chainlesschain 0.165.2 → 0.165.4

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 (210) hide show
  1. package/README.md +151 -29
  2. package/package.json +2 -2
  3. package/src/assets/web-panel/assets/{AIOps-lS1R0Cza.js → AIOps-C__nnraW.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-BmlgBPsj.js → ActionButton-CsKWHEZ-.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-CNKczv1S.js → Analytics-BhIjfjWO.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-BuZGJARQ.js → AppLayout-BjuXFzWZ.js} +4 -4
  7. package/src/assets/web-panel/assets/{Artifacts-Dm73Sl-O.js → Artifacts-k6whDkZJ.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-BGMW7A5e.js → Audit-C4FBMYRh.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-BQ6M54JR.js → BackgroundAgents-C_vRrSXk.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-DBzGP0bR.js → Backup-CngFZeVp.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-D1mLCoOV.js → BaseInput-B_H9EBRm.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-BUfcN7p8.js → Chat-DLEC5kt7.js} +4 -4
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-xijcWkJe.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-Du0Yg5Pi.js → Checkbox-m3ClR4xh.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-B2RXziHW.js → Codegen-CmLSFrgp.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-DWhekOrR.js → Col-DFGQteHN.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-HQhrkon4.js → Community-EUUVORHE.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-izHNb4uz.js → Compact-2PSg0Yr7.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-BDwLy41-.js → Compliance-CcKur7gB.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-DFJhLa7K.js → Cowork-DK_Fezfa.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-DYY9RG7-.js → Cron-Dbw89xl7.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-rr7tJTtv.js → Crosschain-CH66h_Ec.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-D2sfHRLi.js → DID-D1igRb17.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-q_eGdhha.js → Dashboard-DVAsrobk.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-Cufrh2Bz.js → Dropdown-Dl7W8AQs.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-B-kdv10f.js → EmailListRenderer-D5tpaEQC.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-D21XjgfG.js → FamilyGuardDashboard-O_VQf8gq.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-CAwRTLZH.js → Federation-BTVcgS9n.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-vx3daNDF.js → FormItemContext-BRnkJAIz.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-CRWY2wU4.js → GenericCardRenderer-8OWSCkDj.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-Q6SwauyD.js → Git-WXLYTQj2.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-BJ1q4IQZ.js → Governance-BezaUhtc.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-CSWjROgD.js → Inference-CuRay3Gu.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-fzuQsWuY.js → KnowledgeGraph-DfWLDW1m.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-DVF8Mnns.js → Logs-C55y2pPY.js} +2 -2
  36. package/src/assets/web-panel/assets/MarkdownRenderer-hDpWdiBc.js +1 -0
  37. package/src/assets/web-panel/assets/{Marketplace-BQP7LOA4.js → Marketplace-Dk08Uycg.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-BNlJCmNc.js → McpTools-C11fSB5V.js} +4 -4
  39. package/src/assets/web-panel/assets/{Memory-DLLg5WQ4.js → Memory-mr0eZc97.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-CR2skNAF.js → MobileBridge-C0iCSRbb.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-BxVavObl.js → MobileProjects-CY-xMG8Z.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-B17pgqMI.js → Mtc-Bplqc_Wc.js} +4 -4
  43. package/src/assets/web-panel/assets/{MtcAudit-4UmV5cIL.js → MtcAudit-BlzwsoSM.js} +2 -2
  44. package/src/assets/web-panel/assets/{Multisig-DoMEXEcU.js → Multisig-BBLmTty6.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-h9DMXFX4.js → NLProgramming-DtT1uf1W.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-Cihn-xX8.js → Notes-DcqQAxTK.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-BE6ZGa3R.js → NotificationSettings-cb0kWoZe.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-CnwojoSI.js → OrderTableRenderer-kw9HZQNN.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-B2vpwmjb.js → Organization-DlTlbkUN.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-C4z28R0-.js → Overflow-pp1qs-oY.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-BVlFkwhW.js → P2P-BESLnyYz.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-BXbEdL5B.js → PdhVaultBrowser-B-J1mGuf.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-C28xs4lp.js → Permissions-B36PeT1_.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-Dgl_rBjM.js → PersonalDataHub-CTK2ad-3.js} +3 -3
  55. package/src/assets/web-panel/assets/{Pipeline-3QUIhrKI.js → Pipeline-zJNGXsac.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-8Gh33OZ5.js → Privacy-b9fz0Qf0.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-BNmg4tZi.js → ProjectInit-DjZbZgiB.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-vgMfeCf9.js → ProjectSettings-C-hHJXlD.js} +2 -2
  59. package/src/assets/web-panel/assets/Projects-BC9KSDM6.js +1 -0
  60. package/src/assets/web-panel/assets/{Providers-CXoOa8eX.js → Providers-Dz-CAYYU.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-BhfTF0oS.js → QrScannerModal-A0yoQ3-3.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-C746HEAj.js → QuickAsk-DrFgFJNC.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-BSej8Eo0.js → Recommend-KC8hF1g4.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-f3gmnlG3.js → RemoteSession-DGTPIk6u.js} +3 -3
  65. package/src/assets/web-panel/assets/{Reputation-CyvybpkN.js → Reputation-QmbwM7Yk.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-DwV2PeYn.js → Row-BxjJylia.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-11GrzjZy.js → RssFeed-B7Wda1J6.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-BjKXkrAY.js → Search-_plQ_YSA.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-eWiFb9Yk.js → Security-CD2YJZfx.js} +2 -2
  70. package/src/assets/web-panel/assets/{Services-CdCsMAtt.js → Services-qQE7NmwE.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-4Q2UTKQ5.js → Skeleton-DgQqkFf7.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-v4rtYrRj.js → Skills-C4C0oFFt.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-CRhsFvd_.js → Sla-Px2N2B5c.js} +1 -1
  74. package/src/assets/web-panel/assets/SpeechSettings-DN6C3lQd.js +1 -0
  75. package/src/assets/web-panel/assets/{SyncSettings-D16zonl7.js → SyncSettings-jm5aH_m7.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-Xxozz0i_.js → Tasks-DlkJcv67.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-CXJpPtCT.js → Templates-DyrTHUBs.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-XRV0L1ZF.js → Tenant-mC434PtL.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-CYuO1i_w.js → Terminal-o0_s3NgK.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-BXqitWsu.js → TimelineRenderer-DAGlAXOw.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-BvPrDHIy.js → Tokens-BnulS_bs.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-DhCrSTf5.js → Trigger-suQbVXYM.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-DmsuZD6K.js → Trust-DbIJAPo5.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-D_yrts5C.js → UkeySign-CQNpbIHi.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-B01ihPrm.js → VideoEditing-D8aWCERk.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-DpUjKa-N.js → Wallet-CuLpYfZc.js} +2 -2
  87. package/src/assets/web-panel/assets/{WebAuthn-CL07yON6.js → WebAuthn-CsfG8ZMc.js} +2 -2
  88. package/src/assets/web-panel/assets/{WorkflowEditor-CLMflnRr.js → WorkflowEditor-BYsEAZbd.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-DtUqe8h_.js → chat-FT4Um3-I.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-DPKrgVfy.js → colors-CKbS_Wlt.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-BTt2GtOm.js → compact-item-CFJtzuJM.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-D_VeUc1J.js → createContext-B9kSRW6K.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-DJZ0gAMu.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-1kndiylj.js → hasIn-DR-x0Xpi.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-dVc-CXY4.js → index-7jHr_A_k.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DFIZ_1Sf.js → index-B3ZX81mK.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-fk2Rjacw.js → index-B7osrXqy.js} +3 -3
  98. package/src/assets/web-panel/assets/{index-CHG-KcS4.js → index-BGbPnC5x.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-Dbbymxpj.js → index-BI5hP_qy.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BaZAbw9A.js → index-BK3TiKVq.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CzjkKUmR.js → index-BVPU43b1.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BAXfRKfG.js → index-BW-t9n-q.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-8nz_fmlj.js → index-BfFCQHL3.js} +1 -1
  104. package/src/assets/web-panel/assets/index-Bizb4hkw.js +1 -0
  105. package/src/assets/web-panel/assets/{index-DdkplL9R.js → index-Bt4fS2eL.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DG2MZQ3f.js → index-BwR7yc2h.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DfKBRdSS.js → index-Bzz0C1BZ.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-GsoUQ2M7.js → index-C2JvmYRc.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-l1BETrDb.js → index-CGaXUsIs.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-4bna2_SR.js → index-CJmIQ9XR.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DfGl8CqG.js → index-C_enk9I_.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-D95OFht7.js → index-Cr2FLUsD.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DsJCDUJG.js → index-CvrCCqJt.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-sDoMHTNA.js → index-D4LfPvWA.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-By5n8up9.js → index-DMGmg497.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-ocf06EVQ.js → index-DShSkww-.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Bhudc_Ez.js → index-DTxNy0ZU.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CX81qSM4.js → index-DW4BWjTk.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BlDNVgBt.js → index-DWdqx7zI.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CcO04eDn.js → index-Dap9c3eD.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Dwqmtk65.js → index-DcfxhKXR.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-2eyAXE3d.js → index-DdkIhfi-.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-brCInrzq.js → index-DeSgw-WV.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DJ8vXGOa.js → index-DiNUEpSQ.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BHpBMWCh.js → index-DjEP7WkH.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-m31Ka8hZ.js → index-DtkFqPVA.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CtF7EN49.js → index-KqDaCApw.js} +1 -1
  128. package/src/assets/web-panel/assets/index-OHSl-xCh.js +1 -0
  129. package/src/assets/web-panel/assets/{index-B9KvcS7R.js → index-OSzjTzGM.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CauoBQkH.js → index-QBSeNVO3.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-FzdwcSy2.js → index-WE08gMJP.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DxdTdBix.js → index-r2VI1Ikk.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-BepLZwgB.js → index-tqSEHPRT.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-CvyYJd7z.js → initDefaultProps-Dd7n7VgI.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-DYZkhUdz.js → motion-BwxouRw1.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-slnJRVT1.js → move-DObN0PG9.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-DVc0CKmy.js → mtc-parser-B3nOUQc7.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-BCXAtHCq.js → omit-o9WU2Nbl.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-DBsemz_K.js → pickAttrs-CL_vvfQ_.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-BRtkJ-nv.js → placementArrow-CYrM2tyK.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-Cebq7EZn.js → responsiveObserve-k_06cQ96.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-DT7qvId2.js → slide-CPKG0pxS.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-pQiITLkG.js → statusUtils-BDDEeLTw.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-c-19BVKQ.js → styleChecker-Cmb7RTh7.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-DsS5-0bE.js → useFlexGapSupport-e2IedC4N.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-CxGiMe5n.js → useFs-CE_gxVnm.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-D9btVID5.js → usePersonalDataHub-BkMIIKMz.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-CUYFsFEN.js → vnode-DW886XV1.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-CXmn_35j.js → zoom-Dwo_adaf.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/command-help-index.json +3 -3
  152. package/src/commands/agent.js +105 -35
  153. package/src/commands/artifacts.js +363 -33
  154. package/src/commands/cowork.js +202 -36
  155. package/src/commands/session-budget.js +155 -0
  156. package/src/commands/session-location.js +948 -0
  157. package/src/commands/session.js +72 -46
  158. package/src/data/changelog.json +26 -0
  159. package/src/gateways/ws/artifact-protocol.js +77 -13
  160. package/src/gateways/ws/session-protocol.js +391 -24
  161. package/src/gateways/ws/ws-agent-handler.js +191 -14
  162. package/src/gateways/ws/ws-server.js +14 -3
  163. package/src/gateways/ws/ws-session-gateway.js +101 -5
  164. package/src/harness/jsonl-session-store.js +1210 -0
  165. package/src/lib/agent-team/team-runner.js +43 -13
  166. package/src/lib/artifact-access-ledger.js +461 -0
  167. package/src/lib/artifact-cleanup-ledger.js +861 -0
  168. package/src/lib/artifact-deletion-ledger.js +677 -0
  169. package/src/lib/artifact-store.js +256 -51
  170. package/src/lib/background-agent-keeper-protocol.js +75 -4
  171. package/src/lib/background-agent-launch-barrier.js +74 -0
  172. package/src/lib/background-agent-supervisor.js +149 -5
  173. package/src/lib/background-turn-bootstrap-protocol.js +4 -0
  174. package/src/lib/command-lifecycle-report.js +8 -4
  175. package/src/lib/cowork-adapter.js +9 -5
  176. package/src/lib/cowork-task-runner.js +20 -0
  177. package/src/lib/cowork-workflow.js +178 -20
  178. package/src/lib/direct-model-usage.js +62 -22
  179. package/src/lib/dynamic-workflow-runtime.js +3184 -111
  180. package/src/lib/execution-location-result-apply.js +339 -0
  181. package/src/lib/execution-location-result-artifact.js +271 -0
  182. package/src/lib/execution-location-result-review.js +253 -0
  183. package/src/lib/execution-location-result-store.js +331 -0
  184. package/src/lib/execution-location-result.js +617 -0
  185. package/src/lib/execution-location-target.js +236 -1
  186. package/src/lib/managed-tool-checkpoint.js +47 -4
  187. package/src/lib/process-execution-broker/workspace-transaction.js +3 -0
  188. package/src/lib/session-budget-production-root.js +376 -0
  189. package/src/lib/session-budget-runtime.js +109 -18
  190. package/src/lib/session-budget-usage.js +63 -0
  191. package/src/lib/session-host-snapshot.js +19 -2
  192. package/src/lib/session-resource-budget.js +766 -105
  193. package/src/lib/sub-agent-context.js +69 -22
  194. package/src/lib/web-ui-server.js +12 -1
  195. package/src/lib/with-file-lock.js +175 -26
  196. package/src/repl/agent-repl.js +237 -16
  197. package/src/runtime/agent-core.js +123 -0
  198. package/src/runtime/headless-runner.js +135 -46
  199. package/src/runtime/headless-stream.js +133 -25
  200. package/src/runtime/policies/agent-policy.js +10 -0
  201. package/src/workers/background-agent-keeper.js +112 -19
  202. package/src/workers/background-agent-worker.js +383 -134
  203. package/src/workers/background-turn-bootstrap.js +13 -8
  204. package/src/assets/web-panel/assets/ChatBubbleRenderer-CY5m8ZHg.js +0 -1
  205. package/src/assets/web-panel/assets/MarkdownRenderer-BLif4QSg.js +0 -1
  206. package/src/assets/web-panel/assets/Projects-BhtAVilc.js +0 -1
  207. package/src/assets/web-panel/assets/SpeechSettings-DLjKsDVu.js +0 -1
  208. package/src/assets/web-panel/assets/devWarning-Bj5nUW2v.js +0 -1
  209. package/src/assets/web-panel/assets/index-CPcM-eqo.js +0 -1
  210. package/src/assets/web-panel/assets/index-xeSyVoRe.js +0 -1
@@ -120,6 +120,16 @@ import {
120
120
  import executionBroker from "../lib/process-execution-broker/index.js";
121
121
  import { extractPluginUsageAttribution } from "../lib/plugin-usage-attribution.js";
122
122
  import { formatManagedCheckpointEvent } from "../lib/managed-checkpoint-render.js";
123
+ import {
124
+ openProductionSessionBudgetRoot,
125
+ sessionBudgetAdmissionError,
126
+ } from "../lib/session-budget-production-root.js";
127
+ import {
128
+ beginSessionBudgetUsage,
129
+ markSessionBudgetUsageUnknown,
130
+ recordSessionBudgetUsage,
131
+ rejectSessionBudgetUsageUnknown,
132
+ } from "../lib/session-budget-usage.js";
123
133
 
124
134
  const goalBrokerRunner = executionBroker.spawnSync.bind(executionBroker);
125
135
 
@@ -466,11 +476,12 @@ async function withHeadlessSessionHostLease(options, deps, task) {
466
476
  deps.acquireSessionHostLease ||
467
477
  (!hasInjectedSessionStore ? acquireSessionHostLease : null);
468
478
  let lease = null;
479
+ let budgetRoot = null;
469
480
  try {
470
481
  if (authoritySessionId && typeof acquireHostLease === "function") {
471
482
  lease = acquireHostLease(authoritySessionId, { hostKind: "headless" });
472
483
  }
473
- const scopedOptions = lease?.signal
484
+ let scopedOptions = lease?.signal
474
485
  ? {
475
486
  ...options,
476
487
  signal: options.signal
@@ -478,12 +489,28 @@ async function withHeadlessSessionHostLease(options, deps, task) {
478
489
  : lease.signal,
479
490
  }
480
491
  : options;
492
+ budgetRoot = openProductionSessionBudgetRoot(
493
+ authoritySessionId,
494
+ options.sessionBudgetRoot,
495
+ {
496
+ persist: resolution.persist,
497
+ signal: scopedOptions.signal || null,
498
+ table: options.sessionBudgetRoot?.table,
499
+ open: deps.openSessionBudget,
500
+ store: deps.sessionBudgetStore,
501
+ registry: deps.sessionBudgetRegistry,
502
+ },
503
+ );
504
+ if (budgetRoot.enabled) {
505
+ scopedOptions = { ...scopedOptions, ...budgetRoot.options };
506
+ }
481
507
  return await task(scopedOptions, {
482
508
  ...deps,
483
509
  [HEADLESS_SESSION_RESOLUTION]: resolution,
484
510
  [HEADLESS_SESSION_HOST_LEASE]: lease,
485
511
  });
486
512
  } finally {
513
+ budgetRoot?.close?.();
487
514
  lease?.release?.();
488
515
  }
489
516
  }
@@ -773,8 +800,9 @@ async function runAgentHeadlessInWorkspace(
773
800
  const loaded = loadHooks({ cwd, settingsFile: options.settingsFile });
774
801
  // Fold in installed plugins' hooks/hooks.json (Phase 3.3c) — plugins ADD
775
802
  // to the user's settings hooks, never replace them.
776
- const { mergePluginHooks } =
777
- await import("../lib/plugin-runtime/hooks.js");
803
+ const { mergePluginHooks } = await import(
804
+ "../lib/plugin-runtime/hooks.js"
805
+ );
778
806
  const effectiveHooks = mergePluginHooks(
779
807
  attachAuthorityErrors(loaded.hooks, loaded.authorityErrors),
780
808
  { cwd },
@@ -815,8 +843,9 @@ async function runAgentHeadlessInWorkspace(
815
843
  // the run, so no explicit restore is needed.
816
844
  if (!hermeticExecution) {
817
845
  try {
818
- const { applyPluginBinPath } =
819
- await import("../lib/plugin-runtime/bin.js");
846
+ const { applyPluginBinPath } = await import(
847
+ "../lib/plugin-runtime/bin.js"
848
+ );
820
849
  applyPluginBinPath({ cwd });
821
850
  } catch {
822
851
  /* best-effort — plugin bin PATH never blocks a headless run */
@@ -827,8 +856,9 @@ async function runAgentHeadlessInWorkspace(
827
856
  // keys not already set; the process exits at the end so no restore is needed.
828
857
  if (!hermeticExecution) {
829
858
  try {
830
- const { applyPluginSettingsEnv } =
831
- await import("../lib/plugin-runtime/settings.js");
859
+ const { applyPluginSettingsEnv } = await import(
860
+ "../lib/plugin-runtime/settings.js"
861
+ );
832
862
  applyPluginSettingsEnv({ cwd });
833
863
  } catch {
834
864
  /* best-effort — plugin settings never block a headless run */
@@ -961,8 +991,9 @@ async function runAgentHeadlessInWorkspace(
961
991
  if (isHeadlessConfigCommand(prompt)) {
962
992
  const cm = await import("../lib/config-manager.js");
963
993
  const { getConfigPath } = await import("../lib/paths.js");
964
- const { runConfigDirective } =
965
- await import("../lib/headless-config-command.js");
994
+ const { runConfigDirective } = await import(
995
+ "../lib/headless-config-command.js"
996
+ );
966
997
  const { text, isError } = runConfigDirective(prompt, {
967
998
  configManager: cm,
968
999
  getConfigPath,
@@ -1038,8 +1069,9 @@ async function runAgentHeadlessInWorkspace(
1038
1069
  model = macro.model;
1039
1070
  writeErr(` command: model → ${model}\n`);
1040
1071
  try {
1041
- const { maybeWarnDeprecatedModel } =
1042
- await import("../lib/model-deprecation.js");
1072
+ const { maybeWarnDeprecatedModel } = await import(
1073
+ "../lib/model-deprecation.js"
1074
+ );
1043
1075
  maybeWarnDeprecatedModel({ model });
1044
1076
  } catch {
1045
1077
  // deprecation notice is best-effort
@@ -1076,8 +1108,9 @@ async function runAgentHeadlessInWorkspace(
1076
1108
 
1077
1109
  // ── Permission + tool resolution ──────────────────────────────────────
1078
1110
  if (managedSettings) {
1079
- const { assertManagedPermissionMode } =
1080
- await import("../lib/settings-loader.cjs");
1111
+ const { assertManagedPermissionMode } = await import(
1112
+ "../lib/settings-loader.cjs"
1113
+ );
1081
1114
  assertManagedPermissionMode(options.permissionMode, managedSettings);
1082
1115
  }
1083
1116
  const perm = resolvePermissionMode(options.permissionMode);
@@ -1533,8 +1566,9 @@ async function runAgentHeadlessInWorkspace(
1533
1566
  : null;
1534
1567
  if (!hermeticExecution && !instructionExcludes) {
1535
1568
  try {
1536
- const { readStringArraySetting } =
1537
- await import("../lib/settings-loader.cjs");
1569
+ const { readStringArraySetting } = await import(
1570
+ "../lib/settings-loader.cjs"
1571
+ );
1538
1572
  const fromSettings = readStringArraySetting("instructionExcludes", {
1539
1573
  cwd,
1540
1574
  settingsFile: options.settingsFile,
@@ -1588,8 +1622,9 @@ async function runAgentHeadlessInWorkspace(
1588
1622
  // settings.json UserPromptSubmit hooks. block → abort the run; context → inject.
1589
1623
  if (settingsHooks) {
1590
1624
  try {
1591
- const { runUserPromptSubmitHooks } =
1592
- await import("../lib/settings-hook-events.js");
1625
+ const { runUserPromptSubmitHooks } = await import(
1626
+ "../lib/settings-hook-events.js"
1627
+ );
1593
1628
  const ups = runUserPromptSubmitHooks(settingsHooks, {
1594
1629
  prompt: userContent,
1595
1630
  cwd,
@@ -1619,8 +1654,9 @@ async function runAgentHeadlessInWorkspace(
1619
1654
  let instructionsLoadedContext = null;
1620
1655
  if (settingsHooks && _loadedInstructions) {
1621
1656
  try {
1622
- const { runInstructionsLoadedHooks } =
1623
- await import("../lib/settings-hook-events.js");
1657
+ const { runInstructionsLoadedHooks } = await import(
1658
+ "../lib/settings-hook-events.js"
1659
+ );
1624
1660
  instructionsLoadedContext = runInstructionsLoadedHooks(settingsHooks, {
1625
1661
  files: _loadedInstructions.files,
1626
1662
  cwd,
@@ -1635,8 +1671,9 @@ async function runAgentHeadlessInWorkspace(
1635
1671
  let sessionStartContext = null;
1636
1672
  if (settingsHooks) {
1637
1673
  try {
1638
- const { runSessionStartHooks } =
1639
- await import("../lib/settings-hook-events.js");
1674
+ const { runSessionStartHooks } = await import(
1675
+ "../lib/settings-hook-events.js"
1676
+ );
1640
1677
  sessionStartContext = runSessionStartHooks(settingsHooks, {
1641
1678
  source: resumeId ? "resume" : "startup",
1642
1679
  cwd,
@@ -1654,8 +1691,9 @@ async function runAgentHeadlessInWorkspace(
1654
1691
  // back up" — e.g. re-run a workspace sanity check. Observe-only, best-effort.
1655
1692
  if (settingsHooks && resumeId && history.length > 0) {
1656
1693
  try {
1657
- const { runObserveHooks } =
1658
- await import("../lib/settings-hook-events.js");
1694
+ const { runObserveHooks } = await import(
1695
+ "../lib/settings-hook-events.js"
1696
+ );
1659
1697
  runObserveHooks(
1660
1698
  settingsHooks,
1661
1699
  "SessionResume",
@@ -1886,8 +1924,9 @@ async function runAgentHeadlessInWorkspace(
1886
1924
  // --add-dir → workspaceRootDirs = [cwd] and this is a no-op. Best-effort.
1887
1925
  if (hostMcp?.mcpClient && additionalDirectories.length > 0) {
1888
1926
  try {
1889
- const { notifyMcpRootsChanged, workspaceRootDirs } =
1890
- await import("../repl/add-dir.js");
1927
+ const { notifyMcpRootsChanged, workspaceRootDirs } = await import(
1928
+ "../repl/add-dir.js"
1929
+ );
1891
1930
  notifyMcpRootsChanged(
1892
1931
  [hostMcp.mcpClient],
1893
1932
  workspaceRootDirs(options.cwd || process.cwd(), additionalDirectories),
@@ -1995,8 +2034,9 @@ async function runAgentHeadlessInWorkspace(
1995
2034
  error.code = "CC_REMOTE_APPROVAL_GATE_UNAVAILABLE";
1996
2035
  throw error;
1997
2036
  }
1998
- const { startHeadlessRemoteApproval } =
1999
- await import("../lib/remote-approval-bridge.js");
2037
+ const { startHeadlessRemoteApproval } = await import(
2038
+ "../lib/remote-approval-bridge.js"
2039
+ );
2000
2040
  _remoteApproval = await (
2001
2041
  deps.startHeadlessRemoteApproval || startHeadlessRemoteApproval
2002
2042
  )({
@@ -2025,8 +2065,9 @@ async function runAgentHeadlessInWorkspace(
2025
2065
  let _collectorEnabled = false;
2026
2066
  if (!hermeticExecution) {
2027
2067
  try {
2028
- const { isOtlpCollectorEnabled } =
2029
- await import("../lib/observability/index.js");
2068
+ const { isOtlpCollectorEnabled } = await import(
2069
+ "../lib/observability/index.js"
2070
+ );
2030
2071
  _collectorEnabled = isOtlpCollectorEnabled();
2031
2072
  } catch {
2032
2073
  _collectorEnabled = false;
@@ -2034,8 +2075,9 @@ async function runAgentHeadlessInWorkspace(
2034
2075
  }
2035
2076
  if (!hermeticExecution && (options.otlp || _collectorEnabled)) {
2036
2077
  try {
2037
- const { TelemetryRecorder } =
2038
- await import("../lib/telemetry/span-recorder.js");
2078
+ const { TelemetryRecorder } = await import(
2079
+ "../lib/telemetry/span-recorder.js"
2080
+ );
2039
2081
  _otlpRecorder = new TelemetryRecorder({ serviceName: "cc-agent" });
2040
2082
  } catch {
2041
2083
  _otlpRecorder = null; // telemetry is best-effort, never blocks the run
@@ -2049,8 +2091,9 @@ async function runAgentHeadlessInWorkspace(
2049
2091
  let _hookSupervisor = null;
2050
2092
  if (settingsHooks) {
2051
2093
  try {
2052
- const { AsyncHookSupervisor } =
2053
- await import("../lib/async-hook-supervisor.js");
2094
+ const { AsyncHookSupervisor } = await import(
2095
+ "../lib/async-hook-supervisor.js"
2096
+ );
2054
2097
  _hookSupervisor = new AsyncHookSupervisor({
2055
2098
  persistStats: true,
2056
2099
  // Durably park failed-rewake signals keyed by session so a crash before
@@ -2161,6 +2204,7 @@ async function runAgentHeadlessInWorkspace(
2161
2204
  additionalDirectories,
2162
2205
  sandbox: options.sandbox || null,
2163
2206
  sessionId,
2207
+ sessionBudget: options.sessionBudget || null,
2164
2208
  // Content-free continuity metadata from the same verified sample used for
2165
2209
  // replay history and MCP recovery authority.
2166
2210
  sessionHostSnapshot: canonicalResume?.snapshot || null,
@@ -2373,8 +2417,9 @@ async function runAgentHeadlessInWorkspace(
2373
2417
  if (options.goal !== undefined && options.goal !== false) {
2374
2418
  try {
2375
2419
  const explicitId = typeof options.goal === "string" ? options.goal : null;
2376
- const { resolveActiveGoal, linkSession } =
2377
- await import("../lib/goal-store.js");
2420
+ const { resolveActiveGoal, linkSession } = await import(
2421
+ "../lib/goal-store.js"
2422
+ );
2378
2423
  const goal = (deps.resolveActiveGoal || resolveActiveGoal)({
2379
2424
  explicitId,
2380
2425
  sessionId,
@@ -2502,8 +2547,9 @@ async function runAgentHeadlessInWorkspace(
2502
2547
  let _asyncStopHandled = false;
2503
2548
  const _settleAsyncStop = async () => {
2504
2549
  if (!settingsHooks || !_hookSupervisor) return { rewakes: [], results: [] };
2505
- const { dispatchAsyncHooks } =
2506
- await import("../lib/settings-hook-events.js");
2550
+ const { dispatchAsyncHooks } = await import(
2551
+ "../lib/settings-hook-events.js"
2552
+ );
2507
2553
  dispatchAsyncHooks(
2508
2554
  settingsHooks,
2509
2555
  "Stop",
@@ -2554,6 +2600,7 @@ async function runAgentHeadlessInWorkspace(
2554
2600
  provider,
2555
2601
  model,
2556
2602
  source: "model",
2603
+ sessionBudget: options.sessionBudget || null,
2557
2604
  call: () =>
2558
2605
  chatWithTools([{ role: "user", content: judgePrompt }], {
2559
2606
  model,
@@ -2935,6 +2982,11 @@ async function runAgentHeadlessInWorkspace(
2935
2982
  ),
2936
2983
  );
2937
2984
  }
2985
+ beginSessionBudgetUsage(
2986
+ options.sessionBudget,
2987
+ event,
2988
+ "headless provider call",
2989
+ );
2938
2990
  break;
2939
2991
  }
2940
2992
  case "model-usage-unknown":
@@ -2948,6 +3000,10 @@ async function runAgentHeadlessInWorkspace(
2948
3000
  ),
2949
3001
  );
2950
3002
  }
3003
+ const budgetUsageUnknown = markSessionBudgetUsageUnknown(
3004
+ options.sessionBudget,
3005
+ event,
3006
+ );
2951
3007
  if (event.type === "compaction-usage-unknown") {
2952
3008
  endReason = "compaction-usage-unknown";
2953
3009
  stopForCompactionUsageUnknown = true;
@@ -2960,6 +3016,14 @@ async function runAgentHeadlessInWorkspace(
2960
3016
  usage_outcome: "unknown",
2961
3017
  });
2962
3018
  }
3019
+ if (budgetUsageUnknown) {
3020
+ rejectSessionBudgetUsageUnknown(
3021
+ event,
3022
+ event.type === "compaction-usage-unknown"
3023
+ ? "headless semantic compaction"
3024
+ : "headless provider call",
3025
+ );
3026
+ }
2963
3027
  break;
2964
3028
  }
2965
3029
  case "token-usage": {
@@ -2969,6 +3033,11 @@ async function runAgentHeadlessInWorkspace(
2969
3033
  store.appendTokenUsage(sessionId, persistedUsage),
2970
3034
  );
2971
3035
  }
3036
+ recordSessionBudgetUsage(
3037
+ options.sessionBudget,
3038
+ event,
3039
+ "headless usage settlement",
3040
+ );
2972
3041
  if (!event.attribution) {
2973
3042
  usage.input_tokens += event.usage?.input_tokens || 0;
2974
3043
  usage.output_tokens += event.usage?.output_tokens || 0;
@@ -3222,12 +3291,25 @@ async function runAgentHeadlessInWorkspace(
3222
3291
  } catch (err) {
3223
3292
  const runtimeLedgerPersistenceFailed =
3224
3293
  err?.runtimeLedgerPersistence === true;
3294
+ const sessionBudgetFailed =
3295
+ err?.code === "CC_SESSION_BUDGET_EXHAUSTED" ||
3296
+ err?.code === "CC_SESSION_BUDGET_USAGE_UNKNOWN" ||
3297
+ options.sessionBudget?.signal?.aborted === true;
3225
3298
  const message = runtimeLedgerPersistenceFailed
3226
3299
  ? RUNTIME_LEDGER_PERSISTENCE_FAILURE_MESSAGE
3227
- : err?.message || String(err);
3300
+ : err?.code === "CC_SESSION_BUDGET_USAGE_UNKNOWN"
3301
+ ? err.message
3302
+ : sessionBudgetFailed
3303
+ ? sessionBudgetAdmissionError(
3304
+ options.sessionBudget?.reason?.() || err?.budgetReason,
3305
+ "run",
3306
+ ).message
3307
+ : err?.message || String(err);
3228
3308
  const errorSubtype = runtimeLedgerPersistenceFailed
3229
3309
  ? "error_persistence"
3230
- : "error";
3310
+ : sessionBudgetFailed
3311
+ ? "error_session_budget"
3312
+ : "error";
3231
3313
  if (isStream) {
3232
3314
  emitStream({
3233
3315
  type: "result",
@@ -3258,7 +3340,10 @@ async function runAgentHeadlessInWorkspace(
3258
3340
  // Provider/transport failures get their own exit code (5) so CI can tell
3259
3341
  // "the model call failed" from "the run itself errored" (1).
3260
3342
  loopFailureOutcome = {
3261
- exitCode: runtimeLedgerPersistenceFailed ? 1 : classifyLoopError(err),
3343
+ exitCode:
3344
+ runtimeLedgerPersistenceFailed || sessionBudgetFailed
3345
+ ? 1
3346
+ : classifyLoopError(err),
3262
3347
  result: message,
3263
3348
  isError: true,
3264
3349
  };
@@ -3298,8 +3383,9 @@ async function runAgentHeadlessInWorkspace(
3298
3383
  await cleanupDeadline.run("settings-hooks", async () => {
3299
3384
  if (settingsHooks) {
3300
3385
  try {
3301
- const { runObserveHooks, dispatchAsyncHooks } =
3302
- await import("../lib/settings-hook-events.js");
3386
+ const { runObserveHooks, dispatchAsyncHooks } = await import(
3387
+ "../lib/settings-hook-events.js"
3388
+ );
3303
3389
  const stopPayload = {
3304
3390
  reason: pipeState.closed ? "pipe_closed" : endReason,
3305
3391
  cwd,
@@ -3497,6 +3583,7 @@ async function runAgentHeadlessInWorkspace(
3497
3583
  provider,
3498
3584
  model,
3499
3585
  source: "model",
3586
+ sessionBudget: options.sessionBudget || null,
3500
3587
  call: () =>
3501
3588
  chatWithTools([{ role: "user", content: assessPrompt }], {
3502
3589
  model,
@@ -3561,8 +3648,9 @@ async function runAgentHeadlessInWorkspace(
3561
3648
  emitStream({ type: "denials_summary", count: denials.length, denials });
3562
3649
  }
3563
3650
  try {
3564
- const { appendRecentDenials } =
3565
- await import("../lib/permission-denial-store.js");
3651
+ const { appendRecentDenials } = await import(
3652
+ "../lib/permission-denial-store.js"
3653
+ );
3566
3654
  appendRecentDenials(denials, {
3567
3655
  sessionId,
3568
3656
  permissionMode: options.permissionMode || "default",
@@ -3633,8 +3721,9 @@ async function runAgentHeadlessInWorkspace(
3633
3721
  }
3634
3722
  if (_collectorEnabled) {
3635
3723
  try {
3636
- const { exportTelemetryRecorder } =
3637
- await import("../lib/observability/index.js");
3724
+ const { exportTelemetryRecorder } = await import(
3725
+ "../lib/observability/index.js"
3726
+ );
3638
3727
  exportTelemetryRecorder(_otlpRecorder);
3639
3728
  } catch {
3640
3729
  // Telemetry is observational only and never changes the agent result.