maestro-flow 0.3.1 → 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 (424) hide show
  1. package/.claude/commands/maestro-overlay.md +178 -122
  2. package/.codex/skills/maestro-coordinate/SKILL.md +3 -4
  3. package/dist/src/commands/launcher.js +1 -1
  4. package/dist/src/commands/launcher.js.map +1 -1
  5. package/dist/src/commands/overlay-ui/OverlayList.d.ts +35 -0
  6. package/dist/src/commands/overlay-ui/OverlayList.d.ts.map +1 -0
  7. package/dist/src/commands/overlay-ui/OverlayList.js +143 -0
  8. package/dist/src/commands/overlay-ui/OverlayList.js.map +1 -0
  9. package/dist/src/commands/overlay-ui/index.d.ts +2 -0
  10. package/dist/src/commands/overlay-ui/index.d.ts.map +1 -0
  11. package/dist/src/commands/overlay-ui/index.js +188 -0
  12. package/dist/src/commands/overlay-ui/index.js.map +1 -0
  13. package/dist/src/commands/overlay.d.ts.map +1 -1
  14. package/dist/src/commands/overlay.js +79 -59
  15. package/dist/src/commands/overlay.js.map +1 -1
  16. package/dist/src/core/overlay/applier.d.ts +32 -1
  17. package/dist/src/core/overlay/applier.d.ts.map +1 -1
  18. package/dist/src/core/overlay/applier.js +109 -1
  19. package/dist/src/core/overlay/applier.js.map +1 -1
  20. package/package.json +1 -1
  21. package/dist/agents/cli-agent-runner.d.ts +0 -131
  22. package/dist/agents/cli-agent-runner.d.ts.map +0 -1
  23. package/dist/agents/cli-agent-runner.js +0 -688
  24. package/dist/agents/cli-agent-runner.js.map +0 -1
  25. package/dist/agents/cli-history-store.d.ts +0 -63
  26. package/dist/agents/cli-history-store.d.ts.map +0 -1
  27. package/dist/agents/cli-history-store.js +0 -242
  28. package/dist/agents/cli-history-store.js.map +0 -1
  29. package/dist/agents/dashboard-bridge.d.ts +0 -39
  30. package/dist/agents/dashboard-bridge.d.ts.map +0 -1
  31. package/dist/agents/dashboard-bridge.js +0 -76
  32. package/dist/agents/dashboard-bridge.js.map +0 -1
  33. package/dist/agents/parallel-cli-runner.d.ts +0 -46
  34. package/dist/agents/parallel-cli-runner.d.ts.map +0 -1
  35. package/dist/agents/parallel-cli-runner.js +0 -277
  36. package/dist/agents/parallel-cli-runner.js.map +0 -1
  37. package/dist/agents/terminal-adapter.d.ts +0 -94
  38. package/dist/agents/terminal-adapter.d.ts.map +0 -1
  39. package/dist/agents/terminal-adapter.js +0 -132
  40. package/dist/agents/terminal-adapter.js.map +0 -1
  41. package/dist/agents/terminal-backend.d.ts +0 -53
  42. package/dist/agents/terminal-backend.d.ts.map +0 -1
  43. package/dist/agents/terminal-backend.js +0 -286
  44. package/dist/agents/terminal-backend.js.map +0 -1
  45. package/dist/async/delegate-broker-client.d.ts +0 -22
  46. package/dist/async/delegate-broker-client.d.ts.map +0 -1
  47. package/dist/async/delegate-broker-client.js +0 -47
  48. package/dist/async/delegate-broker-client.js.map +0 -1
  49. package/dist/async/delegate-broker.d.ts +0 -180
  50. package/dist/async/delegate-broker.d.ts.map +0 -1
  51. package/dist/async/delegate-broker.js +0 -1040
  52. package/dist/async/delegate-broker.js.map +0 -1
  53. package/dist/async/delegate-control.d.ts +0 -37
  54. package/dist/async/delegate-control.d.ts.map +0 -1
  55. package/dist/async/delegate-control.js +0 -155
  56. package/dist/async/delegate-control.js.map +0 -1
  57. package/dist/async/index.d.ts +0 -3
  58. package/dist/async/index.d.ts.map +0 -1
  59. package/dist/async/index.js +0 -3
  60. package/dist/async/index.js.map +0 -1
  61. package/dist/cli.d.ts +0 -2
  62. package/dist/cli.d.ts.map +0 -1
  63. package/dist/cli.js +0 -40
  64. package/dist/cli.js.map +0 -1
  65. package/dist/commands/cli.d.ts +0 -3
  66. package/dist/commands/cli.d.ts.map +0 -1
  67. package/dist/commands/cli.js +0 -262
  68. package/dist/commands/cli.js.map +0 -1
  69. package/dist/commands/coordinate.d.ts +0 -3
  70. package/dist/commands/coordinate.d.ts.map +0 -1
  71. package/dist/commands/coordinate.js +0 -275
  72. package/dist/commands/coordinate.js.map +0 -1
  73. package/dist/commands/delegate.d.ts +0 -37
  74. package/dist/commands/delegate.d.ts.map +0 -1
  75. package/dist/commands/delegate.js +0 -470
  76. package/dist/commands/delegate.js.map +0 -1
  77. package/dist/commands/ext.d.ts +0 -3
  78. package/dist/commands/ext.d.ts.map +0 -1
  79. package/dist/commands/ext.js +0 -28
  80. package/dist/commands/ext.js.map +0 -1
  81. package/dist/commands/hooks.d.ts +0 -3
  82. package/dist/commands/hooks.d.ts.map +0 -1
  83. package/dist/commands/hooks.js +0 -126
  84. package/dist/commands/hooks.js.map +0 -1
  85. package/dist/commands/install.d.ts +0 -3
  86. package/dist/commands/install.d.ts.map +0 -1
  87. package/dist/commands/install.js +0 -621
  88. package/dist/commands/install.js.map +0 -1
  89. package/dist/commands/launcher.d.ts +0 -3
  90. package/dist/commands/launcher.d.ts.map +0 -1
  91. package/dist/commands/launcher.js +0 -635
  92. package/dist/commands/launcher.js.map +0 -1
  93. package/dist/commands/link-coordinate.d.ts +0 -3
  94. package/dist/commands/link-coordinate.d.ts.map +0 -1
  95. package/dist/commands/link-coordinate.js +0 -225
  96. package/dist/commands/link-coordinate.js.map +0 -1
  97. package/dist/commands/msg.d.ts +0 -3
  98. package/dist/commands/msg.d.ts.map +0 -1
  99. package/dist/commands/msg.js +0 -110
  100. package/dist/commands/msg.js.map +0 -1
  101. package/dist/commands/overlay.d.ts +0 -3
  102. package/dist/commands/overlay.d.ts.map +0 -1
  103. package/dist/commands/overlay.js +0 -243
  104. package/dist/commands/overlay.js.map +0 -1
  105. package/dist/commands/run.d.ts +0 -3
  106. package/dist/commands/run.d.ts.map +0 -1
  107. package/dist/commands/run.js +0 -15
  108. package/dist/commands/run.js.map +0 -1
  109. package/dist/commands/serve.d.ts +0 -3
  110. package/dist/commands/serve.d.ts.map +0 -1
  111. package/dist/commands/serve.js +0 -16
  112. package/dist/commands/serve.js.map +0 -1
  113. package/dist/commands/spec.d.ts +0 -8
  114. package/dist/commands/spec.d.ts.map +0 -1
  115. package/dist/commands/spec.js +0 -147
  116. package/dist/commands/spec.js.map +0 -1
  117. package/dist/commands/stop.d.ts +0 -3
  118. package/dist/commands/stop.d.ts.map +0 -1
  119. package/dist/commands/stop.js +0 -218
  120. package/dist/commands/stop.js.map +0 -1
  121. package/dist/commands/tool.d.ts +0 -3
  122. package/dist/commands/tool.d.ts.map +0 -1
  123. package/dist/commands/tool.js +0 -29
  124. package/dist/commands/tool.js.map +0 -1
  125. package/dist/commands/uninstall.d.ts +0 -3
  126. package/dist/commands/uninstall.d.ts.map +0 -1
  127. package/dist/commands/uninstall.js +0 -77
  128. package/dist/commands/uninstall.js.map +0 -1
  129. package/dist/commands/view.d.ts +0 -3
  130. package/dist/commands/view.d.ts.map +0 -1
  131. package/dist/commands/view.js +0 -337
  132. package/dist/commands/view.js.map +0 -1
  133. package/dist/config/cli-tools-config.d.ts +0 -26
  134. package/dist/config/cli-tools-config.d.ts.map +0 -1
  135. package/dist/config/cli-tools-config.js +0 -49
  136. package/dist/config/cli-tools-config.js.map +0 -1
  137. package/dist/config/cli-tools-config.test.d.ts +0 -2
  138. package/dist/config/cli-tools-config.test.d.ts.map +0 -1
  139. package/dist/config/cli-tools-config.test.js +0 -59
  140. package/dist/config/cli-tools-config.test.js.map +0 -1
  141. package/dist/config/index.d.ts +0 -4
  142. package/dist/config/index.d.ts.map +0 -1
  143. package/dist/config/index.js +0 -27
  144. package/dist/config/index.js.map +0 -1
  145. package/dist/config/paths.d.ts +0 -15
  146. package/dist/config/paths.d.ts.map +0 -1
  147. package/dist/config/paths.js +0 -27
  148. package/dist/config/paths.js.map +0 -1
  149. package/dist/config/template-discovery.d.ts +0 -32
  150. package/dist/config/template-discovery.d.ts.map +0 -1
  151. package/dist/config/template-discovery.js +0 -128
  152. package/dist/config/template-discovery.js.map +0 -1
  153. package/dist/coordinator/cli-executor.d.ts +0 -22
  154. package/dist/coordinator/cli-executor.d.ts.map +0 -1
  155. package/dist/coordinator/cli-executor.js +0 -49
  156. package/dist/coordinator/cli-executor.js.map +0 -1
  157. package/dist/coordinator/expr-evaluator.d.ts +0 -11
  158. package/dist/coordinator/expr-evaluator.d.ts.map +0 -1
  159. package/dist/coordinator/expr-evaluator.js +0 -351
  160. package/dist/coordinator/expr-evaluator.js.map +0 -1
  161. package/dist/coordinator/graph-loader.d.ts +0 -16
  162. package/dist/coordinator/graph-loader.d.ts.map +0 -1
  163. package/dist/coordinator/graph-loader.js +0 -190
  164. package/dist/coordinator/graph-loader.js.map +0 -1
  165. package/dist/coordinator/graph-types.d.ts +0 -304
  166. package/dist/coordinator/graph-types.d.ts.map +0 -1
  167. package/dist/coordinator/graph-types.js +0 -6
  168. package/dist/coordinator/graph-types.js.map +0 -1
  169. package/dist/coordinator/graph-walker.d.ts +0 -51
  170. package/dist/coordinator/graph-walker.d.ts.map +0 -1
  171. package/dist/coordinator/graph-walker.js +0 -666
  172. package/dist/coordinator/graph-walker.js.map +0 -1
  173. package/dist/coordinator/index.d.ts +0 -13
  174. package/dist/coordinator/index.d.ts.map +0 -1
  175. package/dist/coordinator/index.js +0 -14
  176. package/dist/coordinator/index.js.map +0 -1
  177. package/dist/coordinator/intent-router.d.ts +0 -11
  178. package/dist/coordinator/intent-router.d.ts.map +0 -1
  179. package/dist/coordinator/intent-router.js +0 -65
  180. package/dist/coordinator/intent-router.js.map +0 -1
  181. package/dist/coordinator/link-session.d.ts +0 -29
  182. package/dist/coordinator/link-session.d.ts.map +0 -1
  183. package/dist/coordinator/link-session.js +0 -192
  184. package/dist/coordinator/link-session.js.map +0 -1
  185. package/dist/coordinator/link-walker.d.ts +0 -56
  186. package/dist/coordinator/link-walker.d.ts.map +0 -1
  187. package/dist/coordinator/link-walker.js +0 -548
  188. package/dist/coordinator/link-walker.js.map +0 -1
  189. package/dist/coordinator/output-parser.d.ts +0 -5
  190. package/dist/coordinator/output-parser.d.ts.map +0 -1
  191. package/dist/coordinator/output-parser.js +0 -114
  192. package/dist/coordinator/output-parser.js.map +0 -1
  193. package/dist/coordinator/parallel-executor.d.ts +0 -24
  194. package/dist/coordinator/parallel-executor.d.ts.map +0 -1
  195. package/dist/coordinator/parallel-executor.js +0 -43
  196. package/dist/coordinator/parallel-executor.js.map +0 -1
  197. package/dist/coordinator/prompt-assembler.d.ts +0 -15
  198. package/dist/coordinator/prompt-assembler.d.ts.map +0 -1
  199. package/dist/coordinator/prompt-assembler.js +0 -228
  200. package/dist/coordinator/prompt-assembler.js.map +0 -1
  201. package/dist/coordinator/step-analyzer.d.ts +0 -8
  202. package/dist/coordinator/step-analyzer.d.ts.map +0 -1
  203. package/dist/coordinator/step-analyzer.js +0 -82
  204. package/dist/coordinator/step-analyzer.js.map +0 -1
  205. package/dist/core/extension-loader.d.ts +0 -11
  206. package/dist/core/extension-loader.d.ts.map +0 -1
  207. package/dist/core/extension-loader.js +0 -54
  208. package/dist/core/extension-loader.js.map +0 -1
  209. package/dist/core/manifest.d.ts +0 -24
  210. package/dist/core/manifest.d.ts.map +0 -1
  211. package/dist/core/manifest.js +0 -139
  212. package/dist/core/manifest.js.map +0 -1
  213. package/dist/core/mcp-tool-registry.integration.test.d.ts +0 -2
  214. package/dist/core/mcp-tool-registry.integration.test.d.ts.map +0 -1
  215. package/dist/core/mcp-tool-registry.integration.test.js +0 -220
  216. package/dist/core/mcp-tool-registry.integration.test.js.map +0 -1
  217. package/dist/core/overlay/applier.d.ts +0 -73
  218. package/dist/core/overlay/applier.d.ts.map +0 -1
  219. package/dist/core/overlay/applier.js +0 -248
  220. package/dist/core/overlay/applier.js.map +0 -1
  221. package/dist/core/overlay/loader.d.ts +0 -26
  222. package/dist/core/overlay/loader.d.ts.map +0 -1
  223. package/dist/core/overlay/loader.js +0 -199
  224. package/dist/core/overlay/loader.js.map +0 -1
  225. package/dist/core/overlay/patcher.d.ts +0 -26
  226. package/dist/core/overlay/patcher.d.ts.map +0 -1
  227. package/dist/core/overlay/patcher.js +0 -212
  228. package/dist/core/overlay/patcher.js.map +0 -1
  229. package/dist/core/overlay/section-parser.d.ts +0 -25
  230. package/dist/core/overlay/section-parser.d.ts.map +0 -1
  231. package/dist/core/overlay/section-parser.js +0 -99
  232. package/dist/core/overlay/section-parser.js.map +0 -1
  233. package/dist/core/overlay/types.d.ts +0 -51
  234. package/dist/core/overlay/types.d.ts.map +0 -1
  235. package/dist/core/overlay/types.js +0 -15
  236. package/dist/core/overlay/types.js.map +0 -1
  237. package/dist/core/tool-registry.d.ts +0 -10
  238. package/dist/core/tool-registry.d.ts.map +0 -1
  239. package/dist/core/tool-registry.js +0 -29
  240. package/dist/core/tool-registry.js.map +0 -1
  241. package/dist/core/tool-registry.test.d.ts +0 -2
  242. package/dist/core/tool-registry.test.d.ts.map +0 -1
  243. package/dist/core/tool-registry.test.js +0 -78
  244. package/dist/core/tool-registry.test.js.map +0 -1
  245. package/dist/db/connection-pool.d.ts +0 -21
  246. package/dist/db/connection-pool.d.ts.map +0 -1
  247. package/dist/db/connection-pool.js +0 -53
  248. package/dist/db/connection-pool.js.map +0 -1
  249. package/dist/db/index.d.ts +0 -6
  250. package/dist/db/index.d.ts.map +0 -1
  251. package/dist/db/index.js +0 -9
  252. package/dist/db/index.js.map +0 -1
  253. package/dist/db/schema/core/index.d.ts +0 -5
  254. package/dist/db/schema/core/index.d.ts.map +0 -1
  255. package/dist/db/schema/core/index.js +0 -5
  256. package/dist/db/schema/core/index.js.map +0 -1
  257. package/dist/db/schema/core/organizations.d.ts +0 -244
  258. package/dist/db/schema/core/organizations.d.ts.map +0 -1
  259. package/dist/db/schema/core/organizations.js +0 -44
  260. package/dist/db/schema/core/organizations.js.map +0 -1
  261. package/dist/db/schema/core/permissions.d.ts +0 -158
  262. package/dist/db/schema/core/permissions.d.ts.map +0 -1
  263. package/dist/db/schema/core/permissions.js +0 -62
  264. package/dist/db/schema/core/permissions.js.map +0 -1
  265. package/dist/db/schema/core/refresh-tokens.d.ts +0 -147
  266. package/dist/db/schema/core/refresh-tokens.d.ts.map +0 -1
  267. package/dist/db/schema/core/refresh-tokens.js +0 -22
  268. package/dist/db/schema/core/refresh-tokens.js.map +0 -1
  269. package/dist/db/schema/core/users.d.ts +0 -178
  270. package/dist/db/schema/core/users.d.ts.map +0 -1
  271. package/dist/db/schema/core/users.js +0 -14
  272. package/dist/db/schema/core/users.js.map +0 -1
  273. package/dist/db/tenant-migrator.d.ts +0 -11
  274. package/dist/db/tenant-migrator.d.ts.map +0 -1
  275. package/dist/db/tenant-migrator.js +0 -74
  276. package/dist/db/tenant-migrator.js.map +0 -1
  277. package/dist/db/tenant-schema.d.ts +0 -290
  278. package/dist/db/tenant-schema.d.ts.map +0 -1
  279. package/dist/db/tenant-schema.js +0 -32
  280. package/dist/db/tenant-schema.js.map +0 -1
  281. package/dist/hooks/constants.d.ts +0 -40
  282. package/dist/hooks/constants.d.ts.map +0 -1
  283. package/dist/hooks/constants.js +0 -53
  284. package/dist/hooks/constants.js.map +0 -1
  285. package/dist/hooks/context-monitor.d.ts +0 -33
  286. package/dist/hooks/context-monitor.d.ts.map +0 -1
  287. package/dist/hooks/context-monitor.js +0 -117
  288. package/dist/hooks/context-monitor.js.map +0 -1
  289. package/dist/hooks/delegate-monitor.d.ts +0 -24
  290. package/dist/hooks/delegate-monitor.d.ts.map +0 -1
  291. package/dist/hooks/delegate-monitor.js +0 -76
  292. package/dist/hooks/delegate-monitor.js.map +0 -1
  293. package/dist/hooks/index.d.ts +0 -4
  294. package/dist/hooks/index.d.ts.map +0 -1
  295. package/dist/hooks/index.js +0 -4
  296. package/dist/hooks/index.js.map +0 -1
  297. package/dist/hooks/statusline.d.ts +0 -29
  298. package/dist/hooks/statusline.d.ts.map +0 -1
  299. package/dist/hooks/statusline.js +0 -134
  300. package/dist/hooks/statusline.js.map +0 -1
  301. package/dist/index.d.ts +0 -8
  302. package/dist/index.d.ts.map +0 -1
  303. package/dist/index.js +0 -6
  304. package/dist/index.js.map +0 -1
  305. package/dist/mcp/delegate-channel-relay.d.ts +0 -51
  306. package/dist/mcp/delegate-channel-relay.d.ts.map +0 -1
  307. package/dist/mcp/delegate-channel-relay.js +0 -307
  308. package/dist/mcp/delegate-channel-relay.js.map +0 -1
  309. package/dist/mcp/server.d.ts +0 -6
  310. package/dist/mcp/server.d.ts.map +0 -1
  311. package/dist/mcp/server.js +0 -64
  312. package/dist/mcp/server.js.map +0 -1
  313. package/dist/middleware/auth.d.ts +0 -13
  314. package/dist/middleware/auth.d.ts.map +0 -1
  315. package/dist/middleware/auth.js +0 -27
  316. package/dist/middleware/auth.js.map +0 -1
  317. package/dist/middleware/permission.d.ts +0 -9
  318. package/dist/middleware/permission.d.ts.map +0 -1
  319. package/dist/middleware/permission.js +0 -19
  320. package/dist/middleware/permission.js.map +0 -1
  321. package/dist/middleware/rate-limit.d.ts +0 -9
  322. package/dist/middleware/rate-limit.d.ts.map +0 -1
  323. package/dist/middleware/rate-limit.js +0 -40
  324. package/dist/middleware/rate-limit.js.map +0 -1
  325. package/dist/middleware/tenant.d.ts +0 -17
  326. package/dist/middleware/tenant.d.ts.map +0 -1
  327. package/dist/middleware/tenant.js +0 -57
  328. package/dist/middleware/tenant.js.map +0 -1
  329. package/dist/middleware/validation.d.ts +0 -40
  330. package/dist/middleware/validation.d.ts.map +0 -1
  331. package/dist/middleware/validation.js +0 -51
  332. package/dist/middleware/validation.js.map +0 -1
  333. package/dist/routes/auth.d.ts +0 -3
  334. package/dist/routes/auth.d.ts.map +0 -1
  335. package/dist/routes/auth.js +0 -77
  336. package/dist/routes/auth.js.map +0 -1
  337. package/dist/routes/members.d.ts +0 -4
  338. package/dist/routes/members.d.ts.map +0 -1
  339. package/dist/routes/members.js +0 -114
  340. package/dist/routes/members.js.map +0 -1
  341. package/dist/routes/organizations.d.ts +0 -5
  342. package/dist/routes/organizations.d.ts.map +0 -1
  343. package/dist/routes/organizations.js +0 -97
  344. package/dist/routes/organizations.js.map +0 -1
  345. package/dist/services/auth.service.d.ts +0 -24
  346. package/dist/services/auth.service.d.ts.map +0 -1
  347. package/dist/services/auth.service.js +0 -70
  348. package/dist/services/auth.service.js.map +0 -1
  349. package/dist/services/password.service.d.ts +0 -3
  350. package/dist/services/password.service.d.ts.map +0 -1
  351. package/dist/services/password.service.js +0 -18
  352. package/dist/services/password.service.js.map +0 -1
  353. package/dist/services/rbac.service.d.ts +0 -7
  354. package/dist/services/rbac.service.d.ts.map +0 -1
  355. package/dist/services/rbac.service.js +0 -36
  356. package/dist/services/rbac.service.js.map +0 -1
  357. package/dist/services/token.service.d.ts +0 -18
  358. package/dist/services/token.service.d.ts.map +0 -1
  359. package/dist/services/token.service.js +0 -86
  360. package/dist/services/token.service.js.map +0 -1
  361. package/dist/tools/core-memory.d.ts +0 -12
  362. package/dist/tools/core-memory.d.ts.map +0 -1
  363. package/dist/tools/core-memory.js +0 -276
  364. package/dist/tools/core-memory.js.map +0 -1
  365. package/dist/tools/edit-file.d.ts +0 -25
  366. package/dist/tools/edit-file.d.ts.map +0 -1
  367. package/dist/tools/edit-file.js +0 -462
  368. package/dist/tools/edit-file.js.map +0 -1
  369. package/dist/tools/index.d.ts +0 -8
  370. package/dist/tools/index.d.ts.map +0 -1
  371. package/dist/tools/index.js +0 -536
  372. package/dist/tools/index.js.map +0 -1
  373. package/dist/tools/read-file.d.ts +0 -13
  374. package/dist/tools/read-file.d.ts.map +0 -1
  375. package/dist/tools/read-file.js +0 -91
  376. package/dist/tools/read-file.js.map +0 -1
  377. package/dist/tools/read-many-files.d.ts +0 -15
  378. package/dist/tools/read-many-files.d.ts.map +0 -1
  379. package/dist/tools/read-many-files.js +0 -187
  380. package/dist/tools/read-many-files.js.map +0 -1
  381. package/dist/tools/spec-index-builder.d.ts +0 -58
  382. package/dist/tools/spec-index-builder.d.ts.map +0 -1
  383. package/dist/tools/spec-index-builder.js +0 -211
  384. package/dist/tools/spec-index-builder.js.map +0 -1
  385. package/dist/tools/spec-init.d.ts +0 -17
  386. package/dist/tools/spec-init.d.ts.map +0 -1
  387. package/dist/tools/spec-init.js +0 -215
  388. package/dist/tools/spec-init.js.map +0 -1
  389. package/dist/tools/spec-keyword-extractor.d.ts +0 -24
  390. package/dist/tools/spec-keyword-extractor.d.ts.map +0 -1
  391. package/dist/tools/spec-keyword-extractor.js +0 -84
  392. package/dist/tools/spec-keyword-extractor.js.map +0 -1
  393. package/dist/tools/spec-keyword-extractor.test.d.ts +0 -2
  394. package/dist/tools/spec-keyword-extractor.test.d.ts.map +0 -1
  395. package/dist/tools/spec-keyword-extractor.test.js +0 -99
  396. package/dist/tools/spec-keyword-extractor.test.js.map +0 -1
  397. package/dist/tools/spec-loader.d.ts +0 -15
  398. package/dist/tools/spec-loader.d.ts.map +0 -1
  399. package/dist/tools/spec-loader.js +0 -93
  400. package/dist/tools/spec-loader.js.map +0 -1
  401. package/dist/tools/team-msg.d.ts +0 -52
  402. package/dist/tools/team-msg.d.ts.map +0 -1
  403. package/dist/tools/team-msg.js +0 -449
  404. package/dist/tools/team-msg.js.map +0 -1
  405. package/dist/tools/write-file.d.ts +0 -19
  406. package/dist/tools/write-file.d.ts.map +0 -1
  407. package/dist/tools/write-file.js +0 -165
  408. package/dist/tools/write-file.js.map +0 -1
  409. package/dist/types/index.d.ts +0 -47
  410. package/dist/types/index.d.ts.map +0 -1
  411. package/dist/types/index.js +0 -2
  412. package/dist/types/index.js.map +0 -1
  413. package/dist/types/tool-schema.d.ts +0 -37
  414. package/dist/types/tool-schema.d.ts.map +0 -1
  415. package/dist/types/tool-schema.js +0 -24
  416. package/dist/types/tool-schema.js.map +0 -1
  417. package/dist/utils/file-reader.d.ts +0 -74
  418. package/dist/utils/file-reader.d.ts.map +0 -1
  419. package/dist/utils/file-reader.js +0 -217
  420. package/dist/utils/file-reader.js.map +0 -1
  421. package/dist/utils/path-validator.d.ts +0 -52
  422. package/dist/utils/path-validator.d.ts.map +0 -1
  423. package/dist/utils/path-validator.js +0 -151
  424. package/dist/utils/path-validator.js.map +0 -1
