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,403 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { types } from "node:util";
|
|
4
|
+
import { ArtifactStore } from "../artifact-store.js";
|
|
5
|
+
import { ensurePrivateDirectory } from "../secure-fs.js";
|
|
6
|
+
import { EvolutionArtifactPorts } from "./evolution-artifact-ports.js";
|
|
7
|
+
import { createEvolutionLedgerFileBackend } from "./evolution-ledger-file-backend.js";
|
|
8
|
+
import { createEvolutionLedgerPorts } from "./evolution-ledger-ports.js";
|
|
9
|
+
import { SkillReleaseRegistry } from "./skill-release-registry.js";
|
|
10
|
+
import { capturePruningData as capture } from "./governed-wiki-pruning-journal.js";
|
|
11
|
+
|
|
12
|
+
const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
|
|
13
|
+
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
14
|
+
const STORAGE_ID = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$/u;
|
|
15
|
+
const FILE_RESOURCES = new WeakSet();
|
|
16
|
+
|
|
17
|
+
export function captureWorkbenchFileResources(value) {
|
|
18
|
+
if (!FILE_RESOURCES.has(value))
|
|
19
|
+
throw new TypeError("genuine Workbench file resources are required");
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
const DESCRIPTOR_KEYS = [
|
|
23
|
+
"tenantId",
|
|
24
|
+
"artifactTenantId",
|
|
25
|
+
"streamId",
|
|
26
|
+
"runId",
|
|
27
|
+
"skillName",
|
|
28
|
+
"audience",
|
|
29
|
+
"purpose",
|
|
30
|
+
"authorityId",
|
|
31
|
+
"revision",
|
|
32
|
+
"handlerArtifactDigest",
|
|
33
|
+
];
|
|
34
|
+
const STORAGE_KEYS = [
|
|
35
|
+
"artifactDir",
|
|
36
|
+
"ledgerRootDir",
|
|
37
|
+
"ledgerAuthorityRootDir",
|
|
38
|
+
"witnessFilePath",
|
|
39
|
+
"witnessId",
|
|
40
|
+
"releaseRootDir",
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
function record(
|
|
44
|
+
value,
|
|
45
|
+
required,
|
|
46
|
+
optional = [],
|
|
47
|
+
label = "Workbench file resources",
|
|
48
|
+
) {
|
|
49
|
+
if (
|
|
50
|
+
!value ||
|
|
51
|
+
typeof value !== "object" ||
|
|
52
|
+
Array.isArray(value) ||
|
|
53
|
+
types.isProxy(value)
|
|
54
|
+
)
|
|
55
|
+
throw new TypeError(`${label} must be an explicit data record`);
|
|
56
|
+
const properties = Object.getOwnPropertyDescriptors(value);
|
|
57
|
+
const allowed = new Set([...required, ...optional]);
|
|
58
|
+
if (
|
|
59
|
+
required.some((key) => !Object.hasOwn(properties, key)) ||
|
|
60
|
+
Reflect.ownKeys(properties).some((key) => !allowed.has(key))
|
|
61
|
+
)
|
|
62
|
+
throw new TypeError(`${label} has missing or unsupported fields`);
|
|
63
|
+
const result = {};
|
|
64
|
+
for (const [key, property] of Object.entries(properties)) {
|
|
65
|
+
if (!Object.hasOwn(property, "value") || !property.enumerable)
|
|
66
|
+
throw new TypeError(`${label}.${key} must be an own data field`);
|
|
67
|
+
result[key] = property.value;
|
|
68
|
+
}
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function fixed(owner, name, label) {
|
|
73
|
+
if (!owner || typeof owner !== "object" || types.isProxy(owner))
|
|
74
|
+
throw new TypeError(`${label}.${name} port is required`);
|
|
75
|
+
const fn = Object.getOwnPropertyDescriptor(owner, name)?.value;
|
|
76
|
+
if (typeof fn !== "function" || types.isProxy(fn))
|
|
77
|
+
throw new TypeError(`${label}.${name} must be a fixed own method`);
|
|
78
|
+
return Object.freeze(fn.bind(owner));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function signingAuthority(input, label) {
|
|
82
|
+
const value = record(input, ["trust", "signer", "verifier"], [], label);
|
|
83
|
+
const trust = capture(
|
|
84
|
+
record(
|
|
85
|
+
value.trust,
|
|
86
|
+
["algorithm", "keyId", "trustPolicyDigest"],
|
|
87
|
+
[],
|
|
88
|
+
`${label}.trust`,
|
|
89
|
+
),
|
|
90
|
+
);
|
|
91
|
+
if (
|
|
92
|
+
typeof trust.algorithm !== "string" ||
|
|
93
|
+
!/^[a-z0-9][a-z0-9._+-]{0,63}$/u.test(trust.algorithm) ||
|
|
94
|
+
typeof trust.keyId !== "string" ||
|
|
95
|
+
trust.keyId.length > 256 ||
|
|
96
|
+
!/^[a-z][a-z0-9+.-]{1,31}:[^\s\\]+$/u.test(trust.keyId) ||
|
|
97
|
+
!DIGEST.test(trust.trustPolicyDigest)
|
|
98
|
+
)
|
|
99
|
+
throw new TypeError(`${label} trust is invalid`);
|
|
100
|
+
return Object.freeze({
|
|
101
|
+
trust,
|
|
102
|
+
signer: Object.freeze({ sign: fixed(value.signer, "sign", label) }),
|
|
103
|
+
verifier: Object.freeze({ verify: fixed(value.verifier, "verify", label) }),
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function normalizedPath(value, label) {
|
|
108
|
+
if (
|
|
109
|
+
typeof value !== "string" ||
|
|
110
|
+
!path.isAbsolute(value) ||
|
|
111
|
+
value.includes("\0")
|
|
112
|
+
)
|
|
113
|
+
throw new TypeError(`${label} must be an absolute path`);
|
|
114
|
+
const result = path.resolve(value);
|
|
115
|
+
if (result === path.parse(result).root)
|
|
116
|
+
throw new TypeError(`${label} must be a dedicated storage path`);
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function contained(parent, child) {
|
|
121
|
+
const relative = path.relative(parent, child);
|
|
122
|
+
return (
|
|
123
|
+
relative === "" ||
|
|
124
|
+
(relative !== ".." &&
|
|
125
|
+
!relative.startsWith(`..${path.sep}`) &&
|
|
126
|
+
!path.isAbsolute(relative))
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function assertNoAliases(io, target, directory = true) {
|
|
131
|
+
for (let current = target; ; current = path.dirname(current)) {
|
|
132
|
+
let stat;
|
|
133
|
+
try {
|
|
134
|
+
stat = io.lstatSync(current);
|
|
135
|
+
} catch (error) {
|
|
136
|
+
if (error.code !== "ENOENT") throw error;
|
|
137
|
+
}
|
|
138
|
+
if (stat) {
|
|
139
|
+
const actual = io.realpathSync(current);
|
|
140
|
+
if (stat.isSymbolicLink() || path.relative(actual, current) !== "")
|
|
141
|
+
throw new Error("Workbench storage aliases/symlinks are not allowed");
|
|
142
|
+
if (
|
|
143
|
+
current === target &&
|
|
144
|
+
(directory ? !stat.isDirectory() : !stat.isFile() || stat.nlink !== 1)
|
|
145
|
+
)
|
|
146
|
+
throw new Error(
|
|
147
|
+
"Workbench storage path has an invalid file type or link count",
|
|
148
|
+
);
|
|
149
|
+
if (current !== target && !stat.isDirectory())
|
|
150
|
+
throw new Error("Workbench storage ancestor is not a directory");
|
|
151
|
+
}
|
|
152
|
+
if (path.dirname(current) === current) break;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Opens real persistence, not a fixture or a permission authority. The caller
|
|
158
|
+
* still provides identity, human approval and mutation authority to the host.
|
|
159
|
+
* Returned writers are for the authenticated deployment module only, never RPC.
|
|
160
|
+
*/
|
|
161
|
+
export function openEvolutionWorkbenchFileResources(input) {
|
|
162
|
+
const options = record(
|
|
163
|
+
input,
|
|
164
|
+
["descriptor", "storage", "authorities"],
|
|
165
|
+
["secure", "fsImpl", "now"],
|
|
166
|
+
);
|
|
167
|
+
const descriptor = capture(
|
|
168
|
+
record(options.descriptor, DESCRIPTOR_KEYS, [], "Workbench descriptor"),
|
|
169
|
+
);
|
|
170
|
+
for (const key of [
|
|
171
|
+
"tenantId",
|
|
172
|
+
"artifactTenantId",
|
|
173
|
+
"streamId",
|
|
174
|
+
"runId",
|
|
175
|
+
"skillName",
|
|
176
|
+
"audience",
|
|
177
|
+
"authorityId",
|
|
178
|
+
])
|
|
179
|
+
if (typeof descriptor[key] !== "string" || !ID.test(descriptor[key]))
|
|
180
|
+
throw new TypeError(`Workbench ${key} is invalid`);
|
|
181
|
+
for (const key of ["artifactTenantId", "audience"])
|
|
182
|
+
if (!STORAGE_ID.test(descriptor[key]))
|
|
183
|
+
throw new TypeError(`Workbench storage ${key} is invalid`);
|
|
184
|
+
if (
|
|
185
|
+
descriptor.purpose !== "evolution-ledger" ||
|
|
186
|
+
!Number.isSafeInteger(descriptor.revision) ||
|
|
187
|
+
descriptor.revision < 1 ||
|
|
188
|
+
!DIGEST.test(descriptor.handlerArtifactDigest)
|
|
189
|
+
)
|
|
190
|
+
throw new TypeError(
|
|
191
|
+
"Workbench descriptor purpose/revision/handler digest is invalid",
|
|
192
|
+
);
|
|
193
|
+
const storage = record(
|
|
194
|
+
options.storage,
|
|
195
|
+
STORAGE_KEYS,
|
|
196
|
+
[],
|
|
197
|
+
"Workbench storage",
|
|
198
|
+
);
|
|
199
|
+
if (
|
|
200
|
+
typeof storage.witnessId !== "string" ||
|
|
201
|
+
!/^[A-Za-z0-9][A-Za-z0-9._:/-]{0,159}$/u.test(storage.witnessId)
|
|
202
|
+
)
|
|
203
|
+
throw new TypeError("Workbench witnessId is invalid");
|
|
204
|
+
for (const key of STORAGE_KEYS.filter((key) => key !== "witnessId"))
|
|
205
|
+
storage[key] = normalizedPath(storage[key], key);
|
|
206
|
+
const directories = [
|
|
207
|
+
storage.artifactDir,
|
|
208
|
+
storage.ledgerRootDir,
|
|
209
|
+
storage.ledgerAuthorityRootDir,
|
|
210
|
+
storage.releaseRootDir,
|
|
211
|
+
path.dirname(storage.witnessFilePath),
|
|
212
|
+
];
|
|
213
|
+
for (let i = 0; i < directories.length; i++)
|
|
214
|
+
for (let j = i + 1; j < directories.length; j++)
|
|
215
|
+
if (
|
|
216
|
+
contained(directories[i], directories[j]) ||
|
|
217
|
+
contained(directories[j], directories[i])
|
|
218
|
+
)
|
|
219
|
+
throw new Error(
|
|
220
|
+
"Workbench artifact, Ledger, authority, witness and Registry storage must be non-overlapping",
|
|
221
|
+
);
|
|
222
|
+
|
|
223
|
+
const secure = options.secure === undefined ? true : options.secure;
|
|
224
|
+
if (typeof secure !== "boolean")
|
|
225
|
+
throw new TypeError("Workbench secure must be boolean");
|
|
226
|
+
const io = options.fsImpl ?? fs;
|
|
227
|
+
if (!io || typeof io !== "object" || types.isProxy(io))
|
|
228
|
+
throw new TypeError("Workbench filesystem is invalid");
|
|
229
|
+
const clock = options.now ?? Date.now;
|
|
230
|
+
if (typeof clock !== "function" || types.isProxy(clock))
|
|
231
|
+
throw new TypeError("Workbench clock must be a fixed function");
|
|
232
|
+
const now = Object.freeze(() => {
|
|
233
|
+
const value = Number(clock());
|
|
234
|
+
if (!Number.isFinite(value) || Math.abs(value) > 8_640_000_000_000_000)
|
|
235
|
+
throw new TypeError("Workbench clock is invalid");
|
|
236
|
+
return value;
|
|
237
|
+
});
|
|
238
|
+
now();
|
|
239
|
+
const authorities = record(
|
|
240
|
+
options.authorities,
|
|
241
|
+
["artifact", "ledger", "witness", "releaseDurability"],
|
|
242
|
+
[],
|
|
243
|
+
"Workbench authorities",
|
|
244
|
+
);
|
|
245
|
+
const artifact = record(
|
|
246
|
+
authorities.artifact,
|
|
247
|
+
["envelopeSigner", "envelopeVerifier", "currentAuthorityResolver"],
|
|
248
|
+
[],
|
|
249
|
+
"Workbench artifact authority",
|
|
250
|
+
);
|
|
251
|
+
const artifactAuthority = {
|
|
252
|
+
envelopeSigner: Object.freeze({
|
|
253
|
+
sign: fixed(artifact.envelopeSigner, "sign", "artifact"),
|
|
254
|
+
}),
|
|
255
|
+
envelopeVerifier: Object.freeze({
|
|
256
|
+
verify: fixed(artifact.envelopeVerifier, "verify", "artifact"),
|
|
257
|
+
}),
|
|
258
|
+
currentAuthorityResolver: Object.freeze({
|
|
259
|
+
resolve: fixed(artifact.currentAuthorityResolver, "resolve", "artifact"),
|
|
260
|
+
}),
|
|
261
|
+
};
|
|
262
|
+
const ledgerAuthority = signingAuthority(authorities.ledger, "ledger");
|
|
263
|
+
const witnessAuthority = signingAuthority(authorities.witness, "witness");
|
|
264
|
+
// Check original identities before capturing wrappers, which must not disguise
|
|
265
|
+
// use of the same authority for the event log and its independent witness.
|
|
266
|
+
if (
|
|
267
|
+
authorities.ledger === authorities.witness ||
|
|
268
|
+
authorities.ledger.signer === authorities.witness.signer ||
|
|
269
|
+
authorities.ledger.verifier === authorities.witness.verifier ||
|
|
270
|
+
ledgerAuthority.trust.keyId === witnessAuthority.trust.keyId ||
|
|
271
|
+
ledgerAuthority.trust.trustPolicyDigest ===
|
|
272
|
+
witnessAuthority.trust.trustPolicyDigest
|
|
273
|
+
)
|
|
274
|
+
throw new TypeError(
|
|
275
|
+
"Workbench Ledger and witness authorities must be independent",
|
|
276
|
+
);
|
|
277
|
+
const durability = record(
|
|
278
|
+
authorities.releaseDurability,
|
|
279
|
+
["id", "retain", "resolve"],
|
|
280
|
+
[],
|
|
281
|
+
"release durability authority",
|
|
282
|
+
);
|
|
283
|
+
if (typeof durability.id !== "string" || !STORAGE_ID.test(durability.id))
|
|
284
|
+
throw new TypeError("release durability authority id is invalid");
|
|
285
|
+
const artifactDurabilityAuthority = Object.freeze({
|
|
286
|
+
id: durability.id,
|
|
287
|
+
retain: fixed(
|
|
288
|
+
authorities.releaseDurability,
|
|
289
|
+
"retain",
|
|
290
|
+
"release durability",
|
|
291
|
+
),
|
|
292
|
+
resolve: fixed(
|
|
293
|
+
authorities.releaseDurability,
|
|
294
|
+
"resolve",
|
|
295
|
+
"release durability",
|
|
296
|
+
),
|
|
297
|
+
});
|
|
298
|
+
// All configuration and authority ports are captured before any storage opens.
|
|
299
|
+
for (const target of directories) assertNoAliases(io, target);
|
|
300
|
+
assertNoAliases(io, storage.witnessFilePath, false);
|
|
301
|
+
if (secure) {
|
|
302
|
+
for (const target of [
|
|
303
|
+
storage.artifactDir,
|
|
304
|
+
path.dirname(storage.witnessFilePath),
|
|
305
|
+
])
|
|
306
|
+
ensurePrivateDirectory(target, {
|
|
307
|
+
applyWindowsAcl: true,
|
|
308
|
+
failIfUnavailable: true,
|
|
309
|
+
deps: { fs: io },
|
|
310
|
+
});
|
|
311
|
+
} else {
|
|
312
|
+
io.mkdirSync(path.dirname(storage.witnessFilePath), {
|
|
313
|
+
recursive: true,
|
|
314
|
+
mode: 0o700,
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
function open() {
|
|
318
|
+
for (const target of directories) assertNoAliases(io, target);
|
|
319
|
+
const artifactPorts = new EvolutionArtifactPorts({
|
|
320
|
+
artifactStore: new ArtifactStore({ dir: storage.artifactDir, now }),
|
|
321
|
+
tenantId: descriptor.artifactTenantId,
|
|
322
|
+
audience: descriptor.audience,
|
|
323
|
+
...artifactAuthority,
|
|
324
|
+
now,
|
|
325
|
+
});
|
|
326
|
+
const ledgerArtifactResolver =
|
|
327
|
+
artifactPorts.createEvolutionLedgerArtifactResolver({
|
|
328
|
+
purpose: descriptor.purpose,
|
|
329
|
+
});
|
|
330
|
+
const { ledger } = createEvolutionLedgerFileBackend({
|
|
331
|
+
rootDir: storage.ledgerRootDir,
|
|
332
|
+
authorityRootDir: storage.ledgerAuthorityRootDir,
|
|
333
|
+
witnessFilePath: storage.witnessFilePath,
|
|
334
|
+
witnessId: storage.witnessId,
|
|
335
|
+
ledgerAuthority,
|
|
336
|
+
witnessAuthority,
|
|
337
|
+
artifactResolver: ledgerArtifactResolver,
|
|
338
|
+
secure,
|
|
339
|
+
fsImpl: io,
|
|
340
|
+
clock: now,
|
|
341
|
+
});
|
|
342
|
+
const ports = createEvolutionLedgerPorts({
|
|
343
|
+
artifactPorts,
|
|
344
|
+
ledger,
|
|
345
|
+
artifactTenantId: descriptor.artifactTenantId,
|
|
346
|
+
audience: descriptor.audience,
|
|
347
|
+
purpose: descriptor.purpose,
|
|
348
|
+
artifactDurabilityAuthority,
|
|
349
|
+
});
|
|
350
|
+
// Constructor authenticates and recovers the actual Registry journal.
|
|
351
|
+
const releaseRegistry = new SkillReleaseRegistry({
|
|
352
|
+
tenantId: descriptor.tenantId,
|
|
353
|
+
rootDir: storage.releaseRootDir,
|
|
354
|
+
transactionLedger: ports.transactionLedger,
|
|
355
|
+
secure,
|
|
356
|
+
fsImpl: io,
|
|
357
|
+
});
|
|
358
|
+
return {
|
|
359
|
+
artifactPorts,
|
|
360
|
+
ledger,
|
|
361
|
+
ledgerArtifactResolver,
|
|
362
|
+
releaseRegistry,
|
|
363
|
+
...ports,
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
const primary = open();
|
|
367
|
+
const verifier = open();
|
|
368
|
+
for (const target of directories) assertNoAliases(io, target);
|
|
369
|
+
assertNoAliases(io, storage.witnessFilePath, false);
|
|
370
|
+
// Authenticate both complete stores now, not just their constructor shapes.
|
|
371
|
+
const left = primary.ledger.verify();
|
|
372
|
+
const right = verifier.ledger.verify();
|
|
373
|
+
for (const key of [
|
|
374
|
+
"epoch",
|
|
375
|
+
"ledgerId",
|
|
376
|
+
"identityDigest",
|
|
377
|
+
"sequence",
|
|
378
|
+
"headDigest",
|
|
379
|
+
])
|
|
380
|
+
if (left[key] !== right[key])
|
|
381
|
+
throw new Error("Workbench file readers disagree at startup");
|
|
382
|
+
const result = Object.freeze({
|
|
383
|
+
runtimeResources: Object.freeze({
|
|
384
|
+
descriptor,
|
|
385
|
+
artifactPorts: primary.artifactPorts,
|
|
386
|
+
ledger: primary.ledger,
|
|
387
|
+
ledgerArtifactResolver: primary.ledgerArtifactResolver,
|
|
388
|
+
releaseRegistry: primary.releaseRegistry,
|
|
389
|
+
transactionLedger: primary.transactionLedger,
|
|
390
|
+
verifierLedger: verifier.ledger,
|
|
391
|
+
verifierLedgerArtifactResolver: verifier.ledgerArtifactResolver,
|
|
392
|
+
verifierReleaseRegistry: verifier.releaseRegistry,
|
|
393
|
+
verifierTransactionLedger: verifier.transactionLedger,
|
|
394
|
+
now,
|
|
395
|
+
}),
|
|
396
|
+
mutationPorts: Object.freeze({
|
|
397
|
+
auditSink: primary.auditSink,
|
|
398
|
+
nonceStore: primary.nonceStore,
|
|
399
|
+
}),
|
|
400
|
+
});
|
|
401
|
+
FILE_RESOURCES.add(result);
|
|
402
|
+
return result;
|
|
403
|
+
}
|
|
@@ -8,12 +8,18 @@ import {
|
|
|
8
8
|
verifySkillPromotionReviewDecision,
|
|
9
9
|
verifySkillPromotionReviewPacketArtifact,
|
|
10
10
|
} from "./skill-promotion-review.js";
|
|
11
|
+
import {
|
|
12
|
+
captureWorkbenchRegistrySource,
|
|
13
|
+
verifyWorkbenchRegistryState,
|
|
14
|
+
} from "./evolution-workbench-registry-source.js";
|
|
11
15
|
|
|
12
16
|
const { projectEvolutionRun } = evolutionRun;
|
|
13
17
|
const { verifySkillInvocationReceipt } = skillInvocationReceipt;
|
|
14
18
|
|
|
15
19
|
export const EVOLUTION_WORKBENCH_PROJECTION_SCHEMA =
|
|
16
20
|
"chainlesschain.evolution-workbench-projection/v1";
|
|
21
|
+
export const EVOLUTION_WORKBENCH_REGISTRY_PROJECTION_SCHEMA =
|
|
22
|
+
"chainlesschain.evolution-workbench-projection/v2";
|
|
17
23
|
export const EVOLUTION_WORKBENCH_BATCH_PLAN_SCHEMA =
|
|
18
24
|
"chainlesschain.evolution-workbench-batch-plan/v1";
|
|
19
25
|
export const EVOLUTION_WORKBENCH_MAX_ITEMS = 10_000;
|
|
@@ -232,7 +238,8 @@ export function createEvolutionWorkbenchDataSource({
|
|
|
232
238
|
skillName: skillNameInput,
|
|
233
239
|
runAdapter,
|
|
234
240
|
reviewAdapter,
|
|
235
|
-
transitionAdapter,
|
|
241
|
+
transitionAdapter = null,
|
|
242
|
+
registrySource = null,
|
|
236
243
|
invocationReceiptSource = null,
|
|
237
244
|
pilotSource = null,
|
|
238
245
|
} = {}) {
|
|
@@ -241,11 +248,23 @@ export function createEvolutionWorkbenchDataSource({
|
|
|
241
248
|
const skillName = identifier(skillNameInput, "skillName");
|
|
242
249
|
const loadRun = capture(runAdapter, "load", "runAdapter");
|
|
243
250
|
const listReviews = capture(reviewAdapter, "listReviews", "reviewAdapter");
|
|
244
|
-
const
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
251
|
+
const registryReader =
|
|
252
|
+
registrySource === null
|
|
253
|
+
? null
|
|
254
|
+
: captureWorkbenchRegistrySource(registrySource);
|
|
255
|
+
if (
|
|
256
|
+
registryReader &&
|
|
257
|
+
(transitionAdapter !== null ||
|
|
258
|
+
registryReader.descriptor.tenantId !== tenantId ||
|
|
259
|
+
registryReader.descriptor.skillName !== skillName ||
|
|
260
|
+
registryReader.descriptor.runId !== runId)
|
|
261
|
+
)
|
|
262
|
+
throw new TypeError(
|
|
263
|
+
"Workbench Registry source scope differs or has a second transition authority",
|
|
264
|
+
);
|
|
265
|
+
const listTransitions = registryReader
|
|
266
|
+
? null
|
|
267
|
+
: capture(transitionAdapter, "list", "transitionAdapter");
|
|
249
268
|
const listInvocations =
|
|
250
269
|
invocationReceiptSource === null
|
|
251
270
|
? () => []
|
|
@@ -259,6 +278,7 @@ export function createEvolutionWorkbenchDataSource({
|
|
|
259
278
|
runId,
|
|
260
279
|
skillName,
|
|
261
280
|
async load() {
|
|
281
|
+
const context = registryReader?.currentContext();
|
|
262
282
|
const run = normalizeRun(await loadRun(), { tenantId, runId });
|
|
263
283
|
const reviews = normalizeReviews(await listReviews(), {
|
|
264
284
|
tenantId,
|
|
@@ -278,10 +298,14 @@ export function createEvolutionWorkbenchDataSource({
|
|
|
278
298
|
const reviewPacketDigests = new Set(
|
|
279
299
|
reviews.map(({ packet }) => packet.packetDigest),
|
|
280
300
|
);
|
|
281
|
-
const
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
301
|
+
const registryData = registryReader?.load();
|
|
302
|
+
const transitions = normalizeTransitions(
|
|
303
|
+
registryData ? registryData.transitions : await listTransitions(),
|
|
304
|
+
{
|
|
305
|
+
tenantId,
|
|
306
|
+
skillName,
|
|
307
|
+
},
|
|
308
|
+
);
|
|
285
309
|
for (const { request } of transitions) {
|
|
286
310
|
if (!run.projection.registry.candidates[request.candidateId]) {
|
|
287
311
|
throw new Error(
|
|
@@ -289,13 +313,16 @@ export function createEvolutionWorkbenchDataSource({
|
|
|
289
313
|
);
|
|
290
314
|
}
|
|
291
315
|
}
|
|
292
|
-
|
|
316
|
+
const result = deepFreeze({
|
|
293
317
|
run,
|
|
294
318
|
reviews,
|
|
295
319
|
transitions,
|
|
320
|
+
registry: registryData?.registry ?? null,
|
|
296
321
|
invocations: normalizeInvocations(await listInvocations(), { runId }),
|
|
297
322
|
pilot: normalizePilot(await readPilot(), { reviewPacketDigests }),
|
|
298
323
|
});
|
|
324
|
+
if (registryReader) registryReader.assertCurrent(context);
|
|
325
|
+
return result;
|
|
299
326
|
},
|
|
300
327
|
});
|
|
301
328
|
DATA_SOURCES.add(source);
|
|
@@ -563,15 +590,17 @@ export async function buildEvolutionWorkbenchProjection(
|
|
|
563
590
|
normalizeTime(observedAt, "observedAt");
|
|
564
591
|
const data = await source.load();
|
|
565
592
|
const activeReleaseId = data.run.projection.registry.activeReleaseId;
|
|
566
|
-
const activeCandidateIds =
|
|
567
|
-
data.
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
593
|
+
const activeCandidateIds = data.registry
|
|
594
|
+
? new Set(data.registry.active ? [data.registry.active.candidateId] : [])
|
|
595
|
+
: new Set(
|
|
596
|
+
data.transitions
|
|
597
|
+
.filter(
|
|
598
|
+
({ status, settlement }) =>
|
|
599
|
+
status === "committed" &&
|
|
600
|
+
settlement?.activeReleaseDigest === activeReleaseId,
|
|
601
|
+
)
|
|
602
|
+
.map(({ settlement }) => settlement.candidateId),
|
|
603
|
+
);
|
|
575
604
|
const candidates = data.reviews.map((review) =>
|
|
576
605
|
candidateView(review, data.invocations, activeCandidateIds),
|
|
577
606
|
);
|
|
@@ -579,14 +608,61 @@ export async function buildEvolutionWorkbenchProjection(
|
|
|
579
608
|
...runTimeline(data.run.events),
|
|
580
609
|
...reviewTimeline(data.reviews),
|
|
581
610
|
...transitionTimeline(data.transitions),
|
|
611
|
+
...(data.registry?.operations ?? []).map((operation) => ({
|
|
612
|
+
id: `release:${operation.transactionId}`,
|
|
613
|
+
sequence: operation.sequence ?? operation.preparationSequence,
|
|
614
|
+
phase:
|
|
615
|
+
operation.status === "prepared"
|
|
616
|
+
? `release-${operation.operation}-prepared`
|
|
617
|
+
: operation.operation === "rollback"
|
|
618
|
+
? "release-rolled-back"
|
|
619
|
+
: "release-promoted",
|
|
620
|
+
status: operation.status,
|
|
621
|
+
subjectId: operation.candidateId,
|
|
622
|
+
digest: operation.receiptDigest,
|
|
623
|
+
artifactRef: null,
|
|
624
|
+
occurredAt: operation.occurredAt,
|
|
625
|
+
source: "release-registry",
|
|
626
|
+
detail: {
|
|
627
|
+
operationId: operation.operationId,
|
|
628
|
+
requestDigest: operation.requestDigest,
|
|
629
|
+
releaseDigest: operation.releaseDigest,
|
|
630
|
+
fromReleaseDigest: operation.fromReleaseDigest,
|
|
631
|
+
stateDigest: operation.stateDigest,
|
|
632
|
+
transactionId: operation.transactionId,
|
|
633
|
+
},
|
|
634
|
+
})),
|
|
582
635
|
].sort(timelineOrder);
|
|
583
636
|
const conflicts = conflictsFor(candidates, data.transitions, data.pilot);
|
|
637
|
+
for (const operation of data.registry?.operations ?? [])
|
|
638
|
+
if (operation.status === "prepared")
|
|
639
|
+
conflicts.push({
|
|
640
|
+
type: "pending-registry-effect",
|
|
641
|
+
candidateId: operation.candidateId,
|
|
642
|
+
packetDigest: null,
|
|
643
|
+
reason: "actual Registry transaction has not finalized",
|
|
644
|
+
});
|
|
645
|
+
if (
|
|
646
|
+
data.registry?.active &&
|
|
647
|
+
!candidates.some((candidate) => candidate.actualUsage.active)
|
|
648
|
+
)
|
|
649
|
+
conflicts.push({
|
|
650
|
+
type: "active-outside-run",
|
|
651
|
+
candidateId: data.registry.active.candidateId,
|
|
652
|
+
packetDigest: null,
|
|
653
|
+
reason:
|
|
654
|
+
"current Registry release is outside this run's review candidates",
|
|
655
|
+
});
|
|
656
|
+
const schema = data.registry
|
|
657
|
+
? EVOLUTION_WORKBENCH_REGISTRY_PROJECTION_SCHEMA
|
|
658
|
+
: EVOLUTION_WORKBENCH_PROJECTION_SCHEMA;
|
|
584
659
|
const core = {
|
|
585
|
-
schema
|
|
660
|
+
schema,
|
|
586
661
|
tenantId: source.tenantId,
|
|
587
662
|
runId: source.runId,
|
|
588
663
|
skillName: source.skillName,
|
|
589
664
|
observedAt,
|
|
665
|
+
...(data.registry ? { registry: data.registry } : {}),
|
|
590
666
|
run: {
|
|
591
667
|
status: data.run.projection.status,
|
|
592
668
|
projectionDigest: data.run.projection.projectionDigest,
|
|
@@ -608,6 +684,9 @@ export async function buildEvolutionWorkbenchProjection(
|
|
|
608
684
|
rejectedCount: candidates.filter(({ status }) => status === "rejected")
|
|
609
685
|
.length,
|
|
610
686
|
transitionCount: data.transitions.length,
|
|
687
|
+
...(data.registry
|
|
688
|
+
? { registryOperationCount: data.registry.operations.length }
|
|
689
|
+
: {}),
|
|
611
690
|
invocationCount: data.invocations.length,
|
|
612
691
|
conflictCount: conflicts.length,
|
|
613
692
|
},
|
|
@@ -618,7 +697,7 @@ export async function buildEvolutionWorkbenchProjection(
|
|
|
618
697
|
};
|
|
619
698
|
return deepFreeze({
|
|
620
699
|
...core,
|
|
621
|
-
projectionDigest: hash(
|
|
700
|
+
projectionDigest: hash(schema, core),
|
|
622
701
|
});
|
|
623
702
|
}
|
|
624
703
|
|
|
@@ -627,10 +706,13 @@ export function filterEvolutionWorkbenchProjection(
|
|
|
627
706
|
{ query = "", status = null, offset = 0, limit = 100 } = {},
|
|
628
707
|
) {
|
|
629
708
|
if (
|
|
630
|
-
|
|
709
|
+
![
|
|
710
|
+
EVOLUTION_WORKBENCH_PROJECTION_SCHEMA,
|
|
711
|
+
EVOLUTION_WORKBENCH_REGISTRY_PROJECTION_SCHEMA,
|
|
712
|
+
].includes(projection?.schema) ||
|
|
631
713
|
projection.projectionDigest !==
|
|
632
714
|
hash(
|
|
633
|
-
|
|
715
|
+
projection.schema,
|
|
634
716
|
Object.fromEntries(
|
|
635
717
|
Object.entries(projection).filter(
|
|
636
718
|
([key]) => key !== "projectionDigest",
|
|
@@ -642,6 +724,28 @@ export function filterEvolutionWorkbenchProjection(
|
|
|
642
724
|
"a verified Evolution Workbench projection is required",
|
|
643
725
|
);
|
|
644
726
|
}
|
|
727
|
+
const registry =
|
|
728
|
+
projection.schema === EVOLUTION_WORKBENCH_REGISTRY_PROJECTION_SCHEMA
|
|
729
|
+
? verifyWorkbenchRegistryState(
|
|
730
|
+
projection.registry,
|
|
731
|
+
projection.tenantId,
|
|
732
|
+
projection.skillName,
|
|
733
|
+
)
|
|
734
|
+
: null;
|
|
735
|
+
if (
|
|
736
|
+
registry &&
|
|
737
|
+
(projection.summary.registryOperationCount !== registry.operations.length ||
|
|
738
|
+
projection.candidates.some(
|
|
739
|
+
(candidate) =>
|
|
740
|
+
candidate.actualUsage.active !==
|
|
741
|
+
(candidate.candidateId === registry.active?.candidateId &&
|
|
742
|
+
candidate.candidateContentDigest ===
|
|
743
|
+
registry.active?.contentDigest),
|
|
744
|
+
))
|
|
745
|
+
)
|
|
746
|
+
throw new Error(
|
|
747
|
+
"Workbench candidate activity differs from current Registry state",
|
|
748
|
+
);
|
|
645
749
|
if (
|
|
646
750
|
!Number.isSafeInteger(offset) ||
|
|
647
751
|
offset < 0 ||
|
|
@@ -679,8 +783,12 @@ export function filterEvolutionWorkbenchProjection(
|
|
|
679
783
|
});
|
|
680
784
|
const governance = {
|
|
681
785
|
runStatus: projection.run.status,
|
|
682
|
-
activeReleaseId:
|
|
683
|
-
|
|
786
|
+
activeReleaseId: registry
|
|
787
|
+
? (registry.active?.releaseDigest ?? null)
|
|
788
|
+
: projection.run.activeReleaseId,
|
|
789
|
+
lastKnownGoodReleaseId: registry
|
|
790
|
+
? (registry.active?.lastKnownGoodReleaseDigest ?? null)
|
|
791
|
+
: projection.run.lastKnownGoodReleaseId,
|
|
684
792
|
conflictCount: projection.summary.conflictCount,
|
|
685
793
|
pilot:
|
|
686
794
|
projection.pilot === null
|