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,41 @@
1
+ import type { Settings } from "@lorenz/domain";
2
+ import type { SlackMessage, SlackTransport } from "./transport.js";
3
+ /**
4
+ * The configured bot user id, or a clear configuration error. Every agent-facing read and
5
+ * write requires it: without one the mention matcher would fall back to matching ANY user
6
+ * mention, so the tools fail closed instead of operating on (or revealing) untracked messages.
7
+ */
8
+ export declare function requireBotUserId(settings: Settings): string;
9
+ /**
10
+ * Enforce the agent trust boundary: the issueId must reference a configured (watched) channel
11
+ * and an existing message that is tracked - the root mentions the bot, the bot has marked it
12
+ * (its own reaction), or a thread reply mentions the bot. Throws with a caller-facing message
13
+ * otherwise.
14
+ */
15
+ export declare function requireTrackedMessage(settings: Settings, transport: SlackTransport, channel: string, ts: string): Promise<SlackMessage>;
16
+ /** Outcome of a status transition; `root` is the tracked root fetched for the trust check. */
17
+ export type SlackStatusUpdateOutcome = {
18
+ ok: true;
19
+ status: string;
20
+ root: SlackMessage;
21
+ } | {
22
+ ok: false;
23
+ message: string;
24
+ };
25
+ /**
26
+ * Set a Slack issue's status by posting the bot's authoritative `status: <Name>` thread reply.
27
+ *
28
+ * The thread is the source of truth (see threadState.ts): the posted reply is ts-ordered
29
+ * against human commands and is acknowledged by Slack, so there is nothing to roll back or
30
+ * verify. The bot then mirrors the state onto its OWN reactions best-effort for glanceability -
31
+ * reactions are per-author in Slack, so the mirror never touches (and never depends on
32
+ * removing) anyone else's reactions, and mirror failures never fail the transition.
33
+ */
34
+ export declare function updateSlackStatus(settings: Settings, transport: SlackTransport, channel: string, ts: string, status: string): Promise<SlackStatusUpdateOutcome>;
35
+ /**
36
+ * Best-effort visibility mirror: add the bot's reaction for the new state (when one is mapped)
37
+ * and drop the bot's own other managed reactions. `reactions.remove` only removes the caller's
38
+ * own reaction, so human-authored reactions are untouched by construction.
39
+ */
40
+ export declare function mirrorStatusReaction(settings: Settings, transport: SlackTransport, channel: string, ts: string, state: string): Promise<void>;
41
+ //# sourceMappingURL=operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAK/C,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEnE;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAQ3D;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,YAAY,CAAC,CAoBvB;AAED,8FAA8F;AAC9F,MAAM,MAAM,wBAAwB,GAChC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GAChD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,wBAAwB,CAAC,CAgBnC;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAmBf"}
@@ -0,0 +1,97 @@
1
+ import { emojiForState, isBotMention, statusEmojiMap } from "./mapping.js";
2
+ import { slackTrackerOptions } from "./options.js";
3
+ import { BOT_STATUS_PREFIX, resolveStateName } from "./threadState.js";
4
+ /**
5
+ * The configured bot user id, or a clear configuration error. Every agent-facing read and
6
+ * write requires it: without one the mention matcher would fall back to matching ANY user
7
+ * mention, so the tools fail closed instead of operating on (or revealing) untracked messages.
8
+ */
9
+ export function requireBotUserId(settings) {
10
+ const { botUserId } = slackTrackerOptions(settings);
11
+ if (!botUserId || botUserId.trim() === "") {
12
+ throw new Error("slack tools are unavailable: tracker.bot_user_id (or SLACK_BOT_USER_ID) is not configured");
13
+ }
14
+ return botUserId;
15
+ }
16
+ /**
17
+ * Enforce the agent trust boundary: the issueId must reference a configured (watched) channel
18
+ * and an existing message that is tracked - the root mentions the bot, the bot has marked it
19
+ * (its own reaction), or a thread reply mentions the bot. Throws with a caller-facing message
20
+ * otherwise.
21
+ */
22
+ export async function requireTrackedMessage(settings, transport, channel, ts) {
23
+ const { channels } = slackTrackerOptions(settings);
24
+ const botUserId = requireBotUserId(settings);
25
+ if (!channels.includes(channel)) {
26
+ throw new Error(`channel '${channel}' is not a configured tracker channel`);
27
+ }
28
+ const message = await transport.getMessage(channel, ts);
29
+ if (!message) {
30
+ throw new Error(`no tracked issue at ${channel}:${ts}`);
31
+ }
32
+ if (isBotMention(message.text, botUserId) || message.botReacted === true) {
33
+ return message;
34
+ }
35
+ // Reply-tracked thread: the request lives in a reply rather than the root. Last resort
36
+ // because it costs a conversations.replies fetch.
37
+ if ((message.replyCount ?? 0) > 0) {
38
+ const replies = await transport.getThread(channel, ts);
39
+ if (replies.some((reply) => isBotMention(reply.text, botUserId)))
40
+ return message;
41
+ }
42
+ throw new Error("message is not a tracked bot-mention issue");
43
+ }
44
+ /**
45
+ * Set a Slack issue's status by posting the bot's authoritative `status: <Name>` thread reply.
46
+ *
47
+ * The thread is the source of truth (see threadState.ts): the posted reply is ts-ordered
48
+ * against human commands and is acknowledged by Slack, so there is nothing to roll back or
49
+ * verify. The bot then mirrors the state onto its OWN reactions best-effort for glanceability -
50
+ * reactions are per-author in Slack, so the mirror never touches (and never depends on
51
+ * removing) anyone else's reactions, and mirror failures never fail the transition.
52
+ */
53
+ export async function updateSlackStatus(settings, transport, channel, ts, status) {
54
+ const canonical = resolveStateName(status, settings);
55
+ if (canonical === null) {
56
+ return {
57
+ ok: false,
58
+ message: `unknown status '${status}': use one of the workflow's active/terminal states ` +
59
+ `(${[...settings.tracker.activeStates, ...settings.tracker.terminalStates].join(", ")})`,
60
+ };
61
+ }
62
+ // Trust-boundary check: the agent-supplied issueId must point at a watched channel and a
63
+ // tracked message before we write into its thread.
64
+ const root = await requireTrackedMessage(settings, transport, channel, ts);
65
+ await transport.postReply(channel, ts, `${BOT_STATUS_PREFIX} ${canonical}`);
66
+ await mirrorStatusReaction(settings, transport, channel, ts, canonical);
67
+ return { ok: true, status: canonical, root };
68
+ }
69
+ /**
70
+ * Best-effort visibility mirror: add the bot's reaction for the new state (when one is mapped)
71
+ * and drop the bot's own other managed reactions. `reactions.remove` only removes the caller's
72
+ * own reaction, so human-authored reactions are untouched by construction.
73
+ */
74
+ export async function mirrorStatusReaction(settings, transport, channel, ts, state) {
75
+ const map = statusEmojiMap(settings);
76
+ const target = emojiForState(state, map);
77
+ const managed = Object.keys(map);
78
+ for (const emoji of managed) {
79
+ if (emoji === target)
80
+ continue;
81
+ try {
82
+ await transport.removeReaction(channel, ts, emoji);
83
+ }
84
+ catch {
85
+ // Mirror only; the thread reply already carries the authoritative state.
86
+ }
87
+ }
88
+ if (target) {
89
+ try {
90
+ await transport.addReaction(channel, ts, target);
91
+ }
92
+ catch {
93
+ // Mirror only; the thread reply already carries the authoritative state.
94
+ }
95
+ }
96
+ }
97
+ //# sourceMappingURL=operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { Settings } from "@lorenz/domain";
2
+ export declare const SLACK_DEFAULT_ENDPOINT = "https://slack.com/api";
3
+ /** Slack-specific keys of the selected tracker bundle, validated by the provider. */
4
+ export interface SlackTrackerOptions {
5
+ /** Slack channel IDs to watch for mentions. */
6
+ channels: string[];
7
+ /**
8
+ * Slack user id of the bot/worker identity (e.g. `"U0123ABCD"`). Only messages that
9
+ * mention this user become candidate issues; the production transport fails closed
10
+ * (matches nothing) when it is unset.
11
+ */
12
+ botUserId?: string | undefined;
13
+ /** Slack emoji-name → workflow-state overrides (merged over the defaults). */
14
+ emojiStates?: Record<string, string> | undefined;
15
+ /** Emoji the bot reacts with to mark a reply-tracked thread root (default `robot_face`). */
16
+ markerEmoji?: string | undefined;
17
+ /**
18
+ * How far back (days) untracked threads are inspected for new reply-mention requests
19
+ * (default 2). Already-tracked threads are recognized by the marker regardless of age.
20
+ */
21
+ replyLookbackDays?: number | undefined;
22
+ }
23
+ /** Typed view over `settings.tracker.options` for the Slack provider. */
24
+ export declare function slackTrackerOptions(settings: Settings): SlackTrackerOptions;
25
+ /** Read an optional non-negative number option; throws when present but malformed. */
26
+ export declare function numberOption(options: Record<string, unknown>, key: string): number | undefined;
27
+ /** The Slack Web API base URL for the configured tracker (trailing slashes stripped). */
28
+ export declare function slackEndpoint(settings: Settings): string;
29
+ export declare function emojiStatesValue(value: unknown): Record<string, string> | undefined;
30
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI/C,eAAO,MAAM,sBAAsB,0BAA0B,CAAC;AAE9D,qFAAqF;AACrF,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACjD,4FAA4F;IAC5F,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAED,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,mBAAmB,CAa3E;AAED,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAO9F;AAED,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAExD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAcnF"}
@@ -0,0 +1,49 @@
1
+ import { isRecord } from "@lorenz/domain";
2
+ import { stringListOption, stringOption } from "@lorenz/tracker-sdk";
3
+ export const SLACK_DEFAULT_ENDPOINT = "https://slack.com/api";
4
+ /** Typed view over `settings.tracker.options` for the Slack provider. */
5
+ export function slackTrackerOptions(settings) {
6
+ const options = settings.tracker.options;
7
+ const botUserId = stringOption(options, "botUserId");
8
+ const emojiStates = emojiStatesValue(options.emojiStates);
9
+ const markerEmoji = stringOption(options, "markerEmoji");
10
+ const replyLookbackDays = numberOption(options, "replyLookbackDays");
11
+ return {
12
+ channels: stringListOption(options, "channels") ?? [],
13
+ ...(botUserId !== undefined ? { botUserId } : {}),
14
+ ...(emojiStates !== undefined ? { emojiStates } : {}),
15
+ ...(markerEmoji !== undefined ? { markerEmoji } : {}),
16
+ ...(replyLookbackDays !== undefined ? { replyLookbackDays } : {}),
17
+ };
18
+ }
19
+ /** Read an optional non-negative number option; throws when present but malformed. */
20
+ export function numberOption(options, key) {
21
+ const value = options[key];
22
+ if (value === undefined || value === null)
23
+ return undefined;
24
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
25
+ throw new Error(`tracker.${key} must be a non-negative number`);
26
+ }
27
+ return value;
28
+ }
29
+ /** The Slack Web API base URL for the configured tracker (trailing slashes stripped). */
30
+ export function slackEndpoint(settings) {
31
+ return (settings.tracker.endpoint || SLACK_DEFAULT_ENDPOINT).replace(/\/+$/, "");
32
+ }
33
+ export function emojiStatesValue(value) {
34
+ if (value === undefined || value === null)
35
+ return undefined;
36
+ if (!isRecord(value)) {
37
+ throw new Error("tracker.emoji_states must be a mapping of emoji name to state name");
38
+ }
39
+ const out = {};
40
+ // Sorted keys: nested option records are hashed in insertion order by the MCP auth scope, so
41
+ // a semantically identical YAML reorder must not change the parsed identity.
42
+ for (const [emoji, state] of Object.entries(value).sort(([a], [b]) => (a < b ? -1 : 1))) {
43
+ if (typeof state !== "string")
44
+ throw new Error(`tracker.emoji_states.${emoji} must be a string`);
45
+ out[emoji] = state;
46
+ }
47
+ return out;
48
+ }
49
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { TrackerProvider } from "@lorenz/tracker-sdk";
2
+ /**
3
+ * Slack tracker: an @-mention of the bot is an issue, the message's thread carries the status
4
+ * (human `@bot` commands and bot `status:` replies, latest wins; reactions are a bot-owned
5
+ * visibility mirror) and the progress discussion. Issues are polled from the watched channels
6
+ * over the Slack Web API.
7
+ */
8
+ export declare const slackTrackerProvider: TrackerProvider;
9
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAkB3D;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,eAwElC,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { rejectUnknownOptions, resolveEnvReference, stringListOption, stringOption, } from "@lorenz/tracker-sdk";
2
+ import { SlackTrackerClient } from "./client.js";
3
+ import { emojiStatesValue, numberOption, SLACK_DEFAULT_ENDPOINT, slackTrackerOptions, } from "./options.js";
4
+ import { slackToolOps } from "./toolOps.js";
5
+ import { SlackWebTransport } from "./webTransport.js";
6
+ /**
7
+ * Slack tracker: an @-mention of the bot is an issue, the message's thread carries the status
8
+ * (human `@bot` commands and bot `status:` replies, latest wins; reactions are a bot-owned
9
+ * visibility mirror) and the progress discussion. Issues are polled from the watched channels
10
+ * over the Slack Web API.
11
+ */
12
+ export const slackTrackerProvider = {
13
+ kind: "slack",
14
+ configAliases: {
15
+ bot_user_id: "botUserId",
16
+ emoji_states: "emojiStates",
17
+ marker_emoji: "markerEmoji",
18
+ reply_lookback_days: "replyLookbackDays",
19
+ },
20
+ envFallbacks: { apiKey: "SLACK_BOT_TOKEN" },
21
+ defaultEndpoint: SLACK_DEFAULT_ENDPOINT,
22
+ parseOptions(options, context) {
23
+ rejectUnknownOptions(options, ["channels", "botUserId", "emojiStates", "markerEmoji", "replyLookbackDays"], "slack");
24
+ // Channel entries resolve `$VAR` references like the documented bot_user_id one line below
25
+ // them; an unresolved reference collapses to empty and is dropped, so an all-empty list
26
+ // fails dispatch validation instead of polling a literal "$SLACK_CHANNEL_ID" forever.
27
+ const channels = stringListOption(options, "channels")
28
+ ?.map((channel) => resolveEnvReference(channel, context.env))
29
+ .filter((channel) => channel !== "");
30
+ const botUserId = context.resolveSecret?.(stringOption(options, "botUserId"), "SLACK_BOT_USER_ID");
31
+ const emojiStates = emojiStatesValue(options.emojiStates);
32
+ const markerEmoji = stringOption(options, "markerEmoji");
33
+ const replyLookbackDays = numberOption(options, "replyLookbackDays");
34
+ return {
35
+ ...(channels !== undefined && channels.length > 0 ? { channels } : {}),
36
+ ...(botUserId !== undefined ? { botUserId } : {}),
37
+ ...(emojiStates !== undefined ? { emojiStates } : {}),
38
+ ...(markerEmoji !== undefined ? { markerEmoji } : {}),
39
+ ...(replyLookbackDays !== undefined ? { replyLookbackDays } : {}),
40
+ };
41
+ },
42
+ validateDispatch(settings) {
43
+ if (!settings.tracker.apiKey) {
44
+ throw new Error("tracker.api_key (or SLACK_BOT_TOKEN) is required for the slack tracker");
45
+ }
46
+ if (settings.tracker.assignee) {
47
+ // Fail fast rather than silently dispatch everything: slack messages carry no assignee
48
+ // concept, so an assignee-partitioned deployment would double-dispatch every mention.
49
+ throw new Error("tracker.assignee is not supported by the slack tracker; remove it (slack issues have " +
50
+ "no assignee to filter on)");
51
+ }
52
+ const { channels, botUserId } = slackTrackerOptions(settings);
53
+ if (channels.length === 0) {
54
+ throw new Error("tracker.channels is required for the slack tracker");
55
+ }
56
+ if (!botUserId || botUserId.trim() === "") {
57
+ throw new Error("tracker.bot_user_id (or SLACK_BOT_USER_ID) is required for the slack tracker so issue " +
58
+ "creation is scoped to the bot's own mentions; without it any human-to-human mention " +
59
+ "in a watched channel would spawn an agent");
60
+ }
61
+ },
62
+ createClient: (settings) => new SlackTrackerClient(settings, new SlackWebTransport(settings)),
63
+ createToolOps: (settings, context) => slackToolOps(settings, context),
64
+ defaultToolPacks: () => ["slack"],
65
+ projectUrl(settings) {
66
+ // slack.com/app_redirect opens the channel in whichever workspace the operator is signed
67
+ // into - the only deterministic deep link available without an API round-trip.
68
+ const channel = slackTrackerOptions(settings).channels[0];
69
+ return channel
70
+ ? `https://slack.com/app_redirect?channel=${encodeURIComponent(channel)}`
71
+ : undefined;
72
+ },
73
+ };
74
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type ToolRegistry } from "@lorenz/tool-sdk";
2
+ import { type TrackerRegistry } from "@lorenz/tracker-sdk";
3
+ /**
4
+ * Register this extension's tracker provider and tool pack. Idempotent; called by the
5
+ * composition root (or a test) against its registries, defaulting to the process-wide ones.
6
+ */
7
+ export declare function registerSlackTracker(registries?: {
8
+ trackers?: TrackerRegistry;
9
+ tools?: ToolRegistry;
10
+ }): void;
11
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAKnF;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,GAAE;IAAE,QAAQ,CAAC,EAAE,eAAe,CAAC;IAAC,KAAK,CAAC,EAAE,YAAY,CAAA;CAAO,GACpE,IAAI,CASN"}
@@ -0,0 +1,19 @@
1
+ import { defaultToolRegistry } from "@lorenz/tool-sdk";
2
+ import { defaultTrackerRegistry } from "@lorenz/tracker-sdk";
3
+ import { slackTrackerProvider } from "./provider.js";
4
+ import { slackToolProvider } from "./tools.js";
5
+ /**
6
+ * Register this extension's tracker provider and tool pack. Idempotent; called by the
7
+ * composition root (or a test) against its registries, defaulting to the process-wide ones.
8
+ */
9
+ export function registerSlackTracker(registries = {}) {
10
+ const trackers = registries.trackers ?? defaultTrackerRegistry;
11
+ const tools = registries.tools ?? defaultToolRegistry;
12
+ if (trackers.get(slackTrackerProvider.kind) === undefined) {
13
+ trackers.register(slackTrackerProvider);
14
+ }
15
+ if (tools.get(slackToolProvider.name) === undefined) {
16
+ tools.register(slackToolProvider);
17
+ }
18
+ }
19
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAqB,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAwB,MAAM,qBAAqB,CAAC;AAEnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,aAAmE,EAAE;IAErE,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,sBAAsB,CAAC;IAC/D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,mBAAmB,CAAC;IACtD,IAAI,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QAC1D,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACpD,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IACpC,CAAC;AACH,CAAC"}
@@ -0,0 +1,52 @@
1
+ import type { Settings } from "@lorenz/domain";
2
+ import type { SlackMessage, SlackThreadReply, SlackTransport } from "./transport.js";
3
+ /**
4
+ * Thread-command state model. Slack reactions are per-author (the bot cannot remove a human's
5
+ * reaction and vice versa), so reactions cannot carry a jointly-edited status. The thread is the
6
+ * shared, ts-ordered medium both sides can write to, so STATUS LIVES IN THE THREAD:
7
+ *
8
+ * - Humans transition status by mentioning the bot with a `!`-prefixed command reply:
9
+ * `@bot !done`, `@bot !cancel`, `@bot !reopen`, `@bot !status <Name>`. The bang keeps
10
+ * transitions unmistakable next to ordinary prompts addressed to the bot.
11
+ * - The bot (agent/runtime) transitions status by posting a `status: <Name>` reply.
12
+ * - A bot-mention reply with NO command re-opens a terminal issue to the default
13
+ * non-terminal state: mentioning the bot again always means "this needs attention".
14
+ * - The latest event by ts wins. Reactions remain a bot-owned visibility mirror and the
15
+ * back-compat source for threads that have never seen a command or bot status reply.
16
+ */
17
+ /** Recognized prefix of the bot's own authoritative status replies. */
18
+ export declare const BOT_STATUS_PREFIX = "status:";
19
+ /**
20
+ * Resolve a state name case-insensitively against the configured states (config casing wins)
21
+ * and the standard names; `null` when unknown.
22
+ */
23
+ export declare function resolveStateName(name: string, settings: Settings): string | null;
24
+ /**
25
+ * Parse a human status command: a reply that STARTS with the bot mention, followed by a
26
+ * `!`-prefixed keyword or `!status <Name>` as the remaining first line. The explicit `!`
27
+ * separates transitions from ordinary prompts: `@bot !done` transitions, while `@bot done`
28
+ * (or any other phrasing) is a bare mention. Anything without the bang is a bare mention.
29
+ */
30
+ export declare function parseStatusCommand(text: string, botUserId: string | undefined, settings: Settings): {
31
+ state: string;
32
+ } | null;
33
+ /** Derived status of one tracked thread plus, for reply-tracked threads, the request reply. */
34
+ export interface ThreadState {
35
+ state: string;
36
+ /** First bot-mention reply when the ROOT does not mention the bot (the actual request). */
37
+ request?: {
38
+ ts: string;
39
+ text: string;
40
+ user?: string | undefined;
41
+ } | undefined;
42
+ }
43
+ /**
44
+ * Fold a thread into its current state. Events (bot `status:` replies and human command
45
+ * mentions) are applied in ts order and the latest wins; with no events at all the state falls
46
+ * back to the reaction-derived reading (back-compat for reaction-managed threads). A trailing
47
+ * bare bot-mention re-opens a terminal state.
48
+ */
49
+ export declare function stateFromThread(root: SlackMessage, replies: SlackThreadReply[], settings: Settings): ThreadState;
50
+ /** Resolve a tracked root's thread state, fetching replies only when the thread changed. */
51
+ export declare function resolveThreadState(settings: Settings, transport: SlackTransport, root: SlackMessage): Promise<ThreadState>;
52
+ //# sourceMappingURL=threadState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threadState.d.ts","sourceRoot":"","sources":["../src/threadState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAU/C,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErF;;;;;;;;;;;;;GAaG;AAEH,uEAAuE;AACvE,eAAO,MAAM,iBAAiB,YAAY,CAAC;AA4B3C;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAShF;AAeD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,QAAQ,EAAE,QAAQ,GACjB;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAoB1B;AAED,+FAA+F;AAC/F,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,2FAA2F;IAC3F,OAAO,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG,SAAS,CAAC;CAC/E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,QAAQ,EAAE,QAAQ,GACjB,WAAW,CAiDb;AAuBD,4FAA4F;AAC5F,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,cAAc,EACzB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,WAAW,CAAC,CAsBtB"}
@@ -0,0 +1,192 @@
1
+ import { defaultStateType } from "@lorenz/issue";
2
+ import { isBotMention, stateFromReactions, statusEmojiMap, stripLeadingMention, } from "./mapping.js";
3
+ import { slackTrackerOptions } from "./options.js";
4
+ /**
5
+ * Thread-command state model. Slack reactions are per-author (the bot cannot remove a human's
6
+ * reaction and vice versa), so reactions cannot carry a jointly-edited status. The thread is the
7
+ * shared, ts-ordered medium both sides can write to, so STATUS LIVES IN THE THREAD:
8
+ *
9
+ * - Humans transition status by mentioning the bot with a `!`-prefixed command reply:
10
+ * `@bot !done`, `@bot !cancel`, `@bot !reopen`, `@bot !status <Name>`. The bang keeps
11
+ * transitions unmistakable next to ordinary prompts addressed to the bot.
12
+ * - The bot (agent/runtime) transitions status by posting a `status: <Name>` reply.
13
+ * - A bot-mention reply with NO command re-opens a terminal issue to the default
14
+ * non-terminal state: mentioning the bot again always means "this needs attention".
15
+ * - The latest event by ts wins. Reactions remain a bot-owned visibility mirror and the
16
+ * back-compat source for threads that have never seen a command or bot status reply.
17
+ */
18
+ /** Recognized prefix of the bot's own authoritative status replies. */
19
+ export const BOT_STATUS_PREFIX = "status:";
20
+ const BOT_STATUS_RE = /^status:\s*(.+?)\s*$/i;
21
+ /** Standard state names recognized even when a workflow does not list them explicitly. */
22
+ const STANDARD_STATES = ["Todo", "In Progress", "Done", "Cancelled"];
23
+ /** Command keywords (the `!`-prefixed reply body after the mention, punctuation-insensitive). */
24
+ const COMMAND_STATES = [
25
+ {
26
+ keywords: ["done", "complete", "completed", "finished"],
27
+ state: (settings) => resolveStateName("Done", settings) ?? "Done",
28
+ },
29
+ {
30
+ keywords: ["cancel", "cancelled", "canceled", "stop"],
31
+ state: (settings) => resolveStateName("Cancelled", settings) ?? "Cancelled",
32
+ },
33
+ { keywords: ["reopen", "rework", "retry"], state: (settings) => reopenState(settings) },
34
+ {
35
+ keywords: ["in progress", "start", "started", "wip"],
36
+ state: (settings) => resolveStateName("In Progress", settings) ?? "In Progress",
37
+ },
38
+ {
39
+ keywords: ["todo", "backlog"],
40
+ state: (settings) => resolveStateName("Todo", settings) ?? "Todo",
41
+ },
42
+ ];
43
+ /**
44
+ * Resolve a state name case-insensitively against the configured states (config casing wins)
45
+ * and the standard names; `null` when unknown.
46
+ */
47
+ export function resolveStateName(name, settings) {
48
+ const target = name.trim().toLowerCase();
49
+ if (target === "")
50
+ return null;
51
+ const pool = [
52
+ ...settings.tracker.activeStates,
53
+ ...settings.tracker.terminalStates,
54
+ ...STANDARD_STATES,
55
+ ];
56
+ return pool.find((state) => state.trim().toLowerCase() === target) ?? null;
57
+ }
58
+ /** The state a bare re-mention re-opens to: the first configured active state. */
59
+ function reopenState(settings) {
60
+ return settings.tracker.activeStates[0] ?? "Todo";
61
+ }
62
+ /** Terminal by configuration, or by the standard category when the name is a standard one. */
63
+ function isTerminalState(state, settings) {
64
+ const target = state.trim().toLowerCase();
65
+ if (settings.tracker.terminalStates.some((s) => s.trim().toLowerCase() === target))
66
+ return true;
67
+ const category = defaultStateType(state);
68
+ return category === "completed" || category === "canceled";
69
+ }
70
+ /**
71
+ * Parse a human status command: a reply that STARTS with the bot mention, followed by a
72
+ * `!`-prefixed keyword or `!status <Name>` as the remaining first line. The explicit `!`
73
+ * separates transitions from ordinary prompts: `@bot !done` transitions, while `@bot done`
74
+ * (or any other phrasing) is a bare mention. Anything without the bang is a bare mention.
75
+ */
76
+ export function parseStatusCommand(text, botUserId, settings) {
77
+ const trimmed = text.trim();
78
+ const stripped = stripLeadingMention(trimmed, botUserId);
79
+ if (stripped === trimmed)
80
+ return null; // the mention is not leading: not a command form
81
+ const firstLine = (stripped.split("\n")[0] ?? "").trim();
82
+ if (!firstLine.startsWith("!"))
83
+ return null; // no bang: an ordinary prompt, not a transition
84
+ const body = firstLine
85
+ .slice(1)
86
+ .trim()
87
+ .replace(/[.!?]+$/, "");
88
+ const explicit = /^status:?\s+(.+)$/i.exec(body);
89
+ if (explicit) {
90
+ const state = resolveStateName(explicit[1], settings);
91
+ return state ? { state } : null;
92
+ }
93
+ const lower = body.toLowerCase();
94
+ for (const command of COMMAND_STATES) {
95
+ if (command.keywords.includes(lower))
96
+ return { state: command.state(settings) };
97
+ }
98
+ return null;
99
+ }
100
+ /**
101
+ * Fold a thread into its current state. Events (bot `status:` replies and human command
102
+ * mentions) are applied in ts order and the latest wins; with no events at all the state falls
103
+ * back to the reaction-derived reading (back-compat for reaction-managed threads). A trailing
104
+ * bare bot-mention re-opens a terminal state.
105
+ */
106
+ export function stateFromThread(root, replies, settings) {
107
+ const { botUserId } = slackTrackerOptions(settings);
108
+ const ordered = [...replies].sort((a, b) => tsValue(a.ts) - tsValue(b.ts));
109
+ const rootIsMention = isBotMention(root.text, botUserId);
110
+ const events = [];
111
+ const bareMentionTs = [];
112
+ let request;
113
+ for (const reply of ordered) {
114
+ if (botUserId !== undefined && reply.user === botUserId) {
115
+ const status = BOT_STATUS_RE.exec(reply.text.trim());
116
+ if (status) {
117
+ const state = resolveStateName(status[1], settings);
118
+ if (state)
119
+ events.push({ ts: reply.ts, state });
120
+ }
121
+ continue;
122
+ }
123
+ if (!isBotMention(reply.text, botUserId))
124
+ continue;
125
+ if (!rootIsMention && request === undefined) {
126
+ // The first mention in a non-mention thread is the request itself, not a transition.
127
+ request = { ts: reply.ts, text: reply.text, user: reply.user };
128
+ continue;
129
+ }
130
+ const command = parseStatusCommand(reply.text, botUserId, settings);
131
+ if (command)
132
+ events.push({ ts: reply.ts, state: command.state });
133
+ else
134
+ bareMentionTs.push(reply.ts);
135
+ }
136
+ let state;
137
+ let lastEventTs;
138
+ const lastEvent = events[events.length - 1];
139
+ if (lastEvent) {
140
+ state = lastEvent.state;
141
+ lastEventTs = tsValue(lastEvent.ts);
142
+ }
143
+ else if (rootIsMention) {
144
+ state = stateFromReactions(root.reactions, statusEmojiMap(settings), settings);
145
+ // Reactions carry no ordering, so any later bare mention may re-open a terminal reading.
146
+ lastEventTs = Number.NEGATIVE_INFINITY;
147
+ }
148
+ else {
149
+ state = "Todo";
150
+ lastEventTs = Number.NEGATIVE_INFINITY;
151
+ }
152
+ if (isTerminalState(state, settings) && bareMentionTs.some((ts) => tsValue(ts) > lastEventTs)) {
153
+ state = reopenState(settings);
154
+ }
155
+ return { state, ...(request !== undefined ? { request } : {}) };
156
+ }
157
+ function tsValue(ts) {
158
+ const value = Number.parseFloat(ts);
159
+ return Number.isFinite(value) ? value : 0;
160
+ }
161
+ /**
162
+ * Cross-call cache: thread state only changes when the thread (or the root's reactions)
163
+ * changes, and `conversations.history` reports `latest_reply`/`reply_count` on every scan, so
164
+ * unchanged threads never pay a `conversations.replies` fetch. Module-level because the tool
165
+ * packs construct a fresh transport per call.
166
+ */
167
+ const threadStateCache = new Map();
168
+ const THREAD_STATE_CACHE_MAX = 5_000;
169
+ /** Resolve a tracked root's thread state, fetching replies only when the thread changed. */
170
+ export async function resolveThreadState(settings, transport, root) {
171
+ const replyCount = root.replyCount ?? 0;
172
+ if (replyCount === 0) {
173
+ return stateFromThread(root, [], settings);
174
+ }
175
+ const key = `${root.channel}:${root.ts}`;
176
+ const latestReply = root.latestReply ?? "";
177
+ const reactionsKey = [...root.reactions].sort().join(",");
178
+ const cached = threadStateCache.get(key);
179
+ if (cached &&
180
+ cached.latestReply === latestReply &&
181
+ cached.replyCount === replyCount &&
182
+ cached.reactionsKey === reactionsKey) {
183
+ return cached.resolved;
184
+ }
185
+ const replies = await transport.getThread(root.channel, root.ts);
186
+ const resolved = stateFromThread(root, replies, settings);
187
+ if (threadStateCache.size >= THREAD_STATE_CACHE_MAX)
188
+ threadStateCache.clear();
189
+ threadStateCache.set(key, { latestReply, replyCount, reactionsKey, resolved });
190
+ return resolved;
191
+ }
192
+ //# sourceMappingURL=threadState.js.map