@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.
- 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 +15 -15
- package/dist/directive-executor.d.ts.map +1 -1
- package/dist/directive-executor.js +76 -76
- 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/focus-completion.d.ts +85 -0
- package/dist/focus-completion.d.ts.map +1 -0
- package/dist/focus-completion.js +459 -0
- package/dist/focus-completion.js.map +1 -0
- package/dist/focus-engine.d.ts +47 -0
- package/dist/focus-engine.d.ts.map +1 -0
- package/dist/focus-engine.js +421 -0
- 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/focus-executor.js +549 -0
- 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/focus-lifecycle.js +544 -0
- package/dist/focus-lifecycle.js.map +1 -0
- package/dist/focus-merge.d.ts +77 -0
- package/dist/focus-merge.d.ts.map +1 -0
- package/dist/focus-merge.js +378 -0
- package/dist/focus-merge.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/focus-prompt-builder.js +138 -0
- 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/focus-spawn-helpers.d.ts +67 -0
- package/dist/focus-spawn-helpers.d.ts.map +1 -0
- package/dist/focus-spawn-helpers.js +160 -0
- package/dist/focus-spawn-helpers.js.map +1 -0
- package/dist/focus-team-lifecycle.d.ts +50 -0
- package/dist/focus-team-lifecycle.d.ts.map +1 -0
- package/dist/focus-team-lifecycle.js +256 -0
- 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/focus-team-state.js +43 -0
- 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/focus-worktree-state.js +104 -0
- 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 +17 -15
- package/dist/planning-prompt-builder.d.ts.map +1 -1
- package/dist/planning-prompt-builder.js +34 -32
- 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 +28 -24
- package/dist/queries/deliveries.d.ts.map +1 -1
- package/dist/queries/deliveries.js +32 -28
- package/dist/queries/deliveries.js.map +1 -1
- package/dist/queries/focuses.d.ts +97 -0
- package/dist/queries/focuses.d.ts.map +1 -0
- package/dist/queries/focuses.js +136 -0
- 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 +40 -34
- package/dist/queries/schemas.d.ts.map +1 -1
- package/dist/queries/schemas.js +31 -26
- 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/strategy-completion-event.d.ts +37 -3
- package/dist/strategy-completion-event.d.ts.map +1 -1
- package/dist/strategy-completion-event.js +78 -9
- package/dist/strategy-completion-event.js.map +1 -1
- package/dist/strategy-completion.d.ts +11 -0
- package/dist/strategy-completion.d.ts.map +1 -1
- package/dist/strategy-completion.js +22 -1
- package/dist/strategy-completion.js.map +1 -1
- package/dist/strategy-executor.d.ts.map +1 -1
- package/dist/strategy-executor.js +46 -14
- package/dist/strategy-executor.js.map +1 -1
- package/dist/strategy-merge.d.ts.map +1 -1
- package/dist/strategy-merge.js +4 -0
- package/dist/strategy-merge.js.map +1 -1
- package/dist/strategy-team-lifecycle.d.ts.map +1 -1
- package/dist/strategy-team-lifecycle.js +3 -0
- package/dist/strategy-team-lifecycle.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 +59 -19
- package/dist/team-prompt-base.d.ts.map +1 -1
- package/dist/team-prompt-base.js +206 -25
- 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 +87 -83
- 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/focus.d.ts +214 -0
- 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/types/strategy.d.ts +7 -0
- package/dist/types/strategy.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-focus.d.ts +69 -0
- package/dist/worktree-focus.d.ts.map +1 -0
- package/dist/worktree-focus.js +214 -0
- 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 +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"}
|