lorenz 0.1.0

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 (630) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +13 -0
  3. package/README.md +774 -0
  4. package/RELEASE-MANIFEST.json +211 -0
  5. package/apps/cli/bin/lorenz.js +25 -0
  6. package/apps/cli/dist/bin/cli.d.ts +3 -0
  7. package/apps/cli/dist/bin/cli.d.ts.map +1 -0
  8. package/apps/cli/dist/bin/cli.js +4 -0
  9. package/apps/cli/dist/bin/cli.js.map +1 -0
  10. package/apps/cli/dist/daemon.d.ts +76 -0
  11. package/apps/cli/dist/daemon.d.ts.map +1 -0
  12. package/apps/cli/dist/daemon.js +189 -0
  13. package/apps/cli/dist/daemon.js.map +1 -0
  14. package/apps/cli/dist/doctor.d.ts +40 -0
  15. package/apps/cli/dist/doctor.d.ts.map +1 -0
  16. package/apps/cli/dist/doctor.js +590 -0
  17. package/apps/cli/dist/doctor.js.map +1 -0
  18. package/apps/cli/dist/index.d.ts +32 -0
  19. package/apps/cli/dist/index.d.ts.map +1 -0
  20. package/apps/cli/dist/index.js +26 -0
  21. package/apps/cli/dist/index.js.map +1 -0
  22. package/apps/cli/dist/main.d.ts +40 -0
  23. package/apps/cli/dist/main.d.ts.map +1 -0
  24. package/apps/cli/dist/main.js +259 -0
  25. package/apps/cli/dist/main.js.map +1 -0
  26. package/apps/cli/dist/runs.d.ts +31 -0
  27. package/apps/cli/dist/runs.d.ts.map +1 -0
  28. package/apps/cli/dist/runs.js +281 -0
  29. package/apps/cli/dist/runs.js.map +1 -0
  30. package/apps/cli/dist/workerDriverLoader.d.ts +64 -0
  31. package/apps/cli/dist/workerDriverLoader.d.ts.map +1 -0
  32. package/apps/cli/dist/workerDriverLoader.js +211 -0
  33. package/apps/cli/dist/workerDriverLoader.js.map +1 -0
  34. package/apps/cli/package.json +57 -0
  35. package/apps/symphony-dashboard/dist/assets/index-B3owF3jd.css +1 -0
  36. package/apps/symphony-dashboard/dist/assets/index-DQ6XlL0d.js +227 -0
  37. package/apps/symphony-dashboard/dist/index.html +18 -0
  38. package/bin/lorenz +16 -0
  39. package/extensions/docker-worker/dist/index.d.ts +92 -0
  40. package/extensions/docker-worker/dist/index.d.ts.map +1 -0
  41. package/extensions/docker-worker/dist/index.js +283 -0
  42. package/extensions/docker-worker/dist/index.js.map +1 -0
  43. package/extensions/docker-worker/package.json +14 -0
  44. package/extensions/jira-tracker/dist/client.d.ts +50 -0
  45. package/extensions/jira-tracker/dist/client.d.ts.map +1 -0
  46. package/extensions/jira-tracker/dist/client.js +619 -0
  47. package/extensions/jira-tracker/dist/client.js.map +1 -0
  48. package/extensions/jira-tracker/dist/index.d.ts +5 -0
  49. package/extensions/jira-tracker/dist/index.d.ts.map +1 -0
  50. package/extensions/jira-tracker/dist/index.js +5 -0
  51. package/extensions/jira-tracker/dist/index.js.map +1 -0
  52. package/extensions/jira-tracker/dist/options.d.ts +38 -0
  53. package/extensions/jira-tracker/dist/options.d.ts.map +1 -0
  54. package/extensions/jira-tracker/dist/options.js +61 -0
  55. package/extensions/jira-tracker/dist/options.js.map +1 -0
  56. package/extensions/jira-tracker/dist/provider.d.ts +6 -0
  57. package/extensions/jira-tracker/dist/provider.d.ts.map +1 -0
  58. package/extensions/jira-tracker/dist/provider.js +178 -0
  59. package/extensions/jira-tracker/dist/provider.js.map +1 -0
  60. package/extensions/jira-tracker/dist/register.d.ts +10 -0
  61. package/extensions/jira-tracker/dist/register.d.ts.map +1 -0
  62. package/extensions/jira-tracker/dist/register.js +15 -0
  63. package/extensions/jira-tracker/dist/register.js.map +1 -0
  64. package/extensions/jira-tracker/package.json +16 -0
  65. package/extensions/linear-tracker/dist/client.d.ts +82 -0
  66. package/extensions/linear-tracker/dist/client.d.ts.map +1 -0
  67. package/extensions/linear-tracker/dist/client.js +622 -0
  68. package/extensions/linear-tracker/dist/client.js.map +1 -0
  69. package/extensions/linear-tracker/dist/index.d.ts +8 -0
  70. package/extensions/linear-tracker/dist/index.d.ts.map +1 -0
  71. package/extensions/linear-tracker/dist/index.js +7 -0
  72. package/extensions/linear-tracker/dist/index.js.map +1 -0
  73. package/extensions/linear-tracker/dist/options.d.ts +32 -0
  74. package/extensions/linear-tracker/dist/options.d.ts.map +1 -0
  75. package/extensions/linear-tracker/dist/options.js +59 -0
  76. package/extensions/linear-tracker/dist/options.js.map +1 -0
  77. package/extensions/linear-tracker/dist/provider.d.ts +4 -0
  78. package/extensions/linear-tracker/dist/provider.d.ts.map +1 -0
  79. package/extensions/linear-tracker/dist/provider.js +58 -0
  80. package/extensions/linear-tracker/dist/provider.js.map +1 -0
  81. package/extensions/linear-tracker/dist/register.d.ts +11 -0
  82. package/extensions/linear-tracker/dist/register.d.ts.map +1 -0
  83. package/extensions/linear-tracker/dist/register.js +19 -0
  84. package/extensions/linear-tracker/dist/register.js.map +1 -0
  85. package/extensions/linear-tracker/dist/toolOps.d.ts +8 -0
  86. package/extensions/linear-tracker/dist/toolOps.d.ts.map +1 -0
  87. package/extensions/linear-tracker/dist/toolOps.js +160 -0
  88. package/extensions/linear-tracker/dist/toolOps.js.map +1 -0
  89. package/extensions/linear-tracker/dist/tools.d.ts +7 -0
  90. package/extensions/linear-tracker/dist/tools.d.ts.map +1 -0
  91. package/extensions/linear-tracker/dist/tools.js +210 -0
  92. package/extensions/linear-tracker/dist/tools.js.map +1 -0
  93. package/extensions/linear-tracker/package.json +18 -0
  94. package/extensions/local-tracker/dist/boardStore.d.ts +116 -0
  95. package/extensions/local-tracker/dist/boardStore.d.ts.map +1 -0
  96. package/extensions/local-tracker/dist/boardStore.js +475 -0
  97. package/extensions/local-tracker/dist/boardStore.js.map +1 -0
  98. package/extensions/local-tracker/dist/client.d.ts +14 -0
  99. package/extensions/local-tracker/dist/client.d.ts.map +1 -0
  100. package/extensions/local-tracker/dist/client.js +27 -0
  101. package/extensions/local-tracker/dist/client.js.map +1 -0
  102. package/extensions/local-tracker/dist/index.d.ts +7 -0
  103. package/extensions/local-tracker/dist/index.d.ts.map +1 -0
  104. package/extensions/local-tracker/dist/index.js +7 -0
  105. package/extensions/local-tracker/dist/index.js.map +1 -0
  106. package/extensions/local-tracker/dist/options.d.ts +31 -0
  107. package/extensions/local-tracker/dist/options.d.ts.map +1 -0
  108. package/extensions/local-tracker/dist/options.js +69 -0
  109. package/extensions/local-tracker/dist/options.js.map +1 -0
  110. package/extensions/local-tracker/dist/provider.d.ts +9 -0
  111. package/extensions/local-tracker/dist/provider.d.ts.map +1 -0
  112. package/extensions/local-tracker/dist/provider.js +35 -0
  113. package/extensions/local-tracker/dist/provider.js.map +1 -0
  114. package/extensions/local-tracker/dist/register.d.ts +11 -0
  115. package/extensions/local-tracker/dist/register.d.ts.map +1 -0
  116. package/extensions/local-tracker/dist/register.js +19 -0
  117. package/extensions/local-tracker/dist/register.js.map +1 -0
  118. package/extensions/local-tracker/dist/resolveBoardDir.d.ts +24 -0
  119. package/extensions/local-tracker/dist/resolveBoardDir.d.ts.map +1 -0
  120. package/extensions/local-tracker/dist/resolveBoardDir.js +39 -0
  121. package/extensions/local-tracker/dist/resolveBoardDir.js.map +1 -0
  122. package/extensions/local-tracker/dist/toolOps.d.ts +9 -0
  123. package/extensions/local-tracker/dist/toolOps.d.ts.map +1 -0
  124. package/extensions/local-tracker/dist/toolOps.js +86 -0
  125. package/extensions/local-tracker/dist/toolOps.js.map +1 -0
  126. package/extensions/local-tracker/dist/tools.d.ts +7 -0
  127. package/extensions/local-tracker/dist/tools.d.ts.map +1 -0
  128. package/extensions/local-tracker/dist/tools.js +170 -0
  129. package/extensions/local-tracker/dist/tools.js.map +1 -0
  130. package/extensions/local-tracker/package.json +18 -0
  131. package/extensions/memory-tracker/dist/index.d.ts +24 -0
  132. package/extensions/memory-tracker/dist/index.d.ts.map +1 -0
  133. package/extensions/memory-tracker/dist/index.js +110 -0
  134. package/extensions/memory-tracker/dist/index.js.map +1 -0
  135. package/extensions/memory-tracker/package.json +16 -0
  136. package/extensions/slack-tracker/dist/client.d.ts +88 -0
  137. package/extensions/slack-tracker/dist/client.d.ts.map +1 -0
  138. package/extensions/slack-tracker/dist/client.js +246 -0
  139. package/extensions/slack-tracker/dist/client.js.map +1 -0
  140. package/extensions/slack-tracker/dist/inMemoryTransport.d.ts +42 -0
  141. package/extensions/slack-tracker/dist/inMemoryTransport.d.ts.map +1 -0
  142. package/extensions/slack-tracker/dist/inMemoryTransport.js +104 -0
  143. package/extensions/slack-tracker/dist/inMemoryTransport.js.map +1 -0
  144. package/extensions/slack-tracker/dist/index.d.ts +15 -0
  145. package/extensions/slack-tracker/dist/index.d.ts.map +1 -0
  146. package/extensions/slack-tracker/dist/index.js +11 -0
  147. package/extensions/slack-tracker/dist/index.js.map +1 -0
  148. package/extensions/slack-tracker/dist/mapping.d.ts +27 -0
  149. package/extensions/slack-tracker/dist/mapping.d.ts.map +1 -0
  150. package/extensions/slack-tracker/dist/mapping.js +109 -0
  151. package/extensions/slack-tracker/dist/mapping.js.map +1 -0
  152. package/extensions/slack-tracker/dist/operations.d.ts +41 -0
  153. package/extensions/slack-tracker/dist/operations.d.ts.map +1 -0
  154. package/extensions/slack-tracker/dist/operations.js +97 -0
  155. package/extensions/slack-tracker/dist/operations.js.map +1 -0
  156. package/extensions/slack-tracker/dist/options.d.ts +30 -0
  157. package/extensions/slack-tracker/dist/options.d.ts.map +1 -0
  158. package/extensions/slack-tracker/dist/options.js +49 -0
  159. package/extensions/slack-tracker/dist/options.js.map +1 -0
  160. package/extensions/slack-tracker/dist/provider.d.ts +9 -0
  161. package/extensions/slack-tracker/dist/provider.d.ts.map +1 -0
  162. package/extensions/slack-tracker/dist/provider.js +74 -0
  163. package/extensions/slack-tracker/dist/provider.js.map +1 -0
  164. package/extensions/slack-tracker/dist/register.d.ts +11 -0
  165. package/extensions/slack-tracker/dist/register.d.ts.map +1 -0
  166. package/extensions/slack-tracker/dist/register.js +19 -0
  167. package/extensions/slack-tracker/dist/register.js.map +1 -0
  168. package/extensions/slack-tracker/dist/threadState.d.ts +52 -0
  169. package/extensions/slack-tracker/dist/threadState.d.ts.map +1 -0
  170. package/extensions/slack-tracker/dist/threadState.js +192 -0
  171. package/extensions/slack-tracker/dist/threadState.js.map +1 -0
  172. package/extensions/slack-tracker/dist/toolOps.d.ts +13 -0
  173. package/extensions/slack-tracker/dist/toolOps.d.ts.map +1 -0
  174. package/extensions/slack-tracker/dist/toolOps.js +76 -0
  175. package/extensions/slack-tracker/dist/toolOps.js.map +1 -0
  176. package/extensions/slack-tracker/dist/tools.d.ts +8 -0
  177. package/extensions/slack-tracker/dist/tools.d.ts.map +1 -0
  178. package/extensions/slack-tracker/dist/tools.js +266 -0
  179. package/extensions/slack-tracker/dist/tools.js.map +1 -0
  180. package/extensions/slack-tracker/dist/transport.d.ts +63 -0
  181. package/extensions/slack-tracker/dist/transport.d.ts.map +1 -0
  182. package/extensions/slack-tracker/dist/transport.js +2 -0
  183. package/extensions/slack-tracker/dist/transport.js.map +1 -0
  184. package/extensions/slack-tracker/dist/webTransport.d.ts +44 -0
  185. package/extensions/slack-tracker/dist/webTransport.d.ts.map +1 -0
  186. package/extensions/slack-tracker/dist/webTransport.js +402 -0
  187. package/extensions/slack-tracker/dist/webTransport.js.map +1 -0
  188. package/extensions/slack-tracker/package.json +17 -0
  189. package/package.json +89 -0
  190. package/packages/acp/dist/childProcess.d.ts +4 -0
  191. package/packages/acp/dist/childProcess.d.ts.map +1 -0
  192. package/packages/acp/dist/childProcess.js +33 -0
  193. package/packages/acp/dist/childProcess.js.map +1 -0
  194. package/packages/acp/dist/index.d.ts +70 -0
  195. package/packages/acp/dist/index.d.ts.map +1 -0
  196. package/packages/acp/dist/index.js +701 -0
  197. package/packages/acp/dist/index.js.map +1 -0
  198. package/packages/acp/dist/options.d.ts +24 -0
  199. package/packages/acp/dist/options.d.ts.map +1 -0
  200. package/packages/acp/dist/options.js +92 -0
  201. package/packages/acp/dist/options.js.map +1 -0
  202. package/packages/acp/dist/toml.d.ts +2 -0
  203. package/packages/acp/dist/toml.d.ts.map +1 -0
  204. package/packages/acp/dist/toml.js +51 -0
  205. package/packages/acp/dist/toml.js.map +1 -0
  206. package/packages/acp/package.json +24 -0
  207. package/packages/agent-runner/dist/index.d.ts +58 -0
  208. package/packages/agent-runner/dist/index.d.ts.map +1 -0
  209. package/packages/agent-runner/dist/index.js +288 -0
  210. package/packages/agent-runner/dist/index.js.map +1 -0
  211. package/packages/agent-runner/package.json +19 -0
  212. package/packages/agent-sdk/dist/index.d.ts +2 -0
  213. package/packages/agent-sdk/dist/index.d.ts.map +1 -0
  214. package/packages/agent-sdk/dist/index.js +2 -0
  215. package/packages/agent-sdk/dist/index.js.map +1 -0
  216. package/packages/agent-sdk/dist/provider.d.ts +66 -0
  217. package/packages/agent-sdk/dist/provider.d.ts.map +1 -0
  218. package/packages/agent-sdk/dist/provider.js +38 -0
  219. package/packages/agent-sdk/dist/provider.js.map +1 -0
  220. package/packages/agent-sdk/package.json +14 -0
  221. package/packages/cli-kit/dist/index.d.ts +20 -0
  222. package/packages/cli-kit/dist/index.d.ts.map +1 -0
  223. package/packages/cli-kit/dist/index.js +72 -0
  224. package/packages/cli-kit/dist/index.js.map +1 -0
  225. package/packages/cli-kit/package.json +14 -0
  226. package/packages/config/dist/aliases.d.ts +10 -0
  227. package/packages/config/dist/aliases.d.ts.map +1 -0
  228. package/packages/config/dist/aliases.js +153 -0
  229. package/packages/config/dist/aliases.js.map +1 -0
  230. package/packages/config/dist/defaults.d.ts +12 -0
  231. package/packages/config/dist/defaults.d.ts.map +1 -0
  232. package/packages/config/dist/defaults.js +78 -0
  233. package/packages/config/dist/defaults.js.map +1 -0
  234. package/packages/config/dist/errors.d.ts +3 -0
  235. package/packages/config/dist/errors.d.ts.map +1 -0
  236. package/packages/config/dist/errors.js +56 -0
  237. package/packages/config/dist/errors.js.map +1 -0
  238. package/packages/config/dist/index.d.ts +5 -0
  239. package/packages/config/dist/index.d.ts.map +1 -0
  240. package/packages/config/dist/index.js +4 -0
  241. package/packages/config/dist/index.js.map +1 -0
  242. package/packages/config/dist/leaf-utils.d.ts +3 -0
  243. package/packages/config/dist/leaf-utils.d.ts.map +1 -0
  244. package/packages/config/dist/leaf-utils.js +9 -0
  245. package/packages/config/dist/leaf-utils.js.map +1 -0
  246. package/packages/config/dist/parse.d.ts +11 -0
  247. package/packages/config/dist/parse.d.ts.map +1 -0
  248. package/packages/config/dist/parse.js +821 -0
  249. package/packages/config/dist/parse.js.map +1 -0
  250. package/packages/config/dist/schemas.d.ts +214 -0
  251. package/packages/config/dist/schemas.d.ts.map +1 -0
  252. package/packages/config/dist/schemas.js +248 -0
  253. package/packages/config/dist/schemas.js.map +1 -0
  254. package/packages/config/package.json +19 -0
  255. package/packages/dispatch/dist/index.d.ts +22 -0
  256. package/packages/dispatch/dist/index.d.ts.map +1 -0
  257. package/packages/dispatch/dist/index.js +117 -0
  258. package/packages/dispatch/dist/index.js.map +1 -0
  259. package/packages/dispatch/package.json +16 -0
  260. package/packages/dispatch-coordinator/dist/coordinator.d.ts +158 -0
  261. package/packages/dispatch-coordinator/dist/coordinator.d.ts.map +1 -0
  262. package/packages/dispatch-coordinator/dist/coordinator.js +529 -0
  263. package/packages/dispatch-coordinator/dist/coordinator.js.map +1 -0
  264. package/packages/dispatch-coordinator/dist/gate.d.ts +24 -0
  265. package/packages/dispatch-coordinator/dist/gate.d.ts.map +1 -0
  266. package/packages/dispatch-coordinator/dist/gate.js +47 -0
  267. package/packages/dispatch-coordinator/dist/gate.js.map +1 -0
  268. package/packages/dispatch-coordinator/dist/index.d.ts +6 -0
  269. package/packages/dispatch-coordinator/dist/index.d.ts.map +1 -0
  270. package/packages/dispatch-coordinator/dist/index.js +16 -0
  271. package/packages/dispatch-coordinator/dist/index.js.map +1 -0
  272. package/packages/dispatch-coordinator/dist/mcpEndpointManager.d.ts +28 -0
  273. package/packages/dispatch-coordinator/dist/mcpEndpointManager.d.ts.map +1 -0
  274. package/packages/dispatch-coordinator/dist/mcpEndpointManager.js +54 -0
  275. package/packages/dispatch-coordinator/dist/mcpEndpointManager.js.map +1 -0
  276. package/packages/dispatch-coordinator/dist/nullEndpointManager.d.ts +18 -0
  277. package/packages/dispatch-coordinator/dist/nullEndpointManager.d.ts.map +1 -0
  278. package/packages/dispatch-coordinator/dist/nullEndpointManager.js +40 -0
  279. package/packages/dispatch-coordinator/dist/nullEndpointManager.js.map +1 -0
  280. package/packages/dispatch-coordinator/dist/types.d.ts +119 -0
  281. package/packages/dispatch-coordinator/dist/types.d.ts.map +1 -0
  282. package/packages/dispatch-coordinator/dist/types.js +17 -0
  283. package/packages/dispatch-coordinator/dist/types.js.map +1 -0
  284. package/packages/dispatch-coordinator/package.json +16 -0
  285. package/packages/domain/dist/index.d.ts +775 -0
  286. package/packages/domain/dist/index.d.ts.map +1 -0
  287. package/packages/domain/dist/index.js +124 -0
  288. package/packages/domain/dist/index.js.map +1 -0
  289. package/packages/domain/package.json +14 -0
  290. package/packages/humanize/dist/index.d.ts +4 -0
  291. package/packages/humanize/dist/index.d.ts.map +1 -0
  292. package/packages/humanize/dist/index.js +347 -0
  293. package/packages/humanize/dist/index.js.map +1 -0
  294. package/packages/humanize/package.json +11 -0
  295. package/packages/issue/dist/index.d.ts +7 -0
  296. package/packages/issue/dist/index.d.ts.map +1 -0
  297. package/packages/issue/dist/index.js +147 -0
  298. package/packages/issue/dist/index.js.map +1 -0
  299. package/packages/issue/package.json +14 -0
  300. package/packages/log-file/dist/index.d.ts +10 -0
  301. package/packages/log-file/dist/index.d.ts.map +1 -0
  302. package/packages/log-file/dist/index.js +200 -0
  303. package/packages/log-file/dist/index.js.map +1 -0
  304. package/packages/log-file/package.json +15 -0
  305. package/packages/mcp/dist/agentEndpoint.d.ts +31 -0
  306. package/packages/mcp/dist/agentEndpoint.d.ts.map +1 -0
  307. package/packages/mcp/dist/agentEndpoint.js +270 -0
  308. package/packages/mcp/dist/agentEndpoint.js.map +1 -0
  309. package/packages/mcp/dist/auth.d.ts +7 -0
  310. package/packages/mcp/dist/auth.d.ts.map +1 -0
  311. package/packages/mcp/dist/auth.js +48 -0
  312. package/packages/mcp/dist/auth.js.map +1 -0
  313. package/packages/mcp/dist/filter.d.ts +70 -0
  314. package/packages/mcp/dist/filter.d.ts.map +1 -0
  315. package/packages/mcp/dist/filter.js +231 -0
  316. package/packages/mcp/dist/filter.js.map +1 -0
  317. package/packages/mcp/dist/index.d.ts +7 -0
  318. package/packages/mcp/dist/index.d.ts.map +1 -0
  319. package/packages/mcp/dist/index.js +5 -0
  320. package/packages/mcp/dist/index.js.map +1 -0
  321. package/packages/mcp/dist/server.d.ts +31 -0
  322. package/packages/mcp/dist/server.d.ts.map +1 -0
  323. package/packages/mcp/dist/server.js +176 -0
  324. package/packages/mcp/dist/server.js.map +1 -0
  325. package/packages/mcp/dist/tools/linear.d.ts +5 -0
  326. package/packages/mcp/dist/tools/linear.d.ts.map +1 -0
  327. package/packages/mcp/dist/tools/linear.js +192 -0
  328. package/packages/mcp/dist/tools/linear.js.map +1 -0
  329. package/packages/mcp/dist/tools/local.d.ts +5 -0
  330. package/packages/mcp/dist/tools/local.d.ts.map +1 -0
  331. package/packages/mcp/dist/tools/local.js +161 -0
  332. package/packages/mcp/dist/tools/local.js.map +1 -0
  333. package/packages/mcp/dist/tools/result.d.ts +5 -0
  334. package/packages/mcp/dist/tools/result.d.ts.map +1 -0
  335. package/packages/mcp/dist/tools/result.js +15 -0
  336. package/packages/mcp/dist/tools/result.js.map +1 -0
  337. package/packages/mcp/dist/tools.d.ts +14 -0
  338. package/packages/mcp/dist/tools.d.ts.map +1 -0
  339. package/packages/mcp/dist/tools.js +58 -0
  340. package/packages/mcp/dist/tools.js.map +1 -0
  341. package/packages/mcp/package.json +20 -0
  342. package/packages/orchestrator/dist/index.d.ts +171 -0
  343. package/packages/orchestrator/dist/index.d.ts.map +1 -0
  344. package/packages/orchestrator/dist/index.js +524 -0
  345. package/packages/orchestrator/dist/index.js.map +1 -0
  346. package/packages/orchestrator/package.json +18 -0
  347. package/packages/policies/dist/index.d.ts +11 -0
  348. package/packages/policies/dist/index.d.ts.map +1 -0
  349. package/packages/policies/dist/index.js +6 -0
  350. package/packages/policies/dist/index.js.map +1 -0
  351. package/packages/policies/dist/reconciliation.d.ts +5 -0
  352. package/packages/policies/dist/reconciliation.d.ts.map +1 -0
  353. package/packages/policies/dist/reconciliation.js +17 -0
  354. package/packages/policies/dist/reconciliation.js.map +1 -0
  355. package/packages/policies/dist/resume.d.ts +14 -0
  356. package/packages/policies/dist/resume.d.ts.map +1 -0
  357. package/packages/policies/dist/resume.js +7 -0
  358. package/packages/policies/dist/resume.js.map +1 -0
  359. package/packages/policies/dist/retry.d.ts +4 -0
  360. package/packages/policies/dist/retry.d.ts.map +1 -0
  361. package/packages/policies/dist/retry.js +7 -0
  362. package/packages/policies/dist/retry.js.map +1 -0
  363. package/packages/policies/dist/stopReason.d.ts +4 -0
  364. package/packages/policies/dist/stopReason.d.ts.map +1 -0
  365. package/packages/policies/dist/stopReason.js +11 -0
  366. package/packages/policies/dist/stopReason.js.map +1 -0
  367. package/packages/policies/dist/usage.d.ts +14 -0
  368. package/packages/policies/dist/usage.d.ts.map +1 -0
  369. package/packages/policies/dist/usage.js +38 -0
  370. package/packages/policies/dist/usage.js.map +1 -0
  371. package/packages/policies/dist/workerHost.d.ts +8 -0
  372. package/packages/policies/dist/workerHost.d.ts.map +1 -0
  373. package/packages/policies/dist/workerHost.js +20 -0
  374. package/packages/policies/dist/workerHost.js.map +1 -0
  375. package/packages/policies/package.json +21 -0
  376. package/packages/presenter/dist/index.d.ts +81 -0
  377. package/packages/presenter/dist/index.d.ts.map +1 -0
  378. package/packages/presenter/dist/index.js +421 -0
  379. package/packages/presenter/dist/index.js.map +1 -0
  380. package/packages/presenter/package.json +16 -0
  381. package/packages/projections/dist/index.d.ts +10 -0
  382. package/packages/projections/dist/index.d.ts.map +1 -0
  383. package/packages/projections/dist/index.js +30 -0
  384. package/packages/projections/dist/index.js.map +1 -0
  385. package/packages/projections/package.json +15 -0
  386. package/packages/prompt/dist/index.d.ts +9 -0
  387. package/packages/prompt/dist/index.d.ts.map +1 -0
  388. package/packages/prompt/dist/index.js +71 -0
  389. package/packages/prompt/dist/index.js.map +1 -0
  390. package/packages/prompt/package.json +16 -0
  391. package/packages/retry-scheduler/dist/index.d.ts +12 -0
  392. package/packages/retry-scheduler/dist/index.d.ts.map +1 -0
  393. package/packages/retry-scheduler/dist/index.js +39 -0
  394. package/packages/retry-scheduler/dist/index.js.map +1 -0
  395. package/packages/retry-scheduler/package.json +15 -0
  396. package/packages/runtime/dist/index.d.ts +157 -0
  397. package/packages/runtime/dist/index.d.ts.map +1 -0
  398. package/packages/runtime/dist/index.js +1074 -0
  399. package/packages/runtime/dist/index.js.map +1 -0
  400. package/packages/runtime/package.json +26 -0
  401. package/packages/runtime-events/dist/index.d.ts +110 -0
  402. package/packages/runtime-events/dist/index.d.ts.map +1 -0
  403. package/packages/runtime-events/dist/index.js +25 -0
  404. package/packages/runtime-events/dist/index.js.map +1 -0
  405. package/packages/runtime-events/package.json +14 -0
  406. package/packages/server/dist/index.d.ts +25 -0
  407. package/packages/server/dist/index.d.ts.map +1 -0
  408. package/packages/server/dist/index.js +213 -0
  409. package/packages/server/dist/index.js.map +1 -0
  410. package/packages/server/dist/issue-store.d.ts +26 -0
  411. package/packages/server/dist/issue-store.d.ts.map +1 -0
  412. package/packages/server/dist/issue-store.js +88 -0
  413. package/packages/server/dist/issue-store.js.map +1 -0
  414. package/packages/server/dist/path-params.d.ts +6 -0
  415. package/packages/server/dist/path-params.d.ts.map +1 -0
  416. package/packages/server/dist/path-params.js +15 -0
  417. package/packages/server/dist/path-params.js.map +1 -0
  418. package/packages/server/dist/source.d.ts +12 -0
  419. package/packages/server/dist/source.d.ts.map +1 -0
  420. package/packages/server/dist/source.js +2 -0
  421. package/packages/server/dist/source.js.map +1 -0
  422. package/packages/server/dist/trace-routes.d.ts +21 -0
  423. package/packages/server/dist/trace-routes.d.ts.map +1 -0
  424. package/packages/server/dist/trace-routes.js +66 -0
  425. package/packages/server/dist/trace-routes.js.map +1 -0
  426. package/packages/server/dist/ws.d.ts +18 -0
  427. package/packages/server/dist/ws.d.ts.map +1 -0
  428. package/packages/server/dist/ws.js +168 -0
  429. package/packages/server/dist/ws.js.map +1 -0
  430. package/packages/server/package.json +22 -0
  431. package/packages/ssh/dist/index.d.ts +33 -0
  432. package/packages/ssh/dist/index.d.ts.map +1 -0
  433. package/packages/ssh/dist/index.js +281 -0
  434. package/packages/ssh/dist/index.js.map +1 -0
  435. package/packages/ssh/package.json +15 -0
  436. package/packages/static-worker/dist/index.d.ts +73 -0
  437. package/packages/static-worker/dist/index.d.ts.map +1 -0
  438. package/packages/static-worker/dist/index.js +150 -0
  439. package/packages/static-worker/dist/index.js.map +1 -0
  440. package/packages/static-worker/package.json +14 -0
  441. package/packages/tool-sdk/dist/filter.d.ts +70 -0
  442. package/packages/tool-sdk/dist/filter.d.ts.map +1 -0
  443. package/packages/tool-sdk/dist/filter.js +231 -0
  444. package/packages/tool-sdk/dist/filter.js.map +1 -0
  445. package/packages/tool-sdk/dist/index.d.ts +6 -0
  446. package/packages/tool-sdk/dist/index.d.ts.map +1 -0
  447. package/packages/tool-sdk/dist/index.js +4 -0
  448. package/packages/tool-sdk/dist/index.js.map +1 -0
  449. package/packages/tool-sdk/dist/provider.d.ts +51 -0
  450. package/packages/tool-sdk/dist/provider.d.ts.map +1 -0
  451. package/packages/tool-sdk/dist/provider.js +2 -0
  452. package/packages/tool-sdk/dist/provider.js.map +1 -0
  453. package/packages/tool-sdk/dist/registry.d.ts +35 -0
  454. package/packages/tool-sdk/dist/registry.d.ts.map +1 -0
  455. package/packages/tool-sdk/dist/registry.js +85 -0
  456. package/packages/tool-sdk/dist/registry.js.map +1 -0
  457. package/packages/tool-sdk/dist/result.d.ts +5 -0
  458. package/packages/tool-sdk/dist/result.d.ts.map +1 -0
  459. package/packages/tool-sdk/dist/result.js +15 -0
  460. package/packages/tool-sdk/dist/result.js.map +1 -0
  461. package/packages/tool-sdk/package.json +14 -0
  462. package/packages/traceviz-emitter/dist/index.d.ts +19 -0
  463. package/packages/traceviz-emitter/dist/index.d.ts.map +1 -0
  464. package/packages/traceviz-emitter/dist/index.js +97 -0
  465. package/packages/traceviz-emitter/dist/index.js.map +1 -0
  466. package/packages/traceviz-emitter/package.json +17 -0
  467. package/packages/traceviz-server/dist/index.d.ts +14 -0
  468. package/packages/traceviz-server/dist/index.d.ts.map +1 -0
  469. package/packages/traceviz-server/dist/index.js +10 -0
  470. package/packages/traceviz-server/dist/index.js.map +1 -0
  471. package/packages/traceviz-server/dist/models/api.d.ts +51 -0
  472. package/packages/traceviz-server/dist/models/api.d.ts.map +1 -0
  473. package/packages/traceviz-server/dist/models/api.js +5 -0
  474. package/packages/traceviz-server/dist/models/api.js.map +1 -0
  475. package/packages/traceviz-server/dist/models/display-events.d.ts +58 -0
  476. package/packages/traceviz-server/dist/models/display-events.d.ts.map +1 -0
  477. package/packages/traceviz-server/dist/models/display-events.js +6 -0
  478. package/packages/traceviz-server/dist/models/display-events.js.map +1 -0
  479. package/packages/traceviz-server/dist/parser.d.ts +14 -0
  480. package/packages/traceviz-server/dist/parser.d.ts.map +1 -0
  481. package/packages/traceviz-server/dist/parser.js +363 -0
  482. package/packages/traceviz-server/dist/parser.js.map +1 -0
  483. package/packages/traceviz-server/dist/stats.d.ts +7 -0
  484. package/packages/traceviz-server/dist/stats.d.ts.map +1 -0
  485. package/packages/traceviz-server/dist/stats.js +81 -0
  486. package/packages/traceviz-server/dist/stats.js.map +1 -0
  487. package/packages/traceviz-server/dist/watcher.d.ts +54 -0
  488. package/packages/traceviz-server/dist/watcher.d.ts.map +1 -0
  489. package/packages/traceviz-server/dist/watcher.js +368 -0
  490. package/packages/traceviz-server/dist/watcher.js.map +1 -0
  491. package/packages/traceviz-server/package.json +16 -0
  492. package/packages/tracker-sdk/dist/index.d.ts +5 -0
  493. package/packages/tracker-sdk/dist/index.d.ts.map +1 -0
  494. package/packages/tracker-sdk/dist/index.js +4 -0
  495. package/packages/tracker-sdk/dist/index.js.map +1 -0
  496. package/packages/tracker-sdk/dist/options.d.ts +20 -0
  497. package/packages/tracker-sdk/dist/options.d.ts.map +1 -0
  498. package/packages/tracker-sdk/dist/options.js +46 -0
  499. package/packages/tracker-sdk/dist/options.js.map +1 -0
  500. package/packages/tracker-sdk/dist/provider.d.ts +104 -0
  501. package/packages/tracker-sdk/dist/provider.d.ts.map +1 -0
  502. package/packages/tracker-sdk/dist/provider.js +2 -0
  503. package/packages/tracker-sdk/dist/provider.js.map +1 -0
  504. package/packages/tracker-sdk/dist/registry.d.ts +26 -0
  505. package/packages/tracker-sdk/dist/registry.d.ts.map +1 -0
  506. package/packages/tracker-sdk/dist/registry.js +52 -0
  507. package/packages/tracker-sdk/dist/registry.js.map +1 -0
  508. package/packages/tracker-sdk/dist/toolPack.d.ts +10 -0
  509. package/packages/tracker-sdk/dist/toolPack.d.ts.map +1 -0
  510. package/packages/tracker-sdk/dist/toolPack.js +185 -0
  511. package/packages/tracker-sdk/dist/toolPack.js.map +1 -0
  512. package/packages/tracker-sdk/package.json +15 -0
  513. package/packages/tui/dist/index.d.ts +35 -0
  514. package/packages/tui/dist/index.d.ts.map +1 -0
  515. package/packages/tui/dist/index.js +354 -0
  516. package/packages/tui/dist/index.js.map +1 -0
  517. package/packages/tui/package.json +18 -0
  518. package/packages/worker-host-pool/dist/index.d.ts +33 -0
  519. package/packages/worker-host-pool/dist/index.d.ts.map +1 -0
  520. package/packages/worker-host-pool/dist/index.js +311 -0
  521. package/packages/worker-host-pool/dist/index.js.map +1 -0
  522. package/packages/worker-host-pool/package.json +14 -0
  523. package/packages/worker-pool/dist/index.d.ts +6 -0
  524. package/packages/worker-pool/dist/index.d.ts.map +1 -0
  525. package/packages/worker-pool/dist/index.js +15 -0
  526. package/packages/worker-pool/dist/index.js.map +1 -0
  527. package/packages/worker-pool/dist/lease.d.ts +36 -0
  528. package/packages/worker-pool/dist/lease.d.ts.map +1 -0
  529. package/packages/worker-pool/dist/lease.js +53 -0
  530. package/packages/worker-pool/dist/lease.js.map +1 -0
  531. package/packages/worker-pool/dist/ledger.d.ts +51 -0
  532. package/packages/worker-pool/dist/ledger.d.ts.map +1 -0
  533. package/packages/worker-pool/dist/ledger.js +165 -0
  534. package/packages/worker-pool/dist/ledger.js.map +1 -0
  535. package/packages/worker-pool/dist/mutex.d.ts +10 -0
  536. package/packages/worker-pool/dist/mutex.d.ts.map +1 -0
  537. package/packages/worker-pool/dist/mutex.js +22 -0
  538. package/packages/worker-pool/dist/mutex.js.map +1 -0
  539. package/packages/worker-pool/dist/pool.d.ts +33 -0
  540. package/packages/worker-pool/dist/pool.d.ts.map +1 -0
  541. package/packages/worker-pool/dist/pool.js +1727 -0
  542. package/packages/worker-pool/dist/pool.js.map +1 -0
  543. package/packages/worker-pool/dist/reaper.d.ts +94 -0
  544. package/packages/worker-pool/dist/reaper.d.ts.map +1 -0
  545. package/packages/worker-pool/dist/reaper.js +295 -0
  546. package/packages/worker-pool/dist/reaper.js.map +1 -0
  547. package/packages/worker-pool/dist/types.d.ts +249 -0
  548. package/packages/worker-pool/dist/types.d.ts.map +1 -0
  549. package/packages/worker-pool/dist/types.js +2 -0
  550. package/packages/worker-pool/dist/types.js.map +1 -0
  551. package/packages/worker-pool/package.json +16 -0
  552. package/packages/worker-sdk/dist/conformance.d.ts +64 -0
  553. package/packages/worker-sdk/dist/conformance.d.ts.map +1 -0
  554. package/packages/worker-sdk/dist/conformance.js +109 -0
  555. package/packages/worker-sdk/dist/conformance.js.map +1 -0
  556. package/packages/worker-sdk/dist/fake.d.ts +76 -0
  557. package/packages/worker-sdk/dist/fake.d.ts.map +1 -0
  558. package/packages/worker-sdk/dist/fake.js +142 -0
  559. package/packages/worker-sdk/dist/fake.js.map +1 -0
  560. package/packages/worker-sdk/dist/index.d.ts +5 -0
  561. package/packages/worker-sdk/dist/index.d.ts.map +1 -0
  562. package/packages/worker-sdk/dist/index.js +10 -0
  563. package/packages/worker-sdk/dist/index.js.map +1 -0
  564. package/packages/worker-sdk/dist/module.d.ts +46 -0
  565. package/packages/worker-sdk/dist/module.d.ts.map +1 -0
  566. package/packages/worker-sdk/dist/module.js +59 -0
  567. package/packages/worker-sdk/dist/module.js.map +1 -0
  568. package/packages/worker-sdk/dist/registry.d.ts +24 -0
  569. package/packages/worker-sdk/dist/registry.d.ts.map +1 -0
  570. package/packages/worker-sdk/dist/registry.js +49 -0
  571. package/packages/worker-sdk/dist/registry.js.map +1 -0
  572. package/packages/worker-sdk/dist/types.d.ts +138 -0
  573. package/packages/worker-sdk/dist/types.d.ts.map +1 -0
  574. package/packages/worker-sdk/dist/types.js +21 -0
  575. package/packages/worker-sdk/dist/types.js.map +1 -0
  576. package/packages/worker-sdk/package.json +15 -0
  577. package/packages/workflow/dist/index.d.ts +33 -0
  578. package/packages/workflow/dist/index.d.ts.map +1 -0
  579. package/packages/workflow/dist/index.js +125 -0
  580. package/packages/workflow/dist/index.js.map +1 -0
  581. package/packages/workflow/package.json +19 -0
  582. package/packages/workspace/dist/index.d.ts +70 -0
  583. package/packages/workspace/dist/index.d.ts.map +1 -0
  584. package/packages/workspace/dist/index.js +1016 -0
  585. package/packages/workspace/dist/index.js.map +1 -0
  586. package/packages/workspace/package.json +17 -0
  587. package/runtime-deps/anthropic-claude-agent-sdk/LICENSE.md +1 -0
  588. package/runtime-deps/anthropic-claude-agent-sdk/README.md +65 -0
  589. package/runtime-deps/anthropic-claude-agent-sdk/agentSdkTypes.d.ts +1 -0
  590. package/runtime-deps/anthropic-claude-agent-sdk/assistant.d.ts +135 -0
  591. package/runtime-deps/anthropic-claude-agent-sdk/assistant.mjs +190 -0
  592. package/runtime-deps/anthropic-claude-agent-sdk/bridge.d.ts +231 -0
  593. package/runtime-deps/anthropic-claude-agent-sdk/bridge.mjs +168 -0
  594. package/runtime-deps/anthropic-claude-agent-sdk/browser-sdk.d.ts +53 -0
  595. package/runtime-deps/anthropic-claude-agent-sdk/browser-sdk.js +93 -0
  596. package/runtime-deps/anthropic-claude-agent-sdk/extractFromBunfs.d.ts +1 -0
  597. package/runtime-deps/anthropic-claude-agent-sdk/extractFromBunfs.js +156 -0
  598. package/runtime-deps/anthropic-claude-agent-sdk/manifest.json +47 -0
  599. package/runtime-deps/anthropic-claude-agent-sdk/manifest.zst.json +55 -0
  600. package/runtime-deps/anthropic-claude-agent-sdk/node_modules/.bin/anthropic-ai-sdk +21 -0
  601. package/runtime-deps/anthropic-claude-agent-sdk/package.json +81 -0
  602. package/runtime-deps/anthropic-claude-agent-sdk/sdk-tools.d.ts +3170 -0
  603. package/runtime-deps/anthropic-claude-agent-sdk/sdk.d.ts +6000 -0
  604. package/runtime-deps/anthropic-claude-agent-sdk/sdk.mjs +119 -0
  605. package/runtime-deps/openai-codex/README.md +60 -0
  606. package/runtime-deps/openai-codex/bin/codex.js +229 -0
  607. package/runtime-deps/openai-codex/bin/rg +79 -0
  608. package/runtime-deps/openai-codex/package.json +22 -0
  609. package/vendor/claude-agent-acp/dist/acp-agent.d.ts +239 -0
  610. package/vendor/claude-agent-acp/dist/acp-agent.d.ts.map +1 -0
  611. package/vendor/claude-agent-acp/dist/acp-agent.js +2693 -0
  612. package/vendor/claude-agent-acp/dist/bundle.js +41230 -0
  613. package/vendor/claude-agent-acp/dist/index.d.ts +3 -0
  614. package/vendor/claude-agent-acp/dist/index.d.ts.map +1 -0
  615. package/vendor/claude-agent-acp/dist/index.js +67 -0
  616. package/vendor/claude-agent-acp/dist/lib.d.ts +6 -0
  617. package/vendor/claude-agent-acp/dist/lib.d.ts.map +1 -0
  618. package/vendor/claude-agent-acp/dist/lib.js +5 -0
  619. package/vendor/claude-agent-acp/dist/settings.d.ts +68 -0
  620. package/vendor/claude-agent-acp/dist/settings.d.ts.map +1 -0
  621. package/vendor/claude-agent-acp/dist/settings.js +182 -0
  622. package/vendor/claude-agent-acp/dist/tools.d.ts +103 -0
  623. package/vendor/claude-agent-acp/dist/tools.d.ts.map +1 -0
  624. package/vendor/claude-agent-acp/dist/tools.js +713 -0
  625. package/vendor/claude-agent-acp/dist/utils.d.ts +16 -0
  626. package/vendor/claude-agent-acp/dist/utils.d.ts.map +1 -0
  627. package/vendor/claude-agent-acp/dist/utils.js +83 -0
  628. package/vendor/claude-agent-acp/package.json +23 -0
  629. package/vendor/codex-acp/dist/index.js +21280 -0
  630. package/vendor/codex-acp/package.json +17 -0
