@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,861 @@
1
+ /**
2
+ * Agent Commands - CLI operations for orchestrator agents
3
+ *
4
+ * Provides commands for agent management:
5
+ * - agent list: List all registered agents
6
+ * - agent show <id>: Show agent details
7
+ * - agent register <name>: Register a new agent
8
+ * - agent start <id>: Start (spawn) a Claude Code process for an agent
9
+ * - agent stop <id>: Stop an agent session
10
+ * - agent stream <id>: Get agent channel for streaming
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
18
+ */
19
+ async function createOrchestratorClient(options) {
20
+ try {
21
+ const { createStorage, initializeSchema, findStoneforgeDir } = await import('@stoneforge/quarry');
22
+ const { createOrchestratorAPI } = await import('../../api/index.js');
23
+ const stoneforgeDir = findStoneforgeDir(process.cwd());
24
+ if (!stoneforgeDir) {
25
+ return {
26
+ api: null,
27
+ error: 'No .stoneforge directory found. Run "sf init" first.',
28
+ };
29
+ }
30
+ const dbPath = options.db ?? `${stoneforgeDir}/stoneforge.db`;
31
+ const backend = createStorage({ path: dbPath, create: true });
32
+ initializeSchema(backend);
33
+ const api = createOrchestratorAPI(backend);
34
+ return { api };
35
+ }
36
+ catch (err) {
37
+ const message = err instanceof Error ? err.message : String(err);
38
+ return { api: null, error: `Failed to initialize API: ${message}` };
39
+ }
40
+ }
41
+ /**
42
+ * Gets agent metadata from agent entity
43
+ */
44
+ function getAgentMeta(agent) {
45
+ return (agent.metadata?.agent ?? {});
46
+ }
47
+ /**
48
+ * Streams output from a spawned session's event emitter
49
+ * This is a long-running operation that continues until the session ends
50
+ */
51
+ async function streamSpawnedSession(events, sessionMode) {
52
+ return new Promise((resolve) => {
53
+ const onInterrupt = () => {
54
+ console.log('\n[Stream interrupted]');
55
+ cleanup();
56
+ resolve();
57
+ };
58
+ const cleanup = () => {
59
+ process.off('SIGINT', onInterrupt);
60
+ events.off('event', onEvent);
61
+ events.off('pty-data', onPtyData);
62
+ events.off('exit', onExit);
63
+ events.off('error', onError);
64
+ };
65
+ const onEvent = (event) => {
66
+ if (event.type === 'assistant' && event.message) {
67
+ process.stdout.write(event.message);
68
+ }
69
+ else if (event.type === 'tool_use' && event.tool?.name) {
70
+ console.log(`\n[Tool: ${event.tool.name}]`);
71
+ }
72
+ else if (event.type === 'result' && event.message) {
73
+ console.log(`\n[Result: ${event.message}]`);
74
+ }
75
+ };
76
+ const onPtyData = (data) => {
77
+ process.stdout.write(data);
78
+ };
79
+ const onExit = (code, signal) => {
80
+ // User-friendly message for normal exit, show exit code for debugging on errors
81
+ const exitMessage = code === 0
82
+ ? 'The agent has stopped the session'
83
+ : `The agent session ended unexpectedly (exit code ${code})${signal ? ` (signal: ${signal})` : ''}`;
84
+ console.log(`\n[${exitMessage}]`);
85
+ cleanup();
86
+ resolve();
87
+ };
88
+ const onError = (error) => {
89
+ console.error(`\n[Error: ${error.message}]`);
90
+ };
91
+ process.on('SIGINT', onInterrupt);
92
+ if (sessionMode === 'headless') {
93
+ events.on('event', onEvent);
94
+ }
95
+ else {
96
+ events.on('pty-data', onPtyData);
97
+ }
98
+ events.on('exit', onExit);
99
+ events.on('error', onError);
100
+ });
101
+ }
102
+ const agentListOptions = [
103
+ {
104
+ name: 'role',
105
+ short: 'r',
106
+ description: 'Filter by role (director, worker, steward)',
107
+ hasValue: true,
108
+ },
109
+ {
110
+ name: 'status',
111
+ short: 's',
112
+ description: 'Filter by session status (idle, running, suspended, terminated)',
113
+ hasValue: true,
114
+ },
115
+ {
116
+ name: 'workerMode',
117
+ short: 'm',
118
+ description: 'Filter by worker mode (ephemeral, persistent)',
119
+ hasValue: true,
120
+ },
121
+ {
122
+ name: 'focus',
123
+ short: 'f',
124
+ description: 'Filter by steward focus (merge, health, reminder, ops, docs)',
125
+ hasValue: true,
126
+ },
127
+ {
128
+ name: 'reportsTo',
129
+ description: 'Filter by manager entity ID',
130
+ hasValue: true,
131
+ },
132
+ {
133
+ name: 'hasSession',
134
+ description: 'Filter to agents with active sessions',
135
+ },
136
+ ];
137
+ async function agentListHandler(_args, options) {
138
+ const { api, error } = await createOrchestratorClient(options);
139
+ if (error || !api) {
140
+ return failure(error ?? 'Failed to create API', ExitCode.GENERAL_ERROR);
141
+ }
142
+ try {
143
+ let agents;
144
+ // Filter by role if specified
145
+ if (options.role) {
146
+ const validRoles = ['director', 'worker', 'steward'];
147
+ if (!validRoles.includes(options.role)) {
148
+ return failure(`Invalid role: ${options.role}. Must be one of: ${validRoles.join(', ')}`, ExitCode.VALIDATION);
149
+ }
150
+ agents = await api.getAgentsByRole(options.role);
151
+ }
152
+ else {
153
+ agents = await api.listAgents();
154
+ }
155
+ // Additional filter by status
156
+ if (options.status) {
157
+ const validStatuses = ['idle', 'running', 'suspended', 'terminated'];
158
+ if (!validStatuses.includes(options.status)) {
159
+ return failure(`Invalid status: ${options.status}. Must be one of: ${validStatuses.join(', ')}`, ExitCode.VALIDATION);
160
+ }
161
+ agents = agents.filter((a) => {
162
+ const meta = getAgentMeta(a);
163
+ return meta.sessionStatus === options.status;
164
+ });
165
+ }
166
+ // Filter by worker mode
167
+ if (options.workerMode) {
168
+ const validModes = ['ephemeral', 'persistent'];
169
+ if (!validModes.includes(options.workerMode)) {
170
+ return failure(`Invalid workerMode: ${options.workerMode}. Must be one of: ${validModes.join(', ')}`, ExitCode.VALIDATION);
171
+ }
172
+ agents = agents.filter((a) => {
173
+ const meta = getAgentMeta(a);
174
+ return meta.workerMode === options.workerMode;
175
+ });
176
+ }
177
+ // Filter by steward focus
178
+ if (options.focus) {
179
+ const validFocuses = ['merge', 'health', 'reminder', 'ops', 'docs'];
180
+ if (!validFocuses.includes(options.focus)) {
181
+ return failure(`Invalid focus: ${options.focus}. Must be one of: ${validFocuses.join(', ')}`, ExitCode.VALIDATION);
182
+ }
183
+ agents = agents.filter((a) => {
184
+ const meta = getAgentMeta(a);
185
+ return meta.stewardFocus === options.focus;
186
+ });
187
+ }
188
+ // Filter by manager
189
+ if (options.reportsTo) {
190
+ agents = agents.filter((a) => a.reportsTo === options.reportsTo);
191
+ }
192
+ // Filter by has session
193
+ if (options.hasSession) {
194
+ agents = agents.filter((a) => {
195
+ const meta = getAgentMeta(a);
196
+ return meta.sessionId !== undefined;
197
+ });
198
+ }
199
+ const mode = getOutputMode(options);
200
+ const formatter = getFormatter(mode);
201
+ if (mode === 'json') {
202
+ return success(agents);
203
+ }
204
+ if (mode === 'quiet') {
205
+ return success(agents.map((a) => a.id).join('\n'));
206
+ }
207
+ if (agents.length === 0) {
208
+ return success(null, 'No agents found');
209
+ }
210
+ const headers = ['ID', 'NAME', 'ROLE', 'STATUS', 'SESSION'];
211
+ const rows = agents.map((agent) => {
212
+ const meta = getAgentMeta(agent);
213
+ return [
214
+ agent.id,
215
+ agent.name ?? '-',
216
+ meta.agentRole ?? '-',
217
+ meta.sessionStatus ?? 'idle',
218
+ meta.sessionId?.slice(0, 8) ?? '-',
219
+ ];
220
+ });
221
+ const table = formatter.table(headers, rows);
222
+ return success(agents, `${table}\n${agents.length} agent(s)`);
223
+ }
224
+ catch (err) {
225
+ const message = err instanceof Error ? err.message : String(err);
226
+ return failure(`Failed to list agents: ${message}`, ExitCode.GENERAL_ERROR);
227
+ }
228
+ }
229
+ export const agentListCommand = {
230
+ name: 'list',
231
+ description: 'List registered agents',
232
+ usage: 'sf agent list [options]',
233
+ help: `List all registered orchestrator agents.
234
+
235
+ Options:
236
+ -r, --role <role> Filter by role (director, worker, steward)
237
+ -s, --status <status> Filter by session status (idle, running, suspended, terminated)
238
+ -m, --workerMode <mode> Filter by worker mode (ephemeral, persistent)
239
+ -f, --focus <focus> Filter by steward focus (merge, health, reminder, ops, docs)
240
+ --reportsTo <id> Filter by manager entity ID
241
+ --hasSession Filter to agents with active sessions
242
+
243
+ Examples:
244
+ sf agent list
245
+ sf agent list --role worker
246
+ sf agent list --role worker --workerMode ephemeral
247
+ sf agent list --status running
248
+ sf agent list --role steward --focus health
249
+ sf agent list --hasSession`,
250
+ options: agentListOptions,
251
+ handler: agentListHandler,
252
+ };
253
+ // ============================================================================
254
+ // Agent Show Command
255
+ // ============================================================================
256
+ async function agentShowHandler(args, options) {
257
+ const [id] = args;
258
+ if (!id) {
259
+ return failure('Usage: sf agent show <id>\nExample: sf agent show el-abc123', ExitCode.INVALID_ARGUMENTS);
260
+ }
261
+ const { api, error } = await createOrchestratorClient(options);
262
+ if (error || !api) {
263
+ return failure(error ?? 'Failed to create API', ExitCode.GENERAL_ERROR);
264
+ }
265
+ try {
266
+ const agent = await api.getAgent(id);
267
+ if (!agent) {
268
+ return failure(`Agent not found: ${id}`, ExitCode.NOT_FOUND);
269
+ }
270
+ const mode = getOutputMode(options);
271
+ if (mode === 'json') {
272
+ return success(agent);
273
+ }
274
+ if (mode === 'quiet') {
275
+ return success(agent.id);
276
+ }
277
+ const meta = getAgentMeta(agent);
278
+ const lines = [
279
+ `ID: ${agent.id}`,
280
+ `Name: ${agent.name ?? '-'}`,
281
+ `Role: ${meta.agentRole ?? '-'}`,
282
+ `Status: ${meta.sessionStatus ?? 'idle'}`,
283
+ `Session: ${meta.sessionId ?? '-'}`,
284
+ `Channel: ${meta.channelId ?? '-'}`,
285
+ `Created: ${agent.createdAt}`,
286
+ ];
287
+ if (meta.workerMode) {
288
+ lines.push(`Mode: ${meta.workerMode}`);
289
+ }
290
+ if (meta.stewardFocus) {
291
+ lines.push(`Focus: ${meta.stewardFocus}`);
292
+ }
293
+ return success(agent, lines.join('\n'));
294
+ }
295
+ catch (err) {
296
+ const message = err instanceof Error ? err.message : String(err);
297
+ return failure(`Failed to show agent: ${message}`, ExitCode.GENERAL_ERROR);
298
+ }
299
+ }
300
+ export const agentShowCommand = {
301
+ name: 'show',
302
+ description: 'Show agent details',
303
+ usage: 'sf agent show <id>',
304
+ help: `Show detailed information about an agent.
305
+
306
+ Arguments:
307
+ id Agent identifier
308
+
309
+ Examples:
310
+ sf agent show el-abc123`,
311
+ options: [],
312
+ handler: agentShowHandler,
313
+ };
314
+ const agentRegisterOptions = [
315
+ {
316
+ name: 'role',
317
+ short: 'r',
318
+ description: 'Agent role (worker, director, steward)',
319
+ hasValue: true,
320
+ required: true,
321
+ },
322
+ {
323
+ name: 'mode',
324
+ short: 'm',
325
+ description: 'Worker mode (ephemeral, persistent)',
326
+ hasValue: true,
327
+ },
328
+ {
329
+ name: 'focus',
330
+ short: 'f',
331
+ description: 'Steward focus (merge, health, reminder, ops, docs)',
332
+ hasValue: true,
333
+ },
334
+ {
335
+ name: 'maxTasks',
336
+ short: 't',
337
+ description: 'Maximum concurrent tasks (default: 1)',
338
+ hasValue: true,
339
+ },
340
+ {
341
+ name: 'tags',
342
+ description: 'Comma-separated tags',
343
+ hasValue: true,
344
+ },
345
+ {
346
+ name: 'reportsTo',
347
+ description: 'Manager entity ID',
348
+ hasValue: true,
349
+ },
350
+ {
351
+ name: 'roleDef',
352
+ description: 'Role definition document ID',
353
+ hasValue: true,
354
+ },
355
+ {
356
+ name: 'trigger',
357
+ description: 'Steward cron trigger (e.g., "0 2 * * *")',
358
+ hasValue: true,
359
+ },
360
+ {
361
+ name: 'provider',
362
+ description: 'Agent provider (e.g., claude, opencode)',
363
+ hasValue: true,
364
+ },
365
+ {
366
+ name: 'model',
367
+ description: 'LLM model to use (e.g., claude-sonnet-4-5-20250929)',
368
+ hasValue: true,
369
+ },
370
+ ];
371
+ async function agentRegisterHandler(args, options) {
372
+ const [name] = args;
373
+ if (!name) {
374
+ return failure('Usage: sf agent register <name> --role <role> [options]\nExample: sf agent register MyWorker --role worker', ExitCode.INVALID_ARGUMENTS);
375
+ }
376
+ if (!options.role) {
377
+ return failure('--role is required', ExitCode.INVALID_ARGUMENTS);
378
+ }
379
+ const validRoles = ['director', 'worker', 'steward'];
380
+ if (!validRoles.includes(options.role)) {
381
+ return failure(`Invalid role: ${options.role}. Must be one of: ${validRoles.join(', ')}`, ExitCode.VALIDATION);
382
+ }
383
+ const { api, error } = await createOrchestratorClient(options);
384
+ if (error || !api) {
385
+ return failure(error ?? 'Failed to create API', ExitCode.GENERAL_ERROR);
386
+ }
387
+ try {
388
+ // Use the default operator entity for CLI operations
389
+ const createdBy = (options.actor ?? OPERATOR_ENTITY_ID);
390
+ const maxConcurrentTasks = options.maxTasks ? parseInt(options.maxTasks, 10) : 1;
391
+ const tags = options.tags ? options.tags.split(',').map(t => t.trim()) : undefined;
392
+ const reportsTo = options.reportsTo;
393
+ const roleDefinitionRef = options.roleDef;
394
+ let agent;
395
+ switch (options.role) {
396
+ case 'director':
397
+ agent = await api.registerDirector({
398
+ name,
399
+ createdBy,
400
+ maxConcurrentTasks,
401
+ tags,
402
+ roleDefinitionRef,
403
+ provider: options.provider,
404
+ model: options.model,
405
+ });
406
+ break;
407
+ case 'worker': {
408
+ const workerMode = options.mode ?? 'ephemeral';
409
+ const validModes = ['ephemeral', 'persistent'];
410
+ if (!validModes.includes(workerMode)) {
411
+ return failure(`Invalid mode: ${workerMode}. Must be one of: ${validModes.join(', ')}`, ExitCode.VALIDATION);
412
+ }
413
+ agent = await api.registerWorker({
414
+ name,
415
+ createdBy,
416
+ workerMode,
417
+ maxConcurrentTasks,
418
+ tags,
419
+ reportsTo,
420
+ roleDefinitionRef,
421
+ provider: options.provider,
422
+ model: options.model,
423
+ });
424
+ break;
425
+ }
426
+ case 'steward': {
427
+ const stewardFocus = options.focus ?? 'health';
428
+ const validFocuses = ['merge', 'health', 'reminder', 'ops', 'docs'];
429
+ if (!validFocuses.includes(stewardFocus)) {
430
+ return failure(`Invalid focus: ${stewardFocus}. Must be one of: ${validFocuses.join(', ')}`, ExitCode.VALIDATION);
431
+ }
432
+ // Parse trigger if provided
433
+ const triggers = [];
434
+ if (options.trigger) {
435
+ triggers.push({ type: 'cron', schedule: options.trigger });
436
+ }
437
+ agent = await api.registerSteward({
438
+ name,
439
+ createdBy,
440
+ stewardFocus,
441
+ triggers,
442
+ maxConcurrentTasks,
443
+ tags,
444
+ reportsTo,
445
+ roleDefinitionRef,
446
+ provider: options.provider,
447
+ model: options.model,
448
+ });
449
+ break;
450
+ }
451
+ default:
452
+ return failure(`Unknown role: ${options.role}`, ExitCode.VALIDATION);
453
+ }
454
+ const mode = getOutputMode(options);
455
+ if (mode === 'json') {
456
+ return success(agent);
457
+ }
458
+ if (mode === 'quiet') {
459
+ return success(agent.id);
460
+ }
461
+ return success(agent, `Registered ${options.role} agent: ${agent.id}`);
462
+ }
463
+ catch (err) {
464
+ const message = err instanceof Error ? err.message : String(err);
465
+ return failure(`Failed to register agent: ${message}`, ExitCode.GENERAL_ERROR);
466
+ }
467
+ }
468
+ export const agentRegisterCommand = {
469
+ name: 'register',
470
+ description: 'Register a new agent',
471
+ usage: 'sf agent register <name> --role <role> [options]',
472
+ help: `Register a new orchestrator agent.
473
+
474
+ Arguments:
475
+ name Agent name
476
+
477
+ Options:
478
+ -r, --role <role> Agent role: director, worker, steward (required)
479
+ -m, --mode <mode> Worker mode: ephemeral, persistent (default: ephemeral)
480
+ -f, --focus <focus> Steward focus: merge, health, reminder, ops, docs
481
+ -t, --maxTasks <n> Maximum concurrent tasks (default: 1)
482
+ --tags <tags> Comma-separated tags (e.g., "frontend,urgent")
483
+ --reportsTo <id> Manager entity ID (for workers/stewards)
484
+ --roleDef <id> Role definition document ID
485
+ --trigger <cron> Steward cron trigger (e.g., "0 2 * * *")
486
+ --provider <name> Agent provider (e.g., claude, opencode)
487
+ --model <model> LLM model to use (e.g., claude-sonnet-4-5-20250929)
488
+
489
+ Examples:
490
+ sf agent register MyWorker --role worker --mode ephemeral
491
+ sf agent register MainDirector --role director
492
+ sf agent register HealthChecker --role steward --focus health
493
+ sf agent register MyWorker --role worker --tags "frontend,urgent"
494
+ sf agent register TeamWorker --role worker --reportsTo el-director123
495
+ sf agent register DailyChecker --role steward --focus health --trigger "0 9 * * *"
496
+ sf agent register OcWorker --role worker --provider opencode
497
+ sf agent register MyWorker --role worker --model claude-sonnet-4-5-20250929`,
498
+ options: agentRegisterOptions,
499
+ handler: agentRegisterHandler,
500
+ };
501
+ const agentStopOptions = [
502
+ {
503
+ name: 'graceful',
504
+ short: 'g',
505
+ description: 'Graceful shutdown (default: true)',
506
+ },
507
+ {
508
+ name: 'no-graceful',
509
+ description: 'Force immediate shutdown',
510
+ },
511
+ {
512
+ name: 'reason',
513
+ short: 'r',
514
+ description: 'Reason for stopping the agent',
515
+ hasValue: true,
516
+ },
517
+ ];
518
+ async function agentStopHandler(args, options) {
519
+ const [id] = args;
520
+ if (!id) {
521
+ return failure('Usage: sf agent stop <id> [options]\nExample: sf agent stop el-abc123', ExitCode.INVALID_ARGUMENTS);
522
+ }
523
+ const { api, error } = await createOrchestratorClient(options);
524
+ if (error || !api) {
525
+ return failure(error ?? 'Failed to create API', ExitCode.GENERAL_ERROR);
526
+ }
527
+ try {
528
+ // Determine graceful mode (default true unless --no-graceful is set)
529
+ const graceful = options['no-graceful'] !== true;
530
+ const agent = await api.updateAgentSession(id, undefined, 'idle');
531
+ const mode = getOutputMode(options);
532
+ if (mode === 'json') {
533
+ return success({
534
+ ...agent,
535
+ graceful,
536
+ reason: options.reason,
537
+ });
538
+ }
539
+ if (mode === 'quiet') {
540
+ return success(agent.id);
541
+ }
542
+ let message = `Stopped agent ${id}`;
543
+ if (!graceful) {
544
+ message += ' (forced)';
545
+ }
546
+ if (options.reason) {
547
+ message += `: ${options.reason}`;
548
+ }
549
+ return success(agent, message);
550
+ }
551
+ catch (err) {
552
+ const message = err instanceof Error ? err.message : String(err);
553
+ return failure(`Failed to stop agent: ${message}`, ExitCode.GENERAL_ERROR);
554
+ }
555
+ }
556
+ export const agentStopCommand = {
557
+ name: 'stop',
558
+ description: 'Stop an agent session',
559
+ usage: 'sf agent stop <id> [options]',
560
+ help: `Stop an agent session.
561
+
562
+ Arguments:
563
+ id Agent identifier
564
+
565
+ Options:
566
+ -g, --graceful Graceful shutdown (default: true)
567
+ --no-graceful Force immediate shutdown
568
+ -r, --reason <text> Reason for stopping the agent
569
+
570
+ Examples:
571
+ sf agent stop el-abc123
572
+ sf agent stop el-abc123 --reason "Task completed"
573
+ sf agent stop el-abc123 --no-graceful`,
574
+ options: agentStopOptions,
575
+ handler: agentStopHandler,
576
+ };
577
+ // ============================================================================
578
+ // Agent Stream Command
579
+ // ============================================================================
580
+ async function agentStreamHandler(args, options) {
581
+ const [id] = args;
582
+ if (!id) {
583
+ return failure('Usage: sf agent stream <id>\nExample: sf agent stream el-abc123', ExitCode.INVALID_ARGUMENTS);
584
+ }
585
+ const { api, error } = await createOrchestratorClient(options);
586
+ if (error || !api) {
587
+ return failure(error ?? 'Failed to create API', ExitCode.GENERAL_ERROR);
588
+ }
589
+ try {
590
+ const channelId = await api.getAgentChannel(id);
591
+ if (!channelId) {
592
+ return failure(`No channel found for agent: ${id}`, ExitCode.NOT_FOUND);
593
+ }
594
+ const mode = getOutputMode(options);
595
+ if (mode === 'json') {
596
+ return success({ channelId, agentId: id });
597
+ }
598
+ return success({ channelId }, `Agent ${id} channel: ${channelId}\nUse "sf channel stream ${channelId}" to watch messages`);
599
+ }
600
+ catch (err) {
601
+ const message = err instanceof Error ? err.message : String(err);
602
+ return failure(`Failed to get agent stream: ${message}`, ExitCode.GENERAL_ERROR);
603
+ }
604
+ }
605
+ export const agentStreamCommand = {
606
+ name: 'stream',
607
+ description: 'Get agent channel for streaming',
608
+ usage: 'sf agent stream <id>',
609
+ help: `Get the channel ID for an agent to stream messages.
610
+
611
+ Arguments:
612
+ id Agent identifier
613
+
614
+ Examples:
615
+ sf agent stream el-abc123`,
616
+ options: [],
617
+ handler: agentStreamHandler,
618
+ };
619
+ const agentStartOptions = [
620
+ {
621
+ name: 'prompt',
622
+ short: 'p',
623
+ description: 'Initial prompt to send to the agent',
624
+ hasValue: true,
625
+ },
626
+ {
627
+ name: 'mode',
628
+ short: 'm',
629
+ description: 'Spawn mode (headless, interactive)',
630
+ hasValue: true,
631
+ },
632
+ {
633
+ name: 'resume',
634
+ short: 'r',
635
+ description: 'Provider session ID to resume',
636
+ hasValue: true,
637
+ },
638
+ {
639
+ name: 'workdir',
640
+ short: 'w',
641
+ description: 'Working directory for the agent',
642
+ hasValue: true,
643
+ },
644
+ {
645
+ name: 'cols',
646
+ description: 'Terminal columns for interactive mode (default: 120)',
647
+ hasValue: true,
648
+ },
649
+ {
650
+ name: 'rows',
651
+ description: 'Terminal rows for interactive mode (default: 30)',
652
+ hasValue: true,
653
+ },
654
+ {
655
+ name: 'timeout',
656
+ description: 'Timeout in milliseconds (default: 120000)',
657
+ hasValue: true,
658
+ },
659
+ {
660
+ name: 'env',
661
+ short: 'e',
662
+ description: 'Environment variables (KEY=VALUE, can repeat)',
663
+ hasValue: true,
664
+ },
665
+ {
666
+ name: 'taskId',
667
+ short: 't',
668
+ description: 'Task ID to assign to this agent',
669
+ hasValue: true,
670
+ },
671
+ {
672
+ name: 'stream',
673
+ description: 'Stream agent output after spawning',
674
+ },
675
+ {
676
+ name: 'provider',
677
+ description: 'Override agent provider for this session',
678
+ hasValue: true,
679
+ },
680
+ {
681
+ name: 'model',
682
+ description: 'Override model for this session (e.g., claude-opus-4-6)',
683
+ hasValue: true,
684
+ },
685
+ ];
686
+ async function agentStartHandler(args, options) {
687
+ const [id] = args;
688
+ if (!id) {
689
+ return failure('Usage: sf agent start <id> [options]\nExample: sf agent start el-abc123 --prompt "Begin working"', ExitCode.INVALID_ARGUMENTS);
690
+ }
691
+ const { api, error } = await createOrchestratorClient(options);
692
+ if (error || !api) {
693
+ return failure(error ?? 'Failed to create API', ExitCode.GENERAL_ERROR);
694
+ }
695
+ try {
696
+ // Get the agent to verify it exists and get its role
697
+ const agent = await api.getAgent(id);
698
+ if (!agent) {
699
+ return failure(`Agent not found: ${id}`, ExitCode.NOT_FOUND);
700
+ }
701
+ const meta = getAgentMeta(agent);
702
+ const agentRole = meta.agentRole ?? 'worker';
703
+ // Import the spawner service
704
+ const { createSpawnerService } = await import('../../runtime/index.js');
705
+ const { findStoneforgeDir } = await import('@stoneforge/quarry');
706
+ // Parse environment variables
707
+ const environmentVariables = {};
708
+ if (options.env) {
709
+ const parts = options.env.split('=');
710
+ if (parts.length >= 2) {
711
+ const key = parts[0];
712
+ const value = parts.slice(1).join('=');
713
+ environmentVariables[key] = value;
714
+ }
715
+ }
716
+ const stoneforgeDir = findStoneforgeDir(process.cwd());
717
+ const spawner = createSpawnerService({
718
+ workingDirectory: options.workdir ?? process.cwd(),
719
+ stoneforgeRoot: stoneforgeDir ?? undefined,
720
+ timeout: options.timeout ? parseInt(options.timeout, 10) : undefined,
721
+ environmentVariables: Object.keys(environmentVariables).length > 0 ? environmentVariables : undefined,
722
+ });
723
+ // Determine spawn mode
724
+ let spawnMode;
725
+ if (options.mode) {
726
+ if (options.mode !== 'headless' && options.mode !== 'interactive') {
727
+ return failure(`Invalid mode: ${options.mode}. Must be 'headless' or 'interactive'`, ExitCode.VALIDATION);
728
+ }
729
+ spawnMode = options.mode;
730
+ }
731
+ // Spawn the agent
732
+ const result = await spawner.spawn(id, agentRole, {
733
+ initialPrompt: options.prompt,
734
+ mode: spawnMode,
735
+ resumeSessionId: options.resume,
736
+ workingDirectory: options.workdir,
737
+ cols: options.cols ? parseInt(options.cols, 10) : undefined,
738
+ rows: options.rows ? parseInt(options.rows, 10) : undefined,
739
+ });
740
+ // If task ID is provided, assign the task to this agent
741
+ if (options.taskId) {
742
+ await api.assignTaskToAgent(options.taskId, id, { sessionId: result.session.id });
743
+ }
744
+ // If --stream is set, stream the session output
745
+ if (options.stream) {
746
+ console.log(`Spawned agent ${id}`);
747
+ console.log(` Session ID: ${result.session.id}`);
748
+ console.log(` Mode: ${result.session.mode}`);
749
+ console.log('\nStreaming output (Press Ctrl+C to stop):\n');
750
+ await streamSpawnedSession(result.events, result.session.mode);
751
+ return success(result.session, 'Stream ended');
752
+ }
753
+ const mode = getOutputMode(options);
754
+ if (mode === 'json') {
755
+ return success({
756
+ sessionId: result.session.id,
757
+ providerSessionId: result.session.providerSessionId,
758
+ agentId: id,
759
+ status: result.session.status,
760
+ mode: result.session.mode,
761
+ pid: result.session.pid,
762
+ taskId: options.taskId,
763
+ });
764
+ }
765
+ if (mode === 'quiet') {
766
+ return success(result.session.id);
767
+ }
768
+ const lines = [
769
+ `Spawned agent ${id}`,
770
+ ` Session ID: ${result.session.id}`,
771
+ ` Provider ID: ${result.session.providerSessionId ?? '-'}`,
772
+ ` Status: ${result.session.status}`,
773
+ ` Mode: ${result.session.mode}`,
774
+ ` PID: ${result.session.pid ?? '-'}`,
775
+ ];
776
+ if (options.taskId) {
777
+ lines.push(` Task ID: ${options.taskId}`);
778
+ }
779
+ return success(result.session, lines.join('\n'));
780
+ }
781
+ catch (err) {
782
+ const message = err instanceof Error ? err.message : String(err);
783
+ return failure(`Failed to start agent: ${message}`, ExitCode.GENERAL_ERROR);
784
+ }
785
+ }
786
+ export const agentStartCommand = {
787
+ name: 'start',
788
+ description: 'Start an agent process',
789
+ usage: 'sf agent start <id> [options]',
790
+ help: `Start a new agent process.
791
+
792
+ Arguments:
793
+ id Agent identifier
794
+
795
+ Options:
796
+ -p, --prompt <text> Initial prompt to send to the agent
797
+ -m, --mode <mode> Start mode: headless, interactive
798
+ -r, --resume <id> Resume a previous session
799
+ -w, --workdir <path> Working directory for the agent
800
+ --cols <n> Terminal columns for interactive mode (default: 120)
801
+ --rows <n> Terminal rows for interactive mode (default: 30)
802
+ --timeout <ms> Timeout in milliseconds (default: 120000)
803
+ -e, --env <KEY=VALUE> Environment variable to set
804
+ -t, --taskId <id> Task ID to assign to this agent
805
+ --stream Stream agent output after starting
806
+ --provider <name> Override agent provider for this session
807
+ --model <model> Override model for this session
808
+
809
+ Examples:
810
+ sf agent start el-abc123
811
+ sf agent start el-abc123 --mode interactive
812
+ sf agent start el-abc123 --mode interactive --cols 160 --rows 40
813
+ sf agent start el-abc123 --prompt "Start working on your assigned tasks"
814
+ sf agent start el-abc123 --resume prev-session-id
815
+ sf agent start el-abc123 --env MY_VAR=value
816
+ sf agent start el-abc123 --taskId el-task456
817
+ sf agent start el-abc123 --stream
818
+ sf agent start el-abc123 --provider opencode
819
+ sf agent start el-abc123 --model claude-opus-4-6`,
820
+ options: agentStartOptions,
821
+ handler: agentStartHandler,
822
+ };
823
+ // ============================================================================
824
+ // Main Agent Command
825
+ // ============================================================================
826
+ export const agentCommand = {
827
+ name: 'agent',
828
+ description: 'Manage orchestrator agents',
829
+ usage: 'sf agent <subcommand> [options]',
830
+ help: `Manage orchestrator agents.
831
+
832
+ Subcommands:
833
+ list List all registered agents
834
+ show Show agent details
835
+ register Register a new agent
836
+ start Start an agent process
837
+ stop Stop an agent session
838
+ stream Get agent channel for streaming
839
+
840
+ Examples:
841
+ sf agent list
842
+ sf agent register MyWorker --role worker
843
+ sf agent start el-abc123
844
+ sf agent start el-abc123 --mode interactive`,
845
+ subcommands: {
846
+ list: agentListCommand,
847
+ show: agentShowCommand,
848
+ register: agentRegisterCommand,
849
+ start: agentStartCommand,
850
+ stop: agentStopCommand,
851
+ stream: agentStreamCommand,
852
+ // Aliases (hidden from --help via dedup in getCommandHelp)
853
+ create: agentRegisterCommand,
854
+ ls: agentListCommand,
855
+ get: agentShowCommand,
856
+ view: agentShowCommand,
857
+ },
858
+ handler: agentListCommand.handler, // Default to list
859
+ options: [],
860
+ };
861
+ //# sourceMappingURL=agent.js.map