@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,459 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Focus team completion handling.
|
|
3
|
+
*
|
|
4
|
+
* Manages the post-execution lifecycle: advancing delivery statuses
|
|
5
|
+
* based on issue completion, merging the focus branch, cleaning up
|
|
6
|
+
* worktrees, and updating session records.
|
|
7
|
+
*/
|
|
8
|
+
import { filterWorkIssues, filterContextGroups, ACTIVE_WORK_STATUSES } from './constants.js';
|
|
9
|
+
import { updateSession, reportGitState, getDeliveryIssues, getDeliverySessionCount, updateIssueStatus, fetchEffectiveWorkflow, updateDeliveryStatus, getActiveFocuses, } from './supabase.js';
|
|
10
|
+
import { hasPendingSpawnDirective } from './directive-executor.js';
|
|
11
|
+
import { advanceDeliveryStage } from './delivery-lifecycle.js';
|
|
12
|
+
import { withRetry } from '@telora/daemon-core';
|
|
13
|
+
import { mergeFocusBranch, escalateMergeConflict } from './focus-merge.js';
|
|
14
|
+
import { mergeIntegrationToMain } from './git-merge.js';
|
|
15
|
+
import { recordSessionCompleted } from './agent-state.js';
|
|
16
|
+
import { triggerCheck } from './listener.js';
|
|
17
|
+
import { emitLoopTrigger } from './loop-event-bus.js';
|
|
18
|
+
import { getActiveTeams } from './focus-team-state.js';
|
|
19
|
+
import { commitWipChanges, worktreeHasUncommittedChanges, branchHasUnmergedCommits, runGitSync } from './git.js';
|
|
20
|
+
import { computeGitDiffStats } from './git-utils.js';
|
|
21
|
+
import { getFocusDeliveries, updateFocusStatus, fetchFocusWorkflowWithTransitions } from './queries/focuses.js';
|
|
22
|
+
// ── Stage classification (re-exported for consumers) ─────────────────
|
|
23
|
+
import { isStatusAgentActionable } from './stage-classifier.js';
|
|
24
|
+
export { isStatusTerminal, isStatusAgentActionable } from './stage-classifier.js';
|
|
25
|
+
// ── Merge gate ───────────────────────────────────────────────────────
|
|
26
|
+
/**
|
|
27
|
+
* Decide whether to attempt mergeFocusBranch on team exit.
|
|
28
|
+
*
|
|
29
|
+
* Skip merge when:
|
|
30
|
+
* - The team did not succeed (failed exit or unclean shutdown), OR
|
|
31
|
+
* - The team is still in its planning phase (no deliveries scoped, nothing
|
|
32
|
+
* to merge -- this covers cancellation mid-planning).
|
|
33
|
+
*
|
|
34
|
+
* Exported for unit testing the gate logic in isolation.
|
|
35
|
+
*/
|
|
36
|
+
export function shouldAttemptMerge(succeeded, teamState) {
|
|
37
|
+
return succeeded && !teamState.planningPhase;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Handle the team lead process exiting.
|
|
41
|
+
*
|
|
42
|
+
* Responsibilities:
|
|
43
|
+
* - Report git state for all known deliveries
|
|
44
|
+
* - Advance delivery statuses based on issue completion
|
|
45
|
+
* - Merge focus branch to integration (if successful)
|
|
46
|
+
* - Clean up worktree
|
|
47
|
+
* - Update session record
|
|
48
|
+
* - Record heartbeat counters
|
|
49
|
+
* - Trigger re-poll for next work
|
|
50
|
+
*/
|
|
51
|
+
export async function handleTeamCompletion(params) {
|
|
52
|
+
const { config, teamState, sessionId, code, signal } = params;
|
|
53
|
+
const { focusId, focusName, organizationId, branchName } = teamState;
|
|
54
|
+
const worktreePath = teamState.worktreePath;
|
|
55
|
+
const exitCode = code ?? 1;
|
|
56
|
+
// Proactive termination: when the daemon terminates a team because all work
|
|
57
|
+
// is done (no open issues, all deliveries terminal, etc.), it sets
|
|
58
|
+
// shutdownReason = 'work_complete' before sending SIGTERM.
|
|
59
|
+
// Node.js may report SIGTERM as either signal='SIGTERM' or code=143 (128+15)
|
|
60
|
+
const wasSigterm = signal === 'SIGTERM' || exitCode === 143;
|
|
61
|
+
const proactivelyTerminated = teamState.phase === 'shutting_down' &&
|
|
62
|
+
wasSigterm &&
|
|
63
|
+
teamState.shutdownReason === 'work_complete';
|
|
64
|
+
const succeeded = exitCode === 0 || proactivelyTerminated;
|
|
65
|
+
let exitReason = exitCode === 0
|
|
66
|
+
? 'Focus team completed.'
|
|
67
|
+
: proactivelyTerminated
|
|
68
|
+
? teamState.mergedDeliveryIds.size > 0
|
|
69
|
+
? `Focus team terminated: ${teamState.mergedDeliveryIds.size} deliveries merged.`
|
|
70
|
+
: 'Focus team terminated: all work complete.'
|
|
71
|
+
: signal
|
|
72
|
+
? `Team lead terminated by signal: ${signal}`
|
|
73
|
+
: `Team lead exited with code: ${exitCode}`;
|
|
74
|
+
// Fetch fresh delivery list to include mid-flight additions
|
|
75
|
+
let allDeliveries;
|
|
76
|
+
try {
|
|
77
|
+
allDeliveries = await getFocusDeliveries(focusId);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
console.warn(`[focus-executor] Failed to fetch deliveries for gitState reporting, falling back to knownDeliveryIds:`, err.message);
|
|
81
|
+
// Empty knownDeliveryIds (planning teams that exited without scoping) yields
|
|
82
|
+
// an empty fallback array -- subsequent loops are intentional no-ops.
|
|
83
|
+
allDeliveries = [...teamState.knownDeliveryIds].map(id => ({
|
|
84
|
+
id, name: '', description: null, priorityRank: 0,
|
|
85
|
+
executionStatus: 'coding', acceptanceCriteria: null,
|
|
86
|
+
techContext: null, currentWorkflowStageId: null,
|
|
87
|
+
mergeCommitSha: null, gitState: null,
|
|
88
|
+
stageDescription: null,
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
// Only report git state for deliveries the team actually worked on:
|
|
92
|
+
// those in coding status (not queued — queued means work never started),
|
|
93
|
+
// excluding already-merged ones.
|
|
94
|
+
const workedDeliveryIds = allDeliveries
|
|
95
|
+
.filter(d => d.executionStatus === 'coding' &&
|
|
96
|
+
!teamState.mergedDeliveryIds.has(d.id))
|
|
97
|
+
.map(d => d.id);
|
|
98
|
+
// Report worktree_complete for worked deliveries only
|
|
99
|
+
for (const deliveryId of workedDeliveryIds) {
|
|
100
|
+
reportGitState(deliveryId, 'worktree_complete').catch(err => console.warn(`[focus-executor] reportGitState worktree_complete failed for ${deliveryId}:`, err.message));
|
|
101
|
+
}
|
|
102
|
+
// ── Read-only audit safety net ──────────────────────────────────
|
|
103
|
+
// If this was a read-only session, revert any file modifications and
|
|
104
|
+
// block merging if the agent somehow committed despite the pre-commit hook.
|
|
105
|
+
if (teamState.readOnly) {
|
|
106
|
+
// Revert any uncommitted changes
|
|
107
|
+
const hasChanges = worktreeHasUncommittedChanges(worktreePath);
|
|
108
|
+
if (hasChanges) {
|
|
109
|
+
console.warn(`[focus-executor] Read-only audit "${focusName}" left uncommitted changes. Reverting.`);
|
|
110
|
+
runGitSync(['checkout', '.'], worktreePath);
|
|
111
|
+
runGitSync(['clean', '-fd'], worktreePath);
|
|
112
|
+
}
|
|
113
|
+
// Check if the agent somehow committed (bypassed hook)
|
|
114
|
+
if (branchHasUnmergedCommits(branchName, config.integrationBranch, config.repoPath)) {
|
|
115
|
+
console.error(`[focus-executor] READ-ONLY VIOLATION: Audit "${focusName}" has commits on ${branchName}. ` +
|
|
116
|
+
`These will NOT be merged. Manual review required.`);
|
|
117
|
+
exitReason = `Read-only audit violation: commits detected on ${branchName}. Merge skipped.`;
|
|
118
|
+
// Update session as failed due to read-only violation
|
|
119
|
+
try {
|
|
120
|
+
await withRetry(() => updateSession(sessionId, {
|
|
121
|
+
status: 'failed',
|
|
122
|
+
exit_reason: exitReason,
|
|
123
|
+
exit_category: 'error',
|
|
124
|
+
ended_at: new Date().toISOString(),
|
|
125
|
+
}), { maxAttempts: 3, baseDelayMs: 1000, label: 'session-update-readonly-violation' });
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
console.warn(`[focus-executor] Failed to update session after retries:`, err.message);
|
|
129
|
+
}
|
|
130
|
+
// Record heartbeat and clean up
|
|
131
|
+
recordSessionCompleted(0, 0);
|
|
132
|
+
const activeTeams = getActiveTeams();
|
|
133
|
+
teamState.phase = 'terminated';
|
|
134
|
+
activeTeams.delete(focusId);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Commit any uncommitted WIP changes left by the agent (crash, kill, timeout).
|
|
139
|
+
// Only needed when the agent didn't exit cleanly — a clean exit means the
|
|
140
|
+
// agent committed its own work.
|
|
141
|
+
if (!succeeded) {
|
|
142
|
+
try {
|
|
143
|
+
commitWipChanges(worktreePath, focusName);
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
console.warn(`[focus-executor] WIP commit failed for "${focusName}": ${err.message}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Advance delivery statuses based on issue completion
|
|
150
|
+
if (succeeded) {
|
|
151
|
+
await advanceDeliveryStatuses(config, teamState, sessionId);
|
|
152
|
+
}
|
|
153
|
+
// Merge focus branch to integration if team succeeded.
|
|
154
|
+
// For proactive terminations, this is a no-op merge since all deliveries
|
|
155
|
+
// were already merged mid-flight. The merge still runs for safety
|
|
156
|
+
// (handles any commits the team lead made after the last incremental merge).
|
|
157
|
+
// Pass workedDeliveryIds so git state is only reported for deliveries
|
|
158
|
+
// that were actually in coding status (not queued deliveries that never started).
|
|
159
|
+
//
|
|
160
|
+
// Planning-phase exit: if the team exited while still in planning (no
|
|
161
|
+
// deliveries scoped), skip the merge entirely. There is nothing to merge
|
|
162
|
+
// and the merge guard would early-return anyway. Skipping makes the cleanup
|
|
163
|
+
// path explicit for cancellation mid-planning.
|
|
164
|
+
let mergeSucceeded = false;
|
|
165
|
+
if (shouldAttemptMerge(succeeded, teamState)) {
|
|
166
|
+
const mergeResult = await mergeFocusBranch(config, teamState, sessionId, branchName, workedDeliveryIds);
|
|
167
|
+
mergeSucceeded = mergeResult.mergeSucceeded;
|
|
168
|
+
if (mergeResult.exitReason) {
|
|
169
|
+
exitReason += ` ${mergeResult.exitReason}`;
|
|
170
|
+
}
|
|
171
|
+
// Escalate merge failure for worked deliveries only
|
|
172
|
+
if (!mergeSucceeded) {
|
|
173
|
+
for (const deliveryId of workedDeliveryIds) {
|
|
174
|
+
if (!teamState.mergedDeliveryIds.has(deliveryId)) {
|
|
175
|
+
escalateMergeConflict({
|
|
176
|
+
organizationId,
|
|
177
|
+
sessionId,
|
|
178
|
+
deliveryId,
|
|
179
|
+
deliveryName: focusName,
|
|
180
|
+
branchName,
|
|
181
|
+
integrationBranch: config.integrationBranch,
|
|
182
|
+
mergeError: mergeResult.exitReason,
|
|
183
|
+
}).catch(err => console.warn(`[focus-executor] escalateMergeConflict failed for ${deliveryId}:`, err.message));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// ── CI: merge integration → main ──────────────────────────────
|
|
189
|
+
// When CI is enabled, merge the integration branch into main after
|
|
190
|
+
// a successful focus merge. CD additionally pushes main to remote.
|
|
191
|
+
if (mergeSucceeded && teamState.pipelineConfig?.ci?.enabled) {
|
|
192
|
+
const pushToRemote = teamState.pipelineConfig?.cd?.enabled ?? false;
|
|
193
|
+
const ciLabel = pushToRemote ? 'CI+CD' : 'CI';
|
|
194
|
+
console.log(`[${ciLabel}] Merging integration to main for "${focusName}"${pushToRemote ? ' (will push to remote)' : ''}`);
|
|
195
|
+
try {
|
|
196
|
+
const ciResult = await mergeIntegrationToMain({
|
|
197
|
+
config,
|
|
198
|
+
focusName,
|
|
199
|
+
pushToRemote,
|
|
200
|
+
});
|
|
201
|
+
if (ciResult.success) {
|
|
202
|
+
console.log(`[${ciLabel}] Successfully merged integration to main for "${focusName}"`);
|
|
203
|
+
// Update git state for worked deliveries
|
|
204
|
+
for (const deliveryId of workedDeliveryIds) {
|
|
205
|
+
const newState = pushToRemote ? 'pushed_to_remote' : 'merged_to_main';
|
|
206
|
+
reportGitState(deliveryId, newState).catch(err => console.warn(`[${ciLabel}] reportGitState ${newState} failed for ${deliveryId}:`, err.message));
|
|
207
|
+
}
|
|
208
|
+
exitReason += ` ${ciLabel}: merged to main${pushToRemote ? ' and pushed to remote' : ''}.`;
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
console.error(`[${ciLabel}] Failed to merge integration to main for "${focusName}": ${ciResult.error}`);
|
|
212
|
+
exitReason += ` ${ciLabel} failed: ${ciResult.error}`;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
console.error(`[${ciLabel}] Error merging integration to main for "${focusName}":`, err.message);
|
|
217
|
+
exitReason += ` ${ciLabel} error: ${err.message}`;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Worktree is focus-owned — do NOT remove on team completion.
|
|
221
|
+
// It persists for the next team session or QA use.
|
|
222
|
+
// Removal only happens via coordinated teardown when focus is deactivated.
|
|
223
|
+
// Compute git diff stats from all commits on this branch since integration
|
|
224
|
+
let diffStats = { linesAdded: 0, linesRemoved: 0 };
|
|
225
|
+
try {
|
|
226
|
+
diffStats = computeGitDiffStats(worktreePath, `${config.integrationBranch}..${branchName}`);
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
console.debug(`[focus-executor] Failed to compute git diff stats for "${focusName}":`, err.message);
|
|
230
|
+
}
|
|
231
|
+
// Determine exit category for failed sessions
|
|
232
|
+
const exitCategory = succeeded
|
|
233
|
+
? null
|
|
234
|
+
: teamState.shutdownReason === 'user_stopped'
|
|
235
|
+
? 'user_stopped'
|
|
236
|
+
: 'error';
|
|
237
|
+
// Update session
|
|
238
|
+
try {
|
|
239
|
+
await withRetry(() => updateSession(sessionId, {
|
|
240
|
+
status: succeeded ? 'completed' : 'failed',
|
|
241
|
+
exit_reason: exitReason,
|
|
242
|
+
...(exitCategory ? { exit_category: exitCategory } : {}),
|
|
243
|
+
ended_at: new Date().toISOString(),
|
|
244
|
+
lines_added: diffStats.linesAdded,
|
|
245
|
+
lines_removed: diffStats.linesRemoved,
|
|
246
|
+
}), { maxAttempts: 3, baseDelayMs: 1000, label: 'session-update-completion' });
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
console.warn(`[focus-executor] Failed to update session after retries:`, err.message);
|
|
250
|
+
}
|
|
251
|
+
// Review exit handler: if the focus is in in_review when the review
|
|
252
|
+
// team exits, route deliveries based on outcome:
|
|
253
|
+
// - Deliveries with open issues → iterating (review found gaps)
|
|
254
|
+
// - Deliveries with no open issues → done (review passed)
|
|
255
|
+
// Then move the focus back to verify.
|
|
256
|
+
try {
|
|
257
|
+
const focuses = await getActiveFocuses(organizationId, teamState.productId);
|
|
258
|
+
const current = focuses.find(s => s.focus_id === focusId);
|
|
259
|
+
if (current?.status === 'in_review') {
|
|
260
|
+
// If a spawn directive is pending, the team was terminated to make room
|
|
261
|
+
// for a new team (e.g., directive executor spawning the review team).
|
|
262
|
+
// Don't run the review exit handler — the new team will handle it.
|
|
263
|
+
if (hasPendingSpawnDirective(focusId)) {
|
|
264
|
+
console.log(`[focus-executor] Skipping review exit handler for "${focusName}" -- pending spawn directive`);
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
// Route in_review deliveries based on review outcome:
|
|
268
|
+
// - Has open issues (review found gaps) → iterating
|
|
269
|
+
// - No open issues (review passed) → done
|
|
270
|
+
const reviewDeliveries = await getFocusDeliveries(focusId);
|
|
271
|
+
for (const d of reviewDeliveries) {
|
|
272
|
+
if (d.executionStatus === 'in_review') {
|
|
273
|
+
try {
|
|
274
|
+
const [issues, dWorkflow] = await Promise.all([
|
|
275
|
+
getDeliveryIssues(d.id),
|
|
276
|
+
fetchEffectiveWorkflow(d.id),
|
|
277
|
+
]);
|
|
278
|
+
const workIssues = filterWorkIssues(issues);
|
|
279
|
+
const openWork = workIssues.filter(i => ACTIVE_WORK_STATUSES.has(i.status));
|
|
280
|
+
if (openWork.length > 0) {
|
|
281
|
+
// Review created issues — send back to iterating for the team to address
|
|
282
|
+
const iteratingStage = dWorkflow.stages.find(s => s.name === 'iterating');
|
|
283
|
+
await updateDeliveryStatus(d.id, 'iterating', iteratingStage?.id ?? null);
|
|
284
|
+
console.log(`[focus-executor] Delivery "${d.name}" moved from in_review to iterating: ${openWork.length} open issue(s)`);
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
// Review passed — move to done
|
|
288
|
+
const doneStage = dWorkflow.stages.find(s => s.name === 'done');
|
|
289
|
+
await updateDeliveryStatus(d.id, 'done', doneStage?.id ?? null);
|
|
290
|
+
console.log(`[focus-executor] Delivery "${d.name}" moved from in_review to done (review passed)`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
catch (err) {
|
|
294
|
+
console.warn(`[focus-executor] Failed to route delivery "${d.name}" after review: ${err.message}`);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
// Move focus back to verify
|
|
299
|
+
const workflow = await fetchFocusWorkflowWithTransitions(focusId);
|
|
300
|
+
const verifyStage = workflow.stages.find(s => s.name === 'verify');
|
|
301
|
+
if (verifyStage) {
|
|
302
|
+
await updateFocusStatus(focusId, 'verify', verifyStage.id, { reviewRequestedAt: null });
|
|
303
|
+
console.log(`[focus-executor] Review complete for "${focusName}" -- focus moved to verify`);
|
|
304
|
+
emitLoopTrigger({
|
|
305
|
+
type: 'review_completed',
|
|
306
|
+
focusId,
|
|
307
|
+
detail: `review complete -- "${focusName}" moved to verify`,
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
} // end if !hasPendingSpawnDirective
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
catch (err) {
|
|
314
|
+
console.warn(`[focus-executor] Review exit handler failed for "${focusName}":`, err.message);
|
|
315
|
+
}
|
|
316
|
+
// Record heartbeat
|
|
317
|
+
recordSessionCompleted(0, 0);
|
|
318
|
+
// Clean up team state
|
|
319
|
+
const activeTeams = getActiveTeams();
|
|
320
|
+
teamState.phase = 'terminated';
|
|
321
|
+
activeTeams.delete(focusId);
|
|
322
|
+
// Trigger re-poll to pick up next work
|
|
323
|
+
if (succeeded) {
|
|
324
|
+
triggerCheck();
|
|
325
|
+
}
|
|
326
|
+
console.log(`[focus-executor] Team for "${focusName}" cleaned up (merge: ${mergeSucceeded ? 'yes' : 'no'})`);
|
|
327
|
+
}
|
|
328
|
+
const defaultDeps = {
|
|
329
|
+
getFocusDeliveries,
|
|
330
|
+
getDeliveryIssues,
|
|
331
|
+
getDeliverySessionCount,
|
|
332
|
+
updateIssueStatus,
|
|
333
|
+
fetchEffectiveWorkflow,
|
|
334
|
+
updateDeliveryStatus,
|
|
335
|
+
advanceDeliveryStage,
|
|
336
|
+
};
|
|
337
|
+
/**
|
|
338
|
+
* Advance delivery statuses after team completion.
|
|
339
|
+
*
|
|
340
|
+
* Re-queries all deliveries for the focus from the database rather
|
|
341
|
+
* than relying on the spawn-time snapshot in teamState.knownDeliveryIds.
|
|
342
|
+
* This ensures deliveries added mid-flight (after the team was spawned)
|
|
343
|
+
* are discovered and advanced, and that stale deliveryStageIds don't
|
|
344
|
+
* cause deliveries to be skipped.
|
|
345
|
+
*
|
|
346
|
+
* For each delivery in 'coding' status:
|
|
347
|
+
* - All issues Done (or no issues): advance via workflow (coding -> verify -> done)
|
|
348
|
+
* - Open issues remain: re-queue to 'queued' so the next team session picks it up
|
|
349
|
+
*/
|
|
350
|
+
export async function advanceDeliveryStatuses(config, teamState, sessionId, deps = defaultDeps) {
|
|
351
|
+
// Re-query deliveries fresh from the DB to discover mid-flight additions
|
|
352
|
+
let deliveries;
|
|
353
|
+
try {
|
|
354
|
+
deliveries = await deps.getFocusDeliveries(teamState.focusId);
|
|
355
|
+
}
|
|
356
|
+
catch (err) {
|
|
357
|
+
console.warn(`[focus-executor] Failed to fetch deliveries for focus ${teamState.focusId}:`, err.message);
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
for (const delivery of deliveries) {
|
|
361
|
+
// Skip deliveries that were already merged mid-flight
|
|
362
|
+
if (teamState.mergedDeliveryIds.has(delivery.id)) {
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
// Only advance deliveries in agent-actionable status.
|
|
366
|
+
if (!isStatusAgentActionable(delivery.executionStatus ?? '')) {
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
try {
|
|
370
|
+
const [issues, sessionCount, workflow] = await Promise.all([
|
|
371
|
+
deps.getDeliveryIssues(delivery.id),
|
|
372
|
+
deps.getDeliverySessionCount(delivery.id),
|
|
373
|
+
deps.fetchEffectiveWorkflow(delivery.id),
|
|
374
|
+
]);
|
|
375
|
+
// Context Groups are reference material, not actionable work — exclude from open count
|
|
376
|
+
const workIssues = filterWorkIssues(issues);
|
|
377
|
+
const contextGroups = filterContextGroups(issues);
|
|
378
|
+
const openCount = workIssues.filter(i => i.status !== 'Done').length;
|
|
379
|
+
const totalWork = workIssues.length;
|
|
380
|
+
// Use currentWorkflowStageId from the fresh query, falling back to
|
|
381
|
+
// the teamState cache for deliveries known at spawn time
|
|
382
|
+
const currentStageId = delivery.currentWorkflowStageId
|
|
383
|
+
?? teamState.deliveryStageIds.get(delivery.id)
|
|
384
|
+
?? null;
|
|
385
|
+
if (!currentStageId) {
|
|
386
|
+
console.warn(`[focus-executor] Delivery ${delivery.id}: no workflow stage ID, skipping advance`);
|
|
387
|
+
continue;
|
|
388
|
+
}
|
|
389
|
+
// Re-queue deliveries with open work issues so the next team picks them up
|
|
390
|
+
if (totalWork > 0 && openCount > 0) {
|
|
391
|
+
// Already queued — leave it there
|
|
392
|
+
if (delivery.executionStatus === 'queued') {
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
const queuedStage = workflow.stages.find(s => s.name === 'queued');
|
|
396
|
+
if (queuedStage) {
|
|
397
|
+
console.log(`[focus-executor] Delivery ${delivery.id}: ${openCount}/${totalWork} work issues still open, re-queuing`);
|
|
398
|
+
await deps.updateDeliveryStatus(delivery.id, 'queued', queuedStage.id);
|
|
399
|
+
teamState.deliveryStageIds.set(delivery.id, queuedStage.id);
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
console.warn(`[focus-executor] Delivery ${delivery.id}: ${openCount}/${totalWork} work issues still open, no queued stage in workflow — leaving in ${delivery.executionStatus}`);
|
|
403
|
+
}
|
|
404
|
+
continue;
|
|
405
|
+
}
|
|
406
|
+
// Auto-close Context Groups when all work issues are done
|
|
407
|
+
for (const cg of contextGroups) {
|
|
408
|
+
if (cg.status !== 'Done') {
|
|
409
|
+
try {
|
|
410
|
+
await deps.updateIssueStatus(cg.id, 'Done');
|
|
411
|
+
console.log(`[focus-executor] Auto-closed Context Group "${cg.title}" (all work issues done)`);
|
|
412
|
+
}
|
|
413
|
+
catch (err) {
|
|
414
|
+
console.warn(`[focus-executor] Failed to auto-close Context Group "${cg.title}":`, err.message);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
// If delivery is queued, step through coding first (workflow doesn't
|
|
419
|
+
// allow queued -> verify directly). Update the stage ID for the
|
|
420
|
+
// subsequent advance call.
|
|
421
|
+
let effectiveStageId = currentStageId;
|
|
422
|
+
if (delivery.executionStatus === 'queued') {
|
|
423
|
+
const codingStage = workflow.stages.find(s => s.name === 'coding');
|
|
424
|
+
if (codingStage) {
|
|
425
|
+
console.log(`[focus-executor] Delivery ${delivery.id}: stepping queued -> coding before verify advance`);
|
|
426
|
+
await deps.updateDeliveryStatus(delivery.id, 'coding', codingStage.id);
|
|
427
|
+
effectiveStageId = codingStage.id;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
console.log(`[focus-executor] Delivery ${delivery.id}: ${totalWork === 0 ? 'no issues' : `all ${totalWork} work issues done`}, advancing via workflow`);
|
|
431
|
+
const result = await deps.advanceDeliveryStage({
|
|
432
|
+
deliveryId: delivery.id,
|
|
433
|
+
deliveryName: delivery.name,
|
|
434
|
+
organizationId: teamState.organizationId,
|
|
435
|
+
workflow,
|
|
436
|
+
currentStageId: effectiveStageId,
|
|
437
|
+
exitCode: 0,
|
|
438
|
+
openIssueCount: openCount,
|
|
439
|
+
sessionCount,
|
|
440
|
+
policyFailureMode: config.policyFailureMode,
|
|
441
|
+
sessionId,
|
|
442
|
+
});
|
|
443
|
+
// Track the new stage ID for potential future advances
|
|
444
|
+
teamState.deliveryStageIds.set(delivery.id, result.deliveryStageId ?? null);
|
|
445
|
+
// Notify loop engine of delivery completion (verify or done)
|
|
446
|
+
if (result.advanced && (result.deliveryStatus === 'verify' || result.deliveryStatus === 'done')) {
|
|
447
|
+
emitLoopTrigger({
|
|
448
|
+
type: 'delivery_completed',
|
|
449
|
+
focusId: teamState.focusId,
|
|
450
|
+
detail: `${delivery.name} -> ${result.deliveryStatus}`,
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
catch (err) {
|
|
455
|
+
console.warn(`[focus-executor] Failed to check/advance delivery ${delivery.id}:`, err.message);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
//# sourceMappingURL=focus-completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-completion.js","sourceRoot":"","sources":["../src/focus-completion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FocusEngine -- ExecutionEngine adapter for the focus-based daemon.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the existing daemon modules (listener, heartbeat, spawner, git, etc.)
|
|
5
|
+
* behind the ExecutionEngine interface from @telora/daemon-core. This allows
|
|
6
|
+
* the unified process shell to manage the focus engine without knowing
|
|
7
|
+
* its internals.
|
|
8
|
+
*
|
|
9
|
+
* Lifecycle (called by the process shell):
|
|
10
|
+
* 1. init(config) -- validate, connect to Supabase, init git
|
|
11
|
+
* 2. recoverFromCrash() -- reconcile orphaned state from previous run
|
|
12
|
+
* 3. start() -- begin polling loops and heartbeat
|
|
13
|
+
* 4. stop() -- stop accepting new work
|
|
14
|
+
* 5. shutdown() -- graceful cleanup (kill teams, WIP commit, drain)
|
|
15
|
+
*/
|
|
16
|
+
import type { ExecutionEngine, EngineHealth, ResourceUsage, BaseConfig } from '@telora/daemon-core';
|
|
17
|
+
import { ResourceGovernor } from '@telora/daemon-core';
|
|
18
|
+
export declare class FocusEngine implements ExecutionEngine {
|
|
19
|
+
readonly name = "focus";
|
|
20
|
+
/** Daemon config, set during init(). */
|
|
21
|
+
private config;
|
|
22
|
+
/** Optional resource governor for global concurrency limiting. */
|
|
23
|
+
private governor;
|
|
24
|
+
/** Interval handles for periodic tasks (cleared in stop/shutdown). */
|
|
25
|
+
private intervals;
|
|
26
|
+
/** Last scanned timestamp for git activity per product (reset on restart). */
|
|
27
|
+
private lastGitScanTimestamps;
|
|
28
|
+
/**
|
|
29
|
+
* Inject a ResourceGovernor for global concurrency limiting.
|
|
30
|
+
* Called by the process shell after construction but before start().
|
|
31
|
+
*/
|
|
32
|
+
setGovernor(gov: ResourceGovernor): void;
|
|
33
|
+
init(config: BaseConfig & Record<string, unknown>): Promise<void>;
|
|
34
|
+
recoverFromCrash(): Promise<void>;
|
|
35
|
+
start(): Promise<void>;
|
|
36
|
+
private scanAndUpsertGitActivity;
|
|
37
|
+
stop(): void;
|
|
38
|
+
shutdown(): Promise<void>;
|
|
39
|
+
healthCheck(): EngineHealth;
|
|
40
|
+
getResourceUsage(): ResourceUsage;
|
|
41
|
+
/**
|
|
42
|
+
* Assert that config has been set (init() was called) and return it.
|
|
43
|
+
* Throws a clear error if called before init().
|
|
44
|
+
*/
|
|
45
|
+
private requireConfig;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=focus-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-engine.d.ts","sourceRoot":"","sources":["../src/focus-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,aAAa,EACb,UAAU,EACX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAA2B,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AA0ChF,qBAAa,WAAY,YAAW,eAAe;IACjD,QAAQ,CAAC,IAAI,WAAW;IAExB,wCAAwC;IACxC,OAAO,CAAC,MAAM,CAA6B;IAE3C,kEAAkE;IAClE,OAAO,CAAC,QAAQ,CAAiC;IAEjD,sEAAsE;IACtE,OAAO,CAAC,SAAS,CAAwC;IAEzD,8EAA8E;IAC9E,OAAO,CAAC,qBAAqB,CAA6B;IAE1D;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI;IAUlC,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCjE,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoGjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAkEd,wBAAwB;IA+BtC,IAAI,IAAI,IAAI;IAeN,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAsH/B,WAAW,IAAI,YAAY;IA0D3B,gBAAgB,IAAI,aAAa;IAwBjC;;;OAGG;IACH,OAAO,CAAC,aAAa;CAStB"}
|