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
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import structuredMemory from "@chainlesschain/session-core/structured-evolution-memory";
|
|
2
|
+
import { types as utilTypes } from "node:util";
|
|
2
3
|
import { StructuredMemoryLedgerAdapter } from "./structured-memory-ledger-adapter.js";
|
|
3
4
|
import { StructuredMemoryAuthorityLedgerAdapter } from "./structured-memory-authority-ledger-adapter.js";
|
|
4
5
|
import { captureStructuredMemoryPromotionReceiptWriter } from "./structured-memory-promotion-receipt-writer.js";
|
|
5
6
|
import { captureStructuredMemoryPolicyReceiptWriter } from "./structured-memory-policy-receipt-writer.js";
|
|
6
7
|
import { createStructuredMemorySemanticReviewPipeline } from "./structured-memory-semantic-review-pipeline.js";
|
|
7
8
|
import { createSkillEvaluatedPromotionControlPlane } from "./skill-promotion-controller.js";
|
|
9
|
+
import { SKILL_REVOCATION_DEPENDENCY_RESULT_SCHEMA } from "./skill-revocation-propagation.js";
|
|
8
10
|
|
|
9
11
|
const { captureStructuredMemoryAuthority } = structuredMemory;
|
|
10
12
|
|
|
@@ -12,6 +14,51 @@ export const STRUCTURED_MEMORY_AGENT_CONTROL_PLANE_SCHEMA =
|
|
|
12
14
|
"chainlesschain.structured-memory-agent-control-plane/v1";
|
|
13
15
|
|
|
14
16
|
const CONTROL_PLANES = new WeakSet();
|
|
17
|
+
const REVOCATION_REQUEST_KEYS = new Set([
|
|
18
|
+
"schema",
|
|
19
|
+
"tenantId",
|
|
20
|
+
"streamId",
|
|
21
|
+
"operationId",
|
|
22
|
+
"transitionDigest",
|
|
23
|
+
"candidateId",
|
|
24
|
+
"skillName",
|
|
25
|
+
"occurredAt",
|
|
26
|
+
"sourceReceiptDigest",
|
|
27
|
+
"resolutionDigest",
|
|
28
|
+
"dependency",
|
|
29
|
+
"requestDigest",
|
|
30
|
+
]);
|
|
31
|
+
const REVOCATION_DEPENDENCY_KEYS = new Set([
|
|
32
|
+
"kind",
|
|
33
|
+
"ref",
|
|
34
|
+
"digest",
|
|
35
|
+
"disposition",
|
|
36
|
+
]);
|
|
37
|
+
|
|
38
|
+
function exactDataRecord(value, keys, label) {
|
|
39
|
+
if (
|
|
40
|
+
!value ||
|
|
41
|
+
typeof value !== "object" ||
|
|
42
|
+
Array.isArray(value) ||
|
|
43
|
+
utilTypes.isProxy(value) ||
|
|
44
|
+
![Object.prototype, null].includes(Object.getPrototypeOf(value))
|
|
45
|
+
) {
|
|
46
|
+
throw new TypeError(`${label} must be a plain record`);
|
|
47
|
+
}
|
|
48
|
+
const own = Reflect.ownKeys(value);
|
|
49
|
+
if (
|
|
50
|
+
own.length !== keys.size ||
|
|
51
|
+
own.some((key) => typeof key !== "string" || !keys.has(key))
|
|
52
|
+
) {
|
|
53
|
+
throw new TypeError(`${label} has an invalid shape`);
|
|
54
|
+
}
|
|
55
|
+
for (const key of own) {
|
|
56
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
57
|
+
if (!descriptor || !("value" in descriptor) || !descriptor.enumerable) {
|
|
58
|
+
throw new TypeError(`${label}.${String(key)} is not a data field`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
15
62
|
|
|
16
63
|
function sameStorage(left, right) {
|
|
17
64
|
return (
|
|
@@ -143,6 +190,78 @@ export function createStructuredMemoryAgentControlPlane({
|
|
|
143
190
|
projection: memory.projection(),
|
|
144
191
|
});
|
|
145
192
|
};
|
|
193
|
+
const quarantineMemory = async (input) => {
|
|
194
|
+
exactDataRecord(
|
|
195
|
+
input,
|
|
196
|
+
REVOCATION_REQUEST_KEYS,
|
|
197
|
+
"Memory revocation request",
|
|
198
|
+
);
|
|
199
|
+
exactDataRecord(
|
|
200
|
+
input.dependency,
|
|
201
|
+
REVOCATION_DEPENDENCY_KEYS,
|
|
202
|
+
"Memory revocation dependency",
|
|
203
|
+
);
|
|
204
|
+
const request = structuredClone(input);
|
|
205
|
+
const projection = memory.projection();
|
|
206
|
+
const active = projection.memories[request?.dependency?.ref];
|
|
207
|
+
const quarantined = projection.quarantines?.[request?.dependency?.ref];
|
|
208
|
+
const subject =
|
|
209
|
+
active ??
|
|
210
|
+
(quarantined
|
|
211
|
+
? {
|
|
212
|
+
...quarantined,
|
|
213
|
+
memoryId: request.dependency.ref,
|
|
214
|
+
status: "active",
|
|
215
|
+
}
|
|
216
|
+
: null);
|
|
217
|
+
if (!subject) {
|
|
218
|
+
throw new Error("procedural Memory dependency is missing");
|
|
219
|
+
}
|
|
220
|
+
const authorityReceipt = await promotion.retainRevocation(request, subject);
|
|
221
|
+
if (quarantined) {
|
|
222
|
+
if (
|
|
223
|
+
quarantined.metadata?.revocationPropagationRequestDigest !==
|
|
224
|
+
request.requestDigest ||
|
|
225
|
+
quarantined.receipts?.revocation !== authorityReceipt.receiptDigest
|
|
226
|
+
) {
|
|
227
|
+
throw new Error("quarantined Memory conflicts with the rollback");
|
|
228
|
+
}
|
|
229
|
+
} else {
|
|
230
|
+
await memory.append({
|
|
231
|
+
eventId: `revocation-${request.requestDigest.slice("sha256:".length)}`,
|
|
232
|
+
memoryId: subject.memoryId,
|
|
233
|
+
layer: "procedural",
|
|
234
|
+
action: "quarantine",
|
|
235
|
+
authority: promotionActor,
|
|
236
|
+
automatic: true,
|
|
237
|
+
contentDigest: subject.contentDigest,
|
|
238
|
+
artifactRef: subject.artifactRef,
|
|
239
|
+
evidenceRefs: authorityReceipt.evidenceRefs,
|
|
240
|
+
supersedes: [],
|
|
241
|
+
receiptRefs: { revocation: authorityReceipt.receiptDigest },
|
|
242
|
+
timestamp: request.occurredAt,
|
|
243
|
+
metadata: {
|
|
244
|
+
revocationPropagationRequestDigest: request.requestDigest,
|
|
245
|
+
transitionDigest: request.transitionDigest,
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
return Object.freeze({
|
|
250
|
+
schema: SKILL_REVOCATION_DEPENDENCY_RESULT_SCHEMA,
|
|
251
|
+
authenticated: true,
|
|
252
|
+
durable: true,
|
|
253
|
+
applied: true,
|
|
254
|
+
idempotent: true,
|
|
255
|
+
tenantId,
|
|
256
|
+
operationId: request.operationId,
|
|
257
|
+
requestDigest: request.requestDigest,
|
|
258
|
+
dependencyKind: request.dependency.kind,
|
|
259
|
+
dependencyRef: request.dependency.ref,
|
|
260
|
+
dependencyDigest: request.dependency.digest,
|
|
261
|
+
disposition: request.dependency.disposition,
|
|
262
|
+
receiptDigest: memory.projection().projectionDigest,
|
|
263
|
+
});
|
|
264
|
+
};
|
|
146
265
|
const controlPlane = Object.freeze({
|
|
147
266
|
schema: STRUCTURED_MEMORY_AGENT_CONTROL_PLANE_SCHEMA,
|
|
148
267
|
tenantId,
|
|
@@ -152,6 +271,7 @@ export function createStructuredMemoryAgentControlPlane({
|
|
|
152
271
|
promotionReceiptWriter: promotion,
|
|
153
272
|
policyReceiptWriter: policy,
|
|
154
273
|
reconcilePromotionMemories: Object.freeze(reconcilePromotionMemories),
|
|
274
|
+
quarantineMemory: Object.freeze(quarantineMemory),
|
|
155
275
|
createEvaluatedPromotionControlPlane(options = {}) {
|
|
156
276
|
if (
|
|
157
277
|
!options ||
|
|
@@ -258,7 +258,11 @@ export class StructuredMemoryAuthorityLedgerAdapter {
|
|
|
258
258
|
}
|
|
259
259
|
|
|
260
260
|
async listReceipts(kind) {
|
|
261
|
-
if (
|
|
261
|
+
if (
|
|
262
|
+
!["critic", "evaluator", "promotion", "revocation", "policy"].includes(
|
|
263
|
+
kind,
|
|
264
|
+
)
|
|
265
|
+
) {
|
|
262
266
|
throw new TypeError(
|
|
263
267
|
"a structured memory authority receipt kind is required",
|
|
264
268
|
);
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
+
import { types as utilTypes } from "node:util";
|
|
2
3
|
import structuredMemory from "@chainlesschain/session-core/structured-evolution-memory";
|
|
3
4
|
import { buildSkillEvaluatedPromotionReceiptEnvelope } from "./skill-evaluated-promotion.js";
|
|
4
5
|
import { digestSkillMutationReceiptEnvelope } from "./skill-mutation-authority.js";
|
|
5
6
|
import { SKILL_TARGET_MATRIX_EVAL_RECEIPT_SCHEMA } from "./skill-target-matrix-eval.js";
|
|
7
|
+
import {
|
|
8
|
+
SKILL_REVOCATION_DEPENDENCY_REQUEST_SCHEMA,
|
|
9
|
+
digestSkillRevocationDependencyRequest,
|
|
10
|
+
} from "./skill-revocation-propagation.js";
|
|
6
11
|
|
|
7
12
|
const { createStructuredMemoryAuthorityReceipt } = structuredMemory;
|
|
8
13
|
const SKILL_RELEASE_RECEIPT_SCHEMA =
|
|
@@ -12,6 +17,26 @@ const SKILL_PROMOTION_REVIEW_ENVELOPE_SCHEMA =
|
|
|
12
17
|
const RELEASE_RECEIPT_DOMAIN = `${SKILL_RELEASE_RECEIPT_SCHEMA}\0`;
|
|
13
18
|
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
14
19
|
const WRITERS = new WeakSet();
|
|
20
|
+
const REVOCATION_REQUEST_KEYS = new Set([
|
|
21
|
+
"schema",
|
|
22
|
+
"tenantId",
|
|
23
|
+
"streamId",
|
|
24
|
+
"operationId",
|
|
25
|
+
"transitionDigest",
|
|
26
|
+
"candidateId",
|
|
27
|
+
"skillName",
|
|
28
|
+
"occurredAt",
|
|
29
|
+
"sourceReceiptDigest",
|
|
30
|
+
"resolutionDigest",
|
|
31
|
+
"dependency",
|
|
32
|
+
"requestDigest",
|
|
33
|
+
]);
|
|
34
|
+
const REVOCATION_DEPENDENCY_KEYS = new Set([
|
|
35
|
+
"kind",
|
|
36
|
+
"ref",
|
|
37
|
+
"digest",
|
|
38
|
+
"disposition",
|
|
39
|
+
]);
|
|
15
40
|
|
|
16
41
|
function canonical(value) {
|
|
17
42
|
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
@@ -40,6 +65,31 @@ function requiredDigest(value, name) {
|
|
|
40
65
|
return value;
|
|
41
66
|
}
|
|
42
67
|
|
|
68
|
+
function exact(value, keys, label) {
|
|
69
|
+
if (
|
|
70
|
+
!value ||
|
|
71
|
+
typeof value !== "object" ||
|
|
72
|
+
Array.isArray(value) ||
|
|
73
|
+
utilTypes.isProxy(value) ||
|
|
74
|
+
![Object.prototype, null].includes(Object.getPrototypeOf(value))
|
|
75
|
+
) {
|
|
76
|
+
throw new TypeError(`${label} must be a plain record`);
|
|
77
|
+
}
|
|
78
|
+
const own = Reflect.ownKeys(value);
|
|
79
|
+
if (
|
|
80
|
+
own.length !== keys.size ||
|
|
81
|
+
own.some((key) => typeof key !== "string" || !keys.has(key))
|
|
82
|
+
) {
|
|
83
|
+
throw new TypeError(`${label} has an invalid shape`);
|
|
84
|
+
}
|
|
85
|
+
for (const key of own) {
|
|
86
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
87
|
+
if (!descriptor || !("value" in descriptor) || !descriptor.enumerable) {
|
|
88
|
+
throw new TypeError(`${label}.${String(key)} is not a data field`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
43
93
|
function capture(owner, name) {
|
|
44
94
|
if (typeof owner?.[name] !== "function") {
|
|
45
95
|
throw new TypeError(`${name} port is required`);
|
|
@@ -143,6 +193,45 @@ function verifyPromotion(result, matrixBinding, reviewBinding, tenantId) {
|
|
|
143
193
|
return { release, receipt, evidenceRefs: [...new Set(evidenceRefs)].sort() };
|
|
144
194
|
}
|
|
145
195
|
|
|
196
|
+
function verifyRevocation(request, memory, tenantId) {
|
|
197
|
+
exact(request, REVOCATION_REQUEST_KEYS, "Memory revocation request");
|
|
198
|
+
exact(
|
|
199
|
+
request.dependency,
|
|
200
|
+
REVOCATION_DEPENDENCY_KEYS,
|
|
201
|
+
"Memory revocation dependency",
|
|
202
|
+
);
|
|
203
|
+
if (
|
|
204
|
+
request?.schema !== SKILL_REVOCATION_DEPENDENCY_REQUEST_SCHEMA ||
|
|
205
|
+
request.tenantId !== tenantId ||
|
|
206
|
+
request.dependency?.kind !== "memory" ||
|
|
207
|
+
request.dependency.disposition !== "quarantine" ||
|
|
208
|
+
request.dependency.ref !== memory?.memoryId ||
|
|
209
|
+
request.dependency.digest !== memory?.contentDigest ||
|
|
210
|
+
request.requestDigest !== digestSkillRevocationDependencyRequest(request) ||
|
|
211
|
+
memory.layer !== "procedural" ||
|
|
212
|
+
!DIGEST.test(request.transitionDigest ?? "") ||
|
|
213
|
+
!DIGEST.test(request.sourceReceiptDigest ?? "") ||
|
|
214
|
+
!DIGEST.test(request.resolutionDigest ?? "") ||
|
|
215
|
+
!Number.isFinite(Date.parse(request.occurredAt ?? "")) ||
|
|
216
|
+
new Date(request.occurredAt).toISOString() !== request.occurredAt ||
|
|
217
|
+
typeof memory.artifactRef !== "string" ||
|
|
218
|
+
!Array.isArray(memory.evidenceRefs)
|
|
219
|
+
) {
|
|
220
|
+
throw new Error("Memory revocation request is not exactly bound");
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
evidenceRefs: [
|
|
224
|
+
...new Set([
|
|
225
|
+
...memory.evidenceRefs,
|
|
226
|
+
request.transitionDigest,
|
|
227
|
+
request.sourceReceiptDigest,
|
|
228
|
+
request.resolutionDigest,
|
|
229
|
+
request.requestDigest,
|
|
230
|
+
]),
|
|
231
|
+
].sort(),
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
|
|
146
235
|
export function createStructuredMemoryPromotionReceiptWriter({
|
|
147
236
|
descriptor: input,
|
|
148
237
|
authorityStore,
|
|
@@ -201,6 +290,42 @@ export function createStructuredMemoryPromotionReceiptWriter({
|
|
|
201
290
|
}
|
|
202
291
|
return signed;
|
|
203
292
|
},
|
|
293
|
+
async retainRevocation(request, memory) {
|
|
294
|
+
const verified = verifyRevocation(request, memory, descriptor.tenantId);
|
|
295
|
+
const receipt = createStructuredMemoryAuthorityReceipt({
|
|
296
|
+
tenantId: descriptor.tenantId,
|
|
297
|
+
kind: "revocation",
|
|
298
|
+
decision: "accepted",
|
|
299
|
+
memoryId: memory.memoryId,
|
|
300
|
+
layer: "procedural",
|
|
301
|
+
action: "quarantine",
|
|
302
|
+
contentDigest: memory.contentDigest,
|
|
303
|
+
artifactRef: memory.artifactRef,
|
|
304
|
+
evidenceRefs: verified.evidenceRefs,
|
|
305
|
+
issuerId: descriptor.issuerId,
|
|
306
|
+
issuerRevision: descriptor.issuerRevision,
|
|
307
|
+
issuerHandlerDigest: descriptor.issuerHandlerDigest,
|
|
308
|
+
issuedAt: request.occurredAt,
|
|
309
|
+
});
|
|
310
|
+
const attestation = await attest({
|
|
311
|
+
purpose: "structured-memory-revocation-receipt",
|
|
312
|
+
payloadDigest: receipt.receiptDigest,
|
|
313
|
+
receipt,
|
|
314
|
+
propagationRequestDigest: request.requestDigest,
|
|
315
|
+
});
|
|
316
|
+
if (attestation === null || attestation === undefined) {
|
|
317
|
+
throw new Error("revocation receipt attestor returned no attestation");
|
|
318
|
+
}
|
|
319
|
+
const signed = Object.freeze({ ...receipt, attestation });
|
|
320
|
+
const retained = await retainReceipt(signed);
|
|
321
|
+
if (
|
|
322
|
+
retained?.persisted !== true ||
|
|
323
|
+
retained.receiptDigest !== receipt.receiptDigest
|
|
324
|
+
) {
|
|
325
|
+
throw new Error("revocation receipt was not durably acknowledged");
|
|
326
|
+
}
|
|
327
|
+
return signed;
|
|
328
|
+
},
|
|
204
329
|
});
|
|
205
330
|
WRITERS.add(writer);
|
|
206
331
|
return writer;
|
|
@@ -215,6 +340,7 @@ export function captureStructuredMemoryPromotionReceiptWriter(value) {
|
|
|
215
340
|
const captured = Object.freeze({
|
|
216
341
|
descriptor: value.descriptor,
|
|
217
342
|
retainPromotion: capture(value, "retainPromotion"),
|
|
343
|
+
retainRevocation: capture(value, "retainRevocation"),
|
|
218
344
|
});
|
|
219
345
|
WRITERS.add(captured);
|
|
220
346
|
return captured;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
|
|
3
3
|
export const WIKI_SKILL_PROPOSAL_SCHEMA =
|
|
4
|
-
"chainlesschain.wiki-informed-skill-proposal/
|
|
4
|
+
"chainlesschain.wiki-informed-skill-proposal/v2";
|
|
5
5
|
export const WIKI_PROPOSAL_STATUS = Object.freeze({
|
|
6
6
|
PROPOSAL: "proposal",
|
|
7
7
|
NO_PROPOSAL: "no-proposal",
|
|
@@ -38,6 +38,10 @@ function hash(value) {
|
|
|
38
38
|
return `sha256:${createHash("sha256").update(canonical(value)).digest("hex")}`;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
export function computeWikiSkillProposalDigest(proposal) {
|
|
42
|
+
return hash(proposal);
|
|
43
|
+
}
|
|
44
|
+
|
|
41
45
|
function deepFreeze(value) {
|
|
42
46
|
if (value && typeof value === "object" && !Object.isFrozen(value)) {
|
|
43
47
|
Object.freeze(value);
|
|
@@ -53,6 +57,24 @@ function requiredString(value, name) {
|
|
|
53
57
|
return value;
|
|
54
58
|
}
|
|
55
59
|
|
|
60
|
+
function normalizeProposerModel(value) {
|
|
61
|
+
if (
|
|
62
|
+
!value ||
|
|
63
|
+
typeof value !== "object" ||
|
|
64
|
+
Array.isArray(value) ||
|
|
65
|
+
![Object.prototype, null].includes(Object.getPrototypeOf(value)) ||
|
|
66
|
+
canonical(Object.keys(value).sort()) !==
|
|
67
|
+
canonical(["model", "provider", "version"])
|
|
68
|
+
) {
|
|
69
|
+
throw new TypeError("proposerModel must be an exact plain object");
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
provider: requiredString(value.provider, "proposerModel.provider"),
|
|
73
|
+
model: requiredString(value.model, "proposerModel.model"),
|
|
74
|
+
version: requiredString(value.version, "proposerModel.version"),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
56
78
|
function stringList(value, name, { allowEmpty = false, max = 64 } = {}) {
|
|
57
79
|
if (
|
|
58
80
|
!Array.isArray(value) ||
|
|
@@ -76,7 +98,9 @@ function verifyEnvelope(value, expectedKind) {
|
|
|
76
98
|
!DIGEST.test(value.digest ?? "") ||
|
|
77
99
|
value.digest !== hash(value.data)
|
|
78
100
|
) {
|
|
79
|
-
const error = new Error(
|
|
101
|
+
const error = new Error(
|
|
102
|
+
`${expectedKind} evidence is not digest-bound and trusted`,
|
|
103
|
+
);
|
|
80
104
|
error.code = "WIKI_PROPOSAL_UNTRUSTED_EVIDENCE";
|
|
81
105
|
throw error;
|
|
82
106
|
}
|
|
@@ -94,7 +118,7 @@ function normalizeDescriptor(input) {
|
|
|
94
118
|
evolutionRunId: requiredString(input?.evolutionRunId, "evolutionRunId"),
|
|
95
119
|
targetSkillName: requiredString(input?.targetSkillName, "targetSkillName"),
|
|
96
120
|
wikiRevision: requiredString(input?.wikiRevision, "wikiRevision"),
|
|
97
|
-
proposerModel:
|
|
121
|
+
proposerModel: normalizeProposerModel(input?.proposerModel),
|
|
98
122
|
minEvidenceSamples: Math.max(1, Number(input?.minEvidenceSamples) || 1),
|
|
99
123
|
maxSelectiveEvidence: Math.min(
|
|
100
124
|
16,
|
|
@@ -115,7 +139,10 @@ function validateDiff(diff) {
|
|
|
115
139
|
if (!entry || !["add", "replace", "remove"].includes(entry.op)) {
|
|
116
140
|
throw new TypeError("machineDiff operation is invalid");
|
|
117
141
|
}
|
|
118
|
-
const path = requiredString(entry.path, "machineDiff.path").replaceAll(
|
|
142
|
+
const path = requiredString(entry.path, "machineDiff.path").replaceAll(
|
|
143
|
+
"\\",
|
|
144
|
+
"/",
|
|
145
|
+
);
|
|
119
146
|
const parts = path.split("/");
|
|
120
147
|
if (
|
|
121
148
|
path.startsWith("/") ||
|
|
@@ -141,7 +168,9 @@ function validateProposal(output, descriptor, evidence) {
|
|
|
141
168
|
throw new TypeError("proposal output status is invalid");
|
|
142
169
|
}
|
|
143
170
|
if (output.skillName !== descriptor.targetSkillName) {
|
|
144
|
-
const error = new Error(
|
|
171
|
+
const error = new Error(
|
|
172
|
+
"proposer attempted to change more than the fixed Skill",
|
|
173
|
+
);
|
|
145
174
|
error.code = "WIKI_PROPOSAL_MULTI_SKILL";
|
|
146
175
|
throw error;
|
|
147
176
|
}
|
|
@@ -156,7 +185,9 @@ function validateProposal(output, descriptor, evidence) {
|
|
|
156
185
|
};
|
|
157
186
|
for (const ref of [...purpose.patternRefs, ...purpose.sourceEvidenceRefs]) {
|
|
158
187
|
if (!knownRefs.has(ref)) {
|
|
159
|
-
const error = new Error(
|
|
188
|
+
const error = new Error(
|
|
189
|
+
"PURPOSE references evidence outside the resolved set",
|
|
190
|
+
);
|
|
160
191
|
error.code = "WIKI_PROPOSAL_UNKNOWN_LINEAGE";
|
|
161
192
|
throw error;
|
|
162
193
|
}
|
|
@@ -181,22 +212,38 @@ function validateProposal(output, descriptor, evidence) {
|
|
|
181
212
|
skillName: descriptor.targetSkillName,
|
|
182
213
|
purpose,
|
|
183
214
|
applicableWhen: stringList(output.applicableWhen, "applicableWhen"),
|
|
184
|
-
notApplicableWhen: stringList(
|
|
215
|
+
notApplicableWhen: stringList(
|
|
216
|
+
output.notApplicableWhen,
|
|
217
|
+
"notApplicableWhen",
|
|
218
|
+
),
|
|
185
219
|
failureCounterexamples: stringList(
|
|
186
220
|
output.failureCounterexamples,
|
|
187
221
|
"failureCounterexamples",
|
|
188
222
|
),
|
|
189
223
|
rollbackSteps: stringList(output.rollbackSteps, "rollbackSteps"),
|
|
190
|
-
validationMethods: stringList(
|
|
224
|
+
validationMethods: stringList(
|
|
225
|
+
output.validationMethods,
|
|
226
|
+
"validationMethods",
|
|
227
|
+
),
|
|
191
228
|
requestedCapabilities: stringList(
|
|
192
229
|
output.requestedCapabilities,
|
|
193
230
|
"requestedCapabilities",
|
|
194
231
|
{ allowEmpty: true },
|
|
195
|
-
),
|
|
196
|
-
targetRuntimes: stringList(output.targetRuntimes, "targetRuntimes"),
|
|
232
|
+
).sort(),
|
|
233
|
+
targetRuntimes: stringList(output.targetRuntimes, "targetRuntimes").sort(),
|
|
197
234
|
contextCost,
|
|
198
235
|
machineDiff: validateDiff(output.machineDiff),
|
|
199
|
-
sourceEvidenceRefs: evidence
|
|
236
|
+
sourceEvidenceRefs: evidence
|
|
237
|
+
.map(({ ref, digest }) => ({ ref, digest }))
|
|
238
|
+
.sort(
|
|
239
|
+
(left, right) =>
|
|
240
|
+
(left.ref < right.ref ? -1 : left.ref > right.ref ? 1 : 0) ||
|
|
241
|
+
(left.digest < right.digest
|
|
242
|
+
? -1
|
|
243
|
+
: left.digest > right.digest
|
|
244
|
+
? 1
|
|
245
|
+
: 0),
|
|
246
|
+
),
|
|
200
247
|
wikiRevision: descriptor.wikiRevision,
|
|
201
248
|
proposerModel: descriptor.proposerModel,
|
|
202
249
|
});
|
|
@@ -214,8 +261,13 @@ function abstention(status, reason, evidence = []) {
|
|
|
214
261
|
export class WikiInformedSkillProposer {
|
|
215
262
|
constructor({ descriptor, policy, ports } = {}) {
|
|
216
263
|
this.descriptor = normalizeDescriptor(descriptor);
|
|
217
|
-
if (
|
|
218
|
-
|
|
264
|
+
if (
|
|
265
|
+
policy?.proposerWikiRead !== true ||
|
|
266
|
+
policy?.executionAgentWikiRead === true
|
|
267
|
+
) {
|
|
268
|
+
throw new Error(
|
|
269
|
+
"capability policy must isolate Wiki reads to the proposer",
|
|
270
|
+
);
|
|
219
271
|
}
|
|
220
272
|
if (typeof ports?.readInitial !== "function")
|
|
221
273
|
throw new TypeError("readInitial port is required");
|
|
@@ -229,7 +281,7 @@ export class WikiInformedSkillProposer {
|
|
|
229
281
|
Object.freeze(this);
|
|
230
282
|
}
|
|
231
283
|
|
|
232
|
-
async
|
|
284
|
+
async draft() {
|
|
233
285
|
const initial = [];
|
|
234
286
|
for (const kind of INITIAL_SOURCES) {
|
|
235
287
|
initial.push(verifyEnvelope(await this._ports.readInitial(kind), kind));
|
|
@@ -243,7 +295,9 @@ export class WikiInformedSkillProposer {
|
|
|
243
295
|
initial,
|
|
244
296
|
);
|
|
245
297
|
}
|
|
246
|
-
if (
|
|
298
|
+
if (
|
|
299
|
+
Number(training.data?.sampleCount) < this.descriptor.minEvidenceSamples
|
|
300
|
+
) {
|
|
247
301
|
return abstention(
|
|
248
302
|
WIKI_PROPOSAL_STATUS.NEEDS_EVIDENCE,
|
|
249
303
|
"training evidence sample is insufficient",
|
|
@@ -257,7 +311,11 @@ export class WikiInformedSkillProposer {
|
|
|
257
311
|
evidence: deepFreeze([...evidence]),
|
|
258
312
|
});
|
|
259
313
|
if (output?.status === WIKI_PROPOSAL_STATUS.NO_PROPOSAL) {
|
|
260
|
-
return abstention(
|
|
314
|
+
return abstention(
|
|
315
|
+
output.status,
|
|
316
|
+
requiredString(output.reason, "reason"),
|
|
317
|
+
evidence,
|
|
318
|
+
);
|
|
261
319
|
}
|
|
262
320
|
if (output?.status === WIKI_PROPOSAL_STATUS.NEEDS_EVIDENCE) {
|
|
263
321
|
const requests = output.requests;
|
|
@@ -266,11 +324,19 @@ export class WikiInformedSkillProposer {
|
|
|
266
324
|
requests.length === 0 ||
|
|
267
325
|
requests.length > this.descriptor.maxSelectiveEvidence
|
|
268
326
|
) {
|
|
269
|
-
return abstention(
|
|
327
|
+
return abstention(
|
|
328
|
+
output.status,
|
|
329
|
+
"selective evidence request is invalid",
|
|
330
|
+
evidence,
|
|
331
|
+
);
|
|
270
332
|
}
|
|
271
333
|
for (const request of requests) {
|
|
272
334
|
if (!SELECTIVE_SOURCES.has(request?.kind)) {
|
|
273
|
-
return abstention(
|
|
335
|
+
return abstention(
|
|
336
|
+
output.status,
|
|
337
|
+
"requested evidence scope is not allowed",
|
|
338
|
+
evidence,
|
|
339
|
+
);
|
|
274
340
|
}
|
|
275
341
|
evidence.push(
|
|
276
342
|
verifyEnvelope(
|
|
@@ -295,7 +361,45 @@ export class WikiInformedSkillProposer {
|
|
|
295
361
|
}
|
|
296
362
|
|
|
297
363
|
const proposal = validateProposal(output, this.descriptor, evidence);
|
|
298
|
-
const proposalDigest =
|
|
364
|
+
const proposalDigest = computeWikiSkillProposalDigest(proposal);
|
|
365
|
+
return deepFreeze({
|
|
366
|
+
status: WIKI_PROPOSAL_STATUS.PROPOSAL,
|
|
367
|
+
proposal,
|
|
368
|
+
proposalDigest,
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
async propose() {
|
|
373
|
+
const drafted = await this.draft();
|
|
374
|
+
if (drafted.status !== WIKI_PROPOSAL_STATUS.PROPOSAL) return drafted;
|
|
375
|
+
return this.createCandidateFromDraft(drafted);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
async createCandidateFromDraft(drafted) {
|
|
379
|
+
const proposal = drafted?.proposal;
|
|
380
|
+
const sourceEvidenceRefs = Array.isArray(proposal?.sourceEvidenceRefs)
|
|
381
|
+
? proposal.sourceEvidenceRefs
|
|
382
|
+
: [];
|
|
383
|
+
const normalized = validateProposal(
|
|
384
|
+
proposal,
|
|
385
|
+
this.descriptor,
|
|
386
|
+
sourceEvidenceRefs,
|
|
387
|
+
);
|
|
388
|
+
if (
|
|
389
|
+
drafted?.status !== WIKI_PROPOSAL_STATUS.PROPOSAL ||
|
|
390
|
+
proposal?.schema !== WIKI_SKILL_PROPOSAL_SCHEMA ||
|
|
391
|
+
proposal?.tenantId !== this.descriptor.tenantId ||
|
|
392
|
+
proposal?.evolutionRunId !== this.descriptor.evolutionRunId ||
|
|
393
|
+
canonical(normalized) !== canonical(proposal) ||
|
|
394
|
+
drafted?.proposalDigest !== computeWikiSkillProposalDigest(proposal)
|
|
395
|
+
) {
|
|
396
|
+
const error = new Error(
|
|
397
|
+
"draft is not an exact proposal bound to this proposer",
|
|
398
|
+
);
|
|
399
|
+
error.code = "WIKI_PROPOSAL_DRAFT_UNCONFIRMED";
|
|
400
|
+
throw error;
|
|
401
|
+
}
|
|
402
|
+
const { proposalDigest } = drafted;
|
|
299
403
|
const candidateInput = deepFreeze({
|
|
300
404
|
tenantId: proposal.tenantId,
|
|
301
405
|
skillName: proposal.skillName,
|
|
@@ -315,10 +419,12 @@ export class WikiInformedSkillProposer {
|
|
|
315
419
|
candidate.content !== candidateInput.content ||
|
|
316
420
|
candidate.derivationMode !== "wiki" ||
|
|
317
421
|
candidate.wikiRevision !== proposal.wikiRevision ||
|
|
318
|
-
candidate.proposerModel !==
|
|
422
|
+
canonical(candidate.proposerModel) !==
|
|
423
|
+
canonical(proposal.proposerModel) ||
|
|
319
424
|
canonical(candidate.requestedCapabilities) !==
|
|
320
425
|
canonical(proposal.requestedCapabilities) ||
|
|
321
|
-
canonical(candidate.targetRuntimes) !==
|
|
426
|
+
canonical(candidate.targetRuntimes) !==
|
|
427
|
+
canonical(proposal.targetRuntimes) ||
|
|
322
428
|
canonical(candidate.sourceEvidenceRefs) !==
|
|
323
429
|
canonical(proposal.sourceEvidenceRefs)
|
|
324
430
|
) {
|