chainlesschain 0.166.9 → 0.166.13

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 (232) hide show
  1. package/README.md +33 -0
  2. package/bin/chainlesschain.js +5 -0
  3. package/package.json +5 -2
  4. package/src/assets/web-panel/assets/{AIOps-DJvpifGx.js → AIOps-BN25cNOD.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-D2UhuF_A.js → ActionButton-Da9IP-m5.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-C9ho9obu.js → Analytics-D7hkEvQm.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-BvRCpFK3.js → AppLayout-CCV4Xnbc.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-jxrySvpk.js → Artifacts-CVSnVJeA.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-ovEw0ZYl.js → Audit-CuYdw5Ag.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-D7H5z6zS.js → BackgroundAgents-DZCnK-Tf.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-BuXob8za.js → Backup-cV9FdpTy.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-CtnszuQ2.js → BaseInput-BRnv6YSp.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-B_mYE8fJ.js → Chat-Bw5w87P4.js} +6 -6
  14. package/src/assets/web-panel/assets/ChatBubbleRenderer-C0GjtUAw.js +1 -0
  15. package/src/assets/web-panel/assets/{Checkbox-ierdtcJD.js → Checkbox-DaoTqcdt.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-3VKPJD_B.js → Codegen-B4dYcEIi.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-1EdMyf5P.js → Col-mAhuOeuD.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-D6H7UA8K.js → Community-BK6KEdBk.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-BBAZvYIm.js → Compact-CCglmNu5.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-CgsTrAoj.js → Compliance-Cm8S4of7.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-tnZgLoTE.js → Cowork-Dhs1QLMe.js} +3 -3
  22. package/src/assets/web-panel/assets/{Cron-CPpZw2Nh.js → Cron-CLlhmXWk.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-BymBcp5z.js → Crosschain-BnHVbaNs.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-DKPxS_K1.js → DID-UzQP9-0O.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-DvJhEmH9.js → Dashboard-CBdlPClz.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-b8iQyQIZ.js → Dropdown-axIRPdq1.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer--0-A-zKb.js → EmailListRenderer-DUalW5rx.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-C12iDN06.js → FamilyGuardDashboard-Bl4W9luY.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-BRhaE2Z8.js → Federation-C1yP-uEu.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-C4dnq7yf.js → FormItemContext-Xh6Ig5q8.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-CGAdbR5n.js → GenericCardRenderer-C2cz3bt2.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-4eA2fYzL.js → Git-C_z63ixg.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-BJuY9Y-9.js → Governance-BYqB33_3.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-DZ5Dy4up.js → Inference-CEULuArm.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-BMTjRs4A.js → KnowledgeGraph-fgMsu-0H.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-BKEeQEfJ.js → Logs-DO9Hdcec.js} +2 -2
  37. package/src/assets/web-panel/assets/MarkdownRenderer-BkrK04xW.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-Dhho4fEg.js → Marketplace-B8zyLiFe.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-BW6xxSlU.js → McpTools-BLAN2mWW.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-mPqlpSkq.js → Memory-CrQcFM7u.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-Cb9N_DQI.js → MobileBridge-DVnyiiU-.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-BNs8tah_.js → MobileProjects-qjCME5OD.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-CaxBt8tn.js → Mtc-4JE3C3It.js} +2 -2
  44. package/src/assets/web-panel/assets/{MtcAudit-DRPQbp3t.js → MtcAudit-CjBuak9I.js} +5 -5
  45. package/src/assets/web-panel/assets/{Multisig-CRm-d8bK.js → Multisig-BtPcYQcC.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-BCCk3LPs.js → NLProgramming-Cx653_Ba.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-Cv8SN8gN.js → Notes-CkuD3YzS.js} +4 -4
  48. package/src/assets/web-panel/assets/{NotificationSettings-CggIvTh5.js → NotificationSettings-BgNgU7HH.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-BW3_bV12.js → OrderTableRenderer-BTC8W0a-.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-BuRE-VCO.js → Organization-Dmd4Hjxz.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-DBrm1gju.js → Overflow-C_5DA-G0.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-CWVnDYgS.js → P2P-uwslV4XC.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-8RKUIpte.js → PdhVaultBrowser-CuNgwVnX.js} +5 -5
  54. package/src/assets/web-panel/assets/{Permissions-tDUAxogW.js → Permissions-CJayVX9H.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-Dv2-CFis.js → PersonalDataHub-Cb05H5go.js} +4 -4
  56. package/src/assets/web-panel/assets/{Pipeline-DM6kvFni.js → Pipeline-BZlGKapZ.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-DzK-yL0d.js → Privacy-BIzZWYzd.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-B5UrNpkj.js → ProjectInit-vEYYyQXQ.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-CxJD43oW.js → ProjectSettings-MZqTy5CC.js} +2 -2
  60. package/src/assets/web-panel/assets/Projects-CRARUOl8.js +1 -0
  61. package/src/assets/web-panel/assets/{Providers-CYl4jRYK.js → Providers-80VAK8PX.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-DeH2T0fH.js → QrScannerModal-CzRSoIwK.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-Bw9k_kTk.js → QuickAsk-BpwQ2n4C.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-Bl_jGwoi.js → Recommend-BC03TZ79.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-d6u01Kq0.js → RemoteSession-DE59-jaa.js} +2 -2
  66. package/src/assets/web-panel/assets/{Reputation-Ds_Dfr-k.js → Reputation-DOHmeWyA.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-BpQUQTNj.js → Row-hc5RZl1D.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-BatpZBGt.js → RssFeed-Cv5uMP7E.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-D7hOObzi.js → Search-qohu7Ug0.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-dXQ4FKNt.js → Security-drCPFWV5.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-D8wInGPa.js → Services-BAEgUeRy.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-DXQCoYpM.js → Skeleton-CkJkKBlo.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-D3oLRIVn.js → Skills-bMuKEpez.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-BmP4-LnJ.js → Sla-DxWQVHRC.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-DLj-xzro.js → SpeechSettings-BpS8idmV.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-8KKaaRMr.js → SyncSettings-BPBLlW5v.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-GyK42I7C.js → Tasks-C4SLEeUh.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-n1y_8UBG.js → Templates-r-wfU39U.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-B39nBph8.js → Tenant-C7vjRmLN.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-DCQoOKXe.js → Terminal-DdzeFCV2.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-BkhbDfXk.js → TimelineRenderer-CYyWN2KD.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-BeHIIU8D.js → Tokens-D8A9osUg.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-BHvWXVOb.js → Trigger-DBvrNlyS.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-y2WaOSto.js → Trust-DBVAGc7o.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-DBFeJBzt.js → UkeySign-C1vQUCRJ.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-BEOWitC-.js → VideoEditing-BKs4dah4.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-BITedTe6.js → Wallet-ByIuj3lD.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-DMwlJVin.js → WebAuthn-DYlAFCm9.js} +3 -3
  89. package/src/assets/web-panel/assets/{WorkflowEditor-CKfGFEu1.js → WorkflowEditor-Dwyadd0c.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-DR6gnBGF.js → chat-Bm2f3s08.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-C_Hw5NCn.js → colors-C8ORSh7V.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-B8IPwsEu.js → compact-item-1iVlnsM-.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-D-u4JVnJ.js → createContext-CmqNyUSL.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-B69RCDDH.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-CZubdS4D.js → hasIn-rUMaX3Ul.js} +1 -1
  96. package/src/assets/web-panel/assets/index-9biMQ-tw.js +1 -0
  97. package/src/assets/web-panel/assets/{index-C25rOz7O.js → index-B53c3diB.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CfniPP5p.js → index-B59OWAs7.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-11ASqx-A.js → index-B8BrB0Ls.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-auyNYjLo.js → index-BC32_0xT.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-Ctje8Vl3.js → index-BC8Wb6cy.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Cg2bCeol.js → index-BCOhTILd.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-D1w96gg9.js → index-BFniLMn9.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-k1Xa5iw1.js → index-BIvM-uAX.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DuOU5apg.js → index-BK-RY0-7.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-D47jt8ET.js → index-BQL9r73Y.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-C2VmtNaQ.js → index-BVtnizyC.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-Bizm87cX.js → index-Bf1PlIHp.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Dt-w3xQ7.js → index-Bgw4Y2rU.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-ffe7bvqP.js → index-BgwLNxmr.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Cl5RpreD.js → index-C-J5-pGH.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-idZKyADQ.js → index-C-ZIHi42.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-LvjAKDSl.js → index-C3B1S-mW.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DmRcgiYT.js → index-C5RfRciU.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-rYBHSDcJ.js → index-CCEyz58d.js} +1 -1
  116. package/src/assets/web-panel/assets/index-COie87kl.js +1 -0
  117. package/src/assets/web-panel/assets/{index-DcFjRT-K.js → index-CTfEmKK0.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DjRrqooR.js → index-CfiHyVyl.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DpjHpRoq.js → index-CkFvuAex.js} +3 -3
  120. package/src/assets/web-panel/assets/{index-BzoFanEQ.js → index-D98FXb0w.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Cbm8F0M2.js → index-DDHk911Q.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BXS6wYJZ.js → index-DJxtPFOh.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DY6MHo9D.js → index-DVJ1uKf4.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CiXkhOkY.js → index-Dcck8QfW.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-mYZJxGH6.js → index-DgUE51Pz.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CqmLw8cs.js → index-Dsve5Gkv.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-xoNssgz_.js → index-DvedhJeM.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DfnzrUxU.js → index-DwMdWKiF.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-Bi21Etg4.js → index-OcbzdRpT.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DJ6pG79m.js → index-fPK6GFEg.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-_nL79NT8.js → index-geQinnns.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DTosx2Wu.js → index-pHWA7bmM.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-cVqbas5C.js → index-reUHhuz8.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-Bv2132PO.js → index-tqTx5wXo.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-lcU_dT2r.js → initDefaultProps-CuA-cpkL.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-Dc7UNXZ1.js → motion-CimmE_9b.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-Cll8ZXaL.js → move-DlGlrltz.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-CAb_yLIM.js → mtc-parser-CK6BJQ07.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-DurYMyTe.js → omit-BKjBfZfB.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-BITQyOlw.js → pickAttrs-B2chVYw9.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-Dg1rH91i.js → placementArrow-BW8aLJJ3.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-D_EWIeac.js → responsiveObserve-dXlPl66S.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-lK4d3zsh.js → slide-hSa89S4G.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-Bflq-Git.js → statusUtils-DM6KLt-s.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-Ccp0I-wt.js → styleChecker-C9MQAK15.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-CYZbByYA.js → useFlexGapSupport-BpQDpP0z.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-B_x0nxFD.js → useFs-C7rtRViA.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-DW55rL85.js → usePersonalDataHub-Dm15xafq.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-Ca6MH3W8.js → vnode-mEiEytw4.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-NdHelOog.js → zoom-DzPxflhY.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +5 -5
  153. package/src/commands/agent.js +51 -20
  154. package/src/commands/compact.js +349 -3
  155. package/src/commands/context.js +72 -1
  156. package/src/commands/graph.js +26 -15
  157. package/src/commands/hmemory.js +21 -0
  158. package/src/commands/hook.js +256 -28
  159. package/src/commands/memory.js +209 -42
  160. package/src/commands/promcomp.js +17 -0
  161. package/src/commands/serve.js +94 -10
  162. package/src/commands/session.js +2 -3
  163. package/src/commands/team.js +7 -1
  164. package/src/data/changelog.json +41 -2
  165. package/src/gateways/ws/session-core-protocol.js +62 -3
  166. package/src/gateways/ws/session-protocol.js +123 -15
  167. package/src/gateways/ws/ws-agent-handler.js +157 -9
  168. package/src/gateways/ws/ws-session-gateway.js +204 -30
  169. package/src/generated/cc-agent-protocol.schema.json +2094 -4
  170. package/src/harness/prompt-compressor.js +5 -55
  171. package/src/lib/agent-sandbox.js +14 -4
  172. package/src/lib/agent-team/team-distributed-graph-bridge.js +3 -3
  173. package/src/lib/app-server/context-memory-notifications.js +54 -0
  174. package/src/lib/app-server/rollout-store-factory.js +115 -0
  175. package/src/lib/app-server/rollout-store.js +310 -23
  176. package/src/lib/app-server/server.js +184 -7
  177. package/src/lib/app-server/sqlite-rollout-store.js +59 -16
  178. package/src/lib/auto-mode-config.js +26 -0
  179. package/src/lib/causal-observability.js +13 -1
  180. package/src/lib/context-memory-kernel/authority.js +95 -0
  181. package/src/lib/context-memory-kernel/durable-memory-port.js +296 -0
  182. package/src/lib/context-memory-kernel/index.js +8 -0
  183. package/src/lib/context-memory-kernel/jsonl-session-context-port.js +232 -0
  184. package/src/lib/context-memory-kernel/live-compaction.js +375 -0
  185. package/src/lib/context-memory-kernel/memory-service.js +667 -0
  186. package/src/lib/context-memory-kernel/message-adapter.js +451 -0
  187. package/src/lib/context-memory-kernel/privacy-purge-port.js +244 -0
  188. package/src/lib/context-memory-kernel/provider-context.js +192 -0
  189. package/src/lib/context-memory-kernel/runtime.js +61 -0
  190. package/src/lib/direct-model-usage.js +22 -18
  191. package/src/lib/graph-kernel/cutover-authority-resolver.js +4 -5
  192. package/src/lib/graph-kernel/cutover-ledger.js +2 -2
  193. package/src/lib/graph-kernel/event-store.js +3 -5
  194. package/src/lib/graph-kernel/index.js +2 -0
  195. package/src/lib/graph-kernel/migration-saga.js +2 -2
  196. package/src/lib/graph-kernel/production-cutover-evidence.js +976 -0
  197. package/src/lib/graph-kernel/retirement-evidence.js +12 -4
  198. package/src/lib/hierarchical-memory.js +22 -0
  199. package/src/lib/hook-audit-store.js +170 -0
  200. package/src/lib/hook-event-bus.cjs +0 -0
  201. package/src/lib/hook-manager.js +25 -83
  202. package/src/lib/hook-runtime-adapters.js +233 -0
  203. package/src/lib/hook-runtime-contract.cjs +291 -0
  204. package/src/lib/hook-runtime-contract.js +21 -0
  205. package/src/lib/hook-trust.js +210 -0
  206. package/src/lib/hooks-v2-producers.js +52 -6
  207. package/src/lib/hooks-v2-runtime.js +443 -178
  208. package/src/lib/llm-pricing.js +10 -0
  209. package/src/lib/memory-manager.js +29 -4
  210. package/src/lib/model-context-window.js +52 -0
  211. package/src/lib/permanent-memory.js +17 -0
  212. package/src/lib/plan-mode.js +8 -4
  213. package/src/lib/process-execution-broker/index.js +208 -16
  214. package/src/lib/runtime-usage-ledger.js +20 -0
  215. package/src/lib/session-consolidator.js +59 -0
  216. package/src/lib/session-core-singletons.js +17 -4
  217. package/src/lib/session-hooks.js +29 -2
  218. package/src/lib/session-transcript-migration.js +188 -0
  219. package/src/lib/settings-hook-events.cjs +37 -401
  220. package/src/lib/settings-hook-events.js +210 -8
  221. package/src/lib/settings-hooks.cjs +42 -83
  222. package/src/lib/ws-session-manager.js +4 -1
  223. package/src/repl/agent-repl.js +186 -53
  224. package/src/runtime/agent-core.js +376 -350
  225. package/src/runtime/headless-runner.js +40 -33
  226. package/src/runtime/headless-stream.js +131 -30
  227. package/src/assets/web-panel/assets/ChatBubbleRenderer-DaiA6CsX.js +0 -1
  228. package/src/assets/web-panel/assets/MarkdownRenderer-B05DgASC.js +0 -1
  229. package/src/assets/web-panel/assets/Projects-Z2Orm8Ma.js +0 -1
  230. package/src/assets/web-panel/assets/devWarning-Cq6lSd_q.js +0 -1
  231. package/src/assets/web-panel/assets/index-BQ3213fz.js +0 -1
  232. package/src/assets/web-panel/assets/index-vJagfET2.js +0 -1
@@ -8,6 +8,17 @@ export const ROLLOUT_EVENT_SCHEMA = "chainlesschain.rollout-event/v1";
8
8
  export const ROLLOUT_STORE_SCHEMA = "chainlesschain.rollout-store/v1";
9
9
  export const ROLLOUT_STORE_VERSION = 1;
10
10
  export const ROLLOUT_STORE_MIN_VERSION = 1;
11
+ export const ROLLOUT_STORE_METHODS = Object.freeze([
12
+ "start",
13
+ "append",
14
+ "read",
15
+ "resume",
16
+ "fork",
17
+ "checkpoint",
18
+ "compact",
19
+ "archive",
20
+ "migrate",
21
+ ]);
11
22
 
12
23
  const ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,159}$/u;
