@telora/daemon 0.17.36 → 0.17.42
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/build-info.json +5 -3
- package/dist/assembly-engine.d.ts +6 -0
- package/dist/assembly-engine.d.ts.map +1 -1
- package/dist/assembly-engine.js +19 -0
- package/dist/assembly-engine.js.map +1 -1
- package/dist/assembly-resolvers.d.ts +17 -8
- package/dist/assembly-resolvers.d.ts.map +1 -1
- package/dist/assembly-resolvers.js +19 -8
- package/dist/assembly-resolvers.js.map +1 -1
- package/dist/cli/session-state.d.ts +10 -0
- package/dist/cli/session-state.d.ts.map +1 -1
- package/dist/cli/session-state.js +31 -0
- package/dist/cli/session-state.js.map +1 -1
- package/dist/completion/completion-decision.d.ts +83 -0
- package/dist/completion/completion-decision.d.ts.map +1 -0
- package/dist/completion/completion-decision.js +48 -0
- package/dist/completion/completion-decision.js.map +1 -0
- package/dist/completion/event-escalations.d.ts +97 -0
- package/dist/completion/event-escalations.d.ts.map +1 -0
- package/dist/completion/event-escalations.js +213 -0
- package/dist/completion/event-escalations.js.map +1 -0
- package/dist/completion/event.d.ts +1 -72
- package/dist/completion/event.d.ts.map +1 -1
- package/dist/completion/event.js +148 -322
- package/dist/completion/event.js.map +1 -1
- package/dist/completion/exit-classification.d.ts +82 -0
- package/dist/completion/exit-classification.d.ts.map +1 -0
- package/dist/completion/exit-classification.js +61 -0
- package/dist/completion/exit-classification.js.map +1 -0
- package/dist/completion/index.d.ts +14 -5
- package/dist/completion/index.d.ts.map +1 -1
- package/dist/completion/index.js +14 -5
- package/dist/completion/index.js.map +1 -1
- package/dist/completion/merge-phase.d.ts +114 -0
- package/dist/completion/merge-phase.d.ts.map +1 -0
- package/dist/completion/merge-phase.js +198 -0
- package/dist/completion/merge-phase.js.map +1 -0
- package/dist/completion/review-exit-phase.d.ts +82 -0
- package/dist/completion/review-exit-phase.d.ts.map +1 -0
- package/dist/completion/review-exit-phase.js +228 -0
- package/dist/completion/review-exit-phase.js.map +1 -0
- package/dist/completion/status-advance-phase.d.ts +61 -0
- package/dist/completion/status-advance-phase.d.ts.map +1 -0
- package/dist/completion/status-advance-phase.js +182 -0
- package/dist/completion/status-advance-phase.js.map +1 -0
- package/dist/completion/team-completion.d.ts +28 -269
- package/dist/completion/team-completion.d.ts.map +1 -1
- package/dist/completion/team-completion.js +145 -676
- package/dist/completion/team-completion.js.map +1 -1
- package/dist/daemon-process.d.ts +18 -2
- package/dist/daemon-process.d.ts.map +1 -1
- package/dist/daemon-process.js +7 -2
- package/dist/daemon-process.js.map +1 -1
- package/dist/directive/close-loop-stage.d.ts +50 -0
- package/dist/directive/close-loop-stage.d.ts.map +1 -0
- package/dist/directive/close-loop-stage.js +196 -0
- package/dist/directive/close-loop-stage.js.map +1 -0
- package/dist/directive/directive-assembly.d.ts +33 -0
- package/dist/directive/directive-assembly.d.ts.map +1 -0
- package/dist/directive/directive-assembly.js +77 -0
- package/dist/directive/directive-assembly.js.map +1 -0
- package/dist/directive/directive-dispatch.d.ts +103 -0
- package/dist/directive/directive-dispatch.d.ts.map +1 -0
- package/dist/directive/directive-dispatch.js +279 -0
- package/dist/directive/directive-dispatch.js.map +1 -0
- package/dist/directive/phase-sync.d.ts +89 -0
- package/dist/directive/phase-sync.d.ts.map +1 -0
- package/dist/directive/phase-sync.js +173 -0
- package/dist/directive/phase-sync.js.map +1 -0
- package/dist/directive-executor.d.ts +21 -223
- package/dist/directive-executor.d.ts.map +1 -1
- package/dist/directive-executor.js +28 -687
- package/dist/directive-executor.js.map +1 -1
- package/dist/focus-engine.d.ts.map +1 -1
- package/dist/focus-engine.js +8 -0
- package/dist/focus-engine.js.map +1 -1
- package/dist/focus-executor.d.ts +29 -8
- package/dist/focus-executor.d.ts.map +1 -1
- package/dist/focus-executor.js +29 -10
- package/dist/focus-executor.js.map +1 -1
- package/dist/focus-stage-lifecycle.d.ts +7 -5
- package/dist/focus-stage-lifecycle.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle.js +11 -6
- package/dist/focus-stage-lifecycle.js.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/pipeline-config.d.ts +13 -0
- package/dist/pipeline-config.d.ts.map +1 -1
- package/dist/pipeline-config.js +15 -0
- package/dist/pipeline-config.js.map +1 -1
- package/dist/resolvers/agent-escalations.d.ts +8 -1
- package/dist/resolvers/agent-escalations.d.ts.map +1 -1
- package/dist/resolvers/agent-escalations.js +25 -22
- package/dist/resolvers/agent-escalations.js.map +1 -1
- package/dist/resolvers/agent-session-summaries.d.ts +8 -1
- package/dist/resolvers/agent-session-summaries.d.ts.map +1 -1
- package/dist/resolvers/agent-session-summaries.js +21 -18
- package/dist/resolvers/agent-session-summaries.js.map +1 -1
- package/dist/resolvers/delivery-acceptance-criteria.d.ts +7 -1
- package/dist/resolvers/delivery-acceptance-criteria.d.ts.map +1 -1
- package/dist/resolvers/delivery-acceptance-criteria.js +14 -11
- package/dist/resolvers/delivery-acceptance-criteria.js.map +1 -1
- package/dist/resolvers/delivery-description.d.ts +7 -1
- package/dist/resolvers/delivery-description.d.ts.map +1 -1
- package/dist/resolvers/delivery-description.js +14 -11
- package/dist/resolvers/delivery-description.js.map +1 -1
- package/dist/resolvers/delivery-issues.d.ts +8 -1
- package/dist/resolvers/delivery-issues.d.ts.map +1 -1
- package/dist/resolvers/delivery-issues.js +51 -48
- package/dist/resolvers/delivery-issues.js.map +1 -1
- package/dist/resolvers/delivery-listing.d.ts +16 -1
- package/dist/resolvers/delivery-listing.d.ts.map +1 -1
- package/dist/resolvers/delivery-listing.js +36 -33
- package/dist/resolvers/delivery-listing.js.map +1 -1
- package/dist/resolvers/delivery-tech-context.d.ts +7 -1
- package/dist/resolvers/delivery-tech-context.d.ts.map +1 -1
- package/dist/resolvers/delivery-tech-context.js +14 -11
- package/dist/resolvers/delivery-tech-context.js.map +1 -1
- package/dist/resolvers/deployment-profile.d.ts +8 -1
- package/dist/resolvers/deployment-profile.d.ts.map +1 -1
- package/dist/resolvers/deployment-profile.js +20 -17
- package/dist/resolvers/deployment-profile.js.map +1 -1
- package/dist/resolvers/focus-anchoring-injections.d.ts +26 -1
- package/dist/resolvers/focus-anchoring-injections.d.ts.map +1 -1
- package/dist/resolvers/focus-anchoring-injections.js +91 -88
- package/dist/resolvers/focus-anchoring-injections.js.map +1 -1
- package/dist/resolvers/focus-context.d.ts +9 -1
- package/dist/resolvers/focus-context.d.ts.map +1 -1
- package/dist/resolvers/focus-context.js +38 -35
- package/dist/resolvers/focus-context.js.map +1 -1
- package/dist/resolvers/focus-injections.d.ts +13 -1
- package/dist/resolvers/focus-injections.d.ts.map +1 -1
- package/dist/resolvers/focus-injections.js +60 -57
- package/dist/resolvers/focus-injections.js.map +1 -1
- package/dist/resolvers/focus-last-review-report.d.ts +2 -1
- package/dist/resolvers/focus-last-review-report.d.ts.map +1 -1
- package/dist/resolvers/focus-last-review-report.js +33 -30
- package/dist/resolvers/focus-last-review-report.js.map +1 -1
- package/dist/resolvers/focus-reality-tree.d.ts +15 -1
- package/dist/resolvers/focus-reality-tree.d.ts.map +1 -1
- package/dist/resolvers/focus-reality-tree.js +35 -32
- package/dist/resolvers/focus-reality-tree.js.map +1 -1
- package/dist/resolvers/git-diff-against-base.d.ts +8 -1
- package/dist/resolvers/git-diff-against-base.d.ts.map +1 -1
- package/dist/resolvers/git-diff-against-base.js +33 -30
- package/dist/resolvers/git-diff-against-base.js.map +1 -1
- package/dist/resolvers/guards-evaluation-results.d.ts +7 -1
- package/dist/resolvers/guards-evaluation-results.d.ts.map +1 -1
- package/dist/resolvers/guards-evaluation-results.js +25 -22
- package/dist/resolvers/guards-evaluation-results.js.map +1 -1
- package/dist/resolvers/index.d.ts +22 -40
- package/dist/resolvers/index.d.ts.map +1 -1
- package/dist/resolvers/index.js +112 -41
- package/dist/resolvers/index.js.map +1 -1
- package/dist/resolvers/loop-context.d.ts +18 -1
- package/dist/resolvers/loop-context.d.ts.map +1 -1
- package/dist/resolvers/loop-context.js +21 -18
- package/dist/resolvers/loop-context.js.map +1 -1
- package/dist/resolvers/loop-delivery-index.d.ts +17 -1
- package/dist/resolvers/loop-delivery-index.d.ts.map +1 -1
- package/dist/resolvers/loop-delivery-index.js +51 -48
- package/dist/resolvers/loop-delivery-index.js.map +1 -1
- package/dist/resolvers/loop-documents.d.ts +9 -1
- package/dist/resolvers/loop-documents.d.ts.map +1 -1
- package/dist/resolvers/loop-documents.js +22 -19
- package/dist/resolvers/loop-documents.js.map +1 -1
- package/dist/resolvers/loop-expected-effects.d.ts +11 -1
- package/dist/resolvers/loop-expected-effects.d.ts.map +1 -1
- package/dist/resolvers/loop-expected-effects.js +53 -50
- package/dist/resolvers/loop-expected-effects.js.map +1 -1
- package/dist/resolvers/loop-frt-statement.d.ts +11 -1
- package/dist/resolvers/loop-frt-statement.d.ts.map +1 -1
- package/dist/resolvers/loop-frt-statement.js +28 -25
- package/dist/resolvers/loop-frt-statement.js.map +1 -1
- package/dist/resolvers/loop-injection.d.ts +10 -1
- package/dist/resolvers/loop-injection.d.ts.map +1 -1
- package/dist/resolvers/loop-injection.js +38 -35
- package/dist/resolvers/loop-injection.js.map +1 -1
- package/dist/resolvers/loop-persona.d.ts +20 -1
- package/dist/resolvers/loop-persona.d.ts.map +1 -1
- package/dist/resolvers/loop-persona.js +20 -17
- package/dist/resolvers/loop-persona.js.map +1 -1
- package/dist/resolvers/loop-questions.d.ts +8 -1
- package/dist/resolvers/loop-questions.d.ts.map +1 -1
- package/dist/resolvers/loop-questions.js +39 -36
- package/dist/resolvers/loop-questions.js.map +1 -1
- package/dist/resolvers/loop-upstream-udes.d.ts +11 -1
- package/dist/resolvers/loop-upstream-udes.d.ts.map +1 -1
- package/dist/resolvers/loop-upstream-udes.js +74 -71
- package/dist/resolvers/loop-upstream-udes.js.map +1 -1
- package/dist/resolvers/prd-context.d.ts +2 -0
- package/dist/resolvers/prd-context.d.ts.map +1 -1
- package/dist/resolvers/prd-context.js +16 -13
- package/dist/resolvers/prd-context.js.map +1 -1
- package/dist/resolvers/prd-persona.d.ts +2 -0
- package/dist/resolvers/prd-persona.d.ts.map +1 -1
- package/dist/resolvers/prd-persona.js +6 -3
- package/dist/resolvers/prd-persona.js.map +1 -1
- package/dist/resolvers/reality-metrics.d.ts +8 -1
- package/dist/resolvers/reality-metrics.d.ts.map +1 -1
- package/dist/resolvers/reality-metrics.js +73 -70
- package/dist/resolvers/reality-metrics.js.map +1 -1
- package/dist/resolvers/reality-projections.d.ts +7 -1
- package/dist/resolvers/reality-projections.d.ts.map +1 -1
- package/dist/resolvers/reality-projections.js +35 -32
- package/dist/resolvers/reality-projections.js.map +1 -1
- package/dist/resolvers/reality-tree-snapshot.d.ts +10 -1
- package/dist/resolvers/reality-tree-snapshot.d.ts.map +1 -1
- package/dist/resolvers/reality-tree-snapshot.js +34 -31
- package/dist/resolvers/reality-tree-snapshot.js.map +1 -1
- package/dist/resolvers/retired-injections.d.ts +10 -1
- package/dist/resolvers/retired-injections.d.ts.map +1 -1
- package/dist/resolvers/retired-injections.js +68 -65
- package/dist/resolvers/retired-injections.js.map +1 -1
- package/dist/resolvers/review-outcomes.d.ts +11 -1
- package/dist/resolvers/review-outcomes.d.ts.map +1 -1
- package/dist/resolvers/review-outcomes.js +27 -24
- package/dist/resolvers/review-outcomes.js.map +1 -1
- package/dist/resolvers/security-advisory.d.ts +2 -1
- package/dist/resolvers/security-advisory.d.ts.map +1 -1
- package/dist/resolvers/security-advisory.js +47 -44
- package/dist/resolvers/security-advisory.js.map +1 -1
- package/dist/resolvers/wiki-search.d.ts +8 -1
- package/dist/resolvers/wiki-search.d.ts.map +1 -1
- package/dist/resolvers/wiki-search.js +17 -14
- package/dist/resolvers/wiki-search.js.map +1 -1
- package/dist/resolvers/wiki-topic.d.ts +9 -1
- package/dist/resolvers/wiki-topic.d.ts.map +1 -1
- package/dist/resolvers/wiki-topic.js +21 -18
- package/dist/resolvers/wiki-topic.js.map +1 -1
- package/dist/resolvers/workflow-stages.d.ts +7 -1
- package/dist/resolvers/workflow-stages.d.ts.map +1 -1
- package/dist/resolvers/workflow-stages.js +20 -17
- package/dist/resolvers/workflow-stages.js.map +1 -1
- package/dist/self-update.d.ts +6 -0
- package/dist/self-update.d.ts.map +1 -1
- package/dist/self-update.js +6 -1
- package/dist/self-update.js.map +1 -1
- package/dist/spawner/index.d.ts +2 -1
- package/dist/spawner/index.d.ts.map +1 -1
- package/dist/spawner/index.js +2 -1
- package/dist/spawner/index.js.map +1 -1
- package/dist/spawner/spawn-team.d.ts +14 -52
- package/dist/spawner/spawn-team.d.ts.map +1 -1
- package/dist/spawner/spawn-team.js +14 -469
- package/dist/spawner/spawn-team.js.map +1 -1
- package/dist/staleness.d.ts +124 -0
- package/dist/staleness.d.ts.map +1 -0
- package/dist/staleness.js +215 -0
- package/dist/staleness.js.map +1 -0
- package/dist/state-cascade.d.ts +3 -2
- package/dist/state-cascade.d.ts.map +1 -1
- package/dist/state-cascade.js +7 -3
- package/dist/state-cascade.js.map +1 -1
- package/dist/types/focus.d.ts +5 -4
- package/dist/types/focus.d.ts.map +1 -1
- package/dist/types/session.d.ts +2 -3
- package/dist/types/session.d.ts.map +1 -1
- package/dist/unified-shell.d.ts.map +1 -1
- package/dist/unified-shell.js +21 -12
- package/dist/unified-shell.js.map +1 -1
- package/package.json +2 -2
- package/dist/session-lifecycle.d.ts +0 -78
- package/dist/session-lifecycle.d.ts.map +0 -1
- package/dist/session-lifecycle.js +0 -382
- package/dist/session-lifecycle.js.map +0 -1
|
@@ -1,153 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Team completion -- explicit phase sequencer.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*/
|
|
8
|
-
import type { DaemonConfig, FocusTeamState, FocusDeliveryInfo, FocusTeamPhase, Workflow, PolicyFailureMode, ExitCategory } from '../types.js';
|
|
9
|
-
import { getDeliveryIssues, fetchEffectiveWorkflow, updateDeliveryStatus, markDeliveryAutoApproved, getActiveFocuses } from '../supabase.js';
|
|
10
|
-
import { hasPendingSpawnDirective } from '../directive-executor.js';
|
|
11
|
-
import type { StageAdvanceResult } from '../delivery-lifecycle.js';
|
|
12
|
-
import { mergeFocusBranch } from '../focus-merge.js';
|
|
13
|
-
import { emitLoopTrigger } from '../loop-event-bus.js';
|
|
14
|
-
import { branchHasUnmergedCommits } from '../git.js';
|
|
15
|
-
import { getFocusDeliveries, getFocusIssues, clearReviewRequestedAt, getFocusReviewReportForSession } from '../queries/focuses.js';
|
|
16
|
-
import { createEscalation } from '../queries/issues.js';
|
|
17
|
-
export { isStatusTerminal, isStatusAgentActionable } from '../stage-classifier.js';
|
|
18
|
-
/**
|
|
19
|
-
* Decide whether to attempt mergeFocusBranch on team exit.
|
|
20
|
-
*
|
|
21
|
-
* The gate asks "does the branch have clean committed work?" rather than
|
|
22
|
-
* "did the team session exit cleanly?" -- so a team that exits via review-
|
|
23
|
-
* cycle SIGTERM, role-clear, daemon crash, or manual termination still gets
|
|
24
|
-
* its committed work propagated to integration.
|
|
25
|
-
*
|
|
26
|
-
* Skip merge when:
|
|
27
|
-
* - The team is still in its planning phase (cancellation mid-planning --
|
|
28
|
-
* nothing scoped, nothing to merge), OR
|
|
29
|
-
* - The team is a read-only audit session (read-only violation; commits, if
|
|
30
|
-
* any, are surfaced separately by the existing readOnly guard), OR
|
|
31
|
-
* - The branch has no committed work ahead of integration (clean exit with
|
|
32
|
-
* no commits, e.g. audit team or planning-only team).
|
|
33
|
-
*
|
|
34
|
-
* Exported for unit testing the gate logic in isolation.
|
|
35
|
-
*/
|
|
36
|
-
export declare function shouldAttemptMerge(teamState: Pick<FocusTeamState, 'planningPhase' | 'readOnly'>, branchHasCommits: boolean): boolean;
|
|
37
|
-
/**
|
|
38
|
-
* Statuses for deliveries whose git state should be reported on team
|
|
39
|
-
* completion. Includes 'done' so a focus whose deliveries all reached done
|
|
40
|
-
* before the branch was merged (review SIGTERM, role-clear, deferred merge,
|
|
41
|
-
* etc.) still attempts the merge instead of being short-circuited as
|
|
42
|
-
* "no worked deliveries". Excludes 'queued'/'planning'/'paused'/'cancelled'
|
|
43
|
-
* — those represent work that never started or was abandoned.
|
|
4
|
+
* "What happens when a team exits" reads from handleTeamCompletion below:
|
|
5
|
+
* an ordered sequence of named phases. The phase implementations live in
|
|
6
|
+
* focused modules, re-exported here so existing importers are unaffected:
|
|
44
7
|
*
|
|
45
|
-
*
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
*
|
|
50
|
-
* completion. Excludes already-merged deliveries so we don't re-report them.
|
|
8
|
+
* - exit-classification.ts classify exit (success / controlled stop / crash)
|
|
9
|
+
* - merge-phase.ts merge gate + focus->integration merge +
|
|
10
|
+
* merge-failure escalation + CI integration->main
|
|
11
|
+
* - status-advance-phase.ts delivery status advancement from issue completion
|
|
12
|
+
* - review-exit-phase.ts verify-delivery routing on review exit
|
|
51
13
|
*
|
|
52
|
-
*
|
|
14
|
+
* Phase order on team exit:
|
|
15
|
+
* classify -> report git state -> read-only guard -> WIP preserve ->
|
|
16
|
+
* status advance -> merge -> CI merge-to-main -> session finalize ->
|
|
17
|
+
* review exit (escalate/handoff) -> terminate (cleanup + re-poll)
|
|
53
18
|
*/
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
export
|
|
59
|
-
|
|
60
|
-
mergeFocusBranch: typeof mergeFocusBranch;
|
|
61
|
-
}
|
|
62
|
-
export interface FocusMergeAttemptResult {
|
|
63
|
-
attempted: boolean;
|
|
64
|
-
mergeSucceeded: boolean;
|
|
65
|
-
exitReason: string | null;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Decide whether to merge the focus branch and, if so, run the merge.
|
|
69
|
-
*
|
|
70
|
-
* This is the integration of three separate concerns that the merge gate
|
|
71
|
-
* conflated before:
|
|
72
|
-
* 1. Branch state: does the focus branch actually have committed work?
|
|
73
|
-
* 2. Team gate: planningPhase + readOnly safety nets in shouldAttemptMerge.
|
|
74
|
-
* 3. Per-delivery telemetry: workedDeliveryIds is passed through for
|
|
75
|
-
* git-state reporting inside mergeFocusBranch.
|
|
76
|
-
*
|
|
77
|
-
* Returns attempted=false when the gate skips the merge (clean exit with
|
|
78
|
-
* nothing to merge, planning-phase, or read-only). Returns attempted=true
|
|
79
|
-
* with the merge result otherwise.
|
|
80
|
-
*
|
|
81
|
-
* Exported so tests can verify the threading from done-only deliveries +
|
|
82
|
-
* branch-with-commits to a real mergeFocusBranch invocation, without having
|
|
83
|
-
* to mock all of handleTeamCompletion's other side effects.
|
|
84
|
-
*/
|
|
85
|
-
export declare function attemptFocusMerge(config: DaemonConfig, teamState: FocusTeamState, sessionId: string, workedDeliveryIds: string[], deps?: FocusMergeAttemptDeps): Promise<FocusMergeAttemptResult>;
|
|
86
|
-
/**
|
|
87
|
-
* Dependencies for runReviewExitHandler. Defaults to real implementations;
|
|
88
|
-
* overridable in tests via the optional `deps` argument.
|
|
89
|
-
*/
|
|
90
|
-
export interface ReviewExitDeps {
|
|
91
|
-
getActiveFocuses: typeof getActiveFocuses;
|
|
92
|
-
getFocusDeliveries: typeof getFocusDeliveries;
|
|
93
|
-
getFocusIssues: typeof getFocusIssues;
|
|
94
|
-
getDeliveryIssues: typeof getDeliveryIssues;
|
|
95
|
-
fetchEffectiveWorkflow: typeof fetchEffectiveWorkflow;
|
|
96
|
-
updateDeliveryStatus: typeof updateDeliveryStatus;
|
|
97
|
-
markDeliveryAutoApproved: typeof markDeliveryAutoApproved;
|
|
98
|
-
clearReviewRequestedAt: typeof clearReviewRequestedAt;
|
|
99
|
-
hasPendingSpawnDirective: typeof hasPendingSpawnDirective;
|
|
100
|
-
emitLoopTrigger: typeof emitLoopTrigger;
|
|
101
|
-
getFocusReviewReportForSession: typeof getFocusReviewReportForSession;
|
|
102
|
-
createEscalation: typeof createEscalation;
|
|
103
|
-
}
|
|
104
|
-
export interface ReviewExitParams {
|
|
105
|
-
focusId: string;
|
|
106
|
-
focusName: string;
|
|
107
|
-
organizationId: string;
|
|
108
|
-
productId: string;
|
|
109
|
-
sessionId: string;
|
|
110
|
-
sessionType: 'coding' | 'review';
|
|
111
|
-
succeeded: boolean;
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Handle a team exit when the focus has review_requested_at set.
|
|
115
|
-
*
|
|
116
|
-
* Routing is asymmetric in the downward direction (toward intent) -- open
|
|
117
|
-
* work on a verify delivery means the work isn't done, so it routes to
|
|
118
|
-
* verify_failed unconditionally. Closing a verify delivery to `done` is
|
|
119
|
-
* the other direction; it now happens via two paths: an explicit
|
|
120
|
-
* focus_reviews approval, OR a clean review session exit (auto-approve,
|
|
121
|
-
* reversible via the later unapprove affordance).
|
|
122
|
-
*
|
|
123
|
-
* Routing rules:
|
|
124
|
-
* 1. No review_requested_at -> nothing to do.
|
|
125
|
-
* 2. A spawn directive is pending -> defer to the incoming team.
|
|
126
|
-
* 3. For each verify delivery:
|
|
127
|
-
* - open work issues -> verify_failed (always, no evidence gate)
|
|
128
|
-
* - no open work + reportExists -> done (explicit approval)
|
|
129
|
-
* - no open work + no report + review session succeeded ->
|
|
130
|
-
* done (auto-approve; tagged with auto_approved_at /
|
|
131
|
-
* auto_approved_by_session for surfacing + unapprove)
|
|
132
|
-
* - no open work + non-review session (or failed review) ->
|
|
133
|
-
* leave in verify (next auto-review poll re-triggers)
|
|
134
|
-
* 4. If anything routed -> clear review_requested_at + emit
|
|
135
|
-
* review_completed event so phase re-derives on the next poll.
|
|
136
|
-
* 5. If routed via issue evidence (no report present), file a soft
|
|
137
|
-
* review_missing_report notice -- the loop continues regardless.
|
|
138
|
-
* 6. If nothing routed AND no evidence at all -> warn-and-leave. The
|
|
139
|
-
* strict gate no longer escalates: an idle focus with no work and no
|
|
140
|
-
* report is ambiguous, not failed; humans clear it via the MCP
|
|
141
|
-
* clear-review-request path.
|
|
142
|
-
*
|
|
143
|
-
* The independent "evidence" signals (focus_reviews row + review-filed
|
|
144
|
-
* issues) still feed into the issue-evidence notice and the warn-and-leave
|
|
145
|
-
* messaging, but they no longer gate routing -- open work on a delivery
|
|
146
|
-
* is its own evidence that the work isn't done.
|
|
147
|
-
*
|
|
148
|
-
* Exported with injectable deps for unit testing.
|
|
149
|
-
*/
|
|
150
|
-
export declare function runReviewExitHandler(params: ReviewExitParams, deps?: ReviewExitDeps): Promise<void>;
|
|
19
|
+
import type { DaemonConfig, FocusTeamState } from '../types.js';
|
|
20
|
+
export { isStatusTerminal, isStatusAgentActionable } from '../stage-classifier.js';
|
|
21
|
+
export { type TeamExitClassification, classifyTeamExit, deriveExitCategory, } from './exit-classification.js';
|
|
22
|
+
export { shouldAttemptMerge, REPORTABLE_DELIVERY_STATUSES, selectWorkedDeliveryIds, type FocusMergeAttemptDeps, type FocusMergeAttemptResult, attemptFocusMerge, escalateFailedMergeDeliveries, runCiMergeToMain, } from './merge-phase.js';
|
|
23
|
+
export { type AdvanceDeliveryDeps, advanceDeliveryStatuses, } from './status-advance-phase.js';
|
|
24
|
+
export { type ReviewExitDeps, type ReviewExitParams, runReviewExitHandler, } from './review-exit-phase.js';
|
|
151
25
|
export interface TeamCompletionParams {
|
|
152
26
|
config: DaemonConfig;
|
|
153
27
|
teamState: FocusTeamState;
|
|
@@ -155,135 +29,20 @@ export interface TeamCompletionParams {
|
|
|
155
29
|
code: number | null;
|
|
156
30
|
signal: string | null;
|
|
157
31
|
}
|
|
158
|
-
/** Result of classifying how a team lead process exited. */
|
|
159
|
-
export interface TeamExitClassification {
|
|
160
|
-
/** Normalized exit code (null -> 1). */
|
|
161
|
-
exitCode: number;
|
|
162
|
-
/** Node reports a SIGTERM as either signal='SIGTERM' or code=143 (128+15). */
|
|
163
|
-
wasSigterm: boolean;
|
|
164
|
-
/**
|
|
165
|
-
* True when the daemon itself terminated the team because its work was done
|
|
166
|
-
* (shutdownReason='work_complete') -- a lifecycle teardown, NOT a crash.
|
|
167
|
-
*/
|
|
168
|
-
proactivelyTerminated: boolean;
|
|
169
|
-
/**
|
|
170
|
-
* True when the exit should be treated as a SUCCESSFUL completion: a clean
|
|
171
|
-
* code-0 exit, or a proactive lifecycle termination. This is the signal the
|
|
172
|
-
* review-exit handler keys off to auto-approve a clean review's verify
|
|
173
|
-
* delivery -- so a review team that the daemon SIGTERMs as part of normal
|
|
174
|
-
* teardown is NOT mistaken for a failed review.
|
|
175
|
-
*
|
|
176
|
-
* IMPORTANT: `succeeded` is NARROW on purpose -- it stays false for a benign
|
|
177
|
-
* daemon-initiated SIGTERM whose reason is NOT work_complete (deactivated /
|
|
178
|
-
* handoff / teardown / user_stopped). The review auto-approve path depends on
|
|
179
|
-
* that. To label such a controlled stop as a non-error terminal status, use
|
|
180
|
-
* `controlledStop` / `disposition` instead of widening `succeeded`.
|
|
181
|
-
*/
|
|
182
|
-
succeeded: boolean;
|
|
183
|
-
/**
|
|
184
|
-
* True when the daemon itself drove this exit: the team was in the
|
|
185
|
-
* 'shutting_down' phase and the process exited via SIGTERM -- for ANY
|
|
186
|
-
* shutdownReason (work_complete, deactivated, handoff, teardown,
|
|
187
|
-
* user_stopped, or none). Distinguishes a deliberate daemon stop from a
|
|
188
|
-
* genuine crash, WITHOUT widening `succeeded`.
|
|
189
|
-
*/
|
|
190
|
-
controlledStop: boolean;
|
|
191
|
-
/**
|
|
192
|
-
* Terminal disposition for the session status label:
|
|
193
|
-
* - 'completed' -- a successful exit (`succeeded`).
|
|
194
|
-
* - 'stopped' -- a controlled daemon stop that was not a success
|
|
195
|
-
* (`controlledStop && !succeeded`).
|
|
196
|
-
* - 'failed' -- a genuine crash / unexpected exit.
|
|
197
|
-
* Maps 1:1 to the agent_sessions status the daemon writes.
|
|
198
|
-
*/
|
|
199
|
-
disposition: 'completed' | 'stopped' | 'failed';
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Classify how a team lead process exited.
|
|
203
|
-
*
|
|
204
|
-
* Pure and side-effect free so the "lifecycle SIGTERM is not a review failure"
|
|
205
|
-
* invariant is unit-testable in isolation. The crux: when the daemon proactively
|
|
206
|
-
* terminates a team because its work is complete, it sets phase='shutting_down'
|
|
207
|
-
* and shutdownReason='work_complete' BEFORE sending SIGTERM. We detect that
|
|
208
|
-
* teardown and classify it as succeeded -- otherwise a clean review team
|
|
209
|
-
* (which commits nothing of its own, then gets SIGTERMed once all deliveries
|
|
210
|
-
* are terminal) would look like a failed exit and its verify delivery would be
|
|
211
|
-
* stranded in `verify` instead of auto-approved to `done`.
|
|
212
|
-
*/
|
|
213
|
-
export declare function classifyTeamExit(params: {
|
|
214
|
-
code: number | null;
|
|
215
|
-
signal: string | null;
|
|
216
|
-
teamPhase: FocusTeamPhase;
|
|
217
|
-
shutdownReason: FocusTeamState['shutdownReason'];
|
|
218
|
-
}): TeamExitClassification;
|
|
219
|
-
/**
|
|
220
|
-
* Derive the `exit_category` to record alongside the session status, given the
|
|
221
|
-
* classifier disposition and the team's shutdown reason.
|
|
222
|
-
*
|
|
223
|
-
* - 'completed' -> 'work_complete' when the daemon stopped the team because its
|
|
224
|
-
* work was done; otherwise null (a plain clean self-exit has no category).
|
|
225
|
-
* - 'stopped' -> the specific controlled-stop reason; any unknown/null reason
|
|
226
|
-
* falls back to 'handoff' (a benign daemon-initiated respawn).
|
|
227
|
-
* - 'failed' -> 'error' (genuine crash / unexpected exit).
|
|
228
|
-
*/
|
|
229
|
-
export declare function deriveExitCategory(disposition: TeamExitClassification['disposition'], shutdownReason: FocusTeamState['shutdownReason']): ExitCategory | null;
|
|
230
32
|
/**
|
|
231
33
|
* Handle the team lead process exiting.
|
|
232
34
|
*
|
|
233
|
-
* Responsibilities:
|
|
35
|
+
* Responsibilities (in phase order):
|
|
36
|
+
* - Classify the exit (lifecycle teardown vs crash -- see classifyTeamExit)
|
|
234
37
|
* - Report git state for all known deliveries
|
|
38
|
+
* - Read-only audit guard (revert / block merge on violation)
|
|
39
|
+
* - Preserve WIP commits on unclean exits
|
|
235
40
|
* - Advance delivery statuses based on issue completion
|
|
236
|
-
* - Merge focus branch to integration
|
|
237
|
-
* -
|
|
238
|
-
* -
|
|
239
|
-
* -
|
|
240
|
-
* -
|
|
41
|
+
* - Merge focus branch to integration + escalate per-delivery merge failures
|
|
42
|
+
* - CI: merge integration -> main (CD optionally pushes)
|
|
43
|
+
* - Finalize the session record (status, exit reason, diff stats)
|
|
44
|
+
* - Review exit routing (escalate / handoff -- see runReviewExitHandler)
|
|
45
|
+
* - Terminate: heartbeat, team-state cleanup, re-poll trigger
|
|
241
46
|
*/
|
|
242
47
|
export declare function handleTeamCompletion(params: TeamCompletionParams): Promise<void>;
|
|
243
|
-
/**
|
|
244
|
-
* External dependencies for advanceDeliveryStatuses.
|
|
245
|
-
* Defaults to real implementations; overridable in tests.
|
|
246
|
-
*/
|
|
247
|
-
export interface AdvanceDeliveryDeps {
|
|
248
|
-
getFocusDeliveries: (focusId: string) => Promise<FocusDeliveryInfo[]>;
|
|
249
|
-
getDeliveryIssues: (deliveryId: string) => Promise<Array<{
|
|
250
|
-
id: string;
|
|
251
|
-
title: string;
|
|
252
|
-
status: string;
|
|
253
|
-
issueType: string;
|
|
254
|
-
}>>;
|
|
255
|
-
getDeliverySessionCount: (deliveryId: string) => Promise<number>;
|
|
256
|
-
updateIssueStatus: (issueId: string, status: string) => Promise<void>;
|
|
257
|
-
fetchEffectiveWorkflow: (deliveryId: string) => Promise<Workflow>;
|
|
258
|
-
updateDeliveryStatus: typeof updateDeliveryStatus;
|
|
259
|
-
advanceDeliveryStage: (params: {
|
|
260
|
-
deliveryId: string;
|
|
261
|
-
deliveryName: string;
|
|
262
|
-
organizationId: string;
|
|
263
|
-
workflow: Workflow;
|
|
264
|
-
currentStageId: string;
|
|
265
|
-
fromStatus?: string | null;
|
|
266
|
-
exitCode: number;
|
|
267
|
-
openIssueCount: number;
|
|
268
|
-
sessionCount: number;
|
|
269
|
-
policyFailureMode: PolicyFailureMode;
|
|
270
|
-
sessionId: string | null;
|
|
271
|
-
focusId?: string;
|
|
272
|
-
config?: DaemonConfig;
|
|
273
|
-
}) => Promise<StageAdvanceResult>;
|
|
274
|
-
}
|
|
275
|
-
/**
|
|
276
|
-
* Advance delivery statuses after team completion.
|
|
277
|
-
*
|
|
278
|
-
* Re-queries all deliveries for the focus from the database rather
|
|
279
|
-
* than relying on the spawn-time snapshot in teamState.knownDeliveryIds.
|
|
280
|
-
* This ensures deliveries added mid-flight (after the team was spawned)
|
|
281
|
-
* are discovered and advanced, and that stale deliveryStageIds don't
|
|
282
|
-
* cause deliveries to be skipped.
|
|
283
|
-
*
|
|
284
|
-
* For each delivery in 'coding' status:
|
|
285
|
-
* - All issues Done (or no issues): advance via workflow (coding -> verify -> done)
|
|
286
|
-
* - Open issues remain: re-queue to 'queued' so the next team session picks it up
|
|
287
|
-
*/
|
|
288
|
-
export declare function advanceDeliveryStatuses(config: DaemonConfig, teamState: FocusTeamState, sessionId: string, deps?: AdvanceDeliveryDeps): Promise<void>;
|
|
289
48
|
//# sourceMappingURL=team-completion.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team-completion.d.ts","sourceRoot":"","sources":["../../src/completion/team-completion.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"team-completion.d.ts","sourceRoot":"","sources":["../../src/completion/team-completion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAqB,MAAM,aAAa,CAAC;AAsBnF,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,EACL,KAAK,sBAAsB,EAC3B,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,EAClB,4BAA4B,EAC5B,uBAAuB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,iBAAiB,EACjB,6BAA6B,EAC7B,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,mBAAmB,EACxB,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,cAAc,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AA8GD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsKtF"}
|