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
@@ -1,60 +1,18 @@
1
1
  "use strict";
2
2
 
3
3
  /**
4
- * settings-hook-events fire non-tool `.claude/settings.json` hooks
5
- * (UserPromptSubmit, SessionStart, and generic observe events) that live
6
- * outside the executeTool seam.
4
+ * CommonJS compatibility helpers for canonical settings Hook events.
7
5
  *
8
- * Reuses the same loader (collectHooks) + JSON protocol (hook-runner). Tool
9
- * hooks (PreToolUse/PostToolUse) are dispatched inline in agent-core; this is
10
- * the prompt/session lifecycle half. DB-backed session hooks (session-hooks.js
11
- * `fireUserPromptSubmit`) stay separate + observe-only; these settings hooks
12
- * are decision-capable (block) and can inject `additionalContext`.
13
- *
14
- * A hook's non-block stdout becomes context to inject: a JSON
15
- * `{ "additionalContext": "..." }` field, or — for convenience — plain
16
- * (non-JSON) stdout text. Exit 2 / `{decision:block}` aborts the turn.
6
+ * This module deliberately contains no Hook executor. Legacy CJS consumers
7
+ * delegate to settings-hook-events.js, where settings definitions are compiled
8
+ * by the Hooks v2 adapter and scheduled by the one canonical runtime.
17
9
  */
18
10
 
19
- const { collectHooks } = require("./settings-hooks.cjs");
20
- const hookRunner = require("./hook-runner.cjs");
21
- const _deps = { runHooks: hookRunner.runHooks };
22
11
  const { buildHookEnvelope } = require("./hook-event-bus.cjs");
23
12
  const hookEventLog = require("./hook-event-log.cjs");
24
13
 
