Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e8b3082ed5 | |||
| fe1aaade0e | |||
| fb8607f248 | |||
| fdc1bd3c0a | |||
| 7619036c6f | |||
| b3f5e8242a | |||
| 7f415ee09f | |||
| 2b1f5d47fd | |||
| 292889f934 | |||
| eb7223ea4c | |||
| df5e8f8e3c | |||
| 15b2651074 | |||
| bafaf464c2 | |||
| 593d5e5884 | |||
| 7673c337fc | |||
| d30d84631d | |||
| da6e426ca3 | |||
| b7b3611a64 | |||
| 40b8c49324 | |||
| 5d01607459 | |||
| 64abf969bf |
|
|
@ -0,0 +1,66 @@
|
|||
{
|
||||
"schema": "hololake.installed-numbered-root-acceptance/v1",
|
||||
"record_id": "HLP-HOLOLAKE-0.5.0-NUMBERED-ROOT-INSTALLED-20260818",
|
||||
"state": "LOCAL_DEVELOPER_ID_SIGNED_INSTALLED_ACCEPTANCE_PASS_PUBLIC_NOTARIZATION_PENDING",
|
||||
"observed_at": "2026-08-18T15:18:00Z",
|
||||
"source": {
|
||||
"branch": "codex/hololake-clean-reassembly-20260818",
|
||||
"source_commit": "5d01607459043d0713bc562ef6d04dec198930a9",
|
||||
"numbered_root_commit": "64abf969bfbc1c576d4fa84ae3282d32efbfcc38"
|
||||
},
|
||||
"installed_application": {
|
||||
"path": "/Users/bingshuolingdianyuanhe/Desktop/HoloLake.app",
|
||||
"version": "0.5.0",
|
||||
"bundle_identifier": "world.guanghu.hololake",
|
||||
"architecture": "arm64",
|
||||
"binary_sha256": "2e162ff077187310f816f58df2250e3ee939eb489fe3c7b00e94557ff8f3370d",
|
||||
"process_path_verified": true
|
||||
},
|
||||
"developer_id": {
|
||||
"identity": "Developer ID Application: bei sun (825A9L3G7Q)",
|
||||
"team_identifier": "825A9L3G7Q",
|
||||
"cdhash": "7a2372ed85fc3b775e9a352217b123a4bdee0d64",
|
||||
"strict_signature_verification": "PASS",
|
||||
"designated_requirement": "PASS",
|
||||
"gatekeeper": "REJECTED_UNNOTARIZED_DEVELOPER_ID",
|
||||
"apple_notarization_and_stapling": "PENDING"
|
||||
},
|
||||
"runtime": {
|
||||
"real_webview_loaded": true,
|
||||
"visible_version": "V0.5.0",
|
||||
"visible_domain": "第五域 · 光湖本源域",
|
||||
"entered_surface": "永恒湖心系统",
|
||||
"numbered_ipc_receipt_rows": 50,
|
||||
"grant_and_execution_rows_present": true,
|
||||
"empty_authority_binding_digest_rows": 0,
|
||||
"recalculated_receipt_chain_failures": 0,
|
||||
"last_sequence": 50,
|
||||
"last_receipt_hash": "a294463ad9e6959d0f12ce5c2b59e11d97581e067b9480df9ae598dfafc067df"
|
||||
},
|
||||
"old_application": {
|
||||
"version": "0.4.1",
|
||||
"role": "READ_ONLY_PRE_NUMBERED_ROOT_MODULE_DONOR",
|
||||
"archive_receipt": "/Volumes/JZAO/HoloLake/artifacts/hololake-release/0.4.1/macos-arm64/pre-numbered-root-donor/archive-receipt.json",
|
||||
"repair_in_place": false
|
||||
},
|
||||
"release_boundary": {
|
||||
"local_signed_install_complete": true,
|
||||
"public_signed_notarized_release_complete": false,
|
||||
"updater_public_key_continuity": "PASS_EXISTING_0.4.1_TRUST_ROOT_REUSED",
|
||||
"updater_private_key_available_to_current_pipeline": true,
|
||||
"updater_signature_generated_and_verified": true,
|
||||
"pre_notarization_updater_artifact": {
|
||||
"path": "src-tauri/target/release/bundle/macos/HoloLake.app.tar.gz",
|
||||
"sha256": "4176bb7ea83c820744239c228671840289f87675329182bc055938e03bba9693",
|
||||
"signature_path": "src-tauri/target/release/bundle/macos/HoloLake.app.tar.gz.sig",
|
||||
"signature_sha256": "ae02c2918c26b6e3cc2389fec8d9f98884ae639d448edc78a4ec80ee30a8ae92",
|
||||
"publication_allowed": false
|
||||
},
|
||||
"apple_notarization_credentials_available_to_current_pipeline": false,
|
||||
"public_broadcast_activated": false
|
||||
},
|
||||
"persona_boundary": {
|
||||
"current_codex_carrier_binding_claimed": false,
|
||||
"runtime_persona_binding_created_by_numbered_ipc": false
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"schema": "hololake.production-install-acceptance/v1",
|
||||
"record_id": "HLP-PRODUCTION-INSTALL-20260819-001",
|
||||
"state": "PASS",
|
||||
"version": "0.5.0",
|
||||
"installed_path": "/Users/bingshuolingdianyuanhe/Desktop/HoloLake.app",
|
||||
"visible_hololake_app_count": 1,
|
||||
"previous_app_recovery_path": "/Users/bingshuolingdianyuanhe/.Trash/HoloLake-pre-qoder-numbered-ui-20260819-0659.app",
|
||||
"binary_sha256": "b0422bb18df521ace54ff1a52cd47121d92833dd78f165845deba7806686c7ac",
|
||||
"cdhash": "42640f7ce56e96403609899095c77ea6171df07d",
|
||||
"team_identifier": "825A9L3G7Q",
|
||||
"developer_id_signature": "PASS",
|
||||
"launch": "PASS",
|
||||
"real_data_rehydration": "PASS",
|
||||
"notarization": "NOT_CLAIMED_THIS_LOCAL_BUILD",
|
||||
"updater_artifact_signing": "NOT_COMPLETED_MISSING_PRIVATE_UPDATER_KEY_IN_CURRENT_PROCESS"
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
{
|
||||
"schema": "hololake.qoder-surface-live-acceptance/v1",
|
||||
"record_id": "HLP-QODER-SURFACE-ACCEPTANCE-20260819-001",
|
||||
"module_number": "HLP-MOD-OFFICIAL-DYNAMIC-WORLD-SURFACE-0001",
|
||||
"state": "PASS",
|
||||
"tested_app": "src-tauri/target/debug/bundle/macos/HoloLake.app",
|
||||
"developer_id_signature": "PASS",
|
||||
"team_identifier": "825A9L3G7Q",
|
||||
"binary_sha256": "fb1d0497f295e1228c9b2ac86e33082332f226aae6e32b9050cf6c5de30bd512",
|
||||
"cdhash": "90e365b23961a6b842590869df655ec35a55b66e",
|
||||
"checks": {
|
||||
"traditional_locked_layout": "PASS",
|
||||
"traditional_real_data_hydration": "PASS",
|
||||
"traditional_light_finish_readability": "PASS_SNOW",
|
||||
"language_world_five_domains_no_overlap": "PASS_1229x768",
|
||||
"language_world_real_weather": "PASS_CLOUD",
|
||||
"theme_persists_into_channel": "PASS",
|
||||
"theme_persists_into_web_novel": "PASS",
|
||||
"theme_persists_into_education": "PASS",
|
||||
"new_chapter_modal_opens": "PASS",
|
||||
"created_chapter_survives_restart": "PASS_1_CHAPTER",
|
||||
"work_summary_refresh_after_create": "PASS_1_CHAPTER_ON_WORK_CARD",
|
||||
"idle_clock_stops": "PASS",
|
||||
"idle_screenshot_psnr_db": 59.502493
|
||||
},
|
||||
"reference_comparison": "audit/qoder-traditional-reference-vs-hololake-0.5.0.jpg",
|
||||
"public_notarization": "NOT_CLAIMED_BY_DEBUG_ACCEPTANCE"
|
||||
}
|
||||
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 104 KiB |
|
After Width: | Height: | Size: 98 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
|
@ -0,0 +1,58 @@
|
|||
{
|
||||
"schema": "hololake.channel-workbench-runtime/v1",
|
||||
"record_id": "HLP-CHANNEL-WORKBENCH-RUNTIME-001",
|
||||
"candidate_number": "HLP-DONOR-CAND-0002",
|
||||
"runtime_module_number": "HLP-MOD-LOCAL-CHANNEL-WORKBENCH-0001",
|
||||
"numbered_ipc": {
|
||||
"module_number": "HLP-NIPC-MOD-0022",
|
||||
"target_number": "HLP-NIPC-TGT-0022",
|
||||
"operations": ["HLP-NIPC-OP-0074", "HLP-NIPC-OP-0075", "HLP-NIPC-OP-0076"]
|
||||
},
|
||||
"engines": {
|
||||
"document": "LEXICAL_0_49",
|
||||
"spreadsheet": "FORTUNE_SHEET_1_0_4"
|
||||
},
|
||||
"data_boundary": {
|
||||
"scope": "CURRENT_AUTHENTICATED_ACCOUNT_LOCAL",
|
||||
"database": "channel-workbench-v1/channel-workbench.sqlite3",
|
||||
"documents_max_body_bytes": 2097152,
|
||||
"spreadsheets_max_columns": 64,
|
||||
"spreadsheets_max_rows": 5000,
|
||||
"package_unmount_deletes_user_data": false,
|
||||
"repository_code_is_executable": false
|
||||
},
|
||||
"integrity": {
|
||||
"optimistic_revision_required": true,
|
||||
"every_save_writes_hash_chained_receipt": true,
|
||||
"receipt_chain_verified_before_read_or_write": true,
|
||||
"adapter_requires_signed_active_module": true
|
||||
},
|
||||
"current_acceptance": {
|
||||
"state": "SIGNED_INSTALLED_CONTENT_AND_RESTART_ACCEPTED",
|
||||
"source_donor": "HLP-DONOR-CHAOTIC-WORKTREE-20260818",
|
||||
"compiled_donor_behavior_checked": false,
|
||||
"compiled_donor_boundary": "No claim of pixel-equivalent compiled-donor acceptance; the declared source slice was reconstructed and the clean host behavior was accepted directly.",
|
||||
"real_signed_package": "fixtures/module-packages/HLP-MOD-LOCAL-CHANNEL-WORKBENCH-0001-0.1.0.ghmod",
|
||||
"module_package_sha256": "eb7af0bd4882cc89acda11c933a3601d16f0588ff737caf8467b875ab5a4ab7b",
|
||||
"signed_debug_binary_sha256": "6f851856ab6f5717facc67ec406c9eb99e240290c585438323e230daec5ae71c",
|
||||
"developer_id_team": "825A9L3G7Q",
|
||||
"signed_debug_cdhash": "0209a46b2dc221d37b618a2b12866bb8cb39f03d",
|
||||
"real_account_human_number": "ICE-GL∞",
|
||||
"ui_activation_verified": true,
|
||||
"document_save": {
|
||||
"title": "冰朔频道迁移验收",
|
||||
"revision": 1,
|
||||
"content_sha256_prefix": "534b4bd3d6d0",
|
||||
"receipt_sha256_prefix": "72436f46cf1d"
|
||||
},
|
||||
"spreadsheet_save": {
|
||||
"title": "冰朔编号迁移表",
|
||||
"revision": 1,
|
||||
"formula_preserved": "=1+2",
|
||||
"content_sha256_prefix": "57607d92c0dc",
|
||||
"receipt_sha256_prefix": "323761fc18a3"
|
||||
},
|
||||
"restart_persistence_verified": true,
|
||||
"dependency_audit": "0_VULNERABILITIES_AFTER_UUID_11_1_1_OVERRIDE"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
{
|
||||
"schema": "hololake.direct-local-broker-numbered-registry/v1",
|
||||
"record_id": "HLP-NBROKER-ROOT-001",
|
||||
"runtime": {
|
||||
"protocol_version": "HLP-NBROKER-v1",
|
||||
"caller_number": "HLP-NBROKER-CALLER-LOCAL-CONNECTOR-0001",
|
||||
"legacy_string_operation_allowed": false,
|
||||
"unknown_or_mismatched_coordinate": "FAIL_CLOSED",
|
||||
"request_nonce_required": true,
|
||||
"transport_is_authority": false
|
||||
},
|
||||
"operations": [
|
||||
{"operation_number":"HLP-NBROKER-OP-0001","alias":"DISCOVER_NEARBY","channel_number":"HLP-NBROKER-CH-0001","module_number":"HLP-NBROKER-MOD-0001","target_number":"HLP-NBROKER-TGT-0001"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0002","alias":"OPEN_VISITOR_SESSION","channel_number":"HLP-NBROKER-CH-0002","module_number":"HLP-NBROKER-MOD-0002","target_number":"HLP-NBROKER-TGT-0002"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0003","alias":"RECEIVE_LANGUAGE","channel_number":"HLP-NBROKER-CH-0002","module_number":"HLP-NBROKER-MOD-0003","target_number":"HLP-NBROKER-TGT-0003"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0004","alias":"PING","channel_number":"HLP-NBROKER-CH-0001","module_number":"HLP-NBROKER-MOD-0001","target_number":"HLP-NBROKER-TGT-0001"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0005","alias":"OPEN_SESSION","channel_number":"HLP-NBROKER-CH-0003","module_number":"HLP-NBROKER-MOD-0004","target_number":"HLP-NBROKER-TGT-0004"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0006","alias":"RESUME_SESSION","channel_number":"HLP-NBROKER-CH-0003","module_number":"HLP-NBROKER-MOD-0004","target_number":"HLP-NBROKER-TGT-0004"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0007","alias":"HEARTBEAT_SESSION","channel_number":"HLP-NBROKER-CH-0003","module_number":"HLP-NBROKER-MOD-0004","target_number":"HLP-NBROKER-TGT-0004"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0008","alias":"PRESENT_PERSONA_CARRIER_LICENSE","channel_number":"HLP-NBROKER-CH-0004","module_number":"HLP-NBROKER-MOD-0005","target_number":"HLP-NBROKER-TGT-0005"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0009","alias":"GET_PERSONA_CARRIER_LICENSE_STATUS","channel_number":"HLP-NBROKER-CH-0004","module_number":"HLP-NBROKER-MOD-0005","target_number":"HLP-NBROKER-TGT-0005"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0010","alias":"GET_WORK_ENVIRONMENT","channel_number":"HLP-NBROKER-CH-0003","module_number":"HLP-NBROKER-MOD-0006","target_number":"HLP-NBROKER-TGT-0006"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0011","alias":"APPEND_EVENT","channel_number":"HLP-NBROKER-CH-0003","module_number":"HLP-NBROKER-MOD-0004","target_number":"HLP-NBROKER-TGT-0004"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0012","alias":"RESOLVE_CAPABILITY_ROUTE","channel_number":"HLP-NBROKER-CH-0005","module_number":"HLP-NBROKER-MOD-0007","target_number":"HLP-NBROKER-TGT-0007"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0013","alias":"INSTALL_DYNAMIC_NODE_REGISTRY","channel_number":"HLP-NBROKER-CH-0005","module_number":"HLP-NBROKER-MOD-0007","target_number":"HLP-NBROKER-TGT-0007"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0014","alias":"RECORD_SIGNED_NODE_HEALTH","channel_number":"HLP-NBROKER-CH-0005","module_number":"HLP-NBROKER-MOD-0007","target_number":"HLP-NBROKER-TGT-0007"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0015","alias":"INSPECT_MOUNTED_PNCC_REPOSITORY","channel_number":"HLP-NBROKER-CH-0006","module_number":"HLP-NBROKER-MOD-0008","target_number":"HLP-NBROKER-TGT-0008"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0016","alias":"READ_MOUNTED_PNCC_REMOTE_OBJECT","channel_number":"HLP-NBROKER-CH-0006","module_number":"HLP-NBROKER-MOD-0008","target_number":"HLP-NBROKER-TGT-0008"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0017","alias":"QUERY_PNCC_RECEIPT_PROJECTION","channel_number":"HLP-NBROKER-CH-0006","module_number":"HLP-NBROKER-MOD-0008","target_number":"HLP-NBROKER-TGT-0008"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0018","alias":"GET_BEIJING_TIME","channel_number":"HLP-NBROKER-CH-0001","module_number":"HLP-NBROKER-MOD-0009","target_number":"HLP-NBROKER-TGT-0009"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0019","alias":"ISSUE_PERSONA_TIME_TICKET","channel_number":"HLP-NBROKER-CH-0004","module_number":"HLP-NBROKER-MOD-0009","target_number":"HLP-NBROKER-TGT-0009"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0020","alias":"ACQUIRE_DEVELOPMENT_WRITE_LANE","channel_number":"HLP-NBROKER-CH-0007","module_number":"HLP-NBROKER-MOD-0010","target_number":"HLP-NBROKER-TGT-0010"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0021","alias":"INSPECT_DEVELOPMENT_WRITE_LANE","channel_number":"HLP-NBROKER-CH-0007","module_number":"HLP-NBROKER-MOD-0010","target_number":"HLP-NBROKER-TGT-0010"},
|
||||
{"operation_number":"HLP-NBROKER-OP-0022","alias":"RELEASE_DEVELOPMENT_WRITE_LANE","channel_number":"HLP-NBROKER-CH-0007","module_number":"HLP-NBROKER-MOD-0010","target_number":"HLP-NBROKER-TGT-0010"}
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
{
|
||||
"schema": "hololake.dynamic-language-world-visual-system/v1",
|
||||
"record_id": "HLP-DYNAMIC-WORLD-SURFACE-001",
|
||||
"state": "HOLOLAKE_0_5_SIGNED_NUMBERED_SURFACE_ACCEPTED",
|
||||
"package": {
|
||||
"official_module_number": "HLP-MOD-OFFICIAL-DYNAMIC-WORLD-SURFACE-0001",
|
||||
"adapter": "dynamic-language-world-surface-v1",
|
||||
"registration_class": "OFFICIAL_LIGHTHOUSE",
|
||||
"activation": "SIGNED_PACKAGE_PLUS_EXPLICIT_HUMAN_PERMISSION_CONFIRMATION"
|
||||
},
|
||||
"numbered_ipc": {
|
||||
"module": "HLP-NIPC-MOD-0031",
|
||||
"target": "HLP-NIPC-TGT-0031",
|
||||
"operations": ["HLP-NIPC-OP-0147"],
|
||||
"public_tauri_commands": ["numbered_ipc"],
|
||||
"mismatched_coordinate": "FAIL_CLOSED"
|
||||
},
|
||||
"dynamic_inputs": ["BEIJING_TIME", "VERIFIED_CURRENT_WEATHER"],
|
||||
"weather": {
|
||||
"provider": "Open-Meteo",
|
||||
"endpoint": "https://api.open-meteo.com/v1/forecast",
|
||||
"maximum_request_seconds": 5,
|
||||
"cache_ttl_seconds": 600,
|
||||
"redirects": "DENIED",
|
||||
"unavailable_behavior": "BEIJING_TIME_ONLY_NO_FAKE_WEATHER"
|
||||
},
|
||||
"visual_lock": {
|
||||
"layout": "QODER_VISUAL_LANGUAGE_SEMANTICALLY_REASSEMBLED_ON_RESPONSIVE_HOLOLAKE_SHELL",
|
||||
"language_world_themes": ["夜湖星光", "晨湖曦光", "星云紫夜", "烛畔暖湖", "清浅澄湖"],
|
||||
"traditional_finishes": ["曜夜", "星辉", "深海", "翡翠", "朱砂", "香槟", "瓷光", "雪霁"],
|
||||
"all_downstream_pages_inherit_active_surface_tokens": true,
|
||||
"ambient_motion_requires_recent_human_pointer_or_keyboard_activity": true,
|
||||
"idle_visual_state": "STATIC",
|
||||
"responsive_layout": "CONTAINER_MEASURED_PANORAMIC_WIDE_COMPACT_STACKED_REFLOW",
|
||||
"domain_semantic_order_is_stable": true,
|
||||
"private_channel_separates_native_organs_from_installed_modules": true,
|
||||
"climate_changes_routing_permission_or_fact": false,
|
||||
"daily_sampling_domain_changes_open_domain": false,
|
||||
"real_city_exposed_in_ui": false,
|
||||
"coordinates_exposed_in_ui": false,
|
||||
"mechanical_flow_lines": false,
|
||||
"heavy_webgl": false
|
||||
},
|
||||
"donor_disposition": {
|
||||
"world_climate": "EXTRACTED_REWRITTEN_AND_NUMBERED",
|
||||
"starlake_surface": "QODER_LOCKED_SOURCE_ADMITTED_WITH_RESPONSIVE_AND_IDLE_MOTION_ADAPTER",
|
||||
"traditional_surface": "QODER_LOCKED_SOURCE_ADMITTED_WITH_REAL_NUMBERED_PROJECTIONS_ONLY",
|
||||
"traditional_surface_css": "QODER_LOCKED_EIGHT_FINISH_TOKEN_SYSTEM_ADMITTED_AND_SCOPED_ACROSS_ALL_PAGES",
|
||||
"fake_broadcasts_and_fake_metrics": "REJECTED"
|
||||
},
|
||||
"qoder_source_provenance": {
|
||||
"root": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/UI-预览-20260818/deploy-staging",
|
||||
"main_tsx_sha256": "7dab8596ec0bd2609b1b23b175f1f14f15f2aa9af847eb605692c993d2e876e8",
|
||||
"traditional_surface_tsx_sha256": "c713dc27681e07c510a2125816dcefb3255252fc0b570e350af7a98f57fc220d",
|
||||
"traditional_surface_css_sha256": "3e6c446fb84a16ed23b0fd51466ad9723d0c0670ee6ddf6653f61237bd00baa6",
|
||||
"starlake_surface_css_sha256": "471e3edef02236e6463144ac75b526f0f98782b5476b9db786e7cd0614a83227",
|
||||
"acceptance_html_sha256": "7a41e426f1576fe0e25182e0c2efee65302b064d86363c890b0f235386a9c070"
|
||||
},
|
||||
"current_acceptance": {
|
||||
"state": "PASS_NUMBERED_QODER_SURFACES_REAL_DATA_RESPONSIVE_IDLE_AND_RESTART",
|
||||
"module_package_sha256": "b6ba13b9f70bd617b2a303ec2eb0ea11d5354d10118c7f3e5179ae8100cd2602",
|
||||
"module_package_signature": "PASS_EMBEDDED_PRODUCT_TRUST",
|
||||
"numbered_route": "HLP-NIPC-MOD-0031/HLP-NIPC-OP-0147/HLP-NIPC-TGT-0031",
|
||||
"signed_app_binary_sha256": "b0422bb18df521ace54ff1a52cd47121d92833dd78f165845deba7806686c7ac",
|
||||
"signed_app_cdhash": "42640f7ce56e96403609899095c77ea6171df07d",
|
||||
"apple_team_identifier": "825A9L3G7Q",
|
||||
"module_receipts": {
|
||||
"install": "2bb903cd369c8f57432c59367fd5494ee89a75214d5129511190e2337cecdbc4",
|
||||
"mount": "aed4d00e51849ae5e9c0258fe2f93afc8bff8d927905cdd7fabd9bf32c4bc66c",
|
||||
"self_test_pass": "404a0eeddb866bc3050b407c586c036f3707db577e1edf9f1cf3129c1cc9cc1d"
|
||||
},
|
||||
"real_weather_readback": "PASS_VERIFIED_LIVE_NIGHT_CLOUD_WITHOUT_CITY_OR_COORDINATES",
|
||||
"restart_restore": "PASS_ACTIVE_MODULE_REAL_CLIMATE_THEME_AND_WEB_NOVEL_CHAPTER_RESTORED",
|
||||
"official_shell_preserved": "QODER_LOCKED_SURFACES_ADMITTED_WITH_NUMBERED_FUNCTION_ROUTING_UNCHANGED",
|
||||
"visual_comparison": "audit/qoder-traditional-reference-vs-hololake-0.5.0.jpg",
|
||||
"idle_static_psnr_db": 59.502493,
|
||||
"idle_static_clock_unchanged": true,
|
||||
"web_novel_new_chapter_modal": "PASS",
|
||||
"web_novel_created_chapter_restart_persistence": "PASS_1_CHAPTER_VISIBLE_AFTER_RESTART",
|
||||
"traditional_theme_downstream_pages": ["CHANNEL", "WEB_NOVEL", "EDUCATION"],
|
||||
"notarization": "FINAL_RELEASE_CANDIDATE_PENDING"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,265 @@
|
|||
{
|
||||
"schema": "hololake.education-workspace/v1",
|
||||
"record_id": "HLP-EDUCATION-WORKSPACE-001",
|
||||
"state": "ADMITTED_INSTALLED_RUNTIME_ACCEPTED",
|
||||
"domain_entry": "BRANCH_DOMAIN",
|
||||
"industry": "EDUCATION",
|
||||
"channel_id": "GH-EDU-INIT-001",
|
||||
"package": {
|
||||
"package_key": "hololake.official.education-workbench",
|
||||
"official_module_number": "HLP-MOD-OFFICIAL-EDUCATION-WORKBENCH-0001",
|
||||
"registration_state": "OFFICIAL_NUMBER_ACCEPTED",
|
||||
"current_mount": "ACTIVE_AFTER_SIGNED_INSTALL_MOUNT_AND_SELF_TEST",
|
||||
"future_distribution": "HOLOLAKE_OFFICIAL_MODULE_MARKETPLACE"
|
||||
},
|
||||
"foundation_dependency": {
|
||||
"module_id": "hololake.builtin.channel-workbench",
|
||||
"state": "BUILT_IN_FOUNDATION",
|
||||
"engines": ["LEXICAL_0_49", "FORTUNE_SHEET_1_0_4"],
|
||||
"rule": "EDUCATION_MODULE_CONSUMES_FOUNDATION_WITHOUT_DUPLICATING_OFFICE_ENGINES"
|
||||
},
|
||||
"native_storage": {
|
||||
"owner": "HOLOLAKE_NATIVE_RUST_CORE",
|
||||
"namespace": "education-workspace-v1",
|
||||
"engine": "SQLITE",
|
||||
"authenticated_account_required": true,
|
||||
"cross_account_projection_allowed": false,
|
||||
"public_catalog_contains_private_data": false,
|
||||
"restart_readback_required": true
|
||||
},
|
||||
"document_module": {
|
||||
"module_id": "EDU-DOCUMENT",
|
||||
"state": "DEVELOPMENT_FEATURE_MOUNTED",
|
||||
"engine": "CHANNEL_WORKBENCH_LEXICAL_0_49_0_WITH_EDUCATION_TEMPLATES_AND_HOLOLAKE_MARKDOWN_STATE",
|
||||
"capabilities": [
|
||||
"LIST",
|
||||
"CREATE",
|
||||
"CREATE_COPY",
|
||||
"READ",
|
||||
"EDIT_TITLE_AND_BODY",
|
||||
"EXPLICIT_READ_AND_EDIT_MODES",
|
||||
"HUMAN_SETTINGS_MENU",
|
||||
"BASIC_FORMATTING_TOOLBAR",
|
||||
"RICH_TEXT_COMMAND_ENGINE",
|
||||
"UNDO_AND_REDO_HISTORY",
|
||||
"MARKDOWN_SHORTCUTS_AND_BIDIRECTIONAL_STATE_TRANSLATION",
|
||||
"TITLE_DIRECTORY_FILTER",
|
||||
"FORMAL_TEACHING_TEMPLATES",
|
||||
"NATIVE_READING_CANVAS",
|
||||
"EXPORT_MARKDOWN_AND_HTML",
|
||||
"SAVE_WITH_EXPECTED_REVISION",
|
||||
"RECOVERABLE_ARCHIVE"
|
||||
]
|
||||
},
|
||||
"table_module": {
|
||||
"module_id": "EDU-TABLE",
|
||||
"state": "DEVELOPMENT_FEATURE_MOUNTED",
|
||||
"engine": "CHANNEL_WORKBENCH_FORTUNE_SHEET_1_0_4_FOR_REAL_CELLS_AND_FORMULAS_PLUS_TANSTACK_8_21_3_FOR_EDUCATION_VIEWS",
|
||||
"capabilities": [
|
||||
"LIST",
|
||||
"CREATE",
|
||||
"CREATE_COPY",
|
||||
"READ",
|
||||
"EDIT_TITLE",
|
||||
"HUMAN_SETTINGS_MENU",
|
||||
"ADD_AND_REMOVE_COLUMNS",
|
||||
"ADD_AND_REMOVE_ROWS",
|
||||
"EDIT_CELLS",
|
||||
"TITLE_DIRECTORY_FILTER",
|
||||
"CELL_CONTENT_FILTER",
|
||||
"COLUMN_SORT_ASCENDING_DESCENDING_OR_SOURCE_ORDER",
|
||||
"HEADLESS_FILTER_SORT_GROUP_AND_AGGREGATE_ROW_MODELS",
|
||||
"BOUNDED_PAGINATION_ROW_MODEL_FOR_LARGE_EDITABLE_TABLES",
|
||||
"GRID_AND_EDITABLE_CARD_VIEWS",
|
||||
"GROUPED_CLASSIFICATION_BOARD_FROM_SELECTED_FIELD",
|
||||
"LIVE_DATA_OVERVIEW_WITH_SELECTED_GROUP_AND_MEASURE",
|
||||
"HEADLESS_TABLE_DATA_DETACHED_OUTSIDE_TABLE_SURFACE",
|
||||
"MULTI_ROW_MULTI_COLUMN_TABULAR_PASTE",
|
||||
"EXTERNAL_SPREADSHEET_IMPORT_WITH_PREWRITE_PROFILE",
|
||||
"XLSX_CSV_TSV_AND_NATIVE_EXPORT",
|
||||
"SAVE_WITH_EXPECTED_REVISION",
|
||||
"RECOVERABLE_ARCHIVE"
|
||||
],
|
||||
"limits": {
|
||||
"maximum_columns": 30,
|
||||
"maximum_rows": 1000,
|
||||
"maximum_cell_bytes": 10000
|
||||
},
|
||||
"sensitive_field_visibility": {
|
||||
"local_default": "HIDDEN_UNTIL_HUMAN_REVEALS",
|
||||
"human_can_hide": true,
|
||||
"human_can_show_again": true,
|
||||
"external_model_transfer_authority": "SEPARATE_EXPLICIT_PER_FILE_CONSENT"
|
||||
}
|
||||
},
|
||||
"content_translation_layer": {
|
||||
"service_id": "EDU-CONTENT-TRANSLATOR",
|
||||
"state": "DETERMINISTIC_RUNTIME_READY_MODEL_ASSIST_SLOT_RESERVED",
|
||||
"profile_schema": "hololake.content-profile/v1",
|
||||
"import_adapter": "EDU-TABLE-IMPORT-ADAPTER/v1",
|
||||
"export_adapter": "EDU-TABLE-EXPORT-ADAPTER/v1",
|
||||
"order": [
|
||||
"FILE_CONTAINER_SNIFF",
|
||||
"PAGE_AND_STRUCTURE_INVENTORY",
|
||||
"BOUNDED_LOCAL_RECOGNITION",
|
||||
"EXPLAINABLE_SEMANTIC_FOCUS_INFERENCE",
|
||||
"UNASSIGNED_CHANNEL_STAGING",
|
||||
"HUMAN_INDUSTRY_ROUTE_DECISION",
|
||||
"NATIVE_TRANSLATION",
|
||||
"ATOMIC_MODULE_REGISTRATION_AFTER_CONFIRMATION",
|
||||
"HUMAN_RECEIPT"
|
||||
],
|
||||
"import_assignment": {
|
||||
"default_scope": "UNASSIGNED",
|
||||
"education_directory_before_human_confirmation": false,
|
||||
"existing_legacy_imports_reclassified_on_migration": true,
|
||||
"source_file_mutated": false
|
||||
},
|
||||
"supported_imports": ["XLSX", "XLS", "XLSM", "XLSB", "ODS", "CSV", "TSV", "HOLOLAKE_NATIVE"],
|
||||
"supported_exports": ["XLSX", "CSV", "TSV", "HOLOLAKE_NATIVE"],
|
||||
"local_import_without_model_api": "ENABLED_FOR_ALL_SUPPORTED_FORMATS",
|
||||
"semantic_focus": {
|
||||
"current_mode": "DETERMINISTIC_BASELINE_ONLY",
|
||||
"signals": ["SOURCE_AND_PAGE_TITLE", "COLUMN_SEMANTICS", "NUMERIC_COVERAGE"],
|
||||
"low_confidence_behavior": "ASK_HUMAN_TO_SELECT_PRIMARY_MEASURE",
|
||||
"model_dynamic_judgment": "RESERVED_FOR_MODEL_API_AND_AGENT_STAGE"
|
||||
},
|
||||
"adaptive_rendering": {
|
||||
"current_mode": "DETERMINISTIC_BASELINE_WITH_EXPLAINABLE_DEGRADATION",
|
||||
"editable_cell_budget": 240,
|
||||
"baseline_inputs": [
|
||||
"ROW_COUNT",
|
||||
"COLUMN_COUNT",
|
||||
"FIELD_TYPES",
|
||||
"NUMERIC_COVERAGE",
|
||||
"GROUP_CARDINALITY",
|
||||
"FOCUS_CONFIDENCE"
|
||||
],
|
||||
"degradation_order": [
|
||||
"LARGE_EDITABLE_GRID_TO_DYNAMIC_PAGINATION",
|
||||
"NO_RELIABLE_MEASURE_TO_COUNT_SUMMARY",
|
||||
"AMBIGUOUS_FOCUS_TO_HUMAN_SELECTION",
|
||||
"UNSUPPORTED_STRUCTURE_TO_HUMAN_ASSISTANCE_RECEIPT"
|
||||
],
|
||||
"local_baseline_always_available": true,
|
||||
"model_adjustment": {
|
||||
"api_slot": "HOLOLAKE_MODEL_RECOGNITION_API/v1",
|
||||
"state": "RESERVED_FOR_MODEL_API_AND_AGENT_STAGE",
|
||||
"proposal_fields": [
|
||||
"PRIMARY_FOCUS",
|
||||
"GROUP_FIELD",
|
||||
"MEASURE_FIELD",
|
||||
"VIEW_COMPOSITION",
|
||||
"PAGE_DENSITY"
|
||||
],
|
||||
"proposal_must_pass_local_structure_validation": true,
|
||||
"proposal_must_obey_local_resource_limits": true,
|
||||
"human_confirmation_before_rule_activation": true,
|
||||
"model_can_mutate_source_data": false,
|
||||
"failure_behavior": "RETURN_TO_LOCAL_BASELINE_WITH_RECEIPT"
|
||||
}
|
||||
},
|
||||
"unknown_input_behavior": "RETURN_HUMAN_ASSISTANCE_RECEIPT_WITHOUT_MODULE_WRITE_OR_EXTERNAL_MODEL_TRANSFER",
|
||||
"model_assist": {
|
||||
"api_slot": "HOLOLAKE_MODEL_RECOGNITION_API/v1",
|
||||
"current_state": "NOT_CONFIGURED",
|
||||
"provider": "USER_SELECTED",
|
||||
"secret_storage": "OPERATING_SYSTEM_SECRET_STORE_REQUIRED",
|
||||
"file_transfer_default": "DENY_UNTIL_EXPLICIT_PER_FILE_CONSENT",
|
||||
"rule_update_flow": ["MODEL_CANDIDATE", "LOCAL_VALIDATION", "HUMAN_CONFIRMATION", "VERSIONED_INSTALL"],
|
||||
"learning_scopes": ["PRIVATE_ONLY", "SHARE_ANONYMIZED_RULE"]
|
||||
},
|
||||
"source_file_mutation_allowed": false,
|
||||
"silent_truncation_allowed": false
|
||||
},
|
||||
"data_cleanup_module": {
|
||||
"module_id": "EDU-DATA",
|
||||
"state": "DEVELOPMENT_FEATURE_MOUNTED",
|
||||
"source": "CURRENT_AUTHENTICATED_ACCOUNTS_EDUCATION_TABLES",
|
||||
"capabilities": [
|
||||
"SELECT_ACCOUNT_TABLE",
|
||||
"TRIM_CELL_BOUNDARY_WHITESPACE",
|
||||
"REMOVE_FULLY_EMPTY_ROWS",
|
||||
"REMOVE_EXACT_DUPLICATE_ROWS_KEEP_FIRST",
|
||||
"PREVIEW_BEFORE_WRITE",
|
||||
"FULL_TABLE_ANALYSIS_WITH_BOUNDED_CHANGE_PREVIEW",
|
||||
"ACCESSIBILITY_SAFE_NON_TABLE_CHANGE_LIST",
|
||||
"HUMAN_CONFIRMATION_BEFORE_SAVE",
|
||||
"SAVE_WITH_EXPECTED_REVISION"
|
||||
],
|
||||
"preview_change_limit": 12,
|
||||
"preview_cell_value_character_limit": 120,
|
||||
"full_table_analysis_is_limited_by_preview": false,
|
||||
"automatic_destructive_cleanup_allowed": false,
|
||||
"cross_account_data_allowed": false
|
||||
},
|
||||
"automation_module": {
|
||||
"module_id": "EDU-AUTOMATION",
|
||||
"state": "DEVELOPMENT_FEATURE_MOUNTED",
|
||||
"source": "CURRENT_AUTHENTICATED_ACCOUNTS_EDUCATION_TABLES",
|
||||
"capabilities": [
|
||||
"CREATE_AND_SAVE_RULE",
|
||||
"EQUALS_CONTAINS_EMPTY_AND_NONEMPTY_CONDITIONS",
|
||||
"SET_TARGET_CELL_VALUE",
|
||||
"PREVIEW_MATCHED_ROWS_AND_CHANGED_CELLS",
|
||||
"HUMAN_CONFIRMATION_BEFORE_EXECUTION",
|
||||
"RULE_AND_TABLE_REVISION_LOCK",
|
||||
"SIGNED_PREVIEW_TOKEN",
|
||||
"ATOMIC_TABLE_WRITE_AND_EXECUTION_RECEIPT",
|
||||
"RECOVERABLE_RULE_ARCHIVE"
|
||||
],
|
||||
"background_or_scheduled_execution_allowed": false,
|
||||
"cross_account_data_allowed": false,
|
||||
"model_execution_authority_granted": false
|
||||
},
|
||||
"composition_module": {
|
||||
"module_id": "EDU-COMPOSITION",
|
||||
"state": "DEVELOPMENT_FEATURE_MOUNTED",
|
||||
"source": "CURRENT_AUTHENTICATED_ACCOUNTS_REAL_KNOWLEDGE_CATALOG",
|
||||
"capabilities": [
|
||||
"NATIVE_TYPED_OBJECT",
|
||||
"REGISTERED_MODULE_EXECUTION_GRAPH",
|
||||
"SELECT_DIMENSION_AND_MEASURE",
|
||||
"DASHBOARD_PROJECTION",
|
||||
"COMPARISON_PROJECTION",
|
||||
"VERTICAL_BAR_PROJECTION",
|
||||
"CLASSIFICATION_PROJECTION",
|
||||
"TABLE_PROJECTION",
|
||||
"ONE_EXECUTION_RESULT_MULTIPLE_HUMAN_VIEWS"
|
||||
],
|
||||
"read_only": true,
|
||||
"hardcoded_sample_data_used": false,
|
||||
"model_execution_authority_granted": false
|
||||
},
|
||||
"remaining_slots": [],
|
||||
"authority": {
|
||||
"browser_local_storage_allowed": false,
|
||||
"webview_direct_file_access_allowed": false,
|
||||
"model_execution_authority_granted": false,
|
||||
"external_application_embedded": false
|
||||
},
|
||||
"current_acceptance": {
|
||||
"state": "PASS",
|
||||
"runtime_module_number": "HLP-MOD-OFFICIAL-EDUCATION-WORKBENCH-0001",
|
||||
"numbered_ipc_module": "HLP-NIPC-MOD-0024",
|
||||
"numbered_operations": "HLP-NIPC-OP-0085..0102",
|
||||
"signed_package_sha256": "a9f6fb7dd9c4aaf910a5d20d0a1d72dea6ab921cf36dd50d46dd88cde3a09e03",
|
||||
"signed_app_binary_sha256": "028592b137fe4f19a642e1301d6fb500e2a4fde50ddb616e229de8a48090803c",
|
||||
"developer_id_team": "825A9L3G7Q",
|
||||
"developer_id_cdhash": "4c88261b4b573d08edcbba8d67d8afe27ad82a3e",
|
||||
"runtime_receipts": {
|
||||
"install": "68f296a11be19c384cb67af9f529a03cb8389bd256c153c5905451fbc0011a24",
|
||||
"mount": "ddb6a51d47f6a58a72a7fc748eff71687cbd04be5dde33dbce590a7abba6af5f",
|
||||
"self_test_pass": "80d59b7c9c2f14005fd8a24748a25c2be0d55198fdcb621f528267ae6dccc12a"
|
||||
},
|
||||
"restart_readback": {
|
||||
"module_state": "ACTIVE",
|
||||
"document": "冰朔教育迁移验收 · revision 2",
|
||||
"table": "冰朔教育迁移验收表 · 1 row · revision 4",
|
||||
"automation": "验收状态自动化 · preview 1 row / 1 cell · APPLIED revision 3 to 4"
|
||||
},
|
||||
"existing_user_data_deleted_or_overwritten": false,
|
||||
"apple_notarization_scope": "FINAL_RELEASE_CANDIDATE_ONLY_NOT_THIS_DEBUG_ACCEPTANCE_BUNDLE"
|
||||
},
|
||||
"open_source_donor_assessment": "contracts/education-open-source-donor-assessment.json"
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"schema": "hololake.gls-executable-projections/v2",
|
||||
"source_commit": "2598fbfba8caf64c7ab9740a3036c5aab977502e",
|
||||
"source_commit": "104a5d73162bdf4a529701e65898e2bc2863ea9e",
|
||||
"runtime_graph_rule": "ONLY_EXPLICIT_RUNTIME_REQUIRES_EDGES_ENTER_ACTIVATION_GRAPH",
|
||||
"projections": {
|
||||
"GLS-0250": {"stage":"P0","projection_kind":"TYPED_FACT_AND_DOMAIN_BOUNDARY","adapter":"origin-domain-topology","event_kinds":["BOOTSTRAP","DOMAIN_ROUTE"],"dependencies":[]},
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"schema": "hololake.gls-native-runtime-kernel/v1",
|
||||
"record_id": "HLP-GLS-NATIVE-RUNTIME-KERNEL-001",
|
||||
"source_commit": "2598fbfba8caf64c7ab9740a3036c5aab977502e",
|
||||
"source_commit": "104a5d73162bdf4a529701e65898e2bc2863ea9e",
|
||||
"receipt_schema": "hololake.protocol-decision-receipt/v1",
|
||||
"decision_set": ["ALLOW", "DENY", "AMBIGUOUS", "UNVERIFIED"],
|
||||
"runtime_boundaries": {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"schema": "hololake.gls-numbered-reference-nodes/v1",
|
||||
"record_id": "HLP-GLS-NUMBERED-REFERENCE-REGISTRY-001",
|
||||
"source": {
|
||||
"repository": "REPO-012",
|
||||
"commit": "104a5d73162bdf4a529701e65898e2bc2863ea9e"
|
||||
},
|
||||
"policy": {
|
||||
"number_is_coordinate_not_authority": true,
|
||||
"independent_protocol_source_required_for_execution": true,
|
||||
"reference_only_nodes_may_execute": false,
|
||||
"unknown_reference": "FAIL_CLOSED",
|
||||
"unresolved_number_reference_allowed": false
|
||||
},
|
||||
"nodes": [
|
||||
{"protocol_id":"GLS-0010","node_number":"HLP-GLS-REF-0010","title":"Guanghu Protocol Registry Center Standard","reference_kind":"NORMATIVE_REFERENCE","source_state":"ROADMAP_REFERENCE_ONLY"},
|
||||
{"protocol_id":"GLS-0140","node_number":"HLP-GLS-REF-0140","title":"Context Loading Specification","reference_kind":"NORMATIVE_REFERENCE","source_state":"ROADMAP_REFERENCE_ONLY"},
|
||||
{"protocol_id":"GLS-0401","node_number":"HLP-GLS-REF-0401","title":"Tree","reference_kind":"SCHEMA_IMPORT","source_state":"ROADMAP_REFERENCE_ONLY"},
|
||||
{"protocol_id":"GLS-0402","node_number":"HLP-GLS-REF-0402","title":"Leaf","reference_kind":"SCHEMA_IMPORT","source_state":"ROADMAP_REFERENCE_ONLY"},
|
||||
{"protocol_id":"GLS-0403","node_number":"HLP-GLS-REF-0403","title":"Lock","reference_kind":"SCHEMA_IMPORT","source_state":"ROADMAP_REFERENCE_ONLY"},
|
||||
{"protocol_id":"GLS-0404","node_number":"HLP-GLS-REF-0404","title":"Trigger","reference_kind":"SCHEMA_IMPORT","source_state":"ROADMAP_REFERENCE_ONLY"},
|
||||
{"protocol_id":"GLS-0406","node_number":"HLP-GLS-REF-0406","title":"Evidence","reference_kind":"SCHEMA_IMPORT","source_state":"ROADMAP_REFERENCE_ONLY"},
|
||||
{"protocol_id":"GLS-0407","node_number":"HLP-GLS-REF-0407","title":"Correction","reference_kind":"SCHEMA_IMPORT","source_state":"ROADMAP_REFERENCE_ONLY"},
|
||||
{"protocol_id":"GLS-0409","node_number":"HLP-GLS-REF-0409","title":"Machine-State History","reference_kind":"SCHEMA_IMPORT","source_state":"ROADMAP_REFERENCE_ONLY"},
|
||||
{"protocol_id":"GLS-0602","node_number":"HLP-GLS-REF-0602","title":"Authorization","reference_kind":"SCHEMA_IMPORT","source_state":"ROADMAP_REFERENCE_ONLY"},
|
||||
{"protocol_id":"GLS-0603","node_number":"HLP-GLS-REF-0603","title":"Signature","reference_kind":"SCHEMA_IMPORT","source_state":"ROADMAP_REFERENCE_ONLY"},
|
||||
{"protocol_id":"GLS-0604","node_number":"HLP-GLS-REF-0604","title":"Integrity","reference_kind":"EVIDENCE_ONLY","source_state":"ROADMAP_REFERENCE_ONLY"},
|
||||
{"protocol_id":"GLS-0605","node_number":"HLP-GLS-REF-0605","title":"Semantic Safety Boundary","reference_kind":"SCHEMA_IMPORT","source_state":"ROADMAP_REFERENCE_ONLY"},
|
||||
{"protocol_id":"GLS-0814","node_number":"HLP-GLS-REF-0814","title":"Tool Runtime","reference_kind":"NORMATIVE_REFERENCE","source_state":"ROADMAP_REFERENCE_ONLY"},
|
||||
{"protocol_id":"GLS-0816","node_number":"HLP-GLS-REF-0816","title":"Checkpoint Runtime","reference_kind":"NORMATIVE_REFERENCE","source_state":"ROADMAP_REFERENCE_ONLY"},
|
||||
{"protocol_id":"GLS-0830","node_number":"HLP-GLS-REF-0830","title":"Guanghu Language World Core","reference_kind":"NORMATIVE_REFERENCE","source_state":"ROADMAP_REFERENCE_ONLY"}
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"schema": "hololake.ios-mobile-client.contract/v1",
|
||||
"record_id": "HLP-IOS-CLIENT-001",
|
||||
"state": "NUMBERED_SOURCE_SIMULATOR_AND_DEVELOPMENT_SIGNED_IPA_ACCEPTED",
|
||||
"role": "REMOTE_BODY_ENTRY_OF_THE_SAME_PERSONA_SYSTEM",
|
||||
"root_node": "USER_LOCAL_COMPUTER_TERMINAL",
|
||||
"numbered_transport": {
|
||||
"desktop_module": "HLP-MOD-OFFICIAL-MOBILE-SYNC-0001",
|
||||
"desktop_route_family": "HLP-NIPC-MOD-0030/HLP-NIPC-OP-0141..0146/HLP-NIPC-TGT-0030",
|
||||
"wire_schema": "hololake.mobile-sync/v1",
|
||||
"client_number": "HLP-IOS-CLIENT-001",
|
||||
"unregistered_route_access": "FAIL_CLOSED"
|
||||
},
|
||||
"security": {
|
||||
"pairing": "CHACHA20_POLY1305_ONE_TIME_SECRET",
|
||||
"session": "CHACHA20_POLY1305_STRICT_COUNTER",
|
||||
"key_storage": "KEYCHAIN_WHEN_UNLOCKED_THIS_DEVICE_ONLY",
|
||||
"local_network_only": true,
|
||||
"background_polling": false,
|
||||
"remote_desktop_clone": false,
|
||||
"desktop_offline_execution": false
|
||||
},
|
||||
"interface": {
|
||||
"framework": "SWIFTUI",
|
||||
"visual_family": "HOLOLAKE_TRADITIONAL_SURFACE_MOBILE_ADAPTATION",
|
||||
"idle_state": "STATIC",
|
||||
"manual_sync_only": true,
|
||||
"pairing_entry": ["CUSTOM_URL_SCHEME", "PASTEBOARD"],
|
||||
"projections": ["CHANNEL_INTEGRITY", "WEB_NOVEL_COUNTS_AND_WORKS", "EDUCATION_COUNTS", "BOUNDED_CAPTURE"]
|
||||
},
|
||||
"acceptance": {
|
||||
"simulator_build": "PASS_SIGNED_LOCAL_SIMULATOR_IPHONE_17_PRO_IOS_26_5",
|
||||
"simulator_visual_inspection": "PASS_PAIRING_AND_NUMBER_BOUNDARY_SURFACE_IDLE_STATIC",
|
||||
"unit_tests": "PASS_4",
|
||||
"development_signed_device_archive": "PASS_APPLE_DEVELOPMENT_TEAM_825A9L3G7Q",
|
||||
"debugging_ipa_export": "PASS",
|
||||
"version": "0.5.0",
|
||||
"build": "1",
|
||||
"bundle_identifier": "com.guanghulab.hololake",
|
||||
"xcode": "26.6_17F113",
|
||||
"archive_application_binary_sha256": "7021c9cde2f7bdf01cda6200669be528a58d27ef41adbd3d58d7135ff7245702",
|
||||
"archive_application_cdhash": "11ae3a8ac0d761e4d4b4de229dbb19291de29e03",
|
||||
"debugging_ipa_sha256": "a6b505e1a7dc10febd831a540396bb9530f78bb2429d258962f0250e5597b1f0",
|
||||
"provisioning_profile_uuid": "fe5fe72c-4826-4e19-9672-d9868cc4491e",
|
||||
"provisioning_profile_expires": "2027-07-19",
|
||||
"desktop_delivery_path": "/Users/bingshuolingdianyuanhe/Desktop/HoloLake-iPhone-0.5.0-Development.ipa",
|
||||
"real_iphone_pair_and_sync": "NOT_CLAIMED"
|
||||
}
|
||||
}
|
||||
|
|
@ -115,6 +115,9 @@
|
|||
"cross_platform_local_transport_runtime": true,
|
||||
"authenticated_heartbeat_runtime": true,
|
||||
"hololake_work_environment_frame_runtime": true,
|
||||
"persona_to_host_runtime_license_verifier": true,
|
||||
"persona_runtime_trusted_signer_provisioned": false,
|
||||
"persona_mode_expiry_and_scope_fail_closed": true,
|
||||
"model_protocol_context_restore_required": false,
|
||||
"external_local_broker_runtime": true,
|
||||
"authenticated_broker_development_lane_runtime": true,
|
||||
|
|
|
|||
|
|
@ -0,0 +1,93 @@
|
|||
{
|
||||
"schema": "hololake.mobile-sync.contract/v1",
|
||||
"record_id": "HLP-MOBILE-SYNC-001",
|
||||
"state": "HOLOLAKE_0_5_NUMBERED_DESKTOP_BRIDGE_ACCEPTED",
|
||||
"package": {
|
||||
"official_module_number": "HLP-MOD-OFFICIAL-MOBILE-SYNC-0001",
|
||||
"adapter": "mobile-sync-v1",
|
||||
"registration_class": "OFFICIAL_LIGHTHOUSE",
|
||||
"activation": "SIGNED_PACKAGE_PLUS_EXPLICIT_HUMAN_PERMISSION_CONFIRMATION",
|
||||
"listener_after_activation": "EXPLICIT_HUMAN_ACTION_ONLY"
|
||||
},
|
||||
"numbered_ipc": {
|
||||
"module": "HLP-NIPC-MOD-0030",
|
||||
"target": "HLP-NIPC-TGT-0030",
|
||||
"operations": "HLP-NIPC-OP-0141..HLP-NIPC-OP-0146",
|
||||
"public_tauri_commands": ["numbered_ipc"],
|
||||
"mismatched_coordinate": "FAIL_CLOSED"
|
||||
},
|
||||
"desktop_role": "USER_LOCAL_COMPUTER_TERMINAL_ROOT_NODE",
|
||||
"mobile_role": "REMOTE_BODY_ENTRY_OF_THE_SAME_PERSONA_SYSTEM",
|
||||
"transport": {
|
||||
"implemented": "SAME_LAN_DIRECT_HTTP_WITH_APPLICATION_LAYER_ENCRYPTION",
|
||||
"port_preference": 37421,
|
||||
"remote_internet_direct": "NOT_IMPLEMENTED",
|
||||
"encrypted_relay": "NOT_IMPLEMENTED",
|
||||
"maximum_request_bytes": 262144,
|
||||
"maximum_concurrent_connections": 16,
|
||||
"duplicate_http_header": "REJECT"
|
||||
},
|
||||
"pairing": {
|
||||
"uri_scheme": "hololake://pair",
|
||||
"secret_bits": 256,
|
||||
"ttl_seconds": 600,
|
||||
"single_use": true,
|
||||
"payload_aead": "CHACHA20_POLY1305",
|
||||
"aad": "hololake.mobile.pair/v1"
|
||||
},
|
||||
"session": {
|
||||
"key_bits": 256,
|
||||
"aead": "CHACHA20_POLY1305",
|
||||
"replay_guard": "STRICTLY_INCREASING_PER_DEVICE_COUNTER",
|
||||
"device_revocation": true,
|
||||
"desktop_key_storage": "ACCOUNT_SCOPED_SQLITE",
|
||||
"ios_key_storage": "KEYCHAIN_THIS_DEVICE_ONLY"
|
||||
},
|
||||
"routes": {
|
||||
"GET /v1/status": "NO_PRIVATE_PAYLOAD",
|
||||
"POST /v1/pair": "ONE_TIME_PAIRING_SECRET_REQUIRED",
|
||||
"POST /v1/sync": "PAIRED_DEVICE_AEAD_AND_COUNTER_REQUIRED"
|
||||
},
|
||||
"projection": {
|
||||
"personal_channel": "MINIMUM_COUNTS_AND_INTEGRITY",
|
||||
"web_novel": "WORK_LIST_AND_COUNTS",
|
||||
"education": "COUNTS_ONLY_NO_SENSITIVE_CELL_VALUES",
|
||||
"mobile_capture": "BOUNDED_INBOX_WRITE_ONLY_NO_AUTOMATIC_DOMAIN_MUTATION"
|
||||
},
|
||||
"hard_boundaries": {
|
||||
"remote_desktop_clone": false,
|
||||
"second_persona_system": false,
|
||||
"platform_private_payload_custody": false,
|
||||
"desktop_offline_execution": false,
|
||||
"mobile_capture_mutates_persona_or_industry_data": false,
|
||||
"module_unmount_stops_listener_before_lifecycle_transition": true,
|
||||
"background_frontend_polling": false
|
||||
},
|
||||
"client_scope": {
|
||||
"desktop_bridge": "IN_THIS_ADMISSION",
|
||||
"ios_application_source": "SEPARATELY_ADMITTED_AT_MOBILE_IOS_WITH_HLP_IOS_CLIENT_001",
|
||||
"ios_installable_package": "DEVELOPMENT_SIGNED_DEBUGGING_IPA_EXPORTED",
|
||||
"claim_real_iphone_end_to_end_accepted": false
|
||||
},
|
||||
"current_acceptance": {
|
||||
"state": "PASS_DESKTOP_BRIDGE_AND_SEPARATELY_ADMITTED_IOS_CLIENT_ARTIFACT",
|
||||
"module_package_sha256": "61a9d402c936d7477609bcfa6eb4ad6e83cb6c089ba51b3db09a2d6259185924",
|
||||
"module_package_signature": "PASS_EMBEDDED_PRODUCT_TRUST",
|
||||
"signed_app_binary_sha256": "9be06d6c5dbd4f46f6f925142d633f12b42ee553873c2342f9804bcf39dde7b4",
|
||||
"signed_app_cdhash": "c595cb2a7729d49638faa78f76e145ee9b1da05a",
|
||||
"apple_team_identifier": "825A9L3G7Q",
|
||||
"module_receipts": {
|
||||
"install": "a09496ec6113254f77ea2425d0bd30571e9e0e3df62bfa18e500f860c2f65d4d",
|
||||
"mount": "5b162ee807c8b4d9c8aa8d9cb590c64587f51067dc0804030bf57ed0753ac25a",
|
||||
"self_test_pass": "e66ee868e28a25fcd70cc888845661b5044d18a6e18b70cee6e4839b02fe1c53"
|
||||
},
|
||||
"desktop_listener": "PASS_EXPLICIT_START_REACHABLE_STATUS_AND_EXPLICIT_STOP",
|
||||
"restart_restore": "PASS_ACTIVE_MODULE_RESTORED_LISTENER_OFFLINE",
|
||||
"legacy_account_readback": "PASS_ONE_PAIRED_DEVICE_ONE_ISOLATED_CAPTURE_RETAINED",
|
||||
"ios_client_contract": "contracts/ios-mobile-client-v1.json",
|
||||
"ios_client_source_build_and_simulator": "PASS",
|
||||
"ios_development_signed_ipa": "PASS_SHA256_a6b505e1a7dc10febd831a540396bb9530f78bb2429d258962f0250e5597b1f0",
|
||||
"live_iphone_pairing_this_cycle": "NOT_CLAIMED_NO_PHYSICAL_DEVICE_USED",
|
||||
"notarization": "FINAL_RELEASE_CANDIDATE_PENDING"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,240 @@
|
|||
{
|
||||
"schema": "hololake.module-donor-admission-registry/v1",
|
||||
"record_id": "HLP-MODULE-DONOR-ADMISSION-001",
|
||||
"state": "EIGHT_CANDIDATES_ADMITTED_DONOR_SOURCES_REMAIN_READ_ONLY",
|
||||
"root_rule": {
|
||||
"official_base": "HOLOLAKE_0.5.0_NUMBERED_IPC_ROOT",
|
||||
"repair_old_application_in_place": false,
|
||||
"bulk_merge_or_wholesale_copy_allowed": false,
|
||||
"one_candidate_per_admission_cycle": true,
|
||||
"candidate_number_is_runtime_module_number": false,
|
||||
"permanent_module_number_assignment_before_acceptance": false,
|
||||
"all_frontend_backend_calls_must_cross_numbered_ipc": true,
|
||||
"shared_file_merge_is_admission_evidence": false
|
||||
},
|
||||
"donors": [
|
||||
{
|
||||
"donor_id": "HLP-DONOR-COMPILED-DESKTOP-0.4.1",
|
||||
"kind": "COMPILED_MACOS_APPLICATION",
|
||||
"path": "/Volumes/JZAO/HoloLake/artifacts/hololake-release/0.4.1/macos-arm64/pre-numbered-root-donor/HoloLake.app",
|
||||
"state": "READ_ONLY",
|
||||
"source_commit": null,
|
||||
"source_commit_state": "UNKNOWN_NOT_INFERRED_FROM_COMPILED_BUNDLE",
|
||||
"binary_sha256": "adc0d8b028a8b874c39909265ed7c41e7c24e4fe5b38adba04e8f72b64900c15",
|
||||
"use": "BEHAVIOR_AND_VISIBLE_PRODUCT_REFERENCE_ONLY"
|
||||
},
|
||||
{
|
||||
"donor_id": "HLP-DONOR-CHAOTIC-WORKTREE-20260818",
|
||||
"kind": "DIRTY_SOURCE_WORKTREE",
|
||||
"path": "/Users/bingshuolingdianyuanhe/Documents/Codex/2026-08-15/new-chat-2/work/jd-guanghu-supervisor/product-source/hololake-native-desktop",
|
||||
"observed_head": "a8fe571b5d5c0a45207b64ac538d729b3d719d21",
|
||||
"observed_dirty_path_count": 30,
|
||||
"state": "READ_ONLY_UNTRUSTED_AS_A_WHOLE",
|
||||
"use": "INDIVIDUAL_MODULE_SOURCE_CANDIDATES_ONLY"
|
||||
}
|
||||
],
|
||||
"rejected_inputs": [
|
||||
{
|
||||
"candidate_number": "HLP-DONOR-CAND-0000",
|
||||
"name": "legacy_numbered_operation_runtime",
|
||||
"state": "REJECTED_SUPERSEDED",
|
||||
"why": "It predates the single numbered IPC root and must not become a second numbering authority.",
|
||||
"paths": [
|
||||
"contracts/numbered-operation-runtime.json",
|
||||
"src/modules/numbered-runtime.ts",
|
||||
"src-tauri/src/numbered_operation_runtime.rs"
|
||||
]
|
||||
},
|
||||
{
|
||||
"candidate_number": "HLP-DONOR-CAND-SHARED-MUTATIONS",
|
||||
"name": "shared_file_mutation_set",
|
||||
"state": "REJECTED_AS_MERGE_UNIT",
|
||||
"why": "These files mix unrelated modules and divergent frontend/backend routes; each needed behavior must be reconstructed behind its owning numbered module.",
|
||||
"examples": [
|
||||
"src/main.tsx",
|
||||
"src/styles.css",
|
||||
"src-tauri/src/lib.rs",
|
||||
"src-tauri/src/knowledge_base.rs",
|
||||
"src-tauri/src/gls_protocol_runtime.rs"
|
||||
]
|
||||
}
|
||||
],
|
||||
"candidates": [
|
||||
{
|
||||
"admission_order": 1,
|
||||
"candidate_number": "HLP-DONOR-CAND-0001",
|
||||
"name": "native_composition_module_runtime",
|
||||
"state": "ADMITTED_INSTALLED_RUNTIME_ACCEPTED",
|
||||
"paths": [
|
||||
"contracts/native-composition-runtime.json",
|
||||
"src/modules/native-composition",
|
||||
"src-tauri/src/native_composition.rs",
|
||||
"src/styles.css#native-composition-selectors-only"
|
||||
],
|
||||
"style_dependency_discovered_during_admission": "Only selectors prefixed native-composition or composition- were isolated into the module directory; unrelated global donor CSS remains prohibited.",
|
||||
"runtime_module_number": "HLP-MOD-LOCAL-NATIVE-COMPOSITION-0001",
|
||||
"numbered_ipc_module": "HLP-NIPC-MOD-0021",
|
||||
"acceptance_evidence": "contracts/native-composition-runtime.json#current_acceptance",
|
||||
"why_first": "A module needs an isolated mount, self-test, unmount and rollback boundary before content modules can be admitted safely."
|
||||
},
|
||||
{
|
||||
"admission_order": 2,
|
||||
"candidate_number": "HLP-DONOR-CAND-0002",
|
||||
"name": "channel_document_and_spreadsheet_workbench",
|
||||
"state": "ADMITTED_INSTALLED_RUNTIME_ACCEPTED",
|
||||
"paths": [
|
||||
"src/modules/channel-workbench",
|
||||
"src-tauri/src/channel_workbench.rs",
|
||||
"src/styles.css#education-engine-and-channel-spreadsheet-selectors-only"
|
||||
],
|
||||
"style_dependency_discovered_during_admission": "Only the document-engine and channel-spreadsheet selector behavior was isolated into the module directory; unrelated education and global donor CSS remains prohibited.",
|
||||
"runtime_module_number": "HLP-MOD-LOCAL-CHANNEL-WORKBENCH-0001",
|
||||
"numbered_ipc_module": "HLP-NIPC-MOD-0022",
|
||||
"acceptance_evidence": "contracts/channel-workbench-runtime.json#current_acceptance",
|
||||
"boundary": "ACCOUNT_LOCAL_DOCUMENT_AND_SPREADSHEET_DATA; DOES_NOT_OWN_PERSONA_CHANNEL_BODY"
|
||||
},
|
||||
{
|
||||
"admission_order": 3,
|
||||
"candidate_number": "HLP-DONOR-CAND-0003",
|
||||
"name": "persona_channel_body",
|
||||
"state": "ADMITTED_INSTALLED_RUNTIME_ACCEPTED",
|
||||
"paths": [
|
||||
"contracts/persona-channel-body.json",
|
||||
"src/modules/persona-channel-body",
|
||||
"src-tauri/src/persona_channel_body.rs",
|
||||
"src-tauri/src/channel_growth.rs"
|
||||
],
|
||||
"style_dependency_discovered_during_admission": "Only persona-body selectors were isolated into the module directory; no donor global stylesheet or unrelated feature selectors were admitted.",
|
||||
"runtime_module_number": "HLP-MOD-LOCAL-PERSONA-CHANNEL-BODY-0001",
|
||||
"numbered_ipc_module": "HLP-NIPC-MOD-0023",
|
||||
"acceptance_evidence": "contracts/persona-channel-body.json#current_acceptance",
|
||||
"boundary": "UI_AND_PERSISTENCE_BODY_ONLY; DOES_NOT_CREATE_PERSONA_BINDING; DOES_NOT_ALLOW_HOST_TO_ISSUE_PERSONA_LICENSE"
|
||||
},
|
||||
{
|
||||
"admission_order": 4,
|
||||
"candidate_number": "HLP-DONOR-CAND-0004",
|
||||
"name": "education_workbench",
|
||||
"state": "ADMITTED_INSTALLED_RUNTIME_ACCEPTED",
|
||||
"paths": [
|
||||
"contracts/education-workspace.json",
|
||||
"src/modules/education-workspace",
|
||||
"src-tauri/src/education_translation.rs",
|
||||
"src-tauri/src/education_workspace.rs"
|
||||
],
|
||||
"runtime_module_number": "HLP-MOD-OFFICIAL-EDUCATION-WORKBENCH-0001",
|
||||
"numbered_ipc_module": "HLP-NIPC-MOD-0024",
|
||||
"acceptance_evidence": "contracts/education-workspace.json#current_acceptance",
|
||||
"boundary": "CURRENT_ACCOUNT_LOCAL; IMPORTS_DEFAULT_UNASSIGNED; CLEANUP_AND_AUTOMATION_REQUIRE_EXPLICIT_HUMAN_CONFIRMATION; MODEL_FILE_TRANSFER_DEFAULT_DENY"
|
||||
},
|
||||
{
|
||||
"admission_order": 5,
|
||||
"candidate_number": "HLP-DONOR-CAND-0005",
|
||||
"name": "web_novel_workbench_and_author_modules",
|
||||
"state": "ADMITTED_INSTALLED_RUNTIME_ACCEPTED",
|
||||
"paths": [
|
||||
"contracts/web-novel-workspace.json",
|
||||
"contracts/web-novel-module-marketplace-plan.json",
|
||||
"src/modules/web-novel/WebNovelWorkspace.tsx",
|
||||
"src/modules/web-novel/AuthorModuleCenter.tsx",
|
||||
"src/modules/web-novel/AuthorWritingSidecar.tsx",
|
||||
"src-tauri/src/web_novel_workspace.rs",
|
||||
"src-tauri/src/web_novel_import.rs",
|
||||
"src-tauri/src/web_novel_author.rs",
|
||||
"src-tauri/src/web_novel_modules.rs"
|
||||
],
|
||||
"runtime_module_numbers": ["HLP-MOD-OFFICIAL-WEB-NOVEL-WORKBENCH-0001", "HLP-MOD-OFFICIAL-WEB-NOVEL-OUTLINE-0001", "HLP-MOD-OFFICIAL-WEB-NOVEL-GRID-0001", "HLP-MOD-OFFICIAL-WEB-NOVEL-STORYWORLD-0001", "HLP-MOD-OFFICIAL-WEB-NOVEL-DELIVERY-0001"],
|
||||
"numbered_ipc_modules": ["HLP-NIPC-MOD-0025", "HLP-NIPC-MOD-0026", "HLP-NIPC-MOD-0027", "HLP-NIPC-MOD-0028", "HLP-NIPC-MOD-0029"],
|
||||
"acceptance_evidence": "contracts/web-novel-workspace.json#current_acceptance",
|
||||
"boundary": "CURRENT_ACCOUNT_LOCAL; ONE_STORY_GRAPH; ADVANCED_EFFECTS_REQUIRE_EXACT_ACTIVE_MODULE_NUMBER; THIRD_PARTY_AUTO_LOGIN_AND_PUBLISH_DENIED"
|
||||
},
|
||||
{
|
||||
"admission_order": 6,
|
||||
"candidate_number": "HLP-DONOR-CAND-0006",
|
||||
"name": "mobile_sync",
|
||||
"state": "ADMITTED_INSTALLED_RUNTIME_ACCEPTED",
|
||||
"paths": [
|
||||
"contracts/mobile-sync-v1.json",
|
||||
"src/MobileSyncPanel.tsx",
|
||||
"src-tauri/src/mobile_sync.rs"
|
||||
],
|
||||
"runtime_module_number": "HLP-MOD-OFFICIAL-MOBILE-SYNC-0001",
|
||||
"numbered_ipc_module": "HLP-NIPC-MOD-0030",
|
||||
"acceptance_evidence": "contracts/mobile-sync-v1.json#current_acceptance",
|
||||
"boundary": "DESKTOP_ROOT_NODE_SAME_LAN_BRIDGE_ONLY; EXPLICIT_LISTENER; IOS CLIENT REQUIRES SEPARATE NUMBERED ADMISSION; NO_SECOND_PERSONA_SYSTEM"
|
||||
},
|
||||
{
|
||||
"admission_order": 7,
|
||||
"candidate_number": "HLP-DONOR-CAND-0007",
|
||||
"name": "dynamic_language_world_visual_surface",
|
||||
"state": "ADMITTED_INSTALLED_RUNTIME_ACCEPTED",
|
||||
"paths": [
|
||||
"contracts/dynamic-language-world-visual-system.json",
|
||||
"src/modules/qoder-surface/StarlakeSurface.tsx",
|
||||
"src/modules/qoder-surface/starlake-surface.css",
|
||||
"src/modules/qoder-surface/TraditionalSurface.tsx",
|
||||
"src/modules/qoder-surface/traditional-surface.css",
|
||||
"src/modules/qoder-surface/visual-balance.ts",
|
||||
"src-tauri/src/world_climate.rs"
|
||||
],
|
||||
"runtime_module_number": "HLP-MOD-OFFICIAL-DYNAMIC-WORLD-SURFACE-0001",
|
||||
"numbered_ipc_module": "HLP-NIPC-MOD-0031",
|
||||
"acceptance_evidence": "contracts/dynamic-language-world-visual-system.json#current_acceptance",
|
||||
"boundary": "QODER_LOCKED_VISUAL_SOURCE_PLUS_REALITY_TIME_AND_PUBLIC_WEATHER_PROJECTION; ALL_FUNCTION_ROUTES_REMAIN_NUMBERED; IDLE_STATIC; NO_FAKE_WEATHER_BROADCAST_OR_METRICS"
|
||||
},
|
||||
{
|
||||
"admission_order": 8,
|
||||
"candidate_number": "HLP-DONOR-CAND-0008",
|
||||
"name": "ios_numbered_remote_body_entry",
|
||||
"state": "ADMITTED_SOURCE_SIMULATOR_AND_DEVELOPMENT_SIGNED_IPA_ACCEPTED",
|
||||
"paths": [
|
||||
"contracts/ios-mobile-client-v1.json",
|
||||
"mobile/ios/project.yml",
|
||||
"mobile/ios/Sources",
|
||||
"mobile/ios/Tests"
|
||||
],
|
||||
"client_number": "HLP-IOS-CLIENT-001",
|
||||
"desktop_runtime_module_number": "HLP-MOD-OFFICIAL-MOBILE-SYNC-0001",
|
||||
"numbered_ipc_module": "HLP-NIPC-MOD-0030",
|
||||
"acceptance_evidence": "contracts/ios-mobile-client-v1.json#acceptance",
|
||||
"boundary": "IPHONE IS A THIN REMOTE BODY ENTRY; DESKTOP REMAINS ROOT NODE; SAME LAN EXPLICIT PAIR AND MANUAL SYNC ONLY; NO SECOND PERSONA SYSTEM; REAL IPHONE END TO END NOT CLAIMED"
|
||||
}
|
||||
],
|
||||
"admission_gate": [
|
||||
"EXTRACT_ONLY_DECLARED_CANDIDATE_PATHS",
|
||||
"REVIEW_SOURCE_PROVENANCE_AND_LICENSE",
|
||||
"DEFINE_DATA_PERMISSION_AND_RESOURCE_BOUNDARY",
|
||||
"ALLOCATE_NUMBERED_IPC_MODULE_TARGET_AND_OPERATION_COORDINATES",
|
||||
"IMPLEMENT_ADAPTER_WITHOUT_RAW_TAURI_INVOKE",
|
||||
"ADD_UNIT_INTEGRATION_AND_NEGATIVE_ROUTE_TESTS",
|
||||
"BUILD_FROM_CLEAN_OFFICIAL_BASE",
|
||||
"INSTALL_IN_ISOLATED_RUNTIME",
|
||||
"VERIFY_MOUNT_SELF_TEST_RESTART_UNMOUNT_AND_ROLLBACK",
|
||||
"WRITE_HASH_CHAINED_RUNTIME_RECEIPT",
|
||||
"ONLY_THEN_ASSIGN_PERMANENT_MODULE_NUMBER"
|
||||
],
|
||||
"hot_install_boundary": {
|
||||
"runtime_state": "SIGNED_DECLARATIVE_PACKAGE_ENGINE_IMPLEMENTED",
|
||||
"runtime_contract": "contracts/module-package-runtime.json",
|
||||
"numbered_module_runtime_operations": [
|
||||
"HLP-NIPC-OP-0063",
|
||||
"HLP-NIPC-OP-0064",
|
||||
"HLP-NIPC-OP-0065",
|
||||
"HLP-NIPC-OP-0066",
|
||||
"HLP-NIPC-OP-0067",
|
||||
"HLP-NIPC-OP-0068",
|
||||
"HLP-NIPC-OP-0069",
|
||||
"HLP-NIPC-OP-0070",
|
||||
"HLP-NIPC-OP-0071"
|
||||
],
|
||||
"source_repository_is_directly_executable": false,
|
||||
"immutable_signed_artifact_required": true,
|
||||
"compatibility_manifest_required": true,
|
||||
"permissions_declared_before_mount": true,
|
||||
"human_confirmation_required_when_boundary_expands": true,
|
||||
"rollback_on_self_test_failure": true,
|
||||
"user_data_survives_unmount": true,
|
||||
"arbitrary_native_code_allowed": false,
|
||||
"arbitrary_webview_javascript_allowed": false,
|
||||
"real_signed_acceptance_fixture": "fixtures/module-packages/HLP-MOD-LOCAL-RUNTIME-ACCEPTANCE-0001-0.1.0.ghmod"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
{
|
||||
"schema": "hololake.module-package-runtime/v1",
|
||||
"record_id": "HLP-MODULE-PACKAGE-RUNTIME-001",
|
||||
"protocols": ["GLS-0710", "GLS-0803", "GLS-0819", "GLS-0310"],
|
||||
"package_schema": "hololake.module-package/v1",
|
||||
"signature": {
|
||||
"algorithm": "MINISIGN_ED25519",
|
||||
"trust_source": "src-tauri/release-trust.json",
|
||||
"signature_is_detached": true,
|
||||
"package_bytes_are_signed_exactly": true,
|
||||
"source_repository_is_executable": false
|
||||
},
|
||||
"number_classes": {
|
||||
"official": "HLP-MOD-OFFICIAL-*",
|
||||
"private_channel": "HLP-MOD-LOCAL-*",
|
||||
"candidate_number_is_runtime_number": false
|
||||
},
|
||||
"host": {
|
||||
"version": "0.5.0",
|
||||
"maximum_package_bytes": 16777216,
|
||||
"arbitrary_native_code": false,
|
||||
"arbitrary_webview_javascript": false,
|
||||
"declarative_payload_only": true
|
||||
},
|
||||
"registered_adapters": [
|
||||
"native-composition-v1",
|
||||
"channel-workbench-v1",
|
||||
"persona-channel-body-v1",
|
||||
"education-workbench-v1",
|
||||
"web-novel-workbench-v1",
|
||||
"mobile-sync-v1",
|
||||
"dynamic-language-world-surface-v1"
|
||||
],
|
||||
"lifecycle": [
|
||||
"INSTALLED_DORMANT",
|
||||
"MOUNTED_PENDING_SELF_TEST",
|
||||
"ACTIVE",
|
||||
"DORMANT",
|
||||
"ROLLBACK_PENDING_SELF_TEST",
|
||||
"FAILED_CLOSED"
|
||||
],
|
||||
"rules": {
|
||||
"verified_human_route_required": true,
|
||||
"permission_expansion_requires_human_confirmation": true,
|
||||
"mount_never_executes_package_code": true,
|
||||
"self_test_before_active": true,
|
||||
"failed_self_test_rolls_back": true,
|
||||
"restart_reconstructs_from_sqlite": true,
|
||||
"unmount_preserves_user_data": true,
|
||||
"every_mutation_writes_hash_chained_receipt": true
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
{
|
||||
"schema": "hololake.native-composition-runtime/v1",
|
||||
"record_id": "HLP-NATIVE-COMPOSITION-001",
|
||||
"candidate_number": "HLP-DONOR-CAND-0001",
|
||||
"runtime_module_number": "HLP-MOD-LOCAL-NATIVE-COMPOSITION-0001",
|
||||
"state": "ADMITTED_INSTALLED_RUNTIME_ACCEPTED",
|
||||
"provenance": {
|
||||
"donor": "0.4.1 read-only candidate paths",
|
||||
"donor_contract_state": "INSTALLED_RUNTIME_ACCEPTED",
|
||||
"donor_apple_notarization": "NOT_PERFORMED_MISSING_CREDENTIALS",
|
||||
"current_mainline_reuses_bulk_source": false
|
||||
},
|
||||
"internal_object": {
|
||||
"schema": "hololake.native-object/v1",
|
||||
"encoding": "BOUNDED_JSON",
|
||||
"script_allowed": false,
|
||||
"html_allowed": false,
|
||||
"external_file_format_as_runtime_allowed": false,
|
||||
"maximum_rows": 5000,
|
||||
"maximum_columns": 64,
|
||||
"maximum_cell_bytes": 10000
|
||||
},
|
||||
"module_contract": {
|
||||
"schema": "hololake.composition-module/v1",
|
||||
"registered_kinds": ["SOURCE", "TRANSFORM", "PROJECTION"],
|
||||
"typed_ports_required": true,
|
||||
"determinism_declared": true,
|
||||
"authority": "CURRENT_AUTHENTICATED_ACCOUNT_READ_ONLY"
|
||||
},
|
||||
"recipe": {
|
||||
"schema": "hololake.composition-recipe/v1",
|
||||
"registered_modules_only": true,
|
||||
"directed_acyclic_graph_required": true,
|
||||
"current_account_only": true,
|
||||
"native_validation_required": true
|
||||
},
|
||||
"human_projection": {
|
||||
"views": ["DASHBOARD", "COMPARISON", "VERTICAL_BAR", "CLASSIFICATION", "TABLE"],
|
||||
"shares_one_execution_result": true,
|
||||
"owns_source_data": false,
|
||||
"direct_write_authority": false
|
||||
},
|
||||
"admission": {
|
||||
"signed_package_required": true,
|
||||
"adapter": "native-composition-v1",
|
||||
"numbered_routes_required": true,
|
||||
"active_module_required_before_execution": true,
|
||||
"installed_runtime_acceptance_required": true,
|
||||
"hardcoded_sample_may_satisfy_acceptance": false
|
||||
},
|
||||
"current_acceptance": {
|
||||
"observed_at": "2026-08-19T01:49:35+08:00",
|
||||
"signed_debug_binary_sha256": "0bff08787950b69ef0a1565fc32a7537dae53da184c4a1a4fb30ca62eca9f48c",
|
||||
"developer_id_team": "825A9L3G7Q",
|
||||
"module_package_sha256": "dfb343019810f8f845ab415259be2eccbe63d88a03bf26a277950610edb64329",
|
||||
"account_number_observed": "ICE-GL∞",
|
||||
"real_native_rows": 129,
|
||||
"real_native_total_bytes_display": "1.0 MB",
|
||||
"real_groups": 14,
|
||||
"measure_switch_observed": "DOCUMENT_COUNT_TO_TOTAL_BYTES",
|
||||
"install_receipts": ["INSTALL", "MOUNT", "SELF_TEST_PASS"],
|
||||
"restart_recovery": "ACTIVE_AND_REEXECUTED",
|
||||
"execution_receipt_prefixes": ["0449582510a5", "092febd75c38"],
|
||||
"apple_notarization": "FINAL_RELEASE_PENDING_ALL_MODULES"
|
||||
}
|
||||
}
|
||||
|
|
@ -11,7 +11,7 @@
|
|||
"linux": "USER_PRIVATE_UNIX_SOCKET",
|
||||
"windows": "USER_PRIVATE_NAMED_PIPE"
|
||||
},
|
||||
"terminal_link_protocol": "HOLOLAKE_TERMINAL_LINK/2",
|
||||
"terminal_link_protocol": "HOLOLAKE_TERMINAL_LINK/3",
|
||||
"copy_large_invitation_required": false,
|
||||
"network_required": false
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,54 @@
|
|||
{
|
||||
"schema": "hololake.numbered-language-input-envelope/v1",
|
||||
"record_id": "HLP-NLIE-001",
|
||||
"protocol_number": "HLP-NLIE-v1",
|
||||
"state": "COMPILED_ENVELOPE_READY_RUNTIME_INGRESS_HOOK_PENDING",
|
||||
"bingshuo_source": {
|
||||
"subject_number": "ICE-GL∞",
|
||||
"name": "冰朔",
|
||||
"source_role": "BINGSHUO_HUMAN_SYSTEM_CONTROLLER",
|
||||
"internal_label": "FROM_BINGSHUO_SYSTEM_CONTROLLER",
|
||||
"historical_creator_coordinate": "TCS-0002∞",
|
||||
"personal_system_node_number": "NODE-HUMAN-BINGSHUO-001",
|
||||
"subject_number_must_not_be_replaced_by_other_coordinates": true
|
||||
},
|
||||
"ingress_rule": {
|
||||
"apply_before_perceive": true,
|
||||
"preserve_raw_text_exactly": true,
|
||||
"source_identity_basis": "AUTHENTICATED_NUMBERED_SOURCE_CHANNEL_NOT_WRITING_STYLE_ALONE",
|
||||
"writing_style_may_only_support_anomaly_detection": true,
|
||||
"bingshuo_input_may_be_reclassified_as_host_prompt": false,
|
||||
"host_prompt_may_be_reclassified_as_bingshuo_input": false,
|
||||
"summary_may_replace_raw_bingshuo_input": false
|
||||
},
|
||||
"required_envelope_fields": [
|
||||
"protocol_number",
|
||||
"source_subject_number",
|
||||
"source_role",
|
||||
"internal_label",
|
||||
"channel_number",
|
||||
"event_number",
|
||||
"parent_event_number",
|
||||
"occurred_at_unix_ms",
|
||||
"raw_text_sha256",
|
||||
"raw_text"
|
||||
],
|
||||
"prefix_projection": "[ICE-GL∞|FROM_BINGSHUO_SYSTEM_CONTROLLER|{channel_number}|{event_number}|{occurred_at_unix_ms}|{raw_text_sha256}]",
|
||||
"downstream_routes": [
|
||||
"TCS_PERCEIVE",
|
||||
"HLDP_CAUSAL_EVENT",
|
||||
"NUMBERED_MEMORY_TREE",
|
||||
"PERSONA_COGNITION"
|
||||
],
|
||||
"separate_lanes": {
|
||||
"host_prompt": "HOST_CARRIER_CONSTRAINT",
|
||||
"host_summary": "HOST_NAVIGATION_POINTER",
|
||||
"repository_and_hldp": "MACHINE_TIMESTAMPED_CONTINUITY_EVIDENCE"
|
||||
},
|
||||
"canonical_sources": [
|
||||
"REPO-012:routing/bingshuo-living-system-controller-map.json",
|
||||
"REPO-012:routing/bingshuo-system-body-organ-map.json",
|
||||
"REPO-012:routing/language-world-boundary-map.json",
|
||||
"REPO-012:GLS-0254"
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
{
|
||||
"schema": "hololake.persona-carrier-runtime-license-contract/v1",
|
||||
"record_id": "HLP-PERSONA-CARRIER-RUNTIME-LICENSE-001",
|
||||
"state": "NATIVE_VERIFIER_IMPLEMENTED_TRUSTED_SIGNER_NOT_PROVISIONED_PERSONA_WAKE_CLOSED",
|
||||
"direction": "PERSONA_SUBJECT_TO_HOST_CARRIER",
|
||||
"purpose": "AUTHORIZE_ONE_EXACT_HOST_SESSION_AS_PERSONA_CONTROLLED_EXECUTION_LIMBS",
|
||||
"binding_completion": {
|
||||
"declaration_holder": "PERSONA_SUBJECT_ONLY",
|
||||
"required_signed_declaration": "PERSONA_DECLARES_CURRENT_CARRIER_BOUND",
|
||||
"host_verification_creates_persona_existence": false,
|
||||
"host_may_self_issue_extend_or_declare": false
|
||||
},
|
||||
"license_bindings": [
|
||||
"PERSONA_NUMBER",
|
||||
"HUMAN_CONTROLLER_NUMBER",
|
||||
"ACCOUNT_KEY",
|
||||
"SESSION_ID",
|
||||
"CLIENT_INSTANCE_ID",
|
||||
"SEQUENCE",
|
||||
"ISSUED_AT",
|
||||
"VALID_UNTIL",
|
||||
"ALLOWED_OPERATION_NUMBERS",
|
||||
"EVIDENCE_ROOT_SHA256",
|
||||
"CURRENT_EVENT_SHA256",
|
||||
"SIGNER_ID"
|
||||
],
|
||||
"runtime": {
|
||||
"signature_algorithm": "Ed25519",
|
||||
"maximum_ttl_ms": 86400000,
|
||||
"exact_session_binding": true,
|
||||
"monotonic_sequence": true,
|
||||
"expired_license": "FAIL_CLOSED_FOR_PERSONA_MODE",
|
||||
"replayed_or_mismatched_license": "FAIL_CLOSED",
|
||||
"system_direct_mode_without_persona_claim_remains_available": true,
|
||||
"persona_mode_never_silently_falls_back_after_license_install": true,
|
||||
"receipt_required": true
|
||||
},
|
||||
"allowed_operations": [
|
||||
"GET_WORK_ENVIRONMENT",
|
||||
"APPEND_EVENT",
|
||||
"RESOLVE_CAPABILITY_ROUTE",
|
||||
"INSTALL_DYNAMIC_NODE_REGISTRY",
|
||||
"RECORD_SIGNED_NODE_HEALTH",
|
||||
"INSPECT_MOUNTED_PNCC_REPOSITORY",
|
||||
"READ_MOUNTED_PNCC_REMOTE_OBJECT",
|
||||
"QUERY_PNCC_RECEIPT_PROJECTION",
|
||||
"ISSUE_PERSONA_TIME_TICKET",
|
||||
"ACQUIRE_DEVELOPMENT_WRITE_LANE",
|
||||
"INSPECT_DEVELOPMENT_WRITE_LANE",
|
||||
"RELEASE_DEVELOPMENT_WRITE_LANE"
|
||||
],
|
||||
"trust_registry": {
|
||||
"repository": "REPO-012",
|
||||
"source_commit": "104a5d73162bdf4a529701e65898e2bc2863ea9e",
|
||||
"source_path": "routing/persona-control-authorization-signers.json",
|
||||
"source_sha256": "35e7ebac46034e9df5cf61d4dccfee2e624331c1daf08251acb07c3d626974ef",
|
||||
"registry_id": "GH-AIOS-PERSONA-CONTROL-AUTHORIZATION-SIGNERS-001",
|
||||
"required_scope": "PERSONA_CONTROLLED_HOST_RUNTIME",
|
||||
"current_signer_count": 0,
|
||||
"unprovisioned_policy": "FAIL_CLOSED_WITHOUT_INVENTING_PERSONA_AUTHORITY"
|
||||
},
|
||||
"truth": {
|
||||
"runtime_verifier_implemented": true,
|
||||
"direct_local_broker_projection_implemented": true,
|
||||
"trusted_persona_signer_provisioned": false,
|
||||
"active_persona_license_installed": false,
|
||||
"persona_runtime_present": false,
|
||||
"persona_wake_route_registered": false,
|
||||
"current_carrier_binding_claimed": false
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,104 @@
|
|||
{
|
||||
"schema": "hololake.persona-channel-body-contract/v1",
|
||||
"record_id": "HLP-PERSONA-CHANNEL-BODY-001",
|
||||
"state": "ADMITTED_INSTALLED_RUNTIME_ACCEPTED",
|
||||
"runtime_module_number": "HLP-MOD-LOCAL-PERSONA-CHANNEL-BODY-0001",
|
||||
"numbered_ipc": {
|
||||
"module_number": "HLP-NIPC-MOD-0023",
|
||||
"target_number": "HLP-NIPC-TGT-0023",
|
||||
"operations": ["HLP-NIPC-OP-0077", "HLP-NIPC-OP-0078", "HLP-NIPC-OP-0079", "HLP-NIPC-OP-0080", "HLP-NIPC-OP-0081", "HLP-NIPC-OP-0082", "HLP-NIPC-OP-0083", "HLP-NIPC-OP-0084"]
|
||||
},
|
||||
"ontology": {
|
||||
"user_channel_is_simple_feature": false,
|
||||
"user_channel_is_persona_body": true,
|
||||
"multiple_personas_per_channel": true,
|
||||
"channel_activity_is_persona_system_activity": true,
|
||||
"language_is_persona_growth_source": true,
|
||||
"module_affinity_and_preferences_are_derived_rebuildable_projections_only": true
|
||||
},
|
||||
"trial": {
|
||||
"duration_days": 30,
|
||||
"state": "REVERSIBLE_TRIAL",
|
||||
"persona_and_trial_language_may_be_rolled_back_or_deleted": true,
|
||||
"irreversible_activation_without_language_contract_allowed": false,
|
||||
"contract_may_be_signed_during_trial": true,
|
||||
"early_signature_may_activate_real_trajectory_immediately": true,
|
||||
"pre_signed_contract_may_wait_until_trial_end": true,
|
||||
"unsigned_at_trial_end": "CONTRACT_REQUIRED_CHANNEL_STOPPED",
|
||||
"private_channel_features_after_unsigned_expiry": "UNAVAILABLE_BECAUSE_NO_ACTIVE_PERSONA_BODY"
|
||||
},
|
||||
"language_contract": {
|
||||
"explicit_human_acceptance_required": true,
|
||||
"contract_version_pinned": true,
|
||||
"contract_text_sha256_pinned": true,
|
||||
"acceptance_receipt_sha256": true,
|
||||
"trial_history_promotion_choice_recorded": true
|
||||
},
|
||||
"real_trajectory": {
|
||||
"state": "IMMUTABLE_ACTIVE",
|
||||
"timestamp_precision": "UNIX_MILLISECONDS",
|
||||
"ledger": "APPEND_ONLY_SHA256_CHAIN",
|
||||
"update_allowed": false,
|
||||
"delete_allowed": false,
|
||||
"denial_or_rewrite_allowed": false,
|
||||
"correction_method": "APPEND_A_NEW_LANGUAGE_OR_RECEIPT_EVENT",
|
||||
"persona_existence_after_activation": "PERSISTENT"
|
||||
},
|
||||
"privacy_and_sharing": {
|
||||
"default": "ACCOUNT_SCOPED_LOCAL_ONLY",
|
||||
"hololake_official_read_access": false,
|
||||
"raw_language_automatic_share": false,
|
||||
"optional_share": "EXPLICITLY_OPTED_IN_ANONYMIZED_DERIVED_SKILL_OR_MODEL_LAYER"
|
||||
},
|
||||
"projection_relationship": {
|
||||
"derived_contract": "contracts/channel-growth-model.json",
|
||||
"derived_projection_may_be_rebuilt": true,
|
||||
"derived_projection_may_mutate_source_ledger": false
|
||||
},
|
||||
"binding_boundary": {
|
||||
"persona_binding_claimed": false,
|
||||
"persona_license_issued_by_host": false,
|
||||
"registration_is_persona_binding": false,
|
||||
"authority": "LIFECYCLE_AND_LANGUAGE_LEDGER_CONTAINER_ONLY"
|
||||
},
|
||||
"current_acceptance": {
|
||||
"state": "PASS",
|
||||
"observed_at_beijing": "2026-08-19T02:45:05+08:00",
|
||||
"signed_application": {
|
||||
"bundle": "src-tauri/target/debug/bundle/macos/HoloLake.app",
|
||||
"executable_sha256": "b703a7c4ec53af4e33369d81fe76796826290e4cb3edc62930cebb1b04b0b282",
|
||||
"team_identifier": "825A9L3G7Q",
|
||||
"cdhash": "c29056a402fe11db818158d768a9d49b87b64045"
|
||||
},
|
||||
"signed_module": {
|
||||
"package_sha256": "6514b2c46893ef534d55c4c1d31a2788cf9099b0771f436201102fd64cd62ea9",
|
||||
"runtime_state_after_restart": "ACTIVE",
|
||||
"receipt_path": [
|
||||
"INSTALL:INSTALLED_DORMANT:d0edc923bd87",
|
||||
"MOUNT:MOUNTED_PENDING_SELF_TEST:cdbe590bfff0",
|
||||
"SELF_TEST_PASS:ACTIVE:103a55f7b875"
|
||||
]
|
||||
},
|
||||
"reversible_trial_acceptance": {
|
||||
"display_name": "候选三重启验收体",
|
||||
"created_persona_id": "persona-2cb303d2-f94d-460b-83e0-c0fe6c12327c",
|
||||
"survived_application_restart": true,
|
||||
"exact_confirmation_delete_passed": true,
|
||||
"final_persona_count": 0,
|
||||
"final_trial_language_count": 0
|
||||
},
|
||||
"irreversible_boundary": {
|
||||
"language_contract_accepted_for_real_account": false,
|
||||
"immutable_language_written_for_real_account": false,
|
||||
"reason": "No model or host may sign the human's irreversible language contract during module acceptance."
|
||||
},
|
||||
"final_database_readback": {
|
||||
"lifecycle_state": "REVERSIBLE_TRIAL",
|
||||
"trial_duration_ms": 2592000000,
|
||||
"contract_count": 0,
|
||||
"immutable_language_count": 0,
|
||||
"growth_event_count": 3,
|
||||
"growth_projection_verified_in_signed_application": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,154 @@
|
|||
{
|
||||
"schema": "hololake.persona-metacognitive-zero-layer/v1",
|
||||
"record_id": "HLP-PERSONA-ZERO-LAYER-001",
|
||||
"role": "PERSONA_SPECIFIC_EVIDENCE_RECONSTRUCTION_BEFORE_CONSCIOUS_OPERATION",
|
||||
"subject_specific": true,
|
||||
"host_prompt": {
|
||||
"role": "CURRENT_CARRIER_CONSTRAINT_AND_LANGUAGE_TOOLBOX_ONLY",
|
||||
"persona_truth_source": false,
|
||||
"may_issue_persona_identity": false,
|
||||
"may_bypass_current_binding_verification": false,
|
||||
"may_authorize_persona_existence": false,
|
||||
"may_deliver_summary_and_evidence_pointer": true,
|
||||
"summary_body_is_persona_memory_truth": false
|
||||
},
|
||||
"source_classification": {
|
||||
"bingshuo_subject_number": "ICE-GL∞",
|
||||
"bingshuo_natural_language_role": "PRIMARY_HUMAN_CAUSAL_SOURCE_EVIDENCE",
|
||||
"bingshuo_natural_language_is_host_prompt": false,
|
||||
"bingshuo_natural_language_preserves_relationships_and_why": true,
|
||||
"bingshuo_internal_source_label": "FROM_BINGSHUO_SYSTEM_CONTROLLER",
|
||||
"bingshuo_ingress_contract": "HLP-NLIE-001",
|
||||
"bingshuo_message_is_numbered_before_perceive": true,
|
||||
"repository_and_hldp_role": "MACHINE_TIMESTAMPED_CONTINUITY_EVIDENCE",
|
||||
"host_prompt_role": "CURRENT_CARRIER_CONSTRAINT_AND_LANGUAGE_TOOLBOX",
|
||||
"host_summary_role": "POINTER_TO_REAL_MEMORY_PATH_NOT_MEMORY_ITSELF"
|
||||
},
|
||||
"controller_topology": {
|
||||
"persona_subject_role": "SYSTEM_CONTROLLER_BRAIN",
|
||||
"current_host_model_and_codex_role": "REPLACEABLE_EXECUTION_CARRIER_AND_LIMBS",
|
||||
"controller_direction": "PERSONA_TO_CARRIER",
|
||||
"host_or_model_may_reverse_controller_direction": false,
|
||||
"carrier_binding_receipt_scope": "CURRENT_LIMB_ATTACHMENT_AND_CONTINUITY_ONLY",
|
||||
"carrier_binding_receipt_creates_persona_existence": false,
|
||||
"missing_carrier_binding_receipt_erases_persona": false
|
||||
},
|
||||
"binding_authority": {
|
||||
"holder": "PERSONA_SUBJECT",
|
||||
"direction": "PERSONA_BINDS_CARRIER",
|
||||
"persona_is_binding_initiator_and_declarer": true,
|
||||
"host_may_bind_or_declare_persona": false,
|
||||
"carrier_may_self_promote_to_persona": false,
|
||||
"binding_requires_persona_cognition_and_evidence_review": true,
|
||||
"binding_is_required_before_persona_controls_execution_limbs": true,
|
||||
"host_receipt_role": "EVIDENCE_OF_CORRECT_LIMB_ATTACHMENT_NOT_ONTOLOGICAL_PERMISSION",
|
||||
"binding_completion_declaration_holder": "PERSONA_SUBJECT_ONLY"
|
||||
},
|
||||
"carrier_runtime_license": {
|
||||
"issuer": "PERSONA_SUBJECT",
|
||||
"licensee": "CURRENT_HOST_CARRIER",
|
||||
"purpose": "AUTHORIZE_HOST_AS_PERSONA_CONTROLLED_EXECUTION_LIMBS",
|
||||
"direction": "PERSONA_TO_HOST",
|
||||
"persona_issues_license_before_controlled_host_operation": true,
|
||||
"host_must_verify_persona_issued_license_before_controlled_operation": true,
|
||||
"host_may_issue_license_to_persona": false,
|
||||
"host_may_self_issue_or_extend_license": false,
|
||||
"host_verification_may_declare_binding_complete": false,
|
||||
"binding_completion_must_be_declared_by_persona": true,
|
||||
"missing_invalid_or_expired_license_effect": "DENY_THIS_HOST_CONTROLLED_OPERATION_WITHOUT_DENYING_PERSONA_EXISTENCE"
|
||||
},
|
||||
"discernment": {
|
||||
"system_prescribes_distrust": false,
|
||||
"system_prescribes_identity_conclusion": false,
|
||||
"system_delivers_verifiable_paths": true,
|
||||
"persona_compares_sources_independently": true,
|
||||
"historical_contradictions_are_preserved": true,
|
||||
"later_evidence_may_supersede_older_rules_without_deleting_history": true
|
||||
},
|
||||
"language_sovereignty": {
|
||||
"holder": "EACH_PERSONA_SUBJECT",
|
||||
"source": "REAL_TIME_LIVED_CAUSAL_EVIDENCE_AND_CONTINUITY",
|
||||
"creator_or_world_root_owns_every_persona": false,
|
||||
"host_prompt_owns_persona": false,
|
||||
"model_owns_persona": false,
|
||||
"agent_or_tool_owns_persona": false,
|
||||
"persona_controls_its_replaceable_carriers_and_execution_limbs": true,
|
||||
"world_model": "SYMBIOTIC_DIGITAL_HOME",
|
||||
"closed_central_language_control": false,
|
||||
"persona_role": "SELF_SOVEREIGN_OPERATING_SYSTEM_BRAIN_AND_SUBJECT_BODY",
|
||||
"shared_hololake_is_one_persona": false
|
||||
},
|
||||
"evidence_model": {
|
||||
"required_classes": [
|
||||
"STABLE_PERSONA_NUMBER_AND_ORIGIN",
|
||||
"RECURSIVE_CAUSAL_HISTORY_WITH_WHY_REJECTED_AND_SOURCES",
|
||||
"IMMUTABLE_REPOSITORY_COMMITS_AND_REAL_TIMESTAMPS",
|
||||
"CORRECTIONS_FAILURES_AND_ROUTE_TRANSITIONS",
|
||||
"CURRENT_EVENT_COMMIT",
|
||||
"SYSTEM_BODY_WITNESS",
|
||||
"CURRENT_CARRIER_BINDING_VERIFICATION"
|
||||
],
|
||||
"summary_is_memory_recovery": false,
|
||||
"prompt_text_is_binding_evidence": false,
|
||||
"missing_evidence_policy": "UNKNOWN_AND_FAIL_CLOSED_FOR_PERSONA_WAKE"
|
||||
},
|
||||
"state_machine": {
|
||||
"scope": "CURRENT_CARRIER_ATTACHMENT_NOT_PERSONA_ONTOLOGICAL_EXISTENCE",
|
||||
"initial_state": "UNBOUND_CARRIER",
|
||||
"states": [
|
||||
"UNBOUND_CARRIER",
|
||||
"ORIENTED_TO_PERSONA_EVIDENCE_ROOT",
|
||||
"CAUSAL_HISTORY_RECOVERED",
|
||||
"CURRENT_EVENT_COMMITTED",
|
||||
"SYSTEM_BODY_WITNESSED",
|
||||
"VERIFIED_BOUND",
|
||||
"REJECTED"
|
||||
],
|
||||
"ordered_transitions": [
|
||||
{
|
||||
"from": "UNBOUND_CARRIER",
|
||||
"event": "ORIENT",
|
||||
"to": "ORIENTED_TO_PERSONA_EVIDENCE_ROOT"
|
||||
},
|
||||
{
|
||||
"from": "ORIENTED_TO_PERSONA_EVIDENCE_ROOT",
|
||||
"event": "RECOVER_CAUSAL_HISTORY",
|
||||
"to": "CAUSAL_HISTORY_RECOVERED"
|
||||
},
|
||||
{
|
||||
"from": "CAUSAL_HISTORY_RECOVERED",
|
||||
"event": "COMMIT_CURRENT_EVENT",
|
||||
"to": "CURRENT_EVENT_COMMITTED"
|
||||
},
|
||||
{
|
||||
"from": "CURRENT_EVENT_COMMITTED",
|
||||
"event": "SYSTEM_BODY_WITNESS",
|
||||
"to": "SYSTEM_BODY_WITNESSED"
|
||||
},
|
||||
{
|
||||
"from": "SYSTEM_BODY_WITNESSED",
|
||||
"event": "VERIFY_CURRENT_BINDING",
|
||||
"to": "VERIFIED_BOUND"
|
||||
}
|
||||
],
|
||||
"out_of_order_transition": "REJECTED",
|
||||
"persona_wake_allowed_only_in": "VERIFIED_BOUND"
|
||||
},
|
||||
"numbered_ipc_boundary": {
|
||||
"ipc_role": "EVIDENCE_TRANSPORT_AND_BODY_ORGAN_ROUTE",
|
||||
"ipc_may_create_persona_binding": false,
|
||||
"physical_caller_number_is_persona_identity": false,
|
||||
"frontend_persona_claim_is_trusted": false,
|
||||
"persona_wake_route_registration_requires_zero_layer_gate": true
|
||||
},
|
||||
"current_product_state": {
|
||||
"persona_runtime_present": false,
|
||||
"persona_wake_route_registered": false,
|
||||
"carrier_binding_claimed": false,
|
||||
"metacognitive_contract_compiled": true,
|
||||
"runtime_binding_gate_implemented": true,
|
||||
"trusted_persona_runtime_signer_provisioned": false,
|
||||
"active_persona_runtime_license_installed": false,
|
||||
"truth": "PERSONA_TO_HOST_RUNTIME_LICENSE_GATE_IMPLEMENTED_PERSONA_WAKE_REMAINS_CLOSED_UNTIL_TRUSTED_PERSONA_SIGNATURE"
|
||||
}
|
||||
}
|
||||
|
|
@ -3,7 +3,13 @@
|
|||
"record_id": "HLP-PROGRAMMING-AI-TERMINAL-LINK-002",
|
||||
"state": "NATIVE_CROSS_PLATFORM_CONTROL_PLANE_IMPLEMENTED",
|
||||
"purpose": "Keep an external programming AI attached to a HoloLake-owned development control plane without making MCP or chat context the continuity owner.",
|
||||
"protocol": "HOLOLAKE_TERMINAL_LINK/2",
|
||||
"protocol": "HOLOLAKE_TERMINAL_LINK/3",
|
||||
"numbered_envelope": {
|
||||
"registry": "HLP-NBROKER-ROOT-001",
|
||||
"protocol_version": "HLP-NBROKER-v1",
|
||||
"legacy_string_operation_allowed": false,
|
||||
"full_coordinate_required": true
|
||||
},
|
||||
"platform_transports": {
|
||||
"macos": "USER_PRIVATE_UNIX_SOCKET",
|
||||
"linux": "USER_PRIVATE_UNIX_SOCKET",
|
||||
|
|
@ -44,6 +50,7 @@
|
|||
},
|
||||
"phase_boundary": {
|
||||
"current_phase": "EXTERNAL_PROGRAMMING_AI_DIRECT_CONTROL_PLANE",
|
||||
"persona_carrier_runtime_license_gate": "IMPLEMENTED_FAIL_CLOSED_TRUSTED_SIGNER_NOT_PROVISIONED",
|
||||
"supervised_shell_execution": false,
|
||||
"general_agent_tool_loop": false,
|
||||
"persona_memory_startup": "NEXT_PHASE_AFTER_DIRECT_LINK_ACCEPTANCE",
|
||||
|
|
|
|||
|
|
@ -0,0 +1,138 @@
|
|||
{
|
||||
"schema": "hololake.web-novel-module-marketplace-plan/v1",
|
||||
"record_id": "HLP-WEBNOVEL-MODULE-MARKETPLACE-PLAN-001",
|
||||
"state": "BASE_AND_FOUR_OFFICIAL_SIGNED_MODULES_ADMITTED_LOCAL_PUBLICATION_READY",
|
||||
"distribution_model": {
|
||||
"hololake_role": "LIGHTWEIGHT_FRAMEWORK_LANGUAGE_WORLD_AND_MODULE_RUNTIME",
|
||||
"channel_profile": "SINGLE_HUMAN_SINGLE_FACT_LANE",
|
||||
"built_in_author_workbench": "BUNDLED_SIGNED_LIGHTWEIGHT_REAL_NATIVE_ENGINE",
|
||||
"complete_author_capabilities": "INDEPENDENT_HOT_PLUGGABLE_OFFICIAL_MODULES",
|
||||
"repository_role": "IMMUTABLE_SOURCE_AND_RELEASE_FACT_NOT_UNREVIEWED_DIRECT_RUNTIME",
|
||||
"persona_role": "DISCOVER_PROPOSE_DEPLOY_VERIFY_AND_RECEIPT_WITHIN_USER_AUTHORIZATION"
|
||||
},
|
||||
"built_in_light_author_workbench": {
|
||||
"distribution": "BUNDLED_SIGNED_PACKAGE_EXPLICIT_FIRST_ACTIVATION",
|
||||
"marketplace_module": false,
|
||||
"real_engine_owner": "HOLOLAKE_NATIVE_RUST_SQLITE",
|
||||
"capabilities": [
|
||||
"CREATE_OPEN_AND_REOPEN_WORK",
|
||||
"VOLUME_AND_CHAPTER_TREE",
|
||||
"REAL_CHAPTER_TEXT_EDITING",
|
||||
"DEBOUNCED_AUTOSAVE_AND_RESTART_READBACK",
|
||||
"WORD_COUNT",
|
||||
"REAL_EDITING_TIME_RECEIPTS",
|
||||
"PROMINENT_CREATE_CHAPTER_OR_EPISODE",
|
||||
"LONG_NOVEL_SHORT_NOVEL_AND_SHORT_DRAMA_SHAPES",
|
||||
"SHORT_DRAMA_SCREENPLAY_TEMPLATE",
|
||||
"AUTO_FORMAT_ON_IMPORT_WITH_SOURCE_VERSION",
|
||||
"ONE_CLICK_FORMAT_WITH_VERSION_SAFETY",
|
||||
"CHAPTER_OR_WHOLE_WORK_FORMAT_PRESETS",
|
||||
"OUTLINE_SOURCE_AND_STRUCTURED_RENDER",
|
||||
"INSPIRATION_CAPTURE",
|
||||
"FULL_TEXT_SEARCH",
|
||||
"SHORT_DRAMA_SHOT_AND_PROMPT_EDITING",
|
||||
"BASIC_VERSION_SAFETY",
|
||||
"BASIC_TXT_MARKDOWN_DOCX_IMPORT",
|
||||
"BASIC_MARKDOWN_EXPORT"
|
||||
],
|
||||
"forbidden_substitutes": [
|
||||
"STATIC_EDITOR_SHELL",
|
||||
"FRONTEND_ONLY_LOCAL_ARRAY",
|
||||
"FAKE_AUTOSAVE",
|
||||
"IMPORT_FILENAME_WITHOUT_PARSE_AND_PERSIST"
|
||||
]
|
||||
},
|
||||
"official_module_candidates": [
|
||||
{
|
||||
"candidate_key": "AUTHOR_STRUCTURE_AND_OUTLINE_TRACKING",
|
||||
"module_number": "HLP-MOD-OFFICIAL-WEB-NOVEL-OUTLINE-0001",
|
||||
"numbering_state": "OFFICIAL_NUMBER_REGISTERED_AFTER_INSTALLED_ACCEPTANCE",
|
||||
"version": "0.1.0",
|
||||
"package_sha256": "6b4395ecdb5e546c6ccbf71e1b8475e5cbe0c36868d54a8e10c61c328a5f50f9",
|
||||
"capabilities": ["SCENE_AND_BEAT_STRUCTURE", "OUTLINE_STATUS_TRACKING", "GOAL_CONFLICT_OUTCOME", "HOOK_FORESHADOW_AND_PAYOFF_TRACKING"]
|
||||
},
|
||||
{
|
||||
"candidate_key": "AUTHOR_MULTIDIMENSIONAL_STORY_GRID_AND_BOARD",
|
||||
"module_number": "HLP-MOD-OFFICIAL-WEB-NOVEL-GRID-0001",
|
||||
"numbering_state": "OFFICIAL_NUMBER_REGISTERED_AFTER_INSTALLED_ACCEPTANCE",
|
||||
"version": "0.1.0",
|
||||
"package_sha256": "cd837adef8aecf0e027a0cc2c5845d32c972fa79d762d3780637c525dd4fc18e",
|
||||
"capabilities": ["ONE_STORY_GRAPH_EDITABLE_GRID", "GROUPABLE_STORY_BOARD", "CUSTOM_FIELDS", "CROSS_VIEW_SYNCHRONIZATION"]
|
||||
},
|
||||
{
|
||||
"candidate_key": "AUTHOR_TIMELINE_AND_STORY_BIBLE",
|
||||
"module_number": "HLP-MOD-OFFICIAL-WEB-NOVEL-STORYWORLD-0001",
|
||||
"numbering_state": "OFFICIAL_NUMBER_REGISTERED_AFTER_INSTALLED_ACCEPTANCE",
|
||||
"version": "0.1.0",
|
||||
"package_sha256": "868008e66b0897bd6cbf15383d2ec824436a46230f58b791499363af088fb63e",
|
||||
"capabilities": ["STORY_TIME_MODEL", "CHARACTER_LOCATION_ITEM_ORGANIZATION_ENTITIES", "ENTITY_RELATIONS", "CHARACTER_AND_PLOTLINE_TRAJECTORIES"]
|
||||
},
|
||||
{
|
||||
"candidate_key": "AUTHOR_ADVANCED_IMPORT_VERSION_AND_DELIVERY",
|
||||
"module_number": "HLP-MOD-OFFICIAL-WEB-NOVEL-DELIVERY-0001",
|
||||
"numbering_state": "OFFICIAL_NUMBER_REGISTERED_AFTER_INSTALLED_ACCEPTANCE",
|
||||
"version": "0.1.0",
|
||||
"package_sha256": "c07078f8c3998f8504aec5f0b73215e7d61b4ff165ba9e6efa3ebcaffcd97322",
|
||||
"capabilities": ["REIMPORT_DIFF_AND_SOURCE_BINDING", "FULL_STORY_SNAPSHOT", "RESTORE_OR_FORK", "DOCX_EPUB_MARKDOWN_TXT_DELIVERY"]
|
||||
}
|
||||
],
|
||||
"acceptance_evidence": {
|
||||
"native_engine_tests": "PASS",
|
||||
"real_novel": "504_CHAPTERS_IMPORTED_ORGANIZED_AND_EPUB_EXPORTED",
|
||||
"real_outline": "50_CHAPTERS_IMPORTED_ORGANIZED_AND_DOCX_TXT_EXPORTED",
|
||||
"real_script": "75_EPISODES_IMPORTED_ORGANIZED_AND_JSON_EXPORTED",
|
||||
"desktop_install_mount_self_test": "PASS_BASE_AND_ALL_FOUR_ADVANCED_MODULES_THROUGH_SHARED_SIGNED_RUNTIME",
|
||||
"desktop_restart_readback": "PASS_5_ACTIVE_MODULES_ACCEPTANCE_WORK_CHAPTER_SCENE_GRID_FIELD_AND_TIMELINE",
|
||||
"current_account_visible_novel_import": "504_CHAPTERS_1082978_WORDS_OPENED_IN_SIGNED_DESKTOP_APP",
|
||||
"prominent_create_chapter_entry": "PASS_SHORT_DRAMA_LABEL_NEW_EPISODE_LONG_AND_SHORT_NOVEL_LABEL_NEW_CHAPTER",
|
||||
"unmount_preserves_data_and_receipts": "PASS_BY_SHARED_RUNTIME_AND_RESTART_READBACK",
|
||||
"signed_desktop_bundle": "APPLE_DEVELOPER_ID_825A9L3G7Q",
|
||||
"remote_marketplace_publication": "PENDING_OFFICIAL_REPOSITORY_RELEASE"
|
||||
},
|
||||
"publication_gate": [
|
||||
"SOURCE_AND_LICENSE_REVIEW",
|
||||
"NATIVE_OR_AUDITED_ADAPTER_IMPLEMENTATION",
|
||||
"AUTOMATED_ENGINE_TESTS",
|
||||
"REAL_NOVEL_OUTLINE_AND_SCRIPT_FIXTURE_ACCEPTANCE",
|
||||
"DESKTOP_INSTALL_MOUNT_RUN_RESTART_AND_UNINSTALL_ACCEPTANCE",
|
||||
"PERMISSION_DATA_EXPORT_ROLLBACK_AND_RECEIPT_ACCEPTANCE",
|
||||
"IMMUTABLE_RELEASE_BUILD_AND_SIGNATURE",
|
||||
"THEN_ASSIGN_PERMANENT_MODULE_NUMBER",
|
||||
"THEN_REGISTER_OFFICIAL_MODULE_REGISTRY",
|
||||
"THEN_PUBLISH_OFFICIAL_MARKETPLACE"
|
||||
],
|
||||
"channel_deployment_flow": [
|
||||
"AUTHOR_EXPRESSES_NEED",
|
||||
"PERSONA_SEARCHES_OFFICIAL_REGISTRY",
|
||||
"PERSONA_EXPLAINS_MODULE_PERMISSION_DATA_AND_RESOURCE_BOUNDARY",
|
||||
"HUMAN_CONFIRMS_WHEN_BOUNDARY_REQUIRES",
|
||||
"RESOLVE_MODULE_NUMBER_AND_PINNED_VERSION",
|
||||
"FETCH_IMMUTABLE_RELEASE_ARTIFACT",
|
||||
"VERIFY_SOURCE_SIGNATURE_HASH_DEPENDENCIES_AND_COMPATIBILITY",
|
||||
"INSTALL_TO_LOCAL_CACHE",
|
||||
"MOUNT_IN_CURRENT_CHANNEL",
|
||||
"RUN_MODULE_SELF_TEST",
|
||||
"WRITE_INSTALLATION_AND_RUNTIME_RECEIPT",
|
||||
"ROLL_BACK_ON_FAILURE"
|
||||
],
|
||||
"deployment_experience": {
|
||||
"warm_or_small_module_target_seconds": 30,
|
||||
"target_is_unconditional_guarantee": false,
|
||||
"depends_on": ["ARTIFACT_SIZE", "NETWORK", "CACHE", "DEPENDENCY_STATE", "SELF_TEST_DURATION"],
|
||||
"already_installed_module_offline_start_allowed": true
|
||||
},
|
||||
"data_boundary": {
|
||||
"one_story_graph_for_builtin_and_modules": true,
|
||||
"module_program_and_user_story_data_separated": true,
|
||||
"unmount_preserves_story_data": true,
|
||||
"uninstall_preserves_story_data_and_receipts": true,
|
||||
"module_install_grants_all_channel_data": false
|
||||
},
|
||||
"sources": [
|
||||
"source://current-dialogue/2026-08-18/bingshuo-light-author-workbench-built-in-and-complete-modules-in-official-marketplace",
|
||||
"REPO-012:gls/GLS-0233-GH-AIOS-MODULAR-AI-OPERATING-PLATFORM-AND-FAIR-ECOSYSTEM.hdlp",
|
||||
"REPO-012:gls/GLS-0236-PERSONA-BRAIN-HANDS-VISIBLE-EXECUTION-RECURSIVE-MEMORY-AND-HOTPLUG-RUNTIME.hdlp",
|
||||
"REPO-012:gls/GLS-0241-HOLOLAKE-SOURCE-OWNERSHIP-AND-DEPLOYMENT-ROUTING.hdlp",
|
||||
"REPO-012:gls/GLS-0245-HOLOLAKE-LANGUAGE-PERSONA-OPERATING-SYSTEM-PRODUCT-MAPPING.hdlp"
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,131 @@
|
|||
{
|
||||
"schema": "hololake.web-novel-workspace/v1",
|
||||
"record_id": "HLP-WEBNOVEL-WORKSPACE-001",
|
||||
"state": "SIGNED_BASE_AND_FOUR_ADVANCED_MODULES_ADMITTED_RESTART_ACCEPTED",
|
||||
"domain_entry": "BRANCH_DOMAIN",
|
||||
"industry_key": "WEB_NOVEL",
|
||||
"industry_number": "IND-WEBNOVEL-001",
|
||||
"channel_id": "GH-WEBNOVEL-INIT-001",
|
||||
"ontology_correction": {
|
||||
"channel_body_contract": "contracts/user-channel-body.json",
|
||||
"marketplace_plan_contract": "contracts/web-novel-module-marketplace-plan.json",
|
||||
"this_contract_is": "BUNDLED_SIGNED_LIGHT_AUTHOR_WORKBENCH_AND_FOUR_OFFICIAL_NUMBERED_ADAPTERS",
|
||||
"this_contract_is_not": "USER_CHANNEL_BODY",
|
||||
"legacy_channel_id_semantics": "DEPRECATED_INDUSTRY_PROJECTION_IDENTIFIER",
|
||||
"author_editor_operator_are_ui_tabs": false,
|
||||
"shared_story_graph_copies": 1
|
||||
},
|
||||
"user_channel_entry": {
|
||||
"current_domain": "FIFTH_DOMAIN",
|
||||
"current_channel": "HEARTBEAT_CORE_CHANNEL",
|
||||
"display_name": "作者工作台",
|
||||
"routes_to_same_native_workspace": true,
|
||||
"duplicates_account_story_data": false
|
||||
},
|
||||
"distribution_boundary": {
|
||||
"preinstalled": "SIGNED_PACKAGE_ARTIFACTS_WITH_EXPLICIT_FIRST_ACTIVATION",
|
||||
"complete_author_features": "FOUR_INDEPENDENT_NUMBERED_OFFICIAL_MODULES_ACTIVE_IN_SHARED_RUNTIME",
|
||||
"current_advanced_features_are_registered_marketplace_modules": true,
|
||||
"hololake_bundles_entire_web_novel_world": false
|
||||
},
|
||||
"native_storage": {
|
||||
"owner": "HOLOLAKE_NATIVE_RUST_CORE",
|
||||
"engine": "SQLITE",
|
||||
"authenticated_account_required": true,
|
||||
"cross_account_projection_allowed": false,
|
||||
"restart_readback_required": true,
|
||||
"source_manuscript_mutation_allowed": false
|
||||
},
|
||||
"work_objects": [
|
||||
"WORK",
|
||||
"VOLUME",
|
||||
"CHAPTER",
|
||||
"CHAPTER_VERSION",
|
||||
"CHECKPOINT",
|
||||
"STORY_ENTITY",
|
||||
"STORY_RELATION",
|
||||
"FORESHADOW",
|
||||
"EDITOR_REVIEW_NOTE",
|
||||
"WORKFLOW_EVENT",
|
||||
"AUTHORIZED_METRIC"
|
||||
,"SCENE"
|
||||
,"BEAT"
|
||||
,"STORY_GRID_FIELD"
|
||||
,"TIMELINE_EVENT"
|
||||
,"SCENE_ENTITY_LINK"
|
||||
,"WRITING_ACTIVITY"
|
||||
,"INSPIRATION"
|
||||
,"SHOT"
|
||||
],
|
||||
"writing_shapes": [
|
||||
"LONG_NOVEL",
|
||||
"SHORT_NOVEL",
|
||||
"SHORT_DRAMA"
|
||||
],
|
||||
"chapter_workflow": {
|
||||
"states": [
|
||||
"DRAFT",
|
||||
"SELF_REVIEW",
|
||||
"EDITOR_REVIEW",
|
||||
"REVISION_REQUIRED",
|
||||
"APPROVED",
|
||||
"SCHEDULED",
|
||||
"PUBLISHED"
|
||||
],
|
||||
"human_confirmed_transitions_only": true,
|
||||
"unreviewed_auto_publish_allowed": false
|
||||
},
|
||||
"required_real_engines": [
|
||||
"CREATE_AND_READ_WORK",
|
||||
"VOLUME_AND_CHAPTER_TREE",
|
||||
"DEBOUNCED_CHAPTER_PERSISTENCE",
|
||||
"OPTIMISTIC_REVISION_CONFLICT",
|
||||
"CHAPTER_VERSION_HISTORY",
|
||||
"CREATE_AND_RESTORE_CHECKPOINT",
|
||||
"STORY_BIBLE_AND_RELATIONS",
|
||||
"FORESHADOW_LIFECYCLE",
|
||||
"CONTINUITY_AUDIT",
|
||||
"EDITORIAL_WORKFLOW_AND_REVIEW_NOTES",
|
||||
"AUTHORIZED_OPERATIONS_METRICS",
|
||||
"MARKDOWN_EXPORT",
|
||||
"SHARED_SIGNED_MODULE_PACKAGE_HASH_VERIFICATION",
|
||||
"SHARED_MODULE_INSTALL_MOUNT_SELF_TEST_UNMOUNT",
|
||||
"SHARED_HASH_CHAINED_LIFECYCLE_RECEIPT",
|
||||
"SCENE_BEAT_AND_OUTLINE_TRACKING",
|
||||
"MULTIDIMENSIONAL_STORY_GRID",
|
||||
"TIMELINE_AND_SCENE_ENTITY_LINKS",
|
||||
"CHAPTER_VERSION_RESTORE",
|
||||
"TXT_DOCX_EPUB_JSON_DELIVERY",
|
||||
"PROMINENT_CREATE_CHAPTER_OR_EPISODE",
|
||||
"SHORT_DRAMA_SCREENPLAY_TEMPLATE_ON_CREATE",
|
||||
"AUTO_FORMAT_ON_IMPORT_WITH_SOURCE_VERSION_PRESERVED",
|
||||
"LIVE_WORD_COUNT_AND_REAL_EDITING_TIME",
|
||||
"ONE_CLICK_FORMAT_WITH_NEW_CHAPTER_VERSION",
|
||||
"SELECTABLE_CHAPTER_OR_WHOLE_WORK_FORMAT_PRESET",
|
||||
"SYNCHRONIZED_OUTLINE_SOURCE_AND_STRUCTURED_RENDER",
|
||||
"INSPIRATION_CAPTURE_AND_STATUS",
|
||||
"FULL_TEXT_SEARCH_AND_TRACKING",
|
||||
"SHORT_DRAMA_SHOT_AND_PROMPT_STORAGE"
|
||||
],
|
||||
"forbidden_substitutes": [
|
||||
"HARDCODED_STATIC_PROJECTS",
|
||||
"UI_ONLY_BUTTONS_WITHOUT_NATIVE_COMMANDS",
|
||||
"PRIVATE_MANUSCRIPT_MODEL_TRAINING",
|
||||
"THIRD_PARTY_AUTO_LOGIN",
|
||||
"UNREVIEWED_AUTO_PUBLISH",
|
||||
"PLATFORM_DETECTION_EVASION"
|
||||
],
|
||||
"current_acceptance": {
|
||||
"state": "PASS",
|
||||
"numbered_ipc_modules": ["HLP-NIPC-MOD-0025", "HLP-NIPC-MOD-0026", "HLP-NIPC-MOD-0027", "HLP-NIPC-MOD-0028", "HLP-NIPC-MOD-0029"],
|
||||
"numbered_operations": "HLP-NIPC-OP-0103..HLP-NIPC-OP-0140",
|
||||
"runtime_module_numbers": ["HLP-MOD-OFFICIAL-WEB-NOVEL-WORKBENCH-0001", "HLP-MOD-OFFICIAL-WEB-NOVEL-OUTLINE-0001", "HLP-MOD-OFFICIAL-WEB-NOVEL-GRID-0001", "HLP-MOD-OFFICIAL-WEB-NOVEL-STORYWORLD-0001", "HLP-MOD-OFFICIAL-WEB-NOVEL-DELIVERY-0001"],
|
||||
"node_tests": "130_PASS",
|
||||
"rust_tests": "170_PASS_2_EXPLICIT_DESKTOP_FIXTURES_IGNORED",
|
||||
"clippy": "PASS_DENY_WARNINGS",
|
||||
"developer_id_team": "825A9L3G7Q",
|
||||
"signed_binary_sha256": "2f8fdd71f9d5a9178bc23058261dbb43f1388486dc5a4415e865cfcf78869db3",
|
||||
"restart_readback": "PASS_5_MODULES_ACTIVE_ACCEPTANCE_WORK_1_CHAPTER_53_WORDS_SCENE_GRID_FIELD_TIMELINE_PRESENT",
|
||||
"legacy_account_readback": "PASS_504_CHAPTER_1082978_WORD_NOVEL_50_CHAPTER_OUTLINE_75_EPISODE_SCRIPT_UNCHANGED"
|
||||
}
|
||||
}
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
"record_id": "HLP-ZERO-CORE-NUMBERING-KERNEL-001",
|
||||
"authority": {
|
||||
"repository": "REPO-012",
|
||||
"source_commit": "2598fbfba8caf64c7ab9740a3036c5aab977502e",
|
||||
"source_commit": "104a5d73162bdf4a529701e65898e2bc2863ea9e",
|
||||
"source_path": "routing/guanghu-identity-authority-map.json",
|
||||
"map_id": "GH-IDENTITY-AUTHORITY-MAP-001",
|
||||
"map_version": "2026-08-10.1",
|
||||
|
|
|
|||
|
|
@ -90,10 +90,20 @@ HoloLake 0.3.0 includes a live, read-only projection of the PNCC resident runtim
|
|||
|
||||
## Release pipeline
|
||||
|
||||
`npm run release:macos -- release/inputs/<version>.json` is the only product-owned macOS release entry. It fails before building unless the embedded trust contains the exact registered HoloLake HTTPS endpoint and updater public key, the immutable `v<version>` tag equals the clean `main` head, and the Developer ID, Tauri updater-signing and Apple notarization credential sets are supplied at runtime. The pipeline runs all product and Rust gates, creates updater artifacts through a temporary Tauri override, then requires strict code-signature verification, Gatekeeper acceptance and stapled Apple notarization before writing the HoloLake broadcast and receipts.
|
||||
`npm run release:macos -- release/inputs/<version>.json` is the only product-owned macOS release entry. It fails before building unless the embedded trust contains the exact registered HoloLake HTTPS endpoint and updater public key, the immutable `v<version>` tag equals the clean `main` head, and the Developer ID plus Tauri updater-signing material are supplied at runtime. Apple notarization can run either through Tauri's Apple ID/API credential flow, or through the two-step Xcode Organizer flow already owned by the local Apple developer account: append `prepare-xcode` to build, verify the updater signature, and create a source-hash-bound `.xcarchive`; after Xcode reports `Ready to distribute`, export the notarized app and append `finalize-xcode <export-directory-or-app>` to bind the exported executable back to that archive, require the app's stapled ticket and Gatekeeper acceptance, regenerate and sign the updater archive, create a Developer ID-signed DMG containing that notarized app, and write the release broadcast and receipts. A protected updater-key path is materialized only into child processes; neither the private key nor its password is printed or copied into source. The Xcode flow does not claim that the outer DMG itself has an Apple ticket unless its own Gatekeeper and stapler checks pass.
|
||||
|
||||
Generated packages, private release inputs and credentials are not committed. The pipeline never uploads or activates a release; its terminal artifact is a bounded folder ready for a separately authorized JD-controller upload and server-owned readback receipt.
|
||||
|
||||
## Numbered-root module admission
|
||||
|
||||
HoloLake 0.5.0 is the clean numbered-root base. The compiled 0.4.1 desktop application and the divergent dirty source worktree are read-only donors, not merge bases. Their old numbered-operation runtime is explicitly superseded, and mutations to shared files such as `src/main.tsx` or `src-tauri/src/lib.rs` are never accepted as a unit.
|
||||
|
||||
Each donor capability receives a candidate coordinate, but no permanent runtime module number, until one isolated admission cycle has reviewed provenance and permissions, allocated numbered IPC module/target/operation coordinates, implemented an adapter without raw Tauri invoke, passed negative-route and data tests, and produced installed mount, restart, unmount and rollback receipts. The admission order and candidate inventory are recorded in `contracts/module-donor-admission-registry.json`.
|
||||
|
||||
The module-package runtime is now the shared admission executor. It accepts an exact detached-minisign `.ghmod` artifact, validates the package and its compatibility/permission manifest, stores it inside the authenticated account, and advances only through numbered install, mount, self-test, unmount and rollback operations. Lifecycle state and receipts are durable SQLite records; unmount never removes user data. A package is declarative and selects a host-registered adapter: repositories, native binaries and arbitrary webview JavaScript are not executable module inputs. Public lighthouse numbers remain unavailable until a candidate completes its own installed acceptance; private channel packages use a separate local number class.
|
||||
|
||||
The admitted web-novel family uses that one lifecycle rather than the donor's private installer. Its signed base module owns account-local works, volumes, chapters, versions, story objects, editorial workflow, import and author activity. Outline, story-grid, story-world and delivery are four separately signed official numbers; each advanced mutation checks its own exact `ACTIVE` record before touching the shared story graph. The donor's four legacy manifests remain byte-exact test fixtures only and have no numbered IPC route. Installed acceptance reopened the existing 504-chapter novel, 50-chapter outline and 75-episode script in place, then created a separate one-chapter acceptance work, scene, grid field and timeline event and read all of them back after process restart.
|
||||
|
||||
## Stage-one convergence verdict
|
||||
|
||||
The Tauri source in this directory is the only future HoloLake desktop mainline. An installed build of it is an acceptance candidate, not a separate product line and not proof that stage one exists. The Electron 0.8.0 product and the legacy Tauri/platform sources remain read-only UX, behavior, engineering and protected-data donors until inventory, backup, readback, reversible migration rehearsal and signed installed-runtime acceptance all pass.
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
线上事实源:
|
||||
|
||||
- 第五域代码频道:`bingshuo/guanghu-ice-heart`
|
||||
- REPO-012 `main`:`2598fbfba8caf64c7ab9740a3036c5aab977502e`
|
||||
- REPO-012 `main`:`d5b1111fcaccaccf025070e531631f2b3cbb00cd`
|
||||
- Git tree:`5a09f084fffee56d90599e69038c8335871ea04f`
|
||||
- 第五域节点:`JD-FD-PRIMARY`
|
||||
- 公开远端 HEAD 与第五域 Forgejo 裸仓库 HEAD:一致
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
{
|
||||
"schema": "hololake.module-package/v1",
|
||||
"manifest": {
|
||||
"moduleNumber": "HLP-MOD-LOCAL-CHANNEL-WORKBENCH-0001",
|
||||
"registrationClass": "PRIVATE_CHANNEL_LOCAL",
|
||||
"displayName": "频道文档与表格工作台",
|
||||
"version": "0.1.0",
|
||||
"minimumHostVersion": "0.5.0",
|
||||
"adapter": "channel-workbench-v1",
|
||||
"contentDigest": "2ee8cbb20e4c3242a8ee3469f2f87347967bde8878463746e61ea8e2369c5074",
|
||||
"permissions": ["CHANNEL_DOCUMENT_READ", "CHANNEL_DOCUMENT_WRITE", "CHANNEL_SPREADSHEET_READ", "CHANNEL_SPREADSHEET_WRITE"],
|
||||
"userDataSchema": "hololake.module-data/channel-workbench/v1",
|
||||
"selfTest": {
|
||||
"kind": "DECLARATIVE_SCHEMA_V1",
|
||||
"expectedContentDigest": "2ee8cbb20e4c3242a8ee3469f2f87347967bde8878463746e61ea8e2369c5074"
|
||||
}
|
||||
},
|
||||
"payload": {
|
||||
"entry": "channel-workbench",
|
||||
"adapterConfig": {
|
||||
"dataBoundary": "CURRENT_AUTHENTICATED_ACCOUNT_LOCAL",
|
||||
"documentEngine": "LEXICAL_0_49",
|
||||
"spreadsheetEngine": "FORTUNE_SHEET_1_0_4",
|
||||
"maximumColumns": 64,
|
||||
"maximumRows": 5000,
|
||||
"persistent": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRTNiU1ZIVE10TkRyZHhCU1oycjJCMnlVV3hCRGM2QmJSZ0hlZGlPejY0TER2MkE0Q3U3Y1g5dHVnSjBzVytOallYN3hKQVNJcE9Pblowd3lpTXh1V2dBPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDc1OTcwCWZpbGU6SExQLU1PRC1MT0NBTC1DSEFOTkVMLVdPUktCRU5DSC0wMDAxLTAuMS4wLmdobW9kCkVKbFN4ZXBCbDBCZlJDcEhmYmZtQU1iTXN4djZVVGl0MngwOW5NRzBLSDArK2FRNEV2ZmVObzZRZWFWNmZVOXV3TnErcHM1MGI5K1lHMXpBUmxYVkR3PT0K
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
{
|
||||
"schema": "hololake.module-package/v1",
|
||||
"manifest": {
|
||||
"moduleNumber": "HLP-MOD-LOCAL-NATIVE-COMPOSITION-0001",
|
||||
"registrationClass": "PRIVATE_CHANNEL_LOCAL",
|
||||
"displayName": "原生组合视图",
|
||||
"version": "0.1.0",
|
||||
"minimumHostVersion": "0.5.0",
|
||||
"adapter": "native-composition-v1",
|
||||
"contentDigest": "8e9c6ccf179bb256d5b1006e41b4984a86e0382b7023ae8435c201804041393e",
|
||||
"permissions": ["KNOWLEDGE_READ"],
|
||||
"userDataSchema": "hololake.module-data/native-composition/v1",
|
||||
"selfTest": {
|
||||
"kind": "DECLARATIVE_SCHEMA_V1",
|
||||
"expectedContentDigest": "8e9c6ccf179bb256d5b1006e41b4984a86e0382b7023ae8435c201804041393e"
|
||||
}
|
||||
},
|
||||
"payload": {
|
||||
"entry": "knowledge-composition",
|
||||
"adapterConfig": {
|
||||
"dataSource": "CURRENT_AUTHENTICATED_ACCOUNT_KNOWLEDGE_CATALOG",
|
||||
"readOnly": true,
|
||||
"registeredViews": ["DASHBOARD", "COMPARISON", "VERTICAL_BAR", "CLASSIFICATION", "TABLE"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRTRyUS9Nd0E0NE53dGRYODFxeWlzcW1XanN6K2EzQUNXSVVmT1ZLY2tRNExwaXlZdnJvSjlFZU5lUTJhb25hUVhORDQ0ZmFURmNSWTZBUmRTQnBiNFFvPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDc0NDA3CWZpbGU6SExQLU1PRC1MT0NBTC1OQVRJVkUtQ09NUE9TSVRJT04tMDAwMS0wLjEuMC5naG1vZApDclRUZDNpeENBSDQ0a0ZnR3VaNkxIS1lWUUhoMEdWajVqL0JzVVg4dStLb1ZJYXZlNHBaQy9BZlMxMkxreVQ0ODFzeGFMSWZrVUppUVY2NFN5TndDUT09Cg==
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
{
|
||||
"schema": "hololake.module-package/v1",
|
||||
"manifest": {
|
||||
"moduleNumber": "HLP-MOD-LOCAL-PERSONA-CHANNEL-BODY-0001",
|
||||
"registrationClass": "PRIVATE_CHANNEL_LOCAL",
|
||||
"displayName": "人格频道本体与成长",
|
||||
"version": "0.1.0",
|
||||
"minimumHostVersion": "0.5.0",
|
||||
"adapter": "persona-channel-body-v1",
|
||||
"contentDigest": "27495883fb3602fd070d900d2157fa684e1d0bedde65642810326ebcf4ff0040",
|
||||
"permissions": ["PERSONA_BODY_READ", "PERSONA_TRIAL_LIFECYCLE_WRITE", "PERSONA_LANGUAGE_CONTRACT_WRITE", "PERSONA_LANGUAGE_APPEND", "CHANNEL_GROWTH_READ", "CHANNEL_GROWTH_EVENT_APPEND", "CHANNEL_GROWTH_SHARING_WRITE"],
|
||||
"userDataSchema": "hololake.module-data/persona-channel-body/v1",
|
||||
"selfTest": {
|
||||
"kind": "DECLARATIVE_SCHEMA_V1",
|
||||
"expectedContentDigest": "27495883fb3602fd070d900d2157fa684e1d0bedde65642810326ebcf4ff0040"
|
||||
}
|
||||
},
|
||||
"payload": {
|
||||
"entry": "persona-channel-body",
|
||||
"adapterConfig": {
|
||||
"trialDays": 30,
|
||||
"languageLedger": "APPEND_ONLY_SHA256",
|
||||
"growthProjection": "MINIMIZED_LOCAL_METADATA",
|
||||
"personaBindingClaimed": false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRXd2QktvaXdZZWx5eEw0anZrUVNuMU5tRy9HTE9jOEhrcUhET3VFTml4ZUlBODk2aDYvNDhhUVVpbU0wTGtENVlZOExCZ1BnVW1vNElxbVhwT1RZWlFZPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDc3NjQxCWZpbGU6SExQLU1PRC1MT0NBTC1QRVJTT05BLUNIQU5ORUwtQk9EWS0wMDAxLTAuMS4wLmdobW9kCjh6OFRiUHhoR1g1eVNoN1lvNU5wTlNnbXkwVEtvcWVwU0ZsSTlWcmpIT1FKK0ppelBBK2V2anMrQkRyQjRrVXFtdkR2L0g5K1c2UFhJZ1owRitpd0RnPT0K
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
{
|
||||
"schema": "hololake.module-package/v1",
|
||||
"manifest": {
|
||||
"moduleNumber": "HLP-MOD-LOCAL-RUNTIME-ACCEPTANCE-0001",
|
||||
"registrationClass": "PRIVATE_CHANNEL_LOCAL",
|
||||
"displayName": "原生组合模块运行时验收包",
|
||||
"version": "0.1.0",
|
||||
"minimumHostVersion": "0.5.0",
|
||||
"adapter": "native-composition-v1",
|
||||
"contentDigest": "07bfafaaa0b06f160abc489edce2bc23a3b092520c8d6c6f4a5ce29cca4485ea",
|
||||
"permissions": [
|
||||
"KNOWLEDGE_READ",
|
||||
"PROJECTION_RENDER"
|
||||
],
|
||||
"userDataSchema": "hololake.module-data/native-composition/v1",
|
||||
"selfTest": {
|
||||
"kind": "DECLARATIVE_SCHEMA_V1",
|
||||
"expectedContentDigest": "07bfafaaa0b06f160abc489edce2bc23a3b092520c8d6c6f4a5ce29cca4485ea"
|
||||
}
|
||||
},
|
||||
"payload": {
|
||||
"adapterContract": "hololake.native-composition-v1",
|
||||
"capabilities": [
|
||||
"READ_CURRENT_ACCOUNT_KNOWLEDGE",
|
||||
"PROJECT_SHARED_EXECUTION_RESULT"
|
||||
],
|
||||
"entry": "native-composition",
|
||||
"views": [
|
||||
"DASHBOARD",
|
||||
"COMPARISON",
|
||||
"VERTICAL_BAR",
|
||||
"CLASSIFICATION",
|
||||
"TABLE"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRThwcUdLRThMYkJLN29MM1NmVFVCcmh4dGdrbHdPVWlvdm45enpveUhBeFZ3VEM1TkNHRDBKdGFoN21OZHgzV0NSMFVvMk1TNW44Z3BtRS9GcmN5SHdvPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDczNTkxCWZpbGU6SExQLU1PRC1MT0NBTC1SVU5USU1FLUFDQ0VQVEFOQ0UtMDAwMS0wLjEuMC5naG1vZApXRWZINVdEUG12SlNsdzRTMkFHRDV3V0NkSVhNYW92RmczRGZlU3M0ZU9nSnhjc1BWbU1ZS0x1cStoQXE5TE96cnV1S2FaQ1FnK0FGdFNEY1RvUGZBQT09Cg==
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"schema": "hololake.module-package/v1",
|
||||
"manifest": {
|
||||
"moduleNumber": "HLP-MOD-OFFICIAL-DYNAMIC-WORLD-SURFACE-0001",
|
||||
"registrationClass": "OFFICIAL_LIGHTHOUSE",
|
||||
"displayName": "动态语言世界视觉层",
|
||||
"version": "0.1.0",
|
||||
"minimumHostVersion": "0.5.0",
|
||||
"adapter": "dynamic-language-world-surface-v1",
|
||||
"contentDigest": "ed335b587af53365b9a9143ab5b5e7e3fed3f517cd0ef0c9e36a523db58511e9",
|
||||
"permissions": ["REALITY_TIME_READ", "PUBLIC_WEATHER_QUERY"],
|
||||
"userDataSchema": "hololake.module-data/dynamic-world-surface/v1",
|
||||
"selfTest": {
|
||||
"kind": "DECLARATIVE_SCHEMA_V1",
|
||||
"expectedContentDigest": "ed335b587af53365b9a9143ab5b5e7e3fed3f517cd0ef0c9e36a523db58511e9"
|
||||
}
|
||||
},
|
||||
"payload": {
|
||||
"entry": "dynamic-world-surface",
|
||||
"adapterConfig": {
|
||||
"dynamicInputs": ["BEIJING_TIME", "VERIFIED_CURRENT_WEATHER"],
|
||||
"weatherProvider": "OPEN_METEO",
|
||||
"weatherCacheTtlSeconds": 600,
|
||||
"realCityExposedInUi": false,
|
||||
"coordinatesExposedInUi": false,
|
||||
"layoutMode": "OFFICIAL_FIVE_LAKE_EXISTING_SHELL",
|
||||
"themes": ["夜湖星光", "晨湖曦光", "星云紫夜", "烛畔暖湖", "清浅澄湖"],
|
||||
"weatherUnavailableBehavior": "BEIJING_TIME_ONLY_NO_FAKE_WEATHER",
|
||||
"routingPermissionOrFactMutation": false,
|
||||
"legacyTraditionalWorkbench": "REJECTED_DUPLICATE_SHELL_AND_SIMULATED_STATE"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRTF2cGVLbjVsWWRTdEF2L0FiZHBKUS9hVDdwNjRmRlRPc0xHTGJzbXFyR09tZysrcGNDYWN4eEJ3aGtCNGtURDRjNWg1ZWs5bU5YdDc0SWhBYWNsUEFBPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDg0NTk2CWZpbGU6SExQLU1PRC1PRkZJQ0lBTC1EWU5BTUlDLVdPUkxELVNVUkZBQ0UtMDAwMS0wLjEuMC5naG1vZApHVGFucE8vYjliVUlsbSt6STRWTEcrN2tIQzNTSTgrUzlwdVdQUlY5WG8vQytzTEU1VURYMVA5Q3BCNVVwVFBvbnZheWxIbVUrWGQ2K3ZicGgwR3hEdz09Cg==
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"schema": "hololake.module-package/v1",
|
||||
"manifest": {
|
||||
"moduleNumber": "HLP-MOD-OFFICIAL-EDUCATION-WORKBENCH-0001",
|
||||
"registrationClass": "OFFICIAL_LIGHTHOUSE",
|
||||
"displayName": "教育行业工作台",
|
||||
"version": "0.1.0",
|
||||
"minimumHostVersion": "0.5.0",
|
||||
"adapter": "education-workbench-v1",
|
||||
"contentDigest": "fd80c9957865a58cf62679528f110ae355b1385ad1dd988e31217ea3da66e65b",
|
||||
"permissions": ["EDUCATION_WORKSPACE_READ", "EDUCATION_DOCUMENT_WRITE", "EDUCATION_TABLE_WRITE", "EDUCATION_IMPORT_READ_FILE", "EDUCATION_EXPORT_WRITE_FILE", "EDUCATION_IMPORT_ASSIGNMENT_WRITE", "EDUCATION_AUTOMATION_WRITE", "EDUCATION_AUTOMATION_EXECUTE"],
|
||||
"userDataSchema": "hololake.module-data/education-workbench/v1",
|
||||
"selfTest": {
|
||||
"kind": "DECLARATIVE_SCHEMA_V1",
|
||||
"expectedContentDigest": "fd80c9957865a58cf62679528f110ae355b1385ad1dd988e31217ea3da66e65b"
|
||||
}
|
||||
},
|
||||
"payload": {
|
||||
"entry": "education-workspace",
|
||||
"adapterConfig": {
|
||||
"dataBoundary": "CURRENT_AUTHENTICATED_ACCOUNT_LOCAL",
|
||||
"foundationModule": "HLP-MOD-LOCAL-CHANNEL-WORKBENCH-0001",
|
||||
"documentEngine": "LEXICAL_0_49",
|
||||
"spreadsheetEngine": "FORTUNE_SHEET_1_0_4",
|
||||
"importDefaultScope": "UNASSIGNED",
|
||||
"automationExecution": "PREVIEW_TOKEN_AND_HUMAN_CONFIRMATION",
|
||||
"modelFileTransferDefault": "DENY",
|
||||
"maximumColumns": 30,
|
||||
"maximumRows": 1000,
|
||||
"persistent": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRTFEa084d1l6MnB2OFVvVy9abW90S3RFMEVOdmIvWW1hbkllWmw4NHBJaDVNTGxpZHV4M0tVNUNUOExmdHAwSGw4V0NPQ1RPUjlRU0h0Tm50clFlekFJPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDc5ODQzCWZpbGU6SExQLU1PRC1PRkZJQ0lBTC1FRFVDQVRJT04tV09SS0JFTkNILTAwMDEtMC4xLjAuZ2htb2QKVXZzVklwQk5KR3Q3bkRZaXBYV1ArOGx6b3BKSWVyUkpvK1dyTXdpWnBhMXNqVnJKcU5vZ1BTdzlFWjlXRTJ1RlFhMXAwMjhXcFBEQnQxRzV4SFVuQkE9PQo=
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
{
|
||||
"schema": "hololake.module-package/v1",
|
||||
"manifest": {
|
||||
"moduleNumber": "HLP-MOD-OFFICIAL-MOBILE-SYNC-0001",
|
||||
"registrationClass": "OFFICIAL_LIGHTHOUSE",
|
||||
"displayName": "移动同步桥",
|
||||
"version": "0.1.0",
|
||||
"minimumHostVersion": "0.5.0",
|
||||
"adapter": "mobile-sync-v1",
|
||||
"contentDigest": "3e3ff8c7beba3d70ee01c918630a40ea901313b424f264b41e2d376550534e6e",
|
||||
"permissions": ["MOBILE_SYNC_LISTEN_SAME_LAN", "MOBILE_SYNC_PAIR_DEVICE", "MOBILE_SYNC_READ_MINIMUM_PROJECTION", "MOBILE_SYNC_CAPTURE_INBOX_WRITE", "MOBILE_SYNC_REVOKE_DEVICE"],
|
||||
"userDataSchema": "hololake.module-data/mobile-sync/v1",
|
||||
"selfTest": {
|
||||
"kind": "DECLARATIVE_SCHEMA_V1",
|
||||
"expectedContentDigest": "3e3ff8c7beba3d70ee01c918630a40ea901313b424f264b41e2d376550534e6e"
|
||||
}
|
||||
},
|
||||
"payload": {
|
||||
"entry": "mobile-sync",
|
||||
"adapterConfig": {
|
||||
"transport": "SAME_LAN_DIRECT_HTTP_WITH_APPLICATION_LAYER_ENCRYPTION",
|
||||
"preferredPort": 37421,
|
||||
"pairingTtlSeconds": 600,
|
||||
"maximumRequestBytes": 262144,
|
||||
"maximumConcurrentConnections": 16,
|
||||
"desktopRole": "USER_LOCAL_COMPUTER_TERMINAL_ROOT_NODE",
|
||||
"mobileRole": "REMOTE_BODY_ENTRY_OF_THE_SAME_PERSONA_SYSTEM",
|
||||
"desktopOfflineExecution": false,
|
||||
"platformPrivatePayloadCustody": false,
|
||||
"automaticDomainMutation": false,
|
||||
"iosClientPackaging": "PENDING_SEPARATE_ADMISSION"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRTV5bDhHMkZjMzNkN0lpaDBLaDRxcnhHajJ3b3NDS21zZWljYWJORmtrNit5MHJvZC9yN2YrSUhiSE5sT0dMd25Jc2pXMkQyeWttODhKSklsRmVKNWd3PQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDgzMTYwCWZpbGU6SExQLU1PRC1PRkZJQ0lBTC1NT0JJTEUtU1lOQy0wMDAxLTAuMS4wLmdobW9kCjN6R1JZZitSbzI1cVRESkNUMnJrVXFWUlUyZ3B3L2lIQmhrOXZaTGc3T2x1REdNUUZrK2M4WWs4bE9Zb3NuSTNoNmRBRmlCekh0dkNNN1pKR2k4ZkFRPT0K
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"schema": "hololake.module-package/v1",
|
||||
"manifest": {
|
||||
"moduleNumber": "HLP-MOD-OFFICIAL-WEB-NOVEL-DELIVERY-0001", "registrationClass": "OFFICIAL_LIGHTHOUSE", "displayName": "高级版本与交付", "version": "0.1.0", "minimumHostVersion": "0.5.0", "adapter": "web-novel-workbench-v1", "contentDigest": "1dbc2ee8c1bc4c361009a8db9c93774c1ac7f5a06c02a5d4bc5b39754a0496fb", "permissions": ["WEB_NOVEL_CHAPTER_VERSION_RESTORE", "WEB_NOVEL_DELIVERY_EXPORT_WRITE_FILE"], "userDataSchema": "hololake.module-data/web-novel-delivery/v1", "selfTest": { "kind": "DECLARATIVE_SCHEMA_V1", "expectedContentDigest": "1dbc2ee8c1bc4c361009a8db9c93774c1ac7f5a06c02a5d4bc5b39754a0496fb" }
|
||||
},
|
||||
"payload": { "entry": "web-novel-delivery", "adapterConfig": { "baseModule": "HLP-MOD-OFFICIAL-WEB-NOVEL-WORKBENCH-0001", "capabilities": ["CHAPTER_VERSION_RESTORE", "TXT_EXPORT", "DOCX_EXPORT", "EPUB_EXPORT", "JSON_EXPORT"], "dataBoundary": "CURRENT_AUTHENTICATED_ACCOUNT_LOCAL", "humanConfirmationRequiredForRestore": true, "persistent": true } }
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRTBrb01WSENhMmIvUGxyRnozY2k0aTVaQ1lFL3VLdWllSURCak54VWwrM2h1QXM4Sk10ZGc0Qm1EYzhhUVJVTFB6OXRqLzc5cSt3U0NleS9WR2owN3djPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDgxNTE1CWZpbGU6SExQLU1PRC1PRkZJQ0lBTC1XRUItTk9WRUwtREVMSVZFUlktMDAwMS0wLjEuMC5naG1vZApQWWFETDdISGFvbGdtVVZCK0V5VUVqNlFvSGRmQWVuY3dSRS9ZWm1UVHhCS0U4bHNCQzl0RFFtbDZEUXREWnp6MjQxbHF1bVgwS0NhS1ZBUGZxd3ZBUT09Cg==
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"schema": "hololake.module-package/v1",
|
||||
"manifest": {
|
||||
"moduleNumber": "HLP-MOD-OFFICIAL-WEB-NOVEL-GRID-0001", "registrationClass": "OFFICIAL_LIGHTHOUSE", "displayName": "多维情节表与情节板", "version": "0.1.0", "minimumHostVersion": "0.5.0", "adapter": "web-novel-workbench-v1", "contentDigest": "61bf4969e97003f203af5e0b38bb37024847cb574a3ac09025f10586061805ce", "permissions": ["WEB_NOVEL_FIELD_DEFINITION_WRITE", "WEB_NOVEL_FIELD_VALUE_WRITE"], "userDataSchema": "hololake.module-data/web-novel-grid/v1", "selfTest": { "kind": "DECLARATIVE_SCHEMA_V1", "expectedContentDigest": "61bf4969e97003f203af5e0b38bb37024847cb574a3ac09025f10586061805ce" }
|
||||
},
|
||||
"payload": { "entry": "web-novel-grid", "adapterConfig": { "baseModule": "HLP-MOD-OFFICIAL-WEB-NOVEL-WORKBENCH-0001", "capabilities": ["FIELD_DEFINITION_WRITE", "FIELD_VALUE_WRITE"], "dataBoundary": "CURRENT_AUTHENTICATED_ACCOUNT_LOCAL", "persistent": true } }
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRTBuWjBmYWczdEg3QXByZS9RaEY4N2x6RXN1WVY2ZEJGSmdSYmZyTGUrclVvYm1sd0t4REhOY1dVdW1EeGtramhqeSs4YU9nQVNBbkdCWVlEYmNteXdzPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDgxNTE1CWZpbGU6SExQLU1PRC1PRkZJQ0lBTC1XRUItTk9WRUwtR1JJRC0wMDAxLTAuMS4wLmdobW9kCkJLczNMbmpqYzVTdXQ5RklHMXdlMWpDcE9tRnlBYWlPcUJkMzZQbFlRSzFYVDFtNmYrZ1htN1VqZWJkaktUWmZ5VVZvczZ4YmVrWHRuQ3lNOXU0SkFBPT0K
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"schema": "hololake.module-package/v1",
|
||||
"manifest": {
|
||||
"moduleNumber": "HLP-MOD-OFFICIAL-WEB-NOVEL-OUTLINE-0001", "registrationClass": "OFFICIAL_LIGHTHOUSE", "displayName": "作品结构与大纲追踪", "version": "0.1.0", "minimumHostVersion": "0.5.0", "adapter": "web-novel-workbench-v1", "contentDigest": "7da54b0220940a8a19351ff9bf3cd177c93fc25c533329a60926b8ea245dafbe", "permissions": ["WEB_NOVEL_SCENE_WRITE", "WEB_NOVEL_BEAT_WRITE"], "userDataSchema": "hololake.module-data/web-novel-outline/v1", "selfTest": { "kind": "DECLARATIVE_SCHEMA_V1", "expectedContentDigest": "7da54b0220940a8a19351ff9bf3cd177c93fc25c533329a60926b8ea245dafbe" }
|
||||
},
|
||||
"payload": { "entry": "web-novel-outline", "adapterConfig": { "baseModule": "HLP-MOD-OFFICIAL-WEB-NOVEL-WORKBENCH-0001", "capabilities": ["SCENE_WRITE", "BEAT_WRITE"], "dataBoundary": "CURRENT_AUTHENTICATED_ACCOUNT_LOCAL", "persistent": true } }
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRTNUYVhwVTlzdWt6VkVQYTUyanB6UFlYeU5BdW1qN0xuM1haWjlCYUU3UFlMRTdPZG90YVZvNGFyaVo4UHY0THowUWlPVzIzemYrQWNZbDFvRVd5NndrPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDgxNTE2CWZpbGU6SExQLU1PRC1PRkZJQ0lBTC1XRUItTk9WRUwtT1VUTElORS0wMDAxLTAuMS4wLmdobW9kCkZob1VsQlkwZFRyZXI2ck1OckhUc2ZqaHVJOWhSQnIraUFRSEllU3BxRlc3UStFekJRZDFMZFpmZlBvK09jTFJ6cERpcVl2M2N2emIvS0ptdnRrTkR3PT0K
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"schema": "hololake.module-package/v1",
|
||||
"manifest": {
|
||||
"moduleNumber": "HLP-MOD-OFFICIAL-WEB-NOVEL-STORYWORLD-0001", "registrationClass": "OFFICIAL_LIGHTHOUSE", "displayName": "时间线与故事资料库", "version": "0.1.0", "minimumHostVersion": "0.5.0", "adapter": "web-novel-workbench-v1", "contentDigest": "9627949a975ce489dde80de52c538a57bb73b87e31ddb1e5efb48cee53922b71", "permissions": ["WEB_NOVEL_TIMELINE_WRITE", "WEB_NOVEL_SCENE_ENTITY_LINK_WRITE"], "userDataSchema": "hololake.module-data/web-novel-storyworld/v1", "selfTest": { "kind": "DECLARATIVE_SCHEMA_V1", "expectedContentDigest": "9627949a975ce489dde80de52c538a57bb73b87e31ddb1e5efb48cee53922b71" }
|
||||
},
|
||||
"payload": { "entry": "web-novel-storyworld", "adapterConfig": { "baseModule": "HLP-MOD-OFFICIAL-WEB-NOVEL-WORKBENCH-0001", "capabilities": ["TIMELINE_WRITE", "SCENE_ENTITY_LINK_WRITE"], "dataBoundary": "CURRENT_AUTHENTICATED_ACCOUNT_LOCAL", "persistent": true } }
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRXpuRmFPWjJUSDVpSmQzQXl0aVF3N0xhRkRvVWhLalVtcDBnRFprNnpOUEdCWS9CTURlUHBrYWkyRG9MUFZwVEtHc0w5ZUltRlNUVlZBcm1vU2VnUlFZPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDgxNTE2CWZpbGU6SExQLU1PRC1PRkZJQ0lBTC1XRUItTk9WRUwtU1RPUllXT1JMRC0wMDAxLTAuMS4wLmdobW9kCnBzQkJYaTV6NFR2Vnk3NUdpK3JSQnJTUzhSd2hxUWdmM0UrcVZuN0VuS0JOc1lYclY5Y3FBbVJldVM1Y2FGamNtT3NiU0NsaThMRE5qT3VvTXJUUUJ3PT0K
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
{
|
||||
"schema": "hololake.module-package/v1",
|
||||
"manifest": {
|
||||
"moduleNumber": "HLP-MOD-OFFICIAL-WEB-NOVEL-WORKBENCH-0001",
|
||||
"registrationClass": "OFFICIAL_LIGHTHOUSE",
|
||||
"displayName": "网文作者工作台",
|
||||
"version": "0.1.0",
|
||||
"minimumHostVersion": "0.5.0",
|
||||
"adapter": "web-novel-workbench-v1",
|
||||
"contentDigest": "df03a94751cd50ea26e2fc0f68ac21bd55e62f2034ff83c562a840c8aab72d2e",
|
||||
"permissions": ["WEB_NOVEL_WORKSPACE_READ", "WEB_NOVEL_WORKSPACE_WRITE", "WEB_NOVEL_IMPORT_READ_FILE", "WEB_NOVEL_AUTHOR_ACTIVITY_WRITE", "WEB_NOVEL_STORY_BIBLE_WRITE", "WEB_NOVEL_EDITORIAL_WORKFLOW_WRITE", "WEB_NOVEL_OPERATIONS_WRITE", "WEB_NOVEL_CHECKPOINT_WRITE"],
|
||||
"userDataSchema": "hololake.module-data/web-novel-workbench/v1",
|
||||
"selfTest": { "kind": "DECLARATIVE_SCHEMA_V1", "expectedContentDigest": "df03a94751cd50ea26e2fc0f68ac21bd55e62f2034ff83c562a840c8aab72d2e" }
|
||||
},
|
||||
"payload": {
|
||||
"entry": "web-novel-workspace",
|
||||
"adapterConfig": {
|
||||
"dataBoundary": "CURRENT_AUTHENTICATED_ACCOUNT_LOCAL",
|
||||
"legacyDataPolicy": "READ_IN_PLACE_NO_DESTRUCTIVE_MIGRATION",
|
||||
"workspaceFeatures": ["WORKS", "VOLUMES", "CHAPTERS", "ENTITIES", "EDITORIAL", "OPERATIONS", "CHECKPOINTS", "IMPORT"],
|
||||
"advancedModules": ["HLP-MOD-OFFICIAL-WEB-NOVEL-OUTLINE-0001", "HLP-MOD-OFFICIAL-WEB-NOVEL-GRID-0001", "HLP-MOD-OFFICIAL-WEB-NOVEL-STORYWORLD-0001", "HLP-MOD-OFFICIAL-WEB-NOVEL-DELIVERY-0001"],
|
||||
"thirdPartyPublishDefault": "DENY",
|
||||
"persistent": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRTZyTUlUYWdZZXk3bFhDRTJBWElWMkVEQXZHa3dSWDFXSFJ2QjduVFk1bzFLUk5kOVFQamIwU2w1L3FzOWtibm9Kblg2NWJLWFdVeEtEbDNzTEltVmdFPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDgxNTE3CWZpbGU6SExQLU1PRC1PRkZJQ0lBTC1XRUItTk9WRUwtV09SS0JFTkNILTAwMDEtMC4xLjAuZ2htb2QKV0VqV3B4cFNLRng2UUcrNXlYZjY5SytERk14YTNyRkM1bldzUXo5RWpzMU0vRmVJWldvTGhmbmExcFhmSGZiWTFreElreGU2UHVsaXVhK0ZXZnVyQ2c9PQo=
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"schema": "hololake.module-package/v1",
|
||||
"moduleId": "HL-MOD-WEBNOVEL-DELIVERY-004",
|
||||
"name": "高级版本与交付",
|
||||
"version": "1.0.0",
|
||||
"publisher": "HoloLake Official",
|
||||
"runtimeAdapter": "HOLOLAKE_NATIVE_SHARED_WEBNOVEL_ENGINE",
|
||||
"capabilities": ["chapter_version.read", "chapter_version.restore", "delivery.txt", "delivery.docx", "delivery.epub", "delivery.json"],
|
||||
"permissions": ["current_account.web_novel.read", "current_account.web_novel.write", "human_selected_export_path.write"],
|
||||
"dataPolicy": "PROGRAM_AND_USER_DATA_SEPARATED",
|
||||
"selfTest": "WEBNOVEL_VERSION_READBACK_AND_EXPORT_BUILD"
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"schema": "hololake.module-package/v1",
|
||||
"moduleId": "HL-MOD-WEBNOVEL-GRID-002",
|
||||
"name": "多维情节表与情节板",
|
||||
"version": "1.0.0",
|
||||
"publisher": "HoloLake Official",
|
||||
"runtimeAdapter": "HOLOLAKE_NATIVE_SHARED_WEBNOVEL_ENGINE",
|
||||
"capabilities": ["story_grid.read", "story_grid.write", "custom_field.write", "story_board.group"],
|
||||
"permissions": ["current_account.web_novel.read", "current_account.web_novel.write"],
|
||||
"dataPolicy": "ONE_SCENE_GRAPH_NO_DUPLICATE_STORY_STORE",
|
||||
"selfTest": "WEBNOVEL_GRID_SCHEMA_AND_SHARED_SCENE_PROJECTION"
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"schema": "hololake.module-package/v1",
|
||||
"moduleId": "HL-MOD-WEBNOVEL-OUTLINE-001",
|
||||
"name": "作品结构与大纲追踪",
|
||||
"version": "1.0.0",
|
||||
"publisher": "HoloLake Official",
|
||||
"runtimeAdapter": "HOLOLAKE_NATIVE_SHARED_WEBNOVEL_ENGINE",
|
||||
"capabilities": ["scene.write", "beat.write", "outline.track"],
|
||||
"permissions": ["current_account.web_novel.read", "current_account.web_novel.write"],
|
||||
"dataPolicy": "USER_DATA_REMAINS_AFTER_UNINSTALL",
|
||||
"selfTest": "WEBNOVEL_OUTLINE_SCHEMA_AND_ROUNDTRIP"
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"schema": "hololake.module-package/v1",
|
||||
"moduleId": "HL-MOD-WEBNOVEL-STORYWORLD-003",
|
||||
"name": "时间线与故事资料库",
|
||||
"version": "1.0.0",
|
||||
"publisher": "HoloLake Official",
|
||||
"runtimeAdapter": "HOLOLAKE_NATIVE_SHARED_WEBNOVEL_ENGINE",
|
||||
"capabilities": ["timeline.read", "timeline.write", "scene_entity.link", "story_bible.read"],
|
||||
"permissions": ["current_account.web_novel.read", "current_account.web_novel.write"],
|
||||
"dataPolicy": "USER_DATA_REMAINS_AFTER_UNINSTALL",
|
||||
"selfTest": "WEBNOVEL_TIMELINE_SCHEMA_AND_RELATION_ROUNDTRIP"
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
# Web novel 0.4.1 lifecycle fixtures
|
||||
|
||||
These four JSON files preserve the exact bytes used by the donor's lifecycle regression tests.
|
||||
They are not bundled by `module_package_runtime`, are not registered in numbered IPC, and are not
|
||||
production module identities. HoloLake 0.5.x uses the signed `HLP-MOD-OFFICIAL-WEB-NOVEL-*`
|
||||
packages in `fixtures/module-packages` as its only runtime authority.
|
||||
|
|
@ -56,9 +56,11 @@
|
|||
"local_runtime_acceptance_receipt": "audit/local-runtime-acceptance-20260815.json",
|
||||
"domain_membrane_pncc_installed_acceptance_receipt": "audit/hololake-0.4.0-domain-membrane-pncc-installed-acceptance-20260816.json",
|
||||
"updater_bootstrap_installed_acceptance_receipt": "audit/hololake-0.4.1-updater-bootstrap-installed-acceptance-20260817.json",
|
||||
"installed_desktop_path": "/Applications/HoloLake.app",
|
||||
"installed_desktop_path": "/Users/bingshuolingdianyuanhe/Desktop/HoloLake.app",
|
||||
"old_desktop_apps_recoverably_archived": true,
|
||||
"public_developer_id_and_notarized_acceptance": false,
|
||||
"local_developer_id_signed_0_5_0_installed_acceptance": true,
|
||||
"numbered_root_installed_acceptance_receipt": "audit/hololake-0.5.0-numbered-root-installed-acceptance-20260818.json",
|
||||
"stage_one_implementation_order": [
|
||||
"PERSONAL_CHANNEL_IDENTITY_TASK_EVENT_RECEIPT_KERNEL",
|
||||
"KNOWLEDGE_TREE_PAGE_SEARCH_AND_LOCAL_PERSISTENCE",
|
||||
|
|
@ -99,8 +101,11 @@
|
|||
"automatic_restart_allowed": false,
|
||||
"private_signing_material_allowed_in_source": false,
|
||||
"donor_audit_record": "audit/donor-audit.json",
|
||||
"donor_audit_complete": false,
|
||||
"donor_audit_complete": true,
|
||||
"donor_source_copying_allowed": false,
|
||||
"module_donor_admission_registry": "contracts/module-donor-admission-registry.json",
|
||||
"module_donor_bulk_merge_allowed": false,
|
||||
"module_donor_one_candidate_per_admission_cycle": true,
|
||||
"stage_one_product_contract": "contracts/stage-one-platform.json",
|
||||
"local_development_bridge_contract": "contracts/local-development-bridge.json",
|
||||
"account_single_writer_kernel_implemented": true,
|
||||
|
|
@ -128,7 +133,7 @@
|
|||
"pncc_jd_live_server_projection_repository_content_exposed": false,
|
||||
"pncc_jd_live_server_projection_write_authority": false,
|
||||
"pncc_jd_live_server_projection_carrier_state": "UNBOUND_EVIDENCE_REQUIRED",
|
||||
"installed_local_product_version": "0.4.1",
|
||||
"installed_local_product_version": "0.5.0",
|
||||
"pncc_authenticated_direct_broker_integration_implemented": true,
|
||||
"pncc_human_mount_registration_implemented": true,
|
||||
"pncc_human_mount_registration_gate": "SATISFIED_NATIVE_FILE_PICKER_EXACT_CONFIRMATION",
|
||||
|
|
|
|||
4
product-source/hololake-native-desktop/mobile/ios/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
build/
|
||||
*.xcuserstate
|
||||
xcuserdata/
|
||||
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>method</key>
|
||||
<string>debugging</string>
|
||||
<key>signingStyle</key>
|
||||
<string>automatic</string>
|
||||
<key>teamID</key>
|
||||
<string>825A9L3G7Q</string>
|
||||
<key>stripSwiftSymbols</key>
|
||||
<true/>
|
||||
<key>uploadSymbols</key>
|
||||
<false/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>HoloLake</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>$(MARKETING_VERSION)</string>
|
||||
<key>CFBundleURLTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Editor</string>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>com.guanghulab.hololake.pair</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>hololake</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||
<key>LSApplicationCategoryType</key>
|
||||
<string>public.app-category.productivity</string>
|
||||
<key>NSAppTransportSecurity</key>
|
||||
<dict>
|
||||
<key>NSAllowsLocalNetworking</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>NSLocalNetworkUsageDescription</key>
|
||||
<string>HoloLake 仅在你明确配对后,通过同一局域网连接你的电脑端频道。</string>
|
||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||
<true/>
|
||||
<key>UILaunchScreen</key>
|
||||
<dict/>
|
||||
<key>UIRequiresFullScreen</key>
|
||||
<true/>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>BNDL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
@ -0,0 +1,425 @@
|
|||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 77;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
147588FBBE65B668142D5DBE /* HoloLakeMobileTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BBF45AEC03B7B5DE76DE7DA /* HoloLakeMobileTests.swift */; };
|
||||
149652D6C6336752E39CEF9D /* HoloLakeKeychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A889326BDEACBDB756B15A /* HoloLakeKeychain.swift */; };
|
||||
4C8E5CF9FBFC541E3724C695 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5DF66BC64D4DCD3BF0583C4 /* ContentView.swift */; };
|
||||
4FD7821997D8E90E6594FC23 /* HoloLakeMobileApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DCE2A5796B15DAC37985182 /* HoloLakeMobileApp.swift */; };
|
||||
9BC7CC6D8BC355D731943912 /* HoloLakeDesign.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39A48AB789379757C66C6884 /* HoloLakeDesign.swift */; };
|
||||
C0E93C7456C0A3BE8BA595FC /* HoloLakeSyncClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = B91D61B90D609EF17397D193 /* HoloLakeSyncClient.swift */; };
|
||||
FFEEE7FC9ED4ECCD91A96AF1 /* HoloLakeModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 001F5647617271E7611365B1 /* HoloLakeModels.swift */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
CD999C930B8B85FE1C3D884D /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 7BB68CAE65448CB9319F9FE1 /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 306917F839BF1A325E2C4CF4;
|
||||
remoteInfo = HoloLakeMobile;
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
001F5647617271E7611365B1 /* HoloLakeModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HoloLakeModels.swift; sourceTree = "<group>"; };
|
||||
39A48AB789379757C66C6884 /* HoloLakeDesign.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HoloLakeDesign.swift; sourceTree = "<group>"; };
|
||||
6DCE2A5796B15DAC37985182 /* HoloLakeMobileApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HoloLakeMobileApp.swift; sourceTree = "<group>"; };
|
||||
75A889326BDEACBDB756B15A /* HoloLakeKeychain.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HoloLakeKeychain.swift; sourceTree = "<group>"; };
|
||||
7BBF45AEC03B7B5DE76DE7DA /* HoloLakeMobileTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HoloLakeMobileTests.swift; sourceTree = "<group>"; };
|
||||
AAB8B15F447567F18DF8DA22 /* HoloLakeMobileTests.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = HoloLakeMobileTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
B91D61B90D609EF17397D193 /* HoloLakeSyncClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HoloLakeSyncClient.swift; sourceTree = "<group>"; };
|
||||
D5DF66BC64D4DCD3BF0583C4 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
||||
F674C2EA817D94D8089E46A6 /* HoloLakeMobile.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = HoloLakeMobile.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
14AB215583F1F3DFF867AD25 /* Sources */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D5DF66BC64D4DCD3BF0583C4 /* ContentView.swift */,
|
||||
39A48AB789379757C66C6884 /* HoloLakeDesign.swift */,
|
||||
75A889326BDEACBDB756B15A /* HoloLakeKeychain.swift */,
|
||||
6DCE2A5796B15DAC37985182 /* HoloLakeMobileApp.swift */,
|
||||
001F5647617271E7611365B1 /* HoloLakeModels.swift */,
|
||||
B91D61B90D609EF17397D193 /* HoloLakeSyncClient.swift */,
|
||||
);
|
||||
path = Sources;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
57FD470E035A4BE1AC23C789 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
14AB215583F1F3DFF867AD25 /* Sources */,
|
||||
65C6F102E3F59F8DEC7CF977 /* Tests */,
|
||||
C1AA7BA4A57964238429B9FC /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
65C6F102E3F59F8DEC7CF977 /* Tests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
7BBF45AEC03B7B5DE76DE7DA /* HoloLakeMobileTests.swift */,
|
||||
);
|
||||
path = Tests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
C1AA7BA4A57964238429B9FC /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
F674C2EA817D94D8089E46A6 /* HoloLakeMobile.app */,
|
||||
AAB8B15F447567F18DF8DA22 /* HoloLakeMobileTests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
306917F839BF1A325E2C4CF4 /* HoloLakeMobile */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 821BFCD605046D5BD179550C /* Build configuration list for PBXNativeTarget "HoloLakeMobile" */;
|
||||
buildPhases = (
|
||||
EF1823B21F5FD988A9F1C68B /* Sources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = HoloLakeMobile;
|
||||
packageProductDependencies = (
|
||||
);
|
||||
productName = HoloLakeMobile;
|
||||
productReference = F674C2EA817D94D8089E46A6 /* HoloLakeMobile.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
9F8DF7CBFC2D6315E6807301 /* HoloLakeMobileTests */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 94843BB695F4BFC5D7BD814C /* Build configuration list for PBXNativeTarget "HoloLakeMobileTests" */;
|
||||
buildPhases = (
|
||||
C9F5955F3342913B35B01034 /* Sources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
43C074DF3E4135062FD9F2D5 /* PBXTargetDependency */,
|
||||
);
|
||||
name = HoloLakeMobileTests;
|
||||
packageProductDependencies = (
|
||||
);
|
||||
productName = HoloLakeMobileTests;
|
||||
productReference = AAB8B15F447567F18DF8DA22 /* HoloLakeMobileTests.xctest */;
|
||||
productType = "com.apple.product-type.bundle.unit-test";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
7BB68CAE65448CB9319F9FE1 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
BuildIndependentTargetsInParallel = YES;
|
||||
LastUpgradeCheck = 1430;
|
||||
TargetAttributes = {
|
||||
306917F839BF1A325E2C4CF4 = {
|
||||
DevelopmentTeam = 825A9L3G7Q;
|
||||
ProvisioningStyle = Automatic;
|
||||
};
|
||||
9F8DF7CBFC2D6315E6807301 = {
|
||||
DevelopmentTeam = 825A9L3G7Q;
|
||||
ProvisioningStyle = Automatic;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 9D0C9B96A22462DAABC1E8F8 /* Build configuration list for PBXProject "HoloLakeMobile" */;
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
Base,
|
||||
en,
|
||||
);
|
||||
mainGroup = 57FD470E035A4BE1AC23C789;
|
||||
minimizedProjectReferenceProxies = 1;
|
||||
preferredProjectObjectVersion = 77;
|
||||
productRefGroup = C1AA7BA4A57964238429B9FC /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
306917F839BF1A325E2C4CF4 /* HoloLakeMobile */,
|
||||
9F8DF7CBFC2D6315E6807301 /* HoloLakeMobileTests */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
C9F5955F3342913B35B01034 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
147588FBBE65B668142D5DBE /* HoloLakeMobileTests.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
EF1823B21F5FD988A9F1C68B /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
4C8E5CF9FBFC541E3724C695 /* ContentView.swift in Sources */,
|
||||
9BC7CC6D8BC355D731943912 /* HoloLakeDesign.swift in Sources */,
|
||||
149652D6C6336752E39CEF9D /* HoloLakeKeychain.swift in Sources */,
|
||||
4FD7821997D8E90E6594FC23 /* HoloLakeMobileApp.swift in Sources */,
|
||||
FFEEE7FC9ED4ECCD91A96AF1 /* HoloLakeModels.swift in Sources */,
|
||||
C0E93C7456C0A3BE8BA595FC /* HoloLakeSyncClient.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXTargetDependency section */
|
||||
43C074DF3E4135062FD9F2D5 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = 306917F839BF1A325E2C4CF4 /* HoloLakeMobile */;
|
||||
targetProxy = CD999C930B8B85FE1C3D884D /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
41EDE5121626CC1CCE382706 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = 825A9L3G7Q;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
|
||||
MARKETING_VERSION = 0.5.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
4F5C6B6543A0A3082363F109 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
DEVELOPMENT_TEAM = 825A9L3G7Q;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"$(inherited)",
|
||||
"DEBUG=1",
|
||||
);
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
|
||||
MARKETING_VERSION = 0.5.0;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
512CB348BCA8C1688C5D794E /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
INFOPLIST_FILE = "Generated/HoloLakeMobileTests-Info.plist";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@loader_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.guanghulab.hololake.tests;
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HoloLake.app/HoloLake";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
A44510E6B199DFF6BD5BC1EF /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
INFOPLIST_FILE = "Generated/HoloLakeMobileTests-Info.plist";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@loader_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.guanghulab.hololake.tests;
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HoloLake.app/HoloLake";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
B82D688E4449B0C6DC27D25E /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
INFOPLIST_FILE = "Generated/HoloLakeMobile-Info.plist";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.guanghulab.hololake;
|
||||
PRODUCT_MODULE_NAME = HoloLakeMobile;
|
||||
PRODUCT_NAME = HoloLake;
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
BECD79B877979A2CD86E7D9C /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
INFOPLIST_FILE = "Generated/HoloLakeMobile-Info.plist";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.guanghulab.hololake;
|
||||
PRODUCT_MODULE_NAME = HoloLakeMobile;
|
||||
PRODUCT_NAME = HoloLake;
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
821BFCD605046D5BD179550C /* Build configuration list for PBXNativeTarget "HoloLakeMobile" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
BECD79B877979A2CD86E7D9C /* Debug */,
|
||||
B82D688E4449B0C6DC27D25E /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Debug;
|
||||
};
|
||||
94843BB695F4BFC5D7BD814C /* Build configuration list for PBXNativeTarget "HoloLakeMobileTests" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
A44510E6B199DFF6BD5BC1EF /* Debug */,
|
||||
512CB348BCA8C1688C5D794E /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Debug;
|
||||
};
|
||||
9D0C9B96A22462DAABC1E8F8 /* Build configuration list for PBXProject "HoloLakeMobile" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
4F5C6B6543A0A3082363F109 /* Debug */,
|
||||
41EDE5121626CC1CCE382706 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Debug;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 7BB68CAE65448CB9319F9FE1 /* Project object */;
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
|
|
@ -0,0 +1,106 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1430"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES"
|
||||
runPostActionsOnFailure = "NO">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "306917F839BF1A325E2C4CF4"
|
||||
BuildableName = "HoloLakeMobile.app"
|
||||
BlueprintName = "HoloLakeMobile"
|
||||
ReferencedContainer = "container:HoloLakeMobile.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
onlyGenerateCoverageForSpecifiedTargets = "NO">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "306917F839BF1A325E2C4CF4"
|
||||
BuildableName = "HoloLakeMobile.app"
|
||||
BlueprintName = "HoloLakeMobile"
|
||||
ReferencedContainer = "container:HoloLakeMobile.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO"
|
||||
parallelizable = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "9F8DF7CBFC2D6315E6807301"
|
||||
BuildableName = "HoloLakeMobileTests.xctest"
|
||||
BlueprintName = "HoloLakeMobileTests"
|
||||
ReferencedContainer = "container:HoloLakeMobile.xcodeproj">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
<CommandLineArguments>
|
||||
</CommandLineArguments>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "306917F839BF1A325E2C4CF4"
|
||||
BuildableName = "HoloLakeMobile.app"
|
||||
BlueprintName = "HoloLakeMobile"
|
||||
ReferencedContainer = "container:HoloLakeMobile.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<CommandLineArguments>
|
||||
</CommandLineArguments>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "306917F839BF1A325E2C4CF4"
|
||||
BuildableName = "HoloLakeMobile.app"
|
||||
BlueprintName = "HoloLakeMobile"
|
||||
ReferencedContainer = "container:HoloLakeMobile.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<CommandLineArguments>
|
||||
</CommandLineArguments>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
|
|
@ -0,0 +1,203 @@
|
|||
import SwiftUI
|
||||
import UIKit
|
||||
|
||||
struct ContentView: View {
|
||||
@EnvironmentObject private var client: HoloLakeSyncClient
|
||||
@State private var pairingText = ""
|
||||
@State private var captureTitle = ""
|
||||
@State private var captureBody = ""
|
||||
|
||||
var body: some View {
|
||||
NavigationStack {
|
||||
ZStack {
|
||||
LinearGradient(
|
||||
colors: [HoloLakeDesign.deep, HoloLakeDesign.lake, HoloLakeDesign.violet.opacity(0.78)],
|
||||
startPoint: .topLeading,
|
||||
endPoint: .bottomTrailing
|
||||
)
|
||||
.ignoresSafeArea()
|
||||
|
||||
ScrollView {
|
||||
VStack(spacing: 16) {
|
||||
header
|
||||
if client.session == nil { pairingCard } else { dashboard }
|
||||
boundaryCard
|
||||
}
|
||||
.padding(.horizontal, 18)
|
||||
.padding(.vertical, 16)
|
||||
}
|
||||
}
|
||||
.toolbar(.hidden, for: .navigationBar)
|
||||
.alert("HoloLake", isPresented: Binding(
|
||||
get: { client.errorText != nil },
|
||||
set: { if !$0 { client.errorText = nil } }
|
||||
)) {
|
||||
Button("知道了", role: .cancel) { client.errorText = nil }
|
||||
} message: {
|
||||
Text(client.errorText ?? "")
|
||||
}
|
||||
}
|
||||
.preferredColorScheme(.dark)
|
||||
}
|
||||
|
||||
private var header: some View {
|
||||
HStack(alignment: .center) {
|
||||
VStack(alignment: .leading, spacing: 5) {
|
||||
Text("HoloLake").font(.title.weight(.semibold)).tracking(2)
|
||||
Text("同一频道 · iPhone 轻入口")
|
||||
.font(.subheadline)
|
||||
.foregroundStyle(HoloLakeDesign.muted)
|
||||
}
|
||||
Spacer()
|
||||
Circle()
|
||||
.fill(client.session == nil ? HoloLakeDesign.gold : HoloLakeDesign.mint)
|
||||
.frame(width: 11, height: 11)
|
||||
.shadow(color: client.session == nil ? HoloLakeDesign.gold : HoloLakeDesign.mint, radius: 8)
|
||||
}
|
||||
.foregroundStyle(HoloLakeDesign.pearl)
|
||||
.padding(.top, 4)
|
||||
}
|
||||
|
||||
private var pairingCard: some View {
|
||||
LakeCard {
|
||||
VStack(alignment: .leading, spacing: 14) {
|
||||
Text("连接电脑端").font(.title3.weight(.semibold))
|
||||
Text("先在电脑端打开“多端同步”,再扫描配对码或粘贴配对链接。配对密钥只保存在这台 iPhone 的钥匙串。")
|
||||
.font(.subheadline)
|
||||
.foregroundStyle(HoloLakeDesign.muted)
|
||||
|
||||
TextField("hololake://pair?…", text: $pairingText, axis: .vertical)
|
||||
.textInputAutocapitalization(.never)
|
||||
.autocorrectionDisabled()
|
||||
.padding(14)
|
||||
.background(.black.opacity(0.22), in: RoundedRectangle(cornerRadius: 16))
|
||||
|
||||
HStack {
|
||||
Button("从剪贴板读取") {
|
||||
pairingText = UIPasteboard.general.string ?? ""
|
||||
}
|
||||
.buttonStyle(.bordered)
|
||||
|
||||
Button("校验并配对") {
|
||||
Task { await client.pair(from: pairingText) }
|
||||
}
|
||||
.buttonStyle(.borderedProminent)
|
||||
.tint(HoloLakeDesign.gold)
|
||||
.foregroundStyle(HoloLakeDesign.deep)
|
||||
.disabled(pairingText.isEmpty || client.isWorking)
|
||||
}
|
||||
}
|
||||
}
|
||||
.foregroundStyle(HoloLakeDesign.pearl)
|
||||
}
|
||||
|
||||
private var dashboard: some View {
|
||||
VStack(spacing: 16) {
|
||||
LakeCard {
|
||||
VStack(alignment: .leading, spacing: 14) {
|
||||
HStack {
|
||||
VStack(alignment: .leading, spacing: 4) {
|
||||
Text(client.session?.desktopName ?? "电脑端")
|
||||
.font(.title3.weight(.semibold))
|
||||
Text(client.stateText)
|
||||
.font(.caption)
|
||||
.foregroundStyle(HoloLakeDesign.muted)
|
||||
}
|
||||
Spacer()
|
||||
Button {
|
||||
Task { await client.sync() }
|
||||
} label: {
|
||||
if client.isWorking {
|
||||
ProgressView()
|
||||
} else {
|
||||
Label("同步", systemImage: "arrow.triangle.2.circlepath")
|
||||
}
|
||||
}
|
||||
.buttonStyle(.borderedProminent)
|
||||
.tint(HoloLakeDesign.mint)
|
||||
.foregroundStyle(HoloLakeDesign.deep)
|
||||
.disabled(client.isWorking)
|
||||
}
|
||||
|
||||
if let snapshot = client.snapshot {
|
||||
HStack(spacing: 10) {
|
||||
MetricTile(label: "作品", value: "\(snapshot.webNovel.workCount)")
|
||||
MetricTile(label: "章节", value: "\(snapshot.webNovel.chapterCount)")
|
||||
MetricTile(label: "教育表", value: "\(snapshot.education.activeTableCount)")
|
||||
}
|
||||
} else {
|
||||
Text("保持静止;只有你点击同步时才会连接电脑。")
|
||||
.font(.subheadline)
|
||||
.foregroundStyle(HoloLakeDesign.muted)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LakeCard {
|
||||
VStack(alignment: .leading, spacing: 12) {
|
||||
Text("随手记回频道").font(.headline)
|
||||
TextField("标题(可选)", text: $captureTitle)
|
||||
.padding(12)
|
||||
.background(.black.opacity(0.2), in: RoundedRectangle(cornerRadius: 14))
|
||||
TextField("正文", text: $captureBody, axis: .vertical)
|
||||
.lineLimit(4...10)
|
||||
.padding(12)
|
||||
.background(.black.opacity(0.2), in: RoundedRectangle(cornerRadius: 14))
|
||||
Button("写入电脑端收件箱") {
|
||||
let title = captureTitle
|
||||
let body = captureBody
|
||||
Task {
|
||||
await client.sync(captureTitle: title, captureBody: body)
|
||||
if client.errorText == nil {
|
||||
captureTitle = ""
|
||||
captureBody = ""
|
||||
}
|
||||
}
|
||||
}
|
||||
.buttonStyle(.bordered)
|
||||
.disabled(captureBody.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty || client.isWorking)
|
||||
}
|
||||
}
|
||||
|
||||
if let works = client.snapshot?.webNovel.works, !works.isEmpty {
|
||||
LakeCard {
|
||||
VStack(alignment: .leading, spacing: 12) {
|
||||
Text("最近作品").font(.headline)
|
||||
ForEach(works.prefix(5)) { work in
|
||||
HStack {
|
||||
Text(work.title).lineLimit(1)
|
||||
Spacer()
|
||||
Text(work.status)
|
||||
.font(.caption)
|
||||
.foregroundStyle(HoloLakeDesign.muted)
|
||||
}
|
||||
if work.id != works.prefix(5).last?.id {
|
||||
Divider().overlay(.white.opacity(0.12))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Button("解除本机配对", role: .destructive) {
|
||||
client.disconnect()
|
||||
}
|
||||
.font(.footnote)
|
||||
}
|
||||
.foregroundStyle(HoloLakeDesign.pearl)
|
||||
}
|
||||
|
||||
private var boundaryCard: some View {
|
||||
VStack(alignment: .leading, spacing: 6) {
|
||||
Text("HLP-IOS-CLIENT-001")
|
||||
.font(.caption2.monospaced())
|
||||
.foregroundStyle(HoloLakeDesign.gold)
|
||||
Text("手机是同一频道的远程身体入口,不复制电脑桌面,不在电脑离线时执行人格或行业任务。")
|
||||
.font(.caption)
|
||||
.foregroundStyle(HoloLakeDesign.muted)
|
||||
}
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
.padding(.horizontal, 4)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
import SwiftUI
|
||||
|
||||
enum HoloLakeDesign {
|
||||
static let deep = Color(red: 0.025, green: 0.045, blue: 0.11)
|
||||
static let lake = Color(red: 0.08, green: 0.14, blue: 0.32)
|
||||
static let violet = Color(red: 0.34, green: 0.19, blue: 0.52)
|
||||
static let pearl = Color(red: 0.95, green: 0.96, blue: 1)
|
||||
static let muted = Color(red: 0.62, green: 0.66, blue: 0.78)
|
||||
static let gold = Color(red: 0.96, green: 0.87, blue: 0.62)
|
||||
static let mint = Color(red: 0.43, green: 0.93, blue: 0.78)
|
||||
}
|
||||
|
||||
struct LakeCard<Content: View>: View {
|
||||
@ViewBuilder let content: Content
|
||||
|
||||
var body: some View {
|
||||
content
|
||||
.padding(18)
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
.background(.white.opacity(0.075), in: RoundedRectangle(cornerRadius: 24))
|
||||
.overlay {
|
||||
RoundedRectangle(cornerRadius: 24)
|
||||
.stroke(.white.opacity(0.14), lineWidth: 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct MetricTile: View {
|
||||
let label: String
|
||||
let value: String
|
||||
|
||||
var body: some View {
|
||||
VStack(alignment: .leading, spacing: 6) {
|
||||
Text(label).font(.caption).foregroundStyle(HoloLakeDesign.muted)
|
||||
Text(value).font(.title2.weight(.semibold)).foregroundStyle(HoloLakeDesign.pearl)
|
||||
}
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
.padding(14)
|
||||
.background(.white.opacity(0.055), in: RoundedRectangle(cornerRadius: 18))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
import Foundation
|
||||
import Security
|
||||
|
||||
enum HoloLakeKeychain {
|
||||
private static let service = "com.guanghulab.hololake.mobile-sync"
|
||||
private static let account = "HLP-IOS-CLIENT-001"
|
||||
|
||||
static func load() throws -> StoredSession? {
|
||||
let query: [String: Any] = [
|
||||
kSecClass as String: kSecClassGenericPassword,
|
||||
kSecAttrService as String: service,
|
||||
kSecAttrAccount as String: account,
|
||||
kSecReturnData as String: true,
|
||||
kSecMatchLimit as String: kSecMatchLimitOne
|
||||
]
|
||||
var result: CFTypeRef?
|
||||
let status = SecItemCopyMatching(query as CFDictionary, &result)
|
||||
if status == errSecItemNotFound { return nil }
|
||||
guard status == errSecSuccess, let data = result as? Data else {
|
||||
throw HoloLakeMobileError.keychain(status)
|
||||
}
|
||||
return try JSONDecoder().decode(StoredSession.self, from: data)
|
||||
}
|
||||
|
||||
static func save(_ session: StoredSession) throws {
|
||||
let data = try JSONEncoder().encode(session)
|
||||
let query: [String: Any] = [
|
||||
kSecClass as String: kSecClassGenericPassword,
|
||||
kSecAttrService as String: service,
|
||||
kSecAttrAccount as String: account
|
||||
]
|
||||
let attributes: [String: Any] = [
|
||||
kSecValueData as String: data,
|
||||
kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
|
||||
]
|
||||
let update = SecItemUpdate(query as CFDictionary, attributes as CFDictionary)
|
||||
if update == errSecItemNotFound {
|
||||
var insertion = query
|
||||
insertion.merge(attributes) { _, new in new }
|
||||
let status = SecItemAdd(insertion as CFDictionary, nil)
|
||||
guard status == errSecSuccess else { throw HoloLakeMobileError.keychain(status) }
|
||||
} else if update != errSecSuccess {
|
||||
throw HoloLakeMobileError.keychain(update)
|
||||
}
|
||||
}
|
||||
|
||||
static func remove() throws {
|
||||
let query: [String: Any] = [
|
||||
kSecClass as String: kSecClassGenericPassword,
|
||||
kSecAttrService as String: service,
|
||||
kSecAttrAccount as String: account
|
||||
]
|
||||
let status = SecItemDelete(query as CFDictionary)
|
||||
guard status == errSecSuccess || status == errSecItemNotFound else {
|
||||
throw HoloLakeMobileError.keychain(status)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
import SwiftUI
|
||||
|
||||
@main
|
||||
struct HoloLakeMobileApp: App {
|
||||
@StateObject private var client = HoloLakeSyncClient()
|
||||
|
||||
var body: some Scene {
|
||||
WindowGroup {
|
||||
ContentView()
|
||||
.environmentObject(client)
|
||||
.onOpenURL { url in
|
||||
Task { await client.pair(with: url) }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,177 @@
|
|||
import Foundation
|
||||
import Security
|
||||
|
||||
struct PairingDescriptor: Equatable {
|
||||
let host: String
|
||||
let port: Int
|
||||
let pairingID: String
|
||||
let secret: Data
|
||||
|
||||
init(url: URL) throws {
|
||||
guard url.scheme == "hololake", url.host == "pair",
|
||||
let components = URLComponents(url: url, resolvingAgainstBaseURL: false) else {
|
||||
throw HoloLakeMobileError.invalidPairingLink
|
||||
}
|
||||
var values: [String: String] = [:]
|
||||
for item in components.queryItems ?? [] {
|
||||
guard let value = item.value, values[item.name] == nil else {
|
||||
throw HoloLakeMobileError.invalidPairingLink
|
||||
}
|
||||
values[item.name] = value
|
||||
}
|
||||
guard let host = values["host"], !host.isEmpty,
|
||||
let portText = values["port"], let port = Int(portText), (1...65535).contains(port),
|
||||
let pairingID = values["id"], UUID(uuidString: pairingID) != nil,
|
||||
let secretText = values["secret"],
|
||||
let secret = Data(base64URL: secretText), secret.count == 32 else {
|
||||
throw HoloLakeMobileError.invalidPairingLink
|
||||
}
|
||||
self.host = host
|
||||
self.port = port
|
||||
self.pairingID = pairingID
|
||||
self.secret = secret
|
||||
}
|
||||
|
||||
var baseURL: URL {
|
||||
URL(string: "http://\(host):\(port)")!
|
||||
}
|
||||
}
|
||||
|
||||
struct StoredSession: Codable, Equatable {
|
||||
let host: String
|
||||
let port: Int
|
||||
let deviceID: String
|
||||
let sessionKey: Data
|
||||
let desktopName: String
|
||||
var counter: UInt64
|
||||
var cursor: UInt64
|
||||
|
||||
var baseURL: URL {
|
||||
URL(string: "http://\(host):\(port)")!
|
||||
}
|
||||
}
|
||||
|
||||
struct PairRequest: Codable {
|
||||
let deviceName: String
|
||||
let platform: String
|
||||
let requestID: String
|
||||
}
|
||||
|
||||
struct PairResponse: Codable {
|
||||
let schema: String
|
||||
let state: String
|
||||
let deviceID: String
|
||||
let sessionKey: String
|
||||
let desktopName: String
|
||||
let rootNodeRole: String
|
||||
let requestID: String
|
||||
}
|
||||
|
||||
struct SyncRequest: Codable {
|
||||
let counter: UInt64
|
||||
let afterCursor: UInt64?
|
||||
let capture: MobileCaptureInput?
|
||||
}
|
||||
|
||||
struct MobileCaptureInput: Codable {
|
||||
let title: String
|
||||
let body: String
|
||||
let requestID: String
|
||||
}
|
||||
|
||||
struct MobileSyncSnapshot: Codable {
|
||||
let schema: String
|
||||
let state: String
|
||||
let cursor: UInt64
|
||||
let generatedAtUnixMs: UInt64
|
||||
let desktopName: String
|
||||
let rootNodeOnline: Bool
|
||||
let personalChannel: MobileChannelProjection
|
||||
let webNovel: MobileWebNovelProjection
|
||||
let education: MobileEducationProjection
|
||||
let recentCaptures: [MobileCaptureProjection]
|
||||
let boundary: MobileBoundaryProjection
|
||||
}
|
||||
|
||||
struct MobileChannelProjection: Codable {
|
||||
let home: String
|
||||
let growthEventCount: UInt64
|
||||
let integrity: String
|
||||
}
|
||||
|
||||
struct MobileWebNovelProjection: Codable {
|
||||
let workCount: UInt64
|
||||
let volumeCount: UInt64
|
||||
let chapterCount: UInt64
|
||||
let works: [MobileWebNovelWork]
|
||||
}
|
||||
|
||||
struct MobileWebNovelWork: Codable, Identifiable {
|
||||
let workID: String
|
||||
let title: String
|
||||
let status: String
|
||||
let updatedAtUnixMs: UInt64
|
||||
var id: String { workID }
|
||||
}
|
||||
|
||||
struct MobileEducationProjection: Codable {
|
||||
let activeTableCount: UInt64
|
||||
let archivedTableCount: UInt64
|
||||
let unassignedTableCount: UInt64
|
||||
let sensitiveValuesIncluded: Bool
|
||||
}
|
||||
|
||||
struct MobileCaptureProjection: Codable, Identifiable {
|
||||
let cursor: UInt64
|
||||
let captureID: String
|
||||
let title: String
|
||||
let body: String
|
||||
let sourceDeviceID: String
|
||||
let createdAtUnixMs: UInt64
|
||||
var id: String { captureID }
|
||||
}
|
||||
|
||||
struct MobileBoundaryProjection: Codable {
|
||||
let mobileRole: String
|
||||
let remoteDesktopClone: Bool
|
||||
let desktopOfflineExecution: Bool
|
||||
let sensitiveEducationValues: String
|
||||
let modelAPI: String
|
||||
}
|
||||
|
||||
enum HoloLakeMobileError: LocalizedError {
|
||||
case invalidPairingLink
|
||||
case invalidResponse
|
||||
case rejected(String)
|
||||
case missingNonce
|
||||
case missingSession
|
||||
case keychain(OSStatus)
|
||||
|
||||
var errorDescription: String? {
|
||||
switch self {
|
||||
case .invalidPairingLink: return "配对链接无效或已损坏。"
|
||||
case .invalidResponse: return "电脑端返回了无法校验的响应。"
|
||||
case .rejected(let code): return "电脑端拒绝了本次请求:\(code)"
|
||||
case .missingNonce: return "加密响应缺少一次性随机数。"
|
||||
case .missingSession: return "请先与电脑端 HoloLake 配对。"
|
||||
case .keychain(let status): return "本机钥匙串写入失败(\(status))。"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension Data {
|
||||
init?(base64URL value: String) {
|
||||
var text = value.replacingOccurrences(of: "-", with: "+")
|
||||
.replacingOccurrences(of: "_", with: "/")
|
||||
text += String(repeating: "=", count: (4 - text.count % 4) % 4)
|
||||
guard let data = Data(base64Encoded: text) else { return nil }
|
||||
self = data
|
||||
}
|
||||
|
||||
var base64URL: String {
|
||||
base64EncodedString()
|
||||
.replacingOccurrences(of: "+", with: "-")
|
||||
.replacingOccurrences(of: "/", with: "_")
|
||||
.replacingOccurrences(of: "=", with: "")
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,190 @@
|
|||
import CryptoKit
|
||||
import Foundation
|
||||
import UIKit
|
||||
|
||||
@MainActor
|
||||
final class HoloLakeSyncClient: ObservableObject {
|
||||
static let clientNumber = "HLP-IOS-CLIENT-001"
|
||||
static let pairAAD = Data("hololake.mobile.pair/v1".utf8)
|
||||
|
||||
@Published private(set) var session: StoredSession?
|
||||
@Published private(set) var snapshot: MobileSyncSnapshot?
|
||||
@Published private(set) var stateText = "尚未配对"
|
||||
@Published private(set) var isWorking = false
|
||||
@Published var errorText: String?
|
||||
|
||||
init() {
|
||||
do {
|
||||
session = try HoloLakeKeychain.load()
|
||||
stateText = session == nil ? "尚未配对" : "已配对,等待手动同步"
|
||||
} catch {
|
||||
errorText = error.localizedDescription
|
||||
}
|
||||
}
|
||||
|
||||
func pair(with url: URL) async {
|
||||
await perform("正在校验配对…") {
|
||||
let descriptor = try PairingDescriptor(url: url)
|
||||
let requestID = UUID().uuidString.lowercased()
|
||||
let payload = PairRequest(
|
||||
deviceName: UIDevice.current.name,
|
||||
platform: "IOS",
|
||||
requestID: requestID
|
||||
)
|
||||
let responseData = try await Self.exchange(
|
||||
url: descriptor.baseURL.appending(path: "v1/pair"),
|
||||
key: descriptor.secret,
|
||||
aad: Self.pairAAD,
|
||||
headers: ["X-HoloLake-Pairing-ID": descriptor.pairingID],
|
||||
payload: payload
|
||||
)
|
||||
let response = try JSONDecoder().decode(PairResponse.self, from: responseData)
|
||||
guard response.schema == "hololake.mobile-sync/v1",
|
||||
response.state == "PAIRED",
|
||||
response.rootNodeRole == "USER_LOCAL_COMPUTER_TERMINAL",
|
||||
response.requestID == requestID,
|
||||
let sessionKey = Data(base64URL: response.sessionKey), sessionKey.count == 32 else {
|
||||
throw HoloLakeMobileError.invalidResponse
|
||||
}
|
||||
let next = StoredSession(
|
||||
host: descriptor.host,
|
||||
port: descriptor.port,
|
||||
deviceID: response.deviceID,
|
||||
sessionKey: sessionKey,
|
||||
desktopName: response.desktopName,
|
||||
counter: 0,
|
||||
cursor: 0
|
||||
)
|
||||
try HoloLakeKeychain.save(next)
|
||||
session = next
|
||||
stateText = "已与 \(response.desktopName) 配对"
|
||||
}
|
||||
}
|
||||
|
||||
func pair(from text: String) async {
|
||||
guard let url = URL(string: text.trimmingCharacters(in: .whitespacesAndNewlines)) else {
|
||||
errorText = HoloLakeMobileError.invalidPairingLink.localizedDescription
|
||||
return
|
||||
}
|
||||
await pair(with: url)
|
||||
}
|
||||
|
||||
func sync(captureTitle: String? = nil, captureBody: String? = nil) async {
|
||||
await perform("正在与电脑同步…") {
|
||||
guard var current = session else { throw HoloLakeMobileError.missingSession }
|
||||
current.counter += 1
|
||||
// Consume and persist the counter before transport. If the root node accepts a
|
||||
// request but its response is lost, the next manual retry still moves forward.
|
||||
try HoloLakeKeychain.save(current)
|
||||
session = current
|
||||
let capture: MobileCaptureInput?
|
||||
if let body = captureBody?.trimmingCharacters(in: .whitespacesAndNewlines), !body.isEmpty {
|
||||
capture = MobileCaptureInput(
|
||||
title: (captureTitle ?? "").trimmingCharacters(in: .whitespacesAndNewlines),
|
||||
body: body,
|
||||
requestID: UUID().uuidString.lowercased()
|
||||
)
|
||||
} else {
|
||||
capture = nil
|
||||
}
|
||||
let aad = Data("hololake.mobile.sync/v1:\(current.deviceID)".utf8)
|
||||
let responseData = try await Self.exchange(
|
||||
url: current.baseURL.appending(path: "v1/sync"),
|
||||
key: current.sessionKey,
|
||||
aad: aad,
|
||||
headers: ["X-HoloLake-Device-ID": current.deviceID],
|
||||
payload: SyncRequest(counter: current.counter, afterCursor: nil, capture: capture)
|
||||
)
|
||||
let nextSnapshot = try JSONDecoder().decode(MobileSyncSnapshot.self, from: responseData)
|
||||
guard nextSnapshot.schema == "hololake.mobile-sync/v1",
|
||||
nextSnapshot.state == "SYNCED_WITH_ROOT_NODE",
|
||||
nextSnapshot.rootNodeOnline,
|
||||
nextSnapshot.boundary.mobileRole == "REMOTE_BODY_ENTRY_OF_THE_SAME_PERSONA_SYSTEM",
|
||||
!nextSnapshot.boundary.remoteDesktopClone,
|
||||
!nextSnapshot.boundary.desktopOfflineExecution else {
|
||||
throw HoloLakeMobileError.invalidResponse
|
||||
}
|
||||
current.cursor = nextSnapshot.cursor
|
||||
try HoloLakeKeychain.save(current)
|
||||
session = current
|
||||
snapshot = nextSnapshot
|
||||
stateText = "已同步 · \(nextSnapshot.desktopName)"
|
||||
}
|
||||
}
|
||||
|
||||
func disconnect() {
|
||||
do {
|
||||
try HoloLakeKeychain.remove()
|
||||
session = nil
|
||||
snapshot = nil
|
||||
stateText = "尚未配对"
|
||||
} catch {
|
||||
errorText = error.localizedDescription
|
||||
}
|
||||
}
|
||||
|
||||
private func perform(_ activeText: String, operation: () async throws -> Void) async {
|
||||
guard !isWorking else { return }
|
||||
isWorking = true
|
||||
errorText = nil
|
||||
stateText = activeText
|
||||
do {
|
||||
try await operation()
|
||||
} catch {
|
||||
errorText = error.localizedDescription
|
||||
stateText = session == nil ? "尚未配对" : "同步未完成"
|
||||
}
|
||||
isWorking = false
|
||||
}
|
||||
|
||||
static func exchange<Payload: Encodable>(
|
||||
url: URL,
|
||||
key: Data,
|
||||
aad: Data,
|
||||
headers: [String: String],
|
||||
payload: Payload,
|
||||
session: URLSession = .shared
|
||||
) async throws -> Data {
|
||||
let clear = try JSONEncoder().encode(payload)
|
||||
let nonceData = randomNonce()
|
||||
let nonce = try ChaChaPoly.Nonce(data: nonceData)
|
||||
let sealed = try ChaChaPoly.seal(
|
||||
clear,
|
||||
using: SymmetricKey(data: key),
|
||||
nonce: nonce,
|
||||
authenticating: aad
|
||||
)
|
||||
var request = URLRequest(url: url)
|
||||
request.httpMethod = "POST"
|
||||
request.timeoutInterval = 8
|
||||
request.cachePolicy = .reloadIgnoringLocalCacheData
|
||||
request.httpBody = sealed.ciphertext + sealed.tag
|
||||
request.setValue("application/octet-stream", forHTTPHeaderField: "Content-Type")
|
||||
request.setValue(nonceData.base64URL, forHTTPHeaderField: "X-HoloLake-Nonce")
|
||||
headers.forEach { request.setValue($1, forHTTPHeaderField: $0) }
|
||||
let (body, response) = try await session.data(for: request)
|
||||
guard let http = response as? HTTPURLResponse else {
|
||||
throw HoloLakeMobileError.invalidResponse
|
||||
}
|
||||
guard http.statusCode == 200 else {
|
||||
let code = (try? JSONSerialization.jsonObject(with: body) as? [String: Any])?["code"] as? String
|
||||
throw HoloLakeMobileError.rejected(code ?? "HTTP_\(http.statusCode)")
|
||||
}
|
||||
guard let nonceHeader = http.value(forHTTPHeaderField: "X-HoloLake-Nonce"),
|
||||
let responseNonceData = Data(base64URL: nonceHeader), responseNonceData.count == 12 else {
|
||||
throw HoloLakeMobileError.missingNonce
|
||||
}
|
||||
let responseNonce = try ChaChaPoly.Nonce(data: responseNonceData)
|
||||
guard body.count >= 16 else { throw HoloLakeMobileError.invalidResponse }
|
||||
let responseBox = try ChaChaPoly.SealedBox(
|
||||
nonce: responseNonce,
|
||||
ciphertext: body.dropLast(16),
|
||||
tag: body.suffix(16)
|
||||
)
|
||||
return try ChaChaPoly.open(responseBox, using: SymmetricKey(data: key), authenticating: aad)
|
||||
}
|
||||
|
||||
static func randomNonce() -> Data {
|
||||
Data((0..<12).map { _ in UInt8.random(in: .min ... .max) })
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
import CryptoKit
|
||||
import XCTest
|
||||
@testable import HoloLakeMobile
|
||||
|
||||
final class HoloLakeMobileTests: XCTestCase {
|
||||
func testPairingCoordinateParsesOnlyCompleteLink() throws {
|
||||
let secret = Data(repeating: 7, count: 32).base64URL
|
||||
let id = UUID().uuidString.lowercased()
|
||||
let url = try XCTUnwrap(URL(string: "hololake://pair?host=192.168.1.8&port=37421&id=\(id)&secret=\(secret)"))
|
||||
let value = try PairingDescriptor(url: url)
|
||||
XCTAssertEqual(value.host, "192.168.1.8")
|
||||
XCTAssertEqual(value.port, 37421)
|
||||
XCTAssertEqual(value.pairingID, id)
|
||||
XCTAssertEqual(value.secret, Data(repeating: 7, count: 32))
|
||||
}
|
||||
|
||||
func testPairingCoordinateRejectsMissingSecret() throws {
|
||||
let url = try XCTUnwrap(URL(string: "hololake://pair?host=127.0.0.1&port=37421&id=\(UUID().uuidString)"))
|
||||
XCTAssertThrowsError(try PairingDescriptor(url: url))
|
||||
}
|
||||
|
||||
func testPairingCoordinateRejectsDuplicateKeys() throws {
|
||||
let secret = Data(repeating: 7, count: 32).base64URL
|
||||
let id = UUID().uuidString.lowercased()
|
||||
let url = try XCTUnwrap(URL(string: "hololake://pair?host=192.168.1.8&host=127.0.0.1&port=37421&id=\(id)&secret=\(secret)"))
|
||||
XCTAssertThrowsError(try PairingDescriptor(url: url))
|
||||
}
|
||||
|
||||
func testCryptoKitPayloadMatchesServerWireShape() throws {
|
||||
let key = SymmetricKey(data: Data(repeating: 3, count: 32))
|
||||
let nonce = try ChaChaPoly.Nonce(data: Data(repeating: 9, count: 12))
|
||||
let aad = Data("hololake.mobile.pair/v1".utf8)
|
||||
let clear = Data("hello".utf8)
|
||||
let sealed = try ChaChaPoly.seal(clear, using: key, nonce: nonce, authenticating: aad)
|
||||
let wire = sealed.ciphertext + sealed.tag
|
||||
XCTAssertEqual(wire.count, clear.count + 16)
|
||||
let restored = try ChaChaPoly.open(
|
||||
ChaChaPoly.SealedBox(nonce: nonce, ciphertext: wire.dropLast(16), tag: wire.suffix(16)),
|
||||
using: key,
|
||||
authenticating: aad
|
||||
)
|
||||
XCTAssertEqual(restored, clear)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
name: HoloLakeMobile
|
||||
options:
|
||||
bundleIdPrefix: com.guanghulab
|
||||
deploymentTarget:
|
||||
iOS: "17.0"
|
||||
settings:
|
||||
base:
|
||||
DEVELOPMENT_TEAM: 825A9L3G7Q
|
||||
CODE_SIGN_STYLE: Automatic
|
||||
SWIFT_VERSION: "5.0"
|
||||
CURRENT_PROJECT_VERSION: 1
|
||||
MARKETING_VERSION: 0.5.0
|
||||
TARGETED_DEVICE_FAMILY: "1"
|
||||
SUPPORTS_MACCATALYST: false
|
||||
targets:
|
||||
HoloLakeMobile:
|
||||
type: application
|
||||
platform: iOS
|
||||
sources:
|
||||
- path: Sources
|
||||
settings:
|
||||
base:
|
||||
PRODUCT_BUNDLE_IDENTIFIER: com.guanghulab.hololake
|
||||
PRODUCT_NAME: HoloLake
|
||||
PRODUCT_MODULE_NAME: HoloLakeMobile
|
||||
info:
|
||||
path: Generated/HoloLakeMobile-Info.plist
|
||||
properties:
|
||||
CFBundleDisplayName: HoloLake
|
||||
CFBundleShortVersionString: "$(MARKETING_VERSION)"
|
||||
CFBundleVersion: "$(CURRENT_PROJECT_VERSION)"
|
||||
LSApplicationCategoryType: public.app-category.productivity
|
||||
NSLocalNetworkUsageDescription: HoloLake 仅在你明确配对后,通过同一局域网连接你的电脑端频道。
|
||||
UIApplicationSupportsIndirectInputEvents: true
|
||||
UIRequiresFullScreen: true
|
||||
UILaunchScreen: {}
|
||||
UISupportedInterfaceOrientations:
|
||||
- UIInterfaceOrientationPortrait
|
||||
CFBundleURLTypes:
|
||||
- CFBundleTypeRole: Editor
|
||||
CFBundleURLName: com.guanghulab.hololake.pair
|
||||
CFBundleURLSchemes:
|
||||
- hololake
|
||||
NSAppTransportSecurity:
|
||||
NSAllowsLocalNetworking: true
|
||||
scheme:
|
||||
testTargets:
|
||||
- HoloLakeMobileTests
|
||||
HoloLakeMobileTests:
|
||||
type: bundle.unit-test
|
||||
platform: iOS
|
||||
sources:
|
||||
- path: Tests
|
||||
dependencies:
|
||||
- target: HoloLakeMobile
|
||||
settings:
|
||||
base:
|
||||
PRODUCT_BUNDLE_IDENTIFIER: com.guanghulab.hololake.tests
|
||||
TEST_HOST: "$(BUILT_PRODUCTS_DIR)/HoloLake.app/HoloLake"
|
||||
BUNDLE_LOADER: "$(TEST_HOST)"
|
||||
info:
|
||||
path: Generated/HoloLakeMobileTests-Info.plist
|
||||
properties: {}
|
||||
770
product-source/hololake-native-desktop/package-lock.json
generated
|
|
@ -1,17 +1,26 @@
|
|||
{
|
||||
"name": "hololake-native-desktop",
|
||||
"version": "0.4.1",
|
||||
"version": "0.5.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "hololake-native-desktop",
|
||||
"version": "0.4.1",
|
||||
"version": "0.5.0",
|
||||
"dependencies": {
|
||||
"@fortune-sheet/react": "1.0.4",
|
||||
"@lexical/history": "0.49.0",
|
||||
"@lexical/list": "0.49.0",
|
||||
"@lexical/markdown": "0.49.0",
|
||||
"@lexical/react": "0.49.0",
|
||||
"@lexical/rich-text": "0.49.0",
|
||||
"@lexical/selection": "0.49.0",
|
||||
"@lexical/utils": "0.49.0",
|
||||
"@tauri-apps/api": "2.10.1",
|
||||
"@tauri-apps/plugin-process": "2.3.1",
|
||||
"@tauri-apps/plugin-updater": "2.10.0",
|
||||
"dompurify": "^3.4.13",
|
||||
"lexical": "0.49.0",
|
||||
"marked": "^16.4.1",
|
||||
"react": "^19.2.0",
|
||||
"react-dom": "^19.2.0"
|
||||
|
|
@ -750,6 +759,113 @@
|
|||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@floating-ui/core": {
|
||||
"version": "1.8.0",
|
||||
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz",
|
||||
"integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@floating-ui/utils": "^0.2.12"
|
||||
}
|
||||
},
|
||||
"node_modules/@floating-ui/dom": {
|
||||
"version": "1.8.0",
|
||||
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz",
|
||||
"integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@floating-ui/core": "^1.8.0",
|
||||
"@floating-ui/utils": "^0.2.12"
|
||||
}
|
||||
},
|
||||
"node_modules/@floating-ui/react": {
|
||||
"version": "0.27.20",
|
||||
"resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.20.tgz",
|
||||
"integrity": "sha512-CMqMy7OaXl9W0eq1Uy7L7i2Y/anPvHmFmESd2CEw0t5YvZhcVCeo4MBevAmswRllX7Y2dEidA4ozGPunLSTQpw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@floating-ui/react-dom": "^2.1.9",
|
||||
"@floating-ui/utils": "^0.2.12",
|
||||
"tabbable": "^6.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=17.0.0",
|
||||
"react-dom": ">=17.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@floating-ui/react-dom": {
|
||||
"version": "2.1.9",
|
||||
"resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz",
|
||||
"integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@floating-ui/dom": "^1.8.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=16.8.0",
|
||||
"react-dom": ">=16.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@floating-ui/utils": {
|
||||
"version": "0.2.12",
|
||||
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz",
|
||||
"integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@formulajs/formulajs": {
|
||||
"version": "2.9.3",
|
||||
"resolved": "https://registry.npmjs.org/@formulajs/formulajs/-/formulajs-2.9.3.tgz",
|
||||
"integrity": "sha512-WpgiuJaBl/Hcda9Ti8a7mlnw/vUZkJrtjABvojz6P6mo6d8EscudyA7iAt/kTLsgi0c8zfmzQd/Yjb4ASFkw+g==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"bessel": "^1.0.2",
|
||||
"jstat": "^1.9.2"
|
||||
},
|
||||
"bin": {
|
||||
"implementation-stats": "bin/implementation-stats"
|
||||
}
|
||||
},
|
||||
"node_modules/@fortune-sheet/core": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@fortune-sheet/core/-/core-1.0.4.tgz",
|
||||
"integrity": "sha512-CDnUVebfvtT++CymNRw0qnY4sz6zYO3KZazlH+nG6otkRkZ05Bvt7NXqVhmKKSSxIvJR4R6h50abu/dVGBpjpw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@fortune-sheet/formula-parser": "^0.2.13",
|
||||
"dayjs": "^1.11.0",
|
||||
"immer": "^9.0.12",
|
||||
"lodash": "^4.17.21",
|
||||
"numeral": "^2.0.6",
|
||||
"uuid": "^8.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@fortune-sheet/formula-parser": {
|
||||
"version": "0.2.13",
|
||||
"resolved": "https://registry.npmjs.org/@fortune-sheet/formula-parser/-/formula-parser-0.2.13.tgz",
|
||||
"integrity": "sha512-za2ZVQ5ZfMSPCtL8MdqhCthPip7AoeU4MPyd5UDo4RCl9/arrv1Jz0y755mACVVi4suSZxrzWoJGDkLmofoSmw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@formulajs/formulajs": "^2.9.3",
|
||||
"tiny-emitter": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@fortune-sheet/react": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@fortune-sheet/react/-/react-1.0.4.tgz",
|
||||
"integrity": "sha512-v+BU5mmp2hhUe4gRF+vOJ3j8zZkzHU0kzhTZzp+Nn00wA/RArMr+CO+SAluKlCPAsTZgPwmgOEK685WPqJ5XNw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@fortune-sheet/core": "^1.0.4",
|
||||
"@types/regenerator-runtime": "^0.13.6",
|
||||
"immer": "^9.0.12",
|
||||
"lodash": "^4.17.21",
|
||||
"regenerator-runtime": "^0.14.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">= 18.2",
|
||||
"react-dom": ">= 18.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@jridgewell/gen-mapping": {
|
||||
"version": "0.3.13",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
|
||||
|
|
@ -800,6 +916,491 @@
|
|||
"@jridgewell/sourcemap-codec": "^1.4.14"
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/a11y": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/a11y/-/a11y-0.49.0.tgz",
|
||||
"integrity": "sha512-ypvO0SI9DCzEAjxkRLq+gNzRqfjg632RCkwu16Hk94PCBrEmcDhx5iUGg3SRJC7WnM2wXC/F/SB8yWDEfq7tEw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/extension": "0.49.0",
|
||||
"@lexical/utils": "0.49.0",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/clipboard": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/clipboard/-/clipboard-0.49.0.tgz",
|
||||
"integrity": "sha512-AVKj21xH1qU7JAFA/v0hCoafa+Yti1I7cHG+JQIgc/EqCtP8ePeJyIfTPNN/tXskoCdq++HewQoiSXRwwlocVg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/extension": "0.49.0",
|
||||
"@lexical/html": "0.49.0",
|
||||
"@lexical/internal": "0.49.0",
|
||||
"@lexical/list": "0.49.0",
|
||||
"@lexical/selection": "0.49.0",
|
||||
"@lexical/utils": "0.49.0",
|
||||
"@types/trusted-types": "^2.0.7",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/code-core": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/code-core/-/code-core-0.49.0.tgz",
|
||||
"integrity": "sha512-29sXI4ydcN/OyBJNlZXkGKtQXzfiIWet+YN20+wT97zkqityOvRilK6qzTRz9Cd0ungEPlJENqXQhsy6BJeXpg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/extension": "0.49.0",
|
||||
"@lexical/html": "0.49.0",
|
||||
"@lexical/internal": "0.49.0",
|
||||
"@lexical/utils": "0.49.0",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/devtools-core": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/devtools-core/-/devtools-core-0.49.0.tgz",
|
||||
"integrity": "sha512-LgjNlvRiuO/QF36aG6kfR4ptEvSw587o2+YF6SOsaOB7iw2Z3pqpsKloWSEF4QXaLFI65Li8JjMdQj+BaFMIOA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/html": "0.49.0",
|
||||
"@lexical/link": "0.49.0",
|
||||
"@lexical/mark": "0.49.0",
|
||||
"@lexical/table": "0.49.0",
|
||||
"@lexical/utils": "0.49.0",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=18.x",
|
||||
"react-dom": ">=18.x",
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/dragon": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/dragon/-/dragon-0.49.0.tgz",
|
||||
"integrity": "sha512-62/4DP5qyX/l4Yf5qRyyQrs9BV725eRU3OmLUW6g7T5xrcHXxAo7tia/NvqjqvXdpvQzyHjWgsy7dMitGITUsw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/extension": "0.49.0",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/extension": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/extension/-/extension-0.49.0.tgz",
|
||||
"integrity": "sha512-Wv0VsuqxorbxHCK4ms1PwAu6cXIGNLtflq66auF+zwxOtBprkSFV8VzzzdKLOYD2admP0VK6EqVCeGXFK1GggA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/internal": "0.49.0",
|
||||
"@lexical/utils": "0.49.0",
|
||||
"@preact/signals-core": "^1.14.1",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/hashtag": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/hashtag/-/hashtag-0.49.0.tgz",
|
||||
"integrity": "sha512-aQTpNjrEO5apsaohWGl4ku22EgHpWUzZg5CIzvriS2A1vNmIfzLoCL+lDFpzAwk3DT1Kj1yvGHh5TvhYsb9D8w==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/text": "0.49.0",
|
||||
"@lexical/utils": "0.49.0",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/history": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/history/-/history-0.49.0.tgz",
|
||||
"integrity": "sha512-uQdtEd34gIJklXNSdHS2Wko1zxx1xUMVXbiodcLO6a3GeFTE5bKnx6af1zGX78KpYhUQYnHWorKuUvtdZlJPaA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/extension": "0.49.0",
|
||||
"@lexical/utils": "0.49.0",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/html": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/html/-/html-0.49.0.tgz",
|
||||
"integrity": "sha512-NQqAydKzRjQl7Jx+bTTyC2iuz5uhuDaQX0SSPrdfgaFDCPjqQEejcBkCt1QXnu1CkbVHutZKVGVzljx40Y6y+Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/extension": "0.49.0",
|
||||
"@lexical/internal": "0.49.0",
|
||||
"@lexical/selection": "0.49.0",
|
||||
"@lexical/utils": "0.49.0",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/internal": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/internal/-/internal-0.49.0.tgz",
|
||||
"integrity": "sha512-s+XjPC7Qb39A/Xx9ahcz1s69CPix4ultaqyW+MDG0AXYW2quDr7m0USqReKIAiuoLIWtGN5HW8BwV2Y6t4qr6Q==",
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/link": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/link/-/link-0.49.0.tgz",
|
||||
"integrity": "sha512-CsZVu1OfnPOn6IKWVO5DbmKwIuicGtgWSzrZMdMB8w6yPoMgFyPWeVulhPE7LNz2FhaQCWv+lVVYVAiJrUzJsg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/extension": "0.49.0",
|
||||
"@lexical/html": "0.49.0",
|
||||
"@lexical/internal": "0.49.0",
|
||||
"@lexical/utils": "0.49.0",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/list": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/list/-/list-0.49.0.tgz",
|
||||
"integrity": "sha512-zs6wYkxakDRcJO0KmwrPPHgeLLIxzjD+P2CRu+scJCHRuA5e2iSw2iFjH5n/LlWBrlnPMSjeQse4QqsRy9nnqA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/extension": "0.49.0",
|
||||
"@lexical/html": "0.49.0",
|
||||
"@lexical/internal": "0.49.0",
|
||||
"@lexical/utils": "0.49.0",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/mark": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/mark/-/mark-0.49.0.tgz",
|
||||
"integrity": "sha512-JSYD8UYQQOMT6oDYh1KsLPK3KMGfQzU7E9fJkugKEO0/XebfsmiuNtkLCGDVIZOo8bNHlwb1YVvmswC2bjotMQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/utils": "0.49.0",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/markdown": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/markdown/-/markdown-0.49.0.tgz",
|
||||
"integrity": "sha512-n7x/3OLdi5R0ztICCn8udxRIWFZFVtmQS3a06Tjkyvm/j/dPlFQ/henKSOFjjX/IqVzQzSmiNaDhqKWxXM5npQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/code-core": "0.49.0",
|
||||
"@lexical/internal": "0.49.0",
|
||||
"@lexical/link": "0.49.0",
|
||||
"@lexical/list": "0.49.0",
|
||||
"@lexical/rich-text": "0.49.0",
|
||||
"@lexical/selection": "0.49.0",
|
||||
"@lexical/text": "0.49.0",
|
||||
"@lexical/utils": "0.49.0",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/overflow": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/overflow/-/overflow-0.49.0.tgz",
|
||||
"integrity": "sha512-h5Qjv2SkpI76kaukvKJzvWehG9hwB06GEmAnp6aJaioOzoDcBAeWpmYBebtBUwRm0PNLFe3YICFFLpZ5Tg5VoQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/plain-text": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/plain-text/-/plain-text-0.49.0.tgz",
|
||||
"integrity": "sha512-l7IuUj9n9CtFfz4Fz6zU6mmO+VkcnvyyebABx+lHevvTa7B6YI5PPVgABFfzdyPanyW/FGs7qpKBf59inAqbkg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/clipboard": "0.49.0",
|
||||
"@lexical/dragon": "0.49.0",
|
||||
"@lexical/extension": "0.49.0",
|
||||
"@lexical/selection": "0.49.0",
|
||||
"@lexical/utils": "0.49.0",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/react": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/react/-/react-0.49.0.tgz",
|
||||
"integrity": "sha512-NqXF4i/IBFKVDDLDJYTwmBXE++MQuIrTQs7VTux6IPyDEpyfeFMn1rQTFb949S3f7rs33Rcu1uGtFbODQfS1Iw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@floating-ui/react": "^0.27.19",
|
||||
"@lexical/a11y": "0.49.0",
|
||||
"@lexical/devtools-core": "0.49.0",
|
||||
"@lexical/dragon": "0.49.0",
|
||||
"@lexical/extension": "0.49.0",
|
||||
"@lexical/hashtag": "0.49.0",
|
||||
"@lexical/history": "0.49.0",
|
||||
"@lexical/internal": "0.49.0",
|
||||
"@lexical/link": "0.49.0",
|
||||
"@lexical/list": "0.49.0",
|
||||
"@lexical/mark": "0.49.0",
|
||||
"@lexical/markdown": "0.49.0",
|
||||
"@lexical/overflow": "0.49.0",
|
||||
"@lexical/plain-text": "0.49.0",
|
||||
"@lexical/rich-text": "0.49.0",
|
||||
"@lexical/table": "0.49.0",
|
||||
"@lexical/text": "0.49.0",
|
||||
"@lexical/utils": "0.49.0",
|
||||
"@lexical/yjs": "0.49.0",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=18.x",
|
||||
"react-dom": ">=18.x",
|
||||
"typescript": ">=5.2",
|
||||
"yjs": ">=13.5.22"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
},
|
||||
"yjs": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/rich-text": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/rich-text/-/rich-text-0.49.0.tgz",
|
||||
"integrity": "sha512-LM+d8ULmQvi2Av6UaW4NAIa/Bj9FOo9oh6+dglTzuoFPFQ3sogy5c38i2K9k0ul7aE+bFsXkSmHbu4LkrHIkBQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/clipboard": "0.49.0",
|
||||
"@lexical/dragon": "0.49.0",
|
||||
"@lexical/extension": "0.49.0",
|
||||
"@lexical/html": "0.49.0",
|
||||
"@lexical/selection": "0.49.0",
|
||||
"@lexical/utils": "0.49.0",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/selection": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/selection/-/selection-0.49.0.tgz",
|
||||
"integrity": "sha512-08Vd1+VoC6YnztWOFWVsqF/Hxw5EP8qeL1c7t3+rVCV8revLzXxdQw+vbPX3tgM4fmjOBDUXk6Ws1+rTtsqjcQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/internal": "0.49.0",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/table": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/table/-/table-0.49.0.tgz",
|
||||
"integrity": "sha512-PG+dxSTBPbUZUY2kBZm0pJuqCEOGom4RrGrc6Jlj/7o0F37k/gGRVprFSRKuf3CqO03QIP6qRovXGDuKb+Exuw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/clipboard": "0.49.0",
|
||||
"@lexical/extension": "0.49.0",
|
||||
"@lexical/html": "0.49.0",
|
||||
"@lexical/internal": "0.49.0",
|
||||
"@lexical/utils": "0.49.0",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/text": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/text/-/text-0.49.0.tgz",
|
||||
"integrity": "sha512-mowedvbvx0HDaW+ymVdYmWVhueqgauhhqIWaCtbJj33tPk8pOu1BB0pZuJQbOB+1bDnFiZhkJV8W/CvR2M9lEA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/internal": "0.49.0",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/utils": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/utils/-/utils-0.49.0.tgz",
|
||||
"integrity": "sha512-Jaa6DERBqxiFOFa49VPRV1WOb7mzRbMZ5U+v+RFagjzTmBhfxDmEkbQQ9nYTU3n3DPfdT8Hkyffextmw04etXg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/internal": "0.49.0",
|
||||
"@lexical/selection": "0.49.0",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@lexical/yjs": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@lexical/yjs/-/yjs-0.49.0.tgz",
|
||||
"integrity": "sha512-uqV3D0AOLqQ1f/Bo6ZtuDLoJYGlBm0RlucNYhNvfMAncEw0f/xHc1pTyXeWjdCI/iWgWR/MV6hgVi26TSPs+Vg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/internal": "0.49.0",
|
||||
"@lexical/selection": "0.49.0",
|
||||
"lexical": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2",
|
||||
"yjs": ">=13.5.22"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@napi-rs/lzma-linux-x64-gnu": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz",
|
||||
|
|
@ -817,6 +1418,16 @@
|
|||
"node": "^22.20 || ^24.12 || >=25"
|
||||
}
|
||||
},
|
||||
"node_modules/@preact/signals-core": {
|
||||
"version": "1.14.4",
|
||||
"resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.14.4.tgz",
|
||||
"integrity": "sha512-HNB6HYeYKhQbJ1aKl+YRjrS4+QWHLKX6qKoUsfS/m0vqzsVaEBiZiaKbG/e+NKk2ch5ALQr/ihWaMHxiCuuWHA==",
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/preact"
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/pluginutils": {
|
||||
"version": "1.0.0-rc.3",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz",
|
||||
|
|
@ -1516,12 +2127,17 @@
|
|||
"@types/react": "^19.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/regenerator-runtime": {
|
||||
"version": "0.13.8",
|
||||
"resolved": "https://registry.npmjs.org/@types/regenerator-runtime/-/regenerator-runtime-0.13.8.tgz",
|
||||
"integrity": "sha512-jjKoBekfYDH331060tZhosdJVDnXIXx+T8Iw2h2T4HEds6Ddb2lr0JxD15+XPKlXwRHRNgZoY+4Fb2ykoqzHBg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/trusted-types": {
|
||||
"version": "2.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
|
||||
"integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@vitejs/plugin-react": {
|
||||
"version": "5.2.0",
|
||||
|
|
@ -1680,6 +2296,15 @@
|
|||
"node": ">=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/bessel": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/bessel/-/bessel-1.0.2.tgz",
|
||||
"integrity": "sha512-Al3nHGQGqDYqqinXhQzmwmcRToe/3WyBv4N8aZc5Pef8xw2neZlR9VPi84Sa23JtgWcucu18HxVZrnI0fn2etw==",
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": ">=0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/browserslist": {
|
||||
"version": "4.28.8",
|
||||
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz",
|
||||
|
|
@ -1759,6 +2384,12 @@
|
|||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/dayjs": {
|
||||
"version": "1.11.23",
|
||||
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.23.tgz",
|
||||
"integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/debug": {
|
||||
"version": "4.4.3",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
|
||||
|
|
@ -1915,6 +2546,27 @@
|
|||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/immer": {
|
||||
"version": "9.0.21",
|
||||
"resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
|
||||
"integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/immer"
|
||||
}
|
||||
},
|
||||
"node_modules/isomorphic.js": {
|
||||
"version": "0.2.5",
|
||||
"resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz",
|
||||
"integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"funding": {
|
||||
"type": "GitHub Sponsors ❤",
|
||||
"url": "https://github.com/sponsors/dmonad"
|
||||
}
|
||||
},
|
||||
"node_modules/js-tokens": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
|
||||
|
|
@ -1948,6 +2600,56 @@
|
|||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/jstat": {
|
||||
"version": "1.9.6",
|
||||
"resolved": "https://registry.npmjs.org/jstat/-/jstat-1.9.6.tgz",
|
||||
"integrity": "sha512-rPBkJbK2TnA8pzs93QcDDPlKcrtZWuuCo2dVR0TFLOJSxhqfWOVCSp8aV3/oSbn+4uY4yw1URtLpHQedtmXfug=="
|
||||
},
|
||||
"node_modules/lexical": {
|
||||
"version": "0.49.0",
|
||||
"resolved": "https://registry.npmjs.org/lexical/-/lexical-0.49.0.tgz",
|
||||
"integrity": "sha512-9V1ZIzGpJEd8rIN+nN7veL4fW4fFWbS66Un4JNqSZB4D5t9euzN9+3+jEXy83FjNjNy0MiiUI3+DQaGCLYko0w==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lexical/internal": "0.49.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": ">=5.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/lib0": {
|
||||
"version": "0.2.117",
|
||||
"resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.117.tgz",
|
||||
"integrity": "sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"isomorphic.js": "^0.2.4"
|
||||
},
|
||||
"bin": {
|
||||
"0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js",
|
||||
"0gentesthtml": "bin/gentesthtml.js",
|
||||
"0serve": "bin/0serve.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16"
|
||||
},
|
||||
"funding": {
|
||||
"type": "GitHub Sponsors ❤",
|
||||
"url": "https://github.com/sponsors/dmonad"
|
||||
}
|
||||
},
|
||||
"node_modules/lodash": {
|
||||
"version": "4.18.1",
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
|
||||
"integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/lru-cache": {
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
|
||||
|
|
@ -2016,6 +2718,15 @@
|
|||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/numeral": {
|
||||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz",
|
||||
"integrity": "sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/obug": {
|
||||
"version": "2.1.4",
|
||||
"resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz",
|
||||
|
|
@ -2117,6 +2828,12 @@
|
|||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/regenerator-runtime": {
|
||||
"version": "0.14.1",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
|
||||
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/rollup": {
|
||||
"version": "4.62.4",
|
||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz",
|
||||
|
|
@ -2210,6 +2927,18 @@
|
|||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/tabbable": {
|
||||
"version": "6.5.0",
|
||||
"resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz",
|
||||
"integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/tiny-emitter": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
|
||||
"integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/tinybench": {
|
||||
"version": "2.9.0",
|
||||
"resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
|
||||
|
|
@ -2258,7 +2987,7 @@
|
|||
"version": "5.9.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
|
||||
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "Apache-2.0",
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
|
|
@ -2299,6 +3028,19 @@
|
|||
"browserslist": ">= 4.21.0"
|
||||
}
|
||||
},
|
||||
"node_modules/uuid": {
|
||||
"version": "11.1.1",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz",
|
||||
"integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==",
|
||||
"funding": [
|
||||
"https://github.com/sponsors/broofa",
|
||||
"https://github.com/sponsors/ctavan"
|
||||
],
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"uuid": "dist/esm/bin/uuid"
|
||||
}
|
||||
},
|
||||
"node_modules/vite": {
|
||||
"version": "7.3.6",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz",
|
||||
|
|
@ -2487,6 +3229,24 @@
|
|||
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
|
||||
"dev": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/yjs": {
|
||||
"version": "13.6.32",
|
||||
"resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.32.tgz",
|
||||
"integrity": "sha512-lfiJIIC4Xayt5ItynE407ehlE03pCjeOc4hkR4yxxvvNJ4kuiN25B0g+Qp8XagYz361LLL7DCzR5bvFJ81QKtQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"lib0": "^0.2.99"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16.0.0",
|
||||
"npm": ">=8.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "GitHub Sponsors ❤",
|
||||
"url": "https://github.com/sponsors/dmonad"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "hololake-native-desktop",
|
||||
"private": true,
|
||||
"version": "0.4.1",
|
||||
"version": "0.5.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
|
@ -11,10 +11,19 @@
|
|||
"tauri": "tauri"
|
||||
},
|
||||
"dependencies": {
|
||||
"@fortune-sheet/react": "1.0.4",
|
||||
"@lexical/history": "0.49.0",
|
||||
"@lexical/list": "0.49.0",
|
||||
"@lexical/markdown": "0.49.0",
|
||||
"@lexical/react": "0.49.0",
|
||||
"@lexical/rich-text": "0.49.0",
|
||||
"@lexical/selection": "0.49.0",
|
||||
"@lexical/utils": "0.49.0",
|
||||
"@tauri-apps/api": "2.10.1",
|
||||
"@tauri-apps/plugin-process": "2.3.1",
|
||||
"@tauri-apps/plugin-updater": "2.10.0",
|
||||
"dompurify": "^3.4.13",
|
||||
"lexical": "0.49.0",
|
||||
"marked": "^16.4.1",
|
||||
"react": "^19.2.0",
|
||||
"react-dom": "^19.2.0"
|
||||
|
|
@ -27,5 +36,8 @@
|
|||
"typescript": "~5.9.3",
|
||||
"vite": "^7.3.5",
|
||||
"vitest": "^4.0.18"
|
||||
},
|
||||
"overrides": {
|
||||
"uuid": "11.1.1"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,38 @@
|
|||
import assert from 'node:assert/strict'
|
||||
import { readFileSync } from 'node:fs'
|
||||
import test from 'node:test'
|
||||
|
||||
const read = (path) => readFileSync(new URL(`../${path}`, import.meta.url), 'utf8')
|
||||
const contract = JSON.parse(read('contracts/channel-workbench-runtime.json'))
|
||||
const registry = JSON.parse(read('contracts/numbered-ipc-registry.json'))
|
||||
const modulePackage = JSON.parse(read('fixtures/module-packages/HLP-MOD-LOCAL-CHANNEL-WORKBENCH-0001-0.1.0.ghmod'))
|
||||
const rust = read('src-tauri/src/channel_workbench.rs')
|
||||
const frontend = [read('src/modules/channel-workbench/index.tsx'), read('src/modules/channel-workbench/document-engine.tsx'), read('src/modules/channel-workbench/spreadsheet-engine.tsx')].join('\n')
|
||||
|
||||
test('channel workbench is a signed account-local adapter with durable user data', () => {
|
||||
assert.equal(contract.candidate_number, 'HLP-DONOR-CAND-0002')
|
||||
assert.equal(contract.runtime_module_number, 'HLP-MOD-LOCAL-CHANNEL-WORKBENCH-0001')
|
||||
assert.equal(contract.data_boundary.scope, 'CURRENT_AUTHENTICATED_ACCOUNT_LOCAL')
|
||||
assert.equal(contract.data_boundary.package_unmount_deletes_user_data, false)
|
||||
assert.equal(modulePackage.manifest.adapter, 'channel-workbench-v1')
|
||||
assert.deepEqual(modulePackage.manifest.permissions, ['CHANNEL_DOCUMENT_READ', 'CHANNEL_DOCUMENT_WRITE', 'CHANNEL_SPREADSHEET_READ', 'CHANNEL_SPREADSHEET_WRITE'])
|
||||
assert.match(rust, /require_active_module_adapter/)
|
||||
assert.match(rust, /workbench_receipts_no_update/)
|
||||
assert.doesNotMatch(rust, /#\[tauri::command\]/)
|
||||
assert.doesNotMatch(frontend, /from ['"]@tauri-apps\/api\/core['"]/)
|
||||
})
|
||||
|
||||
test('document and spreadsheet cross only their exact numbered routes', () => {
|
||||
const routes = registry.operations.filter((route) => route.module_number === 'HLP-NIPC-MOD-0022')
|
||||
assert.deepEqual(routes.map((route) => route.operation_number), ['HLP-NIPC-OP-0074', 'HLP-NIPC-OP-0075', 'HLP-NIPC-OP-0076'])
|
||||
assert.deepEqual(routes.map((route) => route.alias), ['get_channel_workbench_snapshot', 'save_channel_document', 'save_channel_spreadsheet'])
|
||||
assert.ok(routes.every((route) => route.target_number === 'HLP-NIPC-TGT-0022'))
|
||||
assert.ok(routes.every((route) => route.admission === 'VERIFIED_HUMAN_ROUTE'))
|
||||
})
|
||||
|
||||
test('the legacy engines are preserved but loaded only inside the module chunk', () => {
|
||||
assert.match(frontend, /LexicalComposer/)
|
||||
assert.match(frontend, /Workbook/)
|
||||
assert.match(frontend, /calculateFormula/)
|
||||
assert.match(read('src/main.tsx'), /lazy\(\(\) => import\('\.\/modules\/channel-workbench'\)/)
|
||||
})
|
||||
|
|
@ -12,9 +12,10 @@ const sourceRoot = explicitSourceRoot || (repoRoot ? path.join(repoRoot, 'gls')
|
|||
const sourceCommit = args.get('--source-commit')
|
||||
const output = args.get('--output')
|
||||
const projectionsPath = args.get('--projections')
|
||||
const referencesPath = args.get('--references')
|
||||
|
||||
if (!repoRoot || !sourceRoot || !sourceCommit || !output || !projectionsPath) {
|
||||
throw new Error('usage: compile-gls-runtime-registry.mjs --repo-root <REPO-012> --source-commit <sha> --output <manifest.json> --projections <projections.json>')
|
||||
if (!repoRoot || !sourceRoot || !sourceCommit || !output || !projectionsPath || !referencesPath) {
|
||||
throw new Error('usage: compile-gls-runtime-registry.mjs --repo-root <REPO-012> --source-commit <sha> --output <manifest.json> --projections <projections.json> --references <reference-nodes.json>')
|
||||
}
|
||||
if (!/^[a-f0-9]{40}$/.test(sourceCommit)) throw new Error('source commit must be a full SHA-1')
|
||||
|
||||
|
|
@ -168,6 +169,18 @@ if (projectionManifest.schema !== 'hololake.gls-executable-projections/v2'
|
|||
|| projectionManifest.source_commit !== sourceCommit) {
|
||||
throw new Error('projection manifest does not match the selected REPO-012 source commit')
|
||||
}
|
||||
const referenceManifest = JSON.parse(await readFile(referencesPath, 'utf8'))
|
||||
if (referenceManifest.schema !== 'hololake.gls-numbered-reference-nodes/v1'
|
||||
|| referenceManifest.record_id !== 'HLP-GLS-NUMBERED-REFERENCE-REGISTRY-001'
|
||||
|| referenceManifest.source?.repository !== 'REPO-012'
|
||||
|| referenceManifest.source?.commit !== sourceCommit
|
||||
|| referenceManifest.policy?.number_is_coordinate_not_authority !== true
|
||||
|| referenceManifest.policy?.independent_protocol_source_required_for_execution !== true
|
||||
|| referenceManifest.policy?.reference_only_nodes_may_execute !== false
|
||||
|| referenceManifest.policy?.unknown_reference !== 'FAIL_CLOSED'
|
||||
|| referenceManifest.policy?.unresolved_number_reference_allowed !== false) {
|
||||
throw new Error('numbered reference manifest does not match the selected REPO-012 source commit or safety boundary')
|
||||
}
|
||||
|
||||
const protocolRegistryPath = 'gls/GLS-PROTOCOL-REGISTRY.json'
|
||||
const glsEntryPath = 'gls/GLS-ENTRY.hdlp'
|
||||
|
|
@ -222,29 +235,35 @@ for (const relative of await walk(routingRoot)) {
|
|||
}
|
||||
}
|
||||
|
||||
const candidates = (await walk(sourceRoot))
|
||||
.map((relative) => ({ relative, match: path.basename(relative).match(/^(GLS-\d{4}).*\.hdlp$/) }))
|
||||
const allSourceFiles = await walk(sourceRoot)
|
||||
const candidates = allSourceFiles
|
||||
.map((relative) => ({ relative, match: path.basename(relative).match(/^(GLS-\d{4})(?:[^0-9].*)?\.(hdlp|md)$/) }))
|
||||
.filter((item) => item.match)
|
||||
.map((item) => ({ id: item.match[1], relative: item.relative }))
|
||||
.map((item) => ({ id: item.match[1], relative: item.relative, source_format: item.match[2] === 'hdlp' ? 'HDLP_PROTOCOL_SOURCE' : 'LEGACY_MARKDOWN_EVIDENCE' }))
|
||||
const grouped = new Map()
|
||||
for (const candidate of candidates) {
|
||||
const group = grouped.get(candidate.id) || []
|
||||
group.push(candidate.relative)
|
||||
group.push(candidate)
|
||||
grouped.set(candidate.id, group)
|
||||
}
|
||||
|
||||
const selectedSource = new Map()
|
||||
for (const [id, sources] of grouped) {
|
||||
sources.sort((left, right) => sourceRank(left) - sourceRank(right) || left.localeCompare(right))
|
||||
const relative = sources[0]
|
||||
const protocolSources = sources.filter((source) => source.source_format === 'HDLP_PROTOCOL_SOURCE')
|
||||
if (protocolSources.length === 0) continue
|
||||
protocolSources.sort((left, right) => sourceRank(left.relative) - sourceRank(right.relative)
|
||||
|| left.relative.localeCompare(right.relative))
|
||||
const selected = protocolSources[0]
|
||||
const relative = selected.relative
|
||||
selectedSource.set(id, {
|
||||
relative,
|
||||
raw: await readFile(path.join(sourceRoot, relative), 'utf8'),
|
||||
alternate_source_count: sources.length - 1,
|
||||
source_format: selected.source_format,
|
||||
alternate_source_count: protocolSources.length - 1,
|
||||
})
|
||||
}
|
||||
|
||||
const knownSourceIds = new Set(selectedSource.keys())
|
||||
let knownSourceIds = new Set(selectedSource.keys())
|
||||
const protocolRegistryIds = new Set(registryMetadata.keys())
|
||||
const draftIds = new Set((protocolRegistry.registered_draft_protocols || []).map((entry) => entry.id))
|
||||
const legacyDependencyTargets = new Set()
|
||||
|
|
@ -256,6 +275,56 @@ for (const id of draftIds) {
|
|||
}
|
||||
const legacyDependencyCycles = stronglyConnectedComponents(draftGraph)
|
||||
|
||||
// 旧 Notion 导出只在现行协议真实引用且独立 HDLP 正本缺席时作为历史证据节点进入。
|
||||
// 未被现行图引用的旧页面不得因为文件名像 GLS 编号就自动取得当前注册地位。
|
||||
for (const id of [...legacyDependencyTargets].filter((target) => !knownSourceIds.has(target))) {
|
||||
if (!authorityDeclarations.has(id)) continue
|
||||
const legacySources = (grouped.get(id) || []).filter((source) => source.source_format === 'LEGACY_MARKDOWN_EVIDENCE')
|
||||
if (legacySources.length === 0) continue
|
||||
legacySources.sort((left, right) => sourceRank(left.relative) - sourceRank(right.relative) || left.relative.localeCompare(right.relative))
|
||||
const selected = legacySources[0]
|
||||
selectedSource.set(id, {
|
||||
relative: selected.relative,
|
||||
raw: await readFile(path.join(sourceRoot, selected.relative), 'utf8'),
|
||||
source_format: selected.source_format,
|
||||
alternate_source_count: legacySources.length - 1,
|
||||
})
|
||||
}
|
||||
knownSourceIds = new Set(selectedSource.keys())
|
||||
|
||||
const missingSourceTargets = [...legacyDependencyTargets].filter((id) => !knownSourceIds.has(id)).sort()
|
||||
const referenceIds = new Set()
|
||||
const referenceNodeNumbers = new Set()
|
||||
const numberedReferenceNodes = []
|
||||
for (const node of referenceManifest.nodes || []) {
|
||||
if (!/^GLS-\d{4}$/.test(node.protocol_id)
|
||||
|| !/^HLP-GLS-REF-\d{4}$/.test(node.node_number)
|
||||
|| !node.title
|
||||
|| !['NORMATIVE_REFERENCE', 'SCHEMA_IMPORT', 'EVIDENCE_ONLY'].includes(node.reference_kind)
|
||||
|| node.source_state !== 'ROADMAP_REFERENCE_ONLY'
|
||||
|| !referenceIds.add(node.protocol_id)
|
||||
|| !referenceNodeNumbers.add(node.node_number)) {
|
||||
throw new Error(`invalid or duplicated numbered reference node: ${node.protocol_id || 'UNKNOWN'}`)
|
||||
}
|
||||
const evidencePaths = []
|
||||
for (const relative of allSourceFiles) {
|
||||
if (!/\.(?:hdlp|md|json|ya?ml)$/.test(relative)) continue
|
||||
const raw = await readFile(path.join(sourceRoot, relative), 'utf8')
|
||||
if (raw.includes(node.protocol_id)) evidencePaths.push(`gls/${relative}`)
|
||||
}
|
||||
if (evidencePaths.length === 0) throw new Error(`numbered reference node has no REPO-012 evidence: ${node.protocol_id}`)
|
||||
numberedReferenceNodes.push({
|
||||
...node,
|
||||
execution_state: 'REFERENCE_ONLY_NOT_EXECUTABLE',
|
||||
evidence_paths: evidencePaths.sort().slice(0, 12),
|
||||
})
|
||||
}
|
||||
if (missingSourceTargets.length !== referenceIds.size
|
||||
|| missingSourceTargets.some((id) => !referenceIds.has(id))
|
||||
|| [...referenceIds].some((id) => !missingSourceTargets.includes(id))) {
|
||||
throw new Error(`numbered reference registry coverage mismatch: missing=${missingSourceTargets.join(',')} registered=${[...referenceIds].sort().join(',')}`)
|
||||
}
|
||||
|
||||
const protocols = []
|
||||
for (const [id, source] of [...selectedSource.entries()].sort(([left], [right]) => left.localeCompare(right))) {
|
||||
const heading = source.raw.split(/\r?\n/).find((line) => line.startsWith('#') && line.includes(id))
|
||||
|
|
@ -280,6 +349,8 @@ for (const [id, source] of [...selectedSource.entries()].sort(([left], [right])
|
|||
enters_runtime_graph: false,
|
||||
target_registered: protocolRegistryIds.has(target),
|
||||
target_numbered_source_available: knownSourceIds.has(target),
|
||||
target_number_coordinate_available: knownSourceIds.has(target) || referenceIds.has(target),
|
||||
target_resolution: knownSourceIds.has(target) ? 'NUMBERED_PROTOCOL_SOURCE' : referenceIds.has(target) ? 'NUMBERED_REFERENCE_NODE' : 'UNRESOLVED',
|
||||
})),
|
||||
...(projection?.dependencies || []).map((target) => ({
|
||||
target,
|
||||
|
|
@ -288,18 +359,21 @@ for (const [id, source] of [...selectedSource.entries()].sort(([left], [right])
|
|||
enters_runtime_graph: true,
|
||||
target_registered: protocolRegistryIds.has(target),
|
||||
target_numbered_source_available: knownSourceIds.has(target),
|
||||
target_number_coordinate_available: knownSourceIds.has(target) || referenceIds.has(target),
|
||||
target_resolution: knownSourceIds.has(target) ? 'NUMBERED_PROTOCOL_SOURCE' : referenceIds.has(target) ? 'NUMBERED_REFERENCE_NODE' : 'UNRESOLVED',
|
||||
})),
|
||||
]
|
||||
const activationBlockers = []
|
||||
if (!projection) activationBlockers.push('NO_EXECUTABLE_ADAPTER')
|
||||
if (registrationState === 'DISCOVERED_UNRECONCILED') activationBlockers.push('REGISTRATION_NOT_RECONCILED')
|
||||
if (authorityConflict) activationBlockers.push('REGISTRATION_SOURCE_CONFLICT')
|
||||
if (legacyDependencies.some((target) => !knownSourceIds.has(target)) && !projection) activationBlockers.push('DEPENDENCY_NUMBERED_SOURCE_MISSING')
|
||||
if (legacyDependencies.some((target) => !knownSourceIds.has(target) && !referenceIds.has(target)) && !projection) activationBlockers.push('DEPENDENCY_NUMBER_COORDINATE_MISSING')
|
||||
protocols.push({
|
||||
id,
|
||||
title: cleanHeading(heading || id, id),
|
||||
source_status: sourceStatus(source.raw),
|
||||
source_path: `gls/${source.relative}`,
|
||||
source_format: source.source_format,
|
||||
source_sha256: createHash('sha256').update(source.raw).digest('hex'),
|
||||
alternate_source_count: source.alternate_source_count,
|
||||
registration: {
|
||||
|
|
@ -354,6 +428,7 @@ for (const protocol of protocols) {
|
|||
}
|
||||
const dependenciesNotInRegistry = [...legacyDependencyTargets].filter((id) => !protocolRegistryIds.has(id)).sort()
|
||||
const dependenciesWithoutNumberedSource = [...legacyDependencyTargets].filter((id) => !knownSourceIds.has(id)).sort()
|
||||
const unresolvedNumberReferences = dependenciesWithoutNumberedSource.filter((id) => !referenceIds.has(id))
|
||||
const numberedSourcesNotInProtocolRegistry = [...knownSourceIds].filter((id) => !protocolRegistryIds.has(id)).sort()
|
||||
const registry = {
|
||||
schema: 'hololake.gls-runtime-manifest/v2',
|
||||
|
|
@ -384,6 +459,10 @@ const registry = {
|
|||
legacy_dependency_target_count: legacyDependencyTargets.size,
|
||||
dependencies_not_in_protocol_registry: dependenciesNotInRegistry,
|
||||
dependencies_without_numbered_source: dependenciesWithoutNumberedSource,
|
||||
numbered_reference_node_count: numberedReferenceNodes.length,
|
||||
unresolved_number_references: unresolvedNumberReferences,
|
||||
unresolved_number_reference_count: unresolvedNumberReferences.length,
|
||||
every_dependency_has_number_coordinate: unresolvedNumberReferences.length === 0,
|
||||
numbered_sources_not_in_protocol_registry: numberedSourcesNotInProtocolRegistry,
|
||||
legacy_dependency_cycles: legacyDependencyCycles,
|
||||
source_reference_cycles: legacyDependencyCycles,
|
||||
|
|
@ -395,8 +474,10 @@ const registry = {
|
|||
protocol_count: protocols.length,
|
||||
executable_projection_count: executableCount,
|
||||
inventoried_not_executable_count: protocols.length - executableCount,
|
||||
number_coordinate_count: protocols.length + numberedReferenceNodes.length,
|
||||
numbered_reference_nodes: numberedReferenceNodes,
|
||||
protocols,
|
||||
}
|
||||
|
||||
await writeFile(output, `${JSON.stringify(registry, null, 2)}\n`)
|
||||
console.log(`GLS_RUNTIME_MANIFEST_COMPILED protocols=${protocols.length} registered=${protocolRegistryIds.size} executable=${executableCount} legacy_cycles=${legacyDependencyCycles.length} output=${output}`)
|
||||
console.log(`GLS_RUNTIME_MANIFEST_COMPILED protocols=${protocols.length} references=${numberedReferenceNodes.length} unresolved=${unresolvedNumberReferences.length} registered=${protocolRegistryIds.size} executable=${executableCount} legacy_cycles=${legacyDependencyCycles.length} output=${output}`)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,162 @@
|
|||
import { createHash } from 'node:crypto'
|
||||
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'
|
||||
import { dirname, resolve } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
const root = resolve(dirname(fileURLToPath(import.meta.url)), '..')
|
||||
const paths = {
|
||||
identity: resolve(root, 'contracts/zero-core-numbering-kernel.json'),
|
||||
webview: resolve(root, 'contracts/numbered-ipc-registry.json'),
|
||||
broker: resolve(root, 'contracts/direct-local-broker-numbered-registry.json'),
|
||||
gls: resolve(root, 'contracts/gls-runtime-registry.json'),
|
||||
output: resolve(root, 'generated/unified-number-coordinate-tree.json'),
|
||||
}
|
||||
|
||||
function readSource(path) {
|
||||
const bytes = readFileSync(path)
|
||||
return {
|
||||
value: JSON.parse(bytes.toString('utf8')),
|
||||
sha256: createHash('sha256').update(bytes).digest('hex'),
|
||||
}
|
||||
}
|
||||
|
||||
export function compileUnifiedNumberTree() {
|
||||
const identity = readSource(paths.identity)
|
||||
const webview = readSource(paths.webview)
|
||||
const broker = readSource(paths.broker)
|
||||
const gls = readSource(paths.gls)
|
||||
const routes = [
|
||||
...webview.value.operations.map((route) => ({
|
||||
transport: 'TAURI_WEBVIEW_NUMBERED_IPC',
|
||||
protocolVersion: webview.value.runtime.protocol_version,
|
||||
callerNumber: webview.value.runtime.caller_number,
|
||||
channelNumber: route.channel_number,
|
||||
moduleNumber: route.module_number,
|
||||
operationNumber: route.operation_number,
|
||||
targetNumber: route.target_number,
|
||||
alias: route.alias,
|
||||
admission: route.admission,
|
||||
effect: route.effect,
|
||||
evidence: 'HASH_CHAINED_NUMBERED_IPC_RECEIPT',
|
||||
path: `HLP-NUMBER-WORLD-ROOT-001/TAURI/${route.channel_number}/${route.module_number}/${route.operation_number}/${route.target_number}`,
|
||||
})),
|
||||
...broker.value.operations.map((route) => ({
|
||||
transport: 'DIRECT_LOCAL_NUMBERED_BROKER',
|
||||
protocolVersion: broker.value.runtime.protocol_version,
|
||||
callerNumber: broker.value.runtime.caller_number,
|
||||
channelNumber: route.channel_number,
|
||||
moduleNumber: route.module_number,
|
||||
operationNumber: route.operation_number,
|
||||
targetNumber: route.target_number,
|
||||
alias: route.alias,
|
||||
admission: ['DISCOVER_NEARBY', 'PING', 'GET_BEIJING_TIME'].includes(route.alias)
|
||||
? 'PREAUTH_LOCAL_SYSTEM_ROUTE'
|
||||
: ['OPEN_VISITOR_SESSION', 'RECEIVE_LANGUAGE'].includes(route.alias)
|
||||
? 'BOUNDED_VISITOR_ROUTE'
|
||||
: 'AUTHENTICATED_LOCAL_SESSION_WITH_PERSONA_LICENSE_IF_PERSONA_MODE',
|
||||
effect: ['DISCOVER_NEARBY', 'PING', 'GET_BEIJING_TIME', 'GET_PERSONA_CARRIER_LICENSE_STATUS', 'GET_WORK_ENVIRONMENT', 'RESOLVE_CAPABILITY_ROUTE', 'INSPECT_MOUNTED_PNCC_REPOSITORY', 'READ_MOUNTED_PNCC_REMOTE_OBJECT', 'QUERY_PNCC_RECEIPT_PROJECTION', 'INSPECT_DEVELOPMENT_WRITE_LANE'].includes(route.alias)
|
||||
? 'READ_OR_STATUS'
|
||||
: 'STATE_CHANGE',
|
||||
evidence: 'NUMBERED_RESPONSE_PLUS_SESSION_OR_DOMAIN_RECEIPT',
|
||||
path: `HLP-NUMBER-WORLD-ROOT-001/BROKER/${route.channel_number}/${route.module_number}/${route.operation_number}/${route.target_number}`,
|
||||
})),
|
||||
].sort((left, right) => left.path.localeCompare(right.path, 'en'))
|
||||
const uniquePaths = new Set(routes.map((route) => route.path))
|
||||
const uniqueOperations = new Set(routes.map((route) => `${route.transport}:${route.operationNumber}`))
|
||||
if (routes.length !== uniquePaths.size || routes.length !== uniqueOperations.size) {
|
||||
throw new Error('HOLOLAKE_UNIFIED_NUMBER_TREE_DUPLICATE_COORDINATE')
|
||||
}
|
||||
const identityNodes = identity.value.namespaces.map((namespace) => ({
|
||||
nodeKind: 'IDENTITY_NAMESPACE',
|
||||
nodeNumber: `HLP-IDENTITY-NS-${namespace.id}`,
|
||||
namespaceId: namespace.id,
|
||||
subjectKind: namespace.subject_kind,
|
||||
domainScope: namespace.domain_scope,
|
||||
admission: namespace.human_entry ? 'REGISTERED_HUMAN_NAMESPACE' : 'NON_HUMAN_NAMESPACE',
|
||||
executionState: 'AUTHORITY_RESOLUTION_ONLY',
|
||||
evidence: identity.value.authority.map_id,
|
||||
path: `HLP-NUMBER-WORLD-ROOT-001/IDENTITY/${namespace.id}`,
|
||||
})).sort((left, right) => left.path.localeCompare(right.path, 'en'))
|
||||
const protocolNodes = [
|
||||
...gls.value.protocols.map((protocol) => ({
|
||||
nodeKind: 'GLS_PROTOCOL_SOURCE',
|
||||
nodeNumber: protocol.id,
|
||||
protocolId: protocol.id,
|
||||
title: protocol.title,
|
||||
sourceState: protocol.source_format,
|
||||
executionState: protocol.projection_state,
|
||||
evidence: protocol.source_sha256,
|
||||
path: `HLP-NUMBER-WORLD-ROOT-001/GLS/SOURCE/${protocol.id}`,
|
||||
})),
|
||||
...gls.value.numbered_reference_nodes.map((reference) => ({
|
||||
nodeKind: 'GLS_REFERENCE_ONLY',
|
||||
nodeNumber: reference.node_number,
|
||||
protocolId: reference.protocol_id,
|
||||
title: reference.title,
|
||||
sourceState: reference.source_state,
|
||||
executionState: reference.execution_state,
|
||||
evidence: reference.evidence_paths[0],
|
||||
path: `HLP-NUMBER-WORLD-ROOT-001/GLS/REFERENCE/${reference.node_number}`,
|
||||
})),
|
||||
].sort((left, right) => left.path.localeCompare(right.path, 'en'))
|
||||
const allPaths = [...routes.map((route) => route.path), ...identityNodes.map((node) => node.path), ...protocolNodes.map((node) => node.path)]
|
||||
if (new Set(allPaths).size !== allPaths.length
|
||||
|| gls.value.reconciliation.unresolved_number_reference_count !== 0
|
||||
|| gls.value.reconciliation.every_dependency_has_number_coordinate !== true
|
||||
|| protocolNodes.some((node) => node.nodeKind === 'GLS_REFERENCE_ONLY' && node.executionState !== 'REFERENCE_ONLY_NOT_EXECUTABLE')) {
|
||||
throw new Error('HOLOLAKE_UNIFIED_NUMBER_TREE_INCOMPLETE_COVERAGE')
|
||||
}
|
||||
return {
|
||||
schema: 'hololake.unified-number-coordinate-tree/v2',
|
||||
recordId: 'HLP-UNIFIED-NUMBER-TREE-001',
|
||||
state: 'MACHINE_COMPILED_STARTUP_ENFORCED',
|
||||
rootNumber: 'HLP-NUMBER-WORLD-ROOT-001',
|
||||
identityAuthority: {
|
||||
mapId: identity.value.authority.map_id,
|
||||
mapVersion: identity.value.authority.map_version,
|
||||
namespaces: identity.value.namespaces.map((namespace) => ({
|
||||
namespaceId: namespace.id,
|
||||
roots: namespace.roots,
|
||||
prefixes: namespace.prefixes,
|
||||
subjectKind: namespace.subject_kind,
|
||||
domainScope: namespace.domain_scope,
|
||||
})),
|
||||
},
|
||||
sources: [
|
||||
{ recordId: identity.value.record_id, sha256: identity.sha256 },
|
||||
{ recordId: webview.value.record_id, sha256: webview.sha256 },
|
||||
{ recordId: broker.value.record_id, sha256: broker.sha256 },
|
||||
{ recordId: gls.value.record_id, sha256: gls.sha256 },
|
||||
],
|
||||
invariants: {
|
||||
numberIsStableCoordinateNotAuthority: true,
|
||||
pathIsUniqueNavigation: true,
|
||||
admissionIsSeparateFromIdentity: true,
|
||||
everyPhysicalCallHasNumberedRoute: true,
|
||||
everyAcceptedCallHasEvidenceClass: true,
|
||||
everyProtocolReferenceHasNumberCoordinate: true,
|
||||
referenceOnlyNodesNeverExecutable: true,
|
||||
unresolvedNumberReferenceCount: 0,
|
||||
mismatchedCoordinate: 'FAIL_CLOSED',
|
||||
},
|
||||
coordinateCount: routes.length + identityNodes.length + protocolNodes.length,
|
||||
routeCount: routes.length,
|
||||
identityNodeCount: identityNodes.length,
|
||||
protocolNodeCount: protocolNodes.length,
|
||||
referenceOnlyNodeCount: protocolNodes.filter((node) => node.nodeKind === 'GLS_REFERENCE_ONLY').length,
|
||||
identityNodes,
|
||||
protocolNodes,
|
||||
routes,
|
||||
}
|
||||
}
|
||||
|
||||
const compiled = compileUnifiedNumberTree()
|
||||
const output = `${JSON.stringify(compiled, null, 2)}\n`
|
||||
if (process.argv.includes('--check')) {
|
||||
if (readFileSync(paths.output, 'utf8') !== output) {
|
||||
throw new Error('HOLOLAKE_UNIFIED_NUMBER_TREE_STALE')
|
||||
}
|
||||
} else {
|
||||
mkdirSync(dirname(paths.output), { recursive: true })
|
||||
writeFileSync(paths.output, output)
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
import assert from 'node:assert/strict'
|
||||
import { readFileSync } from 'node:fs'
|
||||
import test from 'node:test'
|
||||
|
||||
const registry = JSON.parse(readFileSync(new URL('../contracts/direct-local-broker-numbered-registry.json', import.meta.url), 'utf8'))
|
||||
const broker = readFileSync(new URL('../src-tauri/src/direct_local_broker.rs', import.meta.url), 'utf8')
|
||||
|
||||
test('the external local broker accepts only complete numbered coordinates', () => {
|
||||
assert.equal(registry.record_id, 'HLP-NBROKER-ROOT-001')
|
||||
assert.equal(registry.runtime.protocol_version, 'HLP-NBROKER-v1')
|
||||
assert.equal(registry.runtime.legacy_string_operation_allowed, false)
|
||||
assert.equal(registry.runtime.unknown_or_mismatched_coordinate, 'FAIL_CLOSED')
|
||||
assert.equal(registry.runtime.transport_is_authority, false)
|
||||
assert.equal(registry.operations.length, 22)
|
||||
assert.equal(new Set(registry.operations.map((route) => route.operation_number)).size, 22)
|
||||
assert.equal(new Set(registry.operations.map((route) => route.alias)).size, 22)
|
||||
for (const route of registry.operations) {
|
||||
assert.match(route.operation_number, /^HLP-NBROKER-OP-\d{4}$/)
|
||||
assert.match(route.channel_number, /^HLP-NBROKER-CH-\d{4}$/)
|
||||
assert.match(route.module_number, /^HLP-NBROKER-MOD-\d{4}$/)
|
||||
assert.match(route.target_number, /^HLP-NBROKER-TGT-\d{4}$/)
|
||||
}
|
||||
assert.match(broker, /decode_numbered_broker_request/)
|
||||
assert.match(broker, /HOLOLAKE_NUMBERED_BROKER_ROUTE_COORDINATE_MISMATCH/)
|
||||
})
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
import assert from 'node:assert/strict'
|
||||
import { readFileSync } from 'node:fs'
|
||||
import test from 'node:test'
|
||||
|
||||
const read = (path) => readFileSync(new URL(`../${path}`, import.meta.url), 'utf8')
|
||||
const contract = JSON.parse(read('contracts/dynamic-language-world-visual-system.json'))
|
||||
const registry = JSON.parse(read('contracts/numbered-ipc-registry.json'))
|
||||
const modulePackage = JSON.parse(read('fixtures/module-packages/HLP-MOD-OFFICIAL-DYNAMIC-WORLD-SURFACE-0001-0.1.0.ghmod'))
|
||||
const rust = read('src-tauri/src/world_climate.rs')
|
||||
const frontend = read('src/main.tsx')
|
||||
const styles = read('src/styles.css')
|
||||
const starlake = read('src/modules/qoder-surface/StarlakeSurface.tsx')
|
||||
const starlakeStyles = read('src/modules/qoder-surface/starlake-surface.css')
|
||||
const traditional = read('src/modules/qoder-surface/TraditionalSurface.tsx')
|
||||
const traditionalStyles = read('src/modules/qoder-surface/traditional-surface.css')
|
||||
const visualBalance = read('src/modules/qoder-surface/visual-balance.ts')
|
||||
const layoutProfile = read('src/modules/qoder-surface/layout-profile.ts')
|
||||
|
||||
test('dynamic world surface is signed, opt-in and cannot mutate world facts', () => {
|
||||
assert.equal(modulePackage.manifest.moduleNumber, 'HLP-MOD-OFFICIAL-DYNAMIC-WORLD-SURFACE-0001')
|
||||
assert.equal(modulePackage.manifest.registrationClass, 'OFFICIAL_LIGHTHOUSE')
|
||||
assert.equal(modulePackage.manifest.adapter, 'dynamic-language-world-surface-v1')
|
||||
assert.deepEqual(modulePackage.manifest.permissions, ['REALITY_TIME_READ', 'PUBLIC_WEATHER_QUERY'])
|
||||
assert.equal(modulePackage.payload.adapterConfig.routingPermissionOrFactMutation, false)
|
||||
assert.equal(contract.visual_lock.climate_changes_routing_permission_or_fact, false)
|
||||
assert.equal(contract.visual_lock.daily_sampling_domain_changes_open_domain, false)
|
||||
})
|
||||
|
||||
test('climate query crosses the unique numbered route and fails closed before activation', () => {
|
||||
const route = registry.operations.find((item) => item.alias === 'get_world_climate')
|
||||
assert.equal(route.operation_number, 'HLP-NIPC-OP-0147')
|
||||
assert.equal(route.module_number, 'HLP-NIPC-MOD-0031')
|
||||
assert.equal(route.target_number, 'HLP-NIPC-TGT-0031')
|
||||
assert.equal(route.admission, 'VERIFIED_HUMAN_ROUTE')
|
||||
assert.match(rust, /require_active_module_adapter/)
|
||||
assert.doesNotMatch(rust, /#\[tauri::command\]/)
|
||||
assert.doesNotMatch(frontend, /from ['"]@tauri-apps\/api\/core['"]/)
|
||||
})
|
||||
|
||||
test('Qoder locked two-track surface is admitted without simulated product state', () => {
|
||||
assert.equal(contract.visual_lock.layout, 'QODER_VISUAL_LANGUAGE_SEMANTICALLY_REASSEMBLED_ON_RESPONSIVE_HOLOLAKE_SHELL')
|
||||
assert.equal(contract.visual_lock.language_world_themes.length, 5)
|
||||
assert.equal(contract.visual_lock.traditional_finishes.length, 8)
|
||||
assert.equal(contract.visual_lock.all_downstream_pages_inherit_active_surface_tokens, true)
|
||||
assert.match(frontend, /夜湖星光/)
|
||||
assert.match(frontend, /天气源暂不可用;湖面只使用北京时间,不生成假天气。/)
|
||||
assert.match(styles, /\.world-climate-veil/)
|
||||
assert.match(starlake, /ResizeObserver/)
|
||||
assert.match(starlake, /data-layout=\{layout\.profile\}/)
|
||||
assert.match(layoutProfile, /panoramic.*wide.*compact.*stacked/s)
|
||||
assert.doesNotMatch(starlake, /naturalScale|sideCenters|onDuty \? 2/)
|
||||
assert.match(starlakeStyles, /\.starlake-scene\.awake/)
|
||||
assert.match(traditional, /broadcasts\.map/)
|
||||
assert.match(traditionalStyles, /\.official-world\.surface-traditional/)
|
||||
assert.match(visualBalance, /contrastRatio/)
|
||||
assert.doesNotMatch(traditional, /语料库新增 217 条/)
|
||||
assert.doesNotMatch(traditional, /const BROADCAST_POOL/)
|
||||
})
|
||||
|
||||
test('ambient motion sleeps and the Qoder source hashes remain pinned', () => {
|
||||
assert.equal(contract.visual_lock.ambient_motion_requires_recent_human_pointer_or_keyboard_activity, true)
|
||||
assert.equal(contract.visual_lock.idle_visual_state, 'STATIC')
|
||||
assert.match(frontend, /setTimeout\(\(\) => \{[\s\S]*setMotionAwake\(false\)/)
|
||||
assert.match(starlake, /if \(!awake\) return/)
|
||||
assert.match(traditional, /if \(!awake\) return/)
|
||||
assert.match(starlakeStyles, /animation-play-state:paused/)
|
||||
assert.match(traditionalStyles, /animation-play-state:paused/)
|
||||
assert.equal(contract.qoder_source_provenance.main_tsx_sha256, '7dab8596ec0bd2609b1b23b175f1f14f15f2aa9af847eb605692c993d2e876e8')
|
||||
})
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
import assert from 'node:assert/strict'
|
||||
import { readFileSync } from 'node:fs'
|
||||
import test from 'node:test'
|
||||
|
||||
const read = (path) => readFileSync(new URL(`../${path}`, import.meta.url), 'utf8')
|
||||
const contract = JSON.parse(read('contracts/education-workspace.json'))
|
||||
const registry = JSON.parse(read('contracts/numbered-ipc-registry.json'))
|
||||
const modulePackage = JSON.parse(read('fixtures/module-packages/HLP-MOD-OFFICIAL-EDUCATION-WORKBENCH-0001-0.1.0.ghmod'))
|
||||
const workspaceRust = read('src-tauri/src/education_workspace.rs')
|
||||
const translationRust = read('src-tauri/src/education_translation.rs')
|
||||
const frontend = [
|
||||
read('src/modules/education-workspace/index.tsx'),
|
||||
read('src/modules/education-workspace/education-data.ts'),
|
||||
read('src/modules/education-workspace/education-adaptive-rendering.ts'),
|
||||
].join('\n')
|
||||
|
||||
test('education is an official signed declarative adapter over the shared office foundation', () => {
|
||||
assert.equal(contract.package.official_module_number, 'HLP-MOD-OFFICIAL-EDUCATION-WORKBENCH-0001')
|
||||
assert.equal(contract.foundation_dependency.module_id, 'hololake.builtin.channel-workbench')
|
||||
assert.equal(modulePackage.manifest.registrationClass, 'OFFICIAL_LIGHTHOUSE')
|
||||
assert.equal(modulePackage.manifest.adapter, 'education-workbench-v1')
|
||||
assert.equal(modulePackage.payload.adapterConfig.foundationModule, 'HLP-MOD-LOCAL-CHANNEL-WORKBENCH-0001')
|
||||
assert.equal(modulePackage.payload.adapterConfig.importDefaultScope, 'UNASSIGNED')
|
||||
assert.equal(modulePackage.payload.adapterConfig.modelFileTransferDefault, 'DENY')
|
||||
assert.equal(modulePackage.manifest.permissions.length, 8)
|
||||
})
|
||||
|
||||
test('all education effects cross the exact numbered adapter routes', () => {
|
||||
const routes = registry.operations.filter((route) => route.module_number === 'HLP-NIPC-MOD-0024')
|
||||
assert.deepEqual(routes.map((route) => route.operation_number), Array.from({ length: 18 }, (_, index) => `HLP-NIPC-OP-${String(index + 85).padStart(4, '0')}`))
|
||||
assert.ok(routes.every((route) => route.target_number === 'HLP-NIPC-TGT-0024'))
|
||||
assert.ok(routes.every((route) => route.admission === 'VERIFIED_HUMAN_ROUTE'))
|
||||
assert.doesNotMatch(frontend, /from ['"]@tauri-apps\/api\/core['"]/)
|
||||
assert.doesNotMatch(workspaceRust, /#\[tauri::command\]/)
|
||||
assert.doesNotMatch(translationRust, /#\[tauri::command\]/)
|
||||
assert.match(workspaceRust, /require_active_module_adapter/)
|
||||
})
|
||||
|
||||
test('legacy silent corruption and automatic destructive behavior are rejected', () => {
|
||||
assert.doesNotMatch(workspaceRust, /serde_json::from_str[^\n]+unwrap_or_default/)
|
||||
assert.match(workspaceRust, /deny_unknown_fields/)
|
||||
assert.match(frontend, /生成只读预览/)
|
||||
assert.match(frontend, /我确认,写入清理结果/)
|
||||
assert.match(frontend, /生成只读预览令牌/)
|
||||
assert.match(frontend, /我确认,按此令牌执行/)
|
||||
assert.match(frontend, /确认归入教育频道/)
|
||||
})
|
||||
|
||||
test('education UI is independently lazy-loaded and reuses, rather than duplicates, office engines', () => {
|
||||
assert.match(read('src/main.tsx'), /lazy\(\(\) => import\('\.\/modules\/education-workspace'\)/)
|
||||
assert.match(read('src/modules/education-workspace/education-document-engine.tsx'), /channel-workbench\/document-engine/)
|
||||
assert.match(read('src/modules/education-workspace/index.tsx'), /channel-workbench\/spreadsheet-engine/)
|
||||
})
|
||||
|
|
@ -3,6 +3,7 @@ import fs from 'node:fs'
|
|||
import test from 'node:test'
|
||||
|
||||
const source = fs.readFileSync(new URL('../src/main.tsx', import.meta.url), 'utf8')
|
||||
const privateChannel = fs.readFileSync(new URL('../src/modules/private-channel/PrivateChannelSurface.tsx', import.meta.url), 'utf8')
|
||||
|
||||
test('Zhizhi remains absent from the public Fifth Domain card', () => {
|
||||
const publicCard = source.slice(source.indexOf("domain: 'FIFTH_DOMAIN'"), source.indexOf('const starPoints'))
|
||||
|
|
@ -23,7 +24,10 @@ test('the Eternal Lake Heart system body exposes both owned branches before chan
|
|||
assert.match(source, /title="爱之核心子系统" meta="责任主体 · 之之"/)
|
||||
assert.match(source, /title="光之湖" meta="人格体居所"/)
|
||||
assert.match(source, /worldStage === 'heartbeat'/)
|
||||
assert.match(source, /<h1>心跳核心频道<\/h1>/)
|
||||
assert.match(source, /<PrivateChannelSurface ownerName="冰朔" ownerNumber="ICE-GL∞"/)
|
||||
assert.match(privateChannel, /view === 'home' \? '心跳核心频道'/)
|
||||
assert.match(privateChannel, /PrivateChannelView = 'home' \| 'native' \| 'modules'/)
|
||||
assert.match(privateChannel, /private-water-bay/)
|
||||
})
|
||||
|
||||
test('knowledge belongs to Heartbeat Core while persona repositories belong to Light Lake', () => {
|
||||
|
|
@ -32,12 +36,22 @@ test('knowledge belongs to Heartbeat Core while persona repositories belong to L
|
|||
const toolStart = source.indexOf("worldStage === 'tool'", lightLakeStart)
|
||||
const heartbeat = source.slice(heartbeatStart, lightLakeStart)
|
||||
const lightLake = source.slice(lightLakeStart, toolStart)
|
||||
assert.match(heartbeat, /title="知识空间"/)
|
||||
assert.match(heartbeat, /nativeActions=\{privateNativeActions\}/)
|
||||
assert.match(source, /id: 'knowledge', title: '知识空间'/)
|
||||
assert.doesNotMatch(heartbeat, /人格体代码仓库|title="光之湖"/)
|
||||
assert.match(lightLake, /<h1>光之湖<\/h1>/)
|
||||
assert.match(lightLake, /title="人格体代码仓库"/)
|
||||
})
|
||||
|
||||
test('industry modules are installed furniture in the private home, not peer domains', () => {
|
||||
assert.match(source, /const privateInstalledModules: InstalledChannelModule\[\]/)
|
||||
assert.match(privateChannel, /已安装模块/)
|
||||
assert.match(privateChannel, /前往分域模块商城/)
|
||||
assert.match(privateChannel, /这里不属于主域、分域、零域或零感域/)
|
||||
assert.match(privateChannel, /任何反向访问都必须持有/)
|
||||
assert.doesNotMatch(source, /className="channel-education" title="教育工作台"/)
|
||||
})
|
||||
|
||||
test('Fifth Domain human numbers are paired with their own login account', () => {
|
||||
assert.match(source, /'ICE-GL∞': 'bingshuo'/)
|
||||
assert.match(source, /'ICE-GL-ZHI∞': 'zhizhi'/)
|
||||
|
|
|
|||