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
@@ -108,7 +108,7 @@ export function loadFromDb(db) {
108
108
  } catch {
109
109
  parameters = {};
110
110
  }
111
- // keyed by id (matches trainIncremental modelId)
111
+ // keyed by id (matches recordIncrementalModelMetrics modelId)
112
112
  models.set(row.id, {
113
113
  id: row.id,
114
114
  name: row.name,
@@ -220,10 +220,19 @@ export function assessCapability(db, name, score, category = "general") {
220
220
  }
221
221
 
222
222
  /**
223
- * Incremental learning train a model with new data.
224
- * Accuracy formula: min(0.99, accuracy + 0.01 * log(1 + dataPoints))
223
+ * Record a synthetic model metric projection.
224
+ *
225
+ * This does not load a model, execute a trainer, update weights, or evaluate
226
+ * predictions. The legacy `accuracy` column is retained for database
227
+ * compatibility and stores only this formula estimate:
228
+ * min(0.99, previousEstimate + 0.01 * log(1 + dataPoints)).
225
229
  */
226
- export function trainIncremental(db, modelId, newData, options = {}) {
230
+ export function recordIncrementalModelMetrics(
231
+ db,
232
+ modelId,
233
+ newData,
234
+ options = {},
235
+ ) {
227
236
  ensureEvolutionTables(db);
228
237
  loadFromDb(db);
229
238
 
@@ -261,11 +270,11 @@ export function trainIncremental(db, modelId, newData, options = {}) {
261
270
  JSON.stringify(model.parameters),
262
271
  );
263
272
 
264
- // Log growth event
273
+ // Record an observation, not evidence that training or evaluation occurred.
265
274
  const logEntry = {
266
275
  id: crypto.randomUUID(),
267
- eventType: "model-training",
268
- description: `Trained ${modelId}: +${dataSize} data points, accuracy=${model.accuracy.toFixed(4)}`,
276
+ eventType: "model-metrics-recorded",
277
+ description: `Recorded formula metrics for ${modelId}: +${dataSize} data points, estimate=${model.accuracy.toFixed(4)}`,
269
278
  capabilityId: null,
270
279
  delta: dataSize,
271
280
  timestamp: new Date().toISOString(),
@@ -284,7 +293,20 @@ export function trainIncremental(db, modelId, newData, options = {}) {
284
293
  logEntry.timestamp,
285
294
  );
286
295
 
287
- return { ...model };
296
+ return {
297
+ ...model,
298
+ metricKind: "synthetic-formula-estimate",
299
+ status: "metrics_recorded",
300
+ performedTraining: false,
301
+ };
302
+ }
303
+
304
+ /**
305
+ * @deprecated Use recordIncrementalModelMetrics. This compatibility alias does
306
+ * not train a model and returns the same metrics-only record.
307
+ */
308
+ export function trainIncremental(db, modelId, newData, options = {}) {
309
+ return recordIncrementalModelMetrics(db, modelId, newData, options);
288
310
  }
289
311
 
290
312
  /**
@@ -435,7 +457,7 @@ export function selfRepair(db, issue) {
435
457
  break;
436
458
  }
437
459
  case "degraded-model": {
438
- // Reset low-accuracy models to retrain
460
+ // Reset low formula estimates for fresh metric collection.
439
461
  for (const [, model] of models) {
440
462
  if (model.accuracy < 0.6) {
441
463
  model.accuracy = 0.5;
@@ -446,7 +468,7 @@ export function selfRepair(db, issue) {
446
468
  db.prepare(
447
469
  `UPDATE evolution_models SET accuracy = ?, data_points = ?, updated_at = datetime('now') WHERE id = ?`,
448
470
  ).run(model.accuracy, model.dataPoints, model.id);
449
- actions.push(`Reset model ${model.id} for retraining`);
471
+ actions.push(`Reset metric record ${model.id} for reassessment`);
450
472
  }
451
473
  }
452
474
  break;
@@ -486,6 +508,7 @@ export function selfRepair(db, issue) {
486
508
  * Predict user behavior based on historical patterns.
487
509
  */
488
510
  export function predictBehavior(db, userId, options = {}) {
511
+ void options;
489
512
  ensureEvolutionTables(db);
490
513
  loadFromDb(db);
491
514
 
@@ -641,7 +664,7 @@ const TRAIN_STRATEGY = Object.freeze({
641
664
  });
642
665
 
643
666
  const _v2CapabilitiesByDim = new Map(); // dimension → { id, dimension, score, previousScore, trend, sampleCount, assessedAt, metadata }
644
- const _v2TrainingLog = []; // { id, strategy, dataSize, lossBefore, lossAfter, knowledgeRetention, durationMs, status, createdAt }
667
+ const _v2TrainingMetricRecords = []; // caller-supplied losses plus derived retention assessment
645
668
  const _v2DiagnosisById = new Map(); // diagnosisId → { id, scope, severity, anomaliesDetected, rootCause, repairSuggestion, repairStatus, repairedAt, createdAt }
646
669
  const _v2Milestones = []; // { id, type, description, capabilityId?, details, timestamp }
647
670
  const _v2Config = {
@@ -721,7 +744,11 @@ export function listCapabilitiesV2() {
721
744
  .sort((a, b) => a.dimension.localeCompare(b.dimension));
722
745
  }
723
746
 
724
- export function trainIncrementalV2({
747
+ /**
748
+ * Record caller-supplied before/after loss metrics and derive a retention
749
+ * ratio. No training, model mutation, or independent evaluation occurs.
750
+ */
751
+ export function recordTrainingMetricsV2({
725
752
  strategy,
726
753
  dataSize,
727
754
  lossBefore,
@@ -750,31 +777,39 @@ export function trainIncrementalV2({
750
777
  lossAfter,
751
778
  knowledgeRetention,
752
779
  durationMs,
753
- status:
780
+ retentionAssessment:
754
781
  knowledgeRetention >= _v2Config.knowledgeRetentionThreshold
755
- ? "completed"
782
+ ? "threshold_met"
756
783
  : "retention_low",
784
+ status: "metrics_recorded",
785
+ performedTraining: false,
757
786
  createdAt: Date.now(),
758
787
  };
759
- _v2TrainingLog.push(entry);
760
- if (entry.status === "completed" && lossAfter < lossBefore) {
761
- recordMilestone({
762
- type: GROWTH_MILESTONE.KNOWLEDGE_EXPANSION,
763
- description: `${strategy} training reduced loss ${lossBefore}→${lossAfter}`,
764
- details: { strategy, dataSize, knowledgeRetention },
765
- });
766
- }
788
+ _v2TrainingMetricRecords.push(entry);
767
789
  return { ...entry };
768
790
  }
769
791
 
770
- export function listTrainingLogV2({ strategy, limit } = {}) {
771
- let list = [..._v2TrainingLog];
792
+ /**
793
+ * @deprecated Use recordTrainingMetricsV2. This compatibility alias records
794
+ * metrics only and never reports training completion.
795
+ */
796
+ export function trainIncrementalV2(options) {
797
+ return recordTrainingMetricsV2(options);
798
+ }
799
+
800
+ export function listTrainingMetricRecordsV2({ strategy, limit } = {}) {
801
+ let list = [..._v2TrainingMetricRecords];
772
802
  if (strategy) list = list.filter((e) => e.strategy === strategy);
773
803
  list.sort((a, b) => b.createdAt - a.createdAt);
774
804
  if (Number.isFinite(limit) && limit > 0) list = list.slice(0, limit);
775
805
  return list;
776
806
  }
777
807
 
808
+ /** @deprecated Use listTrainingMetricRecordsV2. */
809
+ export function listTrainingLogV2({ strategy, limit } = {}) {
810
+ return listTrainingMetricRecordsV2({ strategy, limit });
811
+ }
812
+
778
813
  export function selfDiagnoseV2({ scope = "system", depth = "shallow" } = {}) {
779
814
  const anomalies = [];
780
815
  let severity = DIAGNOSIS_SEVERITY.NORMAL;
@@ -793,9 +828,9 @@ export function selfDiagnoseV2({ scope = "system", depth = "shallow" } = {}) {
793
828
  }
794
829
  }
795
830
 
796
- // Training retention anomalies
797
- const recentTrain = _v2TrainingLog.slice(-10);
798
- const lowRetention = recentTrain.filter(
831
+ // Retention anomalies in caller-supplied metric records.
832
+ const recentMetricRecords = _v2TrainingMetricRecords.slice(-10);
833
+ const lowRetention = recentMetricRecords.filter(
799
834
  (t) => t.knowledgeRetention < _v2Config.knowledgeRetentionThreshold,
800
835
  );
801
836
  if (lowRetention.length >= 3) {
@@ -814,7 +849,7 @@ export function selfDiagnoseV2({ scope = "system", depth = "shallow" } = {}) {
814
849
  rootCause = `Capability ${top.dimension} dropped sharply`;
815
850
  repairSuggestion = REPAIR_STRATEGY.PARAMETER_TUNE;
816
851
  } else if (top.type === "catastrophic_forgetting") {
817
- rootCause = "Knowledge retention below threshold in recent training";
852
+ rootCause = "Derived retention below threshold in recent metric records";
818
853
  repairSuggestion = REPAIR_STRATEGY.MODEL_ROLLBACK;
819
854
  }
820
855
  }
@@ -1028,7 +1063,7 @@ export function getEvolutionStatsV2() {
1028
1063
  }
1029
1064
  return {
1030
1065
  capabilityCount: _v2CapabilitiesByDim.size,
1031
- trainingRuns: _v2TrainingLog.length,
1066
+ trainingMetricRecords: _v2TrainingMetricRecords.length,
1032
1067
  diagnoses: { total: _v2DiagnosisById.size, bySeverity },
1033
1068
  milestones: { total: _v2Milestones.length, byType: byMilestone },
1034
1069
  };
@@ -1036,7 +1071,7 @@ export function getEvolutionStatsV2() {
1036
1071
 
1037
1072
  export function _resetV2State() {
1038
1073
  _v2CapabilitiesByDim.clear();
1039
- _v2TrainingLog.length = 0;
1074
+ _v2TrainingMetricRecords.length = 0;
1040
1075
  _v2DiagnosisById.clear();
1041
1076
  _v2Milestones.length = 0;
1042
1077
  _v2Config.enabled = true;
@@ -0,0 +1,5 @@
1
+ import evolutionRun from "@chainlesschain/session-core/evolution-run";
2
+
3
+ export function projectGraphEvolutionRun(events, options) {
4
+ return evolutionRun.projectEvolutionRun(events, options);
5
+ }
@@ -872,6 +872,26 @@ class HooksV2Runtime extends EventEmitter {
872
872
  }
873
873
  }
874
874
  for (const hook of asyncHooks) {
875
+ if (
876
+ options.skipAsyncWithoutDispatcher === true &&
877
+ typeof options.asyncDispatcher !== "function"
878
+ ) {
879
+ results.push({
880
+ execId: crypto.randomUUID(),
881
+ hookId: hook.id,
882
+ sourceHookId: hook.databaseHookId || hook.id,
883
+ hookName: hook.databaseHookName || hook.description || hook.id,
884
+ event: eventName,
885
+ type: hook.type,
886
+ priority: normalizeHookPriority(hook.priority),
887
+ executionMode: HOOK_EXECUTION_MODE.ASYNC,
888
+ status: "skipped",
889
+ decision: "continue",
890
+ deferred: false,
891
+ skipReason: "async_dispatcher_unavailable",
892
+ });
893
+ continue;
894
+ }
875
895
  const queued = {
876
896
  execId: crypto.randomUUID(),
877
897
  hookId: hook.id,
@@ -10,6 +10,7 @@
10
10
  */
11
11
 
12
12
  import crypto from "node:crypto";
13
+ import fs from "node:fs";
13
14
  import path from "node:path";
14
15
  import { getStatePath } from "./paths.js";
15
16
  import {
@@ -454,8 +455,26 @@ export class McpLifecycleAuthority {
454
455
 
455
456
  _read() {
456
457
  if (!this.statePath) return validateStore(structuredClone(this._memory));
457
- const value = readSecurityStore(this.statePath, "MCP lifecycle authority");
458
- return validateStore(value, { missing: Object.keys(value).length === 0 });
458
+ // A Windows replace can briefly make the destination path unobservable to
459
+ // an unlocked reader. Treating that ENOENT as an empty authority loses the
460
+ // server snapshot even though the replacement is about to become visible.
461
+ // Durable reads therefore share the exact strict lock used by mutations.
462
+ if (!fs.existsSync(path.dirname(this.statePath))) {
463
+ return validateStore({}, { missing: true });
464
+ }
465
+ return this._lock(
466
+ this.statePath,
467
+ () => {
468
+ const value = readSecurityStore(
469
+ this.statePath,
470
+ "MCP lifecycle authority",
471
+ );
472
+ return validateStore(value, {
473
+ missing: Object.keys(value).length === 0,
474
+ });
475
+ },
476
+ { timeoutMs: 2000, staleMs: 30000, failIfUnavailable: true },
477
+ );
459
478
  }
460
479
 
461
480
  _mutate(mutator) {
@@ -53,6 +53,7 @@ import {
53
53
  } from "./remote-control.js";
54
54
  import { logger } from "./logger.js";
55
55
  import { normalizeRemoteApprovalDecision } from "./remote-approval-decision.js";
56
+ import { captureStructuredMemoryPolicyReceiptWriter } from "./evolution/structured-memory-policy-receipt-writer.js";
56
57
 
57
58
  const DEFAULT_DECISION_TIMEOUT_MS = 5 * 60 * 1000;
58
59
  const REMOTE_LEASE_AUTHORIZATION_KIND =
@@ -102,6 +103,7 @@ export class RemoteApprovalBridge {
102
103
  membershipHostAuthorityLockFile = null,
103
104
  expectedCoordinatorPublicKeySha256 = null,
104
105
  onSecurityError = null,
106
+ memoryPolicyReceiptWriter = null,
105
107
  } = {}) {
106
108
  if (!wsUrl) throw new Error("wsUrl is required");
107
109
  if (!agentSessionId) throw new Error("agentSessionId is required");
@@ -122,6 +124,10 @@ export class RemoteApprovalBridge {
122
124
  this._securityErrors = [];
123
125
  this._onSecurityError =
124
126
  typeof onSecurityError === "function" ? onSecurityError : null;
127
+ this._memoryPolicyReceiptWriter =
128
+ memoryPolicyReceiptWriter === null
129
+ ? null
130
+ : captureStructuredMemoryPolicyReceiptWriter(memoryPolicyReceiptWriter);
125
131
  this._membershipHostStore =
126
132
  membershipHostStore === undefined
127
133
  ? () =>
@@ -1090,6 +1096,22 @@ export class RemoteApprovalBridge {
1090
1096
  ) {
1091
1097
  throw new Error("Consumed Remote approval statement binding changed");
1092
1098
  }
1099
+ if (this._memoryPolicyReceiptWriter !== null) {
1100
+ await this._memoryPolicyReceiptWriter.retainConsumedApproval({
1101
+ adopted,
1102
+ operation: {
1103
+ requestId: durableLease.requestId,
1104
+ fingerprint: durableLease.fingerprint,
1105
+ binding: durableLease.binding,
1106
+ toolName: descriptor.toolName,
1107
+ action: context.action ?? null,
1108
+ workspace: descriptor.workspace,
1109
+ session: descriptor.session,
1110
+ targetEnv: descriptor.targetEnv,
1111
+ policyVersion: descriptor.policyVersion,
1112
+ },
1113
+ });
1114
+ }
1093
1115
  return true;
1094
1116
  }
1095
1117
 
@@ -1310,6 +1332,7 @@ export async function startHeadlessRemoteApproval({
1310
1332
  writeErr = () => {},
1311
1333
  isText = false,
1312
1334
  decisionTimeoutMs = undefined,
1335
+ memoryPolicyReceiptWriter = null,
1313
1336
  deps = {},
1314
1337
  } = {}) {
1315
1338
  let effectiveConfig = config;
@@ -1374,6 +1397,7 @@ export async function startHeadlessRemoteApproval({
1374
1397
  agentSessionId,
1375
1398
  scopes: ["observe", "approve"],
1376
1399
  decisionTimeoutMs,
1400
+ memoryPolicyReceiptWriter,
1377
1401
  });
1378
1402
  try {
1379
1403
  await bridge.start();
@@ -37,6 +37,7 @@ const STORAGE_FAILURE_CODE_SET = new Set(STORAGE_FAILURE_CODES);
37
37
  export const SCHEDULER_APPLICATION_ID = 0x4343534b; // "CCSK"
38
38
  export const SCHEDULER_STORE_SCHEMA_VERSION = 6;
39
39
  export const DEFAULT_BUSY_TIMEOUT_MS = 5_000;
40
+ const SQLITE_BUSY_TRANSACTION_ATTEMPTS = 3;
40
41
  export const MAX_LEASE_MS = 24 * 60 * 60 * 1_000;
41
42
  export const MIN_AUTHORITY_WINDOW_MS = 60_000;
42
43
  export const MAX_AUTHORITY_WINDOW_MS = 31 * 24 * 60 * 60 * 1_000;
@@ -748,6 +749,26 @@ function findStorageFailureCode(error) {
748
749
  return null;
749
750
  }
750
751
 
752
+ function isSqliteBusy(error) {
753
+ const visited = new Set();
754
+ let current = error;
755
+ while (
756
+ current !== null &&
757
+ (typeof current === "object" || typeof current === "function") &&
758
+ !visited.has(current)
759
+ ) {
760
+ visited.add(current);
761
+ if (
762
+ typeof current.code === "string" &&
763
+ current.code.trim().toUpperCase().startsWith("SQLITE_BUSY")
764
+ ) {
765
+ return true;
766
+ }
767
+ current = current.cause;
768
+ }
769
+ return false;
770
+ }
771
+
751
772
  function storageUnavailableError({ phase, storageCode, commitState }) {
752
773
  return new SchedulerKernelError(
753
774
  "SCHEDULER_STORAGE_UNAVAILABLE",
@@ -2316,20 +2337,7 @@ export class SchedulerStore {
2316
2337
  this._assertOpen();
2317
2338
  let bodyState = "not_started";
2318
2339
  let bodyObservedTransaction = false;
2319
- try {
2320
- const transaction = this.db.transaction((...args) => {
2321
- bodyState = "running";
2322
- try {
2323
- bodyObservedTransaction = this.db.inTransaction === true;
2324
- } catch {
2325
- bodyObservedTransaction = false;
2326
- }
2327
- const result = callback(...args);
2328
- bodyState = "returned";
2329
- return result;
2330
- });
2331
- return transaction.immediate();
2332
- } catch (cause) {
2340
+ const failWrite = (cause) => {
2333
2341
  if (cause instanceof SchedulerKernelError) throw cause;
2334
2342
  const storageCode = findStorageFailureCode(cause);
2335
2343
  if (!storageCode) throw cause;
@@ -2353,7 +2361,47 @@ export class SchedulerStore {
2353
2361
  ? "not_committed"
2354
2362
  : "unknown",
2355
2363
  });
2364
+ };
2365
+ let transaction;
2366
+ try {
2367
+ transaction = this.db.transaction((...args) => {
2368
+ bodyState = "running";
2369
+ try {
2370
+ bodyObservedTransaction = this.db.inTransaction === true;
2371
+ } catch {
2372
+ bodyObservedTransaction = false;
2373
+ }
2374
+ const result = callback(...args);
2375
+ bodyState = "returned";
2376
+ return result;
2377
+ });
2378
+ } catch (cause) {
2379
+ return failWrite(cause);
2380
+ }
2381
+ for (
2382
+ let attempt = 1;
2383
+ attempt <= SQLITE_BUSY_TRANSACTION_ATTEMPTS;
2384
+ attempt += 1
2385
+ ) {
2386
+ bodyState = "not_started";
2387
+ bodyObservedTransaction = false;
2388
+ try {
2389
+ return transaction.immediate();
2390
+ } catch (cause) {
2391
+ // BEGIN IMMEDIATE can lose a cross-process writer race even after the
2392
+ // native busy timeout. Retrying is safe only while the callback has
2393
+ // never started, so application writes and side effects cannot repeat.
2394
+ if (
2395
+ bodyState === "not_started" &&
2396
+ isSqliteBusy(cause) &&
2397
+ attempt < SQLITE_BUSY_TRANSACTION_ATTEMPTS
2398
+ ) {
2399
+ continue;
2400
+ }
2401
+ return failWrite(cause);
2402
+ }
2356
2403
  }
2404
+ throw new Error("unreachable Scheduler transaction retry state");
2357
2405
  }
2358
2406
 
2359
2407
  _appendEvent({
@@ -171,6 +171,8 @@ import { resolveSlashMacro } from "./slash-macro.js";
171
171
  import { expandMcpPrompt, renderMcpSurface } from "./mcp-prompt.js";
172
172
  import { newCostStore, addUsage } from "./session-cost.js";
173
173
  import { extractPluginUsageAttribution } from "../lib/plugin-usage-attribution.js";
174
+ import { captureStructuredMemoryAgentControlPlane } from "../lib/evolution/structured-memory-agent-control-plane.js";
175
+ import { captureAgentEvolutionIngress } from "../lib/evolution/agent-evolution-ingress.js";
174
176
  import { formatManagedCheckpointEvent } from "../lib/managed-checkpoint-render.js";
175
177
  import { parseThinkCommand, parseEffortCommand } from "./think-command.js";
176
178
  import {
@@ -610,6 +612,10 @@ async function executeTool(name, args, context = {}) {
610
612
  * unit-testable via the `options._coreLoop` injection seam.
611
613
  */
612
614
  export async function agentLoop(messages, options) {
615
+ const evolutionIngress =
616
+ options.evolutionIngress == null
617
+ ? null
618
+ : captureAgentEvolutionIngress(options.evolutionIngress);
613
619
  const writeOut =
614
620
  options.writeOut || ((text) => process.stdout.write(String(text)));
615
621
  const waitForOutput = options.waitForOutput;
@@ -637,6 +643,13 @@ export async function agentLoop(messages, options) {
637
643
  collapseValidatedPlainReplTailInPlace(messages);
638
644
  }
639
645
  const usageEvents = [];
646
+ const currentUserMessage = messages.at(-1);
647
+ if (evolutionIngress !== null && currentUserMessage?.role === "user") {
648
+ await evolutionIngress.ingestUserPrompt({
649
+ content: currentUserMessage.content,
650
+ sessionId: options.sessionId || null,
651
+ });
652
+ }
640
653
  // Visible cross-vendor fallback notice: a silent switch from the configured
641
654
  // provider onto another vendor (or a baseUrl relabel) is surfaced as a yellow
642
655
  // line, so "configured X but it ran Y" never happens quietly. Callers may
@@ -757,6 +770,9 @@ export async function agentLoop(messages, options) {
757
770
  onToolCallSettlement,
758
771
  onProviderFallback,
759
772
  })) {
773
+ if (evolutionIngress !== null) {
774
+ await evolutionIngress.ingestAgentEvent(event);
775
+ }
760
776
  // P1 explicit turn→checkpoint binding — the REPL as PRODUCER: fold every
761
777
  // loop event into the live table (checkpoint / tool / policy / child
762
778
  // agent), mirroring the headless runner's feed. Advisory: a feeder failure
@@ -2909,10 +2925,38 @@ export function resolveReplPermanentMemoryStorage(
2909
2925
 
2910
2926
  /** Start the agentic REPL with non-overridable production bindings. */
2911
2927
  export async function startAgentRepl(options = {}) {
2928
+ const evolutionIngress =
2929
+ options.evolutionIngress == null
2930
+ ? null
2931
+ : captureAgentEvolutionIngress(options.evolutionIngress);
2932
+ const structuredMemoryControlPlane =
2933
+ options.structuredMemoryControlPlane == null
2934
+ ? null
2935
+ : captureStructuredMemoryAgentControlPlane(
2936
+ options.structuredMemoryControlPlane,
2937
+ );
2938
+ if (
2939
+ structuredMemoryControlPlane !== null &&
2940
+ options.memoryPolicyReceiptWriter != null &&
2941
+ options.memoryPolicyReceiptWriter !==
2942
+ structuredMemoryControlPlane.policyReceiptWriter
2943
+ ) {
2944
+ throw new Error(
2945
+ "Agent REPL received conflicting structured memory policy capabilities",
2946
+ );
2947
+ }
2912
2948
  const sessionHostLeaseScope = { lease: null };
2913
2949
  const sessionBudgetRootScope = { root: null };
2914
2950
  const runtimeOptions = {
2915
2951
  ...options,
2952
+ ...(evolutionIngress === null ? {} : { evolutionIngress }),
2953
+ ...(structuredMemoryControlPlane === null
2954
+ ? {}
2955
+ : {
2956
+ structuredMemoryControlPlane,
2957
+ memoryPolicyReceiptWriter:
2958
+ structuredMemoryControlPlane.policyReceiptWriter,
2959
+ }),
2916
2960
  _sessionHostLeaseScope: sessionHostLeaseScope,
2917
2961
  _sessionBudgetRootScope: sessionBudgetRootScope,
2918
2962
  };
@@ -3949,6 +3993,7 @@ async function startAgentReplInWorkspaceOwned(
3949
3993
  isText: false, // the REPL prints its own pairing lines below
3950
3994
  allowLan: options.remoteControlAllowLan === true,
3951
3995
  env: process.env,
3996
+ memoryPolicyReceiptWriter: options.memoryPolicyReceiptWriter ?? null,
3952
3997
  });
3953
3998
  _remoteApproval = {
3954
3999
  bridge: started.bridge,
@@ -19,7 +19,10 @@ import path from "path";
19
19
  import broker from "../lib/process-execution-broker/index.js";
20
20
  import os from "os";
21
21
  import { createHash, randomUUID } from "node:crypto";
22
+ import skillInvocationReceipt from "@chainlesschain/session-core/skill-invocation-receipt";
22
23
  import { isProxy } from "node:util/types";
24
+
25
+ const { startSkillInvocation, settleSkillInvocation } = skillInvocationReceipt;
23
26
  import sharedCodingAgentPolicy from "./coding-agent-policy.cjs";
24
27
  import sharedShellPolicy from "./coding-agent-shell-policy.cjs";
25
28
  import sharedPermissionRules from "../lib/permission-rules.cjs";
@@ -3570,6 +3573,8 @@ export async function executeTool(name, args, context = {}) {
3570
3573
  onProviderReceipt: context.onProviderReceipt || null,
3571
3574
  onToolCallBoundary: context.onToolCallBoundary || null,
3572
3575
  onToolCallSettlement: context.onToolCallSettlement || null,
3576
+ hookTraceId: context.hookTraceId || null,
3577
+ skillLifecycleMode: context.skillLifecycleMode || "active",
3573
3578
  backgroundUsageFailureState: context.backgroundUsageFailureState || null,
3574
3579
  planManager,
3575
3580
  permissionRules: context.permissionRules || null,
@@ -3707,6 +3712,7 @@ export async function executeTool(name, args, context = {}) {
3707
3712
  { cwd, broker },
3708
3713
  )
3709
3714
  : null,
3715
+ skipAsyncWithoutDispatcher: true,
3710
3716
  },
3711
3717
  );
3712
3718
  for (const hookResult of outcome.results || []) {
@@ -5151,6 +5157,7 @@ async function executeToolInner(
5151
5157
  // Hook-envelope tracing: this run's trace id, threaded into child loops
5152
5158
  // (spawn_sub_agent / isolated run_skill) as their parent_id.
5153
5159
  hookTraceId = null,
5160
+ skillLifecycleMode = "active",
5154
5161
  },
5155
5162
  ) {
5156
5163
  const localToolDescriptor =
@@ -7866,6 +7873,63 @@ async function executeToolInner(
7866
7873
  });
7867
7874
  }
7868
7875
 
7876
+ const selectedSkillDigest =
7877
+ match.executionIdentity?.contentDigest ||
7878
+ `sha256:${createHash("sha256").update(admittedSkillBody).digest("hex")}`;
7879
+ const toolSetDigest = `sha256:${createHash("sha256")
7880
+ .update(
7881
+ JSON.stringify(
7882
+ [...(effectiveAllowedToolNames || [])].map(String).sort(),
7883
+ ),
7884
+ )
7885
+ .digest("hex")}`;
7886
+ const policyDigest = `sha256:${createHash("sha256")
7887
+ .update(
7888
+ JSON.stringify({
7889
+ hasApprovalGate: Boolean(approvalGate),
7890
+ hasPermissionRules: Boolean(permissionRules),
7891
+ hasSandbox: Boolean(sandbox),
7892
+ hermeticExecution: hermeticExecution === true,
7893
+ }),
7894
+ )
7895
+ .digest("hex")}`;
7896
+ const invocationStartedAt = Date.now();
7897
+ const invocationStart = startSkillInvocation({
7898
+ attributionRequired: ["automatic-candidate", "canary"].includes(
7899
+ skillLifecycleMode,
7900
+ ),
7901
+ evolutionRunId: workflowEffectId || sessionId,
7902
+ traceId: hookTraceId || sessionId,
7903
+ trajectorySegmentId: turnId || toolCallId,
7904
+ selectedSkillDigest,
7905
+ routerCandidates: [
7906
+ {
7907
+ digest: selectedSkillDigest,
7908
+ score: 1,
7909
+ reason: "explicit-run_skill",
7910
+ },
7911
+ ],
7912
+ providerModelVersion:
7913
+ llmOptions?.provider && llmOptions?.model
7914
+ ? `${llmOptions.provider}:${llmOptions.model}`
7915
+ : null,
7916
+ toolSetDigest,
7917
+ osSandboxPermissionPolicyDigest: policyDigest,
7918
+ taskCohort: "cli:run_skill",
7919
+ });
7920
+ const settleInvocation = (executionStatus, result = {}) =>
7921
+ settleSkillInvocation(invocationStart, {
7922
+ executionStatus,
7923
+ graderReceipts: result.graderReceipts || [],
7924
+ userCorrectionRef: result.userCorrectionRef || null,
7925
+ tokensInput:
7926
+ result.usage?.inputTokens || result.usage?.tokensInput || 0,
7927
+ tokensOutput:
7928
+ result.usage?.outputTokens || result.usage?.tokensOutput || 0,
7929
+ costUsd: result.usage?.costUsd || result.costUsd || 0,
7930
+ latencyMs: Date.now() - invocationStartedAt,
7931
+ });
7932
+
7869
7933
  // Check if skill requests isolation (via SKILL.md frontmatter)
7870
7934
  const skillIsolation = match.isolation === true;
7871
7935
  if (skillIsolation) {
@@ -8066,6 +8130,7 @@ async function executeToolInner(
8066
8130
  success: false,
8067
8131
  isolated: true,
8068
8132
  skill: args.skill_name,
8133
+ invocationReceipt: settleInvocation("failed", result),
8069
8134
  code: result?.code || "CC_SKILL_ISOLATED_EXECUTION_FAILED",
8070
8135
  error: `Isolated skill execution failed: ${failureDetail}`,
8071
8136
  ...(result?.summary ? { summary: result.summary } : {}),
@@ -8075,6 +8140,7 @@ async function executeToolInner(
8075
8140
  success: true,
8076
8141
  isolated: true,
8077
8142
  skill: args.skill_name,
8143
+ invocationReceipt: settleInvocation("completed", result),
8078
8144
  summary: result.summary,
8079
8145
  toolsUsed: result.toolsUsed,
8080
8146
  });
@@ -8096,6 +8162,7 @@ async function executeToolInner(
8096
8162
  success: false,
8097
8163
  isolated: true,
8098
8164
  skill: args.skill_name,
8165
+ invocationReceipt: settleInvocation("failed"),
8099
8166
  code: err?.code || "CC_SKILL_ISOLATED_EXECUTION_FAILED",
8100
8167
  error: `Isolated skill execution failed: ${err.message}`,
8101
8168
  });
@@ -8112,6 +8179,7 @@ async function executeToolInner(
8112
8179
  return attachDescriptor({
8113
8180
  error: `Skill "${args.skill_name}" cannot execute handler.js directly. Add isolation: true and use the controlled agent-tool path.`,
8114
8181
  code: "CC_SKILL_DIRECT_HANDLER_BLOCKED",
8182
+ invocationReceipt: settleInvocation("blocked"),
8115
8183
  policy: { decision: "blocked", via: "skill-execution-boundary" },
8116
8184
  });
8117
8185
  }