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
package/README.md ADDED
@@ -0,0 +1,774 @@
1
+ # Lorenz
2
+
3
+ Lorenz turns tracker issues into agent runs. It polls for eligible work, prepares a workspace,
4
+ renders the workflow prompt with issue context, starts Codex or Claude, and records the run so
5
+ operators can inspect state, retries, cost, and logs.
6
+
7
+ This workspace owns the TypeScript CLI, runtime packages, tracker adapters, terminal dashboard,
8
+ local observability server, trace viewer packages, and tests.
9
+
10
+ ## Requirements
11
+
12
+ [mise](https://mise.jdx.dev/) is recommended for managing Node and pnpm:
13
+
14
+ ```sh
15
+ mise trust
16
+ mise install
17
+ pnpm install
18
+ ```
19
+
20
+ The workspace uses Node 24 and pnpm 9 from `ts/mise.toml`.
21
+
22
+ Runtime requirements depend on the workflow:
23
+
24
+ - `LINEAR_API_KEY` for Linear-backed workflows.
25
+ - `codex` on `PATH` for Codex runs and live Codex tests.
26
+ - A Claude ACP bridge, usually `claude-agent-acp`, for Claude runs and live Claude tests.
27
+ - SSH access for remote workers and live SSH tests.
28
+ - Docker and `ssh-keygen` for disposable live SSH workers when no real SSH hosts are configured.
29
+
30
+ Run commands from `ts/` unless a command says otherwise.
31
+
32
+ ## Run
33
+
34
+ ```sh
35
+ pnpm build
36
+ pnpm start -- WORKFLOW.md
37
+ pnpm start:once -- --dry-run --no-tui WORKFLOW.md
38
+ pnpm runs -- --port 4000 --failed
39
+ ```
40
+
41
+ The built CLI is `lorenz`:
42
+
43
+ ```sh
44
+ lorenz [--once] [--dry-run] [--no-tui] [--port <port>] [--logs-root <path>] [path-to-WORKFLOW.md]
45
+ lorenz runs [--issue ID] [--failed] [--cost] [--retries] [--id RUN_ID] [--limit N] [--url URL | --port PORT] [--json]
46
+ ```
47
+
48
+ Optional flags:
49
+
50
+ - `--logs-root <path>` writes logs under `<path>/log/symphony.log`.
51
+ - `--port <port>` starts the local observability dashboard and JSON API.
52
+ - `--once` polls once and exits.
53
+ - `--dry-run` evaluates candidates without dispatching agents.
54
+ - `--no-tui` disables the terminal dashboard and prints JSON snapshots.
55
+
56
+ With no workflow path, the CLI reads `SYMPHONY_WORKFLOW`, then `./WORKFLOW.md`.
57
+
58
+ The runtime reloads the workflow before each poll. If startup cannot read or parse the workflow,
59
+ the CLI exits with an error. If a later reload fails, the runtime keeps the last good workflow and
60
+ records a `workflow_reload_failed` event.
61
+
62
+ ## Workspace Layout
63
+
64
+ See [docs/ARCHITECTURE.md](./docs/ARCHITECTURE.md) for the layering rules and the tracker extension
65
+ contract (including the recipe for adding a new tracker backend).
66
+
67
+ - `apps/cli` is the composition root: it invokes the built-in extensions' registration and wires
68
+ configuration, agent runners, the runtime, the TUI, and the observability server into the
69
+ shipped binary.
70
+ - `apps/traceviz` renders trace event streams for local inspection.
71
+ - `packages/tracker-sdk` is the extension SDK: the `TrackerProvider` contract, the provider
72
+ registry, and the helpers tracker backends build on.
73
+ - `extensions/*` are the backend extensions: `linear-tracker`, `local-tracker`,
74
+ `memory-tracker`, and `jira-tracker` are self-contained tracker providers (config
75
+ parsing, runtime client, tool packs) that each export their own registration; the CLI
76
+ invokes the built-in set at its composition root.
77
+ - The remaining `packages/*` are the provider-agnostic engine: domain model, configuration
78
+ loader, prompt renderer, runtime, policies, MCP server, dashboards, logging, SSH, and
79
+ support libraries.
80
+ - `test/` contains workspace-level integration, contract, sandbox, and live tests.
81
+ - Package- and app-owned unit tests live under `packages/<name>/test/` or `apps/<name>/test/` as
82
+ `.test.ts` or `.test.tsx` files.
83
+
84
+ Create a package when a boundary has a clear owner. Keep curated exports in `src/index.ts` and
85
+ declare internal dependencies as `workspace:*`.
86
+
87
+ ## Configuration
88
+
89
+ Configuration lives in the YAML front matter of a workflow file. The Markdown body below the front
90
+ matter is the agent session prompt, rendered as Liquid with issue context variables.
91
+
92
+ ### Quickstart
93
+
94
+ ```yaml
95
+ ---
96
+ tracker:
97
+ kind: linear
98
+ trackers:
99
+ linear:
100
+ provider: linear
101
+ project_slug: "your-project-slug"
102
+ workspace:
103
+ root: ~/code/workspaces
104
+ hooks:
105
+ after_create: |
106
+ git clone git@github.com:your-org/your-repo.git .
107
+ agent:
108
+ kind: codex
109
+ ---
110
+
111
+ You are working on {{ issue.identifier }}: {{ issue.title }}
112
+
113
+ {{ issue.description }}
114
+ ```
115
+
116
+ Set `LINEAR_API_KEY` in your environment before running a Linear workflow.
117
+
118
+ ### Full Reference
119
+
120
+ ```yaml
121
+ ---
122
+ tracker:
123
+ kind: linear # linear, jira, jira-mcp, local, or memory
124
+ trackers:
125
+ linear:
126
+ provider: linear
127
+ api_key: $LINEAR_API_KEY # defaults to $LINEAR_API_KEY when unset
128
+ endpoint: "https://api.linear.app/graphql"
129
+ project_slug: "my-project" # right-click a Linear project and copy the URL slug
130
+ assignee: $LINEAR_ASSIGNEE # optional; filters issues by assignee
131
+ active_states:
132
+ - Todo # default: ["Todo", "In Progress"]
133
+ - In Progress
134
+ - Agent Review
135
+ - Merging
136
+ - Rework
137
+ terminal_states:
138
+ - Closed # default: ["Closed", "Cancelled", "Canceled",
139
+ - Cancelled # "Duplicate", "Done"]
140
+ - Canceled
141
+ - Duplicate
142
+ - Done
143
+ dispatch:
144
+ accept_unrouted: true # accept issues without a route label; default: true
145
+ only_routes: null # null accepts any route, [] accepts none
146
+ route_label_prefix: "Symphony:" # route labels look like "Symphony:backend"
147
+
148
+ tools:
149
+ local:
150
+ path: .symphony/local # explicit extra pack config; not needed for Linear-owned tools
151
+
152
+ polling:
153
+ interval_ms: 30000 # default: 30000
154
+
155
+ workspace:
156
+ root: ~/code/workspaces # default: $TMPDIR/symphony_workspaces
157
+
158
+ worker:
159
+ # Either list static SSH hosts here, or set kind to select a top-level workers.<name> profile.
160
+ # kind: static-prod
161
+ ssh_hosts:
162
+ - worker1.example.com # standard OpenSSH targets and Host aliases work
163
+ - worker2.example.com:2222
164
+ ssh_timeout_ms: 60000 # default: 60000
165
+ max_concurrent_agents_per_host: 2 # optional; defaults to the global agent cap per host
166
+ # Alternative to ssh_hosts (mutually exclusive): a warm pool of leased workers
167
+ # provisioned by a worker driver. Disabled by default.
168
+ worker_pool:
169
+ enabled: false
170
+ # driver: fake # compatibility fallback when worker.kind is omitted
171
+ min: 0 # warm-inventory floor the reaper keeps alive
172
+ max: 1 # ceiling on concurrent workers
173
+ warm: 1 # pre-warmed idle workers the reaper tops up toward
174
+ max_in_flight: 1 # run slots per machine; >1 requires co_residence: true
175
+ ttl_ms: 3600000 # hard worker lifetime before recycle
176
+ idle_reap_ms: 300000 # idle window before a warm worker above min is reaped
177
+ acquire_timeout_ms: 30000 # how long an acquire waits for capacity
178
+ spend: # optional caps, all in worker count / wall-clock worker-seconds
179
+ max_concurrent_workers: 4
180
+ max_worker_seconds: 86400
181
+ daily_worker_seconds: 28800
182
+
183
+ workers:
184
+ static-prod: # selected by worker.kind, options pass through verbatim (snake_case preserved)
185
+ driver: static-ssh
186
+ ssh_hosts: ["user@worker1:22"]
187
+
188
+ agent:
189
+ kind: codex # default: "codex"; "claude" is configured below
190
+ max_concurrent_agents: 10 # default: 10
191
+ max_turns: 20 # default: 20
192
+ max_retry_backoff_ms: 300000 # default: 300000
193
+ ensemble_size: 1 # default: 1
194
+ skills: # skill directories overlaid into each workspace before the agent starts
195
+ - ./.codex/skills/symphony-land # one entry per skill directory
196
+
197
+ agents:
198
+ turn_timeout_ms: 3600000 # default: 3600000
199
+ stall_timeout_ms: 300000 # default: 300000
200
+ codex:
201
+ executor: acp
202
+ bridge_command: codex-acp
203
+ claude:
204
+ executor: acp
205
+ bridge_command: claude-agent-acp
206
+ bridge_args:
207
+ - --permission-mode
208
+ - dontAsk
209
+ - --model
210
+ - claude-opus-4-6[1m]
211
+
212
+ status_overrides:
213
+ in progress:
214
+ agent:
215
+ max_concurrent_agents: 5
216
+ merging:
217
+ agent:
218
+ max_concurrent_agents: 2
219
+
220
+ codex:
221
+ command: codex-acp # legacy alias for agents.codex.bridge_command
222
+ turn_timeout_ms: 3600000 # default: 3600000
223
+ stall_timeout_ms: 300000 # default: 300000
224
+
225
+ claude:
226
+ command: claude-agent-acp # ACP bridge command
227
+ model: claude-opus-4-6[1m]
228
+ permission_mode: dontAsk
229
+ strict_mcp_config: true # default: true
230
+
231
+ hooks:
232
+ after_create: | # runs after a workspace directory is created
233
+ git clone --depth 1 git@github.com:org/repo.git .
234
+ before_run: | # runs before each agent turn
235
+ git pull origin main
236
+ after_run: | # best effort; runs after each agent turn
237
+ echo "turn complete"
238
+ before_remove: | # best effort; runs before workspace cleanup
239
+ echo "cleaning up"
240
+ timeout_ms: 60000 # default: 60000
241
+
242
+ observability:
243
+ dashboard_enabled: true # terminal dashboard; default: true
244
+ refresh_ms: 1000 # default: 1000
245
+ render_interval_ms: 16 # default: 16
246
+
247
+ server:
248
+ port: 4000 # enables the web dashboard; default: disabled
249
+ host: 127.0.0.1 # default: 127.0.0.1
250
+
251
+ logging:
252
+ log_file: ./log/symphony.log # default: ~/.symphony/log/symphony.log
253
+ ---
254
+ ```
255
+
256
+ Notes:
257
+
258
+ - `tracker.kind` is always required. When `trackers` is present it selects a named bundle, and
259
+ `trackers.<name>.provider` selects the tracker implementation.
260
+ - The older flat `tracker.kind: linear` shape is still accepted when no `trackers` map is present.
261
+ - `trackers.linear.project_slug`, `trackers.linear.project_slugs`, or
262
+ `trackers.linear.project_labels` is required for Linear workflows.
263
+ - `trackers.linear.api_key` falls back to `LINEAR_API_KEY`; `trackers.linear.assignee` falls back
264
+ to `LINEAR_ASSIGNEE`.
265
+ - Shared tracker secrets can use `op://` references when the 1Password CLI is installed.
266
+ - `tools.<pack>` mounts or configures extra tool packs. Tracker-owned tools are implicit, so a
267
+ Linear tracker does not need a matching `tools.linear` entry.
268
+ - `workspace.root` supports `~` and whole-value `$VAR` expansion. `SYMPHONY_WORKSPACE_ROOT`
269
+ overrides `workspace.root` at runtime.
270
+ - `SYMPHONY_SSH_CONFIG` points SSH worker commands at a custom OpenSSH config file.
271
+ - Hooks run through `bash -lc` locally or over SSH with the workspace as `cwd`. Use
272
+ fail-fast shell options in bootstrap hooks so clone and dependency setup failures stop workspace
273
+ creation immediately.
274
+ - `codex.command` runs through `bash -lc`, so shell expansion happens in the launched process.
275
+ - If the Markdown body is blank, Lorenz uses a default prompt with the issue identifier, title,
276
+ and body.
277
+
278
+ ## Linear
279
+
280
+ Prerequisites:
281
+
282
+ 1. Create a personal API token in Linear Settings, Security & access, Personal API keys.
283
+ 2. Export it as `LINEAR_API_KEY`, or set `trackers.linear.api_key: $LINEAR_API_KEY`.
284
+ 3. Find the project slug by right-clicking a Linear project and copying its URL. The slug is in the
285
+ path.
286
+ 4. The example workflows use non-standard states such as `Agent Review`, `Rework`, `Human Review`,
287
+ and `Merging`. Add those states under Team Settings, Workflow, or adjust `active_states` and
288
+ `terminal_states` to match your team.
289
+
290
+ Route labels let multiple Lorenz instances share one Linear project. With the default
291
+ `route_label_prefix`, labels such as `Symphony:backend` and `Symphony:frontend` become route names.
292
+
293
+ ## Trackers
294
+
295
+ A tracker is the source of issues Lorenz works on. `tracker.kind` selects a named bundle under
296
+ `trackers`, and the selected bundle's `provider` selects the implementation. Every tracker exposes
297
+ the same read surface to the runtime (poll for candidate issues, refresh in-flight issues by id)
298
+ and a set of agent tools. Those tools are read+write symmetric across kinds, mirroring
299
+ `linear_graphql` (which both reads and writes): each tracker gives the agent at least one write tool
300
+ and one read tool. The tools differ per kind; their descriptions are self-documenting and surface
301
+ to the agent via the MCP `tools/list` call.
302
+
303
+ Supported kinds:
304
+
305
+ - `linear` - issues live in a Linear project. Read access uses `trackers.linear.api_key` (resolved
306
+ from `LINEAR_API_KEY`) and project selection uses `trackers.linear.project_slug`,
307
+ `trackers.linear.project_slugs`, or `trackers.linear.project_labels`. Agents can use
308
+ provider-neutral `tracker_*` tools or the legacy
309
+ `linear_graphql` tool.
310
+ - `jira` - issues live in Jira Cloud and are accessed directly over Jira REST. Configure
311
+ `trackers.jira.base_url`, `trackers.jira.email`, `trackers.jira.api_key`, and either
312
+ `trackers.jira.project_keys` or `trackers.jira.jql`. `JIRA_BASE_URL`, `JIRA_EMAIL`, and
313
+ `JIRA_API_KEY` are used as fallbacks.
314
+ - `jira-mcp` - issues live in Jira, but Lorenz reaches them through an external MCP server.
315
+ Configure `trackers.jira-mcp.mcp.url` and either `trackers.jira-mcp.project_keys` or
316
+ `trackers.jira-mcp.jql`. Tool names can be overridden under `trackers.jira-mcp.mcp.tools`.
317
+ - `local` - issues live as Markdown files on disk. No external service required.
318
+ - `slack` - an @-mention of the bot (in a channel message or a thread reply) is an issue, the
319
+ thread carries the status (`@bot !` commands and bot `status:` replies), and a thread reply is
320
+ a comment.
321
+ - `memory` - an in-process tracker used for tests and dry runs.
322
+
323
+ All non-memory providers expose the provider-neutral agent tools:
324
+
325
+ - `tracker_read_issue`
326
+ - `tracker_query`
327
+ - `tracker_update_status`
328
+ - `tracker_comment`
329
+ - `tracker_create_issue`
330
+
331
+ Provider-specific tools are compatibility escape hatches, not the preferred workflow contract.
332
+
333
+ All kinds share the dispatch routing block under the selected tracker bundle:
334
+
335
+ ```yaml
336
+ tracker:
337
+ kind: linear
338
+ trackers:
339
+ linear:
340
+ provider: linear
341
+ dispatch:
342
+ accept_unrouted: true # process issues that carry no matching route label (default)
343
+ only_routes: null # or a list of route names this instance handles
344
+ route_label_prefix: "Symphony:" # the label prefix that names a route
345
+ ```
346
+
347
+ ### Jira tracker
348
+
349
+ For both `jira` and `jira-mcp`, Lorenz only picks up issues that are assigned to the configured
350
+ user (`trackers.jira.assignee` or `trackers.jira-mcp.assignee`, defaulting to the authenticated
351
+ user via `assignee = currentUser()`) and labeled `agent`. This holds even when the configured JQL
352
+ widens the scope, so issues must be explicitly delegated before Lorenz will dispatch them.
353
+ Jira REST issues created through `tracker_create_issue` are assigned to that same owner by
354
+ default. Jira MCP creation forwards a concrete configured or caller-provided `assignee` to the
355
+ external MCP server.
356
+
357
+ Direct Jira REST configuration:
358
+
359
+ ```yaml
360
+ tracker:
361
+ kind: jira
362
+ trackers:
363
+ jira:
364
+ provider: jira
365
+ base_url: https://example.atlassian.net
366
+ email: $JIRA_EMAIL
367
+ api_key: $JIRA_API_KEY
368
+ project_keys: ["ENG"]
369
+ # Optional provider-native scope. When present, Lorenz combines it with active_states.
370
+ # jql: 'project = ENG AND labels in ("symphony")'
371
+ ```
372
+
373
+ Jira via an external MCP server:
374
+
375
+ ```yaml
376
+ tracker:
377
+ kind: jira-mcp
378
+ trackers:
379
+ jira-mcp:
380
+ provider: jira-mcp
381
+ base_url: https://example.atlassian.net # optional; used for issue URLs when MCP payloads omit them
382
+ project_keys: ["ENG"]
383
+ mcp:
384
+ url: http://127.0.0.1:5123/mcp
385
+ token: $JIRA_MCP_TOKEN
386
+ tools:
387
+ search: atlassian_search_jira
388
+ read_issue: atlassian_get_jira_issue
389
+ update_status: atlassian_transition_jira_issue
390
+ comment: atlassian_add_jira_comment
391
+ create_issue: atlassian_create_jira_issue
392
+ ```
393
+
394
+ ### Local tracker (filesystem board)
395
+
396
+ The local tracker runs Lorenz against a directory of Markdown files, with no Linear API key or
397
+ workspace. See `WORKFLOW.local.md` for a complete example workflow.
398
+
399
+ Configure it with `kind: local` and a board `path` (default `.symphony/local`):
400
+
401
+ ```yaml
402
+ tracker:
403
+ kind: local
404
+ trackers:
405
+ local:
406
+ provider: local
407
+ path: .symphony/local
408
+ id_prefix: "BOARD-" # optional, default "BOARD-"
409
+ active_states:
410
+ - Todo
411
+ - In Progress
412
+ terminal_states:
413
+ - Done
414
+ - Cancelled
415
+ ```
416
+
417
+ Both `path` and `id_prefix` are local-specific and always defaulted, so a local workflow is valid
418
+ with just `kind: local`. `id_prefix` sets the issue-id prefix for the board: the tracker only treats
419
+ `<prefix><n>.md` files as issues and mints new ids with it, so one board can be `BOARD-1`, `BOARD-2`
420
+ and another `XXX-1`, `FEAT-1`, etc. It must be filesystem-safe (start alphanumeric, then only
421
+ letters, digits, `_` or `-`); an unsafe prefix is rejected at config load. Changing the prefix of an
422
+ existing board orphans files written under the old prefix (they stop matching), so set it up front.
423
+
424
+ Each issue is one file named `<prefix><n>.md` (for example `.symphony/local/BOARD-7.md`, or
425
+ `.symphony/local/XXX-7.md` with `id_prefix: "XXX-"`). The identifier is the file stem (`BOARD-7`).
426
+ The format is YAML front matter followed by a `# Title`
427
+ heading, the description, and an optional `## Comments` section:
428
+
429
+ <!-- prettier-ignore -->
430
+ ```markdown
431
+ ---
432
+ status: In Progress
433
+ labels:
434
+ - backend
435
+ ---
436
+
437
+ # Fix the retry queue
438
+
439
+ The retry slot is not released when a worker fails.
440
+
441
+ <!-- symphony:comments -->
442
+ ## Comments
443
+ - 2026-05-29T12:00:00.000Z agent: Reproduced the leak; fix in progress.
444
+ ```
445
+
446
+ - `status` (required) is the issue state. Active states (`Todo`, `In Progress`) mean the issue is
447
+ available to work; terminal states (`Done`, `Cancelled`) mean it is finished and must not be
448
+ reopened. Configure the exact sets with `active_states` / `terminal_states`.
449
+ - `labels` (optional) is a YAML list. Labels feed dispatch routing the same way Linear labels do.
450
+ - The `# Title` heading is the issue title; the text below it is the description.
451
+ - The `## Comments` section is managed by the `local_comment` tool. The hidden
452
+ `<!-- symphony:comments -->` marker delimits it so a description that itself contains a
453
+ `## Comments` heading is never misparsed; treat the most recent comment block as the live
454
+ workpad.
455
+
456
+ Agent tools for `kind: local` (read and write, symmetric with `linear_graphql`):
457
+
458
+ - `local_update_status` - move an issue to a new status (args: `issueId`, `status`).
459
+ - `local_comment` - append a progress note to the issue's `## Comments` section (args: `issueId`,
460
+ `body`).
461
+ - `local_create_issue` - create a new board issue for out-of-scope follow-up work (args: `title`,
462
+ optional `body`, optional `status`).
463
+ - `local_read_issue` - read an issue's authoritative state: its current status, title, description,
464
+ and comments (args: `issueId`). Use it to re-read state and recover prior progress notes on a
465
+ continuation turn.
466
+
467
+ Concurrent writes (multiple agents or ensemble slots) to the same board file are serialized
468
+ in-process so a status change and comments are never lost. This assumes a single Lorenz daemon
469
+ owns the board; editing the `BOARD-<n>.md` files from another process at the same time is out of
470
+ scope.
471
+
472
+ To seed a board so you can try `kind: local` immediately, use the demo seeder, which writes
473
+ sample `BOARD-<n>.md` files through the same `BoardStore` the running tracker uses:
474
+
475
+ ```sh
476
+ npx tsx sandbox/seed-local.ts # seeds ./.symphony/local
477
+ npx tsx sandbox/seed-local.ts /tmp/demo-board # seeds an explicit directory
478
+ npx tsx sandbox/seed-local.ts .symphony/local 2 # seeds only the first 2 issues
479
+ npx tsx sandbox/seed-local.ts /tmp/demo-board 3 XXX- # seeds XXX-1..XXX-3 (match trackers.local.id_prefix)
480
+ ```
481
+
482
+ Point `trackers.local.path` at the directory you seeded and run Lorenz as usual. If you set a
483
+ custom `id_prefix`, pass the same prefix to the seeder so the seeded ids match what the tracker
484
+ expects.
485
+
486
+ ### Slack tracker (mention + thread commands)
487
+
488
+ The Slack tracker treats an @-mention of a bot as an issue - in a channel message or in a thread
489
+ reply (a reply mention tracks its thread, anchored at the root, with the reply as the request).
490
+ The request's text is the issue title/description, threaded replies are comments, and the
491
+ issue's STATUS lives in the thread: the bot posts `status: <Name>` replies and humans transition
492
+ with `@bot !` command mentions; the latest event wins, and the bot mirrors the state onto its own
493
+ reaction for glanceability. See `WORKFLOW.slack.md` for a complete example workflow.
494
+
495
+ Set up a Slack app:
496
+
497
+ 1. Create a Slack app at <https://api.slack.com/apps> (from scratch) in your workspace.
498
+ 2. Under "OAuth & Permissions", add these **bot token scopes**:
499
+ - `channels:history` - read messages in public channels.
500
+ - `groups:history` - read messages in private channels (only if you watch private channels).
501
+ - `reactions:read` - read reactions (legacy status fallback and the tracking marker).
502
+ - `reactions:write` - mirror status onto the bot's own reaction and mark tracked threads.
503
+ - `chat:write` - post threaded replies (comments and `status:` transitions).
504
+ - `users:read` - resolve user ids to names for the `slack_user_info` tool (optional but
505
+ recommended).
506
+
507
+ Lorenz discovers issues by paging `conversations.history` and matching the bot's @-mention
508
+ in message text, so it does not need `app_mentions:read`. Only add that scope if you separately
509
+ wire up the Events API / `app_mention` subscription, which Lorenz does not use today.
510
+
511
+ `conversations.history` is rate-limited (newer non-Marketplace apps can be throttled to roughly
512
+ one request per minute), and each poll re-scans recent channel history. The shipped Slack
513
+ workflow therefore sets a conservative `polling.interval_ms` of `60000` (one minute), and you
514
+ should point it at dedicated, low-traffic channels so a busy channel does not trigger sustained
515
+ `429`s. The transport's `429`/`Retry-After` backoff and per-channel `poll_error` handling cover
516
+ transient limits on top of that.
517
+
518
+ 3. Install the app to the workspace and copy the **Bot User OAuth Token** (starts with `xoxb-`).
519
+ Export it as `SLACK_BOT_TOKEN`; Lorenz resolves it into `trackers.slack.api_key`.
520
+ 4. Find the app's **bot user id** (the `U...` id, shown on the app's "App Home" / via
521
+ `auth.test`). Export it as `SLACK_BOT_USER_ID` and reference it as
522
+ `trackers.slack.bot_user_id`.
523
+ 5. Invite the bot to each channel you want it to watch (`/invite @your-bot`). A bot only sees
524
+ `*:history` for channels it has joined.
525
+ 6. Collect the **channel IDs** (`C...`, from the channel's "About" panel) for those channels and
526
+ list them under `trackers.slack.channels`.
527
+
528
+ Configure it with `kind: slack`:
529
+
530
+ ```yaml
531
+ tracker:
532
+ kind: slack
533
+ trackers:
534
+ slack:
535
+ provider: slack
536
+ channels:
537
+ - C0123456789
538
+ bot_user_id: $SLACK_BOT_USER_ID
539
+ emoji_states:
540
+ eyes: In Progress
541
+ white_check_mark: Done
542
+ x: Cancelled
543
+ active_states:
544
+ - Todo
545
+ - In Progress
546
+ terminal_states:
547
+ - Done
548
+ - Cancelled
549
+ ```
550
+
551
+ `SLACK_BOT_TOKEN` (the bot token), a non-empty `channels` list, and `trackers.slack.bot_user_id`
552
+ (`SLACK_BOT_USER_ID`) are all **required**. The bot user id scopes issue creation to the bot's own
553
+ mentions: only messages that mention that exact user become issues, and only that leading mention
554
+ is stripped from the title. It is required so that ordinary human-to-human `<@U...>` mentions in a
555
+ watched channel never spawn agents or expose their text to workers. If it is unset or resolves
556
+ empty, config validation fails and the production transport fails closed (it scans nothing).
557
+ Channel entries resolve `$VAR` references the same way `bot_user_id` does.
558
+ `trackers.slack.assignee` is rejected for `kind: slack`: messages carry no assignee, so an
559
+ assignee-partitioned deployment would otherwise silently dispatch everything everywhere.
560
+
561
+ The issue identifier is the message reference in `<channel>:<ts>` form (for example
562
+ `C0123456789:1717000000.000100`); that is the `issueId` passed to the write tools. Issues also
563
+ carry a permalink (`{{ issue.url }}`, dashboard links) built from the workspace URL that
564
+ `auth.test` reports, and `slack_read_thread` returns the same permalink for linking the source
565
+ message from commits and PRs.
566
+
567
+ Status is derived from the issue's thread: the bot's own `status: <Name>` replies (posted by
568
+ `slack_update_status`) and human command mentions are ts-ordered events, and the latest wins.
569
+ The human commands are:
570
+
571
+ - `@bot !done` / `@bot !cancel` / `@bot !in progress` / `@bot !todo` - transition to the
572
+ standard state.
573
+ - `@bot !status <Name>` - transition to any configured active/terminal state (custom names
574
+ too).
575
+ - `@bot !reopen` - back to the first active state.
576
+ - Any other `@bot` mention on a terminal issue re-opens it: mentioning the bot again always
577
+ means "this needs attention".
578
+
579
+ Reactions are per-author in Slack (the bot cannot remove a human's reaction and vice versa), so
580
+ they are only the bot's visibility mirror, controlled by `emoji_states` (`:eyes:` ->
581
+ `In Progress`, `:white_check_mark:` -> `Done`, `:x:` -> `Cancelled` by default). Threads that
582
+ have never seen a status event fall back to the reaction-derived reading, so reaction-managed
583
+ threads keep working. Two optional keys tune tracking: `marker_emoji` (default `robot_face`) is
584
+ the reaction the bot drops on a reply-tracked thread's root, and `reply_lookback_days` (default
585
+ `2`) bounds how far back untracked threads are inspected for new reply-mention requests.
586
+
587
+ Agent tools for `kind: slack`, served by the `slack` tool pack (mounted by default alongside the
588
+ provider-neutral `tracker` pack):
589
+
590
+ - `slack_update_status` - set the issue's status by posting the bot's authoritative `status:`
591
+ thread reply, then mirror the bot's reaction (args: `issueId`, `status` - any configured
592
+ active/terminal state name).
593
+ - `slack_comment` - post a threaded reply on the source message as a comment (args: `issueId`,
594
+ `body`).
595
+ - `slack_read_thread` - read the issue's authoritative state: thread-derived status, source
596
+ message, request reply (for thread-tracked issues), reactions, permalink, and all replies
597
+ (args: `issueId`). Use it to re-read state, catch new human replies/commands, and recover
598
+ prior progress notes on a continuation turn.
599
+ - `slack_query` - read-only query over the tracked issues in the watched channels (bot-mention
600
+ roots plus bot-marked threads), with thread-derived state: filter with the shared JSON
601
+ predicate DSL, project fields, order, and page; `expand` adds `thread` and `reactions` (args:
602
+ `channels?`, `where?`, `select?`, `expand?`, `order_by?`, `limit?`, `offset?`).
603
+ - `slack_user_info` - resolve a `U...` user id to its profile: name, real name, display name,
604
+ bot flag (args: `userId`).
605
+ - `slack_channel_context` - read the channel conversation around a tracked issue's source
606
+ message, ascending (args: `issueId`, `before?` default 10 max 50, `after?` default 10 max 50).
607
+
608
+ There is no `slack_create_issue`, and the neutral `tracker_create_issue` reports itself as
609
+ unavailable on Slack: issues are created by humans @-mentioning the bot, not by the agent.
610
+
611
+ Routing note: Slack issues carry only hashtag-derived labels (a `#tag` in the message text
612
+ becomes the label `tag`); they are not otherwise routed or assigned. Dispatch treats a label as a
613
+ route only when it starts with `route_label_prefix`, so the Slack workflow sets
614
+ `route_label_prefix: route-`. Tag a message `#route-<name>` to route it: `#route-backend` becomes
615
+ the label `route-backend`, which dispatch resolves to the route `backend` (set `only_routes`
616
+ accordingly). Plain hashtags such as `#backend` stay non-route labels; with the default
617
+ `accept_unrouted: true` all Slack mentions are still picked up.
618
+
619
+ ## Workflow Prompt
620
+
621
+ The prompt body can read these public issue and run fields:
622
+
623
+ - `{{ issue.identifier }}`
624
+ - `{{ issue.title }}`
625
+ - `{{ issue.description }}`
626
+ - `{{ issue.state }}`
627
+ - `{{ issue.state_type }}`
628
+ - `{{ issue.labels }}`
629
+ - `{{ issue.url }}`
630
+ - `{{ issue.id }}`
631
+ - `{{ issue.priority }}`
632
+ - `{{ issue.branch_name }}`
633
+ - `{{ issue.assignee_id }}`
634
+ - `{{ issue.created_at }}`
635
+ - `{{ issue.updated_at }}`
636
+ - `{{ issue.assigned_to_worker }}`
637
+ - `{{ issue.blocked_by }}`
638
+ - `{{ attempt }}`
639
+ - `{{ ensemble.enabled }}`
640
+ - `{{ ensemble.slot_index }}`
641
+ - `{{ ensemble.size }}`
642
+
643
+ Workspace tests render representative Liquid constructs: conditionals, null fallbacks, loops,
644
+ `forloop` metadata, nested blocker refs, and common filters.
645
+
646
+ ## Skills
647
+
648
+ The `.codex/skills/` directory in this repo contains orchestration skills referenced by the example
649
+ workflow files:
650
+
651
+ - `symphony-commit` produces clean, logical commits.
652
+ - `symphony-push` pushes branches and creates or updates PRs.
653
+ - `symphony-pull` merges the latest `origin/main` into a working branch.
654
+ - `symphony-land` monitors and merges approved PRs.
655
+ - `symphony-debug` investigates stuck runs and execution failures.
656
+
657
+ Lorenz overlays skills into each prepared workspace before the agent starts, copying each
658
+ configured directory whole into the agent's skills directory - `.codex/skills/` for Codex,
659
+ `.claude/skills/` for Claude (the active executor chooses). Skills come from two places:
660
+
661
+ - **`agent.skills`** - a list of skill directories you maintain. Each entry is one skill directory
662
+ (e.g. `./.codex/skills/symphony-land`) and is copied to `<skills>/<directory-name>`. Relative
663
+ paths resolve from the workflow file directory.
664
+ - **Tool packs** - a mounted tool pack can bundle the skill that documents it, so the skill ships
665
+ automatically when the tool is in use. The Linear pack bundles `symphony-linear` (raw Linear
666
+ access via the injected `linear_graphql` tool for Codex or the `/mcp` endpoint for Claude), so
667
+ enabling Linear tools overlays that skill without listing it under `agent.skills`.
668
+
669
+ ## Observability
670
+
671
+ The terminal dashboard shows agents, throughput, runtime, token usage, rate limits, running
672
+ sessions, retry queue, and dispatch blocks. The web dashboard exposes the same runtime snapshot
673
+ through a local HTTP server.
674
+
675
+ Start the web dashboard with `--port` or `server.port`:
676
+
677
+ ```sh
678
+ pnpm start -- WORKFLOW.md --port 4000
679
+ ```
680
+
681
+ API routes:
682
+
683
+ - `/`
684
+ - `/api/v1/state`
685
+ - `/api/v1/runs`
686
+ - `/api/v1/runs?id=<run-id>`
687
+ - `/api/v1/refresh`
688
+ - `/api/v1/:issue_identifier`
689
+
690
+ Live updates (ops state and trace events) stream over the `/ws` WebSocket endpoint.
691
+
692
+ Claude sessions use `/mcp` for injected dynamic tools when the runtime has started an
693
+ observability server. The server also starts automatically for Claude workflows so the ACP bridge
694
+ can reach those tools.
695
+
696
+ `lorenz runs` queries the same API for run history, cost summaries, retry summaries, and raw
697
+ JSON output.
698
+
699
+ ## Testing
700
+
701
+ ```sh
702
+ mise run tidy
703
+ mise run check
704
+ ```
705
+
706
+ `mise run tidy` formats and applies lint fixes. `mise run check` runs typecheck, build, tests, and
707
+ lint.
708
+
709
+ Useful direct commands:
710
+
711
+ ```sh
712
+ pnpm typecheck
713
+ pnpm build
714
+ pnpm lint
715
+ pnpm test
716
+ pnpm test:watch
717
+ ```
718
+
719
+ When running Vitest directly, rebuild first so tests exercise the current compiled packages.
720
+
721
+ ## Live Tests
722
+
723
+ Live tests are opt-in and launch real CLIs or services in isolated workspaces.
724
+
725
+ ```sh
726
+ pnpm test:live:codex
727
+ pnpm test:live:linear-codex
728
+ pnpm test:live:claude
729
+ pnpm test:live:ssh
730
+ pnpm test:live:linear-sandbox
731
+ ```
732
+
733
+ `pnpm test:live` runs the Codex, Linear plus Codex, and Claude live tests.
734
+
735
+ Environment knobs:
736
+
737
+ - `SYMPHONY_TS_CODEX_ACP_COMMAND` overrides the Codex ACP bridge command for live tests.
738
+ - `SYMPHONY_TS_CLAUDE_ACP_BRIDGE_COMMAND` enables Claude live tests.
739
+ - `SYMPHONY_TS_CLAUDE_ACP_BRIDGE_ARGS` supplies Claude ACP bridge args as a JSON string array.
740
+ - `LINEAR_API_KEY` is required for Linear live tests and MCP canaries.
741
+ - `LINEAR_PROJECT_SLUG` selects the Linear project for `pnpm test:live:linear-codex`.
742
+ - `SYMPHONY_LIVE_SSH_WORKER_HOSTS` is a comma-separated list of real SSH workers.
743
+ - When `SYMPHONY_LIVE_SSH_WORKER_HOSTS` is unset, the SSH live test can use disposable local
744
+ workers if Docker, `ssh-keygen`, and Codex auth are available.
745
+ - `SYMPHONY_LIVE_DOCKER_CODEX_AUTH_JSON` points disposable workers at a Codex auth file. The
746
+ default is `~/.codex/auth.json`.
747
+ - `CLAUDE_CODE_OAUTH_TOKEN` or `SYMPHONY_LIVE_DOCKER_CLAUDE_CODE_OAUTH_TOKEN` lets disposable
748
+ workers run the remote Claude canary.
749
+ - `SYMPHONY_TS_REQUIRE_REMOTE_CLAUDE=1` makes the remote Claude canary mandatory in the SSH live
750
+ test.
751
+
752
+ ## Packaging
753
+
754
+ ```sh
755
+ pnpm build
756
+ pnpm --filter @lorenz/cli pack --dry-run
757
+ ```
758
+
759
+ The CLI package includes the built binary. Workspace documentation, workflow fixtures, and test
760
+ evidence stay at the workspace root.
761
+
762
+ ## Compatibility Contracts
763
+
764
+ The checked-in workflow files are executable fixtures:
765
+
766
+ - `WORKFLOW.md`
767
+ - `WORKFLOW_FULL_ACCESS.md`
768
+
769
+ `pnpm test` guards workflow docs, prompt rendering, dashboard snapshots, runtime behavior, and CLI
770
+ documentation. Update the fixture and the matching test together when the public contract changes.
771
+
772
+ ## License
773
+
774
+ This project is licensed under the [Apache License 2.0](../LICENSE).