25
- /**
26
- * Publish lifecycle events to Hooks v2 without making the legacy settings hook
27
- * path depend on the ESM runtime. Payloads are deliberately reduced before
28
- * publication: prompt text and file contents must never become durable hook
29
- * context merely because a lifecycle producer fired.
30
- */
31
- function publishHooksV2Event(event, payload = {}) {
32
- const safe = { ...payload };
33
- delete safe.prompt;
34
- delete safe.content;
35
- delete safe.files;
36
- void import("./hooks-v2-producers.js")
37
- .then(({ emitHooksV2Event }) => {
38
- emitHooksV2Event(event, safe);
39
- })
40
- .catch(() => {
41
- // Optional producer bridge; legacy settings hooks remain authoritative.
42
- });
43
- }
44
-
45
- /**
46
- * Stamp a unified-bus delivery id (event_id) onto a hook payload (P2 event bus).
47
- * Additive — a hook that ignores it is unaffected; a hook that reads it gets a
48
- * stable per-delivery id for correlation / `cc hook replay`. traceId/parentId
49
- * are threaded when the caller provides them (else null).
50
- *
51
- * When `CC_HOOK_EVENT_LOG` is enabled, the FULL envelope is best-effort recorded
52
- * to the hash-chained hook event log so `cc hook replay <event-id>` has a real
53
- * source. Recording is opt-in and never throws, so the default firing path is
54
- * byte-for-byte unchanged.
55
- */
56
14
  function withDeliveryId(event, payload, { sessionId, traceId, parentId } = {}) {
57
- const env = buildHookEnvelope({
15
+ const envelope = buildHookEnvelope({
58
16
  eventType: event,
59
17
  data: payload,
60
18
  sessionId: sessionId || payload.session_id || null,
@@ -63,386 +21,64 @@ function withDeliveryId(event, payload, { sessionId, traceId, parentId } = {}) {
63
21
  });
64
22
  if (hookEventLog.isHookEventLogEnabled()) {
65
23
  try {
66
- hookEventLog.appendHookEvent(env);
24
+ hookEventLog.appendHookEvent(envelope);
67
25
  } catch {
68
- /* best-effort recording must not break the turn */
26
+ // The event replay log is optional. Mandatory execution audit is handled
27
+ // separately by the canonical Hook audit store.
69
28
  }
70
29
  }
71
- // trace_id/parent_id are stamped onto the DELIVERED payload only when the
72
- // caller actually threaded them (agent-core context) — absent they are
73
- // omitted entirely, keeping every legacy payload byte-identical.
74
30
  return {
75
31
  ...payload,
76
- event_id: env.event_id,
77
- ...(env.trace_id ? { trace_id: env.trace_id } : {}),
78
- ...(env.parent_id ? { parent_id: env.parent_id } : {}),
32
+ event_id: envelope.event_id,
33
+ ...(envelope.trace_id ? { trace_id: envelope.trace_id } : {}),
34
+ ...(envelope.parent_id ? { parent_id: envelope.parent_id } : {}),
79
35
  };
80
36
  }
81
37
 
82
- /**
83
- * Split collected hooks into the blocking (sync) set and the fire-and-forget
84
- * (`async: true`) set. Only NON-decision events should dispatch async hooks —
85
- * an async hook can't gate a turn it no longer blocks, so a UserPromptSubmit
86
- * hook that must be able to `block` should stay sync. The caller decides which
87
- * events are eligible; this is just the partition.
88
- * @returns {{ sync: Array, async: Array }}
89
- */
90
38
  function partitionAsyncHooks(hooks) {
91
39
  const sync = [];
92
40
  const asyncHooks = [];
93
- for (const h of hooks || []) {
94
- if (h && h.async === true) asyncHooks.push(h);
95
- else sync.push(h);
41
+ for (const hook of hooks || []) {
42
+ if (hook?.async === true) asyncHooks.push(hook);
43
+ else sync.push(hook);
96
44
  }
97
45
  return { sync, async: asyncHooks };
98
46
  }
99
47
 
100
- /** Join the context emitted by the hooks that ran (additionalContext / plain stdout). */
101
48
  function aggregateContext(results) {
102
49
  const parts = [];
103
- for (const r of results || []) {
104
- if (r.additionalContext) {
105
- parts.push(String(r.additionalContext));
106
- } else if (r.exitCode === 0 && r.stdout) {
107
- const s = String(r.stdout).trim();
108
- if (s && s[0] !== "{") parts.push(s); // plain stdout = context to inject
50
+ for (const result of results || []) {
51
+ if (result?.additionalContext) {
52
+ parts.push(String(result.additionalContext));
53
+ } else if (result?.exitCode === 0 && result.stdout) {
54
+ const text = String(result.stdout).trim();
55
+ if (text && text[0] !== "{") parts.push(text);
109
56
  }
110
57
  }
111
58
  return parts.length > 0 ? parts.join("\n") : null;
112
59
  }
113
60
 
114
- /**
115
- * UserPromptSubmit settings hooks. A `block`/`ask` decision aborts the turn;
116
- * otherwise any emitted context is returned for the caller to inject.
117
- *
118
- * `async: true` hooks are EXCLUDED from this blocking run — they can't gate a
119
- * turn they no longer block, so a fire-and-forget hook is dispatched separately
120
- * (see dispatchAsyncHooks). This keeps the sync/decision path unchanged while a
121
- * long-running check runs alongside the turn.
122
- * @returns {{ blocked:boolean, reason?:string, hook?:string, additionalContext:string|null }}
123
- */
124
- function runUserPromptSubmitHooks(
125
- settingsHooks,
126
- { prompt, cwd, sessionId } = {},
127
- ) {
128
- publishHooksV2Event("UserPromptSubmit", {
129
- cwd: cwd || null,
130
- session_id: sessionId || null,
131
- });
132
- if (!settingsHooks) return { blocked: false, additionalContext: null };
133
- const matched = collectHooks(settingsHooks, "UserPromptSubmit", "");
134
- if (matched.length === 0) return { blocked: false, additionalContext: null };
135
- const { sync } = partitionAsyncHooks(matched);
136
- if (sync.length === 0) return { blocked: false, additionalContext: null };
137
- const payload = withDeliveryId(
138
- "UserPromptSubmit",
139
- {
140
- hook_event_name: "UserPromptSubmit",
141
- prompt: String(prompt || ""),
142
- cwd,
143
- session_id: sessionId || null,
144
- },
145
- { sessionId },
146
- );
147
- const outcome = _deps.runHooks(sync, payload, {
148
- cwd,
149
- event: "UserPromptSubmit",
150
- });
151
- if (outcome.decision === "block" || outcome.decision === "ask") {
152
- return {
153
- blocked: true,
154
- reason: outcome.reason,
155
- hook: outcome.hook,
156
- additionalContext: null,
157
- };
158
- }
159
- return {
160
- blocked: false,
161
- additionalContext: aggregateContext(outcome.results),
162
- };
163
- }
164
-
165
- /**
166
- * Dispatch the `async: true` hooks for an event fire-and-forget onto the given
167
- * supervisor (see async-hook-supervisor). Sync hooks are ignored here — they run
168
- * on the blocking path. No-op (returns []) without a supervisor or async hooks,
169
- * so callers can wire it unconditionally.
170
- *
171
- * @param {object} settingsHooks merged hooks block
172
- * @param {string} event UserPromptSubmit / PostToolUse / Stop / …
173
- * @param {object} payload extra fields merged into the hook stdin JSON
174
- * @param {object} opts { cwd, matchTarget, supervisor }
175
- * @returns {Array<{command:string, dispatched:boolean, reason?:string}>}
176
- */
177
- function dispatchAsyncHooks(settingsHooks, event, payload = {}, opts = {}) {
178
- const supervisor = opts.supervisor;
179
- if (!settingsHooks || !supervisor) return [];
180
- const matched = collectHooks(settingsHooks, event, opts.matchTarget || "");
181
- if (matched.length === 0) return [];
182
- const { async: asyncHooks } = partitionAsyncHooks(matched);
183
- if (asyncHooks.length === 0) return [];
184
- return supervisor.dispatch(
185
- asyncHooks,
186
- { hook_event_name: event, cwd: opts.cwd, ...payload },
187
- { cwd: opts.cwd, broker: opts.broker },
188
- );
189
- }
190
-
191
- /**
192
- * SessionStart settings hooks (observe + context injection). The `source`
193
- * (startup / resume / clear) is the matcher target.
194
- * @returns {{ additionalContext:string|null }}
195
- */
196
- function runSessionStartHooks(settingsHooks, { source, cwd, sessionId } = {}) {
197
- publishHooksV2Event("SessionStart", {
198
- source: source || "startup",
199
- cwd: cwd || null,
200
- session_id: sessionId || null,
201
- });
202
- if (!settingsHooks) return { additionalContext: null };
203
- const matched = collectHooks(settingsHooks, "SessionStart", source || "");
204
- if (matched.length === 0) return { additionalContext: null };
205
- const payload = withDeliveryId(
206
- "SessionStart",
207
- {
208
- hook_event_name: "SessionStart",
209
- source: source || "startup",
210
- cwd,
211
- session_id: sessionId || null,
212
- },
213
- { sessionId },
214
- );
215
- const outcome = _deps.runHooks(matched, payload, {
216
- cwd,
217
- event: "SessionStart",
218
- });
219
- return { additionalContext: aggregateContext(outcome.results) };
220
- }
221
-
222
- /**
223
- * CwdChanged settings hooks (observe + context injection). Fired when the
224
- * working directory changes mid-session (`/cd`) — a distinct lifecycle event
225
- * (Claude-Code-parity extension) automation can react to (re-audit trust of the
226
- * new dir, reload a per-dir tool config, …). Observe-only: a cwd change never
227
- * gates flow, so any `block` decision is ignored and only emitted context is
228
- * returned. No-op (byte-unchanged) without a registered CwdChanged hook.
229
- * @returns {{ additionalContext:string|null }}
230
- */
231
- function runCwdChangedHooks(
232
- settingsHooks,
233
- { oldCwd, newCwd, cwd, sessionId } = {},
234
- ) {
235
- publishHooksV2Event("CwdChanged", {
236
- old_cwd: oldCwd || null,
237
- cwd: newCwd || cwd || null,
238
- session_id: sessionId || null,
239
- });
240
- if (!settingsHooks) return { additionalContext: null };
241
- const matched = collectHooks(settingsHooks, "CwdChanged", newCwd || "");
242
- const { sync } = partitionAsyncHooks(matched);
243
- if (sync.length === 0) return { additionalContext: null };
244
- const payload = withDeliveryId(
245
- "CwdChanged",
246
- {
247
- hook_event_name: "CwdChanged",
248
- old_cwd: oldCwd || null,
249
- cwd: newCwd || cwd || null,
250
- session_id: sessionId || null,
251
- },
252
- { sessionId },
253
- );
254
- const outcome = _deps.runHooks(sync, payload, {
255
- cwd: newCwd || cwd,
256
- event: "CwdChanged",
257
- });
258
- return { additionalContext: aggregateContext(outcome.results) };
259
- }
260
-
261
- /**
262
- * WorktreeCreate settings hooks (observe + context injection). Fired right after
263
- * `cc agent --worktree` carves a fresh isolated git worktree — a hook can react
264
- * (register the worktree with an external tracker, seed per-branch tooling,
265
- * warm a build cache). The matcher target is the branch name, so a regex matcher
266
- * can scope to a branch pattern. Observe-only: worktree setup already succeeded,
267
- * so a `block` decision is ignored and only emitted context is returned. No-op
268
- * (byte-unchanged) without a registered WorktreeCreate hook.
269
- * @returns {{ additionalContext:string|null }}
270
- */
271
- function runWorktreeCreateHooks(
272
- settingsHooks,
273
- { worktreePath, branch, baseSha, cwd, sessionId } = {},
274
- ) {
275
- publishHooksV2Event("WorktreeCreate", {
276
- worktree_path: worktreePath || null,
277
- branch: branch || null,
278
- base_sha: baseSha || null,
279
- cwd: cwd || worktreePath || null,
280
- session_id: sessionId || null,
281
- });
282
- if (!settingsHooks) return { additionalContext: null };
283
- const matched = collectHooks(settingsHooks, "WorktreeCreate", branch || "");
284
- const { sync } = partitionAsyncHooks(matched);
285
- if (sync.length === 0) return { additionalContext: null };
286
- const payload = withDeliveryId(
287
- "WorktreeCreate",
288
- {
289
- hook_event_name: "WorktreeCreate",
290
- worktree_path: worktreePath || null,
291
- branch: branch || null,
292
- base_sha: baseSha || null,
293
- cwd: cwd || worktreePath || null,
294
- session_id: sessionId || null,
295
- },
296
- { sessionId },
297
- );
298
- const outcome = _deps.runHooks(sync, payload, {
299
- cwd: cwd || worktreePath,
300
- event: "WorktreeCreate",
301
- });
302
- return { additionalContext: aggregateContext(outcome.results) };
303
- }
304
-
305
- /**
306
- * WorktreeRemove settings hooks (observe + context injection). Fired when a
307
- * `cc agent --worktree` session finishes and its worktree is torn down (or when
308
- * a `keep` decision leaves it in place — `removed` distinguishes the two) — a
309
- * hook can react (unregister the worktree, prune a per-branch cache, notify CI).
310
- * Matcher target is the branch name. Observe-only: teardown already happened, so
311
- * a `block` decision is ignored and only emitted context is returned. No-op
312
- * (byte-unchanged) without a registered WorktreeRemove hook.
313
- * @returns {{ additionalContext:string|null }}
314
- */
315
- function runWorktreeRemoveHooks(
316
- settingsHooks,
317
- { worktreePath, branch, removed, reason, cwd, sessionId } = {},
318
- ) {
319
- publishHooksV2Event("WorktreeRemove", {
320
- worktree_path: worktreePath || null,
321
- branch: branch || null,
322
- removed: removed === true,
323
- reason: reason || null,
324
- cwd: cwd || worktreePath || null,
325
- session_id: sessionId || null,
326
- });
327
- if (!settingsHooks) return { additionalContext: null };
328
- const matched = collectHooks(settingsHooks, "WorktreeRemove", branch || "");
329
- const { sync } = partitionAsyncHooks(matched);
330
- if (sync.length === 0) return { additionalContext: null };
331
- const payload = withDeliveryId(
332
- "WorktreeRemove",
333
- {
334
- hook_event_name: "WorktreeRemove",
335
- worktree_path: worktreePath || null,
336
- branch: branch || null,
337
- removed: removed === true,
338
- reason: reason || null,
339
- cwd: cwd || worktreePath || null,
340
- session_id: sessionId || null,
341
- },
342
- { sessionId },
343
- );
344
- const outcome = _deps.runHooks(sync, payload, {
345
- cwd: cwd || worktreePath,
346
- event: "WorktreeRemove",
347
- });
348
- return { additionalContext: aggregateContext(outcome.results) };
349
- }
350
-
351
- /**
352
- * InstructionsLoaded settings hooks (observe + context injection). Fired once at
353
- * session start after the project-instruction block (cc.md / CLAUDE.md / AGENTS.md
354
- * hierarchy + `.claude/rules/*`) is composed into the system prompt — a hook can
355
- * react to WHICH instruction files are authoritative this session (audit them,
356
- * warn on an unexpected local override, load a companion tool config). The
357
- * caller passes the EXACT loaded set; this producer trims each entry to
358
- * `{path, scope, truncated}` (never the file CONTENT — a hook that wants content
359
- * reads the path). Observe-only: instructions are already loaded, so a `block`
360
- * decision is ignored and only emitted context is returned. No-op (byte-unchanged)
361
- * without a registered InstructionsLoaded hook.
362
- * @returns {{ additionalContext:string|null }}
363
- */
364
- function runInstructionsLoadedHooks(
365
- settingsHooks,
366
- { files, cwd, sessionId } = {},
367
- ) {
368
- publishHooksV2Event("InstructionsLoaded", {
369
- count: Array.isArray(files) ? files.length : 0,
370
- cwd: cwd || null,
371
- session_id: sessionId || null,
372
- });
373
- if (!settingsHooks) return { additionalContext: null };
374
- const matched = collectHooks(settingsHooks, "InstructionsLoaded", "");
375
- const { sync } = partitionAsyncHooks(matched);
376
- if (sync.length === 0) return { additionalContext: null };
377
- const list = Array.isArray(files) ? files : [];
378
- const payload = withDeliveryId(
379
- "InstructionsLoaded",
380
- {
381
- hook_event_name: "InstructionsLoaded",
382
- files: list.map((f) => ({
383
- path: f?.path || null,
384
- scope: f?.scope || null,
385
- truncated: f?.truncated === true,
386
- })),
387
- count: list.length,
388
- cwd: cwd || null,
389
- session_id: sessionId || null,
390
- },
391
- { sessionId },
392
- );
393
- const outcome = _deps.runHooks(sync, payload, {
394
- cwd,
395
- event: "InstructionsLoaded",
396
- });
397
- return { additionalContext: aggregateContext(outcome.results) };
398
- }
399
-
400
- /**
401
- * Generic observe-only fire (SessionEnd / Stop / PreCompact). Returns the raw
402
- * runHooks outcome so callers can read a block reason; never gates flow here.
403
- *
404
- * `async: true` hooks are EXCLUDED from this synchronous run — they are always
405
- * fire-and-forget and are dispatched separately (dispatchAsyncHooks), so running
406
- * them here too would double-execute them.
407
- */
408
- function runObserveHooks(
409
- settingsHooks,
410
- event,
411
- payload = {},
412
- { cwd, matchTarget, traceId, parentId } = {},
413
- ) {
414
- publishHooksV2Event(event, {
415
- ...payload,
416
- cwd: cwd || payload.cwd || null,
417
- trace_id: traceId || payload.trace_id || null,
418
- parent_id: parentId || payload.parent_id || null,
419
- });
420
- if (!settingsHooks) return { decision: "continue", results: [] };
421
- const matched = collectHooks(settingsHooks, event, matchTarget || "");
422
- const { sync } = partitionAsyncHooks(matched);
423
- if (sync.length === 0) return { decision: "continue", results: [] };
424
- return _deps.runHooks(
425
- sync,
426
- withDeliveryId(
427
- event,
428
- { hook_event_name: event, cwd, ...payload },
429
- { traceId, parentId },
430
- ),
431
- { cwd, event },
432
- );
61
+ async function canonicalCall(name, args) {
62
+ const canonical = await import("./settings-hook-events.js");
63
+ return canonical[name](...args);
433
64
  }
434
65
 
435
66
  module.exports = {
436
67
  withDeliveryId,
437
- runUserPromptSubmitHooks,
438
- runSessionStartHooks,
439
- runCwdChangedHooks,
440
- runWorktreeCreateHooks,
441
- runWorktreeRemoveHooks,
442
- runInstructionsLoadedHooks,
443
- runObserveHooks,
444
68
  aggregateContext,
445
69
  partitionAsyncHooks,
446
- dispatchAsyncHooks,
447
- _deps,
70
+ // Async definitions are already scheduled exactly once by Hooks v2.
71
+ dispatchAsyncHooks: () => [],
72
+ runUserPromptSubmitHooks: (...args) =>
73
+ canonicalCall("runUserPromptSubmitHooks", args),
74
+ runSessionStartHooks: (...args) =>
75
+ canonicalCall("runSessionStartHooks", args),
76
+ runCwdChangedHooks: (...args) => canonicalCall("runCwdChangedHooks", args),
77
+ runWorktreeCreateHooks: (...args) =>
78
+ canonicalCall("runWorktreeCreateHooks", args),
79
+ runWorktreeRemoveHooks: (...args) =>
80
+ canonicalCall("runWorktreeRemoveHooks", args),
81
+ runInstructionsLoadedHooks: (...args) =>
82
+ canonicalCall("runInstructionsLoadedHooks", args),
83
+ runObserveHooks: (...args) => canonicalCall("runObserveHooks", args),
448
84
  };