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,10 +1,216 @@
1
- import { runHooks } from "./hook-runner.js";
2
1
  import events from "./settings-hook-events.cjs";
2
+ import { executeHooksV2Event } from "./hooks-v2-producers.js";
3
3
 
4
- events._deps.runHooks = runHooks;
4
+ export const { withDeliveryId, partitionAsyncHooks } = events;
5
5
 
6
- export const {
6
+ function canonicalContext(results = []) {
7
+ const values = [];
8
+ for (const entry of results) {
9
+ if (entry?.status !== "success" || !entry.result) continue;
10
+ const result = entry.result;
11
+ const value =
12
+ typeof result.additionalContext === "string"
13
+ ? result.additionalContext
14
+ : typeof result.raw === "string"
15
+ ? result.raw
16
+ : null;
17
+ const text = value?.trim();
18
+ if (text) values.push(text);
19
+ }
20
+ return values.length > 0 ? values.join("\n") : null;
21
+ }
22
+
23
+ export function aggregateContext(results = []) {
24
+ return canonicalContext(results) || events.aggregateContext(results);
25
+ }
26
+
27
+ async function executeCanonicalSettingsEvent(
28
+ settingsHooks,
29
+ event,
30
+ payload,
31
+ { cwd, matchTarget, failClosed = false, supervisor, broker } = {},
32
+ ) {
33
+ const envelope = withDeliveryId(event, {
34
+ ...payload,
35
+ hook_event_name: event,
36
+ cwd: cwd || payload.cwd || null,
37
+ });
38
+ return executeHooksV2Event(event, envelope, {
39
+ settingsHooks,
40
+ matchTarget: matchTarget || "",
41
+ cwd: cwd || payload.cwd || process.cwd(),
42
+ failClosed,
43
+ asyncDispatcher:
44
+ supervisor && typeof supervisor.dispatch === "function"
45
+ ? (hook, context) =>
46
+ supervisor.dispatch([hook.legacyHook || hook], context, {
47
+ cwd: cwd || payload.cwd || process.cwd(),
48
+ broker,
49
+ })
50
+ : null,
51
+ });
52
+ }
53
+
54
+ export async function runUserPromptSubmitHooks(
55
+ settingsHooks,
56
+ { prompt, cwd, sessionId } = {},
57
+ ) {
58
+ const outcome = await executeCanonicalSettingsEvent(
59
+ settingsHooks,
60
+ "UserPromptSubmit",
61
+ { prompt: String(prompt || ""), cwd, session_id: sessionId || null },
62
+ { cwd, failClosed: true },
63
+ );
64
+ const result = {
65
+ blocked: outcome.blocked || outcome.decision === "ask",
66
+ additionalContext: canonicalContext(outcome.results),
67
+ };
68
+ const reason = outcome.blockingResult?.reason || null;
69
+ const hook = outcome.results?.find((entry) =>
70
+ ["block", "ask"].includes(entry.decision),
71
+ )?.hookId;
72
+ if (reason) result.reason = reason;
73
+ if (hook) result.hook = hook;
74
+ return result;
75
+ }
76
+
77
+ export async function runSessionStartHooks(
78
+ settingsHooks,
79
+ { source, cwd, sessionId } = {},
80
+ ) {
81
+ const outcome = await executeCanonicalSettingsEvent(
82
+ settingsHooks,
83
+ "SessionStart",
84
+ {
85
+ source: source || "startup",
86
+ cwd,
87
+ session_id: sessionId || null,
88
+ },
89
+ { cwd, matchTarget: source || "" },
90
+ );
91
+ return { additionalContext: canonicalContext(outcome.results) };
92
+ }
93
+
94
+ export async function runCwdChangedHooks(
95
+ settingsHooks,
96
+ { oldCwd, newCwd, cwd, sessionId } = {},
97
+ ) {
98
+ const targetCwd = newCwd || cwd;
99
+ const outcome = await executeCanonicalSettingsEvent(
100
+ settingsHooks,
101
+ "CwdChanged",
102
+ {
103
+ old_cwd: oldCwd || null,
104
+ cwd: targetCwd || null,
105
+ session_id: sessionId || null,
106
+ },
107
+ { cwd: targetCwd, matchTarget: newCwd || "" },
108
+ );
109
+ return { additionalContext: canonicalContext(outcome.results) };
110
+ }
111
+
112
+ export async function runWorktreeCreateHooks(
113
+ settingsHooks,
114
+ { worktreePath, branch, baseSha, cwd, sessionId } = {},
115
+ ) {
116
+ const targetCwd = cwd || worktreePath;
117
+ const outcome = await executeCanonicalSettingsEvent(
118
+ settingsHooks,
119
+ "WorktreeCreate",
120
+ {
121
+ worktree_path: worktreePath || null,
122
+ branch: branch || null,
123
+ base_sha: baseSha || null,
124
+ cwd: targetCwd || null,
125
+ session_id: sessionId || null,
126
+ },
127
+ { cwd: targetCwd, matchTarget: branch || "" },
128
+ );
129
+ return { additionalContext: canonicalContext(outcome.results) };
130
+ }
131
+
132
+ export async function runWorktreeRemoveHooks(
133
+ settingsHooks,
134
+ { worktreePath, branch, removed, reason, cwd, sessionId } = {},
135
+ ) {
136
+ const targetCwd = cwd || worktreePath;
137
+ const outcome = await executeCanonicalSettingsEvent(
138
+ settingsHooks,
139
+ "WorktreeRemove",
140
+ {
141
+ worktree_path: worktreePath || null,
142
+ branch: branch || null,
143
+ removed: removed === true,
144
+ reason: reason || null,
145
+ cwd: targetCwd || null,
146
+ session_id: sessionId || null,
147
+ },
148
+ { cwd: targetCwd, matchTarget: branch || "" },
149
+ );
150
+ return { additionalContext: canonicalContext(outcome.results) };
151
+ }
152
+
153
+ export async function runInstructionsLoadedHooks(
154
+ settingsHooks,
155
+ { files, cwd, sessionId } = {},
156
+ ) {
157
+ const list = Array.isArray(files) ? files : [];
158
+ const outcome = await executeCanonicalSettingsEvent(
159
+ settingsHooks,
160
+ "InstructionsLoaded",
161
+ {
162
+ files: list.map((file) => ({
163
+ path: file?.path || null,
164
+ scope: file?.scope || null,
165
+ truncated: file?.truncated === true,
166
+ })),
167
+ count: list.length,
168
+ cwd: cwd || null,
169
+ session_id: sessionId || null,
170
+ },
171
+ { cwd },
172
+ );
173
+ return { additionalContext: canonicalContext(outcome.results) };
174
+ }
175
+
176
+ export async function runObserveHooks(
177
+ settingsHooks,
178
+ event,
179
+ payload = {},
180
+ { cwd, matchTarget, traceId, parentId, supervisor, broker } = {},
181
+ ) {
182
+ const outcome = await executeCanonicalSettingsEvent(
183
+ settingsHooks,
184
+ event,
185
+ {
186
+ ...payload,
187
+ ...(traceId ? { trace_id: traceId } : {}),
188
+ ...(parentId ? { parent_id: parentId } : {}),
189
+ },
190
+ { cwd, matchTarget, supervisor, broker },
191
+ );
192
+ return {
193
+ ...outcome,
194
+ reason:
195
+ outcome.blockingResult?.reason || outcome.blockingResult?.message || null,
196
+ hook:
197
+ outcome.results?.find((entry) =>
198
+ ["block", "ask"].includes(entry.decision),
199
+ )?.hookId || null,
200
+ };
201
+ }
202
+
203
+ // Async definitions are selected and scheduled exactly once by the canonical
204
+ // runtime. This compatibility function prevents legacy callers from dispatching
205
+ // the same definition a second time.
206
+ export function dispatchAsyncHooks() {
207
+ return [];
208
+ }
209
+
210
+ export default {
7
211
  withDeliveryId,
212
+ aggregateContext,
213
+ partitionAsyncHooks,
8
214
  runUserPromptSubmitHooks,
9
215
  runSessionStartHooks,
10
216
  runCwdChangedHooks,
@@ -12,9 +218,5 @@ export const {
12
218
  runWorktreeRemoveHooks,
13
219
  runInstructionsLoadedHooks,
14
220
  runObserveHooks,
15
- aggregateContext,
16
- partitionAsyncHooks,
17
221
  dispatchAsyncHooks,
18
- } = events;
19
-
20
- export default events;
222
+ };
@@ -30,30 +30,12 @@ const fsDefault = require("node:fs");
30
30
  const crypto = require("node:crypto");
31
31
  const { SUGGEST_UMBRELLA } = require("./permission-rules.cjs");
32
32
  const { projectRootBase } = require("./project-root.cjs");
33
+ const { HOOK_EVENT_TYPES } = require("./hook-runtime-contract.cjs");
33
34
 
34
35
  const _deps = { fs: fsDefault, homedir: () => os.homedir() };
35
36
 
36
37
  /** Events this loader understands (PreToolUse/PostToolUse are wired first). */
37
- const HOOK_EVENTS = Object.freeze([
38
- "PreToolUse",
39
- "PostToolUse",
40
- "UserPromptSubmit",
41
- "Stop",
42
- "SubagentStart",
43
- "SubagentStop",
44
- "SessionStart",
45
- "SessionResume",
46
- "SessionPause",
47
- "SessionEnd",
48
- "ConfigChange",
49
- "PreCompact",
50
- "Notification",
51
- "PermissionRequest",
52
- "CwdChanged",
53
- "WorktreeCreate",
54
- "WorktreeRemove",
55
- "InstructionsLoaded",
56
- ]);
38
+ const HOOK_EVENTS = Object.freeze(Object.values(HOOK_EVENT_TYPES));
57
39
 
58
40
  /**
59
41
  * Same hierarchy as settings-loader (user < project-root < cwd < --settings).
@@ -138,7 +120,7 @@ function managedSettingsFile(env = process.env) {
138
120
 
139
121
  function attachAuthoritySource(target, source) {
140
122
  if (!source) return target;
141
- const authoritySource = Object.freeze({
123
+ const authoritySource = {
142
124
  kind:
143
125
  source.kind === "managed"
144
126
  ? "managed"
@@ -150,7 +132,22 @@ function attachAuthoritySource(target, source) {
150
132
  ? path.resolve(source.sourceFile)
151
133
  : null,
152
134
  digest: String(source.digest || ""),
135
+ };
136
+ Object.defineProperty(authoritySource, "scope", {
137
+ value: ["managed", "user", "project", "explicit", "plugin"].includes(
138
+ source.scope,
139
+ )
140
+ ? source.scope
141
+ : source.kind === "managed"
142
+ ? "managed"
143
+ : source.kind === "plugin"
144
+ ? "plugin"
145
+ : "project",
146
+ enumerable: false,
147
+ writable: false,
148
+ configurable: false,
153
149
  });
150
+ Object.freeze(authoritySource);
154
151
  Object.defineProperty(target, "authoritySource", {
155
152
  value: authoritySource,
156
153
  enumerable: true,
@@ -166,6 +163,7 @@ function appendHookBlock(merged, data, authoritySource) {
166
163
  if (!block) return false;
167
164
  let contributed = false;
168
165
  for (const [event, groups] of Object.entries(block)) {
166
+ if (!HOOK_EVENTS.includes(event)) continue;
169
167
  if (!Array.isArray(groups)) continue;
170
168
  for (const g of groups) {
171
169
  if (!g || typeof g !== "object" || !Array.isArray(g.hooks)) continue;
@@ -195,6 +193,14 @@ function loadHooks({
195
193
  const files = [];
196
194
  const authorityErrors = [];
197
195
  const managedFile = managedSettingsFile(env);
196
+ const userSettingsFile = path.resolve(
197
+ _deps.homedir(),
198
+ ".claude",
199
+ "settings.json",
200
+ );
201
+ const explicitSettingsFile = settingsFile
202
+ ? path.resolve(cwd, settingsFile)
203
+ : null;
198
204
  let managed = null;
199
205
  let managedRecord = null;
200
206
  if (_deps.fs.existsSync(managedFile)) {
@@ -237,6 +243,13 @@ function loadHooks({
237
243
  kind: "settings",
238
244
  sourceFile: record.sourceFile,
239
245
  digest: record.digest,
246
+ scope:
247
+ path.resolve(record.sourceFile) === userSettingsFile
248
+ ? "user"
249
+ : explicitSettingsFile &&
250
+ path.resolve(record.sourceFile) === explicitSettingsFile
251
+ ? "explicit"
252
+ : "project",
240
253
  })
241
254
  : false;
242
255
  if (contributed) files.push(file);
@@ -247,6 +260,7 @@ function loadHooks({
247
260
  kind: "managed",
248
261
  sourceFile: managedRecord.sourceFile,
249
262
  digest: managedRecord.digest,
263
+ scope: "managed",
250
264
  })
251
265
  ) {
252
266
  files.push(managedFile);
@@ -364,6 +378,7 @@ function collectHooks(hooksBlock, event, toolName) {
364
378
  const collected = {
365
379
  command: h.command,
366
380
  timeout: h.timeout,
381
+ priority: h.priority,
367
382
  event,
368
383
  async: h.async === true,
369
384
  asyncRewake: h.asyncRewake === true,
@@ -418,47 +433,10 @@ function extractCommandHooks(data) {
418
433
  return out;
419
434
  }
420
435
 
421
- /** `~/.chainlesschain/hook-trust.json` — remembered first-run acknowledgments. */
422
- function hookTrustStorePath() {
423
- return path.join(_deps.homedir(), ".chainlesschain", "hook-trust.json");
424
- }
425
-
426
- function readHookTrustStore() {
427
- try {
428
- const f = hookTrustStorePath();
429
- if (!_deps.fs.existsSync(f)) return {};
430
- const parsed = JSON.parse(_deps.fs.readFileSync(f, "utf-8"));
431
- return parsed && typeof parsed === "object" ? parsed : {};
432
- } catch {
433
- return {}; // unreadable store → treat as nothing acknowledged
434
- }
435
- }
436
-
437
- function writeHookTrustStore(store) {
438
- try {
439
- const f = hookTrustStorePath();
440
- _deps.fs.mkdirSync(path.dirname(f), { recursive: true });
441
- _deps.fs.writeFileSync(f, JSON.stringify(store, null, 2), "utf-8");
442
- return true;
443
- } catch {
444
- return false; // best-effort — a failed write just re-shows the notice
445
- }
446
- }
447
-
448
436
  /**
449
- * First-run trust notice for project-sourced settings.json hooks (which run
450
- * shell). The user's own `~/.claude/settings.json` and an explicit `--settings`
451
- * file are trusted; only the project's `.claude/settings{,.local}.json` (project
452
- * root + cwd) carry the cloned-repo auto-execution risk that Claude-Code 2.1.195
453
- * gated ("untrusted project config must require explicit consent").
454
- *
455
- * Returns a one-line notice (and records an acknowledgment hash) the FIRST time
456
- * a project's shell-running hooks are seen — and again only if those hooks
457
- * change. Returns null when there are no project hooks, the hooks are unchanged
458
- * since last acknowledged, or the notice is disabled (`CC_HOOK_TRUST_NOTICE=0`,
459
- * or hooks themselves are off via `CC_SETTINGS_HOOKS=0`). Best-effort: a failed
460
- * store write still returns the notice (shown again next run) rather than
461
- * throwing — it must never abort agent startup.
437
+ * Explain the canonical project-Hook trust gate without granting trust.
438
+ * Execution is authorized only by the shared, content-addressed workspace
439
+ * trust ledger (`cc hook trust`); displaying this notice is never consent.
462
440
  *
463
441
  * @returns {string|null}
464
442
  */
@@ -498,31 +476,12 @@ function projectHookTrustNotice({ cwd = process.cwd(), settingsFile } = {}) {
498
476
  }
499
477
  if (entries.length === 0) return null;
500
478
 
501
- const fingerprint = entries
502
- .map((e) => `${e.event}${e.matcher ?? ""}${e.command}`)
503
- .sort();
504
- const hash = crypto
505
- .createHash("sha256")
506
- .update(JSON.stringify(fingerprint))
507
- .digest("hex");
508
- const key = projectRootBase(cwd, { fs: _deps.fs, path }) || cwd;
509
-
510
- const store = readHookTrustStore();
511
- if (store[key] && store[key].hash === hash) return null; // already acknowledged
512
- store[key] = {
513
- hash,
514
- files: contributing,
515
- count: entries.length,
516
- at: new Date().toISOString(),
517
- };
518
- writeHookTrustStore(store); // best-effort acknowledgment
519
-
520
479
  const fileList = contributing.map((f) => ` ${f}`).join("\n");
521
480
  return (
522
481
  `⚠ This project's .claude/settings.json defines ${entries.length} ` +
523
- `shell-running hook(s) that auto-run on agent activity:\n${fileList}\n` +
524
- ` Review them before trusting this repo. Shown once per change; ` +
525
- `disable all hooks with CC_SETTINGS_HOOKS=0.`
482
+ `shell-running hook(s), currently blocked until explicitly trusted:\n${fileList}\n` +
483
+ ` Review them, then run cc hook trust. Any content change requires ` +
484
+ `reapproval; disable all hooks with CC_SETTINGS_HOOKS=0.`
526
485
  );
527
486
  }
528
487
 
@@ -9,4 +9,7 @@
9
9
  * `packages/cli/src/gateways/ws/ws-session-gateway.js` in new code.
10
10
  */
11
11
 
12
- export { WSSessionManager } from "../gateways/ws/ws-session-gateway.js";
12
+ export {
13
+ WS_SESSION_ROLLOUT_EVENT,
14
+ WSSessionManager,
15
+ } from "../gateways/ws/ws-session-gateway.js";