chainlesschain 0.166.16 → 0.166.18
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 +17 -10
- package/completions/_cc +1 -1
- package/completions/cc.bash +1 -1
- package/completions/cc.fish +1 -1
- package/completions/cc.ps1 +1 -1
- package/package.json +2 -2
- package/src/assets/web-panel/assets/{AIOps-CTxa2Wbq.js → AIOps-CQSBl3hY.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DHrQyYhy.js → ActionButton-IQt-vRLt.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DQiUqcNl.js → Analytics-DkHC8O7k.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-_Iz4r6wt.js → AppLayout-CSti2P2T.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BNs63YHo.js → Artifacts-C57hxn3v.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BgHIqRLn.js → Audit-DByLntcf.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DUQ5axBB.js → BackgroundAgents-D1Bd2EOa.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CJ51E9Vw.js → Backup-VstHzHng.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-o-5toA_R.js → BaseInput-CLhdexIf.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Cu7a-x1L.js → Chat-BefC_JZS.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-BUyYkAXr.js → ChatBubbleRenderer-DbXMvgmn.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DwdmZ71L.js → Checkbox-CEY982vx.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BrH2eYiP.js → Codegen-Dcm_DTvJ.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BVJQEP2j.js → Col-C8SSu4KA.js} +1 -1
- package/src/assets/web-panel/assets/{Community-FGO3vZPq.js → Community-BVV9vwRR.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DYGAFVnT.js → Compact-B7c5Vo18.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CRvc8Bdt.js → Compliance-Tq9jSZ5a.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-D6Ah2m7A.js → Cowork-BJUjT09Q.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-AXbU2ifR.js → Cron-CjV9PEaS.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-C5DXgEFd.js → Crosschain-Dl7ReL8F.js} +1 -1
- package/src/assets/web-panel/assets/{DID-Bxh9QV9v.js → DID-CG8PjWmM.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-B-ZHEta-.js → Dashboard-CDBM6wmF.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-66Ik1jqa.js → Dropdown-8_55bXTD.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CCWk1BIM.js → EmailListRenderer-D3qOU1Cm.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard--9faIULK.js → FamilyGuardDashboard-Bv5oWMZF.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CejW9CgX.js → Federation-hpZ1xkKd.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-acHgcXki.js → FormItemContext-BN7GT191.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-D2ghd_K4.js → GenericCardRenderer-PCRhfA7M.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BOe1YJrV.js → Git-CIlP2vy7.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BjgzJsof.js → Governance-81lgm7YL.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CXCD5rnP.js → Inference-Cs24xMOV.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CHA8QgJT.js → KnowledgeGraph-CrJLVCZo.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DORPMcL6.js → Logs-DLyO8RKT.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-CPPHz01z.js → MarkdownRenderer-DBOqijrP.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-BCFlo1Yx.js → Marketplace-Dz7AbQZc.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Dl_uZAKh.js → McpTools-BM0aFiWv.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-DupHamwz.js → Memory-C9SJzENX.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BRSMPJxW.js → MobileBridge-BO2HnNRk.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BHpuzsDl.js → MobileProjects-CK_jMz0l.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-Ch0jOQfZ.js → Mtc-CfhrJsdO.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-qzwQrDi7.js → MtcAudit-BE2ELxgI.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-B5wHzUcm.js → Multisig-CgR_E3Jd.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Hy9uAiA0.js → NLProgramming-Cw9445_K.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DkuchMC7.js → Notes-DZimkTrb.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-CYZhD7Pi.js → NotificationSettings-DxHVh4uT.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DKOoqajt.js → OrderTableRenderer-Iy-pnX56.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-D9AXn6j8.js → Organization-pPXJtWo4.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Bg15J6hX.js → Overflow-YamdTJwA.js} +1 -1
- package/src/assets/web-panel/assets/{P2P--B54HoQn.js → P2P-BvqP53x7.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Cz9Kk2Nb.js → PdhVaultBrowser-Blz1Xn2n.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-DHx38eS1.js → Permissions-CgFRQqFJ.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Dw8i2hAs.js → PersonalDataHub-CFeo3-6O.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-B2o6Ur2G.js → Pipeline-BkaRojEK.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-8g-h2fnu.js → Privacy-BNZEx2Qp.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DuVTcINx.js → ProjectInit-HUBOgEEK.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-C8njvdZX.js → ProjectSettings-CFMmhROS.js} +2 -2
- package/src/assets/web-panel/assets/Projects-Dc517BXp.js +1 -0
- package/src/assets/web-panel/assets/{Providers-wFqgod_W.js → Providers-DTLf8bgj.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-9NCXrpmA.js → QrScannerModal-BBNjPszk.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-WUTNvFkY.js → QuickAsk-DCsHvk3G.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-xT4nYmju.js → Recommend-Dpr5YSop.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-fak1PBGC.js → RemoteSession-DmKnvqGg.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-D1AkQvD-.js → Reputation-CSRfuurX.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DVfm6xGt.js → Row-CDj3pQ_w.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BDunoLSE.js → RssFeed-DI0a_kNq.js} +2 -2
- package/src/assets/web-panel/assets/{Search-OPycRoU3.js → Search-jAy7B2nU.js} +1 -1
- package/src/assets/web-panel/assets/{Security-C8-Fm3Dt.js → Security-CkHTqYhc.js} +4 -4
- package/src/assets/web-panel/assets/{Services-qM_sMpMl.js → Services-CP-0Nzga.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-D3HBJjVF.js → Skeleton-BkF5-p3n.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-jr67X-tP.js → Skills-BDu-utDE.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CS3ggyCg.js → Sla-CQvq_2Qb.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CTOCYxOi.js → SpeechSettings-T7Ap512g.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-D3s3cLT5.js → SyncSettings-Bt-PLvot.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-CdfoJ25m.js → Tasks-yLEcCogg.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Drb4AI8X.js → Templates-ByN3fmbr.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DzwR3Qkz.js → Tenant-DBI7hITH.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D-ESq7xp.js → Terminal-B77_DlGX.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BK-AUuws.js → TimelineRenderer-CsLTB_QO.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-xGTouuNp.js → Tokens-BV2N6cR8.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BvZj-v2H.js → Trigger-CjXWGH3p.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BLC9CGmc.js → Trust-uqXIq3WC.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BSuCXpmE.js → UkeySign-D-6qu4vY.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DT3A-_Ql.js → VideoEditing-CxGmx_2e.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-c1OXao85.js → Wallet-DSq7WlAg.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CuA-F7KJ.js → WebAuthn-CDBiD57O.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor-MANZrf82.js → WorkflowEditor-Z8f63TSb.js} +1 -1
- package/src/assets/web-panel/assets/{chat-D4Y4Ey0O.js → chat-B-UZFBjy.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DDH06hKO.js → colors-CFk7K-7Q.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-Cym756Xj.js → compact-item-X0IVMvgi.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-By4Nb1k-.js → createContext-DWg4j2n6.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-B2IW1J_J.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-Ch7OY258.js → hasIn-CkVCwNNF.js} +1 -1
- package/src/assets/web-panel/assets/{index-D9le0-dc.js → index-5OcZHdzc.js} +1 -1
- package/src/assets/web-panel/assets/{index-CykROEJA.js → index-B273IY-E.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjwgJ5Jd.js → index-B3-B3FWD.js} +1 -1
- package/src/assets/web-panel/assets/{index-CjNUTBwe.js → index-BB4KHHcv.js} +1 -1
- package/src/assets/web-panel/assets/index-BCp2ir-1.js +1 -0
- package/src/assets/web-panel/assets/{index-BFydNU6a.js → index-BG-GaZri.js} +1 -1
- package/src/assets/web-panel/assets/{index-mL3nOcH6.js → index-BPBia4b-.js} +1 -1
- package/src/assets/web-panel/assets/{index-XGeQMvWK.js → index-BipwEbTA.js} +1 -1
- package/src/assets/web-panel/assets/{index-D5sADPGY.js → index-BoskgPt9.js} +1 -1
- package/src/assets/web-panel/assets/{index-CV8qXTvb.js → index-Btqk6zWb.js} +1 -1
- package/src/assets/web-panel/assets/index-Bw4iuzRD.js +1 -0
- package/src/assets/web-panel/assets/{index-CJPks33Y.js → index-BzXjYUmd.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBBUn5v7.js → index-C1ZAOJRW.js} +1 -1
- package/src/assets/web-panel/assets/{index-DiewptTL.js → index-CCLwoATF.js} +1 -1
- package/src/assets/web-panel/assets/{index-OU8DZ9BL.js → index-CDfSD07S.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvnywwUj.js → index-CLlP1E4X.js} +1 -1
- package/src/assets/web-panel/assets/{index-CT-3FYwd.js → index-CMCEXBRh.js} +1 -1
- package/src/assets/web-panel/assets/{index-tZ5BUdad.js → index-CN8HZlLH.js} +1 -1
- package/src/assets/web-panel/assets/{index-DNlxihs8.js → index-CNKFsBlz.js} +1 -1
- package/src/assets/web-panel/assets/{index-CF3Lhyns.js → index-CUBkvFPH.js} +1 -1
- package/src/assets/web-panel/assets/{index-CV1UC4zo.js → index-Ca0mij1n.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAkk1M7x.js → index-CbIAWbma.js} +1 -1
- package/src/assets/web-panel/assets/{index-DNEJzc0r.js → index-CbihMThv.js} +1 -1
- package/src/assets/web-panel/assets/{index-q-s04OKn.js → index-CvOa-IFV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZB9q-Lp.js → index-Cvwu_rA_.js} +1 -1
- package/src/assets/web-panel/assets/{index-oBsfUbyH.js → index-D-EJNxgR.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZY2Qs_Sn.js → index-D8uEL8Uw.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtGValNi.js → index-D92g4l3n.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpudmDhf.js → index-DCqpl_E_.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bo20BfdS.js → index-DLSBks8h.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUSUzaB8.js → index-Db_5xhrU.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZn6dmZe.js → index-DcDggpWR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CGsvEbbq.js → index-DeWKPQGs.js} +1 -1
- package/src/assets/web-panel/assets/{index-jx7kr6mB.js → index-DhVHoqGL.js} +3 -3
- package/src/assets/web-panel/assets/{index-BIrRX-ra.js → index-DyWlOuak.js} +1 -1
- package/src/assets/web-panel/assets/{index-6CpOV3Pn.js → index-LU54bChK.js} +1 -1
- package/src/assets/web-panel/assets/{index-6-2eYBXr.js → index-OjnAwUJo.js} +1 -1
- package/src/assets/web-panel/assets/{index-B51otVoZ.js → index-P83LDnCz.js} +1 -1
- package/src/assets/web-panel/assets/{index-ArMrnx0v.js → index-_-9k3Tna.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DGcX9iPP.js → initDefaultProps-CFNgY8lJ.js} +1 -1
- package/src/assets/web-panel/assets/{motion-2SeL1D8A.js → motion-D-5RrDzn.js} +1 -1
- package/src/assets/web-panel/assets/{move-3cYbQCpS.js → move-DN-L0Bd-.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-IDdxfw0z.js → mtc-parser-6mgLSeCK.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BNswdKO6.js → omit-ClWW8eTP.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BwCnem2I.js → pickAttrs-Vystq3R8.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-B9PtZ5rq.js → placementArrow-D0H9hK4W.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CPB6iSzV.js → responsiveObserve-B3iNRU-a.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DZgyblZa.js → slide-CiMXe6am.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-D82IBdsx.js → statusUtils-CGDZJ1uT.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-qSHtosM-.js → styleChecker-D2zA6NkY.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CmWO7h0I.js → useFlexGapSupport-C1sYU6QE.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-yLrs_ub4.js → useFs-BzUHSjg2.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CJ1VW6rh.js → usePersonalDataHub-CxB5yZCq.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CzY_moQ4.js → vnode-BfUfMwtc.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DAa7rEY5.js → zoom-CFYmj1TO.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +2 -2
- package/src/command-manifest.json +2 -2
- package/src/commands/agent.js +80 -2
- package/src/commands/evolution.js +61 -42
- package/src/commands/learning.js +24 -8
- package/src/commands/serve.js +11 -2
- package/src/data/changelog.json +13 -0
- package/src/gateways/ws/session-protocol.js +1 -0
- package/src/gateways/ws/ws-agent-handler.js +70 -2
- package/src/gateways/ws/ws-server.js +8 -0
- package/src/lib/app-server/cli-agent-kernel-adapter.js +4 -0
- package/src/lib/app-server/graph-runtime.js +115 -8
- package/src/lib/app-server/server.js +21 -2
- package/src/lib/app-server/websocket-transport.js +2 -0
- package/src/lib/evolution/agent-evolution-ingress.js +300 -0
- package/src/lib/evolution/agent-evolution-runtime-composition-brand.js +22 -0
- package/src/lib/evolution/agent-evolution-runtime-composition.js +369 -0
- package/src/lib/evolution/bounded-skill-improvement-pilot.js +498 -0
- package/src/lib/evolution/evidence-backed-wiki-maintainer.js +752 -0
- package/src/lib/evolution/evolution-artifact-ports.js +48 -0
- package/src/lib/evolution/evolution-eval-gate.js +11 -4
- package/src/lib/evolution/evolution-evidence-artifact-adapter.js +499 -0
- package/src/lib/evolution/evolution-evidence-projector.js +61 -1
- package/src/lib/evolution/evolution-file-witness.js +601 -0
- package/src/lib/evolution/evolution-ledger-file-backend.js +176 -0
- package/src/lib/evolution/evolution-ledger-ports.js +353 -16
- package/src/lib/evolution/evolution-ledger.js +1355 -54
- package/src/lib/evolution/evolution-run-ledger-adapter.js +409 -0
- package/src/lib/evolution/evolution-run-runtime-adapter.js +5 -0
- package/src/lib/evolution/evolution-run-wiki-maintenance-source.js +300 -0
- package/src/lib/evolution/scheduled-batch-wiki-maintenance-source.js +368 -0
- package/src/lib/evolution/skill-candidate-registry.js +649 -0
- package/src/lib/evolution/skill-evaluated-promotion-durability.js +899 -0
- package/src/lib/evolution/skill-evaluated-promotion.js +481 -0
- package/src/lib/evolution/skill-promotion-controller.js +220 -37
- package/src/lib/evolution/skill-promotion-review-ledger-adapter.js +451 -0
- package/src/lib/evolution/skill-promotion-review.js +793 -0
- package/src/lib/evolution/skill-registry-transition-capability.js +55 -0
- package/src/lib/evolution/skill-registry-transition-ledger-adapter.js +1280 -0
- package/src/lib/evolution/skill-registry-transition-source.js +372 -0
- package/src/lib/evolution/skill-release-registry.js +2191 -11
- package/src/lib/evolution/skill-target-matrix-eval.js +133 -10
- package/src/lib/evolution/structured-memory-agent-control-plane.js +222 -0
- package/src/lib/evolution/structured-memory-authority-ledger-adapter.js +351 -0
- package/src/lib/evolution/structured-memory-ledger-adapter.js +220 -0
- package/src/lib/evolution/structured-memory-policy-receipt-writer.js +164 -0
- package/src/lib/evolution/structured-memory-post-compact-hook.js +87 -0
- package/src/lib/evolution/structured-memory-promotion-receipt-writer.js +221 -0
- package/src/lib/evolution/structured-memory-semantic-review-pipeline.js +313 -0
- package/src/lib/evolution/wiki-informed-skill-proposer.js +343 -0
- package/src/lib/evolution/wiki-maintainer-ledger-adapter.js +200 -0
- package/src/lib/evolution/wiki-maintenance-trigger-ledger-adapter.js +687 -0
- package/src/lib/evolution-system.js +65 -30
- package/src/lib/graph-kernel/evolution-run-runtime-adapter.js +5 -0
- package/src/lib/hooks-v2-runtime.js +20 -0
- package/src/lib/mcp-lifecycle-authority.js +21 -2
- package/src/lib/remote-approval-bridge.js +24 -0
- package/src/lib/scheduler-kernel/store.js +62 -14
- package/src/repl/agent-repl.js +45 -0
- package/src/runtime/agent-core.js +68 -0
- package/src/runtime/agent-runtime.js +114 -1
- package/src/runtime/headless-runner.js +19 -0
- package/src/runtime/headless-stream.js +43 -0
- package/src/runtime/runtime-factory.js +19 -1
- package/src/assets/web-panel/assets/Projects-Ca9BAfu7.js +0 -1
- package/src/assets/web-panel/assets/devWarning-KO3pAGeO.js +0 -1
- package/src/assets/web-panel/assets/index-Bh4Rgkg2.js +0 -1
- package/src/assets/web-panel/assets/index-Dox_coTY.js +0 -1
- package/src/lib/learning/learning-hooks.js +0 -123
|
@@ -12,6 +12,13 @@ import {
|
|
|
12
12
|
verifySkillMutationConsumptionReceipt,
|
|
13
13
|
verifySkillMutationRequest,
|
|
14
14
|
} from "./skill-mutation-authority.js";
|
|
15
|
+
import { captureSkillEvaluatedPromotionProvider } from "./skill-evaluated-promotion.js";
|
|
16
|
+
import { captureStructuredMemoryPromotionReceiptWriter } from "./structured-memory-promotion-receipt-writer.js";
|
|
17
|
+
import {
|
|
18
|
+
consumeRegistryTransitionCapability,
|
|
19
|
+
issueRegistryTransitionCapability,
|
|
20
|
+
} from "./skill-registry-transition-capability.js";
|
|
21
|
+
import { captureSkillPromotionReviewProvider } from "./skill-promotion-review.js";
|
|
15
22
|
|
|
16
23
|
const DIGEST_PATTERN = /^sha256:[a-f0-9]{64}$/u;
|
|
17
24
|
const EMPTY_ACTIVE_DOMAIN = "chainlesschain.skill-active/empty/v1\0";
|
|
@@ -22,7 +29,24 @@ export const EMPTY_SKILL_ACTIVE_DIGEST = `sha256:${crypto
|
|
|
22
29
|
.update(EMPTY_ACTIVE_DOMAIN, "utf8")
|
|
23
30
|
.digest("hex")}`;
|
|
24
31
|
|
|
25
|
-
const
|
|
32
|
+
const EVALUATED_CONTROL_PLANE_OPTION_KEYS = new Set([
|
|
33
|
+
"candidateRegistry",
|
|
34
|
+
"releaseRegistry",
|
|
35
|
+
"authority",
|
|
36
|
+
"evaluatedPromotionProvider",
|
|
37
|
+
"memoryPromotionReceiptWriter",
|
|
38
|
+
"promotionReviewProvider",
|
|
39
|
+
]);
|
|
40
|
+
const EVALUATED_CONTROL_PLANE_REQUIRED_KEYS = new Set([
|
|
41
|
+
"candidateRegistry",
|
|
42
|
+
"releaseRegistry",
|
|
43
|
+
"authority",
|
|
44
|
+
"evaluatedPromotionProvider",
|
|
45
|
+
]);
|
|
46
|
+
|
|
47
|
+
export const SKILL_EVALUATED_PROMOTION_CONTROL_PLANE_SCHEMA =
|
|
48
|
+
"chainlesschain.skill-evaluated-promotion-control-plane/v1";
|
|
49
|
+
const EVALUATED_PROMOTION_CONTROL_PLANES = new WeakSet();
|
|
26
50
|
|
|
27
51
|
export class SkillPromotionControllerError extends Error {
|
|
28
52
|
constructor(code, message, details = {}) {
|
|
@@ -201,40 +225,7 @@ function assertTransitionSubject(request, expectedDigest) {
|
|
|
201
225
|
}
|
|
202
226
|
}
|
|
203
227
|
|
|
204
|
-
|
|
205
|
-
const capability = Object.freeze(Object.create(null));
|
|
206
|
-
TRANSITION_CAPABILITIES.set(capability, {
|
|
207
|
-
registry,
|
|
208
|
-
payload: deepFreeze(payload),
|
|
209
|
-
status: "issued",
|
|
210
|
-
});
|
|
211
|
-
return capability;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
* Registry-only broker. It is exported solely to break the module boundary;
|
|
216
|
-
* callers cannot manufacture a WeakMap-backed capability or replay one.
|
|
217
|
-
*/
|
|
218
|
-
export function consumeRegistryTransitionCapability(capability, registry) {
|
|
219
|
-
const state =
|
|
220
|
-
capability && typeof capability === "object"
|
|
221
|
-
? TRANSITION_CAPABILITIES.get(capability)
|
|
222
|
-
: null;
|
|
223
|
-
if (!state || state.registry !== registry) {
|
|
224
|
-
throw failure(
|
|
225
|
-
"SKILL_PROMOTION_TRANSITION_CAPABILITY_INVALID",
|
|
226
|
-
"registry transition capability is forged or bound to another registry",
|
|
227
|
-
);
|
|
228
|
-
}
|
|
229
|
-
if (state.status !== "issued") {
|
|
230
|
-
throw failure(
|
|
231
|
-
"SKILL_PROMOTION_TRANSITION_CAPABILITY_REPLAYED",
|
|
232
|
-
"registry transition capability has already been consumed",
|
|
233
|
-
);
|
|
234
|
-
}
|
|
235
|
-
state.status = "consumed";
|
|
236
|
-
return state.payload;
|
|
237
|
-
}
|
|
228
|
+
export { consumeRegistryTransitionCapability };
|
|
238
229
|
|
|
239
230
|
export class SkillPromotionController {
|
|
240
231
|
#tenantId;
|
|
@@ -251,7 +242,26 @@ export class SkillPromotionController {
|
|
|
251
242
|
|
|
252
243
|
#consumeAuthority;
|
|
253
244
|
|
|
254
|
-
|
|
245
|
+
#evaluatedPromotionProvider;
|
|
246
|
+
|
|
247
|
+
#requireEvaluatedPromotion;
|
|
248
|
+
|
|
249
|
+
#memoryPromotionReceiptWriter;
|
|
250
|
+
|
|
251
|
+
#promotionReviewProvider;
|
|
252
|
+
|
|
253
|
+
#requireHumanReview;
|
|
254
|
+
|
|
255
|
+
constructor({
|
|
256
|
+
candidateRegistry,
|
|
257
|
+
releaseRegistry,
|
|
258
|
+
authority,
|
|
259
|
+
evaluatedPromotionProvider = null,
|
|
260
|
+
requireEvaluatedPromotion = false,
|
|
261
|
+
memoryPromotionReceiptWriter = null,
|
|
262
|
+
promotionReviewProvider = null,
|
|
263
|
+
requireHumanReview = false,
|
|
264
|
+
} = {}) {
|
|
255
265
|
if (!candidateRegistry || typeof candidateRegistry.read !== "function") {
|
|
256
266
|
throw failure(
|
|
257
267
|
"SKILL_PROMOTION_CANDIDATE_REGISTRY_REQUIRED",
|
|
@@ -288,6 +298,30 @@ export class SkillPromotionController {
|
|
|
288
298
|
"SkillMutationAuthority.consume is required",
|
|
289
299
|
);
|
|
290
300
|
}
|
|
301
|
+
if (typeof requireEvaluatedPromotion !== "boolean") {
|
|
302
|
+
throw failure(
|
|
303
|
+
"SKILL_PROMOTION_INVALID",
|
|
304
|
+
"requireEvaluatedPromotion must be boolean",
|
|
305
|
+
);
|
|
306
|
+
}
|
|
307
|
+
if (requireEvaluatedPromotion && evaluatedPromotionProvider === null) {
|
|
308
|
+
throw failure(
|
|
309
|
+
"SKILL_PROMOTION_EVALUATION_REQUIRED",
|
|
310
|
+
"evaluated-only promotion requires a captured evidence provider",
|
|
311
|
+
);
|
|
312
|
+
}
|
|
313
|
+
if (typeof requireHumanReview !== "boolean") {
|
|
314
|
+
throw failure(
|
|
315
|
+
"SKILL_PROMOTION_INVALID",
|
|
316
|
+
"requireHumanReview must be boolean",
|
|
317
|
+
);
|
|
318
|
+
}
|
|
319
|
+
if (requireHumanReview && promotionReviewProvider === null) {
|
|
320
|
+
throw failure(
|
|
321
|
+
"SKILL_PROMOTION_REVIEW_REQUIRED",
|
|
322
|
+
"human-reviewed promotion requires a captured review provider",
|
|
323
|
+
);
|
|
324
|
+
}
|
|
291
325
|
|
|
292
326
|
this.#tenantId = candidateRegistry.tenantId;
|
|
293
327
|
this.#registryIdentity = releaseRegistry;
|
|
@@ -297,6 +331,22 @@ export class SkillPromotionController {
|
|
|
297
331
|
this.#applyTransition =
|
|
298
332
|
releaseRegistry.applyTransition.bind(releaseRegistry);
|
|
299
333
|
this.#consumeAuthority = authority.consume.bind(authority);
|
|
334
|
+
this.#evaluatedPromotionProvider =
|
|
335
|
+
evaluatedPromotionProvider === null
|
|
336
|
+
? null
|
|
337
|
+
: captureSkillEvaluatedPromotionProvider(evaluatedPromotionProvider);
|
|
338
|
+
this.#requireEvaluatedPromotion = requireEvaluatedPromotion;
|
|
339
|
+
this.#memoryPromotionReceiptWriter =
|
|
340
|
+
memoryPromotionReceiptWriter === null
|
|
341
|
+
? null
|
|
342
|
+
: captureStructuredMemoryPromotionReceiptWriter(
|
|
343
|
+
memoryPromotionReceiptWriter,
|
|
344
|
+
);
|
|
345
|
+
this.#promotionReviewProvider =
|
|
346
|
+
promotionReviewProvider === null
|
|
347
|
+
? null
|
|
348
|
+
: captureSkillPromotionReviewProvider(promotionReviewProvider);
|
|
349
|
+
this.#requireHumanReview = requireHumanReview;
|
|
300
350
|
|
|
301
351
|
Object.freeze(candidateRegistry);
|
|
302
352
|
Object.freeze(releaseRegistry);
|
|
@@ -352,7 +402,7 @@ export class SkillPromotionController {
|
|
|
352
402
|
return verifyDirectConsumptionReceipt(directReceipt, request);
|
|
353
403
|
}
|
|
354
404
|
|
|
355
|
-
async promote(input = {}) {
|
|
405
|
+
async #promote(input = {}) {
|
|
356
406
|
assertDataRecord(
|
|
357
407
|
input,
|
|
358
408
|
new Set(["authorization", "candidateId"]),
|
|
@@ -425,6 +475,77 @@ export class SkillPromotionController {
|
|
|
425
475
|
return this.#applyTransition(transitionCapability);
|
|
426
476
|
}
|
|
427
477
|
|
|
478
|
+
async promote(input = {}) {
|
|
479
|
+
if (this.#requireEvaluatedPromotion) {
|
|
480
|
+
throw failure(
|
|
481
|
+
"SKILL_PROMOTION_EVALUATION_REQUIRED",
|
|
482
|
+
"direct promotion is disabled by the evaluated-only controller policy",
|
|
483
|
+
);
|
|
484
|
+
}
|
|
485
|
+
const result = await this.#promote(input);
|
|
486
|
+
if (this.#memoryPromotionReceiptWriter === null) return result;
|
|
487
|
+
const memoryAuthorityReceipt =
|
|
488
|
+
await this.#memoryPromotionReceiptWriter.retainPromotion(result);
|
|
489
|
+
return deepFreeze({ ...result, memoryAuthorityReceipt });
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
async promoteEvaluated(input = {}) {
|
|
493
|
+
assertDataRecord(
|
|
494
|
+
input,
|
|
495
|
+
new Set(["authorization", "candidateId", "matrixContext"]),
|
|
496
|
+
"evaluated promotion input",
|
|
497
|
+
);
|
|
498
|
+
if (this.#evaluatedPromotionProvider === null) {
|
|
499
|
+
throw failure(
|
|
500
|
+
"SKILL_PROMOTION_EVALUATION_REQUIRED",
|
|
501
|
+
"evaluated promotion requires a captured evidence provider",
|
|
502
|
+
);
|
|
503
|
+
}
|
|
504
|
+
const candidate = this.#readCandidate(input.candidateId);
|
|
505
|
+
const state = this.#readState(candidate.skillName);
|
|
506
|
+
const activeContentDigest = this.#currentContentDigest(state);
|
|
507
|
+
const matrixBinding = await this.#evaluatedPromotionProvider.verify({
|
|
508
|
+
matrixContext: input.matrixContext,
|
|
509
|
+
authorization: input.authorization,
|
|
510
|
+
candidate,
|
|
511
|
+
state,
|
|
512
|
+
activeContentDigest,
|
|
513
|
+
});
|
|
514
|
+
let reviewBinding = null;
|
|
515
|
+
if (this.#requireHumanReview) {
|
|
516
|
+
const activeRelease =
|
|
517
|
+
state.activeReleaseDigest === null
|
|
518
|
+
? null
|
|
519
|
+
: this.#readRelease(state.activeReleaseDigest);
|
|
520
|
+
reviewBinding = await this.#promotionReviewProvider.verify({
|
|
521
|
+
activeRelease,
|
|
522
|
+
authorization: input.authorization,
|
|
523
|
+
candidate,
|
|
524
|
+
matrixBinding,
|
|
525
|
+
state,
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
const result = await this.#promote({
|
|
529
|
+
authorization: input.authorization,
|
|
530
|
+
candidateId: input.candidateId,
|
|
531
|
+
});
|
|
532
|
+
if (this.#memoryPromotionReceiptWriter === null) {
|
|
533
|
+
return deepFreeze({ ...result, matrixBinding, reviewBinding });
|
|
534
|
+
}
|
|
535
|
+
const memoryAuthorityReceipt =
|
|
536
|
+
await this.#memoryPromotionReceiptWriter.retainPromotion(
|
|
537
|
+
result,
|
|
538
|
+
matrixBinding,
|
|
539
|
+
reviewBinding,
|
|
540
|
+
);
|
|
541
|
+
return deepFreeze({
|
|
542
|
+
...result,
|
|
543
|
+
matrixBinding,
|
|
544
|
+
reviewBinding,
|
|
545
|
+
memoryAuthorityReceipt,
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
|
|
428
549
|
async rollback(input = {}) {
|
|
429
550
|
assertDataRecord(
|
|
430
551
|
input,
|
|
@@ -503,4 +624,66 @@ export class SkillPromotionController {
|
|
|
503
624
|
}
|
|
504
625
|
}
|
|
505
626
|
|
|
627
|
+
/**
|
|
628
|
+
* Builds the narrow promotion surface intended for production adapters.
|
|
629
|
+
*
|
|
630
|
+
* This is a composition primitive, not proof that any production entry point
|
|
631
|
+
* uses it. The returned facade deliberately withholds both the controller and
|
|
632
|
+
* direct promote(), while retaining authorized rollback as the recovery path.
|
|
633
|
+
*/
|
|
634
|
+
export function createSkillEvaluatedPromotionControlPlane(options = {}) {
|
|
635
|
+
assertDataRecord(
|
|
636
|
+
options,
|
|
637
|
+
EVALUATED_CONTROL_PLANE_OPTION_KEYS,
|
|
638
|
+
"evaluated promotion control plane options",
|
|
639
|
+
{ required: EVALUATED_CONTROL_PLANE_REQUIRED_KEYS },
|
|
640
|
+
);
|
|
641
|
+
const provider = captureSkillEvaluatedPromotionProvider(
|
|
642
|
+
options.evaluatedPromotionProvider,
|
|
643
|
+
);
|
|
644
|
+
const reviewProvider = captureSkillPromotionReviewProvider(
|
|
645
|
+
options.promotionReviewProvider,
|
|
646
|
+
);
|
|
647
|
+
const controller = new SkillPromotionController({
|
|
648
|
+
candidateRegistry: options.candidateRegistry,
|
|
649
|
+
releaseRegistry: options.releaseRegistry,
|
|
650
|
+
authority: options.authority,
|
|
651
|
+
evaluatedPromotionProvider: options.evaluatedPromotionProvider,
|
|
652
|
+
memoryPromotionReceiptWriter: options.memoryPromotionReceiptWriter ?? null,
|
|
653
|
+
promotionReviewProvider: options.promotionReviewProvider,
|
|
654
|
+
requireEvaluatedPromotion: true,
|
|
655
|
+
requireHumanReview: true,
|
|
656
|
+
});
|
|
657
|
+
const controlPlane = {
|
|
658
|
+
schema: SKILL_EVALUATED_PROMOTION_CONTROL_PLANE_SCHEMA,
|
|
659
|
+
tenantId: options.candidateRegistry.tenantId,
|
|
660
|
+
providerAuthorityId: provider.authorityId,
|
|
661
|
+
providerRevision: provider.revision,
|
|
662
|
+
providerHandlerArtifactDigest: provider.handlerArtifactDigest,
|
|
663
|
+
reviewAuthorityId: reviewProvider.authorityId,
|
|
664
|
+
reviewRevision: reviewProvider.revision,
|
|
665
|
+
reviewHandlerArtifactDigest: reviewProvider.handlerArtifactDigest,
|
|
666
|
+
promoteEvaluated: Object.freeze((input) =>
|
|
667
|
+
controller.promoteEvaluated(input),
|
|
668
|
+
),
|
|
669
|
+
rollback: Object.freeze((input) => controller.rollback(input)),
|
|
670
|
+
};
|
|
671
|
+
EVALUATED_PROMOTION_CONTROL_PLANES.add(controlPlane);
|
|
672
|
+
return Object.freeze(controlPlane);
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
export function captureSkillEvaluatedPromotionControlPlane(value) {
|
|
676
|
+
if (!value || !EVALUATED_PROMOTION_CONTROL_PLANES.has(value)) {
|
|
677
|
+
throw failure(
|
|
678
|
+
"SKILL_PROMOTION_CONTROL_PLANE_REQUIRED",
|
|
679
|
+
"a branded evaluated promotion control plane is required",
|
|
680
|
+
);
|
|
681
|
+
}
|
|
682
|
+
return Object.freeze({
|
|
683
|
+
schema: value.schema,
|
|
684
|
+
tenantId: value.tenantId,
|
|
685
|
+
promoteEvaluated: value.promoteEvaluated.bind(value),
|
|
686
|
+
});
|
|
687
|
+
}
|
|
688
|
+
|
|
506
689
|
Object.freeze(SkillPromotionController.prototype);
|