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
|
@@ -13,6 +13,10 @@ import {
|
|
|
13
13
|
verifySkillPromotionReviewDecision,
|
|
14
14
|
verifySkillPromotionReviewPacketArtifact,
|
|
15
15
|
} from "./skill-promotion-review.js";
|
|
16
|
+
import {
|
|
17
|
+
SKILL_WIKI_REVIEW_DECISION_SCHEMA,
|
|
18
|
+
createSkillWikiReviewReconciliationSource,
|
|
19
|
+
} from "./skill-wiki-reconciliation.js";
|
|
16
20
|
|
|
17
21
|
export const SKILL_PROMOTION_REVIEW_REQUEST_EVENT_TYPE =
|
|
18
22
|
"skill.promotion-review.requested";
|
|
@@ -298,6 +302,9 @@ export class SkillPromotionReviewLedgerAdapter {
|
|
|
298
302
|
) {
|
|
299
303
|
throw new Error("review decision signature verification failed");
|
|
300
304
|
}
|
|
305
|
+
// The verifier may perform I/O. Do not commit an approval whose lease
|
|
306
|
+
// expired while that verification was in flight.
|
|
307
|
+
verifySkillPromotionReviewDecision(decision, packet, Number(this._now()));
|
|
301
308
|
const decisionsForPacket = this._decisionEntries().filter(
|
|
302
309
|
({ decision: stored }) => stored.packetDigest === packet.packetDigest,
|
|
303
310
|
);
|
|
@@ -400,6 +407,67 @@ export class SkillPromotionReviewLedgerAdapter {
|
|
|
400
407
|
return Object.freeze(output);
|
|
401
408
|
}
|
|
402
409
|
|
|
410
|
+
// Historical evidence is not a fresh approval. Workbench recovery may use
|
|
411
|
+
// this only to reconcile an effect already committed to this exact Ledger.
|
|
412
|
+
async readReview(packetDigest) {
|
|
413
|
+
if (!DIGEST.test(packetDigest ?? ""))
|
|
414
|
+
throw new TypeError("packetDigest is required");
|
|
415
|
+
const head = this._verifyLedger();
|
|
416
|
+
const { packet, event: packetEvent } = this._packetByDigest(packetDigest);
|
|
417
|
+
const matches = this._decisionEntries().filter(
|
|
418
|
+
({ decision }) => decision.packetDigest === packetDigest,
|
|
419
|
+
);
|
|
420
|
+
if (matches.length > 1) corrupt("review packet has conflicting decisions");
|
|
421
|
+
const entry = matches[0] ?? null;
|
|
422
|
+
for (const event of [packetEvent, entry?.event].filter(Boolean)) {
|
|
423
|
+
if (
|
|
424
|
+
event.artifactTenantId !== this.descriptor.artifactTenantId ||
|
|
425
|
+
event.skillName !== packet.skillName ||
|
|
426
|
+
packet.tenantId !== this.descriptor.tenantId
|
|
427
|
+
)
|
|
428
|
+
corrupt("review evidence crossed its durable scope");
|
|
429
|
+
}
|
|
430
|
+
if (
|
|
431
|
+
packetEvent.decision !== "proposed" ||
|
|
432
|
+
packetEvent.sourceRefs.length !== 0
|
|
433
|
+
)
|
|
434
|
+
corrupt("review packet lineage is invalid");
|
|
435
|
+
if (entry) {
|
|
436
|
+
verifySkillPromotionReviewDecision(
|
|
437
|
+
entry.decision,
|
|
438
|
+
packet,
|
|
439
|
+
Date.parse(entry.decision.decidedAt),
|
|
440
|
+
);
|
|
441
|
+
if (
|
|
442
|
+
entry.event.sequence <= packetEvent.sequence ||
|
|
443
|
+
entry.event.timestamp !== entry.decision.decidedAt ||
|
|
444
|
+
entry.event.reason !== entry.decision.reason ||
|
|
445
|
+
entry.event.decision !==
|
|
446
|
+
(entry.decision.decision === "approved" ? "accepted" : "rejected")
|
|
447
|
+
)
|
|
448
|
+
corrupt("review decision event binding is invalid");
|
|
449
|
+
if (
|
|
450
|
+
(await this._verifyDecisionSignature({
|
|
451
|
+
decision: entry.decision,
|
|
452
|
+
packet,
|
|
453
|
+
source: "workbench-recovery",
|
|
454
|
+
ledgerEventDigest: entry.event.eventDigest,
|
|
455
|
+
})) !== true
|
|
456
|
+
)
|
|
457
|
+
throw new Error("review decision signature verification failed");
|
|
458
|
+
}
|
|
459
|
+
if (this._verifyLedger().headDigest !== head.headDigest)
|
|
460
|
+
corrupt("review Ledger changed during evidence authentication");
|
|
461
|
+
return Object.freeze({
|
|
462
|
+
packet,
|
|
463
|
+
packetRef: packetEvent.subjectRef,
|
|
464
|
+
packetSequence: packetEvent.sequence,
|
|
465
|
+
decision: entry?.decision ?? null,
|
|
466
|
+
decisionRef: entry?.event.subjectRef ?? null,
|
|
467
|
+
decisionSequence: entry?.event.sequence ?? null,
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
|
|
403
471
|
createDecisionResolver() {
|
|
404
472
|
return Object.freeze({
|
|
405
473
|
resolve: async (request) => {
|
|
@@ -444,6 +512,38 @@ export class SkillPromotionReviewLedgerAdapter {
|
|
|
444
512
|
},
|
|
445
513
|
});
|
|
446
514
|
}
|
|
515
|
+
|
|
516
|
+
createWikiRejectionReconciliationSource() {
|
|
517
|
+
return createSkillWikiReviewReconciliationSource({
|
|
518
|
+
tenantId: this.descriptor.tenantId,
|
|
519
|
+
streamId: `${this.descriptor.streamId}:wiki-rejections`,
|
|
520
|
+
readReviewDecisions: async () => {
|
|
521
|
+
await this.listReviews();
|
|
522
|
+
return this._decisionEntries()
|
|
523
|
+
.filter(({ decision }) => decision.decision === "rejected")
|
|
524
|
+
.map(({ decision, event }) => {
|
|
525
|
+
const { packet } = this._packetByDigest(decision.packetDigest);
|
|
526
|
+
return {
|
|
527
|
+
schema: SKILL_WIKI_REVIEW_DECISION_SCHEMA,
|
|
528
|
+
authenticated: true,
|
|
529
|
+
durable: true,
|
|
530
|
+
tenantId: this.descriptor.tenantId,
|
|
531
|
+
streamId: `${this.descriptor.streamId}:wiki-rejections`,
|
|
532
|
+
sequence: event.sequence,
|
|
533
|
+
candidateId: packet.candidateId,
|
|
534
|
+
skillName: packet.skillName,
|
|
535
|
+
decision: decision.decision,
|
|
536
|
+
reason: decision.reason,
|
|
537
|
+
occurredAt: decision.decidedAt,
|
|
538
|
+
packetDigest: decision.packetDigest,
|
|
539
|
+
decisionReceiptDigest: decision.receiptDigest,
|
|
540
|
+
sourceEvidenceRefs: packet.evidenceSummary,
|
|
541
|
+
sourceReceiptDigest: event.eventDigest,
|
|
542
|
+
};
|
|
543
|
+
});
|
|
544
|
+
},
|
|
545
|
+
});
|
|
546
|
+
}
|
|
447
547
|
}
|
|
448
548
|
|
|
449
549
|
export function createSkillPromotionReviewLedgerAdapter(options) {
|
|
@@ -8,7 +8,10 @@ import {
|
|
|
8
8
|
import {
|
|
9
9
|
EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA,
|
|
10
10
|
EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA,
|
|
11
|
+
EVOLUTION_LEDGER_MAX_EVENTS,
|
|
12
|
+
EvolutionLedger,
|
|
11
13
|
} from "./evolution-ledger.js";
|
|
14
|
+
import { captureSkillReleaseRegistryReader } from "./skill-release-registry.js";
|
|
12
15
|
import {
|
|
13
16
|
EMPTY_SKILL_ACTIVE_DIGEST,
|
|
14
17
|
captureSkillEvaluatedPromotionControlPlane,
|
|
@@ -22,6 +25,10 @@ import {
|
|
|
22
25
|
digestSkillMutationTransitionSubject,
|
|
23
26
|
verifySkillMutationRequest,
|
|
24
27
|
} from "./skill-mutation-authority.js";
|
|
28
|
+
import {
|
|
29
|
+
SKILL_WIKI_TRANSITION_SCHEMA,
|
|
30
|
+
createSkillWikiReconciliationSource,
|
|
31
|
+
} from "./skill-wiki-reconciliation.js";
|
|
25
32
|
|
|
26
33
|
export const SKILL_REGISTRY_TRANSITION_REQUEST_SCHEMA =
|
|
27
34
|
"chainlesschain.skill-registry-transition-request/v1";
|
|
@@ -125,6 +132,85 @@ const SETTLEMENT_KEYS = new Set([
|
|
|
125
132
|
"settlementDigest",
|
|
126
133
|
]);
|
|
127
134
|
const AUTHORIZATION_TTL_MS = 4 * 60_000;
|
|
135
|
+
const sortedRefs = (refs) =>
|
|
136
|
+
[...refs].sort((left, right) =>
|
|
137
|
+
left.ref < right.ref
|
|
138
|
+
? -1
|
|
139
|
+
: left.ref > right.ref
|
|
140
|
+
? 1
|
|
141
|
+
: left.digest < right.digest
|
|
142
|
+
? -1
|
|
143
|
+
: left.digest > right.digest
|
|
144
|
+
? 1
|
|
145
|
+
: 0,
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
// Read-only assembly over the same canonical parsing/effect checks as the
|
|
149
|
+
// transition writer. No source verifier, mutation authority or writer is
|
|
150
|
+
// invented merely to inspect existing workflow records.
|
|
151
|
+
export function createSkillRegistryTransitionLedgerReader({
|
|
152
|
+
descriptor,
|
|
153
|
+
ledger,
|
|
154
|
+
ledgerArtifactResolver,
|
|
155
|
+
releaseRegistry,
|
|
156
|
+
} = {}) {
|
|
157
|
+
if (
|
|
158
|
+
!(ledger instanceof EvolutionLedger) ||
|
|
159
|
+
utilTypes.isProxy(ledger) ||
|
|
160
|
+
!isEvolutionLedgerArtifactResolver(ledgerArtifactResolver)
|
|
161
|
+
)
|
|
162
|
+
throw new TypeError(
|
|
163
|
+
"transition reader requires actual Ledger and artifact resolver",
|
|
164
|
+
);
|
|
165
|
+
const registry = captureSkillReleaseRegistryReader(releaseRegistry);
|
|
166
|
+
const scope = normalizeDescriptor(descriptor);
|
|
167
|
+
if (registry.tenantId !== scope.tenantId)
|
|
168
|
+
throw new TypeError("transition reader Registry tenant differs");
|
|
169
|
+
const view = {
|
|
170
|
+
descriptor: scope,
|
|
171
|
+
_readLedger: () =>
|
|
172
|
+
EvolutionLedger.prototype.read.call(ledger, {
|
|
173
|
+
limit: EVOLUTION_LEDGER_MAX_EVENTS,
|
|
174
|
+
}),
|
|
175
|
+
_verifyLedger: EvolutionLedger.prototype.verify.bind(ledger),
|
|
176
|
+
_resolveArtifact: ledgerArtifactResolver,
|
|
177
|
+
_readState: registry.readState,
|
|
178
|
+
_readRelease: registry.readRelease,
|
|
179
|
+
};
|
|
180
|
+
for (const name of [
|
|
181
|
+
"_events",
|
|
182
|
+
"_resolveEvent",
|
|
183
|
+
"_requests",
|
|
184
|
+
"_attempts",
|
|
185
|
+
"_settlements",
|
|
186
|
+
"_verifyCommittedSettlement",
|
|
187
|
+
"list",
|
|
188
|
+
])
|
|
189
|
+
view[name] =
|
|
190
|
+
SkillRegistryTransitionLedgerAdapter.prototype[name].bind(view);
|
|
191
|
+
Object.freeze(view);
|
|
192
|
+
return Object.freeze({
|
|
193
|
+
list() {
|
|
194
|
+
const before = view._verifyLedger();
|
|
195
|
+
const rows = view.list();
|
|
196
|
+
const settlements = rows.some((row) => row.status === "committed")
|
|
197
|
+
? view._settlements()
|
|
198
|
+
: [];
|
|
199
|
+
const values = rows.map((row) => ({
|
|
200
|
+
...row,
|
|
201
|
+
settlementEventSequence:
|
|
202
|
+
settlements.find(
|
|
203
|
+
(entry) => entry.settlement.requestId === row.request.requestId,
|
|
204
|
+
)?.event.sequence ?? null,
|
|
205
|
+
}));
|
|
206
|
+
if (values.length > 10_000 || !same(before, view._verifyLedger()))
|
|
207
|
+
throw new Error(
|
|
208
|
+
"transition history is over budget or changed during authentication",
|
|
209
|
+
);
|
|
210
|
+
return deepFreeze(values);
|
|
211
|
+
},
|
|
212
|
+
});
|
|
213
|
+
}
|
|
128
214
|
|
|
129
215
|
function canonical(value) {
|
|
130
216
|
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
@@ -703,8 +789,13 @@ export class SkillRegistryTransitionLedgerAdapter {
|
|
|
703
789
|
event.skillName !== settlement.skillName ||
|
|
704
790
|
!Array.isArray(event.sourceRefs) ||
|
|
705
791
|
event.sourceRefs.length !== 2 ||
|
|
706
|
-
!same(
|
|
707
|
-
|
|
792
|
+
!same(
|
|
793
|
+
event.sourceRefs,
|
|
794
|
+
sortedRefs([
|
|
795
|
+
attempt.request.event.subjectRef,
|
|
796
|
+
attempt.event.subjectRef,
|
|
797
|
+
]),
|
|
798
|
+
)
|
|
708
799
|
) {
|
|
709
800
|
fail(
|
|
710
801
|
SKILL_REGISTRY_TRANSITION_CORRUPT_CODE,
|
|
@@ -1174,6 +1265,44 @@ export class SkillRegistryTransitionLedgerAdapter {
|
|
|
1174
1265
|
);
|
|
1175
1266
|
}
|
|
1176
1267
|
|
|
1268
|
+
createWikiReconciliationSource() {
|
|
1269
|
+
return createSkillWikiReconciliationSource({
|
|
1270
|
+
tenantId: this.descriptor.tenantId,
|
|
1271
|
+
streamId: this.descriptor.streamId,
|
|
1272
|
+
readTransitions: () =>
|
|
1273
|
+
this._settlements().map(({ event, settlement }) => {
|
|
1274
|
+
const candidate = this._readCandidate(settlement.candidateId);
|
|
1275
|
+
if (
|
|
1276
|
+
candidate?.tenantId !== this.descriptor.tenantId ||
|
|
1277
|
+
candidate.candidateId !== settlement.candidateId ||
|
|
1278
|
+
candidate.skillName !== settlement.skillName
|
|
1279
|
+
) {
|
|
1280
|
+
fail(
|
|
1281
|
+
SKILL_REGISTRY_TRANSITION_CORRUPT_CODE,
|
|
1282
|
+
"transition candidate lineage is invalid for Wiki reconciliation",
|
|
1283
|
+
);
|
|
1284
|
+
}
|
|
1285
|
+
return {
|
|
1286
|
+
schema: SKILL_WIKI_TRANSITION_SCHEMA,
|
|
1287
|
+
authenticated: true,
|
|
1288
|
+
durable: true,
|
|
1289
|
+
tenantId: this.descriptor.tenantId,
|
|
1290
|
+
streamId: this.descriptor.streamId,
|
|
1291
|
+
sequence: event.sequence,
|
|
1292
|
+
candidateId: settlement.candidateId,
|
|
1293
|
+
skillName: settlement.skillName,
|
|
1294
|
+
activeReleaseDigest: settlement.activeReleaseDigest,
|
|
1295
|
+
stateDigest: settlement.stateDigest,
|
|
1296
|
+
settlementDigest: settlement.settlementDigest,
|
|
1297
|
+
occurredAt: settlement.settledAt,
|
|
1298
|
+
wikiRevision: candidate.wikiRevision,
|
|
1299
|
+
sourceEvidenceRefs: candidate.sourceEvidenceRefs,
|
|
1300
|
+
sourceReceiptDigest: event.eventDigest,
|
|
1301
|
+
};
|
|
1302
|
+
}),
|
|
1303
|
+
});
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1177
1306
|
async processNext() {
|
|
1178
1307
|
const pending = this.list().find((entry) => entry.status === "pending");
|
|
1179
1308
|
if (!pending) return deepFreeze({ processed: false });
|
|
@@ -60,6 +60,17 @@ export const SKILL_RELEASE_JOURNAL_ARCHIVE_SCHEMA =
|
|
|
60
60
|
"chainlesschain.skill-release-journal-archive/v1";
|
|
61
61
|
|
|
62
62
|
const JOURNAL_SCHEMA = "chainlesschain.skill-release-journal/v4";
|
|
63
|
+
const REGISTRY_READERS = new WeakMap();
|
|
64
|
+
|
|
65
|
+
export function captureSkillReleaseRegistryReader(value) {
|
|
66
|
+
const reader = REGISTRY_READERS.get(value);
|
|
67
|
+
if (
|
|
68
|
+
!reader ||
|
|
69
|
+
Object.getPrototypeOf(value) !== SkillReleaseRegistry.prototype
|
|
70
|
+
)
|
|
71
|
+
throw new TypeError("a genuine SkillReleaseRegistry reader is required");
|
|
72
|
+
return reader;
|
|
73
|
+
}
|
|
63
74
|
const INTENT_SCHEMA = "chainlesschain.skill-release-transition-intent/v2";
|
|
64
75
|
const RELEASE_DOMAIN = `${SKILL_RELEASE_SCHEMA}\0`;
|
|
65
76
|
const STATE_DOMAIN = `${SKILL_RELEASE_STATE_SCHEMA}\0`;
|
|
@@ -76,6 +87,9 @@ const TENANT_KEY_PATTERN = /^[a-f0-9]{64}$/u;
|
|
|
76
87
|
const TEMP_PATTERN = /^\.(?:release|state|write)-[A-Za-z0-9._-]+\.tmp$/u;
|
|
77
88
|
const MAX_FILE_BYTES = 4 * 1024 * 1024;
|
|
78
89
|
const MAX_TENANT_MARKER_BYTES = 4096;
|
|
90
|
+
export const SKILL_RELEASE_INVENTORY_MAX_ENTRIES = 4_096;
|
|
91
|
+
export const SKILL_RELEASE_INVENTORY_MAX_BYTES = 32 * 1024 * 1024;
|
|
92
|
+
export const SKILL_RELEASE_INVENTORY_MAX_NODES = 1_000_000;
|
|
79
93
|
const MAX_CANONICAL_DEPTH = 32;
|
|
80
94
|
const MAX_CANONICAL_NODES = 100_000;
|
|
81
95
|
const MAX_CANONICAL_ARRAY_ENTRIES = 65_536;
|
|
@@ -2765,6 +2779,18 @@ export class SkillReleaseRegistry {
|
|
|
2765
2779
|
{ cause },
|
|
2766
2780
|
);
|
|
2767
2781
|
}
|
|
2782
|
+
REGISTRY_READERS.set(
|
|
2783
|
+
this,
|
|
2784
|
+
Object.freeze({
|
|
2785
|
+
tenantId: ownerTenantId,
|
|
2786
|
+
readActive: SkillReleaseRegistry.prototype.readActive.bind(this),
|
|
2787
|
+
readState: SkillReleaseRegistry.prototype.readState.bind(this),
|
|
2788
|
+
readRelease: SkillReleaseRegistry.prototype.readRelease.bind(this),
|
|
2789
|
+
readInventory:
|
|
2790
|
+
SkillReleaseRegistry.prototype.readInventory.bind(this),
|
|
2791
|
+
matchesTransactionLedger: (value) => value === transactionLedger,
|
|
2792
|
+
}),
|
|
2793
|
+
);
|
|
2768
2794
|
Object.freeze(this);
|
|
2769
2795
|
}
|
|
2770
2796
|
|
|
@@ -3677,7 +3703,7 @@ export class SkillReleaseRegistry {
|
|
|
3677
3703
|
});
|
|
3678
3704
|
let projection;
|
|
3679
3705
|
try {
|
|
3680
|
-
projection = this.#ledgerMigrate(request);
|
|
3706
|
+
projection = this.#ledgerMigrate(request, { active, lastKnownGood });
|
|
3681
3707
|
} catch (cause) {
|
|
3682
3708
|
throw failure(
|
|
3683
3709
|
"SKILL_RELEASE_STATE_MIGRATION_LEDGER_FAILED",
|
|
@@ -3861,6 +3887,144 @@ export class SkillReleaseRegistry {
|
|
|
3861
3887
|
});
|
|
3862
3888
|
}
|
|
3863
3889
|
|
|
3890
|
+
#readInventoryNames(area, pattern) {
|
|
3891
|
+
const directory = this.#directories[area]?.path;
|
|
3892
|
+
if (!directory || typeof this.#fs.opendirSync !== "function") {
|
|
3893
|
+
throw failure(
|
|
3894
|
+
"SKILL_RELEASE_STORE_UNSAFE",
|
|
3895
|
+
"release inventory requires bounded directory enumeration",
|
|
3896
|
+
);
|
|
3897
|
+
}
|
|
3898
|
+
const names = [];
|
|
3899
|
+
let handle = null;
|
|
3900
|
+
let enumerationError = null;
|
|
3901
|
+
try {
|
|
3902
|
+
handle = this.#fs.opendirSync(directory);
|
|
3903
|
+
while (true) {
|
|
3904
|
+
const entry = handle.readSync();
|
|
3905
|
+
if (entry === null) break;
|
|
3906
|
+
if (
|
|
3907
|
+
!entry ||
|
|
3908
|
+
typeof entry.name !== "string" ||
|
|
3909
|
+
!pattern.test(entry.name)
|
|
3910
|
+
) {
|
|
3911
|
+
throw failure(
|
|
3912
|
+
"SKILL_RELEASE_STORE_UNSAFE",
|
|
3913
|
+
`release inventory found an unexpected ${area} entry`,
|
|
3914
|
+
);
|
|
3915
|
+
}
|
|
3916
|
+
if (names.length >= SKILL_RELEASE_INVENTORY_MAX_ENTRIES) {
|
|
3917
|
+
throw failure(
|
|
3918
|
+
"SKILL_RELEASE_STORE_LIMIT",
|
|
3919
|
+
`release inventory ${area} entry limit was exceeded`,
|
|
3920
|
+
);
|
|
3921
|
+
}
|
|
3922
|
+
names.push(entry.name);
|
|
3923
|
+
}
|
|
3924
|
+
} catch (cause) {
|
|
3925
|
+
enumerationError =
|
|
3926
|
+
cause instanceof SkillReleaseRegistryError
|
|
3927
|
+
? cause
|
|
3928
|
+
: failure(
|
|
3929
|
+
"SKILL_RELEASE_STORE_UNSAFE",
|
|
3930
|
+
`release inventory could not enumerate ${area} safely`,
|
|
3931
|
+
{ cause },
|
|
3932
|
+
);
|
|
3933
|
+
}
|
|
3934
|
+
if (handle !== null && typeof handle.closeSync === "function") {
|
|
3935
|
+
try {
|
|
3936
|
+
handle.closeSync();
|
|
3937
|
+
} catch (cause) {
|
|
3938
|
+
enumerationError = failure(
|
|
3939
|
+
"SKILL_RELEASE_STORE_UNSAFE",
|
|
3940
|
+
`release inventory could not close ${area} safely`,
|
|
3941
|
+
{ cause, enumerationError },
|
|
3942
|
+
);
|
|
3943
|
+
}
|
|
3944
|
+
}
|
|
3945
|
+
if (enumerationError !== null) throw enumerationError;
|
|
3946
|
+
return names.sort();
|
|
3947
|
+
}
|
|
3948
|
+
|
|
3949
|
+
readInventory() {
|
|
3950
|
+
this.#assertBoundary();
|
|
3951
|
+
const releasePattern = /^[a-f0-9]{64}\.json$/u;
|
|
3952
|
+
const statePattern = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*\.json$/u;
|
|
3953
|
+
const beforeReleases = this.#readInventoryNames(
|
|
3954
|
+
"artifacts",
|
|
3955
|
+
releasePattern,
|
|
3956
|
+
);
|
|
3957
|
+
const beforeStates = this.#readInventoryNames("active", statePattern);
|
|
3958
|
+
if (
|
|
3959
|
+
beforeReleases.length + beforeStates.length >
|
|
3960
|
+
SKILL_RELEASE_INVENTORY_MAX_ENTRIES
|
|
3961
|
+
) {
|
|
3962
|
+
throw failure(
|
|
3963
|
+
"SKILL_RELEASE_STORE_LIMIT",
|
|
3964
|
+
"release inventory aggregate entry limit was exceeded",
|
|
3965
|
+
);
|
|
3966
|
+
}
|
|
3967
|
+
const releases = beforeReleases.map((name) =>
|
|
3968
|
+
this.readRelease(`sha256:${name.slice(0, -".json".length)}`),
|
|
3969
|
+
);
|
|
3970
|
+
const active = beforeStates.map((name) => {
|
|
3971
|
+
const skill = name.slice(0, -".json".length);
|
|
3972
|
+
const value = this.readActive(skill);
|
|
3973
|
+
if (value === null) {
|
|
3974
|
+
throw failure(
|
|
3975
|
+
"SKILL_RELEASE_STATE_CORRUPT",
|
|
3976
|
+
"persisted active state has no committed release",
|
|
3977
|
+
);
|
|
3978
|
+
}
|
|
3979
|
+
return deepFreeze({ skillName: skill, ...value });
|
|
3980
|
+
});
|
|
3981
|
+
let bytes = 0;
|
|
3982
|
+
let nodes = 0;
|
|
3983
|
+
const stack = [...releases, ...active.map(({ state }) => state)];
|
|
3984
|
+
for (const value of stack) {
|
|
3985
|
+
bytes += Buffer.byteLength(canonicalJson(value), "utf8");
|
|
3986
|
+
const pending = [value];
|
|
3987
|
+
while (pending.length > 0) {
|
|
3988
|
+
const node = pending.pop();
|
|
3989
|
+
nodes += 1;
|
|
3990
|
+
if (nodes > SKILL_RELEASE_INVENTORY_MAX_NODES) {
|
|
3991
|
+
throw failure(
|
|
3992
|
+
"SKILL_RELEASE_STORE_LIMIT",
|
|
3993
|
+
"release inventory aggregate node limit was exceeded",
|
|
3994
|
+
);
|
|
3995
|
+
}
|
|
3996
|
+
if (node !== null && typeof node === "object") {
|
|
3997
|
+
pending.push(...(Array.isArray(node) ? node : Object.values(node)));
|
|
3998
|
+
}
|
|
3999
|
+
}
|
|
4000
|
+
}
|
|
4001
|
+
if (bytes > SKILL_RELEASE_INVENTORY_MAX_BYTES) {
|
|
4002
|
+
throw failure(
|
|
4003
|
+
"SKILL_RELEASE_STORE_LIMIT",
|
|
4004
|
+
"release inventory aggregate byte limit was exceeded",
|
|
4005
|
+
);
|
|
4006
|
+
}
|
|
4007
|
+
const afterReleases = this.#readInventoryNames("artifacts", releasePattern);
|
|
4008
|
+
const afterStates = this.#readInventoryNames("active", statePattern);
|
|
4009
|
+
const afterStateDigests = afterStates.map((name) =>
|
|
4010
|
+
this.readState(name.slice(0, -".json".length)).stateDigest,
|
|
4011
|
+
);
|
|
4012
|
+
if (
|
|
4013
|
+
canonicalJson(beforeReleases) !== canonicalJson(afterReleases) ||
|
|
4014
|
+
canonicalJson(beforeStates) !== canonicalJson(afterStates) ||
|
|
4015
|
+
active.some(
|
|
4016
|
+
({ state }, index) => state.stateDigest !== afterStateDigests[index],
|
|
4017
|
+
)
|
|
4018
|
+
) {
|
|
4019
|
+
throw failure(
|
|
4020
|
+
"SKILL_RELEASE_STORE_UNSAFE",
|
|
4021
|
+
"release inventory changed during authenticated enumeration",
|
|
4022
|
+
);
|
|
4023
|
+
}
|
|
4024
|
+
this.#assertBoundary();
|
|
4025
|
+
return deepFreeze({ active, releases });
|
|
4026
|
+
}
|
|
4027
|
+
|
|
3864
4028
|
pinActive(name) {
|
|
3865
4029
|
const active = this.readActive(name);
|
|
3866
4030
|
if (!active)
|
|
@@ -4606,10 +4770,10 @@ export class SkillReleaseRegistry {
|
|
|
4606
4770
|
);
|
|
4607
4771
|
}
|
|
4608
4772
|
|
|
4609
|
-
#prepare(intent) {
|
|
4773
|
+
#prepare(intent, targetRelease) {
|
|
4610
4774
|
let projection;
|
|
4611
4775
|
try {
|
|
4612
|
-
projection = this.#ledgerPrepare(intent);
|
|
4776
|
+
projection = this.#ledgerPrepare(intent, targetRelease);
|
|
4613
4777
|
} catch (cause) {
|
|
4614
4778
|
throw failure(
|
|
4615
4779
|
"SKILL_RELEASE_LEDGER_PREPARE_FAILED",
|
|
@@ -5374,7 +5538,7 @@ export class SkillReleaseRegistry {
|
|
|
5374
5538
|
await this.#crash("after-journal", journal);
|
|
5375
5539
|
|
|
5376
5540
|
this.#renewLease(lease);
|
|
5377
|
-
prepareReceipt = this.#prepare(intent);
|
|
5541
|
+
prepareReceipt = this.#prepare(intent, target);
|
|
5378
5542
|
journal = this.#persistJournal({
|
|
5379
5543
|
...journal,
|
|
5380
5544
|
phase: "prepared",
|