@telora/daemon 0.15.1 → 0.15.3

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 (356) 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 +15 -15
  53. package/dist/directive-executor.d.ts.map +1 -1
  54. package/dist/directive-executor.js +76 -76
  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/focus-completion.d.ts +85 -0
  65. package/dist/focus-completion.d.ts.map +1 -0
  66. package/dist/focus-completion.js +459 -0
  67. package/dist/focus-completion.js.map +1 -0
  68. package/dist/focus-engine.d.ts +47 -0
  69. package/dist/focus-engine.d.ts.map +1 -0
  70. package/dist/focus-engine.js +421 -0
  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/focus-executor.js +549 -0
  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/focus-lifecycle.js +544 -0
  79. package/dist/focus-lifecycle.js.map +1 -0
  80. package/dist/focus-merge.d.ts +77 -0
  81. package/dist/focus-merge.d.ts.map +1 -0
  82. package/dist/focus-merge.js +378 -0
  83. package/dist/focus-merge.js.map +1 -0
  84. package/dist/focus-prompt-builder.d.ts +35 -0
  85. package/dist/focus-prompt-builder.d.ts.map +1 -0
  86. package/dist/focus-prompt-builder.js +138 -0
  87. package/dist/focus-prompt-builder.js.map +1 -0
  88. package/dist/focus-provisioning.d.ts +16 -0
  89. package/dist/focus-provisioning.d.ts.map +1 -0
  90. package/dist/focus-provisioning.js +119 -0
  91. package/dist/focus-provisioning.js.map +1 -0
  92. package/dist/focus-spawn-helpers.d.ts +67 -0
  93. package/dist/focus-spawn-helpers.d.ts.map +1 -0
  94. package/dist/focus-spawn-helpers.js +160 -0
  95. package/dist/focus-spawn-helpers.js.map +1 -0
  96. package/dist/focus-team-lifecycle.d.ts +50 -0
  97. package/dist/focus-team-lifecycle.d.ts.map +1 -0
  98. package/dist/focus-team-lifecycle.js +256 -0
  99. package/dist/focus-team-lifecycle.js.map +1 -0
  100. package/dist/focus-team-state.d.ts +24 -0
  101. package/dist/focus-team-state.d.ts.map +1 -0
  102. package/dist/focus-team-state.js +43 -0
  103. package/dist/focus-team-state.js.map +1 -0
  104. package/dist/focus-worktree-state.d.ts +47 -0
  105. package/dist/focus-worktree-state.d.ts.map +1 -0
  106. package/dist/focus-worktree-state.js +104 -0
  107. package/dist/focus-worktree-state.js.map +1 -0
  108. package/dist/git-merge.d.ts +5 -5
  109. package/dist/git-merge.d.ts.map +1 -1
  110. package/dist/git-merge.js +5 -5
  111. package/dist/git-merge.js.map +1 -1
  112. package/dist/git-state-detector.d.ts +1 -1
  113. package/dist/git-state-detector.js +9 -9
  114. package/dist/git-state-detector.js.map +1 -1
  115. package/dist/git-utils.d.ts +1 -1
  116. package/dist/git-utils.js +1 -1
  117. package/dist/git.d.ts +2 -2
  118. package/dist/git.d.ts.map +1 -1
  119. package/dist/git.js +3 -3
  120. package/dist/git.js.map +1 -1
  121. package/dist/heartbeat.d.ts +4 -4
  122. package/dist/heartbeat.d.ts.map +1 -1
  123. package/dist/heartbeat.js +7 -7
  124. package/dist/heartbeat.js.map +1 -1
  125. package/dist/index.d.ts +1 -1
  126. package/dist/index.js +10 -10
  127. package/dist/index.js.map +1 -1
  128. package/dist/listener-auto-advance.d.ts +2 -2
  129. package/dist/listener-auto-advance.js +21 -21
  130. package/dist/listener-auto-advance.js.map +1 -1
  131. package/dist/listener.d.ts +12 -12
  132. package/dist/listener.d.ts.map +1 -1
  133. package/dist/listener.js +80 -75
  134. package/dist/listener.js.map +1 -1
  135. package/dist/loop-engine.d.ts +20 -20
  136. package/dist/loop-engine.d.ts.map +1 -1
  137. package/dist/loop-engine.js +82 -82
  138. package/dist/loop-engine.js.map +1 -1
  139. package/dist/loop-event-bus.d.ts +5 -5
  140. package/dist/loop-event-bus.d.ts.map +1 -1
  141. package/dist/loop-event-bus.js +3 -3
  142. package/dist/loop-llm-client.d.ts +1 -1
  143. package/dist/loop-llm-client.js +1 -1
  144. package/dist/loop-variance.d.ts +1 -1
  145. package/dist/loop-variance.js +1 -1
  146. package/dist/merge-detector.d.ts +6 -6
  147. package/dist/merge-detector.d.ts.map +1 -1
  148. package/dist/merge-detector.js +47 -47
  149. package/dist/merge-detector.js.map +1 -1
  150. package/dist/otlp-log-parser.js +2 -2
  151. package/dist/otlp-log-parser.js.map +1 -1
  152. package/dist/otlp-metric-parser.js +1 -1
  153. package/dist/otlp-metric-parser.js.map +1 -1
  154. package/dist/otlp-receiver.d.ts +1 -1
  155. package/dist/otlp-receiver.js +7 -7
  156. package/dist/otlp-receiver.js.map +1 -1
  157. package/dist/otlp-types.d.ts +1 -1
  158. package/dist/otlp-types.d.ts.map +1 -1
  159. package/dist/otlp-types.js +3 -3
  160. package/dist/otlp-types.js.map +1 -1
  161. package/dist/output-monitor.d.ts +6 -6
  162. package/dist/output-monitor.d.ts.map +1 -1
  163. package/dist/output-monitor.js +11 -11
  164. package/dist/output-monitor.js.map +1 -1
  165. package/dist/planning-prompt-builder.d.ts +17 -15
  166. package/dist/planning-prompt-builder.d.ts.map +1 -1
  167. package/dist/planning-prompt-builder.js +34 -32
  168. package/dist/planning-prompt-builder.js.map +1 -1
  169. package/dist/pm/mitigation-correlator.d.ts +7 -7
  170. package/dist/pm/mitigation-correlator.d.ts.map +1 -1
  171. package/dist/pm/mitigation-correlator.js +33 -33
  172. package/dist/pm/mitigation-correlator.js.map +1 -1
  173. package/dist/pm-engine.js +1 -1
  174. package/dist/pm-engine.js.map +1 -1
  175. package/dist/prompt-builder.d.ts +1 -1
  176. package/dist/prompt-builder.js +9 -9
  177. package/dist/prompt-builder.js.map +1 -1
  178. package/dist/prompts/starter-prompt.d.ts +2 -2
  179. package/dist/prompts/starter-prompt.d.ts.map +1 -1
  180. package/dist/prompts/starter-prompt.js +6 -6
  181. package/dist/qa-crash-recovery.d.ts +10 -10
  182. package/dist/qa-crash-recovery.d.ts.map +1 -1
  183. package/dist/qa-crash-recovery.js +32 -32
  184. package/dist/qa-crash-recovery.js.map +1 -1
  185. package/dist/qa-dev-server.d.ts +3 -3
  186. package/dist/qa-dev-server.d.ts.map +1 -1
  187. package/dist/qa-dev-server.js +3 -3
  188. package/dist/qa-dev-server.js.map +1 -1
  189. package/dist/qa-orchestrator.d.ts +18 -18
  190. package/dist/qa-orchestrator.d.ts.map +1 -1
  191. package/dist/qa-orchestrator.js +47 -47
  192. package/dist/qa-orchestrator.js.map +1 -1
  193. package/dist/qa-provisioner.d.ts +3 -3
  194. package/dist/qa-provisioner.d.ts.map +1 -1
  195. package/dist/qa-provisioner.js +14 -14
  196. package/dist/qa-provisioner.js.map +1 -1
  197. package/dist/qa-state.d.ts +10 -10
  198. package/dist/qa-state.d.ts.map +1 -1
  199. package/dist/qa-state.js +11 -11
  200. package/dist/qa-state.js.map +1 -1
  201. package/dist/queries/control-state.d.ts +5 -5
  202. package/dist/queries/control-state.d.ts.map +1 -1
  203. package/dist/queries/control-state.js +4 -4
  204. package/dist/queries/control-state.js.map +1 -1
  205. package/dist/queries/deliveries.d.ts +28 -24
  206. package/dist/queries/deliveries.d.ts.map +1 -1
  207. package/dist/queries/deliveries.js +32 -28
  208. package/dist/queries/deliveries.js.map +1 -1
  209. package/dist/queries/focuses.d.ts +97 -0
  210. package/dist/queries/focuses.d.ts.map +1 -0
  211. package/dist/queries/focuses.js +136 -0
  212. package/dist/queries/focuses.js.map +1 -0
  213. package/dist/queries/index.d.ts +3 -3
  214. package/dist/queries/index.d.ts.map +1 -1
  215. package/dist/queries/index.js +2 -2
  216. package/dist/queries/index.js.map +1 -1
  217. package/dist/queries/qa.d.ts +16 -16
  218. package/dist/queries/qa.d.ts.map +1 -1
  219. package/dist/queries/qa.js +22 -22
  220. package/dist/queries/qa.js.map +1 -1
  221. package/dist/queries/schemas.d.ts +40 -34
  222. package/dist/queries/schemas.d.ts.map +1 -1
  223. package/dist/queries/schemas.js +31 -26
  224. package/dist/queries/schemas.js.map +1 -1
  225. package/dist/queries/sessions.d.ts +1 -1
  226. package/dist/queries/sessions.d.ts.map +1 -1
  227. package/dist/queries/sessions.js +2 -2
  228. package/dist/queries/sessions.js.map +1 -1
  229. package/dist/queries/shared.js +10 -10
  230. package/dist/queries/shared.js.map +1 -1
  231. package/dist/queries/workflows.d.ts +1 -1
  232. package/dist/queries/workflows.js +1 -1
  233. package/dist/queries/worktrees.d.ts +7 -7
  234. package/dist/queries/worktrees.d.ts.map +1 -1
  235. package/dist/queries/worktrees.js +7 -7
  236. package/dist/queries/worktrees.js.map +1 -1
  237. package/dist/review-defect-detector.d.ts +125 -0
  238. package/dist/review-defect-detector.d.ts.map +1 -0
  239. package/dist/review-defect-detector.js +289 -0
  240. package/dist/review-defect-detector.js.map +1 -0
  241. package/dist/session-lifecycle.d.ts +17 -17
  242. package/dist/session-lifecycle.d.ts.map +1 -1
  243. package/dist/session-lifecycle.js +82 -82
  244. package/dist/session-lifecycle.js.map +1 -1
  245. package/dist/spawn-cooldown.d.ts +8 -8
  246. package/dist/spawn-cooldown.d.ts.map +1 -1
  247. package/dist/spawn-cooldown.js +15 -15
  248. package/dist/spawn-cooldown.js.map +1 -1
  249. package/dist/spawn-environment.d.ts +2 -2
  250. package/dist/spawn-environment.d.ts.map +1 -1
  251. package/dist/spawn-environment.js +3 -3
  252. package/dist/spawn-environment.js.map +1 -1
  253. package/dist/spawner-lifecycle.d.ts +2 -2
  254. package/dist/spawner-lifecycle.d.ts.map +1 -1
  255. package/dist/spawner-lifecycle.js +3 -3
  256. package/dist/spawner-lifecycle.js.map +1 -1
  257. package/dist/spawner-resolution.d.ts +3 -3
  258. package/dist/spawner-resolution.d.ts.map +1 -1
  259. package/dist/spawner-resolution.js +4 -4
  260. package/dist/spawner-resolution.js.map +1 -1
  261. package/dist/spawner-stream-handlers.js +2 -2
  262. package/dist/spawner-stream-handlers.js.map +1 -1
  263. package/dist/spawner.d.ts +1 -1
  264. package/dist/spawner.d.ts.map +1 -1
  265. package/dist/spawner.js +6 -6
  266. package/dist/spawner.js.map +1 -1
  267. package/dist/stage-classifier.d.ts +1 -1
  268. package/dist/stage-classifier.js +1 -1
  269. package/dist/state-cascade.d.ts +25 -25
  270. package/dist/state-cascade.d.ts.map +1 -1
  271. package/dist/state-cascade.js +89 -89
  272. package/dist/state-cascade.js.map +1 -1
  273. package/dist/strategy-completion-event.d.ts +37 -3
  274. package/dist/strategy-completion-event.d.ts.map +1 -1
  275. package/dist/strategy-completion-event.js +78 -9
  276. package/dist/strategy-completion-event.js.map +1 -1
  277. package/dist/strategy-completion.d.ts +11 -0
  278. package/dist/strategy-completion.d.ts.map +1 -1
  279. package/dist/strategy-completion.js +22 -1
  280. package/dist/strategy-completion.js.map +1 -1
  281. package/dist/strategy-executor.d.ts.map +1 -1
  282. package/dist/strategy-executor.js +46 -14
  283. package/dist/strategy-executor.js.map +1 -1
  284. package/dist/strategy-merge.d.ts.map +1 -1
  285. package/dist/strategy-merge.js +4 -0
  286. package/dist/strategy-merge.js.map +1 -1
  287. package/dist/strategy-team-lifecycle.d.ts.map +1 -1
  288. package/dist/strategy-team-lifecycle.js +3 -0
  289. package/dist/strategy-team-lifecycle.js.map +1 -1
  290. package/dist/supabase.d.ts +4 -4
  291. package/dist/supabase.d.ts.map +1 -1
  292. package/dist/supabase.js +5 -5
  293. package/dist/supabase.js.map +1 -1
  294. package/dist/task-converter.d.ts +4 -4
  295. package/dist/task-converter.d.ts.map +1 -1
  296. package/dist/task-converter.js +1 -1
  297. package/dist/task-converter.js.map +1 -1
  298. package/dist/team-prompt-base.d.ts +59 -19
  299. package/dist/team-prompt-base.d.ts.map +1 -1
  300. package/dist/team-prompt-base.js +206 -25
  301. package/dist/team-prompt-base.js.map +1 -1
  302. package/dist/team-spawner.d.ts +9 -9
  303. package/dist/team-spawner.d.ts.map +1 -1
  304. package/dist/team-spawner.js +87 -83
  305. package/dist/team-spawner.js.map +1 -1
  306. package/dist/telemetry-writer.d.ts +2 -2
  307. package/dist/telemetry-writer.d.ts.map +1 -1
  308. package/dist/templates/claude-md.js +8 -8
  309. package/dist/templates/claude-settings.d.ts +1 -1
  310. package/dist/templates/claude-settings.js +2 -2
  311. package/dist/templates/claude-settings.js.map +1 -1
  312. package/dist/trigger-executor.d.ts +4 -4
  313. package/dist/trigger-executor.d.ts.map +1 -1
  314. package/dist/trigger-executor.js +11 -11
  315. package/dist/trigger-executor.js.map +1 -1
  316. package/dist/types/dag.d.ts +1 -1
  317. package/dist/types/delivery.d.ts +3 -3
  318. package/dist/types/delivery.d.ts.map +1 -1
  319. package/dist/types/focus.d.ts +214 -0
  320. package/dist/types/focus.d.ts.map +1 -0
  321. package/dist/types/focus.js +5 -0
  322. package/dist/types/focus.js.map +1 -0
  323. package/dist/types/index.d.ts +1 -1
  324. package/dist/types/index.d.ts.map +1 -1
  325. package/dist/types/index.js +1 -1
  326. package/dist/types/index.js.map +1 -1
  327. package/dist/types/merge.d.ts +1 -1
  328. package/dist/types/session.d.ts +2 -2
  329. package/dist/types/session.d.ts.map +1 -1
  330. package/dist/types/strategy.d.ts +7 -0
  331. package/dist/types/strategy.d.ts.map +1 -1
  332. package/dist/unified-engine-lifecycle.js +11 -11
  333. package/dist/unified-engine-lifecycle.js.map +1 -1
  334. package/dist/unified-init.d.ts +1 -1
  335. package/dist/unified-init.js +9 -9
  336. package/dist/unified-init.js.map +1 -1
  337. package/dist/unified-shell-config.d.ts +4 -4
  338. package/dist/unified-shell-config.d.ts.map +1 -1
  339. package/dist/unified-shell-config.js +5 -5
  340. package/dist/unified-shell-config.js.map +1 -1
  341. package/dist/unified-shell-status.js +3 -3
  342. package/dist/unified-shell-status.js.map +1 -1
  343. package/dist/unified-shell.d.ts +1 -1
  344. package/dist/unified-shell.js +4 -4
  345. package/dist/unified-shell.js.map +1 -1
  346. package/dist/workflow-engine.d.ts +1 -1
  347. package/dist/workflow-engine.d.ts.map +1 -1
  348. package/dist/worktree-focus.d.ts +69 -0
  349. package/dist/worktree-focus.d.ts.map +1 -0
  350. package/dist/worktree-focus.js +214 -0
  351. package/dist/worktree-focus.js.map +1 -0
  352. package/dist/worktree.d.ts +10 -10
  353. package/dist/worktree.d.ts.map +1 -1
  354. package/dist/worktree.js +39 -39
  355. package/dist/worktree.js.map +1 -1
  356. package/package.json +2 -2
