maestro-flow 0.3.0 → 0.3.2

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 (425) hide show
  1. package/.claude/commands/maestro-overlay.md +178 -122
  2. package/.claude/commands/manage-harvest.md +4 -4
  3. package/.codex/skills/maestro-coordinate/SKILL.md +3 -4
  4. package/dist/src/commands/launcher.js +1 -1
  5. package/dist/src/commands/launcher.js.map +1 -1
  6. package/dist/src/commands/overlay-ui/OverlayList.d.ts +35 -0
  7. package/dist/src/commands/overlay-ui/OverlayList.d.ts.map +1 -0
  8. package/dist/src/commands/overlay-ui/OverlayList.js +143 -0
  9. package/dist/src/commands/overlay-ui/OverlayList.js.map +1 -0
  10. package/dist/src/commands/overlay-ui/index.d.ts +2 -0
  11. package/dist/src/commands/overlay-ui/index.d.ts.map +1 -0
  12. package/dist/src/commands/overlay-ui/index.js +188 -0
  13. package/dist/src/commands/overlay-ui/index.js.map +1 -0
  14. package/dist/src/commands/overlay.d.ts.map +1 -1
  15. package/dist/src/commands/overlay.js +79 -59
  16. package/dist/src/commands/overlay.js.map +1 -1
  17. package/dist/src/core/overlay/applier.d.ts +32 -1
  18. package/dist/src/core/overlay/applier.d.ts.map +1 -1
  19. package/dist/src/core/overlay/applier.js +109 -1
  20. package/dist/src/core/overlay/applier.js.map +1 -1
  21. package/package.json +1 -1
  22. package/dist/agents/cli-agent-runner.d.ts +0 -131
  23. package/dist/agents/cli-agent-runner.d.ts.map +0 -1
  24. package/dist/agents/cli-agent-runner.js +0 -688
  25. package/dist/agents/cli-agent-runner.js.map +0 -1
  26. package/dist/agents/cli-history-store.d.ts +0 -63
  27. package/dist/agents/cli-history-store.d.ts.map +0 -1
  28. package/dist/agents/cli-history-store.js +0 -242
  29. package/dist/agents/cli-history-store.js.map +0 -1
  30. package/dist/agents/dashboard-bridge.d.ts +0 -39
  31. package/dist/agents/dashboard-bridge.d.ts.map +0 -1
  32. package/dist/agents/dashboard-bridge.js +0 -76
  33. package/dist/agents/dashboard-bridge.js.map +0 -1
  34. package/dist/agents/parallel-cli-runner.d.ts +0 -46
  35. package/dist/agents/parallel-cli-runner.d.ts.map +0 -1
  36. package/dist/agents/parallel-cli-runner.js +0 -277
  37. package/dist/agents/parallel-cli-runner.js.map +0 -1
  38. package/dist/agents/terminal-adapter.d.ts +0 -94
  39. package/dist/agents/terminal-adapter.d.ts.map +0 -1
  40. package/dist/agents/terminal-adapter.js +0 -132
  41. package/dist/agents/terminal-adapter.js.map +0 -1
  42. package/dist/agents/terminal-backend.d.ts +0 -53
  43. package/dist/agents/terminal-backend.d.ts.map +0 -1
  44. package/dist/agents/terminal-backend.js +0 -286
  45. package/dist/agents/terminal-backend.js.map +0 -1
  46. package/dist/async/delegate-broker-client.d.ts +0 -22
  47. package/dist/async/delegate-broker-client.d.ts.map +0 -1
  48. package/dist/async/delegate-broker-client.js +0 -47
  49. package/dist/async/delegate-broker-client.js.map +0 -1
  50. package/dist/async/delegate-broker.d.ts +0 -180
  51. package/dist/async/delegate-broker.d.ts.map +0 -1
  52. package/dist/async/delegate-broker.js +0 -1040
  53. package/dist/async/delegate-broker.js.map +0 -1
  54. package/dist/async/delegate-control.d.ts +0 -37
  55. package/dist/async/delegate-control.d.ts.map +0 -1
  56. package/dist/async/delegate-control.js +0 -155
  57. package/dist/async/delegate-control.js.map +0 -1
  58. package/dist/async/index.d.ts +0 -3
  59. package/dist/async/index.d.ts.map +0 -1
  60. package/dist/async/index.js +0 -3
  61. package/dist/async/index.js.map +0 -1
  62. package/dist/cli.d.ts +0 -2
  63. package/dist/cli.d.ts.map +0 -1
  64. package/dist/cli.js +0 -40
  65. package/dist/cli.js.map +0 -1
  66. package/dist/commands/cli.d.ts +0 -3
  67. package/dist/commands/cli.d.ts.map +0 -1
  68. package/dist/commands/cli.js +0 -262
  69. package/dist/commands/cli.js.map +0 -1
  70. package/dist/commands/coordinate.d.ts +0 -3
  71. package/dist/commands/coordinate.d.ts.map +0 -1
  72. package/dist/commands/coordinate.js +0 -275
  73. package/dist/commands/coordinate.js.map +0 -1
  74. package/dist/commands/delegate.d.ts +0 -37
  75. package/dist/commands/delegate.d.ts.map +0 -1
  76. package/dist/commands/delegate.js +0 -470
  77. package/dist/commands/delegate.js.map +0 -1
  78. package/dist/commands/ext.d.ts +0 -3
  79. package/dist/commands/ext.d.ts.map +0 -1
  80. package/dist/commands/ext.js +0 -28
  81. package/dist/commands/ext.js.map +0 -1
  82. package/dist/commands/hooks.d.ts +0 -3
  83. package/dist/commands/hooks.d.ts.map +0 -1
  84. package/dist/commands/hooks.js +0 -126
  85. package/dist/commands/hooks.js.map +0 -1
  86. package/dist/commands/install.d.ts +0 -3
  87. package/dist/commands/install.d.ts.map +0 -1
  88. package/dist/commands/install.js +0 -621
  89. package/dist/commands/install.js.map +0 -1
  90. package/dist/commands/launcher.d.ts +0 -3
  91. package/dist/commands/launcher.d.ts.map +0 -1
  92. package/dist/commands/launcher.js +0 -635
  93. package/dist/commands/launcher.js.map +0 -1
  94. package/dist/commands/link-coordinate.d.ts +0 -3
  95. package/dist/commands/link-coordinate.d.ts.map +0 -1
  96. package/dist/commands/link-coordinate.js +0 -225
  97. package/dist/commands/link-coordinate.js.map +0 -1
  98. package/dist/commands/msg.d.ts +0 -3
  99. package/dist/commands/msg.d.ts.map +0 -1
  100. package/dist/commands/msg.js +0 -110
  101. package/dist/commands/msg.js.map +0 -1
  102. package/dist/commands/overlay.d.ts +0 -3
  103. package/dist/commands/overlay.d.ts.map +0 -1
  104. package/dist/commands/overlay.js +0 -243
  105. package/dist/commands/overlay.js.map +0 -1
  106. package/dist/commands/run.d.ts +0 -3
  107. package/dist/commands/run.d.ts.map +0 -1
  108. package/dist/commands/run.js +0 -15
  109. package/dist/commands/run.js.map +0 -1
  110. package/dist/commands/serve.d.ts +0 -3
  111. package/dist/commands/serve.d.ts.map +0 -1
  112. package/dist/commands/serve.js +0 -16
  113. package/dist/commands/serve.js.map +0 -1
  114. package/dist/commands/spec.d.ts +0 -8
  115. package/dist/commands/spec.d.ts.map +0 -1
  116. package/dist/commands/spec.js +0 -147
  117. package/dist/commands/spec.js.map +0 -1
  118. package/dist/commands/stop.d.ts +0 -3
  119. package/dist/commands/stop.d.ts.map +0 -1
  120. package/dist/commands/stop.js +0 -218
  121. package/dist/commands/stop.js.map +0 -1
  122. package/dist/commands/tool.d.ts +0 -3
  123. package/dist/commands/tool.d.ts.map +0 -1
  124. package/dist/commands/tool.js +0 -29
  125. package/dist/commands/tool.js.map +0 -1
  126. package/dist/commands/uninstall.d.ts +0 -3
  127. package/dist/commands/uninstall.d.ts.map +0 -1
  128. package/dist/commands/uninstall.js +0 -77
  129. package/dist/commands/uninstall.js.map +0 -1
  130. package/dist/commands/view.d.ts +0 -3
  131. package/dist/commands/view.d.ts.map +0 -1
  132. package/dist/commands/view.js +0 -337
  133. package/dist/commands/view.js.map +0 -1
  134. package/dist/config/cli-tools-config.d.ts +0 -26
  135. package/dist/config/cli-tools-config.d.ts.map +0 -1
  136. package/dist/config/cli-tools-config.js +0 -49
  137. package/dist/config/cli-tools-config.js.map +0 -1
  138. package/dist/config/cli-tools-config.test.d.ts +0 -2
  139. package/dist/config/cli-tools-config.test.d.ts.map +0 -1
  140. package/dist/config/cli-tools-config.test.js +0 -59
  141. package/dist/config/cli-tools-config.test.js.map +0 -1
  142. package/dist/config/index.d.ts +0 -4
  143. package/dist/config/index.d.ts.map +0 -1
  144. package/dist/config/index.js +0 -27
  145. package/dist/config/index.js.map +0 -1
  146. package/dist/config/paths.d.ts +0 -15
  147. package/dist/config/paths.d.ts.map +0 -1
  148. package/dist/config/paths.js +0 -27
  149. package/dist/config/paths.js.map +0 -1
  150. package/dist/config/template-discovery.d.ts +0 -32
  151. package/dist/config/template-discovery.d.ts.map +0 -1
  152. package/dist/config/template-discovery.js +0 -128
  153. package/dist/config/template-discovery.js.map +0 -1
  154. package/dist/coordinator/cli-executor.d.ts +0 -22
  155. package/dist/coordinator/cli-executor.d.ts.map +0 -1
  156. package/dist/coordinator/cli-executor.js +0 -49
  157. package/dist/coordinator/cli-executor.js.map +0 -1
  158. package/dist/coordinator/expr-evaluator.d.ts +0 -11
  159. package/dist/coordinator/expr-evaluator.d.ts.map +0 -1
  160. package/dist/coordinator/expr-evaluator.js +0 -351
  161. package/dist/coordinator/expr-evaluator.js.map +0 -1
  162. package/dist/coordinator/graph-loader.d.ts +0 -16
  163. package/dist/coordinator/graph-loader.d.ts.map +0 -1
  164. package/dist/coordinator/graph-loader.js +0 -190
  165. package/dist/coordinator/graph-loader.js.map +0 -1
  166. package/dist/coordinator/graph-types.d.ts +0 -304
  167. package/dist/coordinator/graph-types.d.ts.map +0 -1
  168. package/dist/coordinator/graph-types.js +0 -6
  169. package/dist/coordinator/graph-types.js.map +0 -1
  170. package/dist/coordinator/graph-walker.d.ts +0 -51
  171. package/dist/coordinator/graph-walker.d.ts.map +0 -1
  172. package/dist/coordinator/graph-walker.js +0 -666
  173. package/dist/coordinator/graph-walker.js.map +0 -1
  174. package/dist/coordinator/index.d.ts +0 -13
  175. package/dist/coordinator/index.d.ts.map +0 -1
  176. package/dist/coordinator/index.js +0 -14
  177. package/dist/coordinator/index.js.map +0 -1
  178. package/dist/coordinator/intent-router.d.ts +0 -11
  179. package/dist/coordinator/intent-router.d.ts.map +0 -1
  180. package/dist/coordinator/intent-router.js +0 -65
  181. package/dist/coordinator/intent-router.js.map +0 -1
  182. package/dist/coordinator/link-session.d.ts +0 -29
  183. package/dist/coordinator/link-session.d.ts.map +0 -1
  184. package/dist/coordinator/link-session.js +0 -192
  185. package/dist/coordinator/link-session.js.map +0 -1
  186. package/dist/coordinator/link-walker.d.ts +0 -56
  187. package/dist/coordinator/link-walker.d.ts.map +0 -1
  188. package/dist/coordinator/link-walker.js +0 -548
  189. package/dist/coordinator/link-walker.js.map +0 -1
  190. package/dist/coordinator/output-parser.d.ts +0 -5
  191. package/dist/coordinator/output-parser.d.ts.map +0 -1
  192. package/dist/coordinator/output-parser.js +0 -114
  193. package/dist/coordinator/output-parser.js.map +0 -1
  194. package/dist/coordinator/parallel-executor.d.ts +0 -24
  195. package/dist/coordinator/parallel-executor.d.ts.map +0 -1
  196. package/dist/coordinator/parallel-executor.js +0 -43
  197. package/dist/coordinator/parallel-executor.js.map +0 -1
  198. package/dist/coordinator/prompt-assembler.d.ts +0 -15
  199. package/dist/coordinator/prompt-assembler.d.ts.map +0 -1
  200. package/dist/coordinator/prompt-assembler.js +0 -228
  201. package/dist/coordinator/prompt-assembler.js.map +0 -1
  202. package/dist/coordinator/step-analyzer.d.ts +0 -8
  203. package/dist/coordinator/step-analyzer.d.ts.map +0 -1
  204. package/dist/coordinator/step-analyzer.js +0 -82
  205. package/dist/coordinator/step-analyzer.js.map +0 -1
  206. package/dist/core/extension-loader.d.ts +0 -11
  207. package/dist/core/extension-loader.d.ts.map +0 -1
  208. package/dist/core/extension-loader.js +0 -54
  209. package/dist/core/extension-loader.js.map +0 -1
  210. package/dist/core/manifest.d.ts +0 -24
  211. package/dist/core/manifest.d.ts.map +0 -1
  212. package/dist/core/manifest.js +0 -139
  213. package/dist/core/manifest.js.map +0 -1
  214. package/dist/core/mcp-tool-registry.integration.test.d.ts +0 -2
  215. package/dist/core/mcp-tool-registry.integration.test.d.ts.map +0 -1
  216. package/dist/core/mcp-tool-registry.integration.test.js +0 -220
  217. package/dist/core/mcp-tool-registry.integration.test.js.map +0 -1
  218. package/dist/core/overlay/applier.d.ts +0 -73
  219. package/dist/core/overlay/applier.d.ts.map +0 -1
  220. package/dist/core/overlay/applier.js +0 -248
  221. package/dist/core/overlay/applier.js.map +0 -1
  222. package/dist/core/overlay/loader.d.ts +0 -26
  223. package/dist/core/overlay/loader.d.ts.map +0 -1
  224. package/dist/core/overlay/loader.js +0 -199
  225. package/dist/core/overlay/loader.js.map +0 -1
  226. package/dist/core/overlay/patcher.d.ts +0 -26
  227. package/dist/core/overlay/patcher.d.ts.map +0 -1
  228. package/dist/core/overlay/patcher.js +0 -212
  229. package/dist/core/overlay/patcher.js.map +0 -1
  230. package/dist/core/overlay/section-parser.d.ts +0 -25
  231. package/dist/core/overlay/section-parser.d.ts.map +0 -1
  232. package/dist/core/overlay/section-parser.js +0 -99
  233. package/dist/core/overlay/section-parser.js.map +0 -1
  234. package/dist/core/overlay/types.d.ts +0 -51
  235. package/dist/core/overlay/types.d.ts.map +0 -1
  236. package/dist/core/overlay/types.js +0 -15
  237. package/dist/core/overlay/types.js.map +0 -1
  238. package/dist/core/tool-registry.d.ts +0 -10
  239. package/dist/core/tool-registry.d.ts.map +0 -1
  240. package/dist/core/tool-registry.js +0 -29
  241. package/dist/core/tool-registry.js.map +0 -1
  242. package/dist/core/tool-registry.test.d.ts +0 -2
  243. package/dist/core/tool-registry.test.d.ts.map +0 -1
  244. package/dist/core/tool-registry.test.js +0 -78
  245. package/dist/core/tool-registry.test.js.map +0 -1
  246. package/dist/db/connection-pool.d.ts +0 -21
  247. package/dist/db/connection-pool.d.ts.map +0 -1
  248. package/dist/db/connection-pool.js +0 -53
  249. package/dist/db/connection-pool.js.map +0 -1
  250. package/dist/db/index.d.ts +0 -6
  251. package/dist/db/index.d.ts.map +0 -1
  252. package/dist/db/index.js +0 -9
  253. package/dist/db/index.js.map +0 -1
  254. package/dist/db/schema/core/index.d.ts +0 -5
  255. package/dist/db/schema/core/index.d.ts.map +0 -1
  256. package/dist/db/schema/core/index.js +0 -5
  257. package/dist/db/schema/core/index.js.map +0 -1
  258. package/dist/db/schema/core/organizations.d.ts +0 -244
  259. package/dist/db/schema/core/organizations.d.ts.map +0 -1
  260. package/dist/db/schema/core/organizations.js +0 -44
  261. package/dist/db/schema/core/organizations.js.map +0 -1
  262. package/dist/db/schema/core/permissions.d.ts +0 -158
  263. package/dist/db/schema/core/permissions.d.ts.map +0 -1
  264. package/dist/db/schema/core/permissions.js +0 -62
  265. package/dist/db/schema/core/permissions.js.map +0 -1
  266. package/dist/db/schema/core/refresh-tokens.d.ts +0 -147
  267. package/dist/db/schema/core/refresh-tokens.d.ts.map +0 -1
  268. package/dist/db/schema/core/refresh-tokens.js +0 -22
  269. package/dist/db/schema/core/refresh-tokens.js.map +0 -1
  270. package/dist/db/schema/core/users.d.ts +0 -178
  271. package/dist/db/schema/core/users.d.ts.map +0 -1
  272. package/dist/db/schema/core/users.js +0 -14
  273. package/dist/db/schema/core/users.js.map +0 -1
  274. package/dist/db/tenant-migrator.d.ts +0 -11
  275. package/dist/db/tenant-migrator.d.ts.map +0 -1
  276. package/dist/db/tenant-migrator.js +0 -74
  277. package/dist/db/tenant-migrator.js.map +0 -1
  278. package/dist/db/tenant-schema.d.ts +0 -290
  279. package/dist/db/tenant-schema.d.ts.map +0 -1
  280. package/dist/db/tenant-schema.js +0 -32
  281. package/dist/db/tenant-schema.js.map +0 -1
  282. package/dist/hooks/constants.d.ts +0 -40
  283. package/dist/hooks/constants.d.ts.map +0 -1
  284. package/dist/hooks/constants.js +0 -53
  285. package/dist/hooks/constants.js.map +0 -1
  286. package/dist/hooks/context-monitor.d.ts +0 -33
  287. package/dist/hooks/context-monitor.d.ts.map +0 -1
  288. package/dist/hooks/context-monitor.js +0 -117
  289. package/dist/hooks/context-monitor.js.map +0 -1
  290. package/dist/hooks/delegate-monitor.d.ts +0 -24
  291. package/dist/hooks/delegate-monitor.d.ts.map +0 -1
  292. package/dist/hooks/delegate-monitor.js +0 -76
  293. package/dist/hooks/delegate-monitor.js.map +0 -1
  294. package/dist/hooks/index.d.ts +0 -4
  295. package/dist/hooks/index.d.ts.map +0 -1
  296. package/dist/hooks/index.js +0 -4
  297. package/dist/hooks/index.js.map +0 -1
  298. package/dist/hooks/statusline.d.ts +0 -29
  299. package/dist/hooks/statusline.d.ts.map +0 -1
  300. package/dist/hooks/statusline.js +0 -134
  301. package/dist/hooks/statusline.js.map +0 -1
  302. package/dist/index.d.ts +0 -8
  303. package/dist/index.d.ts.map +0 -1
  304. package/dist/index.js +0 -6
  305. package/dist/index.js.map +0 -1
  306. package/dist/mcp/delegate-channel-relay.d.ts +0 -51
  307. package/dist/mcp/delegate-channel-relay.d.ts.map +0 -1
  308. package/dist/mcp/delegate-channel-relay.js +0 -307
  309. package/dist/mcp/delegate-channel-relay.js.map +0 -1
  310. package/dist/mcp/server.d.ts +0 -6
  311. package/dist/mcp/server.d.ts.map +0 -1
  312. package/dist/mcp/server.js +0 -64
  313. package/dist/mcp/server.js.map +0 -1
  314. package/dist/middleware/auth.d.ts +0 -13
  315. package/dist/middleware/auth.d.ts.map +0 -1
  316. package/dist/middleware/auth.js +0 -27
  317. package/dist/middleware/auth.js.map +0 -1
  318. package/dist/middleware/permission.d.ts +0 -9
  319. package/dist/middleware/permission.d.ts.map +0 -1
  320. package/dist/middleware/permission.js +0 -19
  321. package/dist/middleware/permission.js.map +0 -1
  322. package/dist/middleware/rate-limit.d.ts +0 -9
  323. package/dist/middleware/rate-limit.d.ts.map +0 -1
  324. package/dist/middleware/rate-limit.js +0 -40
  325. package/dist/middleware/rate-limit.js.map +0 -1
  326. package/dist/middleware/tenant.d.ts +0 -17
  327. package/dist/middleware/tenant.d.ts.map +0 -1
  328. package/dist/middleware/tenant.js +0 -57
  329. package/dist/middleware/tenant.js.map +0 -1
  330. package/dist/middleware/validation.d.ts +0 -40
  331. package/dist/middleware/validation.d.ts.map +0 -1
  332. package/dist/middleware/validation.js +0 -51
  333. package/dist/middleware/validation.js.map +0 -1
  334. package/dist/routes/auth.d.ts +0 -3
  335. package/dist/routes/auth.d.ts.map +0 -1
  336. package/dist/routes/auth.js +0 -77
  337. package/dist/routes/auth.js.map +0 -1
  338. package/dist/routes/members.d.ts +0 -4
  339. package/dist/routes/members.d.ts.map +0 -1
  340. package/dist/routes/members.js +0 -114
  341. package/dist/routes/members.js.map +0 -1
  342. package/dist/routes/organizations.d.ts +0 -5
  343. package/dist/routes/organizations.d.ts.map +0 -1
  344. package/dist/routes/organizations.js +0 -97
  345. package/dist/routes/organizations.js.map +0 -1
  346. package/dist/services/auth.service.d.ts +0 -24
  347. package/dist/services/auth.service.d.ts.map +0 -1
  348. package/dist/services/auth.service.js +0 -70
  349. package/dist/services/auth.service.js.map +0 -1
  350. package/dist/services/password.service.d.ts +0 -3
  351. package/dist/services/password.service.d.ts.map +0 -1
  352. package/dist/services/password.service.js +0 -18
  353. package/dist/services/password.service.js.map +0 -1
  354. package/dist/services/rbac.service.d.ts +0 -7
  355. package/dist/services/rbac.service.d.ts.map +0 -1
  356. package/dist/services/rbac.service.js +0 -36
  357. package/dist/services/rbac.service.js.map +0 -1
  358. package/dist/services/token.service.d.ts +0 -18
  359. package/dist/services/token.service.d.ts.map +0 -1
  360. package/dist/services/token.service.js +0 -86
  361. package/dist/services/token.service.js.map +0 -1
  362. package/dist/tools/core-memory.d.ts +0 -12
  363. package/dist/tools/core-memory.d.ts.map +0 -1
  364. package/dist/tools/core-memory.js +0 -276
  365. package/dist/tools/core-memory.js.map +0 -1
  366. package/dist/tools/edit-file.d.ts +0 -25
  367. package/dist/tools/edit-file.d.ts.map +0 -1
  368. package/dist/tools/edit-file.js +0 -462
  369. package/dist/tools/edit-file.js.map +0 -1
  370. package/dist/tools/index.d.ts +0 -8
  371. package/dist/tools/index.d.ts.map +0 -1
  372. package/dist/tools/index.js +0 -536
  373. package/dist/tools/index.js.map +0 -1
  374. package/dist/tools/read-file.d.ts +0 -13
  375. package/dist/tools/read-file.d.ts.map +0 -1
  376. package/dist/tools/read-file.js +0 -91
  377. package/dist/tools/read-file.js.map +0 -1
  378. package/dist/tools/read-many-files.d.ts +0 -15
  379. package/dist/tools/read-many-files.d.ts.map +0 -1
  380. package/dist/tools/read-many-files.js +0 -187
  381. package/dist/tools/read-many-files.js.map +0 -1
  382. package/dist/tools/spec-index-builder.d.ts +0 -58
  383. package/dist/tools/spec-index-builder.d.ts.map +0 -1
  384. package/dist/tools/spec-index-builder.js +0 -211
  385. package/dist/tools/spec-index-builder.js.map +0 -1
  386. package/dist/tools/spec-init.d.ts +0 -17
  387. package/dist/tools/spec-init.d.ts.map +0 -1
  388. package/dist/tools/spec-init.js +0 -215
  389. package/dist/tools/spec-init.js.map +0 -1
  390. package/dist/tools/spec-keyword-extractor.d.ts +0 -24
  391. package/dist/tools/spec-keyword-extractor.d.ts.map +0 -1
  392. package/dist/tools/spec-keyword-extractor.js +0 -84
  393. package/dist/tools/spec-keyword-extractor.js.map +0 -1
  394. package/dist/tools/spec-keyword-extractor.test.d.ts +0 -2
  395. package/dist/tools/spec-keyword-extractor.test.d.ts.map +0 -1
  396. package/dist/tools/spec-keyword-extractor.test.js +0 -99
  397. package/dist/tools/spec-keyword-extractor.test.js.map +0 -1
  398. package/dist/tools/spec-loader.d.ts +0 -15
  399. package/dist/tools/spec-loader.d.ts.map +0 -1
  400. package/dist/tools/spec-loader.js +0 -93
  401. package/dist/tools/spec-loader.js.map +0 -1
  402. package/dist/tools/team-msg.d.ts +0 -52
  403. package/dist/tools/team-msg.d.ts.map +0 -1
  404. package/dist/tools/team-msg.js +0 -449
  405. package/dist/tools/team-msg.js.map +0 -1
  406. package/dist/tools/write-file.d.ts +0 -19
  407. package/dist/tools/write-file.d.ts.map +0 -1
  408. package/dist/tools/write-file.js +0 -165
  409. package/dist/tools/write-file.js.map +0 -1
  410. package/dist/types/index.d.ts +0 -47
  411. package/dist/types/index.d.ts.map +0 -1
  412. package/dist/types/index.js +0 -2
  413. package/dist/types/index.js.map +0 -1
  414. package/dist/types/tool-schema.d.ts +0 -37
  415. package/dist/types/tool-schema.d.ts.map +0 -1
  416. package/dist/types/tool-schema.js +0 -24
  417. package/dist/types/tool-schema.js.map +0 -1
  418. package/dist/utils/file-reader.d.ts +0 -74
  419. package/dist/utils/file-reader.d.ts.map +0 -1
  420. package/dist/utils/file-reader.js +0 -217
  421. package/dist/utils/file-reader.js.map +0 -1
  422. package/dist/utils/path-validator.d.ts +0 -52
  423. package/dist/utils/path-validator.d.ts.map +0 -1
  424. package/dist/utils/path-validator.js +0 -151
  425. package/dist/utils/path-validator.js.map +0 -1
