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,368 @@
1
+ import { createHash } from "node:crypto";
2
+ import { types as utilTypes } from "node:util";
3
+
4
+ import { SchedulerStore } from "../scheduler-kernel/store.js";
5
+ import {
6
+ WIKI_MAINTENANCE_TRIGGER_KIND,
7
+ WikiMaintenanceTriggerLedgerAdapter,
8
+ } from "./wiki-maintenance-trigger-ledger-adapter.js";
9
+
10
+ export const SCHEDULED_BATCH_WIKI_MAINTENANCE_SOURCE_SCHEMA =
11
+ "chainlesschain.scheduled-batch-wiki-maintenance-source/v1";
12
+ export const SCHEDULED_BATCH_WIKI_MAINTENANCE_PRODUCER_SCHEMA =
13
+ "chainlesschain.scheduled-batch-wiki-maintenance-producer/v1";
14
+ export const SCHEDULED_BATCH_WIKI_MAINTENANCE_JOB_SCHEMA =
15
+ "chainlesschain.scheduled-batch-wiki-maintenance-job/v1";
16
+ export const SCHEDULED_BATCH_WIKI_MAINTENANCE_RESULT_SCHEMA =
17
+ "chainlesschain.scheduled-batch-wiki-maintenance-result/v1";
18
+ export const SCHEDULED_BATCH_WIKI_MAINTENANCE_INVALID_CODE =
19
+ "CC_SCHEDULED_BATCH_WIKI_MAINTENANCE_INVALID";
20
+
21
+ const SOURCES = new WeakSet();
22
+ const PRODUCERS = new WeakSet();
23
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
24
+ const BUILD_KEYS = new Set(["occurrenceId"]);
25
+ const VERIFY_KEYS = new Set([
26
+ "tenantId",
27
+ "kind",
28
+ "sourceId",
29
+ "sourceReceiptDigest",
30
+ "evidenceRefs",
31
+ "effectiveAt",
32
+ ]);
33
+ const JOB_PAYLOAD_KEYS = new Set([
34
+ "schema",
35
+ "tenantId",
36
+ "evidenceSelectorDigest",
37
+ ]);
38
+ const RESULT_KEYS = new Set([
39
+ "schema",
40
+ "tenantId",
41
+ "evidenceRefs",
42
+ "evidenceSetDigest",
43
+ ]);
44
+ const AUTHORITY_RESULT_KEYS = new Set([
45
+ "authenticated",
46
+ "durable",
47
+ "tenantId",
48
+ "occurrenceId",
49
+ "jobId",
50
+ "jobRevision",
51
+ "occurrenceDigest",
52
+ "receiptDigest",
53
+ ]);
54
+
55
+ function failure(message, options) {
56
+ const error = new Error(message, options);
57
+ error.code = SCHEDULED_BATCH_WIKI_MAINTENANCE_INVALID_CODE;
58
+ return error;
59
+ }
60
+
61
+ function assertExactRecord(value, keys, label) {
62
+ if (
63
+ !value ||
64
+ typeof value !== "object" ||
65
+ Array.isArray(value) ||
66
+ utilTypes.isProxy(value) ||
67
+ ![Object.prototype, null].includes(Object.getPrototypeOf(value))
68
+ ) {
69
+ throw failure(`${label} must be a plain object`);
70
+ }
71
+ const ownKeys = Reflect.ownKeys(value);
72
+ if (
73
+ ownKeys.length !== keys.size ||
74
+ ownKeys.some((key) => typeof key !== "string" || !keys.has(key))
75
+ ) {
76
+ throw failure(`${label} must contain exactly the supported fields`);
77
+ }
78
+ for (const key of ownKeys) {
79
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
80
+ if (!descriptor || !("value" in descriptor) || !descriptor.enumerable) {
81
+ throw failure(`${label}.${String(key)} must be an enumerable data field`);
82
+ }
83
+ }
84
+ }
85
+
86
+ function requiredString(value, label) {
87
+ if (
88
+ typeof value !== "string" ||
89
+ value.trim() === "" ||
90
+ Buffer.byteLength(value, "utf8") > 256
91
+ ) {
92
+ throw failure(`${label} is invalid`);
93
+ }
94
+ return value;
95
+ }
96
+
97
+ function digest(value) {
98
+ return `sha256:${createHash("sha256").update(canonical(value)).digest("hex")}`;
99
+ }
100
+
101
+ function canonical(value) {
102
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
103
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
104
+ return `{${Object.keys(value)
105
+ .sort()
106
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
107
+ .join(",")}}`;
108
+ }
109
+
110
+ function same(left, right) {
111
+ return canonical(left) === canonical(right);
112
+ }
113
+
114
+ function deepFreeze(value) {
115
+ if (value && typeof value === "object" && !Object.isFrozen(value)) {
116
+ Object.freeze(value);
117
+ for (const child of Object.values(value)) deepFreeze(child);
118
+ }
119
+ return value;
120
+ }
121
+
122
+ function evidenceRefs(value) {
123
+ if (
124
+ !Array.isArray(value) ||
125
+ value.length < 1 ||
126
+ value.length > 256 ||
127
+ value.some(
128
+ (item) =>
129
+ typeof item !== "string" ||
130
+ item.trim() === "" ||
131
+ Buffer.byteLength(item, "utf8") > 512,
132
+ )
133
+ ) {
134
+ throw failure("scheduled batch evidenceRefs are invalid");
135
+ }
136
+ const normalized = [...new Set(value)].sort();
137
+ if (normalized.length !== value.length) {
138
+ throw failure("scheduled batch evidenceRefs must be unique");
139
+ }
140
+ return normalized;
141
+ }
142
+
143
+ function captureResolver(value) {
144
+ if (
145
+ !value ||
146
+ typeof value !== "object" ||
147
+ utilTypes.isProxy(value) ||
148
+ typeof value.resolve !== "function"
149
+ ) {
150
+ throw new TypeError("schedulerStoreResolver.resolve is required");
151
+ }
152
+ const resolve = value.resolve.bind(value);
153
+ Object.freeze(value);
154
+ return resolve;
155
+ }
156
+
157
+ function captureVerifier(value) {
158
+ if (
159
+ !value ||
160
+ typeof value !== "object" ||
161
+ utilTypes.isProxy(value) ||
162
+ typeof value.verify !== "function"
163
+ ) {
164
+ throw new TypeError("schedulerAuthorityVerifier.verify is required");
165
+ }
166
+ const verify = value.verify.bind(value);
167
+ Object.freeze(value);
168
+ return verify;
169
+ }
170
+
171
+ function captureSource(value) {
172
+ if (!SOURCES.has(value)) {
173
+ throw new TypeError(
174
+ "a branded scheduled-batch Wiki maintenance source is required",
175
+ );
176
+ }
177
+ return value;
178
+ }
179
+
180
+ function readBatch(resolveStore, tenantId, occurrenceIdInput) {
181
+ const occurrenceId = requiredString(occurrenceIdInput, "occurrenceId");
182
+ const store = resolveStore(deepFreeze({ tenantId, occurrenceId }));
183
+ if (!(store instanceof SchedulerStore)) {
184
+ throw failure("scheduler resolver did not return a SchedulerStore");
185
+ }
186
+ const occurrence = store.getOccurrence(occurrenceId);
187
+ if (
188
+ !occurrence ||
189
+ occurrence.id !== occurrenceId ||
190
+ occurrence.status !== "succeeded" ||
191
+ occurrence.authority?.tenantId !== tenantId ||
192
+ !Number.isSafeInteger(occurrence.jobRevision) ||
193
+ occurrence.jobRevision < 1 ||
194
+ !Number.isSafeInteger(occurrence.settledAt) ||
195
+ occurrence.settledAt < occurrence.scheduledFor
196
+ ) {
197
+ throw failure("scheduler occurrence is not a settled tenant batch");
198
+ }
199
+ const job = store.getJob(occurrence.jobId);
200
+ if (
201
+ !job ||
202
+ job.id !== occurrence.jobId ||
203
+ job.revision !== occurrence.jobRevision ||
204
+ job.authority?.tenantId !== tenantId
205
+ ) {
206
+ throw failure("scheduled batch job binding is stale or missing");
207
+ }
208
+ assertExactRecord(
209
+ job.payload,
210
+ JOB_PAYLOAD_KEYS,
211
+ "scheduled batch job payload",
212
+ );
213
+ if (
214
+ job.payload.schema !== SCHEDULED_BATCH_WIKI_MAINTENANCE_JOB_SCHEMA ||
215
+ job.payload.tenantId !== tenantId ||
216
+ !DIGEST.test(job.payload.evidenceSelectorDigest ?? "")
217
+ ) {
218
+ throw failure("scheduled batch job payload is not evolution-governed");
219
+ }
220
+ assertExactRecord(occurrence.result, RESULT_KEYS, "scheduled batch result");
221
+ const refs = evidenceRefs(occurrence.result.evidenceRefs);
222
+ if (
223
+ occurrence.result.schema !==
224
+ SCHEDULED_BATCH_WIKI_MAINTENANCE_RESULT_SCHEMA ||
225
+ occurrence.result.tenantId !== tenantId ||
226
+ occurrence.result.evidenceSetDigest !== digest(refs)
227
+ ) {
228
+ throw failure("scheduled batch result evidence binding is invalid");
229
+ }
230
+ const occurrenceDigest = digest({ job, occurrence });
231
+ return deepFreeze({
232
+ job,
233
+ occurrence,
234
+ occurrenceDigest,
235
+ evidenceRefs: refs,
236
+ effectiveAt: new Date(occurrence.settledAt).toISOString(),
237
+ });
238
+ }
239
+
240
+ async function projectTrigger(
241
+ resolveStore,
242
+ verifyAuthority,
243
+ tenantId,
244
+ occurrenceId,
245
+ ) {
246
+ const batch = readBatch(resolveStore, tenantId, occurrenceId);
247
+ const verified = await verifyAuthority(
248
+ deepFreeze({
249
+ tenantId,
250
+ job: batch.job,
251
+ occurrence: batch.occurrence,
252
+ occurrenceDigest: batch.occurrenceDigest,
253
+ }),
254
+ );
255
+ assertExactRecord(
256
+ verified,
257
+ AUTHORITY_RESULT_KEYS,
258
+ "scheduler authority verification",
259
+ );
260
+ if (
261
+ verified.authenticated !== true ||
262
+ verified.durable !== true ||
263
+ verified.tenantId !== tenantId ||
264
+ verified.occurrenceId !== batch.occurrence.id ||
265
+ verified.jobId !== batch.job.id ||
266
+ verified.jobRevision !== batch.job.revision ||
267
+ verified.occurrenceDigest !== batch.occurrenceDigest ||
268
+ !DIGEST.test(verified.receiptDigest ?? "")
269
+ ) {
270
+ throw failure("scheduler authority did not authenticate the exact batch");
271
+ }
272
+ return deepFreeze({
273
+ kind: WIKI_MAINTENANCE_TRIGGER_KIND.SCHEDULED_BATCH,
274
+ sourceId: batch.occurrence.id,
275
+ sourceReceiptDigest: verified.receiptDigest,
276
+ evidenceRefs: batch.evidenceRefs,
277
+ effectiveAt: batch.effectiveAt,
278
+ });
279
+ }
280
+
281
+ export function createScheduledBatchWikiMaintenanceSource({
282
+ tenantId: tenantInput,
283
+ schedulerStoreResolver,
284
+ schedulerAuthorityVerifier,
285
+ } = {}) {
286
+ const tenantId = requiredString(tenantInput, "tenantId");
287
+ const resolveStore = captureResolver(schedulerStoreResolver);
288
+ const verifyAuthority = captureVerifier(schedulerAuthorityVerifier);
289
+ const source = {
290
+ schema: SCHEDULED_BATCH_WIKI_MAINTENANCE_SOURCE_SCHEMA,
291
+ tenantId,
292
+ async build(input) {
293
+ assertExactRecord(input, BUILD_KEYS, "scheduled batch trigger input");
294
+ return projectTrigger(
295
+ resolveStore,
296
+ verifyAuthority,
297
+ tenantId,
298
+ input.occurrenceId,
299
+ );
300
+ },
301
+ async verify(input) {
302
+ assertExactRecord(input, VERIFY_KEYS, "Wiki maintenance source request");
303
+ if (
304
+ input.tenantId !== tenantId ||
305
+ input.kind !== WIKI_MAINTENANCE_TRIGGER_KIND.SCHEDULED_BATCH
306
+ ) {
307
+ throw failure("Wiki maintenance source is not this tenant batch");
308
+ }
309
+ const expected = await projectTrigger(
310
+ resolveStore,
311
+ verifyAuthority,
312
+ tenantId,
313
+ input.sourceId,
314
+ );
315
+ if (!same(input, { tenantId, ...expected })) {
316
+ throw failure(
317
+ "Wiki maintenance source no longer matches the durable scheduler batch",
318
+ );
319
+ }
320
+ return deepFreeze({
321
+ authenticated: true,
322
+ durable: true,
323
+ tenantId,
324
+ kind: expected.kind,
325
+ sourceId: expected.sourceId,
326
+ receiptDigest: expected.sourceReceiptDigest,
327
+ evidenceRefs: expected.evidenceRefs,
328
+ effectiveAt: expected.effectiveAt,
329
+ });
330
+ },
331
+ };
332
+ SOURCES.add(source);
333
+ return Object.freeze(source);
334
+ }
335
+
336
+ export function createScheduledBatchWikiMaintenanceProducer({
337
+ source: sourceInput,
338
+ triggerAdapter,
339
+ } = {}) {
340
+ const source = captureSource(sourceInput);
341
+ if (
342
+ !(triggerAdapter instanceof WikiMaintenanceTriggerLedgerAdapter) ||
343
+ triggerAdapter.descriptor?.tenantId !== source.tenantId
344
+ ) {
345
+ throw new TypeError(
346
+ "a tenant-matched WikiMaintenanceTriggerLedgerAdapter is required",
347
+ );
348
+ }
349
+ const enqueue = triggerAdapter.enqueue.bind(triggerAdapter);
350
+ const producer = {
351
+ schema: SCHEDULED_BATCH_WIKI_MAINTENANCE_PRODUCER_SCHEMA,
352
+ tenantId: source.tenantId,
353
+ async enqueueSettledBatch(input) {
354
+ return enqueue(await source.build(input));
355
+ },
356
+ };
357
+ PRODUCERS.add(producer);
358
+ return Object.freeze(producer);
359
+ }
360
+
361
+ export function captureScheduledBatchWikiMaintenanceProducer(value) {
362
+ if (!PRODUCERS.has(value)) {
363
+ throw new TypeError(
364
+ "a branded scheduled-batch Wiki maintenance producer is required",
365
+ );
366
+ }
367
+ return value;
368
+ }