chainlesschain 0.166.45 → 0.166.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/package.json +3 -1
- package/src/assets/web-panel/assets/{AIOps-CrMhYNeH.js → AIOps-CDpT0WXV.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DLY5blZ3.js → ActionButton-BNfUljWx.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-C0NhKQB0.js → Analytics-C9323DEx.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DLyepgMq.js → AppLayout-CRrjb2db.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-Depk01Sa.js → Artifacts-Db-DGqJS.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-jKe6NQ3J.js → Audit-CJdHRJ0W.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CG4GKT9s.js → BackgroundAgents-_RSCnTYs.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DYWCkzwM.js → Backup-8GFQi-dM.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-xm5vodmJ.js → BaseInput-C87NtgUZ.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-B20_PNd3.js → Chat-DcTMWS8G.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-D4d-eh0F.js → ChatBubbleRenderer-5ZDPTW_H.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-CfgwkV_r.js → Checkbox-DM9EmYee.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DbnoWI44.js → Codegen-M2YqDRNN.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CfzzhgGw.js → Col-oB1LLxyf.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BU7mGM8p.js → Community-TcVZK5tF.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DpYim0an.js → Compact-XKmq-3K_.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BNJcO6ra.js → Compliance-C6CBiDRy.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CecZ-pWj.js → Cowork-Dz9CGqXH.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-BG_C1fe3.js → Cron-CxJDgDVL.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BAeILQLL.js → Crosschain-DMP0JsaQ.js} +1 -1
- package/src/assets/web-panel/assets/{DID-CYqOEkXi.js → DID-I5IQeogb.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-BYU8wmL1.js → Dashboard-BfLW2MXj.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DYlJeTTa.js → Dropdown-BK8EjAlh.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-C0M6py3K.js → EmailListRenderer-C3iqSv5I.js} +1 -1
- package/src/assets/web-panel/assets/EvolutionSettings-BJmBzpW6.js +1 -0
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-Du90iDch.js → FamilyGuardDashboard-T19rnqm-.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DkFp_hzB.js → Federation-CozrbPMy.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BGgtGTfG.js → FormItemContext-k1dCLNNJ.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BIDsSCei.js → GenericCardRenderer-DbaW_Jvt.js} +1 -1
- package/src/assets/web-panel/assets/{Git--d3Te93J.js → Git-CQHRyEIt.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CZwD0vmO.js → Governance-BMJYZgMy.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DiDcSFEW.js → Inference-B7mpNU7V.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Bi0hSfzg.js → KnowledgeGraph-Br0Blg6B.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-C8NHSc0K.js → Logs-HIdk0S6M.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-DfDuADqF.js → MarkdownRenderer-HxeocBHy.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-D6kD0bNf.js → Marketplace-Bkfq69UP.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-mTSamCr5.js → McpTools-dtmx0bHO.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-YQBXfLjU.js → Memory-CrRlOuEf.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-D2awuupp.js → MobileBridge-D4ZIZiAH.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-Bl7lZc_-.js → MobileProjects-C90Rw7GE.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CBqjLK2Q.js → Mtc-CC6k_uh4.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-C4poRInZ.js → MtcAudit-T_CUIYUy.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-C_J0zXYZ.js → Multisig-N_e0RRWk.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Ci43sWOU.js → NLProgramming-Iq3VzEv0.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DN7A-GFZ.js → Notes-B5sKJUJt.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-D5jNm71V.js → NotificationSettings-K8UVp8qQ.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-C9UsPOG8.js → OrderTableRenderer-BWNyM-6m.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-BapYMJrP.js → Organization-DMO1NJxI.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BwxwjhFw.js → Overflow-BBY6b31Z.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-TObXXOu3.js → P2P-DmsL0y0v.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-UwJvMbFO.js → PdhVaultBrowser-C65AX_RY.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-Damnxv-O.js → Permissions-CWcpRtWa.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-d_7jlBb-.js → PersonalDataHub--ZNDIdsn.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-DA87VjLw.js → Pipeline-DCdj5NGb.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DzO_UvWn.js → Privacy-BRKu7Q3E.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CwqECDhs.js → ProjectInit-BJ7ozIAb.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CT5YdIl6.js → ProjectSettings-B2cVLiXW.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-D3KdZPCv.js → Projects-Ce9r_W-p.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-BjBIS8kk.js → Providers-BDespvGZ.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-mMFqiKkI.js → QrScannerModal-BUNO4fDU.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BwGi9ZU1.js → QuickAsk-D2TUqeBV.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BY65SR5s.js → Recommend-BNNQPHBH.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BGsVH_XU.js → RemoteSession-D2t1V_Cm.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-DpPbxSgI.js → Reputation-DVK5hEqI.js} +1 -1
- package/src/assets/web-panel/assets/{Row-B5YBYoVz.js → Row-BB9RTwmE.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DvM5jaoh.js → RssFeed-DmEO7liZ.js} +2 -2
- package/src/assets/web-panel/assets/{Search-6RX39EPO.js → Search-UwEYjnDB.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Beal-7cM.js → Security-DebqSsMp.js} +4 -4
- package/src/assets/web-panel/assets/{Services-D6rjVLe-.js → Services-CuuPts3C.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Dur7R7vz.js → Skeleton-DbWpmbgf.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-D1QkGwMk.js → Skills-BaK7SxzT.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-3ObrX8Es.js → Sla-BFHv51Jb.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DG_KAiH1.js → SpeechSettings-B9b1R6uK.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BaHq0SJ2.js → SyncSettings-BnO0CN02.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BDpAkBAB.js → Tasks-Dy01Vq49.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-tYdoRd-c.js → Templates-BCy2AMHc.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-yGS5zIQ1.js → Tenant-4Tx9y_Y1.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B3QbmVFa.js → Terminal-CPOoUH8J.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-B_7Pr5dS.js → TimelineRenderer-C85GlJzu.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DPvpDa53.js → Tokens-_xneFBGF.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DcSAD0GZ.js → Trigger-BizG4rTr.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BBzEq-uy.js → Trust-Dh8EIn3n.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-Dssav7-5.js → UkeySign-C5NWoHWQ.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CPOZf4yi.js → VideoEditing-0YfrySL6.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BzBVRXEq.js → Wallet-BZVH8Ags.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DdSGaCCh.js → WebAuthn-kNofa6vm.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-CKjBFoSs.js → WorkflowEditor-BNO34_j0.js} +1 -1
- package/src/assets/web-panel/assets/{chat-B9aMGLg0.js → chat-ifQ2FlwD.js} +1 -1
- package/src/assets/web-panel/assets/{colors-GFCMctSV.js → colors-1TL8H6EH.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BqSDFAYJ.js → compact-item-DBfRjs_T.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BwUm3Ffp.js → createContext-Bs6V4iBf.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BHnbnuYL.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DN1kMJOT.js → hasIn-Bz6LMY_0.js} +1 -1
- package/src/assets/web-panel/assets/{index-B4dI_csl.js → index--WvT2Il3.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7Yu5wwV.js → index-84mi5rsv.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAK28GY8.js → index-B5SJCUZ7.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmEHzOsw.js → index-B6RClMZl.js} +1 -1
- package/src/assets/web-panel/assets/{index-By9GbJhu.js → index-BB1Af7Fv.js} +1 -1
- package/src/assets/web-panel/assets/{index-7W1e9Vi4.js → index-BQL_tldd.js} +1 -1
- package/src/assets/web-panel/assets/{index-BDL2MwxN.js → index-BXJXMaZe.js} +1 -1
- package/src/assets/web-panel/assets/{index-CEMl-Qte.js → index-BhPDhmvN.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCnbC2z7.js → index-BiZ7Nz5-.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cwih67e8.js → index-BoCTDcn6.js} +1 -1
- package/src/assets/web-panel/assets/{index-DI90Wo_P.js → index-BxqC3LiO.js} +1 -1
- package/src/assets/web-panel/assets/{index-THsr_UUJ.js → index-C6c0j-Ki.js} +1 -1
- package/src/assets/web-panel/assets/{index-PKwZkQDC.js → index-C7d6QlfR.js} +1 -1
- package/src/assets/web-panel/assets/{index-rCTtYCGu.js → index-C9QYxq61.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ci0zIpSX.js → index-CBh48_Mh.js} +1 -1
- package/src/assets/web-panel/assets/{index-tMF_deZb.js → index-CNKHoXWI.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9Pe-EyB.js → index-CXVBQ82k.js} +3 -3
- package/src/assets/web-panel/assets/{index-B4MfxM5W.js → index-CXtiLagi.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaFr7XB1.js → index-Cn7EIWmI.js} +1 -1
- package/src/assets/web-panel/assets/index-CsRz9-ZH.js +1 -0
- package/src/assets/web-panel/assets/{index-D8jcp9Rj.js → index-CtB45Hok.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cli0VREv.js → index-Cu_V6ZJH.js} +1 -1
- package/src/assets/web-panel/assets/{index-DO-IKERp.js → index-Cykt9BbN.js} +1 -1
- package/src/assets/web-panel/assets/{index-y7cfh9rP.js → index-DDhy4eCS.js} +1 -1
- package/src/assets/web-panel/assets/{index-CH2wK5dx.js → index-DEPPzM8I.js} +1 -1
- package/src/assets/web-panel/assets/{index-BeycSy7n.js → index-DMVktlxG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BwssFWI1.js → index-DOww5Qny.js} +1 -1
- package/src/assets/web-panel/assets/{index-PJt1Zrx2.js → index-DWPp-d07.js} +1 -1
- package/src/assets/web-panel/assets/index-DnjMFf3m.js +1 -0
- package/src/assets/web-panel/assets/{index-BPGlcDvs.js → index-DvM2xBUA.js} +1 -1
- package/src/assets/web-panel/assets/{index-BL_0ndQc.js → index-EK3XtMxA.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnJt9DaX.js → index-XJIV7HEw.js} +1 -1
- package/src/assets/web-panel/assets/{index-BpiR6uzH.js → index-cNwsev6n.js} +1 -1
- package/src/assets/web-panel/assets/{index-bwb4cg_D.js → index-f_7L9GvP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DbDhKroq.js → index-lUL3bD2z.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvvJWwT8.js → index-pOUFfRdN.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBMW8bQO.js → index-rGhS02f8.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRikhGgx.js → index-vHtnQsnV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHUxz4dy.js → index-vb1XIxEB.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-B6e5CZ5p.js → initDefaultProps-DpRIjwTt.js} +1 -1
- package/src/assets/web-panel/assets/{motion-riMM1KfJ.js → motion-CG4_9o-Z.js} +1 -1
- package/src/assets/web-panel/assets/{move-C1NSDMjc.js → move-Dku1fXtf.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-Bibuny9B.js → mtc-parser-BvAVeX-3.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Cmf6FoRn.js → omit-DFu0x78D.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BSsYBUCY.js → pickAttrs-CmI-FNcK.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-gSB7-GAS.js → placementArrow-CGERYewB.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-qaqttvKa.js → responsiveObserve-D7G8bF5J.js} +1 -1
- package/src/assets/web-panel/assets/{slide-RX2gxl3k.js → slide-B2sXwWXy.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DEJmkhqw.js → statusUtils-DI5yh0n3.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CIWmJ78O.js → styleChecker-deGJ5dp_.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-D-UPSQBE.js → useFlexGapSupport-OqHBXEmi.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-9QFtqADc.js → useFs-Dqgx0Qv_.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DM6kyift.js → usePersonalDataHub-Be-lveh2.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-C-q6FNSJ.js → vnode-CFxB876W.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-D4WJY2m8.js → zoom-BFOYrl4e.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +3 -3
- package/src/commands/agent.js +11 -7
- package/src/commands/background-session.js +31 -3
- package/src/commands/chat.js +5 -1
- package/src/commands/eval.js +86 -28
- package/src/commands/llm.js +104 -1
- package/src/commands/plugin.js +130 -1
- package/src/commands/sandbox.js +121 -2
- package/src/commands/serve.js +11 -2
- package/src/commands/skill.js +29 -0
- package/src/data/changelog.json +26 -0
- package/src/gateways/ws/session-protocol.js +13 -0
- package/src/gateways/ws/ws-agent-handler.js +17 -0
- package/src/gateways/ws/ws-server.js +3 -0
- package/src/gateways/ws/ws-session-state.js +131 -0
- package/src/generated/cc-agent-protocol.schema.json +4 -0
- package/src/lazy-dispatch.js +8 -1
- package/src/lib/agent-sandbox.js +337 -53
- package/src/lib/app-server/cli-agent-kernel-adapter.js +28 -0
- package/src/lib/app-server/server.js +93 -0
- package/src/lib/background-agent-keeper-client.js +2 -0
- package/src/lib/background-agent-keeper-protocol.js +7 -0
- package/src/lib/background-agent-supervisor.js +194 -47
- package/src/lib/codex-app-server-adapter.js +81 -27
- package/src/lib/context-memory-kernel/durable-memory-port.js +31 -8
- package/src/lib/context-memory-kernel/provider-context.js +53 -19
- package/src/lib/deferred-question-context.js +122 -0
- package/src/lib/eval/evidence.js +202 -64
- package/src/lib/eval/plugin-suite.js +917 -0
- package/src/lib/eval/runner.js +10 -3
- package/src/lib/evolution/agent-evolution-ingress.js +60 -8
- package/src/lib/evolution/agent-evolution-runtime-composition.js +236 -1
- package/src/lib/evolution/agent-model-projection.js +97 -1
- package/src/lib/evolution/evidence-backed-wiki-maintainer.js +154 -1
- package/src/lib/evolution/evolution-artifact-ports.js +6 -0
- package/src/lib/evolution/evolution-deployment-loader.js +188 -10
- package/src/lib/evolution/evolution-eval-gate.js +8 -0
- package/src/lib/evolution/evolution-eval-runtime-composition.js +255 -0
- package/src/lib/evolution/evolution-evidence-artifact-adapter.js +58 -2
- package/src/lib/evolution/evolution-ledger-file-backend.js +23 -2
- package/src/lib/evolution/evolution-ledger-manifest-chain.js +223 -7
- package/src/lib/evolution/evolution-ledger-v2-journal.js +525 -0
- package/src/lib/evolution/evolution-ledger-v2-manifest-backend.js +46 -2
- package/src/lib/evolution/evolution-ledger.js +57 -1
- package/src/lib/evolution/evolution-run-ledger-adapter.js +93 -0
- package/src/lib/evolution/evolution-run-wiki-evidence-resolver.js +259 -0
- package/src/lib/evolution/governed-hub-llm.js +238 -5
- package/src/lib/evolution/governed-hub-resolver.js +82 -4
- package/src/lib/evolution/governed-hub-skill.js +11 -5
- package/src/lib/evolution/governed-skill-synthesis-provider-chat.js +10 -1
- package/src/lib/evolution/skill-runtime-revalidation-ledger-adapter.js +254 -0
- package/src/lib/evolution/skill-runtime-revalidation.js +530 -0
- package/src/lib/evolution/skill-target-matrix-eval.js +4 -4
- package/src/lib/evolution/wiki-evidence-commit-guard.js +366 -0
- package/src/lib/evolution/wiki-informed-skill-proposer.js +13 -1
- package/src/lib/goal-context.js +14 -5
- package/src/lib/interaction-adapter.js +166 -1
- package/src/lib/model-capabilities.js +271 -0
- package/src/lib/model-context-catalog.js +105 -0
- package/src/lib/model-context-window.js +4 -49
- package/src/lib/openai-responses.js +428 -0
- package/src/lib/plugin-runtime/scopes.js +7 -1
- package/src/lib/remote-read-loop-guard.js +2 -2
- package/src/lib/runtime-usage-ledger.js +16 -0
- package/src/lib/skill-loader.js +12 -0
- package/src/lib/with-file-lock.js +3 -1
- package/src/repl/agent-repl.js +6 -2
- package/src/runtime/agent-core.js +357 -44
- package/src/runtime/agent-runtime.js +7 -0
- package/src/runtime/coding-agent-contract-shared.cjs +13 -1
- package/src/runtime/headless-runner.js +4 -1
- package/src/runtime/headless-stream.js +133 -44
- package/src/runtime/runtime-factory.js +26 -2
- package/src/workers/background-agent-keeper.js +23 -13
- package/src/workers/background-agent-worker.js +27 -13
- package/src/assets/web-panel/assets/EvolutionSettings-_QnjPFZJ.js +0 -1
- package/src/assets/web-panel/assets/devWarning-LxtRBsCm.js +0 -1
- package/src/assets/web-panel/assets/index-36hxBH-o.js +0 -1
- package/src/assets/web-panel/assets/index-C0b78zWZ.js +0 -1
|
@@ -54,6 +54,11 @@ export const EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA =
|
|
|
54
54
|
export const EVOLUTION_LEDGER_MAX_EVENT_BYTES = 1024 * 1024;
|
|
55
55
|
export const EVOLUTION_LEDGER_MAX_ARTIFACT_BYTES = 16 * 1024 * 1024;
|
|
56
56
|
export const EVOLUTION_LEDGER_MAX_EVENTS = 250_000;
|
|
57
|
+
export const EVOLUTION_LEDGER_V2_MIGRATION_INTENT =
|
|
58
|
+
"evolution.ledger-v2.migration-intent";
|
|
59
|
+
export const EVOLUTION_LEDGER_V2_CUTOVER_COMPLETED =
|
|
60
|
+
"evolution.ledger-v2.cutover-completed";
|
|
61
|
+
const MIGRATION_SOURCES = new WeakMap();
|
|
57
62
|
|
|
58
63
|
const IDENTITY_DOMAIN = "chainlesschain.evolution-ledger-identity/v1\0";
|
|
59
64
|
const EVENT_DOMAIN = "chainlesschain.evolution-event/v2\0";
|
|
@@ -2011,6 +2016,29 @@ export class EvolutionLedger {
|
|
|
2011
2016
|
);
|
|
2012
2017
|
}
|
|
2013
2018
|
|
|
2019
|
+
MIGRATION_SOURCES.set(
|
|
2020
|
+
this,
|
|
2021
|
+
Object.freeze({
|
|
2022
|
+
ledger: this,
|
|
2023
|
+
requiresV2: () =>
|
|
2024
|
+
this.#withLock(() =>
|
|
2025
|
+
this.#loadState({
|
|
2026
|
+
allowInitialize: false,
|
|
2027
|
+
incremental: true,
|
|
2028
|
+
}).events.some(
|
|
2029
|
+
(event) => event.type === EVOLUTION_LEDGER_V2_MIGRATION_INTENT,
|
|
2030
|
+
),
|
|
2031
|
+
),
|
|
2032
|
+
append: (input, options = {}) =>
|
|
2033
|
+
this.#appendEvents([input], options, false, false, true),
|
|
2034
|
+
appendBatch: (inputs, options = {}) =>
|
|
2035
|
+
this.#appendEvents(inputs, options, false, true, true),
|
|
2036
|
+
appendDomainEvent: (input, options = {}) =>
|
|
2037
|
+
this.#appendEvents([input], options, true, false, true),
|
|
2038
|
+
appendDomainEventBatch: (inputs, options = {}) =>
|
|
2039
|
+
this.#appendEvents(inputs, options, true, true, true),
|
|
2040
|
+
}),
|
|
2041
|
+
);
|
|
2014
2042
|
Object.freeze(this);
|
|
2015
2043
|
}
|
|
2016
2044
|
|
|
@@ -4485,7 +4513,7 @@ export class EvolutionLedger {
|
|
|
4485
4513
|
return this.#appendEvents([input], options, domainEvent, false);
|
|
4486
4514
|
}
|
|
4487
4515
|
|
|
4488
|
-
#appendEvents(inputs, options, domainEvent, batch) {
|
|
4516
|
+
#appendEvents(inputs, options, domainEvent, batch, migrationWrite = false) {
|
|
4489
4517
|
const safeInputs = readDenseDataArray(
|
|
4490
4518
|
inputs,
|
|
4491
4519
|
batch ? "append batch" : "append input",
|
|
@@ -4557,6 +4585,23 @@ export class EvolutionLedger {
|
|
|
4557
4585
|
? normalizeDomainAppendInput(input, generatedTimestamp)
|
|
4558
4586
|
: normalizeAppendInput(input, generatedTimestamp);
|
|
4559
4587
|
});
|
|
4588
|
+
if (
|
|
4589
|
+
!migrationWrite &&
|
|
4590
|
+
(current.events.some(
|
|
4591
|
+
(event) => event.type === EVOLUTION_LEDGER_V2_MIGRATION_INTENT,
|
|
4592
|
+
) ||
|
|
4593
|
+
normalizedInputs.some((event) =>
|
|
4594
|
+
[
|
|
4595
|
+
EVOLUTION_LEDGER_V2_MIGRATION_INTENT,
|
|
4596
|
+
EVOLUTION_LEDGER_V2_CUTOVER_COMPLETED,
|
|
4597
|
+
].includes(event.type),
|
|
4598
|
+
))
|
|
4599
|
+
) {
|
|
4600
|
+
throw ledgerError(
|
|
4601
|
+
"CC_EVOLUTION_LEDGER_V2_REQUIRED",
|
|
4602
|
+
"ledger writes require the authenticated v2 cutover composition",
|
|
4603
|
+
);
|
|
4604
|
+
}
|
|
4560
4605
|
const eventIds = new Set(current.events.map((event) => event.eventId));
|
|
4561
4606
|
for (const normalized of normalizedInputs) {
|
|
4562
4607
|
if (eventIds.has(normalized.eventId)) {
|
|
@@ -5209,6 +5254,17 @@ export class EvolutionLedger {
|
|
|
5209
5254
|
}
|
|
5210
5255
|
}
|
|
5211
5256
|
|
|
5257
|
+
// Trusted composition port; consumers receive the journal wrapper, never this
|
|
5258
|
+
// capability. WeakMap identity excludes structural or prototype impersonation.
|
|
5259
|
+
export function captureEvolutionLedgerMigrationSource(ledger) {
|
|
5260
|
+
const source = MIGRATION_SOURCES.get(ledger);
|
|
5261
|
+
if (!source)
|
|
5262
|
+
throw new TypeError(
|
|
5263
|
+
"a constructed EvolutionLedger migration source is required",
|
|
5264
|
+
);
|
|
5265
|
+
return source;
|
|
5266
|
+
}
|
|
5267
|
+
|
|
5212
5268
|
function artifactRefsForAudit(input) {
|
|
5213
5269
|
const refs = Object.hasOwn(input, "subjectRef")
|
|
5214
5270
|
? [input.subjectRef, ...input.sourceRefs]
|
|
@@ -19,6 +19,7 @@ export const EVOLUTION_RUN_LEDGER_CORRUPT_CODE =
|
|
|
19
19
|
|
|
20
20
|
const ARTIFACT_TYPE = "evolution-run-event";
|
|
21
21
|
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
22
|
+
const EVIDENCE_READERS = new WeakMap();
|
|
22
23
|
const EVENT_KEYS = new Set([
|
|
23
24
|
"schema",
|
|
24
25
|
"tenantId",
|
|
@@ -71,6 +72,14 @@ function clone(value) {
|
|
|
71
72
|
return JSON.parse(canonical(value));
|
|
72
73
|
}
|
|
73
74
|
|
|
75
|
+
function freeze(value) {
|
|
76
|
+
if (value && typeof value === "object" && !Object.isFrozen(value)) {
|
|
77
|
+
Object.values(value).forEach(freeze);
|
|
78
|
+
Object.freeze(value);
|
|
79
|
+
}
|
|
80
|
+
return value;
|
|
81
|
+
}
|
|
82
|
+
|
|
74
83
|
function same(left, right) {
|
|
75
84
|
return canonical(left) === canonical(right);
|
|
76
85
|
}
|
|
@@ -169,6 +178,82 @@ export class EvolutionRunLedgerAdapter {
|
|
|
169
178
|
throw new TypeError("now must be a function");
|
|
170
179
|
this._resolve = ledgerArtifactResolver;
|
|
171
180
|
this._now = now;
|
|
181
|
+
const load = this.load.bind(this);
|
|
182
|
+
const verify = this._verify;
|
|
183
|
+
const checkpoints = new WeakSet();
|
|
184
|
+
const frontier = () => {
|
|
185
|
+
// verifiedAt describes this observation, not a ledger mutation.
|
|
186
|
+
const { verifiedAt: _observedAt, ...identity } = clone(verify());
|
|
187
|
+
return identity;
|
|
188
|
+
};
|
|
189
|
+
const snapshot = () => {
|
|
190
|
+
const before = frontier();
|
|
191
|
+
const loaded = load();
|
|
192
|
+
const after = frontier();
|
|
193
|
+
if (!same(before, after)) {
|
|
194
|
+
fail(
|
|
195
|
+
EVOLUTION_RUN_LEDGER_CONFLICT_CODE,
|
|
196
|
+
"Run changed during evidence lookup",
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
if (loaded.projection?.status !== "completed") {
|
|
200
|
+
fail(
|
|
201
|
+
EVOLUTION_RUN_LEDGER_CORRUPT_CODE,
|
|
202
|
+
"Wiki evidence requires a completed Run",
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
return { loaded, ledgerHead: after };
|
|
206
|
+
};
|
|
207
|
+
// Preserve the legacy subclass API, but only the exact implementation may
|
|
208
|
+
// mint the new evidence membership capability. A subclass can override
|
|
209
|
+
// load/_entries and must never turn those overrides into signed membership.
|
|
210
|
+
if (Object.getPrototypeOf(this) === EvolutionRunLedgerAdapter.prototype)
|
|
211
|
+
EVIDENCE_READERS.set(
|
|
212
|
+
this,
|
|
213
|
+
Object.freeze({
|
|
214
|
+
descriptor: this.descriptor,
|
|
215
|
+
readEvidence(evidenceId) {
|
|
216
|
+
requiredString(evidenceId, "evidenceId");
|
|
217
|
+
const { loaded, ledgerHead } = snapshot();
|
|
218
|
+
const matches = loaded.events.filter(
|
|
219
|
+
(event) =>
|
|
220
|
+
event.type === EVENT_TYPES.RAW_EVENT_REFERENCED &&
|
|
221
|
+
event.subjectId === evidenceId,
|
|
222
|
+
);
|
|
223
|
+
if (matches.length !== 1) {
|
|
224
|
+
fail(
|
|
225
|
+
EVOLUTION_RUN_LEDGER_CORRUPT_CODE,
|
|
226
|
+
"Run evidence is missing or ambiguous",
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
const checkpoint = freeze({
|
|
230
|
+
event: clone(matches[0]),
|
|
231
|
+
ledgerHead,
|
|
232
|
+
projectionDigest: loaded.projection.projectionDigest,
|
|
233
|
+
});
|
|
234
|
+
checkpoints.add(checkpoint);
|
|
235
|
+
return checkpoint;
|
|
236
|
+
},
|
|
237
|
+
assertCurrent(expected) {
|
|
238
|
+
if (!checkpoints.has(expected)) {
|
|
239
|
+
fail(
|
|
240
|
+
EVOLUTION_RUN_LEDGER_CORRUPT_CODE,
|
|
241
|
+
"Run evidence checkpoint is not authentic",
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
const { loaded, ledgerHead } = snapshot();
|
|
245
|
+
if (
|
|
246
|
+
!same(ledgerHead, expected.ledgerHead) ||
|
|
247
|
+
loaded.projection.projectionDigest !== expected.projectionDigest
|
|
248
|
+
) {
|
|
249
|
+
fail(
|
|
250
|
+
EVOLUTION_RUN_LEDGER_CONFLICT_CODE,
|
|
251
|
+
"Run evidence frontier changed before release",
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
},
|
|
255
|
+
}),
|
|
256
|
+
);
|
|
172
257
|
Object.freeze(this);
|
|
173
258
|
}
|
|
174
259
|
|
|
@@ -407,3 +492,11 @@ export class EvolutionRunLedgerAdapter {
|
|
|
407
492
|
});
|
|
408
493
|
}
|
|
409
494
|
}
|
|
495
|
+
|
|
496
|
+
/** Read-only capability registered only by the real Run adapter constructor. */
|
|
497
|
+
export function captureEvolutionRunEvidenceReader(adapter) {
|
|
498
|
+
const reader = EVIDENCE_READERS.get(adapter);
|
|
499
|
+
if (!reader)
|
|
500
|
+
throw new TypeError("a real EvolutionRunLedgerAdapter is required");
|
|
501
|
+
return reader;
|
|
502
|
+
}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { types as utilTypes } from "node:util";
|
|
3
|
+
import { EvolutionEvidenceArtifactAdapter } from "./evolution-evidence-artifact-adapter.js";
|
|
4
|
+
import { EvolutionEvidenceReader } from "./evolution-evidence-projector.js";
|
|
5
|
+
import { captureEvolutionRunEvidenceReader } from "./evolution-run-ledger-adapter.js";
|
|
6
|
+
import { WIKI_EVIDENCE_SCHEMA } from "./evidence-backed-wiki-maintainer.js";
|
|
7
|
+
|
|
8
|
+
export const EVOLUTION_RUN_WIKI_EVIDENCE_DENIED_CODE =
|
|
9
|
+
"CC_EVOLUTION_RUN_WIKI_EVIDENCE_DENIED";
|
|
10
|
+
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
11
|
+
const KINDS = Object.freeze({
|
|
12
|
+
"tool-observation": "tool-observation",
|
|
13
|
+
"verified-outcome": "grader-receipt",
|
|
14
|
+
});
|
|
15
|
+
const FORBIDDEN = new Set([
|
|
16
|
+
"content",
|
|
17
|
+
"output",
|
|
18
|
+
"payload",
|
|
19
|
+
"prompt",
|
|
20
|
+
"secret",
|
|
21
|
+
"token",
|
|
22
|
+
"__proto__",
|
|
23
|
+
"constructor",
|
|
24
|
+
"prototype",
|
|
25
|
+
]);
|
|
26
|
+
const RESERVED = new Set([
|
|
27
|
+
"sourceCommitment",
|
|
28
|
+
"rawRecordDigest",
|
|
29
|
+
"manifestDigest",
|
|
30
|
+
"projectionReceiptDigest",
|
|
31
|
+
"schemaDigest",
|
|
32
|
+
]);
|
|
33
|
+
|
|
34
|
+
function denied(message) {
|
|
35
|
+
const error = new Error(message);
|
|
36
|
+
error.code = EVOLUTION_RUN_WIKI_EVIDENCE_DENIED_CODE;
|
|
37
|
+
return error;
|
|
38
|
+
}
|
|
39
|
+
function canonical(value) {
|
|
40
|
+
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
41
|
+
if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
|
|
42
|
+
return `{${Object.keys(value)
|
|
43
|
+
.sort()
|
|
44
|
+
.map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
|
|
45
|
+
.join(",")}}`;
|
|
46
|
+
}
|
|
47
|
+
function hash(value) {
|
|
48
|
+
return `sha256:${createHash("sha256").update(canonical(value)).digest("hex")}`;
|
|
49
|
+
}
|
|
50
|
+
function freeze(value) {
|
|
51
|
+
if (value && typeof value === "object" && !Object.isFrozen(value)) {
|
|
52
|
+
Object.values(value).forEach(freeze);
|
|
53
|
+
Object.freeze(value);
|
|
54
|
+
}
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
function record(value, label) {
|
|
58
|
+
if (
|
|
59
|
+
!value ||
|
|
60
|
+
utilTypes.isProxy(value) ||
|
|
61
|
+
Array.isArray(value) ||
|
|
62
|
+
![Object.prototype, null].includes(Object.getPrototypeOf(value))
|
|
63
|
+
)
|
|
64
|
+
throw denied(`${label} must be plain data`);
|
|
65
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
66
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
67
|
+
if (
|
|
68
|
+
typeof key !== "string" ||
|
|
69
|
+
!descriptor?.enumerable ||
|
|
70
|
+
!("value" in descriptor)
|
|
71
|
+
)
|
|
72
|
+
throw denied(`${label} must contain data fields`);
|
|
73
|
+
}
|
|
74
|
+
return value;
|
|
75
|
+
}
|
|
76
|
+
function metadata(value, depth = 0) {
|
|
77
|
+
if (depth > 8) throw denied("Wiki evidence metadata is too deep");
|
|
78
|
+
if (
|
|
79
|
+
value === null ||
|
|
80
|
+
typeof value === "boolean" ||
|
|
81
|
+
typeof value === "string" ||
|
|
82
|
+
(typeof value === "number" && Number.isFinite(value))
|
|
83
|
+
)
|
|
84
|
+
return value;
|
|
85
|
+
if (Array.isArray(value)) {
|
|
86
|
+
denseArray(value, 64);
|
|
87
|
+
return value.map((entry) => metadata(entry, depth + 1));
|
|
88
|
+
}
|
|
89
|
+
record(value, "Wiki evidence metadata");
|
|
90
|
+
return Object.fromEntries(
|
|
91
|
+
Object.entries(value).map(([key, child]) => {
|
|
92
|
+
if (FORBIDDEN.has(key.toLowerCase()))
|
|
93
|
+
throw denied("Wiki evidence contains forbidden metadata fields");
|
|
94
|
+
return [key, metadata(child, depth + 1)];
|
|
95
|
+
}),
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
function denseArray(value, max) {
|
|
99
|
+
if (
|
|
100
|
+
utilTypes.isProxy(value) ||
|
|
101
|
+
!Array.isArray(value) ||
|
|
102
|
+
Object.getPrototypeOf(value) !== Array.prototype ||
|
|
103
|
+
value.length > max ||
|
|
104
|
+
Reflect.ownKeys(value).length !== value.length + 1
|
|
105
|
+
)
|
|
106
|
+
throw denied("Wiki metadata arrays must be bounded plain data");
|
|
107
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
108
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
|
|
109
|
+
if (!descriptor?.enumerable || !("value" in descriptor))
|
|
110
|
+
throw denied("Wiki metadata arrays must be dense data");
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Host configuration, never per-request trust claims. Only a captured real Run
|
|
116
|
+
* capability can select evidence; both downstream calls use production private
|
|
117
|
+
* state, so instance-shaped facades cannot supply bundles or read decisions.
|
|
118
|
+
*/
|
|
119
|
+
export function createEvolutionRunWikiEvidenceResolver({
|
|
120
|
+
runAdapter,
|
|
121
|
+
evidenceAdapter,
|
|
122
|
+
evidenceReader,
|
|
123
|
+
principalEnvelope,
|
|
124
|
+
schemaPolicies,
|
|
125
|
+
} = {}) {
|
|
126
|
+
const run = captureEvolutionRunEvidenceReader(runAdapter);
|
|
127
|
+
if (
|
|
128
|
+
utilTypes.isProxy(evidenceAdapter) ||
|
|
129
|
+
Object.getPrototypeOf(evidenceAdapter ?? {}) !==
|
|
130
|
+
EvolutionEvidenceArtifactAdapter.prototype ||
|
|
131
|
+
utilTypes.isProxy(evidenceReader) ||
|
|
132
|
+
Object.getPrototypeOf(evidenceReader ?? {}) !==
|
|
133
|
+
EvolutionEvidenceReader.prototype
|
|
134
|
+
) {
|
|
135
|
+
throw new TypeError(
|
|
136
|
+
"real evidence adapter and trusted reader are required",
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
if (
|
|
140
|
+
typeof principalEnvelope !== "string" ||
|
|
141
|
+
!principalEnvelope ||
|
|
142
|
+
principalEnvelope.length > 8192
|
|
143
|
+
) {
|
|
144
|
+
throw new TypeError("Wiki reader principal envelope is required");
|
|
145
|
+
}
|
|
146
|
+
record(schemaPolicies, "Wiki schema policies");
|
|
147
|
+
const policies = new Map();
|
|
148
|
+
for (const [schemaDigest, input] of Object.entries(schemaPolicies)) {
|
|
149
|
+
record(input, "Wiki schema policy");
|
|
150
|
+
denseArray(input.metadataKeys, 32);
|
|
151
|
+
if (
|
|
152
|
+
!DIGEST.test(schemaDigest) ||
|
|
153
|
+
Object.keys(input).sort().join(",") !== "metadataKeys,sourceKind" ||
|
|
154
|
+
!Object.hasOwn(KINDS, input.sourceKind) ||
|
|
155
|
+
!Array.isArray(input.metadataKeys) ||
|
|
156
|
+
!input.metadataKeys.length ||
|
|
157
|
+
input.metadataKeys.length > 32 ||
|
|
158
|
+
input.metadataKeys.some(
|
|
159
|
+
(key) =>
|
|
160
|
+
typeof key !== "string" ||
|
|
161
|
+
!/^[a-zA-Z][a-zA-Z0-9_]{0,63}$/u.test(key) ||
|
|
162
|
+
FORBIDDEN.has(key.toLowerCase()) ||
|
|
163
|
+
RESERVED.has(key),
|
|
164
|
+
) ||
|
|
165
|
+
new Set(input.metadataKeys).size !== input.metadataKeys.length
|
|
166
|
+
) {
|
|
167
|
+
throw denied("Wiki schema policy is invalid");
|
|
168
|
+
}
|
|
169
|
+
policies.set(
|
|
170
|
+
schemaDigest,
|
|
171
|
+
freeze({
|
|
172
|
+
sourceKind: input.sourceKind,
|
|
173
|
+
metadataKeys: [...input.metadataKeys],
|
|
174
|
+
}),
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
if (!policies.size || policies.size > 32)
|
|
178
|
+
throw denied("Wiki schema policy set must be bounded and nonempty");
|
|
179
|
+
const resolve = EvolutionEvidenceArtifactAdapter.prototype.resolveRunEvidence;
|
|
180
|
+
const readTrusted = EvolutionEvidenceReader.prototype.readTrusted;
|
|
181
|
+
const tenantId = run.descriptor.tenantId;
|
|
182
|
+
return Object.freeze({
|
|
183
|
+
tenantId,
|
|
184
|
+
async resolveEvidence(evidenceId) {
|
|
185
|
+
const checkpoint = run.readEvidence(evidenceId);
|
|
186
|
+
const event = checkpoint.event;
|
|
187
|
+
if (event.tenantId !== tenantId || event.runId !== run.descriptor.runId)
|
|
188
|
+
throw denied("Wiki evidence belongs to another Run");
|
|
189
|
+
const resolved = await Reflect.apply(resolve, evidenceAdapter, [
|
|
190
|
+
{
|
|
191
|
+
event,
|
|
192
|
+
ledgerId: checkpoint.ledgerHead.ledgerId,
|
|
193
|
+
epoch: checkpoint.ledgerHead.epoch,
|
|
194
|
+
},
|
|
195
|
+
]);
|
|
196
|
+
const { bundle } = resolved;
|
|
197
|
+
const raw = bundle.rawRecord;
|
|
198
|
+
const trusted = await Reflect.apply(readTrusted, evidenceReader, [
|
|
199
|
+
bundle,
|
|
200
|
+
principalEnvelope,
|
|
201
|
+
"wiki-maintenance",
|
|
202
|
+
]);
|
|
203
|
+
const policy = policies.get(raw.schemaDigest);
|
|
204
|
+
if (
|
|
205
|
+
raw.tenantId !== tenantId ||
|
|
206
|
+
raw.evidenceId !== evidenceId ||
|
|
207
|
+
trusted.tenantId !== tenantId ||
|
|
208
|
+
trusted.evidenceId !== evidenceId ||
|
|
209
|
+
resolved.verification.verified !== true ||
|
|
210
|
+
trusted.status !== "trusted" ||
|
|
211
|
+
!raw.authenticated ||
|
|
212
|
+
raw.trust !== "trusted" ||
|
|
213
|
+
!raw.compilable ||
|
|
214
|
+
!policy ||
|
|
215
|
+
policy.sourceKind !== raw.sourceKind ||
|
|
216
|
+
!Object.hasOwn(KINDS, raw.sourceKind)
|
|
217
|
+
) {
|
|
218
|
+
throw denied(
|
|
219
|
+
"Wiki evidence has no admitted authenticated source schema",
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
const content = record(trusted.content, "trusted Wiki metadata");
|
|
223
|
+
if (
|
|
224
|
+
Object.keys(content).some((key) => !policy.metadataKeys.includes(key))
|
|
225
|
+
)
|
|
226
|
+
throw denied("trusted Wiki metadata exceeds its schema allowlist");
|
|
227
|
+
const data = metadata(content);
|
|
228
|
+
if (Buffer.byteLength(canonical(data), "utf8") > 16_384)
|
|
229
|
+
throw denied("trusted Wiki metadata exceeds its budget");
|
|
230
|
+
const core = {
|
|
231
|
+
schema: WIKI_EVIDENCE_SCHEMA,
|
|
232
|
+
tenantId,
|
|
233
|
+
ref: evidenceId,
|
|
234
|
+
sourceDigest: hash({
|
|
235
|
+
domain: "chainlesschain.wiki-source-commitment/v1",
|
|
236
|
+
tenantId,
|
|
237
|
+
sourceCommitment: raw.sourceCommitment,
|
|
238
|
+
}),
|
|
239
|
+
projectionDigest: trusted.projectionDigest,
|
|
240
|
+
artifactRef: event.artifactRef,
|
|
241
|
+
trustedProjection: true,
|
|
242
|
+
trustDomain: `evolution-principal:${tenantId}:${raw.principalId}`,
|
|
243
|
+
kind: KINDS[raw.sourceKind],
|
|
244
|
+
status: "active",
|
|
245
|
+
observedAt: bundle.receipt.createdAt,
|
|
246
|
+
expiresAt: raw.retention.expiresAt,
|
|
247
|
+
data: {
|
|
248
|
+
...data,
|
|
249
|
+
rawRecordDigest: raw.rawRecordDigest,
|
|
250
|
+
manifestDigest: event.payloadDigest,
|
|
251
|
+
projectionReceiptDigest: bundle.receipt.receiptDigest,
|
|
252
|
+
schemaDigest: raw.schemaDigest,
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
run.assertCurrent(checkpoint);
|
|
256
|
+
return freeze({ ...core, envelopeDigest: hash(core) });
|
|
257
|
+
},
|
|
258
|
+
});
|
|
259
|
+
}
|