chainlesschain 0.166.46 → 0.166.48
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 +4 -2
- package/src/assets/web-panel/assets/{AIOps-Cp8KiMmv.js → AIOps-BLGEffkh.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-B4d9BGsm.js → ActionButton-Cz1z2VGD.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Cf9yXTkv.js → Analytics-C3j9cf6q.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-40UkmxtP.js → AppLayout-BR9ERuCA.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-Ckkb4oOA.js → Artifacts-CozJCm4y.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Dnf569k5.js → Audit-DC5g9Ra2.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CA6bLem4.js → BackgroundAgents-B1zrQ0dW.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-ChQU0I_Q.js → Backup-ChVnfjpm.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BHeZXnNN.js → BaseInput-8_vLQsLf.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DcFVYB2E.js → Chat-Dct9bm6L.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-BvoSsCKh.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-2PDbejv2.js → Checkbox-DZQIsCIC.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DJBn1RAu.js → Codegen-CdzHxmnq.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CPRq7n6y.js → Col-DdAN8LeW.js} +1 -1
- package/src/assets/web-panel/assets/{Community-axvINFMi.js → Community-CNgjT9MA.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-_OX4Qbe0.js → Compact-BtQiX6G-.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DWAkvzRL.js → Compliance-OGX5ma3j.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CUIJ25oj.js → Cowork-CgugQnGM.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-nR0m7H3_.js → Cron-Bpg7cPFD.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CgTLXzh_.js → Crosschain-D1hsuswf.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BllzRB6Q.js → DID-miDRsMBw.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-C9f0IIBN.js → Dashboard-CGcl8htP.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BkahetiO.js → Dropdown-BFaxTdVE.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-rartVC-k.js → EmailListRenderer-BQdGLZIO.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-BqpG3XHV.js → EvolutionSettings-bMvgBk6r.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DgUdFvw1.js → FamilyGuardDashboard-c1WVC_--.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-oFpIQU6g.js → Federation-DyAcFrQY.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BUH5xlyP.js → FormItemContext-CfwpfD2B.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-ilRa-ueg.js → GenericCardRenderer-DkJcbBpS.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DlHHSF8j.js → Git-DgYIrPJh.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-yQiiXIWe.js → Governance-BF1tYPJ6.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BUDRVGOP.js → Inference-BFkwRIrU.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-BaGyIoN1.js → KnowledgeGraph-DpCoqhBa.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-C1cO6zE0.js → Logs-DU2qAJmD.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-_z_Iaoes.js → MarkdownRenderer-QWv7UJLq.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-CM8cGL0K.js → Marketplace-Dz9NUrfo.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CDqAMU0U.js → McpTools-B67I3d5v.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CfB0-Ofv.js → Memory-crkElJSy.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BL18ytvB.js → MobileBridge-BO20VbdX.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-PIyyxbuJ.js → MobileProjects-Ba-3gZZd.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BTTrFCol.js → Mtc-BAHZM084.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-JHZn037c.js → MtcAudit-CL3DzajL.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-CMf9NEdB.js → Multisig-BSWWzvWH.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Dhk3qaus.js → NLProgramming-fnxqXM_3.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-6F8EarNN.js → Notes-qUZPIQXT.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-gxdaVEit.js → NotificationSettings-x9Xrixqu.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-gVgXQWdc.js → OrderTableRenderer-BtMtQUt7.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CzvHcDNO.js → Organization-C946Hzna.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Dclx30Vv.js → Overflow-BYf8KIts.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CM0Wm9vZ.js → P2P-Cbqf5dnv.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-rmxp0cuF.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-B_oATenG.js → Permissions-CZBw45EW.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-CptiVBh5.js → PersonalDataHub-BKwUAt43.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-DkHzgyyI.js → Pipeline-DmFD2QW4.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DzZvwcKh.js → Privacy-KpuwWvt5.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CzkCs-5G.js → ProjectInit-Bt8UheX6.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BB8dcxRD.js → ProjectSettings-2ZeAn9CP.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-B7PW9CFY.js → Projects-zBuet8Zs.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-Tfx-ti1V.js → Providers-DcEAnw6L.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-EvWlNhfX.js → QrScannerModal-qF7liYG9.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CUspgbNC.js → QuickAsk-qiESlVBJ.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-COY2g77J.js → Recommend-Bk-cQyi9.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BzMBU6E6.js → RemoteSession-CwrekErS.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-RtYRF4YP.js → Reputation-Bmw_UQtW.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Bva3l9Lc.js → Row-CPdqZIUX.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BhjzLvW3.js → RssFeed-D_W-xxvS.js} +2 -2
- package/src/assets/web-panel/assets/{Search-BYzT2PTR.js → Search-Hu0oDFj_.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Bcl4-KTv.js → Security-DeRxUwmq.js} +3 -3
- package/src/assets/web-panel/assets/{Services-BRRa4A0f.js → Services-CsNmHFkf.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DYQ016qy.js → Skeleton-gv_Vz0tN.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CAUKL9JA.js → Skills-Dgg-_rCB.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BTyUqfuD.js → Sla-Bpu-bsEJ.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CUjMihrs.js → SpeechSettings-CrhleHuF.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CvfOSupr.js → SyncSettings-JHjUN6I9.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-EvjNXrWH.js → Tasks-DKRWKkl9.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-wPAp0EoM.js → Templates-leiWntLq.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CP0D-q9Q.js → Tenant--1bYulvn.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CQ0f2iFg.js → Terminal-C0y6FvSS.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-D3JrGSPb.js → TimelineRenderer-CQK4PVv4.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-yXf2PPp9.js → Tokens-DbIvF-DV.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DfmMOoZ2.js → Trigger-CkXJ2vuq.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BTCyMgf1.js → Trust-B02WXJPw.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DKCwIBHi.js → UkeySign-VPMkfzmw.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CQpDSzLO.js → VideoEditing-C5ezUnah.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CyFrzC3K.js → Wallet-CYfvYRrY.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-D6Nr_1kd.js → WebAuthn-DtKl-kpr.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-CgR9tNrB.js → WorkflowEditor-DACITF-u.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CRG_IeyP.js → chat-qnygfnLi.js} +1 -1
- package/src/assets/web-panel/assets/{colors-MdE3TStI.js → colors-D4mISLBD.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-B0LRuiNV.js → compact-item-BBPfxYGL.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-B_V5fjcX.js → createContext-Byx4ndHp.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DBy6gsuI.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DSL-c_hr.js → hasIn-CGjLkkn3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DE7bSYmW.js → index-B8UpadHC.js} +1 -1
- package/src/assets/web-panel/assets/{index-BD0w-888.js → index-B9jH-h4X.js} +1 -1
- package/src/assets/web-panel/assets/{index-BbZZ7P_c.js → index-BN7_TSgU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BIDCNwy6.js → index-BNe2lCk6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkN53KiJ.js → index-B_fHPZ8E.js} +1 -1
- package/src/assets/web-panel/assets/index-BfEDXk_E.js +1 -0
- package/src/assets/web-panel/assets/{index-BsAEd-Do.js → index-BklGH3YI.js} +1 -1
- package/src/assets/web-panel/assets/{index-CS3bOhV7.js → index-BmKYaaGP.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3iW-mhn.js → index-BxQF1wCU.js} +1 -1
- package/src/assets/web-panel/assets/{index-SmQfEHjp.js → index-ByA1NyFP.js} +1 -1
- package/src/assets/web-panel/assets/{index-0200QxC4.js → index-BzeBBAl5.js} +1 -1
- package/src/assets/web-panel/assets/{index-c8OqO3rq.js → index-C3abGsSW.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-aKWR2v.js → index-C9tcHs46.js} +1 -1
- package/src/assets/web-panel/assets/{index-BNhWoD6d.js → index-CD5Btq6p.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVDi4rS9.js → index-CFMWjuav.js} +1 -1
- package/src/assets/web-panel/assets/{index-CEOAZm5j.js → index-CMj8qmpX.js} +1 -1
- package/src/assets/web-panel/assets/{index-C67dPW0L.js → index-CVUJjQAT.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3pJBTvo.js → index-CWhI8G14.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtOTppk8.js → index-CZjNamSU.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRRY44XP.js → index-CmHE-lY_.js} +1 -1
- package/src/assets/web-panel/assets/{index-Tg3yl8wc.js → index-CoA8WsVr.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXMeisJK.js → index-Cpg3AWRy.js} +1 -1
- package/src/assets/web-panel/assets/index-CrxUwNM8.js +1 -0
- package/src/assets/web-panel/assets/{index-Bq8-2Ibv.js → index-CsVuQsY1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHp1nSur.js → index-CydHMjwc.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPYshcic.js → index-DH6iC5b2.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBwBZwio.js → index-DZXhKAk9.js} +1 -1
- package/src/assets/web-panel/assets/{index-Didyuq2Z.js → index-D_g9mA1N.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdHMc9LQ.js → index-DboTeuPF.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5dqieYX.js → index-DfgpKd64.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdplnAS9.js → index-Dmfe0L2Z.js} +1 -1
- package/src/assets/web-panel/assets/{index-KaSejHjf.js → index-Dzni_5Qw.js} +1 -1
- package/src/assets/web-panel/assets/{index-BpwGsAA-.js → index-J5JkStvY.js} +1 -1
- package/src/assets/web-panel/assets/{index-OBhlHSMN.js → index-Ne8UGllV.js} +3 -3
- package/src/assets/web-panel/assets/{index-CZICtYJ0.js → index-O09jXbir.js} +1 -1
- package/src/assets/web-panel/assets/{index-DVgTf7CZ.js → index-Y7el_3WS.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQAsL19t.js → index-c_tBkIlU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMm8tO2X.js → index-lKJWAmd4.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNytQuFq.js → index-xzRKTy0R.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-P8SBN6Di.js → initDefaultProps-XuhfEIhB.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BubbjUT_.js → motion-Cbxh6AxO.js} +1 -1
- package/src/assets/web-panel/assets/{move-Chcykv0I.js → move-C7IEnFly.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DyiYuGDu.js → mtc-parser-lLADx4LL.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Rdwb_Neb.js → omit-mIbic_k-.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CCr0MYHl.js → pickAttrs-_xIYEqu3.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-B1ZXz3bb.js → placementArrow-ClB-E0ny.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BGEdwej6.js → responsiveObserve-D36Bg2ut.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CpnsUMaT.js → slide-CUuO08Bl.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-C7x-TVp_.js → statusUtils-BKahwLbv.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CC5k_791.js → styleChecker-2pT-T8vy.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BpZFKsJW.js → useFlexGapSupport-DyH5g7Rg.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CVq5HySy.js → useFs-CTOauB3X.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BGkdLryu.js → usePersonalDataHub-B02JYIMe.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-uLtOUEK-.js → vnode-Do22wQrc.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BfVC9iUs.js → zoom-BfnL7rit.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 +8 -0
- 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 +161 -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 +48 -1
- 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-list-index.js +222 -0
- package/src/lib/background-agent-supervisor.js +232 -47
- package/src/lib/codex-app-server-adapter.js +82 -27
- package/src/lib/context-memory-kernel/durable-memory-port.js +31 -8
- package/src/lib/context-memory-kernel/provider-context.js +118 -19
- package/src/lib/deferred-question-context.js +278 -0
- package/src/lib/eval/evidence.js +202 -64
- package/src/lib/eval/plugin-suite.js +1181 -0
- package/src/lib/eval/runner.js +10 -3
- 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 +87 -3
- 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/session-host-snapshot.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 +5 -1
- package/src/runtime/agent-core.js +348 -23
- 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 +283 -45
- 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/ChatBubbleRenderer-Bi2SY9E_.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-fYmQzmTA.js +0 -7
- package/src/assets/web-panel/assets/devWarning-BtFLt3qI.js +0 -1
- package/src/assets/web-panel/assets/index-BhuWQHeG.js +0 -1
- package/src/assets/web-panel/assets/index-D-4tFek3.js +0 -1
|
@@ -11,6 +11,8 @@ export const EVOLUTION_LEDGER_MANIFEST_CHAIN_SCHEMA =
|
|
|
11
11
|
"chainlesschain.evolution-ledger-manifest-chain/v2";
|
|
12
12
|
export const EVOLUTION_LEDGER_SEGMENT_PAYLOAD_SCHEMA =
|
|
13
13
|
"chainlesschain.evolution-ledger-segment-payload/v2";
|
|
14
|
+
export const EVOLUTION_LEDGER_EVENT_PAYLOAD_SCHEMA =
|
|
15
|
+
"chainlesschain.evolution-ledger-event-payload/v2";
|
|
14
16
|
export const EVOLUTION_LEDGER_SEGMENT_MANIFEST_SCHEMA =
|
|
15
17
|
"chainlesschain.evolution-ledger-segment-manifest/v2";
|
|
16
18
|
export const EVOLUTION_LEDGER_MANIFEST_HEAD_SCHEMA =
|
|
@@ -336,8 +338,163 @@ function payload(sequenceStart, eventDigests) {
|
|
|
336
338
|
});
|
|
337
339
|
}
|
|
338
340
|
|
|
341
|
+
// Snapshot only bounded canonical JSON. Do not invoke getters, toJSON or Proxy
|
|
342
|
+
// traps while capturing signed event bytes supplied to the storage boundary.
|
|
343
|
+
function snapshotEvent(
|
|
344
|
+
value,
|
|
345
|
+
depth = 0,
|
|
346
|
+
seen = new Set(),
|
|
347
|
+
budget = { bytes: 64 * 1024 * 1024, nodes: 1_000_000 },
|
|
348
|
+
) {
|
|
349
|
+
rejectProxy(value, "event payload");
|
|
350
|
+
budget.bytes -=
|
|
351
|
+
typeof value === "string" ? Buffer.byteLength(value, "utf8") : 8;
|
|
352
|
+
if (--budget.nodes < 0 || budget.bytes < 0)
|
|
353
|
+
throw failure(
|
|
354
|
+
EVOLUTION_LEDGER_MANIFEST_INVALID_CODE,
|
|
355
|
+
"event payload exceeds bounded capacity",
|
|
356
|
+
);
|
|
357
|
+
if (depth > 32 || seen.has(value))
|
|
358
|
+
throw failure(
|
|
359
|
+
EVOLUTION_LEDGER_MANIFEST_INVALID_CODE,
|
|
360
|
+
"event payload is cyclic or too deep",
|
|
361
|
+
);
|
|
362
|
+
if (value === null || typeof value === "string" || typeof value === "boolean")
|
|
363
|
+
return value;
|
|
364
|
+
if (typeof value === "number" && Number.isFinite(value)) return value;
|
|
365
|
+
if (
|
|
366
|
+
!value ||
|
|
367
|
+
typeof value !== "object" ||
|
|
368
|
+
![Array.isArray(value) ? Array.prototype : Object.prototype, null].includes(
|
|
369
|
+
Object.getPrototypeOf(value),
|
|
370
|
+
)
|
|
371
|
+
)
|
|
372
|
+
throw failure(
|
|
373
|
+
EVOLUTION_LEDGER_MANIFEST_INVALID_CODE,
|
|
374
|
+
"event payload must be JSON data",
|
|
375
|
+
);
|
|
376
|
+
seen.add(value);
|
|
377
|
+
const array = Array.isArray(value);
|
|
378
|
+
const result = array ? [] : Object.create(null);
|
|
379
|
+
const keys = Reflect.ownKeys(value).filter(
|
|
380
|
+
(key) => !(array && key === "length"),
|
|
381
|
+
);
|
|
382
|
+
if (array && keys.length !== value.length)
|
|
383
|
+
throw failure(
|
|
384
|
+
EVOLUTION_LEDGER_MANIFEST_INVALID_CODE,
|
|
385
|
+
"event payload array must be dense",
|
|
386
|
+
);
|
|
387
|
+
for (const key of keys) {
|
|
388
|
+
const property = Object.getOwnPropertyDescriptor(value, key);
|
|
389
|
+
if (
|
|
390
|
+
typeof key !== "string" ||
|
|
391
|
+
!property.enumerable ||
|
|
392
|
+
!("value" in property) ||
|
|
393
|
+
(array &&
|
|
394
|
+
(!/^(0|[1-9][0-9]*)$/u.test(key) || Number(key) >= value.length))
|
|
395
|
+
)
|
|
396
|
+
throw failure(
|
|
397
|
+
EVOLUTION_LEDGER_MANIFEST_INVALID_CODE,
|
|
398
|
+
"event payload must contain own data properties",
|
|
399
|
+
);
|
|
400
|
+
budget.bytes -= Buffer.byteLength(key, "utf8");
|
|
401
|
+
result[key] = snapshotEvent(property.value, depth + 1, seen, budget);
|
|
402
|
+
}
|
|
403
|
+
seen.delete(value);
|
|
404
|
+
return Object.freeze(result);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
function eventPayload(sequenceStart, input, expected = {}) {
|
|
408
|
+
rejectProxy(input, "event payload");
|
|
409
|
+
if (
|
|
410
|
+
!Array.isArray(input) ||
|
|
411
|
+
input.length < 1 ||
|
|
412
|
+
input.length > MAX_EVENTS_PER_SEGMENT
|
|
413
|
+
)
|
|
414
|
+
throw failure(
|
|
415
|
+
EVOLUTION_LEDGER_MANIFEST_INVALID_CODE,
|
|
416
|
+
"event payload count is invalid",
|
|
417
|
+
);
|
|
418
|
+
const events = snapshotEvent(input);
|
|
419
|
+
if (
|
|
420
|
+
!Array.isArray(events) ||
|
|
421
|
+
events.length < 1 ||
|
|
422
|
+
events.length > MAX_EVENTS_PER_SEGMENT
|
|
423
|
+
)
|
|
424
|
+
throw failure(
|
|
425
|
+
EVOLUTION_LEDGER_MANIFEST_INVALID_CODE,
|
|
426
|
+
"event payload count is invalid",
|
|
427
|
+
);
|
|
428
|
+
let previous = expected.previousDigest;
|
|
429
|
+
for (const [index, event] of events.entries()) {
|
|
430
|
+
if (
|
|
431
|
+
!event ||
|
|
432
|
+
![
|
|
433
|
+
"chainlesschain.evolution-event/v2",
|
|
434
|
+
"chainlesschain.evolution-domain-event/v1",
|
|
435
|
+
].includes(event.schema)
|
|
436
|
+
)
|
|
437
|
+
throw failure(
|
|
438
|
+
EVOLUTION_LEDGER_MANIFEST_CORRUPT_CODE,
|
|
439
|
+
"event payload schema is invalid",
|
|
440
|
+
);
|
|
441
|
+
const { eventDigest, signature, ...core } = event;
|
|
442
|
+
const signatureFields = exactRecord(
|
|
443
|
+
signature,
|
|
444
|
+
new Set(["algorithm", "keyId", "trustPolicyDigest", "value"]),
|
|
445
|
+
"event payload signature",
|
|
446
|
+
EVOLUTION_LEDGER_MANIFEST_CORRUPT_CODE,
|
|
447
|
+
);
|
|
448
|
+
if (
|
|
449
|
+
["algorithm", "keyId", "trustPolicyDigest"].some(
|
|
450
|
+
(field) => data(signatureFields, field) !== event[field],
|
|
451
|
+
) ||
|
|
452
|
+
typeof signature.value !== "string" ||
|
|
453
|
+
signature.value.length < 1 ||
|
|
454
|
+
signature.value.length > 16_384
|
|
455
|
+
)
|
|
456
|
+
throw failure(
|
|
457
|
+
EVOLUTION_LEDGER_MANIFEST_CORRUPT_CODE,
|
|
458
|
+
"event signature binding differs",
|
|
459
|
+
);
|
|
460
|
+
if (
|
|
461
|
+
!signature ||
|
|
462
|
+
event.sequence !== sequenceStart + index ||
|
|
463
|
+
eventDigest !==
|
|
464
|
+
sha256(Buffer.from(`${event.schema}\0${canonical(core)}`, "utf8")) ||
|
|
465
|
+
(previous !== undefined && event.prevDigest !== previous) ||
|
|
466
|
+
(expected.epoch !== undefined && event.epoch !== expected.epoch) ||
|
|
467
|
+
(expected.ledgerId !== undefined &&
|
|
468
|
+
event.ledgerId !== expected.ledgerId) ||
|
|
469
|
+
(expected.tenantId !== undefined && event.tenantId !== expected.tenantId)
|
|
470
|
+
)
|
|
471
|
+
throw failure(
|
|
472
|
+
EVOLUTION_LEDGER_MANIFEST_CORRUPT_CODE,
|
|
473
|
+
"event payload digest, sequence or scope is invalid",
|
|
474
|
+
);
|
|
475
|
+
if (Buffer.byteLength(canonical(event), "utf8") > 1024 * 1024)
|
|
476
|
+
throw failure(
|
|
477
|
+
EVOLUTION_LEDGER_MANIFEST_INVALID_CODE,
|
|
478
|
+
"event payload exceeds the event byte limit",
|
|
479
|
+
);
|
|
480
|
+
previous = eventDigest;
|
|
481
|
+
}
|
|
482
|
+
return Object.freeze({
|
|
483
|
+
events,
|
|
484
|
+
schema: EVOLUTION_LEDGER_EVENT_PAYLOAD_SCHEMA,
|
|
485
|
+
sequenceStart,
|
|
486
|
+
sequenceEnd: sequenceStart + events.length - 1,
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
|
|
339
490
|
function payloadBytes(value) {
|
|
340
|
-
|
|
491
|
+
const bytes = Buffer.from(canonical(value), "utf8");
|
|
492
|
+
if (bytes.length > 64 * 1024 * 1024)
|
|
493
|
+
throw failure(
|
|
494
|
+
EVOLUTION_LEDGER_MANIFEST_INVALID_CODE,
|
|
495
|
+
"event segment exceeds byte capacity",
|
|
496
|
+
);
|
|
497
|
+
return bytes;
|
|
341
498
|
}
|
|
342
499
|
|
|
343
500
|
function parsePayload(bytes, expected) {
|
|
@@ -356,6 +513,28 @@ function parsePayload(bytes, expected) {
|
|
|
356
513
|
"manifest segment payload is not JSON",
|
|
357
514
|
);
|
|
358
515
|
}
|
|
516
|
+
if (raw.schema === EVOLUTION_LEDGER_EVENT_PAYLOAD_SCHEMA) {
|
|
517
|
+
exactRecord(
|
|
518
|
+
raw,
|
|
519
|
+
new Set(["events", "schema", "sequenceStart", "sequenceEnd"]),
|
|
520
|
+
"event segment payload",
|
|
521
|
+
);
|
|
522
|
+
const parsed = eventPayload(expected.sequenceStart, raw.events, expected);
|
|
523
|
+
if (
|
|
524
|
+
!payloadBytes(parsed).equals(bytes) ||
|
|
525
|
+
raw.sequenceEnd !== expected.sequenceEnd
|
|
526
|
+
)
|
|
527
|
+
throw failure(
|
|
528
|
+
EVOLUTION_LEDGER_MANIFEST_CORRUPT_CODE,
|
|
529
|
+
"event segment payload range differs",
|
|
530
|
+
);
|
|
531
|
+
return Object.freeze({
|
|
532
|
+
...parsed,
|
|
533
|
+
eventDigests: Object.freeze(
|
|
534
|
+
parsed.events.map((event) => event.eventDigest),
|
|
535
|
+
),
|
|
536
|
+
});
|
|
537
|
+
}
|
|
359
538
|
const fields = exactRecord(
|
|
360
539
|
raw,
|
|
361
540
|
PAYLOAD_KEYS,
|
|
@@ -798,9 +977,17 @@ export function captureEvolutionLedgerManifestAuthority(value) {
|
|
|
798
977
|
}
|
|
799
978
|
|
|
800
979
|
export function sealEvolutionLedgerManifestSegment(options = undefined) {
|
|
980
|
+
const fullEvents =
|
|
981
|
+
options && !utilTypes.isProxy(options) && Object.hasOwn(options, "events");
|
|
801
982
|
const fields = exactRecord(
|
|
802
983
|
options,
|
|
803
|
-
|
|
984
|
+
fullEvents
|
|
985
|
+
? new Set(
|
|
986
|
+
[...SEAL_CONFIG_KEYS]
|
|
987
|
+
.filter((key) => key !== "eventDigests")
|
|
988
|
+
.concat("events"),
|
|
989
|
+
)
|
|
990
|
+
: SEAL_CONFIG_KEYS,
|
|
804
991
|
"manifest segment seal configuration",
|
|
805
992
|
);
|
|
806
993
|
const descriptorValue = descriptor(data(fields, "descriptor"));
|
|
@@ -818,8 +1005,17 @@ export function sealEvolutionLedgerManifestSegment(options = undefined) {
|
|
|
818
1005
|
descriptorValue,
|
|
819
1006
|
authority,
|
|
820
1007
|
);
|
|
1008
|
+
const sequenceStart = (previous?.sequence || 0) + 1;
|
|
1009
|
+
const fullPayload = fullEvents
|
|
1010
|
+
? eventPayload(sequenceStart, data(fields, "events"), {
|
|
1011
|
+
...descriptorValue,
|
|
1012
|
+
previousDigest: previous?.eventDigest ?? null,
|
|
1013
|
+
})
|
|
1014
|
+
: null;
|
|
821
1015
|
const eventDigests = normalizeDigests(
|
|
822
|
-
|
|
1016
|
+
fullPayload
|
|
1017
|
+
? fullPayload.events.map((event) => event.eventDigest)
|
|
1018
|
+
: data(fields, "eventDigests"),
|
|
823
1019
|
"eventDigests",
|
|
824
1020
|
descriptorValue.maximumEventsPerSegment,
|
|
825
1021
|
);
|
|
@@ -841,8 +1037,7 @@ export function sealEvolutionLedgerManifestSegment(options = undefined) {
|
|
|
841
1037
|
new Date(nowMs).toISOString(),
|
|
842
1038
|
"manifest issuedAt",
|
|
843
1039
|
).value;
|
|
844
|
-
const
|
|
845
|
-
const segmentPayload = payload(sequenceStart, eventDigests);
|
|
1040
|
+
const segmentPayload = fullPayload ?? payload(sequenceStart, eventDigests);
|
|
846
1041
|
let receipt;
|
|
847
1042
|
try {
|
|
848
1043
|
receipt = store.retain({
|
|
@@ -958,7 +1153,7 @@ export function verifyEvolutionLedgerSegmentManifest(options = undefined) {
|
|
|
958
1153
|
);
|
|
959
1154
|
}
|
|
960
1155
|
|
|
961
|
-
|
|
1156
|
+
function verifyChain(options, includeEvents) {
|
|
962
1157
|
const fields = exactRecord(
|
|
963
1158
|
options,
|
|
964
1159
|
VERIFY_CONFIG_KEYS,
|
|
@@ -987,6 +1182,7 @@ export function verifyEvolutionLedgerManifestChain(options = undefined) {
|
|
|
987
1182
|
);
|
|
988
1183
|
}
|
|
989
1184
|
let previous = null;
|
|
1185
|
+
const events = [];
|
|
990
1186
|
for (const rawManifest of manifests) {
|
|
991
1187
|
const manifest = normalizeManifest(rawManifest, descriptorValue, authority);
|
|
992
1188
|
if (
|
|
@@ -1023,7 +1219,18 @@ export function verifyEvolutionLedgerManifestChain(options = undefined) {
|
|
|
1023
1219
|
"manifest segment resolution is not authenticated immutable storage",
|
|
1024
1220
|
);
|
|
1025
1221
|
}
|
|
1026
|
-
const parsed = parsePayload(resolution.bytes,
|
|
1222
|
+
const parsed = parsePayload(resolution.bytes, {
|
|
1223
|
+
...manifest,
|
|
1224
|
+
previousDigest: previous?.eventDigests.at(-1) ?? null,
|
|
1225
|
+
});
|
|
1226
|
+
if (includeEvents) {
|
|
1227
|
+
if (!parsed.events)
|
|
1228
|
+
throw failure(
|
|
1229
|
+
EVOLUTION_LEDGER_MANIFEST_CORRUPT_CODE,
|
|
1230
|
+
"digest-only segments cannot recover event payloads",
|
|
1231
|
+
);
|
|
1232
|
+
events.push(...parsed.events);
|
|
1233
|
+
}
|
|
1027
1234
|
if (canonical(parsed.eventDigests) !== canonical(manifest.eventDigests)) {
|
|
1028
1235
|
throw failure(
|
|
1029
1236
|
EVOLUTION_LEDGER_MANIFEST_CORRUPT_CODE,
|
|
@@ -1049,5 +1256,14 @@ export function verifyEvolutionLedgerManifestChain(options = undefined) {
|
|
|
1049
1256
|
head,
|
|
1050
1257
|
manifestCount: manifests.length,
|
|
1051
1258
|
sequence: head.sequence,
|
|
1259
|
+
...(includeEvents ? { events: Object.freeze(events) } : {}),
|
|
1052
1260
|
});
|
|
1053
1261
|
}
|
|
1262
|
+
|
|
1263
|
+
export function verifyEvolutionLedgerManifestChain(options = undefined) {
|
|
1264
|
+
return verifyChain(options, false);
|
|
1265
|
+
}
|
|
1266
|
+
|
|
1267
|
+
export function readEvolutionLedgerManifestEvents(options = undefined) {
|
|
1268
|
+
return verifyChain(options, true);
|
|
1269
|
+
}
|