chainlesschain 0.166.21 → 0.166.24
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 +67 -9
- package/package.json +4 -3
- package/src/assets/web-panel/assets/{AIOps-BjMnsUci.js → AIOps-DR-MWcZc.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DdYFP03A.js → ActionButton-DT8B7sEb.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Bb8TuuK_.js → Analytics-asjh3dQJ.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-Kn3TIOtk.js → AppLayout-DivQ491i.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-4IxpqI_b.js → Artifacts-DPH2uUmy.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BOV2caqU.js → Audit-Bp2nLyc-.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-B86k-ay4.js → BackgroundAgents-CHS28khl.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-C5_ie1e3.js → Backup-CKeaFSfz.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-xpwg6QCW.js → BaseInput-CxwM9BAH.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CVZOcZau.js → Chat-DYLDwaCv.js} +4 -4
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-D8fPYhUu.js → ChatBubbleRenderer-DdBJDBP0.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-MKTq3zdP.js → Checkbox-uYTWOB8j.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-JUk3wzep.js → Codegen-CvYa_dwT.js} +1 -1
- package/src/assets/web-panel/assets/{Col-JPvTA0kC.js → Col-CanMAX4m.js} +1 -1
- package/src/assets/web-panel/assets/{Community-Tqgl87NQ.js → Community-B4WaDtHw.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BuAFYBmN.js → Compact-K93Uof_3.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CXS9WIPZ.js → Compliance-CKeDLgUW.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Ds2bFHrr.js → Cowork-P93grAeB.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-C_dV_OeW.js → Cron-BSHnMtDn.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BsO6tIRo.js → Crosschain-epAOpUVJ.js} +1 -1
- package/src/assets/web-panel/assets/{DID-rNOFqBac.js → DID-ByjXfP7t.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-C2fcKKVY.js → Dashboard-QztTU8tb.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-Y7Ndr0X_.js → Dropdown-DhUc9yhN.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DcP_uPmL.js → EmailListRenderer-C2sLhJJN.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-Cwn3gDzk.js → FamilyGuardDashboard-CdfbWNDn.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-ClQuOsqb.js → Federation-CcF_R7NW.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DfwtmlcK.js → FormItemContext-Cm_X2IBk.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-zNZhtbC5.js → GenericCardRenderer-DUi4NWlb.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BZmdW-G5.js → Git-4Sq5FjBt.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CqBk4lEn.js → Governance-Dx2_v4V6.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-Dbmt3ZXk.js → Inference-7Vr1xekR.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-hMTH6qf3.js → KnowledgeGraph-Cnd2XOzf.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CkiYgiW2.js → Logs-B66QPVf-.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-BL1FElXg.js → MarkdownRenderer-PLsEvhly.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-CbB6wfin.js → Marketplace-BMIK9BmC.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BSwiFtte.js → McpTools-BDbyp3J_.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-B03PeHrz.js → Memory-CJdzfZGi.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CRGrnd-X.js → MobileBridge-C2TH5Y3-.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CE_5v2kO.js → MobileProjects-D1dYXkvV.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-Dp11QVx1.js → Mtc-B-4A1I1j.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-CYu-3JBu.js → MtcAudit-Bgcc9UOl.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-CGyJ0Xl3.js → Multisig-DqOe-etP.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CoWi_ov1.js → NLProgramming-7VnhzE_6.js} +1 -1
- package/src/assets/web-panel/assets/Notes-BxawpeUQ.js +7 -0
- package/src/assets/web-panel/assets/{NotificationSettings-DX4I2b4W.js → NotificationSettings-Cr08G2aE.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-Ce8bEGlK.js +1 -0
- package/src/assets/web-panel/assets/{Organization-oopLO_tk.js → Organization-BC7lveGv.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BFVvjMyf.js → Overflow-CakOW-G0.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CBy5t-Tk.js → P2P-Cf8CaOBZ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser--YWJNsu6.js → PdhVaultBrowser-Dc7b98W9.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-C2dZ8scb.js → Permissions-DGJyMEfS.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Bs3l7Hlx.js → PersonalDataHub-DNIwSdwu.js} +6 -6
- package/src/assets/web-panel/assets/{Pipeline-DEBWbZuD.js → Pipeline-5B1S12wa.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CjHBb6NU.js → Privacy-CMB6Ke5t.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-D2WipUz5.js → ProjectInit-D5PqTFiT.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-B6WfnrGB.js → ProjectSettings-CbKNdSjV.js} +2 -2
- package/src/assets/web-panel/assets/Projects-ccXaHzYL.js +1 -0
- package/src/assets/web-panel/assets/{Providers-CCv5M_Dv.js → Providers-CJF5_-Gs.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CGthxU54.js → QrScannerModal-CT6iEAdi.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CnPmXPFb.js → QuickAsk-Ci0h9mJ_.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Df_tGEa9.js → Recommend-Da5mobZu.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-Z58N0Loe.js → RemoteSession-BaCY8eey.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-CZTBQ2Vt.js → Reputation-CaITfTsI.js} +1 -1
- package/src/assets/web-panel/assets/{Row-CdK3YpCQ.js → Row-DtUDamyP.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CFMVT5sb.js → RssFeed-DX27gFpg.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DrF8RIvD.js → Search-DFL69osN.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Ddk2f2DM.js → Security-BqGeoWv-.js} +3 -3
- package/src/assets/web-panel/assets/{Services-CCuK-VOo.js → Services-3z1WnEAc.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DxCpHzeM.js → Skeleton-C_OJQQ9Z.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-t2oTDgcv.js → Skills-BY7aT6Mo.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Df63M9_R.js → Sla-BZv7DSaD.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-6lJKLhCn.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-COd_tgPp.js → SyncSettings-B6D7STlI.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-CzDCcrik.js → Tasks-Co_FCZAO.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-D-vfxTGA.js → Templates-CnY-9fgz.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BlpT_Gxc.js → Tenant-B71yXfZ8.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D5rq52Hg.js → Terminal-Dd_P7awo.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DdoMndkK.js → TimelineRenderer-CvIEMyli.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BhgBsI6g.js → Tokens-DknFBGOi.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DwwzoikZ.js → Trigger-D_4nJONB.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-HkTpzXFb.js → Trust-BNl21fa7.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-D9nk6Ehe.js → UkeySign-CFrCI7uK.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BKk0rfoy.js → VideoEditing-BVfY6JLg.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-IVWIU_Lq.js → Wallet-Cj9CAK0J.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CFTCpfsG.js → WebAuthn-DcqZlzA3.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-Dnf4Obif.js → WorkflowEditor-Dfr_dMld.js} +1 -1
- package/src/assets/web-panel/assets/{chat-D2snERdj.js → chat-Yv6UF0AD.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DKEjK1N1.js → colors-CDW_-1fs.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BEDLwQdt.js → compact-item-BYOQvd-6.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DA9iW1a0.js → createContext-BCGO0BiP.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-H-kXSuf-.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-5l2xEcY9.js → hasIn-DY-70cfQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7_W_rYd.js → index-366wfQBU.js} +1 -1
- package/src/assets/web-panel/assets/index-B0o4MeNK.js +1 -0
- package/src/assets/web-panel/assets/{index-CxEtQYdi.js → index-B9ZogJJM.js} +1 -1
- package/src/assets/web-panel/assets/{index-B00GeekA.js → index-B9m5QAMg.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7sKbM5s.js → index-BBs2mv5M.js} +1 -1
- package/src/assets/web-panel/assets/{index-CX1x4AFn.js → index-BFv1hzF6.js} +1 -1
- package/src/assets/web-panel/assets/index-BVafOL_I.js +1 -0
- package/src/assets/web-panel/assets/{index-DU2TXJu-.js → index-BXlEx4UH.js} +1 -1
- package/src/assets/web-panel/assets/{index-e-e40id6.js → index-BayRTE5w.js} +1 -1
- package/src/assets/web-panel/assets/{index-DXet1xol.js → index-Bb9nyts1.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7z4zB_a.js → index-Bf_Va0S-.js} +1 -1
- package/src/assets/web-panel/assets/{index-fccZmC_h.js → index-Br3wQLVY.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bqc8tdIF.js → index-BvK4fjkk.js} +1 -1
- package/src/assets/web-panel/assets/{index-BO9dQjpt.js → index-C40UdtlS.js} +1 -1
- package/src/assets/web-panel/assets/{index-Csfb-7hw.js → index-C4UJA2ju.js} +1 -1
- package/src/assets/web-panel/assets/{index-Td8ZwyoC.js → index-CB_Iw73G.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZ5lY2zx.js → index-CCwWp3mT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpqtbXdE.js → index-CFa2fPCk.js} +1 -1
- package/src/assets/web-panel/assets/{index-NJieh3T1.js → index-CIyHxV4u.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dbkghqn_.js → index-CUP-A2_h.js} +1 -1
- package/src/assets/web-panel/assets/{index-DqwPFbOb.js → index-CUo27q9J.js} +3 -3
- package/src/assets/web-panel/assets/{index-B4QYBliR.js → index-CaT8trvf.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgfImyZI.js → index-CnZNbcux.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dbd7eEex.js → index-Cy2NE6AO.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbTPvp2_.js → index-CzeEEazr.js} +1 -1
- package/src/assets/web-panel/assets/{index-5pW4t1iD.js → index-D--TEyDj.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dg2a9owQ.js → index-DCtsjhhT.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_eCoZgW.js → index-DLOf7BSz.js} +1 -1
- package/src/assets/web-panel/assets/{index-7P1b8HZo.js → index-DM5c4pc-.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRPrHE7h.js → index-DRFC2Qt0.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bq5P3piS.js → index-DT_qVaaV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CjWltbi_.js → index-DUDoRk9r.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkMKuqUs.js → index-Dg-AQYDf.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLoalqRX.js → index-DuIPq5MX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CGlotREA.js → index-NYVBUAVN.js} +1 -1
- package/src/assets/web-panel/assets/{index-yYEQXYaU.js → index-NaCESahy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmruhzFi.js → index-RjIMPG0u.js} +1 -1
- package/src/assets/web-panel/assets/{index-fgYk0QXO.js → index-Y9akzgFO.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvV03Ayk.js → index-hZ0Eyrrw.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CPrcB1TC.js → initDefaultProps-CG99CcR4.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BQ7mWRh_.js → motion-Z7MH0_0G.js} +1 -1
- package/src/assets/web-panel/assets/{move-CzOEq99p.js → move-BX67lOdq.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BlQI5jrw.js → mtc-parser-CmAbG1fE.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DlW4gxmv.js → omit-DiU5tI1_.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BBYms5nP.js → pickAttrs-BGfvLrYL.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-az2MPJ_7.js → placementArrow-CggLEgaJ.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-D1-ibEol.js → responsiveObserve-t3nlghPZ.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DHGqa4GA.js → slide-BkV4dL9s.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CYGDo6lD.js → statusUtils-qec1PUoC.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Cl2EM9K6.js → styleChecker-ChjX6T8D.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DdYhzuv1.js → useFlexGapSupport-B1jLoZcM.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DWumPuBW.js → useFs-C3X53s4E.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DxAO-Aqi.js → usePersonalDataHub-DOvbbnkZ.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CplsQf_N.js → vnode-Ie0TEVFT.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Cw5HXNSG.js → zoom-CRUMVS8l.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.js +2 -0
- package/src/commands/governed-skill-marketplace.js +142 -0
- package/src/commands/marketplace.js +4 -1
- package/src/commands/serve.js +41 -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/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 +30 -4
- package/src/lazy-dispatch.js +15 -1
- 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 +45 -1
- package/src/lib/app-server/websocket-transport.js +23 -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 +217 -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 +10 -1
- package/src/lib/evolution/evidence-json-text.js +236 -0
- package/src/lib/evolution/evolution-artifact-ports.js +202 -21
- package/src/lib/evolution/evolution-deployment-loader.js +369 -0
- 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 +240 -37
- package/src/lib/evolution/evolution-file-witness.js +153 -30
- package/src/lib/evolution/evolution-ledger-ports.js +1027 -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-ledger-adapter.js +335 -0
- package/src/lib/evolution/evolution-release-train-stage-output-ledger-adapter.js +333 -0
- package/src/lib/evolution/evolution-release-train.js +586 -0
- 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 +152 -25
- 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 +736 -0
- package/src/lib/evolution/governed-knowledge-artifact-lifecycle.js +364 -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-ledger-executor.js +95 -83
- package/src/lib/evolution/governed-knowledge-merge-ledger-executor.js +29 -2
- package/src/lib/evolution/governed-knowledge-merge-publisher-authority.js +31 -3
- package/src/lib/evolution/governed-knowledge-record.js +148 -0
- package/src/lib/evolution/governed-knowledge-revocation-record.js +135 -0
- package/src/lib/evolution/governed-knowledge-skill-rollback.js +475 -0
- package/src/lib/evolution/governed-knowledge-sync-ledger-adapter.js +92 -6
- package/src/lib/evolution/governed-knowledge-sync-merge-publisher.js +57 -4
- package/src/lib/evolution/governed-knowledge-sync.js +332 -99
- package/src/lib/evolution/governed-knowledge-wiki-tombstone.js +462 -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 +124 -0
- package/src/lib/evolution/knowledge-wiki-source-provenance.js +359 -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 +22 -0
- 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 +25 -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 +15 -12
- package/src/lib/evolution/statistical-progressive-canary.js +845 -0
- 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 +760 -100
- 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 +101 -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 +574 -0
- 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-page.js +191 -0
- package/src/lib/runnable-provider.js +2 -1
- package/src/lib/session-host-lease.js +11 -16
- package/src/lib/skill-retrieval-router.js +22 -1
- package/src/repl/agent-repl.js +127 -33
- package/src/runtime/agent-core.js +224 -80
- 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 +53 -6
- package/src/runtime/runtime-factory.js +41 -2
- package/src/assets/web-panel/assets/Notes-CgU9DDo9.js +0 -7
- package/src/assets/web-panel/assets/OrderTableRenderer-CwHc15Zs.js +0 -1
- package/src/assets/web-panel/assets/Projects-FF_thRi6.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-l7ox6KuX.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DyhgpXPf.js +0 -1
- package/src/assets/web-panel/assets/index-Ck1jhFE0.js +0 -1
- package/src/assets/web-panel/assets/index-c8jJEHVs.js +0 -1
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { captureWikiRevisionReader } from "./wiki-maintainer-ledger-adapter.js";
|
|
2
|
+
import { captureRawDeletionLedgerReader } from "./evolution-raw-deletion-ledger-adapter.js";
|
|
3
|
+
import { capturePruningData } from "./governed-wiki-pruning-journal.js";
|
|
4
|
+
import { GovernedWikiPruning } from "./governed-wiki-pruning.js";
|
|
5
|
+
import { GovernedWikiPruningLedgerAdapter } from "./governed-wiki-pruning-ledger-adapter.js";
|
|
6
|
+
import { GovernedWikiPruningPlanAuthority } from "./governed-wiki-pruning-plan-authority.js";
|
|
7
|
+
import { GovernedWikiPruningMaintenance } from "./governed-wiki-pruning-maintenance.js";
|
|
8
|
+
import { GovernedWikiPruningRawShred } from "./governed-wiki-pruning-raw-shred.js";
|
|
9
|
+
import { GovernedWikiPruningRetrieval } from "./governed-wiki-pruning-retrieval.js";
|
|
10
|
+
|
|
11
|
+
// Deployment composition, not an acknowledgement-port harness. Every effect
|
|
12
|
+
// and verifier below is a concrete repository implementation. The caller owns
|
|
13
|
+
// the physical Ledger/ArtifactStore and independent privacy/KMS/release keys.
|
|
14
|
+
// No fallback signer, fake successful shred, or task-time self-modification.
|
|
15
|
+
export function createGovernedWikiPruningRuntime({
|
|
16
|
+
descriptor: input,
|
|
17
|
+
artifactPorts,
|
|
18
|
+
ledgerArtifactResolver,
|
|
19
|
+
ledger,
|
|
20
|
+
wikiLedgerAdapter,
|
|
21
|
+
deletionLedgerAdapter,
|
|
22
|
+
skillRollbackProvider = null,
|
|
23
|
+
keyAuthority,
|
|
24
|
+
clock = Date.now,
|
|
25
|
+
} = {}) {
|
|
26
|
+
const descriptor = capturePruningData(input);
|
|
27
|
+
const wiki = captureWikiRevisionReader(wikiLedgerAdapter);
|
|
28
|
+
const raw = captureRawDeletionLedgerReader(
|
|
29
|
+
deletionLedgerAdapter,
|
|
30
|
+
descriptor.tenantId,
|
|
31
|
+
descriptor.streamId,
|
|
32
|
+
);
|
|
33
|
+
for (const key of ["tenantId", "artifactTenantId", "audience", "purpose"])
|
|
34
|
+
if (
|
|
35
|
+
wiki.descriptor[key] !== descriptor[key] ||
|
|
36
|
+
raw.descriptor[key] !== descriptor[key]
|
|
37
|
+
)
|
|
38
|
+
throw new TypeError(
|
|
39
|
+
"pruning runtime stores must share the exact deployment scope",
|
|
40
|
+
);
|
|
41
|
+
const maintenance = new GovernedWikiPruningMaintenance({
|
|
42
|
+
descriptor,
|
|
43
|
+
wikiLedgerAdapter,
|
|
44
|
+
skillRollbackProvider,
|
|
45
|
+
});
|
|
46
|
+
const authority = new GovernedWikiPruningPlanAuthority({
|
|
47
|
+
descriptor,
|
|
48
|
+
wikiLedgerAdapter,
|
|
49
|
+
deletionReceipts: { resolve: raw.resolveDeletionReceipt },
|
|
50
|
+
wikiMaintenance: maintenance.authorityPorts(),
|
|
51
|
+
});
|
|
52
|
+
const rawShred = new GovernedWikiPruningRawShred({
|
|
53
|
+
descriptor,
|
|
54
|
+
deletionLedgerAdapter,
|
|
55
|
+
keyAuthority,
|
|
56
|
+
});
|
|
57
|
+
const retrieval = new GovernedWikiPruningRetrieval({
|
|
58
|
+
descriptor,
|
|
59
|
+
wikiLedgerAdapter,
|
|
60
|
+
skillRollbackProvider,
|
|
61
|
+
artifactPorts,
|
|
62
|
+
ledgerArtifactResolver,
|
|
63
|
+
ledger,
|
|
64
|
+
clock,
|
|
65
|
+
});
|
|
66
|
+
const wikiReceiptVerifier = maintenance.operationReceiptVerifier();
|
|
67
|
+
const rawReceiptVerifier = rawShred.operationReceiptVerifier();
|
|
68
|
+
const retrievalReceiptVerifier = retrieval.operationReceiptVerifier();
|
|
69
|
+
const journal = new GovernedWikiPruningLedgerAdapter({
|
|
70
|
+
descriptor,
|
|
71
|
+
artifactPorts,
|
|
72
|
+
ledgerArtifactResolver,
|
|
73
|
+
ledger,
|
|
74
|
+
clock,
|
|
75
|
+
planVerifier: authority.verifier(),
|
|
76
|
+
operationReceiptVerifier: {
|
|
77
|
+
async verifyAll(inputs) {
|
|
78
|
+
const wikiInputs = [];
|
|
79
|
+
for (const input of inputs) {
|
|
80
|
+
switch (input.request.operation) {
|
|
81
|
+
case "dependency-dispositions":
|
|
82
|
+
case "wiki-revision":
|
|
83
|
+
wikiInputs.push(input);
|
|
84
|
+
break;
|
|
85
|
+
case "crypto-shred":
|
|
86
|
+
if (!(await rawReceiptVerifier.verify(input))) return false;
|
|
87
|
+
break;
|
|
88
|
+
case "retrieval-projection":
|
|
89
|
+
if (!(await retrievalReceiptVerifier.verify(input))) return false;
|
|
90
|
+
break;
|
|
91
|
+
default:
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return !wikiInputs.length || wikiReceiptVerifier.verifyMany(wikiInputs);
|
|
96
|
+
},
|
|
97
|
+
verify(input) {
|
|
98
|
+
switch (input.request.operation) {
|
|
99
|
+
case "dependency-dispositions":
|
|
100
|
+
case "wiki-revision":
|
|
101
|
+
return wikiReceiptVerifier.verify(input);
|
|
102
|
+
case "crypto-shred":
|
|
103
|
+
return rawReceiptVerifier.verify(input);
|
|
104
|
+
case "retrieval-projection":
|
|
105
|
+
return retrievalReceiptVerifier.verify(input);
|
|
106
|
+
default:
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
const provider = maintenance.createProvider(journal);
|
|
113
|
+
const rawProvider = rawShred.createProvider(journal);
|
|
114
|
+
const retrievalProvider = retrieval.createProvider(journal);
|
|
115
|
+
const controller = new GovernedWikiPruning({
|
|
116
|
+
descriptor,
|
|
117
|
+
journalStore: journal,
|
|
118
|
+
ports: {
|
|
119
|
+
loadWikiState: wiki.loadWiki,
|
|
120
|
+
resolveDeletionReceipt: raw.resolveDeletionReceipt,
|
|
121
|
+
...provider,
|
|
122
|
+
...rawProvider,
|
|
123
|
+
...retrievalProvider,
|
|
124
|
+
verifyOfflineClosure() {
|
|
125
|
+
throw new Error(
|
|
126
|
+
"task-time online adaptation is not enabled by the pruning runtime",
|
|
127
|
+
);
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
return Object.freeze({
|
|
132
|
+
descriptor,
|
|
133
|
+
controller,
|
|
134
|
+
journal,
|
|
135
|
+
maintenance,
|
|
136
|
+
authority,
|
|
137
|
+
rawShred,
|
|
138
|
+
retrieval,
|
|
139
|
+
provider,
|
|
140
|
+
rawProvider,
|
|
141
|
+
retrievalProvider,
|
|
142
|
+
wikiReceiptVerifier,
|
|
143
|
+
rawReceiptVerifier,
|
|
144
|
+
retrievalReceiptVerifier,
|
|
145
|
+
plan: (input) => controller.plan(input),
|
|
146
|
+
execute: (input) => controller.execute(input),
|
|
147
|
+
resume: (input) => controller.resume(input),
|
|
148
|
+
retrievalReader: retrieval.createProposerReader({
|
|
149
|
+
journalStore: journal,
|
|
150
|
+
policy: { proposerWikiRead: true, executionAgentWikiRead: false },
|
|
151
|
+
}),
|
|
152
|
+
});
|
|
153
|
+
}
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { captureSkillReleaseRegistryReader } from "./skill-release-registry.js";
|
|
2
|
+
import { types } from "node:util";
|
|
3
|
+
import { captureSkillReleaseOperationReader } from "./evolution-ledger-ports.js";
|
|
4
|
+
import { captureSkillRollbackProvider } from "./skill-promotion-controller.js";
|
|
5
|
+
import {
|
|
6
|
+
verifySkillMutationRequest,
|
|
7
|
+
digestSkillMutationTransitionSubject,
|
|
8
|
+
} from "./skill-mutation-authority.js";
|
|
9
|
+
import { digestWikiState } from "./evidence-backed-wiki-maintainer.js";
|
|
10
|
+
import {
|
|
11
|
+
capturePruningData,
|
|
12
|
+
pruningDigest,
|
|
13
|
+
pruningOperationCalls,
|
|
14
|
+
verifyPruningJournalPlan,
|
|
15
|
+
} from "./governed-wiki-pruning-journal.js";
|
|
16
|
+
|
|
17
|
+
const PROVIDERS = new WeakMap();
|
|
18
|
+
export const WIKI_PRUNING_SKILL_ROLLBACK_SCHEMA =
|
|
19
|
+
"chainlesschain.wiki-pruning-skill-rollback/v1";
|
|
20
|
+
|
|
21
|
+
function fail(message) {
|
|
22
|
+
const error = new Error(message);
|
|
23
|
+
error.code = "CC_WIKI_PRUNING_SKILL_ROLLBACK_INVALID";
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
export function captureWikiPruningSkillRollback(value, tenantId) {
|
|
27
|
+
const provider = PROVIDERS.get(value);
|
|
28
|
+
if (!provider || provider.tenantId !== tenantId)
|
|
29
|
+
throw new TypeError(
|
|
30
|
+
"a same-tenant branded pruning Skill rollback provider is required",
|
|
31
|
+
);
|
|
32
|
+
return provider;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// A real ReleaseRegistry/controller effect, never a rollback boolean or an
|
|
36
|
+
// independent revoke record. The enclosing Wiki provider supplies the source
|
|
37
|
+
// it authenticated with its branded history reader and exact journal context.
|
|
38
|
+
// All release transactions MUST be on that same Ledger, so a later finalize
|
|
39
|
+
// cannot retrospectively authenticate an earlier pruning checkpoint.
|
|
40
|
+
export class GovernedWikiPruningSkillRollback {
|
|
41
|
+
#registry;
|
|
42
|
+
#operations;
|
|
43
|
+
#rollback;
|
|
44
|
+
#authorize;
|
|
45
|
+
#tenantId;
|
|
46
|
+
|
|
47
|
+
constructor({
|
|
48
|
+
tenantId,
|
|
49
|
+
releaseRegistry,
|
|
50
|
+
transactionLedger,
|
|
51
|
+
rollbackProvider,
|
|
52
|
+
authorizationProvider,
|
|
53
|
+
} = {}) {
|
|
54
|
+
this.#registry = captureSkillReleaseRegistryReader(releaseRegistry);
|
|
55
|
+
this.#operations = captureSkillReleaseOperationReader(transactionLedger);
|
|
56
|
+
const executor = captureSkillRollbackProvider(
|
|
57
|
+
rollbackProvider,
|
|
58
|
+
releaseRegistry,
|
|
59
|
+
);
|
|
60
|
+
if (
|
|
61
|
+
this.#registry.tenantId !== tenantId ||
|
|
62
|
+
executor.tenantId !== tenantId ||
|
|
63
|
+
!this.#registry.matchesTransactionLedger(transactionLedger)
|
|
64
|
+
)
|
|
65
|
+
throw new TypeError(
|
|
66
|
+
"pruning rollback registry/ledger tenant binding differs",
|
|
67
|
+
);
|
|
68
|
+
const authorize = authorizationProvider?.authorizeRollback;
|
|
69
|
+
if (typeof authorize !== "function")
|
|
70
|
+
throw new TypeError("rollback authorization provider is required");
|
|
71
|
+
this.#tenantId = tenantId;
|
|
72
|
+
this.#rollback = executor.rollback;
|
|
73
|
+
this.#authorize = authorize.bind(authorizationProvider);
|
|
74
|
+
PROVIDERS.set(
|
|
75
|
+
this,
|
|
76
|
+
Object.freeze({
|
|
77
|
+
tenantId,
|
|
78
|
+
apply: (input, refresh) => this.#apply(input, refresh),
|
|
79
|
+
verify: (input) => this.#verify(input),
|
|
80
|
+
}),
|
|
81
|
+
);
|
|
82
|
+
Object.freeze(this);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
#input(input) {
|
|
86
|
+
const {
|
|
87
|
+
plan: candidate,
|
|
88
|
+
source,
|
|
89
|
+
context,
|
|
90
|
+
requireCurrent = false,
|
|
91
|
+
} = capturePruningData(input);
|
|
92
|
+
const plan = verifyPruningJournalPlan(candidate, this.#tenantId);
|
|
93
|
+
if (
|
|
94
|
+
source?.trusted !== true ||
|
|
95
|
+
source.state?.tenantId !== this.#tenantId ||
|
|
96
|
+
source.stateDigest !== plan.wikiStateDigest ||
|
|
97
|
+
digestWikiState(source.state) !== plan.wikiStateDigest ||
|
|
98
|
+
typeof requireCurrent !== "boolean"
|
|
99
|
+
)
|
|
100
|
+
fail("rollback source differs from the pruning Wiki baseline");
|
|
101
|
+
const groups = new Map();
|
|
102
|
+
for (const item of plan.dependencyDispositions) {
|
|
103
|
+
if (item.action !== "rollback") continue;
|
|
104
|
+
if (!Array.isArray(item.skillNames) || item.skillNames.length === 0)
|
|
105
|
+
fail("rollback has no Skill dependency");
|
|
106
|
+
for (const name of item.skillNames) {
|
|
107
|
+
if (!groups.has(name)) groups.set(name, new Set());
|
|
108
|
+
groups.get(name).add(item.patternId);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (groups.size > 4096)
|
|
112
|
+
fail("rollback Skill count exceeds the pruning action budget");
|
|
113
|
+
const skills = [...groups]
|
|
114
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
115
|
+
.map(([skillName, patternIds]) => ({
|
|
116
|
+
skillName,
|
|
117
|
+
patternIds: [...patternIds].sort(),
|
|
118
|
+
operationId: `pruning-rollback:${pruningDigest(
|
|
119
|
+
"chainlesschain.wiki-pruning-skill-operation/v1",
|
|
120
|
+
{
|
|
121
|
+
requestDigest: pruningOperationCalls(plan)[0].requestDigest,
|
|
122
|
+
skillName,
|
|
123
|
+
},
|
|
124
|
+
).slice(7)}`,
|
|
125
|
+
}));
|
|
126
|
+
return { plan, source, context, requireCurrent, skills };
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
#validateReleases(input, skill, from, target) {
|
|
130
|
+
if (
|
|
131
|
+
!from ||
|
|
132
|
+
!target ||
|
|
133
|
+
from.tenantId !== this.#tenantId ||
|
|
134
|
+
target.tenantId !== this.#tenantId ||
|
|
135
|
+
from.skillName !== skill.skillName ||
|
|
136
|
+
target.skillName !== skill.skillName ||
|
|
137
|
+
from.releaseDigest === target.releaseDigest
|
|
138
|
+
)
|
|
139
|
+
fail("rollback does not select distinct same-tenant releases");
|
|
140
|
+
const decisions =
|
|
141
|
+
input.source.state.skillImpact?.[skill.skillName]?.decisions ?? [];
|
|
142
|
+
const patternsFor = (release) => {
|
|
143
|
+
const accepted = decisions.filter(
|
|
144
|
+
(item) =>
|
|
145
|
+
item.candidateId === release.candidate.candidateId &&
|
|
146
|
+
item.outcome === "accepted",
|
|
147
|
+
);
|
|
148
|
+
if (!accepted.length)
|
|
149
|
+
fail("release has no authenticated candidate-to-pattern lineage");
|
|
150
|
+
return new Set(accepted.flatMap((item) => item.patternRefs));
|
|
151
|
+
};
|
|
152
|
+
const affected = patternsFor(from);
|
|
153
|
+
if (skill.patternIds.some((id) => !affected.has(id)))
|
|
154
|
+
fail("active release is not the planned dependent candidate");
|
|
155
|
+
const deleted = new Set(
|
|
156
|
+
input.plan.deletions.map((item) => item.evidenceRef),
|
|
157
|
+
);
|
|
158
|
+
for (const id of patternsFor(target)) {
|
|
159
|
+
const pattern = input.source.state.patterns[id];
|
|
160
|
+
if (
|
|
161
|
+
!pattern ||
|
|
162
|
+
[...pattern.positiveEvidence, ...pattern.negativeEvidence].some((ref) =>
|
|
163
|
+
deleted.has(ref),
|
|
164
|
+
)
|
|
165
|
+
)
|
|
166
|
+
fail("last-known-good release still depends on deleted evidence");
|
|
167
|
+
}
|
|
168
|
+
// Direct recordings must not be hidden behind an empty Wiki pattern list.
|
|
169
|
+
const deletedRefs = new Set(
|
|
170
|
+
input.plan.deletions.flatMap((item) => [
|
|
171
|
+
item.evidenceRef,
|
|
172
|
+
item.artifactRef,
|
|
173
|
+
item.rawArtifactRef,
|
|
174
|
+
]),
|
|
175
|
+
);
|
|
176
|
+
if (
|
|
177
|
+
target.candidate.sourceEvidenceRefs.some(({ ref }) =>
|
|
178
|
+
deletedRefs.has(ref),
|
|
179
|
+
)
|
|
180
|
+
)
|
|
181
|
+
fail("last-known-good release directly references deleted evidence");
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
#resolve(input, skill) {
|
|
185
|
+
return this.#operations.resolveOperation({
|
|
186
|
+
tenantId: this.#tenantId,
|
|
187
|
+
skillName: skill.skillName,
|
|
188
|
+
operationId: skill.operationId,
|
|
189
|
+
context: input.context,
|
|
190
|
+
}).result;
|
|
191
|
+
}
|
|
192
|
+
#receipt(input, skill, result) {
|
|
193
|
+
if (result.projection.status !== "committed")
|
|
194
|
+
fail(
|
|
195
|
+
"rollback transaction is prepared but not committed; reopen the registry for recovery",
|
|
196
|
+
);
|
|
197
|
+
const { intent, projection, previous } = result;
|
|
198
|
+
if (
|
|
199
|
+
intent.operation !== "rollback" ||
|
|
200
|
+
intent.operationId !== skill.operationId ||
|
|
201
|
+
intent.skillName !== skill.skillName ||
|
|
202
|
+
intent.targetReleaseDigest !== previous.lastKnownGoodReleaseDigest ||
|
|
203
|
+
previous.activeReleaseDigest === intent.targetReleaseDigest
|
|
204
|
+
)
|
|
205
|
+
fail("settled release transaction is not the exact pruning rollback");
|
|
206
|
+
const from = this.#registry.readRelease(previous.activeReleaseDigest);
|
|
207
|
+
const target = this.#registry.readRelease(intent.targetReleaseDigest);
|
|
208
|
+
this.#validateReleases(input, skill, from, target);
|
|
209
|
+
if (
|
|
210
|
+
intent.expectedParentDigest !== from.contentDigest ||
|
|
211
|
+
intent.dependencyLockDigest !== target.dependencyLockDigest
|
|
212
|
+
)
|
|
213
|
+
fail("rollback content/dependency lock binding differs");
|
|
214
|
+
if (input.requireCurrent) {
|
|
215
|
+
const current = this.#registry.readActive(skill.skillName);
|
|
216
|
+
if (
|
|
217
|
+
projection.current !== true ||
|
|
218
|
+
current?.state.transactionId !== intent.transactionId ||
|
|
219
|
+
current.state.stateDigest !== projection.stateDigest ||
|
|
220
|
+
current.release.releaseDigest !== target.releaseDigest
|
|
221
|
+
)
|
|
222
|
+
fail("active release changed after the pruning rollback");
|
|
223
|
+
}
|
|
224
|
+
const core = {
|
|
225
|
+
schema: WIKI_PRUNING_SKILL_ROLLBACK_SCHEMA,
|
|
226
|
+
tenantId: this.#tenantId,
|
|
227
|
+
skillName: skill.skillName,
|
|
228
|
+
planDigest: input.plan.planDigest,
|
|
229
|
+
pruningRequestDigest: pruningOperationCalls(input.plan)[0].requestDigest,
|
|
230
|
+
operationId: skill.operationId,
|
|
231
|
+
transactionId: intent.transactionId,
|
|
232
|
+
fromReleaseDigest: from.releaseDigest,
|
|
233
|
+
targetReleaseDigest: target.releaseDigest,
|
|
234
|
+
previousStateDigest: previous.stateDigest,
|
|
235
|
+
resultStateDigest: projection.stateDigest,
|
|
236
|
+
intentDigest: intent.intentDigest,
|
|
237
|
+
authorityReceiptDigest: intent.authorityReceiptDigest,
|
|
238
|
+
releaseReceiptDigest: projection.receiptDigest,
|
|
239
|
+
epoch: projection.epoch,
|
|
240
|
+
ledgerId: projection.ledgerId,
|
|
241
|
+
sequence: projection.sequence,
|
|
242
|
+
eventDigest: projection.headDigest,
|
|
243
|
+
};
|
|
244
|
+
return capturePruningData({
|
|
245
|
+
...core,
|
|
246
|
+
receiptDigest: pruningDigest(WIKI_PRUNING_SKILL_ROLLBACK_SCHEMA, core),
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
#verify(value) {
|
|
251
|
+
const input = this.#input(value);
|
|
252
|
+
const receipts = [];
|
|
253
|
+
for (const skill of input.skills) {
|
|
254
|
+
const result = this.#resolve(input, skill);
|
|
255
|
+
if (!result) return null;
|
|
256
|
+
receipts.push(this.#receipt(input, skill, result));
|
|
257
|
+
}
|
|
258
|
+
return capturePruningData(receipts);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
async #apply(value, refresh) {
|
|
262
|
+
if (typeof refresh !== "function")
|
|
263
|
+
fail("a fresh pruning journal authorization is required");
|
|
264
|
+
const input = this.#input({ ...value, requireCurrent: true });
|
|
265
|
+
if (input.context.mode !== "current")
|
|
266
|
+
fail("historical checkpoints cannot authorize new rollback effects");
|
|
267
|
+
const pending = [];
|
|
268
|
+
for (const skill of input.skills) {
|
|
269
|
+
const existing = this.#resolve(input, skill);
|
|
270
|
+
if (existing) {
|
|
271
|
+
this.#receipt(input, skill, existing);
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
const active = this.#registry.readActive(skill.skillName);
|
|
275
|
+
if (!active) fail("planned dependent Skill has no active release");
|
|
276
|
+
const target = this.#registry.readRelease(
|
|
277
|
+
active.state.lastKnownGoodReleaseDigest,
|
|
278
|
+
);
|
|
279
|
+
this.#validateReleases(input, skill, active.release, target);
|
|
280
|
+
pending.push({ skill, active, target });
|
|
281
|
+
}
|
|
282
|
+
if (pending.length === 0) return { changed: false };
|
|
283
|
+
// Preflight every pending Skill before mutating the first. One real
|
|
284
|
+
// operation per call lets the enclosing journal refresh its full head.
|
|
285
|
+
const { skill, active, target } = pending[0];
|
|
286
|
+
const expected = Object.freeze({
|
|
287
|
+
tenantId: this.#tenantId,
|
|
288
|
+
skillName: skill.skillName,
|
|
289
|
+
operationId: skill.operationId,
|
|
290
|
+
operation: "rollback",
|
|
291
|
+
targetScope: "active",
|
|
292
|
+
expectedTargetDigest: active.release.contentDigest,
|
|
293
|
+
expectedTargetRevision: active.state.revision,
|
|
294
|
+
targetReleaseDigest: target.releaseDigest,
|
|
295
|
+
transitionSubjectDigest: digestSkillMutationTransitionSubject({
|
|
296
|
+
tenantId: this.#tenantId,
|
|
297
|
+
skillName: skill.skillName,
|
|
298
|
+
operation: "rollback",
|
|
299
|
+
candidateId: null,
|
|
300
|
+
rollbackTargetReleaseDigest: target.releaseDigest,
|
|
301
|
+
dependencyLockDigest: target.dependencyLockDigest,
|
|
302
|
+
expectedActiveContentDigest: active.release.contentDigest,
|
|
303
|
+
expectedActiveRevision: active.state.revision,
|
|
304
|
+
}),
|
|
305
|
+
});
|
|
306
|
+
const authorization = await this.#authorize(expected);
|
|
307
|
+
if (
|
|
308
|
+
!authorization ||
|
|
309
|
+
typeof authorization !== "object" ||
|
|
310
|
+
types.isProxy(authorization)
|
|
311
|
+
)
|
|
312
|
+
fail("rollback authorization must be own data");
|
|
313
|
+
const fields = Object.getOwnPropertyDescriptors(authorization);
|
|
314
|
+
if (
|
|
315
|
+
Reflect.ownKeys(fields).length !== 2 ||
|
|
316
|
+
!fields.request ||
|
|
317
|
+
!fields.capability ||
|
|
318
|
+
[fields.request, fields.capability].some(
|
|
319
|
+
(field) => !("value" in field) || !field.enumerable,
|
|
320
|
+
)
|
|
321
|
+
)
|
|
322
|
+
fail(
|
|
323
|
+
"rollback authorization must have exact own request/capability fields",
|
|
324
|
+
);
|
|
325
|
+
const request = verifySkillMutationRequest(fields.request.value);
|
|
326
|
+
for (const key of [
|
|
327
|
+
"tenantId",
|
|
328
|
+
"skillName",
|
|
329
|
+
"operationId",
|
|
330
|
+
"operation",
|
|
331
|
+
"targetScope",
|
|
332
|
+
"expectedTargetDigest",
|
|
333
|
+
"expectedTargetRevision",
|
|
334
|
+
"transitionSubjectDigest",
|
|
335
|
+
])
|
|
336
|
+
if (request[key] !== expected[key])
|
|
337
|
+
fail("rollback authority authorized a different transition");
|
|
338
|
+
// Issuing authorization may itself append authority audit events. The
|
|
339
|
+
// enclosing branded journal must reauthenticate the SAME plan at its new
|
|
340
|
+
// current head; reusing the pre-authorization head would reject real audit.
|
|
341
|
+
const refreshed = this.#input({
|
|
342
|
+
...(await refresh()),
|
|
343
|
+
requireCurrent: true,
|
|
344
|
+
});
|
|
345
|
+
if (
|
|
346
|
+
refreshed.plan.planDigest !== input.plan.planDigest ||
|
|
347
|
+
refreshed.context.mode !== "current"
|
|
348
|
+
)
|
|
349
|
+
fail(
|
|
350
|
+
"pruning authorization changed while requesting rollback permission",
|
|
351
|
+
);
|
|
352
|
+
if (this.#resolve(refreshed, skill) !== null)
|
|
353
|
+
fail("rollback changed while authorization was pending");
|
|
354
|
+
await this.#rollback({
|
|
355
|
+
authorization: { request, capability: fields.capability.value },
|
|
356
|
+
targetReleaseDigest: target.releaseDigest,
|
|
357
|
+
});
|
|
358
|
+
return { changed: true };
|
|
359
|
+
}
|
|
360
|
+
}
|