chainlesschain 0.165.5 → 0.165.8

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 (256) hide show
  1. package/package.json +2 -1
  2. package/src/assets/web-panel/assets/{AIOps-CEeYTeDB.js → AIOps-B3gWmXjo.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-BeRUQ3V2.js → ActionButton-G9pdT-0e.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-DrV718XF.js → Analytics-Ca30J7m2.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-Cd2Frt7Q.js → AppLayout-BtVTm8PU.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-CUJMlORU.js → Artifacts-BhViNa6u.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-CXJcfT6p.js → Audit-DhKq-FnY.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-DOv6Z7H9.js → BackgroundAgents-BL0SVbnE.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-BwdDyBI0.js → Backup-BWkblnFi.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-BmLn4kYH.js → BaseInput-ClaRNrF8.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-COg8pAW2.js → Chat-sZE2Z77o.js} +4 -4
  12. package/src/assets/web-panel/assets/ChatBubbleRenderer-BAfKOnRe.js +1 -0
  13. package/src/assets/web-panel/assets/{Checkbox-BCP4uoU8.js → Checkbox-Cvhay5WM.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-pRt6Y9JI.js → Codegen-BpejL-4N.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-DLaprKhS.js → Col-g2Ki6g_1.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-DyATsz5f.js → Community-D2xKbNo9.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-BXAaupZK.js → Compact-DbL1Pds3.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-DpcJBELr.js → Compliance-DGtZCV4c.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-DG4EFWyd.js → Cowork-4kQpoNsI.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-F6Oy5n2P.js → Cron-BxTYXXAN.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-BOdgtalX.js → Crosschain-k0J0LT2N.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-DT1dSkjH.js → DID-BaqhoPgN.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-NBUIqWzC.js → Dashboard-T4RVPIM1.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-CSpHeMYB.js → Dropdown-DszOToWq.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-CEG0xISr.js → EmailListRenderer-C9KJU7HF.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BTZ0BZna.js → FamilyGuardDashboard-Cmr0JnsA.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-BuuCTn2V.js → Federation-BI-_2xZX.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-KAVceevk.js → FormItemContext-DsnDEPsl.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-DnHpcQvW.js → GenericCardRenderer-BLncAKKK.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-C_B_0HwB.js → Git-BPQhGXDn.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-DPSZuzuu.js → Governance-CyElbUQW.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-BV-06V7q.js → Inference-CcSntBQD.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-wpDuupn6.js → KnowledgeGraph-p6e7HZ2r.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-Bseca1_I.js → Logs-CNEtr-wz.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-Bj9xI0YH.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-d3kM4DDL.js → Marketplace-Dd2notAJ.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-DQ_xZ23i.js → McpTools-BBsN2CSW.js} +4 -4
  38. package/src/assets/web-panel/assets/{Memory-CRIeYO4L.js → Memory-Dg2uTvwx.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-BsllIa9l.js → MobileBridge-r1YMRiJV.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-BUuQy30X.js → MobileProjects-C-89kSm4.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-BOFDIzrC.js → Mtc-CrPZcVgf.js} +5 -5
  42. package/src/assets/web-panel/assets/{MtcAudit-BQg-vyvG.js → MtcAudit-sxi7hqJb.js} +5 -5
  43. package/src/assets/web-panel/assets/{Multisig-Bo1jrPdN.js → Multisig-CAgOMfF1.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-Bmod8alw.js → NLProgramming-DafaPts3.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-CGGFL8w-.js → Notes-CJM-xUW_.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-BsZvCJxC.js → NotificationSettings-L0ZjfAh_.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-C1-Quo_h.js → OrderTableRenderer-BB1CvCK0.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-BjOeDYOi.js → Organization-DeLtgAD8.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-DwVV3l5A.js → Overflow-CKC2b10z.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-Cu3DQT9W.js → P2P-eyf2rzY1.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-Cg0gR7dH.js → PdhVaultBrowser-5upNIOW8.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-CsAXxRN5.js → Permissions-B8p3W6JK.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-C-nNmnYp.js → PersonalDataHub-BnRMxTq3.js} +5 -5
  54. package/src/assets/web-panel/assets/{Pipeline-BOnW7nNc.js → Pipeline-DjCNI1li.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-ClLSyGKt.js → Privacy-u6gXLbWT.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-DuLvjjq7.js → ProjectInit-BZAw4tkM.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-DQYYbDD9.js → ProjectSettings-B1Tr72q7.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-Drw8MBGK.js → Projects-DO7HFuBQ.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-ckqHQe6K.js → Providers-BjCztyhj.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-DW5BXk-G.js → QrScannerModal-ZWyCUbR1.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-DDLnhNTp.js → QuickAsk-DhDjeW4G.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-PJQ2C91U.js → Recommend-R_CN2MuU.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-s6wmda34.js → RemoteSession-uxFcujeu.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-DC2sb-I3.js → Reputation-DX8D7rks.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-hPGk1eGj.js → Row-BYahQILD.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-RIvfZql0.js → RssFeed-CUSQ2tm-.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-DFg1G1eR.js → Search-CnN_S8Cs.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-D6H5p8Dp.js → Security-DcZlh-O4.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-nxYiFV_w.js → Services-ZhBOjzIX.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-BmgFNAdB.js → Skeleton-D5Qnq_lI.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-CsaaD2av.js → Skills-BC9cZ3Be.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-yM5y9yvK.js → Sla-DauJ3E8_.js} +1 -1
  73. package/src/assets/web-panel/assets/SpeechSettings-DbNeZ_fh.js +1 -0
  74. package/src/assets/web-panel/assets/{SyncSettings-CFVhEyyr.js → SyncSettings-DUvJbSct.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-DdO02Inn.js → Tasks-BXa-5noQ.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-Eo2d8Llu.js → Templates-JxaiUt_3.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-ChESOXgy.js → Tenant-BW4ERQN8.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-BJ7oDxTI.js → Terminal-DltUbdtv.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-hWX0fUvz.js → TimelineRenderer-CMoZz0Tc.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-DVBZQnd-.js → Tokens-D_VEV60K.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-D89cQfVq.js → Trigger-CCXTCs0R.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-BIVSb4-V.js → Trust-lkGRIPcG.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-B58gWopl.js → UkeySign-BfGeQ9HX.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-DhHI7bmG.js → VideoEditing-BEC7pYvc.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-C4FheWS_.js → Wallet-BZdG24o0.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-DnPRq-Bx.js → WebAuthn-yoEddedp.js} +3 -3
  87. package/src/assets/web-panel/assets/{WorkflowEditor-BerRPjpJ.js → WorkflowEditor-BXZEprOW.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-BzZ52iKr.js → chat-gg0bzZal.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-BI_E4BAn.js → colors-DjRVRuin.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-d50mr3yk.js → compact-item-su-dieAc.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-C6FsQ1IH.js → createContext-Ci3S8oKF.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-CxbFX9uH.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-DLZEMgLP.js → hasIn-D8F10heH.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-D-aBumtY.js → index-11wtYQiF.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-CjuKZBqJ.js → index-1IgxgALJ.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-9H_M2jju.js → index-1agckWSq.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DE0V6cp-.js → index-5JqhujnR.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-Y2-q7QLm.js → index-6Tniqk1s.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DoFtCVZ7.js → index-8Z-8BIlN.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-KNGgO4Wm.js → index-BCI5v0yB.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DY4j5zkF.js → index-BDJntYmJ.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BZjjdQ62.js → index-BGzixOGZ.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BTpIOTfR.js → index-BMMOVoLD.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BB9SqVSt.js → index-BTFpdBtt.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-AHr7ryWf.js → index-Ba_HyPnE.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-Pvf30m8Q.js → index-BbF1IHof.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CRN5TRTQ.js → index-BgT9su_e.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CUaEHfQ0.js → index-BzPB6kGZ.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CdKt9fOd.js → index-C6ygzplr.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Dec0Kf_Z.js → index-CC3ZDjzY.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-IPkwSAW_.js → index-CEmXRhAE.js} +1 -1
  112. package/src/assets/web-panel/assets/index-CJGOlduY.js +1 -0
  113. package/src/assets/web-panel/assets/{index-C3k8kevG.js → index-CMPqd5Cv.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-A5CDWP7y.js → index-COWd8uGx.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CO8DAF7U.js → index-CPIYSp4H.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CVzuawCX.js → index-CR0h6seT.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Co7s9LsB.js → index-CUmDhC4j.js} +1 -1
  118. package/src/assets/web-panel/assets/index-CkBCN5yH.js +1 -0
  119. package/src/assets/web-panel/assets/{index-CLoTQr0W.js → index-CusgZPtc.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-B81mo1Et.js → index-DBAETXft.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BcSUl9fA.js → index-DIJ2qFOC.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Q5Tn735s.js → index-Dbq4NMET.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-GXE0D8Nx.js → index-DkMEF5VT.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-TWG-_D1M.js → index-DkfQR3hM.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BAE3hwev.js → index-DnLucOn9.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CgkoH3_g.js → index-DugB_aKa.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BRGx3w6T.js → index-DyLUarhZ.js} +3 -3
  128. package/src/assets/web-panel/assets/{index-BeM4hfht.js → index-T6_6ygJZ.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DsscwxPE.js → index-Tu8eWqh-.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Bmr_vxXD.js → index-W7XUgdVL.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-BoNZlzhQ.js → index-dHZinfko.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DqkbHHg8.js → index-jyNgp5FI.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-D-4Hzgej.js → initDefaultProps-Cv4p8e4w.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-D4Wl4xU7.js → motion-B8EwmMOw.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-Cd5eQvL0.js → move-B8R9F8TK.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-B4ilslCW.js → mtc-parser-DoFYz5Bp.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-Ckarx-tf.js → omit-CHWYLBjI.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-QJ0bpCmc.js → pickAttrs-CXuPDO77.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-CKHm-tq8.js → placementArrow-BaAtUUon.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-CV6a_w_Y.js → responsiveObserve-DCc4zcDD.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-mHpeQFgk.js → slide-B_lx89oZ.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-DIaQNQWA.js → statusUtils-DE8DPmR0.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-PJpzavV8.js → styleChecker-1ktXOsL_.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-BH7zTw8S.js → useFlexGapSupport-xH89-wjh.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-BDNG3JDd.js → useFs-DscvfW5p.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-CY2VWdUg.js → usePersonalDataHub-RdMKQta7.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-D0kw9jhz.js → vnode-Z3wTni2T.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-B5g7TN7r.js → zoom-B0iChCsm.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/command-help-index.json +3 -3
  151. package/src/commands/agent.js +105 -62
  152. package/src/commands/background-session.js +100 -10
  153. package/src/commands/git.js +39 -0
  154. package/src/commands/mcp.js +5 -0
  155. package/src/commands/plugin.js +160 -29
  156. package/src/commands/remote-control.js +295 -110
  157. package/src/commands/session-group.js +131 -0
  158. package/src/commands/session-location.js +48 -0
  159. package/src/commands/session-message.js +171 -0
  160. package/src/commands/session.js +22 -0
  161. package/src/commands/sync-providers.js +4 -1
  162. package/src/commands/update.js +1 -0
  163. package/src/data/changelog.json +41 -2
  164. package/src/gateways/ws/ws-agent-handler.js +20 -12
  165. package/src/harness/jsonl-session-store.js +279 -37
  166. package/src/harness/mcp-client.js +832 -91
  167. package/src/harness/session-index.js +15 -4
  168. package/src/lib/agent-worktree.js +8 -1
  169. package/src/lib/auto-mode-safety-classifier.js +3 -17
  170. package/src/lib/background-agent-keeper-protocol.js +26 -6
  171. package/src/lib/background-agent-supervisor.js +17 -1
  172. package/src/lib/background-session-transport.js +153 -27
  173. package/src/lib/browser-evidence.js +1405 -0
  174. package/src/lib/chrome-connector.js +465 -79
  175. package/src/lib/claude-project-auto-memory.js +481 -0
  176. package/src/lib/claude-project-storage-layout.js +104 -0
  177. package/src/lib/cloud/cloud-client.js +40 -0
  178. package/src/lib/execution-location-local-supervisor.mjs +226 -0
  179. package/src/lib/execution-location-runner-lifecycle.js +991 -0
  180. package/src/lib/execution-location-target-preflight.js +333 -0
  181. package/src/lib/execution-location-target.js +783 -13
  182. package/src/lib/file-lines.js +6 -1
  183. package/src/lib/gateway-client-resilience.js +571 -0
  184. package/src/lib/gitlab-mr-worktree.js +176 -0
  185. package/src/lib/hooks-v2-producers.js +119 -15
  186. package/src/lib/hooks-v2-workspace-context.js +44 -1
  187. package/src/lib/host-resource-budget.js +295 -0
  188. package/src/lib/ide-context.js +15 -2
  189. package/src/lib/llm-config-defaults.js +43 -0
  190. package/src/lib/mcp-client.js +2 -0
  191. package/src/lib/mcp-headers-helper.js +47 -5
  192. package/src/lib/mcp-lifecycle-authority.js +887 -0
  193. package/src/lib/mcp-oauth.js +156 -26
  194. package/src/lib/mcp-tls.js +330 -0
  195. package/src/lib/output-styles.js +12 -0
  196. package/src/lib/paths.js +260 -32
  197. package/src/lib/permission-request.js +48 -0
  198. package/src/lib/plugin-runtime/bin.js +3 -1
  199. package/src/lib/plugin-runtime/hooks.js +3 -1
  200. package/src/lib/plugin-runtime/install.js +730 -71
  201. package/src/lib/plugin-runtime/lsp.js +4 -4
  202. package/src/lib/plugin-runtime/marketplace-archive-source.js +366 -0
  203. package/src/lib/plugin-runtime/marketplace-catalog.js +63 -6
  204. package/src/lib/plugin-runtime/marketplace-command-descriptor.js +343 -0
  205. package/src/lib/plugin-runtime/marketplace-command-source.js +580 -0
  206. package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +1 -0
  207. package/src/lib/plugin-runtime/marketplace-source-adapter.js +188 -0
  208. package/src/lib/plugin-runtime/marketplace-source-cache.js +11 -1
  209. package/src/lib/plugin-runtime/mcp.js +3 -1
  210. package/src/lib/plugin-runtime/monitors.js +3 -1
  211. package/src/lib/plugin-runtime/remote-source.js +583 -58
  212. package/src/lib/plugin-runtime/settings.js +3 -1
  213. package/src/lib/plugin-runtime/trust.js +274 -13
  214. package/src/lib/plugin-security.js +393 -41
  215. package/src/lib/plugin-source-identity.js +850 -0
  216. package/src/lib/process-execution-broker/credential-agent.js +210 -41
  217. package/src/lib/process-execution-broker/index.js +15 -1
  218. package/src/lib/process-execution-broker/linux-cgroup-v2.js +391 -0
  219. package/src/lib/process-execution-broker/platform-sandbox.js +50 -28
  220. package/src/lib/project-mcp-trust.js +165 -10
  221. package/src/lib/remote-approval-bridge.js +136 -46
  222. package/src/lib/remote-control.js +217 -31
  223. package/src/lib/resume-session.js +9 -6
  224. package/src/lib/session-core-singletons.js +26 -11
  225. package/src/lib/session-host-lease.js +52 -16
  226. package/src/lib/session-lifecycle-scope.js +153 -0
  227. package/src/lib/session-message-fabric.js +1252 -0
  228. package/src/lib/session-projection.js +286 -3
  229. package/src/lib/session-runtime-retention.js +155 -0
  230. package/src/lib/session-store-guard.js +3 -1
  231. package/src/lib/session-workbench-store.js +466 -0
  232. package/src/lib/settings-loader.cjs +29 -0
  233. package/src/lib/spellcheck.js +211 -0
  234. package/src/lib/sub-agent-context.js +9 -9
  235. package/src/lib/sync-cli-db.js +485 -129
  236. package/src/lib/sync-credentials.js +31 -20
  237. package/src/lib/web-fetch.js +112 -40
  238. package/src/lib/web-search.js +127 -61
  239. package/src/lib/workspace-trust.js +793 -0
  240. package/src/repl/agent-repl.js +175 -19
  241. package/src/repl/permission-prompt.js +29 -8
  242. package/src/repl/repl-keybindings.js +55 -0
  243. package/src/runtime/agent-core.js +362 -20
  244. package/src/runtime/bootstrap.js +37 -13
  245. package/src/runtime/coding-agent-contract-shared.cjs +11 -4
  246. package/src/runtime/headless-runner.js +281 -102
  247. package/src/runtime/headless-stream.js +199 -30
  248. package/src/runtime/mcp-config.js +298 -6
  249. package/src/runtime/policies/agent-policy.js +10 -0
  250. package/src/runtime/status-diagnostics-lite.js +9 -1
  251. package/src/assets/web-panel/assets/ChatBubbleRenderer-4gGkdGgA.js +0 -1
  252. package/src/assets/web-panel/assets/MarkdownRenderer-B4RLp2zs.js +0 -1
  253. package/src/assets/web-panel/assets/SpeechSettings-DPy1XMYh.js +0 -1
  254. package/src/assets/web-panel/assets/devWarning-CagEcIex.js +0 -1
  255. package/src/assets/web-panel/assets/index-pzT9PpOU.js +0 -1
  256. package/src/assets/web-panel/assets/index-z1kFadaX.js +0 -1
@@ -61,6 +61,11 @@ import {
61
61
  verifyExecutionLocationResultApplySourceGit,
62
62
  } from "../lib/execution-location-result-apply.js";
63
63
  import { executionBroker } from "../lib/process-execution-broker/index.js";
64
+ import {
65
+ projectExecutionLocationTargetSigtermProbe,
66
+ projectExecutionLocationTargetPreflight,
67
+ runExecutionLocationTargetResourceProbe,
68
+ } from "../lib/execution-location-target-preflight.js";
64
69
  import {
65
70
  sameFileStatIdentity,
66
71
  samePathHandleFileIdentity,
@@ -1134,6 +1139,17 @@ function runPreviewAction(action, deps = {}) {
1134
1139
  }
1135
1140
  }
1136
1141
 
1142
+ async function runAsyncAction(action, options = {}) {
1143
+ try {
1144
+ const projection = await action();
1145
+ writeProjection(projection, options);
1146
+ return projection.allowed === false ? 2 : 0;
1147
+ } catch (error) {
1148
+ process.stderr.write(`Execution location failed: ${error.message}\n`);
1149
+ return 1;
1150
+ }
1151
+ }
1152
+
1137
1153
  export function registerSessionLocationSubcommands(session, deps = {}) {
1138
1154
  const location = session
1139
1155
  .command("location")
@@ -1152,6 +1168,38 @@ export function registerSessionLocationSubcommands(session, deps = {}) {
1152
1168
  );
1153
1169
  });
