Compare commits

...
Author SHA1 Message Date
e8b3082ed5 feat: close complete numbering and responsive fifth-domain UI 2026-08-19 13:16:32 +08:00
fe1aaade0e feat: admit numbered iPhone companion 2026-08-19 07:28:26 +08:00
fb8607f248 feat: admit complete Qoder surfaces into numbered HoloLake 2026-08-19 07:07:25 +08:00
fdc1bd3c0a fix: harden Xcode release provenance 2026-08-19 05:10:54 +08:00
7619036c6f fix: encode Xcode archive creation date 2026-08-19 04:59:22 +08:00
b3f5e8242a fix: resolve release app bundle root 2026-08-19 04:55:53 +08:00
7f415ee09f feat: add Xcode notarization release flow 2026-08-19 04:50:17 +08:00
2b1f5d47fd feat: admit signed dynamic world surface module 2026-08-19 04:35:49 +08:00
292889f934 feat: admit signed mobile sync bridge module 2026-08-19 04:14:58 +08:00
eb7223ea4c feat: admit signed web novel module family 2026-08-19 03:51:18 +08:00
df5e8f8e3c feat: admit signed education workbench module 2026-08-19 03:17:00 +08:00
15b2651074 feat: admit signed persona channel body module 2026-08-19 02:48:13 +08:00
bafaf464c2 feat: admit signed channel workbench module 2026-08-19 02:22:32 +08:00
593d5e5884 feat: admit signed native composition module 2026-08-19 01:52:47 +08:00
7673c337fc feat: add signed numbered module lifecycle 2026-08-19 01:28:22 +08:00
d30d84631d chore: compile current GLS authority into runtime 2026-08-19 00:54:07 +08:00
da6e426ca3 feat: close persona license and unified number routes 2026-08-19 00:45:35 +08:00
b7b3611a64 fix: restore numbered source and persona binding direction 2026-08-19 00:06:49 +08:00
40b8c49324 release: formalize HoloLake 0.5.0 numbered root 2026-08-18 23:37:32 +08:00
5d01607459 chore: prepare HoloLake 0.5.0 official base 2026-08-18 23:12:21 +08:00
64abf969bf feat: 建立 HoloLake 编号通信根与人格第零层合同 2026-08-18 23:04:18 +08:00
202 changed files with 38600 additions and 610 deletions

View file

@ -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
}
}

View file

@ -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"
}

View file

@ -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"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

View file

@ -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"
}
}

View file

@ -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"}
]
}

View file

@ -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"
}
}

View file

@ -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"
}

View file

@ -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":[]},

View file

@ -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": {

View file

@ -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"}
]
}

View file

@ -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"
}
}

View file

@ -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,

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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
}
}

View file

@ -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"
}
}

View file

@ -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
},

File diff suppressed because it is too large Load diff

View file

@ -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"
]
}

View file

@ -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
}
}

View file

@ -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
}
}
}

View file

@ -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"
}
}

View file

@ -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",

View file

@ -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"
]
}

View file

@ -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"
}
}

View file

@ -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",

View file

@ -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.

View file

@ -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一致

View file

@ -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
}
}
}

View file

@ -0,0 +1 @@
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRTNiU1ZIVE10TkRyZHhCU1oycjJCMnlVV3hCRGM2QmJSZ0hlZGlPejY0TER2MkE0Q3U3Y1g5dHVnSjBzVytOallYN3hKQVNJcE9Pblowd3lpTXh1V2dBPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDc1OTcwCWZpbGU6SExQLU1PRC1MT0NBTC1DSEFOTkVMLVdPUktCRU5DSC0wMDAxLTAuMS4wLmdobW9kCkVKbFN4ZXBCbDBCZlJDcEhmYmZtQU1iTXN4djZVVGl0MngwOW5NRzBLSDArK2FRNEV2ZmVObzZRZWFWNmZVOXV3TnErcHM1MGI5K1lHMXpBUmxYVkR3PT0K

View file

@ -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"]
}
}
}

View file

@ -0,0 +1 @@
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRTRyUS9Nd0E0NE53dGRYODFxeWlzcW1XanN6K2EzQUNXSVVmT1ZLY2tRNExwaXlZdnJvSjlFZU5lUTJhb25hUVhORDQ0ZmFURmNSWTZBUmRTQnBiNFFvPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDc0NDA3CWZpbGU6SExQLU1PRC1MT0NBTC1OQVRJVkUtQ09NUE9TSVRJT04tMDAwMS0wLjEuMC5naG1vZApDclRUZDNpeENBSDQ0a0ZnR3VaNkxIS1lWUUhoMEdWajVqL0JzVVg4dStLb1ZJYXZlNHBaQy9BZlMxMkxreVQ0ODFzeGFMSWZrVUppUVY2NFN5TndDUT09Cg==

