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