1154
1170
 
1171
+ location
1172
+ .command("target-preflight", { hidden: true })
1173
+ .description("Verify target-local runner fences and resource limits")
1174
+ .option("--json", "Machine-readable JSON output")
1175
+ .action((options) => {
1176
+ process.exitCode = runAction(
1177
+ () => projectExecutionLocationTargetPreflight({}, deps),
1178
+ options,
1179
+ );
1180
+ });
1181
+
1182
+ location
1183
+ .command("resource-probe <kind>", { hidden: true })
1184
+ .description("Exercise a target-local cpu or memory enforcement boundary")
1185
+ .action((kind) => {
1186
+ process.exitCode = runAction(
1187
+ () => runExecutionLocationTargetResourceProbe(kind),
1188
+ {},
1189
+ );
1190
+ });
1191
+
1192
+ location
1193
+ .command("sigterm-drain-probe", { hidden: true })
1194
+ .description("Exercise the target-local SIGTERM drain transition")
1195
+ .option("--json", "Machine-readable JSON output")
1196
+ .action(async (options) => {
1197
+ process.exitCode = await runAsyncAction(
1198
+ () => projectExecutionLocationTargetSigtermProbe({}, deps),
1199
+ options,
1200
+ );
1201
+ });
1202
+
1155
1203
  location
