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,459 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA,
|
|
3
|
+
isEvolutionLedgerArtifactResolver,
|
|
4
|
+
} from "./evolution-artifact-ports.js";
|
|
5
|
+
import {
|
|
6
|
+
EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA,
|
|
7
|
+
EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA,
|
|
8
|
+
EVOLUTION_LEDGER_MAX_EVENTS,
|
|
9
|
+
} from "./evolution-ledger.js";
|
|
10
|
+
import {
|
|
11
|
+
WIKI_PRUNING_JOURNAL_MAX_BYTES,
|
|
12
|
+
assertPruningJournalTransition,
|
|
13
|
+
pruningCanonical,
|
|
14
|
+
pruningOperationCalls,
|
|
15
|
+
verifyWikiPruningJournal,
|
|
16
|
+
} from "./governed-wiki-pruning-journal.js";
|
|
17
|
+
|
|
18
|
+
export const WIKI_PRUNING_JOURNAL_EVENT_TYPE = "wiki.pruning.journal-committed";
|
|
19
|
+
export const WIKI_PRUNING_JOURNAL_ARTIFACT_TYPE = "wiki-pruning-journal";
|
|
20
|
+
const STORES = new WeakMap();
|
|
21
|
+
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
22
|
+
function currentContext(head) {
|
|
23
|
+
return Object.freeze({
|
|
24
|
+
mode: "current",
|
|
25
|
+
checkpoint: Object.freeze({
|
|
26
|
+
epoch: head.epoch,
|
|
27
|
+
ledgerId: head.ledgerId,
|
|
28
|
+
identityDigest: head.identityDigest,
|
|
29
|
+
sequence: head.sequence,
|
|
30
|
+
headDigest: head.headDigest,
|
|
31
|
+
}),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function historicalContext(event) {
|
|
36
|
+
return Object.freeze({
|
|
37
|
+
mode: "checkpoint",
|
|
38
|
+
checkpoint: Object.freeze({
|
|
39
|
+
epoch: event.epoch,
|
|
40
|
+
ledgerId: event.ledgerId,
|
|
41
|
+
identityDigest: event.identityDigest,
|
|
42
|
+
sequence: event.sequence,
|
|
43
|
+
headDigest: event.eventDigest,
|
|
44
|
+
}),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function fail(message) {
|
|
49
|
+
const error = new Error(message);
|
|
50
|
+
error.code = "CC_WIKI_PRUNING_JOURNAL_INVALID";
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
function conflict(message) {
|
|
54
|
+
const error = new Error(message);
|
|
55
|
+
error.code = "CC_WIKI_PRUNING_JOURNAL_CONFLICT";
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
function capture(owner, name) {
|
|
59
|
+
const operation = owner?.[name];
|
|
60
|
+
if (typeof operation !== "function")
|
|
61
|
+
throw new TypeError(`${name} port is required`);
|
|
62
|
+
return (...args) => Reflect.apply(operation, owner, args);
|
|
63
|
+
}
|
|
64
|
+
function descriptor(input) {
|
|
65
|
+
const value = {};
|
|
66
|
+
for (const key of [
|
|
67
|
+
"tenantId",
|
|
68
|
+
"artifactTenantId",
|
|
69
|
+
"streamId",
|
|
70
|
+
"audience",
|
|
71
|
+
"purpose",
|
|
72
|
+
]) {
|
|
73
|
+
if (
|
|
74
|
+
typeof input?.[key] !== "string" ||
|
|
75
|
+
!input[key].trim() ||
|
|
76
|
+
input[key].length > 256
|
|
77
|
+
)
|
|
78
|
+
throw new TypeError(`${key} is invalid`);
|
|
79
|
+
value[key] = input[key];
|
|
80
|
+
}
|
|
81
|
+
if (value.purpose !== "evolution-ledger")
|
|
82
|
+
throw new TypeError("pruning journal requires evolution-ledger purpose");
|
|
83
|
+
return Object.freeze(value);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// This adapter authenticates persistence, not business authorization by itself.
|
|
87
|
+
// Plan and operation verifiers are mandatory and reconsulted on every restore.
|
|
88
|
+
// Historical entries are verified at their authenticated checkpoint, NOT
|
|
89
|
+
// against an arbitrarily newer Wiki. The current unfinished execution and all
|
|
90
|
+
// proposed writes additionally require current authorization. A completed
|
|
91
|
+
// record is never treated as permission to perform more effects. Plan verifiers
|
|
92
|
+
// must bind checkpoint context to the Wiki ledger identity and ordered effects.
|
|
93
|
+
// The operation verifier must independently authenticate the exact provider
|
|
94
|
+
// receipt, not merely echo its authenticated/durable flags. Effect providers
|
|
95
|
+
// must reconcile duplicate requestDigest values across process boundaries.
|
|
96
|
+
export class GovernedWikiPruningLedgerAdapter {
|
|
97
|
+
#put;
|
|
98
|
+
#read;
|
|
99
|
+
#verifyLedger;
|
|
100
|
+
#append;
|
|
101
|
+
#resolve;
|
|
102
|
+
#verifyPlan;
|
|
103
|
+
#verifyOperation;
|
|
104
|
+
#verifyOperations;
|
|
105
|
+
#clock;
|
|
106
|
+
|
|
107
|
+
constructor({
|
|
108
|
+
descriptor: input,
|
|
109
|
+
artifactPorts,
|
|
110
|
+
ledger,
|
|
111
|
+
ledgerArtifactResolver,
|
|
112
|
+
planVerifier,
|
|
113
|
+
operationReceiptVerifier,
|
|
114
|
+
clock = Date.now,
|
|
115
|
+
} = {}) {
|
|
116
|
+
this.descriptor = descriptor(input);
|
|
117
|
+
if (!isEvolutionLedgerArtifactResolver(ledgerArtifactResolver))
|
|
118
|
+
throw new TypeError(
|
|
119
|
+
"a branded EvolutionArtifactPorts ledger resolver is required",
|
|
120
|
+
);
|
|
121
|
+
this.#put = capture(artifactPorts, "putCanonical");
|
|
122
|
+
this.#read = capture(ledger, "read");
|
|
123
|
+
this.#verifyLedger = capture(ledger, "verify");
|
|
124
|
+
this.#append = capture(ledger, "appendDomainEvent");
|
|
125
|
+
this.#resolve = ledgerArtifactResolver;
|
|
126
|
+
this.#verifyPlan = capture(planVerifier, "verify");
|
|
127
|
+
this.#verifyOperation = capture(operationReceiptVerifier, "verify");
|
|
128
|
+
this.#verifyOperations =
|
|
129
|
+
operationReceiptVerifier.verifyAll === undefined
|
|
130
|
+
? null
|
|
131
|
+
: capture(operationReceiptVerifier, "verifyAll");
|
|
132
|
+
if (typeof clock !== "function")
|
|
133
|
+
throw new TypeError("clock port is required");
|
|
134
|
+
this.#clock = clock;
|
|
135
|
+
Object.freeze(this);
|
|
136
|
+
STORES.set(
|
|
137
|
+
this,
|
|
138
|
+
Object.freeze({
|
|
139
|
+
descriptor: this.descriptor,
|
|
140
|
+
load: (input) => this.#load(input),
|
|
141
|
+
commit: (input) => this.#commit(input),
|
|
142
|
+
}),
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
async #authenticate(state, context, verifiedPrefix = null) {
|
|
147
|
+
if (
|
|
148
|
+
verifiedPrefix === null &&
|
|
149
|
+
(await this.#verifyPlan({
|
|
150
|
+
plan: state.plan,
|
|
151
|
+
tenantId: this.descriptor.tenantId,
|
|
152
|
+
streamId: this.descriptor.streamId,
|
|
153
|
+
context,
|
|
154
|
+
})) !== true
|
|
155
|
+
)
|
|
156
|
+
fail("pruning plan authorization is unavailable or revoked");
|
|
157
|
+
const calls = pruningOperationCalls(state.plan);
|
|
158
|
+
const inputs = [];
|
|
159
|
+
for (const [index, receipt] of state.operationReceipts.entries()) {
|
|
160
|
+
if (index < (verifiedPrefix?.operationReceipts.length ?? 0)) continue;
|
|
161
|
+
inputs.push({
|
|
162
|
+
...calls[index],
|
|
163
|
+
plan: state.plan,
|
|
164
|
+
receipt,
|
|
165
|
+
tenantId: this.descriptor.tenantId,
|
|
166
|
+
streamId: this.descriptor.streamId,
|
|
167
|
+
context,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
if (this.#verifyOperations && inputs.length) {
|
|
171
|
+
if ((await this.#verifyOperations(inputs)) !== true)
|
|
172
|
+
fail("pruning operation receipt batch authentication failed");
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
for (const input of inputs) {
|
|
176
|
+
if ((await this.#verifyOperation(input)) !== true)
|
|
177
|
+
fail("pruning operation receipt authentication failed");
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
async #history() {
|
|
182
|
+
const all = this.#read({ limit: EVOLUTION_LEDGER_MAX_EVENTS });
|
|
183
|
+
if (!Array.isArray(all))
|
|
184
|
+
fail("pruning journal ledger did not return events");
|
|
185
|
+
// read() already authenticates this snapshot. Resolve its artifacts using
|
|
186
|
+
// the same identity and compare to a freshly authenticated head after ALL
|
|
187
|
+
// transition/business checks; no cached authorization crosses calls.
|
|
188
|
+
const tail = all.at(-1);
|
|
189
|
+
const head = tail
|
|
190
|
+
? {
|
|
191
|
+
epoch: tail.epoch,
|
|
192
|
+
ledgerId: tail.ledgerId,
|
|
193
|
+
identityDigest: tail.identityDigest,
|
|
194
|
+
sequence: tail.sequence,
|
|
195
|
+
headDigest: tail.eventDigest,
|
|
196
|
+
}
|
|
197
|
+
: this.#verifyLedger();
|
|
198
|
+
if (
|
|
199
|
+
all.length !== head.sequence ||
|
|
200
|
+
(all.at(-1)?.eventDigest ?? null) !== head.headDigest ||
|
|
201
|
+
all.some(
|
|
202
|
+
(event, index) =>
|
|
203
|
+
event.sequence !== index + 1 ||
|
|
204
|
+
["epoch", "ledgerId", "identityDigest"].some(
|
|
205
|
+
(key) => event[key] !== head[key],
|
|
206
|
+
),
|
|
207
|
+
)
|
|
208
|
+
) {
|
|
209
|
+
conflict("pruning journal ledger range is incomplete or changed");
|
|
210
|
+
}
|
|
211
|
+
const events = all.filter(
|
|
212
|
+
(event) =>
|
|
213
|
+
event.schema === EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA &&
|
|
214
|
+
event.type === WIKI_PRUNING_JOURNAL_EVENT_TYPE &&
|
|
215
|
+
event.tenantId === this.descriptor.tenantId &&
|
|
216
|
+
event.correlationId === this.descriptor.streamId,
|
|
217
|
+
);
|
|
218
|
+
const history = [];
|
|
219
|
+
const plans = new Set();
|
|
220
|
+
for (const event of events) {
|
|
221
|
+
const previous = history.at(-1) ?? null;
|
|
222
|
+
if (
|
|
223
|
+
event.artifactTenantId !== this.descriptor.artifactTenantId ||
|
|
224
|
+
event.decision !== "committed" ||
|
|
225
|
+
event.skillName !== null ||
|
|
226
|
+
!Array.isArray(event.sourceRefs) ||
|
|
227
|
+
event.sourceRefs.length !== (previous ? 1 : 0) ||
|
|
228
|
+
(previous &&
|
|
229
|
+
pruningCanonical(event.sourceRefs[0]) !==
|
|
230
|
+
pruningCanonical(previous.event.subjectRef))
|
|
231
|
+
)
|
|
232
|
+
fail("pruning journal event lineage is invalid");
|
|
233
|
+
const resolution = this.#resolve({
|
|
234
|
+
epoch: head.epoch,
|
|
235
|
+
ledgerId: head.ledgerId,
|
|
236
|
+
ref: event.subjectRef,
|
|
237
|
+
tenantId: this.descriptor.artifactTenantId,
|
|
238
|
+
});
|
|
239
|
+
if (
|
|
240
|
+
resolution?.schema !== EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA ||
|
|
241
|
+
resolution.authenticated !== true ||
|
|
242
|
+
resolution.found !== true ||
|
|
243
|
+
resolution.ref !== event.subjectRef.ref ||
|
|
244
|
+
resolution.digest !== event.subjectRef.digest ||
|
|
245
|
+
!DIGEST.test(resolution.receiptDigest) ||
|
|
246
|
+
!Buffer.isBuffer(resolution.bytes) ||
|
|
247
|
+
resolution.bytes.length > WIKI_PRUNING_JOURNAL_MAX_BYTES
|
|
248
|
+
)
|
|
249
|
+
fail("pruning journal artifact resolution is invalid");
|
|
250
|
+
const record = JSON.parse(
|
|
251
|
+
new TextDecoder("utf-8", { fatal: true }).decode(resolution.bytes),
|
|
252
|
+
);
|
|
253
|
+
if (
|
|
254
|
+
record?.schema !== EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA ||
|
|
255
|
+
record.tenantId !== this.descriptor.artifactTenantId ||
|
|
256
|
+
record.audience !== this.descriptor.audience ||
|
|
257
|
+
record.purpose !== this.descriptor.purpose ||
|
|
258
|
+
record.retention !== "ledger" ||
|
|
259
|
+
record.type !== WIKI_PRUNING_JOURNAL_ARTIFACT_TYPE
|
|
260
|
+
)
|
|
261
|
+
fail("pruning journal durable artifact binding is invalid");
|
|
262
|
+
const state = verifyWikiPruningJournal(
|
|
263
|
+
record.value,
|
|
264
|
+
this.descriptor.tenantId,
|
|
265
|
+
);
|
|
266
|
+
if (
|
|
267
|
+
event.eventId !==
|
|
268
|
+
`${WIKI_PRUNING_JOURNAL_EVENT_TYPE}.${state.journalDigest.slice(7)}`
|
|
269
|
+
)
|
|
270
|
+
fail("pruning journal event identity is invalid");
|
|
271
|
+
assertPruningJournalTransition(previous?.state ?? null, state);
|
|
272
|
+
if (previous?.state.plan.planDigest !== state.plan.planDigest) {
|
|
273
|
+
if (plans.has(state.plan.planDigest))
|
|
274
|
+
fail("pruning journal restarted a historical plan");
|
|
275
|
+
plans.add(state.plan.planDigest);
|
|
276
|
+
}
|
|
277
|
+
const samePlan =
|
|
278
|
+
previous?.state.plan.planDigest === state.plan.planDigest;
|
|
279
|
+
const entry = {
|
|
280
|
+
event,
|
|
281
|
+
state,
|
|
282
|
+
prepared: samePlan ? previous.prepared : { event, state },
|
|
283
|
+
};
|
|
284
|
+
if (samePlan) history[history.length - 1] = entry;
|
|
285
|
+
else history.push(entry);
|
|
286
|
+
}
|
|
287
|
+
// Every immutable event/transition above is checked. Per plan, authenticate
|
|
288
|
+
// its source at preparation and its full retained receipt prefix at the
|
|
289
|
+
// latest checkpoint. Intermediate states retain the exact same plan and
|
|
290
|
+
// immutable receipt prefixes, so need no duplicate business verification.
|
|
291
|
+
const latestEntry = history.at(-1);
|
|
292
|
+
const currentIsLatestCheckpoint =
|
|
293
|
+
latestEntry?.state.phase !== "finalized" &&
|
|
294
|
+
latestEntry?.event.sequence === head.sequence &&
|
|
295
|
+
latestEntry?.event.eventDigest === head.headDigest;
|
|
296
|
+
for (const entry of history) {
|
|
297
|
+
// When the latest checkpoint IS the current head, current verification
|
|
298
|
+
// proves the exact same historical boundary and additionally enforces
|
|
299
|
+
// current authorities/active pointers. Do not verify that boundary twice.
|
|
300
|
+
// Older preparation checkpoints always retain their own as-of check.
|
|
301
|
+
const latestContext =
|
|
302
|
+
entry === latestEntry && currentIsLatestCheckpoint
|
|
303
|
+
? currentContext(head)
|
|
304
|
+
: historicalContext(entry.event);
|
|
305
|
+
await this.#authenticate(
|
|
306
|
+
entry.prepared.state,
|
|
307
|
+
entry.state.journalDigest === entry.prepared.state.journalDigest
|
|
308
|
+
? latestContext
|
|
309
|
+
: historicalContext(entry.prepared.event),
|
|
310
|
+
);
|
|
311
|
+
if (entry.state.journalDigest !== entry.prepared.state.journalDigest)
|
|
312
|
+
await this.#authenticate(entry.state, latestContext);
|
|
313
|
+
}
|
|
314
|
+
const latest = history.at(-1)?.state;
|
|
315
|
+
if (latest && latest.phase !== "finalized" && !currentIsLatestCheckpoint)
|
|
316
|
+
await this.#authenticate(latest, currentContext(head));
|
|
317
|
+
const after = this.#verifyLedger();
|
|
318
|
+
if (
|
|
319
|
+
after.headDigest !== head.headDigest ||
|
|
320
|
+
after.sequence !== head.sequence ||
|
|
321
|
+
after.identityDigest !== head.identityDigest ||
|
|
322
|
+
after.epoch !== head.epoch ||
|
|
323
|
+
after.ledgerId !== head.ledgerId
|
|
324
|
+
)
|
|
325
|
+
conflict("pruning journal ledger changed while restoring");
|
|
326
|
+
return { head, history };
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
#resolution(entry, head) {
|
|
330
|
+
return Object.freeze({
|
|
331
|
+
authenticated: true,
|
|
332
|
+
durable: true,
|
|
333
|
+
found: !!entry,
|
|
334
|
+
tenantId: this.descriptor.tenantId,
|
|
335
|
+
streamId: this.descriptor.streamId,
|
|
336
|
+
state: entry?.state ?? null,
|
|
337
|
+
receiptDigest: entry?.event.eventDigest ?? null,
|
|
338
|
+
ledgerHead: currentContext(head).checkpoint,
|
|
339
|
+
checkpoint: entry ? historicalContext(entry.event).checkpoint : null,
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
load(input) {
|
|
344
|
+
return this.#load(input);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
async #load({ tenantId, planDigest = null } = {}) {
|
|
348
|
+
if (
|
|
349
|
+
tenantId !== this.descriptor.tenantId ||
|
|
350
|
+
(planDigest !== null && !DIGEST.test(planDigest))
|
|
351
|
+
)
|
|
352
|
+
throw new TypeError("pruning journal load scope is invalid");
|
|
353
|
+
const { history, head } = await this.#history();
|
|
354
|
+
return this.#resolution(
|
|
355
|
+
(planDigest === null
|
|
356
|
+
? history
|
|
357
|
+
: history.filter((entry) => entry.state.plan.planDigest === planDigest)
|
|
358
|
+
).at(-1),
|
|
359
|
+
head,
|
|
360
|
+
);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
commit(input) {
|
|
364
|
+
return this.#commit(input);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
async #commit({ state: input, expectedJournalDigest } = {}) {
|
|
368
|
+
const state = verifyWikiPruningJournal(input, this.descriptor.tenantId);
|
|
369
|
+
if (expectedJournalDigest !== null && !DIGEST.test(expectedJournalDigest))
|
|
370
|
+
throw new TypeError("expectedJournalDigest is invalid");
|
|
371
|
+
const { history, head } = await this.#history();
|
|
372
|
+
const previous = history.at(-1) ?? null;
|
|
373
|
+
if (previous?.state.journalDigest === state.journalDigest)
|
|
374
|
+
return this.#resolution(previous, head);
|
|
375
|
+
if ((previous?.state.journalDigest ?? null) !== expectedJournalDigest)
|
|
376
|
+
conflict("pruning journal changed before commit");
|
|
377
|
+
assertPruningJournalTransition(previous?.state ?? null, state);
|
|
378
|
+
if (
|
|
379
|
+
previous?.state.plan.planDigest !== state.plan.planDigest &&
|
|
380
|
+
history.some(
|
|
381
|
+
(entry) => entry.state.plan.planDigest === state.plan.planDigest,
|
|
382
|
+
)
|
|
383
|
+
)
|
|
384
|
+
fail("pruning journal cannot restart a historical plan");
|
|
385
|
+
// #history reauthenticated the unfinished plan and EVERY existing effect
|
|
386
|
+
// at this exact current head in this commit call. The transition validator
|
|
387
|
+
// above requires an identical plan and immutable receipt prefix. Only the
|
|
388
|
+
// newly appended receipt needs additional authentication; finalize adds
|
|
389
|
+
// none. Nothing is cached across calls, and the same head still guards CAS.
|
|
390
|
+
const verifiedPrefix =
|
|
391
|
+
previous?.state.phase !== "finalized" &&
|
|
392
|
+
previous?.state.plan.planDigest === state.plan.planDigest
|
|
393
|
+
? previous.state
|
|
394
|
+
: null;
|
|
395
|
+
await this.#authenticate(state, currentContext(head), verifiedPrefix);
|
|
396
|
+
const now = Number(this.#clock());
|
|
397
|
+
if (!Number.isFinite(now))
|
|
398
|
+
throw new TypeError("pruning journal clock is invalid");
|
|
399
|
+
const published = this.#put(WIKI_PRUNING_JOURNAL_ARTIFACT_TYPE, state, {
|
|
400
|
+
audience: this.descriptor.audience,
|
|
401
|
+
purpose: this.descriptor.purpose,
|
|
402
|
+
retention: "ledger",
|
|
403
|
+
});
|
|
404
|
+
if (
|
|
405
|
+
published?.receipt?.persisted !== true ||
|
|
406
|
+
published.receipt.readbackVerified !== true ||
|
|
407
|
+
published.receipt.integrityVerified !== true ||
|
|
408
|
+
published.receipt.retention !== "ledger"
|
|
409
|
+
)
|
|
410
|
+
fail("pruning journal artifact was not durably confirmed");
|
|
411
|
+
const eventId = `${WIKI_PRUNING_JOURNAL_EVENT_TYPE}.${state.journalDigest.slice(7)}`;
|
|
412
|
+
let appendError = null;
|
|
413
|
+
try {
|
|
414
|
+
const receipt = this.#append(
|
|
415
|
+
{
|
|
416
|
+
artifactTenantId: this.descriptor.artifactTenantId,
|
|
417
|
+
correlationId: this.descriptor.streamId,
|
|
418
|
+
decision: "committed",
|
|
419
|
+
eventId,
|
|
420
|
+
reason: `Wiki pruning ${state.phase} checkpoint ${state.revision}`,
|
|
421
|
+
skillName: null,
|
|
422
|
+
sourceRefs: previous ? [previous.event.subjectRef] : [],
|
|
423
|
+
subjectRef: published.ref,
|
|
424
|
+
tenantId: this.descriptor.tenantId,
|
|
425
|
+
timestamp: new Date(now).toISOString(),
|
|
426
|
+
type: WIKI_PRUNING_JOURNAL_EVENT_TYPE,
|
|
427
|
+
},
|
|
428
|
+
{
|
|
429
|
+
expectedHeadDigest: head.headDigest,
|
|
430
|
+
expectedSequence: head.sequence,
|
|
431
|
+
},
|
|
432
|
+
);
|
|
433
|
+
if (
|
|
434
|
+
receipt?.authenticated !== true ||
|
|
435
|
+
receipt.durable !== true ||
|
|
436
|
+
receipt.committed !== true ||
|
|
437
|
+
receipt.eventId !== eventId
|
|
438
|
+
)
|
|
439
|
+
fail("pruning journal append was not confirmed");
|
|
440
|
+
} catch (error) {
|
|
441
|
+
// Only authenticated readback may turn response loss into success.
|
|
442
|
+
appendError = error;
|
|
443
|
+
}
|
|
444
|
+
const restored = await this.#history();
|
|
445
|
+
const recovered = restored.history.at(-1);
|
|
446
|
+
if (recovered?.state.journalDigest !== state.journalDigest) {
|
|
447
|
+
if (appendError) throw appendError;
|
|
448
|
+
fail("pruning journal readback did not match commit");
|
|
449
|
+
}
|
|
450
|
+
return this.#resolution(recovered, restored.head);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
export function captureWikiPruningJournalStore(value) {
|
|
455
|
+
const ports = STORES.get(value);
|
|
456
|
+
if (!ports)
|
|
457
|
+
throw new TypeError("a branded Wiki pruning journal store is required");
|
|
458
|
+
return ports;
|
|
459
|
+
}
|