@telora/daemon 0.15.2 → 0.15.4

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 (401) hide show
  1. package/README.md +11 -11
  2. package/build-info.json +2 -2
  3. package/dist/assembly-engine.d.ts +1 -1
  4. package/dist/assembly-engine.d.ts.map +1 -1
  5. package/dist/assembly-resolvers.js +41 -41
  6. package/dist/assembly-resolvers.js.map +1 -1
  7. package/dist/branch-status.d.ts +4 -4
  8. package/dist/branch-status.d.ts.map +1 -1
  9. package/dist/branch-status.js +23 -23
  10. package/dist/branch-status.js.map +1 -1
  11. package/dist/cli/connect.js +1 -1
  12. package/dist/cli/connect.js.map +1 -1
  13. package/dist/completion-detector.d.ts +1 -1
  14. package/dist/completion-detector.js +1 -1
  15. package/dist/completion-handler.d.ts +1 -1
  16. package/dist/completion-handler.js +4 -4
  17. package/dist/completion-handler.js.map +1 -1
  18. package/dist/condition-evaluators.js +4 -4
  19. package/dist/condition-evaluators.js.map +1 -1
  20. package/dist/control-state.d.ts +6 -6
  21. package/dist/control-state.d.ts.map +1 -1
  22. package/dist/control-state.js +43 -43
  23. package/dist/control-state.js.map +1 -1
  24. package/dist/crash-recovery-scan.d.ts +1 -1
  25. package/dist/crash-recovery-scan.js +20 -20
  26. package/dist/crash-recovery-scan.js.map +1 -1
  27. package/dist/crash-recovery-types.d.ts +3 -3
  28. package/dist/crash-recovery-types.d.ts.map +1 -1
  29. package/dist/crash-recovery-types.js +2 -2
  30. package/dist/crash-recovery-types.js.map +1 -1
  31. package/dist/crash-recovery.d.ts +3 -3
  32. package/dist/crash-recovery.d.ts.map +1 -1
  33. package/dist/crash-recovery.js +21 -21
  34. package/dist/crash-recovery.js.map +1 -1
  35. package/dist/daemon-process.d.ts +1 -1
  36. package/dist/daemon-process.d.ts.map +1 -1
  37. package/dist/dag-validator.d.ts +6 -6
  38. package/dist/dag-validator.d.ts.map +1 -1
  39. package/dist/dag-validator.js +2 -2
  40. package/dist/dag-validator.js.map +1 -1
  41. package/dist/delivery-guards.d.ts +1 -1
  42. package/dist/delivery-guards.js +1 -1
  43. package/dist/delivery-lifecycle.d.ts +5 -5
  44. package/dist/delivery-lifecycle.d.ts.map +1 -1
  45. package/dist/delivery-lifecycle.js +12 -12
  46. package/dist/delivery-lifecycle.js.map +1 -1
  47. package/dist/delivery-merge.js +1 -1
  48. package/dist/delivery-merge.js.map +1 -1
  49. package/dist/dependency-resolver.d.ts +7 -7
  50. package/dist/dependency-resolver.d.ts.map +1 -1
  51. package/dist/dependency-resolver.js.map +1 -1
  52. package/dist/directive-executor.d.ts +32 -17
  53. package/dist/directive-executor.d.ts.map +1 -1
  54. package/dist/directive-executor.js +119 -78
  55. package/dist/directive-executor.js.map +1 -1
  56. package/dist/evaluation-context.d.ts +2 -2
  57. package/dist/evaluation-context.d.ts.map +1 -1
  58. package/dist/evaluation-context.js +4 -4
  59. package/dist/evaluation-context.js.map +1 -1
  60. package/dist/focus-completion-event.d.ts +97 -0
  61. package/dist/focus-completion-event.d.ts.map +1 -0
  62. package/dist/focus-completion-event.js +257 -0
  63. package/dist/focus-completion-event.js.map +1 -0
  64. package/dist/{strategy-completion.d.ts → focus-completion.d.ts} +11 -11
  65. package/dist/focus-completion.d.ts.map +1 -0
  66. package/dist/{strategy-completion.js → focus-completion.js} +68 -68
  67. package/dist/focus-completion.js.map +1 -0
  68. package/dist/{strategy-engine.d.ts → focus-engine.d.ts} +5 -5
  69. package/dist/focus-engine.d.ts.map +1 -0
  70. package/dist/{strategy-engine.js → focus-engine.js} +35 -35
  71. package/dist/focus-engine.js.map +1 -0
  72. package/dist/focus-executor.d.ts +55 -0
  73. package/dist/focus-executor.d.ts.map +1 -0
  74. package/dist/{strategy-executor.js → focus-executor.js} +167 -120
  75. package/dist/focus-executor.js.map +1 -0
  76. package/dist/focus-lifecycle.d.ts +61 -0
  77. package/dist/focus-lifecycle.d.ts.map +1 -0
  78. package/dist/{strategy-lifecycle.js → focus-lifecycle.js} +164 -164
  79. package/dist/focus-lifecycle.js.map +1 -0
  80. package/dist/{strategy-merge.d.ts → focus-merge.d.ts} +10 -10
  81. package/dist/focus-merge.d.ts.map +1 -0
  82. package/dist/{strategy-merge.js → focus-merge.js} +51 -51
  83. package/dist/focus-merge.js.map +1 -0
  84. package/dist/focus-phase.d.ts +22 -0
  85. package/dist/focus-phase.d.ts.map +1 -0
  86. package/dist/focus-phase.js +54 -0
  87. package/dist/focus-phase.js.map +1 -0
  88. package/dist/focus-prompt-builder.d.ts +35 -0
  89. package/dist/focus-prompt-builder.d.ts.map +1 -0
  90. package/dist/{strategy-prompt-builder.js → focus-prompt-builder.js} +55 -4
  91. package/dist/focus-prompt-builder.js.map +1 -0
  92. package/dist/focus-provisioning.d.ts +16 -0
  93. package/dist/focus-provisioning.d.ts.map +1 -0
  94. package/dist/focus-provisioning.js +119 -0
  95. package/dist/focus-provisioning.js.map +1 -0
  96. package/dist/{strategy-spawn-helpers.d.ts → focus-spawn-helpers.d.ts} +15 -15
  97. package/dist/focus-spawn-helpers.d.ts.map +1 -0
  98. package/dist/{strategy-spawn-helpers.js → focus-spawn-helpers.js} +28 -28
  99. package/dist/focus-spawn-helpers.js.map +1 -0
  100. package/dist/{strategy-team-lifecycle.d.ts → focus-team-lifecycle.d.ts} +13 -13
  101. package/dist/focus-team-lifecycle.d.ts.map +1 -0
  102. package/dist/{strategy-team-lifecycle.js → focus-team-lifecycle.js} +57 -57
  103. package/dist/focus-team-lifecycle.js.map +1 -0
  104. package/dist/focus-team-state.d.ts +24 -0
  105. package/dist/focus-team-state.d.ts.map +1 -0
  106. package/dist/{strategy-team-state.js → focus-team-state.js} +9 -9
  107. package/dist/focus-team-state.js.map +1 -0
  108. package/dist/focus-worktree-state.d.ts +47 -0
  109. package/dist/focus-worktree-state.d.ts.map +1 -0
  110. package/dist/{strategy-worktree-state.js → focus-worktree-state.js} +29 -29
  111. package/dist/focus-worktree-state.js.map +1 -0
  112. package/dist/git-merge.d.ts +5 -5
  113. package/dist/git-merge.d.ts.map +1 -1
  114. package/dist/git-merge.js +5 -5
  115. package/dist/git-merge.js.map +1 -1
  116. package/dist/git-state-detector.d.ts +1 -1
  117. package/dist/git-state-detector.js +9 -9
  118. package/dist/git-state-detector.js.map +1 -1
  119. package/dist/git-utils.d.ts +1 -1
  120. package/dist/git-utils.js +1 -1
  121. package/dist/git.d.ts +2 -2
  122. package/dist/git.d.ts.map +1 -1
  123. package/dist/git.js +3 -3
  124. package/dist/git.js.map +1 -1
  125. package/dist/heartbeat.d.ts +4 -4
  126. package/dist/heartbeat.d.ts.map +1 -1
  127. package/dist/heartbeat.js +7 -7
  128. package/dist/heartbeat.js.map +1 -1
  129. package/dist/index.d.ts +1 -1
  130. package/dist/index.js +10 -10
  131. package/dist/index.js.map +1 -1
  132. package/dist/listener-auto-advance.d.ts +2 -2
  133. package/dist/listener-auto-advance.js +21 -21
  134. package/dist/listener-auto-advance.js.map +1 -1
  135. package/dist/listener.d.ts +12 -12
  136. package/dist/listener.d.ts.map +1 -1
  137. package/dist/listener.js +80 -75
  138. package/dist/listener.js.map +1 -1
  139. package/dist/loop-engine.d.ts +20 -20
  140. package/dist/loop-engine.d.ts.map +1 -1
  141. package/dist/loop-engine.js +82 -82
  142. package/dist/loop-engine.js.map +1 -1
  143. package/dist/loop-event-bus.d.ts +5 -5
  144. package/dist/loop-event-bus.d.ts.map +1 -1
  145. package/dist/loop-event-bus.js +3 -3
  146. package/dist/loop-llm-client.d.ts +1 -1
  147. package/dist/loop-llm-client.js +1 -1
  148. package/dist/loop-variance.d.ts +1 -1
  149. package/dist/loop-variance.js +1 -1
  150. package/dist/merge-detector.d.ts +6 -6
  151. package/dist/merge-detector.d.ts.map +1 -1
  152. package/dist/merge-detector.js +47 -47
  153. package/dist/merge-detector.js.map +1 -1
  154. package/dist/otlp-log-parser.js +2 -2
  155. package/dist/otlp-log-parser.js.map +1 -1
  156. package/dist/otlp-metric-parser.js +1 -1
  157. package/dist/otlp-metric-parser.js.map +1 -1
  158. package/dist/otlp-receiver.d.ts +1 -1
  159. package/dist/otlp-receiver.js +7 -7
  160. package/dist/otlp-receiver.js.map +1 -1
  161. package/dist/otlp-types.d.ts +1 -1
  162. package/dist/otlp-types.d.ts.map +1 -1
  163. package/dist/otlp-types.js +3 -3
  164. package/dist/otlp-types.js.map +1 -1
  165. package/dist/output-monitor.d.ts +6 -6
  166. package/dist/output-monitor.d.ts.map +1 -1
  167. package/dist/output-monitor.js +11 -11
  168. package/dist/output-monitor.js.map +1 -1
  169. package/dist/planning-prompt-builder.d.ts +11 -11
  170. package/dist/planning-prompt-builder.d.ts.map +1 -1
  171. package/dist/planning-prompt-builder.js +28 -28
  172. package/dist/planning-prompt-builder.js.map +1 -1
  173. package/dist/pm/mitigation-correlator.d.ts +7 -7
  174. package/dist/pm/mitigation-correlator.d.ts.map +1 -1
  175. package/dist/pm/mitigation-correlator.js +33 -33
  176. package/dist/pm/mitigation-correlator.js.map +1 -1
  177. package/dist/pm-engine.js +1 -1
  178. package/dist/pm-engine.js.map +1 -1
  179. package/dist/prompt-builder.d.ts +1 -1
  180. package/dist/prompt-builder.js +9 -9
  181. package/dist/prompt-builder.js.map +1 -1
  182. package/dist/prompts/starter-prompt.d.ts +2 -2
  183. package/dist/prompts/starter-prompt.d.ts.map +1 -1
  184. package/dist/prompts/starter-prompt.js +6 -6
  185. package/dist/qa-crash-recovery.d.ts +10 -10
  186. package/dist/qa-crash-recovery.d.ts.map +1 -1
  187. package/dist/qa-crash-recovery.js +32 -32
  188. package/dist/qa-crash-recovery.js.map +1 -1
  189. package/dist/qa-dev-server.d.ts +3 -3
  190. package/dist/qa-dev-server.d.ts.map +1 -1
  191. package/dist/qa-dev-server.js +3 -3
  192. package/dist/qa-dev-server.js.map +1 -1
  193. package/dist/qa-orchestrator.d.ts +18 -18
  194. package/dist/qa-orchestrator.d.ts.map +1 -1
  195. package/dist/qa-orchestrator.js +47 -47
  196. package/dist/qa-orchestrator.js.map +1 -1
  197. package/dist/qa-provisioner.d.ts +3 -3
  198. package/dist/qa-provisioner.d.ts.map +1 -1
  199. package/dist/qa-provisioner.js +14 -14
  200. package/dist/qa-provisioner.js.map +1 -1
  201. package/dist/qa-state.d.ts +10 -10
  202. package/dist/qa-state.d.ts.map +1 -1
  203. package/dist/qa-state.js +11 -11
  204. package/dist/qa-state.js.map +1 -1
  205. package/dist/queries/control-state.d.ts +5 -5
  206. package/dist/queries/control-state.d.ts.map +1 -1
  207. package/dist/queries/control-state.js +4 -4
  208. package/dist/queries/control-state.js.map +1 -1
  209. package/dist/queries/deliveries.d.ts +24 -23
  210. package/dist/queries/deliveries.d.ts.map +1 -1
  211. package/dist/queries/deliveries.js +30 -29
  212. package/dist/queries/deliveries.js.map +1 -1
  213. package/dist/queries/{strategies.d.ts → focuses.d.ts} +24 -21
  214. package/dist/queries/focuses.d.ts.map +1 -0
  215. package/dist/queries/{strategies.js → focuses.js} +39 -31
  216. package/dist/queries/focuses.js.map +1 -0
  217. package/dist/queries/index.d.ts +3 -3
  218. package/dist/queries/index.d.ts.map +1 -1
  219. package/dist/queries/index.js +2 -2
  220. package/dist/queries/index.js.map +1 -1
  221. package/dist/queries/qa.d.ts +16 -16
  222. package/dist/queries/qa.d.ts.map +1 -1
  223. package/dist/queries/qa.js +22 -22
  224. package/dist/queries/qa.js.map +1 -1
  225. package/dist/queries/schemas.d.ts +36 -30
  226. package/dist/queries/schemas.d.ts.map +1 -1
  227. package/dist/queries/schemas.js +28 -25
  228. package/dist/queries/schemas.js.map +1 -1
  229. package/dist/queries/sessions.d.ts +1 -1
  230. package/dist/queries/sessions.d.ts.map +1 -1
  231. package/dist/queries/sessions.js +2 -2
  232. package/dist/queries/sessions.js.map +1 -1
  233. package/dist/queries/shared.js +10 -10
  234. package/dist/queries/shared.js.map +1 -1
  235. package/dist/queries/workflows.d.ts +1 -1
  236. package/dist/queries/workflows.js +1 -1
  237. package/dist/queries/worktrees.d.ts +7 -7
  238. package/dist/queries/worktrees.d.ts.map +1 -1
  239. package/dist/queries/worktrees.js +7 -7
  240. package/dist/queries/worktrees.js.map +1 -1
  241. package/dist/review-defect-detector.d.ts +125 -0
  242. package/dist/review-defect-detector.d.ts.map +1 -0
  243. package/dist/review-defect-detector.js +289 -0
  244. package/dist/review-defect-detector.js.map +1 -0
  245. package/dist/session-lifecycle.d.ts +17 -17
  246. package/dist/session-lifecycle.d.ts.map +1 -1
  247. package/dist/session-lifecycle.js +82 -82
  248. package/dist/session-lifecycle.js.map +1 -1
  249. package/dist/spawn-cooldown.d.ts +8 -8
  250. package/dist/spawn-cooldown.d.ts.map +1 -1
  251. package/dist/spawn-cooldown.js +15 -15
  252. package/dist/spawn-cooldown.js.map +1 -1
  253. package/dist/spawn-environment.d.ts +2 -2
  254. package/dist/spawn-environment.d.ts.map +1 -1
  255. package/dist/spawn-environment.js +3 -3
  256. package/dist/spawn-environment.js.map +1 -1
  257. package/dist/spawner-lifecycle.d.ts +2 -2
  258. package/dist/spawner-lifecycle.d.ts.map +1 -1
  259. package/dist/spawner-lifecycle.js +3 -3
  260. package/dist/spawner-lifecycle.js.map +1 -1
  261. package/dist/spawner-resolution.d.ts +3 -3
  262. package/dist/spawner-resolution.d.ts.map +1 -1
  263. package/dist/spawner-resolution.js +4 -4
  264. package/dist/spawner-resolution.js.map +1 -1
  265. package/dist/spawner-stream-handlers.js +2 -2
  266. package/dist/spawner-stream-handlers.js.map +1 -1
  267. package/dist/spawner.d.ts +1 -1
  268. package/dist/spawner.d.ts.map +1 -1
  269. package/dist/spawner.js +6 -6
  270. package/dist/spawner.js.map +1 -1
  271. package/dist/stage-classifier.d.ts +1 -1
  272. package/dist/stage-classifier.js +1 -1
  273. package/dist/state-cascade.d.ts +25 -25
  274. package/dist/state-cascade.d.ts.map +1 -1
  275. package/dist/state-cascade.js +89 -89
  276. package/dist/state-cascade.js.map +1 -1
  277. package/dist/supabase.d.ts +4 -4
  278. package/dist/supabase.d.ts.map +1 -1
  279. package/dist/supabase.js +5 -5
  280. package/dist/supabase.js.map +1 -1
  281. package/dist/task-converter.d.ts +4 -4
  282. package/dist/task-converter.d.ts.map +1 -1
  283. package/dist/task-converter.js +1 -1
  284. package/dist/task-converter.js.map +1 -1
  285. package/dist/team-prompt-base.d.ts +49 -22
  286. package/dist/team-prompt-base.d.ts.map +1 -1
  287. package/dist/team-prompt-base.js +96 -32
  288. package/dist/team-prompt-base.js.map +1 -1
  289. package/dist/team-spawner.d.ts +9 -9
  290. package/dist/team-spawner.d.ts.map +1 -1
  291. package/dist/team-spawner.js +84 -82
  292. package/dist/team-spawner.js.map +1 -1
  293. package/dist/telemetry-writer.d.ts +2 -2
  294. package/dist/telemetry-writer.d.ts.map +1 -1
  295. package/dist/templates/claude-md.js +8 -8
  296. package/dist/templates/claude-settings.d.ts +1 -1
  297. package/dist/templates/claude-settings.js +2 -2
  298. package/dist/templates/claude-settings.js.map +1 -1
  299. package/dist/trigger-executor.d.ts +4 -4
  300. package/dist/trigger-executor.d.ts.map +1 -1
  301. package/dist/trigger-executor.js +11 -11
  302. package/dist/trigger-executor.js.map +1 -1
  303. package/dist/types/dag.d.ts +1 -1
  304. package/dist/types/delivery.d.ts +3 -3
  305. package/dist/types/delivery.d.ts.map +1 -1
  306. package/dist/types/{strategy.d.ts → focus.d.ts} +65 -31
  307. package/dist/types/focus.d.ts.map +1 -0
  308. package/dist/types/focus.js +5 -0
  309. package/dist/types/focus.js.map +1 -0
  310. package/dist/types/index.d.ts +1 -1
  311. package/dist/types/index.d.ts.map +1 -1
  312. package/dist/types/index.js +1 -1
  313. package/dist/types/index.js.map +1 -1
  314. package/dist/types/merge.d.ts +1 -1
  315. package/dist/types/session.d.ts +2 -2
  316. package/dist/types/session.d.ts.map +1 -1
  317. package/dist/unified-engine-lifecycle.js +11 -11
  318. package/dist/unified-engine-lifecycle.js.map +1 -1
  319. package/dist/unified-init.d.ts +1 -1
  320. package/dist/unified-init.js +9 -9
  321. package/dist/unified-init.js.map +1 -1
  322. package/dist/unified-shell-config.d.ts +4 -4
  323. package/dist/unified-shell-config.d.ts.map +1 -1
  324. package/dist/unified-shell-config.js +5 -5
  325. package/dist/unified-shell-config.js.map +1 -1
  326. package/dist/unified-shell-status.js +3 -3
  327. package/dist/unified-shell-status.js.map +1 -1
  328. package/dist/unified-shell.d.ts +1 -1
  329. package/dist/unified-shell.js +4 -4
  330. package/dist/unified-shell.js.map +1 -1
  331. package/dist/workflow-engine.d.ts +1 -1
  332. package/dist/workflow-engine.d.ts.map +1 -1
  333. package/dist/{worktree-strategy.d.ts → worktree-focus.d.ts} +15 -15
  334. package/dist/worktree-focus.d.ts.map +1 -0
  335. package/dist/{worktree-strategy.js → worktree-focus.js} +37 -37
  336. package/dist/worktree-focus.js.map +1 -0
  337. package/dist/worktree.d.ts +10 -10
  338. package/dist/worktree.d.ts.map +1 -1
  339. package/dist/worktree.js +39 -39
  340. package/dist/worktree.js.map +1 -1
  341. package/package.json +3 -3
  342. package/dist/listener-review.d.ts +0 -37
  343. package/dist/listener-review.d.ts.map +0 -1
  344. package/dist/listener-review.js +0 -217
  345. package/dist/listener-review.js.map +0 -1
  346. package/dist/queries/strategies.d.ts.map +0 -1
  347. package/dist/queries/strategies.js.map +0 -1
  348. package/dist/review-spawner.d.ts +0 -32
  349. package/dist/review-spawner.d.ts.map +0 -1
  350. package/dist/review-spawner.js +0 -170
  351. package/dist/review-spawner.js.map +0 -1
  352. package/dist/strategy-completion-event.d.ts +0 -63
  353. package/dist/strategy-completion-event.d.ts.map +0 -1
  354. package/dist/strategy-completion-event.js +0 -138
  355. package/dist/strategy-completion-event.js.map +0 -1
  356. package/dist/strategy-completion.d.ts.map +0 -1
  357. package/dist/strategy-completion.js.map +0 -1
  358. package/dist/strategy-engine.d.ts.map +0 -1
  359. package/dist/strategy-engine.js.map +0 -1
  360. package/dist/strategy-executor.d.ts +0 -55
  361. package/dist/strategy-executor.d.ts.map +0 -1
  362. package/dist/strategy-executor.js.map +0 -1
  363. package/dist/strategy-lifecycle.d.ts +0 -61
  364. package/dist/strategy-lifecycle.d.ts.map +0 -1
  365. package/dist/strategy-lifecycle.js.map +0 -1
  366. package/dist/strategy-merge.d.ts.map +0 -1
  367. package/dist/strategy-merge.js.map +0 -1
  368. package/dist/strategy-prompt-builder.d.ts +0 -24
  369. package/dist/strategy-prompt-builder.d.ts.map +0 -1
  370. package/dist/strategy-prompt-builder.js.map +0 -1
  371. package/dist/strategy-provisioning.d.ts +0 -16
  372. package/dist/strategy-provisioning.d.ts.map +0 -1
  373. package/dist/strategy-provisioning.js +0 -119
  374. package/dist/strategy-provisioning.js.map +0 -1
  375. package/dist/strategy-spawn-helpers.d.ts.map +0 -1
  376. package/dist/strategy-spawn-helpers.js.map +0 -1
  377. package/dist/strategy-team-lifecycle.d.ts.map +0 -1
  378. package/dist/strategy-team-lifecycle.js.map +0 -1
  379. package/dist/strategy-team-state.d.ts +0 -24
  380. package/dist/strategy-team-state.d.ts.map +0 -1
  381. package/dist/strategy-team-state.js.map +0 -1
  382. package/dist/strategy-teardown.d.ts +0 -24
  383. package/dist/strategy-teardown.d.ts.map +0 -1
  384. package/dist/strategy-teardown.js +0 -158
  385. package/dist/strategy-teardown.js.map +0 -1
  386. package/dist/strategy-worktree-state.d.ts +0 -47
  387. package/dist/strategy-worktree-state.d.ts.map +0 -1
  388. package/dist/strategy-worktree-state.js.map +0 -1
  389. package/dist/team-prompt-variants.d.ts +0 -17
  390. package/dist/team-prompt-variants.d.ts.map +0 -1
  391. package/dist/team-prompt-variants.js +0 -79
  392. package/dist/team-prompt-variants.js.map +0 -1
  393. package/dist/types/strategy.d.ts.map +0 -1
  394. package/dist/types/strategy.js +0 -5
  395. package/dist/types/strategy.js.map +0 -1
  396. package/dist/worktree-merge.d.ts +0 -23
  397. package/dist/worktree-merge.d.ts.map +0 -1
  398. package/dist/worktree-merge.js +0 -57
  399. package/dist/worktree-merge.js.map +0 -1
  400. package/dist/worktree-strategy.d.ts.map +0 -1
  401. package/dist/worktree-strategy.js.map +0 -1
