@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,378 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Focus branch merge logic.
|
|
3
|
+
*
|
|
4
|
+
* Handles merging a focus's work branch into the integration branch,
|
|
5
|
+
* including workflow resolution and per-delivery git state reporting.
|
|
6
|
+
*/
|
|
7
|
+
import { runGitSync } from './git-types.js';
|
|
8
|
+
import { fetchEffectiveWorkflow, reportGitState, getMergeConflictDeliveries } from './supabase.js';
|
|
9
|
+
import { mergeToIntegration } from './git.js';
|
|
10
|
+
import { mergeBackFromIntegration } from './git-merge.js';
|
|
11
|
+
import { mergeDeliveryBranch } from './delivery-lifecycle.js';
|
|
12
|
+
import { createEscalation } from './queries/issues.js';
|
|
13
|
+
import { updateDeliveryMergeCommitSha } from './queries/deliveries.js';
|
|
14
|
+
import { withRetry, sendMessage, ESCALATION_REASONS } from '@telora/daemon-core';
|
|
15
|
+
import { spawnResolutionAgent } from './spawner.js';
|
|
16
|
+
import { getFocusWorktree } from './focus-worktree-state.js';
|
|
17
|
+
// Track deliveries with pending merge conflict escalations to avoid duplicates
|
|
18
|
+
const pendingMergeConflictDeliveries = new Set();
|
|
19
|
+
/**
|
|
20
|
+
* Report merge_conflict git state for a delivery.
|
|
21
|
+
*
|
|
22
|
+
* Makes the merge failure visible in the frontend delivery detail view.
|
|
23
|
+
*/
|
|
24
|
+
export async function reportMergeConflictState(deliveryId, branchName) {
|
|
25
|
+
try {
|
|
26
|
+
await reportGitState(deliveryId, 'merge_conflict', branchName);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
console.warn(`[focus-merge] reportGitState merge_conflict failed for ${deliveryId}:`, err.message);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create an escalation for a merge conflict and report the git state.
|
|
34
|
+
*
|
|
35
|
+
* Idempotent: skips escalation creation if one is already pending for
|
|
36
|
+
* the same delivery (tracked in-memory via pendingMergeConflictDeliveries).
|
|
37
|
+
* Always reports merge_conflict git state regardless.
|
|
38
|
+
*
|
|
39
|
+
* Called by all focus-level merge callers when mergeToIntegration fails.
|
|
40
|
+
*/
|
|
41
|
+
export async function escalateMergeConflict(params) {
|
|
42
|
+
const { organizationId, sessionId, deliveryId, deliveryName, branchName, integrationBranch, mergeError } = params;
|
|
43
|
+
// Always report merge_conflict git state
|
|
44
|
+
await reportMergeConflictState(deliveryId, branchName);
|
|
45
|
+
// Skip duplicate escalation
|
|
46
|
+
if (pendingMergeConflictDeliveries.has(deliveryId)) {
|
|
47
|
+
console.log(`[focus-merge] Merge conflict escalation already pending for delivery ${deliveryId}, skipping duplicate`);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
pendingMergeConflictDeliveries.add(deliveryId);
|
|
51
|
+
try {
|
|
52
|
+
await withRetry(() => createEscalation({
|
|
53
|
+
organizationId,
|
|
54
|
+
sessionId,
|
|
55
|
+
issueId: null,
|
|
56
|
+
reasonType: ESCALATION_REASONS.ERROR_ENCOUNTERED,
|
|
57
|
+
description: `Merge conflict merging focus branch into integration.\n\n` +
|
|
58
|
+
`**Delivery:** ${deliveryName}\n` +
|
|
59
|
+
`**Source branch:** ${branchName}\n` +
|
|
60
|
+
`**Target branch:** ${integrationBranch}\n` +
|
|
61
|
+
`**Error:** ${mergeError}\n\n` +
|
|
62
|
+
`The branch has been preserved. Resolve the conflict and mark the escalation as resolved to trigger a retry.`,
|
|
63
|
+
whatWasTried: `Attempted automatic merge of ${branchName} into ${integrationBranch}.`,
|
|
64
|
+
helpNeeded: `Resolve the merge conflicts between ${branchName} and ${integrationBranch}, then mark this escalation as resolved.`,
|
|
65
|
+
}), { maxAttempts: 3, label: `escalation-focus-merge-conflict-${deliveryId}` });
|
|
66
|
+
console.log(`[focus-merge] Created merge conflict escalation for delivery "${deliveryName}"`);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
console.error(`[focus-merge] Failed to create merge conflict escalation for "${deliveryName}": ${err.message}`);
|
|
70
|
+
// Remove from pending set so a retry can create it later
|
|
71
|
+
pendingMergeConflictDeliveries.delete(deliveryId);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Clear the pending merge conflict flag for a delivery (e.g., after successful retry).
|
|
76
|
+
*/
|
|
77
|
+
export function clearMergeConflictFlag(deliveryId) {
|
|
78
|
+
pendingMergeConflictDeliveries.delete(deliveryId);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Check for deliveries stuck in merge_conflict state and retry the merge.
|
|
82
|
+
*
|
|
83
|
+
* Called once per poll cycle. Queries the API for deliveries with
|
|
84
|
+
* merge_conflict git state, groups them by branch (to avoid duplicate
|
|
85
|
+
* merges), and retries mergeToIntegration for each unique branch.
|
|
86
|
+
*
|
|
87
|
+
* On success: reports merged_to_integration for all deliveries on that
|
|
88
|
+
* branch and clears their pending merge conflict flags.
|
|
89
|
+
* On failure: logs quietly (the existing escalation remains active).
|
|
90
|
+
*/
|
|
91
|
+
export async function checkResolvedMergeConflicts(config) {
|
|
92
|
+
let conflictDeliveries;
|
|
93
|
+
try {
|
|
94
|
+
conflictDeliveries = await getMergeConflictDeliveries(config.organizationId, config.productId);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
console.warn(`[focus-merge] Failed to fetch merge conflict deliveries:`, err.message);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (conflictDeliveries.length === 0)
|
|
101
|
+
return;
|
|
102
|
+
// Group deliveries by branch so we only merge once per branch
|
|
103
|
+
const byBranch = new Map();
|
|
104
|
+
for (const d of conflictDeliveries) {
|
|
105
|
+
if (!d.git_branch_name)
|
|
106
|
+
continue;
|
|
107
|
+
const group = byBranch.get(d.git_branch_name) ?? [];
|
|
108
|
+
group.push(d);
|
|
109
|
+
byBranch.set(d.git_branch_name, group);
|
|
110
|
+
}
|
|
111
|
+
for (const [branchName, deliveries] of byBranch) {
|
|
112
|
+
const representative = deliveries[0];
|
|
113
|
+
console.log(`[focus-merge] Retrying merge for branch ${branchName} ` +
|
|
114
|
+
`(${deliveries.length} delivery/ies in merge_conflict state)`);
|
|
115
|
+
const mergeResult = await mergeToIntegration({
|
|
116
|
+
config,
|
|
117
|
+
branchName,
|
|
118
|
+
deliveryName: representative.delivery_name,
|
|
119
|
+
deliveryId: representative.delivery_id,
|
|
120
|
+
});
|
|
121
|
+
if (mergeResult.success) {
|
|
122
|
+
console.log(`[focus-merge] Merge retry succeeded for branch ${branchName}`);
|
|
123
|
+
// Update all deliveries in this branch group
|
|
124
|
+
for (const d of deliveries) {
|
|
125
|
+
clearMergeConflictFlag(d.delivery_id);
|
|
126
|
+
reportGitState(d.delivery_id, 'merged_to_integration').catch((err) => console.warn(`[focus-merge] reportGitState merged_to_integration failed for ${d.delivery_id}:`, err.message));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
console.log(`[focus-merge] Merge retry still failing for branch ${branchName}: ${mergeResult.error ?? 'unknown'}`);
|
|
131
|
+
// Attempt fallback resolution agent if a worktree exists for this focus
|
|
132
|
+
if (representative.focus_id) {
|
|
133
|
+
const worktreeInfo = getFocusWorktree(representative.focus_id);
|
|
134
|
+
if (worktreeInfo) {
|
|
135
|
+
console.log(`[focus-merge] Spawning fallback resolution agent for branch ${branchName}`);
|
|
136
|
+
// Merge integration back into the focus worktree to surface conflicts
|
|
137
|
+
const mergeBackResult = await mergeBackFromIntegration({
|
|
138
|
+
worktreePath: worktreeInfo.worktreePath,
|
|
139
|
+
integrationBranch: config.integrationBranch,
|
|
140
|
+
});
|
|
141
|
+
if (mergeBackResult.status === 'conflict') {
|
|
142
|
+
const fallbackResult = await spawnResolutionAgent({
|
|
143
|
+
config,
|
|
144
|
+
worktreePath: worktreeInfo.worktreePath,
|
|
145
|
+
branchName,
|
|
146
|
+
integrationBranch: config.integrationBranch,
|
|
147
|
+
conflictFiles: mergeBackResult.conflictFiles ?? [],
|
|
148
|
+
focusDescription: worktreeInfo.focusName || branchName,
|
|
149
|
+
});
|
|
150
|
+
if (fallbackResult.success) {
|
|
151
|
+
// Retry merge after resolution
|
|
152
|
+
const retryResult = await mergeToIntegration({
|
|
153
|
+
config,
|
|
154
|
+
branchName,
|
|
155
|
+
deliveryName: representative.delivery_name,
|
|
156
|
+
deliveryId: representative.delivery_id,
|
|
157
|
+
});
|
|
158
|
+
if (retryResult.success) {
|
|
159
|
+
console.log(`[focus-merge] Merge succeeded after fallback resolution for branch ${branchName}`);
|
|
160
|
+
for (const d of deliveries) {
|
|
161
|
+
clearMergeConflictFlag(d.delivery_id);
|
|
162
|
+
reportGitState(d.delivery_id, 'merged_to_integration').catch((err) => console.warn(`[focus-merge] reportGitState failed for ${d.delivery_id}:`, err.message));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// ── Team lead conflict resolution ────────────────────────────────
|
|
173
|
+
/** Default timeout for team lead to resolve merge conflicts (5 minutes). */
|
|
174
|
+
const MERGE_CONFLICT_RESOLUTION_TIMEOUT_MS = 5 * 60 * 1000;
|
|
175
|
+
/** Poll interval when waiting for conflict resolution (5 seconds). */
|
|
176
|
+
const RESOLUTION_POLL_INTERVAL_MS = 5000;
|
|
177
|
+
/**
|
|
178
|
+
* Request the team lead to resolve merge conflicts in the worktree.
|
|
179
|
+
*
|
|
180
|
+
* Sends a user message via stdin with conflict details and instructions,
|
|
181
|
+
* then polls git state to detect when conflicts are resolved (no more
|
|
182
|
+
* unmerged files and a merge commit exists).
|
|
183
|
+
*
|
|
184
|
+
* Returns when resolution is detected or timeout expires.
|
|
185
|
+
*/
|
|
186
|
+
export async function requestTeamLeadResolution(teamState, conflictFiles, branchName, integrationBranch, timeoutMs = MERGE_CONFLICT_RESOLUTION_TIMEOUT_MS) {
|
|
187
|
+
const { leadStdin, worktreePath, focusName } = teamState;
|
|
188
|
+
if (!leadStdin || !worktreePath) {
|
|
189
|
+
return { resolved: false, reason: 'No active team lead stdin or worktree' };
|
|
190
|
+
}
|
|
191
|
+
// Set concurrency guard
|
|
192
|
+
teamState.resolvingMergeConflict = true;
|
|
193
|
+
try {
|
|
194
|
+
// Send conflict resolution instructions to the team lead
|
|
195
|
+
const message = `MERGE CONFLICT RESOLUTION NEEDED\n\n` +
|
|
196
|
+
`The integration branch has changes that conflict with your focus branch.\n\n` +
|
|
197
|
+
`**Conflicted files:**\n${conflictFiles.map(f => `- ${f}`).join('\n')}\n\n` +
|
|
198
|
+
`**Source:** origin/${integrationBranch}\n` +
|
|
199
|
+
`**Target:** ${branchName}\n\n` +
|
|
200
|
+
`**Instructions:**\n` +
|
|
201
|
+
`1. Open each conflicted file and resolve the conflict markers (<<<<<<< / ======= / >>>>>>>)\n` +
|
|
202
|
+
`2. Stage each resolved file with: git add <file>\n` +
|
|
203
|
+
`3. Commit the merge resolution: git commit --no-edit\n` +
|
|
204
|
+
`4. Run: npm run build && npm test\n` +
|
|
205
|
+
`5. If build+test fails, fix the issues, commit, and re-run\n\n` +
|
|
206
|
+
`Do NOT run git merge --abort. Your goal is to produce a clean merge commit that passes build and tests.`;
|
|
207
|
+
sendMessage(leadStdin, message);
|
|
208
|
+
console.log(`[focus-merge] Sent merge conflict resolution request to team lead for "${focusName}"`);
|
|
209
|
+
// Poll git state to detect resolution
|
|
210
|
+
const deadline = Date.now() + timeoutMs;
|
|
211
|
+
const preResolutionHead = runGitSync(['rev-parse', 'HEAD'], worktreePath).output;
|
|
212
|
+
while (Date.now() < deadline) {
|
|
213
|
+
await new Promise(resolve => setTimeout(resolve, RESOLUTION_POLL_INTERVAL_MS));
|
|
214
|
+
// Check if unmerged files remain
|
|
215
|
+
const unmergedResult = runGitSync(['diff', '--name-only', '--diff-filter=U'], worktreePath);
|
|
216
|
+
const unmergedFiles = unmergedResult.success
|
|
217
|
+
? unmergedResult.output.split('\n').filter(Boolean)
|
|
218
|
+
: [];
|
|
219
|
+
if (unmergedFiles.length === 0) {
|
|
220
|
+
// No unmerged files -- check if HEAD advanced (merge commit created)
|
|
221
|
+
const currentHead = runGitSync(['rev-parse', 'HEAD'], worktreePath).output;
|
|
222
|
+
if (currentHead !== preResolutionHead) {
|
|
223
|
+
console.log(`[focus-merge] Team lead resolved merge conflicts for "${focusName}"`);
|
|
224
|
+
return { resolved: true };
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// Timeout expired
|
|
229
|
+
console.warn(`[focus-merge] Team lead did not resolve merge conflicts within ${timeoutMs / 1000}s for "${focusName}"`);
|
|
230
|
+
return { resolved: false, reason: `Resolution timeout (${timeoutMs / 1000}s)` };
|
|
231
|
+
}
|
|
232
|
+
finally {
|
|
233
|
+
teamState.resolvingMergeConflict = false;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Merge the focus branch to integration.
|
|
238
|
+
*
|
|
239
|
+
* Uses the first delivery ID as the representative for merge operations
|
|
240
|
+
* (all deliveries share the same branch in the focus model).
|
|
241
|
+
*
|
|
242
|
+
* `workedDeliveryIds` is the set of deliveries the team actually built in
|
|
243
|
+
* this merge cycle. Git state and the merge commit SHA are recorded only
|
|
244
|
+
* for these deliveries — never for queued/planning deliveries that happen
|
|
245
|
+
* to share the same focus branch but were never touched.
|
|
246
|
+
*/
|
|
247
|
+
export async function mergeFocusBranch(config, teamState, sessionId, branchName, workedDeliveryIds) {
|
|
248
|
+
// Empty-set guard: planning teams may exit before any deliveries are
|
|
249
|
+
// worked (human cleared the agent role mid-planning, planning failed,
|
|
250
|
+
// etc.). With workedDeliveryIds required, this also covers the old
|
|
251
|
+
// "no deliveries to merge" case.
|
|
252
|
+
if (workedDeliveryIds.length === 0) {
|
|
253
|
+
return { mergeSucceeded: false, exitReason: 'No worked deliveries to merge.' };
|
|
254
|
+
}
|
|
255
|
+
// Use first worked delivery as the representative for merge operations
|
|
256
|
+
const representativeDeliveryId = workedDeliveryIds[0];
|
|
257
|
+
// Fetch workflow for merge operations (used only for conflict rollback stage lookup)
|
|
258
|
+
let workflow;
|
|
259
|
+
try {
|
|
260
|
+
workflow = await fetchEffectiveWorkflow(representativeDeliveryId);
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
console.warn(`[focus-executor] Failed to fetch workflow for merge, using fallback:`, err.message);
|
|
264
|
+
workflow = { id: 'fallback', stages: [] };
|
|
265
|
+
}
|
|
266
|
+
// ── Merge-back: sync integration into focus branch before merging out ──
|
|
267
|
+
// Merge integration HEAD into the focus branch to surface conflicts early
|
|
268
|
+
const worktreePath = teamState.worktreePath;
|
|
269
|
+
if (worktreePath) {
|
|
270
|
+
const mergeBackResult = await mergeBackFromIntegration({
|
|
271
|
+
worktreePath,
|
|
272
|
+
integrationBranch: config.integrationBranch,
|
|
273
|
+
});
|
|
274
|
+
if (mergeBackResult.status === 'conflict') {
|
|
275
|
+
const conflictFiles = mergeBackResult.conflictFiles ?? [];
|
|
276
|
+
console.log(`[focus-merge] Merge-back produced conflicts for "${teamState.focusName}": ` +
|
|
277
|
+
`${conflictFiles.join(', ') || 'unknown files'}`);
|
|
278
|
+
// If team lead is alive, delegate resolution to them
|
|
279
|
+
if (teamState.leadStdin && teamState.phase === 'executing') {
|
|
280
|
+
const resolution = await requestTeamLeadResolution(teamState, conflictFiles, branchName, config.integrationBranch);
|
|
281
|
+
if (resolution.resolved) {
|
|
282
|
+
// Agent committed the merge resolution, proceed to integration merge
|
|
283
|
+
console.log(`[focus-merge] Conflict resolved by team lead for "${teamState.focusName}", proceeding`);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
// Team lead could not resolve -- escalate
|
|
287
|
+
await escalateMergeConflict({
|
|
288
|
+
organizationId: teamState.organizationId,
|
|
289
|
+
sessionId,
|
|
290
|
+
deliveryId: representativeDeliveryId,
|
|
291
|
+
deliveryName: teamState.focusName,
|
|
292
|
+
branchName,
|
|
293
|
+
integrationBranch: config.integrationBranch,
|
|
294
|
+
mergeError: `Merge-back conflict unresolved: ${resolution.reason ?? 'unknown'}`,
|
|
295
|
+
});
|
|
296
|
+
return { mergeSucceeded: false, exitReason: 'merge_back_conflict_unresolved' };
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
// No active team lead -- spawn a short-lived resolution agent
|
|
301
|
+
console.log(`[focus-merge] No active team lead for "${teamState.focusName}", spawning fallback resolution agent`);
|
|
302
|
+
// Report resolving_conflict state for all unmerged deliveries
|
|
303
|
+
for (const deliveryId of teamState.knownDeliveryIds) {
|
|
304
|
+
if (!teamState.mergedDeliveryIds.has(deliveryId)) {
|
|
305
|
+
reportGitState(deliveryId, 'resolving_conflict').catch(err => console.warn(`[focus-merge] reportGitState resolving_conflict failed for ${deliveryId}:`, err.message));
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
const fallbackResult = await spawnResolutionAgent({
|
|
309
|
+
config,
|
|
310
|
+
worktreePath,
|
|
311
|
+
branchName,
|
|
312
|
+
integrationBranch: config.integrationBranch,
|
|
313
|
+
conflictFiles,
|
|
314
|
+
focusDescription: teamState.focusName,
|
|
315
|
+
});
|
|
316
|
+
if (fallbackResult.success) {
|
|
317
|
+
console.log(`[focus-merge] Fallback resolution agent resolved conflicts for "${teamState.focusName}", proceeding`);
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
await escalateMergeConflict({
|
|
321
|
+
organizationId: teamState.organizationId,
|
|
322
|
+
sessionId,
|
|
323
|
+
deliveryId: representativeDeliveryId,
|
|
324
|
+
deliveryName: teamState.focusName,
|
|
325
|
+
branchName,
|
|
326
|
+
integrationBranch: config.integrationBranch,
|
|
327
|
+
mergeError: `Fallback resolution agent failed: ${fallbackResult.error ?? 'unknown'}`,
|
|
328
|
+
});
|
|
329
|
+
return { mergeSucceeded: false, exitReason: 'merge_back_conflict_unresolved' };
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
if (mergeBackResult.status === 'error') {
|
|
334
|
+
console.error(`[focus-merge] Merge-back error for "${teamState.focusName}": ${mergeBackResult.message}`);
|
|
335
|
+
return { mergeSucceeded: false, exitReason: mergeBackResult.message };
|
|
336
|
+
}
|
|
337
|
+
// status === 'clean' -- proceed to merge to integration
|
|
338
|
+
console.log(`[focus-merge] Merge-back clean for "${teamState.focusName}", proceeding to integration merge`);
|
|
339
|
+
}
|
|
340
|
+
const mergeOutcome = await mergeDeliveryBranch({
|
|
341
|
+
config,
|
|
342
|
+
branchName,
|
|
343
|
+
deliveryId: representativeDeliveryId,
|
|
344
|
+
deliveryName: teamState.focusName,
|
|
345
|
+
organizationId: teamState.organizationId,
|
|
346
|
+
sessionId,
|
|
347
|
+
workflow,
|
|
348
|
+
focusId: teamState.focusId,
|
|
349
|
+
});
|
|
350
|
+
// Report git state and merge commit SHA only for deliveries that were
|
|
351
|
+
// actually worked on, never for queued/planning deliveries on the same branch.
|
|
352
|
+
const deliveryIdsForGitState = new Set(workedDeliveryIds);
|
|
353
|
+
if (mergeOutcome.mergeSucceeded) {
|
|
354
|
+
for (const deliveryId of deliveryIdsForGitState) {
|
|
355
|
+
if (!teamState.mergedDeliveryIds.has(deliveryId)) {
|
|
356
|
+
reportGitState(deliveryId, 'merged_to_integration').catch(err => console.warn(`[focus-executor] reportGitState merged_to_integration failed for ${deliveryId}:`, err.message));
|
|
357
|
+
// Propagate the merge commit SHA to all deliveries so the git state
|
|
358
|
+
// detector can track their containment in main/remote independently.
|
|
359
|
+
if (mergeOutcome.commitSha) {
|
|
360
|
+
updateDeliveryMergeCommitSha(deliveryId, mergeOutcome.commitSha).catch(err => console.warn(`[focus-merge] updateDeliveryMergeCommitSha failed for ${deliveryId}:`, err.message));
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
// Report merge_conflict state for worked deliveries only
|
|
367
|
+
for (const deliveryId of deliveryIdsForGitState) {
|
|
368
|
+
if (!teamState.mergedDeliveryIds.has(deliveryId)) {
|
|
369
|
+
reportMergeConflictState(deliveryId, branchName).catch(err => console.warn(`[focus-merge] reportMergeConflictState failed for ${deliveryId}:`, err.message));
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return {
|
|
374
|
+
mergeSucceeded: mergeOutcome.mergeSucceeded,
|
|
375
|
+
exitReason: mergeOutcome.exitReason,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
//# sourceMappingURL=focus-merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-merge.js","sourceRoot":"","sources":["../src/focus-merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Focus team prompt builder.
|
|
3
|
+
*
|
|
4
|
+
* The core prompt building logic lives in team-prompt-base.ts (section builders
|
|
5
|
+
* + buildFocusTeamPrompt). This file re-exports the main entry points for
|
|
6
|
+
* backward compatibility and houses buildWakeMessage (wake-only, not part of
|
|
7
|
+
* the role framework).
|
|
8
|
+
*
|
|
9
|
+
* Planning prompts have been extracted to planning-prompt-builder.ts
|
|
10
|
+
* and are re-exported here for backward compatibility.
|
|
11
|
+
*/
|
|
12
|
+
import type { FocusDeliveryInfo, FocusIssueInfo } from './types.js';
|
|
13
|
+
export type { DeploymentProfileSnapshotContext, FocusTeamPromptContext } from './team-prompt-base.js';
|
|
14
|
+
export { buildFocusTeamPrompt } from './team-prompt-base.js';
|
|
15
|
+
/**
|
|
16
|
+
* Build a re-engagement message listing all non-terminal deliveries that
|
|
17
|
+
* the team must finish, scope, or cancel before the focus can wind down.
|
|
18
|
+
*
|
|
19
|
+
* Unlike `buildWakeMessage` (which only lists agent-actionable deliveries),
|
|
20
|
+
* this message includes deliveries in `planning`, `iterating`, and other
|
|
21
|
+
* non-terminal states so the team is reminded that work is still pending.
|
|
22
|
+
* Used by the scope-coverage guard when the focus executor would
|
|
23
|
+
* otherwise idle-terminate while non-terminal deliveries remain.
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildReEngagementMessage(nonTerminalDeliveries: FocusDeliveryInfo[], issues: FocusIssueInfo[]): string;
|
|
26
|
+
/**
|
|
27
|
+
* Build a wake message for an idle team when new work is available.
|
|
28
|
+
*
|
|
29
|
+
* The team already has role context and execution instructions from the
|
|
30
|
+
* initial prompt. This message is a lean update with just the new work.
|
|
31
|
+
*/
|
|
32
|
+
export declare function buildWakeMessage(deliveries: FocusDeliveryInfo[], issues: FocusIssueInfo[], knownDeliveryIds: Set<string>): string;
|
|
33
|
+
export type { PlanningPass1Context, PlanningPass2Context } from './planning-prompt-builder.js';
|
|
34
|
+
export { buildPlanningPass1Prompt, buildPlanningPass2Prompt, buildPlanningCombinedPrompt } from './planning-prompt-builder.js';
|
|
35
|
+
//# sourceMappingURL=focus-prompt-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-prompt-builder.d.ts","sourceRoot":"","sources":["../src/focus-prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACf,MAAM,YAAY,CAAC;AAIpB,YAAY,EAAE,gCAAgC,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACtG,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,qBAAqB,EAAE,iBAAiB,EAAE,EAC1C,MAAM,EAAE,cAAc,EAAE,GACvB,MAAM,CA+CR;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,iBAAiB,EAAE,EAC/B,MAAM,EAAE,cAAc,EAAE,EACxB,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC5B,MAAM,CA2ER;AAMD,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAC/F,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Focus team prompt builder.
|
|
3
|
+
*
|
|
4
|
+
* The core prompt building logic lives in team-prompt-base.ts (section builders
|
|
5
|
+
* + buildFocusTeamPrompt). This file re-exports the main entry points for
|
|
6
|
+
* backward compatibility and houses buildWakeMessage (wake-only, not part of
|
|
7
|
+
* the role framework).
|
|
8
|
+
*
|
|
9
|
+
* Planning prompts have been extracted to planning-prompt-builder.ts
|
|
10
|
+
* and are re-exported here for backward compatibility.
|
|
11
|
+
*/
|
|
12
|
+
import { isStatusAgentActionable } from './stage-classifier.js';
|
|
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
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Build a wake message for an idle team when new work is available.
|
|
67
|
+
*
|
|
68
|
+
* The team already has role context and execution instructions from the
|
|
69
|
+
* initial prompt. This message is a lean update with just the new work.
|
|
70
|
+
*/
|
|
71
|
+
export function buildWakeMessage(deliveries, issues, knownDeliveryIds) {
|
|
72
|
+
const parts = [];
|
|
73
|
+
parts.push('## New Work Available');
|
|
74
|
+
parts.push('');
|
|
75
|
+
const actionableDeliveries = deliveries.filter(d => isStatusAgentActionable(d.executionStatus ?? ''));
|
|
76
|
+
if (actionableDeliveries.length === 0) {
|
|
77
|
+
parts.push('No actionable deliveries at this time.');
|
|
78
|
+
parts.push('');
|
|
79
|
+
return parts.join('\n');
|
|
80
|
+
}
|
|
81
|
+
for (const delivery of actionableDeliveries) {
|
|
82
|
+
const isNew = !knownDeliveryIds.has(delivery.id);
|
|
83
|
+
const tag = isNew ? ' (NEW)' : '';
|
|
84
|
+
parts.push(`### ${delivery.name} [${delivery.executionStatus}]${tag}`);
|
|
85
|
+
parts.push(`**Delivery ID:** ${delivery.id}`);
|
|
86
|
+
if (delivery.stageDescription) {
|
|
87
|
+
parts.push(`**Stage directive:** ${delivery.stageDescription}`);
|
|
88
|
+
}
|
|
89
|
+
if (delivery.description) {
|
|
90
|
+
parts.push(`**Description:** ${delivery.description}`);
|
|
91
|
+
}
|
|
92
|
+
// Compact issue listing
|
|
93
|
+
const deliveryIssues = issues.filter(i => i.deliveryId === delivery.id);
|
|
94
|
+
const actionableIssues = deliveryIssues.filter(i => i.issueType !== 'Context Group');
|
|
95
|
+
if (actionableIssues.length > 0) {
|
|
96
|
+
const statusCounts = new Map();
|
|
97
|
+
for (const issue of actionableIssues) {
|
|
98
|
+
statusCounts.set(issue.status, (statusCounts.get(issue.status) ?? 0) + 1);
|
|
99
|
+
}
|
|
100
|
+
const countParts = [];
|
|
101
|
+
for (const s of ['To Do', 'In Progress', 'Done', 'Blocked', 'In Review']) {
|
|
102
|
+
const count = statusCounts.get(s);
|
|
103
|
+
if (count !== undefined) {
|
|
104
|
+
countParts.push(`${count} ${s}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
parts.push(`**Issues (${countParts.join(', ')}):**`);
|
|
108
|
+
}
|
|
109
|
+
const wakeContextGroups = deliveryIssues.filter(i => i.issueType === 'Context Group');
|
|
110
|
+
for (const issue of deliveryIssues) {
|
|
111
|
+
if (issue.issueType === 'Context Group') {
|
|
112
|
+
const children = deliveryIssues.filter(i => i.parentIssueId === issue.id);
|
|
113
|
+
const depsSuffix = issue.dependsOn && issue.dependsOn.length > 0
|
|
114
|
+
? ` [depends on: ${issue.dependsOn.map(depId => {
|
|
115
|
+
const depCg = wakeContextGroups.find(cg => cg.id === depId);
|
|
116
|
+
return depCg ? `"${depCg.title}"` : depId;
|
|
117
|
+
}).join(', ')}]`
|
|
118
|
+
: '';
|
|
119
|
+
if (children.length > 0) {
|
|
120
|
+
const childSummaries = children.map(c => `${c.key} (${c.status})`).join(', ');
|
|
121
|
+
parts.push(` Context Group: "${issue.title}"${depsSuffix} -- children: ${childSummaries}`);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
parts.push(` Context Group: "${issue.title}"${depsSuffix}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else if (!issue.parentIssueId) {
|
|
128
|
+
parts.push(` - ${issue.key}: ${issue.title} (${issue.status})`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
parts.push('');
|
|
132
|
+
}
|
|
133
|
+
parts.push('Do NOT poll for new deliveries. The daemon will send them to you directly.');
|
|
134
|
+
parts.push('');
|
|
135
|
+
return parts.join('\n');
|
|
136
|
+
}
|
|
137
|
+
export { buildPlanningPass1Prompt, buildPlanningPass2Prompt, buildPlanningCombinedPrompt } from './planning-prompt-builder.js';
|
|
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"}
|