@telora/daemon 0.13.12 → 0.13.15

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.
Files changed (59) hide show
  1. package/build-info.json +2 -2
  2. package/dist/pm/adaptive-poller.d.ts +26 -0
  3. package/dist/pm/adaptive-poller.d.ts.map +1 -0
  4. package/dist/pm/adaptive-poller.js +53 -0
  5. package/dist/pm/adaptive-poller.js.map +1 -0
  6. package/dist/pm/cascade-evaluator.d.ts +29 -0
  7. package/dist/pm/cascade-evaluator.d.ts.map +1 -0
  8. package/dist/pm/cascade-evaluator.js +135 -0
  9. package/dist/pm/cascade-evaluator.js.map +1 -0
  10. package/dist/pm/channel-email.d.ts +42 -0
  11. package/dist/pm/channel-email.d.ts.map +1 -0
  12. package/dist/pm/channel-email.js +47 -0
  13. package/dist/pm/channel-email.js.map +1 -0
  14. package/dist/pm/channel-slack.d.ts +40 -0
  15. package/dist/pm/channel-slack.d.ts.map +1 -0
  16. package/dist/pm/channel-slack.js +46 -0
  17. package/dist/pm/channel-slack.js.map +1 -0
  18. package/dist/pm/communication-drafter.d.ts +44 -0
  19. package/dist/pm/communication-drafter.d.ts.map +1 -0
  20. package/dist/pm/communication-drafter.js +84 -0
  21. package/dist/pm/communication-drafter.js.map +1 -0
  22. package/dist/pm/dialog-handler.d.ts +32 -0
  23. package/dist/pm/dialog-handler.d.ts.map +1 -0
  24. package/dist/pm/dialog-handler.js +107 -0
  25. package/dist/pm/dialog-handler.js.map +1 -0
  26. package/dist/pm/mitigation-correlator.d.ts +29 -0
  27. package/dist/pm/mitigation-correlator.d.ts.map +1 -0
  28. package/dist/pm/mitigation-correlator.js +147 -0
  29. package/dist/pm/mitigation-correlator.js.map +1 -0
  30. package/dist/pm/risk-scanner.d.ts +28 -0
  31. package/dist/pm/risk-scanner.d.ts.map +1 -0
  32. package/dist/pm/risk-scanner.js +112 -0
  33. package/dist/pm/risk-scanner.js.map +1 -0
  34. package/dist/pm-engine.d.ts +67 -0
  35. package/dist/pm-engine.d.ts.map +1 -0
  36. package/dist/pm-engine.js +277 -0
  37. package/dist/pm-engine.js.map +1 -0
  38. package/dist/queries/strategies.d.ts +2 -0
  39. package/dist/queries/strategies.d.ts.map +1 -1
  40. package/dist/queries/strategies.js +7 -0
  41. package/dist/queries/strategies.js.map +1 -1
  42. package/dist/state-cascade.d.ts +4 -15
  43. package/dist/state-cascade.d.ts.map +1 -1
  44. package/dist/state-cascade.js +10 -73
  45. package/dist/state-cascade.js.map +1 -1
  46. package/dist/strategy-completion.d.ts.map +1 -1
  47. package/dist/strategy-completion.js +20 -3
  48. package/dist/strategy-completion.js.map +1 -1
  49. package/dist/strategy-executor.d.ts.map +1 -1
  50. package/dist/strategy-executor.js +7 -66
  51. package/dist/strategy-executor.js.map +1 -1
  52. package/dist/strategy-prompt-builder.d.ts.map +1 -1
  53. package/dist/strategy-prompt-builder.js +4 -0
  54. package/dist/strategy-prompt-builder.js.map +1 -1
  55. package/dist/unified-shell.d.ts +1 -1
  56. package/dist/unified-shell.d.ts.map +1 -1
  57. package/dist/unified-shell.js +56 -1
  58. package/dist/unified-shell.js.map +1 -1
  59. package/package.json +1 -1