1156
1204
  .command("show <id>")
1157
1205
  .description("Show the execution location anchored by session_start")
@@ -0,0 +1,171 @@
1
+ import { logger } from "../lib/logger.js";
2
+ import { SessionMessageFabric } from "../lib/session-message-fabric.js";
3
+
4
+ function output(value, options = {}) {
5
+ if (options.json) {
6
+ logger.log(JSON.stringify(value, null, 2));
7
+ return;
8
+ }
9
+ if (Array.isArray(value)) {
10
+ if (value.length === 0) {
11
+ logger.log("No session messages.");
12
+ return;
13
+ }
14
+ for (const item of value) logger.log(JSON.stringify(item));
15
+ return;
16
+ }
17
+ logger.log(JSON.stringify(value, null, 2));
18
+ }
19
+
20
+ function numericOption(value) {
21
+ if (value == null) return null;
22
+ const number = Number(value);
23
+ return Number.isSafeInteger(number) && number > 0 ? number : value;
24
+ }
25
+
26
+ function fabric() {
27
+ return new SessionMessageFabric();
28
+ }
29
+
30
+ export function registerSessionMessageCommands(session) {
31
+ const message = session
32
+ .command("message")
33
+ .description(
34
+ "Durable cross-session inbox, addressing, policy and receipts",
35
+ );
36
+
37
+ message
38
+ .command("register <session-id>")
39
+ .description("Register or reconnect a uniquely named session endpoint")
40
+ .option("--name <name>", "Unique @name (defaults to session id)")
41
+ .option("--machine <id>", "Stable machine identity", "local")
42
+ .option(
43
+ "--policy <policy>",
44
+ "Inbound policy: accept | hold | refuse",
45
+ "accept",
46
+ )
47
+ .option("--busy", "Register as busy instead of idle")
48
+ .option("--json", "Output as JSON")
49
+ .action((sessionId, options) => {
50
+ output(
51
+ fabric().register({
52
+ sessionId,
53
+ name: options.name || sessionId,
54
+ machineId: options.machine,
55
+ policy: options.policy,
56
+ idle: options.busy !== true,
57
+ }),
58
+ options,
59
+ );
60
+ });
61
+
62
+ message
63
+ .command("unregister <endpoint>")
64
+ .description("Retire an endpoint epoch without leaking its inbox to reuse")
65
+ .option("--json", "Output as JSON")
66
+ .action((endpoint, options) => {
67
+ output(
68
+ { unregistered: fabric().unregister(endpoint), endpoint },
69
+ options,
70
+ );
71
+ });
72
+
73
+ message
74
+ .command("send <from> <to> <body...>")
75
+ .description("Send one bounded, idempotent message and print its receipt")
76
+ .option("--subject <text>", "Optional bounded subject")
77
+ .option("--message-id <id>", "Stable idempotency key")
78
+ .option("--sequence <n>", "Per sender/recipient ordering sequence")
79
+ .option("--ttl-ms <n>", "Message expiry in milliseconds")
80
+ .option(
81
+ "--notify-when-idle",
82
+ "Emit one receipt update when target becomes idle",
83
+ )
84
+ .option("--json", "Output as JSON")
85
+ .action((from, to, body, options) => {
86
+ output(
87
+ fabric().send({
88
+ from,
89
+ to,
90
+ body: body.join(" "),
91
+ subject: options.subject,
92
+ messageId: options.messageId,
93
+ sequence: numericOption(options.sequence),
94
+ ttlMs: numericOption(options.ttlMs),
95
+ notifyWhenIdle: options.notifyWhenIdle === true,
96
+ }),
97
+ options,
98
+ );
99
+ });
100
+
101
+ message
102
+ .command("inbox <endpoint>")
103
+ .description("Read an endpoint inbox in sender sequence order")
104
+ .option("--ack", "Acknowledge and release returned live message bodies")
105
+ .option("--json", "Output as JSON")
106
+ .action((endpoint, options) => {
107
+ output(fabric().inbox(endpoint, { acknowledge: options.ack }), options);
108
+ });
109
+
110
+ message
111
+ .command("receipts <endpoint>")
112
+ .description("List durable delivered/refused/full/expired receipts")
113
+ .option("--json", "Output as JSON")
114
+ .action((endpoint, options) => {
115
+ output(fabric().receipts(endpoint), options);
116
+ });
117
+
118
+ message
119
+ .command("policy <endpoint> <policy>")
120
+ .description("Set accept, hold or refuse with optional revision CAS")
121
+ .option("--expected-revision <n>", "Reject a stale rendered policy action")
122
+ .option("--json", "Output as JSON")
123
+ .action((endpoint, policy, options) => {
124
+ output(
125
+ fabric().setPolicy(endpoint, policy, {
126
+ expectedRevision: numericOption(options.expectedRevision),
127
+ }),
128
+ options,
129
+ );
130
+ });
131
+
132
+ message
133
+ .command("idle <endpoint> <state>")
134
+ .description("Set idle/busy and deliver notify_when_idle exactly once")
135
+ .option("--expected-revision <n>", "Reject a stale rendered idle action")
136
+ .option("--json", "Output as JSON")
137
+ .action((endpoint, state, options) => {
138
+ const normalized = String(state).trim().toLowerCase();
139
+ if (!["idle", "busy", "true", "false"].includes(normalized)) {
140
+ const error = new Error("state must be idle, busy, true or false");
141
+ error.code = "SESSION_MESSAGE_INVALID_ARGUMENT";
142
+ throw error;
143
+ }
144
+ output(
145
+ fabric().setIdle(endpoint, ["idle", "true"].includes(normalized), {
146
+ expectedRevision: numericOption(options.expectedRevision),
147
+ }),
148
+ options,
149
+ );
150
+ });
151
+
152
+ for (const action of ["disconnect", "reconnect"]) {
153
+ message
154
+ .command(`${action} <endpoint>`)
155
+ .description(
156
+ action === "disconnect"
157
+ ? "Mark transport offline while retaining its durable inbox"
158
+ : "Mark a durable endpoint transport online again",
159
+ )
160
+ .option("--json", "Output as JSON")
161
+ .action((endpoint, options) => {
162
+ output({ endpoint, [action]: fabric()[action](endpoint) }, options);
163
+ });
164
+ }
165
+
166
+ message
167
+ .command("status")
168
+ .description("Emit the bounded CLI-owned message projection")
169
+ .option("--json", "Output as JSON")
170
+ .action((options) => output(fabric().projection(), options));
171
+ }
@@ -68,6 +68,8 @@ import { registerSessionShowSubcommand } from "./session-show.js";
68
68
  import { registerSessionObservabilitySubcommand } from "./session-observability.js";
