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.
Files changed (223) hide show
  1. package/README.md +17 -10
  2. package/completions/_cc +1 -1
  3. package/completions/cc.bash +1 -1
  4. package/completions/cc.fish +1 -1
  5. package/completions/cc.ps1 +1 -1
  6. package/package.json +2 -2
  7. package/src/assets/web-panel/assets/{AIOps-CTxa2Wbq.js → AIOps-CQSBl3hY.js} +1 -1
  8. package/src/assets/web-panel/assets/{ActionButton-DHrQyYhy.js → ActionButton-IQt-vRLt.js} +1 -1
  9. package/src/assets/web-panel/assets/{Analytics-DQiUqcNl.js → Analytics-DkHC8O7k.js} +3 -3
  10. package/src/assets/web-panel/assets/{AppLayout-_Iz4r6wt.js → AppLayout-CSti2P2T.js} +5 -5
  11. package/src/assets/web-panel/assets/{Artifacts-BNs63YHo.js → Artifacts-C57hxn3v.js} +1 -1
  12. package/src/assets/web-panel/assets/{Audit-BgHIqRLn.js → Audit-DByLntcf.js} +1 -1
  13. package/src/assets/web-panel/assets/{BackgroundAgents-DUQ5axBB.js → BackgroundAgents-D1Bd2EOa.js} +1 -1
  14. package/src/assets/web-panel/assets/{Backup-CJ51E9Vw.js → Backup-VstHzHng.js} +1 -1
  15. package/src/assets/web-panel/assets/{BaseInput-o-5toA_R.js → BaseInput-CLhdexIf.js} +1 -1
  16. package/src/assets/web-panel/assets/{Chat-Cu7a-x1L.js → Chat-BefC_JZS.js} +6 -6
  17. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BUyYkAXr.js → ChatBubbleRenderer-DbXMvgmn.js} +1 -1
  18. package/src/assets/web-panel/assets/{Checkbox-DwdmZ71L.js → Checkbox-CEY982vx.js} +1 -1
  19. package/src/assets/web-panel/assets/{Codegen-BrH2eYiP.js → Codegen-Dcm_DTvJ.js} +1 -1
  20. package/src/assets/web-panel/assets/{Col-BVJQEP2j.js → Col-C8SSu4KA.js} +1 -1
  21. package/src/assets/web-panel/assets/{Community-FGO3vZPq.js → Community-BVV9vwRR.js} +1 -1
  22. package/src/assets/web-panel/assets/{Compact-DYGAFVnT.js → Compact-B7c5Vo18.js} +1 -1
  23. package/src/assets/web-panel/assets/{Compliance-CRvc8Bdt.js → Compliance-Tq9jSZ5a.js} +1 -1
  24. package/src/assets/web-panel/assets/{Cowork-D6Ah2m7A.js → Cowork-BJUjT09Q.js} +3 -3
  25. package/src/assets/web-panel/assets/{Cron-AXbU2ifR.js → Cron-CjV9PEaS.js} +2 -2
  26. package/src/assets/web-panel/assets/{Crosschain-C5DXgEFd.js → Crosschain-Dl7ReL8F.js} +1 -1
  27. package/src/assets/web-panel/assets/{DID-Bxh9QV9v.js → DID-CG8PjWmM.js} +2 -2
  28. package/src/assets/web-panel/assets/{Dashboard-B-ZHEta-.js → Dashboard-CDBM6wmF.js} +2 -2
  29. package/src/assets/web-panel/assets/{Dropdown-66Ik1jqa.js → Dropdown-8_55bXTD.js} +1 -1
  30. package/src/assets/web-panel/assets/{EmailListRenderer-CCWk1BIM.js → EmailListRenderer-D3qOU1Cm.js} +1 -1
  31. package/src/assets/web-panel/assets/{FamilyGuardDashboard--9faIULK.js → FamilyGuardDashboard-Bv5oWMZF.js} +1 -1
  32. package/src/assets/web-panel/assets/{Federation-CejW9CgX.js → Federation-hpZ1xkKd.js} +1 -1
  33. package/src/assets/web-panel/assets/{FormItemContext-acHgcXki.js → FormItemContext-BN7GT191.js} +1 -1
  34. package/src/assets/web-panel/assets/{GenericCardRenderer-D2ghd_K4.js → GenericCardRenderer-PCRhfA7M.js} +1 -1
  35. package/src/assets/web-panel/assets/{Git-BOe1YJrV.js → Git-CIlP2vy7.js} +2 -2
  36. package/src/assets/web-panel/assets/{Governance-BjgzJsof.js → Governance-81lgm7YL.js} +1 -1
  37. package/src/assets/web-panel/assets/{Inference-CXCD5rnP.js → Inference-Cs24xMOV.js} +1 -1
  38. package/src/assets/web-panel/assets/{KnowledgeGraph-CHA8QgJT.js → KnowledgeGraph-CrJLVCZo.js} +1 -1
  39. package/src/assets/web-panel/assets/{Logs-DORPMcL6.js → Logs-DLyO8RKT.js} +2 -2
  40. package/src/assets/web-panel/assets/{MarkdownRenderer-CPPHz01z.js → MarkdownRenderer-DBOqijrP.js} +1 -1
  41. package/src/assets/web-panel/assets/{Marketplace-BCFlo1Yx.js → Marketplace-Dz7AbQZc.js} +1 -1
  42. package/src/assets/web-panel/assets/{McpTools-Dl_uZAKh.js → McpTools-BM0aFiWv.js} +3 -3
  43. package/src/assets/web-panel/assets/{Memory-DupHamwz.js → Memory-C9SJzENX.js} +2 -2
  44. package/src/assets/web-panel/assets/{MobileBridge-BRSMPJxW.js → MobileBridge-BO2HnNRk.js} +1 -1
  45. package/src/assets/web-panel/assets/{MobileProjects-BHpuzsDl.js → MobileProjects-CK_jMz0l.js} +1 -1
  46. package/src/assets/web-panel/assets/{Mtc-Ch0jOQfZ.js → Mtc-CfhrJsdO.js} +2 -2
  47. package/src/assets/web-panel/assets/{MtcAudit-qzwQrDi7.js → MtcAudit-BE2ELxgI.js} +4 -4
  48. package/src/assets/web-panel/assets/{Multisig-B5wHzUcm.js → Multisig-CgR_E3Jd.js} +3 -3
  49. package/src/assets/web-panel/assets/{NLProgramming-Hy9uAiA0.js → NLProgramming-Cw9445_K.js} +1 -1
  50. package/src/assets/web-panel/assets/{Notes-DkuchMC7.js → Notes-DZimkTrb.js} +3 -3
  51. package/src/assets/web-panel/assets/{NotificationSettings-CYZhD7Pi.js → NotificationSettings-DxHVh4uT.js} +1 -1
  52. package/src/assets/web-panel/assets/{OrderTableRenderer-DKOoqajt.js → OrderTableRenderer-Iy-pnX56.js} +1 -1
  53. package/src/assets/web-panel/assets/{Organization-D9AXn6j8.js → Organization-pPXJtWo4.js} +4 -4
  54. package/src/assets/web-panel/assets/{Overflow-Bg15J6hX.js → Overflow-YamdTJwA.js} +1 -1
  55. package/src/assets/web-panel/assets/{P2P--B54HoQn.js → P2P-BvqP53x7.js} +2 -2
  56. package/src/assets/web-panel/assets/{PdhVaultBrowser-Cz9Kk2Nb.js → PdhVaultBrowser-Blz1Xn2n.js} +3 -3
  57. package/src/assets/web-panel/assets/{Permissions-DHx38eS1.js → Permissions-CgFRQqFJ.js} +4 -4
  58. package/src/assets/web-panel/assets/{PersonalDataHub-Dw8i2hAs.js → PersonalDataHub-CFeo3-6O.js} +4 -4
  59. package/src/assets/web-panel/assets/{Pipeline-B2o6Ur2G.js → Pipeline-BkaRojEK.js} +1 -1
  60. package/src/assets/web-panel/assets/{Privacy-8g-h2fnu.js → Privacy-BNZEx2Qp.js} +1 -1
  61. package/src/assets/web-panel/assets/{ProjectInit-DuVTcINx.js → ProjectInit-HUBOgEEK.js} +2 -2
  62. package/src/assets/web-panel/assets/{ProjectSettings-C8njvdZX.js → ProjectSettings-CFMmhROS.js} +2 -2
  63. package/src/assets/web-panel/assets/Projects-Dc517BXp.js +1 -0
  64. package/src/assets/web-panel/assets/{Providers-wFqgod_W.js → Providers-DTLf8bgj.js} +1 -1
  65. package/src/assets/web-panel/assets/{QrScannerModal-9NCXrpmA.js → QrScannerModal-BBNjPszk.js} +1 -1
  66. package/src/assets/web-panel/assets/{QuickAsk-WUTNvFkY.js → QuickAsk-DCsHvk3G.js} +1 -1
  67. package/src/assets/web-panel/assets/{Recommend-xT4nYmju.js → Recommend-Dpr5YSop.js} +1 -1
  68. package/src/assets/web-panel/assets/{RemoteSession-fak1PBGC.js → RemoteSession-DmKnvqGg.js} +2 -2
  69. package/src/assets/web-panel/assets/{Reputation-D1AkQvD-.js → Reputation-CSRfuurX.js} +1 -1
  70. package/src/assets/web-panel/assets/{Row-DVfm6xGt.js → Row-CDj3pQ_w.js} +1 -1
  71. package/src/assets/web-panel/assets/{RssFeed-BDunoLSE.js → RssFeed-DI0a_kNq.js} +2 -2
  72. package/src/assets/web-panel/assets/{Search-OPycRoU3.js → Search-jAy7B2nU.js} +1 -1
  73. package/src/assets/web-panel/assets/{Security-C8-Fm3Dt.js → Security-CkHTqYhc.js} +4 -4
  74. package/src/assets/web-panel/assets/{Services-qM_sMpMl.js → Services-CP-0Nzga.js} +2 -2
  75. package/src/assets/web-panel/assets/{Skeleton-D3HBJjVF.js → Skeleton-BkF5-p3n.js} +1 -1
  76. package/src/assets/web-panel/assets/{Skills-jr67X-tP.js → Skills-BDu-utDE.js} +1 -1
  77. package/src/assets/web-panel/assets/{Sla-CS3ggyCg.js → Sla-CQvq_2Qb.js} +1 -1
  78. package/src/assets/web-panel/assets/{SpeechSettings-CTOCYxOi.js → SpeechSettings-T7Ap512g.js} +1 -1
  79. package/src/assets/web-panel/assets/{SyncSettings-D3s3cLT5.js → SyncSettings-Bt-PLvot.js} +2 -2
  80. package/src/assets/web-panel/assets/{Tasks-CdfoJ25m.js → Tasks-yLEcCogg.js} +1 -1
  81. package/src/assets/web-panel/assets/{Templates-Drb4AI8X.js → Templates-ByN3fmbr.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tenant-DzwR3Qkz.js → Tenant-DBI7hITH.js} +1 -1
  83. package/src/assets/web-panel/assets/{Terminal-D-ESq7xp.js → Terminal-B77_DlGX.js} +2 -2
  84. package/src/assets/web-panel/assets/{TimelineRenderer-BK-AUuws.js → TimelineRenderer-CsLTB_QO.js} +1 -1
  85. package/src/assets/web-panel/assets/{Tokens-xGTouuNp.js → Tokens-BV2N6cR8.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trigger-BvZj-v2H.js → Trigger-CjXWGH3p.js} +1 -1
  87. package/src/assets/web-panel/assets/{Trust-BLC9CGmc.js → Trust-uqXIq3WC.js} +1 -1
  88. package/src/assets/web-panel/assets/{UkeySign-BSuCXpmE.js → UkeySign-D-6qu4vY.js} +1 -1
  89. package/src/assets/web-panel/assets/{VideoEditing-DT3A-_Ql.js → VideoEditing-CxGmx_2e.js} +1 -1
  90. package/src/assets/web-panel/assets/{Wallet-c1OXao85.js → Wallet-DSq7WlAg.js} +4 -4
  91. package/src/assets/web-panel/assets/{WebAuthn-CuA-F7KJ.js → WebAuthn-CDBiD57O.js} +2 -2
  92. package/src/assets/web-panel/assets/{WorkflowEditor-MANZrf82.js → WorkflowEditor-Z8f63TSb.js} +1 -1
  93. package/src/assets/web-panel/assets/{chat-D4Y4Ey0O.js → chat-B-UZFBjy.js} +1 -1
  94. package/src/assets/web-panel/assets/{colors-DDH06hKO.js → colors-CFk7K-7Q.js} +1 -1
  95. package/src/assets/web-panel/assets/{compact-item-Cym756Xj.js → compact-item-X0IVMvgi.js} +1 -1
  96. package/src/assets/web-panel/assets/{createContext-By4Nb1k-.js → createContext-DWg4j2n6.js} +1 -1
  97. package/src/assets/web-panel/assets/devWarning-B2IW1J_J.js +1 -0
  98. package/src/assets/web-panel/assets/{hasIn-Ch7OY258.js → hasIn-CkVCwNNF.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-D9le0-dc.js → index-5OcZHdzc.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CykROEJA.js → index-B273IY-E.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DjwgJ5Jd.js → index-B3-B3FWD.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CjNUTBwe.js → index-BB4KHHcv.js} +1 -1
  103. package/src/assets/web-panel/assets/index-BCp2ir-1.js +1 -0
  104. package/src/assets/web-panel/assets/{index-BFydNU6a.js → index-BG-GaZri.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-mL3nOcH6.js → index-BPBia4b-.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-XGeQMvWK.js → index-BipwEbTA.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-D5sADPGY.js → index-BoskgPt9.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CV8qXTvb.js → index-Btqk6zWb.js} +1 -1
  109. package/src/assets/web-panel/assets/index-Bw4iuzRD.js +1 -0
  110. package/src/assets/web-panel/assets/{index-CJPks33Y.js → index-BzXjYUmd.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BBBUn5v7.js → index-C1ZAOJRW.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DiewptTL.js → index-CCLwoATF.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-OU8DZ9BL.js → index-CDfSD07S.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DvnywwUj.js → index-CLlP1E4X.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CT-3FYwd.js → index-CMCEXBRh.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-tZ5BUdad.js → index-CN8HZlLH.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DNlxihs8.js → index-CNKFsBlz.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CF3Lhyns.js → index-CUBkvFPH.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CV1UC4zo.js → index-Ca0mij1n.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DAkk1M7x.js → index-CbIAWbma.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DNEJzc0r.js → index-CbihMThv.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-q-s04OKn.js → index-CvOa-IFV.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BZB9q-Lp.js → index-Cvwu_rA_.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-oBsfUbyH.js → index-D-EJNxgR.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-ZY2Qs_Sn.js → index-D8uEL8Uw.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DtGValNi.js → index-D92g4l3n.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CpudmDhf.js → index-DCqpl_E_.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-Bo20BfdS.js → index-DLSBks8h.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CUSUzaB8.js → index-Db_5xhrU.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CZn6dmZe.js → index-DcDggpWR.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CGsvEbbq.js → index-DeWKPQGs.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-jx7kr6mB.js → index-DhVHoqGL.js} +3 -3
  133. package/src/assets/web-panel/assets/{index-BIrRX-ra.js → index-DyWlOuak.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-6CpOV3Pn.js → index-LU54bChK.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-6-2eYBXr.js → index-OjnAwUJo.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-B51otVoZ.js → index-P83LDnCz.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-ArMrnx0v.js → index-_-9k3Tna.js} +1 -1
  138. package/src/assets/web-panel/assets/{initDefaultProps-DGcX9iPP.js → initDefaultProps-CFNgY8lJ.js} +1 -1
  139. package/src/assets/web-panel/assets/{motion-2SeL1D8A.js → motion-D-5RrDzn.js} +1 -1
  140. package/src/assets/web-panel/assets/{move-3cYbQCpS.js → move-DN-L0Bd-.js} +1 -1
  141. package/src/assets/web-panel/assets/{mtc-parser-IDdxfw0z.js → mtc-parser-6mgLSeCK.js} +1 -1
  142. package/src/assets/web-panel/assets/{omit-BNswdKO6.js → omit-ClWW8eTP.js} +1 -1
  143. package/src/assets/web-panel/assets/{pickAttrs-BwCnem2I.js → pickAttrs-Vystq3R8.js} +1 -1
  144. package/src/assets/web-panel/assets/{placementArrow-B9PtZ5rq.js → placementArrow-D0H9hK4W.js} +1 -1
  145. package/src/assets/web-panel/assets/{responsiveObserve-CPB6iSzV.js → responsiveObserve-B3iNRU-a.js} +1 -1
  146. package/src/assets/web-panel/assets/{slide-DZgyblZa.js → slide-CiMXe6am.js} +1 -1
  147. package/src/assets/web-panel/assets/{statusUtils-D82IBdsx.js → statusUtils-CGDZJ1uT.js} +1 -1
  148. package/src/assets/web-panel/assets/{styleChecker-qSHtosM-.js → styleChecker-D2zA6NkY.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFlexGapSupport-CmWO7h0I.js → useFlexGapSupport-C1sYU6QE.js} +1 -1
  150. package/src/assets/web-panel/assets/{useFs-yLrs_ub4.js → useFs-BzUHSjg2.js} +1 -1
  151. package/src/assets/web-panel/assets/{usePersonalDataHub-CJ1VW6rh.js → usePersonalDataHub-CxB5yZCq.js} +1 -1
  152. package/src/assets/web-panel/assets/{vnode-CzY_moQ4.js → vnode-BfUfMwtc.js} +1 -1
  153. package/src/assets/web-panel/assets/{zoom-DAa7rEY5.js → zoom-CFYmj1TO.js} +1 -1
  154. package/src/assets/web-panel/index.html +1 -1
  155. package/src/command-help-index.json +2 -2
  156. package/src/command-manifest.json +2 -2
  157. package/src/commands/agent.js +80 -2
  158. package/src/commands/evolution.js +61 -42
  159. package/src/commands/learning.js +24 -8
  160. package/src/commands/serve.js +11 -2
  161. package/src/data/changelog.json +13 -0
  162. package/src/gateways/ws/session-protocol.js +1 -0
  163. package/src/gateways/ws/ws-agent-handler.js +70 -2
  164. package/src/gateways/ws/ws-server.js +8 -0
  165. package/src/lib/app-server/cli-agent-kernel-adapter.js +4 -0
  166. package/src/lib/app-server/graph-runtime.js +115 -8
  167. package/src/lib/app-server/server.js +21 -2
  168. package/src/lib/app-server/websocket-transport.js +2 -0
  169. package/src/lib/evolution/agent-evolution-ingress.js +300 -0
  170. package/src/lib/evolution/agent-evolution-runtime-composition-brand.js +22 -0
  171. package/src/lib/evolution/agent-evolution-runtime-composition.js +369 -0
  172. package/src/lib/evolution/bounded-skill-improvement-pilot.js +498 -0
  173. package/src/lib/evolution/evidence-backed-wiki-maintainer.js +752 -0
  174. package/src/lib/evolution/evolution-artifact-ports.js +48 -0
  175. package/src/lib/evolution/evolution-eval-gate.js +11 -4
  176. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +499 -0
  177. package/src/lib/evolution/evolution-evidence-projector.js +61 -1
  178. package/src/lib/evolution/evolution-file-witness.js +601 -0
  179. package/src/lib/evolution/evolution-ledger-file-backend.js +176 -0
  180. package/src/lib/evolution/evolution-ledger-ports.js +353 -16
  181. package/src/lib/evolution/evolution-ledger.js +1355 -54
  182. package/src/lib/evolution/evolution-run-ledger-adapter.js +409 -0
  183. package/src/lib/evolution/evolution-run-runtime-adapter.js +5 -0
  184. package/src/lib/evolution/evolution-run-wiki-maintenance-source.js +300 -0
  185. package/src/lib/evolution/scheduled-batch-wiki-maintenance-source.js +368 -0
  186. package/src/lib/evolution/skill-candidate-registry.js +649 -0
  187. package/src/lib/evolution/skill-evaluated-promotion-durability.js +899 -0
  188. package/src/lib/evolution/skill-evaluated-promotion.js +481 -0
  189. package/src/lib/evolution/skill-promotion-controller.js +220 -37
  190. package/src/lib/evolution/skill-promotion-review-ledger-adapter.js +451 -0
  191. package/src/lib/evolution/skill-promotion-review.js +793 -0
  192. package/src/lib/evolution/skill-registry-transition-capability.js +55 -0
  193. package/src/lib/evolution/skill-registry-transition-ledger-adapter.js +1280 -0
  194. package/src/lib/evolution/skill-registry-transition-source.js +372 -0
  195. package/src/lib/evolution/skill-release-registry.js +2191 -11
  196. package/src/lib/evolution/skill-target-matrix-eval.js +133 -10
  197. package/src/lib/evolution/structured-memory-agent-control-plane.js +222 -0
  198. package/src/lib/evolution/structured-memory-authority-ledger-adapter.js +351 -0
  199. package/src/lib/evolution/structured-memory-ledger-adapter.js +220 -0
  200. package/src/lib/evolution/structured-memory-policy-receipt-writer.js +164 -0
  201. package/src/lib/evolution/structured-memory-post-compact-hook.js +87 -0
  202. package/src/lib/evolution/structured-memory-promotion-receipt-writer.js +221 -0
  203. package/src/lib/evolution/structured-memory-semantic-review-pipeline.js +313 -0
  204. package/src/lib/evolution/wiki-informed-skill-proposer.js +343 -0
  205. package/src/lib/evolution/wiki-maintainer-ledger-adapter.js +200 -0
  206. package/src/lib/evolution/wiki-maintenance-trigger-ledger-adapter.js +687 -0
  207. package/src/lib/evolution-system.js +65 -30
  208. package/src/lib/graph-kernel/evolution-run-runtime-adapter.js +5 -0
  209. package/src/lib/hooks-v2-runtime.js +20 -0
  210. package/src/lib/mcp-lifecycle-authority.js +21 -2
  211. package/src/lib/remote-approval-bridge.js +24 -0
  212. package/src/lib/scheduler-kernel/store.js +62 -14
  213. package/src/repl/agent-repl.js +45 -0
  214. package/src/runtime/agent-core.js +68 -0
  215. package/src/runtime/agent-runtime.js +114 -1
  216. package/src/runtime/headless-runner.js +19 -0
  217. package/src/runtime/headless-stream.js +43 -0
  218. package/src/runtime/runtime-factory.js +19 -1
  219. package/src/assets/web-panel/assets/Projects-Ca9BAfu7.js +0 -1
  220. package/src/assets/web-panel/assets/devWarning-KO3pAGeO.js +0 -1
  221. package/src/assets/web-panel/assets/index-Bh4Rgkg2.js +0 -1
  222. package/src/assets/web-panel/assets/index-Dox_coTY.js +0 -1
  223. 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
- return this.deps.startAgentRepl(this.policy);
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
- }