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
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { types } from "node:util";
|
|
2
|
+
import { capturePruningData as capture } from "./governed-wiki-pruning-journal.js";
|
|
3
|
+
import { createEvolutionWorkbenchRegistrySource } from "./evolution-workbench-registry-source.js";
|
|
4
|
+
import { createEvolutionWorkbenchReviewRuntime } from "./evolution-workbench-review-ledger-adapter.js";
|
|
5
|
+
import { createEvolutionWorkbenchRollbackRuntime } from "./evolution-workbench-rollback-ledger-adapter.js";
|
|
6
|
+
import { createEvolutionWorkbenchCliHost } from "./evolution-workbench-cli-host.js";
|
|
7
|
+
|
|
8
|
+
const REQUIRED = [
|
|
9
|
+
"descriptor",
|
|
10
|
+
"artifactPorts",
|
|
11
|
+
"ledger",
|
|
12
|
+
"ledgerArtifactResolver",
|
|
13
|
+
"releaseRegistry",
|
|
14
|
+
"transactionLedger",
|
|
15
|
+
"verifierLedger",
|
|
16
|
+
"verifierLedgerArtifactResolver",
|
|
17
|
+
"verifierReleaseRegistry",
|
|
18
|
+
"verifierTransactionLedger",
|
|
19
|
+
"rollbackProvider",
|
|
20
|
+
"authorizationProvider",
|
|
21
|
+
"identityProvider",
|
|
22
|
+
"decisionVerifier",
|
|
23
|
+
"humanDecisionProvider",
|
|
24
|
+
"humanDecisionVerifier",
|
|
25
|
+
"humanRollbackProvider",
|
|
26
|
+
"humanRollbackVerifier",
|
|
27
|
+
];
|
|
28
|
+
const OPTIONAL = ["invocationReceiptSource", "pilotSource", "now"];
|
|
29
|
+
|
|
30
|
+
function optionsRecord(value) {
|
|
31
|
+
if (
|
|
32
|
+
!value ||
|
|
33
|
+
typeof value !== "object" ||
|
|
34
|
+
Array.isArray(value) ||
|
|
35
|
+
types.isProxy(value)
|
|
36
|
+
)
|
|
37
|
+
throw new TypeError("Workbench runtime requires explicit resource options");
|
|
38
|
+
const descriptors = Object.getOwnPropertyDescriptors(value);
|
|
39
|
+
const allowed = new Set([...REQUIRED, ...OPTIONAL]);
|
|
40
|
+
if (
|
|
41
|
+
Reflect.ownKeys(descriptors).some((key) => !allowed.has(key)) ||
|
|
42
|
+
REQUIRED.some((key) => !Object.hasOwn(descriptors, key))
|
|
43
|
+
)
|
|
44
|
+
throw new TypeError("Workbench runtime resources are missing or replaced");
|
|
45
|
+
const output = {};
|
|
46
|
+
for (const [key, property] of Object.entries(descriptors)) {
|
|
47
|
+
if (!Object.hasOwn(property, "value"))
|
|
48
|
+
throw new TypeError(
|
|
49
|
+
"Workbench runtime resource accessors are not allowed",
|
|
50
|
+
);
|
|
51
|
+
output[key] = property.value;
|
|
52
|
+
}
|
|
53
|
+
return output;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function fixed(owner, name) {
|
|
57
|
+
if (!owner || types.isProxy(owner))
|
|
58
|
+
throw new TypeError(`Workbench ${name} fixed port is required`);
|
|
59
|
+
const fn = Object.getOwnPropertyDescriptor(owner, name)?.value;
|
|
60
|
+
if (typeof fn !== "function" || types.isProxy(fn))
|
|
61
|
+
throw new TypeError(`Workbench ${name} fixed own method is required`);
|
|
62
|
+
return Object.freeze({ [name]: fn.bind(owner) });
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Open/recover the actual Registry before calling this assembly. Nothing here
|
|
66
|
+
// creates credentials or grants permissions. No host escapes before current
|
|
67
|
+
// storage, all adapters and existing-effect reconciliation have been verified.
|
|
68
|
+
export async function createEvolutionWorkbenchRuntime(input) {
|
|
69
|
+
const options = optionsRecord(input);
|
|
70
|
+
const descriptor = capture(options.descriptor);
|
|
71
|
+
const shared = {
|
|
72
|
+
descriptor,
|
|
73
|
+
artifactPorts: options.artifactPorts,
|
|
74
|
+
ledger: options.ledger,
|
|
75
|
+
ledgerArtifactResolver: options.ledgerArtifactResolver,
|
|
76
|
+
now: options.now ?? Date.now,
|
|
77
|
+
};
|
|
78
|
+
const identityProvider = fixed(options.identityProvider, "current");
|
|
79
|
+
const registrySource = createEvolutionWorkbenchRegistrySource({
|
|
80
|
+
...shared,
|
|
81
|
+
releaseRegistry: options.releaseRegistry,
|
|
82
|
+
transactionLedger: options.transactionLedger,
|
|
83
|
+
verifierLedger: options.verifierLedger,
|
|
84
|
+
verifierLedgerArtifactResolver: options.verifierLedgerArtifactResolver,
|
|
85
|
+
verifierReleaseRegistry: options.verifierReleaseRegistry,
|
|
86
|
+
verifierTransactionLedger: options.verifierTransactionLedger,
|
|
87
|
+
});
|
|
88
|
+
const review = createEvolutionWorkbenchReviewRuntime({
|
|
89
|
+
...shared,
|
|
90
|
+
registrySource,
|
|
91
|
+
decisionVerifier: fixed(options.decisionVerifier, "verify"),
|
|
92
|
+
humanDecisionProvider: fixed(options.humanDecisionProvider, "request"),
|
|
93
|
+
humanDecisionVerifier: fixed(options.humanDecisionVerifier, "verify"),
|
|
94
|
+
invocationReceiptSource: options.invocationReceiptSource ?? null,
|
|
95
|
+
pilotSource: options.pilotSource ?? null,
|
|
96
|
+
});
|
|
97
|
+
const rollback = createEvolutionWorkbenchRollbackRuntime({
|
|
98
|
+
...shared,
|
|
99
|
+
projectionReader: review.projectionReader,
|
|
100
|
+
releaseRegistry: options.releaseRegistry,
|
|
101
|
+
transactionLedger: options.transactionLedger,
|
|
102
|
+
verifierReleaseRegistry: options.verifierReleaseRegistry,
|
|
103
|
+
verifierTransactionLedger: options.verifierTransactionLedger,
|
|
104
|
+
rollbackProvider: options.rollbackProvider,
|
|
105
|
+
authorizationProvider: fixed(
|
|
106
|
+
options.authorizationProvider,
|
|
107
|
+
"authorizeRollback",
|
|
108
|
+
),
|
|
109
|
+
humanRollbackProvider: fixed(options.humanRollbackProvider, "authorize"),
|
|
110
|
+
humanRollbackVerifier: fixed(options.humanRollbackVerifier, "verify"),
|
|
111
|
+
});
|
|
112
|
+
const reviewRecovery = await review.reconcileCommitted();
|
|
113
|
+
const rollbackRecovery = await rollback.reconcileCommitted();
|
|
114
|
+
await review.projectionLoader.load();
|
|
115
|
+
const workbenchHost = createEvolutionWorkbenchCliHost({
|
|
116
|
+
tenantId: descriptor.tenantId,
|
|
117
|
+
projectionLoader: review.projectionLoader,
|
|
118
|
+
projectionAuthority: review.projectionAuthority,
|
|
119
|
+
identityProvider,
|
|
120
|
+
activeStateReader: rollback.activeStateReader,
|
|
121
|
+
batchExecutor: review.batchExecutor,
|
|
122
|
+
rollbackExecutor: rollback.rollbackExecutor,
|
|
123
|
+
});
|
|
124
|
+
return Object.freeze({
|
|
125
|
+
workbenchHost,
|
|
126
|
+
recovery: capture({
|
|
127
|
+
reviewsSettled: reviewRecovery.settledItems.length,
|
|
128
|
+
reviewPreparationsDeferred: reviewRecovery.deferredRequestDigests.length,
|
|
129
|
+
rollbacksSettled: rollbackRecovery.settledReceipts.length,
|
|
130
|
+
rollbackPlansDeferred: rollbackRecovery.deferredPlanDigests.length,
|
|
131
|
+
}),
|
|
132
|
+
});
|
|
133
|
+
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
+
import { types } from "node:util";
|
|
3
|
+
import { capturePruningData } from "./governed-wiki-pruning-journal.js";
|
|
2
4
|
|
|
3
5
|
import { filterEvolutionWorkbenchProjection } from "./evolution-workbench-projection.js";
|
|
4
6
|
|
|
@@ -156,7 +158,8 @@ export function buildEvolutionWorkbenchRollbackPlan(
|
|
|
156
158
|
});
|
|
157
159
|
}
|
|
158
160
|
|
|
159
|
-
function
|
|
161
|
+
export function verifyEvolutionWorkbenchRollbackPlan(input, tenantId) {
|
|
162
|
+
const plan = capturePruningData(input);
|
|
160
163
|
if (
|
|
161
164
|
plan?.schema !== EVOLUTION_WORKBENCH_ROLLBACK_PLAN_SCHEMA ||
|
|
162
165
|
plan.tenantId !== tenantId ||
|
|
@@ -170,9 +173,57 @@ function verifyPlan(plan, tenantId) {
|
|
|
170
173
|
return freeze(clone(plan));
|
|
171
174
|
}
|
|
172
175
|
|
|
176
|
+
export function buildEvolutionWorkbenchRollbackRequest(
|
|
177
|
+
plan,
|
|
178
|
+
authorizationReceiptDigest,
|
|
179
|
+
) {
|
|
180
|
+
const core = {
|
|
181
|
+
planDigest: plan.planDigest,
|
|
182
|
+
expectedActiveStateDigest: plan.expectedActiveStateDigest,
|
|
183
|
+
fromContentDigest: plan.fromContentDigest,
|
|
184
|
+
toContentDigest: plan.toContentDigest,
|
|
185
|
+
authorizationReceiptDigest: digest(
|
|
186
|
+
authorizationReceiptDigest,
|
|
187
|
+
"authorization receipt",
|
|
188
|
+
),
|
|
189
|
+
};
|
|
190
|
+
return freeze({
|
|
191
|
+
...core,
|
|
192
|
+
requestDigest: hash(
|
|
193
|
+
"chainlesschain.evolution-workbench-rollback-request/v1",
|
|
194
|
+
core,
|
|
195
|
+
),
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export function buildEvolutionWorkbenchRollbackReceipt(
|
|
200
|
+
plan,
|
|
201
|
+
request,
|
|
202
|
+
transitionReceiptDigest,
|
|
203
|
+
active,
|
|
204
|
+
) {
|
|
205
|
+
const core = {
|
|
206
|
+
schema: EVOLUTION_WORKBENCH_ROLLBACK_RECEIPT_SCHEMA,
|
|
207
|
+
tenantId: plan.tenantId,
|
|
208
|
+
skillName: plan.skillName,
|
|
209
|
+
planDigest: plan.planDigest,
|
|
210
|
+
requestDigest: request.requestDigest,
|
|
211
|
+
authorizationReceiptDigest: request.authorizationReceiptDigest,
|
|
212
|
+
transitionReceiptDigest,
|
|
213
|
+
activeStateDigest: active.stateDigest,
|
|
214
|
+
activeContentDigest: active.contentDigest,
|
|
215
|
+
};
|
|
216
|
+
return freeze({
|
|
217
|
+
...core,
|
|
218
|
+
receiptDigest: hash(EVOLUTION_WORKBENCH_ROLLBACK_RECEIPT_SCHEMA, core),
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
|
|
173
222
|
export class EvolutionWorkbenchRollbackExecutor {
|
|
174
223
|
constructor({ tenantId, ports } = {}) {
|
|
175
224
|
this.tenantId = string(tenantId, "tenantId");
|
|
225
|
+
if (!ports || types.isProxy(ports))
|
|
226
|
+
throw new TypeError("fixed rollback ports are required");
|
|
176
227
|
for (const name of [
|
|
177
228
|
"loadProjection",
|
|
178
229
|
"authorizeHumanRollback",
|
|
@@ -180,14 +231,16 @@ export class EvolutionWorkbenchRollbackExecutor {
|
|
|
180
231
|
"readActiveState",
|
|
181
232
|
"commitRollback",
|
|
182
233
|
]) {
|
|
183
|
-
|
|
234
|
+
const method = Object.getOwnPropertyDescriptor(ports, name)?.value;
|
|
235
|
+
if (typeof method !== "function" || types.isProxy(method))
|
|
184
236
|
throw new TypeError(`Workbench rollback port ${name} is required`);
|
|
185
|
-
this[`_${name}`] =
|
|
237
|
+
this[`_${name}`] = method.bind(ports);
|
|
186
238
|
}
|
|
239
|
+
Object.freeze(this);
|
|
187
240
|
}
|
|
188
241
|
|
|
189
242
|
async execute(input) {
|
|
190
|
-
const plan =
|
|
243
|
+
const plan = verifyEvolutionWorkbenchRollbackPlan(input, this.tenantId);
|
|
191
244
|
const projection = await this._loadProjection({
|
|
192
245
|
tenantId: this.tenantId,
|
|
193
246
|
projectionDigest: plan.sourceProjectionDigest,
|
|
@@ -210,20 +263,10 @@ export class EvolutionWorkbenchRollbackExecutor {
|
|
|
210
263
|
!DIGEST.test(authorization.receiptDigest ?? "")
|
|
211
264
|
)
|
|
212
265
|
throw new Error("Workbench rollback lacks exact human authorization");
|
|
213
|
-
const
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
toContentDigest: plan.toContentDigest,
|
|
218
|
-
authorizationReceiptDigest: authorization.receiptDigest,
|
|
219
|
-
};
|
|
220
|
-
const request = freeze({
|
|
221
|
-
...requestCore,
|
|
222
|
-
requestDigest: hash(
|
|
223
|
-
"chainlesschain.evolution-workbench-rollback-request/v1",
|
|
224
|
-
requestCore,
|
|
225
|
-
),
|
|
226
|
-
});
|
|
266
|
+
const request = buildEvolutionWorkbenchRollbackRequest(
|
|
267
|
+
plan,
|
|
268
|
+
authorization.receiptDigest,
|
|
269
|
+
);
|
|
227
270
|
const applied = await this._applyRollback(request);
|
|
228
271
|
if (
|
|
229
272
|
applied?.authenticated !== true ||
|
|
@@ -238,28 +281,19 @@ export class EvolutionWorkbenchRollbackExecutor {
|
|
|
238
281
|
});
|
|
239
282
|
if (
|
|
240
283
|
active?.authenticated !== true ||
|
|
284
|
+
active.durable !== true ||
|
|
285
|
+
active.tenantId !== this.tenantId ||
|
|
286
|
+
active.skillName !== plan.skillName ||
|
|
241
287
|
active.contentDigest !== plan.toContentDigest ||
|
|
242
288
|
!DIGEST.test(active.stateDigest ?? "")
|
|
243
289
|
)
|
|
244
290
|
throw new Error("Workbench rollback active readback differs from target");
|
|
245
|
-
const
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
authorizationReceiptDigest: authorization.receiptDigest,
|
|
252
|
-
transitionReceiptDigest: applied.receiptDigest,
|
|
253
|
-
activeStateDigest: active.stateDigest,
|
|
254
|
-
activeContentDigest: active.contentDigest,
|
|
255
|
-
};
|
|
256
|
-
const receipt = freeze({
|
|
257
|
-
...receiptCore,
|
|
258
|
-
receiptDigest: hash(
|
|
259
|
-
EVOLUTION_WORKBENCH_ROLLBACK_RECEIPT_SCHEMA,
|
|
260
|
-
receiptCore,
|
|
261
|
-
),
|
|
262
|
-
});
|
|
291
|
+
const receipt = buildEvolutionWorkbenchRollbackReceipt(
|
|
292
|
+
plan,
|
|
293
|
+
request,
|
|
294
|
+
applied.receiptDigest,
|
|
295
|
+
active,
|
|
296
|
+
);
|
|
263
297
|
const committed = await this._commitRollback({ receipt });
|
|
264
298
|
if (
|
|
265
299
|
committed?.authenticated !== true ||
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
const {
|
|
15
15
|
EVOLVABLE_ARTIFACT_PERSISTENCE_RECEIPT_SCHEMA,
|
|
16
16
|
EVOLVABLE_ARTIFACT_ACTIVE_RELEASE_SCHEMA,
|
|
17
|
+
EVOLVABLE_ARTIFACT_CANDIDATE_READ_SCHEMA,
|
|
17
18
|
EVOLVABLE_ARTIFACT_TRANSITION_REQUEST_SCHEMA,
|
|
18
19
|
EVOLVABLE_ARTIFACT_TRANSITION_RECEIPT_SCHEMA,
|
|
19
20
|
createEvolvableArtifactActiveReleaseReader,
|
|
@@ -510,6 +511,53 @@ export class EvolvableArtifactLedgerAdapter {
|
|
|
510
511
|
return reader;
|
|
511
512
|
}
|
|
512
513
|
|
|
514
|
+
candidateProvider() {
|
|
515
|
+
const adapter = this;
|
|
516
|
+
return Object.freeze({
|
|
517
|
+
readerScope: this.readerScope,
|
|
518
|
+
async readCandidate({ type, artifactId, candidateId } = {}) {
|
|
519
|
+
if (!ARTIFACT_TYPES.has(type))
|
|
520
|
+
throw new TypeError("candidate artifact type is invalid");
|
|
521
|
+
const normalizedArtifactId = text(artifactId, "artifactId");
|
|
522
|
+
const normalizedCandidateId = text(candidateId, "candidateId");
|
|
523
|
+
const matches = adapter
|
|
524
|
+
._events(EVOLVABLE_ARTIFACT_CANDIDATE_EVENT)
|
|
525
|
+
.map((event) =>
|
|
526
|
+
adapter._resolve(
|
|
527
|
+
event,
|
|
528
|
+
"evolvable-artifact-candidate",
|
|
529
|
+
"candidate",
|
|
530
|
+
),
|
|
531
|
+
)
|
|
532
|
+
.filter(
|
|
533
|
+
(record) =>
|
|
534
|
+
record.artifact.type === type &&
|
|
535
|
+
record.artifact.artifactId === normalizedArtifactId &&
|
|
536
|
+
record.artifact.candidate.candidateId === normalizedCandidateId,
|
|
537
|
+
);
|
|
538
|
+
if (matches.length > 1)
|
|
539
|
+
throw new Error("candidate artifact read is ambiguous");
|
|
540
|
+
if (matches.length === 0) return null;
|
|
541
|
+
const record = matches[0];
|
|
542
|
+
return freeze({
|
|
543
|
+
schema: EVOLVABLE_ARTIFACT_CANDIDATE_READ_SCHEMA,
|
|
544
|
+
authenticated: true,
|
|
545
|
+
durable: true,
|
|
546
|
+
tenantId: record.artifact.tenantId,
|
|
547
|
+
type: record.artifact.type,
|
|
548
|
+
artifactId: record.artifact.artifactId,
|
|
549
|
+
candidateId: record.artifact.candidate.candidateId,
|
|
550
|
+
contentDigest: record.artifact.contentDigest,
|
|
551
|
+
artifactDigest: record.artifact.artifactDigest,
|
|
552
|
+
artifact: record.artifact,
|
|
553
|
+
persistenceReceipt: record.receipt,
|
|
554
|
+
contentAvailable: record.contentAvailable,
|
|
555
|
+
content: record.content,
|
|
556
|
+
});
|
|
557
|
+
},
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
|
|
513
561
|
_activeArtifacts() {
|
|
514
562
|
const histories = new Map();
|
|
515
563
|
for (const event of this._events(EVOLVABLE_ARTIFACT_TRANSITION_EVENT)) {
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import { captureSkillCandidateRegistryReader } from "./skill-candidate-registry.js";
|
|
2
|
+
import { captureSkillReleaseRegistryReader } from "./skill-release-registry.js";
|
|
3
|
+
import { captureSkillReleaseOperationReader } from "./evolution-ledger-ports.js";
|
|
4
|
+
import { captureWikiRevisionReader } from "./wiki-maintainer-ledger-adapter.js";
|
|
5
|
+
import { governedKnowledgeSourceRef } from "./governed-knowledge-skill-rollback.js";
|
|
6
|
+
import {
|
|
7
|
+
createGovernedKnowledgeDependencyAuthority,
|
|
8
|
+
GOVERNED_KNOWLEDGE_DEPENDENCY_RESULT_SCHEMA,
|
|
9
|
+
digestGovernedKnowledgeDependencyResult,
|
|
10
|
+
} from "./governed-knowledge-dependency-authority.js";
|
|
11
|
+
import {
|
|
12
|
+
capturePruningData as captureData,
|
|
13
|
+
pruningDigest as digest,
|
|
14
|
+
pruningCanonical as canonical,
|
|
15
|
+
} from "./governed-wiki-pruning-journal.js";
|
|
16
|
+
|
|
17
|
+
const VERIFICATION_SCHEMA =
|
|
18
|
+
"chainlesschain.knowledge-candidate-rejection-verification/v1";
|
|
19
|
+
const QUARANTINE_VERIFICATION_SCHEMA =
|
|
20
|
+
"chainlesschain.knowledge-candidate-quarantine-verification/v1";
|
|
21
|
+
function fail(message) {
|
|
22
|
+
throw new Error(`knowledge candidate disposition: ${message}`);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function bindReader(
|
|
26
|
+
candidateRegistry,
|
|
27
|
+
releaseRegistry,
|
|
28
|
+
transactionLedger,
|
|
29
|
+
tenantId,
|
|
30
|
+
wikiAdapter,
|
|
31
|
+
) {
|
|
32
|
+
const candidates = captureSkillCandidateRegistryReader(candidateRegistry);
|
|
33
|
+
const releases = captureSkillReleaseRegistryReader(releaseRegistry);
|
|
34
|
+
if (
|
|
35
|
+
candidates.tenantId !== tenantId ||
|
|
36
|
+
releases.tenantId !== tenantId ||
|
|
37
|
+
!releases.matchesTransactionLedger(transactionLedger)
|
|
38
|
+
) {
|
|
39
|
+
throw new TypeError(
|
|
40
|
+
"candidate rejection registry/ledger tenant binding differs",
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
const operations = captureSkillReleaseOperationReader(transactionLedger);
|
|
44
|
+
const wiki =
|
|
45
|
+
wikiAdapter == null ? null : captureWikiRevisionReader(wikiAdapter);
|
|
46
|
+
if (
|
|
47
|
+
wiki &&
|
|
48
|
+
(wiki.descriptor.tenantId !== tenantId ||
|
|
49
|
+
!operations.matchesWikiAdapter(wikiAdapter))
|
|
50
|
+
)
|
|
51
|
+
throw new TypeError("candidate Wiki tenant differs");
|
|
52
|
+
return Object.freeze({ candidates, releases, operations, wiki });
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function sourceProof(reader, candidate, request, admission) {
|
|
56
|
+
const ref = governedKnowledgeSourceRef(request);
|
|
57
|
+
const direct = candidate.sourceEvidenceRefs.some(
|
|
58
|
+
(entry) => entry.ref === ref && entry.digest === request.contentDigest,
|
|
59
|
+
);
|
|
60
|
+
let wiki = null;
|
|
61
|
+
if (candidate.derivationMode === "wiki") {
|
|
62
|
+
if (!reader.wiki)
|
|
63
|
+
fail("Wiki-derived candidate requires an authenticated Wiki reader");
|
|
64
|
+
const revision = reader.wiki.readKnowledgeProvenance({
|
|
65
|
+
tenantId: request.tenantId,
|
|
66
|
+
revisionId: candidate.wikiRevision,
|
|
67
|
+
knowledgeId: request.knowledgeId,
|
|
68
|
+
contentDigest: request.contentDigest,
|
|
69
|
+
});
|
|
70
|
+
if (
|
|
71
|
+
["epoch", "ledgerId", "identityDigest"].some(
|
|
72
|
+
(key) => revision.checkpoint[key] !== admission.checkpoint[key],
|
|
73
|
+
) ||
|
|
74
|
+
revision.checkpoint.sequence >= admission.fence.sequence ||
|
|
75
|
+
admission.history.some(
|
|
76
|
+
(entry) => revision.checkpoint.sequence >= entry.preparationSequence,
|
|
77
|
+
)
|
|
78
|
+
) {
|
|
79
|
+
fail(
|
|
80
|
+
"Wiki provenance must precede revocation and every original promotion",
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
wiki = {
|
|
84
|
+
revisionId: revision.revisionId,
|
|
85
|
+
stateDigest: revision.stateDigest,
|
|
86
|
+
checkpoint: revision.checkpoint,
|
|
87
|
+
affectedPatternIds: revision.affectedPatternIds,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
if (!direct && !wiki?.affectedPatternIds.length)
|
|
91
|
+
fail("candidate source lineage does not identify the revoked Knowledge");
|
|
92
|
+
return captureData({ direct, wiki });
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function prove(reader, request, context, disposition) {
|
|
96
|
+
if (
|
|
97
|
+
request.dependency.kind !== "candidate" ||
|
|
98
|
+
request.dependency.disposition !== disposition
|
|
99
|
+
) {
|
|
100
|
+
fail(`this provider requires a candidate / ${disposition} dependency`);
|
|
101
|
+
}
|
|
102
|
+
const candidate = reader.candidates.read(request.dependency.digest);
|
|
103
|
+
if (
|
|
104
|
+
candidate.tenantId !== request.tenantId ||
|
|
105
|
+
candidate.candidateId !== request.dependency.digest
|
|
106
|
+
)
|
|
107
|
+
fail("candidate identity differs");
|
|
108
|
+
const resolve =
|
|
109
|
+
disposition === "quarantine"
|
|
110
|
+
? reader.operations.resolveCandidateQuarantine
|
|
111
|
+
: reader.operations.resolveCandidateRevocation;
|
|
112
|
+
const admission = resolve({
|
|
113
|
+
tenantId: request.tenantId,
|
|
114
|
+
skillName: candidate.skillName,
|
|
115
|
+
candidateId: candidate.candidateId,
|
|
116
|
+
operationDigest: request.operationDigest,
|
|
117
|
+
context,
|
|
118
|
+
});
|
|
119
|
+
if (!admission.fence || admission.fence.record.deviceId !== request.deviceId)
|
|
120
|
+
fail("no exact durable candidate admission fence");
|
|
121
|
+
const knowledge = admission.fence.record.knowledge;
|
|
122
|
+
for (const key of [
|
|
123
|
+
"tenantId",
|
|
124
|
+
"knowledgeId",
|
|
125
|
+
"action",
|
|
126
|
+
"contentDigest",
|
|
127
|
+
"revocationReceiptDigest",
|
|
128
|
+
]) {
|
|
129
|
+
if (knowledge[key] !== request[key])
|
|
130
|
+
fail("prepared revocation differs from request");
|
|
131
|
+
}
|
|
132
|
+
if (admission.pendingTransactions.length)
|
|
133
|
+
fail(
|
|
134
|
+
"in-flight release transition requires recovery before candidate disposition can settle",
|
|
135
|
+
);
|
|
136
|
+
const active = reader.releases.readActive(candidate.skillName);
|
|
137
|
+
if (
|
|
138
|
+
Boolean(active) !== Boolean(admission.current) ||
|
|
139
|
+
(active &&
|
|
140
|
+
(active.release.releaseDigest !== admission.current.releaseDigest ||
|
|
141
|
+
active.state.stateDigest !== admission.current.stateDigest ||
|
|
142
|
+
active.state.revision !== admission.current.revision ||
|
|
143
|
+
admission.current.projection.current !== true))
|
|
144
|
+
)
|
|
145
|
+
fail("actual active state differs from authenticated release history");
|
|
146
|
+
let lastKnownGood = null;
|
|
147
|
+
if (active) {
|
|
148
|
+
lastKnownGood = reader.releases.readRelease(
|
|
149
|
+
active.state.lastKnownGoodReleaseDigest,
|
|
150
|
+
);
|
|
151
|
+
if (
|
|
152
|
+
active.release.candidate.candidateId === candidate.candidateId ||
|
|
153
|
+
lastKnownGood.candidate.candidateId === candidate.candidateId
|
|
154
|
+
) {
|
|
155
|
+
fail(
|
|
156
|
+
"active or rollback-eligible candidate requires real release rollback first",
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const source = sourceProof(reader, candidate, request, admission);
|
|
161
|
+
if (canonical(reader.operations.currentContext()) !== canonical(context))
|
|
162
|
+
fail("ledger changed during candidate verification");
|
|
163
|
+
return captureData({
|
|
164
|
+
candidateId: candidate.candidateId,
|
|
165
|
+
skillName: candidate.skillName,
|
|
166
|
+
source,
|
|
167
|
+
admission,
|
|
168
|
+
active: active
|
|
169
|
+
? {
|
|
170
|
+
releaseDigest: active.release.releaseDigest,
|
|
171
|
+
stateDigest: active.state.stateDigest,
|
|
172
|
+
lastKnownGoodReleaseDigest: lastKnownGood.releaseDigest,
|
|
173
|
+
}
|
|
174
|
+
: null,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export function createGovernedKnowledgeCandidateRejectionAuthority(
|
|
179
|
+
options = {},
|
|
180
|
+
) {
|
|
181
|
+
return createCandidateDispositionAuthority(options, "reject-candidate");
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Quarantine is a distinct, persistent admission disposition, not rejection or
|
|
185
|
+
// a draft-label rewrite. Neither factory may certify an active/LKG candidate.
|
|
186
|
+
export function createGovernedKnowledgeCandidateQuarantineAuthority(
|
|
187
|
+
options = {},
|
|
188
|
+
) {
|
|
189
|
+
return createCandidateDispositionAuthority(options, "quarantine");
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function createCandidateDispositionAuthority(
|
|
193
|
+
{
|
|
194
|
+
tenantId,
|
|
195
|
+
deviceId,
|
|
196
|
+
candidateRegistry,
|
|
197
|
+
releaseRegistry,
|
|
198
|
+
transactionLedger,
|
|
199
|
+
verifierCandidateRegistry,
|
|
200
|
+
verifierReleaseRegistry,
|
|
201
|
+
verifierTransactionLedger,
|
|
202
|
+
wikiLedgerAdapter = null,
|
|
203
|
+
verifierWikiLedgerAdapter = null,
|
|
204
|
+
providerDescriptor,
|
|
205
|
+
verifierDescriptor,
|
|
206
|
+
},
|
|
207
|
+
disposition,
|
|
208
|
+
) {
|
|
209
|
+
if (
|
|
210
|
+
candidateRegistry === verifierCandidateRegistry ||
|
|
211
|
+
releaseRegistry === verifierReleaseRegistry ||
|
|
212
|
+
transactionLedger === verifierTransactionLedger ||
|
|
213
|
+
(wikiLedgerAdapter !== null &&
|
|
214
|
+
wikiLedgerAdapter === verifierWikiLedgerAdapter) ||
|
|
215
|
+
Boolean(wikiLedgerAdapter) !== Boolean(verifierWikiLedgerAdapter)
|
|
216
|
+
) {
|
|
217
|
+
throw new TypeError(
|
|
218
|
+
"candidate rejection requires independent fixed readers",
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
const provider = bindReader(
|
|
222
|
+
candidateRegistry,
|
|
223
|
+
releaseRegistry,
|
|
224
|
+
transactionLedger,
|
|
225
|
+
tenantId,
|
|
226
|
+
wikiLedgerAdapter,
|
|
227
|
+
);
|
|
228
|
+
const verifier = bindReader(
|
|
229
|
+
verifierCandidateRegistry,
|
|
230
|
+
verifierReleaseRegistry,
|
|
231
|
+
verifierTransactionLedger,
|
|
232
|
+
tenantId,
|
|
233
|
+
verifierWikiLedgerAdapter,
|
|
234
|
+
);
|
|
235
|
+
const providerHead = provider.operations.currentContext().checkpoint;
|
|
236
|
+
const verifierHead = verifier.operations.currentContext().checkpoint;
|
|
237
|
+
if (
|
|
238
|
+
["epoch", "ledgerId", "identityDigest"].some(
|
|
239
|
+
(key) => providerHead[key] !== verifierHead[key],
|
|
240
|
+
)
|
|
241
|
+
) {
|
|
242
|
+
throw new TypeError(
|
|
243
|
+
"candidate rejection readers belong to different ledgers",
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
if (
|
|
247
|
+
provider.wiki &&
|
|
248
|
+
canonical(provider.wiki.descriptor) !== canonical(verifier.wiki.descriptor)
|
|
249
|
+
)
|
|
250
|
+
throw new TypeError("candidate Wiki reader scopes differ");
|
|
251
|
+
const providerIdentity = captureData(providerDescriptor);
|
|
252
|
+
const verifierIdentity = captureData(verifierDescriptor);
|
|
253
|
+
function proofPair(request) {
|
|
254
|
+
const context = provider.operations.currentContext();
|
|
255
|
+
const other = verifier.operations.currentContext();
|
|
256
|
+
if (canonical(context) !== canonical(other))
|
|
257
|
+
fail("independent readers do not authenticate the same current ledger");
|
|
258
|
+
const left = prove(provider, request, context, disposition);
|
|
259
|
+
const right = prove(verifier, request, context, disposition);
|
|
260
|
+
if (canonical(left) !== canonical(right))
|
|
261
|
+
fail("independent candidate rejection proof differs");
|
|
262
|
+
return left;
|
|
263
|
+
}
|
|
264
|
+
return createGovernedKnowledgeDependencyAuthority({
|
|
265
|
+
tenantId,
|
|
266
|
+
deviceId,
|
|
267
|
+
providerDescriptor: providerIdentity,
|
|
268
|
+
verifierDescriptor: verifierIdentity,
|
|
269
|
+
provider: Object.freeze({
|
|
270
|
+
async apply(request) {
|
|
271
|
+
// Preparation already activated the mandatory admission fence. This
|
|
272
|
+
// authority certifies its real effect; it never changes a draft label
|
|
273
|
+
// or reports success while an active/in-flight version can survive.
|
|
274
|
+
const proof = proofPair(request);
|
|
275
|
+
const evidence = proof.admission.fence.evidence;
|
|
276
|
+
const core = {
|
|
277
|
+
schema: GOVERNED_KNOWLEDGE_DEPENDENCY_RESULT_SCHEMA,
|
|
278
|
+
tenantId,
|
|
279
|
+
deviceId,
|
|
280
|
+
operationId: request.operationId,
|
|
281
|
+
requestDigest: request.requestDigest,
|
|
282
|
+
knowledgeId: request.knowledgeId,
|
|
283
|
+
revocationReceiptDigest: request.revocationReceiptDigest,
|
|
284
|
+
dependencyKind: request.dependency.kind,
|
|
285
|
+
dependencyDigest: request.dependency.digest,
|
|
286
|
+
dependencyDisposition: request.dependency.disposition,
|
|
287
|
+
authorityId: providerIdentity.authorityId,
|
|
288
|
+
authorityRevision: providerIdentity.revision,
|
|
289
|
+
handlerArtifactDigest: providerIdentity.handlerArtifactDigest,
|
|
290
|
+
applied: true,
|
|
291
|
+
durable: true,
|
|
292
|
+
idempotent: true,
|
|
293
|
+
appliedAt: evidence.timestamp,
|
|
294
|
+
};
|
|
295
|
+
const { algorithm, keyId, value } = evidence.signature;
|
|
296
|
+
return captureData({
|
|
297
|
+
...core,
|
|
298
|
+
resultDigest: digestGovernedKnowledgeDependencyResult(core),
|
|
299
|
+
attestation: { algorithm, keyId, value },
|
|
300
|
+
});
|
|
301
|
+
},
|
|
302
|
+
}),
|
|
303
|
+
verifier: Object.freeze({
|
|
304
|
+
async verify({ request, result }) {
|
|
305
|
+
const proof = proofPair(request);
|
|
306
|
+
const evidence = proof.admission.fence.evidence;
|
|
307
|
+
const { algorithm, keyId, value } = evidence.signature;
|
|
308
|
+
if (
|
|
309
|
+
result.appliedAt !== evidence.timestamp ||
|
|
310
|
+
canonical(result.attestation) !==
|
|
311
|
+
canonical({ algorithm, keyId, value })
|
|
312
|
+
)
|
|
313
|
+
fail("result differs from authenticated admission fence");
|
|
314
|
+
return captureData({
|
|
315
|
+
authenticated: true,
|
|
316
|
+
durable: true,
|
|
317
|
+
tenantId,
|
|
318
|
+
deviceId,
|
|
319
|
+
operationId: request.operationId,
|
|
320
|
+
requestDigest: request.requestDigest,
|
|
321
|
+
resultDigest: result.resultDigest,
|
|
322
|
+
providerAuthorityId: providerIdentity.authorityId,
|
|
323
|
+
providerRevision: providerIdentity.revision,
|
|
324
|
+
verifierAuthorityId: verifierIdentity.authorityId,
|
|
325
|
+
verifierRevision: verifierIdentity.revision,
|
|
326
|
+
verificationReceiptDigest: digest(
|
|
327
|
+
disposition === "quarantine"
|
|
328
|
+
? QUARANTINE_VERIFICATION_SCHEMA
|
|
329
|
+
: VERIFICATION_SCHEMA,
|
|
330
|
+
{
|
|
331
|
+
tenantId,
|
|
332
|
+
deviceId,
|
|
333
|
+
requestDigest: request.requestDigest,
|
|
334
|
+
resultDigest: result.resultDigest,
|
|
335
|
+
proof,
|
|
336
|
+
verifierIdentity,
|
|
337
|
+
},
|
|
338
|
+
),
|
|
339
|
+
});
|
|
340
|
+
},
|
|
341
|
+
}),
|
|
342
|
+
});
|
|
343
|
+
}
|