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
@@ -0,0 +1,164 @@
1
+ import { createHash } from "node:crypto";
2
+ import structuredMemory from "@chainlesschain/session-core/structured-evolution-memory";
3
+
4
+ const { createStructuredMemoryAuthorityReceipt } = structuredMemory;
5
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
6
+ const HOST_DIGEST = /^[a-f0-9]{64}$/u;
7
+ const WRITERS = new WeakSet();
8
+
9
+ function canonical(value) {
10
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
11
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
12
+ return `{${Object.keys(value)
13
+ .sort()
14
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
15
+ .join(",")}}`;
16
+ }
17
+
18
+ function hash(value) {
19
+ return `sha256:${createHash("sha256").update(value).digest("hex")}`;
20
+ }
21
+
22
+ function requiredString(value, name) {
23
+ if (typeof value !== "string" || value.trim() === "") {
24
+ throw new TypeError(`${name} is required`);
25
+ }
26
+ return value;
27
+ }
28
+
29
+ function requiredDigest(value, name) {
30
+ if (!DIGEST.test(value || "")) {
31
+ throw new TypeError(`${name} must be sha256-bound`);
32
+ }
33
+ return value;
34
+ }
35
+
36
+ function capture(owner, name) {
37
+ if (typeof owner?.[name] !== "function") {
38
+ throw new TypeError(`${name} port is required`);
39
+ }
40
+ return (...args) => Reflect.apply(owner[name], owner, args);
41
+ }
42
+
43
+ function normalizeDescriptor(input) {
44
+ if (
45
+ !Number.isSafeInteger(input?.issuerRevision) ||
46
+ input.issuerRevision < 1
47
+ ) {
48
+ throw new TypeError("issuerRevision must be a positive integer");
49
+ }
50
+ return Object.freeze({
51
+ tenantId: requiredString(input.tenantId, "tenantId"),
52
+ issuerId: requiredString(input.issuerId, "issuerId"),
53
+ issuerRevision: input.issuerRevision,
54
+ issuerHandlerDigest: requiredDigest(
55
+ input.issuerHandlerDigest,
56
+ "issuerHandlerDigest",
57
+ ),
58
+ });
59
+ }
60
+
61
+ function verifyConsumedApproval(adopted, operation) {
62
+ const payload = adopted?.payload;
63
+ if (
64
+ !(
65
+ (adopted?.adopted === true && adopted.replayed === false) ||
66
+ (adopted?.adopted === false && adopted.replayed === true)
67
+ ) ||
68
+ !HOST_DIGEST.test(adopted.statementDigest || "") ||
69
+ !HOST_DIGEST.test(adopted.receiptHash || "") ||
70
+ payload?.status !== "consumed" ||
71
+ payload.requestId !== operation.requestId ||
72
+ payload.fingerprint !== operation.fingerprint ||
73
+ payload.binding !== operation.binding
74
+ ) {
75
+ throw new Error(
76
+ "policy receipt requires a durably adopted consumed approval",
77
+ );
78
+ }
79
+ return payload;
80
+ }
81
+
82
+ export function createStructuredMemoryPolicyReceiptWriter({
83
+ descriptor: input,
84
+ authorityStore,
85
+ attestor,
86
+ clock = () => new Date().toISOString(),
87
+ } = {}) {
88
+ const descriptor = normalizeDescriptor(input);
89
+ const retainReceipt = capture(authorityStore, "retainReceipt");
90
+ const attest = capture(attestor, "attest");
91
+ if (typeof clock !== "function")
92
+ throw new TypeError("clock must be a function");
93
+
94
+ const writer = Object.freeze({
95
+ descriptor,
96
+ async retainConsumedApproval({ adopted, operation } = {}) {
97
+ const payload = verifyConsumedApproval(adopted, operation || {});
98
+ const issuedAt = requiredString(clock(), "issuedAt");
99
+ if (!Number.isFinite(Date.parse(issuedAt))) {
100
+ throw new TypeError("issuedAt must be an ISO timestamp");
101
+ }
102
+ const operationCore = Object.freeze({
103
+ requestId: payload.requestId,
104
+ fingerprint: payload.fingerprint,
105
+ binding: payload.binding,
106
+ toolName: operation.toolName ?? null,
107
+ action: operation.action ?? null,
108
+ workspace: operation.workspace ?? null,
109
+ session: operation.session ?? null,
110
+ targetEnv: operation.targetEnv ?? null,
111
+ policyVersion: operation.policyVersion ?? null,
112
+ });
113
+ const receipt = createStructuredMemoryAuthorityReceipt({
114
+ tenantId: descriptor.tenantId,
115
+ kind: "policy",
116
+ decision: "accepted",
117
+ memoryId: `remote-approval:${payload.requestId}:${adopted.statementDigest}`,
118
+ layer: "policy",
119
+ action: "accept",
120
+ contentDigest: hash(canonical(operationCore)),
121
+ artifactRef: adopted.statementDigest,
122
+ evidenceRefs: [adopted.receiptHash, adopted.statementDigest].sort(),
123
+ issuerId: descriptor.issuerId,
124
+ issuerRevision: descriptor.issuerRevision,
125
+ issuerHandlerDigest: descriptor.issuerHandlerDigest,
126
+ issuedAt,
127
+ });
128
+ const attestation = await attest({
129
+ purpose: "structured-memory-policy-receipt",
130
+ payloadDigest: receipt.receiptDigest,
131
+ receipt,
132
+ operation: operationCore,
133
+ });
134
+ if (attestation === null || attestation === undefined) {
135
+ throw new Error("policy receipt attestor returned no attestation");
136
+ }
137
+ const signed = Object.freeze({ ...receipt, attestation });
138
+ const retained = await retainReceipt(signed);
139
+ if (
140
+ retained?.persisted !== true ||
141
+ retained.receiptDigest !== receipt.receiptDigest
142
+ ) {
143
+ throw new Error("policy receipt was not durably acknowledged");
144
+ }
145
+ return signed;
146
+ },
147
+ });
148
+ WRITERS.add(writer);
149
+ return writer;
150
+ }
151
+
152
+ export function captureStructuredMemoryPolicyReceiptWriter(value) {
153
+ if (!WRITERS.has(value)) {
154
+ throw new TypeError(
155
+ "a branded structured memory policy writer is required",
156
+ );
157
+ }
158
+ const captured = Object.freeze({
159
+ descriptor: value.descriptor,
160
+ retainConsumedApproval: capture(value, "retainConsumedApproval"),
161
+ });
162
+ WRITERS.add(captured);
163
+ return captured;
164
+ }
@@ -0,0 +1,87 @@
1
+ import { createHash } from "node:crypto";
2
+ import structuredMemory from "@chainlesschain/session-core/structured-evolution-memory";
3
+ import { executeHooksV2Event } from "../hooks-v2-producers.js";
4
+
5
+ const {
6
+ STRUCTURED_MEMORY_POST_COMPACT_VERIFICATION_SCHEMA,
7
+ createStructuredMemoryPostCompactVerifier,
8
+ } = structuredMemory;
9
+
10
+ const ATTESTATION_DOMAIN = "chainlesschain.structured-memory-post-compact-hook/v1\0";
11
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
12
+
13
+ function canonical(value) {
14
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
15
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
16
+ return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`).join(",")}}`;
17
+ }
18
+
19
+ function hash(value) {
20
+ return `sha256:${createHash("sha256").update(canonical(value)).digest("hex")}`;
21
+ }
22
+
23
+ function requiredString(value, name) {
24
+ if (typeof value !== "string" || value.trim() === "") throw new TypeError(`${name} is required`);
25
+ return value;
26
+ }
27
+
28
+ function capture(owner, name) {
29
+ if (typeof owner?.[name] !== "function") throw new TypeError(`${name} port is required`);
30
+ return (...args) => Reflect.apply(owner[name], owner, args);
31
+ }
32
+
33
+ function descriptor(input) {
34
+ if (!Number.isSafeInteger(input?.authorityRevision) || input.authorityRevision <= 0) {
35
+ throw new TypeError("authorityRevision must be a positive integer");
36
+ }
37
+ if (!DIGEST.test(input?.handlerDigest || "")) throw new TypeError("handlerDigest must be sha256-bound");
38
+ return Object.freeze({ tenantId: requiredString(input.tenantId, "tenantId"),
39
+ authorityId: requiredString(input.authorityId, "authorityId"), authorityRevision: input.authorityRevision,
40
+ handlerDigest: input.handlerDigest });
41
+ }
42
+
43
+ function outcomeSummary(outcome) {
44
+ const results = Array.isArray(outcome?.results) ? outcome.results : [];
45
+ return Object.freeze({ success: outcome?.success === true, blocked: outcome?.blocked === true,
46
+ decision: typeof outcome?.decision === "string" ? outcome.decision : null,
47
+ resultCount: results.length,
48
+ statuses: Object.freeze(results.map((result) => String(result?.status || "unknown")).sort()) });
49
+ }
50
+
51
+ function attestationMessage(result) {
52
+ const core = Object.fromEntries(Object.entries(result).filter(([key]) => key !== "signature"));
53
+ return `${ATTESTATION_DOMAIN}${canonical(core)}`;
54
+ }
55
+
56
+ export function createCliStructuredMemoryPostCompactVerifier({ descriptor: input,
57
+ hookExecutor = executeHooksV2Event, attestor, clock = Date.now } = {}) {
58
+ const identity = descriptor(input);
59
+ if (typeof hookExecutor !== "function") throw new TypeError("hookExecutor must be a function");
60
+ if (typeof clock !== "function") throw new TypeError("clock must be a function");
61
+ const sign = capture(attestor, "sign");
62
+ const verify = capture(attestor, "verify");
63
+ const hook = { run: async (request) => {
64
+ const outcome = await hookExecutor("PostCompact", { schema_version: 1, trigger: "structured-memory",
65
+ tenant_id: identity.tenantId, snapshot_digest: request.snapshotDigest,
66
+ projection_digest: request.projectionDigest, previous_snapshot_digest: request.previousSnapshotDigest,
67
+ candidate: request.candidate }, { failClosed: true });
68
+ const summary = outcomeSummary(outcome);
69
+ const accepted = summary.success && !summary.blocked && summary.decision !== "block" &&
70
+ summary.resultCount > 0 && summary.statuses.every((status) => status === "success");
71
+ const unsigned = { schema: STRUCTURED_MEMORY_POST_COMPACT_VERIFICATION_SCHEMA, authenticated: true,
72
+ ...identity, snapshotDigest: request.snapshotDigest, projectionDigest: request.projectionDigest,
73
+ previousSnapshotDigest: request.previousSnapshotDigest, decision: accepted ? "accepted" : "rejected",
74
+ checkedAt: new Date(clock()).toISOString(), hookOutcomeDigest: hash(summary) };
75
+ const receiptDigest = hash({ domain: ATTESTATION_DOMAIN, result: unsigned });
76
+ const result = { ...unsigned, receiptDigest };
77
+ const signature = await sign({ message: attestationMessage(result), identity, result: Object.freeze({ ...result }) });
78
+ return Object.freeze({ ...result, signature });
79
+ } };
80
+ return createStructuredMemoryPostCompactVerifier({ descriptor: identity, hook,
81
+ verifier: { verify: async ({ result }) => {
82
+ const expectedDigest = hash({ domain: ATTESTATION_DOMAIN,
83
+ result: Object.fromEntries(Object.entries(result).filter(([key]) => !["receiptDigest", "signature"].includes(key))) });
84
+ if (result.receiptDigest !== expectedDigest) return false;
85
+ return await verify({ message: attestationMessage(result), identity, result });
86
+ } } });
87
+ }
@@ -0,0 +1,221 @@
1
+ import { createHash } from "node:crypto";
2
+ import structuredMemory from "@chainlesschain/session-core/structured-evolution-memory";
3
+ import { buildSkillEvaluatedPromotionReceiptEnvelope } from "./skill-evaluated-promotion.js";
4
+ import { digestSkillMutationReceiptEnvelope } from "./skill-mutation-authority.js";
5
+ import { SKILL_TARGET_MATRIX_EVAL_RECEIPT_SCHEMA } from "./skill-target-matrix-eval.js";
6
+
7
+ const { createStructuredMemoryAuthorityReceipt } = structuredMemory;
8
+ const SKILL_RELEASE_RECEIPT_SCHEMA =
9
+ "chainlesschain.skill-release-transition-receipt/v4";
10
+ const SKILL_PROMOTION_REVIEW_ENVELOPE_SCHEMA =
11
+ "chainlesschain.skill-promotion-review-envelope/v1";
12
+ const RELEASE_RECEIPT_DOMAIN = `${SKILL_RELEASE_RECEIPT_SCHEMA}\0`;
13
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
14
+ const WRITERS = new WeakSet();
15
+
16
+ function canonical(value) {
17
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
18
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
19
+ return `{${Object.keys(value)
20
+ .sort()
21
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
22
+ .join(",")}}`;
23
+ }
24
+
25
+ function hash(value) {
26
+ return `sha256:${createHash("sha256").update(value).digest("hex")}`;
27
+ }
28
+
29
+ function requiredString(value, name) {
30
+ if (typeof value !== "string" || value.trim() === "") {
31
+ throw new TypeError(`${name} is required`);
32
+ }
33
+ return value;
34
+ }
35
+
36
+ function requiredDigest(value, name) {
37
+ if (!DIGEST.test(value || "")) {
38
+ throw new TypeError(`${name} must be sha256-bound`);
39
+ }
40
+ return value;
41
+ }
42
+
43
+ function capture(owner, name) {
44
+ if (typeof owner?.[name] !== "function") {
45
+ throw new TypeError(`${name} port is required`);
46
+ }
47
+ return (...args) => Reflect.apply(owner[name], owner, args);
48
+ }
49
+
50
+ function normalizeDescriptor(input) {
51
+ if (
52
+ !Number.isSafeInteger(input?.issuerRevision) ||
53
+ input.issuerRevision < 1
54
+ ) {
55
+ throw new TypeError("issuerRevision must be a positive integer");
56
+ }
57
+ return Object.freeze({
58
+ tenantId: requiredString(input.tenantId, "tenantId"),
59
+ issuerId: requiredString(input.issuerId, "issuerId"),
60
+ issuerRevision: input.issuerRevision,
61
+ issuerHandlerDigest: requiredDigest(
62
+ input.issuerHandlerDigest,
63
+ "issuerHandlerDigest",
64
+ ),
65
+ });
66
+ }
67
+
68
+ function verifyPromotion(result, matrixBinding, reviewBinding, tenantId) {
69
+ const release = result?.release;
70
+ const state = result?.state;
71
+ const receipt = result?.receipt;
72
+ if (
73
+ receipt?.schema !== SKILL_RELEASE_RECEIPT_SCHEMA ||
74
+ receipt.operation !== "promote" ||
75
+ receipt.tenantId !== tenantId ||
76
+ release?.tenantId !== tenantId ||
77
+ state?.tenantId !== tenantId ||
78
+ receipt.skillName !== release.skillName ||
79
+ state.skillName !== release.skillName ||
80
+ receipt.activeReleaseDigest !== release.releaseDigest ||
81
+ state.activeReleaseDigest !== release.releaseDigest ||
82
+ !DIGEST.test(release.releaseDigest || "") ||
83
+ !DIGEST.test(release.contentDigest || "") ||
84
+ !DIGEST.test(receipt.receiptDigest || "")
85
+ ) {
86
+ throw new Error("promotion result is not a committed release transition");
87
+ }
88
+ const core = structuredClone(receipt);
89
+ delete core.receiptDigest;
90
+ if (
91
+ hash(`${RELEASE_RECEIPT_DOMAIN}${canonical(core)}`) !==
92
+ receipt.receiptDigest
93
+ ) {
94
+ throw new Error("promotion transition receipt digest is invalid");
95
+ }
96
+ const evidenceRefs = [receipt.receiptDigest];
97
+ if (matrixBinding !== null) {
98
+ const expectedEvalReceiptDigest = digestSkillMutationReceiptEnvelope(
99
+ buildSkillEvaluatedPromotionReceiptEnvelope({
100
+ schema: SKILL_TARGET_MATRIX_EVAL_RECEIPT_SCHEMA,
101
+ receiptDigest: matrixBinding.matrixReceiptDigest,
102
+ }),
103
+ );
104
+ if (
105
+ matrixBinding?.tenantId !== tenantId ||
106
+ matrixBinding.skillName !== release.skillName ||
107
+ matrixBinding.candidateContentDigest !== release.contentDigest ||
108
+ !DIGEST.test(matrixBinding.matrixReceiptDigest || "") ||
109
+ receipt.receiptDigests?.eval !== expectedEvalReceiptDigest
110
+ ) {
111
+ throw new Error(
112
+ "matrix binding does not authorize the committed release",
113
+ );
114
+ }
115
+ evidenceRefs.push(matrixBinding.matrixReceiptDigest);
116
+ }
117
+ if (reviewBinding !== null) {
118
+ const reviewEnvelope = canonical({
119
+ schema: SKILL_PROMOTION_REVIEW_ENVELOPE_SCHEMA,
120
+ receiptDigest: reviewBinding.reviewReceiptDigest,
121
+ });
122
+ const expectedPolicyReceiptDigest =
123
+ digestSkillMutationReceiptEnvelope(reviewEnvelope);
124
+ if (
125
+ reviewBinding?.tenantId !== tenantId ||
126
+ reviewBinding.skillName !== release.skillName ||
127
+ reviewBinding.candidateId !== release.candidateId ||
128
+ !DIGEST.test(reviewBinding.reviewReceiptDigest || "") ||
129
+ !DIGEST.test(reviewBinding.packetDigest || "") ||
130
+ !DIGEST.test(reviewBinding.capabilityDiffDigest || "") ||
131
+ !DIGEST.test(reviewBinding.candidateDiffDigest || "") ||
132
+ !DIGEST.test(reviewBinding.contentRiskDigest || "") ||
133
+ reviewBinding.matrixReceiptDigest !==
134
+ matrixBinding?.matrixReceiptDigest ||
135
+ receipt.receiptDigests?.policy !== expectedPolicyReceiptDigest
136
+ ) {
137
+ throw new Error(
138
+ "human review binding does not authorize the committed release",
139
+ );
140
+ }
141
+ evidenceRefs.push(reviewBinding.reviewReceiptDigest);
142
+ }
143
+ return { release, receipt, evidenceRefs: [...new Set(evidenceRefs)].sort() };
144
+ }
145
+
146
+ export function createStructuredMemoryPromotionReceiptWriter({
147
+ descriptor: input,
148
+ authorityStore,
149
+ attestor,
150
+ clock = () => new Date().toISOString(),
151
+ } = {}) {
152
+ const descriptor = normalizeDescriptor(input);
153
+ const retainReceipt = capture(authorityStore, "retainReceipt");
154
+ const attest = capture(attestor, "attest");
155
+ if (typeof clock !== "function")
156
+ throw new TypeError("clock must be a function");
157
+
158
+ const writer = Object.freeze({
159
+ descriptor,
160
+ async retainPromotion(result, matrixBinding = null, reviewBinding = null) {
161
+ const verified = verifyPromotion(
162
+ result,
163
+ matrixBinding,
164
+ reviewBinding,
165
+ descriptor.tenantId,
166
+ );
167
+ const issuedAt = requiredString(clock(), "issuedAt");
168
+ if (!Number.isFinite(Date.parse(issuedAt))) {
169
+ throw new TypeError("issuedAt must be an ISO timestamp");
170
+ }
171
+ const receipt = createStructuredMemoryAuthorityReceipt({
172
+ tenantId: descriptor.tenantId,
173
+ kind: "promotion",
174
+ decision: "accepted",
175
+ memoryId: `skill-release:${verified.release.skillName}:${verified.release.releaseDigest}`,
176
+ layer: "procedural",
177
+ action: "accept",
178
+ contentDigest: verified.release.contentDigest,
179
+ artifactRef: verified.release.releaseDigest,
180
+ evidenceRefs: verified.evidenceRefs,
181
+ issuerId: descriptor.issuerId,
182
+ issuerRevision: descriptor.issuerRevision,
183
+ issuerHandlerDigest: descriptor.issuerHandlerDigest,
184
+ issuedAt,
185
+ });
186
+ const attestation = await attest({
187
+ purpose: "structured-memory-promotion-receipt",
188
+ payloadDigest: receipt.receiptDigest,
189
+ receipt,
190
+ });
191
+ if (attestation === null || attestation === undefined) {
192
+ throw new Error("promotion receipt attestor returned no attestation");
193
+ }
194
+ const signed = Object.freeze({ ...receipt, attestation });
195
+ const retained = await retainReceipt(signed);
196
+ if (
197
+ retained?.persisted !== true ||
198
+ retained.receiptDigest !== receipt.receiptDigest
199
+ ) {
200
+ throw new Error("promotion receipt was not durably acknowledged");
201
+ }
202
+ return signed;
203
+ },
204
+ });
205
+ WRITERS.add(writer);
206
+ return writer;
207
+ }
208
+
209
+ export function captureStructuredMemoryPromotionReceiptWriter(value) {
210
+ if (!WRITERS.has(value)) {
211
+ throw new TypeError(
212
+ "a branded structured memory promotion writer is required",
213
+ );
214
+ }
215
+ const captured = Object.freeze({
216
+ descriptor: value.descriptor,
217
+ retainPromotion: capture(value, "retainPromotion"),
218
+ });
219
+ WRITERS.add(captured);
220
+ return captured;
221
+ }