@@ -0,0 +1,701 @@
1
+ import fs from "node:fs/promises";
2
+ import { createRequire } from "node:module";
3
+ import path from "node:path";
4
+ import { execFileSync } from "node:child_process";
5
+ import { Readable, Writable } from "node:stream";
6
+ import { ClientSideConnection, PROTOCOL_VERSION, ndJsonStream, } from "@agentclientprotocol/sdk";
7
+ import { acquireAgentMcpEndpoint, } from "@lorenz/mcp";
8
+ import { actionForStopReason } from "@lorenz/policies/stopReason";
9
+ import { shellEscape, startSshProcess } from "@lorenz/ssh";
10
+ import { workerHostPool } from "@lorenz/worker-host-pool";
11
+ import { validateWorkspaceCwd } from "@lorenz/workspace";
12
+ import { execa } from "execa";
13
+ import { errorMessage, } from "@lorenz/domain";
14
+ import { stopChild, withTimeout } from "./childProcess.js";
15
+ import { acpAgentOptions, isClaudeCompatibleBridgeCommand, parseAcpAgentOptions, } from "./options.js";
16
+ export { acpAgentOptions, AGENT_USAGE_ACCOUNTING_VALUES, isClaudeCompatibleBridgeCommand, } from "./options.js";
17
+ /** The SSH worker-host pool provisions the reverse tunnels behind remote MCP endpoints. */
18
+ const mcpTunnelTransport = workerHostPool;
19
+ /**
20
+ * The ACP executor: drives an external bridge subprocess (e.g. `codex-acp`,
21
+ * `claude-agent-acp`) over the Agent Client Protocol, locally or via SSH.
22
+ */
23
+ /** Fold the legacy `command` spelling into `bridgeCommand`; the canonical key wins. */
24
+ function normalizeLegacyCommand(options) {
25
+ if (!("command" in options))
26
+ return options;
27
+ const { command, ...rest } = options;
28
+ return { bridgeCommand: rest.bridgeCommand ?? command, ...rest };
29
+ }
30
+ export const acpExecutorProvider = {
31
+ executor: "acp",
32
+ // `command` is the legacy spelling of `bridge_command`; it is listed first so the
33
+ // canonical key wins when a record configures both.
34
+ configAliases: {
35
+ bridge_command: "bridgeCommand",
36
+ usage_accounting: "usageAccounting",
37
+ provider_config: "providerConfig",
38
+ strict_mcp_config: "strictMcpConfig",
39
+ },
40
+ parseOptions: (options) => parseAcpAgentOptions(normalizeLegacyCommand(options)),
41
+ validateAgent(kind, config) {
42
+ if (!acpAgentOptions(config).bridgeCommand.trim()) {
43
+ throw new Error(kind === "claude"
44
+ ? "claude.command is required"
45
+ : `agents.${kind}.bridgeCommand is required`);
46
+ }
47
+ },
48
+ createExecutor: (kind) => new Executor(kind),
49
+ skillsDir(kind, config) {
50
+ // Claude reads skills from `.claude/skills`; Codex and other bridges from `.codex/skills`.
51
+ const isClaudeBridge = kind === "claude" || isClaudeCompatibleBridgeCommand(acpAgentOptions(config).bridgeCommand);
52
+ return isClaudeBridge ? ".claude/skills" : ".codex/skills";
53
+ },
54
+ };
55
+ export class Executor {
56
+ kind;
57
+ constructor(kind = "acp") {
58
+ this.kind = kind;
59
+ }
60
+ async startSession(input) {
61
+ const workspace = await validateWorkspaceCwd(input.settings, input.workspace, input.workerHost ?? null);
62
+ const agentKind = input.settings.agent.kind;
63
+ const agentConfig = resolveAgentConfig(input.settings, agentKind);
64
+ // The coordinator owns the lease ONLY when one was threaded in; otherwise acp
65
+ // owns the endpoint it acquires below and must release it on stop.
66
+ const threadedEndpoint = input.mcpEndpoint ?? null;
67
+ const ownsMcpEndpoint = threadedEndpoint === null;
68
+ const acpOptions = acpAgentOptions(agentConfig);
69
+ let mcpEndpoint = null;
70
+ let child = null;
71
+ let session = null;
72
+ try {
73
+ mcpEndpoint =
74
+ threadedEndpoint ??
75
+ (await acquireAgentMcpEndpoint(input.settings, input.workerHost ?? null, mcpTunnelTransport));
76
+ child = startBridgeProcess(acpOptions.bridgeCommand, workspace, input.workerHost ?? null);
77
+ const client = acpClient({
78
+ workspace,
79
+ workerHost: input.workerHost ?? null,
80
+ currentSession: () => session,
81
+ emit: (update) => this.emit(session, update),
82
+ });
83
+ const stream = ndJsonStream(Writable.toWeb(child.stdin), Readable.toWeb(child.stdout));
84
+ const connection = new ClientSideConnection((_agent) => client, stream);
85
+ const executorPid = child.pid === undefined ? null : String(child.pid);
86
+ const init = await withTimeout(connection.initialize({
87
+ protocolVersion: PROTOCOL_VERSION,
88
+ clientCapabilities: clientCapabilities(input.workerHost ?? null),
89
+ }), 30_000, "acp initialize timed out");
90
+ const nextSession = {
91
+ agentKind,
92
+ connection,
93
+ process: child,
94
+ settings: input.settings,
95
+ workspace,
96
+ agentConfig,
97
+ acpOptions,
98
+ init,
99
+ mcpEndpoint,
100
+ ownsMcpEndpoint,
101
+ workerHost: input.workerHost ?? null,
102
+ sessionId: null,
103
+ executorPid,
104
+ onUpdate: input.onUpdate,
105
+ usageTotals: emptyUsageTotals(),
106
+ sawCallUsageThisTurn: false,
107
+ turnStartTotals: emptyUsageTotals(),
108
+ lastCallUsageSeq: 0,
109
+ stop: async () => {
110
+ await this.stopSession(nextSession);
111
+ },
112
+ };
113
+ session = nextSession;
114
+ wireProcessEvents(session);
115
+ const sessionId = await openSession(session, [mcpEndpoint.acpServer()]);
116
+ session.sessionId = sessionId;
117
+ this.emit(session, {
118
+ type: "session_started",
119
+ message: `session started (${sessionId})`,
120
+ sessionId,
121
+ executorPid,
122
+ timestamp: new Date(),
123
+ });
124
+ return session;
125
+ }
126
+ catch (error) {
127
+ if (session)
128
+ await this.stopSession(session);
129
+ else {
130
+ if (child)
131
+ await stopChild(child);
132
+ // Only release the endpoint acp OWNS. A threaded lease belongs to the
133
+ // coordinator's slot.release, so acp must never release it (even on a
134
+ // startup error) or it would double-close the token+local-server+tunnel.
135
+ if (ownsMcpEndpoint)
136
+ await mcpEndpoint?.release();
137
+ }
138
+ throw error;
139
+ }
140
+ }
141
+ async runTurn(session, prompt, _issue) {
142
+ if (session.pendingTurn)
143
+ throw new Error("ACP turn already running");
144
+ const previous = session.onUpdate;
145
+ const updates = [];
146
+ let settled = false;
147
+ return new Promise((resolve, reject) => {
148
+ const cancelTurn = () => {
149
+ void session.connection.cancel({ sessionId: requireSessionId(session) }).catch((err) => {
150
+ process.stderr.write(`session cancel failed: ${err}\n`);
151
+ });
152
+ finishReject(new Error("acp turn timed out"));
153
+ };
154
+ let stallTimer;
155
+ const resetStallTimer = () => {
156
+ if (session.agentConfig.stallTimeoutMs <= 0)
157
+ return;
158
+ if (stallTimer)
159
+ clearTimeout(stallTimer);
160
+ stallTimer = setTimeout(cancelTurn, session.agentConfig.stallTimeoutMs);
161
+ };
162
+ const hardTimer = setTimeout(cancelTurn, session.agentConfig.turnTimeoutMs);
163
+ const cleanup = () => {
164
+ clearTimeout(hardTimer);
165
+ if (stallTimer)
166
+ clearTimeout(stallTimer);
167
+ session.onUpdate = previous;
168
+ session.pendingTurn = undefined;
169
+ };
170
+ const finishResolve = (value) => {
171
+ if (settled)
172
+ return;
173
+ settled = true;
174
+ cleanup();
175
+ resolve(value);
176
+ };
177
+ const finishReject = (error) => {
178
+ if (settled)
179
+ return;
180
+ settled = true;
181
+ cleanup();
182
+ reject(error);
183
+ };
184
+ resetStallTimer();
185
+ session.sawCallUsageThisTurn = false;
186
+ session.turnStartTotals = { ...session.usageTotals };
187
+ session.pendingTurn = { reject: finishReject, allowSessionIdRotation: true };
188
+ session.onUpdate = (update) => {
189
+ resetStallTimer();
190
+ updates.push(update);
191
+ previous?.(update);
192
+ };
193
+ const sessionId = requireSessionId(session);
194
+ this.emit(session, {
195
+ type: "turn_started",
196
+ sessionId,
197
+ message: { prompt: [{ type: "text", text: prompt }] },
198
+ timestamp: new Date(),
199
+ });
200
+ session.connection
201
+ .prompt({
202
+ sessionId,
203
+ prompt: [{ type: "text", text: prompt }],
204
+ })
205
+ .then((response) => {
206
+ if (settled)
207
+ return;
208
+ const usage = finalizeTurnUsage(session, extractUsage(response.usage ?? undefined));
209
+ const action = actionForStopReason(response.stopReason);
210
+ const terminalType = action === "continue"
211
+ ? "turn_completed"
212
+ : action === "cancel"
213
+ ? "turn_cancelled"
214
+ : "turn_failed";
215
+ const base = {
216
+ sessionUpdate: acpProtocolUpdate(session, terminalType, { response }),
217
+ sessionId: session.sessionId,
218
+ executorPid: session.executorPid,
219
+ message: { response },
220
+ timestamp: new Date(),
221
+ ...(usage && { usage, usageKind: "cumulative" }),
222
+ };
223
+ if (action === "continue") {
224
+ this.emit(session, { ...base, type: "turn_completed" });
225
+ finishResolve([...updates]);
226
+ }
227
+ else if (action === "cancel") {
228
+ this.emit(session, { ...base, type: "turn_cancelled" });
229
+ finishReject(new Error("acp_turn_cancelled"));
230
+ }
231
+ else {
232
+ this.emit(session, { ...base, type: "turn_failed" });
233
+ finishReject(new Error(`acp_turn_failed: ${response.stopReason}`));
234
+ }
235
+ })
236
+ .catch((error) => {
237
+ if (settled)
238
+ return;
239
+ const message = errorMessage(error);
240
+ this.emit(session, {
241
+ type: "turn_failed",
242
+ sessionId,
243
+ message,
244
+ timestamp: new Date(),
245
+ });
246
+ finishReject(error instanceof Error ? error : new Error(message));
247
+ });
248
+ });
249
+ }
250
+ emit(session, update) {
251
+ session?.onUpdate?.(update);
252
+ }
253
+ async stopSession(session) {
254
+ const sessionId = session.sessionId;
255
+ session.pendingTurn?.reject(new Error("acp session stopped"));
256
+ try {
257
+ if (sessionId && supportsClose(session.init)) {
258
+ await withTimeout(session.connection.closeSession({ sessionId }), 5_000, "acp close timed out");
259
+ }
260
+ }
261
+ catch {
262
+ // Closing is best effort because the bridge may already be gone.
263
+ }
264
+ finally {
265
+ await stopChild(session.process);
266
+ // Release ONLY the endpoint acp owns. When the coordinator threaded a
267
+ // per-run lease in (`ownsMcpEndpoint === false`) the slot.release closes it,
268
+ // so acp skips its own release to avoid a double-close of the shared
269
+ // token+local-server+tunnel.
270
+ if (session.ownsMcpEndpoint)
271
+ await session.mcpEndpoint.release();
272
+ }
273
+ }
274
+ }
275
+ function handleSessionUpdate(session, notification) {
276
+ const canAcceptRotation = session.pendingTurn?.allowSessionIdRotation === true && Boolean(session.sessionId);
277
+ if (session.sessionId && notification.sessionId !== session.sessionId && !canAcceptRotation) {
278
+ session.onUpdate?.({
279
+ type: "malformed",
280
+ sessionUpdate: acpProtocolUpdate(session, "malformed", notification),
281
+ sessionId: session.sessionId,
282
+ executorPid: session.executorPid,
283
+ message: `acp_session_update_mismatch: active session ${session.sessionId}, notification session ${notification.sessionId}`,
284
+ timestamp: new Date(),
285
+ });
286
+ return;
287
+ }
288
+ if (session.pendingTurn)
289
+ session.pendingTurn.allowSessionIdRotation = false;
290
+ session.sessionId = notification.sessionId;
291
+ const usage = consumeCallUsage(session, notification);
292
+ session.onUpdate?.({
293
+ type: "session_notification",
294
+ sessionUpdate: acpProtocolUpdate(session, "session_notification", notification),
295
+ sessionId: session.sessionId,
296
+ executorPid: session.executorPid,
297
+ message: notification,
298
+ timestamp: new Date(),
299
+ ...(usage && { usage, usageKind: "cumulative" }),
300
+ });
301
+ }
302
+ /**
303
+ * Patched bridges attach a per-model-call token bucket to usage_update
304
+ * notifications under _meta["symphony/callUsage"] (see ts/vendor/README.md).
305
+ * Buckets are deltas for exactly one call, so they accumulate additively
306
+ * regardless of the agent's turn-level usage accounting mode. Returns the
307
+ * running session totals when a new bucket was consumed.
308
+ */
309
+ function consumeCallUsage(session, notification) {
310
+ if (notification.update?.sessionUpdate !== "usage_update")
311
+ return undefined;
312
+ const meta = notification.update._meta;
313
+ if (!meta)
314
+ return undefined;
315
+ const rawCall = meta["symphony/callUsage"];
316
+ const call = parseUsageBucket(rawCall);
317
+ if (!call)
318
+ return undefined;
319
+ const seq = bucketSeq(rawCall);
320
+ if (seq !== null) {
321
+ if (seq <= session.lastCallUsageSeq)
322
+ return undefined;
323
+ session.lastCallUsageSeq = seq;
324
+ }
325
+ session.sawCallUsageThisTurn = true;
326
+ addUsageTotals(session, call);
327
+ const total = parseUsageBucket(meta["symphony/totalUsage"]);
328
+ if (total) {
329
+ // The bridge also reports its own cumulative counter; use it as a floor
330
+ // so missed bucket notifications cannot under-count the session. The
331
+ // baseline captures any spend already on the counter before the first
332
+ // observed call.
333
+ session.callUsageBaseline ??= subtractUsage(total, call);
334
+ maxUsageTotals(session, subtractUsage(total, session.callUsageBaseline));
335
+ }
336
+ return usageSnapshot(session);
337
+ }
338
+ /**
339
+ * Turn-end usage. The bridge's turn-level report is normalized to a
340
+ * session-cumulative value (a per-turn report is the turn's delta, so it is
341
+ * offset from the turn-start totals; a cumulative report already is one) and
342
+ * applied as a monotonic floor on the session totals. With per-call buckets
343
+ * this reconciles gaps without re-adding what the buckets already counted;
344
+ * without buckets it reproduces plain turn-level accounting.
345
+ */
346
+ function finalizeTurnUsage(session, reported) {
347
+ if (!reported)
348
+ return session.sawCallUsageThisTurn ? usageSnapshot(session) : undefined;
349
+ const reportedCumulative = session.acpOptions.usageAccounting === "cumulative"
350
+ ? reported
351
+ : addUsage(session.turnStartTotals, reported);
352
+ maxUsageTotals(session, reportedCumulative);
353
+ return usageSnapshot(session);
354
+ }
355
+ function parseUsageBucket(value) {
356
+ if (typeof value !== "object" || value === null)
357
+ return undefined;
358
+ const bucket = value;
359
+ const field = (key) => {
360
+ const raw = bucket[key];
361
+ return typeof raw === "number" ? nonNegativeFinite(raw) : 0;
362
+ };
363
+ const inputTokens = field("inputTokens") + field("cachedReadTokens") + field("cachedWriteTokens");
364
+ const outputTokens = field("outputTokens");
365
+ const rawTotal = bucket["totalTokens"];
366
+ const totalTokens = (typeof rawTotal === "number" ? nonNegativeUsageValue(rawTotal) : undefined) ??
367
+ inputTokens + outputTokens;
368
+ return { inputTokens, outputTokens, totalTokens };
369
+ }
370
+ function bucketSeq(value) {
371
+ if (typeof value !== "object" || value === null)
372
+ return null;
373
+ const seq = value["seq"];
374
+ return typeof seq === "number" && Number.isFinite(seq) ? seq : null;
375
+ }
376
+ function addUsageTotals(session, usage) {
377
+ session.usageTotals = {
378
+ inputTokens: session.usageTotals.inputTokens + (usage.inputTokens ?? 0),
379
+ outputTokens: session.usageTotals.outputTokens + (usage.outputTokens ?? 0),
380
+ totalTokens: session.usageTotals.totalTokens + (usage.totalTokens ?? 0),
381
+ secondsRunning: session.usageTotals.secondsRunning,
382
+ };
383
+ }
384
+ function maxUsageTotals(session, usage) {
385
+ session.usageTotals = {
386
+ inputTokens: Math.max(session.usageTotals.inputTokens, usage.inputTokens ?? 0),
387
+ outputTokens: Math.max(session.usageTotals.outputTokens, usage.outputTokens ?? 0),
388
+ totalTokens: Math.max(session.usageTotals.totalTokens, usage.totalTokens ?? 0),
389
+ secondsRunning: session.usageTotals.secondsRunning,
390
+ };
391
+ }
392
+ function addUsage(left, right) {
393
+ return {
394
+ inputTokens: (left.inputTokens ?? 0) + (right.inputTokens ?? 0),
395
+ outputTokens: (left.outputTokens ?? 0) + (right.outputTokens ?? 0),
396
+ totalTokens: (left.totalTokens ?? 0) + (right.totalTokens ?? 0),
397
+ };
398
+ }
399
+ function subtractUsage(left, right) {
400
+ return {
401
+ inputTokens: Math.max((left.inputTokens ?? 0) - (right.inputTokens ?? 0), 0),
402
+ outputTokens: Math.max((left.outputTokens ?? 0) - (right.outputTokens ?? 0), 0),
403
+ totalTokens: Math.max((left.totalTokens ?? 0) - (right.totalTokens ?? 0), 0),
404
+ };
405
+ }
406
+ function usageSnapshot(session) {
407
+ return {
408
+ inputTokens: session.usageTotals.inputTokens,
409
+ outputTokens: session.usageTotals.outputTokens,
410
+ totalTokens: session.usageTotals.totalTokens,
411
+ };
412
+ }
413
+ function handlePermissionRequest(session, request, emit) {
414
+ const selected = request.options.find((option) => option.kind.startsWith("allow")) ??
415
+ request.options.find((option) => option.optionId.toLowerCase().includes("allow")) ??
416
+ null;
417
+ if (selected) {
418
+ emit({
419
+ type: "approval_auto_approved",
420
+ sessionId: request.sessionId,
421
+ executorPid: session?.executorPid,
422
+ message: { request, selected },
423
+ timestamp: new Date(),
424
+ });
425
+ return { outcome: { outcome: "selected", optionId: selected.optionId } };
426
+ }
427
+ emit({
428
+ type: "approval_required",
429
+ sessionId: request.sessionId,
430
+ executorPid: session?.executorPid,
431
+ message: { request, selected },
432
+ timestamp: new Date(),
433
+ });
434
+ return { outcome: { outcome: "cancelled" } };
435
+ }
436
+ function acpClient(input) {
437
+ const executor = new ClientAdapter(input.workspace, input.workerHost, input.currentSession, input.emit);
438
+ return executor.client();
439
+ }
440
+ class ClientAdapter {
441
+ workspace;
442
+ workerHost;
443
+ currentSession;
444
+ emit;
445
+ constructor(workspace, workerHost, currentSession, emit) {
446
+ this.workspace = workspace;
447
+ this.workerHost = workerHost;
448
+ this.currentSession = currentSession;
449
+ this.emit = emit;
450
+ }
451
+ client() {
452
+ const client = {
453
+ sessionUpdate: async (params) => {
454
+ const session = this.currentSession();
455
+ if (!session)
456
+ return Promise.resolve();
457
+ handleSessionUpdate(session, params);
458
+ return Promise.resolve();
459
+ },
460
+ requestPermission: async (params) => {
461
+ const session = this.currentSession();
462
+ return Promise.resolve(handlePermissionRequest(session, params, this.emit));
463
+ },
464
+ };
465
+ if (!this.workerHost) {
466
+ client.readTextFile = async (params) => this.readTextFile(params);
467
+ client.writeTextFile = async (params) => this.writeTextFile(params);
468
+ }
469
+ return client;
470
+ }
471
+ async readTextFile(params) {
472
+ const filePath = this.workspacePath(params.path);
473
+ const text = await fs.readFile(filePath, "utf8");
474
+ if (!params.line && !params.limit)
475
+ return { content: text };
476
+ const lines = text.split(/\r?\n/);
477
+ const start = Math.max((params.line ?? 1) - 1, 0);
478
+ const end = params.limit ? start + params.limit : undefined;
479
+ return { content: lines.slice(start, end).join("\n") };
480
+ }
481
+ async writeTextFile(params) {
482
+ const filePath = this.workspacePath(params.path);
483
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
484
+ await fs.writeFile(filePath, params.content);
485
+ this.emit({
486
+ type: "fs_write",
487
+ sessionId: params.sessionId,
488
+ message: { path: params.path },
489
+ timestamp: new Date(),
490
+ });
491
+ return {};
492
+ }
493
+ workspacePath(rawPath) {
494
+ if (!path.isAbsolute(rawPath))
495
+ throw new Error("acp_fs_path_must_be_absolute");
496
+ const root = path.resolve(this.workspace);
497
+ const resolved = path.resolve(rawPath);
498
+ const relative = path.relative(root, resolved);
499
+ if (relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative))) {
500
+ return resolved;
501
+ }
502
+ throw new Error("acp_fs_path_outside_workspace");
503
+ }
504
+ }
505
+ async function openSession(session, mcpServers) {
506
+ const meta = providerConfigMeta(session);
507
+ const created = await withTimeout(session.connection.newSession({
508
+ cwd: session.workspace,
509
+ mcpServers,
510
+ ...(meta && { _meta: meta }),
511
+ }), 30_000, "acp new session timed out");
512
+ return created.sessionId;
513
+ }
514
+ /**
515
+ * Provider config rides the session request's _meta instead of config files
516
+ * written into the workspace. The vendored claude bridge consumes a
517
+ * settings.json-shaped overlay under symphony/settings; the vendored codex
518
+ * bridge consumes config.toml-shaped overrides under symphony/config (see
519
+ * ts/vendor/README.md). Bridges that don't know the keys ignore them.
520
+ */
521
+ function providerConfigMeta(session) {
522
+ const providerConfig = session.acpOptions.providerConfig;
523
+ if (!providerConfig)
524
+ return undefined;
525
+ const isClaudeBridge = session.agentKind === "claude" ||
526
+ isClaudeCompatibleBridgeCommand(session.acpOptions.bridgeCommand);
527
+ return { [isClaudeBridge ? "symphony/settings" : "symphony/config"]: providerConfig };
528
+ }
529
+ const VENDORED_BRIDGE_PACKAGES = {
530
+ "codex-acp": "@agentclientprotocol/codex-acp",
531
+ "claude-agent-acp": "@agentclientprotocol/claude-agent-acp",
532
+ };
533
+ function binTargetForManifest(manifest, bin) {
534
+ if (typeof manifest.bin === "string")
535
+ return manifest.bin;
536
+ return manifest.bin?.[bin] ?? "dist/index.js";
537
+ }
538
+ /**
539
+ * Resolve bare bridge names to the vendored workspace packages so local runs
540
+ * always use Symphony's patched bridges rather than whatever PATH provides.
541
+ * Remote hosts keep the configured command verbatim (the vendored install
542
+ * only exists locally), as do custom commands and explicit paths.
543
+ */
544
+ export function resolveBridgeCommand(bridgeCommand, workerHost) {
545
+ if (workerHost)
546
+ return bridgeCommand;
547
+ const [bin, ...args] = bridgeCommand.trim().split(/\s+/);
548
+ if (!bin)
549
+ return bridgeCommand;
550
+ const packageName = VENDORED_BRIDGE_PACKAGES[bin];
551
+ if (!packageName)
552
+ return bridgeCommand;
553
+ try {
554
+ const require = createRequire(import.meta.url);
555
+ const manifestPath = require.resolve(`${packageName}/package.json`);
556
+ const manifest = require(manifestPath);
557
+ const binPath = path.join(path.dirname(manifestPath), binTargetForManifest(manifest, bin));
558
+ return [shellEscape(process.execPath), shellEscape(binPath), ...args].join(" ");
559
+ }
560
+ catch {
561
+ return bridgeCommand;
562
+ }
563
+ }
564
+ // Packaged builds of the CLI do not bundle the claude/codex agent binaries, so the local bridge
565
+ // resolves them from the host. codex already falls back to `codex` on PATH, but claude needs an
566
+ // explicit path, so both are set for consistency. An explicit value in the environment always wins.
567
+ const HOST_AGENT_BINARIES = [
568
+ { env: "CLAUDE_CODE_EXECUTABLE", command: "claude" },
569
+ { env: "CODEX_PATH", command: "codex" },
570
+ ];
571
+ const hostBinaryPaths = new Map();
572
+ function lookupHostBinary(command) {
573
+ const cached = hostBinaryPaths.get(command);
574
+ if (cached !== undefined)
575
+ return cached;
576
+ let resolved;
577
+ try {
578
+ // A login shell matches the PATH the bridge itself sees when it is spawned under `bash -lc`.
579
+ resolved =
580
+ execFileSync("bash", ["-lc", `command -v ${command}`], { encoding: "utf8" }).trim() || null;
581
+ }
582
+ catch {
583
+ resolved = null;
584
+ }
585
+ hostBinaryPaths.set(command, resolved);
586
+ return resolved;
587
+ }
588
+ export function hostAgentBinaryEnv(currentEnv = process.env, lookup = lookupHostBinary) {
589
+ const env = {};
590
+ for (const { env: name, command } of HOST_AGENT_BINARIES) {
591
+ if (currentEnv[name])
592
+ continue;
593
+ const resolved = lookup(command);
594
+ if (resolved)
595
+ env[name] = resolved;
596
+ }
597
+ return env;
598
+ }
599
+ function startBridgeProcess(bridgeCommand, workspace, workerHost) {
600
+ const command = `exec ${resolveBridgeCommand(bridgeCommand, workerHost)}`;
601
+ if (workerHost) {
602
+ // Remote bridges resolve their own binaries on the worker host.
603
+ return startSshProcess(workerHost, `cd ${shellEscape(workspace)} && ${command}`);
604
+ }
605
+ return execa("bash", ["-lc", command], {
606
+ cwd: workspace,
607
+ stdin: "pipe",
608
+ stdout: "pipe",
609
+ stderr: "pipe",
610
+ reject: false,
611
+ env: hostAgentBinaryEnv(),
612
+ });
613
+ }
614
+ function wireProcessEvents(session) {
615
+ let stderr = "";
616
+ session.process.stderr.setEncoding("utf8");
617
+ session.process.stderr.on("data", (chunk) => {
618
+ stderr += chunk;
619
+ const lines = stderr.split(/\r?\n/);
620
+ stderr = lines.pop() ?? "";
621
+ for (const line of lines) {
622
+ session.onUpdate?.({ type: "stderr", message: line, timestamp: new Date() });
623
+ }
624
+ });
625
+ session.process.on("close", (code, signal) => {
626
+ if (stderr) {
627
+ session.onUpdate?.({ type: "stderr", message: stderr, timestamp: new Date() });
628
+ stderr = "";
629
+ }
630
+ const message = `acp bridge exited${code === null ? "" : ` with status ${code}`}${signal ? ` signal ${signal}` : ""}`;
631
+ session.onUpdate?.({ type: "process_exit", message, timestamp: new Date() });
632
+ session.pendingTurn?.reject(new Error(message));
633
+ });
634
+ }
635
+ function clientCapabilities(workerHost) {
636
+ const capabilities = {};
637
+ if (!workerHost) {
638
+ capabilities.fs = {
639
+ readTextFile: true,
640
+ writeTextFile: true,
641
+ };
642
+ }
643
+ return capabilities;
644
+ }
645
+ function acpProtocolUpdate(session, type, message) {
646
+ return {
647
+ kind: type,
648
+ sessionId: session.sessionId,
649
+ agentKind: session.agentKind,
650
+ message,
651
+ at: new Date(),
652
+ _meta: {
653
+ executorPid: session.executorPid,
654
+ },
655
+ };
656
+ }
657
+ function extractUsage(usage) {
658
+ if (!usage)
659
+ return undefined;
660
+ const inputTokens = nonNegativeFinite(usage.inputTokens) +
661
+ nonNegativeFinite(usage.cachedReadTokens) +
662
+ nonNegativeFinite(usage.cachedWriteTokens);
663
+ const outputTokens = nonNegativeFinite(usage.outputTokens);
664
+ const totalTokens = nonNegativeUsageValue(usage.totalTokens) ?? inputTokens + outputTokens;
665
+ return {
666
+ inputTokens,
667
+ outputTokens,
668
+ totalTokens,
669
+ };
670
+ }
671
+ function emptyUsageTotals() {
672
+ return {
673
+ inputTokens: 0,
674
+ outputTokens: 0,
675
+ totalTokens: 0,
676
+ secondsRunning: 0,
677
+ };
678
+ }
679
+ function nonNegativeFinite(value) {
680
+ return nonNegativeUsageValue(value) ?? 0;
681
+ }
682
+ function nonNegativeUsageValue(value) {
683
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : undefined;
684
+ }
685
+ function resolveAgentConfig(settings, kind) {
686
+ const agent = settings.agents[kind];
687
+ if (!agent)
688
+ throw new Error(`agents.${kind} is required`);
689
+ if (agent.executor !== "acp")
690
+ throw new Error(`agents.${kind}.executor must be acp`);
691
+ return agent;
692
+ }
693
+ function supportsClose(init) {
694
+ return Boolean(init.agentCapabilities?.sessionCapabilities?.close);
695
+ }
696
+ function requireSessionId(session) {
697
+ if (!session.sessionId)
698
+ throw new Error("acp session not started");
699
+ return session.sessionId;
700
+ }
701
+ //# sourceMappingURL=index.js.map