@@ -0,0 +1,277 @@
1
+ /**
2
+ * PMEngine -- ExecutionEngine adapter for the PM (Project Manager) monitoring engine.
3
+ *
4
+ * The PM engine is a monitoring-only engine that does NOT spawn Claude Code
5
+ * processes. It polls the database for risk states and dependencies, evaluates
6
+ * transitions, and produces action recommendations via structured logging.
7
+ *
8
+ * Lifecycle (called by the process shell):
9
+ * 1. init(config) -- validate config, initialize API client
10
+ * 2. recoverFromCrash() -- no-op (no worktrees or processes to recover)
11
+ * 3. start() -- begin adaptive poll loop
12
+ * 4. stop() -- clear intervals, set shutting-down flag
13
+ * 5. shutdown() -- no-op (no processes to kill)
14
+ */
15
+ import { initSupabase, callApi } from './queries/shared.js';
16
+ import { scanRiskDependencies } from './pm/risk-scanner.js';
17
+ import { correlateMitigationProgress } from './pm/mitigation-correlator.js';
18
+ import { computePollInterval, DEFAULT_POLL_CADENCE, } from './pm/adaptive-poller.js';
19
+ import { draftCommunication } from './pm/communication-drafter.js';
20
+ // ---------------------------------------------------------------------------
21
+ // PMEngine
22
+ // ---------------------------------------------------------------------------
23
+ export class PMEngine {
24
+ name = 'pm';
25
+ /** Daemon config, set during init(). */
26
+ config = null;
27
+ /** Optional resource governor (stored but not actively used). */
28
+ governor = null;
29
+ /** Poll cadence configuration. */
30
+ pollCadence = DEFAULT_POLL_CADENCE;
31
+ /** Active poll timeout handle (for adaptive interval). */
32
+ pollTimeout = null;
33
+ /** Whether the engine is shutting down. */
34
+ shuttingDown = false;
35
+ /** Count of active (non-resolved, non-draft) risks from last scan. */
36
+ activeRiskCount = 0;
37
+ /** Last poll timestamp for health reporting. */
38
+ lastPollAt = null;
39
+ /** Last set of risk stages seen (for adaptive polling). */
40
+ lastRiskStages = [];
41
+ /** Total follow-up actions from last scan. */
42
+ lastFollowupActionCount = 0;
43
+ /** Mitigation assessment summary from last scan. */
44
+ lastMitigationSummary = {};
45
+ // -----------------------------------------------------------------------
46
+ // setGovernor
47
+ // -----------------------------------------------------------------------
48
+ setGovernor(gov) {
49
+ this.governor = gov;
50
+ // PM engine does not acquire governor slots (no Claude processes)
51
+ }
52
+ // -----------------------------------------------------------------------
53
+ // init
54
+ // -----------------------------------------------------------------------
55
+ async init(config) {
56
+ this.config = config;
57
+ // Resolve poll cadence from config
58
+ const pmConfig = config.pm;
59
+ if (pmConfig && typeof pmConfig === 'object') {
60
+ const pc = pmConfig;
61
+ if (pc.pollCadence && typeof pc.pollCadence === 'object') {
62
+ const cadence = pc.pollCadence;
63
+ this.pollCadence = {
64
+ activeIntervalMs: typeof cadence.activeIntervalMs === 'number'
65
+ ? cadence.activeIntervalMs : DEFAULT_POLL_CADENCE.activeIntervalMs,
66
+ imminentIntervalMs: typeof cadence.imminentIntervalMs === 'number'
67
+ ? cadence.imminentIntervalMs : DEFAULT_POLL_CADENCE.imminentIntervalMs,
68
+ trackingIntervalMs: typeof cadence.trackingIntervalMs === 'number'
69
+ ? cadence.trackingIntervalMs : DEFAULT_POLL_CADENCE.trackingIntervalMs,
70
+ defaultIntervalMs: typeof cadence.defaultIntervalMs === 'number'
71
+ ? cadence.defaultIntervalMs : DEFAULT_POLL_CADENCE.defaultIntervalMs,
72
+ };
73
+ }
74
+ }
75
+ // Initialize API client (reuse shared infrastructure -- may already be
76
+ // initialized by the strategy engine, but initSupabase is idempotent)
77
+ initSupabase(this.config);
78
+ console.log('[PM] Engine initialized');
79
+ }
80
+ // -----------------------------------------------------------------------
81
+ // recoverFromCrash
82
+ // -----------------------------------------------------------------------
83
+ async recoverFromCrash() {
84
+ // No-op: PM engine has no worktrees, processes, or persistent state
85
+ // to recover. It simply polls the database on start.
86
+ console.log('[PM] No crash recovery needed (monitoring-only engine)');
87
+ }
88
+ // -----------------------------------------------------------------------
89
+ // start
90
+ // -----------------------------------------------------------------------
91
+ async start() {
92
+ this.shuttingDown = false;
93
+ // Run initial poll immediately
94
+ await this.runPollCycle();
95
+ // Schedule next poll with adaptive interval
96
+ this.scheduleNextPoll();
97
+ console.log('[PM] Engine started (adaptive polling active)');
98
+ }
99
+ // -----------------------------------------------------------------------
100
+ // stop
101
+ // -----------------------------------------------------------------------
102
+ stop() {
103
+ this.shuttingDown = true;
104
+ if (this.pollTimeout !== null) {
105
+ clearTimeout(this.pollTimeout);
106
+ this.pollTimeout = null;
107
+ }
108
+ }
109
+ // -----------------------------------------------------------------------
110
+ // shutdown
111
+ // -----------------------------------------------------------------------
112
+ async shutdown() {
113
+ // No-op: PM engine has no processes to kill or state to drain
114
+ console.log('[PM] Shutdown complete');
115
+ }
116
+ // -----------------------------------------------------------------------
117
+ // healthCheck
118
+ // -----------------------------------------------------------------------
119
+ healthCheck() {
120
+ let status = 'healthy';
121
+ if (this.config === null) {
122
+ status = 'unhealthy';
123
+ }
124
+ return {
125
+ status,
126
+ activeWorkItems: this.activeRiskCount,
127
+ details: {
128
+ activeRiskCount: this.activeRiskCount,
129
+ lastPollAt: this.lastPollAt?.toISOString() ?? null,
130
+ lastFollowupActions: this.lastFollowupActionCount,
131
+ mitigationSummary: this.lastMitigationSummary,
132
+ currentPollIntervalMs: computePollInterval(this.lastRiskStages, this.pollCadence),
133
+ },
134
+ };
135
+ }
136
+ // -----------------------------------------------------------------------
137
+ // getResourceUsage
138
+ // -----------------------------------------------------------------------
139
+ getResourceUsage() {
140
+ return {
141
+ activeClaudeProcesses: 0,
142
+ activeWorktrees: 0,
143
+ };
144
+ }
145
+ // -----------------------------------------------------------------------
146
+ // Private: poll cycle
147
+ // -----------------------------------------------------------------------
148
+ /**
149
+ * Run a single poll cycle: scan dependencies, correlate mitigation, log results.
150
+ */
151
+ async runPollCycle() {
152
+ const config = this.config;
153
+ if (!config)
154
+ return;
155
+ this.lastPollAt = new Date();
156
+ for (const product of config.products) {
157
+ try {
158
+ await this.pollProduct(product.id);
159
+ }
160
+ catch (err) {
161
+ console.log(`[PM] Poll failed for product ${product.id}: ${err instanceof Error ? err.message : String(err)}`);
162
+ }
163
+ }
164
+ }
165
+ /**
166
+ * Poll a single product for risk states and follow-up actions.
167
+ */
168
+ async pollProduct(productId) {
169
+ // 1. Scan risk dependencies for follow-up actions
170
+ const followupActions = await scanRiskDependencies(productId);
171
+ this.lastFollowupActionCount = followupActions.length;
172
+ if (followupActions.length > 0) {
173
+ console.log(`[PM] ${followupActions.length} follow-up action(s) for product ${productId}:`);
174
+ for (const action of followupActions) {
175
+ console.log(`[PM] [${action.urgency.toUpperCase()}] ${action.action}: "${action.dependencyTitle}" ` +
176
+ `(risk: "${action.riskTitle}", owner: ${action.ownerName ?? 'unassigned'})`);
177
+ }
178
+ }
179
+ // 2. Draft communications for high-urgency follow-ups
180
+ const draftsCreated = await this.createFollowupDrafts(productId, followupActions);
181
+ if (draftsCreated > 0) {
182
+ console.log(`[PM] Created ${draftsCreated} communication draft(s) for product ${productId}`);
183
+ }
184
+ // 3. Correlate mitigation progress
185
+ const mitigationReports = await correlateMitigationProgress(productId);
186
+ // Track risk stages for adaptive polling
187
+ const riskStages = [];
188
+ const assessmentCounts = {};
189
+ for (const report of mitigationReports) {
190
+ riskStages.push(report.riskStage);
191
+ assessmentCounts[report.assessment] = (assessmentCounts[report.assessment] ?? 0) + 1;
192
+ // Log non-trivial assessments
193
+ if (report.assessment === 'behind' || report.assessment === 'no_mitigation') {
194
+ console.log(`[PM] Risk "${report.riskTitle}" (${report.riskStage}): ` +
195
+ `mitigation ${report.assessment} (${report.overallCompletionPct}% complete)`);
196
+ }
197
+ }
198
+ this.lastRiskStages = riskStages;
199
+ this.activeRiskCount = riskStages.filter(s => s !== 'resolved' && s !== 'draft').length;
200
+ this.lastMitigationSummary = assessmentCounts;
201
+ if (mitigationReports.length > 0) {
202
+ console.log(`[PM] Product ${productId}: ${mitigationReports.length} risk(s) scanned, ` +
203
+ `assessments: ${Object.entries(assessmentCounts).map(([k, v]) => `${k}=${v}`).join(', ')}`);
204
+ }
205
+ }
206
+ /**
207
+ * Create communication drafts for high-urgency follow-up actions.
208
+ *
209
+ * Only drafts for 'high' urgency actions with a 'send_followup' recommendation.
210
+ * Drafts are stored via the API with status='draft' for human approval.
211
+ * Returns the number of drafts successfully created.
212
+ */
213
+ async createFollowupDrafts(productId, actions) {
214
+ const highUrgencyFollowups = actions.filter(a => a.urgency === 'high' && a.action === 'send_followup');
215
+ if (highUrgencyFollowups.length === 0)
216
+ return 0;
217
+ let created = 0;
218
+ for (const action of highUrgencyFollowups) {
219
+ // Calculate days past due
220
+ const daysPastDue = action.nextFollowupAt
221
+ ? Math.max(0, Math.floor((Date.now() - new Date(action.nextFollowupAt).getTime()) / (24 * 60 * 60 * 1000)))
222
+ : 0;
223
+ const draft = draftCommunication({
224
+ type: 'followup_due',
225
+ dependencyTitle: action.dependencyTitle,
226
+ ownerName: action.ownerName ?? 'Unknown',
227
+ daysPastDue,
228
+ }, {
229
+ title: action.dependencyTitle,
230
+ ownerName: action.ownerName,
231
+ ownerContact: action.ownerContact,
232
+ }, 'email');
233
+ // Set the dependency ID on the draft
234
+ draft.riskDependencyId = action.dependencyId;
235
+ try {
236
+ await callApi('risk_communication_create', {
237
+ productId,
238
+ riskDependencyId: draft.riskDependencyId,
239
+ direction: draft.direction,
240
+ channel: draft.channel,
241
+ subject: draft.subject,
242
+ body: draft.body,
243
+ sender: draft.sender,
244
+ recipient: draft.recipient,
245
+ status: draft.status,
246
+ });
247
+ created++;
248
+ }
249
+ catch (err) {
250
+ console.log(`[PM] Failed to store draft for dependency ${action.dependencyId}: ` +
251
+ `${err instanceof Error ? err.message : String(err)}`);
252
+ }
253
+ }
254
+ return created;
255
+ }
256
+ /**
257
+ * Schedule the next poll cycle using the adaptive interval based on current risk stages.
258
+ */
259
+ scheduleNextPoll() {
260
+ if (this.shuttingDown)
261
+ return;
262
+ const intervalMs = computePollInterval(this.lastRiskStages, this.pollCadence);
263
+ this.pollTimeout = setTimeout(async () => {
264
+ if (this.shuttingDown)
265
+ return;
266
+ try {
267
+ await this.runPollCycle();
268
+ }
269
+ catch (err) {
270
+ console.log(`[PM] Poll cycle error: ${err instanceof Error ? err.message : String(err)}`);
271
+ }
272
+ // Schedule the next poll (interval may have changed based on new risk stages)
273
+ this.scheduleNextPoll();
274
+ }, intervalMs);
275
+ }
276
+ }
277
+ //# sourceMappingURL=pm-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pm-engine.js","sourceRoot":"","sources":["../src/pm-engine.ts"],"names":[],"mappings":"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"}
@@ -56,6 +56,8 @@ export declare function getProductDeploymentProfileSnapshot(productId: string):
56
56
  export declare function updateStrategyStatus(strategyId: string, status: string, currentWorkflowStageId?: string | null, extraFields?: {
57
57
  reviewRequestedAt?: string | null;
58
58
  }): Promise<void>;