13
24
  const IDEMPOTENCY_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$/u;
@@ -20,6 +31,32 @@ function storeError(code, message, details = {}) {
20
31
  return error;
21
32
  }
22
33
 
34
+ export function assertRolloutStore(store, { requireList = false } = {}) {
35
+ if (!store || typeof store !== "object") {
36
+ throw storeError(
37
+ "CC_ROLLOUT_ADAPTER_INVALID",
38
+ "rollout store adapter must be an object",
39
+ );
40
+ }
41
+ // `list` is a host discovery extension used by Thread/list and whole-store
42
+ // migration; the lifecycle contract itself intentionally remains the nine
43
+ // methods above so a remote adapter can migrate explicit thread ids.
44
+ const required = requireList
45
+ ? [...ROLLOUT_STORE_METHODS, "list"]
46
+ : ROLLOUT_STORE_METHODS;
47
+ const missing = required.filter(
48
+ (method) => typeof store[method] !== "function",
49
+ );
50
+ if (missing.length > 0) {
51
+ throw storeError(
52
+ "CC_ROLLOUT_ADAPTER_INVALID",
53
+ `rollout store adapter is missing: ${missing.join(", ")}`,
54
+ { missing },
55
+ );
56
+ }
57
+ return store;
58
+ }
59
+
23
60
  function identifier(value, label = "identifier") {
24
61
  const output = String(value || "").trim();
25
62
  if (!ID_PATTERN.test(output)) {
@@ -88,6 +125,21 @@ function timestamp(now) {
88
125
  return new Date(now()).toISOString();
89
126
  }
90
127
 
128
+ function boundedLimit(value, fallback) {
129
+ return Math.max(1, Math.min(100_000, Number(value) || fallback));
130
+ }
131
+
132
+ function startPayload({ title = null, parentThreadId = null, metadata = {} }) {
133
+ return {
134
+ title: title == null ? null : String(title).slice(0, 512),
135
+ parentThreadId:
136
+ parentThreadId == null
137
+ ? null
138
+ : identifier(parentThreadId, "parentThreadId"),
139
+ metadata: stableValue(metadata || {}),
140
+ };
141
+ }
142
+
91
143
  function buildRecord(input, previous, now) {
92
144
  const threadId = identifier(input.threadId, "threadId");
93
145
  const record = {
@@ -210,6 +262,194 @@ function projectThread(records) {
210
262
  });
211
263
  }
212
264
 
265
+ function recordInput(record) {
266
+ return {
267
+ threadId: record.thread_id,
268
+ turnId: record.turn_id,
269
+ itemId: record.item_id,
270
+ eventType: record.event_type,
271
+ toolUseId: record.tool_use_id,
272
+ approvalId: record.approval_id,
273
+ traceId: record.trace_id,
274
+ parentId: record.parent_id,
275
+ idempotencyKey: record.idempotency_key,
276
+ timestamp: record.timestamp,
277
+ payload: clone(record.payload),
278
+ };
279
+ }
280
+
281
+ function sameRecord(left, right) {
282
+ return Boolean(left && right && left.hash === right.hash);
283
+ }
284
+
285
+ function sameLocalAdapter(sourceStore, targetStore) {
286
+ if (
287
+ !["jsonl", "sqlite"].includes(sourceStore?.backend) ||
288
+ sourceStore.backend !== targetStore?.backend ||
289
+ !sourceStore.location ||
290
+ !targetStore.location
291
+ ) {
292
+ return false;
293
+ }
294
+ const sourceLocation = path.resolve(sourceStore.location);
295
+ const targetLocation = path.resolve(targetStore.location);
296
+ return process.platform === "win32"
297
+ ? sourceLocation.toLowerCase() === targetLocation.toLowerCase()
298
+ : sourceLocation === targetLocation;
299
+ }
300
+
301
+ function readAllRecords(store, threadId) {
302
+ const records = [];
303
+ let afterSeq = 0;
304
+ for (;;) {
305
+ const batch = store.read(threadId, { afterSeq, limit: 100_000 });
306
+ if (batch.length === 0) break;
307
+ records.push(...batch);
308
+ const nextSeq = Number(batch.at(-1)?.event_seq);
309
+ if (!Number.isInteger(nextSeq) || nextSeq <= afterSeq) {
310
+ throw storeError(
311
+ "CC_ROLLOUT_CORRUPT",
312
+ `rollout adapter did not advance while reading ${threadId}`,
313
+ { threadId, afterSeq },
314
+ );
315
+ }
316
+ afterSeq = nextSeq;
317
+ if (batch.length < 100_000) break;
318
+ }
319
+ return verifyRecords(records, threadId);
320
+ }
321
+
322
+ /**
323
+ * Copy canonical records between physical adapters without changing their
324
+ * event sequence or hash chain. Existing matching prefixes make the operation
325
+ * restartable after a crash; any divergent target fails closed.
326
+ */
327
+ export function migrateRolloutStore({
328
+ sourceStore,
329
+ targetStore,
330
+ threadIds = null,
331
+ dryRun = true,
332
+ } = {}) {
333
+ assertRolloutStore(sourceStore, { requireList: threadIds == null });
334
+ assertRolloutStore(targetStore);
335
+ if (
336
+ sourceStore === targetStore ||
337
+ sameLocalAdapter(sourceStore, targetStore)
338
+ ) {
339
+ throw storeError(
340
+ "CC_ROLLOUT_MIGRATION_INVALID",
341
+ "source and target rollout stores must be different physical stores",
342
+ );
343
+ }
344
+
345
+ const ids = Array.isArray(threadIds)
346
+ ? [...new Set(threadIds.map((value) => identifier(value, "threadId")))]
347
+ : sourceStore
348
+ .list({ includeArchived: true, limit: 100_000 })
349
+ .map((thread) => identifier(thread.id, "threadId"));
350
+ let events = 0;
351
+ let copiedEvents = 0;
352
+ let alreadyPresent = 0;
353
+
354
+ for (const threadId of ids) {
355
+ const sourceRecords = readAllRecords(sourceStore, threadId);
356
+ if (sourceRecords.length === 0) continue;
357
+ events += sourceRecords.length;
358
+
359
+ let targetRecords = [];
360
+ try {
361
+ targetRecords = readAllRecords(targetStore, threadId);
362
+ } catch (error) {
363
+ if (
364
+ error?.code !== "CC_ROLLOUT_THREAD_NOT_FOUND" &&
365
+ !/thread does not exist/u.test(String(error?.message || ""))
366
+ ) {
367
+ throw error;
368
+ }
369
+ }
370
+ if (targetRecords.length > sourceRecords.length) {
371
+ throw storeError(
372
+ "CC_ROLLOUT_MIGRATION_CONFLICT",
373
+ `target rollout is ahead of source: ${threadId}`,
374
+ { threadId },
375
+ );
376
+ }
377
+ for (let index = 0; index < targetRecords.length; index += 1) {
378
+ if (!sameRecord(targetRecords[index], sourceRecords[index])) {
379
+ throw storeError(
380
+ "CC_ROLLOUT_MIGRATION_CONFLICT",
381
+ `target rollout diverged from source: ${threadId}`,
382
+ { threadId, eventSeq: index + 1 },
383
+ );
384
+ }
385
+ }
386
+ alreadyPresent += targetRecords.length;
387
+ if (dryRun !== false) {
388
+ copiedEvents += sourceRecords.length - targetRecords.length;
389
+ continue;
390
+ }
391
+
392
+ let offset = targetRecords.length;
393
+ if (offset === 0) {
394
+ const first = sourceRecords[0];
395
+ if (first.event_type !== "thread.started") {
396
+ throw storeError(
397
+ "CC_ROLLOUT_CORRUPT",
398
+ `rollout does not begin with thread.started: ${threadId}`,
399
+ { threadId },
400
+ );
401
+ }
402
+ targetStore.start({
403
+ threadId,
404
+ title: first.payload?.title ?? null,
405
+ parentThreadId: first.payload?.parentThreadId ?? null,
406
+ metadata: clone(first.payload?.metadata || {}),
407
+ timestamp: first.timestamp,
408
+ });
409
+ const copied = targetStore.read(threadId, { limit: 1 })[0];
410
+ if (!sameRecord(copied, first)) {
411
+ throw storeError(
412
+ "CC_ROLLOUT_MIGRATION_CONFLICT",
413
+ `target adapter changed the canonical start record: ${threadId}`,
414
+ { threadId, eventSeq: 1 },
415
+ );
416
+ }
417
+ copiedEvents += 1;
418
+ offset = 1;
419
+ }
420
+
421
+ for (let index = offset; index < sourceRecords.length; index += 1) {
422
+ const previous = sourceRecords[index - 1];
423
+ const expected = sourceRecords[index];
424
+ const copied = targetStore.append({
425
+ ...recordInput(expected),
426
+ expectedRevision: previous.event_seq,
427
+ expectedHeadHash: previous.hash,
428
+ });
429
+ if (!sameRecord(copied, expected)) {
430
+ throw storeError(
431
+ "CC_ROLLOUT_MIGRATION_CONFLICT",
432
+ `target adapter changed a canonical event: ${threadId}`,
433
+ { threadId, eventSeq: expected.event_seq },
434
+ );
435
+ }
436
+ copiedEvents += 1;
437
+ }
438
+ }
439
+
440
+ return Object.freeze({
441
+ schema: ROLLOUT_STORE_SCHEMA,
442
+ fromVersion: ROLLOUT_STORE_VERSION,
443
+ toVersion: ROLLOUT_STORE_VERSION,
444
+ dryRun: dryRun !== false,
445
+ threads: ids.length,
446
+ events,
447
+ copiedEvents,
448
+ alreadyPresent,
449
+ backupRequired: false,
450
+ });
451
+ }
452
+
213
453
  export function defaultRolloutStoreDirectory() {
214
454
  return path.join(getHomeDir(), "app-server", "rollouts");
215
455
  }
@@ -274,6 +514,7 @@ export class JsonlRolloutStore {
274
514
  title = null,
275
515
  parentThreadId = null,
276
516
  metadata = {},
517
+ timestamp: startedAt = null,
277
518
  } = {}) {
278
519
  const safeThreadId = identifier(threadId, "threadId");
279
520
  this._ensureDirectory();
@@ -288,14 +529,8 @@ export class JsonlRolloutStore {
288
529
  threadId: safeThreadId,
289
530
  eventType: "thread.started",
290
531
  idempotencyKey: `thread:${safeThreadId}`,
291
- payload: {
292
- title: title == null ? null : String(title).slice(0, 512),
293
- parentThreadId:
294
- parentThreadId == null
295
- ? null
296
- : identifier(parentThreadId, "parentThreadId"),
297
- metadata: stableValue(metadata),
298
- },
532
+ timestamp: startedAt || undefined,
533
+ payload: startPayload({ title, parentThreadId, metadata }),
299
534
  },
300
535
  null,
301
536
  this.now,
@@ -349,7 +584,7 @@ export class JsonlRolloutStore {
349
584
  }
350
585
 
351
586
  read(threadId, { afterSeq = 0, limit = 10_000 } = {}) {
352
- const safeLimit = Math.max(1, Math.min(100_000, Number(limit) || 10_000));
587
+ const safeLimit = boundedLimit(limit, 10_000);
353
588
  return clone(
354
589
  this._readUnsafe(threadId)
355
590
  .filter((record) => record.event_seq > Number(afterSeq || 0))
@@ -387,7 +622,7 @@ export class JsonlRolloutStore {
387
622
  }
388
623
  return output
389
624
  .sort((left, right) => right.updatedAt.localeCompare(left.updatedAt))
390
- .slice(0, Math.max(1, Math.min(10_000, Number(limit) || 100)));
625
+ .slice(0, boundedLimit(limit, 100));
391
626
  }
392
627
 
393
628
  forkThread(sourceThreadId, { threadId = randomUUID(), title = null } = {}) {
@@ -412,6 +647,10 @@ export class JsonlRolloutStore {
412
647
  return this.resume(target.id);
413
648
  }
414
649
 
650
+ fork(sourceThreadId, options = {}) {
651
+ return this.forkThread(sourceThreadId, options);
652
+ }
653
+
415
654
  checkpoint(threadId, payload = {}) {
416
655
  return this.append({
417
656
  threadId,
@@ -450,14 +689,27 @@ export class JsonlRolloutStore {
450
689
  }
451
690
 
452
691
  migrate({
453
- fromVersion,
692
+ fromVersion = ROLLOUT_STORE_VERSION,
454
693
  toVersion = ROLLOUT_STORE_VERSION,
455
694
  dryRun = true,
695
+ targetStore = null,
696
+ threadIds = null,
456
697
  } = {}) {
698
+ if (targetStore) {
699
+ return migrateRolloutStore({
700
+ sourceStore: this,
701
+ targetStore,
702
+ threadIds,
703
+ dryRun,
704
+ });
705
+ }
706
+ const normalizedFromVersion = Number(fromVersion);
707
+ const normalizedToVersion = Number(toVersion);
457
708
  if (
458
- Number(fromVersion) < ROLLOUT_STORE_MIN_VERSION ||
459
- Number(fromVersion) > ROLLOUT_STORE_VERSION ||
460
- Number(toVersion) !== ROLLOUT_STORE_VERSION
709
+ !Number.isInteger(normalizedFromVersion) ||
710
+ normalizedFromVersion < ROLLOUT_STORE_MIN_VERSION ||
711
+ normalizedFromVersion > ROLLOUT_STORE_VERSION ||
712
+ normalizedToVersion !== ROLLOUT_STORE_VERSION
461
713
  ) {
462
714
  throw storeError(
463
715
  "CC_ROLLOUT_MIGRATION_UNSUPPORTED",
@@ -466,8 +718,8 @@ export class JsonlRolloutStore {
466
718
  }
467
719
  return Object.freeze({
468
720
  schema: ROLLOUT_STORE_SCHEMA,
469
- fromVersion: Number(fromVersion),
470
- toVersion: Number(toVersion),
721
+ fromVersion: normalizedFromVersion,
722
+ toVersion: normalizedToVersion,
471
723
  dryRun: dryRun !== false,
472
724
  changes: 0,
473
725
  backupRequired: false,
@@ -486,6 +738,7 @@ export class MemoryRolloutStore {
486
738
  title = null,
487
739
  parentThreadId = null,
488
740
  metadata = {},
741
+ timestamp: startedAt = null,
489
742
  } = {}) {
490
743
  const safeThreadId = identifier(threadId, "threadId");
491
744
  if (this.records.has(safeThreadId)) return this.resume(safeThreadId);
@@ -494,7 +747,8 @@ export class MemoryRolloutStore {
494
747
  threadId: safeThreadId,
495
748
  eventType: "thread.started",
496
749
  idempotencyKey: `thread:${safeThreadId}`,
497
- payload: { title, parentThreadId, metadata },
750
+ timestamp: startedAt || undefined,
751
+ payload: startPayload({ title, parentThreadId, metadata }),
498
752
  },
499
753
  null,
500
754
  this.now,
@@ -546,7 +800,7 @@ export class MemoryRolloutStore {
546
800
  return clone(
547
801
  records
548
802
  .filter((record) => record.event_seq > Number(afterSeq || 0))
549
- .slice(0, limit),
803
+ .slice(0, boundedLimit(limit, 10_000)),
550
804
  );
551
805
  }
552
806
 
@@ -559,7 +813,7 @@ export class MemoryRolloutStore {
559
813
  .map((threadId) => this.resume(threadId))
560
814
  .filter((thread) => includeArchived || thread.status !== "archived")
561
815
  .sort((left, right) => right.updatedAt.localeCompare(left.updatedAt))
562
- .slice(0, limit);
816
+ .slice(0, boundedLimit(limit, 100));
563
817
  }
564
818
 
565
819
  forkThread(sourceThreadId, { threadId = randomUUID(), title = null } = {}) {
@@ -583,6 +837,10 @@ export class MemoryRolloutStore {
583
837
  return this.resume(target.id);
584
838
  }
585
839
 
840
+ fork(sourceThreadId, options = {}) {
841
+ return this.forkThread(sourceThreadId, options);
842
+ }
843
+
586
844
  checkpoint(threadId, payload = {}) {
587
845
  return this.append({
588
846
  threadId,
@@ -593,13 +851,19 @@ export class MemoryRolloutStore {
593
851
  }
594
852
 
595
853
  compact(threadId, options = {}) {
854
+ if (typeof options.summary !== "string" || !options.summary.trim()) {
855
+ throw storeError(
856
+ "CC_ROLLOUT_INVALID_ARGUMENT",
857
+ "compaction summary is required",
858
+ );
859
+ }
596
860
  return this.append({
597
861
  threadId,
598
862
  eventType: "rollout.compacted",
599
863
  idempotencyKey: options.idempotencyKey || null,
600
864
  payload: {
601
- summary: String(options.summary || ""),
602
- retainedState: options.retainedState || {},
865
+ summary: options.summary,
866
+ retainedState: options.retainedState ?? {},
603
867
  },
604
868
  });
605
869
  }
@@ -615,10 +879,31 @@ export class MemoryRolloutStore {
615
879
  }
616
880
 
617
881
  migrate(options = {}) {
882
+ if (options.targetStore) {
883
+ return migrateRolloutStore({
884
+ sourceStore: this,
885
+ targetStore: options.targetStore,
886
+ threadIds: options.threadIds || null,
887
+ dryRun: options.dryRun,
888
+ });
889
+ }
890
+ const fromVersion = Number(options.fromVersion ?? ROLLOUT_STORE_VERSION);
891
+ const toVersion = Number(options.toVersion ?? ROLLOUT_STORE_VERSION);
892
+ if (
893
+ !Number.isInteger(fromVersion) ||
894
+ fromVersion < ROLLOUT_STORE_MIN_VERSION ||
895
+ fromVersion > ROLLOUT_STORE_VERSION ||
896
+ toVersion !== ROLLOUT_STORE_VERSION
897
+ ) {
898
+ throw storeError(
899
+ "CC_ROLLOUT_MIGRATION_UNSUPPORTED",
900
+ `rollout migration ${fromVersion} -> ${toVersion} is unsupported`,
901
+ );
902
+ }
618
903
  return Object.freeze({
619
904
  schema: ROLLOUT_STORE_SCHEMA,
620
- fromVersion: Number(options.fromVersion || 1),
621
- toVersion: Number(options.toVersion || 1),
905
+ fromVersion,
906
+ toVersion,
622
907
  dryRun: options.dryRun !== false,
623
908
  changes: 0,
624
909
  backupRequired: false,
@@ -627,9 +912,11 @@ export class MemoryRolloutStore {
627
912
  }
628
913
 
629
914
  export const _rolloutStoreInternals = Object.freeze({
915
+ assertExpectedHead,
630
916
  buildRecord,
631
917
  canonicalJson,
632
918
  digest,
633
919
  projectThread,
920
+ startPayload,
634
921
  verifyRecords,
635
922
  });