@@ -1,54 +1,56 @@
1
1
  /**
2
- * Strategy executor - manages Agent Team lifecycle per strategy.
2
+ * Focus executor - manages Agent Team lifecycle per focus.
3
3
  *
4
- * Replaces the per-delivery agent spawning model. When a strategy has
4
+ * Replaces the per-delivery agent spawning model. When a focus has
5
5
  * an assigned agent role and queued deliveries, the executor spawns
6
- * a single Agent Team (one lead agent process) scoped to the entire strategy.
6
+ * a single Agent Team (one lead agent process) scoped to the entire focus.
7
7
  *
8
8
  * The lead agent:
9
- * 1. Reads all deliveries + issues for the strategy
9
+ * 1. Reads all deliveries + issues for the focus
10
10
  * 2. Builds a task DAG with dependencies
11
11
  * 3. Spawns worker teammates to execute issues in parallel
12
12
  * 4. Advances delivery stages as their issues complete
13
13
  * 5. Terminates when all work is done; fresh team spawned for new work
14
14
  *
15
15
  * This module is the orchestration entry point. Pure logic is extracted to:
16
- * - strategy-team-state.ts -- active teams map, config derivation
17
- * - strategy-merge.ts -- branch merge logic
18
- * - strategy-completion.ts -- post-execution completion handling
19
- * - strategy-spawn-helpers.ts -- log streams, stream handlers, process close
20
- * - strategy-team-lifecycle.ts -- terminate, wait, detect deactivated, merge checks
21
- * - strategy-completion-event.ts -- completion event handler
16
+ * - focus-team-state.ts -- active teams map, config derivation
17
+ * - focus-merge.ts -- branch merge logic
18
+ * - focus-completion.ts -- post-execution completion handling
19
+ * - focus-spawn-helpers.ts -- log streams, stream handlers, process close
20
+ * - focus-team-lifecycle.ts -- terminate, wait, detect deactivated, merge checks
21
+ * - focus-completion-event.ts -- completion event handler
22
22
  */