59
+ /** Clear review_requested_at without changing strategy status or stage. */
60
+ export declare function clearReviewRequestedAt(strategyId: string): Promise<void>;
59
61
  /**
60
62
  * A workflow stage with its optional agent directive.
61
63
  * Mirrors WorkflowStage fields plus the directive payload used by the directive executor.
@@ -1 +1 @@
1
- {"version":3,"file":"strategies.d.ts","sourceRoot":"","sources":["../../src/queries/strategies.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,cAAc,EAAE,QAAQ,EAAqC,MAAM,aAAa,CAAC;AAQxI;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAoB/F;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAQxF;AAED;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAW9B;AAED;;GAEG;AACH,wBAAsB,6BAA6B,CACjD,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;;;;GAKG;AACH,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAsB,mCAAmC,CACvD,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAM3C;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,EACtC,WAAW,CAAC,EAAE;IAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAClD,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,0BAA0B,EAAE,CAAC;CACtC;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA4B/F;AAED;;;GAGG;AACH,wBAAsB,oCAAoC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAwChG"}
1
+ {"version":3,"file":"strategies.d.ts","sourceRoot":"","sources":["../../src/queries/strategies.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,cAAc,EAAE,QAAQ,EAAqC,MAAM,aAAa,CAAC;AAQxI;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAoB/F;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAQxF;AAED;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAW9B;AAED;;GAEG;AACH,wBAAsB,6BAA6B,CACjD,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;;;;GAKG;AACH,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAsB,mCAAmC,CACvD,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAM3C;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,EACtC,WAAW,CAAC,EAAE;IAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAClD,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,2EAA2E;AAC3E,wBAAsB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK9E;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,0BAA0B,EAAE,CAAC;CACtC;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA4B/F;AAED;;;GAGG;AACH,wBAAsB,oCAAoC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAwChG"}
@@ -81,6 +81,13 @@ export async function updateStrategyStatus(strategyId, status, currentWorkflowSt
81
81
  fields,
82
82
  });
83
83
  }
84
+ /** Clear review_requested_at without changing strategy status or stage. */
85
+ export async function clearReviewRequestedAt(strategyId) {
86
+ await callApi('daemon_update_strategy_status', {
87
+ strategyId,
88
+ fields: { reviewRequestedAt: null },
89
+ });
90
+ }
84
91
  /**
85
92
  * Fetch the effective workflow for a strategy, including ordered stages.
86
93
  * Uses resolve_effective_workflow RPC to walk the assignment hierarchy.
@@ -1 +1 @@
1
- {"version":3,"file":"strategies.js","sourceRoot":"","sources":["../../src/queries/strategies.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"strategies.js","sourceRoot":"","sources":["../../src/queries/strategies.ts"],"names":[],"mappings":"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"}
@@ -21,8 +21,6 @@ export interface CascadeDeps {
21
21
  reviewRequestedAt?: string | null;
22
22
  }) => Promise<void>;
23
23
  fetchStrategyWorkflowWithTransitions: (strategyId: string) => Promise<Workflow>;
24
- updateDeliveryStatus: (deliveryId: string, executionStatus: string, currentWorkflowStageId?: string | null) => Promise<void>;
25
- fetchDeliveryWorkflow: (deliveryId: string) => Promise<Workflow>;
26
24
  }
27
25
  /**
28
26
  * Check if all non-cancelled deliveries within a strategy have reached verify,
@@ -34,19 +32,10 @@ export declare function checkDeliveryToStrategyCascade(config: DaemonConfig, str
34
32
  * non-complete status, regress the strategy back to building.
35
33
  */