@@ -1,688 +0,0 @@
1
- // ---------------------------------------------------------------------------
2
- // CLI Agent Runner
3
- // Orchestrates adapter selection, process spawning, stdout rendering, and
4
- // exit handling for the `maestro cli` command.
5
- // ---------------------------------------------------------------------------
6
- import { resolve, join } from 'node:path';
7
- import { pathToFileURL } from 'node:url';
8
- import { randomBytes } from 'node:crypto';
9
- import { spawn } from 'node:child_process';
10
- import { readFileSync, appendFileSync, existsSync } from 'node:fs';
11
- import { tmpdir } from 'node:os';
12
- import { DashboardBridge } from './dashboard-bridge.js';
13
- import { CliHistoryStore } from './cli-history-store.js';
14
- import { loadTemplate, loadProtocol } from '../config/template-discovery.js';
15
- import { NOTIFY_PREFIX } from '../hooks/constants.js';
16
- import { DelegateBrokerClient } from '../async/index.js';
17
- // ---------------------------------------------------------------------------
18
- // Tool name -> AgentType mapping
19
- // ---------------------------------------------------------------------------
20
- const TOOL_TO_AGENT_TYPE = {
21
- gemini: 'gemini',
22
- 'gemini-a2a': 'gemini-a2a',
23
- qwen: 'qwen',
24
- codex: 'codex',
25
- 'codex-server': 'codex-server',
26
- claude: 'claude-code',
27
- opencode: 'opencode',
28
- };
29
- // ---------------------------------------------------------------------------
30
- // AgentType -> terminal CLI command mapping
31
- // ---------------------------------------------------------------------------
32
- const AGENT_TYPE_TO_TERMINAL_CMD = {
33
- 'gemini': 'gemini',
34
- 'gemini-a2a': 'gemini',
35
- 'qwen': 'qwen',
36
- 'codex': 'codex',
37
- 'codex-server': 'codex',
38
- 'claude-code': 'claude',
39
- 'opencode': 'opencode',
40
- };
41
- // ---------------------------------------------------------------------------
42
- // Execution ID generation
43
- // ---------------------------------------------------------------------------
44
- const TOOL_PREFIX = {
45
- gemini: 'gem',
46
- 'gemini-a2a': 'gma',
47
- qwen: 'qwn',
48
- codex: 'cdx',
49
- 'codex-server': 'cxs',
50
- claude: 'cld',
51
- opencode: 'opc',
52
- };
53
- export function generateCliExecId(tool) {
54
- const prefix = TOOL_PREFIX[tool] ?? 'run';
55
- const now = new Date();
56
- const hh = String(now.getHours()).padStart(2, '0');
57
- const mm = String(now.getMinutes()).padStart(2, '0');
58
- const ss = String(now.getSeconds()).padStart(2, '0');
59
- const rand = randomBytes(2).toString('hex'); // 4 hex chars
60
- return `${prefix}-${hh}${mm}${ss}-${rand}`;
61
- }
62
- // ---------------------------------------------------------------------------
63
- // Prompt assembly — protocol + user prompt + template
64
- // ---------------------------------------------------------------------------
65
- async function assemblePrompt(userPrompt, mode, rule) {
66
- const parts = [];
67
- // 1. Load mode protocol
68
- const protocol = await loadProtocol(mode);
69
- if (protocol) {
70
- parts.push(protocol);
71
- }
72
- // 2. User prompt
73
- parts.push(userPrompt);
74
- // 3. Load rule template (if specified)
75
- if (rule) {
76
- const template = await loadTemplate(rule);
77
- if (template) {
78
- parts.push(template);
79
- }
80
- else {
81
- console.error(`Warning: template "${rule}" not found, proceeding without it.`);
82
- }
83
- }
84
- return parts.join('\n\n');
85
- }
86
- // ---------------------------------------------------------------------------
87
- // Adapter factory — dynamic import avoids rootDir cross-boundary issues
88
- // ---------------------------------------------------------------------------
89
- async function loadAdapterModule(adapterFile) {
90
- const baseDir = import.meta.dirname ?? __dirname;
91
- // Prefer tsc-compiled output; fall back to legacy vite bundle path
92
- const tscAgents = resolve(baseDir, '..', '..', 'dashboard', 'dist-server', 'dashboard', 'src', 'server', 'agents');
93
- const legacyAgents = resolve(baseDir, '..', '..', 'dashboard', 'dist-server', 'server', 'agents');
94
- const tscPath = resolve(tscAgents, adapterFile);
95
- const legacyPath = resolve(legacyAgents, adapterFile);
96
- const fullPath = existsSync(tscPath) ? tscPath : legacyPath;
97
- // Convert to file:// URL for Windows compatibility with dynamic import()
98
- const fileUrl = pathToFileURL(fullPath).href;
99
- return await import(fileUrl);
100
- }
101
- async function createAdapter(agentType, backend) {
102
- if (backend === 'terminal') {
103
- const { detectBackend } = await import('./terminal-backend.js');
104
- const { TerminalAdapter } = await import('./terminal-adapter.js');
105
- const termBackend = detectBackend();
106
- if (!termBackend) {
107
- throw new Error('No terminal multiplexer detected (need TMUX or WEZTERM_PANE env)');
108
- }
109
- const cmd = AGENT_TYPE_TO_TERMINAL_CMD[agentType] ?? agentType;
110
- return new TerminalAdapter(termBackend, cmd);
111
- }
112
- const mod = await loadAdapterModule('adapter-factory.js');
113
- const factory = mod.createAdapterForType;
114
- return await factory(agentType);
115
- }
116
- // ---------------------------------------------------------------------------
117
- // Entry renderer — writes normalized entries to stdout/stderr
118
- // ---------------------------------------------------------------------------
119
- function renderEntry(entry) {
120
- switch (entry.type) {
121
- case 'assistant_message':
122
- process.stdout.write(entry.content);
123
- break;
124
- case 'tool_use':
125
- if (entry.status === 'running') {
126
- console.log(`[Tool: ${entry.name}]`);
127
- }
128
- else if (entry.status === 'completed' || entry.status === 'failed') {
129
- console.log(`[Tool ${entry.name}: ${entry.status}]`);
130
- if (entry.result) {
131
- console.log(entry.result);
132
- }
133
- }
134
- break;
135
- case 'error':
136
- console.error(`Error: ${entry.message}`);
137
- break;
138
- case 'file_change':
139
- console.log(`[File ${entry.action}: ${entry.path}]`);
140
- break;
141
- case 'command_exec':
142
- console.log(`[Exec: ${entry.command}]`);
143
- break;
144
- case 'token_usage':
145
- console.log(`[Tokens: ${entry.inputTokens}in/${entry.outputTokens}out]`);
146
- break;
147
- // Silently skip: user_message, thinking, approval_request,
148
- // approval_response, status_change (handled by the runner itself)
149
- default:
150
- break;
151
- }
152
- }
153
- function buildJobMetadata(options) {
154
- const metadata = {
155
- tool: options.tool,
156
- mode: options.mode,
157
- workDir: options.workDir,
158
- prompt: options.prompt.substring(0, 200),
159
- cancelRequestedAt: null,
160
- cancelRequestedBy: null,
161
- cancelReason: null,
162
- };
163
- if (options.model) {
164
- metadata.model = options.model;
165
- }
166
- if (options.rule) {
167
- metadata.rule = options.rule;
168
- }
169
- if (options.backend) {
170
- metadata.backend = options.backend;
171
- }
172
- if (options.sessionId) {
173
- metadata.sessionId = options.sessionId;
174
- }
175
- if (options.includeDirs && options.includeDirs.length > 0) {
176
- metadata.includeDirs = options.includeDirs;
177
- }
178
- return metadata;
179
- }
180
- function mergeJsonObjects(base, patch) {
181
- return patch ? { ...base, ...patch } : { ...base };
182
- }
183
- function spawnQueuedDelegateWorker(options, execId, prompt) {
184
- const entryScript = process.argv[1];
185
- if (!entryScript) {
186
- return false;
187
- }
188
- const args = [
189
- entryScript,
190
- 'delegate',
191
- prompt,
192
- '--worker',
193
- '--to',
194
- options.tool,
195
- '--mode',
196
- options.mode,
197
- '--cd',
198
- options.workDir,
199
- '--id',
200
- execId,
201
- '--backend',
202
- options.backend ?? 'direct',
203
- '--resume',
204
- execId,
205
- ];
206
- if (options.model) {
207
- args.push('--model', options.model);
208
- }
209
- if (options.rule) {
210
- args.push('--rule', options.rule);
211
- }
212
- if (options.includeDirs && options.includeDirs.length > 0) {
213
- args.push('--includeDirs', options.includeDirs.join(','));
214
- }
215
- if (options.sessionId) {
216
- args.push('--session', options.sessionId);
217
- }
218
- const child = spawn(process.execPath, args, {
219
- cwd: options.workDir,
220
- detached: true,
221
- stdio: 'ignore',
222
- env: {
223
- ...process.env,
224
- MAESTRO_DISABLE_DASHBOARD_BRIDGE: '1',
225
- },
226
- });
227
- child.unref();
228
- return true;
229
- }
230
- function isTerminalStatus(status) {
231
- return status === 'completed' || status === 'failed' || status === 'cancelled';
232
- }
233
- function summarizeEntry(entry) {
234
- switch (entry.type) {
235
- case 'assistant_message':
236
- return entry.content.replace(/\s+/g, ' ').trim().slice(0, 200) || 'Assistant response updated';
237
- case 'tool_use':
238
- return `Tool ${entry.name} ${entry.status}`;
239
- case 'file_change':
240
- return `File ${entry.action}: ${entry.path}`;
241
- case 'command_exec':
242
- return `Command: ${entry.command}`;
243
- case 'error':
244
- return entry.message;
245
- case 'status_change':
246
- return `Status changed to ${entry.status}`;
247
- default:
248
- return `Event: ${entry.type}`;
249
- }
250
- }
251
- function shouldPublishSnapshot(entry) {
252
- switch (entry.type) {
253
- case 'assistant_message':
254
- return entry.partial !== true;
255
- case 'tool_use':
256
- return entry.status === 'completed' || entry.status === 'failed';
257
- case 'file_change':
258
- case 'command_exec':
259
- case 'error':
260
- return true;
261
- default:
262
- return false;
263
- }
264
- }
265
- function createNoopBridge() {
266
- return {
267
- async tryConnect() {
268
- return false;
269
- },
270
- forwardSpawn() {
271
- return;
272
- },
273
- forwardEntry() {
274
- return;
275
- },
276
- forwardStopped() {
277
- return;
278
- },
279
- close() {
280
- return;
281
- },
282
- };
283
- }
284
- // ---------------------------------------------------------------------------
285
- // CliAgentRunner
286
- // ---------------------------------------------------------------------------
287
- export class CliAgentRunner {
288
- dependencies;
289
- constructor(dependencies = {}) {
290
- this.dependencies = dependencies;
291
- }
292
- /** Resolve dashboard WS URL from env → config → default port 3001 */
293
- static getDashboardWsUrl() {
294
- const envPort = process.env.MAESTRO_DASHBOARD_PORT;
295
- if (envPort) {
296
- const p = parseInt(envPort, 10);
297
- if (!isNaN(p))
298
- return `ws://127.0.0.1:${p}/ws`;
299
- }
300
- try {
301
- const configPath = resolve(process.cwd(), '.workflow', 'config.json');
302
- const raw = readFileSync(configPath, 'utf-8');
303
- const json = JSON.parse(raw);
304
- const dashboard = json['dashboard'];
305
- if (dashboard?.port && typeof dashboard.port === 'number') {
306
- return `ws://127.0.0.1:${dashboard.port}/ws`;
307
- }
308
- }
309
- catch {
310
- // Config missing or unreadable — use default
311
- }
312
- return 'ws://127.0.0.1:3001/ws';
313
- }
314
- /**
315
- * Send MCP channel notification (primary path).
316
- * If maestro MCP server is running in this process, push a
317
- * notifications/claude/channel message directly.
318
- */
319
- static sendChannelNotification(_sessionId, execId, tool, mode, status, exitCode) {
320
- try {
321
- // Dynamic import to avoid circular dependency — getMcpServer is exported
322
- // from mcp/server.ts which may not be loaded in CLI-only mode.
323
- const { getMcpServer } = require('../mcp/server.js');
324
- const server = getMcpServer();
325
- if (!server)
326
- return;
327
- const label = status === 'completed'
328
- ? 'DELEGATE COMPLETED'
329
- : status === 'cancelled'
330
- ? 'DELEGATE CANCELLED'
331
- : 'DELEGATE FAILED';
332
- const result = status === 'completed'
333
- ? 'done'
334
- : status === 'cancelled'
335
- ? 'cancelled'
336
- : `exit:${exitCode}`;
337
- const content = `[${label}] ${execId} (${tool}/${mode}) ${result}\nUse \`maestro delegate output ${execId}\` for full result.`;
338
- // Fire-and-forget notification via MCP protocol
339
- server.notification({
340
- method: 'notifications/claude/channel',
341
- params: {
342
- content,
343
- meta: { exec_id: execId, job_id: execId, tool, mode, exit_code: String(exitCode), event_type: status, status },
344
- },
345
- }).catch((err) => { console.error(`[${execId}] MCP notification send failed: ${err instanceof Error ? err.message : err}`); });
346
- }
347
- catch (err) {
348
- console.error(`[${execId}] MCP server not available for channel notification: ${err instanceof Error ? err.message : err}`);
349
- }
350
- }
351
- /**
352
- * Run a CLI agent to completion and return its exit code (0 = success).
353
- */
354
- async run(options) {
355
- const agentType = TOOL_TO_AGENT_TYPE[options.tool];
356
- if (!agentType) {
357
- console.error(`Unknown tool: ${options.tool}`);
358
- return 1;
359
- }
360
- // Generate or use provided execution ID
361
- const execId = options.execId ?? generateCliExecId(options.tool);
362
- process.stderr.write(`[MAESTRO_EXEC_ID=${execId}]\n`);
363
- // History store for persistence and resume
364
- const store = new CliHistoryStore();
365
- const broker = this.dependencies.brokerClient ?? new DelegateBrokerClient();
366
- const now = this.dependencies.now ?? (() => new Date().toISOString());
367
- const jobMetadata = buildJobMetadata(options);
368
- // Handle --resume: prepend previous session context to user prompt
369
- let userPrompt = options.prompt;
370
- if (options.resume) {
371
- let resumeId = options.resume;
372
- if (resumeId === 'last') {
373
- const recent = store.listRecent(1);
374
- resumeId = recent.length > 0 ? recent[0].execId : '';
375
- }
376
- if (resumeId) {
377
- userPrompt = store.buildResumePrompt(resumeId, userPrompt);
378
- }
379
- else {
380
- console.error('No previous execution found for --resume');
381
- }
382
- }
383
- // Assemble final prompt: protocol + user prompt + template
384
- const finalPrompt = await assemblePrompt(userPrompt, options.mode, options.rule);
385
- const adapterFactory = this.dependencies.createAdapter ?? createAdapter;
386
- const adapter = await adapterFactory(agentType, options.backend);
387
- // Optional Dashboard bridge — connect silently, don't block startup
388
- const bridgeEnabled = process.env.MAESTRO_DISABLE_DASHBOARD_BRIDGE !== '1';
389
- const bridge = bridgeEnabled
390
- ? (this.dependencies.createBridge?.() ?? new DashboardBridge())
391
- : createNoopBridge();
392
- const bridgeConnected = bridgeEnabled
393
- ? await bridge.tryConnect(CliAgentRunner.getDashboardWsUrl(), 1000)
394
- : false;
395
- if (!bridgeConnected) {
396
- process.stderr.write('[Dashboard not connected — real-time view unavailable]\n');
397
- }
398
- const config = {
399
- type: agentType,
400
- prompt: finalPrompt,
401
- workDir: options.workDir,
402
- model: options.model,
403
- approvalMode: options.mode === 'write' ? 'auto' : 'suggest',
404
- interactive: adapter.supportsInteractive?.() === true,
405
- };
406
- const agentProcess = await adapter.spawn(config);
407
- bridge.forwardSpawn(agentProcess);
408
- const agentJobMetadata = {
409
- ...jobMetadata,
410
- agentProcessId: agentProcess.id,
411
- };
412
- store.saveMeta(execId, {
413
- execId,
414
- tool: options.tool,
415
- model: options.model,
416
- mode: options.mode,
417
- prompt: options.prompt.substring(0, 500),
418
- workDir: options.workDir,
419
- startedAt: agentProcess.startedAt,
420
- });
421
- const publishEvent = (type, status, summary, extraPayload = {}, extraJobMetadata) => {
422
- try {
423
- const snapshot = store.buildSnapshot(execId);
424
- broker.publishEvent({
425
- jobId: execId,
426
- type,
427
- status,
428
- snapshot: snapshot,
429
- payload: {
430
- execId,
431
- summary,
432
- ...extraPayload,
433
- },
434
- jobMetadata: mergeJsonObjects(agentJobMetadata, extraJobMetadata),
435
- });
436
- }
437
- catch {
438
- // Broker publication is best-effort and must not break CLI execution
439
- }
440
- };
441
- publishEvent('status_update', 'running', `Delegate started for ${options.tool}/${options.mode}`);
442
- // Safety net: if the process exits without a stopped event (e.g. Windows
443
- // shell process tree doesn't fire exit/close reliably), write meta.json
444
- // from the synchronous process.on('exit') handler as a last resort.
445
- let metaWritten = false;
446
- let cancellationRequested = Boolean(broker.getJob(execId)?.metadata?.cancelRequestedAt);
447
- let cancellationInitiated = false;
448
- let cancellationPoller = null;
449
- const clearCancellationPoller = () => {
450
- if (cancellationPoller) {
451
- clearInterval(cancellationPoller);
452
- cancellationPoller = null;
453
- }
454
- };
455
- const saveMeta = (status, exitCode) => {
456
- if (metaWritten)
457
- return;
458
- metaWritten = true;
459
- const completedAt = now();
460
- store.saveMeta(execId, {
461
- execId,
462
- tool: options.tool,
463
- model: options.model,
464
- mode: options.mode,
465
- prompt: options.prompt.substring(0, 500),
466
- workDir: options.workDir,
467
- startedAt: agentProcess.startedAt,
468
- completedAt,
469
- exitCode,
470
- ...(status === 'cancelled' ? { cancelledAt: completedAt } : {}),
471
- });
472
- publishEvent(status, status, status === 'completed'
473
- ? `Delegate completed: ${execId}`
474
- : status === 'cancelled'
475
- ? `Delegate cancelled: ${execId}`
476
- : `Delegate failed: ${execId}`, {
477
- exitCode,
478
- completedAt,
479
- status,
480
- });
481
- // Write delegate completion notification (for hook fallback)
482
- const sessionId = options.sessionId;
483
- if (sessionId) {
484
- // JSONL file write (for hook fallback)
485
- try {
486
- const notifyPath = join(tmpdir(), `${NOTIFY_PREFIX}${sessionId}.jsonl`);
487
- const entry = JSON.stringify({
488
- execId,
489
- tool: options.tool,
490
- mode: options.mode,
491
- prompt: options.prompt.substring(0, 200),
492
- exitCode,
493
- completedAt,
494
- status,
495
- });
496
- appendFileSync(notifyPath, entry + '\n', 'utf-8');
497
- }
498
- catch (err) {
499
- console.error(`[${execId}] Failed to write JSONL notification: ${err instanceof Error ? err.message : err}`);
500
- }
501
- // MCP channel notification (primary path)
502
- try {
503
- CliAgentRunner.sendChannelNotification(sessionId, execId, options.tool, options.mode, status, exitCode);
504
- }
505
- catch (err) {
506
- console.error(`[${execId}] Failed to send channel notification: ${err instanceof Error ? err.message : err}`);
507
- }
508
- }
509
- };
510
- const processExitHandler = () => {
511
- saveMeta(cancellationRequested ? 'cancelled' : 'completed', cancellationRequested ? 130 : 0);
512
- };
513
- process.on('exit', processExitHandler);
514
- const requestCancellation = async () => {
515
- cancellationRequested = true;
516
- if (cancellationInitiated) {
517
- return;
518
- }
519
- cancellationInitiated = true;
520
- publishEvent('status_update', 'running', `Cancellation requested for ${execId}`, {
521
- cancelRequested: true,
522
- });
523
- try {
524
- await adapter.stop(agentProcess.id);
525
- }
526
- catch {
527
- // Adapter stop failures are surfaced by subsequent process status events.
528
- }
529
- };
530
- const dispatchQueuedFollowup = (finalStatus) => {
531
- let queuedMessage;
532
- try {
533
- queuedMessage = broker.listMessages(execId).find((message) => (message.status === 'queued'
534
- && ((message.delivery === 'inject'
535
- && (finalStatus === 'cancelled' || finalStatus === 'completed' || finalStatus === 'failed'))
536
- || (message.delivery === 'after_complete' && finalStatus === 'completed'))));
537
- }
538
- catch {
539
- return;
540
- }
541
- if (!queuedMessage) {
542
- return;
543
- }
544
- const dispatchedAt = now();
545
- let launched = false;
546
- try {
547
- launched = (this.dependencies.spawnDetachedDelegate ?? spawnQueuedDelegateWorker)(options, execId, queuedMessage.message);
548
- }
549
- catch {
550
- launched = false;
551
- }
552
- if (!launched) {
553
- broker.updateMessage({
554
- jobId: execId,
555
- messageId: queuedMessage.messageId,
556
- status: 'dropped',
557
- dispatchReason: 'missing-entry-script',
558
- now: dispatchedAt,
559
- });
560
- return;
561
- }
562
- broker.updateMessage({
563
- jobId: execId,
564
- messageId: queuedMessage.messageId,
565
- status: 'dispatched',
566
- dispatchReason: finalStatus,
567
- now: dispatchedAt,
568
- });
569
- publishEvent('status_update', finalStatus, `Queued follow-up dispatched via ${queuedMessage.delivery}`, {
570
- delivery: queuedMessage.delivery,
571
- messageId: queuedMessage.messageId,
572
- }, {
573
- cancelRequestedAt: null,
574
- cancelRequestedBy: null,
575
- cancelReason: null,
576
- });
577
- };
578
- const inFlightMessageIds = new Set();
579
- if (!isTerminalStatus(broker.getJob(execId)?.status)) {
580
- cancellationPoller = setInterval(() => {
581
- try {
582
- const job = broker.getJob(execId);
583
- if (job?.metadata?.cancelRequestedAt && !cancellationInitiated) {
584
- void requestCancellation();
585
- }
586
- }
587
- catch {
588
- // Best-effort polling only.
589
- }
590
- // Poll for inject messages and auto-route based on adapter capabilities
591
- try {
592
- const injectMessages = broker.listMessages(execId)
593
- .filter((msg) => msg.status === 'queued' && msg.delivery === 'inject' && !inFlightMessageIds.has(msg.messageId))
594
- .sort((a, b) => a.createdAt.localeCompare(b.createdAt));
595
- for (const msg of injectMessages) {
596
- const polledNow = now();
597
- if (adapter.sendMessage && (adapter.supportsInteractive?.() !== false)) {
598
- // Interactive adapter: inject via stdin without interruption
599
- inFlightMessageIds.add(msg.messageId);
600
- void adapter.sendMessage(agentProcess.id, msg.message).then(() => {
601
- broker.updateMessage({
602
- jobId: execId,
603
- messageId: msg.messageId,
604
- status: 'injected',
605
- dispatchReason: 'inject-streaming',
606
- now: polledNow,
607
- });
608
- }).catch(() => {
609
- broker.updateMessage({
610
- jobId: execId,
611
- messageId: msg.messageId,
612
- status: 'dropped',
613
- dispatchReason: 'send-failed',
614
- now: polledNow,
615
- });
616
- }).finally(() => {
617
- inFlightMessageIds.delete(msg.messageId);
618
- });
619
- }
620
- else {
621
- // Non-interactive adapter: fall back to cancel + resume
622
- if (!cancellationInitiated) {
623
- void requestCancellation();
624
- }
625
- break; // Messages stay queued for dispatchQueuedFollowup after restart
626
- }
627
- }
628
- }
629
- catch {
630
- // Best-effort inject message polling.
631
- }
632
- }, 750);
633
- }
634
- if (cancellationRequested) {
635
- void requestCancellation();
636
- }
637
- return new Promise((resolvePromise) => {
638
- const unsubscribe = adapter.onEntry(agentProcess.id, (entry) => {
639
- // Persist entry to JSONL history before rendering
640
- store.appendEntry(execId, entry);
641
- (this.dependencies.renderEntry ?? renderEntry)(entry);
642
- bridge.forwardEntry(entry);
643
- if (shouldPublishSnapshot(entry)) {
644
- publishEvent('snapshot', 'running', summarizeEntry(entry), {
645
- entryType: entry.type,
646
- });
647
- }
648
- // Interactive mode: when Claude emits token_usage (end of turn) and no
649
- // more inject messages are queued, close stdin to let the process exit.
650
- if (config.interactive && entry.type === 'token_usage' && broker) {
651
- try {
652
- const pending = broker.listMessages(execId)
653
- .filter((m) => m.status === 'queued' && m.delivery === 'inject');
654
- if (pending.length === 0 && !cancellationRequested) {
655
- adapter.endInput?.(agentProcess.id);
656
- }
657
- }
658
- catch { /* best-effort */ }
659
- }
660
- // Resolve when the agent process stops
661
- if (entry.type === 'status_change' && entry.status === 'stopped') {
662
- clearCancellationPoller();
663
- const finalStatus = cancellationRequested ? 'cancelled' : 'completed';
664
- saveMeta(finalStatus, cancellationRequested ? 130 : 0);
665
- dispatchQueuedFollowup(finalStatus);
666
- process.removeListener('exit', processExitHandler);
667
- bridge.forwardStopped(agentProcess.id);
668
- bridge.close();
669
- unsubscribe();
670
- resolvePromise(cancellationRequested ? 130 : 0);
671
- }
672
- // Resolve with error code on error status
673
- if (entry.type === 'status_change' && entry.status === 'error') {
674
- clearCancellationPoller();
675
- const finalStatus = cancellationRequested ? 'cancelled' : 'failed';
676
- saveMeta(finalStatus, cancellationRequested ? 130 : 1);
677
- dispatchQueuedFollowup(finalStatus);
678
- process.removeListener('exit', processExitHandler);
679
- bridge.forwardStopped(agentProcess.id);
680
- bridge.close();
681
- unsubscribe();
682
- resolvePromise(cancellationRequested ? 130 : 1);
683
- }
684
- });
685
- });
686
- }
687
- }
688
- //# sourceMappingURL=cli-agent-runner.js.map