@@ -0,0 +1,549 @@
1
+ /**
2
+ * Focus executor - manages Agent Team lifecycle per focus.
3
+ *
4
+ * Replaces the per-delivery agent spawning model. When a focus has
5
+ * an assigned agent role and queued deliveries, the executor spawns
6
+ * a single Agent Team (one lead agent process) scoped to the entire focus.
7
+ *
8
+ * The lead agent:
9
+ * 1. Reads all deliveries + issues for the focus
10
+ * 2. Builds a task DAG with dependencies
11
+ * 3. Spawns worker teammates to execute issues in parallel
12
+ * 4. Advances delivery stages as their issues complete
13
+ * 5. Terminates when all work is done; fresh team spawned for new work
14
+ *
15
+ * This module is the orchestration entry point. Pure logic is extracted to:
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
+ */
23
+ import { spawn } from 'node:child_process';
24
+ import { mkdirSync, existsSync } from 'node:fs';
25
+ import { createSession, updateSession, getActiveFocuses, } from './supabase.js';
26
+ import { createWorktree, runGitSync, repoHasCommits } from './git.js';
27
+ import { installAuditPreCommitHook } from './audit-hooks.js';
28
+ import { getFocusWorktree, setFocusWorktree } from './focus-worktree-state.js';
29
+ import { withRetry, sendMessage, productLabel } from '@telora/daemon-core';
30
+ import { recordActivity } from './heartbeat.js';
31
+ import { buildFocusTeamPrompt } from './focus-prompt-builder.js';
32
+ import { buildRoleFrameworkPrompt } from './team-prompt-base.js';
33
+ import { getFocusDeliveries, getFocusIssues, getProductContextForFocus, getProductDeploymentProfileSnapshot, fetchFocusWorkflow } from './queries/focuses.js';
34
+ import { buildSpawnEnvironment } from './spawn-environment.js';
35
+ import { sanitizeGitSegment } from './git-utils.js';
36
+ import { recordFocusTeardown } from './spawn-cooldown.js';
37
+ import { consumePendingSpawnDirective, assembleDirectiveContent } from './directive-executor.js';
38
+ import { resolveAssemblyRecipe } from './assembly-engine.js';
39
+ import './assembly-resolvers.js';
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';
43
+ // ── Imports from extracted modules ──────────────────────────────────────
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';
48
+ // ── Re-exports for backward compatibility ───────────────────────────────
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) ─────────
54
+ let governor = null;
55
+ /** Inject the resource governor for global concurrency limiting. */
56
+ export function initGovernor(gov) {
57
+ governor = gov;
58
+ }
59
+ /**
60
+ * Pre-spawn guard: enforce rank-ordered execution.
61
+ *
62
+ * Walk deliveries in priority_rank order (already sorted by API).
63
+ * A delivery is actionable only if all lower-ranked deliveries are non-blocking.
64
+ *
65
+ * Returns:
66
+ * - 'planning' when the focus has zero deliveries (agent will scope them).
67
+ * - 'execute' with the filtered actionable deliveries when work is queued.
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.
77
+ */
78
+ function findActionableDeliveries(deliveries, focusName) {
79
+ // Zero deliveries -- the team's first act is to scope them.
80
+ if (deliveries.length === 0) {
81
+ return { kind: 'planning' };
82
+ }
83
+ let nextActionable = null;
84
+ for (const d of deliveries) {
85
+ const status = d.executionStatus ?? '';
86
+ if (!isStatusBlocking(status))
87
+ continue;
88
+ if (isStatusAgentActionable(status)) {
89
+ nextActionable = d;
90
+ }
91
+ else {
92
+ // Blocking status (planning, paused) prevents subsequent deliveries
93
+ console.log(`[focus-executor] Delivery "${d.name}" (rank ${d.priorityRank}) ` +
94
+ `is in "${status}" state -- blocking subsequent deliveries in focus "${focusName}"`);
95
+ }
96
+ break;
97
+ }
98
+ if (!nextActionable || !isStatusAgentActionable(nextActionable.executionStatus ?? '')) {
99
+ console.log(`[focus-executor] No actionable deliveries for focus "${focusName}" -- skipping spawn`);
100
+ return { kind: 'skip' };
101
+ }
102
+ return {
103
+ kind: 'execute',
104
+ deliveries: deliveries.filter(d => isStatusAgentActionable(d.executionStatus ?? '')),
105
+ };
106
+ }
107
+ // ── Team spawning ────────────────────────────────────────────────────
108
+ /**
109
+ * Generate branch name for focus-level work.
110
+ */
111
+ export function generateFocusBranchName(role, focusName, focusId) {
112
+ const sanitizedRoleName = sanitizeGitSegment(role.name);
113
+ const shortId = focusId.slice(0, 8);
114
+ const sanitizedFocusName = sanitizeGitSegment(focusName);
115
+ return `agent/${sanitizedRoleName}/${sanitizedFocusName}-${shortId}`;
116
+ }
117
+ /**
118
+ * Build Claude Code CLI arguments for the team lead.
119
+ */
120
+ function buildTeamLeadArgs(config, pipelineConfig, resumeSessionId) {
121
+ const args = [];
122
+ // --resume must come early, before --input-format stream-json
123
+ if (resumeSessionId) {
124
+ args.push('--resume', resumeSessionId);
125
+ }
126
+ args.push('--dangerously-skip-permissions');
127
+ args.push('--setting-sources', 'project,local');
128
+ args.push('--input-format', 'stream-json');
129
+ args.push('--output-format', 'stream-json');
130
+ args.push('--verbose');
131
+ // Enable in-process teammate mode for the team lead
132
+ args.push('--teammate-mode', 'in-process');
133
+ // Honour pipeline config model override
134
+ const model = pipelineConfig?.model;
135
+ if (model) {
136
+ args.push('--model', model);
137
+ }
138
+ return args;
139
+ }
140
+ /**
141
+ * Spawn a focus team to execute all deliveries in a focus.
142
+ *
143
+ * Creates a single Agent Team (lead process) that reads all deliveries
144
+ * and issues, builds a task DAG, and coordinates worker execution.
145
+ */
146
+ export async function spawnFocusTeam(params) {
147
+ const { config, focusId, focusName, role, pipelineConfig, readOnly = false, lastClaudeSessionId } = params;
148
+ const activeTeams = getActiveTeams();
149
+ // Prevent double-spawn
150
+ if (activeTeams.has(focusId)) {
151
+ console.warn(`[focus-executor] Team already active for focus "${focusName}", skipping spawn`);
152
+ return;
153
+ }
154
+ const executionConfig = deriveExecutionConfig(pipelineConfig);
155
+ const branchName = generateFocusBranchName(role, focusName, focusId);
156
+ // Initialize team state
157
+ const teamState = {
158
+ focusId,
159
+ focusName,
160
+ roleId: role.id,
161
+ roleName: role.name,
162
+ organizationId: config.organizationId,
163
+ productId: config.productId,
164
+ executionConfig,
165
+ pipelineConfig,
166
+ startedAt: new Date(),
167
+ phase: 'initializing',
168
+ knownDeliveryIds: new Set(),
169
+ mergedDeliveryIds: new Set(),
170
+ planningPhase: false,
171
+ shutdownReason: null,
172
+ deliveryStageIds: new Map(),
173
+ leadSessionId: null,
174
+ leadPid: null,
175
+ leadStdin: null,
176
+ branchName,
177
+ worktreePath: null,
178
+ resolvingMergeConflict: false,
179
+ readOnly,
180
+ completionDetector: null,
181
+ claudeSessionId: null,
182
+ lastProgressSnapshot: null,
183
+ noProgressCycles: 0,
184
+ };
185
+ activeTeams.set(focusId, teamState);
186
+ const currentProduct = config.products.find(p => p.id === config.productId);
187
+ const productTag = config.products.length > 1 && currentProduct ? ` [${productLabel(currentProduct)}]` : '';
188
+ console.log(`[focus-executor] Spawning team for focus "${focusName}"${readOnly ? ' [READ-ONLY]' : ''}${productTag}`);
189
+ console.log(` Role: ${role.name}`);
190
+ console.log(` Model: ${pipelineConfig?.model ?? '(CLI default)'}`);
191
+ console.log(` Max workers: ${executionConfig.maxWorkers}`);
192
+ console.log(` Branch: ${branchName}`);
193
+ if (config.products.length > 1) {
194
+ console.log(` Product: ${currentProduct ? productLabel(currentProduct) : config.productId.slice(0, 8)}`);
195
+ console.log(` Repo: ${config.repoPath}`);
196
+ }
197
+ // Fetch all deliveries, issues, product context, deployment profile, and loop context
198
+ let deliveries;
199
+ let issues;
200
+ let productContextDocs;
201
+ let deploymentProfileSnapshot;
202
+ let loopContext;
203
+ try {
204
+ [deliveries, issues, productContextDocs, deploymentProfileSnapshot, loopContext] = await Promise.all([
205
+ getFocusDeliveries(focusId),
206
+ getFocusIssues(focusId),
207
+ getProductContextForFocus(config.productId, focusId),
208
+ getProductDeploymentProfileSnapshot(config.productId).catch((err) => {
209
+ console.debug(`[focus-executor] Could not fetch deployment profile snapshot (non-fatal):`, err.message);
210
+ return null;
211
+ }),
212
+ (async () => {
213
+ try {
214
+ const assemblyCtx = {
215
+ focusId,
216
+ deliveryIds: [],
217
+ worktreePath: null,
218
+ config,
219
+ organizationId: config.organizationId,
220
+ productId: config.productId,
221
+ };
222
+ return await resolveAssemblyRecipe(['loop.context', 'focus.injections'], assemblyCtx);
223
+ }
224
+ catch (err) {
225
+ console.debug(`[focus-executor] Could not fetch loop context (non-fatal):`, err.message);
226
+ return '';
227
+ }
228
+ })(),
229
+ ]);
230
+ }
231
+ catch (err) {
232
+ console.error(`[focus-executor] Failed to fetch context for focus "${focusName}":`, err.message);
233
+ activeTeams.delete(focusId);
234
+ return;
235
+ }
236
+ // Check for pending spawn directive (e.g., review stage spawn)
237
+ const pendingDirective = consumePendingSpawnDirective(focusId);
238
+ // Pre-spawn guard: enforce rank-ordered execution.
239
+ // Skip when a pending spawn directive exists -- the directive has its own intent.
240
+ let actionableDeliveries = [];
241
+ let isPlanningSpawn = false;
242
+ if (pendingDirective) {
243
+ actionableDeliveries = deliveries.filter(d => isStatusAgentActionable(d.executionStatus ?? ''));
244
+ }
245
+ else {
246
+ const decision = findActionableDeliveries(deliveries, focusName);
247
+ if (decision.kind === 'skip') {
248
+ activeTeams.delete(focusId);
249
+ return;
250
+ }
251
+ if (decision.kind === 'planning') {
252
+ isPlanningSpawn = true;
253
+ teamState.planningPhase = true;
254
+ console.log(`[focus-executor] Focus "${focusName}" has no deliveries -- spawning planning team`);
255
+ }
256
+ else {
257
+ actionableDeliveries = decision.deliveries;
258
+ }
259
+ }
260
+ // Track known deliveries, pre-populate already-completed ones.
261
+ // Empty deliveries (planning spawn) yields zero iterations: knownDeliveryIds
262
+ // stays empty until the wake-cycle refresh in handleCompletionEvent picks
263
+ // up MCP-written deliveries, at which point planningPhase is cleared.
264
+ for (const d of deliveries) {
265
+ teamState.knownDeliveryIds.add(d.id);
266
+ teamState.deliveryStageIds.set(d.id, d.currentWorkflowStageId);
267
+ if (!isStatusAgentActionable(d.executionStatus ?? '') && !isStatusBlocking(d.executionStatus ?? '')) {
268
+ teamState.mergedDeliveryIds.add(d.id);
269
+ }
270
+ }
271
+ if (isPlanningSpawn) {
272
+ console.log(` Deliveries: 0 (planning required)`);
273
+ }
274
+ else {
275
+ console.log(` Deliveries: ${deliveries.length} (${actionableDeliveries.length} queued)`);
276
+ }
277
+ console.log(` Issues: ${issues.length}`);
278
+ // Ensure log directory exists
279
+ if (!existsSync(config.logDir)) {
280
+ mkdirSync(config.logDir, { recursive: true, mode: 0o700 });
281
+ }
282
+ // Reuse persistent focus worktree (created by ensureFocusWorktrees in poll loop)
283
+ let worktreePath;
284
+ const existingWorktree = getFocusWorktree(focusId);
285
+ if (existingWorktree) {
286
+ worktreePath = existingWorktree.worktreePath;
287
+ // Rebase onto integration to pick up latest changes from other focuses
288
+ const rebaseResult = runGitSync(['rebase', config.integrationBranch], worktreePath);
289
+ if (!rebaseResult.success) {
290
+ runGitSync(['rebase', '--abort'], worktreePath);
291
+ console.warn(`[focus-executor] Rebase failed for "${focusName}", continuing with existing state`);
292
+ }
293
+ console.log(` Worktree (reused): ${worktreePath}`);
294
+ }
295
+ else {
296
+ // Guard: can't create worktrees in a repo with no commits
297
+ if (!repoHasCommits(config.repoPath)) {
298
+ console.warn(`[focus-executor] Repository has no commits -- cannot create worktree for "${focusName}"`);
299
+ activeTeams.delete(focusId);
300
+ recordFocusTeardown(focusId);
301
+ return;
302
+ }
303
+ // Fallback: worktree doesn't exist yet (race condition or first poll)
304
+ console.warn(`[focus-executor] No persistent worktree for "${focusName}", creating inline`);
305
+ try {
306
+ worktreePath = await createWorktree(config, branchName);
307
+ setFocusWorktree(focusId, {
308
+ focusId,
309
+ focusName,
310
+ worktreePath,
311
+ branchName,
312
+ createdAt: new Date(),
313
+ hasQaDevServer: false,
314
+ });
315
+ console.log(` Worktree (created inline): ${worktreePath}`);
316
+ // Install audit pre-commit hook for read-only focuses
317
+ if (readOnly) {
318
+ installAuditPreCommitHook(worktreePath);
319
+ console.log(` Installed audit pre-commit hook (read-only mode)`);
320
+ }
321
+ }
322
+ catch (err) {
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);
326
+ return;
327
+ }
328
+ }
329
+ teamState.worktreePath = worktreePath;
330
+ // Create session record for the team lead
331
+ let session;
332
+ try {
333
+ session = await createSession({
334
+ organizationId: config.organizationId,
335
+ roleId: role.id,
336
+ issueId: null,
337
+ focusId,
338
+ branchName,
339
+ sessionType: pendingDirective?.sessionType ?? 'coding',
340
+ });
341
+ teamState.leadSessionId = session.id;
342
+ }
343
+ catch (err) {
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);
347
+ return;
348
+ }
349
+ recordActivity();
350
+ // Build the team lead prompt.
351
+ // Priority: pending spawn directive > current stage directive > legacy full prompt.
352
+ // When a directive exists, compose: role framework + assembled directive content.
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
+ }
371
+ const promptContext = {
372
+ focusId,
373
+ focusName,
374
+ organizationId: config.organizationId,
375
+ productId: config.productId,
376
+ deliveries,
377
+ issues,
378
+ executionConfig,
379
+ pipelineConfig,
380
+ productContextDocs,
381
+ deploymentProfileSnapshot,
382
+ readOnly,
383
+ loopContext,
384
+ reviewFiledOpenCount,
385
+ };
386
+ let prompt;
387
+ let directiveModel = null;
388
+ if (pendingDirective && pendingDirective.message.trim()) {
389
+ // Spawn directive from directive-executor (e.g., review stage transition)
390
+ prompt = buildRoleFrameworkPrompt(role, promptContext)
391
+ + '\n\n'
392
+ + pendingDirective.message;
393
+ directiveModel = pendingDirective.model;
394
+ console.log(`[focus-executor] Using pending spawn directive for "${focusName}" ` +
395
+ `(${pendingDirective.message.length} chars directive, model: ${directiveModel ?? 'default'})`);
396
+ }
397
+ else {
398
+ // No pending directive -- check if the current stage has a directive in the DB.
399
+ // This handles the common case: initial spawn into "building" stage.
400
+ let stageDirectiveContent = null;
401
+ let stageDirectiveModel = null;
402
+ try {
403
+ const workflow = await fetchFocusWorkflow(focusId);
404
+ // Find the focus's current workflow stage. Query getActiveFocuses to
405
+ // get the current_workflow_stage_id, then match against the workflow stages.
406
+ const activeFocuses = await getActiveFocuses(config.organizationId, config.productId);
407
+ const focusRecord = activeFocuses.find(s => s.focus_id === focusId);
408
+ const currentStageId = focusRecord?.current_workflow_stage_id;
409
+ const currentStage = currentStageId
410
+ ? workflow.stages.find(s => s.id === currentStageId)
411
+ : workflow.stages.find(s => s.name === 'building'); // fallback
412
+ if (currentStage?.agentDirective) {
413
+ const directiveContent = await assembleDirectiveContent(config, focusId, currentStage.agentDirective, worktreePath);
414
+ if (directiveContent.trim()) {
415
+ stageDirectiveContent = directiveContent;
416
+ stageDirectiveModel = currentStage.agentDirective.model;
417
+ }
418
+ }
419
+ }
420
+ catch (err) {
421
+ console.debug(`[focus-executor] Could not fetch stage directive for "${focusName}" (falling back to legacy prompt):`, err.message);
422
+ }
423
+ if (stageDirectiveContent) {
424
+ prompt = buildRoleFrameworkPrompt(role, promptContext)
425
+ + '\n\n'
426
+ + stageDirectiveContent;
427
+ directiveModel = stageDirectiveModel;
428
+ console.log(`[focus-executor] Using stage directive for "${focusName}" (${stageDirectiveContent.length} chars)`);
429
+ }
430
+ else {
431
+ // Legacy fallback: full hardcoded prompt
432
+ prompt = buildFocusTeamPrompt(role, promptContext);
433
+ }
434
+ }
435
+ // Set up log file streams
436
+ const logs = setupTeamLogStreams(config.logDir, branchName, focusName);
437
+ // Build args and env
438
+ // Never resume when spawning for a directive (fresh session)
439
+ const resumeId = (pendingDirective || directiveModel) ? null : (lastClaudeSessionId ?? null);
440
+ // If a directive specifies a model override, use it
441
+ const effectivePipelineConfig = directiveModel
442
+ ? { ...pipelineConfig, model: directiveModel }
443
+ : pipelineConfig;
444
+ const args = buildTeamLeadArgs(config, effectivePipelineConfig, resumeId);
445
+ if (resumeId) {
446
+ console.log(`[focus-executor] Resuming Claude session ${resumeId} for "${focusName}"`);
447
+ }
448
+ const spawnEnv = buildSpawnEnvironment(config, {
449
+ orgId: config.organizationId,
450
+ focusId,
451
+ sessionId: session.id,
452
+ });
453
+ // Update session to starting
454
+ await updateSession(session.id, {
455
+ status: 'starting',
456
+ started_at: new Date().toISOString(),
457
+ stdout_path: logs.stdoutPath,
458
+ stderr_path: logs.stderrPath,
459
+ });
460
+ // Acquire governor slot (if governor is configured)
461
+ if (governor) {
462
+ try {
463
+ await governor.acquireSlot('focus');
464
+ }
465
+ catch (err) {
466
+ console.warn(`[focus-executor] Governor denied slot for "${focusName}":`, err.message);
467
+ // Mark session as failed so it doesn't linger in `starting` status
468
+ await updateSession(session.id, {
469
+ status: 'failed',
470
+ exit_reason: 'Governor denied slot',
471
+ exit_category: 'governor_denied',
472
+ ended_at: new Date().toISOString(),
473
+ }).catch(updateErr => {
474
+ console.warn(`[focus-executor] Failed to update session after governor denial:`, updateErr.message);
475
+ });
476
+ activeTeams.delete(focusId);
477
+ return;
478
+ }
479
+ }
480
+ // Spawn the team lead process
481
+ const proc = spawn(config.claudeCodePath, args, {
482
+ cwd: worktreePath,
483
+ env: spawnEnv,
484
+ stdio: ['pipe', 'pipe', 'pipe'],
485
+ });
486
+ teamState.leadPid = proc.pid ?? null;
487
+ teamState.leadStdin = proc.stdin;
488
+ teamState.phase = 'executing';
489
+ // Attach stream parser, completion detector, activity tracker, event handlers
490
+ const { completionDetector, activityTracker } = attachStreamHandlers({
491
+ proc, teamState, focusId, focusName, sessionId: session.id, logs,
492
+ });
493
+ // Send prompt via stdin (single message -- directive content is already composed in)
494
+ sendMessage(proc.stdin, prompt);
495
+ // Update session to running
496
+ await updateSession(session.id, {
497
+ status: 'running',
498
+ pid: proc.pid,
499
+ });
500
+ console.log(`[focus-executor] Team lead spawned for "${focusName}" (PID: ${proc.pid}, session: ${session.id})`);
501
+ // Handle completion -- check for more work or terminate.
502
+ // No idle phase: if actionable work remains, send it immediately (mid-focus
503
+ // handoff). If all work is done, terminate. A fresh team is spawned if new
504
+ // deliveries arrive later (~$0.50-1.00 exploration cost, but clean context).
505
+ completionDetector.on('complete', (info) => {
506
+ console.log(`[focus-executor] Team lead for "${focusName}" completed work cycle: ` +
507
+ `${info.turnCount} turns, $${info.totalCostUsd.toFixed(4)}`);
508
+ handleCompletionEvent({ focusId, focusName, teamState, completionDetector, proc, completionInfo: info }).catch(err => {
509
+ console.warn(`[focus-executor] Failed to check delivery state for "${focusName}":`, err.message);
510
+ // Fallback: terminate to avoid idle money burn.
511
+ terminateTeam(focusId);
512
+ });
513
+ });
514
+ // Handle process exit
515
+ const spawnedAt = Date.now();
516
+ proc.on('close', (code, signal) => {
517
+ handleTeamProcessClose({
518
+ code, signal, focusName, focusId, resumeId, spawnedAt,
519
+ teamState, sessionId: session.id, config, completionDetector,
520
+ activityTracker, logs, params, governor, spawnFocusTeam,
521
+ }).catch(err => {
522
+ console.error(`[focus-executor] handleTeamProcessClose failed for "${focusName}":`, err.message);
523
+ });
524
+ });
525
+ proc.on('error', async (err) => {
526
+ console.error(`[focus-executor] Team lead for "${focusName}" error:`, err.message);
527
+ // Release governor slot (if governor is configured)
528
+ governor?.releaseSlot('focus');
529
+ try {
530
+ await withRetry(() => updateSession(session.id, {
531
+ status: 'failed',
532
+ exit_reason: `Process error: ${err.message}`,
533
+ exit_category: 'error',
534
+ ended_at: new Date().toISOString(),
535
+ }), { maxAttempts: 3, baseDelayMs: 1000, label: 'session-update-error' });
536
+ }
537
+ catch (updateErr) {
538
+ console.warn(`[focus-executor] Failed to update session after retries:`, updateErr.message);
539
+ }
540
+ completionDetector.destroy();
541
+ logs.stdoutLogStream.end();
542
+ logs.stderrStream.end();
543
+ logs.jsonlStream.end();
544
+ // Worktree is focus-owned — do not remove on team error
545
+ teamState.phase = 'terminated';
546
+ activeTeams.delete(focusId);
547
+ });
548
+ }
549
+ //# 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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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Focus lifecycle management.
3
+ *
4
+ * Handles persistent worktree provisioning for active focuses and
5
+ * coordinated teardown when focuses are deactivated. Replaces the
6
+ * separate detectDeactivatedFocuses() and checkQaForDeactivatedFocuses()
7
+ * flows with a single unified lifecycle.
8
+ */
9
+ import type { DaemonConfig, AgentRole } from './types.js';
10
+ /**
11
+ * Ensure persistent worktrees exist for all active focuses.
12
+ *
13
+ * Called each poll cycle BEFORE processReadyFocuses(). Creates
14
+ * worktrees for active focuses that don't have one yet.
15
+ * Syncs integration with main once per cycle (not per focus).
16
+ */
17
+ export declare function ensureFocusWorktrees(config: DaemonConfig, roles: Map<string, AgentRole>): Promise<void>;
18
+ /**
19
+ * Tear down a single focus: stop QA, terminate team, remove worktree.
20
+ *
21
+ * Each step is independently try/caught so a failure in one
22
+ * does not prevent the others from running.
23
+ */
24
+ export declare function teardownFocus(config: DaemonConfig, focusId: string, focusName: string): Promise<void>;
25
+ /**
26
+ * Detect deactivated focuses and tear them down.
27
+ *
28
+ * Replaces both detectDeactivatedFocuses() from focus-executor.ts
29
+ * and checkQaForDeactivatedFocuses() from qa-orchestrator.ts.
30
+ * A single pass handles both team termination and QA cleanup.
31
+ */
32
+ export declare function checkForDeactivatedFocuses(config: DaemonConfig): Promise<void>;
33
+ /**
34
+ * Rebuild the focus-worktree-state after a daemon restart.
35
+ *
36
+ * Two-phase approach:
37
+ * Phase 1 (DB-first): If hydrateFromDb() populated the Map, validate
38
+ * each entry against disk and enrich with focus names. Removes
39
+ * stale entries (worktree deleted from disk) and cleans up entries
40
+ * for deactivated focuses.
41
+ * Phase 2 (disk fallback): Scans for agent-* directories NOT already
42
+ * in the Map. Covers first-run after migration and manually created
43
+ * worktrees. Matches by ID prefix against active focuses.
44
+ *
45
+ * Also removes legacy qa-* directories from the pre-persistent worktree era.
46
+ *
47
+ * Must run AFTER hydrateFromDb() and crash recovery but BEFORE startListeners().
48
+ */
49
+ export declare function rebuildFocusWorktreeState(config: DaemonConfig): Promise<void>;
50
+ /**
51
+ * Reconcile git state for active focus worktrees after startup.
52
+ *
53
+ * Checks all rebuilt focus worktrees and re-reports `worktree_active`
54
+ * for deliveries in coding/queued status. This ensures the DB reflects
55
+ * accurate git state even if previous reportGitState calls were lost
56
+ * (network blip, circuit breaker, daemon crash).
57
+ *
58
+ * Must run AFTER rebuildFocusWorktreeState().
59
+ */
60
+ export declare function reconcileGitState(_config: DaemonConfig): Promise<void>;
61
+ //# sourceMappingURL=focus-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-lifecycle.d.ts","sourceRoot":"","sources":["../src/focus-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAuB1D;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CA4Gf;AAID;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAqGf;AAED;;;;;;GAMG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CA0Df;AAID;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CA4Lf;AAID;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC,CAiCf"}