36
34
  export declare function handleStrategyRegression(config: DaemonConfig, strategyId: string, strategyStatus: string, deps?: CascadeDeps): Promise<void>;
37
- /**
38
- * When a strategy is in in_review and all deliveries have moved out of
39
- * in_review (back to verify or done), regress the strategy to verify
40
- * and clear review_requested_at.
41
- */
42
- export declare function handleReviewCompletion(config: DaemonConfig, strategyId: string, strategyStatus: string, deps?: CascadeDeps): Promise<void>;
43
35
  /**
44
36
  * When a strategy reaches verify and has pipeline_config.review.enabled,
45
- * automatically trigger AI review by transitioning verify deliveries to
46
- * in_review and advancing the strategy to in_review.
47
- *
48
- * This mirrors what the manual "Review" button does via request_strategy_review
49
- * in product-api, but triggered automatically by the cascade.
37
+ * automatically trigger AI review by setting review_requested_at and
38
+ * transitioning the strategy to in_review. Deliveries stay in verify.
50
39
  */
51
40
  export declare function checkAutoReview(config: DaemonConfig, strategyId: string, strategyStatus: string, pipelineConfig: PipelineConfig | null, deps?: CascadeDeps): Promise<void>;
52
41
  /**
@@ -54,8 +43,8 @@ export declare function checkAutoReview(config: DaemonConfig, strategyId: string
54
43
  *
55
44
  * Called from the daemon poll loop. For each active strategy:
56
45
  * 1. Check delivery->strategy cascade (all deliveries verify => strategy verify)
57
- * 2. Check for strategy regression (delivery reverted => strategy back to building)
58
- * 3. Check for review completion (all deliveries out of in_review => strategy verify)
46
+ * 2. Check auto-review (strategy in verify + review.enabled)
47
+ * 3. Check for strategy regression (delivery reverted => strategy back to building)
59
48
  */
