@stoneforge/smithy 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 (497) hide show
  1. package/LICENSE +13 -0
  2. package/README.md +114 -0
  3. package/dist/api/index.d.ts +7 -0
  4. package/dist/api/index.d.ts.map +1 -0
  5. package/dist/api/index.js +7 -0
  6. package/dist/api/index.js.map +1 -0
  7. package/dist/api/orchestrator-api.d.ts +153 -0
  8. package/dist/api/orchestrator-api.d.ts.map +1 -0
  9. package/dist/api/orchestrator-api.js +374 -0
  10. package/dist/api/orchestrator-api.js.map +1 -0
  11. package/dist/bin/sf.d.ts +3 -0
  12. package/dist/bin/sf.d.ts.map +1 -0
  13. package/dist/bin/sf.js +10 -0
  14. package/dist/bin/sf.js.map +1 -0
  15. package/dist/cli/commands/agent.d.ts +20 -0
  16. package/dist/cli/commands/agent.d.ts.map +1 -0
  17. package/dist/cli/commands/agent.js +861 -0
  18. package/dist/cli/commands/agent.js.map +1 -0
  19. package/dist/cli/commands/daemon.d.ts +14 -0
  20. package/dist/cli/commands/daemon.d.ts.map +1 -0
  21. package/dist/cli/commands/daemon.js +272 -0
  22. package/dist/cli/commands/daemon.js.map +1 -0
  23. package/dist/cli/commands/dispatch.d.ts +9 -0
  24. package/dist/cli/commands/dispatch.d.ts.map +1 -0
  25. package/dist/cli/commands/dispatch.js +128 -0
  26. package/dist/cli/commands/dispatch.js.map +1 -0
  27. package/dist/cli/commands/merge.d.ts +11 -0
  28. package/dist/cli/commands/merge.d.ts.map +1 -0
  29. package/dist/cli/commands/merge.js +246 -0
  30. package/dist/cli/commands/merge.js.map +1 -0
  31. package/dist/cli/commands/pool.d.ts +21 -0
  32. package/dist/cli/commands/pool.d.ts.map +1 -0
  33. package/dist/cli/commands/pool.js +762 -0
  34. package/dist/cli/commands/pool.js.map +1 -0
  35. package/dist/cli/commands/serve.d.ts +54 -0
  36. package/dist/cli/commands/serve.d.ts.map +1 -0
  37. package/dist/cli/commands/serve.js +57 -0
  38. package/dist/cli/commands/serve.js.map +1 -0
  39. package/dist/cli/commands/task.d.ts +36 -0
  40. package/dist/cli/commands/task.d.ts.map +1 -0
  41. package/dist/cli/commands/task.js +889 -0
  42. package/dist/cli/commands/task.js.map +1 -0
  43. package/dist/cli/commands/test-orchestration.d.ts +32 -0
  44. package/dist/cli/commands/test-orchestration.d.ts.map +1 -0
  45. package/dist/cli/commands/test-orchestration.js +392 -0
  46. package/dist/cli/commands/test-orchestration.js.map +1 -0
  47. package/dist/cli/index.d.ts +13 -0
  48. package/dist/cli/index.d.ts.map +1 -0
  49. package/dist/cli/index.js +15 -0
  50. package/dist/cli/index.js.map +1 -0
  51. package/dist/cli/plugin.d.ts +23 -0
  52. package/dist/cli/plugin.d.ts.map +1 -0
  53. package/dist/cli/plugin.js +36 -0
  54. package/dist/cli/plugin.js.map +1 -0
  55. package/dist/git/index.d.ts +10 -0
  56. package/dist/git/index.d.ts.map +1 -0
  57. package/dist/git/index.js +12 -0
  58. package/dist/git/index.js.map +1 -0
  59. package/dist/git/merge.d.ts +79 -0
  60. package/dist/git/merge.d.ts.map +1 -0
  61. package/dist/git/merge.js +254 -0
  62. package/dist/git/merge.js.map +1 -0
  63. package/dist/git/worktree-manager.d.ts +299 -0
  64. package/dist/git/worktree-manager.d.ts.map +1 -0
  65. package/dist/git/worktree-manager.js +744 -0
  66. package/dist/git/worktree-manager.js.map +1 -0
  67. package/dist/index.d.ts +24 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +31 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/prompts/director.md +272 -0
  72. package/dist/prompts/index.d.ts +100 -0
  73. package/dist/prompts/index.d.ts.map +1 -0
  74. package/dist/prompts/index.js +294 -0
  75. package/dist/prompts/index.js.map +1 -0
  76. package/dist/prompts/message-triage.md +50 -0
  77. package/dist/prompts/persistent-worker.md +240 -0
  78. package/dist/prompts/steward-base.md +64 -0
  79. package/dist/prompts/steward-docs.md +118 -0
  80. package/dist/prompts/steward-health.md +39 -0
  81. package/dist/prompts/steward-merge.md +168 -0
  82. package/dist/prompts/steward-ops.md +28 -0
  83. package/dist/prompts/steward-reminder.md +26 -0
  84. package/dist/prompts/worker.md +282 -0
  85. package/dist/providers/claude/headless.d.ts +18 -0
  86. package/dist/providers/claude/headless.d.ts.map +1 -0
  87. package/dist/providers/claude/headless.js +307 -0
  88. package/dist/providers/claude/headless.js.map +1 -0
  89. package/dist/providers/claude/index.d.ts +24 -0
  90. package/dist/providers/claude/index.d.ts.map +1 -0
  91. package/dist/providers/claude/index.js +80 -0
  92. package/dist/providers/claude/index.js.map +1 -0
  93. package/dist/providers/claude/interactive.d.ts +21 -0
  94. package/dist/providers/claude/interactive.d.ts.map +1 -0
  95. package/dist/providers/claude/interactive.js +142 -0
  96. package/dist/providers/claude/interactive.js.map +1 -0
  97. package/dist/providers/codex/event-mapper.d.ts +91 -0
  98. package/dist/providers/codex/event-mapper.d.ts.map +1 -0
  99. package/dist/providers/codex/event-mapper.js +299 -0
  100. package/dist/providers/codex/event-mapper.js.map +1 -0
  101. package/dist/providers/codex/headless.d.ts +20 -0
  102. package/dist/providers/codex/headless.d.ts.map +1 -0
  103. package/dist/providers/codex/headless.js +174 -0
  104. package/dist/providers/codex/headless.js.map +1 -0
  105. package/dist/providers/codex/index.d.ts +30 -0
  106. package/dist/providers/codex/index.d.ts.map +1 -0
  107. package/dist/providers/codex/index.js +55 -0
  108. package/dist/providers/codex/index.js.map +1 -0
  109. package/dist/providers/codex/interactive.d.ts +21 -0
  110. package/dist/providers/codex/interactive.d.ts.map +1 -0
  111. package/dist/providers/codex/interactive.js +141 -0
  112. package/dist/providers/codex/interactive.js.map +1 -0
  113. package/dist/providers/codex/jsonrpc-client.d.ts +52 -0
  114. package/dist/providers/codex/jsonrpc-client.d.ts.map +1 -0
  115. package/dist/providers/codex/jsonrpc-client.js +141 -0
  116. package/dist/providers/codex/jsonrpc-client.js.map +1 -0
  117. package/dist/providers/codex/server-manager.d.ts +100 -0
  118. package/dist/providers/codex/server-manager.d.ts.map +1 -0
  119. package/dist/providers/codex/server-manager.js +153 -0
  120. package/dist/providers/codex/server-manager.js.map +1 -0
  121. package/dist/providers/index.d.ts +15 -0
  122. package/dist/providers/index.d.ts.map +1 -0
  123. package/dist/providers/index.js +19 -0
  124. package/dist/providers/index.js.map +1 -0
  125. package/dist/providers/opencode/async-queue.d.ts +21 -0
  126. package/dist/providers/opencode/async-queue.d.ts.map +1 -0
  127. package/dist/providers/opencode/async-queue.js +51 -0
  128. package/dist/providers/opencode/async-queue.js.map +1 -0
  129. package/dist/providers/opencode/event-mapper.d.ts +132 -0
  130. package/dist/providers/opencode/event-mapper.d.ts.map +1 -0
  131. package/dist/providers/opencode/event-mapper.js +204 -0
  132. package/dist/providers/opencode/event-mapper.js.map +1 -0
  133. package/dist/providers/opencode/headless.d.ts +25 -0
  134. package/dist/providers/opencode/headless.d.ts.map +1 -0
  135. package/dist/providers/opencode/headless.js +190 -0
  136. package/dist/providers/opencode/headless.js.map +1 -0
  137. package/dist/providers/opencode/index.d.ts +33 -0
  138. package/dist/providers/opencode/index.d.ts.map +1 -0
  139. package/dist/providers/opencode/index.js +42 -0
  140. package/dist/providers/opencode/index.js.map +1 -0
  141. package/dist/providers/opencode/interactive.d.ts +21 -0
  142. package/dist/providers/opencode/interactive.d.ts.map +1 -0
  143. package/dist/providers/opencode/interactive.js +135 -0
  144. package/dist/providers/opencode/interactive.js.map +1 -0
  145. package/dist/providers/opencode/server-manager.d.ts +145 -0
  146. package/dist/providers/opencode/server-manager.d.ts.map +1 -0
  147. package/dist/providers/opencode/server-manager.js +163 -0
  148. package/dist/providers/opencode/server-manager.js.map +1 -0
  149. package/dist/providers/registry.d.ts +38 -0
  150. package/dist/providers/registry.d.ts.map +1 -0
  151. package/dist/providers/registry.js +82 -0
  152. package/dist/providers/registry.js.map +1 -0
  153. package/dist/providers/types.d.ts +144 -0
  154. package/dist/providers/types.d.ts.map +1 -0
  155. package/dist/providers/types.js +25 -0
  156. package/dist/providers/types.js.map +1 -0
  157. package/dist/runtime/event-utils.d.ts +8 -0
  158. package/dist/runtime/event-utils.d.ts.map +1 -0
  159. package/dist/runtime/event-utils.js +23 -0
  160. package/dist/runtime/event-utils.js.map +1 -0
  161. package/dist/runtime/handoff.d.ts +195 -0
  162. package/dist/runtime/handoff.d.ts.map +1 -0
  163. package/dist/runtime/handoff.js +332 -0
  164. package/dist/runtime/handoff.js.map +1 -0
  165. package/dist/runtime/index.d.ts +17 -0
  166. package/dist/runtime/index.d.ts.map +1 -0
  167. package/dist/runtime/index.js +60 -0
  168. package/dist/runtime/index.js.map +1 -0
  169. package/dist/runtime/message-mapper.d.ts +99 -0
  170. package/dist/runtime/message-mapper.d.ts.map +1 -0
  171. package/dist/runtime/message-mapper.js +202 -0
  172. package/dist/runtime/message-mapper.js.map +1 -0
  173. package/dist/runtime/predecessor-query.d.ts +212 -0
  174. package/dist/runtime/predecessor-query.d.ts.map +1 -0
  175. package/dist/runtime/predecessor-query.js +283 -0
  176. package/dist/runtime/predecessor-query.js.map +1 -0
  177. package/dist/runtime/session-manager.d.ts +466 -0
  178. package/dist/runtime/session-manager.d.ts.map +1 -0
  179. package/dist/runtime/session-manager.js +986 -0
  180. package/dist/runtime/session-manager.js.map +1 -0
  181. package/dist/runtime/spawner.d.ts +407 -0
  182. package/dist/runtime/spawner.d.ts.map +1 -0
  183. package/dist/runtime/spawner.js +781 -0
  184. package/dist/runtime/spawner.js.map +1 -0
  185. package/dist/server/config.d.ts +22 -0
  186. package/dist/server/config.d.ts.map +1 -0
  187. package/dist/server/config.js +59 -0
  188. package/dist/server/config.js.map +1 -0
  189. package/dist/server/daemon-state.d.ts +50 -0
  190. package/dist/server/daemon-state.d.ts.map +1 -0
  191. package/dist/server/daemon-state.js +100 -0
  192. package/dist/server/daemon-state.js.map +1 -0
  193. package/dist/server/events-websocket.d.ts +32 -0
  194. package/dist/server/events-websocket.d.ts.map +1 -0
  195. package/dist/server/events-websocket.js +96 -0
  196. package/dist/server/events-websocket.js.map +1 -0
  197. package/dist/server/formatters.d.ts +94 -0
  198. package/dist/server/formatters.d.ts.map +1 -0
  199. package/dist/server/formatters.js +142 -0
  200. package/dist/server/formatters.js.map +1 -0
  201. package/dist/server/index.d.ts +17 -0
  202. package/dist/server/index.d.ts.map +1 -0
  203. package/dist/server/index.js +153 -0
  204. package/dist/server/index.js.map +1 -0
  205. package/dist/server/lsp-websocket.d.ts +33 -0
  206. package/dist/server/lsp-websocket.d.ts.map +1 -0
  207. package/dist/server/lsp-websocket.js +161 -0
  208. package/dist/server/lsp-websocket.js.map +1 -0
  209. package/dist/server/routes/agents.d.ts +9 -0
  210. package/dist/server/routes/agents.d.ts.map +1 -0
  211. package/dist/server/routes/agents.js +369 -0
  212. package/dist/server/routes/agents.js.map +1 -0
  213. package/dist/server/routes/daemon.d.ts +13 -0
  214. package/dist/server/routes/daemon.d.ts.map +1 -0
  215. package/dist/server/routes/daemon.js +187 -0
  216. package/dist/server/routes/daemon.js.map +1 -0
  217. package/dist/server/routes/events.d.ts +23 -0
  218. package/dist/server/routes/events.d.ts.map +1 -0
  219. package/dist/server/routes/events.js +282 -0
  220. package/dist/server/routes/events.js.map +1 -0
  221. package/dist/server/routes/extensions.d.ts +9 -0
  222. package/dist/server/routes/extensions.d.ts.map +1 -0
  223. package/dist/server/routes/extensions.js +202 -0
  224. package/dist/server/routes/extensions.js.map +1 -0
  225. package/dist/server/routes/health.d.ts +7 -0
  226. package/dist/server/routes/health.d.ts.map +1 -0
  227. package/dist/server/routes/health.js +33 -0
  228. package/dist/server/routes/health.js.map +1 -0
  229. package/dist/server/routes/index.d.ts +21 -0
  230. package/dist/server/routes/index.d.ts.map +1 -0
  231. package/dist/server/routes/index.js +21 -0
  232. package/dist/server/routes/index.js.map +1 -0
  233. package/dist/server/routes/lsp.d.ts +9 -0
  234. package/dist/server/routes/lsp.d.ts.map +1 -0
  235. package/dist/server/routes/lsp.js +50 -0
  236. package/dist/server/routes/lsp.js.map +1 -0
  237. package/dist/server/routes/plugins.d.ts +9 -0
  238. package/dist/server/routes/plugins.d.ts.map +1 -0
  239. package/dist/server/routes/plugins.js +109 -0
  240. package/dist/server/routes/plugins.js.map +1 -0
  241. package/dist/server/routes/pools.d.ts +9 -0
  242. package/dist/server/routes/pools.d.ts.map +1 -0
  243. package/dist/server/routes/pools.js +189 -0
  244. package/dist/server/routes/pools.js.map +1 -0
  245. package/dist/server/routes/scheduler.d.ts +9 -0
  246. package/dist/server/routes/scheduler.d.ts.map +1 -0
  247. package/dist/server/routes/scheduler.js +162 -0
  248. package/dist/server/routes/scheduler.js.map +1 -0
  249. package/dist/server/routes/sessions.d.ts +27 -0
  250. package/dist/server/routes/sessions.d.ts.map +1 -0
  251. package/dist/server/routes/sessions.js +773 -0
  252. package/dist/server/routes/sessions.js.map +1 -0
  253. package/dist/server/routes/tasks.d.ts +9 -0
  254. package/dist/server/routes/tasks.d.ts.map +1 -0
  255. package/dist/server/routes/tasks.js +954 -0
  256. package/dist/server/routes/tasks.js.map +1 -0
  257. package/dist/server/routes/upload.d.ts +8 -0
  258. package/dist/server/routes/upload.d.ts.map +1 -0
  259. package/dist/server/routes/upload.js +40 -0
  260. package/dist/server/routes/upload.js.map +1 -0
  261. package/dist/server/routes/workflows.d.ts +9 -0
  262. package/dist/server/routes/workflows.d.ts.map +1 -0
  263. package/dist/server/routes/workflows.js +532 -0
  264. package/dist/server/routes/workflows.js.map +1 -0
  265. package/dist/server/routes/workspace-files.d.ts +12 -0
  266. package/dist/server/routes/workspace-files.d.ts.map +1 -0
  267. package/dist/server/routes/workspace-files.js +520 -0
  268. package/dist/server/routes/workspace-files.js.map +1 -0
  269. package/dist/server/routes/worktrees.d.ts +9 -0
  270. package/dist/server/routes/worktrees.d.ts.map +1 -0
  271. package/dist/server/routes/worktrees.js +94 -0
  272. package/dist/server/routes/worktrees.js.map +1 -0
  273. package/dist/server/server.d.ts +14 -0
  274. package/dist/server/server.d.ts.map +1 -0
  275. package/dist/server/server.js +258 -0
  276. package/dist/server/server.js.map +1 -0
  277. package/dist/server/services/lsp-manager.d.ts +93 -0
  278. package/dist/server/services/lsp-manager.d.ts.map +1 -0
  279. package/dist/server/services/lsp-manager.js +291 -0
  280. package/dist/server/services/lsp-manager.js.map +1 -0
  281. package/dist/server/services/session-messages.d.ts +61 -0
  282. package/dist/server/services/session-messages.d.ts.map +1 -0
  283. package/dist/server/services/session-messages.js +101 -0
  284. package/dist/server/services/session-messages.js.map +1 -0
  285. package/dist/server/services.d.ts +35 -0
  286. package/dist/server/services.d.ts.map +1 -0
  287. package/dist/server/services.js +159 -0
  288. package/dist/server/services.js.map +1 -0
  289. package/dist/server/static.d.ts +18 -0
  290. package/dist/server/static.d.ts.map +1 -0
  291. package/dist/server/static.js +71 -0
  292. package/dist/server/static.js.map +1 -0
  293. package/dist/server/types.d.ts +20 -0
  294. package/dist/server/types.d.ts.map +1 -0
  295. package/dist/server/types.js +7 -0
  296. package/dist/server/types.js.map +1 -0
  297. package/dist/server/websocket.d.ts +16 -0
  298. package/dist/server/websocket.d.ts.map +1 -0
  299. package/dist/server/websocket.js +143 -0
  300. package/dist/server/websocket.js.map +1 -0
  301. package/dist/services/agent-pool-service.d.ts +181 -0
  302. package/dist/services/agent-pool-service.d.ts.map +1 -0
  303. package/dist/services/agent-pool-service.js +590 -0
  304. package/dist/services/agent-pool-service.js.map +1 -0
  305. package/dist/services/agent-registry.d.ts +185 -0
  306. package/dist/services/agent-registry.d.ts.map +1 -0
  307. package/dist/services/agent-registry.js +432 -0
  308. package/dist/services/agent-registry.js.map +1 -0
  309. package/dist/services/dispatch-daemon.d.ts +429 -0
  310. package/dist/services/dispatch-daemon.d.ts.map +1 -0
  311. package/dist/services/dispatch-daemon.js +1833 -0
  312. package/dist/services/dispatch-daemon.js.map +1 -0
  313. package/dist/services/dispatch-service.d.ts +148 -0
  314. package/dist/services/dispatch-service.d.ts.map +1 -0
  315. package/dist/services/dispatch-service.js +170 -0
  316. package/dist/services/dispatch-service.js.map +1 -0
  317. package/dist/services/docs-steward-service.d.ts +199 -0
  318. package/dist/services/docs-steward-service.d.ts.map +1 -0
  319. package/dist/services/docs-steward-service.js +599 -0
  320. package/dist/services/docs-steward-service.js.map +1 -0
  321. package/dist/services/health-steward-service.d.ts +446 -0
  322. package/dist/services/health-steward-service.d.ts.map +1 -0
  323. package/dist/services/health-steward-service.js +866 -0
  324. package/dist/services/health-steward-service.js.map +1 -0
  325. package/dist/services/index.d.ts +26 -0
  326. package/dist/services/index.d.ts.map +1 -0
  327. package/dist/services/index.js +111 -0
  328. package/dist/services/index.js.map +1 -0
  329. package/dist/services/merge-request-provider.d.ts +59 -0
  330. package/dist/services/merge-request-provider.d.ts.map +1 -0
  331. package/dist/services/merge-request-provider.js +89 -0
  332. package/dist/services/merge-request-provider.js.map +1 -0
  333. package/dist/services/merge-steward-service.d.ts +268 -0
  334. package/dist/services/merge-steward-service.d.ts.map +1 -0
  335. package/dist/services/merge-steward-service.js +568 -0
  336. package/dist/services/merge-steward-service.js.map +1 -0
  337. package/dist/services/plugin-executor.d.ts +247 -0
  338. package/dist/services/plugin-executor.d.ts.map +1 -0
  339. package/dist/services/plugin-executor.js +451 -0
  340. package/dist/services/plugin-executor.js.map +1 -0
  341. package/dist/services/role-definition-service.d.ts +117 -0
  342. package/dist/services/role-definition-service.d.ts.map +1 -0
  343. package/dist/services/role-definition-service.js +289 -0
  344. package/dist/services/role-definition-service.js.map +1 -0
  345. package/dist/services/steward-scheduler.d.ts +336 -0
  346. package/dist/services/steward-scheduler.d.ts.map +1 -0
  347. package/dist/services/steward-scheduler.js +732 -0
  348. package/dist/services/steward-scheduler.js.map +1 -0
  349. package/dist/services/task-assignment-service.d.ts +291 -0
  350. package/dist/services/task-assignment-service.d.ts.map +1 -0
  351. package/dist/services/task-assignment-service.js +454 -0
  352. package/dist/services/task-assignment-service.js.map +1 -0
  353. package/dist/services/worker-task-service.d.ts +202 -0
  354. package/dist/services/worker-task-service.d.ts.map +1 -0
  355. package/dist/services/worker-task-service.js +228 -0
  356. package/dist/services/worker-task-service.js.map +1 -0
  357. package/dist/testing/index.d.ts +13 -0
  358. package/dist/testing/index.d.ts.map +1 -0
  359. package/dist/testing/index.js +17 -0
  360. package/dist/testing/index.js.map +1 -0
  361. package/dist/testing/orchestration-tests.d.ts +62 -0
  362. package/dist/testing/orchestration-tests.d.ts.map +1 -0
  363. package/dist/testing/orchestration-tests.js +1115 -0
  364. package/dist/testing/orchestration-tests.js.map +1 -0
  365. package/dist/testing/test-context.d.ts +171 -0
  366. package/dist/testing/test-context.d.ts.map +1 -0
  367. package/dist/testing/test-context.js +665 -0
  368. package/dist/testing/test-context.js.map +1 -0
  369. package/dist/testing/test-prompts.d.ts +46 -0
  370. package/dist/testing/test-prompts.d.ts.map +1 -0
  371. package/dist/testing/test-prompts.js +140 -0
  372. package/dist/testing/test-prompts.js.map +1 -0
  373. package/dist/testing/test-utils.d.ts +200 -0
  374. package/dist/testing/test-utils.d.ts.map +1 -0
  375. package/dist/testing/test-utils.js +378 -0
  376. package/dist/testing/test-utils.js.map +1 -0
  377. package/dist/types/agent-pool.d.ts +215 -0
  378. package/dist/types/agent-pool.d.ts.map +1 -0
  379. package/dist/types/agent-pool.js +143 -0
  380. package/dist/types/agent-pool.js.map +1 -0
  381. package/dist/types/agent.d.ts +265 -0
  382. package/dist/types/agent.d.ts.map +1 -0
  383. package/dist/types/agent.js +127 -0
  384. package/dist/types/agent.js.map +1 -0
  385. package/dist/types/index.d.ts +11 -0
  386. package/dist/types/index.d.ts.map +1 -0
  387. package/dist/types/index.js +40 -0
  388. package/dist/types/index.js.map +1 -0
  389. package/dist/types/message-types.d.ts +294 -0
  390. package/dist/types/message-types.d.ts.map +1 -0
  391. package/dist/types/message-types.js +354 -0
  392. package/dist/types/message-types.js.map +1 -0
  393. package/dist/types/role-definition.d.ts +272 -0
  394. package/dist/types/role-definition.d.ts.map +1 -0
  395. package/dist/types/role-definition.js +144 -0
  396. package/dist/types/role-definition.js.map +1 -0
  397. package/dist/types/task-meta.d.ts +248 -0
  398. package/dist/types/task-meta.d.ts.map +1 -0
  399. package/dist/types/task-meta.js +213 -0
  400. package/dist/types/task-meta.js.map +1 -0
  401. package/package.json +120 -0
  402. package/web/assets/abap-BrgZPUOV.js +6 -0
  403. package/web/assets/apex-DyP6w7ZV.js +6 -0
  404. package/web/assets/azcli-BaLxmfj-.js +6 -0
  405. package/web/assets/bat-CFOPXBzS.js +6 -0
  406. package/web/assets/bicep-BfEKNvv3.js +7 -0
  407. package/web/assets/cameligo-BFG1Mk7z.js +6 -0
  408. package/web/assets/clojure-DTECt2xU.js +6 -0
  409. package/web/assets/codicon-DCmgc-ay.ttf +0 -0
  410. package/web/assets/coffee-CDGzqUPQ.js +6 -0
  411. package/web/assets/cpp-CLLBncYj.js +6 -0
  412. package/web/assets/csharp-dUCx_-0o.js +6 -0
  413. package/web/assets/csp-5Rap-vPy.js +6 -0
  414. package/web/assets/css-D3h14YRZ.js +8 -0
  415. package/web/assets/cssMode-DMo-5YLA.js +9 -0
  416. package/web/assets/cypher-DrQuvNYM.js +6 -0
  417. package/web/assets/dart-CFKIUWau.js +6 -0
  418. package/web/assets/dockerfile-Zznr-cwX.js +6 -0
  419. package/web/assets/ecl-Ce3n6wWz.js +6 -0
  420. package/web/assets/elixir-deUWdS0T.js +6 -0
  421. package/web/assets/flow9-i9-g7ZhI.js +6 -0
  422. package/web/assets/freemarker2-D4qgkQzN.js +8 -0
  423. package/web/assets/fsharp-CzKuDChf.js +6 -0
  424. package/web/assets/go-Cphgjts3.js +6 -0
  425. package/web/assets/graphql-Cg7bfA9N.js +6 -0
  426. package/web/assets/handlebars-CXFvNjQC.js +6 -0
  427. package/web/assets/hcl-0cvrggvQ.js +6 -0
  428. package/web/assets/html-oyuB_D-B.js +6 -0
  429. package/web/assets/htmlMode-iWuZ24-r.js +9 -0
  430. package/web/assets/index-DqP-_E4F.css +32 -0
  431. package/web/assets/index-R1cylSgw.js +1665 -0
  432. package/web/assets/ini-Drc7WvVn.js +6 -0
  433. package/web/assets/java-B_fMsGYe.js +6 -0
  434. package/web/assets/javascript-CRIkN2Pg.js +6 -0
  435. package/web/assets/jsonMode-DVDkDgex.js +15 -0
  436. package/web/assets/julia-Bqgm2twL.js +6 -0
  437. package/web/assets/kotlin-BSkB5QuD.js +6 -0
  438. package/web/assets/less-BsTHnhdd.js +7 -0
  439. package/web/assets/lexon-YWi4-JPR.js +6 -0
  440. package/web/assets/liquid-CSfldbB5.js +6 -0
  441. package/web/assets/lua-nf6ki56Z.js +6 -0
  442. package/web/assets/m3-Cpb6xl2v.js +6 -0
  443. package/web/assets/markdown-DSZPf7rp.js +6 -0
  444. package/web/assets/mdx-Dd58iymR.js +6 -0
  445. package/web/assets/mips-B_c3zf-v.js +6 -0
  446. package/web/assets/monaco-editor-B4lwqA13.js +751 -0
  447. package/web/assets/monaco-editor-CQpyCxOA.css +1 -0
  448. package/web/assets/msdax-rUNN04Wq.js +6 -0
  449. package/web/assets/mysql-DDwshQtU.js +6 -0
  450. package/web/assets/objective-c-B5zXfXm9.js +6 -0
  451. package/web/assets/pascal-CXOwvkN_.js +6 -0
  452. package/web/assets/pascaligo-Bc-ZgV77.js +6 -0
  453. package/web/assets/perl-CwNk8-XU.js +6 -0
  454. package/web/assets/pgsql-tGk8EFnU.js +6 -0
  455. package/web/assets/php-CpIb_Oan.js +6 -0
  456. package/web/assets/pla-B03wrqEc.js +6 -0
  457. package/web/assets/postiats-BKlk5iyT.js +6 -0
  458. package/web/assets/powerquery-Bhzvs7bI.js +6 -0
  459. package/web/assets/powershell-Dd3NCNK9.js +6 -0
  460. package/web/assets/protobuf-COyEY5Pt.js +7 -0
  461. package/web/assets/pug-BaJupSGV.js +6 -0
  462. package/web/assets/python-XWrMqdhO.js +6 -0
  463. package/web/assets/qsharp-DXyYeYxl.js +6 -0
  464. package/web/assets/r-CdQndTaG.js +6 -0
  465. package/web/assets/razor-DPlhCpIs.js +6 -0
  466. package/web/assets/redis-CVwtpugi.js +6 -0
  467. package/web/assets/redshift-25W9uPmb.js +6 -0
  468. package/web/assets/restructuredtext-DfzH4Xui.js +6 -0
  469. package/web/assets/router-vendor-DHlGizSU.js +41 -0
  470. package/web/assets/ruby-Cp1zYvxS.js +6 -0
  471. package/web/assets/rust-D5C2fndG.js +6 -0
  472. package/web/assets/sb-CDntyWJ8.js +6 -0
  473. package/web/assets/scala-BoFRg7Ot.js +6 -0
  474. package/web/assets/scheme-Bio4gycK.js +6 -0
  475. package/web/assets/scss-4Ik7cdeQ.js +8 -0
  476. package/web/assets/shell-CX-rkNHf.js +6 -0
  477. package/web/assets/solidity-Tw7wswEv.js +6 -0
  478. package/web/assets/sophia-C5WLch3f.js +6 -0
  479. package/web/assets/sparql-DHaeiCBh.js +6 -0
  480. package/web/assets/sql-CCSDG5nI.js +6 -0
  481. package/web/assets/st-pnP8ivHi.js +6 -0
  482. package/web/assets/swift-DwJ7jVG9.js +8 -0
  483. package/web/assets/systemverilog-B9Xyijhd.js +6 -0
  484. package/web/assets/tcl-DnHyzjbg.js +6 -0
  485. package/web/assets/tsMode-BbA1Jbf3.js +16 -0
  486. package/web/assets/twig-CPajHgWi.js +6 -0
  487. package/web/assets/typescript-DcLHYzvH.js +6 -0
  488. package/web/assets/typespec-D-MeaMDU.js +6 -0
  489. package/web/assets/ui-vendor-BSco96uv.js +51 -0
  490. package/web/assets/utils-vendor-DaJ2Dubl.js +911 -0
  491. package/web/assets/vb-DgyLZaXg.js +6 -0
  492. package/web/assets/wgsl-DYQUnd45.js +303 -0
  493. package/web/assets/xml-xKYS3dO6.js +6 -0
  494. package/web/assets/yaml-CNmlXqzH.js +6 -0
  495. package/web/favicon.ico +0 -0
  496. package/web/index.html +22 -0
  497. package/web/logo.png +0 -0
