chainlesschain 0.166.22 → 0.166.25
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 +46 -3
- package/package.json +4 -3
- package/src/assets/web-panel/assets/{AIOps-oJ7USzMC.js → AIOps-RaxL_QQD.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BlgnZe_C.js → ActionButton-DD3ieFO-.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D2rRbTLu.js → Analytics-CATDJukS.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-FwS3f0B2.js → AppLayout-BHGsnRDS.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-iF-_08Hi.js → Artifacts-BL6NunjN.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-D24p0zQw.js → Audit-D0nEWfbA.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-Cg3mRVi9.js → BackgroundAgents-BAP1MUol.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-EOqht3H-.js → Backup-R4y2OeSi.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-9XWYq2hj.js → BaseInput-ByQZ2z6S.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Dq5yardA.js → Chat-32uV--xF.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-t1enanwz.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-CuyCBoBf.js → Checkbox-D1CB-7bq.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DjWtYHNe.js → Codegen-BPx3dQ2q.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CrVr_iuG.js → Col-DkPTQ2Gl.js} +1 -1
- package/src/assets/web-panel/assets/{Community-C6QxpfGc.js → Community-ZriaxRlr.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-B-v5r6Pa.js → Compact-C_qJ0P7F.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-zNiLiFgD.js → Compliance-Bgoy-saS.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-D9K7lMOu.js → Cowork-B5i9y6XK.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-DAjO36z4.js → Cron-D7vBJ5-J.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Bxqn0aqB.js → Crosschain-D4kvoGI_.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DfRmLUe-.js → DID-BLOeBd-r.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-Cz8KF3fr.js → Dashboard-mecJaonC.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-C4oVfkP0.js → Dropdown-GPKwaFer.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-ivyZKN8k.js → EmailListRenderer-BML9m7Dd.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DoxY1CPW.js → FamilyGuardDashboard-DN5bAtJC.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-C93gZxnb.js → Federation-DmD6Gecd.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-D_lEjYJE.js → FormItemContext-6wwplN_K.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BNFN9YjN.js → GenericCardRenderer-DUhpLkDL.js} +1 -1
- package/src/assets/web-panel/assets/{Git-mUu2HcLI.js → Git-eJfyXkwf.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CNuosrge.js → Governance-swAUW59x.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DwY5pbCB.js → Inference-CbdwJPDJ.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-aRUxhACD.js → KnowledgeGraph-UuYpg1nm.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DFfsWYy_.js → Logs-CS0G057y.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BxIIB4k3.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-COI-ciM-.js → Marketplace-CZRjuvvI.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BJJwaIpe.js → McpTools-BOJ9A_Rf.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CDO6SGDZ.js → Memory-BnkrR-Ok.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BlZ5tFf4.js → MobileBridge-Do4mPi13.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DuoxbgWz.js → MobileProjects-2JxWa6-p.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-6ec9j70b.js → Mtc-CS_mnpGd.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-BuL7HkC7.js → MtcAudit-DZ4J_351.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-CJxR85lk.js → Multisig-Jh74zKXu.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-B71O1S4l.js → NLProgramming-_4n2BfnS.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Bsw5zbpV.js → Notes-CtENcKHv.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BnAhXuK_.js → NotificationSettings-dgDCvpK9.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BJ0R5GGz.js → OrderTableRenderer-D5VxCrmG.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-B7wwNxoP.js → Organization-CpIF8Xkd.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-CfAGr0gM.js → Overflow-aHnBZaez.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-KhMg22Fz.js → P2P-8ppzog2V.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-NdAXI9ft.js → PdhVaultBrowser-D3p1BXkp.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CIYjqyT7.js → Permissions-D7vflD5q.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-D2ht3P_R.js → PersonalDataHub-D2hY-Ek2.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-i6flZW1m.js → Pipeline-qK2VqhJC.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DE0lhYVc.js → Privacy-DHJr4uu0.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BL3YbyxS.js → ProjectInit-DMBS6trm.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CEtdg7ni.js → ProjectSettings-D3Ng74BT.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-CvtU5peJ.js → Projects-BfJFZiIW.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DKt_Cg-j.js → Providers-DlNA95G0.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DA61jNSx.js → QrScannerModal-CMOIYxIm.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-fS9ryUmq.js → QuickAsk-D6MyGp5I.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CR9dZU5Y.js → Recommend-W6WcShtf.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BV0BR2Dz.js → RemoteSession-Dm_MjlV_.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-BIeGUvYD.js → Reputation-Ctvij6eX.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DHDT1aro.js → Row-DivbeDE-.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-Cq6YKb1h.js → RssFeed-D4famoAw.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DEF6vsy6.js → Search-6gOAh3zG.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CHtYiKY9.js → Security-DApb9kK8.js} +4 -4
- package/src/assets/web-panel/assets/{Services-u16lvBJN.js → Services-B8OomyE2.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CGbizyDj.js → Skeleton-BTJ2g2E3.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BZMQcAa7.js → Skills-NIRr4DD1.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Bm-CycVi.js → Sla-BQHP_6px.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BudpA5kr.js → SpeechSettings-BVQTDSVS.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-B8q1C1eC.js → SyncSettings-BOD4Mar6.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-SU1pBWc-.js → Tasks-Ciu7H2-y.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CyOfJzmt.js → Templates-CtlwavRU.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-xqWSm2GP.js → Tenant-QLWYJdL6.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D1Ttgjsi.js → Terminal-B3q10mjm.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Da2lYs5D.js → TimelineRenderer-CqltBA_8.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-B34-SduO.js → Tokens-CJOKrj4y.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-C8zyYm4R.js → Trigger-CPMGgfdM.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-D1Pvqems.js → Trust-DiJms7Bl.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-Do3VVnAy.js → UkeySign-rakR8eel.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Dz7egVIA.js → VideoEditing-DAWZUM5o.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Dcuw-OxR.js → Wallet-DqUPnl7K.js} +3 -3
- package/src/assets/web-panel/assets/{WebAuthn-DPlw-QsB.js → WebAuthn-BnVUwvMm.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-h4OsnU5q.js → WorkflowEditor-B1CAwxgs.js} +1 -1
- package/src/assets/web-panel/assets/{chat-eO9wEwrW.js → chat-k2-0Jzfy.js} +1 -1
- package/src/assets/web-panel/assets/{colors-34lSmOXw.js → colors-BAu8xBmW.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CK4kEWJ4.js → compact-item-DMlqcdfI.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-E0A57xed.js → createContext-BU9kfiSw.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DuGrUMAS.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BD9ZMGAl.js → hasIn-2vacgdcl.js} +1 -1
- package/src/assets/web-panel/assets/{index--N0u6kTG.js → index-B-C-Ruft.js} +1 -1
- package/src/assets/web-panel/assets/{index-DzXjP44T.js → index-B7wDjYUd.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZBaqe3d.js → index-BMq0frKK.js} +1 -1
- package/src/assets/web-panel/assets/{index-DrOalGut.js → index-BUX4W-2v.js} +1 -1
- package/src/assets/web-panel/assets/{index-CT1_eRL-.js → index-BZz2eB33.js} +1 -1
- package/src/assets/web-panel/assets/{index-DrsDA_md.js → index-BblNQlaA.js} +1 -1
- package/src/assets/web-panel/assets/{index-DP-UZAQN.js → index-BdfKoqsK.js} +1 -1
- package/src/assets/web-panel/assets/{index-DiT_REby.js → index-Bf8YofPE.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cx3Jn1r0.js → index-Bn8tARil.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0rkHxKK.js → index-Bpe2CJd-.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_G_ElKO.js → index-BxctzdYQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-MIg5Z8qe.js → index-C24NoPpy.js} +1 -1
- package/src/assets/web-panel/assets/{index-BmNbU2Z6.js → index-C5C4kSi8.js} +1 -1
- package/src/assets/web-panel/assets/{index-BsGmo6v1.js → index-C6ICn9Y6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CsrKJJcX.js → index-C8ldqZi6.js} +1 -1
- package/src/assets/web-panel/assets/{index-BbX_Dted.js → index-C9WsM29I.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ch175NUw.js → index-CONPVaxw.js} +1 -1
- package/src/assets/web-panel/assets/{index-DONOUtlz.js → index-CPyYXKFB.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFLE2qO9.js → index-CSvSf9px.js} +1 -1
- package/src/assets/web-panel/assets/{index-o8pYehRq.js → index-CXmpR6N3.js} +3 -3
- package/src/assets/web-panel/assets/{index-Cz3unNfL.js → index-Chybe7Ge.js} +1 -1
- package/src/assets/web-panel/assets/{index-yAGBu2E0.js → index-CyXmP3PW.js} +1 -1
- package/src/assets/web-panel/assets/{index-CuSau5ya.js → index-DCusBOqR.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcE1BspQ.js → index-DH01oIaj.js} +1 -1
- package/src/assets/web-panel/assets/{index-DrSAAuJj.js → index-DHg3LMNP.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZkFMeWL.js → index-DWLTSIka.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvKcroix.js → index-DaUGdvtU.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bjs90Eh9.js → index-DcA-tEQd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGRxt5wj.js → index-DfWvcu4p.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCn-ECvK.js → index-DmZNnZz7.js} +1 -1
- package/src/assets/web-panel/assets/index-DvFfMAux.js +1 -0
- package/src/assets/web-panel/assets/{index-8qMA1DWQ.js → index-JsyGqKmD.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4bB_x_v.js → index-TtrpHmYx.js} +1 -1
- package/src/assets/web-panel/assets/{index-Brqc9Emx.js → index-Ygh0wmKz.js} +1 -1
- package/src/assets/web-panel/assets/{index-Da5fmOHB.js → index-dIYqw3f0.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpfisY1g.js → index-hDHHJYno.js} +1 -1
- package/src/assets/web-panel/assets/index-n6p-1A77.js +1 -0
- package/src/assets/web-panel/assets/{index-DeXNCyQJ.js → index-oElehY4F.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcbgVLOH.js → index-z4_YwZDW.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DMTkAomF.js → initDefaultProps-B9OXWu2e.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Cnti1F5g.js → motion-IQ47MCDQ.js} +1 -1
- package/src/assets/web-panel/assets/{move-CGxmHUga.js → move-CLCU4kjV.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CuwwLoq7.js → mtc-parser-CXnVlSPq.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BpdlTkPM.js → omit-BJjLXB0f.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-D7nWrThp.js → pickAttrs-BHdtvdy6.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Bhx0TV8F.js → placementArrow-oq8X_Bwc.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CZ1KesZh.js → responsiveObserve-DTD02LAO.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CnldF8J6.js → slide-DbEeq8to.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CZfo_GOA.js → statusUtils-Do2fy1CJ.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-B2QCcAv5.js → styleChecker-CFWD63T-.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DzzjIS4J.js → useFlexGapSupport-BeozAWOo.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-B_atg9M0.js → useFs-0-rIgnBL.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DhZs3QYN.js → usePersonalDataHub-CeiNoI31.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DcePTYAm.js → vnode-Dj0ReRNg.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BYmlnjRk.js → zoom-DD7MC4Dy.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 +18 -1
- package/src/commands/evolution-benchmark.js +72 -0
- package/src/commands/evolution-knowledge.js +40 -1
- package/src/commands/evolution.js +2 -0
- package/src/commands/governed-skill-marketplace.js +142 -0
- package/src/commands/marketplace.js +4 -1
- package/src/commands/serve.js +21 -0
- package/src/commands/skill.js +3 -0
- package/src/data/changelog.json +39 -0
- package/src/gateways/ws/ws-agent-handler.js +59 -2
- package/src/gateways/ws/ws-server.js +2 -0
- package/src/generated/cc-agent-protocol.schema.json +3 -1
- package/src/harness/golden-transcript.js +1 -0
- package/src/harness/prompt-compressor.js +51 -5
- package/src/harness/provider-backed-compaction.js +28 -1
- package/src/harness/remote-session-registry.js +15 -3
- package/src/index.js +20 -2
- package/src/lazy-dispatch.js +6 -0
- package/src/lib/advisor-runtime.js +55 -2
- package/src/lib/app-server/cli-agent-kernel-adapter.js +4 -0
- package/src/lib/app-server/graph-runtime.js +32 -0
- package/src/lib/app-server/server.js +94 -1
- package/src/lib/app-server/websocket-transport.js +15 -0
- package/src/lib/autonomous-agent.js +63 -13
- package/src/lib/cowork/ab-comparator-cli.js +4 -3
- package/src/lib/cowork/debate-review-cli.js +4 -3
- package/src/lib/cowork/decision-kb-cli.js +5 -0
- package/src/lib/cowork-adapter.js +38 -16
- package/src/lib/evolution/agent-evolution-ingress.js +95 -15
- package/src/lib/evolution/agent-evolution-runtime-composition.js +82 -0
- package/src/lib/evolution/agent-evolution-session-lifecycle.js +46 -0
- package/src/lib/evolution/agent-model-projection.js +437 -0
- package/src/lib/evolution/bounded-descriptor-read.js +29 -0
- package/src/lib/evolution/controlled-skill-pilot-ledger-adapter.js +551 -0
- package/src/lib/evolution/controlled-skill-production-pilot.js +308 -18
- package/src/lib/evolution/evidence-backed-wiki-maintainer.js +32 -10
- package/src/lib/evolution/evidence-json-text.js +236 -0
- package/src/lib/evolution/evolution-artifact-ports.js +196 -21
- package/src/lib/evolution/evolution-deployment-loader.js +240 -2
- package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +373 -0
- package/src/lib/evolution/evolution-eval-gate.js +14 -1
- package/src/lib/evolution/evolution-eval-process-supervisor-worker.mjs +14 -0
- package/src/lib/evolution/evolution-eval-process-supervisor.js +607 -0
- package/src/lib/evolution/evolution-evidence-artifact-adapter.js +14 -1
- package/src/lib/evolution/evolution-evidence-projector.js +271 -37
- package/src/lib/evolution/evolution-file-witness.js +153 -30
- package/src/lib/evolution/evolution-ledger-ports.js +1219 -66
- package/src/lib/evolution/evolution-ledger.js +66 -2
- package/src/lib/evolution/evolution-raw-crypto-shred.js +29 -15
- package/src/lib/evolution/evolution-raw-deletion-ledger-adapter.js +865 -0
- package/src/lib/evolution/evolution-release-train-domain-stages.js +769 -0
- package/src/lib/evolution/evolution-release-train-stage-output-ledger-adapter.js +333 -0
- package/src/lib/evolution/evolution-release-train.js +54 -6
- package/src/lib/evolution/evolution-workbench-batch-executor.js +101 -144
- package/src/lib/evolution/evolution-workbench-control-ports.js +203 -0
- package/src/lib/evolution/evolution-workbench-file-resources.js +403 -0
- package/src/lib/evolution/evolution-workbench-projection.js +134 -26
- package/src/lib/evolution/evolution-workbench-registry-source.js +482 -0
- package/src/lib/evolution/evolution-workbench-review-ledger-adapter.js +823 -0
- package/src/lib/evolution/evolution-workbench-review-protocol.js +157 -0
- package/src/lib/evolution/evolution-workbench-rollback-authorization.js +57 -0
- package/src/lib/evolution/evolution-workbench-rollback-ledger-adapter.js +1016 -0
- package/src/lib/evolution/evolution-workbench-runtime.js +133 -0
- package/src/lib/evolution/evolution-workbench-version-control.js +70 -36
- package/src/lib/evolution/evolvable-artifact-ledger-adapter.js +48 -0
- package/src/lib/evolution/governed-knowledge-candidate-rejection.js +343 -0
- package/src/lib/evolution/governed-knowledge-dependency-authority.js +227 -44
- package/src/lib/evolution/governed-knowledge-dependency-inventory.js +392 -0
- package/src/lib/evolution/governed-knowledge-dependency-ledger-executor.js +217 -82
- package/src/lib/evolution/governed-knowledge-quarantine-release.js +1013 -0
- package/src/lib/evolution/governed-knowledge-record.js +148 -0
- package/src/lib/evolution/governed-knowledge-revocation-host.js +59 -0
- package/src/lib/evolution/governed-knowledge-revocation-record.js +135 -0
- package/src/lib/evolution/governed-knowledge-skill-rollback.js +510 -0
- package/src/lib/evolution/governed-knowledge-sync.js +181 -95
- package/src/lib/evolution/governed-knowledge-wiki-tombstone.js +516 -0
- package/src/lib/evolution/governed-skill-marketplace-badge.js +208 -0
- package/src/lib/evolution/governed-skill-marketplace-candidate.js +330 -0
- package/src/lib/evolution/governed-skill-marketplace-cli-host.js +308 -0
- package/src/lib/evolution/governed-skill-marketplace-ledger-adapter.js +420 -0
- package/src/lib/evolution/governed-skill-marketplace.js +288 -5
- package/src/lib/evolution/governed-wiki-pruning-journal.js +302 -0
- package/src/lib/evolution/governed-wiki-pruning-ledger-adapter.js +459 -0
- package/src/lib/evolution/governed-wiki-pruning-maintenance.js +576 -0
- package/src/lib/evolution/governed-wiki-pruning-plan-authority.js +169 -0
- package/src/lib/evolution/governed-wiki-pruning-raw-shred.js +207 -0
- package/src/lib/evolution/governed-wiki-pruning-retrieval.js +587 -0
- package/src/lib/evolution/governed-wiki-pruning-runtime.js +153 -0
- package/src/lib/evolution/governed-wiki-pruning-skill-rollback.js +360 -0
- package/src/lib/evolution/governed-wiki-pruning.js +322 -143
- package/src/lib/evolution/independent-skill-revocation-source.js +231 -0
- package/src/lib/evolution/knowledge-wiki-source-admission.js +283 -0
- package/src/lib/evolution/knowledge-wiki-source-provenance.js +360 -0
- package/src/lib/evolution/progressive-canary-external-watchdog.js +578 -0
- package/src/lib/evolution/progressive-canary-traffic-worker.js +628 -0
- package/src/lib/evolution/progressive-canary-watchdog-file-store.js +285 -0
- package/src/lib/evolution/progressive-canary-watchdog-node-pki.js +265 -0
- package/src/lib/evolution/skill-candidate-registry.js +43 -3
- package/src/lib/evolution/skill-promotion-controller.js +25 -0
- package/src/lib/evolution/skill-promotion-review-ledger-adapter.js +100 -0
- package/src/lib/evolution/skill-registry-transition-ledger-adapter.js +131 -2
- package/src/lib/evolution/skill-release-registry.js +168 -4
- package/src/lib/evolution/skill-retrieval-revocation-authority.js +361 -0
- package/src/lib/evolution/skill-retrieval-revocation-ledger-adapter.js +346 -0
- package/src/lib/evolution/skill-revocation-propagation.js +467 -0
- package/src/lib/evolution/skill-target-matrix-eval.js +162 -11
- package/src/lib/evolution/skill-wiki-reconciliation.js +985 -0
- package/src/lib/evolution/skill-writer-inventory-manifest.js +8 -6
- package/src/lib/evolution/statistical-progressive-canary.js +165 -3
- package/src/lib/evolution/structured-memory-agent-control-plane.js +120 -0
- package/src/lib/evolution/structured-memory-authority-ledger-adapter.js +5 -1
- package/src/lib/evolution/structured-memory-promotion-receipt-writer.js +126 -0
- package/src/lib/evolution/wiki-informed-skill-proposer.js +127 -21
- package/src/lib/evolution/wiki-maintainer-ledger-adapter.js +822 -101
- package/src/lib/evolution/wiki-revision-protocol.js +120 -0
- package/src/lib/evolution/wiki-skill-proposal-ledger-adapter.js +307 -0
- package/src/lib/evolution/wiki-target-tombstone-revision.js +109 -0
- package/src/lib/evolution/wikiskill-benchmark-cli-host.js +178 -0
- package/src/lib/evolution/wikiskill-benchmark-execution-host.js +702 -0
- package/src/lib/evolution/wikiskill-benchmark-ledger-adapter.js +613 -0
- package/src/lib/evolution/wikiskill-benchmark.js +80 -16
- package/src/lib/goal-assess.js +17 -10
- package/src/lib/interactive-planner.js +9 -1
- package/src/lib/iteration-budget.js +16 -2
- package/src/lib/micro-compact.js +4 -1
- package/src/lib/model-failure-policy.js +21 -0
- package/src/lib/process-execution-broker/index.js +1 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
- package/src/lib/process-execution-broker/windows-sandbox.cs +33 -15
- package/src/lib/read-file-loop-guard.js +113 -0
- package/src/lib/read-file-page.js +191 -0
- package/src/lib/runnable-provider.js +2 -1
- package/src/lib/skill-retrieval-router.js +22 -1
- package/src/repl/agent-repl.js +133 -34
- package/src/runtime/agent-core.js +196 -74
- package/src/runtime/agent-runtime.js +43 -0
- package/src/runtime/coding-agent-contract-shared.cjs +7 -1
- package/src/runtime/fallback-model.js +143 -62
- package/src/runtime/headless-runner.js +54 -10
- package/src/runtime/headless-stream.js +50 -6
- package/src/runtime/runtime-factory.js +41 -2
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Ds3pA-ET.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-DqTx7_u1.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CF3xafX2.js +0 -1
- package/src/assets/web-panel/assets/index-C907rPwd.js +0 -1
- package/src/assets/web-panel/assets/index-wueRSK2d.js +0 -1
|
@@ -7,7 +7,13 @@ export const EVOLUTION_DEPLOYMENT_DESCRIPTOR_SCHEMA =
|
|
|
7
7
|
"chainlesschain.evolution-deployment-descriptor/v1";
|
|
8
8
|
|
|
9
9
|
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
10
|
-
const SUPPORTED_COMMANDS = new Set([
|
|
10
|
+
const SUPPORTED_COMMANDS = new Set([
|
|
11
|
+
"agent",
|
|
12
|
+
"desktop",
|
|
13
|
+
"evolution",
|
|
14
|
+
"marketplace",
|
|
15
|
+
"serve",
|
|
16
|
+
]);
|
|
11
17
|
|
|
12
18
|
function canonical(value) {
|
|
13
19
|
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
@@ -111,17 +117,161 @@ function dependencies(value, commandName) {
|
|
|
111
117
|
|
|
112
118
|
async function loadBuiltInFactories(commandName) {
|
|
113
119
|
const factories = {};
|
|
120
|
+
if (commandName === "marketplace" || commandName === "desktop") {
|
|
121
|
+
const [
|
|
122
|
+
{ createGovernedSkillMarketplaceCliHost },
|
|
123
|
+
{ createGovernedSkillMarketplaceLedgerAdapter },
|
|
124
|
+
{ createGovernedSkillMarketplaceCandidateInstaller },
|
|
125
|
+
] = await Promise.all([
|
|
126
|
+
import("./governed-skill-marketplace-cli-host.js"),
|
|
127
|
+
import("./governed-skill-marketplace-ledger-adapter.js"),
|
|
128
|
+
import("./governed-skill-marketplace-candidate.js"),
|
|
129
|
+
]);
|
|
130
|
+
factories.createGovernedSkillMarketplaceCliHost =
|
|
131
|
+
createGovernedSkillMarketplaceCliHost;
|
|
132
|
+
factories.createGovernedSkillMarketplaceLedgerAdapter =
|
|
133
|
+
createGovernedSkillMarketplaceLedgerAdapter;
|
|
134
|
+
factories.createGovernedSkillMarketplaceCandidateInstaller =
|
|
135
|
+
createGovernedSkillMarketplaceCandidateInstaller;
|
|
136
|
+
}
|
|
114
137
|
if (commandName === "evolution" || commandName === "serve") {
|
|
115
138
|
const [
|
|
116
139
|
{ createEvolutionWorkbenchCliHost },
|
|
140
|
+
{ createEvolutionWorkbenchReviewRuntime },
|
|
141
|
+
{ createEvolutionWorkbenchRollbackRuntime },
|
|
142
|
+
{ createEvolutionWorkbenchRegistrySource },
|
|
143
|
+
{ createEvolutionWorkbenchRuntime },
|
|
144
|
+
{ openEvolutionWorkbenchFileResources },
|
|
145
|
+
{ createEvolutionWorkbenchControlPorts },
|
|
117
146
|
{ createGovernedKnowledgeReviewHost },
|
|
147
|
+
{ createWikiSkillBenchmarkCliHost },
|
|
148
|
+
{
|
|
149
|
+
createWikiSkillBenchmarkDatasetProvider,
|
|
150
|
+
createWikiSkillBenchmarkExecutionManifest,
|
|
151
|
+
createWikiSkillBenchmarkGrader,
|
|
152
|
+
createWikiSkillBenchmarkReportAttestor,
|
|
153
|
+
createWikiSkillBenchmarkRunner,
|
|
154
|
+
},
|
|
155
|
+
{ createWikiSkillBenchmarkLedgerAdapter },
|
|
156
|
+
{ createEvolutionEvalProcessSupervisor },
|
|
118
157
|
] = await Promise.all([
|
|
119
158
|
import("./evolution-workbench-cli-host.js"),
|
|
159
|
+
import("./evolution-workbench-review-ledger-adapter.js"),
|
|
160
|
+
import("./evolution-workbench-rollback-ledger-adapter.js"),
|
|
161
|
+
import("./evolution-workbench-registry-source.js"),
|
|
162
|
+
import("./evolution-workbench-runtime.js"),
|
|
163
|
+
import("./evolution-workbench-file-resources.js"),
|
|
164
|
+
import("./evolution-workbench-control-ports.js"),
|
|
120
165
|
import("./governed-knowledge-review-host.js"),
|
|
166
|
+
import("./wikiskill-benchmark-cli-host.js"),
|
|
167
|
+
import("./wikiskill-benchmark-execution-host.js"),
|
|
168
|
+
import("./wikiskill-benchmark-ledger-adapter.js"),
|
|
169
|
+
import("./evolution-eval-process-supervisor.js"),
|
|
121
170
|
]);
|
|
122
171
|
factories.createEvolutionWorkbenchCliHost = createEvolutionWorkbenchCliHost;
|
|
172
|
+
factories.createEvolutionWorkbenchReviewRuntime =
|
|
173
|
+
createEvolutionWorkbenchReviewRuntime;
|
|
174
|
+
factories.createEvolutionWorkbenchRollbackRuntime =
|
|
175
|
+
createEvolutionWorkbenchRollbackRuntime;
|
|
176
|
+
factories.createEvolutionWorkbenchRegistrySource =
|
|
177
|
+
createEvolutionWorkbenchRegistrySource;
|
|
178
|
+
factories.createEvolutionWorkbenchRuntime = createEvolutionWorkbenchRuntime;
|
|
179
|
+
factories.openEvolutionWorkbenchFileResources =
|
|
180
|
+
openEvolutionWorkbenchFileResources;
|
|
181
|
+
factories.createEvolutionWorkbenchControlPorts =
|
|
182
|
+
createEvolutionWorkbenchControlPorts;
|
|
123
183
|
factories.createGovernedKnowledgeReviewHost =
|
|
124
184
|
createGovernedKnowledgeReviewHost;
|
|
185
|
+
factories.createWikiSkillBenchmarkCliHost = createWikiSkillBenchmarkCliHost;
|
|
186
|
+
factories.createWikiSkillBenchmarkDatasetProvider =
|
|
187
|
+
createWikiSkillBenchmarkDatasetProvider;
|
|
188
|
+
factories.createWikiSkillBenchmarkExecutionManifest =
|
|
189
|
+
createWikiSkillBenchmarkExecutionManifest;
|
|
190
|
+
factories.createWikiSkillBenchmarkGrader = createWikiSkillBenchmarkGrader;
|
|
191
|
+
factories.createWikiSkillBenchmarkReportAttestor =
|
|
192
|
+
createWikiSkillBenchmarkReportAttestor;
|
|
193
|
+
factories.createWikiSkillBenchmarkRunner = createWikiSkillBenchmarkRunner;
|
|
194
|
+
factories.createWikiSkillBenchmarkLedgerAdapter =
|
|
195
|
+
createWikiSkillBenchmarkLedgerAdapter;
|
|
196
|
+
factories.createEvolutionEvalProcessSupervisor =
|
|
197
|
+
createEvolutionEvalProcessSupervisor;
|
|
198
|
+
const [
|
|
199
|
+
{ SkillCandidateRegistry },
|
|
200
|
+
{ SkillReleaseRegistry },
|
|
201
|
+
{ SkillPromotionController },
|
|
202
|
+
{ createEvolutionLedgerPorts },
|
|
203
|
+
{ createWikiMaintainerLedgerAdapter },
|
|
204
|
+
{ createGovernedKnowledgeArtifactLifecycle },
|
|
205
|
+
{ GovernedKnowledgeSyncLedgerAdapter },
|
|
206
|
+
{ GovernedKnowledgeDependencyLedgerExecutor },
|
|
207
|
+
{ GovernedKnowledgeDependencyInventoryPlanner },
|
|
208
|
+
{ GovernedKnowledgeSync },
|
|
209
|
+
{ createGovernedKnowledgeRevocationHost },
|
|
210
|
+
{
|
|
211
|
+
createGovernedKnowledgeCandidateQuarantineAuthority,
|
|
212
|
+
createGovernedKnowledgeCandidateRejectionAuthority,
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
createGovernedKnowledgeSkillQuarantineAuthority,
|
|
216
|
+
createGovernedKnowledgeSkillRollbackAuthority,
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
createGovernedKnowledgeWikiQuarantineAuthority,
|
|
220
|
+
createGovernedKnowledgeWikiTombstoneAuthority,
|
|
221
|
+
},
|
|
222
|
+
{ createGovernedKnowledgeDependencyRouter },
|
|
223
|
+
{
|
|
224
|
+
GovernedKnowledgeQuarantineReleaseLedger,
|
|
225
|
+
createGovernedKnowledgeQuarantineReleaseDecisionAuthority,
|
|
226
|
+
},
|
|
227
|
+
] = await Promise.all([
|
|
228
|
+
import("./skill-candidate-registry.js"),
|
|
229
|
+
import("./skill-release-registry.js"),
|
|
230
|
+
import("./skill-promotion-controller.js"),
|
|
231
|
+
import("./evolution-ledger-ports.js"),
|
|
232
|
+
import("./wiki-maintainer-ledger-adapter.js"),
|
|
233
|
+
import("./governed-knowledge-artifact-lifecycle.js"),
|
|
234
|
+
import("./governed-knowledge-sync-ledger-adapter.js"),
|
|
235
|
+
import("./governed-knowledge-dependency-ledger-executor.js"),
|
|
236
|
+
import("./governed-knowledge-dependency-inventory.js"),
|
|
237
|
+
import("./governed-knowledge-sync.js"),
|
|
238
|
+
import("./governed-knowledge-revocation-host.js"),
|
|
239
|
+
import("./governed-knowledge-candidate-rejection.js"),
|
|
240
|
+
import("./governed-knowledge-skill-rollback.js"),
|
|
241
|
+
import("./governed-knowledge-wiki-tombstone.js"),
|
|
242
|
+
import("./governed-knowledge-dependency-authority.js"),
|
|
243
|
+
import("./governed-knowledge-quarantine-release.js"),
|
|
244
|
+
]);
|
|
245
|
+
Object.assign(factories, {
|
|
246
|
+
createSkillCandidateRegistry: (options) =>
|
|
247
|
+
new SkillCandidateRegistry(options),
|
|
248
|
+
createSkillReleaseRegistry: (options) =>
|
|
249
|
+
new SkillReleaseRegistry(options),
|
|
250
|
+
createSkillPromotionController: (options) =>
|
|
251
|
+
new SkillPromotionController(options),
|
|
252
|
+
createEvolutionLedgerPorts,
|
|
253
|
+
createWikiMaintainerLedgerAdapter,
|
|
254
|
+
createGovernedKnowledgeArtifactLifecycle,
|
|
255
|
+
createGovernedKnowledgeSyncLedgerAdapter: (options) =>
|
|
256
|
+
new GovernedKnowledgeSyncLedgerAdapter(options),
|
|
257
|
+
createGovernedKnowledgeDependencyLedgerExecutor: (options) =>
|
|
258
|
+
new GovernedKnowledgeDependencyLedgerExecutor(options),
|
|
259
|
+
createGovernedKnowledgeDependencyInventoryPlanner: (options) =>
|
|
260
|
+
new GovernedKnowledgeDependencyInventoryPlanner(options),
|
|
261
|
+
createGovernedKnowledgeSync: (options) =>
|
|
262
|
+
new GovernedKnowledgeSync(options),
|
|
263
|
+
createGovernedKnowledgeRevocationHost,
|
|
264
|
+
createGovernedKnowledgeCandidateQuarantineAuthority,
|
|
265
|
+
createGovernedKnowledgeCandidateRejectionAuthority,
|
|
266
|
+
createGovernedKnowledgeSkillQuarantineAuthority,
|
|
267
|
+
createGovernedKnowledgeSkillRollbackAuthority,
|
|
268
|
+
createGovernedKnowledgeWikiQuarantineAuthority,
|
|
269
|
+
createGovernedKnowledgeWikiTombstoneAuthority,
|
|
270
|
+
createGovernedKnowledgeDependencyRouter,
|
|
271
|
+
createGovernedKnowledgeQuarantineReleaseDecisionAuthority,
|
|
272
|
+
createGovernedKnowledgeQuarantineReleaseLedger: (options) =>
|
|
273
|
+
new GovernedKnowledgeQuarantineReleaseLedger(options),
|
|
274
|
+
});
|
|
125
275
|
}
|
|
126
276
|
if (commandName === "agent" || commandName === "serve") {
|
|
127
277
|
const { createAgentEvolutionRuntimeComposition } =
|
|
@@ -132,6 +282,60 @@ async function loadBuiltInFactories(commandName) {
|
|
|
132
282
|
return Object.freeze(factories);
|
|
133
283
|
}
|
|
134
284
|
|
|
285
|
+
function bindFactoriesToModule(factories, moduleDigest) {
|
|
286
|
+
const result = { ...factories };
|
|
287
|
+
const providerFactories = [
|
|
288
|
+
"createEvolutionWorkbenchReviewRuntime",
|
|
289
|
+
"createEvolutionWorkbenchRollbackRuntime",
|
|
290
|
+
"createEvolutionWorkbenchRegistrySource",
|
|
291
|
+
"createEvolutionWorkbenchRuntime",
|
|
292
|
+
"openEvolutionWorkbenchFileResources",
|
|
293
|
+
"createEvolutionWorkbenchControlPorts",
|
|
294
|
+
"createWikiSkillBenchmarkDatasetProvider",
|
|
295
|
+
"createWikiSkillBenchmarkGrader",
|
|
296
|
+
"createWikiSkillBenchmarkReportAttestor",
|
|
297
|
+
"createWikiSkillBenchmarkRunner",
|
|
298
|
+
];
|
|
299
|
+
for (const name of providerFactories) {
|
|
300
|
+
if (typeof factories[name] !== "function") continue;
|
|
301
|
+
result[name] = (options = {}) => {
|
|
302
|
+
if (options?.descriptor?.handlerArtifactDigest !== moduleDigest)
|
|
303
|
+
throw new Error(
|
|
304
|
+
`${name} handlerArtifactDigest must equal the authenticated deployment module digest`,
|
|
305
|
+
);
|
|
306
|
+
return factories[name](options);
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
if (
|
|
310
|
+
typeof factories.createWikiSkillBenchmarkExecutionManifest === "function"
|
|
311
|
+
) {
|
|
312
|
+
result.createWikiSkillBenchmarkExecutionManifest = (input = {}) => {
|
|
313
|
+
for (const authority of [
|
|
314
|
+
"datasetProvider",
|
|
315
|
+
"runner",
|
|
316
|
+
"grader",
|
|
317
|
+
"reportAttestor",
|
|
318
|
+
]) {
|
|
319
|
+
if (input?.[authority]?.handlerArtifactDigest !== moduleDigest)
|
|
320
|
+
throw new Error(
|
|
321
|
+
`benchmark ${authority} handlerArtifactDigest must equal the authenticated deployment module digest`,
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
return factories.createWikiSkillBenchmarkExecutionManifest(input);
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
if (typeof factories.createEvolutionEvalProcessSupervisor === "function") {
|
|
328
|
+
result.createEvolutionEvalProcessSupervisor = (options = {}) => {
|
|
329
|
+
if (options?.authorityDescriptor?.handlerArtifactDigest !== moduleDigest)
|
|
330
|
+
throw new Error(
|
|
331
|
+
"process Eval supervisor handlerArtifactDigest must equal the authenticated deployment module digest",
|
|
332
|
+
);
|
|
333
|
+
return factories.createEvolutionEvalProcessSupervisor(options);
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
return Object.freeze(result);
|
|
337
|
+
}
|
|
338
|
+
|
|
135
339
|
export async function loadEvolutionDeploymentCommandDependencies(
|
|
136
340
|
commandName,
|
|
137
341
|
{
|
|
@@ -139,6 +343,7 @@ export async function loadEvolutionDeploymentCommandDependencies(
|
|
|
139
343
|
read = readFile,
|
|
140
344
|
resolveRealPath = realpath,
|
|
141
345
|
importModule = (url) => import(url),
|
|
346
|
+
additionalFactories = {},
|
|
142
347
|
} = {},
|
|
143
348
|
) {
|
|
144
349
|
if (!SUPPORTED_COMMANDS.has(commandName)) return null;
|
|
@@ -195,12 +400,45 @@ export async function loadEvolutionDeploymentCommandDependencies(
|
|
|
195
400
|
throw new Error(
|
|
196
401
|
"evolution deployment module must export createChainlessChainCommandDependencies",
|
|
197
402
|
);
|
|
403
|
+
const builtInFactories = bindFactoriesToModule(
|
|
404
|
+
await loadBuiltInFactories(commandName),
|
|
405
|
+
descriptor.moduleDigest,
|
|
406
|
+
);
|
|
407
|
+
if (
|
|
408
|
+
!additionalFactories ||
|
|
409
|
+
typeof additionalFactories !== "object" ||
|
|
410
|
+
Array.isArray(additionalFactories) ||
|
|
411
|
+
utilTypes.isProxy(additionalFactories)
|
|
412
|
+
) {
|
|
413
|
+
throw new TypeError(
|
|
414
|
+
"additional evolution deployment factories are invalid",
|
|
415
|
+
);
|
|
416
|
+
}
|
|
417
|
+
const additionalFactoryEntries = Object.entries(additionalFactories);
|
|
418
|
+
if (additionalFactoryEntries.length > 0 && commandName !== "desktop") {
|
|
419
|
+
throw new Error(
|
|
420
|
+
"additional evolution deployment factories are reserved for desktop",
|
|
421
|
+
);
|
|
422
|
+
}
|
|
423
|
+
if (
|
|
424
|
+
additionalFactoryEntries.some(
|
|
425
|
+
([name, factory]) =>
|
|
426
|
+
Object.hasOwn(builtInFactories, name) || typeof factory !== "function",
|
|
427
|
+
)
|
|
428
|
+
) {
|
|
429
|
+
throw new TypeError(
|
|
430
|
+
"additional evolution deployment factories are invalid",
|
|
431
|
+
);
|
|
432
|
+
}
|
|
198
433
|
return dependencies(
|
|
199
434
|
await loaded.createChainlessChainCommandDependencies(
|
|
200
435
|
Object.freeze({
|
|
201
436
|
commandName,
|
|
202
437
|
descriptor: Object.freeze({ ...descriptor }),
|
|
203
|
-
factories:
|
|
438
|
+
factories: Object.freeze({
|
|
439
|
+
...builtInFactories,
|
|
440
|
+
...additionalFactories,
|
|
441
|
+
}),
|
|
204
442
|
}),
|
|
205
443
|
),
|
|
206
444
|
commandName,
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA,
|
|
3
|
+
isEvolutionLedgerArtifactResolver,
|
|
4
|
+
} from "./evolution-artifact-ports.js";
|
|
5
|
+
import {
|
|
6
|
+
EVOLUTION_EVAL_ATTESTATION_PURPOSES,
|
|
7
|
+
EVOLUTION_EVAL_RECEIPT_SCHEMA,
|
|
8
|
+
EVOLUTION_EVAL_TARGET_INVOCATION_SCHEMA,
|
|
9
|
+
EVOLUTION_EVAL_TARGET_REVOCATION_SCHEMA,
|
|
10
|
+
computeEvolutionEvalReceiptDigest,
|
|
11
|
+
computeEvolutionEvalSignedEvidenceDigest,
|
|
12
|
+
} from "./evolution-eval-gate.js";
|
|
13
|
+
import {
|
|
14
|
+
EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA,
|
|
15
|
+
EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA,
|
|
16
|
+
} from "./evolution-ledger.js";
|
|
17
|
+
|
|
18
|
+
export const EVOLUTION_EVAL_CHILD_EVIDENCE_RECORD_SCHEMA =
|
|
19
|
+
"chainlesschain.evolution-eval-child-evidence-record/v1";
|
|
20
|
+
export const EVOLUTION_EVAL_CHILD_EVIDENCE_RESOLUTION_SCHEMA =
|
|
21
|
+
"chainlesschain.evolution-eval-child-evidence-resolution/v1";
|
|
22
|
+
export const EVOLUTION_EVAL_CHILD_EVIDENCE_EVENT_TYPE =
|
|
23
|
+
"evolution.eval-child-evidence.retained";
|
|
24
|
+
export const EVOLUTION_EVAL_CHILD_EVIDENCE_CORRUPT_CODE =
|
|
25
|
+
"CC_EVOLUTION_EVAL_CHILD_EVIDENCE_CORRUPT";
|
|
26
|
+
|
|
27
|
+
const ARTIFACT_TYPE = "evolution-eval-child-evidence";
|
|
28
|
+
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
29
|
+
const CHILD_EVIDENCE_STORES = new WeakSet();
|
|
30
|
+
const KINDS = Object.freeze({
|
|
31
|
+
"gate-receipt": Object.freeze({
|
|
32
|
+
purpose: null,
|
|
33
|
+
schema: EVOLUTION_EVAL_RECEIPT_SCHEMA,
|
|
34
|
+
}),
|
|
35
|
+
invocation: Object.freeze({
|
|
36
|
+
purpose: EVOLUTION_EVAL_ATTESTATION_PURPOSES.targetInvocation,
|
|
37
|
+
schema: EVOLUTION_EVAL_TARGET_INVOCATION_SCHEMA,
|
|
38
|
+
}),
|
|
39
|
+
revocation: Object.freeze({
|
|
40
|
+
purpose: EVOLUTION_EVAL_ATTESTATION_PURPOSES.targetRevocation,
|
|
41
|
+
schema: EVOLUTION_EVAL_TARGET_REVOCATION_SCHEMA,
|
|
42
|
+
}),
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
function requiredString(value, label) {
|
|
46
|
+
if (typeof value !== "string" || value.trim() === "")
|
|
47
|
+
throw new TypeError(`${label} is required`);
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function capture(owner, method, label = method) {
|
|
52
|
+
if (typeof owner?.[method] !== "function")
|
|
53
|
+
throw new TypeError(`${label} port is required`);
|
|
54
|
+
return (...args) => Reflect.apply(owner[method], owner, args);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function canonical(value) {
|
|
58
|
+
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
59
|
+
if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
|
|
60
|
+
return `{${Object.keys(value)
|
|
61
|
+
.sort()
|
|
62
|
+
.map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
|
|
63
|
+
.join(",")}}`;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function corrupt(message) {
|
|
67
|
+
const error = new Error(message);
|
|
68
|
+
error.code = EVOLUTION_EVAL_CHILD_EVIDENCE_CORRUPT_CODE;
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function descriptor(input) {
|
|
73
|
+
if (!Number.isSafeInteger(input?.revision) || input.revision < 1)
|
|
74
|
+
throw new TypeError("revision must be a positive integer");
|
|
75
|
+
if (!DIGEST.test(input?.handlerArtifactDigest || ""))
|
|
76
|
+
throw new TypeError("handlerArtifactDigest must be sha256-bound");
|
|
77
|
+
return Object.freeze({
|
|
78
|
+
tenantId: requiredString(input.tenantId, "tenantId"),
|
|
79
|
+
artifactTenantId: requiredString(
|
|
80
|
+
input.artifactTenantId,
|
|
81
|
+
"artifactTenantId",
|
|
82
|
+
),
|
|
83
|
+
streamId: requiredString(input.streamId, "streamId"),
|
|
84
|
+
audience: requiredString(input.audience, "audience"),
|
|
85
|
+
purpose: requiredString(input.purpose, "purpose"),
|
|
86
|
+
authorityId: requiredString(input.authorityId, "authorityId"),
|
|
87
|
+
revision: input.revision,
|
|
88
|
+
handlerArtifactDigest: input.handlerArtifactDigest,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function storeDescriptor(input) {
|
|
93
|
+
if (!Number.isSafeInteger(input?.revision) || input.revision < 1)
|
|
94
|
+
throw new TypeError("child evidence store revision must be positive");
|
|
95
|
+
if (!DIGEST.test(input?.handlerArtifactDigest || ""))
|
|
96
|
+
throw new TypeError("child evidence store handler digest is invalid");
|
|
97
|
+
return Object.freeze({
|
|
98
|
+
tenantId: requiredString(input.tenantId, "child evidence store tenantId"),
|
|
99
|
+
streamId: requiredString(input.streamId, "child evidence store streamId"),
|
|
100
|
+
authorityId: requiredString(
|
|
101
|
+
input.authorityId,
|
|
102
|
+
"child evidence store authorityId",
|
|
103
|
+
),
|
|
104
|
+
revision: input.revision,
|
|
105
|
+
handlerArtifactDigest: input.handlerArtifactDigest,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function captureEvidence(kind, evidence, expectedDigest) {
|
|
110
|
+
const policy = KINDS[kind];
|
|
111
|
+
if (!policy) throw new TypeError("child evidence kind is invalid");
|
|
112
|
+
if (!evidence || typeof evidence !== "object" || Array.isArray(evidence))
|
|
113
|
+
throw new TypeError("child evidence must be a record");
|
|
114
|
+
const captured = Object.freeze(structuredClone(evidence));
|
|
115
|
+
if (captured.schema !== policy.schema)
|
|
116
|
+
throw new TypeError("child evidence schema does not match its kind");
|
|
117
|
+
const receiptDigest =
|
|
118
|
+
kind === "gate-receipt"
|
|
119
|
+
? computeEvolutionEvalReceiptDigest(captured)
|
|
120
|
+
: computeEvolutionEvalSignedEvidenceDigest(captured, policy.purpose);
|
|
121
|
+
if (kind === "gate-receipt" && captured.receiptDigest !== receiptDigest)
|
|
122
|
+
throw new TypeError("Gate child receipt digest is invalid");
|
|
123
|
+
if (expectedDigest !== undefined && receiptDigest !== expectedDigest)
|
|
124
|
+
throw new TypeError("child evidence digest does not match its bytes");
|
|
125
|
+
return Object.freeze({ captured, receiptDigest });
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export class EvolutionEvalChildEvidenceLedgerAdapter {
|
|
129
|
+
constructor({
|
|
130
|
+
descriptor: input,
|
|
131
|
+
artifactPorts,
|
|
132
|
+
ledger,
|
|
133
|
+
ledgerArtifactResolver,
|
|
134
|
+
now = Date.now,
|
|
135
|
+
} = {}) {
|
|
136
|
+
this.descriptor = descriptor(input);
|
|
137
|
+
this._put = capture(artifactPorts, "putCanonical");
|
|
138
|
+
this._read = capture(ledger, "read");
|
|
139
|
+
this._verifyLedger = capture(ledger, "verify");
|
|
140
|
+
this._append = capture(ledger, "appendDomainEvent");
|
|
141
|
+
if (!isEvolutionLedgerArtifactResolver(ledgerArtifactResolver))
|
|
142
|
+
throw new TypeError(
|
|
143
|
+
"a branded EvolutionArtifactPorts ledger resolver is required",
|
|
144
|
+
);
|
|
145
|
+
if (typeof now !== "function")
|
|
146
|
+
throw new TypeError("now must be a function");
|
|
147
|
+
this._resolveArtifact = ledgerArtifactResolver;
|
|
148
|
+
this._now = now;
|
|
149
|
+
CHILD_EVIDENCE_STORES.add(this);
|
|
150
|
+
Object.freeze(this);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
_events() {
|
|
154
|
+
const events = this._read();
|
|
155
|
+
if (!Array.isArray(events))
|
|
156
|
+
corrupt("EvolutionLedger did not return events");
|
|
157
|
+
return events.filter(
|
|
158
|
+
(event) =>
|
|
159
|
+
event.schema === EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA &&
|
|
160
|
+
event.type === EVOLUTION_EVAL_CHILD_EVIDENCE_EVENT_TYPE &&
|
|
161
|
+
event.tenantId === this.descriptor.tenantId &&
|
|
162
|
+
event.correlationId === this.descriptor.streamId,
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
_resolveEvent(event) {
|
|
167
|
+
if (
|
|
168
|
+
event.artifactTenantId !== this.descriptor.artifactTenantId ||
|
|
169
|
+
event.decision !== "accepted" ||
|
|
170
|
+
event.skillName !== "evolution-eval" ||
|
|
171
|
+
!Array.isArray(event.sourceRefs) ||
|
|
172
|
+
event.sourceRefs.length !== 0
|
|
173
|
+
) {
|
|
174
|
+
corrupt("child evidence ledger event binding is invalid");
|
|
175
|
+
}
|
|
176
|
+
const identity = this._verifyLedger();
|
|
177
|
+
const resolution = this._resolveArtifact({
|
|
178
|
+
epoch: identity.epoch,
|
|
179
|
+
ledgerId: identity.ledgerId,
|
|
180
|
+
ref: event.subjectRef,
|
|
181
|
+
tenantId: this.descriptor.artifactTenantId,
|
|
182
|
+
});
|
|
183
|
+
if (
|
|
184
|
+
resolution?.schema !== EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA ||
|
|
185
|
+
resolution.authenticated !== true ||
|
|
186
|
+
resolution.found !== true ||
|
|
187
|
+
resolution.ref !== event.subjectRef.ref ||
|
|
188
|
+
resolution.digest !== event.subjectRef.digest ||
|
|
189
|
+
!Buffer.isBuffer(resolution.bytes)
|
|
190
|
+
) {
|
|
191
|
+
corrupt("child evidence artifact resolution is invalid");
|
|
192
|
+
}
|
|
193
|
+
let durableRecord;
|
|
194
|
+
try {
|
|
195
|
+
durableRecord = JSON.parse(resolution.bytes.toString("utf8"));
|
|
196
|
+
} catch {
|
|
197
|
+
corrupt("child evidence artifact is not JSON");
|
|
198
|
+
}
|
|
199
|
+
if (
|
|
200
|
+
durableRecord?.schema !== EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA ||
|
|
201
|
+
durableRecord.tenantId !== this.descriptor.artifactTenantId ||
|
|
202
|
+
durableRecord.audience !== this.descriptor.audience ||
|
|
203
|
+
durableRecord.purpose !== this.descriptor.purpose ||
|
|
204
|
+
durableRecord.retention !== "ledger" ||
|
|
205
|
+
durableRecord.type !== ARTIFACT_TYPE
|
|
206
|
+
) {
|
|
207
|
+
corrupt("child evidence durable record binding is invalid");
|
|
208
|
+
}
|
|
209
|
+
const value = durableRecord.value;
|
|
210
|
+
if (
|
|
211
|
+
value?.schema !== EVOLUTION_EVAL_CHILD_EVIDENCE_RECORD_SCHEMA ||
|
|
212
|
+
value.tenantId !== this.descriptor.tenantId ||
|
|
213
|
+
value.streamId !== this.descriptor.streamId
|
|
214
|
+
) {
|
|
215
|
+
corrupt("child evidence record scope is invalid");
|
|
216
|
+
}
|
|
217
|
+
const verified = captureEvidence(
|
|
218
|
+
value.kind,
|
|
219
|
+
value.evidence,
|
|
220
|
+
value.receiptDigest,
|
|
221
|
+
);
|
|
222
|
+
if (
|
|
223
|
+
event.eventId !==
|
|
224
|
+
`${EVOLUTION_EVAL_CHILD_EVIDENCE_EVENT_TYPE}.${verified.receiptDigest.slice(7)}`
|
|
225
|
+
) {
|
|
226
|
+
corrupt("child evidence event identity is invalid");
|
|
227
|
+
}
|
|
228
|
+
return Object.freeze({
|
|
229
|
+
kind: value.kind,
|
|
230
|
+
evidence: verified.captured,
|
|
231
|
+
receiptDigest: verified.receiptDigest,
|
|
232
|
+
event,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
async retain({ kind, evidence, receiptDigest } = {}) {
|
|
237
|
+
const verified = captureEvidence(kind, evidence, receiptDigest);
|
|
238
|
+
const eventId = `${EVOLUTION_EVAL_CHILD_EVIDENCE_EVENT_TYPE}.${verified.receiptDigest.slice(7)}`;
|
|
239
|
+
const existing = this._events().filter(
|
|
240
|
+
(event) => event.eventId === eventId,
|
|
241
|
+
);
|
|
242
|
+
if (existing.length > 1) corrupt("child evidence event is ambiguous");
|
|
243
|
+
if (existing.length === 1) {
|
|
244
|
+
const recovered = this._resolveEvent(existing[0]);
|
|
245
|
+
if (
|
|
246
|
+
recovered.kind !== kind ||
|
|
247
|
+
canonical(recovered.evidence) !== canonical(verified.captured)
|
|
248
|
+
) {
|
|
249
|
+
corrupt("child evidence event resolved substituted bytes");
|
|
250
|
+
}
|
|
251
|
+
return Object.freeze({
|
|
252
|
+
authenticated: true,
|
|
253
|
+
durable: true,
|
|
254
|
+
recovered: true,
|
|
255
|
+
kind,
|
|
256
|
+
receiptDigest: verified.receiptDigest,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
const head = this._verifyLedger();
|
|
260
|
+
const nowMs = Number(this._now());
|
|
261
|
+
if (!Number.isFinite(nowMs))
|
|
262
|
+
throw new TypeError("child evidence clock is invalid");
|
|
263
|
+
const record = Object.freeze({
|
|
264
|
+
schema: EVOLUTION_EVAL_CHILD_EVIDENCE_RECORD_SCHEMA,
|
|
265
|
+
tenantId: this.descriptor.tenantId,
|
|
266
|
+
streamId: this.descriptor.streamId,
|
|
267
|
+
kind,
|
|
268
|
+
receiptDigest: verified.receiptDigest,
|
|
269
|
+
evidence: verified.captured,
|
|
270
|
+
});
|
|
271
|
+
const published = this._put(ARTIFACT_TYPE, record, {
|
|
272
|
+
audience: this.descriptor.audience,
|
|
273
|
+
purpose: this.descriptor.purpose,
|
|
274
|
+
retention: "ledger",
|
|
275
|
+
});
|
|
276
|
+
if (
|
|
277
|
+
published?.receipt?.persisted !== true ||
|
|
278
|
+
published.receipt.readbackVerified !== true ||
|
|
279
|
+
published.receipt.integrityVerified !== true ||
|
|
280
|
+
published.receipt.retention !== "ledger"
|
|
281
|
+
) {
|
|
282
|
+
corrupt("child evidence persistence was not durably confirmed");
|
|
283
|
+
}
|
|
284
|
+
const receipt = this._append(
|
|
285
|
+
{
|
|
286
|
+
artifactTenantId: this.descriptor.artifactTenantId,
|
|
287
|
+
correlationId: this.descriptor.streamId,
|
|
288
|
+
decision: "accepted",
|
|
289
|
+
eventId,
|
|
290
|
+
reason: `durable ${kind} child evidence`,
|
|
291
|
+
skillName: "evolution-eval",
|
|
292
|
+
sourceRefs: [],
|
|
293
|
+
subjectRef: published.ref,
|
|
294
|
+
tenantId: this.descriptor.tenantId,
|
|
295
|
+
timestamp: new Date(nowMs).toISOString(),
|
|
296
|
+
type: EVOLUTION_EVAL_CHILD_EVIDENCE_EVENT_TYPE,
|
|
297
|
+
},
|
|
298
|
+
{ expectedHeadDigest: head.headDigest, expectedSequence: head.sequence },
|
|
299
|
+
);
|
|
300
|
+
if (receipt?.authenticated !== true || receipt.durable !== true)
|
|
301
|
+
corrupt("child evidence ledger append was not durable");
|
|
302
|
+
return Object.freeze({
|
|
303
|
+
authenticated: true,
|
|
304
|
+
durable: true,
|
|
305
|
+
recovered: false,
|
|
306
|
+
kind,
|
|
307
|
+
receiptDigest: verified.receiptDigest,
|
|
308
|
+
ledgerReceiptDigest: receipt.receiptDigest,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
async resolve({ tenantId, kind, receiptDigest } = {}) {
|
|
313
|
+
if (
|
|
314
|
+
tenantId !== this.descriptor.tenantId ||
|
|
315
|
+
!KINDS[kind] ||
|
|
316
|
+
!DIGEST.test(receiptDigest || "")
|
|
317
|
+
) {
|
|
318
|
+
throw new TypeError("child evidence resolution request is invalid");
|
|
319
|
+
}
|
|
320
|
+
const matches = this._events()
|
|
321
|
+
.filter(
|
|
322
|
+
(event) =>
|
|
323
|
+
event.eventId ===
|
|
324
|
+
`${EVOLUTION_EVAL_CHILD_EVIDENCE_EVENT_TYPE}.${receiptDigest.slice(7)}`,
|
|
325
|
+
)
|
|
326
|
+
.map((event) => this._resolveEvent(event))
|
|
327
|
+
.filter(
|
|
328
|
+
(entry) => entry.kind === kind && entry.receiptDigest === receiptDigest,
|
|
329
|
+
);
|
|
330
|
+
if (matches.length !== 1) corrupt("child evidence is missing or ambiguous");
|
|
331
|
+
const resolvedAtMs = Number(this._now());
|
|
332
|
+
if (!Number.isFinite(resolvedAtMs))
|
|
333
|
+
throw new TypeError("child evidence clock is invalid");
|
|
334
|
+
return Object.freeze({
|
|
335
|
+
schema: EVOLUTION_EVAL_CHILD_EVIDENCE_RESOLUTION_SCHEMA,
|
|
336
|
+
authenticated: true,
|
|
337
|
+
durable: true,
|
|
338
|
+
authorityId: this.descriptor.authorityId,
|
|
339
|
+
revision: this.descriptor.revision,
|
|
340
|
+
handlerArtifactDigest: this.descriptor.handlerArtifactDigest,
|
|
341
|
+
tenantId,
|
|
342
|
+
streamId: this.descriptor.streamId,
|
|
343
|
+
kind,
|
|
344
|
+
receiptDigest,
|
|
345
|
+
evidence: matches[0].evidence,
|
|
346
|
+
resolvedAt: new Date(resolvedAtMs).toISOString(),
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
export function createEvolutionEvalChildEvidenceLedgerAdapter(options) {
|
|
352
|
+
return new EvolutionEvalChildEvidenceLedgerAdapter(options);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
export function createEvolutionEvalChildEvidenceStorePort({
|
|
356
|
+
descriptor: input,
|
|
357
|
+
retain,
|
|
358
|
+
resolve,
|
|
359
|
+
} = {}) {
|
|
360
|
+
if (typeof retain !== "function" || typeof resolve !== "function")
|
|
361
|
+
throw new TypeError("child evidence store ports are required");
|
|
362
|
+
const port = Object.freeze({
|
|
363
|
+
descriptor: storeDescriptor(input),
|
|
364
|
+
retain: (...args) => Reflect.apply(retain, undefined, args),
|
|
365
|
+
resolve: (...args) => Reflect.apply(resolve, undefined, args),
|
|
366
|
+
});
|
|
367
|
+
CHILD_EVIDENCE_STORES.add(port);
|
|
368
|
+
return port;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
export function isEvolutionEvalChildEvidenceStore(value) {
|
|
372
|
+
return CHILD_EVIDENCE_STORES.has(value);
|
|
373
|
+
}
|
|
@@ -1055,6 +1055,19 @@ export function buildEvolutionEvalAttestationDigest(value, purpose) {
|
|
|
1055
1055
|
return digest(value, `chainlesschain.evolution-eval-attestation/${purpose}`);
|
|
1056
1056
|
}
|
|
1057
1057
|
|
|
1058
|
+
export function computeEvolutionEvalSignedEvidenceDigest(record, purpose) {
|
|
1059
|
+
if (
|
|
1060
|
+
purpose !== EVOLUTION_EVAL_ATTESTATION_PURPOSES.targetInvocation &&
|
|
1061
|
+
purpose !== EVOLUTION_EVAL_ATTESTATION_PURPOSES.targetRevocation
|
|
1062
|
+
) {
|
|
1063
|
+
throw evalError(
|
|
1064
|
+
EVOLUTION_EVAL_INVALID_CODE,
|
|
1065
|
+
"signed evidence purpose is invalid",
|
|
1066
|
+
);
|
|
1067
|
+
}
|
|
1068
|
+
return digest(cloneCanonical(record), `${purpose}/signed-record`);
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1058
1071
|
export function computeEvolutionEvalEnvironmentDigest(environment) {
|
|
1059
1072
|
return digest(
|
|
1060
1073
|
cloneCanonical(environment),
|
|
@@ -2345,7 +2358,7 @@ function verifySynchronousEvidence({
|
|
|
2345
2358
|
}
|
|
2346
2359
|
return deepFreeze({
|
|
2347
2360
|
core,
|
|
2348
|
-
recordDigest:
|
|
2361
|
+
recordDigest: computeEvolutionEvalSignedEvidenceDigest(record, purpose),
|
|
2349
2362
|
});
|
|
2350
2363
|
}
|
|
2351
2364
|
|