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
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
import { createGraphAuthorityBinding } from "../graph-kernel/authority.js";
|
|
7
7
|
import { GraphEventStore } from "../graph-kernel/event-store.js";
|
|
8
8
|
import { GraphKernel } from "../graph-kernel/runtime.js";
|
|
9
|
+
import { captureAgentEvolutionRuntimeComposition } from "../evolution/agent-evolution-runtime-composition-brand.js";
|
|
9
10
|
import {
|
|
10
11
|
diffGraphTrace,
|
|
11
12
|
locateBlockedRoot,
|
|
@@ -143,11 +144,18 @@ export class AppServerGraphRuntime {
|
|
|
143
144
|
now = Date.now,
|
|
144
145
|
createId = randomUUID,
|
|
145
146
|
onEvent = null,
|
|
147
|
+
evolutionCompositionFactory = null,
|
|
146
148
|
writerLeaseTtlMs = 24 * 60 * 60 * 1000,
|
|
147
149
|
} = {}) {
|
|
148
150
|
if (typeof executeNode !== "function") {
|
|
149
151
|
throw new TypeError("AppServerGraphRuntime requires executeNode()");
|
|
150
152
|
}
|
|
153
|
+
if (
|
|
154
|
+
evolutionCompositionFactory !== null &&
|
|
155
|
+
typeof evolutionCompositionFactory !== "function"
|
|
156
|
+
) {
|
|
157
|
+
throw new TypeError("evolutionCompositionFactory must be a function");
|
|
158
|
+
}
|
|
151
159
|
this.eventStore = eventStore;
|
|
152
160
|
this.rolloutStore = eventStore.rolloutStore;
|
|
153
161
|
this.executeNode = executeNode;
|
|
@@ -156,12 +164,88 @@ export class AppServerGraphRuntime {
|
|
|
156
164
|
this.now = now;
|
|
157
165
|
this.createId = createId;
|
|
158
166
|
this.onEvent = typeof onEvent === "function" ? onEvent : null;
|
|
167
|
+
this.evolutionCompositionFactory = evolutionCompositionFactory;
|
|
159
168
|
this.writerLeaseTtlMs = writerLeaseTtlMs;
|
|
160
169
|
this.runs = new Map();
|
|
161
170
|
this.drives = new Map();
|
|
162
171
|
this.active = new Map();
|
|
163
172
|
}
|
|
164
173
|
|
|
174
|
+
async _prepareEvolution(entry) {
|
|
175
|
+
if (!this.evolutionCompositionFactory) return null;
|
|
176
|
+
if (!entry.evolutionCompositionPromise) {
|
|
177
|
+
const context = Object.freeze({
|
|
178
|
+
mode: "graph",
|
|
179
|
+
runId: entry.runId,
|
|
180
|
+
originSurface: entry.originSurface,
|
|
181
|
+
revisionDigest: entry.compiled.revisionDigest,
|
|
182
|
+
authorityMode: entry.authorityMode,
|
|
183
|
+
});
|
|
184
|
+
entry.evolutionCompositionPromise = Promise.resolve()
|
|
185
|
+
.then(() => this.evolutionCompositionFactory(context))
|
|
186
|
+
.then((value) => {
|
|
187
|
+
const composition = captureAgentEvolutionRuntimeComposition(value);
|
|
188
|
+
if (composition.runId !== entry.runId) {
|
|
189
|
+
throw new TypeError(
|
|
190
|
+
"Agent evolution composition belongs to another Graph run",
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
if (
|
|
194
|
+
typeof composition.evolutionIngress?.start !== "function" ||
|
|
195
|
+
typeof composition.evolutionIngress?.complete !== "function"
|
|
196
|
+
) {
|
|
197
|
+
throw new TypeError(
|
|
198
|
+
"Agent evolution composition has no usable ingress",
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
return composition;
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
if (!entry.evolutionStartPromise) {
|
|
205
|
+
entry.evolutionStartPromise = entry.evolutionCompositionPromise.then(
|
|
206
|
+
async (composition) => {
|
|
207
|
+
await composition.evolutionIngress.start();
|
|
208
|
+
return composition;
|
|
209
|
+
},
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
try {
|
|
213
|
+
return await entry.evolutionStartPromise;
|
|
214
|
+
} catch (cause) {
|
|
215
|
+
entry.evolutionIngressFailed = true;
|
|
216
|
+
if (cause?.code === "CC_AGENT_EVOLUTION_INGRESS_FAILED") throw cause;
|
|
217
|
+
const error = runtimeError(
|
|
218
|
+
"CC_AGENT_EVOLUTION_INGRESS_FAILED",
|
|
219
|
+
`Graph evolution ingress failed: ${cause?.message || String(cause)}`,
|
|
220
|
+
{ cause },
|
|
221
|
+
);
|
|
222
|
+
throw error;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
async _completeEvolution(entry) {
|
|
227
|
+
if (!this.evolutionCompositionFactory || entry.evolutionIngressFailed) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
if (entry.evolutionCompletionPromise) {
|
|
231
|
+
return entry.evolutionCompletionPromise;
|
|
232
|
+
}
|
|
233
|
+
try {
|
|
234
|
+
entry.evolutionCompletionPromise = this._prepareEvolution(entry).then(
|
|
235
|
+
(composition) => composition.evolutionIngress.complete(),
|
|
236
|
+
);
|
|
237
|
+
await entry.evolutionCompletionPromise;
|
|
238
|
+
} catch (cause) {
|
|
239
|
+
entry.evolutionIngressFailed = true;
|
|
240
|
+
if (cause?.code === "CC_AGENT_EVOLUTION_INGRESS_FAILED") throw cause;
|
|
241
|
+
throw runtimeError(
|
|
242
|
+
"CC_AGENT_EVOLUTION_INGRESS_FAILED",
|
|
243
|
+
`Graph evolution completion failed: ${cause?.message || String(cause)}`,
|
|
244
|
+
{ cause },
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
165
249
|
_requestThread(runId) {
|
|
166
250
|
return `graph-request:${graphDigest(
|
|
167
251
|
runId,
|
|
@@ -329,6 +413,8 @@ export class AppServerGraphRuntime {
|
|
|
329
413
|
runId: id,
|
|
330
414
|
compiled,
|
|
331
415
|
inputs: { ...inputs },
|
|
416
|
+
originSurface,
|
|
417
|
+
authorityMode,
|
|
332
418
|
});
|
|
333
419
|
this._emit(id, "graph/run-started", { projection });
|
|
334
420
|
return this.status(id);
|
|
@@ -339,9 +425,16 @@ export class AppServerGraphRuntime {
|
|
|
339
425
|
if (projection.authorityMode === "shadow") {
|
|
340
426
|
return Promise.resolve(this.status(projection.id));
|
|
341
427
|
}
|
|
342
|
-
const
|
|
343
|
-
|
|
344
|
-
|
|
428
|
+
const entry = this.runs.get(projection.id);
|
|
429
|
+
const launch = () => {
|
|
430
|
+
const settled = this._drive(projection.id);
|
|
431
|
+
if (options.waitForCompletion === true) return settled;
|
|
432
|
+
return projection;
|
|
433
|
+
};
|
|
434
|
+
if (this.evolutionCompositionFactory) {
|
|
435
|
+
return this._prepareEvolution(entry).then(launch);
|
|
436
|
+
}
|
|
437
|
+
return Promise.resolve(launch());
|
|
345
438
|
}
|
|
346
439
|
|
|
347
440
|
resume(runId, { waitForCompletion = false } = {}) {
|
|
@@ -375,12 +468,15 @@ export class AppServerGraphRuntime {
|
|
|
375
468
|
if (!entry)
|
|
376
469
|
throw runtimeError("CC_GRAPH_RUN_NOT_FOUND", "Graph run missing");
|
|
377
470
|
const { kernel } = entry;
|
|
471
|
+
await this._prepareEvolution(entry);
|
|
378
472
|
for (let steps = 0; steps < 10_000; steps += 1) {
|
|
379
473
|
const status = kernel.getRun(runId);
|
|
380
|
-
if (
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
474
|
+
if (TERMINAL.has(status.status)) {
|
|
475
|
+
await this._completeEvolution(entry);
|
|
476
|
+
this._emit(runId, "graph/run-settled", { projection: status });
|
|
477
|
+
return status;
|
|
478
|
+
}
|
|
479
|
+
if (status.status === "reconciliation_required") {
|
|
384
480
|
this._emit(runId, "graph/run-settled", { projection: status });
|
|
385
481
|
return status;
|
|
386
482
|
}
|
|
@@ -562,6 +658,7 @@ export class AppServerGraphRuntime {
|
|
|
562
658
|
async _executeAttempt(entry, nodeId) {
|
|
563
659
|
const { kernel } = entry;
|
|
564
660
|
const runId = entry.runId;
|
|
661
|
+
const evolutionComposition = await this._prepareEvolution(entry);
|
|
565
662
|
const attempt = kernel.assignNode(runId, nodeId, "app-server-agent", {
|
|
566
663
|
ttlMs: this.writerLeaseTtlMs,
|
|
567
664
|
leaseId: `app-server-attempt:${this.createId()}`,
|
|
@@ -595,6 +692,7 @@ export class AppServerGraphRuntime {
|
|
|
595
692
|
attempt,
|
|
596
693
|
input: nodeInput(entry.inputs, nodeId),
|
|
597
694
|
signal: controller.signal,
|
|
695
|
+
evolutionIngress: evolutionComposition?.evolutionIngress || null,
|
|
598
696
|
});
|
|
599
697
|
if (!result || !["succeeded", "completed"].includes(result.status)) {
|
|
600
698
|
const error = runtimeError(
|
|
@@ -631,6 +729,9 @@ export class AppServerGraphRuntime {
|
|
|
631
729
|
});
|
|
632
730
|
return settled;
|
|
633
731
|
} catch (error) {
|
|
732
|
+
if (error?.code === "CC_AGENT_EVOLUTION_INGRESS_FAILED") {
|
|
733
|
+
entry.evolutionIngressFailed = true;
|
|
734
|
+
}
|
|
634
735
|
if (controller.signal.aborted) return kernel.getRun(runId);
|
|
635
736
|
if (effect) {
|
|
636
737
|
const known = error?.outcomeKnown === true;
|
|
@@ -826,6 +927,8 @@ export class AppServerGraphRuntime {
|
|
|
826
927
|
runId,
|
|
827
928
|
compiled: compileGraphDefinition(request.definition),
|
|
828
929
|
inputs: { ...request.inputs },
|
|
930
|
+
originSurface: request.originSurface,
|
|
931
|
+
authorityMode: request.authorityMode,
|
|
829
932
|
};
|
|
830
933
|
this.runs.set(runId, entry);
|
|
831
934
|
this._recoverReceiptedAttempts(entry);
|
|
@@ -1003,7 +1106,7 @@ export class AppServerGraphRuntime {
|
|
|
1003
1106
|
async cancel(runId, reason = "cancelled by App Server client") {
|
|
1004
1107
|
const id = String(runId);
|
|
1005
1108
|
const entry = this.runs.get(id) || this._recover(id);
|
|
1006
|
-
|
|
1109
|
+
const projection = await entry.kernel.cancelRun(id, {
|
|
1007
1110
|
reason,
|
|
1008
1111
|
interrupt: async (attempt) => {
|
|
1009
1112
|
const active = this.active.get(attempt.id);
|
|
@@ -1012,6 +1115,10 @@ export class AppServerGraphRuntime {
|
|
|
1012
1115
|
await active.done;
|
|
1013
1116
|
},
|
|
1014
1117
|
});
|
|
1118
|
+
if (TERMINAL.has(projection.status)) {
|
|
1119
|
+
await this._completeEvolution(entry);
|
|
1120
|
+
}
|
|
1121
|
+
return projection;
|
|
1015
1122
|
}
|
|
1016
1123
|
|
|
1017
1124
|
async reconcile(runId, input = {}) {
|
|
@@ -144,6 +144,7 @@ export class CcAppServer {
|
|
|
144
144
|
interruptSettlementMs = 30_000,
|
|
145
145
|
transport = "stdio",
|
|
146
146
|
graphRuntime = null,
|
|
147
|
+
evolutionCompositionFactory = null,
|
|
147
148
|
contextMemoryRuntimeFactory = createCliContextMemoryRuntime,
|
|
148
149
|
} = {}) {
|
|
149
150
|
if (typeof send !== "function") {
|
|
@@ -165,12 +166,18 @@ export class CcAppServer {
|
|
|
165
166
|
throw new TypeError("contextMemoryRuntimeFactory must be a function");
|
|
166
167
|
}
|
|
167
168
|
this.contextMemoryRuntimeFactory = contextMemoryRuntimeFactory;
|
|
169
|
+
if (graphRuntime && evolutionCompositionFactory) {
|
|
170
|
+
throw new TypeError(
|
|
171
|
+
"graphRuntime and evolutionCompositionFactory cannot both be provided",
|
|
172
|
+
);
|
|
173
|
+
}
|
|
168
174
|
this.graphRuntime =
|
|
169
175
|
graphRuntime ||
|
|
170
176
|
new AppServerGraphRuntime({
|
|
171
177
|
rolloutStore: resolvedStore,
|
|
172
178
|
now,
|
|
173
179
|
createId,
|
|
180
|
+
evolutionCompositionFactory,
|
|
174
181
|
executeNode: (context) => this._executeGraphNode(context),
|
|
175
182
|
requestHumanTask: (context) => this._requestHumanTask(context),
|
|
176
183
|
onEvent: (event) => {
|
|
@@ -598,7 +605,14 @@ export class CcAppServer {
|
|
|
598
605
|
);
|
|
599
606
|
}
|
|
600
607
|
|
|
601
|
-
async _executeGraphNode({
|
|
608
|
+
async _executeGraphNode({
|
|
609
|
+
runId,
|
|
610
|
+
nodeId,
|
|
611
|
+
attempt,
|
|
612
|
+
input,
|
|
613
|
+
signal,
|
|
614
|
+
evolutionIngress,
|
|
615
|
+
}) {
|
|
602
616
|
const threadId = `graph-agent:${runId}:${nodeId}`;
|
|
603
617
|
const turn = { id: attempt.id, threadId };
|
|
604
618
|
const onAbort = () => {
|
|
@@ -606,11 +620,16 @@ export class CcAppServer {
|
|
|
606
620
|
};
|
|
607
621
|
signal?.addEventListener?.("abort", onAbort, { once: true });
|
|
608
622
|
try {
|
|
623
|
+
const turnOptions = { ...(input?.options || {}) };
|
|
624
|
+
delete turnOptions.evolutionIngress;
|
|
625
|
+
if (evolutionIngress !== null && evolutionIngress !== undefined) {
|
|
626
|
+
turnOptions.evolutionIngress = evolutionIngress;
|
|
627
|
+
}
|
|
609
628
|
const result = await this.kernel.startTurn({
|
|
610
629
|
threadId,
|
|
611
630
|
turnId: attempt.id,
|
|
612
631
|
input: requiredString(input?.prompt, `inputs.${nodeId}.prompt`),
|
|
613
|
-
options:
|
|
632
|
+
options: turnOptions,
|
|
614
633
|
emit: (event) =>
|
|
615
634
|
this._notify("graph/event", {
|
|
616
635
|
type: "graph/agent-event",
|
|
@@ -396,6 +396,8 @@ export class WebSocketAppServerHost extends EventEmitter {
|
|
|
396
396
|
send,
|
|
397
397
|
store: this.store,
|
|
398
398
|
kernel: this.kernelFactory?.(),
|
|
399
|
+
evolutionCompositionFactory:
|
|
400
|
+
this.options.evolutionCompositionFactory ?? null,
|
|
399
401
|
transport: "websocket",
|
|
400
402
|
maxQueuedRequests: this.options.maxQueuedRequests,
|
|
401
403
|
maxQueuedRequestBytes: this.options.maxQueuedRequestBytes,
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import evolutionRun from "@chainlesschain/session-core/evolution-run";
|
|
3
|
+
|
|
4
|
+
import { EvolutionEvidenceArtifactAdapter } from "./evolution-evidence-artifact-adapter.js";
|
|
5
|
+
import { EvolutionRunLedgerAdapter } from "./evolution-run-ledger-adapter.js";
|
|
6
|
+
import { captureEvolutionRunWikiMaintenanceProducer } from "./evolution-run-wiki-maintenance-source.js";
|
|
7
|
+
import { WIKI_MAINTENANCE_TRIGGER_KIND } from "./wiki-maintenance-trigger-ledger-adapter.js";
|
|
8
|
+
|
|
9
|
+
const { EVOLUTION_RUN_EVENT_SCHEMA, EVENT_TYPES } = evolutionRun;
|
|
10
|
+
|
|
11
|
+
export const AGENT_EVOLUTION_INGRESS_SCHEMA =
|
|
12
|
+
"chainlesschain.agent-evolution-ingress/v1";
|
|
13
|
+
export const AGENT_EVOLUTION_INGRESS_FAILED_CODE =
|
|
14
|
+
"CC_AGENT_EVOLUTION_INGRESS_FAILED";
|
|
15
|
+
|
|
16
|
+
const INGRESSES = new WeakSet();
|
|
17
|
+
const CORE_EVENT_KINDS = new Map([
|
|
18
|
+
["tool-executing", "tool-requested"],
|
|
19
|
+
["tool-result", "tool-completed"],
|
|
20
|
+
["tool-error", "tool-failed"],
|
|
21
|
+
["response-complete", "response-completed"],
|
|
22
|
+
["run-ended", "goal-ended"],
|
|
23
|
+
]);
|
|
24
|
+
|
|
25
|
+
function requiredString(value, label) {
|
|
26
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
27
|
+
throw new TypeError(`${label} is required`);
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function canonical(value) {
|
|
33
|
+
if (value === null || typeof value === "boolean") {
|
|
34
|
+
return JSON.stringify(value);
|
|
35
|
+
}
|
|
36
|
+
if (typeof value === "number") {
|
|
37
|
+
if (!Number.isFinite(value)) {
|
|
38
|
+
throw new TypeError("Agent evolution evidence must be finite JSON");
|
|
39
|
+
}
|
|
40
|
+
return JSON.stringify(value);
|
|
41
|
+
}
|
|
42
|
+
if (typeof value === "string") return JSON.stringify(value);
|
|
43
|
+
if (!value || typeof value !== "object") {
|
|
44
|
+
throw new TypeError("Agent evolution evidence must be JSON-compatible");
|
|
45
|
+
}
|
|
46
|
+
if (Array.isArray(value)) {
|
|
47
|
+
return `[${value.map(canonical).join(",")}]`;
|
|
48
|
+
}
|
|
49
|
+
const prototype = Object.getPrototypeOf(value);
|
|
50
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
51
|
+
throw new TypeError("Agent evolution evidence must use plain objects");
|
|
52
|
+
}
|
|
53
|
+
return `{${Object.keys(value)
|
|
54
|
+
.sort()
|
|
55
|
+
.map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
|
|
56
|
+
.join(",")}}`;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function clone(value) {
|
|
60
|
+
return JSON.parse(canonical(value));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function digest(value) {
|
|
64
|
+
return `sha256:${crypto.createHash("sha256").update(canonical(value)).digest("hex")}`;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function timestamp(value, label) {
|
|
68
|
+
const date = new Date(value);
|
|
69
|
+
if (!Number.isFinite(date.getTime()) || date.toISOString() !== value) {
|
|
70
|
+
throw new TypeError(`${label} must be a canonical timestamp`);
|
|
71
|
+
}
|
|
72
|
+
return value;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function normalizeId(value, label) {
|
|
76
|
+
const result = requiredString(value, label);
|
|
77
|
+
if (Buffer.byteLength(result, "utf8") > 256) {
|
|
78
|
+
throw new TypeError(`${label} is too long`);
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function guardIngress(operation) {
|
|
84
|
+
return Promise.resolve(operation).catch((cause) => {
|
|
85
|
+
if (cause?.code === AGENT_EVOLUTION_INGRESS_FAILED_CODE) throw cause;
|
|
86
|
+
const error = new Error(
|
|
87
|
+
`Agent evolution ingress failed: ${cause?.message || String(cause)}`,
|
|
88
|
+
{ cause },
|
|
89
|
+
);
|
|
90
|
+
error.code = AGENT_EVOLUTION_INGRESS_FAILED_CODE;
|
|
91
|
+
throw error;
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function createAgentEvolutionIngress({
|
|
96
|
+
evidenceAdapter,
|
|
97
|
+
runAdapter,
|
|
98
|
+
sourceEnvelopeAuthority,
|
|
99
|
+
wikiMaintenanceProducer = null,
|
|
100
|
+
completionTriggerKind = WIKI_MAINTENANCE_TRIGGER_KIND.SESSION_END,
|
|
101
|
+
now = () => new Date(),
|
|
102
|
+
idGenerator = () => crypto.randomUUID(),
|
|
103
|
+
} = {}) {
|
|
104
|
+
if (!(evidenceAdapter instanceof EvolutionEvidenceArtifactAdapter)) {
|
|
105
|
+
throw new TypeError("an EvolutionEvidenceArtifactAdapter is required");
|
|
106
|
+
}
|
|
107
|
+
if (!(runAdapter instanceof EvolutionRunLedgerAdapter)) {
|
|
108
|
+
throw new TypeError("an EvolutionRunLedgerAdapter is required");
|
|
109
|
+
}
|
|
110
|
+
if (typeof sourceEnvelopeAuthority?.issue !== "function") {
|
|
111
|
+
throw new TypeError("sourceEnvelopeAuthority.issue is required");
|
|
112
|
+
}
|
|
113
|
+
if (typeof now !== "function" || typeof idGenerator !== "function") {
|
|
114
|
+
throw new TypeError("ingress clock and idGenerator must be functions");
|
|
115
|
+
}
|
|
116
|
+
const maintenanceProducer =
|
|
117
|
+
wikiMaintenanceProducer === null
|
|
118
|
+
? null
|
|
119
|
+
: captureEvolutionRunWikiMaintenanceProducer(wikiMaintenanceProducer);
|
|
120
|
+
if (
|
|
121
|
+
![
|
|
122
|
+
WIKI_MAINTENANCE_TRIGGER_KIND.SESSION_END,
|
|
123
|
+
WIKI_MAINTENANCE_TRIGGER_KIND.GOAL_END,
|
|
124
|
+
].includes(completionTriggerKind)
|
|
125
|
+
) {
|
|
126
|
+
throw new TypeError(
|
|
127
|
+
"Agent completion trigger kind must be session-end or goal-end",
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
const issueSourceEnvelope = sourceEnvelopeAuthority.issue.bind(
|
|
131
|
+
sourceEnvelopeAuthority,
|
|
132
|
+
);
|
|
133
|
+
const descriptor = runAdapter.descriptor;
|
|
134
|
+
let tail = Promise.resolve();
|
|
135
|
+
|
|
136
|
+
const serialize = (operation) => {
|
|
137
|
+
const pending = tail.then(operation, operation);
|
|
138
|
+
tail = pending.catch(() => undefined);
|
|
139
|
+
return pending;
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
const currentTimestamp = () => {
|
|
143
|
+
const value = now();
|
|
144
|
+
const iso = value instanceof Date ? value.toISOString() : value;
|
|
145
|
+
return timestamp(iso, "ingress timestamp");
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
const appendStarted = () => {
|
|
149
|
+
const loaded = runAdapter.load();
|
|
150
|
+
if (loaded.events.length > 0) return loaded.projection;
|
|
151
|
+
const occurredAt = currentTimestamp();
|
|
152
|
+
return runAdapter.appendEvent({
|
|
153
|
+
schema: EVOLUTION_RUN_EVENT_SCHEMA,
|
|
154
|
+
tenantId: descriptor.tenantId,
|
|
155
|
+
runId: descriptor.runId,
|
|
156
|
+
eventId: `${descriptor.runId}:started`,
|
|
157
|
+
sequence: 1,
|
|
158
|
+
type: EVENT_TYPES.RUN_STARTED,
|
|
159
|
+
subjectId: descriptor.runId,
|
|
160
|
+
payloadDigest: digest({ occurredAt, runtime: "agent" }),
|
|
161
|
+
artifactRef: null,
|
|
162
|
+
keyRef: null,
|
|
163
|
+
data: { occurredAt, runtime: "agent" },
|
|
164
|
+
}).projection;
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
const ingest = (kind, evidence, options = {}) =>
|
|
168
|
+
guardIngress(
|
|
169
|
+
serialize(async () => {
|
|
170
|
+
const projection = appendStarted();
|
|
171
|
+
if (projection.status === "completed") {
|
|
172
|
+
throw new Error(
|
|
173
|
+
"completed EvolutionRun cannot accept Agent evidence",
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
const eventId = normalizeId(
|
|
177
|
+
options.eventId ?? `agent:${idGenerator()}`,
|
|
178
|
+
"Agent evidence eventId",
|
|
179
|
+
);
|
|
180
|
+
const occurredAt = timestamp(
|
|
181
|
+
options.occurredAt ?? currentTimestamp(),
|
|
182
|
+
"Agent evidence occurredAt",
|
|
183
|
+
);
|
|
184
|
+
const payload = clone(evidence);
|
|
185
|
+
const sourceEnvelope = await issueSourceEnvelope(
|
|
186
|
+
Object.freeze({
|
|
187
|
+
schema: AGENT_EVOLUTION_INGRESS_SCHEMA,
|
|
188
|
+
tenantId: descriptor.tenantId,
|
|
189
|
+
runId: descriptor.runId,
|
|
190
|
+
eventId,
|
|
191
|
+
kind,
|
|
192
|
+
occurredAt,
|
|
193
|
+
evidence: payload,
|
|
194
|
+
}),
|
|
195
|
+
);
|
|
196
|
+
const persisted = await evidenceAdapter.projectAndPersist({
|
|
197
|
+
sourceEnvelope,
|
|
198
|
+
payload,
|
|
199
|
+
});
|
|
200
|
+
if (
|
|
201
|
+
persisted?.tenantId !== descriptor.tenantId ||
|
|
202
|
+
persisted.evidenceId == null ||
|
|
203
|
+
persisted.manifest?.type !== "evidence" ||
|
|
204
|
+
typeof persisted.manifest.ref?.ref !== "string"
|
|
205
|
+
) {
|
|
206
|
+
throw new Error(
|
|
207
|
+
"Agent evidence persistence returned an unbound result",
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
const current = runAdapter.load();
|
|
211
|
+
return runAdapter.appendEvent({
|
|
212
|
+
schema: EVOLUTION_RUN_EVENT_SCHEMA,
|
|
213
|
+
tenantId: descriptor.tenantId,
|
|
214
|
+
runId: descriptor.runId,
|
|
215
|
+
eventId,
|
|
216
|
+
sequence: current.events.length + 1,
|
|
217
|
+
type: EVENT_TYPES.RAW_EVENT_REFERENCED,
|
|
218
|
+
subjectId: persisted.evidenceId,
|
|
219
|
+
payloadDigest: persisted.manifest.digest,
|
|
220
|
+
artifactRef: persisted.manifest.ref.ref,
|
|
221
|
+
keyRef: null,
|
|
222
|
+
data: {
|
|
223
|
+
evidenceKind: kind,
|
|
224
|
+
occurredAt,
|
|
225
|
+
derivationManifestDigest: persisted.manifest.digest,
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
}),
|
|
229
|
+
);
|
|
230
|
+
|
|
231
|
+
const ingress = Object.freeze({
|
|
232
|
+
schema: AGENT_EVOLUTION_INGRESS_SCHEMA,
|
|
233
|
+
tenantId: descriptor.tenantId,
|
|
234
|
+
runId: descriptor.runId,
|
|
235
|
+
start: () => guardIngress(serialize(() => appendStarted())),
|
|
236
|
+
ingestUserPrompt: (input, options) =>
|
|
237
|
+
ingest("user-prompt", { input: clone(input) }, options),
|
|
238
|
+
ingestAgentEvent: (event, options) => {
|
|
239
|
+
const baseKind = CORE_EVENT_KINDS.get(event?.type);
|
|
240
|
+
if (!baseKind) {
|
|
241
|
+
return Promise.resolve(Object.freeze({ ignored: true }));
|
|
242
|
+
}
|
|
243
|
+
const kind =
|
|
244
|
+
event.type === "tool-result" &&
|
|
245
|
+
Boolean(event.error || event.result?.error || event.result?.isError)
|
|
246
|
+
? "tool-failed"
|
|
247
|
+
: baseKind;
|
|
248
|
+
return ingest(kind, { event: clone(event) }, options);
|
|
249
|
+
},
|
|
250
|
+
complete: (options = {}) =>
|
|
251
|
+
guardIngress(
|
|
252
|
+
serialize(async () => {
|
|
253
|
+
const loaded = runAdapter.load();
|
|
254
|
+
let projection;
|
|
255
|
+
if (loaded.projection?.status === "completed") {
|
|
256
|
+
projection = loaded.projection;
|
|
257
|
+
} else {
|
|
258
|
+
if (loaded.events.length === 0) appendStarted();
|
|
259
|
+
const current = runAdapter.load();
|
|
260
|
+
const occurredAt = timestamp(
|
|
261
|
+
options.occurredAt ?? currentTimestamp(),
|
|
262
|
+
"Agent completion occurredAt",
|
|
263
|
+
);
|
|
264
|
+
projection = runAdapter.appendEvent({
|
|
265
|
+
schema: EVOLUTION_RUN_EVENT_SCHEMA,
|
|
266
|
+
tenantId: descriptor.tenantId,
|
|
267
|
+
runId: descriptor.runId,
|
|
268
|
+
eventId: `${descriptor.runId}:completed`,
|
|
269
|
+
sequence: current.events.length + 1,
|
|
270
|
+
type: EVENT_TYPES.RUN_COMPLETED,
|
|
271
|
+
subjectId: descriptor.runId,
|
|
272
|
+
payloadDigest: digest({ occurredAt, status: "completed" }),
|
|
273
|
+
artifactRef: null,
|
|
274
|
+
keyRef: null,
|
|
275
|
+
data: { occurredAt, status: "completed" },
|
|
276
|
+
}).projection;
|
|
277
|
+
}
|
|
278
|
+
if (maintenanceProducer !== null) {
|
|
279
|
+
await maintenanceProducer.enqueueCompletedRun({
|
|
280
|
+
kind: completionTriggerKind,
|
|
281
|
+
runId: descriptor.runId,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
return projection;
|
|
285
|
+
}),
|
|
286
|
+
),
|
|
287
|
+
});
|
|
288
|
+
INGRESSES.add(ingress);
|
|
289
|
+
return ingress;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
export function captureAgentEvolutionIngress(value, options = {}) {
|
|
293
|
+
if (!INGRESSES.has(value)) {
|
|
294
|
+
throw new TypeError("a branded Agent evolution ingress is required");
|
|
295
|
+
}
|
|
296
|
+
if (options.tenantId != null && value.tenantId !== options.tenantId) {
|
|
297
|
+
throw new TypeError("Agent evolution ingress belongs to another tenant");
|
|
298
|
+
}
|
|
299
|
+
return value;
|
|
300
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export const AGENT_EVOLUTION_RUNTIME_COMPOSITION_SCHEMA =
|
|
2
|
+
"chainlesschain.agent-evolution-runtime-composition/v1";
|
|
3
|
+
|
|
4
|
+
const COMPOSITIONS = new WeakSet();
|
|
5
|
+
|
|
6
|
+
export function sealAgentEvolutionRuntimeComposition(fields) {
|
|
7
|
+
const composition = Object.freeze({
|
|
8
|
+
schema: AGENT_EVOLUTION_RUNTIME_COMPOSITION_SCHEMA,
|
|
9
|
+
...fields,
|
|
10
|
+
});
|
|
11
|
+
COMPOSITIONS.add(composition);
|
|
12
|
+
return composition;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function captureAgentEvolutionRuntimeComposition(value) {
|
|
16
|
+
if (!COMPOSITIONS.has(value)) {
|
|
17
|
+
throw new TypeError(
|
|
18
|
+
"a branded Agent evolution runtime composition is required",
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
}
|