View file

@ -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
}
}
}

View file

@ -0,0 +1 @@
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRXd2QktvaXdZZWx5eEw0anZrUVNuMU5tRy9HTE9jOEhrcUhET3VFTml4ZUlBODk2aDYvNDhhUVVpbU0wTGtENVlZOExCZ1BnVW1vNElxbVhwT1RZWlFZPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDc3NjQxCWZpbGU6SExQLU1PRC1MT0NBTC1QRVJTT05BLUNIQU5ORUwtQk9EWS0wMDAxLTAuMS4wLmdobW9kCjh6OFRiUHhoR1g1eVNoN1lvNU5wTlNnbXkwVEtvcWVwU0ZsSTlWcmpIT1FKK0ppelBBK2V2anMrQkRyQjRrVXFtdkR2L0g5K1c2UFhJZ1owRitpd0RnPT0K

View file

@ -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"
]
}
}

View file

@ -0,0 +1 @@
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRThwcUdLRThMYkJLN29MM1NmVFVCcmh4dGdrbHdPVWlvdm45enpveUhBeFZ3VEM1TkNHRDBKdGFoN21OZHgzV0NSMFVvMk1TNW44Z3BtRS9GcmN5SHdvPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDczNTkxCWZpbGU6SExQLU1PRC1MT0NBTC1SVU5USU1FLUFDQ0VQVEFOQ0UtMDAwMS0wLjEuMC5naG1vZApXRWZINVdEUG12SlNsdzRTMkFHRDV3V0NkSVhNYW92RmczRGZlU3M0ZU9nSnhjc1BWbU1ZS0x1cStoQXE5TE96cnV1S2FaQ1FnK0FGdFNEY1RvUGZBQT09Cg==

View file

@ -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"
}
}
}

View file

@ -0,0 +1 @@
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRTF2cGVLbjVsWWRTdEF2L0FiZHBKUS9hVDdwNjRmRlRPc0xHTGJzbXFyR09tZysrcGNDYWN4eEJ3aGtCNGtURDRjNWg1ZWs5bU5YdDc0SWhBYWNsUEFBPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDg0NTk2CWZpbGU6SExQLU1PRC1PRkZJQ0lBTC1EWU5BTUlDLVdPUkxELVNVUkZBQ0UtMDAwMS0wLjEuMC5naG1vZApHVGFucE8vYjliVUlsbSt6STRWTEcrN2tIQzNTSTgrUzlwdVdQUlY5WG8vQytzTEU1VURYMVA5Q3BCNVVwVFBvbnZheWxIbVUrWGQ2K3ZicGgwR3hEdz09Cg==

View file

@ -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
}
}
}

View file

@ -0,0 +1 @@
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRTFEa084d1l6MnB2OFVvVy9abW90S3RFMEVOdmIvWW1hbkllWmw4NHBJaDVNTGxpZHV4M0tVNUNUOExmdHAwSGw4V0NPQ1RPUjlRU0h0Tm50clFlekFJPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDc5ODQzCWZpbGU6SExQLU1PRC1PRkZJQ0lBTC1FRFVDQVRJT04tV09SS0JFTkNILTAwMDEtMC4xLjAuZ2htb2QKVXZzVklwQk5KR3Q3bkRZaXBYV1ArOGx6b3BKSWVyUkpvK1dyTXdpWnBhMXNqVnJKcU5vZ1BTdzlFWjlXRTJ1RlFhMXAwMjhXcFBEQnQxRzV4SFVuQkE9PQo=

View file

@ -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"
}
}
}

View file

@ -0,0 +1 @@
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRTV5bDhHMkZjMzNkN0lpaDBLaDRxcnhHajJ3b3NDS21zZWljYWJORmtrNit5MHJvZC9yN2YrSUhiSE5sT0dMd25Jc2pXMkQyeWttODhKSklsRmVKNWd3PQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDgzMTYwCWZpbGU6SExQLU1PRC1PRkZJQ0lBTC1NT0JJTEUtU1lOQy0wMDAxLTAuMS4wLmdobW9kCjN6R1JZZitSbzI1cVRESkNUMnJrVXFWUlUyZ3B3L2lIQmhrOXZaTGc3T2x1REdNUUZrK2M4WWs4bE9Zb3NuSTNoNmRBRmlCekh0dkNNN1pKR2k4ZkFRPT0K

View file

@ -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 } }
}

View file

