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
|
@@ -31,6 +31,9 @@ import { loadConfig } from "../lib/config-manager.js";
|
|
|
31
31
|
import { collectWorkspacePluginBinSandboxPolicy } from "../lib/plugin-runtime/bin.js";
|
|
32
32
|
import { issueMcpStdioExecutionAuthority } from "../lib/mcp-stdio-execution-authority.js";
|
|
33
33
|
import { registerHostHooksV2Workspace } from "../lib/hooks-v2-workspace-context.js";
|
|
34
|
+
import { captureStructuredMemoryPolicyReceiptWriter } from "../lib/evolution/structured-memory-policy-receipt-writer.js";
|
|
35
|
+
import { captureStructuredMemoryAgentControlPlane } from "../lib/evolution/structured-memory-agent-control-plane.js";
|
|
36
|
+
import { captureAgentEvolutionIngress } from "../lib/evolution/agent-evolution-ingress.js";
|
|
34
37
|
|
|
35
38
|
const {
|
|
36
39
|
DEFAULT_ALLOWED_MCP_SERVER_NAMES,
|
|
@@ -62,6 +65,41 @@ export class AgentRuntime {
|
|
|
62
65
|
this.config = config;
|
|
63
66
|
this.context = createRuntimeContext({ kind, policy, config });
|
|
64
67
|
this.events = deps.events || new RuntimeEventEmitter();
|
|
68
|
+
this.evolutionIngress =
|
|
69
|
+
deps.evolutionIngress == null
|
|
70
|
+
? null
|
|
71
|
+
: captureAgentEvolutionIngress(deps.evolutionIngress);
|
|
72
|
+
this.structuredMemoryControlPlane =
|
|
73
|
+
deps.structuredMemoryControlPlane == null
|
|
74
|
+
? null
|
|
75
|
+
: captureStructuredMemoryAgentControlPlane(
|
|
76
|
+
deps.structuredMemoryControlPlane,
|
|
77
|
+
);
|
|
78
|
+
if (
|
|
79
|
+
this.structuredMemoryControlPlane !== null &&
|
|
80
|
+
deps.memoryPolicyReceiptWriter != null
|
|
81
|
+
) {
|
|
82
|
+
throw new Error(
|
|
83
|
+
"structured memory control plane and standalone policy writer cannot both be configured",
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
this.memoryPolicyReceiptWriter =
|
|
87
|
+
this.structuredMemoryControlPlane?.policyReceiptWriter ??
|
|
88
|
+
(deps.memoryPolicyReceiptWriter == null
|
|
89
|
+
? null
|
|
90
|
+
: captureStructuredMemoryPolicyReceiptWriter(
|
|
91
|
+
deps.memoryPolicyReceiptWriter,
|
|
92
|
+
));
|
|
93
|
+
if (
|
|
94
|
+
this.evolutionIngress !== null &&
|
|
95
|
+
this.structuredMemoryControlPlane !== null &&
|
|
96
|
+
this.evolutionIngress.tenantId !==
|
|
97
|
+
this.structuredMemoryControlPlane.tenantId
|
|
98
|
+
) {
|
|
99
|
+
throw new Error(
|
|
100
|
+
"Agent evolution ingress and structured memory must share one tenant",
|
|
101
|
+
);
|
|
102
|
+
}
|
|
65
103
|
this.deps = {
|
|
66
104
|
startAgentRepl: deps.startAgentRepl || startAgentRepl,
|
|
67
105
|
startChatRepl: deps.startChatRepl || startChatRepl,
|
|
@@ -88,8 +126,18 @@ export class AgentRuntime {
|
|
|
88
126
|
resolveAgentBundle: deps.resolveAgentBundle || null,
|
|
89
127
|
openBrowser: deps.openBrowser || openBrowser,
|
|
90
128
|
runTurn: deps.runTurn || null,
|
|
129
|
+
evolutionCompositionFactory:
|
|
130
|
+
deps.evolutionCompositionFactory == null
|
|
131
|
+
? null
|
|
132
|
+
: deps.evolutionCompositionFactory,
|
|
91
133
|
logger: deps.logger || logger,
|
|
92
134
|
};
|
|
135
|
+
if (
|
|
136
|
+
this.deps.evolutionCompositionFactory !== null &&
|
|
137
|
+
typeof this.deps.evolutionCompositionFactory !== "function"
|
|
138
|
+
) {
|
|
139
|
+
throw new TypeError("evolutionCompositionFactory must be a function");
|
|
140
|
+
}
|
|
93
141
|
}
|
|
94
142
|
|
|
95
143
|
on(eventName, listener) {
|
|
@@ -146,6 +194,14 @@ export class AgentRuntime {
|
|
|
146
194
|
}
|
|
147
195
|
|
|
148
196
|
const startedAt = Date.now();
|
|
197
|
+
if (this.evolutionIngress !== null) {
|
|
198
|
+
await this.evolutionIngress.ingestUserPrompt({
|
|
199
|
+
input,
|
|
200
|
+
meta,
|
|
201
|
+
sessionId: this.policy.sessionId || null,
|
|
202
|
+
startedAt,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
149
205
|
this.emit(
|
|
150
206
|
RUNTIME_EVENTS.TURN_START,
|
|
151
207
|
createAgentTurnRecord({
|
|
@@ -165,6 +221,16 @@ export class AgentRuntime {
|
|
|
165
221
|
context: this.context,
|
|
166
222
|
});
|
|
167
223
|
|
|
224
|
+
if (this.evolutionIngress !== null) {
|
|
225
|
+
await this.evolutionIngress.ingestAgentEvent({
|
|
226
|
+
type: "response-complete",
|
|
227
|
+
content: result,
|
|
228
|
+
sessionId: this.policy.sessionId || null,
|
|
229
|
+
startedAt,
|
|
230
|
+
endedAt: Date.now(),
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
|
|
168
234
|
this.emit(
|
|
169
235
|
RUNTIME_EVENTS.TURN_END,
|
|
170
236
|
createAgentTurnRecord({
|
|
@@ -181,7 +247,35 @@ export class AgentRuntime {
|
|
|
181
247
|
return result;
|
|
182
248
|
}
|
|
183
249
|
|
|
250
|
+
_requireStructuredMemoryControlPlane() {
|
|
251
|
+
if (this.kind !== "agent" || this.structuredMemoryControlPlane === null) {
|
|
252
|
+
throw new Error(
|
|
253
|
+
"structured memory Agent control plane is not configured",
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
return this.structuredMemoryControlPlane;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
async proposeSemanticMemory(input) {
|
|
260
|
+
return this._requireStructuredMemoryControlPlane().semantic.propose(input);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
async reviewAndAcceptSemanticMemory(input) {
|
|
264
|
+
return this._requireStructuredMemoryControlPlane().semantic.reviewAndAccept(
|
|
265
|
+
input,
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
createEvolutionPromotionControlPlane(options) {
|
|
270
|
+
return this._requireStructuredMemoryControlPlane().createEvaluatedPromotionControlPlane(
|
|
271
|
+
options,
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
|
|
184
275
|
async startAgentSession() {
|
|
276
|
+
if (this.evolutionIngress !== null) {
|
|
277
|
+
await this.evolutionIngress.start();
|
|
278
|
+
}
|
|
185
279
|
this.emit(RUNTIME_EVENTS.RUNTIME_START, {
|
|
186
280
|
kind: this.kind,
|
|
187
281
|
policy: this.policy,
|
|
@@ -190,7 +284,24 @@ export class AgentRuntime {
|
|
|
190
284
|
kind: this.kind,
|
|
191
285
|
sessionId: this.policy.sessionId || null,
|
|
192
286
|
});
|
|
193
|
-
|
|
287
|
+
const result = await this.deps.startAgentRepl({
|
|
288
|
+
...this.policy,
|
|
289
|
+
...(this.memoryPolicyReceiptWriter === null
|
|
290
|
+
? {}
|
|
291
|
+
: { memoryPolicyReceiptWriter: this.memoryPolicyReceiptWriter }),
|
|
292
|
+
...(this.structuredMemoryControlPlane === null
|
|
293
|
+
? {}
|
|
294
|
+
: {
|
|
295
|
+
structuredMemoryControlPlane: this.structuredMemoryControlPlane,
|
|
296
|
+
}),
|
|
297
|
+
...(this.evolutionIngress === null
|
|
298
|
+
? {}
|
|
299
|
+
: { evolutionIngress: this.evolutionIngress }),
|
|
300
|
+
});
|
|
301
|
+
if (this.evolutionIngress !== null) {
|
|
302
|
+
await this.evolutionIngress.complete();
|
|
303
|
+
}
|
|
304
|
+
return result;
|
|
194
305
|
}
|
|
195
306
|
|
|
196
307
|
async startChatSession() {
|
|
@@ -356,6 +467,7 @@ export class AgentRuntime {
|
|
|
356
467
|
remoteSessionRelayUrl,
|
|
357
468
|
remoteSessionPeerId,
|
|
358
469
|
envelopeBus,
|
|
470
|
+
evolutionCompositionFactory: this.deps.evolutionCompositionFactory,
|
|
359
471
|
});
|
|
360
472
|
|
|
361
473
|
server.on("connection", ({ clientId, ip }) => {
|
|
@@ -529,6 +641,7 @@ export class AgentRuntime {
|
|
|
529
641
|
timeout: 60000,
|
|
530
642
|
sessionManager,
|
|
531
643
|
projectRoot: workspacePolicyCwd,
|
|
644
|
+
evolutionCompositionFactory: this.deps.evolutionCompositionFactory,
|
|
532
645
|
});
|
|
533
646
|
// ChainlessChainWSServer extends EventEmitter and emits "error"
|
|
534
647
|
// synchronously on bind failure (in addition to rejecting start()).
|
|
@@ -120,6 +120,7 @@ import { captureAmbientExecutionLocation } from "../lib/execution-location-runti
|
|
|
120
120
|
import { createBackgroundPhaseReporter } from "../lib/background-phase-reporter.js";
|
|
121
121
|
import { createBackgroundInteractionClient } from "../lib/background-interaction-resolver.js";
|
|
122
122
|
import { withQuietStdout } from "./quiet-stdout.js";
|
|
123
|
+
import { captureAgentEvolutionIngress } from "../lib/evolution/agent-evolution-ingress.js";
|
|
123
124
|
import { CostBudget } from "../lib/cost-budget.js";
|
|
124
125
|
import { estimateTokens } from "../harness/prompt-compressor.js";
|
|
125
126
|
import {
|
|
@@ -654,6 +655,10 @@ async function runAgentHeadlessInWorkspace(
|
|
|
654
655
|
deps = {},
|
|
655
656
|
pipeState = { closed: false },
|
|
656
657
|
) {
|
|
658
|
+
const evolutionIngress =
|
|
659
|
+
options.evolutionIngress == null
|
|
660
|
+
? null
|
|
661
|
+
: captureAgentEvolutionIngress(options.evolutionIngress);
|
|
657
662
|
const prompt = (options.prompt || "").trim();
|
|
658
663
|
if (!prompt) {
|
|
659
664
|
throw new Error(
|
|
@@ -697,6 +702,14 @@ async function runAgentHeadlessInWorkspace(
|
|
|
697
702
|
},
|
|
698
703
|
`headless-${Date.now()}-${process.pid}`,
|
|
699
704
|
);
|
|
705
|
+
if (evolutionIngress !== null) {
|
|
706
|
+
await evolutionIngress.start();
|
|
707
|
+
await evolutionIngress.ingestUserPrompt({
|
|
708
|
+
content: prompt,
|
|
709
|
+
sessionId,
|
|
710
|
+
source: "headless",
|
|
711
|
+
});
|
|
712
|
+
}
|
|
700
713
|
const sessionHostLease = deps[HEADLESS_SESSION_HOST_LEASE] || null;
|
|
701
714
|
const includeHookEvents = isStream && options.includeHookEvents === true;
|
|
702
715
|
// One headless invocation owns one bounded queue/cache authority. Keep an
|
|
@@ -3007,6 +3020,9 @@ async function runAgentHeadlessInWorkspace(
|
|
|
3007
3020
|
});
|
|
3008
3021
|
}
|
|
3009
3022
|
for await (const event of runLoop(messages, loopOptions)) {
|
|
3023
|
+
if (evolutionIngress !== null) {
|
|
3024
|
+
await evolutionIngress.ingestAgentEvent(event);
|
|
3025
|
+
}
|
|
3010
3026
|
if (turnBindingFeed) turnBindingFeed.handleEvent(event);
|
|
3011
3027
|
switch (event.type) {
|
|
3012
3028
|
case "managed-checkpoint":
|
|
@@ -3762,6 +3778,9 @@ async function runAgentHeadlessInWorkspace(
|
|
|
3762
3778
|
// remains observable through onCleanupReport but must not replace it.
|
|
3763
3779
|
if (loopFailureOutcome) return loopFailureOutcome;
|
|
3764
3780
|
if (cleanupFailure) throw cleanupFailure;
|
|
3781
|
+
if (evolutionIngress !== null) {
|
|
3782
|
+
await evolutionIngress.complete();
|
|
3783
|
+
}
|
|
3765
3784
|
|
|
3766
3785
|
// A downstream consumer closed stdout/stderr. The abort above unwound the
|
|
3767
3786
|
// model loop through the same `finally` as every other termination, so MCP,
|
|
@@ -76,6 +76,10 @@ import {
|
|
|
76
76
|
} from "../lib/ide-context.js";
|
|
77
77
|
import { detectVersionSkew, versionSkewMessage } from "../lib/version-skew.js";
|
|
78
78
|
import { captureAmbientExecutionLocation } from "../lib/execution-location-runtime.js";
|
|
79
|
+
import {
|
|
80
|
+
AGENT_EVOLUTION_INGRESS_FAILED_CODE,
|
|
81
|
+
captureAgentEvolutionIngress,
|
|
82
|
+
} from "../lib/evolution/agent-evolution-ingress.js";
|
|
79
83
|
import {
|
|
80
84
|
resolveAgentMcp,
|
|
81
85
|
resolvePermissionPromptTool,
|
|
@@ -882,6 +886,7 @@ async function runTurn(
|
|
|
882
886
|
persistUsageEvent,
|
|
883
887
|
persistToolEvent,
|
|
884
888
|
sessionBudget,
|
|
889
|
+
evolutionIngress = null,
|
|
885
890
|
emitPolicyDecisionEvents = false,
|
|
886
891
|
now = Date.now,
|
|
887
892
|
},
|
|
@@ -933,6 +938,9 @@ async function runTurn(
|
|
|
933
938
|
collapseConsecutiveMessagesInPlace(messages);
|
|
934
939
|
}
|
|
935
940
|
for await (const event of runLoop(messages, loopOptions)) {
|
|
941
|
+
if (evolutionIngress !== null) {
|
|
942
|
+
await evolutionIngress.ingestAgentEvent(event);
|
|
943
|
+
}
|
|
936
944
|
turnBindingFeed?.handleEvent(event);
|
|
937
945
|
switch (event.type) {
|
|
938
946
|
case "tool-executing": {
|
|
@@ -1527,6 +1535,10 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
1527
1535
|
pipeState = { closed: false },
|
|
1528
1536
|
streamCleanup,
|
|
1529
1537
|
) {
|
|
1538
|
+
const evolutionIngress =
|
|
1539
|
+
options.evolutionIngress == null
|
|
1540
|
+
? null
|
|
1541
|
+
: captureAgentEvolutionIngress(options.evolutionIngress);
|
|
1530
1542
|
const model = options.model || "qwen2.5:7b";
|
|
1531
1543
|
const provider = options.provider || "ollama";
|
|
1532
1544
|
const baseUrl = options.baseUrl || "http://localhost:11434";
|
|
@@ -1538,6 +1550,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
1538
1550
|
deps[STREAM_SESSION_ID] ||
|
|
1539
1551
|
options.sessionId ||
|
|
1540
1552
|
`headless-stream-${Date.now()}-${process.pid}`;
|
|
1553
|
+
if (evolutionIngress !== null) {
|
|
1554
|
+
await evolutionIngress.start();
|
|
1555
|
+
}
|
|
1541
1556
|
// The input stream may drive many turns. Allocate once at the stream-run
|
|
1542
1557
|
// boundary so every turn (and its nested agents) shares cache/backlog limits.
|
|
1543
1558
|
// SessionResourceBudget remains separately leased by executeTool.
|
|
@@ -3317,6 +3332,7 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3317
3332
|
: null;
|
|
3318
3333
|
|
|
3319
3334
|
let sawError = false;
|
|
3335
|
+
let evolutionIngressFailed = false;
|
|
3320
3336
|
let terminalPersistenceFailure = null;
|
|
3321
3337
|
const persistUsageEvent = persist
|
|
3322
3338
|
? (event) => {
|
|
@@ -4413,6 +4429,15 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4413
4429
|
);
|
|
4414
4430
|
}
|
|
4415
4431
|
|
|
4432
|
+
if (evolutionIngress !== null) {
|
|
4433
|
+
await evolutionIngress.ingestUserPrompt({
|
|
4434
|
+
content: parsed.text,
|
|
4435
|
+
imageCount: parsed.images?.length || 0,
|
|
4436
|
+
sessionId,
|
|
4437
|
+
source: "headless-stream",
|
|
4438
|
+
turn: turns + 1,
|
|
4439
|
+
});
|
|
4440
|
+
}
|
|
4416
4441
|
messages.push({ role: "user", content: turnContent });
|
|
4417
4442
|
let persistenceFailure = null;
|
|
4418
4443
|
if (persist) {
|
|
@@ -4536,6 +4561,7 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4536
4561
|
persistUsageEvent,
|
|
4537
4562
|
persistToolEvent,
|
|
4538
4563
|
sessionBudget: options.sessionBudget || null,
|
|
4564
|
+
evolutionIngress,
|
|
4539
4565
|
emitPolicyDecisionEvents: () =>
|
|
4540
4566
|
options.includeHookEvents === true &&
|
|
4541
4567
|
fieldGate.permission_decision !== false,
|
|
@@ -4543,6 +4569,19 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4543
4569
|
);
|
|
4544
4570
|
} catch (err) {
|
|
4545
4571
|
currentAbort = null;
|
|
4572
|
+
if (err?.code === AGENT_EVOLUTION_INGRESS_FAILED_CODE) {
|
|
4573
|
+
emit({
|
|
4574
|
+
type: "result",
|
|
4575
|
+
subtype: "error_evolution_ingress",
|
|
4576
|
+
is_error: true,
|
|
4577
|
+
code: err.code,
|
|
4578
|
+
error: err.message,
|
|
4579
|
+
turn: turns,
|
|
4580
|
+
});
|
|
4581
|
+
sawError = true;
|
|
4582
|
+
evolutionIngressFailed = true;
|
|
4583
|
+
break;
|
|
4584
|
+
}
|
|
4546
4585
|
if (persist) {
|
|
4547
4586
|
const normalized = createSessionPersistenceFailure(err, {
|
|
4548
4587
|
sessionId,
|
|
@@ -4814,6 +4853,10 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4814
4853
|
await streamCleanup.cleanup();
|
|
4815
4854
|
removeHookObserver?.();
|
|
4816
4855
|
|
|
4856
|
+
if (evolutionIngress !== null && !evolutionIngressFailed) {
|
|
4857
|
+
await evolutionIngress.complete();
|
|
4858
|
+
}
|
|
4859
|
+
|
|
4817
4860
|
if (!pipeState.closed) {
|
|
4818
4861
|
emit({ type: "system", subtype: "end", session_id: sessionId, turns });
|
|
4819
4862
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { loadConfig } from "../lib/config-manager.js";
|
|
2
2
|
import { AgentRuntime } from "./agent-runtime.js";
|
|
3
|
+
import { captureAgentEvolutionRuntimeComposition } from "../lib/evolution/agent-evolution-runtime-composition-brand.js";
|
|
3
4
|
import {
|
|
4
5
|
resolveAgentPolicy,
|
|
5
6
|
resolveServerPolicy,
|
|
@@ -9,14 +10,31 @@ import {
|
|
|
9
10
|
export function createAgentRuntimeFactory({
|
|
10
11
|
config = loadConfig(),
|
|
11
12
|
deps = {},
|
|
13
|
+
evolutionComposition = null,
|
|
12
14
|
} = {}) {
|
|
15
|
+
const composition =
|
|
16
|
+
evolutionComposition === null
|
|
17
|
+
? null
|
|
18
|
+
: captureAgentEvolutionRuntimeComposition(evolutionComposition);
|
|
19
|
+
if (composition !== null && Object.hasOwn(deps, "evolutionIngress")) {
|
|
20
|
+
throw new TypeError(
|
|
21
|
+
"evolution ingress must come from the production composition root only",
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
const runtimeDeps =
|
|
25
|
+
composition === null
|
|
26
|
+
? deps
|
|
27
|
+
: Object.freeze({
|
|
28
|
+
...deps,
|
|
29
|
+
evolutionIngress: composition.evolutionIngress,
|
|
30
|
+
});
|
|
13
31
|
return {
|
|
14
32
|
createAgentRuntime(overrides = {}) {
|
|
15
33
|
return new AgentRuntime({
|
|
16
34
|
kind: "agent",
|
|
17
35
|
policy: resolveAgentPolicy({ config, overrides }),
|
|
18
36
|
config,
|
|
19
|
-
deps,
|
|
37
|
+
deps: runtimeDeps,
|
|
20
38
|
});
|
|
21
39
|
},
|
|
22
40
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as i,J as A,U as I,R as s,Q as r,c as t,K as a,V as _,S as x,o as oe,b as ee,r as u,P as p,F as ne,a2 as ge}from"./vendor-Bn1JzzAn.js";import{_ as we,b as re,u as ie,d}from"./index-jx7kr6mB.js";import{u as de}from"./useShellMode-CgR0wCYM.js";import{aN as ke,aO as Fe,aP as be,f as je,a5 as Ce,a8 as xe,at as Oe,R as Se}from"./icons-DG5UD-6K.js";const Pe={__name:"Projects",setup(se,{expose:l}){l();const{t:te}=re(),e=ie(),{isEmbedded:J}=de();async function w(o,f,ye,ae=8e3){if(J){const Y=await e.sendRaw({...f,type:o},ae);if(!Y?.ok){const $=Y?.error;throw new Error(typeof $=="string"?$:$?.message||`${o} failed`)}return Y.result}return e.executeJson(ye,ae)}const B=u(!1),y=u([]),O=u(""),S=u(""),P=u(!1),v=u(null),h=u([]),k=u(!1),E=u(!1),L=u(!1),F=u({name:"",description:"",type:"document",rootPath:""}),z=[{title:"ID",key:"id",width:110},{title:"名称",key:"name"},{title:"类型",key:"project_type",width:120},{title:"状态",key:"status",width:100},{title:"同步",key:"sync_status",width:100},{title:"更新",key:"updated_at",width:160},{title:"操作",key:"actions",width:180,fixed:"right"}],V=ee(()=>{const o={active:0,draft:0,completed:0,archived:0};for(const f of y.value)o[f.status]!==void 0&&(o[f.status]+=1);return o}),W=ee(()=>y.value.filter(o=>!(O.value&&o.status!==O.value||S.value&&!o.name.toLowerCase().includes(S.value.toLowerCase()))));function g(o){switch(o){case"active":return"green";case"draft":return"default";case"completed":return"cyan";case"archived":return"gold";default:return"default"}}function K(o){switch(o){case"synced":return"green";case"pending":return"orange";case"conflict":return"red";case"error":return"red";default:return"default"}}function Q(o){return!o&&o!==0?"-":new Date(typeof o=="number"?o:parseInt(o,10)).toLocaleString("zh-CN",{hour12:!1})}async function C(){B.value=!0;try{const o=await w("project.list",{limit:500},"project list --limit 500 --json",1e4);y.value=Array.isArray(o?.projects)?o.projects:Array.isArray(o)?o:[]}catch(o){d.error("加载失败: "+(o.message||o)),y.value=[]}finally{B.value=!1}}function Z(o){return{onClick:()=>M(o)}}async function M(o){v.value=o,P.value=!0,k.value=!0,h.value=[];try{const f=await w("project.listFiles",{projectId:o.id,limit:200},`project list-files ${o.id} --json`,8e3);h.value=Array.isArray(f?.files)?f.files:[]}catch{h.value=[]}finally{k.value=!1}}async function G(o){try{(await w("project.delete",{id:o.id},`project delete ${o.id} --json`,8e3))?.ok?(d.success(`已删除项目 '${o.name}'`),P.value=!1,await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}function H(){F.value={name:"",description:"",type:"document",rootPath:""},E.value=!0}async function T(){if(!F.value.name.trim()){d.warning("请输入项目名称");return}L.value=!0;try{const o=await w("project.init",{name:F.value.name.trim(),description:F.value.description||null,projectType:F.value.type,rootPath:F.value.rootPath||null},`project init "${F.value.name.trim()}" --type ${F.value.type} --json`,8e3);o?.id?(d.success(`已创建项目 '${o.name}'`),E.value=!1,await C()):d.error("创建失败")}catch(o){d.error(o.message||String(o))}finally{L.value=!1}}const b=u(!1),D=u(!1),j=u({path:"",content:""}),U=u(!1),m=u(!1),R=u({path:""}),n=u(!1),c=u(null),q=u(""),X=u(!1);function ue(){j.value={path:"",content:""},b.value=!0}function ce(){R.value={path:""},U.value=!0}async function N(){if(v.value){k.value=!0;try{const o=await w("project.listFiles",{projectId:v.value.id,limit:200},`project list-files ${v.value.id} --json`,8e3);h.value=Array.isArray(o?.files)?o.files:[]}catch(o){d.error("刷新文件失败: "+(o.message||o))}finally{k.value=!1}}}async function fe(){if(!j.value.path.trim()){d.warning("请输入文件路径");return}if(v.value){D.value=!0;try{const o=await w("project.createFile",{projectId:v.value.id,filePath:j.value.path.trim(),content:j.value.content||""},`project create-file ${v.value.id} "${j.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件 '${o.file_name}'`),b.value=!1,await N(),await C()):d.error("创建文件失败")}catch(o){d.error(o.message||String(o))}finally{D.value=!1}}}async function pe(){if(!R.value.path.trim()){d.warning("请输入文件夹路径");return}if(v.value){m.value=!0;try{const o=await w("project.createFolder",{projectId:v.value.id,folderPath:R.value.path.trim()},`project create-folder ${v.value.id} "${R.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件夹 '${o.file_name}'`),U.value=!1,await N(),await C()):d.error("创建文件夹失败")}catch(o){d.error(o.message||String(o))}finally{m.value=!1}}}async function ve(o){try{(await w("project.deleteFile",{fileId:o.id},`project delete-file ${o.id} --json`,8e3))?.deleted?(d.success(`已删除 '${o.file_name}'`),await N(),await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}async function me(o){if(o.is_folder){d.info("文件夹无内容可编辑");return}try{const f=await w("project.getFile",{fileId:o.id},`project get-file ${o.id} --json`,8e3);c.value=o,q.value=f?.content||"",n.value=!0}catch(f){d.error("读取文件失败: "+(f.message||f))}}async function _e(){if(c.value){X.value=!0;try{(await w("project.writeFile",{fileId:c.value.id,content:q.value},`project write-file ${c.value.id} --json`,8e3))?.id?(d.success("已保存"),n.value=!1,await N()):d.error("保存失败")}catch(o){d.error(o.message||String(o))}finally{X.value=!1}}}oe(()=>{C()});const le={t:te,ws:e,isEmbedded:J,callProjectTopic:w,loading:B,projects:y,statusFilter:O,nameFilter:S,detailOpen:P,detail:v,files:h,filesLoading:k,createOpen:E,creating:L,newProject:F,columns:z,countByStatus:V,filteredProjects:W,statusColor:g,syncColor:K,formatTime:Q,loadAll:C,onRowClick:Z,openDetail:M,onDelete:G,onShowCreate:H,onCreate:T,createFileOpen:b,creatingFile:D,newFile:j,createFolderOpen:U,creatingFolder:m,newFolder:R,editFileOpen:n,editingFile:c,editFileContent:q,savingFile:X,openCreateFile:ue,openCreateFolder:ce,refreshFiles:N,onCreateFile:fe,onCreateFolder:pe,onDeleteFile:ve,openEditFile:me,onSaveFile:_e,ref:u,computed:ee,onMounted:oe,get ReloadOutlined(){return Se},get PlusOutlined(){return Oe},get FolderOutlined(){return xe},get FileTextOutlined(){return Ce},get CheckCircleOutlined(){return je},get CheckSquareOutlined(){return be},get FileAddOutlined(){return Fe},get FolderAddOutlined(){return ke},get message(){return d},get useI18n(){return re},get useWsStore(){return ie},get useShellMode(){return de}};return Object.defineProperty(le,"__isScriptSetup",{enumerable:!1,value:!0}),le}},ze={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Ue={class:"page-title"},Ae={class:"page-sub"},Ie={class:"filter-bar",style:{"margin-bottom":"12px",display:"flex",gap:"12px","align-items":"center"}},he={key:0,style:{"font-size":"12px",color:"#888"}},De={key:0,style:{color:"#888","font-size":"12px"}},Re={key:0},Te={key:1,style:{color:"#888"}},Be=["onClick"],Ee={key:0,style:{color:"#888","font-size":"12px"}};function Le(se,l,te,e,J,w){const B=i("router-link"),y=i("a-button"),O=i("a-space"),S=i("a-statistic"),P=i("a-card"),v=i("a-col"),h=i("a-row"),k=i("a-radio-button"),E=i("a-radio-group"),L=i("a-input-search"),F=i("a-alert"),z=i("a-tag"),V=i("a-popconfirm"),W=i("a-table"),g=i("a-descriptions-item"),K=i("a-descriptions"),Q=i("a-divider"),C=i("a-empty"),Z=i("a-list-item"),M=i("a-list"),G=i("a-spin"),H=i("a-drawer"),T=i("a-input"),b=i("a-form-item"),D=i("a-textarea"),j=i("a-form"),U=i("a-modal"),m=i("a-select-option"),R=i("a-select");return p(),A("div",null,[I("div",ze,[I("div",null,[I("h2",Ue,s(e.t("projects.title")),1),I("p",Ae,[l[17]||(l[17]=r("桌面 / CLI / 手机 三端共享同一份项目数据,Phase 3d sync 自动同步 (",-1)),t(B,{to:"/project-init"},{default:a(()=>[...l[16]||(l[16]=[r("项目初始化 / 环境设置",-1)])]),_:1}),l[18]||(l[18]=r(")",-1))])]),t(O,null,{default:a(()=>[t(y,{loading:e.loading,onClick:e.loadAll},{icon:a(()=>[t(e.ReloadOutlined)]),default:a(()=>[l[19]||(l[19]=r(" 刷新 ",-1))]),_:1},8,["loading"]),t(y,{type:"primary",onClick:e.onShowCreate},{icon:a(()=>[t(e.PlusOutlined)]),default:a(()=>[l[20]||(l[20]=r(" 新建项目 ",-1))]),_:1})]),_:1})]),_(" Stats "),t(h,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"总项目",value:e.projects.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[t(e.FolderOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"活跃",value:e.countByStatus.active,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckCircleOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"草稿",value:e.countByStatus.draft,"value-style":{color:"#8c8c8c",fontSize:"20px"}},{prefix:a(()=>[t(e.FileTextOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"已完成",value:e.countByStatus.completed,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckSquareOutlined)]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),_(" Filter "),I("div",Ie,[t(E,{value:e.statusFilter,"onUpdate:value":l[0]||(l[0]=n=>e.statusFilter=n),size:"small","button-style":"solid"},{default:a(()=>[t(k,{value:""},{default:a(()=>[...l[21]||(l[21]=[r("全部",-1)])]),_:1}),t(k,{value:"active"},{default:a(()=>[...l[22]||(l[22]=[r("活跃",-1)])]),_:1}),t(k,{value:"draft"},{default:a(()=>[...l[23]||(l[23]=[r("草稿",-1)])]),_:1}),t(k,{value:"completed"},{default:a(()=>[...l[24]||(l[24]=[r("已完成",-1)])]),_:1}),t(k,{value:"archived"},{default:a(()=>[...l[25]||(l[25]=[r("已归档",-1)])]),_:1})]),_:1},8,["value"]),t(L,{value:e.nameFilter,"onUpdate:value":l[1]||(l[1]=n=>e.nameFilter=n),placeholder:"按名称过滤",style:{"max-width":"260px"},"allow-clear":""},null,8,["value"])]),!e.projects.length&&!e.loading?(p(),x(F,{key:0,type:"info",message:"还没有项目",description:'运行 `cc project init <name>` 或点击右上角"新建项目"按钮创建。桌面 / CLI / 手机三端共享同一份数据。',"show-icon":"",style:{"margin-bottom":"16px"}})):_("v-if",!0),e.projects.length||e.loading?(p(),x(W,{key:1,columns:e.columns,"data-source":e.filteredProjects,loading:e.loading,pagination:{pageSize:20,showSizeChanger:!0},"row-key":"id","custom-row":e.onRowClick},{bodyCell:a(({column:n,record:c})=>[n.key==="id"?(p(),A("code",he,s(c.id.slice(0,8))+"…",1)):n.key==="name"?(p(),A(ne,{key:1},[I("strong",null,s(c.name),1),c.description?(p(),A("div",De,s(c.description),1)):_("v-if",!0)],64)):n.key==="project_type"?(p(),x(z,{key:2},{default:a(()=>[r(s(c.project_type),1)]),_:2},1024)):n.key==="status"?(p(),x(z,{key:3,color:e.statusColor(c.status)},{default:a(()=>[r(s(c.status),1)]),_:2},1032,["color"])):n.key==="sync_status"?(p(),x(z,{key:4,color:e.syncColor(c.sync_status)},{default:a(()=>[r(s(c.sync_status||"unknown"),1)]),_:2},1032,["color"])):n.key==="updated_at"?(p(),A(ne,{key:5},[r(s(e.formatTime(c.updated_at)),1)],64)):n.key==="actions"?(p(),x(O,{key:6,onClick:l[2]||(l[2]=ge(()=>{},["stop"]))},{default:a(()=>[t(y,{size:"small",onClick:q=>e.openDetail(c)},{default:a(()=>[...l[26]||(l[26]=[r("详情",-1)])]),_:1},8,["onClick"]),t(V,{title:`删除项目 '${c.name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:q=>e.onDelete(c)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[27]||(l[27]=[r("删除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):_("v-if",!0)]),_:1},8,["data-source","loading"])):_("v-if",!0),_(" Detail drawer "),t(H,{open:e.detailOpen,"onUpdate:open":l[3]||(l[3]=n=>e.detailOpen=n),title:e.detail?.name||"项目详情",width:"640",placement:"right"},{default:a(()=>[e.detail?(p(),x(K,{key:0,column:1,bordered:"",size:"small"},{default:a(()=>[t(g,{label:"ID"},{default:a(()=>[I("code",null,s(e.detail.id),1)]),_:1}),t(g,{label:"名称"},{default:a(()=>[r(s(e.detail.name),1)]),_:1}),t(g,{label:"描述"},{default:a(()=>[r(s(e.detail.description||"-"),1)]),_:1}),t(g,{label:"类型"},{default:a(()=>[t(z,null,{default:a(()=>[r(s(e.detail.project_type),1)]),_:1})]),_:1}),t(g,{label:"状态"},{default:a(()=>[t(z,{color:e.statusColor(e.detail.status)},{default:a(()=>[r(s(e.detail.status),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"同步状态"},{default:a(()=>[t(z,{color:e.syncColor(e.detail.sync_status)},{default:a(()=>[r(s(e.detail.sync_status||"unknown"),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"用户"},{default:a(()=>[r(s(e.detail.user_id),1)]),_:1}),t(g,{label:"根路径"},{default:a(()=>[e.detail.root_path?(p(),A("code",Re,s(e.detail.root_path),1)):(p(),A("span",Te,"(无)"))]),_:1}),t(g,{label:"文件数"},{default:a(()=>[r(s(e.detail.file_count||0),1)]),_:1}),t(g,{label:"创建"},{default:a(()=>[r(s(e.formatTime(e.detail.created_at)),1)]),_:1}),t(g,{label:"更新"},{default:a(()=>[r(s(e.formatTime(e.detail.updated_at)),1)]),_:1})]),_:1})):_("v-if",!0),t(Q,null,{default:a(()=>[...l[28]||(l[28]=[r("文件",-1)])]),_:1}),_(" Sub-phase 7.3 (2026-05-17): 文件 CRUD toolbar "),t(O,{style:{"margin-bottom":"12px"}},{default:a(()=>[t(y,{size:"small",type:"primary",disabled:!e.detail,onClick:e.openCreateFile},{default:a(()=>[t(e.FileAddOutlined),l[29]||(l[29]=r(" 新建文件 ",-1))]),_:1},8,["disabled"]),t(y,{size:"small",disabled:!e.detail,onClick:e.openCreateFolder},{default:a(()=>[t(e.FolderAddOutlined),l[30]||(l[30]=r(" 新建文件夹 ",-1))]),_:1},8,["disabled"])]),_:1}),t(G,{spinning:e.filesLoading},{default:a(()=>[!e.files.length&&!e.filesLoading?(p(),x(C,{key:0,description:"无文件 (点上方按钮新建)"})):(p(),x(M,{key:1,size:"small","data-source":e.files},{renderItem:a(({item:n})=>[t(Z,null,{extra:a(()=>[t(O,null,{default:a(()=>[n.file_size?(p(),A("span",Ee,s(n.file_size)+" B",1)):_("v-if",!0),t(V,{title:`删除 ${n.is_folder?"文件夹":"文件"} '${n.file_name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:c=>e.onDeleteFile(n)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[31]||(l[31]=[r("×",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)]),default:a(()=>[I("span",{style:{cursor:"pointer"},onClick:c=>e.openEditFile(n)},s(n.is_folder?"📁":"📄")+" "+s(n.file_path),9,Be)]),_:2},1024)]),_:1},8,["data-source"]))]),_:1},8,["spinning"])]),_:1},8,["open","title"]),_(" Sub-phase 7.3: Create file modal "),t(U,{open:e.createFileOpen,"onUpdate:open":l[6]||(l[6]=n=>e.createFileOpen=n),title:"新建文件","confirm-loading":e.creatingFile,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFile},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"文件路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFile.path,"onUpdate:value":l[4]||(l[4]=n=>e.newFile.path=n),placeholder:"例如 README.md 或 src/main.kt"},null,8,["value"])]),_:1}),t(b,{label:"初始内容(可选)"},{default:a(()=>[t(D,{value:e.newFile.content,"onUpdate:value":l[5]||(l[5]=n=>e.newFile.content=n),rows:6,placeholder:"留空创建空文件"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Create folder modal "),t(U,{open:e.createFolderOpen,"onUpdate:open":l[8]||(l[8]=n=>e.createFolderOpen=n),title:"新建文件夹","confirm-loading":e.creatingFolder,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFolder},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"文件夹路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFolder.path,"onUpdate:value":l[7]||(l[7]=n=>e.newFolder.path=n),placeholder:"例如 src/utils"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Edit file content modal "),t(U,{open:e.editFileOpen,"onUpdate:open":l[10]||(l[10]=n=>e.editFileOpen=n),title:`编辑 ${e.editingFile?.file_name||""}`,"confirm-loading":e.savingFile,"ok-text":"保存","cancel-text":"取消",onOk:e.onSaveFile,width:"720"},{default:a(()=>[t(D,{value:e.editFileContent,"onUpdate:value":l[9]||(l[9]=n=>e.editFileContent=n),rows:18,"auto-size":{minRows:12,maxRows:24},style:{"font-family":"monospace"}},null,8,["value"])]),_:1},8,["open","title","confirm-loading"]),_(" Create modal "),t(U,{open:e.createOpen,"onUpdate:open":l[15]||(l[15]=n=>e.createOpen=n),title:"新建项目","confirm-loading":e.creating,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreate},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"项目名称",required:""},{default:a(()=>[t(T,{value:e.newProject.name,"onUpdate:value":l[11]||(l[11]=n=>e.newProject.name=n),placeholder:"例如:旅行计划-上海"},null,8,["value"])]),_:1}),t(b,{label:"描述"},{default:a(()=>[t(D,{value:e.newProject.description,"onUpdate:value":l[12]||(l[12]=n=>e.newProject.description=n),rows:2},null,8,["value"])]),_:1}),t(b,{label:"类型"},{default:a(()=>[t(R,{value:e.newProject.type,"onUpdate:value":l[13]||(l[13]=n=>e.newProject.type=n)},{default:a(()=>[t(m,{value:"document"},{default:a(()=>[...l[32]||(l[32]=[r("文档 (document)",-1)])]),_:1}),t(m,{value:"data"},{default:a(()=>[...l[33]||(l[33]=[r("数据 (data)",-1)])]),_:1}),t(m,{value:"web"},{default:a(()=>[...l[34]||(l[34]=[r("Web",-1)])]),_:1}),t(m,{value:"app"},{default:a(()=>[...l[35]||(l[35]=[r("应用 (app)",-1)])]),_:1}),t(m,{value:"presentation"},{default:a(()=>[...l[36]||(l[36]=[r("演示文稿",-1)])]),_:1}),t(m,{value:"spreadsheet"},{default:a(()=>[...l[37]||(l[37]=[r("表格",-1)])]),_:1}),t(m,{value:"design"},{default:a(()=>[...l[38]||(l[38]=[r("设计",-1)])]),_:1}),t(m,{value:"code"},{default:a(()=>[...l[39]||(l[39]=[r("代码",-1)])]),_:1}),t(m,{value:"workflow"},{default:a(()=>[...l[40]||(l[40]=[r("工作流",-1)])]),_:1}),t(m,{value:"knowledge"},{default:a(()=>[...l[41]||(l[41]=[r("知识库",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(b,{label:"根路径 (可选)"},{default:a(()=>[t(T,{value:e.newProject.rootPath,"onUpdate:value":l[14]||(l[14]=n=>e.newProject.rootPath=n),placeholder:"留空则仅元数据"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}const Je=we(Pe,[["render",Le],["__scopeId","data-v-019ac5aa"],["__file","/tmp/cc-web-panel-UJ86gZ/repo/packages/web-panel/src/views/Projects.vue"]]);export{Je as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-jx7kr6mB.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-DVfm6xGt.js";import{a0 as t}from"./index-jx7kr6mB.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-CPB6iSzV.js";import"./useFlexGapSupport-CmWO7h0I.js";import"./styleChecker-qSHtosM-.js";import"./index-DNlxihs8.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-BVJQEP2j.js";import{a0 as t}from"./index-jx7kr6mB.js";import"./vendor-Bn1JzzAn.js";import"./index-DNlxihs8.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Learning Loop — Hook registration.
|
|
3
|
-
*
|
|
4
|
-
* Wires the TrajectoryStore into the existing hook infrastructure:
|
|
5
|
-
* - UserPromptSubmit → startTrajectory()
|
|
6
|
-
* - PostToolUse → appendToolCall()
|
|
7
|
-
* - SessionEnd → (reserved for ReflectionEngine in P3)
|
|
8
|
-
*
|
|
9
|
-
* This module does NOT modify agent-core.js or agent-repl.js.
|
|
10
|
-
* Instead it provides an init function that the REPL calls once
|
|
11
|
-
* during session setup, passing a LearningLoop context object.
|
|
12
|
-
*
|
|
13
|
-
* Design:
|
|
14
|
-
* - Fire-and-forget: learning failures never break the host flow
|
|
15
|
-
* - No-op when learningCtx is null or disabled
|
|
16
|
-
* - Stateless — the trajectory ID is tracked on learningCtx
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import { createRequire } from "node:module";
|
|
20
|
-
// ESM module — `require` is not a global here. createRequire gives a working
|
|
21
|
-
// require() for the lazy TrajectoryStore load below (kept lazy to avoid a
|
|
22
|
-
// circular import). Node >=22.12 (our engines floor) supports require(esm).
|
|
23
|
-
const require = createRequire(import.meta.url);
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* @typedef {object} LearningContext
|
|
27
|
-
* @property {import("./trajectory-store.js").TrajectoryStore} trajectoryStore
|
|
28
|
-
* @property {string|null} currentTrajectoryId — set per user turn
|
|
29
|
-
* @property {boolean} enabled
|
|
30
|
-
* @property {string} sessionId
|
|
31
|
-
*/
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Called on UserPromptSubmit — starts a new trajectory for this turn.
|
|
35
|
-
* @param {LearningContext} ctx
|
|
36
|
-
* @param {string} prompt — the user's raw input
|
|
37
|
-
*/
|
|
38
|
-
export function onUserPromptSubmit(ctx, prompt) {
|
|
39
|
-
if (!ctx || !ctx.enabled || !ctx.trajectoryStore) return;
|
|
40
|
-
try {
|
|
41
|
-
ctx.currentTrajectoryId = ctx.trajectoryStore.startTrajectory(
|
|
42
|
-
ctx.sessionId,
|
|
43
|
-
prompt,
|
|
44
|
-
);
|
|
45
|
-
} catch (_err) {
|
|
46
|
-
// Learning failures never break the REPL
|
|
47
|
-
ctx.currentTrajectoryId = null;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Called on PostToolUse — appends a tool call to the current trajectory.
|
|
53
|
-
* @param {LearningContext} ctx
|
|
54
|
-
* @param {{tool:string, args:any, result:any, durationMs?:number, status?:string}} record
|
|
55
|
-
*/
|
|
56
|
-
export function onPostToolUse(ctx, record) {
|
|
57
|
-
if (!ctx || !ctx.enabled || !ctx.trajectoryStore || !ctx.currentTrajectoryId)
|
|
58
|
-
return;
|
|
59
|
-
try {
|
|
60
|
-
ctx.trajectoryStore.appendToolCall(ctx.currentTrajectoryId, record);
|
|
61
|
-
} catch (_err) {
|
|
62
|
-
// Swallow — never break the agent loop
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Called on response-complete — completes the current trajectory.
|
|
68
|
-
* @param {LearningContext} ctx
|
|
69
|
-
* @param {{finalResponse?:string, tags?:string[]}} data
|
|
70
|
-
* @returns {object|null} completed trajectory or null
|
|
71
|
-
*/
|
|
72
|
-
export function onResponseComplete(ctx, data) {
|
|
73
|
-
if (!ctx || !ctx.enabled || !ctx.trajectoryStore || !ctx.currentTrajectoryId)
|
|
74
|
-
return null;
|
|
75
|
-
try {
|
|
76
|
-
const trajectory = ctx.trajectoryStore.completeTrajectory(
|
|
77
|
-
ctx.currentTrajectoryId,
|
|
78
|
-
data,
|
|
79
|
-
);
|
|
80
|
-
// Reset for next turn
|
|
81
|
-
const finishedId = ctx.currentTrajectoryId;
|
|
82
|
-
ctx.currentTrajectoryId = null;
|
|
83
|
-
return trajectory;
|
|
84
|
-
} catch (_err) {
|
|
85
|
-
ctx.currentTrajectoryId = null;
|
|
86
|
-
return null;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Called on SessionEnd — reserved for ReflectionEngine (P3).
|
|
92
|
-
* Currently a no-op placeholder.
|
|
93
|
-
* @param {LearningContext} ctx
|
|
94
|
-
*/
|
|
95
|
-
export function onSessionEnd(ctx) {
|
|
96
|
-
if (!ctx || !ctx.enabled) return;
|
|
97
|
-
// P3: will call reflectionEngine.onSessionEnd(ctx.sessionId)
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Create a LearningContext for a session.
|
|
102
|
-
* Returns null if db is not available or learning is disabled.
|
|
103
|
-
*
|
|
104
|
-
* @param {import("better-sqlite3").Database|null} db
|
|
105
|
-
* @param {string} sessionId
|
|
106
|
-
* @param {{enabled?:boolean}} [config]
|
|
107
|
-
* @returns {LearningContext|null}
|
|
108
|
-
*/
|
|
109
|
-
export function createLearningContext(db, sessionId, config = {}) {
|
|
110
|
-
if (!db) return null;
|
|
111
|
-
const enabled = config.enabled !== false;
|
|
112
|
-
if (!enabled) return null;
|
|
113
|
-
|
|
114
|
-
// Lazy import to avoid circular deps — TrajectoryStore calls ensureLearningTables
|
|
115
|
-
const { TrajectoryStore } = require("./trajectory-store.js");
|
|
116
|
-
|
|
117
|
-
return {
|
|
118
|
-
trajectoryStore: new TrajectoryStore(db),
|
|
119
|
-
currentTrajectoryId: null,
|
|
120
|
-
enabled: true,
|
|
121
|
-
sessionId,
|
|
122
|
-
};
|
|
123
|
-
}
|