@@ -1,666 +0,0 @@
1
- // Graph Walker — State machine that traverses ChainGraph nodes autonomously.
2
- import { writeFileSync, readFileSync, mkdirSync, readdirSync } from 'node:fs';
3
- import { join } from 'node:path';
4
- import { randomBytes } from 'node:crypto';
5
- export class GraphWalker {
6
- loader;
7
- assembler;
8
- executor;
9
- analyzer;
10
- outputParser;
11
- evaluator;
12
- emitter;
13
- sessionDir;
14
- parallelExecutor;
15
- activeState = null;
16
- constructor(loader, assembler, executor, analyzer, outputParser, evaluator, emitter, sessionDir, parallelExecutor) {
17
- this.loader = loader;
18
- this.assembler = assembler;
19
- this.executor = executor;
20
- this.analyzer = analyzer;
21
- this.outputParser = outputParser;
22
- this.evaluator = evaluator;
23
- this.emitter = emitter;
24
- this.sessionDir = sessionDir;
25
- this.parallelExecutor = parallelExecutor;
26
- }
27
- async start(graphId, intent, options) {
28
- const sessionId = `coord-${Date.now()}-${randomBytes(2).toString('hex')}`;
29
- const graph = await this.loader.load(graphId);
30
- const ctx = this.buildInitialContext(options);
31
- const state = {
32
- session_id: sessionId,
33
- graph_id: graphId,
34
- current_node: graph.entry,
35
- status: 'running',
36
- context: ctx,
37
- history: [],
38
- fork_state: null,
39
- delegate_stack: [],
40
- created_at: new Date().toISOString(),
41
- updated_at: new Date().toISOString(),
42
- tool: options.tool,
43
- auto_mode: options.autoMode,
44
- step_mode: options.stepMode ?? false,
45
- intent,
46
- };
47
- state.context.inputs['intent'] = intent;
48
- if (options.inputs)
49
- Object.assign(state.context.inputs, options.inputs);
50
- this.activeState = state;
51
- this.emit({ type: 'walker:started', session_id: sessionId, graph_id: graphId, intent });
52
- if (options.dryRun)
53
- return this.dryRunWalk(state, graph);
54
- return this.walkGraph(state, graph);
55
- }
56
- async resume(sessionId) {
57
- const state = this.loadState(sessionId);
58
- this.activeState = state;
59
- const graph = await this.loader.load(state.graph_id);
60
- state.status = 'running';
61
- return this.walkGraph(state, graph);
62
- }
63
- /** Load session state without executing — for status queries. */
64
- getState(sessionId) {
65
- return this.loadState(sessionId);
66
- }
67
- /** Continue a step_paused session — execute next command node, then pause again. */
68
- async next(sessionId) {
69
- const state = this.loadState(sessionId);
70
- if (state.status !== 'step_paused') {
71
- throw new Error(`Cannot advance: session status is '${state.status}', expected 'step_paused'`);
72
- }
73
- this.activeState = state;
74
- state.status = 'running';
75
- const graph = await this.loader.load(state.graph_id);
76
- return this.walkGraph(state, graph);
77
- }
78
- async stop() {
79
- await this.executor.abort();
80
- if (this.activeState) {
81
- this.activeState.status = 'paused';
82
- this.activeState.updated_at = new Date().toISOString();
83
- this.save(this.activeState);
84
- }
85
- }
86
- async walkGraph(state, graph) {
87
- this.activeState = state;
88
- await this.walk(state, graph);
89
- return state;
90
- }
91
- async walk(state, graph) {
92
- while (state.status === 'running') {
93
- const nodeId = state.current_node;
94
- const node = graph.nodes[nodeId];
95
- if (!node) {
96
- state.status = 'failed';
97
- this.emit({ type: 'walker:error', session_id: state.session_id, error: `Node not found: ${nodeId}` });
98
- break;
99
- }
100
- // Visit count guard
101
- const maxVisits = node.max_visits ?? graph.defaults?.max_visits ?? 10;
102
- const currentVisits = state.context.visits[nodeId] ?? 0;
103
- if (currentVisits >= maxVisits) {
104
- const cmdNode = node;
105
- if (node.type === 'command' && cmdNode.on_failure) {
106
- state.current_node = cmdNode.on_failure;
107
- continue;
108
- }
109
- state.status = 'failed';
110
- this.emit({ type: 'walker:error', session_id: state.session_id, error: `Max visits (${maxVisits}) exceeded for ${nodeId}` });
111
- break;
112
- }
113
- // Record visit
114
- state.context.visits[nodeId] = currentVisits + 1;
115
- const entry = {
116
- node_id: nodeId,
117
- node_type: node.type,
118
- entered_at: new Date().toISOString(),
119
- };
120
- state.history.push(entry);
121
- this.emit({ type: 'walker:node_enter', session_id: state.session_id, node_id: nodeId, node_type: node.type });
122
- // Dispatch by type
123
- switch (node.type) {
124
- case 'command':
125
- await this.handleCommand(state, graph, nodeId, node, entry);
126
- break;
127
- case 'decision':
128
- this.handleDecision(state, nodeId, node);
129
- break;
130
- case 'gate':
131
- this.handleGate(state, node, entry);
132
- break;
133
- case 'eval':
134
- this.handleEval(state, node);
135
- break;
136
- case 'fork':
137
- await this.handleFork(state, graph, node);
138
- break;
139
- case 'join':
140
- this.handleJoin(state, node);
141
- break;
142
- case 'terminal':
143
- await this.handleTerminal(state, graph, nodeId, node);
144
- break;
145
- }
146
- entry.exited_at = new Date().toISOString();
147
- this.emit({ type: 'walker:node_exit', session_id: state.session_id, node_id: nodeId, outcome: entry.outcome ?? 'success' });
148
- // Step mode: pause after each command node execution
149
- if (state.step_mode && node.type === 'command' && state.status === 'running') {
150
- state.status = 'step_paused';
151
- }
152
- state.updated_at = new Date().toISOString();
153
- this.save(state);
154
- if (state.status === 'step_paused')
155
- break;
156
- // Bail if status changed to non-running (waiting, paused, completed, failed)
157
- if (state.status !== 'running')
158
- break;
159
- }
160
- }
161
- async handleCommand(state, graph, nodeId, node, entry) {
162
- const prevCmd = this.findPreviousCommand(state);
163
- const cmdIndex = this.countCommandsBefore(state, nodeId) + 1;
164
- const cmdTotal = this.countCommandNodes(graph);
165
- const assembleReq = {
166
- node,
167
- node_id: nodeId,
168
- context: state.context,
169
- graph: { id: graph.id, name: graph.name },
170
- command_index: cmdIndex,
171
- command_total: cmdTotal,
172
- auto_mode: state.auto_mode,
173
- previous_command: prevCmd,
174
- };
175
- const prompt = await this.assembler.assemble(assembleReq);
176
- state.status = 'waiting_command';
177
- this.save(state);
178
- this.emit({ type: 'walker:command', session_id: state.session_id, node_id: nodeId, cmd: node.cmd, status: 'spawned' });
179
- const execResult = await this.executor.execute({
180
- prompt,
181
- agent_type: state.tool || 'claude',
182
- work_dir: state.context.inputs['workflowRoot'] ?? '.',
183
- approval_mode: state.auto_mode ? 'auto' : 'suggest',
184
- timeout_ms: node.timeout_ms ?? graph.defaults?.timeout_ms ?? 300000,
185
- node_id: nodeId,
186
- cmd: node.cmd,
187
- });
188
- const parsed = this.outputParser.parse(execResult.raw_output, node);
189
- state.context.result = parsed.structured;
190
- // Analyze if applicable
191
- let analysis = null;
192
- const shouldAnalyze = node.analyze !== false
193
- && (graph.defaults?.analyze !== false)
194
- && this.countCommandNodes(graph) > 1
195
- && this.analyzer !== null;
196
- if (shouldAnalyze && this.analyzer) {
197
- const analysisResult = await this.analyzer.analyze(node, execResult.raw_output, state.context, prevCmd);
198
- state.context.analysis = analysisResult;
199
- analysis = analysisResult;
200
- }
201
- else {
202
- state.context.analysis = null;
203
- }
204
- entry.exec_id = execResult.exec_id;
205
- entry.quality_score = analysis ? analysis.quality_score : undefined;
206
- entry.summary = parsed.structured.summary || undefined;
207
- if (execResult.success && parsed.structured.status === 'SUCCESS') {
208
- entry.outcome = 'success';
209
- state.current_node = node.next;
210
- state.status = 'running';
211
- this.emit({ type: 'walker:command', session_id: state.session_id, node_id: nodeId, cmd: node.cmd, status: 'completed' });
212
- }
213
- else {
214
- entry.outcome = 'failure';
215
- if (node.on_failure) {
216
- state.current_node = node.on_failure;
217
- state.status = 'running';
218
- }
219
- else {
220
- state.status = 'failed';
221
- }
222
- this.emit({ type: 'walker:command', session_id: state.session_id, node_id: nodeId, cmd: node.cmd, status: 'failed' });
223
- }
224
- }
225
- handleDecision(state, nodeId, node) {
226
- const strategy = node.strategy ?? 'expr';
227
- if (strategy === 'llm') {
228
- // LLM strategy: fallback to first default edge
229
- const defaultEdge = node.edges.find(e => e.default);
230
- if (defaultEdge) {
231
- state.current_node = defaultEdge.target;
232
- }
233
- else {
234
- state.status = 'failed';
235
- }
236
- return;
237
- }
238
- // expr strategy
239
- const resolvedValue = node.eval ? this.evaluator.resolve(node.eval, state.context) : undefined;
240
- let matched = false;
241
- for (const edge of node.edges) {
242
- if (this.evaluator.match(edge, resolvedValue, state.context)) {
243
- state.current_node = edge.target;
244
- matched = true;
245
- this.emit({ type: 'walker:decision', session_id: state.session_id, node_id: nodeId, resolved_value: resolvedValue, target: edge.target });
246
- break;
247
- }
248
- }
249
- if (!matched) {
250
- state.status = 'failed';
251
- this.emit({ type: 'walker:error', session_id: state.session_id, error: `No matching edge in decision ${nodeId}` });
252
- }
253
- }
254
- handleGate(state, node, entry) {
255
- const passed = this.evaluator.evaluate(node.condition, state.context);
256
- if (passed) {
257
- state.current_node = node.on_pass;
258
- entry.outcome = 'success';
259
- }
260
- else if (node.wait) {
261
- state.status = 'waiting_gate';
262
- entry.outcome = 'skipped';
263
- this.save(state);
264
- }
265
- else {
266
- state.current_node = node.on_fail;
267
- entry.outcome = 'failure';
268
- }
269
- }
270
- handleEval(state, node) {
271
- for (const [key, expr] of Object.entries(node.set)) {
272
- const value = this.evaluator.resolve(expr, state.context);
273
- this.setContextValue(state.context, key, value);
274
- }
275
- state.current_node = node.next;
276
- }
277
- async handleFork(state, graph, node) {
278
- // Validate all branch nodes exist
279
- for (const branch of node.branches) {
280
- if (!graph.nodes[branch]) {
281
- state.status = 'failed';
282
- this.emit({ type: 'walker:error', session_id: state.session_id, error: `Fork branch node not found: ${branch}` });
283
- return;
284
- }
285
- }
286
- // Initialize fork_state keyed by current fork node ID
287
- const forkNodeId = state.current_node;
288
- const branchStates = {};
289
- for (const branch of node.branches) {
290
- branchStates[branch] = 'pending';
291
- }
292
- if (!state.fork_state)
293
- state.fork_state = {};
294
- state.fork_state[forkNodeId] = {
295
- branches: branchStates,
296
- join_node: node.join,
297
- results: {},
298
- };
299
- this.emit({ type: 'walker:fork_start', session_id: state.session_id, node_id: forkNodeId, branches: node.branches });
300
- const forkEntry = state.fork_state[forkNodeId];
301
- if (this.parallelExecutor) {
302
- // Parallel execution via injected executor
303
- const workDir = state.context.inputs['workflowRoot'] ?? '.';
304
- const agentType = state.tool || 'claude';
305
- const branchTasks = node.branches.map((branchId) => {
306
- const branchNode = graph.nodes[branchId];
307
- return {
308
- branchId,
309
- nodeId: branchId,
310
- prompt: branchNode.type === 'command' ? branchNode.cmd : branchId,
311
- workDir,
312
- agentType,
313
- };
314
- });
315
- // Mark all branches running
316
- for (const branch of node.branches) {
317
- forkEntry.branches[branch] = 'running';
318
- }
319
- const joinNode = graph.nodes[node.join];
320
- const strategy = joinNode?.strategy ?? 'all';
321
- const results = await this.parallelExecutor.executeBranches(branchTasks, strategy);
322
- // Update branch states and store results
323
- for (const result of results) {
324
- forkEntry.branches[result.branchId] = result.success ? 'completed' : 'failed';
325
- forkEntry.results[result.branchId] = { output: result.output, success: result.success, durationMs: result.durationMs };
326
- state.context.visits[result.branchId] = (state.context.visits[result.branchId] ?? 0) + 1;
327
- this.emit({ type: 'walker:branch_complete', session_id: state.session_id, node_id: forkNodeId, branch_id: result.branchId, success: result.success });
328
- }
329
- }
330
- else {
331
- // Sequential fallback — visit each branch entry, record visit
332
- for (const branch of node.branches) {
333
- forkEntry.branches[branch] = 'running';
334
- state.context.visits[branch] = (state.context.visits[branch] ?? 0) + 1;
335
- forkEntry.branches[branch] = 'completed';
336
- forkEntry.results[branch] = { output: '', success: true, durationMs: 0 };
337
- this.emit({ type: 'walker:branch_complete', session_id: state.session_id, node_id: forkNodeId, branch_id: branch, success: true });
338
- }
339
- }
340
- state.current_node = node.join;
341
- }
342
- handleJoin(state, node) {
343
- if (!state.fork_state) {
344
- // No fork state — just proceed (backward compat)
345
- state.current_node = node.next;
346
- return;
347
- }
348
- // Find the fork entry that references this join node
349
- const joinNodeId = state.current_node;
350
- let forkKey;
351
- for (const [key, entry] of Object.entries(state.fork_state)) {
352
- if (entry.join_node === joinNodeId) {
353
- forkKey = key;
354
- break;
355
- }
356
- }
357
- if (!forkKey) {
358
- // No matching fork — just proceed
359
- state.current_node = node.next;
360
- return;
361
- }
362
- const forkEntry = state.fork_state[forkKey];
363
- // Evaluate join strategy
364
- const branches = forkEntry.branches;
365
- const branchIds = Object.keys(branches);
366
- const completedCount = branchIds.filter((id) => branches[id] === 'completed').length;
367
- const totalCount = branchIds.length;
368
- let joinSuccess;
369
- switch (node.strategy) {
370
- case 'all':
371
- joinSuccess = completedCount === totalCount;
372
- break;
373
- case 'any':
374
- joinSuccess = completedCount >= 1;
375
- break;
376
- case 'majority':
377
- joinSuccess = completedCount > totalCount / 2;
378
- break;
379
- default:
380
- joinSuccess = completedCount === totalCount;
381
- }
382
- // Apply merge mode to aggregate branch results
383
- const mergeMode = node.merge ?? 'concat';
384
- const branchResults = forkEntry.results;
385
- switch (mergeMode) {
386
- case 'concat': {
387
- const outputs = [];
388
- for (const id of branchIds) {
389
- const br = branchResults[id];
390
- if (br?.output)
391
- outputs.push(br.output);
392
- }
393
- state.context.result = { merged: outputs.join('\n'), branches: branchResults };
394
- break;
395
- }
396
- case 'last': {
397
- const lastId = branchIds[branchIds.length - 1];
398
- const lastResult = branchResults[lastId];
399
- state.context.result = lastResult ? { ...lastResult, branches: branchResults } : { branches: branchResults };
400
- break;
401
- }
402
- case 'best_score': {
403
- // Pick the first successful branch; fall back to first branch
404
- let bestId = branchIds[0];
405
- for (const id of branchIds) {
406
- if (branches[id] === 'completed') {
407
- bestId = id;
408
- break;
409
- }
410
- }
411
- const bestResult = branchResults[bestId];
412
- state.context.result = bestResult ? { ...bestResult, branches: branchResults } : { branches: branchResults };
413
- break;
414
- }
415
- }
416
- this.emit({ type: 'walker:join_complete', session_id: state.session_id, node_id: state.current_node, strategy: node.strategy, success: joinSuccess });
417
- // Clear fork state for this fork
418
- delete state.fork_state[forkKey];
419
- if (Object.keys(state.fork_state).length === 0) {
420
- state.fork_state = null;
421
- }
422
- if (joinSuccess) {
423
- state.current_node = node.next;
424
- }
425
- else {
426
- state.status = 'failed';
427
- this.emit({ type: 'walker:error', session_id: state.session_id, error: `Join strategy '${node.strategy}' not satisfied: ${completedCount}/${totalCount} branches completed` });
428
- }
429
- }
430
- async handleTerminal(state, graph, nodeId, node) {
431
- if (node.status === 'delegate' && node.delegate_graph) {
432
- // Push current frame
433
- state.delegate_stack.push({
434
- parent_graph_id: state.graph_id,
435
- parent_node_id: nodeId,
436
- return_inputs: { ...state.context.inputs },
437
- });
438
- this.emit({ type: 'walker:delegate', session_id: state.session_id, from_graph: state.graph_id, to_graph: node.delegate_graph });
439
- const newGraph = await this.loader.load(node.delegate_graph);
440
- // Merge delegate_inputs
441
- if (node.delegate_inputs) {
442
- for (const [key, tmpl] of Object.entries(node.delegate_inputs)) {
443
- state.context.inputs[key] = this.resolveTemplate(tmpl, state.context);
444
- }
445
- }
446
- state.graph_id = node.delegate_graph;
447
- state.current_node = newGraph.entry;
448
- await this.walk(state, newGraph);
449
- // After delegate completes, pop frame and return to parent
450
- if (state.delegate_stack.length > 0 && (state.status === 'completed' || state.status === 'failed')) {
451
- const frame = state.delegate_stack.pop();
452
- state.graph_id = frame.parent_graph_id;
453
- Object.assign(state.context.inputs, frame.return_inputs);
454
- }
455
- return;
456
- }
457
- // Non-delegate terminal
458
- if (node.status === 'success') {
459
- if (state.delegate_stack.length > 0) {
460
- const frame = state.delegate_stack.pop();
461
- state.graph_id = frame.parent_graph_id;
462
- Object.assign(state.context.inputs, frame.return_inputs);
463
- state.status = 'completed';
464
- }
465
- else {
466
- state.status = 'completed';
467
- }
468
- }
469
- else if (node.status === 'failure') {
470
- state.status = 'failed';
471
- }
472
- else if (node.status === 'paused') {
473
- state.status = 'paused';
474
- }
475
- const historySummary = state.history
476
- .filter(h => h.summary)
477
- .map(h => `${h.node_id}: ${h.summary}`);
478
- this.emit({
479
- type: 'walker:completed',
480
- session_id: state.session_id,
481
- status: state.status === 'completed' ? 'success' : 'failure',
482
- history_summary: historySummary,
483
- });
484
- }
485
- countCommandNodes(graph) {
486
- return Object.values(graph.nodes).filter(n => n.type === 'command').length;
487
- }
488
- countCommandsBefore(state, _nodeId) {
489
- const seen = new Set();
490
- for (const entry of state.history) {
491
- if (entry.node_type === 'command')
492
- seen.add(entry.node_id);
493
- }
494
- seen.delete(_nodeId);
495
- return seen.size;
496
- }
497
- findPreviousCommand(state) {
498
- for (let i = state.history.length - 1; i >= 0; i--) {
499
- const h = state.history[i];
500
- if (h.node_type === 'command' && h.outcome) {
501
- return {
502
- node_id: h.node_id,
503
- cmd: h.node_id,
504
- outcome: h.outcome === 'skipped' ? 'failure' : h.outcome,
505
- summary: h.summary,
506
- };
507
- }
508
- }
509
- return undefined;
510
- }
511
- setContextValue(ctx, path, value) {
512
- const parts = path.split('.');
513
- if (parts.length === 1) {
514
- ctx.var[parts[0]] = value;
515
- return;
516
- }
517
- const root = parts[0];
518
- const rest = parts.slice(1);
519
- let target;
520
- switch (root) {
521
- case 'inputs':
522
- target = ctx.inputs;
523
- break;
524
- case 'var':
525
- target = ctx.var;
526
- break;
527
- case 'result':
528
- target = (ctx.result ?? {});
529
- ctx.result = target;
530
- break;
531
- default:
532
- target = ctx.var;
533
- rest.unshift(root);
534
- break;
535
- }
536
- for (let i = 0; i < rest.length - 1; i++) {
537
- const key = rest[i];
538
- if (!(key in target) || typeof target[key] !== 'object' || target[key] === null) {
539
- target[key] = {};
540
- }
541
- target = target[key];
542
- }
543
- target[rest[rest.length - 1]] = value;
544
- }
545
- resolveTemplate(template, ctx) {
546
- return template.replace(/\{([^}]+)\}/g, (_match, key) => {
547
- const value = this.evaluator.resolve(key.trim(), ctx);
548
- return value !== undefined ? String(value) : `{${key}}`;
549
- });
550
- }
551
- buildInitialContext(options) {
552
- let project = {
553
- initialized: false,
554
- current_phase: null,
555
- phase_status: 'pending',
556
- artifacts: {},
557
- execution: { tasks_completed: 0, tasks_total: 0 },
558
- verification_status: 'pending',
559
- review_verdict: null,
560
- uat_status: 'pending',
561
- phases_total: 0,
562
- phases_completed: 0,
563
- accumulated_context: null,
564
- };
565
- try {
566
- const stateFile = join(options.workflowRoot, '.workflow', 'state.json');
567
- const raw = JSON.parse(readFileSync(stateFile, 'utf-8'));
568
- if (raw && typeof raw === 'object') {
569
- project = { ...project, ...raw, initialized: true };
570
- }
571
- }
572
- catch { /* no state file */ }
573
- return {
574
- inputs: {
575
- workflowRoot: options.workflowRoot,
576
- phase: project.current_phase != null ? String(project.current_phase) : '',
577
- },
578
- project,
579
- result: null,
580
- analysis: null,
581
- visits: {},
582
- var: {},
583
- };
584
- }
585
- save(state) {
586
- if (!this.sessionDir)
587
- return;
588
- try {
589
- const dir = join(this.sessionDir, state.session_id);
590
- mkdirSync(dir, { recursive: true });
591
- writeFileSync(join(dir, 'walker-state.json'), JSON.stringify(state, null, 2), 'utf-8');
592
- }
593
- catch { /* best-effort */ }
594
- }
595
- loadState(sessionId) {
596
- if (!this.sessionDir)
597
- throw new Error('No sessionDir configured for resume');
598
- if (sessionId) {
599
- const filePath = join(this.sessionDir, sessionId, 'walker-state.json');
600
- try {
601
- return JSON.parse(readFileSync(filePath, 'utf-8'));
602
- }
603
- catch {
604
- throw new Error(`Session not found: ${sessionId} (expected ${filePath})`);
605
- }
606
- }
607
- let entries;
608
- try {
609
- entries = readdirSync(this.sessionDir, { withFileTypes: true });
610
- }
611
- catch {
612
- throw new Error(`No sessions directory at ${this.sessionDir}`);
613
- }
614
- const dirs = entries
615
- .filter(e => e.isDirectory() && e.name.startsWith('coord-'))
616
- .map(e => e.name)
617
- .sort()
618
- .reverse();
619
- if (dirs.length === 0)
620
- throw new Error('No walker sessions found');
621
- const filePath = join(this.sessionDir, dirs[0], 'walker-state.json');
622
- return JSON.parse(readFileSync(filePath, 'utf-8'));
623
- }
624
- dryRunWalk(state, graph) {
625
- const visited = [];
626
- let current = state.current_node;
627
- const seen = new Set();
628
- while (current && !seen.has(current)) {
629
- seen.add(current);
630
- const node = graph.nodes[current];
631
- if (!node)
632
- break;
633
- visited.push(`${current} (${node.type})`);
634
- switch (node.type) {
635
- case 'command':
636
- current = node.next;
637
- break;
638
- case 'decision':
639
- current = node.edges[0]?.target ?? '';
640
- break;
641
- case 'gate':
642
- current = node.on_pass;
643
- break;
644
- case 'eval':
645
- current = node.next;
646
- break;
647
- case 'fork':
648
- current = node.join;
649
- break;
650
- case 'join':
651
- current = node.next;
652
- break;
653
- case 'terminal':
654
- current = '';
655
- break;
656
- }
657
- }
658
- state.status = 'completed';
659
- state.context.var['dry_run_plan'] = visited;
660
- return state;
661
- }
662
- emit(event) {
663
- this.emitter?.emit(event);
664
- }
665
- }
666
- //# sourceMappingURL=graph-walker.js.map