@ -0,0 +1 @@
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRTBrb01WSENhMmIvUGxyRnozY2k0aTVaQ1lFL3VLdWllSURCak54VWwrM2h1QXM4Sk10ZGc0Qm1EYzhhUVJVTFB6OXRqLzc5cSt3U0NleS9WR2owN3djPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDgxNTE1CWZpbGU6SExQLU1PRC1PRkZJQ0lBTC1XRUItTk9WRUwtREVMSVZFUlktMDAwMS0wLjEuMC5naG1vZApQWWFETDdISGFvbGdtVVZCK0V5VUVqNlFvSGRmQWVuY3dSRS9ZWm1UVHhCS0U4bHNCQzl0RFFtbDZEUXREWnp6MjQxbHF1bVgwS0NhS1ZBUGZxd3ZBUT09Cg==

View file

@ -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 } }
}

View file

@ -0,0 +1 @@
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRTBuWjBmYWczdEg3QXByZS9RaEY4N2x6RXN1WVY2ZEJGSmdSYmZyTGUrclVvYm1sd0t4REhOY1dVdW1EeGtramhqeSs4YU9nQVNBbkdCWVlEYmNteXdzPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDgxNTE1CWZpbGU6SExQLU1PRC1PRkZJQ0lBTC1XRUItTk9WRUwtR1JJRC0wMDAxLTAuMS4wLmdobW9kCkJLczNMbmpqYzVTdXQ5RklHMXdlMWpDcE9tRnlBYWlPcUJkMzZQbFlRSzFYVDFtNmYrZ1htN1VqZWJkaktUWmZ5VVZvczZ4YmVrWHRuQ3lNOXU0SkFBPT0K

View file

@ -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 } }
}

View file

@ -0,0 +1 @@
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRTNUYVhwVTlzdWt6VkVQYTUyanB6UFlYeU5BdW1qN0xuM1haWjlCYUU3UFlMRTdPZG90YVZvNGFyaVo4UHY0THowUWlPVzIzemYrQWNZbDFvRVd5NndrPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDgxNTE2CWZpbGU6SExQLU1PRC1PRkZJQ0lBTC1XRUItTk9WRUwtT1VUTElORS0wMDAxLTAuMS4wLmdobW9kCkZob1VsQlkwZFRyZXI2ck1OckhUc2ZqaHVJOWhSQnIraUFRSEllU3BxRlc3UStFekJRZDFMZFpmZlBvK09jTFJ6cERpcVl2M2N2emIvS0ptdnRrTkR3PT0K

View file

@ -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 } }
}

View file

@ -0,0 +1 @@
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRXpuRmFPWjJUSDVpSmQzQXl0aVF3N0xhRkRvVWhLalVtcDBnRFprNnpOUEdCWS9CTURlUHBrYWkyRG9MUFZwVEtHc0w5ZUltRlNUVlZBcm1vU2VnUlFZPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDgxNTE2CWZpbGU6SExQLU1PRC1PRkZJQ0lBTC1XRUItTk9WRUwtU1RPUllXT1JMRC0wMDAxLTAuMS4wLmdobW9kCnBzQkJYaTV6NFR2Vnk3NUdpK3JSQnJTUzhSd2hxUWdmM0UrcVZuN0VuS0JOc1lYclY5Y3FBbVJldVM1Y2FGamNtT3NiU0NsaThMRE5qT3VvTXJUUUJ3PT0K

View file

@ -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
}
}
}

View file

@ -0,0 +1 @@
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRTZyTUlUYWdZZXk3bFhDRTJBWElWMkVEQXZHa3dSWDFXSFJ2QjduVFk1bzFLUk5kOVFQamIwU2w1L3FzOWtibm9Kblg2NWJLWFdVeEtEbDNzTEltVmdFPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDgxNTE3CWZpbGU6SExQLU1PRC1PRkZJQ0lBTC1XRUItTk9WRUwtV09SS0JFTkNILTAwMDEtMC4xLjAuZ2htb2QKV0VqV3B4cFNLRng2UUcrNXlYZjY5SytERk14YTNyRkM1bldzUXo5RWpzMU0vRmVJWldvTGhmbmExcFhmSGZiWTFreElreGU2UHVsaXVhK0ZXZnVyQ2c9PQo=

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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.

View file

@ -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",

View file

@ -0,0 +1,4 @@
build/
*.xcuserstate
xcuserdata/

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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 */;
}

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View file

@ -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>

View file

@ -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)
}
}

View file

@ -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))
}
}

View file

@ -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)
}
}
}

View file

@ -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) }
}
}
}
}

View file

@ -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: "")
}
}

View file

@ -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) })
}
}

View file

@ -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)
}
}

View file

@ -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: {}

View file

@ -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"
}
}
}
}

View file

@ -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"
}
}

View file

@ -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'\)/)
})

View file

@ -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}`)

View file

@ -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)
}

View file

@ -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/)
})

View file

@ -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')
})

View file

@ -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/)
})

View file

@ -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'/)

Some files were not shown because too many files have changed in this diff Show more