23
23
  import { spawn } from 'node:child_process';
24
24
  import { mkdirSync, existsSync } from 'node:fs';
25
- import { createSession, updateSession, getActiveStrategies, } from './supabase.js';
25
+ import { createSession, updateSession, getActiveFocuses, } from './supabase.js';
26
26
  import { createWorktree, runGitSync, repoHasCommits } from './git.js';
27
27
  import { installAuditPreCommitHook } from './audit-hooks.js';
28
- import { getStrategyWorktree, setStrategyWorktree } from './strategy-worktree-state.js';
28
+ import { getFocusWorktree, setFocusWorktree } from './focus-worktree-state.js';
29
29
  import { withRetry, sendMessage, productLabel } from '@telora/daemon-core';
30
30
  import { recordActivity } from './heartbeat.js';
31
- import { buildStrategyTeamPrompt } from './strategy-prompt-builder.js';
31
+ import { buildFocusTeamPrompt } from './focus-prompt-builder.js';
32
32
  import { buildRoleFrameworkPrompt } from './team-prompt-base.js';
33
- import { getStrategyDeliveries, getStrategyIssues, getProductContextForStrategy, getProductDeploymentProfileSnapshot, fetchStrategyWorkflow } from './queries/strategies.js';
33
+ import { getFocusDeliveries, getFocusIssues, getProductContextForFocus, getProductDeploymentProfileSnapshot, fetchFocusWorkflow } from './queries/focuses.js';
34
34
  import { buildSpawnEnvironment } from './spawn-environment.js';