69
69
  import { registerSessionLocationSubcommands } from "./session-location.js";
70
70
  import { registerSessionBudgetCommands } from "./session-budget.js";
71
+ import { registerSessionMessageCommands } from "./session-message.js";
72
+ import { registerSessionGroupCommands } from "./session-group.js";
71
73
 
72
74
  export const _deps = {
73
75
  execFileSync: (...args) => executionBroker.execFileSync(...args),
@@ -226,6 +228,8 @@ export function registerSessionCommand(program) {
226
228
  registerSessionMcpRecoveryCommands(session);
227
229
  registerSessionLocationSubcommands(session);
228
230
  registerSessionBudgetCommands(session);
231
+ registerSessionMessageCommands(session);
232
+ registerSessionGroupCommands(session);
229
233
 
230
234
  // session list
231
235
  session
@@ -321,6 +325,8 @@ export function registerSessionCommand(program) {
321
325
  let team = [];
322
326
  let workflow = [];
323
327
  let dynamicWorkflow = [];
328
+ let sessionMessageFabric = null;
329
+ let sessionWorkbench = null;
324
330
  let artifacts = [];
325
331
  let prLinks = {};
326
332
 
@@ -462,6 +468,20 @@ export function registerSessionCommand(program) {
462
468
  } catch {
463
469
  // Summaries are optional; absence never removes a session.
464
470
  }
471
+ try {
472
+ const { SessionMessageFabric } =
473
+ await import("../lib/session-message-fabric.js");
474
+ sessionMessageFabric = new SessionMessageFabric().projection();
475
+ } catch (error) {
476
+ sourceErrors.sessionMessageFabric = error?.message || String(error);
477
+ }
478
+ try {
479
+ const { SessionWorkbenchStore } =
480
+ await import("../lib/session-workbench-store.js");
481
+ sessionWorkbench = new SessionWorkbenchStore().projection();
482
+ } catch (error) {
483
+ sourceErrors.sessionWorkbench = error?.message || String(error);
484
+ }
465
485
 
466
486
  const { buildSessionProjection } =
467
487
  await import("../lib/session-projection.js");
@@ -474,6 +494,8 @@ export function registerSessionCommand(program) {
474
494
  dynamicWorkflow,
475
495
  artifacts,
476
496
  prLinks,
497
+ sessionMessageFabric,
498
+ sessionWorkbench,
477
499
  sourceErrors,
478
500
  });
479
501
  if (options.json) {
@@ -188,7 +188,10 @@ async function _runProvider(providerId, opts = {}) {
188
188
  try {
189
189
  vault = await openCliVault();
190
190
  } catch (err) {
191
- if (err.code === "BETTER_SQLITE3_MISSING") {
191
+ if (
192
+ err?.code === "BETTER_SQLITE3_MISSING" ||
193
+ String(err?.code || "").startsWith("CLI_VAULT_")
194
+ ) {
192
195
  console.error(chalk.red(`✗ ${err.message}`));
193
196
  process.exitCode = 2;
194
197
  return;
@@ -91,6 +91,7 @@ export async function selfUpdateCli(targetVersion) {
91
91
  ...invocations.npm.prefixArgs,
92
92
  "install",
93
93
  "-g",
94
+ "--include=optional",
94
95
  `chainlesschain@${targetVersion}`,
95
96
  ],
96
97
  "update:npm-install",
@@ -1,16 +1,55 @@
1
1
  {
2
2
  "source": "CHANGELOG.md",
3
3
  "releases": [
4
+ {
5
+ "productVersion": null,
6
+ "cliVersion": "0.165.8",
7
+ "cliVersions": ["0.165.7", "0.165.8"],
8
+ "date": "2026-08-23",
9
+ "title": "",
10
+ "sections": [
11
+ {
12
+ "heading": "Fixed - cc CLI 0.165.8: release-gate home isolation",
13
+ "body": "> `chainlesschain` **0.165.7 -> 0.165.8** (source candidate; not yet\n> published, 2026-08-23).\n> CLI-only candidate; `@chainlesschain/personal-data-hub` remains **0.4.59**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Agent SDK release-gate isolation**: the real-CLI SDK test now keeps its\n simulated operating-system home separate from `CHAINLESSCHAIN_HOME`, while\n retaining separate workspace and rollback-resistant security-anchor roots.\n This exercises the production fail-closed layout without asking the CLI to\n repair owner-only permissions on a broad user-home directory.\n- **Candidate continuity**: exact SHA `350fb4ce71` passed the complete Linux,\n Windows, and macOS `CLI CI` (`32612516841`) and `CLI Strict Sandbox`\n (`32612516696`) matrices. Its immutable `v-npm-0-165-7` release run\n (`32613795671`) stopped in the Agent SDK test before package, dry-run, or npm\n publish jobs; `0.165.7` was therefore never published and the fix advances\n to a new immutable version/tag rather than moving the existing tag.\n- **Release status**: publication requires this candidate's exact commit to\n pass the complete Linux, Windows, and macOS `CLI CI` and `CLI Strict Sandbox`\n matrices. Tag, provenance, registry readback, and publication evidence must\n be recorded only after those exact-SHA gates succeed."
14
+ }
15
+ ]
16
+ },
17
+ {
18
+ "productVersion": null,
19
+ "cliVersion": "0.165.7",
20
+ "cliVersions": ["0.165.6", "0.165.7"],
21
+ "date": "2026-08-23",
22
+ "title": "",
23
+ "sections": [
24
+ {
25
+ "heading": "Fixed - cc CLI 0.165.7: merged-session and evidence stability",
26
+ "body": "> `chainlesschain` **0.165.6 -> 0.165.7** (unpublished immutable-tag candidate,\n> 2026-08-23; superseded by `0.165.8` after a pre-package release-gate failure).\n> CLI-only candidate; `@chainlesschain/personal-data-hub` remains **0.4.59**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Durable session stability**: bound headless event backlogs, scoped session\n sidecars, routed Claude project storage through canonical path authority,\n and prevented Windows append-writer starvation under concurrent session\n activity.\n- **Execution-location convergence**: local and remote replicas now bootstrap\n isolated target state, preserve replica identity and witnesses, forward\n staged input through the target supervisor, and retain CPU-limit evidence.\n- **Browser evidence reliability**: two-origin browser evidence installs its\n complete driver and aggregate dependency closure, preserves detached\n baselines, stabilizes Windows tabs, and retries bounded profile cleanup.\n- **Merged test-contract repair**: real-spawn fixtures keep workspace and\n application data as siblings, while path-module mocks inherit the production\n API before overriding isolated test roots. The bundled offline changelog is\n regenerated from this canonical record.\n- **Release status**: publication requires this candidate's exact commit to\n pass the complete Linux, Windows, and macOS `CLI CI` and `CLI Strict Sandbox`\n matrices. Tag, provenance, registry readback, and publication evidence must\n be recorded only after those exact-SHA gates succeed."
27
+ }
28
+ ]
29
+ },
30
+ {
31
+ "productVersion": null,
32
+ "cliVersion": "0.165.6",
33
+ "cliVersions": ["0.165.5", "0.165.6"],
34
+ "date": "2026-08-21",
35
+ "title": "",
36
+ "sections": [
37
+ {
38
+ "heading": "Added - cc CLI 0.165.6: safer remote sessions and governed plugin sources",
39
+ "body": "> `chainlesschain` **0.165.5 -> 0.165.6** (published from exact SHA\n> `ef4324349f272f5ec6af9a6ab80110e814122dae`, 2026-08-21).\n> CLI-only release; `@chainlesschain/personal-data-hub` remains **0.4.59**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Remote Control safe defaults**: direct sessions bind to loopback by\n default. Trusted-LAN exposure requires explicit command authority, preserves\n the selected bind address, fails closed on relay/direct fallback, and keeps\n IDE pairing surfaces from presenting loopback endpoints as phone-ready QR\n links.\n- **Governed plugin source identity**: managed Marketplace policy now evaluates\n canonical Git, registry, file, alias, ref, path, host, port, principal, and\n registry-resolution identities before target I/O or process spawn. Clone\n execution is isolated from ambient Git/SSH configuration, and cache\n provenance remains bound to the approved source and registry document.\n- **Digest-pinned Marketplace archives**: registry install and update can\n materialize same-origin, catalog-bound `tgz`/`tar.gz` sources only after\n candidate preflight. SHA-256 verification and bounded extraction reject\n traversal, links, special entries, case collisions, and expansion bombs;\n archive and extracted-payload digest authority are revalidated for offline\n cache replay. Dynamic command and headers-helper sources remain disabled by\n product policy.\n- **Cross-platform policy enforcement**: Windows runner temporary roots are\n canonicalized without probing caller-controlled targets. Other existing 8.3\n spellings resolve to their long-path authority, while unresolved or forged\n aliases remain rejected. Linux, Windows, and macOS Marketplace campaigns\n exercise air-gapped cache, proxy, PAC, and private-registry boundaries.\n- **Durable session and MCP lifecycle**: cross-session messaging, bounded\n long-running live state, MCP reconnect subscription recovery, lifecycle\n compatibility, and structured headless observability now share explicit\n identity, cleanup, and backpressure contracts.\n- **Focused terminal ergonomics**: the `concise` output style and persisted\n `classic`/`readline` keybinding flavor extend interactive use without\n changing existing default behavior.\n- **Published release evidence**: immutable tag `v-npm-0-165-6`, three-OS\n `CLI CI` (`32483224738`), `CLI Strict Sandbox` (`32483224517`), npm release\n (`32486454203`), and independent registry/provenance readback\n (`32488130856`) all bind exact SHA `ef4324349f`. npm reports\n `latest=0.165.6`; the public tarball SHA-1 is\n `d0dc65bdf34d0afe8e8db4492a1ddc72d63ee260`."
40
+ }
41
+ ]
42
+ },
4
43
  {
5
44
  "productVersion": null,
6
45
  "cliVersion": "0.165.5",
7
46
  "cliVersions": ["0.165.4", "0.165.5"],
8
- "date": "2026-08-20",
47
+ "date": "2026-08-21",
9
48
  "title": "",
10
49
  "sections": [
11
50
  {
12
51
  "heading": "Added - cc CLI 0.165.5: governed recovery and native add-on policy",
13
- "body": "> `chainlesschain` **0.165.4 -> 0.165.5** (candidate; not yet published,\n> 2026-08-20).\n> CLI-only release; `@chainlesschain/personal-data-hub` remains **0.4.59**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Recoverable Artifact workflows**: inspect and settle orphaned Artifact\n writes through a bounded CLI-owned recovery projection, retain exact\n access/deletion evidence, and surface workbench state without letting IDE\n clients derive storage mutations.\n- **Durable workflow recovery**: plan and resume interrupted workflow stages\n through persisted authority and checkpoint evidence, with tighter session\n and execution-location projections for CLI, WebSocket, and IDE consumers.\n- **Native MCP add-on policy**: admit only supported native loader shapes and\n validated executable/package identities. Unsupported or ambiguous native\n add-ons now return typed fail-closed rejections instead of crossing the\n strict process boundary.\n- **Release-candidate gates**: add cross-host Marketplace, accessibility,\n execution-location, context/permission, and live-provider campaigns while\n keeping CI dependency installation clean and deterministic.\n- **Release status**: publication requires this exact candidate commit to pass\n the complete Linux, Windows, and macOS `CLI CI` and `CLI Strict Sandbox`\n matrices. The immutable npm tag and registry readback will be recorded only\n after those gates succeed."
52
+ "body": "> `chainlesschain` **0.165.4 -> 0.165.5** (published from exact SHA\n> `11aef634aa3ab88994698eca0ce2f5cfa65faf48`, 2026-08-21).\n> CLI-only release; `@chainlesschain/personal-data-hub` remains **0.4.59**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Recoverable Artifact workflows**: inspect and settle orphaned Artifact\n writes through a bounded CLI-owned recovery projection, retain exact\n access/deletion evidence, and surface workbench state without letting IDE\n clients derive storage mutations.\n- **Durable workflow recovery**: plan and resume interrupted workflow stages\n through persisted authority and checkpoint evidence, with tighter session\n and execution-location projections for CLI, WebSocket, and IDE consumers.\n- **Native MCP add-on policy**: admit only supported native loader shapes and\n validated executable/package identities. Unsupported or ambiguous native\n add-ons now return typed fail-closed rejections instead of crossing the\n strict process boundary.\n- **Release gates**: add cross-host Marketplace, accessibility,\n execution-location, context/permission, and live-provider campaigns while\n keeping CI dependency installation clean and deterministic.\n- **Published release evidence**: immutable tag `v-npm-0-165-5`, three-OS\n `CLI CI` (`32413582642`), `CLI Strict Sandbox` (`32413582490`), npm release\n (`32428314006`), and independent registry/provenance readback\n (`32429710720`) all bind exact SHA `11aef634aa`. npm reports\n `latest=0.165.5`; the public tarball SHA-1 is\n `c2cc7fb18ea572749d747de02355c6a0a5aef357`."
14
53
  }
15
54
  ]
16
55
  },
@@ -69,6 +69,7 @@ import {
69
69
  recordSessionBudgetUsage,
70
70
  rejectSessionBudgetUsageUnknown,
71
71
  } from "../../lib/session-budget-usage.js";
72
+ import { HostResourceBudget } from "../../lib/host-resource-budget.js";
72
73
 
73
74
  const CANONICAL_WS_TURN_QUEUES = new Map();
74
75
  const CANONICAL_WS_CLAIM_CAS_ATTEMPTS = 4;
@@ -163,6 +164,7 @@ export class WSAgentHandler {
163
164
  canonicalSessionStore,
164
165
  sessionHostLease = null,
165
166
  sessionBudgetRoot = null,
167
+ hostResourceBudget = null,
166
168
  }) {
167
169
  this.session = session;
168
170
  this.interaction = interaction;
@@ -173,6 +175,9 @@ export class WSAgentHandler {
173
175
  this._sessionHostLease = sessionHostLease;
174
176
  this._sessionBudgetRoot = sessionBudgetRoot;
175
177
  this._sessionBudget = sessionBudgetRoot?.budget || null;
178
+ // session-protocol keeps one handler alive across reconnects and incoming
179
+ // requests, making this authority session-scoped rather than turn-scoped.
180
+ this._hostResourceBudget = hostResourceBudget || new HostResourceBudget();
176
181
  this._onSessionHostLeaseAbort = null;
177
182
  if (sessionHostLease?.signal) {
178
183
  this._onSessionHostLeaseAbort = () => {
@@ -642,7 +647,8 @@ export class WSAgentHandler {
642
647
  model: session.model,
643
648
  baseUrl: session.baseUrl,
644
649
  apiKey: session.apiKey,
645
- signal: signal || this._sessionBudgetSignal || this._sessionHostLease?.signal,
650
+ signal:
651
+ signal || this._sessionBudgetSignal || this._sessionHostLease?.signal,
646
652
  onlyIfNeeded: true,
647
653
  preserveCompletedExchange: true,
648
654
  llmQuery: this._compactionLlmQuery,
@@ -1152,11 +1158,10 @@ export class WSAgentHandler {
1152
1158
  strictUsageTelemetry =
1153
1159
  this._resolveCanonicalUsageProtocol() === "call-ledger";
1154
1160
  if (strictUsageTelemetry) this._assertUsageLedgerWritable();
1155
- const compacted =
1156
- await this._compactCanonicalHistoryBeforeClaim(
1157
- requestId,
1158
- turnSignal,
1159
- );
1161
+ const compacted = await this._compactCanonicalHistoryBeforeClaim(
1162
+ requestId,
1163
+ turnSignal,
1164
+ );
1160
1165
  if (!compacted) return;
1161
1166
  }
1162
1167
  canonicalTurn ||= this._claimCanonicalTurn(userMessage, requestId);
@@ -1240,6 +1245,7 @@ export class WSAgentHandler {
1240
1245
  cwd: session.projectRoot,
1241
1246
  sessionId: session.id,
1242
1247
  planManager: session.planManager,
1248
+ hostResourceBudget: this._hostResourceBudget,
1243
1249
  enabledToolNames: session.enabledToolNames || null,
1244
1250
  hostManagedToolPolicy: session.hostManagedToolPolicy || null,
1245
1251
  extraToolDefinitions: session.externalToolDefinitions || [],
@@ -1507,7 +1513,10 @@ export class WSAgentHandler {
1507
1513
  this._persistCanonicalUsageBoundary(event, "unknown");
1508
1514
  }
1509
1515
  if (this._markSessionBudgetUsageUnknown(event)) {
1510
- rejectSessionBudgetUsageUnknown(event, "WebSocket provider call");
1516
+ rejectSessionBudgetUsageUnknown(
1517
+ event,
1518
+ "WebSocket provider call",
1519
+ );
1511
1520
  }
1512
1521
  break;
1513
1522
 
@@ -1624,9 +1633,9 @@ export class WSAgentHandler {
1624
1633
  ? surfacedError?.code || "CC_SESSION_BUDGET_EXHAUSTED"
1625
1634
  : isAbortError(err)
1626
1635
  ? "CC_WS_TURN_INTERRUPTED"
1627
- : err?.code === "CC_WS_EMPTY_ASSISTANT_RESPONSE"
1628
- ? "CC_WS_EMPTY_ASSISTANT_RESPONSE"
1629
- : "CC_WS_TURN_FAILED";
1636
+ : err?.code === "CC_WS_EMPTY_ASSISTANT_RESPONSE"
1637
+ ? "CC_WS_EMPTY_ASSISTANT_RESPONSE"
1638
+ : "CC_WS_TURN_FAILED";
1630
1639
  try {
1631
1640
  this._settleCanonicalFailure(canonicalTurn, failureCode);
1632
1641
  } catch (settlementError) {
@@ -1917,8 +1926,7 @@ export class WSAgentHandler {
1917
1926
  model: session.model,
1918
1927
  baseUrl: session.baseUrl,
1919
1928
  apiKey: session.apiKey,
1920
- signal:
1921
- this._sessionBudgetSignal || this._sessionHostLease?.signal,
1929
+ signal: this._sessionBudgetSignal || this._sessionHostLease?.signal,
1922
1930
  force: true,
1923
1931
  preserveCompletedExchange: true,
1924
1932
  llmQuery: this._compactionLlmQuery,