@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,45 +1,45 @@
1
1
  /**
2
- * Strategy lifecycle management.
2
+ * Focus lifecycle management.
3
3
  *
4
- * Handles persistent worktree provisioning for active strategies and
5
- * coordinated teardown when strategies are deactivated. Replaces the
6
- * separate detectDeactivatedStrategies() and checkQaForDeactivatedStrategies()
4
+ * Handles persistent worktree provisioning for active focuses and
5
+ * coordinated teardown when focuses are deactivated. Replaces the
6
+ * separate detectDeactivatedFocuses() and checkQaForDeactivatedFocuses()
7
7
  * flows with a single unified lifecycle.
8
8
  */
9
9
  import { existsSync, readdirSync, statSync } from 'node:fs';
10
10
  import { join, resolve } from 'node:path';
11
11
  import { installAuditPreCommitHook } from './audit-hooks.js';
12
- import { getReadyStrategies, getActiveStrategies, reportGitState } from './supabase.js';
13
- import { createWorktree, syncIntegrationWithMain, runGitSync, safeRemoveStrategyWorktree, commitWipChanges, generateMcpConfigInWorktree, ensureIntegrationBranch, ensureMergeWorktree } from './git.js';
14
- import { generateStrategyBranchName, terminateTeam, waitForTeamExit } from './strategy-executor.js';
15
- import { getActiveTeams } from './strategy-team-state.js';
16
- import { recordStrategyTeardown } from './spawn-cooldown.js';
17
- import { getStrategyWorktree, setStrategyWorktree, removeStrategyWorktree, getAllStrategyWorktrees, hasStrategyWorktree, } from './strategy-worktree-state.js';
18
- import { getStrategyDeliveries } from './queries/strategies.js';
12
+ import { getReadyFocuses, getActiveFocuses, reportGitState } from './supabase.js';
13
+ import { createWorktree, syncIntegrationWithMain, runGitSync, safeRemoveFocusWorktree, commitWipChanges, generateMcpConfigInWorktree, ensureIntegrationBranch, ensureMergeWorktree } from './git.js';
14
+ import { generateFocusBranchName, terminateTeam, waitForTeamExit } from './focus-executor.js';
15
+ import { getActiveTeams } from './focus-team-state.js';
16
+ import { recordFocusTeardown } from './spawn-cooldown.js';
17
+ import { getFocusWorktree, setFocusWorktree, removeFocusWorktree, getAllFocusWorktrees, hasFocusWorktree, } from './focus-worktree-state.js';
18
+ import { getFocusDeliveries } from './queries/focuses.js';
19
19
  import { isStatusAgentActionable } from './stage-classifier.js';
20
- import { escalateMergeConflict } from './strategy-merge.js';
20
+ import { escalateMergeConflict } from './focus-merge.js';
21
21
  import { getQaEnvironment, removeQaEnvironment } from './qa-state.js';
22
22
  import { stopQaDevServer } from './qa-dev-server.js';
23
23
  import { updateQaStatus } from './supabase.js';
24
24
  // ── Persistent worktree provisioning ─────────────────────────────────
25
25
  /**
26
- * Ensure persistent worktrees exist for all active strategies.
26
+ * Ensure persistent worktrees exist for all active focuses.
27
27
  *
28
- * Called each poll cycle BEFORE processReadyStrategies(). Creates
29
- * worktrees for active strategies that don't have one yet.
30
- * Syncs integration with main once per cycle (not per strategy).
28
+ * Called each poll cycle BEFORE processReadyFocuses(). Creates
29
+ * worktrees for active focuses that don't have one yet.
30
+ * Syncs integration with main once per cycle (not per focus).
31
31
  */