35
35
  import { sanitizeGitSegment } from './git-utils.js';
36
- import { recordStrategyTeardown } from './spawn-cooldown.js';
37
- import { consumePendingSpawnDirective, assembleDirectiveContent } from './directive-executor.js';
36
+ import { recordFocusTeardown } from './spawn-cooldown.js';
37
+ import { consumePendingSpawnDirective, assembleDirectiveContent, syncFocusPhase } from './directive-executor.js';
38
38
  import { resolveAssemblyRecipe } from './assembly-engine.js';
39
39
  import './assembly-resolvers.js';
40
40
  import { isStatusAgentActionable, isStatusBlocking } from './stage-classifier.js';
41
+ import { filterReviewFiledIssues } from './review-defect-detector.js';
42
+ import { getActiveFocuses as fetchActiveFocusesForReviewState } from './queries/deliveries.js';
41
43
  // ── Imports from extracted modules ──────────────────────────────────────
42
- import { getActiveTeams, deriveExecutionConfig, } from './strategy-team-state.js';
43
- import { setupTeamLogStreams, attachStreamHandlers, handleTeamProcessClose, } from './strategy-spawn-helpers.js';
44
- import { terminateTeam, } from './strategy-team-lifecycle.js';
45
- import { handleCompletionEvent, } from './strategy-completion-event.js';
44
+ import { getActiveTeams, deriveExecutionConfig, } from './focus-team-state.js';
45
+ import { setupTeamLogStreams, attachStreamHandlers, handleTeamProcessClose, } from './focus-spawn-helpers.js';
46
+ import { terminateTeam, } from './focus-team-lifecycle.js';
47
+ import { handleCompletionEvent, } from './focus-completion-event.js';
46
48
  // ── Re-exports for backward compatibility ───────────────────────────────
