@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,665 @@
1
+ /**
2
+ * Test Context for Orchestration E2E Tests
3
+ *
4
+ * Provides isolated test workspace setup and teardown for orchestration tests.
5
+ * Each test run gets a completely isolated temporary directory with:
6
+ * - Fresh git repository
7
+ * - Minimal project structure
8
+ * - Temporary SQLite database
9
+ * - All required services configured
10
+ *
11
+ * @module
12
+ */
13
+ import { mkdtemp, rm, mkdir, writeFile } from 'node:fs/promises';
14
+ import { existsSync } from 'node:fs';
15
+ import { tmpdir } from 'node:os';
16
+ import { join, dirname, resolve, delimiter } from 'node:path';
17
+ import { fileURLToPath } from 'node:url';
18
+ import { execSync } from 'node:child_process';
19
+ import { createTimestamp, createTask as coreCreateTask, asEntityId, asElementId } from '@stoneforge/core';
20
+ import { createStorage, initializeSchema, createInboxService } from '@stoneforge/quarry';
21
+ import { createOrchestratorAPI } from '../api/index.js';
22
+ import { createAgentRegistry } from '../services/agent-registry.js';
23
+ import { createDispatchDaemon } from '../services/dispatch-daemon.js';
24
+ import { createWorktreeManager } from '../git/worktree-manager.js';
25
+ import { createTaskAssignmentService } from '../services/task-assignment-service.js';
26
+ import { createDispatchService } from '../services/dispatch-service.js';
27
+ import { createStewardScheduler, createDefaultStewardExecutor } from '../services/steward-scheduler.js';
28
+ // ============================================================================
29
+ // Test Context Creation
30
+ // ============================================================================
31
+ /**
32
+ * Sets up an isolated test context for orchestration tests.
33
+ *
34
+ * Creates:
35
+ * - Temporary directory with git repo
36
+ * - Minimal project structure
37
+ * - Fresh SQLite database
38
+ * - All required services
39
+ *
40
+ * @param options - Setup options
41
+ * @returns The test context
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * const ctx = await setupTestContext({ verbose: true });
46
+ * try {
47
+ * // Run tests...
48
+ * } finally {
49
+ * await ctx.cleanup();
50
+ * }
51
+ * ```
52
+ */
53
+ export async function setupTestContext(options = {}) {
54
+ const verbose = options.verbose ?? false;
55
+ const tempPrefix = options.tempPrefix ?? 'orchestration-test-';
56
+ const pollIntervalMs = options.pollIntervalMs ?? 2000;
57
+ const mode = options.mode ?? 'mock';
58
+ const log = (message) => {
59
+ if (verbose) {
60
+ console.log(` ${message}`);
61
+ }
62
+ };
63
+ // 1. Create isolated temp workspace
64
+ const tempWorkspace = await mkdtemp(join(tmpdir(), tempPrefix));
65
+ log(`Created temp workspace: ${tempWorkspace}`);
66
+ try {
67
+ // 2. Initialize git repo
68
+ await initializeGitRepo(tempWorkspace);
69
+ log('Initialized git repository');
70
+ // 3. Create minimal project structure
71
+ await createProjectStructure(tempWorkspace);
72
+ log('Created project structure');
73
+ // 4. Create initial commit
74
+ execSync('git add -A && git commit -m "Initial commit"', {
75
+ cwd: tempWorkspace,
76
+ stdio: 'pipe',
77
+ });
78
+ log('Created initial commit');
79
+ // 4b. Create bare repo as fake remote (allows workers to push branches)
80
+ const bareRepoPath = join(tempWorkspace, '.test-remote.git');
81
+ execSync(`git init --bare "${bareRepoPath}"`, { stdio: 'pipe' });
82
+ execSync(`git remote add origin "${bareRepoPath}"`, { cwd: tempWorkspace, stdio: 'pipe' });
83
+ const defaultBranch = execSync('git branch --show-current', { cwd: tempWorkspace, encoding: 'utf-8' }).trim();
84
+ execSync(`git push -u origin ${defaultBranch}`, { cwd: tempWorkspace, stdio: 'pipe' });
85
+ log('Created local bare remote');
86
+ // 5. Initialize Stoneforge database
87
+ const stoneforgeDir = join(tempWorkspace, '.stoneforge');
88
+ await mkdir(stoneforgeDir, { recursive: true });
89
+ const dbPath = join(stoneforgeDir, 'stoneforge.db');
90
+ const storage = createStorage({ path: dbPath, create: true });
91
+ initializeSchema(storage);
92
+ log(`Initialized database: ${dbPath}`);
93
+ // 6. Create API and system entity
94
+ const api = createOrchestratorAPI(storage);
95
+ const stoneforgeApi = api;
96
+ const systemEntity = await createSystemEntity(stoneforgeApi);
97
+ log(`Created system entity: ${systemEntity}`);
98
+ // 7. Create all services
99
+ const agentRegistry = createAgentRegistry(api);
100
+ const taskAssignment = createTaskAssignmentService(api);
101
+ const inboxService = createInboxService(storage);
102
+ const dispatchService = createDispatchService(api, taskAssignment, agentRegistry);
103
+ const worktreeManager = createWorktreeManager({
104
+ workspaceRoot: tempWorkspace,
105
+ worktreeDir: '.stoneforge/.worktrees',
106
+ });
107
+ await worktreeManager.initWorkspace();
108
+ log('Initialized worktree manager');
109
+ const stewardScheduler = createStewardScheduler(agentRegistry, createDefaultStewardExecutor());
110
+ // 8. Create session manager (mock or real)
111
+ let sessionManager;
112
+ if (mode === 'real') {
113
+ const { createSpawnerService } = await import('../runtime/spawner.js');
114
+ const { createSessionManager: createRealSessionManager } = await import('../runtime/session-manager.js');
115
+ const elBinDir = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..', 'node_modules', '.bin');
116
+ const spawner = createSpawnerService({
117
+ workingDirectory: tempWorkspace,
118
+ stoneforgeRoot: tempWorkspace,
119
+ environmentVariables: {
120
+ PATH: `${elBinDir}${delimiter}${process.env.PATH ?? ''}`,
121
+ },
122
+ });
123
+ sessionManager = createRealSessionManager(spawner, stoneforgeApi, agentRegistry);
124
+ log('Created real session manager (spawner-backed)');
125
+ }
126
+ else {
127
+ sessionManager = createMockSessionManager(agentRegistry);
128
+ log('Created mock session manager');
129
+ }
130
+ // 8b. Write test prompt overrides for real mode
131
+ if (mode === 'real') {
132
+ await writeTestPromptOverrides(tempWorkspace);
133
+ log('Wrote test prompt overrides');
134
+ }
135
+ // 9. Create dispatch daemon
136
+ // In real mode, enforce a max session duration so stuck workers
137
+ // get reaped and don't block subsequent test dispatches.
138
+ const daemon = createDispatchDaemon(stoneforgeApi, agentRegistry, sessionManager, dispatchService, worktreeManager, taskAssignment, stewardScheduler, inboxService, {
139
+ pollIntervalMs,
140
+ maxSessionDurationMs: mode === 'real' ? 180_000 : 0,
141
+ });
142
+ // 10. Start daemon if not skipped
143
+ if (!options.skipDaemonStart) {
144
+ await daemon.start();
145
+ log('Started dispatch daemon');
146
+ }
147
+ // 11. Cleanup function
148
+ const cleanup = async () => {
149
+ log('Cleaning up test context...');
150
+ // Stop daemon
151
+ await daemon.stop();
152
+ log('Stopped daemon');
153
+ // Stop any running sessions with grace period for real mode
154
+ const running = sessionManager.listSessions({ status: 'running' });
155
+ const starting = sessionManager.listSessions({ status: 'starting' });
156
+ const sessionsToStop = [...running, ...starting];
157
+ for (const session of sessionsToStop) {
158
+ try {
159
+ if (mode === 'real') {
160
+ // Give real sessions a grace period before force-terminating
161
+ const gracefulStop = sessionManager.stopSession(session.id, { graceful: true });
162
+ const forceStop = new Promise((resolve) => setTimeout(async () => {
163
+ try {
164
+ await sessionManager.stopSession(session.id, { graceful: false });
165
+ }
166
+ catch { /* ignore */ }
167
+ resolve();
168
+ }, 5000));
169
+ await Promise.race([gracefulStop, forceStop]);
170
+ }
171
+ else {
172
+ await sessionManager.stopSession(session.id, { graceful: false });
173
+ }
174
+ }
175
+ catch { /* ignore */ }
176
+ }
177
+ log(`Terminated ${sessionsToStop.length} sessions`);
178
+ // Clean up worktrees
179
+ try {
180
+ const worktrees = await worktreeManager.listWorktrees();
181
+ for (const wt of worktrees) {
182
+ try {
183
+ await worktreeManager.removeWorktree(wt.path, { force: true });
184
+ }
185
+ catch { /* ignore */ }
186
+ }
187
+ log(`Cleaned up ${worktrees.length} worktrees`);
188
+ }
189
+ catch { /* ignore */ }
190
+ // Delete temp workspace
191
+ if (existsSync(tempWorkspace)) {
192
+ await rm(tempWorkspace, { recursive: true, force: true });
193
+ log('Deleted temp workspace');
194
+ }
195
+ };
196
+ // Safety net: clean up on process termination
197
+ const sigintHandler = () => {
198
+ cleanup().catch(() => { }).finally(() => process.exit(1));
199
+ };
200
+ process.on('SIGINT', sigintHandler);
201
+ process.on('SIGTERM', sigintHandler);
202
+ return {
203
+ api,
204
+ stoneforgeApi,
205
+ daemon,
206
+ sessionManager,
207
+ agentRegistry,
208
+ worktreeManager,
209
+ taskAssignment,
210
+ dispatchService,
211
+ stewardScheduler,
212
+ inboxService,
213
+ tempWorkspace,
214
+ dbPath,
215
+ systemEntityId: systemEntity,
216
+ log,
217
+ verbose,
218
+ mode,
219
+ cleanup,
220
+ };
221
+ }
222
+ catch (error) {
223
+ // Cleanup on setup failure
224
+ if (existsSync(tempWorkspace)) {
225
+ await rm(tempWorkspace, { recursive: true, force: true });
226
+ }
227
+ throw error;
228
+ }
229
+ }
230
+ // ============================================================================
231
+ // Git Repository Setup
232
+ // ============================================================================
233
+ /**
234
+ * Initializes a git repository in the given directory.
235
+ */
236
+ async function initializeGitRepo(dir) {
237
+ execSync('git init', { cwd: dir, stdio: 'pipe' });
238
+ execSync('git config user.email "test@orchestration-test.local"', {
239
+ cwd: dir,
240
+ stdio: 'pipe',
241
+ });
242
+ execSync('git config user.name "Orchestration Test"', {
243
+ cwd: dir,
244
+ stdio: 'pipe',
245
+ });
246
+ }
247
+ /**
248
+ * Creates a minimal project structure for testing.
249
+ */
250
+ async function createProjectStructure(dir) {
251
+ // Create directories
252
+ await mkdir(join(dir, 'src'), { recursive: true });
253
+ await mkdir(join(dir, '.stoneforge'), { recursive: true });
254
+ // Create package.json
255
+ await writeFile(join(dir, 'package.json'), JSON.stringify({
256
+ name: 'test-project',
257
+ version: '1.0.0',
258
+ type: 'module',
259
+ scripts: {
260
+ test: 'echo "No tests configured"',
261
+ build: 'echo "No build configured"',
262
+ },
263
+ }, null, 2));
264
+ // Create src/index.ts
265
+ await writeFile(join(dir, 'src/index.ts'), `/**
266
+ * Test project entry point
267
+ * Agents can modify this file during tests.
268
+ */
269
+
270
+ export function hello(): string {
271
+ return 'Hello, World!';
272
+ }
273
+
274
+ export function add(a: number, b: number): number {
275
+ return a + b;
276
+ }
277
+ `);
278
+ // Create README.md
279
+ await writeFile(join(dir, 'README.md'), `# Test Project
280
+
281
+ This is a minimal test project for orchestration E2E testing.
282
+ Agents can modify files in this project during tests.
283
+ `);
284
+ // Create .gitignore
285
+ await writeFile(join(dir, '.gitignore'), `node_modules/
286
+ dist/
287
+ .stoneforge/.worktrees/
288
+ .test-remote.git/
289
+ *.db
290
+ *.db-journal
291
+ `);
292
+ }
293
+ /**
294
+ * Creates a system entity for test operations.
295
+ */
296
+ async function createSystemEntity(api) {
297
+ const { createEntity, EntityTypeValue } = await import('@stoneforge/core');
298
+ const entity = await createEntity({
299
+ name: 'test-system',
300
+ entityType: EntityTypeValue.SYSTEM,
301
+ createdBy: 'system:test',
302
+ tags: ['test', 'system'],
303
+ metadata: { description: 'System entity for orchestration tests' },
304
+ });
305
+ const saved = await api.create(entity);
306
+ return asEntityId(saved.id);
307
+ }
308
+ // ============================================================================
309
+ // Test Prompt Overrides (Real Mode)
310
+ // ============================================================================
311
+ /**
312
+ * Writes constrained prompt overrides into the workspace for real-mode testing.
313
+ * These instruct agents to work fast, skip exploration, and use the `sf` CLI.
314
+ */
315
+ async function writeTestPromptOverrides(workspacePath) {
316
+ const { buildTestWorkerOverride, buildTestDirectorOverride, buildTestStewardOverride, } = await import('./test-prompts.js');
317
+ const promptsDir = join(workspacePath, '.stoneforge', 'prompts');
318
+ await mkdir(promptsDir, { recursive: true });
319
+ await writeFile(join(promptsDir, 'worker.md'), buildTestWorkerOverride());
320
+ await writeFile(join(promptsDir, 'director.md'), buildTestDirectorOverride());
321
+ await writeFile(join(promptsDir, 'steward.md'), buildTestStewardOverride());
322
+ }
323
+ // ============================================================================
324
+ // Mock Session Manager
325
+ // ============================================================================
326
+ /**
327
+ * Creates a mock session manager that simulates agent sessions
328
+ * without actually spawning Claude processes.
329
+ */
330
+ export function createMockSessionManager(agentRegistry) {
331
+ const sessions = new Map();
332
+ const agentSessions = new Map();
333
+ const mockSessions = new Map();
334
+ const { EventEmitter } = require('node:events');
335
+ let sessionCounter = 0;
336
+ const manager = {
337
+ mockSessions,
338
+ createMockSession(agentId, options = {}) {
339
+ const id = `mock-session-${++sessionCounter}-${Date.now()}`;
340
+ const events = new EventEmitter();
341
+ const mockSession = {
342
+ id,
343
+ agentId,
344
+ workingDirectory: options.workingDirectory ?? process.cwd(),
345
+ worktree: options.worktree,
346
+ status: 'running',
347
+ events,
348
+ };
349
+ mockSessions.set(id, mockSession);
350
+ // Also create a session record
351
+ const record = {
352
+ id,
353
+ agentId,
354
+ agentRole: 'worker',
355
+ mode: 'headless',
356
+ status: 'running',
357
+ workingDirectory: mockSession.workingDirectory,
358
+ worktree: mockSession.worktree,
359
+ createdAt: createTimestamp(),
360
+ lastActivityAt: createTimestamp(),
361
+ };
362
+ sessions.set(id, record);
363
+ agentSessions.set(agentId, id);
364
+ return mockSession;
365
+ },
366
+ completeMockSession(sessionId) {
367
+ const mock = mockSessions.get(sessionId);
368
+ if (mock) {
369
+ mock.status = 'terminated';
370
+ mock.events.emit('exit', 0, null);
371
+ }
372
+ const session = sessions.get(sessionId);
373
+ if (session) {
374
+ sessions.set(sessionId, {
375
+ ...session,
376
+ status: 'terminated',
377
+ endedAt: createTimestamp(),
378
+ });
379
+ agentSessions.delete(session.agentId);
380
+ }
381
+ },
382
+ async startSession(agentId, options) {
383
+ const existing = agentSessions.get(agentId);
384
+ if (existing && sessions.get(existing)?.status === 'running') {
385
+ throw new Error(`Agent ${agentId} already has an active session`);
386
+ }
387
+ const agent = await agentRegistry.getAgent(agentId);
388
+ const agentMeta = agent?.metadata?.agent;
389
+ const agentRole = agentMeta?.agentRole ?? 'worker';
390
+ const id = `mock-session-${++sessionCounter}-${Date.now()}`;
391
+ const events = new EventEmitter();
392
+ const session = {
393
+ id,
394
+ agentId,
395
+ agentRole,
396
+ mode: 'headless',
397
+ status: 'running',
398
+ workingDirectory: options?.workingDirectory ?? process.cwd(),
399
+ worktree: options?.worktree,
400
+ createdAt: createTimestamp(),
401
+ startedAt: createTimestamp(),
402
+ lastActivityAt: createTimestamp(),
403
+ };
404
+ sessions.set(id, session);
405
+ agentSessions.set(agentId, id);
406
+ const mockSession = {
407
+ id,
408
+ agentId,
409
+ workingDirectory: session.workingDirectory,
410
+ worktree: session.worktree,
411
+ status: 'running',
412
+ events,
413
+ };
414
+ mockSessions.set(id, mockSession);
415
+ // Simulate Claude session ID
416
+ const providerSessionId = `claude-${id}`;
417
+ sessions.set(id, { ...session, providerSessionId });
418
+ // Update agent status
419
+ await agentRegistry.updateAgentSession(agentId, providerSessionId, 'running');
420
+ return { session: sessions.get(id), events };
421
+ },
422
+ async resumeSession(agentId, options) {
423
+ return this.startSession(agentId, {
424
+ workingDirectory: options.workingDirectory,
425
+ worktree: options.worktree,
426
+ });
427
+ },
428
+ async stopSession(sessionId, options) {
429
+ const session = sessions.get(sessionId);
430
+ if (!session) {
431
+ throw new Error(`Session not found: ${sessionId}`);
432
+ }
433
+ sessions.set(sessionId, {
434
+ ...session,
435
+ status: 'terminated',
436
+ endedAt: createTimestamp(),
437
+ terminationReason: options?.reason,
438
+ });
439
+ agentSessions.delete(session.agentId);
440
+ const mock = mockSessions.get(sessionId);
441
+ if (mock) {
442
+ mock.status = 'terminated';
443
+ mock.events.emit('exit', 0, null);
444
+ }
445
+ await agentRegistry.updateAgentSession(session.agentId, undefined, 'idle');
446
+ },
447
+ async suspendSession(sessionId, reason) {
448
+ const session = sessions.get(sessionId);
449
+ if (!session) {
450
+ throw new Error(`Session not found: ${sessionId}`);
451
+ }
452
+ sessions.set(sessionId, {
453
+ ...session,
454
+ status: 'suspended',
455
+ endedAt: createTimestamp(),
456
+ terminationReason: reason,
457
+ });
458
+ agentSessions.delete(session.agentId);
459
+ await agentRegistry.updateAgentSession(session.agentId, session.providerSessionId, 'suspended');
460
+ },
461
+ async interruptSession(sessionId) {
462
+ const mock = mockSessions.get(sessionId);
463
+ if (mock) {
464
+ mock.events.emit('interrupt');
465
+ }
466
+ },
467
+ getSession(sessionId) {
468
+ return sessions.get(sessionId);
469
+ },
470
+ getActiveSession(agentId) {
471
+ const sessionId = agentSessions.get(agentId);
472
+ if (!sessionId)
473
+ return undefined;
474
+ const session = sessions.get(sessionId);
475
+ if (!session || session.status !== 'running')
476
+ return undefined;
477
+ return session;
478
+ },
479
+ listSessions(filter) {
480
+ let result = Array.from(sessions.values());
481
+ if (filter) {
482
+ if (filter.agentId) {
483
+ result = result.filter(s => s.agentId === filter.agentId);
484
+ }
485
+ if (filter.role) {
486
+ result = result.filter(s => s.agentRole === filter.role);
487
+ }
488
+ if (filter.status) {
489
+ const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];
490
+ result = result.filter(s => statuses.includes(s.status));
491
+ }
492
+ }
493
+ return result;
494
+ },
495
+ getMostRecentResumableSession(agentId) {
496
+ const agentSessionList = Array.from(sessions.values())
497
+ .filter(s => s.agentId === agentId && s.providerSessionId)
498
+ .sort((a, b) => {
499
+ const aTime = typeof a.createdAt === 'number' ? a.createdAt : new Date(a.createdAt).getTime();
500
+ const bTime = typeof b.createdAt === 'number' ? b.createdAt : new Date(b.createdAt).getTime();
501
+ return bTime - aTime;
502
+ });
503
+ return agentSessionList[0];
504
+ },
505
+ async getSessionHistory(agentId, limit = 10) {
506
+ return Array.from(sessions.values())
507
+ .filter(s => s.agentId === agentId)
508
+ .slice(0, limit)
509
+ .map(s => ({
510
+ id: s.id,
511
+ providerSessionId: s.providerSessionId,
512
+ status: s.status,
513
+ workingDirectory: s.workingDirectory,
514
+ worktree: s.worktree,
515
+ startedAt: s.startedAt,
516
+ endedAt: s.endedAt,
517
+ terminationReason: s.terminationReason,
518
+ }));
519
+ },
520
+ async getSessionHistoryByRole(role, limit = 10) {
521
+ return Array.from(sessions.values())
522
+ .filter(s => s.agentRole === role)
523
+ .slice(0, limit)
524
+ .map(s => ({
525
+ id: s.id,
526
+ providerSessionId: s.providerSessionId,
527
+ status: s.status,
528
+ workingDirectory: s.workingDirectory,
529
+ worktree: s.worktree,
530
+ startedAt: s.startedAt,
531
+ endedAt: s.endedAt,
532
+ terminationReason: s.terminationReason,
533
+ role: s.agentRole,
534
+ agentId: s.agentId,
535
+ agentName: undefined,
536
+ }));
537
+ },
538
+ async getPreviousSession(role) {
539
+ const history = await this.getSessionHistoryByRole(role, 1);
540
+ return history.find(s => s.status === 'suspended' || s.status === 'terminated');
541
+ },
542
+ async messageSession(sessionId, _options) {
543
+ const session = sessions.get(sessionId);
544
+ if (!session) {
545
+ return { success: false, error: `Session not found: ${sessionId}` };
546
+ }
547
+ const mock = mockSessions.get(sessionId);
548
+ if (mock) {
549
+ mock.events.emit('message', _options);
550
+ }
551
+ return { success: true };
552
+ },
553
+ getEventEmitter(sessionId) {
554
+ return mockSessions.get(sessionId)?.events;
555
+ },
556
+ recordUserInput(_sessionId) {
557
+ // No-op for mock
558
+ },
559
+ getSessionUserIdleMs(_agentId) {
560
+ return undefined;
561
+ },
562
+ async persistSession(_sessionId) {
563
+ // No-op for mock
564
+ },
565
+ async loadSessionState(_agentId) {
566
+ // No-op for mock
567
+ },
568
+ async reconcileOnStartup() {
569
+ return { reconciled: 0, errors: [] };
570
+ },
571
+ };
572
+ return manager;
573
+ }
574
+ // ============================================================================
575
+ // Test Data Helpers
576
+ // ============================================================================
577
+ /**
578
+ * Creates a test worker agent.
579
+ */
580
+ export async function createTestWorker(ctx, name, options = {}) {
581
+ return ctx.api.registerWorker({
582
+ name,
583
+ createdBy: ctx.systemEntityId,
584
+ workerMode: options.workerMode ?? 'ephemeral',
585
+ maxConcurrentTasks: 1,
586
+ tags: ['test'],
587
+ });
588
+ }
589
+ /**
590
+ * Creates a test director agent.
591
+ */
592
+ export async function createTestDirector(ctx, name) {
593
+ return ctx.api.registerDirector({
594
+ name,
595
+ createdBy: ctx.systemEntityId,
596
+ maxConcurrentTasks: 5,
597
+ tags: ['test'],
598
+ });
599
+ }
600
+ /**
601
+ * Creates a test steward agent.
602
+ */
603
+ export async function createTestSteward(ctx, name, options = {}) {
604
+ return ctx.api.registerSteward({
605
+ name,
606
+ createdBy: ctx.systemEntityId,
607
+ stewardFocus: options.focus ?? 'merge',
608
+ triggers: options.triggers ?? [],
609
+ maxConcurrentTasks: 1,
610
+ tags: ['test'],
611
+ });
612
+ }
613
+ /**
614
+ * Creates a test task.
615
+ */
616
+ export async function createTestTask(ctx, title, options = {}) {
617
+ // Create task using core factory
618
+ const task = await coreCreateTask({
619
+ title,
620
+ createdBy: ctx.systemEntityId,
621
+ priority: (options.priority ?? 5),
622
+ tags: options.tags ?? ['test'],
623
+ acceptanceCriteria: options.acceptanceCriteria,
624
+ });
625
+ // Save to database
626
+ const saved = await ctx.api.create(task);
627
+ return saved;
628
+ }
629
+ /**
630
+ * Sends a message to an agent's channel.
631
+ */
632
+ export async function sendTestMessage(ctx, agentId, content) {
633
+ const channelId = await ctx.api.getAgentChannel(agentId);
634
+ if (!channelId) {
635
+ throw new Error(`Agent ${agentId} has no channel`);
636
+ }
637
+ // Create a document for the message content
638
+ const doc = await ctx.stoneforgeApi.create({
639
+ type: 'document',
640
+ kind: 'document',
641
+ subKind: 'message',
642
+ title: 'Test Message',
643
+ content,
644
+ metadata: {},
645
+ tags: ['test'],
646
+ createdBy: ctx.systemEntityId,
647
+ createdAt: createTimestamp(),
648
+ updatedAt: createTimestamp(),
649
+ });
650
+ // Create the message
651
+ await ctx.stoneforgeApi.create({
652
+ type: 'message',
653
+ kind: 'message',
654
+ subKind: 'direct',
655
+ channel: channelId,
656
+ sender: ctx.systemEntityId,
657
+ contentRef: asElementId(doc.id),
658
+ metadata: {},
659
+ tags: ['test'],
660
+ createdBy: ctx.systemEntityId,
661
+ createdAt: createTimestamp(),
662
+ updatedAt: createTimestamp(),
663
+ });
664
+ }
665
+ //# sourceMappingURL=test-context.js.map