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