@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,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Focus team prompt builder.
|
|
3
3
|
*
|
|
4
4
|
* The core prompt building logic lives in team-prompt-base.ts (section builders
|
|
5
|
-
* +
|
|
5
|
+
* + buildFocusTeamPrompt). This file re-exports the main entry points for
|
|
6
6
|
* backward compatibility and houses buildWakeMessage (wake-only, not part of
|
|
7
7
|
* the role framework).
|
|
8
8
|
*
|
|
@@ -10,7 +10,58 @@
|
|
|
10
10
|
* and are re-exported here for backward compatibility.
|
|
11
11
|
*/
|
|
12
12
|
import { isStatusAgentActionable } from './stage-classifier.js';
|
|
13
|
-
export {
|
|
13
|
+
export { buildFocusTeamPrompt } from './team-prompt-base.js';
|
|
14
|
+
/**
|
|
15
|
+
* Build a re-engagement message listing all non-terminal deliveries that
|
|
16
|
+
* the team must finish, scope, or cancel before the focus can wind down.
|
|
17
|
+
*
|
|
18
|
+
* Unlike `buildWakeMessage` (which only lists agent-actionable deliveries),
|
|
19
|
+
* this message includes deliveries in `planning`, `iterating`, and other
|
|
20
|
+
* non-terminal states so the team is reminded that work is still pending.
|
|
21
|
+
* Used by the scope-coverage guard when the focus executor would
|
|
22
|
+
* otherwise idle-terminate while non-terminal deliveries remain.
|
|
23
|
+
*/
|
|
24
|
+
export function buildReEngagementMessage(nonTerminalDeliveries, issues) {
|
|
25
|
+
const parts = [];
|
|
26
|
+
parts.push('## Remaining Work -- Scope, Finish, or Cancel');
|
|
27
|
+
parts.push('');
|
|
28
|
+
parts.push('The focus still has non-terminal deliveries. The team must');
|
|
29
|
+
parts.push('finish, scope, or cancel each one before the focus can wind');
|
|
30
|
+
parts.push('down. Do not exit. Pick the highest-priority delivery (lowest');
|
|
31
|
+
parts.push('priorityRank) and continue from there.');
|
|
32
|
+
parts.push('');
|
|
33
|
+
const sorted = [...nonTerminalDeliveries].sort((a, b) => a.priorityRank - b.priorityRank);
|
|
34
|
+
for (const delivery of sorted) {
|
|
35
|
+
parts.push(`### ${delivery.name} [${delivery.executionStatus ?? 'draft'}]`);
|
|
36
|
+
parts.push(`**Delivery ID:** ${delivery.id} | **Rank:** ${delivery.priorityRank}`);
|
|
37
|
+
if (delivery.description) {
|
|
38
|
+
parts.push(`**Description:** ${delivery.description}`);
|
|
39
|
+
}
|
|
40
|
+
const deliveryIssues = issues.filter(i => i.deliveryId === delivery.id);
|
|
41
|
+
const workIssues = deliveryIssues.filter(i => i.issueType !== 'Context Group');
|
|
42
|
+
if (workIssues.length === 0) {
|
|
43
|
+
parts.push('**Issues:** none scoped yet');
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
const statusCounts = new Map();
|
|
47
|
+
for (const issue of workIssues) {
|
|
48
|
+
statusCounts.set(issue.status, (statusCounts.get(issue.status) ?? 0) + 1);
|
|
49
|
+
}
|
|
50
|
+
const countParts = [];
|
|
51
|
+
for (const s of ['To Do', 'In Progress', 'Done', 'Blocked', 'In Review']) {
|
|
52
|
+
const count = statusCounts.get(s);
|
|
53
|
+
if (count !== undefined) {
|
|
54
|
+
countParts.push(`${count} ${s}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
parts.push(`**Issues (${countParts.join(', ')}):**`);
|
|
58
|
+
}
|
|
59
|
+
parts.push('');
|
|
60
|
+
}
|
|
61
|
+
parts.push('Do NOT poll. The daemon will send the next message when state changes.');
|
|
62
|
+
parts.push('');
|
|
63
|
+
return parts.join('\n');
|
|
64
|
+
}
|
|
14
65
|
/**
|
|
15
66
|
* Build a wake message for an idle team when new work is available.
|
|
16
67
|
*
|
|
@@ -84,4 +135,4 @@ export function buildWakeMessage(deliveries, issues, knownDeliveryIds) {
|
|
|
84
135
|
return parts.join('\n');
|
|
85
136
|
}
|
|
86
137
|
export { buildPlanningPass1Prompt, buildPlanningPass2Prompt, buildPlanningCombinedPrompt } from './planning-prompt-builder.js';
|
|
87
|
-
//# sourceMappingURL=
|
|
138
|
+
//# sourceMappingURL=focus-prompt-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-prompt-builder.js","sourceRoot":"","sources":["../src/focus-prompt-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent worktree provisioning for active focuses.
|
|
3
|
+
*
|
|
4
|
+
* Creates worktrees for active focuses that don't have one yet,
|
|
5
|
+
* adopts existing worktrees on disk, and rebases onto integration.
|
|
6
|
+
*/
|
|
7
|
+
import type { DaemonConfig, AgentRole } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Ensure persistent worktrees exist for all active focuses.
|
|
10
|
+
*
|
|
11
|
+
* Called each poll cycle BEFORE processReadyFocuses(). Creates
|
|
12
|
+
* worktrees for active focuses that don't have one yet.
|
|
13
|
+
* Syncs integration with main once per cycle (not per focus).
|
|
14
|
+
*/
|
|
15
|
+
export declare function ensureFocusWorktrees(config: DaemonConfig, roles: Map<string, AgentRole>): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=focus-provisioning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-provisioning.d.ts","sourceRoot":"","sources":["../src/focus-provisioning.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAW1D;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAsGf"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent worktree provisioning for active focuses.
|
|
3
|
+
*
|
|
4
|
+
* Creates worktrees for active focuses that don't have one yet,
|
|
5
|
+
* adopts existing worktrees on disk, and rebases onto integration.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { installAuditPreCommitHook } from './audit-hooks.js';
|
|
10
|
+
import { getReadyFocuses } from './supabase.js';
|
|
11
|
+
import { createWorktree, syncIntegrationWithMain, runGitSync, generateMcpConfigInWorktree } from './git.js';
|
|
12
|
+
import { symlinkEnvFiles } from './qa-provisioner.js';
|
|
13
|
+
import { generateFocusBranchName } from './focus-executor.js';
|
|
14
|
+
import { setFocusWorktree, hasFocusWorktree, } from './focus-worktree-state.js';
|
|
15
|
+
/**
|
|
16
|
+
* Ensure persistent worktrees exist for all active focuses.
|
|
17
|
+
*
|
|
18
|
+
* Called each poll cycle BEFORE processReadyFocuses(). Creates
|
|
19
|
+
* worktrees for active focuses that don't have one yet.
|
|
20
|
+
* Syncs integration with main once per cycle (not per focus).
|
|
21
|
+
*/
|
|
22
|
+
export async function ensureFocusWorktrees(config, roles) {
|
|
23
|
+
let readyFocuses;
|
|
24
|
+
try {
|
|
25
|
+
readyFocuses = await getReadyFocuses(config.organizationId, config.productId);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
console.warn(`[focus-lifecycle] Failed to query ready focuses for worktree provisioning: ${err.message}`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Find focuses that need worktrees
|
|
32
|
+
const needsWorktree = readyFocuses.filter(s => !hasFocusWorktree(s.focus_id));
|
|
33
|
+
if (needsWorktree.length === 0)
|
|
34
|
+
return;
|
|
35
|
+
// Sync integration with main once before creating any worktrees
|
|
36
|
+
try {
|
|
37
|
+
const syncResult = await syncIntegrationWithMain(config);
|
|
38
|
+
if (syncResult.success) {
|
|
39
|
+
console.log(`[focus-lifecycle] Synced integration with main before worktree provisioning`);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
console.warn(`[focus-lifecycle] Could not sync integration with main: ${syncResult.error}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
console.warn(`[focus-lifecycle] Sync failed (continuing): ${err instanceof Error ? err.message : String(err)}`);
|
|
47
|
+
}
|
|
48
|
+
for (const focus of needsWorktree) {
|
|
49
|
+
const role = roles.get(focus.assigned_agent_role_id);
|
|
50
|
+
if (!role) {
|
|
51
|
+
console.warn(`[focus-lifecycle] Unknown agent role ${focus.assigned_agent_role_id} for focus "${focus.focus_name}", skipping worktree`);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const branchName = generateFocusBranchName(role, focus.focus_name, focus.focus_id);
|
|
55
|
+
const worktreePath = join(config.worktreeDir, branchName.replace(/\//g, '-'));
|
|
56
|
+
// Check if a valid worktree already exists on disk (e.g., after daemon restart
|
|
57
|
+
// or reactivation). Adopt it instead of destroying and rebuilding.
|
|
58
|
+
if (existsSync(worktreePath)) {
|
|
59
|
+
const gitDirResult = runGitSync(['rev-parse', '--git-dir'], worktreePath);
|
|
60
|
+
const branchResult = runGitSync(['rev-parse', '--abbrev-ref', 'HEAD'], worktreePath);
|
|
61
|
+
if (gitDirResult.success && branchResult.success && branchResult.output === branchName) {
|
|
62
|
+
// Valid worktree on the expected branch -- adopt it
|
|
63
|
+
console.log(`[focus-lifecycle] Adopting existing worktree for "${focus.focus_name}": ${worktreePath}`);
|
|
64
|
+
setFocusWorktree(focus.focus_id, {
|
|
65
|
+
focusId: focus.focus_id,
|
|
66
|
+
focusName: focus.focus_name,
|
|
67
|
+
worktreePath,
|
|
68
|
+
branchName,
|
|
69
|
+
createdAt: new Date(),
|
|
70
|
+
hasQaDevServer: false,
|
|
71
|
+
});
|
|
72
|
+
// Rebase onto integration to bring it current
|
|
73
|
+
const rebaseResult = runGitSync(['rebase', config.integrationBranch], worktreePath);
|
|
74
|
+
if (!rebaseResult.success) {
|
|
75
|
+
runGitSync(['rebase', '--abort'], worktreePath);
|
|
76
|
+
console.warn(`[focus-lifecycle] Could not rebase adopted worktree for "${focus.focus_name}" onto integration. Continuing with existing state.`);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
console.log(`[focus-lifecycle] Rebased adopted worktree for "${focus.focus_name}" onto ${config.integrationBranch}`);
|
|
80
|
+
}
|
|
81
|
+
// Symlink env files and generate .mcp.json in worktree
|
|
82
|
+
symlinkEnvFiles(config.repoPath, worktreePath);
|
|
83
|
+
generateMcpConfigInWorktree(worktreePath, config);
|
|
84
|
+
// Install audit pre-commit hook for read-only focuses
|
|
85
|
+
if (focus.read_only) {
|
|
86
|
+
installAuditPreCommitHook(worktreePath);
|
|
87
|
+
console.log(`[focus-lifecycle] Installed audit pre-commit hook for "${focus.focus_name}"`);
|
|
88
|
+
}
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
// Directory exists but is not a valid worktree for this branch -- fall through to createWorktree
|
|
92
|
+
console.log(`[focus-lifecycle] Existing directory at ${worktreePath} is not a valid worktree for ${branchName}, recreating`);
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
const createdPath = await createWorktree(config, branchName);
|
|
96
|
+
setFocusWorktree(focus.focus_id, {
|
|
97
|
+
focusId: focus.focus_id,
|
|
98
|
+
focusName: focus.focus_name,
|
|
99
|
+
worktreePath: createdPath,
|
|
100
|
+
branchName,
|
|
101
|
+
createdAt: new Date(),
|
|
102
|
+
hasQaDevServer: false,
|
|
103
|
+
});
|
|
104
|
+
console.log(`[focus-lifecycle] Created persistent worktree for "${focus.focus_name}": ${createdPath}`);
|
|
105
|
+
// Symlink env files from main repo into worktree
|
|
106
|
+
symlinkEnvFiles(config.repoPath, createdPath);
|
|
107
|
+
// Install audit pre-commit hook for read-only focuses
|
|
108
|
+
if (focus.read_only) {
|
|
109
|
+
installAuditPreCommitHook(createdPath);
|
|
110
|
+
console.log(`[focus-lifecycle] Installed audit pre-commit hook for "${focus.focus_name}"`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
console.error(`[focus-lifecycle] Failed to create worktree for "${focus.focus_name}": ${err instanceof Error ? err.message : String(err)}`);
|
|
115
|
+
// Continue with other focuses
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=focus-provisioning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-provisioning.js","sourceRoot":"","sources":["../src/focus-provisioning.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Focus spawn helpers - log streams, stream handlers, and process close handling.
|
|
3
3
|
*
|
|
4
|
-
* Extracted from
|
|
5
|
-
*
|
|
4
|
+
* Extracted from focus-executor.ts. These are internal helpers used by
|
|
5
|
+
* spawnFocusTeam() -- not a public API surface.
|
|
6
6
|
*/
|
|
7
7
|
import type { ChildProcess } from 'node:child_process';
|
|
8
8
|
import { createWriteStream } from 'node:fs';
|
|
9
|
-
import type { DaemonConfig,
|
|
9
|
+
import type { DaemonConfig, FocusTeamState } from './types.js';
|
|
10
10
|
import { CompletionDetector } from './completion-detector.js';
|
|
11
11
|
import { ActivityTracker } from './activity-tracker.js';
|
|
12
|
-
import type {
|
|
12
|
+
import type { SpawnFocusTeamParams } from './focus-executor.js';
|
|
13
13
|
import type { ResourceGovernor } from '@telora/daemon-core';
|
|
14
14
|
export interface TeamLogStreams {
|
|
15
15
|
stdoutPath: string;
|
|
@@ -21,9 +21,9 @@ export interface TeamLogStreams {
|
|
|
21
21
|
}
|
|
22
22
|
export interface AttachStreamHandlersParams {
|
|
23
23
|
proc: ChildProcess;
|
|
24
|
-
teamState:
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
teamState: FocusTeamState;
|
|
25
|
+
focusId: string;
|
|
26
|
+
focusName: string;
|
|
27
27
|
sessionId: string;
|
|
28
28
|
logs: TeamLogStreams;
|
|
29
29
|
}
|
|
@@ -34,24 +34,24 @@ export interface AttachStreamHandlersResult {
|
|
|
34
34
|
export interface HandleTeamProcessCloseParams {
|
|
35
35
|
code: number | null;
|
|
36
36
|
signal: string | null;
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
focusName: string;
|
|
38
|
+
focusId: string;
|
|
39
39
|
resumeId: string | null;
|
|
40
40
|
spawnedAt: number;
|
|
41
|
-
teamState:
|
|
41
|
+
teamState: FocusTeamState;
|
|
42
42
|
sessionId: string;
|
|
43
43
|
config: DaemonConfig;
|
|
44
44
|
completionDetector: CompletionDetector;
|
|
45
45
|
activityTracker: ActivityTracker;
|
|
46
46
|
logs: TeamLogStreams;
|
|
47
|
-
params:
|
|
47
|
+
params: SpawnFocusTeamParams;
|
|
48
48
|
governor: ResourceGovernor | null;
|
|
49
|
-
|
|
49
|
+
spawnFocusTeam: (params: SpawnFocusTeamParams) => Promise<void>;
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
52
52
|
* Create log file paths and writable streams for a team's output.
|
|
53
53
|
*/
|
|
54
|
-
export declare function setupTeamLogStreams(logDir: string, branchName: string,
|
|
54
|
+
export declare function setupTeamLogStreams(logDir: string, branchName: string, focusName: string): TeamLogStreams;
|
|
55
55
|
/**
|
|
56
56
|
* Attach stream parser, completion detector, activity tracker, and event
|
|
57
57
|
* handlers to the spawned team lead process.
|
|
@@ -64,4 +64,4 @@ export declare function attachStreamHandlers(params: AttachStreamHandlersParams)
|
|
|
64
64
|
* runs normal cleanup (governor release, stream close, completion handling).
|
|
65
65
|
*/
|
|
66
66
|
export declare function handleTeamProcessClose(ctx: HandleTeamProcessCloseParams): Promise<void>;
|
|
67
|
-
//# sourceMappingURL=
|
|
67
|
+
//# sourceMappingURL=focus-spawn-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-spawn-helpers.d.ts","sourceRoot":"","sources":["../src/focus-spawn-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACf,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAIxD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAI5D,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;IACtD,YAAY,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;IACnD,WAAW,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,cAAc,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,cAAc,CAAC;CACtB;AAED,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,eAAe,EAAE,eAAe,CAAC;CAClC;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,cAAc,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;IACrB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,eAAe,EAAE,eAAe,CAAC;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAClC,cAAc,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAID;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,cAAc,CAuBzG;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,0BAA0B,GAAG,0BAA0B,CAwDnG;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,4BAA4B,GAAG,OAAO,CAAC,IAAI,CAAC,CAmE7F"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Focus spawn helpers - log streams, stream handlers, and process close handling.
|
|
3
3
|
*
|
|
4
|
-
* Extracted from
|
|
5
|
-
*
|
|
4
|
+
* Extracted from focus-executor.ts. These are internal helpers used by
|
|
5
|
+
* spawnFocusTeam() -- not a public API surface.
|
|
6
6
|
*/
|
|
7
7
|
import { createWriteStream } from 'node:fs';
|
|
8
8
|
import { join } from 'node:path';
|
|
@@ -11,16 +11,16 @@ import { StreamJsonParser, formatEventForLog } from '@telora/daemon-core';
|
|
|
11
11
|
import { recordActivity, setNarration } from './heartbeat.js';
|
|
12
12
|
import { CompletionDetector } from './completion-detector.js';
|
|
13
13
|
import { ActivityTracker } from './activity-tracker.js';
|
|
14
|
-
import { getActiveTeams } from './
|
|
15
|
-
import { handleTeamCompletion } from './
|
|
16
|
-
import {
|
|
14
|
+
import { getActiveTeams } from './focus-team-state.js';
|
|
15
|
+
import { handleTeamCompletion } from './focus-completion.js';
|
|
16
|
+
import { updateFocusClaudeSessionId } from './queries/focuses.js';
|
|
17
17
|
// ── Functions ───────────────────────────────────────────────────────────
|
|
18
18
|
/**
|
|
19
19
|
* Create log file paths and writable streams for a team's output.
|
|
20
20
|
*/
|
|
21
|
-
export function setupTeamLogStreams(logDir, branchName,
|
|
21
|
+
export function setupTeamLogStreams(logDir, branchName, focusName) {
|
|
22
22
|
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
23
|
-
const logPrefix = `
|
|
23
|
+
const logPrefix = `focus-${branchName.replace(/\//g, '-')}-${timestamp}`;
|
|
24
24
|
const stdoutPath = join(logDir, `${logPrefix}.stdout.log`);
|
|
25
25
|
const stderrPath = join(logDir, `${logPrefix}.stderr.log`);
|
|
26
26
|
const jsonlPath = join(logDir, `${logPrefix}.stream.jsonl`);
|
|
@@ -29,13 +29,13 @@ export function setupTeamLogStreams(logDir, branchName, strategyName) {
|
|
|
29
29
|
const jsonlStream = createWriteStream(jsonlPath, { mode: 0o600 });
|
|
30
30
|
// Attach error handlers to prevent unhandled 'error' events from crashing the daemon
|
|
31
31
|
stdoutLogStream.on('error', (err) => {
|
|
32
|
-
console.warn(`[
|
|
32
|
+
console.warn(`[focus-executor] stdout log stream error for "${focusName}": ${err.message}`);
|
|
33
33
|
});
|
|
34
34
|
stderrStream.on('error', (err) => {
|
|
35
|
-
console.warn(`[
|
|
35
|
+
console.warn(`[focus-executor] stderr log stream error for "${focusName}": ${err.message}`);
|
|
36
36
|
});
|
|
37
37
|
jsonlStream.on('error', (err) => {
|
|
38
|
-
console.warn(`[
|
|
38
|
+
console.warn(`[focus-executor] jsonl log stream error for "${focusName}": ${err.message}`);
|
|
39
39
|
});
|
|
40
40
|
return { stdoutPath, stderrPath, jsonlPath, stdoutLogStream, stderrStream, jsonlStream };
|
|
41
41
|
}
|
|
@@ -44,7 +44,7 @@ export function setupTeamLogStreams(logDir, branchName, strategyName) {
|
|
|
44
44
|
* handlers to the spawned team lead process.
|
|
45
45
|
*/
|
|
46
46
|
export function attachStreamHandlers(params) {
|
|
47
|
-
const { proc, teamState,
|
|
47
|
+
const { proc, teamState, focusId, focusName, sessionId, logs } = params;
|
|
48
48
|
const streamParser = new StreamJsonParser();
|
|
49
49
|
const completionDetector = new CompletionDetector();
|
|
50
50
|
streamParser.attach(proc.stdout);
|
|
@@ -52,7 +52,7 @@ export function attachStreamHandlers(params) {
|
|
|
52
52
|
teamState.completionDetector = completionDetector;
|
|
53
53
|
// Attach activity tracker for live activity snapshots
|
|
54
54
|
const activityTracker = new ActivityTracker(sessionId);
|
|
55
|
-
activityTracker.onNarration((text) => setNarration(
|
|
55
|
+
activityTracker.onNarration((text) => setNarration(focusId, text));
|
|
56
56
|
activityTracker.attach(streamParser);
|
|
57
57
|
// Write raw NDJSON lines to jsonl log file
|
|
58
58
|
streamParser.on('event', (event) => {
|
|
@@ -67,25 +67,25 @@ export function attachStreamHandlers(params) {
|
|
|
67
67
|
});
|
|
68
68
|
// Track session state from stream events
|
|
69
69
|
streamParser.on('init', (event) => {
|
|
70
|
-
console.log(` [
|
|
70
|
+
console.log(` [focus-team] Session initialized (model: ${event.model}, tools: ${event.tools.length})`);
|
|
71
71
|
teamState.claudeSessionId = event.session_id;
|
|
72
72
|
// Persist session ID for --resume support on re-spawn
|
|
73
|
-
|
|
74
|
-
console.warn(`[
|
|
73
|
+
updateFocusClaudeSessionId(focusId, event.session_id).catch((err) => {
|
|
74
|
+
console.warn(`[focus-executor] Failed to persist Claude session ID for "${focusName}":`, err.message);
|
|
75
75
|
});
|
|
76
76
|
});
|
|
77
77
|
streamParser.on('teammate', (event) => {
|
|
78
78
|
if (event.subtype === 'teammate_spawned') {
|
|
79
|
-
console.log(` [
|
|
79
|
+
console.log(` [focus-team] Worker spawned: ${event.agent_name}`);
|
|
80
80
|
}
|
|
81
81
|
else if (event.subtype === 'teammate_completed') {
|
|
82
82
|
const status = event.is_error ? 'FAILED' : 'completed';
|
|
83
|
-
console.log(` [
|
|
83
|
+
console.log(` [focus-team] Worker ${status}: ${event.agent_name}`);
|
|
84
84
|
}
|
|
85
85
|
});
|
|
86
86
|
streamParser.on('result', (result) => {
|
|
87
87
|
const cost = result.total_cost_usd?.toFixed(4) ?? '?';
|
|
88
|
-
console.log(` [
|
|
88
|
+
console.log(` [focus-team] Result: ${result.is_error ? 'ERROR' : 'Success'}: ${result.num_turns} turns, $${cost}`);
|
|
89
89
|
});
|
|
90
90
|
// Stderr pipes to log
|
|
91
91
|
proc.stderr?.pipe(logs.stderrStream);
|
|
@@ -98,17 +98,17 @@ export function attachStreamHandlers(params) {
|
|
|
98
98
|
* runs normal cleanup (governor release, stream close, completion handling).
|
|
99
99
|
*/
|
|
100
100
|
export async function handleTeamProcessClose(ctx) {
|
|
101
|
-
const { code, signal,
|
|
101
|
+
const { code, signal, focusName, focusId, resumeId, spawnedAt, teamState, sessionId, config: cfg, completionDetector, activityTracker, logs, params: spawnParams, governor, spawnFocusTeam: spawnFn, } = ctx;
|
|
102
102
|
const activeTeams = getActiveTeams();
|
|
103
|
-
console.log(`[
|
|
103
|
+
console.log(`[focus-executor] Team lead for "${focusName}" exited (code: ${code}, signal: ${signal})`);
|
|
104
104
|
// Detect --resume failure: if the process exits quickly with a non-zero
|
|
105
105
|
// code and --resume was used, retry without resume.
|
|
106
106
|
const RESUME_FAILURE_THRESHOLD_MS = 15_000;
|
|
107
107
|
const elapsedMs = Date.now() - spawnedAt;
|
|
108
108
|
if (resumeId && code !== 0 && code !== null && elapsedMs < RESUME_FAILURE_THRESHOLD_MS) {
|
|
109
|
-
console.warn(`[
|
|
109
|
+
console.warn(`[focus-executor] Resume failed for "${focusName}" (exited in ${elapsedMs}ms), retrying without resume`);
|
|
110
110
|
// Release governor slot and clean up minimal state
|
|
111
|
-
governor?.releaseSlot('
|
|
111
|
+
governor?.releaseSlot('focus');
|
|
112
112
|
completionDetector.destroy();
|
|
113
113
|
logs.stdoutLogStream.end();
|
|
114
114
|
logs.stderrStream.end();
|
|
@@ -123,16 +123,16 @@ export async function handleTeamProcessClose(ctx) {
|
|
|
123
123
|
});
|
|
124
124
|
}
|
|
125
125
|
catch (updateErr) {
|
|
126
|
-
console.warn('[
|
|
126
|
+
console.warn('[focus-executor] Failed to update session after resume failure:', updateErr.message);
|
|
127
127
|
}
|
|
128
128
|
teamState.phase = 'terminated';
|
|
129
|
-
activeTeams.delete(
|
|
129
|
+
activeTeams.delete(focusId);
|
|
130
130
|
// Re-spawn without --resume
|
|
131
131
|
await spawnFn({ ...spawnParams, lastClaudeSessionId: null });
|
|
132
132
|
return;
|
|
133
133
|
}
|
|
134
134
|
// Release governor slot (if governor is configured)
|
|
135
|
-
governor?.releaseSlot('
|
|
135
|
+
governor?.releaseSlot('focus');
|
|
136
136
|
// Null out stdin so post-exit merge logic falls through to the
|
|
137
137
|
// fallback resolution agent instead of sending messages to a dead process.
|
|
138
138
|
teamState.leadStdin = null;
|
|
@@ -141,7 +141,7 @@ export async function handleTeamProcessClose(ctx) {
|
|
|
141
141
|
await activityTracker.finalFlush();
|
|
142
142
|
}
|
|
143
143
|
catch (err) {
|
|
144
|
-
console.warn('[
|
|
144
|
+
console.warn('[focus-executor] activityTracker.finalFlush failed:', err.message);
|
|
145
145
|
}
|
|
146
146
|
// Clean up streams
|
|
147
147
|
completionDetector.destroy();
|
|
@@ -157,4 +157,4 @@ export async function handleTeamProcessClose(ctx) {
|
|
|
157
157
|
signal,
|
|
158
158
|
});
|
|
159
159
|
}
|
|
160
|
-
//# sourceMappingURL=
|
|
160
|
+
//# sourceMappingURL=focus-spawn-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-spawn-helpers.js","sourceRoot":"","sources":["../src/focus-spawn-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,41 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Focus team lifecycle management - terminate, wait, detect deactivated.
|
|
3
3
|
*
|
|
4
|
-
* Extracted from
|
|
5
|
-
* of running
|
|
4
|
+
* Extracted from focus-executor.ts. These functions manage the lifecycle
|
|
5
|
+
* of running focus teams (shutdown, deactivation detection, merge checks).
|
|
6
6
|
*/
|
|
7
7
|
import type { DaemonConfig } from './types.js';
|
|
8
8
|
/**
|
|
9
|
-
* Terminate a
|
|
9
|
+
* Terminate a focus team.
|
|
10
10
|
*
|
|
11
11
|
* Sends a deactivation message via stdin (if open) before SIGTERM
|
|
12
12
|
* to allow the team lead to process the shutdown gracefully.
|
|
13
13
|
*/
|
|
14
|
-
export declare function terminateTeam(
|
|
14
|
+
export declare function terminateTeam(focusId: string): boolean;
|
|
15
15
|
/**
|
|
16
16
|
* Wait for a team's process to exit (leave activeTeams).
|
|
17
17
|
*
|
|
18
|
-
* Polls activeTeams until the
|
|
18
|
+
* Polls activeTeams until the focus is no longer present,
|
|
19
19
|
* which happens when handleTeamCompletion runs on the 'close' event.
|
|
20
20
|
* If the timeout expires, sends SIGKILL and waits briefly.
|
|
21
21
|
*
|
|
22
|
-
* @param
|
|
22
|
+
* @param focusId - Focus to wait for
|
|
23
23
|
* @param timeoutMs - Max wait time in ms (default 30s)
|
|
24
24
|
* @returns true if team exited within timeout, false if forced
|
|
25
25
|
*/
|
|
26
|
-
export declare function waitForTeamExit(
|
|
26
|
+
export declare function waitForTeamExit(focusId: string, timeoutMs?: number): Promise<boolean>;
|
|
27
27
|
/**
|
|
28
28
|
* Terminate all active teams.
|
|
29
29
|
*/
|
|
30
30
|
export declare function terminateAllTeams(): void;
|
|
31
31
|
/**
|
|
32
|
-
* Detect
|
|
32
|
+
* Detect focuses that have been deactivated (agent role removed)
|
|
33
33
|
* and shut down their active teams.
|
|
34
34
|
*/
|
|
35
|
-
export declare function
|
|
35
|
+
export declare function detectDeactivatedFocuses(config: DaemonConfig): Promise<void>;
|
|
36
36
|
/**
|
|
37
37
|
* Check active teams for newly completed deliveries and merge
|
|
38
|
-
* the
|
|
38
|
+
* the focus branch to integration incrementally.
|
|
39
39
|
*
|
|
40
40
|
* Called from the poll loop. For each active team, queries delivery
|
|
41
41
|
* statuses and triggers a merge when any delivery reaches verify/done
|
|
@@ -43,8 +43,8 @@ export declare function detectDeactivatedStrategies(config: DaemonConfig): Promi
|
|
|
43
43
|
*
|
|
44
44
|
* After processing merges, checks if ALL active deliveries are terminal
|
|
45
45
|
* and merged. If so, terminates the team proactively since no more work
|
|
46
|
-
* remains. The
|
|
46
|
+
* remains. The focus stays active in the DB -- if new deliveries
|
|
47
47
|
* arrive later, the next poll cycle spawns a fresh team.
|
|
48
48
|
*/
|
|
49
49
|
export declare function checkAndMergeCompletedDeliveries(config: DaemonConfig): Promise<void>;
|
|
50
|
-
//# sourceMappingURL=
|
|
50
|
+
//# sourceMappingURL=focus-team-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-team-lifecycle.d.ts","sourceRoot":"","sources":["../src/focus-team-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAgB/C;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CA2CtD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAsB1F;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CAqIf"}
|