47
- export { getActiveTeams, hasActiveTeam, getActiveTeamCount, } from './strategy-team-state.js';
48
- export { mergeStrategyBranch, } from './strategy-merge.js';
49
- export { handleTeamCompletion, advanceDeliveryStatuses, isStatusTerminal, isStatusAgentActionable, } from './strategy-completion.js';
50
- export { terminateTeam, waitForTeamExit, terminateAllTeams, detectDeactivatedStrategies, checkAndMergeCompletedDeliveries, } from './strategy-team-lifecycle.js';
51
- // ── Resource governor (optional, injected by StrategyEngine) ─────────
49
+ export { getActiveTeams, hasActiveTeam, getActiveTeamCount, } from './focus-team-state.js';
50
+ export { mergeFocusBranch, } from './focus-merge.js';
51
+ export { handleTeamCompletion, advanceDeliveryStatuses, isStatusTerminal, isStatusAgentActionable, } from './focus-completion.js';
52
+ export { terminateTeam, waitForTeamExit, terminateAllTeams, detectDeactivatedFocuses, checkAndMergeCompletedDeliveries, } from './focus-team-lifecycle.js';
53
+ // ── Resource governor (optional, injected by FocusEngine) ─────────
52
54
  let governor = null;
53
55
  /** Inject the resource governor for global concurrency limiting. */
