@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,762 @@
1
+ /**
2
+ * Pool Commands - CLI operations for agent pool management
3
+ *
4
+ * Provides commands for managing agent pools:
5
+ * - pool list: List all agent pools
6
+ * - pool show <id>: Show pool details
7
+ * - pool create <name>: Create a new agent pool
8
+ * - pool update <id>: Update pool configuration
9
+ * - pool delete <id>: Delete a pool
10
+ * - pool status <id>: Show pool status with active agents
11
+ */
12
+ import { success, failure, ExitCode, getFormatter, getOutputMode, OPERATOR_ENTITY_ID } from '@stoneforge/quarry/cli';
13
+ // ============================================================================
14
+ // Shared Helpers
15
+ // ============================================================================
16
+ /**
17
+ * Creates orchestrator API client and pool service
18
+ */
19
+ async function createPoolClient(options) {
20
+ try {
21
+ const { createStorage, initializeSchema, findStoneforgeDir } = await import('@stoneforge/quarry');
22
+ const { createOrchestratorAPI } = await import('../../api/index.js');
23
+ const { createAgentPoolService, createAgentRegistry } = await import('../../services/index.js');
24
+ const { createSpawnerService, createSessionManager } = await import('../../runtime/index.js');
25
+ const stoneforgeDir = findStoneforgeDir(process.cwd());
26
+ if (!stoneforgeDir) {
27
+ return {
28
+ poolService: null,
29
+ error: 'No .stoneforge directory found. Run "sf init" first.',
30
+ };
31
+ }
32
+ const dbPath = options.db ?? `${stoneforgeDir}/stoneforge.db`;
33
+ const backend = createStorage({ path: dbPath, create: true });
34
+ initializeSchema(backend);
35
+ const api = createOrchestratorAPI(backend);
36
+ // Create agent registry
37
+ const agentRegistry = createAgentRegistry(api);
38
+ // Create spawner and session manager
39
+ const spawner = createSpawnerService();
40
+ const sessionManager = createSessionManager(spawner, api, agentRegistry);
41
+ // Create pool service
42
+ const poolService = createAgentPoolService(api, sessionManager, agentRegistry);
43
+ return { poolService };
44
+ }
45
+ catch (err) {
46
+ const message = err instanceof Error ? err.message : String(err);
47
+ return { poolService: null, error: `Failed to initialize pool service: ${message}` };
48
+ }
49
+ }
50
+ /**
51
+ * Parses agent type configuration from CLI string format
52
+ * Format: "role[:workerMode|stewardFocus][:priority][:maxSlots]"
53
+ * Examples:
54
+ * "worker:ephemeral:100:5" - ephemeral workers, priority 100, max 5 slots
55
+ * "worker:persistent:50" - persistent workers, priority 50
56
+ * "steward:merge" - merge stewards
57
+ * "worker" - all workers with default settings
58
+ */
59
+ function parseAgentTypeConfig(configStr) {
60
+ const parts = configStr.split(':');
61
+ if (parts.length === 0)
62
+ return null;
63
+ const role = parts[0];
64
+ if (!['worker', 'steward'].includes(role)) {
65
+ return null;
66
+ }
67
+ // Build config properties
68
+ let workerMode;
69
+ let stewardFocus;
70
+ let priority;
71
+ let maxSlots;
72
+ if (parts.length > 1) {
73
+ if (role === 'worker') {
74
+ if (['ephemeral', 'persistent'].includes(parts[1])) {
75
+ workerMode = parts[1];
76
+ }
77
+ else if (!isNaN(parseInt(parts[1], 10))) {
78
+ // It's a priority number
79
+ priority = parseInt(parts[1], 10);
80
+ }
81
+ }
82
+ else if (role === 'steward') {
83
+ if (['merge', 'health', 'reminder', 'ops', 'docs'].includes(parts[1])) {
84
+ stewardFocus = parts[1];
85
+ }
86
+ else if (!isNaN(parseInt(parts[1], 10))) {
87
+ priority = parseInt(parts[1], 10);
88
+ }
89
+ }
90
+ }
91
+ if (parts.length > 2) {
92
+ const maybeNum = parseInt(parts[2], 10);
93
+ if (!isNaN(maybeNum)) {
94
+ priority = maybeNum;
95
+ }
96
+ }
97
+ if (parts.length > 3) {
98
+ const maybeSlots = parseInt(parts[3], 10);
99
+ if (!isNaN(maybeSlots)) {
100
+ maxSlots = maybeSlots;
101
+ }
102
+ }
103
+ // Build the config object with all properties upfront
104
+ const config = {
105
+ role: role,
106
+ ...(workerMode !== undefined && { workerMode }),
107
+ ...(stewardFocus !== undefined && { stewardFocus }),
108
+ ...(priority !== undefined && { priority }),
109
+ ...(maxSlots !== undefined && { maxSlots }),
110
+ };
111
+ return config;
112
+ }
113
+ /**
114
+ * Formats agent type config for display
115
+ */
116
+ function formatAgentTypeConfig(config) {
117
+ let result = config.role;
118
+ if (config.workerMode)
119
+ result += `:${config.workerMode}`;
120
+ if (config.stewardFocus)
121
+ result += `:${config.stewardFocus}`;
122
+ if (config.priority !== undefined)
123
+ result += ` (priority: ${config.priority})`;
124
+ if (config.maxSlots !== undefined)
125
+ result += ` (max: ${config.maxSlots})`;
126
+ return result;
127
+ }
128
+ const poolListOptions = [
129
+ {
130
+ name: 'enabled',
131
+ short: 'e',
132
+ description: 'Only show enabled pools',
133
+ },
134
+ {
135
+ name: 'available',
136
+ short: 'a',
137
+ description: 'Only show pools with available slots',
138
+ },
139
+ {
140
+ name: 'tag',
141
+ short: 't',
142
+ description: 'Filter by tag',
143
+ hasValue: true,
144
+ },
145
+ ];
146
+ async function poolListHandler(_args, options) {
147
+ const { poolService, error } = await createPoolClient(options);
148
+ if (error || !poolService) {
149
+ return failure(error ?? 'Failed to create pool service', ExitCode.GENERAL_ERROR);
150
+ }
151
+ try {
152
+ const pools = await poolService.listPools({
153
+ enabled: options.enabled,
154
+ hasAvailableSlots: options.available,
155
+ tags: options.tag ? [options.tag] : undefined,
156
+ });
157
+ const mode = getOutputMode(options);
158
+ const formatter = getFormatter(mode);
159
+ if (mode === 'json') {
160
+ return success(pools);
161
+ }
162
+ if (mode === 'quiet') {
163
+ return success(pools.map((p) => p.id).join('\n'));
164
+ }
165
+ if (pools.length === 0) {
166
+ return success(null, 'No agent pools found');
167
+ }
168
+ const headers = ['ID', 'NAME', 'SIZE', 'ACTIVE', 'AVAILABLE', 'ENABLED'];
169
+ const rows = pools.map((pool) => [
170
+ pool.id,
171
+ pool.config.name,
172
+ String(pool.config.maxSize),
173
+ String(pool.status.activeCount),
174
+ String(pool.status.availableSlots),
175
+ pool.config.enabled ? 'yes' : 'no',
176
+ ]);
177
+ const table = formatter.table(headers, rows);
178
+ return success(pools, `${table}\n${pools.length} pool(s)`);
179
+ }
180
+ catch (err) {
181
+ const message = err instanceof Error ? err.message : String(err);
182
+ return failure(`Failed to list pools: ${message}`, ExitCode.GENERAL_ERROR);
183
+ }
184
+ }
185
+ export const poolListCommand = {
186
+ name: 'list',
187
+ description: 'List agent pools',
188
+ usage: 'sf pool list [options]',
189
+ help: `List all agent pools.
190
+
191
+ Options:
192
+ -e, --enabled Only show enabled pools
193
+ -a, --available Only show pools with available slots
194
+ -t, --tag <tag> Filter by tag
195
+
196
+ Examples:
197
+ sf pool list
198
+ sf pool list --enabled
199
+ sf pool list --available
200
+ sf pool list --tag production`,
201
+ options: poolListOptions,
202
+ handler: poolListHandler,
203
+ };
204
+ // ============================================================================
205
+ // Pool Show Command
206
+ // ============================================================================
207
+ async function poolShowHandler(args, options) {
208
+ const [idOrName] = args;
209
+ if (!idOrName) {
210
+ return failure('Usage: sf pool show <id|name>\nExample: sf pool show default', ExitCode.INVALID_ARGUMENTS);
211
+ }
212
+ const { poolService, error } = await createPoolClient(options);
213
+ if (error || !poolService) {
214
+ return failure(error ?? 'Failed to create pool service', ExitCode.GENERAL_ERROR);
215
+ }
216
+ try {
217
+ // Try to get by ID first, then by name
218
+ let pool;
219
+ if (idOrName.startsWith('el-')) {
220
+ pool = await poolService.getPool(idOrName);
221
+ }
222
+ if (!pool) {
223
+ pool = await poolService.getPoolByName(idOrName);
224
+ }
225
+ if (!pool) {
226
+ return failure(`Pool not found: ${idOrName}`, ExitCode.NOT_FOUND);
227
+ }
228
+ const mode = getOutputMode(options);
229
+ if (mode === 'json') {
230
+ return success(pool);
231
+ }
232
+ if (mode === 'quiet') {
233
+ return success(pool.id);
234
+ }
235
+ const lines = [
236
+ `ID: ${pool.id}`,
237
+ `Name: ${pool.config.name}`,
238
+ `Description: ${pool.config.description ?? '-'}`,
239
+ `Max Size: ${pool.config.maxSize}`,
240
+ `Enabled: ${pool.config.enabled ? 'yes' : 'no'}`,
241
+ `Created: ${pool.createdAt}`,
242
+ '',
243
+ 'Status:',
244
+ ` Active: ${pool.status.activeCount}`,
245
+ ` Available: ${pool.status.availableSlots}`,
246
+ ` Updated: ${pool.status.lastUpdatedAt}`,
247
+ ];
248
+ if (pool.config.agentTypes.length > 0) {
249
+ lines.push('', 'Agent Types:');
250
+ for (const typeConfig of pool.config.agentTypes) {
251
+ lines.push(` - ${formatAgentTypeConfig(typeConfig)}`);
252
+ }
253
+ }
254
+ if (pool.config.tags && pool.config.tags.length > 0) {
255
+ lines.push(`Tags: ${pool.config.tags.join(', ')}`);
256
+ }
257
+ if (pool.status.activeAgentIds.length > 0) {
258
+ lines.push('', 'Active Agents:');
259
+ for (const agentId of pool.status.activeAgentIds) {
260
+ lines.push(` - ${agentId}`);
261
+ }
262
+ }
263
+ return success(pool, lines.join('\n'));
264
+ }
265
+ catch (err) {
266
+ const message = err instanceof Error ? err.message : String(err);
267
+ return failure(`Failed to show pool: ${message}`, ExitCode.GENERAL_ERROR);
268
+ }
269
+ }
270
+ export const poolShowCommand = {
271
+ name: 'show',
272
+ description: 'Show pool details',
273
+ usage: 'sf pool show <id|name>',
274
+ help: `Show detailed information about an agent pool.
275
+
276
+ Arguments:
277
+ id|name Pool identifier or name
278
+
279
+ Examples:
280
+ sf pool show default
281
+ sf pool show el-abc123`,
282
+ options: [],
283
+ handler: poolShowHandler,
284
+ };
285
+ const poolCreateOptions = [
286
+ {
287
+ name: 'size',
288
+ short: 's',
289
+ description: 'Maximum pool size (default: 5)',
290
+ hasValue: true,
291
+ },
292
+ {
293
+ name: 'description',
294
+ short: 'd',
295
+ description: 'Pool description',
296
+ hasValue: true,
297
+ },
298
+ {
299
+ name: 'agentType',
300
+ short: 't',
301
+ description: 'Agent type config (can repeat). Format: role[:mode|focus][:priority][:maxSlots]',
302
+ hasValue: true,
303
+ },
304
+ {
305
+ name: 'tags',
306
+ description: 'Comma-separated tags',
307
+ hasValue: true,
308
+ },
309
+ {
310
+ name: 'disabled',
311
+ description: 'Create pool in disabled state',
312
+ },
313
+ ];
314
+ async function poolCreateHandler(args, options) {
315
+ const [name] = args;
316
+ if (!name) {
317
+ return failure('Usage: sf pool create <name> [options]\nExample: sf pool create default --size 5', ExitCode.INVALID_ARGUMENTS);
318
+ }
319
+ const { poolService, error } = await createPoolClient(options);
320
+ if (error || !poolService) {
321
+ return failure(error ?? 'Failed to create pool service', ExitCode.GENERAL_ERROR);
322
+ }
323
+ try {
324
+ const maxSize = options.size ? parseInt(options.size, 10) : 5;
325
+ if (isNaN(maxSize) || maxSize < 1 || maxSize > 1000) {
326
+ return failure('Invalid size. Must be between 1 and 1000.', ExitCode.VALIDATION);
327
+ }
328
+ // Parse agent types
329
+ const agentTypes = [];
330
+ const agentTypeInputs = Array.isArray(options.agentType)
331
+ ? options.agentType
332
+ : options.agentType
333
+ ? [options.agentType]
334
+ : [];
335
+ for (const typeStr of agentTypeInputs) {
336
+ const typeConfig = parseAgentTypeConfig(typeStr);
337
+ if (!typeConfig) {
338
+ return failure(`Invalid agent type format: ${typeStr}. ` +
339
+ `Use: role[:mode|focus][:priority][:maxSlots] (e.g., worker:ephemeral:100:5)`, ExitCode.VALIDATION);
340
+ }
341
+ agentTypes.push(typeConfig);
342
+ }
343
+ const input = {
344
+ name,
345
+ description: options.description,
346
+ maxSize,
347
+ agentTypes,
348
+ enabled: !options.disabled,
349
+ tags: options.tags ? options.tags.split(',').map((t) => t.trim()) : undefined,
350
+ createdBy: (options.actor ?? OPERATOR_ENTITY_ID),
351
+ };
352
+ const pool = await poolService.createPool(input);
353
+ const mode = getOutputMode(options);
354
+ if (mode === 'json') {
355
+ return success(pool);
356
+ }
357
+ if (mode === 'quiet') {
358
+ return success(pool.id);
359
+ }
360
+ return success(pool, `Created pool '${name}': ${pool.id}`);
361
+ }
362
+ catch (err) {
363
+ const message = err instanceof Error ? err.message : String(err);
364
+ return failure(`Failed to create pool: ${message}`, ExitCode.GENERAL_ERROR);
365
+ }
366
+ }
367
+ export const poolCreateCommand = {
368
+ name: 'create',
369
+ description: 'Create an agent pool',
370
+ usage: 'sf pool create <name> [options]',
371
+ help: `Create a new agent pool.
372
+
373
+ Arguments:
374
+ name Pool name (must be unique)
375
+
376
+ Options:
377
+ -s, --size <n> Maximum pool size (default: 5)
378
+ -d, --description <text> Pool description
379
+ -t, --agentType <config> Agent type config (can repeat)
380
+ Format: role[:mode|focus][:priority][:maxSlots]
381
+ --tags <tags> Comma-separated tags
382
+ --disabled Create pool in disabled state
383
+
384
+ Agent Type Format Examples:
385
+ worker All workers with default settings
386
+ worker:ephemeral Ephemeral workers only
387
+ worker:ephemeral:100 Ephemeral workers with priority 100
388
+ worker:persistent:50:3 Persistent workers, priority 50, max 3 slots
389
+ steward:merge Merge stewards
390
+ steward:health:80 Health stewards with priority 80
391
+
392
+ Examples:
393
+ sf pool create default --size 5
394
+ sf pool create workers --size 10 -t worker:ephemeral -t worker:persistent
395
+ sf pool create merge-pool --size 2 -t steward:merge:100
396
+ sf pool create production --size 20 --tags "prod,critical"`,
397
+ options: poolCreateOptions,
398
+ handler: poolCreateHandler,
399
+ };
400
+ const poolUpdateOptions = [
401
+ {
402
+ name: 'size',
403
+ short: 's',
404
+ description: 'Maximum pool size',
405
+ hasValue: true,
406
+ },
407
+ {
408
+ name: 'description',
409
+ short: 'd',
410
+ description: 'Pool description',
411
+ hasValue: true,
412
+ },
413
+ {
414
+ name: 'agentType',
415
+ short: 't',
416
+ description: 'Agent type config (replaces existing, can repeat)',
417
+ hasValue: true,
418
+ },
419
+ {
420
+ name: 'tags',
421
+ description: 'Comma-separated tags (replaces existing)',
422
+ hasValue: true,
423
+ },
424
+ {
425
+ name: 'enable',
426
+ description: 'Enable the pool',
427
+ },
428
+ {
429
+ name: 'disable',
430
+ description: 'Disable the pool',
431
+ },
432
+ ];
433
+ async function poolUpdateHandler(args, options) {
434
+ const [idOrName] = args;
435
+ if (!idOrName) {
436
+ return failure('Usage: sf pool update <id|name> [options]\nExample: sf pool update default --size 10', ExitCode.INVALID_ARGUMENTS);
437
+ }
438
+ if (options.enable && options.disable) {
439
+ return failure('Cannot use both --enable and --disable', ExitCode.VALIDATION);
440
+ }
441
+ const { poolService, error } = await createPoolClient(options);
442
+ if (error || !poolService) {
443
+ return failure(error ?? 'Failed to create pool service', ExitCode.GENERAL_ERROR);
444
+ }
445
+ try {
446
+ // Find the pool
447
+ let pool;
448
+ if (idOrName.startsWith('el-')) {
449
+ pool = await poolService.getPool(idOrName);
450
+ }
451
+ if (!pool) {
452
+ pool = await poolService.getPoolByName(idOrName);
453
+ }
454
+ if (!pool) {
455
+ return failure(`Pool not found: ${idOrName}`, ExitCode.NOT_FOUND);
456
+ }
457
+ // Validate and parse options first
458
+ let maxSize;
459
+ if (options.size !== undefined) {
460
+ maxSize = parseInt(options.size, 10);
461
+ if (isNaN(maxSize) || maxSize < 1 || maxSize > 1000) {
462
+ return failure('Invalid size. Must be between 1 and 1000.', ExitCode.VALIDATION);
463
+ }
464
+ }
465
+ let agentTypes;
466
+ if (options.agentType !== undefined) {
467
+ agentTypes = [];
468
+ const agentTypeInputs = Array.isArray(options.agentType)
469
+ ? options.agentType
470
+ : [options.agentType];
471
+ for (const typeStr of agentTypeInputs) {
472
+ const typeConfig = parseAgentTypeConfig(typeStr);
473
+ if (!typeConfig) {
474
+ return failure(`Invalid agent type format: ${typeStr}`, ExitCode.VALIDATION);
475
+ }
476
+ agentTypes.push(typeConfig);
477
+ }
478
+ }
479
+ const parsedTags = options.tags !== undefined
480
+ ? options.tags.split(',').map((t) => t.trim())
481
+ : undefined;
482
+ const enabled = options.enable ? true : options.disable ? false : undefined;
483
+ // Build updates object with all properties upfront
484
+ const updates = {
485
+ ...(options.description !== undefined && { description: options.description }),
486
+ ...(maxSize !== undefined && { maxSize }),
487
+ ...(agentTypes !== undefined && { agentTypes }),
488
+ ...(parsedTags !== undefined && { tags: parsedTags }),
489
+ ...(enabled !== undefined && { enabled }),
490
+ };
491
+ const updatedPool = await poolService.updatePool(pool.id, updates);
492
+ const mode = getOutputMode(options);
493
+ if (mode === 'json') {
494
+ return success(updatedPool);
495
+ }
496
+ if (mode === 'quiet') {
497
+ return success(updatedPool.id);
498
+ }
499
+ return success(updatedPool, `Updated pool '${updatedPool.config.name}'`);
500
+ }
501
+ catch (err) {
502
+ const message = err instanceof Error ? err.message : String(err);
503
+ return failure(`Failed to update pool: ${message}`, ExitCode.GENERAL_ERROR);
504
+ }
505
+ }
506
+ export const poolUpdateCommand = {
507
+ name: 'update',
508
+ description: 'Update pool configuration',
509
+ usage: 'sf pool update <id|name> [options]',
510
+ help: `Update an agent pool configuration.
511
+
512
+ Arguments:
513
+ id|name Pool identifier or name
514
+
515
+ Options:
516
+ -s, --size <n> Maximum pool size
517
+ -d, --description <text> Pool description
518
+ -t, --agentType <config> Agent type config (replaces existing, can repeat)
519
+ --tags <tags> Comma-separated tags (replaces existing)
520
+ --enable Enable the pool
521
+ --disable Disable the pool
522
+
523
+ Examples:
524
+ sf pool update default --size 10
525
+ sf pool update workers --enable
526
+ sf pool update merge-pool --disable
527
+ sf pool update production --description "Production agent pool"`,
528
+ options: poolUpdateOptions,
529
+ handler: poolUpdateHandler,
530
+ };
531
+ const poolDeleteOptions = [
532
+ {
533
+ name: 'force',
534
+ short: 'f',
535
+ description: 'Delete even if agents are active',
536
+ },
537
+ ];
538
+ async function poolDeleteHandler(args, options) {
539
+ const [idOrName] = args;
540
+ if (!idOrName) {
541
+ return failure('Usage: sf pool delete <id|name>\nExample: sf pool delete old-pool', ExitCode.INVALID_ARGUMENTS);
542
+ }
543
+ const { poolService, error } = await createPoolClient(options);
544
+ if (error || !poolService) {
545
+ return failure(error ?? 'Failed to create pool service', ExitCode.GENERAL_ERROR);
546
+ }
547
+ try {
548
+ // Find the pool
549
+ let pool;
550
+ if (idOrName.startsWith('el-')) {
551
+ pool = await poolService.getPool(idOrName);
552
+ }
553
+ if (!pool) {
554
+ pool = await poolService.getPoolByName(idOrName);
555
+ }
556
+ if (!pool) {
557
+ return failure(`Pool not found: ${idOrName}`, ExitCode.NOT_FOUND);
558
+ }
559
+ // Check for active agents
560
+ if (pool.status.activeCount > 0 && !options.force) {
561
+ return failure(`Pool '${pool.config.name}' has ${pool.status.activeCount} active agent(s). ` +
562
+ `Use --force to delete anyway.`, ExitCode.VALIDATION);
563
+ }
564
+ await poolService.deletePool(pool.id);
565
+ const mode = getOutputMode(options);
566
+ if (mode === 'json') {
567
+ return success({ deleted: pool.id, name: pool.config.name });
568
+ }
569
+ if (mode === 'quiet') {
570
+ return success(pool.id);
571
+ }
572
+ return success({ deleted: pool.id }, `Deleted pool '${pool.config.name}'`);
573
+ }
574
+ catch (err) {
575
+ const message = err instanceof Error ? err.message : String(err);
576
+ return failure(`Failed to delete pool: ${message}`, ExitCode.GENERAL_ERROR);
577
+ }
578
+ }
579
+ export const poolDeleteCommand = {
580
+ name: 'delete',
581
+ description: 'Delete an agent pool',
582
+ usage: 'sf pool delete <id|name>',
583
+ help: `Delete an agent pool.
584
+
585
+ Arguments:
586
+ id|name Pool identifier or name
587
+
588
+ Options:
589
+ -f, --force Delete even if agents are active
590
+
591
+ Examples:
592
+ sf pool delete old-pool
593
+ sf pool delete el-abc123 --force`,
594
+ options: poolDeleteOptions,
595
+ handler: poolDeleteHandler,
596
+ };
597
+ // ============================================================================
598
+ // Pool Status Command
599
+ // ============================================================================
600
+ async function poolStatusHandler(args, options) {
601
+ const [idOrName] = args;
602
+ if (!idOrName) {
603
+ return failure('Usage: sf pool status <id|name>\nExample: sf pool status default', ExitCode.INVALID_ARGUMENTS);
604
+ }
605
+ const { poolService, error } = await createPoolClient(options);
606
+ if (error || !poolService) {
607
+ return failure(error ?? 'Failed to create pool service', ExitCode.GENERAL_ERROR);
608
+ }
609
+ try {
610
+ // Find the pool
611
+ let pool;
612
+ if (idOrName.startsWith('el-')) {
613
+ pool = await poolService.getPool(idOrName);
614
+ }
615
+ if (!pool) {
616
+ pool = await poolService.getPoolByName(idOrName);
617
+ }
618
+ if (!pool) {
619
+ return failure(`Pool not found: ${idOrName}`, ExitCode.NOT_FOUND);
620
+ }
621
+ // Refresh status from session manager
622
+ const status = await poolService.getPoolStatus(pool.id);
623
+ const mode = getOutputMode(options);
624
+ if (mode === 'json') {
625
+ return success({
626
+ poolId: pool.id,
627
+ poolName: pool.config.name,
628
+ ...status,
629
+ });
630
+ }
631
+ if (mode === 'quiet') {
632
+ return success(`${status.activeCount}/${pool.config.maxSize}`);
633
+ }
634
+ const lines = [
635
+ `Pool: ${pool.config.name} (${pool.id})`,
636
+ `Enabled: ${pool.config.enabled ? 'yes' : 'no'}`,
637
+ '',
638
+ 'Capacity:',
639
+ ` Max Size: ${pool.config.maxSize}`,
640
+ ` Active: ${status.activeCount}`,
641
+ ` Available: ${status.availableSlots}`,
642
+ ` Utilization: ${Math.round((status.activeCount / pool.config.maxSize) * 100)}%`,
643
+ '',
644
+ `Last Updated: ${status.lastUpdatedAt}`,
645
+ ];
646
+ if (Object.keys(status.activeByType).length > 0) {
647
+ lines.push('', 'Active by Type:');
648
+ for (const [typeKey, count] of Object.entries(status.activeByType)) {
649
+ lines.push(` ${typeKey}: ${count}`);
650
+ }
651
+ }
652
+ if (status.activeAgentIds.length > 0) {
653
+ lines.push('', 'Active Agents:');
654
+ for (const agentId of status.activeAgentIds) {
655
+ lines.push(` - ${agentId}`);
656
+ }
657
+ }
658
+ return success(status, lines.join('\n'));
659
+ }
660
+ catch (err) {
661
+ const message = err instanceof Error ? err.message : String(err);
662
+ return failure(`Failed to get pool status: ${message}`, ExitCode.GENERAL_ERROR);
663
+ }
664
+ }
665
+ export const poolStatusCommand = {
666
+ name: 'status',
667
+ description: 'Show pool status',
668
+ usage: 'sf pool status <id|name>',
669
+ help: `Show the current status of an agent pool.
670
+
671
+ Arguments:
672
+ id|name Pool identifier or name
673
+
674
+ Examples:
675
+ sf pool status default
676
+ sf pool status el-abc123`,
677
+ options: [],
678
+ handler: poolStatusHandler,
679
+ };
680
+ // ============================================================================
681
+ // Pool Refresh Command
682
+ // ============================================================================
683
+ async function poolRefreshHandler(_args, options) {
684
+ const { poolService, error } = await createPoolClient(options);
685
+ if (error || !poolService) {
686
+ return failure(error ?? 'Failed to create pool service', ExitCode.GENERAL_ERROR);
687
+ }
688
+ try {
689
+ await poolService.refreshAllPoolStatus();
690
+ const pools = await poolService.listPools();
691
+ const mode = getOutputMode(options);
692
+ if (mode === 'json') {
693
+ return success(pools);
694
+ }
695
+ if (mode === 'quiet') {
696
+ return success(String(pools.length));
697
+ }
698
+ return success(pools, `Refreshed status for ${pools.length} pool(s)`);
699
+ }
700
+ catch (err) {
701
+ const message = err instanceof Error ? err.message : String(err);
702
+ return failure(`Failed to refresh pool status: ${message}`, ExitCode.GENERAL_ERROR);
703
+ }
704
+ }
705
+ export const poolRefreshCommand = {
706
+ name: 'refresh',
707
+ description: 'Refresh pool status from sessions',
708
+ usage: 'sf pool refresh',
709
+ help: `Refresh the status of all agent pools based on current sessions.
710
+
711
+ Examples:
712
+ sf pool refresh`,
713
+ options: [],
714
+ handler: poolRefreshHandler,
715
+ };
716
+ // ============================================================================
717
+ // Main Pool Command
718
+ // ============================================================================
719
+ export const poolCommand = {
720
+ name: 'pool',
721
+ description: 'Manage agent pools',
722
+ usage: 'sf pool <subcommand> [options]',
723
+ help: `Manage agent pools for concurrency limiting.
724
+
725
+ Agent pools allow you to limit the maximum number of agents running
726
+ concurrently. When a pool is at capacity, new agent spawns are blocked
727
+ until slots become available.
728
+
729
+ Subcommands:
730
+ list List all agent pools
731
+ show Show pool details
732
+ create Create a new pool
733
+ update Update pool configuration
734
+ delete Delete a pool
735
+ status Show pool status with active agents
736
+ refresh Refresh pool status from sessions
737
+
738
+ Examples:
739
+ sf pool list
740
+ sf pool create default --size 5
741
+ sf pool show default
742
+ sf pool status default
743
+ sf pool update default --size 10
744
+ sf pool delete old-pool`,
745
+ subcommands: {
746
+ list: poolListCommand,
747
+ show: poolShowCommand,
748
+ create: poolCreateCommand,
749
+ update: poolUpdateCommand,
750
+ delete: poolDeleteCommand,
751
+ status: poolStatusCommand,
752
+ refresh: poolRefreshCommand,
753
+ // Aliases
754
+ ls: poolListCommand,
755
+ get: poolShowCommand,
756
+ add: poolCreateCommand,
757
+ rm: poolDeleteCommand,
758
+ },
759
+ handler: poolListCommand.handler, // Default to list
760
+ options: [],
761
+ };
762
+ //# sourceMappingURL=pool.js.map