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,821 @@
1
+ import path from "node:path";
2
+ import { execaSync } from "execa";
3
+ import { z } from "zod";
4
+ import { errorMessage, isRecord as isPlainRecord, normalizeHttpBindHost, withDerivedMaxInFlight, } from "@lorenz/domain";
5
+ import { defaultAgentExecutorRegistry, } from "@lorenz/agent-sdk";
6
+ import { defaultTrackerRegistry } from "@lorenz/tracker-sdk";
7
+ import { hooksAliases, normalizeAliases } from "./aliases.js";
8
+ import { defaultAgentRecords, defaultSettings } from "./defaults.js";
9
+ import { configErrorMessage } from "./errors.js";
10
+ import { joinPath, nonEmptyString } from "./leaf-utils.js";
11
+ import { agentRecordOverrideSchema, agentRecordSchema, coercedNonNegativeTimeoutMs, coercedTimeoutMs, workflowConfigSchema, trackerRecordSchema, } from "./schemas.js";
12
+ export function parseConfig(raw = {}, env = {}, defaults = {}, registry = defaultTrackerRegistry, executors = defaultAgentExecutorRegistry) {
13
+ const settings = defaultSettings(defaults);
14
+ const parsed = parseWorkflowConfig(raw);
15
+ const trackerRaw = parsed.tracker ?? {};
16
+ settings.tracker = parseTracker(settings.tracker, trackerRaw, parsed.trackers ?? {}, env, registry);
17
+ settings.toolOptions = parseToolOptions(parsed.tools, env);
18
+ const pollingRaw = parsed.polling ?? {};
19
+ settings.polling.intervalMs = pollingRaw.intervalMs ?? settings.polling.intervalMs;
20
+ const workspaceRaw = parsed.workspace ?? {};
21
+ const workspaceRootFallback = settings.workspace.rootExpression ?? settings.workspace.root;
22
+ const workspaceRootExpression = resolveWorkspaceRootExpression(nonEmptyString(env.SYMPHONY_WORKSPACE_ROOT) ?? workspaceRaw.root, workspaceRootFallback, env);
23
+ settings.workspace.rootExpression = workspaceRootExpression;
24
+ settings.workspace.root = expandLocalPath(workspaceRootExpression, env);
25
+ settings.workspace.isolation = workspaceRaw.isolation ?? settings.workspace.isolation;
26
+ const workerRaw = parsed.worker ?? {};
27
+ if (workerRaw.kind !== undefined)
28
+ settings.worker.kind = workerRaw.kind;
29
+ settings.worker.sshHosts = workerRaw.sshHosts ?? settings.worker.sshHosts;
30
+ settings.worker.sshTimeoutMs = workerRaw.sshTimeoutMs ?? settings.worker.sshTimeoutMs;
31
+ if (workerRaw.maxConcurrentAgentsPerHost !== undefined) {
32
+ settings.worker.maxConcurrentAgentsPerHost = workerRaw.maxConcurrentAgentsPerHost;
33
+ }
34
+ if (workerRaw.kind !== undefined && settings.worker.sshHosts.length > 0) {
35
+ throw new Error("worker.kind cannot be combined with worker.ssh_hosts");
36
+ }
37
+ const workerPool = parseWorkerPool(workerRaw.workerPool, workerRaw, parsed.workers ?? {});
38
+ if (workerPool)
39
+ settings.worker.workerPool = workerPool;
40
+ if (workerPool?.enabled && settings.worker.sshHosts.length > 0) {
41
+ throw new Error("worker.worker_pool.enabled cannot be combined with worker.ssh_hosts");
42
+ }
43
+ settings.hooks = parseHooks(settings.hooks, parsed.hooks ?? {});
44
+ if (settings.workspace.isolation === "none")
45
+ assertNoWorkspaceHooks(settings.hooks);
46
+ settings.agent = parseAgentSettings(settings.agent, parsed.agent ?? {}, parseSkillSources(parsed.agent?.skills, env, defaults.configDir));
47
+ settings.agents = parseAgents(parsed.agents ?? {}, legacyAgentRecordOverrides(parsed.codex ?? {}, parsed.claude ?? {}), executors, env);
48
+ const observabilityRaw = parsed.observability ?? {};
49
+ settings.observability.dashboardEnabled =
50
+ observabilityRaw.dashboardEnabled ?? settings.observability.dashboardEnabled;
51
+ settings.observability.refreshMs = observabilityRaw.refreshMs ?? settings.observability.refreshMs;
52
+ settings.observability.renderIntervalMs =
53
+ observabilityRaw.renderIntervalMs ?? settings.observability.renderIntervalMs;
54
+ const serverRaw = parsed.server ?? {};
55
+ settings.server.host = normalizeHttpBindHost(serverRaw.host ?? settings.server.host);
56
+ if (serverRaw.port !== undefined)
57
+ settings.server.port = serverRaw.port;
58
+ if (serverRaw.traceDir !== undefined)
59
+ settings.server.traceDir = serverRaw.traceDir;
60
+ if (serverRaw.staticDir !== undefined)
61
+ settings.server.staticDir = serverRaw.staticDir;
62
+ const loggingRaw = parsed.logging ?? {};
63
+ if (loggingRaw.logFile !== undefined) {
64
+ settings.logging.logFile = expandLocalPath(loggingRaw.logFile, env);
65
+ }
66
+ settings.statusOverrides = parseStatusOverrides(parsed.statusOverrides ?? {}, settings.agents, executors, env);
67
+ return settings;
68
+ }
69
+ export function settingsForIssueState(settings, state) {
70
+ const override = settings.statusOverrides.get(normalizeStateName(state));
71
+ if (!override)
72
+ return cloneSettings(settings);
73
+ const merged = cloneSettings(settings);
74
+ if (override.agent)
75
+ merged.agent = { ...merged.agent, ...override.agent };
76
+ if (override.agents) {
77
+ for (const [kind, fragment] of Object.entries(override.agents)) {
78
+ const base = merged.agents[kind];
79
+ if (!base)
80
+ continue;
81
+ merged.agents[kind] = mergeAgentFragment(base, fragment);
82
+ }
83
+ }
84
+ return merged;
85
+ }
86
+ export function validateDispatchConfig(settings, trackers = defaultTrackerRegistry, executors = defaultAgentExecutorRegistry, tools) {
87
+ const provider = trackers.require(settings.tracker.kind);
88
+ provider.validateDispatch?.(settings);
89
+ if (tools && settings.toolOptions !== undefined) {
90
+ for (const [pack, options] of Object.entries(settings.toolOptions)) {
91
+ const provider = tools.require(pack);
92
+ if (provider.validateOptions === undefined) {
93
+ if (Object.keys(options).length > 0) {
94
+ throw new Error(`tools.${pack} is not supported by the "${pack}" pack`);
95
+ }
96
+ continue;
97
+ }
98
+ provider.validateOptions(options);
99
+ }
100
+ }
101
+ const requiredBackends = new Set([settings.agent.kind]);
102
+ for (const override of settings.statusOverrides.values()) {
103
+ if (override.agent?.kind)
104
+ requiredBackends.add(override.agent.kind);
105
+ }
106
+ for (const kind of requiredBackends) {
107
+ const agent = settings.agents[kind];
108
+ if (!agent)
109
+ throw new Error(`agents.${kind} is required`);
110
+ const executorProvider = executors.get(agent.executor);
111
+ if (!executorProvider) {
112
+ const known = executors.executors();
113
+ const hint = known.length > 0 ? ` (known executors: ${known.join(", ")})` : "";
114
+ throw new Error(`unsupported agents.${kind}.executor: ${agent.executor}${hint}`);
115
+ }
116
+ executorProvider.validateAgent?.(kind, agent, settings);
117
+ }
118
+ }
119
+ export function normalizeStateName(value) {
120
+ return value.trim().toLowerCase();
121
+ }
122
+ export function normalizeRouteName(value) {
123
+ if (value === undefined || value === null)
124
+ return "";
125
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
126
+ return String(value).trim().toLowerCase();
127
+ }
128
+ /** Shared tracker aliases; provider-specific aliases are declared by each tracker provider. */
129
+ const TRACKER_COMMON_ALIASES = {
130
+ api_key: "apiKey",
131
+ active_states: "activeStates",
132
+ terminal_states: "terminalStates",
133
+ };
134
+ const TRACKER_DISPATCH_ALIASES = {
135
+ accept_unrouted: "acceptUnrouted",
136
+ only_routes: "onlyRoutes",
137
+ route_label_prefix: "routeLabelPrefix",
138
+ };
139
+ /** Keys of a selected tracker config record owned by the core; everything else belongs to the provider. */
140
+ const TRACKER_COMMON_KEYS = new Set([
141
+ "kind",
142
+ "provider",
143
+ "endpoint",
144
+ "apiKey",
145
+ "assignee",
146
+ "activeStates",
147
+ "terminalStates",
148
+ "dispatch",
149
+ ]);
150
+ function parseTracker(defaults, trackerRaw, trackersRaw, env, registry) {
151
+ assertTrackerBundleNames(trackersRaw);
152
+ const selectorRecord = parseTrackerRecord(trackerRaw, "tracker");
153
+ const selectedBundleName = trackerKindValue(selectorRecord.kind) ?? defaults.kind;
154
+ const trackerRecord = selectedBundleName === undefined
155
+ ? legacyTrackerRecord(selectorRecord, selectedBundleName, trackersRaw)
156
+ : trackerRecordForSelection(selectorRecord, selectedBundleName, trackersRaw);
157
+ const kind = trackerRecord.kind;
158
+ // Unregistered kinds parse generically (options pass through unvalidated) and are
159
+ // rejected with the full list of known kinds by validateDispatchConfig.
160
+ const provider = registry.get(kind);
161
+ const apiKey = resolveConfiguredSecret(trackerRecord.apiKey, env, provider?.envFallbacks?.apiKey);
162
+ const assignee = resolveConfiguredSecret(trackerRecord.assignee, env, provider?.envFallbacks?.assignee);
163
+ const endpoint = trackerRecord.endpoint ?? provider?.defaultEndpoint ?? defaults.endpoint;
164
+ const providerRaw = {};
165
+ for (const [key, value] of Object.entries(trackerRecord)) {
166
+ if (!TRACKER_COMMON_KEYS.has(key))
167
+ providerRaw[key] = value;
168
+ }
169
+ const aliased = normalizeAliases(providerRaw, { ...(provider?.configAliases ?? {}) });
170
+ const options = provider?.parseOptions
171
+ ? provider.parseOptions(aliased, {
172
+ env,
173
+ resolveSecret: (value, fallbackEnvVar) => resolveConfiguredSecret(value, env, fallbackEnvVar),
174
+ })
175
+ : aliased;
176
+ return {
177
+ kind,
178
+ endpoint,
179
+ apiKey,
180
+ assignee,
181
+ activeStates: trackerRecord.activeStates ?? defaults.activeStates,
182
+ terminalStates: trackerRecord.terminalStates ?? defaults.terminalStates,
183
+ dispatch: parseDispatch(defaults.dispatch, trackerRecord.dispatch ?? {}),
184
+ options,
185
+ };
186
+ }
187
+ function legacyTrackerRecord(selectorRecord, selectedBundleName, trackersRaw) {
188
+ if (selectedBundleName !== undefined && Object.keys(trackersRaw).length > 0) {
189
+ throw new Error(`trackers.${selectedBundleName} is required by tracker.kind`);
190
+ }
191
+ return { ...selectorRecord, kind: selectedBundleName };
192
+ }
193
+ function trackerRecordForSelection(selectorRecord, selectedBundleName, trackersRaw) {
194
+ const selectedBundleRaw = trackersRaw[selectedBundleName];
195
+ return selectedBundleRaw === undefined
196
+ ? legacyTrackerRecord(selectorRecord, selectedBundleName, trackersRaw)
197
+ : bundledTrackerRecord(selectorRecord, selectedBundleRaw, selectedBundleName);
198
+ }
199
+ function bundledTrackerRecord(selectorRecord, selectedBundleRaw, selectedBundleName) {
200
+ const selectedBundle = parseTrackerRecord(selectedBundleRaw, `trackers.${selectedBundleName}`);
201
+ const provider = trackerKindValue(selectedBundle.provider);
202
+ if (provider === undefined) {
203
+ throw new Error(`trackers.${selectedBundleName}.provider is required`);
204
+ }
205
+ const { kind: _selectorKind, provider: _selectorProvider, ...selectorOptions } = selectorRecord;
206
+ const { kind: _bundleKind, provider: _bundleProvider, ...bundleOptions } = selectedBundle;
207
+ return { ...selectorOptions, ...bundleOptions, kind: provider };
208
+ }
209
+ function assertTrackerBundleNames(trackersRaw) {
210
+ for (const name of Object.keys(trackersRaw)) {
211
+ if (!name.trim())
212
+ throw new Error("trackers names must not be blank");
213
+ }
214
+ }
215
+ function parseTrackerRecord(raw, label) {
216
+ const normalized = normalizeAliases(raw, TRACKER_COMMON_ALIASES);
217
+ if (isPlainRecord(normalized.dispatch)) {
218
+ normalized.dispatch = normalizeAliases(normalized.dispatch, TRACKER_DISPATCH_ALIASES);
219
+ }
220
+ const result = trackerRecordSchema.safeParse(normalized);
221
+ if (result.success)
222
+ return result.data;
223
+ throw new Error(configErrorMessage(result.error, label));
224
+ }
225
+ function expandLocalPath(value, env) {
226
+ const expanded = expandPathVariables(value, env);
227
+ const home = nonEmptyString(env.HOME) ?? nonEmptyString(env.USERPROFILE);
228
+ if (home && expanded === "~")
229
+ return home;
230
+ if (home && expanded.startsWith("~/"))
231
+ return joinPath(home, expanded.slice(2));
232
+ return expanded;
233
+ }
234
+ function parseSkillSources(skills, env, configDir) {
235
+ const baseDir = configDir ?? process.cwd();
236
+ const seen = new Set();
237
+ const resolved = [];
238
+ for (const source of skills ?? []) {
239
+ const expanded = expandLocalPath(source, env);
240
+ if (!nonEmptyString(expanded))
241
+ throw new Error("agent.skills must not contain blank paths");
242
+ const absolute = path.isAbsolute(expanded)
243
+ ? path.normalize(expanded)
244
+ : path.resolve(baseDir, expanded);
245
+ if (seen.has(absolute))
246
+ continue;
247
+ seen.add(absolute);
248
+ resolved.push(absolute);
249
+ }
250
+ return resolved;
251
+ }
252
+ function resolveWorkspaceRootExpression(value, fallback, env) {
253
+ const expression = value ?? fallback;
254
+ return nonEmptyString(expandLocalPath(expression, env)) === undefined ? fallback : expression;
255
+ }
256
+ function parseDispatch(defaults, raw) {
257
+ const onlyRoutesRaw = raw.onlyRoutes;
258
+ const onlyRoutes = onlyRoutesRaw === null
259
+ ? null
260
+ : onlyRoutesRaw === undefined
261
+ ? defaults.onlyRoutes
262
+ : normalizeOnlyRoutes(onlyRoutesRaw);
263
+ return {
264
+ acceptUnrouted: raw.acceptUnrouted ?? defaults.acceptUnrouted,
265
+ onlyRoutes,
266
+ routeLabelPrefix: (raw.routeLabelPrefix ?? defaults.routeLabelPrefix).trim(),
267
+ };
268
+ }
269
+ function assertNoWorkspaceHooks(hooks) {
270
+ const configured = Object.entries(hooksAliases)
271
+ .filter(([snake, camel]) => snake !== "timeout_ms" && hooks[camel])
272
+ .map(([snake]) => snake);
273
+ if (configured.length === 0)
274
+ return;
275
+ throw new Error(`workspace.isolation = "none" does not support hooks; remove ${configured.join(", ")}`);
276
+ }
277
+ function parseWorkerPool(raw, workerRaw, workersRaw) {
278
+ const selectedWorker = selectedWorkerProfile(workerRaw.kind, workersRaw);
279
+ if ((raw === undefined || raw === null) && selectedWorker === undefined)
280
+ return undefined;
281
+ if (selectedWorker !== undefined && raw?.driver !== undefined) {
282
+ throw new Error("worker.kind cannot be combined with worker.worker_pool.driver");
283
+ }
284
+ const enabled = raw?.enabled ?? selectedWorker !== undefined;
285
+ const driver = selectedWorker?.driver ?? raw?.driver ?? "fake";
286
+ const min = raw?.min ?? 0;
287
+ const max = raw?.max ?? 1;
288
+ const warm = raw?.warm ?? 1;
289
+ if (max < min) {
290
+ throw new Error("worker.worker_pool.max must be >= worker.worker_pool.min");
291
+ }
292
+ if (warm > max) {
293
+ throw new Error("worker.worker_pool.warm must be <= worker.worker_pool.max");
294
+ }
295
+ // `maxInFlight` is a derived getter over `slotsPerMachine` (domain `withDerivedMaxInFlight`),
296
+ // so the constructed object carries exactly ONE own field (`slotsPerMachine`). The config key
297
+ // `worker.worker_pool.max_in_flight` is unchanged; it parses into `slotsPerMachine`.
298
+ const input = {
299
+ enabled,
300
+ driver,
301
+ min,
302
+ max,
303
+ warm,
304
+ slotsPerMachine: raw?.maxInFlight ?? 1,
305
+ ttlMs: raw?.ttlMs ?? 3_600_000,
306
+ idleReapMs: raw?.idleReapMs ?? 300_000,
307
+ acquireTimeoutMs: raw?.acquireTimeoutMs ?? 30_000,
308
+ reapIntervalMs: raw?.reapIntervalMs ?? 15_000,
309
+ staleHeartbeatMs: raw?.staleHeartbeatMs ?? 600_000,
310
+ drainDeadlineMs: raw?.drainDeadlineMs ?? 30_000,
311
+ };
312
+ const settings = withDerivedMaxInFlight(input);
313
+ // Co-residence opt-in, tunnel ceiling, and fairness cap stay absent unless explicitly set, so
314
+ // a default config's settings object keeps exactly the same own fields (the absent-worker_pool
315
+ // deep-equal-clone holds).
316
+ if (raw?.maxWorkersPerIssue !== undefined)
317
+ settings.maxWorkersPerIssue = raw.maxWorkersPerIssue;
318
+ if (raw?.coResidence !== undefined)
319
+ settings.coResidence = raw.coResidence;
320
+ if (raw?.maxConcurrentTunnels !== undefined)
321
+ settings.maxConcurrentTunnels = raw.maxConcurrentTunnels;
322
+ const spend = parseWorkerPoolSpend(raw?.spend);
323
+ if (spend)
324
+ settings.spend = spend;
325
+ const driverOptions = selectedWorker === undefined ? undefined : selectedWorkerDriverOptions(selectedWorker);
326
+ if (driverOptions !== undefined)
327
+ settings.driverOptions = driverOptions;
328
+ // Driver-specific option validation (e.g. static-ssh's required ssh_hosts)
329
+ // lives with the registered driver and runs at pool construction - the same
330
+ // fail-loud startup point as an unregistered kind.
331
+ return settings;
332
+ }
333
+ function selectedWorkerProfile(workerKind, workersRaw) {
334
+ if (workerKind === undefined)
335
+ return undefined;
336
+ const selected = workersRaw[workerKind];
337
+ if (selected === undefined) {
338
+ throw new Error(`worker.kind "${workerKind}" does not match any workers entry`);
339
+ }
340
+ return selected;
341
+ }
342
+ function selectedWorkerDriverOptions(worker) {
343
+ const { driver: _driver, ...driverOptions } = worker;
344
+ return Object.keys(driverOptions).length === 0 ? undefined : driverOptions;
345
+ }
346
+ function parseWorkerPoolSpend(raw) {
347
+ if (raw === undefined)
348
+ return undefined;
349
+ const spend = {};
350
+ if (raw.maxConcurrentWorkers !== undefined)
351
+ spend.maxConcurrentWorkers = raw.maxConcurrentWorkers;
352
+ if (raw.maxWorkerSeconds !== undefined)
353
+ spend.maxWorkerSeconds = raw.maxWorkerSeconds;
354
+ if (raw.dailyWorkerSeconds !== undefined)
355
+ spend.dailyWorkerSeconds = raw.dailyWorkerSeconds;
356
+ return spend;
357
+ }
358
+ function parseHooks(defaults, hooksRaw) {
359
+ return {
360
+ afterCreate: hooksRaw.afterCreate ?? null,
361
+ beforeRun: hooksRaw.beforeRun ?? null,
362
+ afterRun: hooksRaw.afterRun ?? null,
363
+ beforeRemove: hooksRaw.beforeRemove ?? null,
364
+ timeoutMs: hooksRaw.timeoutMs ?? defaults.timeoutMs,
365
+ };
366
+ }
367
+ function parseAgentSettings(defaults, agentRaw, skills) {
368
+ const kind = agentRaw.kind ?? defaults.kind;
369
+ return {
370
+ kind,
371
+ maxConcurrentAgents: agentRaw.maxConcurrentAgents ?? defaults.maxConcurrentAgents,
372
+ maxTurns: agentRaw.maxTurns ?? defaults.maxTurns,
373
+ maxRetryBackoffMs: agentRaw.maxRetryBackoffMs ?? defaults.maxRetryBackoffMs,
374
+ ensembleSize: agentRaw.ensembleSize ?? defaults.ensembleSize,
375
+ skills: agentRaw.skills ? skills : defaults.skills,
376
+ };
377
+ }
378
+ /**
379
+ * Map a legacy top-level `codex:` / `claude:` workflow section onto the matching
380
+ * {@link Settings.agents} record. The sections are parse-time conveniences only;
381
+ * `agents` is the single source of truth at runtime.
382
+ */
383
+ function legacyAgentRecordOverrides(codexRaw, claudeRaw) {
384
+ const overrides = {};
385
+ const codex = agentRecordFragment(codexRaw);
386
+ if (Object.keys(codex).length > 0)
387
+ overrides.codex = codex;
388
+ const claude = claudeRecordFragment(defaultAgentRecords().claude, claudeRaw);
389
+ if (Object.keys(claude).length > 0)
390
+ overrides.claude = claude;
391
+ return overrides;
392
+ }
393
+ /**
394
+ * Translate legacy backend-section keys into an agent-record fragment: shared keys stay
395
+ * top-level, ACP keys (`command`, ...) become entries of the record's options bag.
396
+ */
397
+ function agentRecordFragment(raw) {
398
+ const options = {
399
+ ...(raw.command !== undefined ? { bridgeCommand: raw.command } : {}),
400
+ ...(raw.strictMcpConfig !== undefined ? { strictMcpConfig: raw.strictMcpConfig } : {}),
401
+ ...(raw.providerConfig !== undefined ? { providerConfig: raw.providerConfig } : {}),
402
+ };
403
+ return {
404
+ ...(raw.turnTimeoutMs !== undefined ? { turnTimeoutMs: raw.turnTimeoutMs } : {}),
405
+ ...(raw.stallTimeoutMs !== undefined ? { stallTimeoutMs: raw.stallTimeoutMs } : {}),
406
+ ...(Object.keys(options).length > 0 ? { options } : {}),
407
+ };
408
+ }
409
+ /**
410
+ * Like {@link agentRecordFragment}, plus the top-level `claude.model` handling: the model
411
+ * setting pins the `model` key of the record's provider config; an explicit `model` key
412
+ * inside a configured provider config takes precedence.
413
+ */
414
+ function claudeRecordFragment(base, raw) {
415
+ const fragment = agentRecordFragment(raw);
416
+ if (raw.model === undefined && raw.providerConfig === undefined)
417
+ return fragment;
418
+ const baseProviderConfig = isPlainRecord(base.options.providerConfig)
419
+ ? base.options.providerConfig
420
+ : undefined;
421
+ const model = raw.model ?? baseProviderConfig?.model;
422
+ const providerConfig = raw.providerConfig
423
+ ? { ...(model !== undefined ? { model } : {}), ...raw.providerConfig }
424
+ : { ...baseProviderConfig, ...(model !== undefined ? { model } : {}) };
425
+ fragment.options = { ...fragment.options, providerConfig };
426
+ return fragment;
427
+ }
428
+ /** Layer a sparse record fragment over a full record, merging the options bags per key. */
429
+ function mergeAgentFragment(base, fragment) {
430
+ return { ...base, ...fragment, options: { ...base.options, ...fragment.options } };
431
+ }
432
+ /** Like {@link mergeAgentFragment} for two sparse fragments; the second fragment wins. */
433
+ function mergeAgentFragments(first, second) {
434
+ if (!second)
435
+ return first;
436
+ const options = { ...first.options, ...second.options };
437
+ return {
438
+ ...first,
439
+ ...second,
440
+ ...(Object.keys(options).length > 0 ? { options } : {}),
441
+ };
442
+ }
443
+ function parseAgents(raw, legacyOverrides, executors, env) {
444
+ const { timeoutDefaults, records } = parseAgentsRaw(raw);
445
+ const base = defaultAgentRecords();
446
+ for (const [kind, fragment] of Object.entries(legacyOverrides)) {
447
+ const record = base[kind];
448
+ if (record)
449
+ base[kind] = mergeAgentFragment(record, fragment);
450
+ }
451
+ // TODO: Remove legacy top-level codex/claude timeout fallbacks after configs use shared agents-level timeout defaults.
452
+ const baseAgents = withAgentTimeoutDefaults(base, timeoutDefaults);
453
+ const agents = cloneAgentRecords(baseAgents);
454
+ const claudeDefaults = baseAgents.claude;
455
+ for (const [name, value] of Object.entries(records)) {
456
+ const normalized = name.trim();
457
+ if (!normalized)
458
+ throw new Error("agents names must not be blank");
459
+ const recordRaw = asRecord(value, `agents.${normalized}`);
460
+ const parsed = parseAgentRecordSchema(recordRaw, `agents.${normalized}`);
461
+ agents[normalized] = parseAgent(normalized, parsed, baseAgents, claudeDefaults, executors, env);
462
+ }
463
+ return agents;
464
+ }
465
+ function parseAgentsRaw(raw) {
466
+ const { turnTimeoutMs, stallTimeoutMs, ...records } = raw;
467
+ const result = z
468
+ .object({
469
+ turnTimeoutMs: coercedTimeoutMs.optional(),
470
+ stallTimeoutMs: coercedNonNegativeTimeoutMs.optional(),
471
+ })
472
+ .strict()
473
+ .safeParse({ turnTimeoutMs, stallTimeoutMs });
474
+ if (!result.success)
475
+ throw new Error(configErrorMessage(result.error, "agents"));
476
+ return { timeoutDefaults: result.data, records };
477
+ }
478
+ function withAgentTimeoutDefaults(records, timeoutDefaults) {
479
+ if (timeoutDefaults.turnTimeoutMs === undefined && timeoutDefaults.stallTimeoutMs === undefined) {
480
+ return records;
481
+ }
482
+ return Object.fromEntries(Object.entries(records).map(([name, record]) => [
483
+ name,
484
+ {
485
+ ...record,
486
+ turnTimeoutMs: timeoutDefaults.turnTimeoutMs ?? record.turnTimeoutMs,
487
+ stallTimeoutMs: timeoutDefaults.stallTimeoutMs ?? record.stallTimeoutMs,
488
+ },
489
+ ]));
490
+ }
491
+ /**
492
+ * Default record backing a custom agent kind: the claude record minus its provider config,
493
+ * which only carries over when the configured bridge command is claude-compatible.
494
+ */
495
+ function customAgentDefaultsForBridge(aliasedOptions, claudeDefaults) {
496
+ const configured = aliasedOptions.bridgeCommand;
497
+ const bridgeCommand = typeof configured === "string" ? configured : String(claudeDefaults.options.bridgeCommand);
498
+ const isClaudeCompatible = /(^|\s|\/)claude-agent-acp(\s|$)/.test(bridgeCommand);
499
+ // No usageAccounting default: custom kinds infer it from their effective bridge command.
500
+ const { usageAccounting: _usageAccounting, ...claudeOptions } = claudeDefaults.options;
501
+ return {
502
+ ...claudeDefaults,
503
+ options: isClaudeCompatible
504
+ ? claudeOptions
505
+ : Object.fromEntries(Object.entries(claudeOptions).filter(([key]) => key !== "providerConfig")),
506
+ };
507
+ }
508
+ function parseAgentRecordSchema(raw, label) {
509
+ const result = agentRecordSchema.safeParse(raw);
510
+ if (result.success)
511
+ return result.data;
512
+ throw new Error(configErrorMessage(result.error, label));
513
+ }
514
+ /** Keys of an agents.<kind> record owned by the core; everything else belongs to the executor. */
515
+ const AGENT_COMMON_KEYS = new Set(["executor", "turnTimeoutMs", "stallTimeoutMs"]);
516
+ function parseAgent(kind, raw, baseAgents, claudeDefaults, executors, env) {
517
+ const executor = raw.executor ?? baseAgents[kind]?.executor ?? claudeDefaults.executor;
518
+ // Unregistered executors parse generically (options pass through unvalidated) and are
519
+ // rejected with the full list of known executors by validateDispatchConfig.
520
+ const provider = executors.get(executor);
521
+ const aliased = agentOptionsRaw(raw, provider, `agents.${kind}`);
522
+ const defaults = baseAgents[kind] ?? customAgentDefaultsForBridge(aliased, claudeDefaults);
523
+ // Option bags belong to one executor: a record selecting a different executor than its
524
+ // defaults (including the ACP-flavored custom-kind fallback) starts from an empty bag.
525
+ // Shared timeouts still inherit below.
526
+ const inheritedOptions = executor === defaults.executor ? defaults.options : {};
527
+ const merged = { ...inheritedOptions, ...aliased };
528
+ const options = parseAgentOptions(provider, merged, env, `agents.${kind}`);
529
+ return {
530
+ executor,
531
+ turnTimeoutMs: raw.turnTimeoutMs ?? defaults.turnTimeoutMs,
532
+ stallTimeoutMs: raw.stallTimeoutMs ?? defaults.stallTimeoutMs,
533
+ options,
534
+ };
535
+ }
536
+ /** Run the executor provider's option parser, labelling errors with the record's config path. */
537
+ function parseAgentOptions(provider, options, env, label) {
538
+ if (!provider?.parseOptions)
539
+ return options;
540
+ try {
541
+ return provider.parseOptions(options, {
542
+ env,
543
+ resolveSecret: (value, fallbackEnvVar) => resolveConfiguredSecret(value, env, fallbackEnvVar),
544
+ });
545
+ }
546
+ catch (error) {
547
+ throw new Error(`${label}: ${errorMessage(error)}`, { cause: error });
548
+ }
549
+ }
550
+ function parseStatusOverrides(raw, baseAgents, executors, env) {
551
+ const overrides = new Map();
552
+ for (const [stateName, value] of Object.entries(raw)) {
553
+ const normalizedState = normalizeStateName(stateName);
554
+ if (!normalizedState)
555
+ throw new Error("status_overrides state names must not be blank");
556
+ const next = {};
557
+ if (value.agent !== undefined)
558
+ next.agent = parsePartialAgent(value.agent);
559
+ const agents = parseStatusOverrideAgents(normalizedState, value, baseAgents, executors, env);
560
+ if (Object.keys(agents).length > 0)
561
+ next.agents = agents;
562
+ overrides.set(normalizedState, next);
563
+ }
564
+ return overrides;
565
+ }
566
+ function parsePartialAgent(raw) {
567
+ const next = {};
568
+ if (raw.kind !== undefined)
569
+ next.kind = raw.kind;
570
+ if (raw.maxConcurrentAgents !== undefined)
571
+ next.maxConcurrentAgents = raw.maxConcurrentAgents;
572
+ if (raw.maxTurns !== undefined)
573
+ next.maxTurns = raw.maxTurns;
574
+ if (raw.maxRetryBackoffMs !== undefined)
575
+ next.maxRetryBackoffMs = raw.maxRetryBackoffMs;
576
+ if (raw.ensembleSize !== undefined)
577
+ next.ensembleSize = raw.ensembleSize;
578
+ return next;
579
+ }
580
+ /**
581
+ * Collect per-kind agent record overrides for one state: the explicit `agents:` map plus
582
+ * the legacy `codex:` / `claude:` sugar sections, all normalized into agent-record fields.
583
+ */
584
+ function parseStatusOverrideAgents(state, value, baseAgents, executors, env) {
585
+ const agents = {};
586
+ for (const [kind, recordRaw] of Object.entries(value.agents ?? {})) {
587
+ const normalizedKind = kind.trim();
588
+ if (!normalizedKind)
589
+ throw new Error("status_overrides agents names must not be blank");
590
+ const label = `status_overrides.${state}.agents.${normalizedKind}`;
591
+ const result = agentRecordOverrideSchema.safeParse(recordRaw);
592
+ if (!result.success)
593
+ throw new Error(configErrorMessage(result.error, label));
594
+ agents[normalizedKind] = agentRecordOverrideFragment(result.data, label, baseAgents[normalizedKind], executors, env);
595
+ }
596
+ if (value.codex !== undefined) {
597
+ agents.codex = mergeAgentFragments(agentRecordFragment(value.codex), agents.codex);
598
+ }
599
+ if (value.claude !== undefined) {
600
+ const fragment = agentRecordFragment(value.claude);
601
+ // A model override re-pins the provider config unless the override supplies its own.
602
+ const base = baseAgents.claude;
603
+ if (value.claude.model !== undefined && value.claude.providerConfig === undefined && base) {
604
+ const baseProviderConfig = isPlainRecord(base.options.providerConfig)
605
+ ? base.options.providerConfig
606
+ : undefined;
607
+ fragment.options = {
608
+ ...fragment.options,
609
+ providerConfig: { ...baseProviderConfig, model: value.claude.model },
610
+ };
611
+ }
612
+ agents.claude = mergeAgentFragments(fragment, agents.claude);
613
+ }
614
+ return agents;
615
+ }
616
+ /**
617
+ * Build a sparse fragment from an explicit per-state agent record: shared keys stay
618
+ * top-level, the remaining keys are aliased by the base record's executor provider and kept
619
+ * as a sparse options overlay. The overlay is the diff of the provider-parsed merge against
620
+ * the base options, so coercions and derived keys land normalized while base defaults never
621
+ * leak into the fragment.
622
+ */
623
+ function agentRecordOverrideFragment(raw, label, base, executors, env) {
624
+ // Per-state overrides cannot switch executors; reject the key explicitly.
625
+ if ("executor" in raw) {
626
+ throw new Error(`${label} contains unsupported keys: executor`);
627
+ }
628
+ const provider = executors.get(base?.executor);
629
+ const aliased = agentOptionsRaw(raw, provider, label);
630
+ const options = base && Object.keys(aliased).length > 0
631
+ ? sparseOptionsOverlay(parseAgentOptions(provider, { ...base.options, ...aliased }, env, label), base.options)
632
+ : aliased;
633
+ return {
634
+ ...(raw.turnTimeoutMs !== undefined ? { turnTimeoutMs: raw.turnTimeoutMs } : {}),
635
+ ...(raw.stallTimeoutMs !== undefined ? { stallTimeoutMs: raw.stallTimeoutMs } : {}),
636
+ ...(Object.keys(options).length > 0 ? { options } : {}),
637
+ };
638
+ }
639
+ function agentOptionsRaw(raw, provider, _label) {
640
+ const flat = Object.fromEntries(Object.entries(raw).filter(([key]) => !AGENT_COMMON_KEYS.has(key)));
641
+ const aliases = { ...(provider?.configAliases ?? {}) };
642
+ return normalizeLegacyAgentCommand(normalizeAliases(flat, aliases));
643
+ }
644
+ /** Fold the legacy `command` spelling into `bridgeCommand`; an explicit canonical key wins. */
645
+ function normalizeLegacyAgentCommand(options) {
646
+ if (!("command" in options))
647
+ return options;
648
+ const { command, ...rest } = options;
649
+ return { bridgeCommand: rest.bridgeCommand ?? command, ...rest };
650
+ }
651
+ /** Keys of a parsed options bag whose values differ from the base record's options. */
652
+ function sparseOptionsOverlay(parsed, base) {
653
+ const overlay = {};
654
+ for (const [key, value] of Object.entries(parsed)) {
655
+ if (!sameOptionValue(value, base[key]))
656
+ overlay[key] = value;
657
+ }
658
+ return overlay;
659
+ }
660
+ function sameOptionValue(a, b) {
661
+ if (Object.is(a, b))
662
+ return true;
663
+ if (typeof a !== "object" || typeof b !== "object" || a === null || b === null)
664
+ return false;
665
+ return JSON.stringify(a) === JSON.stringify(b);
666
+ }
667
+ function parseToolOptions(tools, env) {
668
+ if (tools === undefined)
669
+ return undefined;
670
+ if (Object.keys(tools).length === 0)
671
+ return undefined;
672
+ return resolveToolOptionReferences(tools, env);
673
+ }
674
+ /**
675
+ * Copy per-pack tool options, resolving whole-value `$VAR` and `op://` references in
676
+ * top-level string values at parse time - like shared tracker credentials - so the
677
+ * effective values are what execution uses and what the MCP server identity hashes.
678
+ */
679
+ function resolveToolOptionReferences(toolOptions, env) {
680
+ const resolved = {};
681
+ for (const [pack, options] of Object.entries(toolOptions)) {
682
+ resolved[pack] = Object.fromEntries(Object.entries(structuredClone(options)).flatMap(([key, value]) => {
683
+ if (typeof value !== "string")
684
+ return [[key, value]];
685
+ const secret = resolveConfiguredSecret(value, env);
686
+ return secret === undefined ? [] : [[key, secret]];
687
+ }));
688
+ }
689
+ return resolved;
690
+ }
691
+ function cloneSettings(settings) {
692
+ return {
693
+ ...settings,
694
+ tracker: cloneTracker(settings.tracker),
695
+ polling: { ...settings.polling },
696
+ workspace: { ...settings.workspace },
697
+ worker: cloneWorkerSettings(settings.worker),
698
+ hooks: { ...settings.hooks },
699
+ agent: { ...settings.agent, skills: [...settings.agent.skills] },
700
+ agents: cloneAgentRecords(settings.agents),
701
+ ...(settings.toolOptions !== undefined && {
702
+ toolOptions: structuredClone(settings.toolOptions),
703
+ }),
704
+ observability: { ...settings.observability },
705
+ server: { ...settings.server },
706
+ logging: { ...settings.logging },
707
+ statusOverrides: new Map(settings.statusOverrides),
708
+ };
709
+ }
710
+ function cloneWorkerSettings(worker) {
711
+ const cloned = { ...worker, sshHosts: [...worker.sshHosts] };
712
+ if (worker.workerPool === undefined) {
713
+ delete cloned.workerPool;
714
+ }
715
+ else {
716
+ cloned.workerPool = cloneWorkerPool(worker.workerPool);
717
+ }
718
+ return cloned;
719
+ }
720
+ function cloneWorkerPool(workerPool) {
721
+ // A shallow spread copies the enumerable `maxInFlight` getter as a plain data property; strip it
722
+ // and re-install the derived accessor over the cloned `slotsPerMachine` so the clone stays
723
+ // drift-proof (single own field) exactly like the parse path.
724
+ const { maxInFlight: _maxInFlight, ...rest } = workerPool;
725
+ const input = { ...rest };
726
+ if (workerPool.spend !== undefined)
727
+ input.spend = { ...workerPool.spend };
728
+ if (workerPool.driverOptions !== undefined) {
729
+ // structuredClone guarantees nested arrays/objects (e.g. ssh_hosts) are copied,
730
+ // so a per-issue settings clone never aliases the source driverOptions.
731
+ input.driverOptions = structuredClone(workerPool.driverOptions);
732
+ }
733
+ return withDerivedMaxInFlight(input);
734
+ }
735
+ /**
736
+ * Deep-copy mutable tracker collections (dispatch, state lists, provider options) so
737
+ * per-issue-state clones cannot mutate the shared base config.
738
+ */
739
+ function cloneTracker(tracker) {
740
+ return {
741
+ ...tracker,
742
+ dispatch: { ...tracker.dispatch },
743
+ activeStates: [...tracker.activeStates],
744
+ terminalStates: [...tracker.terminalStates],
745
+ options: structuredClone(tracker.options),
746
+ };
747
+ }
748
+ function cloneAgentRecords(records) {
749
+ const cloned = {};
750
+ for (const [name, record] of Object.entries(records)) {
751
+ cloned[name] = { ...record, options: structuredClone(record.options) };
752
+ }
753
+ return cloned;
754
+ }
755
+ function asRecord(value, label) {
756
+ if (!isPlainRecord(value))
757
+ throw new Error(`${label} must be a map`);
758
+ return value;
759
+ }
760
+ function parseWorkflowConfig(raw) {
761
+ const result = workflowConfigSchema.safeParse(raw);
762
+ if (result.success)
763
+ return result.data;
764
+ throw new Error(configErrorMessage(result.error));
765
+ }
766
+ function trackerKindValue(value) {
767
+ if (value === undefined || value === null)
768
+ return undefined;
769
+ const kind = value.trim();
770
+ return kind === "" ? undefined : kind;
771
+ }
772
+ function normalizeOnlyRoutes(routes) {
773
+ const normalized = routes.map(normalizeRouteName);
774
+ if (normalized.some((route) => route === "")) {
775
+ throw new Error("tracker.dispatch.only_routes must not contain blank routes");
776
+ }
777
+ return [...new Set(normalized)];
778
+ }
779
+ function resolveEnv(value, env) {
780
+ const name = wholeEnvName(value);
781
+ if (name === null)
782
+ return value;
783
+ return env[name] ?? "";
784
+ }
785
+ function resolveConfiguredSecret(value, env, fallbackEnvName) {
786
+ const fallback = fallbackEnvName === undefined ? undefined : nonEmptyString(env[fallbackEnvName]);
787
+ if (value === undefined) {
788
+ return resolveOnePasswordRef(fallback, env);
789
+ }
790
+ const resolved = resolveEnv(value, env);
791
+ const secret = nonEmptyString(resolved) ?? fallback;
792
+ return resolveOnePasswordRef(secret, env);
793
+ }
794
+ function resolveOnePasswordRef(value, env) {
795
+ if (value === undefined || !value.startsWith("op://"))
796
+ return value;
797
+ const mergedEnv = { ...process.env, ...env };
798
+ try {
799
+ execaSync("op", ["--version"], { env: mergedEnv });
800
+ }
801
+ catch {
802
+ throw new Error("1Password CLI (op) is required to resolve op:// references but was not found. " +
803
+ "Install it from https://developer.1password.com/docs/cli/get-started - it cannot be managed by mise.");
804
+ }
805
+ try {
806
+ const result = execaSync("op", ["read", value], { env: mergedEnv });
807
+ return result.stdout.trim();
808
+ }
809
+ catch {
810
+ throw new Error(`Failed to resolve 1Password reference: ${value}`);
811
+ }
812
+ }
813
+ function expandPathVariables(value, env) {
814
+ const name = wholeEnvName(value);
815
+ return name === null ? value : (env[name] ?? "");
816
+ }
817
+ function wholeEnvName(value) {
818
+ const match = /^\$([A-Za-z_][A-Za-z0-9_]*)$/.exec(value);
819
+ return match?.[1] ?? null;
820
+ }
821
+ //# sourceMappingURL=parse.js.map