54
56
  export function initGovernor(gov) {
@@ -61,11 +63,19 @@ export function initGovernor(gov) {
61
63
  * A delivery is actionable only if all lower-ranked deliveries are non-blocking.
62
64
  *
63
65
  * Returns:
64
- * - 'planning' when the strategy has zero deliveries (agent will scope them).
66
+ * - 'planning' when the focus has zero deliveries (agent will scope them).
65
67
  * - 'execute' with the filtered actionable deliveries when work is queued.
66
68
  * - 'skip' when a non-actionable blocking status holds at the front of the queue.
69
+ *
70
+ * Multi-delivery handling: when bulk-queue lands all `planning` deliveries to
71
+ * `queued` at focus activation (see migration
72
+ * 20260501221417_bulk_queue_planning_deliveries_on_focus_activation.sql), this
73
+ * filter returns ALL queued/coding deliveries. The team lead receives the
74
+ * complete list at spawn and decides ordering and parallelism. Rank order is
75
+ * still surfaced via the delivery listing (lower rank rendered first), but it
76
+ * is informational guidance, not a serializer.
67
77
  */
68
- function findActionableDeliveries(deliveries, strategyName) {
78
+ function findActionableDeliveries(deliveries, focusName) {
69
79
  // Zero deliveries -- the team's first act is to scope them.
70
80
  if (deliveries.length === 0) {
71
81
  return { kind: 'planning' };
@@ -80,13 +90,13 @@ function findActionableDeliveries(deliveries, strategyName) {
80
90
  }
81
91
  else {
82
92
  // Blocking status (planning, paused) prevents subsequent deliveries
83
- console.log(`[strategy-executor] Delivery "${d.name}" (rank ${d.priorityRank}) ` +
84
- `is in "${status}" state -- blocking subsequent deliveries in strategy "${strategyName}"`);
93
+ console.log(`[focus-executor] Delivery "${d.name}" (rank ${d.priorityRank}) ` +
94
+ `is in "${status}" state -- blocking subsequent deliveries in focus "${focusName}"`);
85
95
  }
86
96
  break;
87
97
  }
88
98
  if (!nextActionable || !isStatusAgentActionable(nextActionable.executionStatus ?? '')) {
89
- console.log(`[strategy-executor] No actionable deliveries for strategy "${strategyName}" -- skipping spawn`);
99
+ console.log(`[focus-executor] No actionable deliveries for focus "${focusName}" -- skipping spawn`);
90
100
  return { kind: 'skip' };
91
101
  }
92
102
  return {
@@ -96,13 +106,13 @@ function findActionableDeliveries(deliveries, strategyName) {
96
106
  }
97
107
  // ── Team spawning ────────────────────────────────────────────────────
98
108
  /**
99
- * Generate branch name for strategy-level work.
109
+ * Generate branch name for focus-level work.
100
110
  */
101
- export function generateStrategyBranchName(role, strategyName, strategyId) {
111
+ export function generateFocusBranchName(role, focusName, focusId) {
102
112
  const sanitizedRoleName = sanitizeGitSegment(role.name);
103
- const shortId = strategyId.slice(0, 8);
104
- const sanitizedStrategyName = sanitizeGitSegment(strategyName);
105
- return `agent/${sanitizedRoleName}/${sanitizedStrategyName}-${shortId}`;
113
+ const shortId = focusId.slice(0, 8);
114
+ const sanitizedFocusName = sanitizeGitSegment(focusName);
115
+ return `agent/${sanitizedRoleName}/${sanitizedFocusName}-${shortId}`;
106
116
  }
107
117
  /**
108
118
  * Build Claude Code CLI arguments for the team lead.
@@ -128,25 +138,25 @@ function buildTeamLeadArgs(config, pipelineConfig, resumeSessionId) {
128
138
  return args;
129
139
  }
130
140
  /**
131
- * Spawn a strategy team to execute all deliveries in a strategy.
141
+ * Spawn a focus team to execute all deliveries in a focus.
132
142
  *
133
143
  * Creates a single Agent Team (lead process) that reads all deliveries
134
144
  * and issues, builds a task DAG, and coordinates worker execution.
135
145
  */
136
- export async function spawnStrategyTeam(params) {
137
- const { config, strategyId, strategyName, role, pipelineConfig, readOnly = false, lastClaudeSessionId } = params;
146
+ export async function spawnFocusTeam(params) {
147
+ const { config, focusId, focusName, role, pipelineConfig, readOnly = false, lastClaudeSessionId } = params;
138
148
  const activeTeams = getActiveTeams();
139
149
  // Prevent double-spawn
140
- if (activeTeams.has(strategyId)) {
141
- console.warn(`[strategy-executor] Team already active for strategy "${strategyName}", skipping spawn`);
150
+ if (activeTeams.has(focusId)) {
151
+ console.warn(`[focus-executor] Team already active for focus "${focusName}", skipping spawn`);
142
152
  return;
143
153
  }
144
154
  const executionConfig = deriveExecutionConfig(pipelineConfig);
145
- const branchName = generateStrategyBranchName(role, strategyName, strategyId);
155
+ const branchName = generateFocusBranchName(role, focusName, focusId);
146
156
  // Initialize team state
147
157
  const teamState = {
148
- strategyId,
149
- strategyName,
158
+ focusId,
159
+ focusName,
150
160
  roleId: role.id,
151
161
  roleName: role.name,
152
162
  organizationId: config.organizationId,
@@ -169,11 +179,13 @@ export async function spawnStrategyTeam(params) {
169
179
  readOnly,
170
180
  completionDetector: null,
171
181
  claudeSessionId: null,
182
+ lastProgressSnapshot: null,
183
+ noProgressCycles: 0,
172
184
  };
173
- activeTeams.set(strategyId, teamState);
185
+ activeTeams.set(focusId, teamState);
174
186
  const currentProduct = config.products.find(p => p.id === config.productId);
175
187
  const productTag = config.products.length > 1 && currentProduct ? ` [${productLabel(currentProduct)}]` : '';
176
- console.log(`[strategy-executor] Spawning team for strategy "${strategyName}"${readOnly ? ' [READ-ONLY]' : ''}${productTag}`);
188
+ console.log(`[focus-executor] Spawning team for focus "${focusName}"${readOnly ? ' [READ-ONLY]' : ''}${productTag}`);
177
189
  console.log(` Role: ${role.name}`);
178
190
  console.log(` Model: ${pipelineConfig?.model ?? '(CLI default)'}`);
179
191
  console.log(` Max workers: ${executionConfig.maxWorkers}`);
@@ -190,39 +202,39 @@ export async function spawnStrategyTeam(params) {
190
202
  let loopContext;
191
203
  try {
192
204
  [deliveries, issues, productContextDocs, deploymentProfileSnapshot, loopContext] = await Promise.all([
193
- getStrategyDeliveries(strategyId),
194
- getStrategyIssues(strategyId),
195
- getProductContextForStrategy(config.productId, strategyId),
205
+ getFocusDeliveries(focusId),
206
+ getFocusIssues(focusId),
207
+ getProductContextForFocus(config.productId, focusId),
196
208
  getProductDeploymentProfileSnapshot(config.productId).catch((err) => {
197
- console.debug(`[strategy-executor] Could not fetch deployment profile snapshot (non-fatal):`, err.message);
209
+ console.debug(`[focus-executor] Could not fetch deployment profile snapshot (non-fatal):`, err.message);
198
210
  return null;
199
211
  }),
200
212
  (async () => {
201
213
  try {
202
214
  const assemblyCtx = {
203
- strategyId,
215
+ focusId,
204
216
  deliveryIds: [],
205
217
  worktreePath: null,
206
218
  config,
207
219
  organizationId: config.organizationId,
208
220
  productId: config.productId,
209
221
  };
210
- return await resolveAssemblyRecipe(['loop.context', 'strategy.injections'], assemblyCtx);
222
+ return await resolveAssemblyRecipe(['loop.context', 'focus.injections'], assemblyCtx);
211
223
  }
212
224
  catch (err) {
213
- console.debug(`[strategy-executor] Could not fetch loop context (non-fatal):`, err.message);
225
+ console.debug(`[focus-executor] Could not fetch loop context (non-fatal):`, err.message);
214
226
  return '';
215
227
  }
216
228
  })(),
217
229
  ]);
218
230
  }
219
231
  catch (err) {
220
- console.error(`[strategy-executor] Failed to fetch context for strategy "${strategyName}":`, err.message);
221
- activeTeams.delete(strategyId);
232
+ console.error(`[focus-executor] Failed to fetch context for focus "${focusName}":`, err.message);
233
+ activeTeams.delete(focusId);
222
234
  return;
223
235
  }
224
236
  // Check for pending spawn directive (e.g., review stage spawn)
225
- const pendingDirective = consumePendingSpawnDirective(strategyId);
237
+ const pendingDirective = consumePendingSpawnDirective(focusId);
226
238
  // Pre-spawn guard: enforce rank-ordered execution.
227
239
  // Skip when a pending spawn directive exists -- the directive has its own intent.
228
240
  let actionableDeliveries = [];
@@ -231,15 +243,15 @@ export async function spawnStrategyTeam(params) {
231
243
  actionableDeliveries = deliveries.filter(d => isStatusAgentActionable(d.executionStatus ?? ''));
232
244
  }
233
245
  else {
234
- const decision = findActionableDeliveries(deliveries, strategyName);
246
+ const decision = findActionableDeliveries(deliveries, focusName);
235
247
  if (decision.kind === 'skip') {
236
- activeTeams.delete(strategyId);
248
+ activeTeams.delete(focusId);
237
249
  return;
238
250
  }
239
251
  if (decision.kind === 'planning') {
240
252
  isPlanningSpawn = true;
241
253
  teamState.planningPhase = true;
242
- console.log(`[strategy-executor] Strategy "${strategyName}" has no deliveries -- spawning planning team`);
254
+ console.log(`[focus-executor] Focus "${focusName}" has no deliveries -- spawning planning team`);
243
255
  }
244
256
  else {
245
257
  actionableDeliveries = decision.deliveries;
@@ -267,50 +279,50 @@ export async function spawnStrategyTeam(params) {
267
279
  if (!existsSync(config.logDir)) {
268
280
  mkdirSync(config.logDir, { recursive: true, mode: 0o700 });
269
281
  }
270
- // Reuse persistent strategy worktree (created by ensureStrategyWorktrees in poll loop)
282
+ // Reuse persistent focus worktree (created by ensureFocusWorktrees in poll loop)
271
283
  let worktreePath;
272
- const existingWorktree = getStrategyWorktree(strategyId);
284
+ const existingWorktree = getFocusWorktree(focusId);
273
285
  if (existingWorktree) {
274
286
  worktreePath = existingWorktree.worktreePath;
275
- // Rebase onto integration to pick up latest changes from other strategies
287
+ // Rebase onto integration to pick up latest changes from other focuses
276
288
  const rebaseResult = runGitSync(['rebase', config.integrationBranch], worktreePath);
277
289
  if (!rebaseResult.success) {
278
290
  runGitSync(['rebase', '--abort'], worktreePath);
279
- console.warn(`[strategy-executor] Rebase failed for "${strategyName}", continuing with existing state`);
291
+ console.warn(`[focus-executor] Rebase failed for "${focusName}", continuing with existing state`);
280
292
  }
281
293
  console.log(` Worktree (reused): ${worktreePath}`);
282
294
  }
283
295
  else {
284
296
  // Guard: can't create worktrees in a repo with no commits
285
297
  if (!repoHasCommits(config.repoPath)) {
286
- console.warn(`[strategy-executor] Repository has no commits -- cannot create worktree for "${strategyName}"`);
287
- activeTeams.delete(strategyId);
288
- recordStrategyTeardown(strategyId);
298
+ console.warn(`[focus-executor] Repository has no commits -- cannot create worktree for "${focusName}"`);
299
+ activeTeams.delete(focusId);
300
+ recordFocusTeardown(focusId);
289
301
  return;
290
302
  }
291
303
  // Fallback: worktree doesn't exist yet (race condition or first poll)
292
- console.warn(`[strategy-executor] No persistent worktree for "${strategyName}", creating inline`);
304
+ console.warn(`[focus-executor] No persistent worktree for "${focusName}", creating inline`);
293
305
  try {
294
306
  worktreePath = await createWorktree(config, branchName);
295
- setStrategyWorktree(strategyId, {
296
- strategyId,
297
- strategyName,
307
+ setFocusWorktree(focusId, {
308
+ focusId,
309
+ focusName,
298
310
  worktreePath,
299
311
  branchName,
300
312
  createdAt: new Date(),
301
313
  hasQaDevServer: false,
302
314
  });
303
315
  console.log(` Worktree (created inline): ${worktreePath}`);
304
- // Install audit pre-commit hook for read-only strategies
316
+ // Install audit pre-commit hook for read-only focuses
305
317
  if (readOnly) {
306
318
  installAuditPreCommitHook(worktreePath);
307
319
  console.log(` Installed audit pre-commit hook (read-only mode)`);
308
320
  }
309
321
  }
310
322
  catch (err) {
311
- console.error(`[strategy-executor] Failed to create worktree for strategy "${strategyName}":`, err instanceof Error ? err.message : String(err));
312
- activeTeams.delete(strategyId);
313
- recordStrategyTeardown(strategyId);
323
+ console.error(`[focus-executor] Failed to create worktree for focus "${focusName}":`, err instanceof Error ? err.message : String(err));
324
+ activeTeams.delete(focusId);
325
+ recordFocusTeardown(focusId);
314
326
  return;
315
327
  }
316
328
  }
@@ -322,16 +334,16 @@ export async function spawnStrategyTeam(params) {
322
334
  organizationId: config.organizationId,
323
335
  roleId: role.id,
324
336
  issueId: null,
325
- strategyId,
337
+ focusId,
326
338
  branchName,
327
339
  sessionType: pendingDirective?.sessionType ?? 'coding',
328
340
  });
329
341
  teamState.leadSessionId = session.id;
330
342
  }
331
343
  catch (err) {
332
- console.error(`[strategy-executor] Failed to create session for strategy "${strategyName}":`, err.message);
333
- // Worktree is strategy-owned and persists even if session creation fails
334
- activeTeams.delete(strategyId);
344
+ console.error(`[focus-executor] Failed to create session for focus "${focusName}":`, err.message);
345
+ // Worktree is focus-owned and persists even if session creation fails
346
+ activeTeams.delete(focusId);
335
347
  return;
336
348
  }
337
349
  recordActivity();
@@ -339,9 +351,26 @@ export async function spawnStrategyTeam(params) {
339
351
  // Priority: pending spawn directive > current stage directive > legacy full prompt.
340
352
  // When a directive exists, compose: role framework + assembled directive content.
341
353
  // This ensures the workflow stage controls what the agent does.
354
+ // If this focus has a recorded review_requested_at and there are open
355
+ // review-filed issues, compute the count so the team prompt includes the
356
+ // remediation directive. Best-effort -- a fetch failure leaves the count
357
+ // at zero and the directive is omitted (the team behaves as a normal
358
+ // execution team rather than a remediation team).
359
+ let reviewFiledOpenCount = 0;
360
+ try {
361
+ const activeFocuses = await fetchActiveFocusesForReviewState(config.organizationId, config.productId);
362
+ const current = activeFocuses.find(f => f.focus_id === focusId);
363
+ const reviewRequestedAt = current?.review_requested_at ?? null;
364
+ if (reviewRequestedAt) {
365
+ reviewFiledOpenCount = filterReviewFiledIssues(issues, reviewRequestedAt).length;
366
+ }
367
+ }
368
+ catch (err) {
369
+ console.debug(`[focus-executor] Could not compute review-filed open count for "${focusName}":`, err.message);
370
+ }
342
371
  const promptContext = {
343
- strategyId,
344
- strategyName,
372
+ focusId,
373
+ focusName,
345
374
  organizationId: config.organizationId,
346
375
  productId: config.productId,
347
376
  deliveries,
@@ -352,6 +381,7 @@ export async function spawnStrategyTeam(params) {
352
381
  deploymentProfileSnapshot,
353
382
  readOnly,
354
383
  loopContext,
384
+ reviewFiledOpenCount,
355
385
  };
356
386
  let prompt;
357
387
  let directiveModel = null;
@@ -361,49 +391,66 @@ export async function spawnStrategyTeam(params) {
361
391
  + '\n\n'
362
392
  + pendingDirective.message;
363
393
  directiveModel = pendingDirective.model;
364
- console.log(`[strategy-executor] Using pending spawn directive for "${strategyName}" ` +
394
+ console.log(`[focus-executor] Using pending spawn directive for "${focusName}" ` +
365
395
  `(${pendingDirective.message.length} chars directive, model: ${directiveModel ?? 'default'})`);
366
396
  }
367
397
  else {
368
- // No pending directive -- check if the current stage has a directive in the DB.
369
- // This handles the common case: initial spawn into "building" stage.
398
+ // Sync the focus's execution phase from its delivery aggregate, then
399
+ // assemble the matching stage directive. Every focus workflow stage is
400
+ // expected to carry an agent_directive (populated by migration
401
+ // 20260503140420_focus_phase_directives); the legacy hardcoded prompt
402
+ // path below is a safety net that should not fire under normal
403
+ // operation. When it does fire, the warning identifies which guard
404
+ // tripped so the gap can be fixed.
370
405
  let stageDirectiveContent = null;
371
406
  let stageDirectiveModel = null;
407
+ let fallbackReason = null;
372
408
  try {
373
- const workflow = await fetchStrategyWorkflow(strategyId);
374
- // Find the strategy's current workflow stage. Query getActiveStrategies to
375
- // get the current_workflow_stage_id, then match against the workflow stages.
376
- const activeStrategies = await getActiveStrategies(config.organizationId, config.productId);
377
- const strategyRecord = activeStrategies.find(s => s.strategy_id === strategyId);
378
- const currentStageId = strategyRecord?.current_workflow_stage_id;
379
- const currentStage = currentStageId
380
- ? workflow.stages.find(s => s.id === currentStageId)
381
- : workflow.stages.find(s => s.name === 'building'); // fallback
382
- if (currentStage?.agentDirective) {
383
- const directiveContent = await assembleDirectiveContent(config, strategyId, currentStage.agentDirective, worktreePath);
409
+ const activeFocuses = await getActiveFocuses(config.organizationId, config.productId);
410
+ const focusRecord = activeFocuses.find(s => s.focus_id === focusId);
411
+ const syncedStageId = focusRecord
412
+ ? await syncFocusPhase(focusRecord)
413
+ : null;
414
+ const workflow = await fetchFocusWorkflow(focusId);
415
+ const currentStage = syncedStageId
416
+ ? workflow.stages.find(s => s.id === syncedStageId)
417
+ : workflow.stages.find(s => s.is_initial);
418
+ if (!currentStage) {
419
+ fallbackReason = syncedStageId
420
+ ? `no stage matching synced id ${syncedStageId.slice(0, 8)} in workflow`
421
+ : 'no synced stage and no is_initial stage in workflow';
422
+ }
423
+ else if (!currentStage.agentDirective) {
424
+ fallbackReason = `stage "${currentStage.name}" has no agent_directive populated`;
425
+ }
426
+ else {
427
+ const directiveContent = await assembleDirectiveContent(config, focusId, currentStage.agentDirective, worktreePath);
384
428
  if (directiveContent.trim()) {
385
429
  stageDirectiveContent = directiveContent;
386
430
  stageDirectiveModel = currentStage.agentDirective.model;
387
431
  }
432
+ else {
433
+ fallbackReason = `assembly returned empty content for stage "${currentStage.name}"`;
434
+ }
388
435
  }
389
436
  }
390
437
  catch (err) {
391
- console.debug(`[strategy-executor] Could not fetch stage directive for "${strategyName}" (falling back to legacy prompt):`, err.message);
438
+ fallbackReason = `directive lookup threw: ${err.message}`;
392
439
  }
393
440
  if (stageDirectiveContent) {
394
441
  prompt = buildRoleFrameworkPrompt(role, promptContext)
395
442
  + '\n\n'
396
443
  + stageDirectiveContent;
397
444
  directiveModel = stageDirectiveModel;
398
- console.log(`[strategy-executor] Using stage directive for "${strategyName}" (${stageDirectiveContent.length} chars)`);
445
+ console.log(`[focus-executor] Using stage directive for "${focusName}" (${stageDirectiveContent.length} chars)`);
399
446
  }
400
447
  else {
401
- // Legacy fallback: full hardcoded prompt
402
- prompt = buildStrategyTeamPrompt(role, promptContext);
448
+ console.warn(`[focus-executor] LEGACY PROMPT FALLBACK for "${focusName}": ${fallbackReason ?? 'unknown reason'}`);
449
+ prompt = buildFocusTeamPrompt(role, promptContext);
403
450
  }
404
451
  }
405
452
  // Set up log file streams
406
- const logs = setupTeamLogStreams(config.logDir, branchName, strategyName);
453
+ const logs = setupTeamLogStreams(config.logDir, branchName, focusName);
407
454
  // Build args and env
408
455
  // Never resume when spawning for a directive (fresh session)
409
456
  const resumeId = (pendingDirective || directiveModel) ? null : (lastClaudeSessionId ?? null);
@@ -413,11 +460,11 @@ export async function spawnStrategyTeam(params) {
413
460
  : pipelineConfig;
414
461
  const args = buildTeamLeadArgs(config, effectivePipelineConfig, resumeId);
415
462
  if (resumeId) {
416
- console.log(`[strategy-executor] Resuming Claude session ${resumeId} for "${strategyName}"`);
463
+ console.log(`[focus-executor] Resuming Claude session ${resumeId} for "${focusName}"`);
417
464
  }
418
465
  const spawnEnv = buildSpawnEnvironment(config, {
419
466
  orgId: config.organizationId,
420
- strategyId,
467
+ focusId,
421
468
  sessionId: session.id,
422
469
  });
423
470
  // Update session to starting
@@ -430,10 +477,10 @@ export async function spawnStrategyTeam(params) {
430
477
  // Acquire governor slot (if governor is configured)
431
478
  if (governor) {
432
479
  try {
433
- await governor.acquireSlot('strategy');
480
+ await governor.acquireSlot('focus');
434
481
  }
435
482
  catch (err) {
436
- console.warn(`[strategy-executor] Governor denied slot for "${strategyName}":`, err.message);
483
+ console.warn(`[focus-executor] Governor denied slot for "${focusName}":`, err.message);
437
484
  // Mark session as failed so it doesn't linger in `starting` status
438
485
  await updateSession(session.id, {
439
486
  status: 'failed',
@@ -441,9 +488,9 @@ export async function spawnStrategyTeam(params) {
441
488
  exit_category: 'governor_denied',
442
489
  ended_at: new Date().toISOString(),
443
490
  }).catch(updateErr => {
444
- console.warn(`[strategy-executor] Failed to update session after governor denial:`, updateErr.message);
491
+ console.warn(`[focus-executor] Failed to update session after governor denial:`, updateErr.message);
445
492
  });
446
- activeTeams.delete(strategyId);
493
+ activeTeams.delete(focusId);
447
494
  return;
448
495
  }
449
496
  }
@@ -458,7 +505,7 @@ export async function spawnStrategyTeam(params) {
458
505
  teamState.phase = 'executing';
459
506
  // Attach stream parser, completion detector, activity tracker, event handlers
460
507
  const { completionDetector, activityTracker } = attachStreamHandlers({
461
- proc, teamState, strategyId, strategyName, sessionId: session.id, logs,
508
+ proc, teamState, focusId, focusName, sessionId: session.id, logs,
462
509
  });
463
510
  // Send prompt via stdin (single message -- directive content is already composed in)
464
511
  sendMessage(proc.stdin, prompt);
@@ -467,35 +514,35 @@ export async function spawnStrategyTeam(params) {
467
514
  status: 'running',
468
515
  pid: proc.pid,
469
516
  });
470
- console.log(`[strategy-executor] Team lead spawned for "${strategyName}" (PID: ${proc.pid}, session: ${session.id})`);
517
+ console.log(`[focus-executor] Team lead spawned for "${focusName}" (PID: ${proc.pid}, session: ${session.id})`);
471
518
  // Handle completion -- check for more work or terminate.
472
- // No idle phase: if actionable work remains, send it immediately (mid-strategy
519
+ // No idle phase: if actionable work remains, send it immediately (mid-focus
473
520
  // handoff). If all work is done, terminate. A fresh team is spawned if new
474
521
  // deliveries arrive later (~$0.50-1.00 exploration cost, but clean context).
475
522
  completionDetector.on('complete', (info) => {
476
- console.log(`[strategy-executor] Team lead for "${strategyName}" completed work cycle: ` +
523
+ console.log(`[focus-executor] Team lead for "${focusName}" completed work cycle: ` +
477
524
  `${info.turnCount} turns, $${info.totalCostUsd.toFixed(4)}`);
478
- handleCompletionEvent({ strategyId, strategyName, teamState, completionDetector, proc, completionInfo: info }).catch(err => {
479
- console.warn(`[strategy-executor] Failed to check delivery state for "${strategyName}":`, err.message);
525
+ handleCompletionEvent({ focusId, focusName, teamState, completionDetector, proc, completionInfo: info }).catch(err => {
526
+ console.warn(`[focus-executor] Failed to check delivery state for "${focusName}":`, err.message);
480
527
  // Fallback: terminate to avoid idle money burn.
481
- terminateTeam(strategyId);
528
+ terminateTeam(focusId);
482
529
  });
483
530
  });
484
531
  // Handle process exit
485
532
  const spawnedAt = Date.now();
486
533
  proc.on('close', (code, signal) => {
487
534
  handleTeamProcessClose({
488
- code, signal, strategyName, strategyId, resumeId, spawnedAt,
535
+ code, signal, focusName, focusId, resumeId, spawnedAt,
489
536
  teamState, sessionId: session.id, config, completionDetector,
490
- activityTracker, logs, params, governor, spawnStrategyTeam,
537
+ activityTracker, logs, params, governor, spawnFocusTeam,
491
538
  }).catch(err => {
492
- console.error(`[strategy-executor] handleTeamProcessClose failed for "${strategyName}":`, err.message);
539
+ console.error(`[focus-executor] handleTeamProcessClose failed for "${focusName}":`, err.message);
493
540
  });
494
541
  });
495
542
  proc.on('error', async (err) => {
496
- console.error(`[strategy-executor] Team lead for "${strategyName}" error:`, err.message);
543
+ console.error(`[focus-executor] Team lead for "${focusName}" error:`, err.message);
497
544
  // Release governor slot (if governor is configured)
498
- governor?.releaseSlot('strategy');
545
+ governor?.releaseSlot('focus');
499
546
  try {
500
547
  await withRetry(() => updateSession(session.id, {
501
548
  status: 'failed',
@@ -505,15 +552,15 @@ export async function spawnStrategyTeam(params) {
505
552
  }), { maxAttempts: 3, baseDelayMs: 1000, label: 'session-update-error' });
506
553
  }
507
554
  catch (updateErr) {
508
- console.warn(`[strategy-executor] Failed to update session after retries:`, updateErr.message);
555
+ console.warn(`[focus-executor] Failed to update session after retries:`, updateErr.message);
509
556
  }
510
557
  completionDetector.destroy();
511
558
  logs.stdoutLogStream.end();
512
559
  logs.stderrStream.end();
513
560
  logs.jsonlStream.end();
514
- // Worktree is strategy-owned — do not remove on team error
561
+ // Worktree is focus-owned — do not remove on team error
515
562
  teamState.phase = 'terminated';
516
- activeTeams.delete(strategyId);
563
+ activeTeams.delete(focusId);
517
564
  });
518
565
  }
519
- //# sourceMappingURL=strategy-executor.js.map
566
+ //# sourceMappingURL=focus-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-executor.js","sourceRoot":"","sources":["../src/focus-executor.ts"],"names":[],"mappings":"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"}