32
- export async function ensureStrategyWorktrees(config, roles) {
33
- let readyStrategies;
32
+ export async function ensureFocusWorktrees(config, roles) {
33
+ let readyFocuses;
34
34
  try {
35
- readyStrategies = await getReadyStrategies(config.organizationId, config.productId);
35
+ readyFocuses = await getReadyFocuses(config.organizationId, config.productId);
36
36
  }
37
37
  catch (err) {
38
- console.warn(`[strategy-lifecycle] Failed to query ready strategies for worktree provisioning: ${err.message}`);
38
+ console.warn(`[focus-lifecycle] Failed to query ready focuses for worktree provisioning: ${err.message}`);
39
39
  return;
40
40
  }
41
- // Find strategies that need worktrees
42
- const needsWorktree = readyStrategies.filter(s => !hasStrategyWorktree(s.strategy_id));
41
+ // Find focuses that need worktrees
42
+ const needsWorktree = readyFocuses.filter(s => !hasFocusWorktree(s.focus_id));
43
43
  if (needsWorktree.length === 0)
44
44
  return;
45
45
  // Ensure git infrastructure exists (normally handled by initGit on startup,
@@ -49,29 +49,29 @@ export async function ensureStrategyWorktrees(config, roles) {
49
49
  ensureMergeWorktree(config);
50
50
  }
51
51
  catch (err) {
52
- console.warn(`[strategy-lifecycle] Failed to ensure git infrastructure: ${err.message}`);
52
+ console.warn(`[focus-lifecycle] Failed to ensure git infrastructure: ${err.message}`);
53
53
  return;
54
54
  }
55
55
  // Sync integration with main once before creating any worktrees
56
56
  try {
57
57
  const syncResult = await syncIntegrationWithMain(config);
58
58
  if (syncResult.success) {
59
- console.log(`[strategy-lifecycle] Synced integration with main before worktree provisioning`);
59
+ console.log(`[focus-lifecycle] Synced integration with main before worktree provisioning`);
60
60
  }
61
61
  else {
62
- console.warn(`[strategy-lifecycle] Could not sync integration with main: ${syncResult.error}`);
62
+ console.warn(`[focus-lifecycle] Could not sync integration with main: ${syncResult.error}`);
63
63
  }
64
64
  }
65
65
  catch (err) {
66
- console.warn(`[strategy-lifecycle] Sync failed (continuing): ${err instanceof Error ? err.message : String(err)}`);
66
+ console.warn(`[focus-lifecycle] Sync failed (continuing): ${err instanceof Error ? err.message : String(err)}`);
67
67
  }
68
- for (const strategy of needsWorktree) {
69
- const role = roles.get(strategy.assigned_agent_role_id);
68
+ for (const focus of needsWorktree) {
69
+ const role = roles.get(focus.assigned_agent_role_id);
70
70
  if (!role) {
71
- console.warn(`[strategy-lifecycle] Unknown agent role ${strategy.assigned_agent_role_id} for strategy "${strategy.strategy_name}", skipping worktree`);
71
+ console.warn(`[focus-lifecycle] Unknown agent role ${focus.assigned_agent_role_id} for focus "${focus.focus_name}", skipping worktree`);
72
72
  continue;
73
73
  }
74
- const branchName = generateStrategyBranchName(role, strategy.strategy_name, strategy.strategy_id);
74
+ const branchName = generateFocusBranchName(role, focus.focus_name, focus.focus_id);
75
75
  const worktreePath = join(config.worktreeDir, branchName.replace(/\//g, '-'));
76
76
  // Check if a valid worktree already exists on disk (e.g., after daemon restart
77
77
  // or reactivation). Adopt it instead of destroying and rebuilding.
@@ -80,10 +80,10 @@ export async function ensureStrategyWorktrees(config, roles) {
80
80
  const branchResult = runGitSync(['rev-parse', '--abbrev-ref', 'HEAD'], worktreePath);
81
81
  if (gitDirResult.success && branchResult.success && branchResult.output === branchName) {
82
82
  // Valid worktree on the expected branch -- adopt it
83
- console.log(`[strategy-lifecycle] Adopting existing worktree for "${strategy.strategy_name}": ${worktreePath}`);
84
- setStrategyWorktree(strategy.strategy_id, {
85
- strategyId: strategy.strategy_id,
86
- strategyName: strategy.strategy_name,
83
+ console.log(`[focus-lifecycle] Adopting existing worktree for "${focus.focus_name}": ${worktreePath}`);
84
+ setFocusWorktree(focus.focus_id, {
85
+ focusId: focus.focus_id,
86
+ focusName: focus.focus_name,
87
87
  worktreePath,
88
88
  branchName,
89
89
  createdAt: new Date(),
@@ -93,78 +93,78 @@ export async function ensureStrategyWorktrees(config, roles) {
93
93
  const rebaseResult = runGitSync(['rebase', config.integrationBranch], worktreePath);
94
94
  if (!rebaseResult.success) {
95
95
  runGitSync(['rebase', '--abort'], worktreePath);
96
- console.warn(`[strategy-lifecycle] Could not rebase adopted worktree for "${strategy.strategy_name}" onto integration. Continuing with existing state.`);
96
+ console.warn(`[focus-lifecycle] Could not rebase adopted worktree for "${focus.focus_name}" onto integration. Continuing with existing state.`);
97
97
  }
98
98
  else {
99
- console.log(`[strategy-lifecycle] Rebased adopted worktree for "${strategy.strategy_name}" onto ${config.integrationBranch}`);
99
+ console.log(`[focus-lifecycle] Rebased adopted worktree for "${focus.focus_name}" onto ${config.integrationBranch}`);
100
100
  }
101
101
  // Generate .mcp.json with absolute path to MCP server
102
102
  generateMcpConfigInWorktree(worktreePath, config);
103
- // Install audit pre-commit hook for read-only strategies
104
- if (strategy.read_only) {
103
+ // Install audit pre-commit hook for read-only focuses
104
+ if (focus.read_only) {
105
105
  installAuditPreCommitHook(worktreePath);
106
- console.log(`[strategy-lifecycle] Installed audit pre-commit hook for "${strategy.strategy_name}"`);
106
+ console.log(`[focus-lifecycle] Installed audit pre-commit hook for "${focus.focus_name}"`);
107
107
  }
108
108
  continue;
109
109
  }
110
110
  // Directory exists but is not a valid worktree for this branch -- fall through to createWorktree
111
- console.log(`[strategy-lifecycle] Existing directory at ${worktreePath} is not a valid worktree for ${branchName}, recreating`);
111
+ console.log(`[focus-lifecycle] Existing directory at ${worktreePath} is not a valid worktree for ${branchName}, recreating`);
112
112
  }
113
113
  try {
114
114
  const createdPath = await createWorktree(config, branchName);
115
- setStrategyWorktree(strategy.strategy_id, {
116
- strategyId: strategy.strategy_id,
117
- strategyName: strategy.strategy_name,
115
+ setFocusWorktree(focus.focus_id, {
116
+ focusId: focus.focus_id,
117
+ focusName: focus.focus_name,
118
118
  worktreePath: createdPath,
119
119
  branchName,
120
120
  createdAt: new Date(),
121
121
  hasQaDevServer: false,
122
122
  });
123
- console.log(`[strategy-lifecycle] Created persistent worktree for "${strategy.strategy_name}": ${createdPath}`);
124
- // Install audit pre-commit hook for read-only strategies
125
- if (strategy.read_only) {
123
+ console.log(`[focus-lifecycle] Created persistent worktree for "${focus.focus_name}": ${createdPath}`);
124
+ // Install audit pre-commit hook for read-only focuses
125
+ if (focus.read_only) {
126
126
  installAuditPreCommitHook(createdPath);
127
- console.log(`[strategy-lifecycle] Installed audit pre-commit hook for "${strategy.strategy_name}"`);
127
+ console.log(`[focus-lifecycle] Installed audit pre-commit hook for "${focus.focus_name}"`);
128
128
  }
129
129
  }
130
130
  catch (err) {
131
- console.error(`[strategy-lifecycle] Failed to create worktree for "${strategy.strategy_name}": ${err instanceof Error ? err.message : String(err)}`);
132
- // Continue with other strategies
131
+ console.error(`[focus-lifecycle] Failed to create worktree for "${focus.focus_name}": ${err instanceof Error ? err.message : String(err)}`);
132
+ // Continue with other focuses
133
133
  }
134
134
  }
135
135
  }
136
136
  // ── Coordinated teardown ─────────────────────────────────────────────
137
137
  /**
138
- * Tear down a single strategy: stop QA, terminate team, remove worktree.
138
+ * Tear down a single focus: stop QA, terminate team, remove worktree.
139
139
  *
140
140
  * Each step is independently try/caught so a failure in one
141
141
  * does not prevent the others from running.
142
142
  */
143
- export async function teardownStrategy(config, strategyId, strategyName) {
144
- console.log(`[strategy-lifecycle] Tearing down strategy "${strategyName}"`);
143
+ export async function teardownFocus(config, focusId, focusName) {
144
+ console.log(`[focus-lifecycle] Tearing down focus "${focusName}"`);
145
145
  // Record teardown for spawn cooldown (prevents immediate respawn crash loops)
146
- recordStrategyTeardown(strategyId);
146
+ recordFocusTeardown(focusId);
147
147
  // 1. Stop QA dev server if running
148
148
  try {
149
- const qaState = getQaEnvironment(strategyId);
149
+ const qaState = getQaEnvironment(focusId);
150
150
  if (qaState?.pid) {
151
- console.log(`[strategy-lifecycle] Stopping QA dev server for "${strategyName}" (PID: ${qaState.pid})`);
151
+ console.log(`[focus-lifecycle] Stopping QA dev server for "${focusName}" (PID: ${qaState.pid})`);
152
152
  await stopQaDevServer(qaState.pid);
153
153
  }
154
154
  }
155
155
  catch (err) {
156
- console.warn(`[strategy-lifecycle] Failed to stop QA dev server for "${strategyName}": ${err.message}`);
156
+ console.warn(`[focus-lifecycle] Failed to stop QA dev server for "${focusName}": ${err.message}`);
157
157
  }
158
158
  // 2. Clear QA in-memory state
159
159
  try {
160
- removeQaEnvironment(strategyId);
160
+ removeQaEnvironment(focusId);
161
161
  }
162
162
  catch (err) {
163
- console.warn(`[strategy-lifecycle] Failed to clear QA state for "${strategyName}": ${err.message}`);
163
+ console.warn(`[focus-lifecycle] Failed to clear QA state for "${focusName}": ${err.message}`);
164
164
  }
165
165
  // 3. Clear QA DB state
166
166
  try {
167
- await updateQaStatus(strategyId, {
167
+ await updateQaStatus(focusId, {
168
168
  qaStatus: null,
169
169
  qaUrl: null,
170
170
  qaPort: null,
@@ -174,204 +174,204 @@ export async function teardownStrategy(config, strategyId, strategyName) {
174
174
  });
175
175
  }
176
176
  catch (err) {
177
- console.warn(`[strategy-lifecycle] Failed to clear QA DB state for "${strategyName}": ${err.message}`);
177
+ console.warn(`[focus-lifecycle] Failed to clear QA DB state for "${focusName}": ${err.message}`);
178
178
  }
179
179
  // 4. Terminate agent team and wait for process exit
180
180
  try {
181
181
  const activeTeams = getActiveTeams();
182
- const team = activeTeams.get(strategyId);
182
+ const team = activeTeams.get(focusId);
183
183
  if (team && team.phase !== 'shutting_down' && team.phase !== 'terminated') {
184
- console.log(`[strategy-lifecycle] Terminating team for "${strategyName}"`);
185
- terminateTeam(strategyId);
184
+ console.log(`[focus-lifecycle] Terminating team for "${focusName}"`);
185
+ terminateTeam(focusId);
186
186
  // Wait for process to actually exit (default 30s, then SIGKILL)
187
- const exited = await waitForTeamExit(strategyId);
187
+ const exited = await waitForTeamExit(focusId);
188
188
  if (!exited) {
189
- console.warn(`[strategy-lifecycle] Team for "${strategyName}" did not exit cleanly after SIGKILL`);
189
+ console.warn(`[focus-lifecycle] Team for "${focusName}" did not exit cleanly after SIGKILL`);
190
190
  }
191
191
  }
192
192
  }
193
193
  catch (err) {
194
- console.warn(`[strategy-lifecycle] Failed to terminate team for "${strategyName}": ${err.message}`);
194
+ console.warn(`[focus-lifecycle] Failed to terminate team for "${focusName}": ${err.message}`);
195
195
  }
196
196
  // 4b. Commit any uncommitted WIP changes left by the agent
197
197
  try {
198
- const worktreeInfo = getStrategyWorktree(strategyId);
198
+ const worktreeInfo = getFocusWorktree(focusId);
199
199
  if (worktreeInfo) {
200
- commitWipChanges(worktreeInfo.worktreePath, strategyName);
200
+ commitWipChanges(worktreeInfo.worktreePath, focusName);
201
201
  }
202
202
  }
203
203
  catch (err) {
204
- console.warn(`[strategy-lifecycle] WIP commit failed for "${strategyName}": ${err.message}`);
204
+ console.warn(`[focus-lifecycle] WIP commit failed for "${focusName}": ${err.message}`);
205
205
  }
206
- // 5. Remove strategy worktree via canonical path (merge-before-remove + conditional state cleanup).
206
+ // 5. Remove focus worktree via canonical path (merge-before-remove + conditional state cleanup).
207
207
  // If the team was killed mid-work (OOM, signal, crash) before handleTeamCompletion ran,
208
- // there may be commits that never got a merge attempt. safeRemoveStrategyWorktree closes that gap.
208
+ // there may be commits that never got a merge attempt. safeRemoveFocusWorktree closes that gap.
209
209
  try {
210
- const worktreeInfo = getStrategyWorktree(strategyId);
210
+ const worktreeInfo = getFocusWorktree(focusId);
211
211
  if (worktreeInfo) {
212
- console.log(`[strategy-lifecycle] Removing worktree for "${strategyName}": ${worktreeInfo.worktreePath}`);
213
- const removeResult = await safeRemoveStrategyWorktree({
212
+ console.log(`[focus-lifecycle] Removing worktree for "${focusName}": ${worktreeInfo.worktreePath}`);
213
+ const removeResult = await safeRemoveFocusWorktree({
214
214
  config,
215
215
  worktreePath: worktreeInfo.worktreePath,
216
216
  branchName: worktreeInfo.branchName,
217
- deliveryName: strategyName,
218
- deliveryId: strategyId,
219
- strategyId,
217
+ deliveryName: focusName,
218
+ deliveryId: focusId,
219
+ focusId,
220
220
  });
221
221
  // Escalate if merge failed (worktree preserved with unmerged work)
222
222
  if (removeResult.merged && removeResult.mergeError) {
223
223
  escalateMergeConflict({
224
224
  organizationId: config.organizationId,
225
225
  sessionId: '',
226
- deliveryId: strategyId,
227
- deliveryName: strategyName,
226
+ deliveryId: focusId,
227
+ deliveryName: focusName,
228
228
  branchName: worktreeInfo.branchName,
229
229
  integrationBranch: config.integrationBranch,
230
230
  mergeError: removeResult.mergeError,
231
- }).catch(err => console.warn(`[strategy-lifecycle] escalateMergeConflict failed for "${strategyName}": ${err.message}`));
231
+ }).catch(err => console.warn(`[focus-lifecycle] escalateMergeConflict failed for "${focusName}": ${err.message}`));
232
232
  }
233
233
  }
234
234
  }
235
235
  catch (err) {
236
- console.warn(`[strategy-lifecycle] Failed to remove worktree for "${strategyName}": ${err.message}`);
236
+ console.warn(`[focus-lifecycle] Failed to remove worktree for "${focusName}": ${err.message}`);
237
237
  }
238
- console.log(`[strategy-lifecycle] Teardown complete for "${strategyName}"`);
238
+ console.log(`[focus-lifecycle] Teardown complete for "${focusName}"`);
239
239
  }
240
240
  /**
241
- * Detect deactivated strategies and tear them down.
241
+ * Detect deactivated focuses and tear them down.
242
242
  *
243
- * Replaces both detectDeactivatedStrategies() from strategy-executor.ts
244
- * and checkQaForDeactivatedStrategies() from qa-orchestrator.ts.
243
+ * Replaces both detectDeactivatedFocuses() from focus-executor.ts
244
+ * and checkQaForDeactivatedFocuses() from qa-orchestrator.ts.
245
245
  * A single pass handles both team termination and QA cleanup.
246
246
  */
247
- export async function checkForDeactivatedStrategies(config) {
248
- const allWorktrees = getAllStrategyWorktrees();
247
+ export async function checkForDeactivatedFocuses(config) {
248
+ const allWorktrees = getAllFocusWorktrees();
249
249
  const activeTeams = getActiveTeams();
250
250
  // Nothing to check if no worktrees and no teams
251
251
  if (allWorktrees.size === 0 && activeTeams.size === 0)
252
252
  return;
253
- let activeStrategyIds;
253
+ let activeFocusIds;
254
254
  try {
255
- // Use getActiveStrategies (not getReadyStrategies) -- a strategy is "active" even
255
+ // Use getActiveFocuses (not getReadyFocuses) -- a focus is "active" even
256
256
  // when all deliveries are done. Worktrees must persist for QA and idle queues.
257
- const activeStrategies = await getActiveStrategies(config.organizationId, config.productId);
258
- activeStrategyIds = new Set(activeStrategies.map(s => s.strategy_id));
257
+ const activeFocuses = await getActiveFocuses(config.organizationId, config.productId);
258
+ activeFocusIds = new Set(activeFocuses.map(s => s.focus_id));
259
259
  }
260
260
  catch (err) {
261
261
  // If the endpoint isn't deployed yet, skip deactivation checks entirely.
262
262
  // Better to leave worktrees alive than to tear them down incorrectly.
263
- console.warn(`[strategy-lifecycle] Cannot determine active strategies (skipping deactivation check): ${err.message}`);
263
+ console.warn(`[focus-lifecycle] Cannot determine active focuses (skipping deactivation check): ${err.message}`);
264
264
  return;
265
265
  }
266
- // In multi-product setups, the global worktree/team maps contain strategies
267
- // from ALL products. Only check strategies we can confirm belong to THIS
268
- // product — otherwise Product B's poll tears down Product A's strategies.
266
+ // In multi-product setups, the global worktree/team maps contain focuses
267
+ // from ALL products. Only check focuses we can confirm belong to THIS
268
+ // product — otherwise Product B's poll tears down Product A's focuses.
269
269
  //
270
- // Strategy ownership is determined by:
270
+ // Focus ownership is determined by:
271
271
  // 1. Active team with matching productId (definitive)
272
- // 2. Worktree for a strategy that appears in this product's active set
273
- // (if it's active for this product, it's this product's strategy)
272
+ // 2. Worktree for a focus that appears in this product's active set
273
+ // (if it's active for this product, it's this product's focus)
274
274
  //
275
275
  // Orphan worktrees (no team, not in active set) have unknown product
276
276
  // ownership and are left alone — startup recovery handles them.
277
- const trackedStrategyIds = new Set();
277
+ const trackedFocusIds = new Set();
278
278
  for (const [id, team] of activeTeams) {
279
279
  if (team.productId === config.productId) {
280
- trackedStrategyIds.add(id);
280
+ trackedFocusIds.add(id);
281
281
  }
282
282
  }
283
- for (const strategyId of trackedStrategyIds) {
284
- if (activeStrategyIds.has(strategyId))
283
+ for (const focusId of trackedFocusIds) {
284
+ if (activeFocusIds.has(focusId))
285
285
  continue;
286
- const worktreeInfo = getStrategyWorktree(strategyId);
287
- const team = activeTeams.get(strategyId);
288
- const name = worktreeInfo?.strategyName ?? team?.strategyName ?? strategyId;
286
+ const worktreeInfo = getFocusWorktree(focusId);
287
+ const team = activeTeams.get(focusId);
288
+ const name = worktreeInfo?.focusName ?? team?.focusName ?? focusId;
289
289
  // Skip teams already shutting down
290
290
  if (team && (team.phase === 'shutting_down' || team.phase === 'terminated') && !worktreeInfo) {
291
291
  continue;
292
292
  }
293
293
  const reason = worktreeInfo && !team
294
- ? 'worktree exists but strategy no longer active'
294
+ ? 'worktree exists but focus no longer active'
295
295
  : team && !worktreeInfo
296
- ? 'team running but strategy no longer active'
297
- : 'strategy no longer active';
298
- console.log(`[strategy-lifecycle] Strategy "${name}" deactivated (${reason}) -- coordinated teardown`);
299
- await teardownStrategy(config, strategyId, name);
296
+ ? 'team running but focus no longer active'
297
+ : 'focus no longer active';
298
+ console.log(`[focus-lifecycle] Focus "${name}" deactivated (${reason}) -- coordinated teardown`);
299
+ await teardownFocus(config, focusId, name);
300
300
  }
301
301
  }
302
302
  // ── Startup recovery ─────────────────────────────────────────────
303
303
  /**
304
- * Rebuild the strategy-worktree-state after a daemon restart.
304
+ * Rebuild the focus-worktree-state after a daemon restart.
305
305
  *
306
306
  * Two-phase approach:
307
307
  * Phase 1 (DB-first): If hydrateFromDb() populated the Map, validate
308
- * each entry against disk and enrich with strategy names. Removes
308
+ * each entry against disk and enrich with focus names. Removes
309
309
  * stale entries (worktree deleted from disk) and cleans up entries
310
- * for deactivated strategies.
310
+ * for deactivated focuses.
311
311
  * Phase 2 (disk fallback): Scans for agent-* directories NOT already
312
312
  * in the Map. Covers first-run after migration and manually created
313
- * worktrees. Matches by ID prefix against active strategies.
313
+ * worktrees. Matches by ID prefix against active focuses.
314
314
  *
315
315
  * Also removes legacy qa-* directories from the pre-persistent worktree era.
316
316
  *
317
317
  * Must run AFTER hydrateFromDb() and crash recovery but BEFORE startListeners().
318
318
  */
319
- export async function rebuildStrategyWorktreeState(config) {
319
+ export async function rebuildFocusWorktreeState(config) {
320
320
  const { worktreeDir, repoPath, organizationId, productId } = config;
321
321
  if (!existsSync(worktreeDir)) {
322
- console.log('[strategy-lifecycle] No worktree directory — nothing to rebuild');
322
+ console.log('[focus-lifecycle] No worktree directory — nothing to rebuild');
323
323
  return;
324
324
  }
325
- // Query active strategies for enrichment and deactivation detection
326
- let activeStrategies;
325
+ // Query active focuses for enrichment and deactivation detection
326
+ let activeFocuses;
327
327
  try {
328
- activeStrategies = await getActiveStrategies(organizationId, productId);
328
+ activeFocuses = await getActiveFocuses(organizationId, productId);
329
329
  }
330
330
  catch (err) {
331
- console.warn(`[strategy-lifecycle] Cannot determine active strategies for state rebuild (preserving all): ${err.message}`);
331
+ console.warn(`[focus-lifecycle] Cannot determine active focuses for state rebuild (preserving all): ${err.message}`);
332
332
  return;
333
333
  }
334
- const strategyById = new Map(activeStrategies.map(s => [s.strategy_id, s]));
335
- const strategyByPrefix = new Map(activeStrategies.map(s => [s.strategy_id.slice(0, 8), s]));
334
+ const focusById = new Map(activeFocuses.map(s => [s.focus_id, s]));
335
+ const focusByPrefix = new Map(activeFocuses.map(s => [s.focus_id.slice(0, 8), s]));
336
336
  let validated = 0;
337
337
  let removedStale = 0;
338
338
  let deactivatedCleaned = 0;
339
339
  // ── Phase 1: Validate DB-hydrated entries ──────────────────────
340
- const allWorktrees = getAllStrategyWorktrees();
340
+ const allWorktrees = getAllFocusWorktrees();
341
341
  if (allWorktrees.size > 0) {
342
- console.log(`[strategy-lifecycle] Validating ${allWorktrees.size} DB-hydrated worktree(s) against disk`);
343
- for (const [strategyId, info] of [...allWorktrees]) {
342
+ console.log(`[focus-lifecycle] Validating ${allWorktrees.size} DB-hydrated worktree(s) against disk`);
343
+ for (const [focusId, info] of [...allWorktrees]) {
344
344
  if (!existsSync(info.worktreePath)) {
345
345
  // Worktree was manually deleted — remove from state (also fires async DB remove)
346
- console.log(`[strategy-lifecycle] DB-hydrated worktree no longer on disk: ${info.worktreePath}`);
347
- removeStrategyWorktree(strategyId);
346
+ console.log(`[focus-lifecycle] DB-hydrated worktree no longer on disk: ${info.worktreePath}`);
347
+ removeFocusWorktree(focusId);
348
348
  removedStale++;
349
349
  continue;
350
350
  }
351
- const strategy = strategyById.get(strategyId);
352
- if (strategy) {
353
- // Active — enrich with strategy name (not stored in DB)
354
- info.strategyName = strategy.strategy_name;
351
+ const focus = focusById.get(focusId);
352
+ if (focus) {
353
+ // Active — enrich with focus name (not stored in DB)
354
+ info.focusName = focus.focus_name;
355
355
  validated++;
356
- console.log(`[strategy-lifecycle] Validated worktree for "${strategy.strategy_name}": ${info.worktreePath}`);
356
+ console.log(`[focus-lifecycle] Validated worktree for "${focus.focus_name}": ${info.worktreePath}`);
357
357
  }
358
358
  else {
359
359
  // Deactivated — clean up via canonical path
360
- console.log(`[strategy-lifecycle] DB-hydrated worktree for deactivated strategy: ${info.worktreePath}`);
360
+ console.log(`[focus-lifecycle] DB-hydrated worktree for deactivated focus: ${info.worktreePath}`);
361
361
  try {
362
- const result = await safeRemoveStrategyWorktree({
362
+ const result = await safeRemoveFocusWorktree({
363
363
  config,
364
364
  worktreePath: info.worktreePath,
365
365
  branchName: info.branchName,
366
- deliveryName: info.strategyName || strategyId,
367
- deliveryId: strategyId,
368
- strategyId,
366
+ deliveryName: info.focusName || focusId,
367
+ deliveryId: focusId,
368
+ focusId,
369
369
  });
370
370
  if (result.removed)
371
371
  deactivatedCleaned++;
372
372
  }
373
373
  catch (err) {
374
- console.warn(`[strategy-lifecycle] Failed to clean up deactivated worktree: ${err.message}`);
374
+ console.warn(`[focus-lifecycle] Failed to clean up deactivated worktree: ${err.message}`);
375
375
  }
376
376
  }
377
377
  }
@@ -392,18 +392,18 @@ export async function rebuildStrategyWorktreeState(config) {
392
392
  });
393
393
  }
394
394
  catch (err) {
395
- console.warn(`[strategy-lifecycle] Failed to scan worktree directory: ${err.message}`);
395
+ console.warn(`[focus-lifecycle] Failed to scan worktree directory: ${err.message}`);
396
396
  agentDirs = [];
397
397
  }
398
398
  // Filter to directories whose full path is NOT already tracked
399
- const trackedPaths = new Set([...getAllStrategyWorktrees().values()].map(w => w.worktreePath));
399
+ const trackedPaths = new Set([...getAllFocusWorktrees().values()].map(w => w.worktreePath));
400
400
  const orphanDirs = agentDirs.filter(dirName => {
401
401
  const fullPath = resolve(join(worktreeDir, dirName));
402
402
  return !trackedPaths.has(fullPath);
403
403
  });
404
404
  let diskRegistered = 0;
405
405
  if (orphanDirs.length > 0) {
406
- console.log(`[strategy-lifecycle] Found ${orphanDirs.length} untracked agent-* dir(s) on disk (migration fallback)`);
406
+ console.log(`[focus-lifecycle] Found ${orphanDirs.length} untracked agent-* dir(s) on disk (migration fallback)`);
407
407
  // Parse git worktree list for branch names
408
408
  const pathToBranch = new Map();
409
409
  const worktreeListResult = runGitSync(['worktree', 'list', '--porcelain'], repoPath);
@@ -427,24 +427,24 @@ export async function rebuildStrategyWorktreeState(config) {
427
427
  const branchName = pathToBranch.get(fullPath) ?? dirName.replace(/-/g, '/');
428
428
  const idMatch = dirName.match(/-([0-9a-f]{8})$/);
429
429
  const idPrefix = idMatch ? idMatch[1] : null;
430
- const strategy = idPrefix ? strategyByPrefix.get(idPrefix) : undefined;
431
- if (strategy) {
432
- setStrategyWorktree(strategy.strategy_id, {
433
- strategyId: strategy.strategy_id,
434
- strategyName: strategy.strategy_name,
430
+ const focus = idPrefix ? focusByPrefix.get(idPrefix) : undefined;
431
+ if (focus) {
432
+ setFocusWorktree(focus.focus_id, {
433
+ focusId: focus.focus_id,
434
+ focusName: focus.focus_name,
435
435
  worktreePath: fullPath,
436
436
  branchName,
437
437
  createdAt: new Date(),
438
438
  hasQaDevServer: false,
439
439
  });
440
440
  diskRegistered++;
441
- console.log(`[strategy-lifecycle] Registered orphan worktree for "${strategy.strategy_name}": ${fullPath}`);
441
+ console.log(`[focus-lifecycle] Registered orphan worktree for "${focus.focus_name}": ${fullPath}`);
442
442
  }
443
443
  else {
444
444
  // Deactivated — canonical removal
445
- console.log(`[strategy-lifecycle] Cleaning up orphan deactivated worktree: ${fullPath} [${branchName}]`);
445
+ console.log(`[focus-lifecycle] Cleaning up orphan deactivated worktree: ${fullPath} [${branchName}]`);
446
446
  try {
447
- const result = await safeRemoveStrategyWorktree({
447
+ const result = await safeRemoveFocusWorktree({
448
448
  config,
449
449
  worktreePath: fullPath,
450
450
  branchName,
@@ -455,7 +455,7 @@ export async function rebuildStrategyWorktreeState(config) {
455
455
  deactivatedCleaned++;
456
456
  }
457
457
  catch (err) {
458
- console.warn(`[strategy-lifecycle] Failed to clean up orphan worktree ${dirName}: ${err.message}`);
458
+ console.warn(`[focus-lifecycle] Failed to clean up orphan worktree ${dirName}: ${err.message}`);
459
459
  }
460
460
  }
461
461
  }
@@ -475,7 +475,7 @@ export async function rebuildStrategyWorktreeState(config) {
475
475
  });
476
476
  for (const qaDir of legacyQaDirs) {
477
477
  const qaPath = join(worktreeDir, qaDir);
478
- console.log(`[strategy-lifecycle] Removing legacy qa-* directory: ${qaPath}`);
478
+ console.log(`[focus-lifecycle] Removing legacy qa-* directory: ${qaPath}`);
479
479
  try {
480
480
  const removeResult = runGitSync(['worktree', 'remove', '--force', qaPath], repoPath);
481
481
  if (!removeResult.success) {
@@ -486,7 +486,7 @@ export async function rebuildStrategyWorktreeState(config) {
486
486
  legacyCleaned++;
487
487
  }
488
488
  catch (err) {
489
- console.warn(`[strategy-lifecycle] Failed to remove legacy QA directory ${qaDir}: ${err.message}`);
489
+ console.warn(`[focus-lifecycle] Failed to remove legacy QA directory ${qaDir}: ${err.message}`);
490
490
  }
491
491
  }
492
492
  }
@@ -500,29 +500,29 @@ export async function rebuildStrategyWorktreeState(config) {
500
500
  deactivatedCleaned > 0 ? `${deactivatedCleaned} deactivated cleaned` : null,
501
501
  legacyCleaned > 0 ? `${legacyCleaned} legacy qa-* removed` : null,
502
502
  ].filter(Boolean);
503
- console.log(`[strategy-lifecycle] State rebuild complete: ${parts.join(', ')}`);
503
+ console.log(`[focus-lifecycle] State rebuild complete: ${parts.join(', ')}`);
504
504
  }
505
505
  // ── Git state reconciliation ──────────────────────────────────────
506
506
  /**
507
- * Reconcile git state for active strategy worktrees after startup.
507
+ * Reconcile git state for active focus worktrees after startup.
508
508
  *
509
- * Checks all rebuilt strategy worktrees and re-reports `worktree_active`
509
+ * Checks all rebuilt focus worktrees and re-reports `worktree_active`
510
510
  * for deliveries in coding/queued status. This ensures the DB reflects
511
511
  * accurate git state even if previous reportGitState calls were lost
512
512
  * (network blip, circuit breaker, daemon crash).
513
513
  *
514
- * Must run AFTER rebuildStrategyWorktreeState().
514
+ * Must run AFTER rebuildFocusWorktreeState().
515
515
  */
516
516
  export async function reconcileGitState(_config) {
517
- const worktrees = getAllStrategyWorktrees();
517
+ const worktrees = getAllFocusWorktrees();
518
518
  if (worktrees.size === 0) {
519
519
  return;
520
520
  }
521
- console.log(`[strategy-lifecycle] Reconciling git state for ${worktrees.size} strategy worktree(s)...`);
521
+ console.log(`[focus-lifecycle] Reconciling git state for ${worktrees.size} focus worktree(s)...`);
522
522
  let reconciled = 0;
523
- for (const [strategyId, worktree] of worktrees) {
523
+ for (const [focusId, worktree] of worktrees) {
524
524
  try {
525
- const deliveries = await getStrategyDeliveries(strategyId);
525
+ const deliveries = await getFocusDeliveries(focusId);
526
526
  const activeDeliveries = deliveries.filter(d => isStatusAgentActionable(d.executionStatus ?? ''));
527
527
  for (const delivery of activeDeliveries) {
528
528
  await reportGitState(delivery.id, 'worktree_active', worktree.branchName);
@@ -530,15 +530,15 @@ export async function reconcileGitState(_config) {
530
530
  }
531
531
  }
532
532
  catch (err) {
533
- console.warn(`[strategy-lifecycle] Failed to reconcile git state for "${worktree.strategyName}": ` +
533
+ console.warn(`[focus-lifecycle] Failed to reconcile git state for "${worktree.focusName}": ` +
534
534
  `${err.message}`);
535
535
  }
536
536
  }
537
537
  if (reconciled > 0) {
538
- console.log(`[strategy-lifecycle] Reconciled git state for ${reconciled} delivery(ies)`);
538
+ console.log(`[focus-lifecycle] Reconciled git state for ${reconciled} delivery(ies)`);
539
539
  }
540
540
  else {
541
- console.log('[strategy-lifecycle] No deliveries needed git state reconciliation');
541
+ console.log('[focus-lifecycle] No deliveries needed git state reconciliation');
542
542
  }
543
543
  }
544
- //# sourceMappingURL=strategy-lifecycle.js.map
544
+ //# sourceMappingURL=focus-lifecycle.js.map