chainlesschain 0.162.197 → 0.162.198

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 (208) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-D3Gu1a5d.js → AIOps-CSN-D2xb.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-DrwAoKaz.js → ActionButton-CBSMlGzv.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-C7Q-gd_3.js → Analytics-3yr3Nt2t.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-DgBtae-n.js → AppLayout-1b-o3lMH.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-pQ6LcA-W.js → Artifacts-Dr8rJi17.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-DK61tocB.js → Audit-2V689HC2.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-BOKgDFRh.js → BackgroundAgents-DIxkNrD_.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-Bo9G4vTP.js → Backup-Pg6BcwrE.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-Do_dE9_v.js → BaseInput-CLUpqyfH.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-COVvZzOL.js → Chat-qVS8rD4G.js} +5 -5
  12. package/src/assets/web-panel/assets/ChatBubbleRenderer-ti49X12Q.js +1 -0
  13. package/src/assets/web-panel/assets/{Checkbox-Z9MJMolt.js → Checkbox-Bs9AaEay.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-BVzWKVbf.js → Codegen-Dvc1mq8q.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-C8MnYcbT.js → Col-C4_biO7A.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-DQxqw15l.js → Community-al25XQUV.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-BAUmrh3y.js → Compact-D-ZDB8M1.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-jPAkQ3zK.js → Compliance-6lIfDz1W.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-BBQyxbh8.js → Cowork-DdI48XMJ.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-W5koq8Z5.js → Cron-DF5HZd2g.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-BQhnu5hS.js → Crosschain-DuxeSvt3.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-DD7PlI18.js → DID-B9yHkUTd.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-w_ILuwKI.js → Dashboard-Z5EuI3IM.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-qiDUAyAo.js → Dropdown-vuRfO3dY.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-PDeBcI5H.js → EmailListRenderer-QFLCc1uL.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-SuArscRM.js → FamilyGuardDashboard-BZ7EXkFJ.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-BCovZaUn.js → Federation-DycIEg2s.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-DjlFdVFk.js → FormItemContext-Ba0H_7yG.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-DoEZ7fcS.js → GenericCardRenderer--JgSTK-C.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-CV0-6GPI.js → Git-DEvTbldE.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-B_SFN50w.js → Governance-BJIljy18.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-heI0Eo6k.js → Inference-CVyW3G3q.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-Cz5INS5p.js → KnowledgeGraph-v8-borge.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-BSFxiHkg.js → Logs-BCdS7gGo.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-CU-JB2Ns.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-0TWTpE7k.js → Marketplace-AN6tGA2B.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-CV4-wBLm.js → McpTools-DGViXASN.js} +4 -4
  38. package/src/assets/web-panel/assets/{Memory-x5bH5rw5.js → Memory-Bpvmx9X4.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-DaBmUu9G.js → MobileBridge-CTP-DOTC.js} +1 -1
  40. package/src/assets/web-panel/assets/MobileProjects-C8qfktxn.js +1 -0
  41. package/src/assets/web-panel/assets/{Mtc-B_zKEBif.js → Mtc-ndYr0M1s.js} +5 -5
  42. package/src/assets/web-panel/assets/{MtcAudit-BCfKD2yg.js → MtcAudit-Ci0-YK7W.js} +2 -2
  43. package/src/assets/web-panel/assets/{Multisig-DgYfj6c_.js → Multisig-BehSTFW7.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-Dz09lFUm.js → NLProgramming-B91_YBLv.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-Cuj6ugBE.js → Notes-BQlJ0-gq.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-DK2WXjhg.js → NotificationSettings-CDgYMjYK.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-D1IAOQoo.js → OrderTableRenderer-BJkSlKeH.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-9fqnPvTw.js → Organization-B-b3cWCp.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-n5xHkhow.js → Overflow-CILUL4nL.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-B5AUWwH-.js → P2P-BTCFBkF0.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-CoUDV6dy.js → PdhVaultBrowser-BAR6AUx5.js} +4 -4
  52. package/src/assets/web-panel/assets/{Permissions-DPRmQf_H.js → Permissions-RRf6HbWJ.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-B37bsbEN.js → PersonalDataHub-BGTMiICa.js} +4 -4
  54. package/src/assets/web-panel/assets/{Pipeline-CCAuPqu9.js → Pipeline-945qY9YF.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-B81msZdv.js → Privacy-DPZwI6lJ.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-B-Py2NbF.js → ProjectInit-BPH2NRKc.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-CYsneiRB.js → ProjectSettings-BZCRNCvb.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-Y975Mh6R.js → Projects-BTI__tBt.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-uO-10aP1.js → Providers-DDCf_nIw.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-Bj_6gJ0l.js → QrScannerModal-N6rbqt1r.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-BgpBCMPE.js → QuickAsk-DrwjPS7M.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-DhUW3YUA.js → Recommend-Cog9Wd99.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-DdeyfbkA.js → RemoteSession-DC9pynjM.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-fxW421xd.js → Reputation-D4th4gKS.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-De73w1og.js → Row-ogiWR6v9.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-3US_Q_lj.js → RssFeed-uYlk-2Oj.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-DbZ_DU74.js → Search-DYzzwvtM.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-DoIU1vMF.js → Security-Da7YOyX6.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-DB_RGqpc.js → Services-CLI1VM1X.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-DnzLaayC.js → Skeleton-DK77dzDC.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-VzVXHENF.js → Skills-C_z7Lmhl.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-DMfvjCAI.js → Sla-D6413Q8L.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-DQQOYWbF.js → SpeechSettings-C07ydbj2.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-Bmx3FG1P.js → SyncSettings-DGOm2W22.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-DOQyfb-2.js → Tasks-Cr_PVyLM.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-D6hTRT7c.js → Templates-BhL2mZ0t.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-CTPQZAzs.js → Tenant-CPk5oyUr.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-B7vII3oH.js → Terminal-ClhqUsqV.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-BkiFJeXV.js → TimelineRenderer-BCC7MV5a.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-BPPdQMNo.js → Tokens-DD1Jt4oO.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-BxG8JAEI.js → Trigger-BCydFvN2.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-DHD7nMpM.js → Trust-DDHT1noa.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-B4BJpU47.js → UkeySign-CWPZC7oI.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-CRiGpFx2.js → VideoEditing-9Ea0nJR0.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-BSDSNiem.js → Wallet-BjxhLxTf.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-DLTUh5Zv.js → WebAuthn-C6uCye67.js} +5 -5
  87. package/src/assets/web-panel/assets/{WorkflowEditor-tW2MwjhD.js → WorkflowEditor-d2g4reYo.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-SgsLQ3FC.js → chat-frTc6ScX.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-BHjjLIKO.js → colors-B5K6lG3v.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-VceErdKq.js → compact-item-Cdn46r8D.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-BZ332MYl.js → createContext-DU1jqVQi.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-CP-jEUyw.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-CBTjJOjn.js → hasIn-DdNH-aW_.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-CawpdGTW.js → index-32ajXmTb.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-BOtvPdHt.js → index-7ehytj1K.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-vIXOpcjD.js → index-BC4eGkar.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-Cr4rjlW5.js → index-BVLL-mq_.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-D_SePDWj.js → index-BXKhhx9V.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BETEjuNr.js → index-BcGwGIaR.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BY1wexYG.js → index-Be4OtL-N.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BRWhLbWF.js → index-BoFak7le.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-29wVzi-k.js → index-BwlIxAmX.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BeiqkxJG.js → index-CGiwfwB9.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BQSmZGgs.js → index-CHmkkdfT.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BhXZEUAc.js → index-CQorP1Ng.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-C_B9rFQE.js → index-CUoNAmE8.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-iYQNU9za.js → index-Cj6P9Nst.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DePOeMDM.js → index-CtRPi4YC.js} +1 -1
  109. package/src/assets/web-panel/assets/index-CzrCHrFy.js +1 -0
  110. package/src/assets/web-panel/assets/{index-DdefYBSw.js → index-D1qIC4GR.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-By5jBtkV.js → index-D23xGYjM.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CMVvxIS8.js → index-D4l82Me1.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CLc19alH.js → index-D4miNkWv.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-B2u26AS3.js → index-DIVyTmZ3.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DaCCy6lq.js → index-DM5FmPZU.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DUkVN794.js → index-DRzBBdQ0.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BPXFLYdW.js → index-Dca_i7H8.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CpumS98o.js → index-DftZuyA7.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CrUgDQkf.js → index-DtBCCkC4.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CtjLcCNU.js → index-HjCvXHf5.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CaIS_TNX.js → index-LaivuXyF.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BC1xuQgX.js → index-MM4Zz2OE.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BcUenmCX.js → index-NmEXVjzt.js} +1 -1
  124. package/src/assets/web-panel/assets/index-OJsGskZw.js +1 -0
  125. package/src/assets/web-panel/assets/{index-_PHrIO4O.js → index-PjAS0sIZ.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DgPvuIn2.js → index-VDM2KKo9.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-B5KAGxNo.js → index-cYaWV4Mq.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-B40dQn0G.js → index-gg3QPC3i.js} +3 -3
  129. package/src/assets/web-panel/assets/{index-BTlc-Bve.js → index-kVO_MDm-.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-FJ3zC9LK.js → index-mgU3Q-lN.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-1n7xjKDU.js → index-t_OBzIP4.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-fU7wNHDB.js → index-yZRuZpwK.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-D1oZNz0D.js → initDefaultProps-DwLTRNdo.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-C8k6doMO.js → motion-BchZDXnh.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-DJ4qSbYt.js → move-e8M-zZFl.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-CdpJD85j.js → mtc-parser-Ci40fQb3.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-B0V4slKA.js → omit-C7110_f2.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-Di5NiW1F.js → pickAttrs-skteMgnM.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-B5OMHgEM.js → placementArrow-MGZ-lh2B.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-C6U9IWql.js → responsiveObserve-N4Sd7uy-.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-BMyTH3rN.js → slide-C7HDGRaa.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-C7d6BG7Z.js → statusUtils-BhRexlgy.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-CR50QnQy.js → styleChecker-ChEoQkN2.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-DBEeoMb8.js → useFlexGapSupport-CDbG1s2Y.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-3r099cjv.js → useFs-CUIx0tcJ.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-C5IYNdTK.js → usePersonalDataHub-bkO7L7ec.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-DmEOLRHf.js → vnode-B_ZvABIG.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-DnpUiVCB.js → zoom-D5shjpS8.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/command-help-index.json +4 -4
  151. package/src/commands/agent.js +3 -3
  152. package/src/commands/background-session.js +145 -0
  153. package/src/commands/mcp.js +125 -7
  154. package/src/commands/serve.js +1 -1
  155. package/src/commands/session-show.js +131 -0
  156. package/src/commands/session.js +50 -106
  157. package/src/commands/skill.js +87 -50
  158. package/src/data/changelog.json +14 -1
  159. package/src/gateways/ws/ws-agent-handler.js +8 -1
  160. package/src/harness/jsonl-session-store.js +428 -25
  161. package/src/harness/mcp-client.js +2652 -404
  162. package/src/harness/session-list-index.js +65 -7
  163. package/src/lazy-dispatch.js +76 -8
  164. package/src/lib/abort-utils.js +68 -0
  165. package/src/lib/agent-core.js +1 -59
  166. package/src/lib/chat-core.js +24 -6
  167. package/src/lib/cowork-mcp-tools.js +47 -2
  168. package/src/lib/cowork-task-runner.js +11 -3
  169. package/src/lib/doctor-checkup.js +9 -7
  170. package/src/lib/learning/skill-improver.js +21 -2
  171. package/src/lib/mcp-call-ledger-store.js +116 -3
  172. package/src/lib/mcp-call-ledger.js +59 -14
  173. package/src/lib/mcp-client.js +1 -0
  174. package/src/lib/mcp-stdio-executable-identity.js +598 -0
  175. package/src/lib/mcp-stdio-execution-authority.js +363 -0
  176. package/src/lib/mcp-tool-metadata.js +436 -0
  177. package/src/lib/mcp-tool-result.js +367 -0
  178. package/src/lib/observability/index.js +71 -0
  179. package/src/lib/pr-link-ledger.js +8 -27
  180. package/src/lib/pr-link-store.js +26 -0
  181. package/src/lib/process-execution-broker/index.js +14 -0
  182. package/src/lib/process-tree-termination.js +253 -0
  183. package/src/lib/session-host-snapshot.js +9 -5
  184. package/src/lib/session-projection.js +5 -1
  185. package/src/lib/session-tail.js +31 -1
  186. package/src/lib/skill-budget.js +222 -0
  187. package/src/lib/skill-execution-authority.js +381 -0
  188. package/src/lib/skill-execution-identity.js +39 -2
  189. package/src/lib/skill-loader.js +322 -86
  190. package/src/lib/skill-mcp.js +43 -1
  191. package/src/repl/agent-repl.js +174 -38
  192. package/src/repl/bg-dashboard.js +81 -28
  193. package/src/repl/chat-repl.js +77 -12
  194. package/src/runtime/agent-core.js +340 -108
  195. package/src/runtime/agent-runtime.js +26 -3
  196. package/src/runtime/headless-runner.js +150 -23
  197. package/src/runtime/headless-stream.js +309 -59
  198. package/src/runtime/mcp-config.js +157 -10
  199. package/src/runtime/mcp-tool-search.js +0 -0
  200. package/src/runtime/output-backpressure.js +366 -0
  201. package/src/runtime/pipe-safety.js +56 -21
  202. package/src/assets/web-panel/assets/ChatBubbleRenderer-BUUyJ5QO.js +0 -1
  203. package/src/assets/web-panel/assets/MarkdownRenderer-1mNozZ8v.js +0 -1
  204. package/src/assets/web-panel/assets/MobileProjects-DqnoFPgR.js +0 -1
  205. package/src/assets/web-panel/assets/devWarning-DosMaL-k.js +0 -1
  206. package/src/assets/web-panel/assets/index-0O5ePnUq.js +0 -1
  207. package/src/assets/web-panel/assets/index-ChAzPigF.js +0 -1
  208. package/src/lib/skill-process-broker.js +0 -85
@@ -19,11 +19,16 @@ import { attachTopicHandlers } from "../gateways/ws/topic-handler-attachment.js"
19
19
  import { PtyManager } from "../gateways/terminal/PtyManager.js";
20
20
  import { createTerminalHandlers } from "../gateways/terminal/terminal-handlers.js";
21
21
  import { createWebUIServer } from "../gateways/ui/web-ui-server.js";
22
- import { MCPClient, MCPServerConfig } from "../harness/mcp-client.js";
22
+ import {
23
+ MCPClient,
24
+ MCPServerConfig,
25
+ inferTransport,
26
+ } from "../harness/mcp-client.js";
23
27
  import sharedManagedToolPolicy from "./coding-agent-managed-tool-policy.cjs";
24
28
  import { findProjectRoot, loadProjectConfig } from "../lib/project-detector.js";
25
29
  import { loadConfig } from "../lib/config-manager.js";
26
30
  import { collectWorkspacePluginBinSandboxPolicy } from "../lib/plugin-runtime/bin.js";
31
+ import { issueMcpStdioExecutionAuthority } from "../lib/mcp-stdio-execution-authority.js";
27
32
 
28
33
  const {
29
34
  DEFAULT_ALLOWED_MCP_SERVER_NAMES,
@@ -266,7 +271,15 @@ export class AgentRuntime {
266
271
  }
267
272
  for (const [name, cfg] of entries) {
268
273
  try {
269
- await bundleMcpClient.connect(name, cfg);
274
+ const authorizedConfig = { ...cfg };
275
+ authorizedConfig.mcpStdioExecutionAuthority =
276
+ issueMcpStdioExecutionAuthority({
277
+ serverName: name,
278
+ config: authorizedConfig,
279
+ approvalKind: "explicit-config",
280
+ approvalSource: `agent-bundle:${path.resolve(this.policy.bundlePath)}`,
281
+ });
282
+ await bundleMcpClient.connect(name, authorizedConfig);
270
283
  } catch (mcpErr) {
271
284
  runtimeLogger.log(
272
285
  chalk.yellow(
@@ -779,7 +792,17 @@ export class AgentRuntime {
779
792
 
780
793
  for (const server of eligibleServers) {
781
794
  try {
782
- await mcpClient.connect(server.name, server);
795
+ const authorizedServer = { ...server };
796
+ if (inferTransport(authorizedServer) === "stdio") {
797
+ authorizedServer.mcpStdioExecutionAuthority =
798
+ issueMcpStdioExecutionAuthority({
799
+ serverName: server.name,
800
+ config: authorizedServer,
801
+ approvalKind: "registered-config",
802
+ approvalSource: `${server.configScope || "user"}:${server.configSource || "database"}:${server.name}`,
803
+ });
804
+ }
805
+ await mcpClient.connect(server.name, authorizedServer);
783
806
  connectedCount += 1;
784
807
  } catch (err) {
785
808
  options.logger?.log?.(
@@ -53,6 +53,7 @@ import {
53
53
  findLatestEvent as jsonlFindLatestEvent,
54
54
  rebuildMessages as jsonlRebuildMessages,
55
55
  sessionExists as jsonlSessionExists,
56
+ sessionHasPersistedEvidence as jsonlSessionHasPersistedEvidence,
56
57
  getLastSessionId as jsonlGetLastSessionId,
57
58
  verifySession as jsonlVerifySession,
58
59
  } from "../harness/jsonl-session-store.js";
@@ -153,6 +154,7 @@ const VALID_OUTPUT_FORMATS = Object.freeze(["text", "json", "stream-json"]);
153
154
  // the stream-json driver + REPL); re-exported here for existing importers.
154
155
  export { installPipeSafety } from "./pipe-safety.js";
155
156
  import { installPipeSafety } from "./pipe-safety.js";
157
+ import { createHeadlessOutputBackpressure } from "./output-backpressure.js";
156
158
 
157
159
  /**
158
160
  * Normalize a public --permission-mode spelling to the canonical internal mode.
@@ -363,12 +365,92 @@ export function applyForkSession(opts = {}, store = {}) {
363
365
  */
364
366
  export async function runAgentHeadless(options = {}, deps = {}) {
365
367
  const trustedWorkspaceRoot = options.cwd || process.cwd();
366
- return runWithHostHooksV2Workspace(trustedWorkspaceRoot, () =>
367
- runAgentHeadlessInWorkspace(options, deps),
368
- );
368
+ const pipeState = { closed: false };
369
+ const stdout = deps.stdout || process.stdout;
370
+ const stderr = deps.stderr || process.stderr;
371
+ const shouldInstallPipeSafety =
372
+ typeof deps.installPipeSafety === "function" ||
373
+ (!deps.writeOut && !deps.writeErr);
374
+ const pipeAbort = shouldInstallPipeSafety ? new AbortController() : null;
375
+ const managesNativeOutput = !deps.writeOut || !deps.writeErr;
376
+ const outputAbort = managesNativeOutput ? new AbortController() : null;
377
+ const handlePipeClosed = () => {
378
+ if (pipeState.closed) return;
379
+ pipeState.closed = true;
380
+ process.exitCode = 0;
381
+ pipeAbort?.abort();
382
+ };
383
+ const outputFlow =
384
+ deps.outputFlow ||
385
+ createHeadlessOutputBackpressure({
386
+ stdout,
387
+ stderr,
388
+ writeOut: deps.writeOut,
389
+ writeErr: deps.writeErr,
390
+ maxQueuedBytes: deps.outputBackpressureMaxBytes,
391
+ onFailure: (error) => {
392
+ outputAbort?.abort(error);
393
+ if (error?.code === "EPIPE") handlePipeClosed();
394
+ },
395
+ });
396
+ const abortSignals = [
397
+ options.signal,
398
+ pipeAbort?.signal,
399
+ outputAbort?.signal,
400
+ ].filter(Boolean);
401
+ const runtimeOptions =
402
+ abortSignals.length === 0
403
+ ? options
404
+ : {
405
+ ...options,
406
+ signal:
407
+ abortSignals.length === 1
408
+ ? abortSignals[0]
409
+ : AbortSignal.any(abortSignals),
410
+ };
411
+ const runtimeDeps = {
412
+ ...deps,
413
+ writeOut: outputFlow.writeOut,
414
+ writeErr: outputFlow.writeErr,
415
+ outputFlow,
416
+ };
417
+ const installSafety = deps.installPipeSafety || installPipeSafety;
418
+ const disposePipeSafety = shouldInstallPipeSafety
419
+ ? installSafety([stdout, stderr], handlePipeClosed)
420
+ : null;
421
+
422
+ let outcome;
423
+ let failure = null;
424
+ try {
425
+ outcome = await runWithHostHooksV2Workspace(trustedWorkspaceRoot, () =>
426
+ runAgentHeadlessInWorkspace(runtimeOptions, runtimeDeps, pipeState),
427
+ );
428
+ } catch (error) {
429
+ failure = error;
430
+ } finally {
431
+ try {
432
+ await outputFlow.wait();
433
+ } catch (error) {
434
+ failure ||= error;
435
+ }
436
+ outputFlow.dispose();
437
+ disposePipeSafety?.();
438
+ }
439
+
440
+ if (pipeState.closed) {
441
+ return outcome
442
+ ? { ...outcome, exitCode: 0, isError: false }
443
+ : { exitCode: 0, result: "", isError: false };
444
+ }
445
+ if (failure) throw failure;
446
+ return outcome;
369
447
  }
370
448
 
371
- async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
449
+ async function runAgentHeadlessInWorkspace(
450
+ options = {},
451
+ deps = {},
452
+ pipeState = { closed: false },
453
+ ) {
372
454
  const prompt = (options.prompt || "").trim();
373
455
  if (!prompt) {
374
456
  throw new Error(
@@ -386,11 +468,11 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
386
468
  const isStream = outputFormat === "stream-json";
387
469
  const isJson = outputFormat === "json";
388
470
  const isText = outputFormat === "text";
389
- const writeOut = deps.writeOut || ((s) => process.stdout.write(s));
390
- const writeErr = deps.writeErr || ((s) => process.stderr.write(s));
391
- if (!deps.writeOut && !deps.writeErr) installPipeSafety();
471
+ const writeOut = deps.writeOut;
472
+ const writeErr = deps.writeErr;
392
473
 
393
474
  const hasInjectedSessionStore =
475
+ typeof deps.sessionHasPersistedEvidence === "function" ||
394
476
  typeof deps.sessionExists === "function" ||
395
477
  typeof deps.rebuildMessages === "function" ||
396
478
  typeof deps.appendEvent === "function" ||
@@ -435,27 +517,36 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
435
517
  // settings/plugin loading, bootstrap, model access, hooks, MCP and tools.
436
518
  const canReadCanonicalResume =
437
519
  !hasInjectedSessionStore || typeof deps.readVerifiedEvents === "function";
438
- const canonicalResume =
439
- resumeId && canReadCanonicalResume
440
- ? readSessionHostResumeState(resumeId, {
520
+ const canonicalAdmissionId = resumeId || (persist ? sessionId : null);
521
+ const canonicalAdmission =
522
+ canonicalAdmissionId && canReadCanonicalResume
523
+ ? readSessionHostResumeState(canonicalAdmissionId, {
524
+ sessionHasPersistedEvidence:
525
+ deps.sessionHasPersistedEvidence ||
526
+ (!hasInjectedSessionStore
527
+ ? jsonlSessionHasPersistedEvidence
528
+ : undefined),
441
529
  sessionExists: deps.sessionExists || jsonlSessionExists,
442
530
  readVerifiedEvents:
443
531
  deps.readVerifiedEvents || jsonlReadVerifiedEvents,
444
532
  })
445
533
  : null;
446
- if (canonicalResume && !canonicalResume.snapshot.verified) {
534
+ if (canonicalAdmission && !canonicalAdmission.snapshot.verified) {
447
535
  const message =
448
536
  "CC_SESSION_HOST_SNAPSHOT_UNVERIFIED: canonical JSONL session is not " +
449
- "fully verified; resume was refused";
537
+ "fully verified; resume/write admission was refused";
450
538
  emitHeadlessError(message);
451
539
  writeErr(`${message}\n`);
452
540
  return {
453
541
  exitCode: 1,
454
542
  result: message,
455
543
  isError: true,
456
- sessionSnapshot: canonicalResume.snapshot,
544
+ sessionSnapshot: canonicalAdmission.snapshot,
457
545
  };
458
546
  }
547
+ // A persist-only target must pass the same canonical admission boundary, but
548
+ // it does not opt into replaying the target's prior conversation.
549
+ const canonicalResume = resumeId ? canonicalAdmission : null;
459
550
 
460
551
  // `let` (not const): a custom-command macro's `model:` frontmatter may
461
552
  // override it below (when the user passed no explicit --model), mirroring
@@ -533,7 +624,7 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
533
624
  cwd,
534
625
  settingsFile: options.settingsFile,
535
626
  });
536
- if (notice) process.stderr.write(notice + "\n");
627
+ if (notice) writeErr(notice + "\n");
537
628
  } catch {
538
629
  /* trust notice is best-effort */
539
630
  }
@@ -1465,9 +1556,12 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
1465
1556
  bundle: mcp,
1466
1557
  sessionId,
1467
1558
  sink: persist
1468
- ? createSessionMcpLedgerSink(sessionId, {
1469
- appendEvent: store.appendAuthorityEvent,
1470
- })
1559
+ ? createSessionMcpLedgerSink(
1560
+ sessionId,
1561
+ hasInjectedSessionStore
1562
+ ? { appendEvent: store.appendAuthorityEvent }
1563
+ : { recovery: resumeMcpRecovery },
1564
+ )
1471
1565
  : null,
1472
1566
  recovery: resumeMcpRecovery,
1473
1567
  recoveryError: resumeMcpRecoveryError,
@@ -1831,6 +1925,24 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
1831
1925
  const suffix = retryIn > 0 ? ` · will retry in ${retryIn}s` : "";
1832
1926
  writeErr(` ⏳ waiting for API response (silent ${silent}s)${suffix}…\n`);
1833
1927
  },
1928
+ onProviderFallback: (info) => {
1929
+ if (isStream) {
1930
+ emitStream({
1931
+ type: "raw",
1932
+ subtype: "provider_fallback",
1933
+ text:
1934
+ info.message || `provider switched from ${info.from} to ${info.to}`,
1935
+ from: info.from,
1936
+ to: info.to,
1937
+ reason: info.reason,
1938
+ session_id: sessionId,
1939
+ });
1940
+ } else {
1941
+ writeErr(
1942
+ `[provider] ${info.message || `switched from ${info.from} to ${info.to}`}\n`,
1943
+ );
1944
+ }
1945
+ },
1834
1946
  };
1835
1947
 
1836
1948
  // Goal binding (cc goal, Phase 1). `--goal <id>` binds explicitly; `--goal`
@@ -2421,6 +2533,7 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
2421
2533
  if (isStream && event.type) emitStream(event);
2422
2534
  break;
2423
2535
  }
2536
+ await deps.outputFlow?.wait?.();
2424
2537
  // Hard cost cap reached: stop consuming the loop so no further paid LLM
2425
2538
  // call is made (break out of the for-await, not just the switch).
2426
2539
  if (stopForCost) break;
@@ -2660,7 +2773,11 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
2660
2773
  try {
2661
2774
  const { runObserveHooks, dispatchAsyncHooks } =
2662
2775
  await import("../lib/settings-hook-events.js");
2663
- const stopPayload = { reason: endReason, cwd, session_id: sessionId };
2776
+ const stopPayload = {
2777
+ reason: pipeState.closed ? "pipe_closed" : endReason,
2778
+ cwd,
2779
+ session_id: sessionId,
2780
+ };
2664
2781
  const stopOutcome = runObserveHooks(
2665
2782
  settingsHooks,
2666
2783
  "Stop",
@@ -2736,7 +2853,11 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
2736
2853
  runObserveHooks(
2737
2854
  settingsHooks,
2738
2855
  "SessionEnd",
2739
- { reason: "completed", cwd, session_id: sessionId },
2856
+ {
2857
+ reason: pipeState.closed ? "pipe_closed" : "completed",
2858
+ cwd,
2859
+ session_id: sessionId,
2860
+ },
2740
2861
  { cwd },
2741
2862
  );
2742
2863
  } catch (error) {
@@ -2751,6 +2872,14 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
2751
2872
  }
2752
2873
  }
2753
2874
 
2875
+ // A downstream consumer closed stdout/stderr. The abort above unwound the
2876
+ // model loop through the same `finally` as every other termination, so MCP,
2877
+ // background tasks, approval bridges, and hooks are settled. Do not attempt
2878
+ // more writes to the closed pipe or persist a partial assistant answer.
2879
+ if (pipeState.closed) {
2880
+ return { exitCode: 0, result: finalText, isError: false };
2881
+ }
2882
+
2754
2883
  // coreAgentLoop emits run-ended reason "budget-exhausted" when the iteration
2755
2884
  // cap is hit; treat that as the max-turns error surface. A cost-budget stop
2756
2885
  // (--max-budget-usd) is its own error surface so callers can tell them apart.
@@ -2923,12 +3052,10 @@ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
2923
3052
  );
2924
3053
  if (!isStream) {
2925
3054
  const sum = _otlpRecorder.summary();
2926
- process.stderr.write(
2927
- `[otlp] ${sum.spanCount} span(s) → ${options.otlp}\n`,
2928
- );
3055
+ writeErr(`[otlp] ${sum.spanCount} span(s) → ${options.otlp}\n`);
2929
3056
  }
2930
3057
  } catch (err) {
2931
- process.stderr.write(`[otlp] export failed: ${err.message}\n`);
3058
+ writeErr(`[otlp] export failed: ${err.message}\n`);
2932
3059
  }
2933
3060
  }
2934
3061
  if (_collectorEnabled) {