60
49
  export declare function runCascadeChecks(config: DaemonConfig): Promise<void>;
61
50
  //# sourceMappingURL=state-cascade.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"state-cascade.d.ts","sourceRoot":"","sources":["../src/state-cascade.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAgBvD,+DAA+D;AAC/D,MAAM,WAAW,WAAW;IAC1B,qBAAqB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC/E,oBAAoB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,WAAW,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1J,oCAAoC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChF,oBAAoB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7H,qBAAqB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CAClE;AAUD;;;GAGG;AACH,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,IAAI,GAAE,WAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAwDf;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,IAAI,GAAE,WAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAsCf;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,IAAI,GAAE,WAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,cAAc,GAAG,IAAI,EACrC,IAAI,GAAE,WAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAkEf;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B1E"}
1
+ {"version":3,"file":"state-cascade.d.ts","sourceRoot":"","sources":["../src/state-cascade.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAcvD,+DAA+D;AAC/D,MAAM,WAAW,WAAW;IAC1B,qBAAqB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC/E,oBAAoB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,WAAW,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1J,oCAAoC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CACjF;AAQD;;;GAGG;AACH,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,IAAI,GAAE,WAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAwDf;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,IAAI,GAAE,WAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAsCf;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,cAAc,GAAG,IAAI,EACrC,IAAI,GAAE,WAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAwCf;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB1E"}
@@ -14,11 +14,9 @@
14
14
  */
15
15
  import { getActiveStrategies } from './supabase.js';
16
16
  import { getStrategyDeliveries as _getStrategyDeliveries, updateStrategyStatus as _updateStrategyStatus, fetchStrategyWorkflowWithTransitions as _fetchStrategyWorkflowWithTransitions } from './queries/strategies.js';
17
- import { updateDeliveryStatus as _updateDeliveryStatus } from './queries/deliveries.js';
18
- import { fetchEffectiveWorkflow as _fetchEffectiveWorkflow } from './queries/workflows.js';
19
17
  import { configForProduct } from './config.js';
20
18
  // Delivery statuses that count as "complete" for cascade purposes
21
- const DELIVERY_COMPLETE_STATUSES = new Set(['verify', 'in_review', 'done']);
19
+ const DELIVERY_COMPLETE_STATUSES = new Set(['verify', 'done']);
22
20
  // Delivery statuses to exclude from cascade checks entirely
23
21
  const DELIVERY_EXCLUDED_STATUSES = new Set(['cancelled']);
24
22
  // Strategy stages that indicate the strategy has advanced past building
@@ -27,8 +25,6 @@ const defaultDeps = {
27
25
  getStrategyDeliveries: _getStrategyDeliveries,
28
26
  updateStrategyStatus: _updateStrategyStatus,
29
27
  fetchStrategyWorkflowWithTransitions: _fetchStrategyWorkflowWithTransitions,
30
- updateDeliveryStatus: _updateDeliveryStatus,
31
- fetchDeliveryWorkflow: _fetchEffectiveWorkflow,
32
28
  };
33
29
  /**
34
30
  * Check if all non-cancelled deliveries within a strategy have reached verify,
@@ -104,45 +100,10 @@ export async function handleStrategyRegression(config, strategyId, strategyStatu
104
100
  console.warn(`[state-cascade] Failed to check strategy regression for ${strategyId}:`, err.message);
105
101
  }
106
102
  }
107
- /**
108
- * When a strategy is in in_review and all deliveries have moved out of
109
- * in_review (back to verify or done), regress the strategy to verify
110
- * and clear review_requested_at.
111
- */
112
- export async function handleReviewCompletion(config, strategyId, strategyStatus, deps = defaultDeps) {
113
- if (strategyStatus !== 'in_review')
114
- return;
115
- try {
116
- const deliveries = await deps.getStrategyDeliveries(strategyId);
117
- const activeDeliveries = deliveries.filter(d => !DELIVERY_EXCLUDED_STATUSES.has(d.executionStatus ?? ''));
118
- if (activeDeliveries.length === 0)
119
- return;
120
- // If any delivery is still in_review, review is not complete
121
- const hasInReview = activeDeliveries.some(d => d.executionStatus === 'in_review');
122
- if (hasInReview)
123
- return;
124
- // All deliveries have left in_review — move strategy back to verify
125
- const workflow = await deps.fetchStrategyWorkflowWithTransitions(strategyId);
126
- const verifyStage = workflow.stages.find(s => s.name === 'verify');
127
- if (!verifyStage) {
128
- console.warn('[state-cascade] No verify stage found in strategy workflow -- cannot complete review');
129
- return;
130
- }
131
- await deps.updateStrategyStatus(strategyId, 'verify', verifyStage.id, { reviewRequestedAt: null });
132
- console.log(`[state-cascade] Strategy ${strategyId} review complete: in_review -> verify ` +
133
- `(all deliveries out of review, review_requested_at cleared)`);
134
- }
135
- catch (err) {
136
- console.warn(`[state-cascade] Failed to check review completion for ${strategyId}:`, err.message);
137
- }
138
- }
139
103
  /**
140
104
  * When a strategy reaches verify and has pipeline_config.review.enabled,
141
- * automatically trigger AI review by transitioning verify deliveries to
142
- * in_review and advancing the strategy to in_review.
143
- *
144
- * This mirrors what the manual "Review" button does via request_strategy_review
145
- * in product-api, but triggered automatically by the cascade.
105
+ * automatically trigger AI review by setting review_requested_at and
106
+ * transitioning the strategy to in_review. Deliveries stay in verify.
146
107
  */
147
108
  export async function checkAutoReview(config, strategyId, strategyStatus, pipelineConfig, deps = defaultDeps) {
148
109
  // Only trigger when strategy just reached verify and review is enabled
@@ -153,33 +114,11 @@ export async function checkAutoReview(config, strategyId, strategyStatus, pipeli
153
114
  try {
154
115
  const deliveries = await deps.getStrategyDeliveries(strategyId);
155
116
  const activeDeliveries = deliveries.filter(d => !DELIVERY_EXCLUDED_STATUSES.has(d.executionStatus ?? ''));
156
- // Only auto-review when ALL non-cancelled deliveries are in verify (not done/in_review)
157
- // If some are already in_review, a review is already in progress.
158
- // If some are done, they've already been reviewed.
159
- const verifyDeliveries = activeDeliveries.filter(d => d.executionStatus === 'verify');
160
- if (verifyDeliveries.length === 0)
161
- return;
162
- const hasInReview = activeDeliveries.some(d => d.executionStatus === 'in_review');
163
- if (hasInReview)
117
+ // Only auto-review when ALL non-cancelled deliveries are in verify or done
118
+ const allComplete = activeDeliveries.every(d => DELIVERY_COMPLETE_STATUSES.has(d.executionStatus ?? ''));
119
+ if (!allComplete)
164
120
  return;
165
- // Transition each verify delivery to in_review
166
- let transitioned = 0;
167
- for (const delivery of verifyDeliveries) {
168
- try {
169
- const workflow = await deps.fetchDeliveryWorkflow(delivery.id);
170
- const inReviewStage = workflow.stages.find(s => s.name === 'in_review');
171
- if (!inReviewStage) {
172
- console.warn(`[state-cascade] Auto-review: no in_review stage in workflow for delivery "${delivery.name}" -- skipping`);
173
- continue;
174
- }
175
- await deps.updateDeliveryStatus(delivery.id, 'in_review', inReviewStage.id);
176
- transitioned++;
177
- }
178
- catch (err) {
179
- console.warn(`[state-cascade] Auto-review: failed to transition delivery "${delivery.name}":`, err.message);
180
- }
181
- }
182
- if (transitioned === 0)
121
+ if (activeDeliveries.length === 0)
183
122
  return;
184
123
  // Transition strategy to in_review and set review_requested_at
185
124
  const strategyWorkflow = await deps.fetchStrategyWorkflowWithTransitions(strategyId);
@@ -190,7 +129,7 @@ export async function checkAutoReview(config, strategyId, strategyStatus, pipeli
190
129
  }
191
130
  await deps.updateStrategyStatus(strategyId, 'in_review', inReviewStage.id, { reviewRequestedAt: new Date().toISOString() });
192
131
  console.log(`[state-cascade] Auto-review triggered for strategy ${strategyId}: ` +
193
- `${transitioned} delivery(ies) transitioned to in_review`);
132
+ `strategy transitioned to in_review`);
194
133
  }
195
134
  catch (err) {
196
135
  console.warn(`[state-cascade] Failed to check auto-review for ${strategyId}:`, err.message);
@@ -201,8 +140,8 @@ export async function checkAutoReview(config, strategyId, strategyStatus, pipeli
201
140
  *
202
141
  * Called from the daemon poll loop. For each active strategy:
203
142
  * 1. Check delivery->strategy cascade (all deliveries verify => strategy verify)
204
- * 2. Check for strategy regression (delivery reverted => strategy back to building)
205
- * 3. Check for review completion (all deliveries out of in_review => strategy verify)
143
+ * 2. Check auto-review (strategy in verify + review.enabled)
144
+ * 3. Check for strategy regression (delivery reverted => strategy back to building)
206
145
  */
207
146
  export async function runCascadeChecks(config) {
208
147
  for (const product of config.products) {
@@ -216,8 +155,6 @@ export async function runCascadeChecks(config) {
216
155
  await checkAutoReview(pc, strategy.strategy_id, strategy.status, strategy.pipeline_config);
217
156
  // Check for strategy regression
218
157
  await handleStrategyRegression(pc, strategy.strategy_id, strategy.status);
219
- // Check for review completion
220
- await handleReviewCompletion(pc, strategy.strategy_id, strategy.status);
221
158
  }
222
159
  }
223
160
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"state-cascade.js","sourceRoot":"","sources":["../src/state-cascade.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state-cascade.js","sourceRoot":"","sources":["../src/state-cascade.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"strategy-completion.d.ts","sourceRoot":"","sources":["../src/strategy-completion.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,QAAQ,EACR,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAWpB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAalE;;;GAGG;AACH,eAAO,MAAM,0BAA0B,aAA8B,CAAC;AAEtE;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,aAA6C,CAAC;AAI7E,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2OtF;AAID;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,qBAAqB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC/E,iBAAiB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAC5H,uBAAuB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,sBAAsB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClE,oBAAoB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7H,oBAAoB,EAAE,CAAC,MAAM,EAAE;QAC7B,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,QAAQ,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,iBAAiB,CAAC;QACrC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACnC;AAYD;;;;;;;;;;;;GAYG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,iBAAiB,EAC5B,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,mBAAiC,GACtC,OAAO,CAAC,IAAI,CAAC,CA4Gf"}
1
+ {"version":3,"file":"strategy-completion.d.ts","sourceRoot":"","sources":["../src/strategy-completion.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,QAAQ,EACR,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAYpB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAalE;;;GAGG;AACH,eAAO,MAAM,0BAA0B,aAA8B,CAAC;AAEtE;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,aAAgC,CAAC;AAIhE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4PtF;AAID;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,qBAAqB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC/E,iBAAiB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAC5H,uBAAuB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,sBAAsB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClE,oBAAoB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7H,oBAAoB,EAAE,CAAC,MAAM,EAAE;QAC7B,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,QAAQ,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,iBAAiB,CAAC;QACrC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACnC;AAYD;;;;;;;;;;;;GAYG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,iBAAiB,EAC5B,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,mBAAiC,GACtC,OAAO,CAAC,IAAI,CAAC,CA4Gf"}
@@ -5,7 +5,7 @@
5
5
  * based on issue completion, merging the strategy branch, cleaning up
6
6
  * worktrees, and updating session records.
7
7
  */
8
- import { updateSession, reportGitState, getDeliveryIssues, getDeliverySessionCount, updateIssueStatus, fetchEffectiveWorkflow, updateDeliveryStatus, } from './supabase.js';
8
+ import { updateSession, reportGitState, getDeliveryIssues, getDeliverySessionCount, updateIssueStatus, fetchEffectiveWorkflow, updateDeliveryStatus, getActiveStrategies, } from './supabase.js';
9
9
  import { advanceDeliveryStage } from './delivery-lifecycle.js';
10
10
  import { withRetry } from '@telora/daemon-core';
11
11
  import { mergeStrategyBranch, escalateMergeConflict } from './strategy-merge.js';
@@ -15,7 +15,7 @@ import { triggerCheck } from './listener.js';
15
15
  import { getActiveTeams } from './strategy-team-state.js';
16
16
  import { commitWipChanges, worktreeHasUncommittedChanges, branchHasUnmergedCommits, runGitSync } from './git.js';
17
17
  import { computeGitDiffStats } from './git-utils.js';
18
- import { getStrategyDeliveries } from './queries/strategies.js';
18
+ import { getStrategyDeliveries, updateStrategyStatus, fetchStrategyWorkflowWithTransitions } from './queries/strategies.js';
19
19
  // ── Constants ────────────────────────────────────────────────────────
20
20
  /**
21
21
  * Delivery execution statuses that indicate a delivery has reached
@@ -28,7 +28,7 @@ export const TERMINAL_DELIVERY_STATUSES = new Set(['verify', 'done']);
28
28
  * All other statuses (draft, planning, iterating, verify, done, paused,
29
29
  * cancelled) are human-owned states.
30
30
  */
31
- export const TEAM_WORK_STATUSES = new Set(['queued', 'coding', 'in_review']);
31
+ export const TEAM_WORK_STATUSES = new Set(['queued', 'coding']);
32
32
  /**
33
33
  * Handle the team lead process exiting.
34
34
  *
@@ -226,6 +226,23 @@ export async function handleTeamCompletion(params) {
226
226
  catch (err) {
227
227
  console.warn(`[strategy-executor] Failed to update session after retries:`, err.message);
228
228
  }
229
+ // Review exit handler: if the strategy is in in_review when the review
230
+ // team exits, clear review_requested_at and move strategy back to verify.
231
+ try {
232
+ const strategies = await getActiveStrategies(organizationId, teamState.productId);
233
+ const current = strategies.find(s => s.strategy_id === strategyId);
234
+ if (current?.status === 'in_review') {
235
+ const workflow = await fetchStrategyWorkflowWithTransitions(strategyId);
236
+ const verifyStage = workflow.stages.find(s => s.name === 'verify');
237
+ if (verifyStage) {
238
+ await updateStrategyStatus(strategyId, 'verify', verifyStage.id, { reviewRequestedAt: null });
239
+ console.log(`[strategy-executor] Review session exited for "${strategyName}" -- strategy moved from in_review to verify`);
240
+ }
241
+ }
242
+ }
243
+ catch (err) {
244
+ console.warn(`[strategy-executor] Review exit handler failed for "${strategyName}":`, err.message);
245
+ }
229
246
  // Record heartbeat
230
247
  recordSessionCompleted(0, 0);
231
248
  // Clean up team state