@@ -0,0 +1,454 @@
1
+ /**
2
+ * Task Assignment Service
3
+ *
4
+ * This service provides task assignment functionality for the orchestration system.
5
+ * It manages the assignment of tasks to agents with orchestrator metadata tracking
6
+ * including branch, worktree, and session associations.
7
+ *
8
+ * Key features:
9
+ * - Assign tasks to agents with orchestrator metadata
10
+ * - Query agent workload (tasks assigned to an agent)
11
+ * - Query unassigned tasks
12
+ * - Query tasks by assignment status
13
+ * - Track branch, worktree, sessionId in task metadata
14
+ *
15
+ * @module
16
+ */
17
+ import { createTimestamp, TaskStatus, ElementType, asElementId } from '@stoneforge/core';
18
+ import { getOrchestratorTaskMeta, setOrchestratorTaskMeta, updateOrchestratorTaskMeta, closeTaskSessionHistory, generateBranchName, generateWorktreePath, createSlugFromTitle, } from '../types/index.js';
19
+ import { isAgentEntity, getAgentMetadata, } from '../api/orchestrator-api.js';
20
+ /**
21
+ * All valid assignment status values
22
+ */
23
+ export const AssignmentStatusValues = [
24
+ 'unassigned',
25
+ 'assigned',
26
+ 'in_progress',
27
+ 'completed',
28
+ 'merged',
29
+ ];
30
+ // ============================================================================
31
+ // Task Assignment Service Implementation
32
+ // ============================================================================
33
+ /**
34
+ * Implementation of the Task Assignment Service.
35
+ *
36
+ * This implementation uses the QuarryAPI for storage operations.
37
+ */
38
+ export class TaskAssignmentServiceImpl {
39
+ api;
40
+ mergeRequestProvider;
41
+ constructor(api, mergeRequestProvider) {
42
+ this.api = api;
43
+ this.mergeRequestProvider = mergeRequestProvider;
44
+ }
45
+ // ----------------------------------------
46
+ // Assignment Operations
47
+ // ----------------------------------------
48
+ async assignToAgent(taskId, agentId, options) {
49
+ // Get and validate the task
50
+ const task = await this.api.get(taskId);
51
+ if (!task || task.type !== ElementType.TASK) {
52
+ throw new Error(`Task not found: ${taskId}`);
53
+ }
54
+ // Note: Previously there was a guard against reassignment here, but
55
+ // the dispatch service needs to support task reassignment. The dispatch
56
+ // layer is responsible for determining when reassignment is appropriate
57
+ // (e.g., for handoffs). Callers who want to prevent reassignment should
58
+ // check task.assignee before calling assignToAgent.
59
+ // Get and validate the agent
60
+ const agent = await this.api.get(asElementId(agentId));
61
+ if (!agent || agent.type !== ElementType.ENTITY || !isAgentEntity(agent)) {
62
+ throw new Error(`Agent not found: ${agentId}`);
63
+ }
64
+ // Generate branch and worktree names if not provided
65
+ const slug = createSlugFromTitle(task.title);
66
+ const branch = options?.branch ?? generateBranchName(agent.name, taskId, slug);
67
+ const worktree = options?.worktree ?? generateWorktreePath(agent.name, slug);
68
+ // Update task assignee
69
+ await this.api.update(taskId, { assignee: agentId });
70
+ // Get existing orchestrator metadata to preserve handoff history
71
+ const existingMeta = getOrchestratorTaskMeta(task.metadata);
72
+ // Build new orchestrator metadata, preserving handoff context if this is a reassignment
73
+ const orchestratorMeta = {
74
+ assignedAgent: agentId,
75
+ branch: options?.branch ?? existingMeta?.handoffBranch ?? branch,
76
+ worktree: options?.worktree ?? existingMeta?.handoffWorktree ?? worktree,
77
+ sessionId: options?.sessionId,
78
+ mergeStatus: 'pending',
79
+ // Preserve handoff history from previous assignments
80
+ handoffHistory: existingMeta?.handoffHistory,
81
+ };
82
+ // If marking as started, add start time
83
+ if (options?.markAsStarted) {
84
+ orchestratorMeta.startedAt = createTimestamp();
85
+ }
86
+ const currentMeta = task.metadata;
87
+ const newMetadata = setOrchestratorTaskMeta(currentMeta, orchestratorMeta);
88
+ // Update status to active if marking as started
89
+ const updates = { metadata: newMetadata };
90
+ if (options?.markAsStarted) {
91
+ updates.status = TaskStatus.IN_PROGRESS;
92
+ }
93
+ return this.api.update(taskId, updates);
94
+ }
95
+ async unassignTask(taskId) {
96
+ const task = await this.api.get(taskId);
97
+ if (!task || task.type !== ElementType.TASK) {
98
+ throw new Error(`Task not found: ${taskId}`);
99
+ }
100
+ // Clear assignee
101
+ await this.api.update(taskId, { assignee: undefined });
102
+ // Update orchestrator metadata - preserve branch info but clear agent-specific data
103
+ const currentMeta = getOrchestratorTaskMeta(task.metadata);
104
+ if (currentMeta) {
105
+ const newMeta = updateOrchestratorTaskMeta(task.metadata, {
106
+ assignedAgent: undefined,
107
+ sessionId: undefined,
108
+ worktree: undefined,
109
+ startedAt: undefined,
110
+ });
111
+ return this.api.update(taskId, { metadata: newMeta });
112
+ }
113
+ return this.api.get(taskId);
114
+ }
115
+ async startTask(taskId, sessionId) {
116
+ const task = await this.api.get(taskId);
117
+ if (!task || task.type !== ElementType.TASK) {
118
+ throw new Error(`Task not found: ${taskId}`);
119
+ }
120
+ const updates = {
121
+ startedAt: createTimestamp(),
122
+ };
123
+ if (sessionId) {
124
+ updates.sessionId = sessionId;
125
+ }
126
+ const newMeta = updateOrchestratorTaskMeta(task.metadata, updates);
127
+ return this.api.update(taskId, {
128
+ status: TaskStatus.IN_PROGRESS,
129
+ metadata: newMeta,
130
+ });
131
+ }
132
+ async completeTask(taskId, options) {
133
+ const task = await this.api.get(taskId);
134
+ if (!task || task.type !== ElementType.TASK) {
135
+ throw new Error(`Task not found: ${taskId}`);
136
+ }
137
+ if (task.status === TaskStatus.CLOSED || task.status === TaskStatus.REVIEW) {
138
+ throw new Error(`Cannot complete task ${taskId}: task is already in '${task.status}' status`);
139
+ }
140
+ const currentMeta = getOrchestratorTaskMeta(task.metadata);
141
+ const branch = currentMeta?.branch;
142
+ const currentSessionId = currentMeta?.sessionId;
143
+ // Close the current session's history entry
144
+ let metadataWithClosedSession = task.metadata;
145
+ if (currentSessionId) {
146
+ metadataWithClosedSession = closeTaskSessionHistory(metadataWithClosedSession, currentSessionId, createTimestamp());
147
+ }
148
+ // Build the base metadata updates
149
+ const metaUpdates = {
150
+ completedAt: createTimestamp(),
151
+ mergeStatus: 'pending',
152
+ };
153
+ // Add optional completion info
154
+ if (options?.summary) {
155
+ metaUpdates.completionSummary = options.summary;
156
+ }
157
+ if (options?.commitHash) {
158
+ metaUpdates.lastCommitHash = options.commitHash;
159
+ }
160
+ // PR creation is attempted when a provider is configured and not explicitly disabled
161
+ let mergeRequestUrl;
162
+ let mergeRequestId;
163
+ if (branch && this.mergeRequestProvider && options?.createMergeRequest !== false) {
164
+ const baseBranch = options?.baseBranch || 'main';
165
+ let body = `## Task\n\n**ID:** ${task.id}\n**Title:** ${task.title}\n\n`;
166
+ if (options?.summary) {
167
+ body += `## Summary\n\n${options.summary}\n\n`;
168
+ }
169
+ body += `---\n_Created by Stoneforge Smithy_`;
170
+ const mrResult = await this.mergeRequestProvider.createMergeRequest(task, {
171
+ title: options?.mergeRequestTitle || task.title,
172
+ body: options?.mergeRequestBody || body,
173
+ sourceBranch: branch,
174
+ targetBranch: baseBranch,
175
+ });
176
+ mergeRequestUrl = mrResult.url;
177
+ mergeRequestId = mrResult.id;
178
+ metaUpdates.mergeRequestUrl = mergeRequestUrl;
179
+ metaUpdates.mergeRequestId = mergeRequestId;
180
+ metaUpdates.mergeRequestProvider = this.mergeRequestProvider.name;
181
+ }
182
+ // When no provider is configured, skip PR creation but still complete the task.
183
+ // The merge steward can create PRs later if needed.
184
+ // Apply metadata updates on top of the closed session history
185
+ const newMeta = updateOrchestratorTaskMeta(metadataWithClosedSession, metaUpdates);
186
+ // Set status to REVIEW (not CLOSED) - merge steward will set CLOSED after merge
187
+ // Clear assignee - task is now awaiting merge review, not actively being worked on
188
+ const updatedTask = await this.api.update(taskId, {
189
+ status: TaskStatus.REVIEW,
190
+ assignee: undefined,
191
+ metadata: newMeta,
192
+ });
193
+ return {
194
+ task: updatedTask,
195
+ mergeRequestUrl,
196
+ mergeRequestId,
197
+ };
198
+ }
199
+ async handoffTask(taskId, options) {
200
+ const task = await this.api.get(taskId);
201
+ if (!task || task.type !== ElementType.TASK) {
202
+ throw new Error(`Task not found: ${taskId}`);
203
+ }
204
+ const currentMeta = getOrchestratorTaskMeta(task.metadata);
205
+ const { sessionId, message, branch, worktree } = options;
206
+ // Close the current session's history entry using the sessionId from orchestrator metadata
207
+ // (the options.sessionId is the provider session ID, but we match on internal sessionId)
208
+ const currentSessionId = currentMeta?.sessionId;
209
+ let metadataWithClosedSession = task.metadata;
210
+ if (currentSessionId) {
211
+ metadataWithClosedSession = closeTaskSessionHistory(metadataWithClosedSession, currentSessionId, createTimestamp());
212
+ }
213
+ // Determine the branch and worktree to preserve
214
+ const handoffBranch = branch || currentMeta?.branch;
215
+ const handoffWorktree = worktree || currentMeta?.worktree;
216
+ // Build handoff history (append to existing history)
217
+ const existingHistory = currentMeta?.handoffHistory;
218
+ const handoffEntry = {
219
+ sessionId,
220
+ message,
221
+ branch: handoffBranch,
222
+ worktree: handoffWorktree,
223
+ handoffAt: createTimestamp(),
224
+ };
225
+ const handoffHistory = [...(existingHistory || []), handoffEntry];
226
+ // Append handoff note to the task's description Document
227
+ if (task.descriptionRef && message) {
228
+ try {
229
+ const doc = await this.api.get(asElementId(task.descriptionRef));
230
+ if (doc) {
231
+ const handoffLine = `\n\n[AGENT HANDOFF NOTE]: ${message}`;
232
+ await this.api.update(asElementId(task.descriptionRef), {
233
+ content: doc.content + handoffLine,
234
+ });
235
+ }
236
+ }
237
+ catch {
238
+ // Non-fatal: handoff note is also preserved in handoffHistory
239
+ }
240
+ }
241
+ // Update orchestrator metadata with handoff info
242
+ const metaUpdates = {
243
+ // Clear assignment but preserve branch/worktree for continuation
244
+ assignedAgent: undefined,
245
+ sessionId: undefined,
246
+ startedAt: undefined,
247
+ // Clear mergeStatus so merge steward doesn't pick up the task
248
+ mergeStatus: undefined,
249
+ // Store handoff context
250
+ handoffBranch,
251
+ handoffWorktree,
252
+ lastSessionId: sessionId,
253
+ handoffAt: createTimestamp(),
254
+ handoffHistory,
255
+ };
256
+ // Apply metadata updates on top of the closed session history
257
+ const newMeta = updateOrchestratorTaskMeta(metadataWithClosedSession, metaUpdates);
258
+ // Update task: clear assignee, reset status to OPEN, update metadata
259
+ // Note: We store the handoff note in metadata since tasks use descriptionRef
260
+ // Setting status to OPEN ensures dispatch daemon can pick up the task
261
+ return this.api.update(taskId, {
262
+ assignee: undefined,
263
+ status: TaskStatus.OPEN,
264
+ metadata: newMeta,
265
+ });
266
+ }
267
+ async updateSessionId(taskId, sessionId) {
268
+ const task = await this.api.get(taskId);
269
+ if (!task || task.type !== ElementType.TASK) {
270
+ throw new Error(`Task not found: ${taskId}`);
271
+ }
272
+ const newMeta = updateOrchestratorTaskMeta(task.metadata, { sessionId });
273
+ return this.api.update(taskId, { metadata: newMeta });
274
+ }
275
+ // ----------------------------------------
276
+ // Workload Queries
277
+ // ----------------------------------------
278
+ async getAgentTasks(agentId, filter) {
279
+ return this.listAssignments({
280
+ ...filter,
281
+ agentId,
282
+ });
283
+ }
284
+ async getAgentWorkload(agentId) {
285
+ const tasks = await this.getAgentTasks(agentId);
286
+ const byStatus = {
287
+ open: 0,
288
+ in_progress: 0,
289
+ blocked: 0,
290
+ deferred: 0,
291
+ backlog: 0,
292
+ review: 0,
293
+ closed: 0,
294
+ tombstone: 0,
295
+ };
296
+ let inProgressCount = 0;
297
+ let awaitingMergeCount = 0;
298
+ for (const { task, orchestratorMeta } of tasks) {
299
+ // Count by task status
300
+ byStatus[task.status] = (byStatus[task.status] || 0) + 1;
301
+ // Count in-progress (in_progress with start time)
302
+ if (task.status === TaskStatus.IN_PROGRESS && orchestratorMeta?.startedAt) {
303
+ inProgressCount++;
304
+ }
305
+ // Count awaiting merge (review status with pending merge status)
306
+ if (task.status === TaskStatus.REVIEW) {
307
+ const mergeStatus = orchestratorMeta?.mergeStatus;
308
+ if (!mergeStatus || mergeStatus === 'pending' || mergeStatus === 'testing') {
309
+ awaitingMergeCount++;
310
+ }
311
+ }
312
+ }
313
+ return {
314
+ agentId,
315
+ totalTasks: tasks.length,
316
+ byStatus,
317
+ inProgressCount,
318
+ awaitingMergeCount,
319
+ };
320
+ }
321
+ async agentHasCapacity(agentId) {
322
+ // Get the agent to check their max concurrent tasks
323
+ const agent = await this.api.get(asElementId(agentId));
324
+ if (!agent || !isAgentEntity(agent)) {
325
+ return false;
326
+ }
327
+ const meta = getAgentMetadata(agent);
328
+ const maxConcurrent = meta?.maxConcurrentTasks ?? 1;
329
+ // Count currently active tasks
330
+ const workload = await this.getAgentWorkload(agentId);
331
+ const activeTasks = workload.byStatus.in_progress || 0;
332
+ return activeTasks < maxConcurrent;
333
+ }
334
+ // ----------------------------------------
335
+ // Task Status Queries
336
+ // ----------------------------------------
337
+ async getUnassignedTasks(filter) {
338
+ const assignments = await this.listAssignments({
339
+ ...filter,
340
+ assignmentStatus: 'unassigned',
341
+ });
342
+ return assignments.map((a) => a.task);
343
+ }
344
+ async getTasksByAssignmentStatus(status, filter) {
345
+ return this.listAssignments({
346
+ ...filter,
347
+ assignmentStatus: status,
348
+ });
349
+ }
350
+ async listAssignments(filter) {
351
+ // Build task filter from assignment filter
352
+ const taskFilter = {
353
+ type: 'task',
354
+ };
355
+ if (filter?.taskStatus) {
356
+ taskFilter.status = filter.taskStatus;
357
+ }
358
+ // Push assignee filter to API level when available (M-2)
359
+ if (filter?.agentId !== undefined) {
360
+ taskFilter.assignee = filter.agentId;
361
+ }
362
+ // Get tasks (pre-filtered by assignee at API level when possible)
363
+ const tasks = await this.api.list(taskFilter);
364
+ // Convert to assignments and apply filters
365
+ let assignments = tasks.map((task) => ({
366
+ taskId: task.id,
367
+ task,
368
+ orchestratorMeta: getOrchestratorTaskMeta(task.metadata),
369
+ }));
370
+ // Apply agent filter
371
+ if (filter?.agentId !== undefined) {
372
+ assignments = assignments.filter((a) => {
373
+ // Check both task.assignee and orchestrator metadata
374
+ return (a.task.assignee === filter.agentId ||
375
+ a.orchestratorMeta?.assignedAgent === filter.agentId);
376
+ });
377
+ }
378
+ // Apply assignment status filter
379
+ if (filter?.assignmentStatus !== undefined) {
380
+ const statuses = Array.isArray(filter.assignmentStatus)
381
+ ? filter.assignmentStatus
382
+ : [filter.assignmentStatus];
383
+ assignments = assignments.filter((a) => {
384
+ const assignmentStatus = this.determineAssignmentStatus(a);
385
+ return statuses.includes(assignmentStatus);
386
+ });
387
+ }
388
+ // Apply merge status filter
389
+ if (filter?.mergeStatus !== undefined) {
390
+ const mergeStatuses = Array.isArray(filter.mergeStatus)
391
+ ? filter.mergeStatus
392
+ : [filter.mergeStatus];
393
+ assignments = assignments.filter((a) => {
394
+ const mergeStatus = a.orchestratorMeta?.mergeStatus;
395
+ return mergeStatus !== undefined && mergeStatuses.includes(mergeStatus);
396
+ });
397
+ }
398
+ return assignments;
399
+ }
400
+ async getTasksAwaitingMerge() {
401
+ return this.listAssignments({
402
+ taskStatus: TaskStatus.REVIEW,
403
+ mergeStatus: ['pending', 'testing'],
404
+ });
405
+ }
406
+ // ----------------------------------------
407
+ // Private Helpers
408
+ // ----------------------------------------
409
+ /**
410
+ * Determines the assignment status of a task
411
+ */
412
+ determineAssignmentStatus(assignment) {
413
+ const { task, orchestratorMeta } = assignment;
414
+ // Check status-based assignment states first (regardless of assignee)
415
+ // REVIEW status = task completed, awaiting merge review
416
+ if (task.status === TaskStatus.REVIEW) {
417
+ return 'completed';
418
+ }
419
+ // CLOSED status = either merged or completed
420
+ if (task.status === TaskStatus.CLOSED) {
421
+ const mergeStatus = orchestratorMeta?.mergeStatus;
422
+ if (mergeStatus === 'merged') {
423
+ return 'merged';
424
+ }
425
+ // CLOSED without 'merged' status is still 'completed'
426
+ return 'completed';
427
+ }
428
+ // Check if unassigned (only for tasks not in terminal states)
429
+ const hasAssignment = task.assignee || orchestratorMeta?.assignedAgent;
430
+ if (!hasAssignment) {
431
+ return 'unassigned';
432
+ }
433
+ // Check if actively being worked on
434
+ if (task.status === TaskStatus.IN_PROGRESS && orchestratorMeta?.startedAt) {
435
+ return 'in_progress';
436
+ }
437
+ // Assigned but not started
438
+ return 'assigned';
439
+ }
440
+ }
441
+ // ============================================================================
442
+ // Factory Function
443
+ // ============================================================================
444
+ /**
445
+ * Creates a TaskAssignmentService instance
446
+ *
447
+ * @param api - The QuarryAPI instance
448
+ * @param mergeRequestProvider - Optional provider for creating merge requests.
449
+ * When omitted, merge request creation is silently skipped.
450
+ */
451
+ export function createTaskAssignmentService(api, mergeRequestProvider) {
452
+ return new TaskAssignmentServiceImpl(api, mergeRequestProvider);
453
+ }
454
+ //# sourceMappingURL=task-assignment-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-assignment-service.js","sourceRoot":"","sources":["../../src/services/task-assignment-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAoC,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAM3H,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,0BAA0B,EAC1B,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,aAAa,EACb,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AAqGpC;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,YAAY;IACZ,UAAU;IACV,aAAa;IACb,WAAW;IACX,QAAQ;CACA,CAAC;AA4LX,+EAA+E;AAC/E,yCAAyC;AACzC,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,OAAO,yBAAyB;IACnB,GAAG,CAAY;IACf,oBAAoB,CAAwB;IAE7D,YAAY,GAAc,EAAE,oBAA2C;QACrE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;IACnD,CAAC;IAED,2CAA2C;IAC3C,wBAAwB;IACxB,2CAA2C;IAE3C,KAAK,CAAC,aAAa,CACjB,MAAiB,EACjB,OAAiB,EACjB,OAA2B;QAE3B,4BAA4B;QAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAO,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,oEAAoE;QACpE,wEAAwE;QACxE,wEAAwE;QACxE,wEAAwE;QACxE,oDAAoD;QAEpD,6BAA6B;QAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAc,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,qDAAqD;QACrD,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAC/E,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,oBAAoB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAE7E,uBAAuB;QACvB,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAO,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAE3D,iEAAiE;QACjE,MAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAAC,QAA+C,CAAC,CAAC;QAEnG,wFAAwF;QACxF,MAAM,gBAAgB,GAA4B;YAChD,aAAa,EAAE,OAAO;YACtB,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,aAAa,IAAI,MAAM;YAChE,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,eAAe,IAAI,QAAQ;YACxE,SAAS,EAAE,OAAO,EAAE,SAAS;YAC7B,WAAW,EAAE,SAAwB;YACrC,qDAAqD;YACrD,cAAc,EAAE,YAAY,EAAE,cAAc;SAC7C,CAAC;QAEF,wCAAwC;QACxC,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;YAC3B,gBAAgB,CAAC,SAAS,GAAG,eAAe,EAAE,CAAC;QACjD,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,QAA+C,CAAC;QACzE,MAAM,WAAW,GAAG,uBAAuB,CAAC,WAAW,EAAE,gBAAwC,CAAC,CAAC;QAEnG,gDAAgD;QAChD,MAAM,OAAO,GAAkB,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;QACzD,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;YAC3B,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC;QAC1C,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAO,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAiB;QAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAO,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,iBAAiB;QACjB,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAO,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QAE7D,oFAAoF;QACpF,MAAM,WAAW,GAAG,uBAAuB,CAAC,IAAI,CAAC,QAA+C,CAAC,CAAC;QAClG,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,0BAA0B,CACxC,IAAI,CAAC,QAA+C,EACpD;gBACE,aAAa,EAAE,SAAS;gBACxB,SAAS,EAAE,SAAS;gBACpB,QAAQ,EAAE,SAAS;gBACnB,SAAS,EAAE,SAAS;aACrB,CACF,CAAC;YACF,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAO,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAO,MAAM,CAAkB,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAiB,EAAE,SAAkB;QACnD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAO,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,OAAO,GAAkC;YAC7C,SAAS,EAAE,eAAe,EAAE;SAC7B,CAAC;QACF,IAAI,SAAS,EAAE,CAAC;YACb,OAAkC,CAAC,SAAS,GAAG,SAAS,CAAC;QAC5D,CAAC;QAED,MAAM,OAAO,GAAG,0BAA0B,CACxC,IAAI,CAAC,QAA+C,EACpD,OAAO,CACR,CAAC;QAEF,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAO,MAAM,EAAE;YACnC,MAAM,EAAE,UAAU,CAAC,WAAW;YAC9B,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAiB,EAAE,OAA6B;QACjE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAO,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;YAC3E,MAAM,IAAI,KAAK,CACb,wBAAwB,MAAM,yBAAyB,IAAI,CAAC,MAAM,UAAU,CAC7E,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,uBAAuB,CAAC,IAAI,CAAC,QAA+C,CAAC,CAAC;QAClG,MAAM,MAAM,GAAG,WAAW,EAAE,MAAM,CAAC;QACnC,MAAM,gBAAgB,GAAG,WAAW,EAAE,SAAS,CAAC;QAEhD,4CAA4C;QAC5C,IAAI,yBAAyB,GAAG,IAAI,CAAC,QAA+C,CAAC;QACrF,IAAI,gBAAgB,EAAE,CAAC;YACrB,yBAAyB,GAAG,uBAAuB,CACjD,yBAAyB,EACzB,gBAAgB,EAChB,eAAe,EAAE,CAClB,CAAC;QACJ,CAAC;QAED,kCAAkC;QAClC,MAAM,WAAW,GAA4B;YAC3C,WAAW,EAAE,eAAe,EAAE;YAC9B,WAAW,EAAE,SAAwB;SACtC,CAAC;QAEF,+BAA+B;QAC/B,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;YACrB,WAAW,CAAC,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;QAClD,CAAC;QACD,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;YACxB,WAAW,CAAC,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;QAClD,CAAC;QAED,qFAAqF;QACrF,IAAI,eAAmC,CAAC;QACxC,IAAI,cAAkC,CAAC;QAEvC,IAAI,MAAM,IAAI,IAAI,CAAC,oBAAoB,IAAI,OAAO,EAAE,kBAAkB,KAAK,KAAK,EAAE,CAAC;YACjF,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,MAAM,CAAC;YACjD,IAAI,IAAI,GAAG,sBAAsB,IAAI,CAAC,EAAE,gBAAgB,IAAI,CAAC,KAAK,MAAM,CAAC;YACzE,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;gBACrB,IAAI,IAAI,iBAAiB,OAAO,CAAC,OAAO,MAAM,CAAC;YACjD,CAAC;YACD,IAAI,IAAI,qCAAqC,CAAC;YAE9C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,IAAI,EAAE;gBACxE,KAAK,EAAE,OAAO,EAAE,iBAAiB,IAAI,IAAI,CAAC,KAAK;gBAC/C,IAAI,EAAE,OAAO,EAAE,gBAAgB,IAAI,IAAI;gBACvC,YAAY,EAAE,MAAM;gBACpB,YAAY,EAAE,UAAU;aACzB,CAAC,CAAC;YACH,eAAe,GAAG,QAAQ,CAAC,GAAG,CAAC;YAC/B,cAAc,GAAG,QAAQ,CAAC,EAAE,CAAC;YAC7B,WAAW,CAAC,eAAe,GAAG,eAAe,CAAC;YAC9C,WAAW,CAAC,cAAc,GAAG,cAAc,CAAC;YAC5C,WAAW,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;QACpE,CAAC;QACD,gFAAgF;QAChF,oDAAoD;QAEpD,8DAA8D;QAC9D,MAAM,OAAO,GAAG,0BAA0B,CACxC,yBAAyB,EACzB,WAA4C,CAC7C,CAAC;QAEF,gFAAgF;QAChF,mFAAmF;QACnF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAO,MAAM,EAAE;YACtD,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QAEH,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,eAAe;YACf,cAAc;SACf,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAiB,EAAE,OAA2B;QAC9D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAO,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,WAAW,GAAG,uBAAuB,CAAC,IAAI,CAAC,QAA+C,CAAC,CAAC;QAClG,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QAEzD,2FAA2F;QAC3F,yFAAyF;QACzF,MAAM,gBAAgB,GAAG,WAAW,EAAE,SAAS,CAAC;QAChD,IAAI,yBAAyB,GAAG,IAAI,CAAC,QAA+C,CAAC;QACrF,IAAI,gBAAgB,EAAE,CAAC;YACrB,yBAAyB,GAAG,uBAAuB,CACjD,yBAAyB,EACzB,gBAAgB,EAChB,eAAe,EAAE,CAClB,CAAC;QACJ,CAAC;QAED,gDAAgD;QAChD,MAAM,aAAa,GAAG,MAAM,IAAI,WAAW,EAAE,MAAM,CAAC;QACpD,MAAM,eAAe,GAAG,QAAQ,IAAI,WAAW,EAAE,QAAQ,CAAC;QAE1D,qDAAqD;QACrD,MAAM,eAAe,GAAI,WAAmD,EAAE,cAAmD,CAAC;QAClI,MAAM,YAAY,GAAwB;YACxC,SAAS;YACT,OAAO;YACP,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,eAAe;YACzB,SAAS,EAAE,eAAe,EAAE;SAC7B,CAAC;QACF,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;QAElE,yDAAyD;QACzD,IAAI,IAAI,CAAC,cAAc,IAAI,OAAO,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAW,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAC3E,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,WAAW,GAAG,6BAA6B,OAAO,EAAE,CAAC;oBAC3D,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAW,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE;wBAChE,OAAO,EAAE,GAAG,CAAC,OAAO,GAAG,WAAW;qBACd,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,8DAA8D;YAChE,CAAC;QACH,CAAC;QAED,iDAAiD;QACjD,MAAM,WAAW,GAA4B;YAC3C,iEAAiE;YACjE,aAAa,EAAE,SAAS;YACxB,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,SAAS;YACpB,8DAA8D;YAC9D,WAAW,EAAE,SAAS;YACtB,wBAAwB;YACxB,aAAa;YACb,eAAe;YACf,aAAa,EAAE,SAAS;YACxB,SAAS,EAAE,eAAe,EAAE;YAC5B,cAAc;SACf,CAAC;QAEF,8DAA8D;QAC9D,MAAM,OAAO,GAAG,0BAA0B,CACxC,yBAAyB,EACzB,WAA4C,CAC7C,CAAC;QAEF,qEAAqE;QACrE,6EAA6E;QAC7E,sEAAsE;QACtE,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAO,MAAM,EAAE;YACnC,QAAQ,EAAE,SAAS;YACnB,MAAM,EAAE,UAAU,CAAC,IAAI;YACvB,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAiB,EAAE,SAAiB;QACxD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAO,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,OAAO,GAAG,0BAA0B,CACxC,IAAI,CAAC,QAA+C,EACpD,EAAE,SAAS,EAAE,CACd,CAAC;QAEF,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAO,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,2CAA2C;IAC3C,mBAAmB;IACnB,2CAA2C;IAE3C,KAAK,CAAC,aAAa,CACjB,OAAiB,EACjB,MAA0C;QAE1C,OAAO,IAAI,CAAC,eAAe,CAAC;YAC1B,GAAG,MAAM;YACT,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAAiB;QACtC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAEhD,MAAM,QAAQ,GAAoC;YAChD,IAAI,EAAE,CAAC;YACP,WAAW,EAAE,CAAC;YACd,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,CAAC;SACb,CAAC;QAEF,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,kBAAkB,GAAG,CAAC,CAAC;QAE3B,KAAK,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,KAAK,EAAE,CAAC;YAC/C,uBAAuB;YACvB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAEzD,kDAAkD;YAClD,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,WAAW,IAAI,gBAAgB,EAAE,SAAS,EAAE,CAAC;gBAC1E,eAAe,EAAE,CAAC;YACpB,CAAC;YAED,iEAAiE;YACjE,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;gBACtC,MAAM,WAAW,GAAG,gBAAgB,EAAE,WAAW,CAAC;gBAClD,IAAI,CAAC,WAAW,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;oBAC3E,kBAAkB,EAAE,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO;YACP,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,QAAQ;YACR,eAAe;YACf,kBAAkB;SACnB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAAiB;QACtC,oDAAoD;QACpD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAc,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,IAAI,EAAE,kBAAkB,IAAI,CAAC,CAAC;QAEpD,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,IAAI,CAAC,CAAC;QAEvD,OAAO,WAAW,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,2CAA2C;IAC3C,sBAAsB;IACtB,2CAA2C;IAE3C,KAAK,CAAC,kBAAkB,CACtB,MAA+D;QAE/D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC;YAC7C,GAAG,MAAM;YACT,gBAAgB,EAAE,YAAY;SAC/B,CAAC,CAAC;QACH,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,0BAA0B,CAC9B,MAAwB,EACxB,MAAmD;QAEnD,OAAO,IAAI,CAAC,eAAe,CAAC;YAC1B,GAAG,MAAM;YACT,gBAAgB,EAAE,MAAM;SACzB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAyB;QAC7C,2CAA2C;QAC3C,MAAM,UAAU,GAA8E;YAC5F,IAAI,EAAE,MAAe;SACtB,CAAC;QAEF,IAAI,MAAM,EAAE,UAAU,EAAE,CAAC;YACvB,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;QACxC,CAAC;QAED,yDAAyD;QACzD,IAAI,MAAM,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;YAClC,UAAU,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;QACvC,CAAC;QAED,kEAAkE;QAClE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAO,UAAU,CAAC,CAAC;QAEpD,2CAA2C;QAC3C,IAAI,WAAW,GAAqB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACvD,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,IAAI;YACJ,gBAAgB,EAAE,uBAAuB,CAAC,IAAI,CAAC,QAA+C,CAAC;SAChG,CAAC,CAAC,CAAC;QAEJ,qBAAqB;QACrB,IAAI,MAAM,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;YAClC,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBACrC,qDAAqD;gBACrD,OAAO,CACL,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,OAAO;oBAClC,CAAC,CAAC,gBAAgB,EAAE,aAAa,KAAK,MAAM,CAAC,OAAO,CACrD,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QAED,iCAAiC;QACjC,IAAI,MAAM,EAAE,gBAAgB,KAAK,SAAS,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC;gBACrD,CAAC,CAAC,MAAM,CAAC,gBAAgB;gBACzB,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAE9B,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBACrC,MAAM,gBAAgB,GAAG,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC;gBAC3D,OAAO,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC;QAED,4BAA4B;QAC5B,IAAI,MAAM,EAAE,WAAW,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;gBACrD,CAAC,CAAC,MAAM,CAAC,WAAW;gBACpB,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAEzB,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBACrC,MAAM,WAAW,GAAG,CAAC,CAAC,gBAAgB,EAAE,WAAW,CAAC;gBACpD,OAAO,WAAW,KAAK,SAAS,IAAI,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,qBAAqB;QACzB,OAAO,IAAI,CAAC,eAAe,CAAC;YAC1B,UAAU,EAAE,UAAU,CAAC,MAAM;YAC7B,WAAW,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAED,2CAA2C;IAC3C,kBAAkB;IAClB,2CAA2C;IAE3C;;OAEG;IACK,yBAAyB,CAAC,UAA0B;QAC1D,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,UAAU,CAAC;QAE9C,sEAAsE;QACtE,wDAAwD;QACxD,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,6CAA6C;QAC7C,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,WAAW,GAAG,gBAAgB,EAAE,WAAW,CAAC;YAClD,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;gBAC7B,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,sDAAsD;YACtD,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,8DAA8D;QAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,IAAI,gBAAgB,EAAE,aAAa,CAAC;QACvE,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,oCAAoC;QACpC,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,WAAW,IAAI,gBAAgB,EAAE,SAAS,EAAE,CAAC;YAC1E,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,2BAA2B;QAC3B,OAAO,UAAU,CAAC;IACpB,CAAC;CACF;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,GAAc,EACd,oBAA2C;IAE3C,OAAO,IAAI,yBAAyB,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Worker Task Service
3
+ *
4
+ * This service provides the complete workflow for workers picking up tasks
5
+ * and working in isolated worktrees. It orchestrates:
6
+ * - Task dispatch to worker
7
+ * - Worktree creation for task isolation
8
+ * - Worker spawning in the worktree
9
+ * - Task context delivery to worker
10
+ * - Task completion with branch ready for merge
11
+ *
12
+ * @module
13
+ */
14
+ import type { Task, ElementId, EntityId, Timestamp } from '@stoneforge/core';
15
+ import type { QuarryAPI } from '@stoneforge/quarry';
16
+ import type { AgentEntity } from '../api/orchestrator-api.js';
17
+ import type { TaskAssignmentService } from './task-assignment-service.js';
18
+ import type { AgentRegistry } from './agent-registry.js';
19
+ import type { DispatchService, DispatchResult } from './dispatch-service.js';
20
+ import type { WorktreeManager, CreateWorktreeResult, WorktreeInfo } from '../git/worktree-manager.js';
21
+ import type { SpawnerService } from '../runtime/spawner.js';
22
+ import type { SessionManager, SessionRecord } from '../runtime/session-manager.js';
23
+ /**
24
+ * Options for starting a worker on a task
25
+ */
26
+ export interface StartWorkerOnTaskOptions {
27
+ /** Custom branch name (auto-generated if not provided) */
28
+ branch?: string;
29
+ /** Custom worktree path (auto-generated if not provided) */
30
+ worktreePath?: string;
31
+ /** Base branch to create the worktree from (defaults to default branch) */
32
+ baseBranch?: string;
33
+ /** Additional initial prompt to prepend to task context */
34
+ additionalPrompt?: string;
35
+ /** Entity performing the operation */
36
+ performedBy?: EntityId;
37
+ /** Skip worktree creation (use existing working directory) */
38
+ skipWorktree?: boolean;
39
+ /** Custom working directory (used if skipWorktree is true) */
40
+ workingDirectory?: string;
41
+ /** Dispatch priority for notification */
42
+ priority?: number;
43
+ }
44
+ /**
45
+ * Result of starting a worker on a task
46
+ */
47
+ export interface StartWorkerOnTaskResult {
48
+ /** The task being worked on */
49
+ task: Task;
50
+ /** The worker agent */
51
+ agent: AgentEntity;
52
+ /** The dispatch result (notification sent) */
53
+ dispatch: DispatchResult;
54
+ /** The worktree created (if applicable) */
55
+ worktree?: CreateWorktreeResult;
56
+ /** The session spawned */
57
+ session: SessionRecord;
58
+ /** The task context prompt that was sent */
59
+ taskContextPrompt: string;
60
+ /** Timestamp when the worker started */
61
+ startedAt: Timestamp;
62
+ }
63
+ /**
64
+ * Options for completing a task
65
+ */
66
+ export interface CompleteTaskOptions {
67
+ /** Summary of what was accomplished */
68
+ summary?: string;
69
+ /** Commit hash for the final commit */
70
+ commitHash?: string;
71
+ /** Whether to run tests before marking complete (defaults to false) */
72
+ runTests?: boolean;
73
+ /** Entity performing the completion */
74
+ performedBy?: EntityId;
75
+ }
76
+ /**
77
+ * Result of completing a task
78
+ */
79
+ export interface CompleteTaskResult {
80
+ /** The completed task */
81
+ task: Task;
82
+ /** The worktree info (if applicable) */
83
+ worktree?: WorktreeInfo;
84
+ /** Whether the branch is ready for merge */
85
+ readyForMerge: boolean;
86
+ /** Timestamp when the task was completed */
87
+ completedAt: Timestamp;
88
+ }
89
+ /**
90
+ * Task context information for generating prompts
91
+ */
92
+ export interface TaskContext {
93
+ /** Task ID */
94
+ taskId: ElementId;
95
+ /** Task title */
96
+ title: string;
97
+ /** Task description (from metadata) */
98
+ description?: string;
99
+ /** Task tags */
100
+ tags: string[];
101
+ /** Task priority (enum value) */
102
+ priority?: number;
103
+ /** Task complexity (enum value) */
104
+ complexity?: number;
105
+ /** Branch name */
106
+ branch?: string;
107
+ /** Worktree path */
108
+ worktreePath?: string;
109
+ /** Additional instructions */
110
+ additionalInstructions?: string;
111
+ }
112
+ /**
113
+ * Worker Task Service interface for orchestrating worker task workflow.
114
+ *
115
+ * This service provides the complete lifecycle management for workers:
116
+ * 1. Start worker on a task (dispatch + worktree + spawn)
117
+ * 2. Build task context prompts
118
+ * 3. Complete tasks (close + ready for merge)
119
+ * 4. Clean up after task completion
120
+ */
121
+ export interface WorkerTaskService {
122
+ /**
123
+ * Starts a worker on a task with full worktree isolation.
124
+ *
125
+ * This method performs the complete workflow:
126
+ * 1. Dispatches the task to the worker (assigns + notifies)
127
+ * 2. Creates a worktree for the task (if worktrees enabled)
128
+ * 3. Spawns the worker session in the worktree
129
+ * 4. Sends task context to the worker
130
+ *
131
+ * @param taskId - The task to start
132
+ * @param agentId - The worker agent
133
+ * @param options - Options for starting
134
+ * @returns The complete result
135
+ */
136
+ startWorkerOnTask(taskId: ElementId, agentId: EntityId, options?: StartWorkerOnTaskOptions): Promise<StartWorkerOnTaskResult>;
137
+ /**
138
+ * Completes a task and marks the branch as ready for merge.
139
+ *
140
+ * This method:
141
+ * 1. Marks the task as completed
142
+ * 2. Updates merge status to 'pending' (ready for Merge Steward)
143
+ * 3. Optionally runs tests
144
+ *
145
+ * @param taskId - The task to complete
146
+ * @param options - Completion options
147
+ * @returns The completion result
148
+ */
149
+ completeTask(taskId: ElementId, options?: CompleteTaskOptions): Promise<CompleteTaskResult>;
150
+ /**
151
+ * Builds the task context prompt for a worker.
152
+ *
153
+ * @param taskId - The task
154
+ * @param workerId - The worker entity ID
155
+ * @param additionalInstructions - Additional instructions to include
156
+ * @returns The formatted task context prompt
157
+ */
158
+ buildTaskContextPrompt(taskId: ElementId, workerId: EntityId, additionalInstructions?: string): Promise<string>;
159
+ /**
160
+ * Gets the task context information.
161
+ *
162
+ * @param taskId - The task
163
+ * @returns The task context
164
+ */
165
+ getTaskContext(taskId: ElementId): Promise<TaskContext>;
166
+ /**
167
+ * Cleans up after a task is merged or abandoned.
168
+ *
169
+ * This method:
170
+ * 1. Removes the worktree
171
+ * 2. Optionally deletes the branch
172
+ * 3. Updates task metadata
173
+ *
174
+ * @param taskId - The task to clean up
175
+ * @param deleteBranch - Whether to delete the branch
176
+ * @returns Success status
177
+ */
178
+ cleanupTask(taskId: ElementId, deleteBranch?: boolean): Promise<boolean>;
179
+ }
180
+ /**
181
+ * Implementation of the Worker Task Service.
182
+ */
183
+ export declare class WorkerTaskServiceImpl implements WorkerTaskService {
184
+ private readonly api;
185
+ private readonly taskAssignment;
186
+ private readonly agentRegistry;
187
+ private readonly dispatchService;
188
+ private readonly worktreeManager;
189
+ private readonly _spawnerService;
190
+ private readonly sessionManager;
191
+ constructor(api: QuarryAPI, taskAssignment: TaskAssignmentService, agentRegistry: AgentRegistry, dispatchService: DispatchService, spawnerService: SpawnerService, sessionManager: SessionManager, worktreeManager?: WorktreeManager);
192
+ startWorkerOnTask(taskId: ElementId, agentId: EntityId, options?: StartWorkerOnTaskOptions): Promise<StartWorkerOnTaskResult>;
193
+ completeTask(taskId: ElementId, options?: CompleteTaskOptions): Promise<CompleteTaskResult>;
194
+ buildTaskContextPrompt(taskId: ElementId, workerId: EntityId, additionalInstructions?: string): Promise<string>;
195
+ getTaskContext(taskId: ElementId): Promise<TaskContext>;
196
+ cleanupTask(taskId: ElementId, deleteBranch?: boolean): Promise<boolean>;
197
+ }
198
+ /**
199
+ * Creates a WorkerTaskService instance
200
+ */
201
+ export declare function createWorkerTaskService(api: QuarryAPI, taskAssignment: TaskAssignmentService, agentRegistry: AgentRegistry, dispatchService: DispatchService, spawnerService: SpawnerService, sessionManager: SessionManager, worktreeManager?: WorktreeManager): WorkerTaskService;
202
+ //# sourceMappingURL=worker-task-service.d.ts.map