@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.
- package/build-info.json +2 -2
- package/dist/pm/adaptive-poller.d.ts +26 -0
- package/dist/pm/adaptive-poller.d.ts.map +1 -0
- package/dist/pm/adaptive-poller.js +53 -0
- package/dist/pm/adaptive-poller.js.map +1 -0
- package/dist/pm/cascade-evaluator.d.ts +29 -0
- package/dist/pm/cascade-evaluator.d.ts.map +1 -0
- package/dist/pm/cascade-evaluator.js +135 -0
- package/dist/pm/cascade-evaluator.js.map +1 -0
- package/dist/pm/channel-email.d.ts +42 -0
- package/dist/pm/channel-email.d.ts.map +1 -0
- package/dist/pm/channel-email.js +47 -0
- package/dist/pm/channel-email.js.map +1 -0
- package/dist/pm/channel-slack.d.ts +40 -0
- package/dist/pm/channel-slack.d.ts.map +1 -0
- package/dist/pm/channel-slack.js +46 -0
- package/dist/pm/channel-slack.js.map +1 -0
- package/dist/pm/communication-drafter.d.ts +44 -0
- package/dist/pm/communication-drafter.d.ts.map +1 -0
- package/dist/pm/communication-drafter.js +84 -0
- package/dist/pm/communication-drafter.js.map +1 -0
- package/dist/pm/dialog-handler.d.ts +32 -0
- package/dist/pm/dialog-handler.d.ts.map +1 -0
- package/dist/pm/dialog-handler.js +107 -0
- package/dist/pm/dialog-handler.js.map +1 -0
- package/dist/pm/mitigation-correlator.d.ts +29 -0
- package/dist/pm/mitigation-correlator.d.ts.map +1 -0
- package/dist/pm/mitigation-correlator.js +147 -0
- package/dist/pm/mitigation-correlator.js.map +1 -0
- package/dist/pm/risk-scanner.d.ts +28 -0
- package/dist/pm/risk-scanner.d.ts.map +1 -0
- package/dist/pm/risk-scanner.js +112 -0
- package/dist/pm/risk-scanner.js.map +1 -0
- package/dist/pm-engine.d.ts +67 -0
- package/dist/pm-engine.d.ts.map +1 -0
- package/dist/pm-engine.js +277 -0
- package/dist/pm-engine.js.map +1 -0
- package/dist/queries/strategies.d.ts +2 -0
- package/dist/queries/strategies.d.ts.map +1 -1
- package/dist/queries/strategies.js +7 -0
- package/dist/queries/strategies.js.map +1 -1
- package/dist/state-cascade.d.ts +4 -15
- package/dist/state-cascade.d.ts.map +1 -1
- package/dist/state-cascade.js +10 -73
- package/dist/state-cascade.js.map +1 -1
- package/dist/strategy-completion.d.ts.map +1 -1
- package/dist/strategy-completion.js +20 -3
- package/dist/strategy-completion.js.map +1 -1
- package/dist/strategy-executor.d.ts.map +1 -1
- package/dist/strategy-executor.js +7 -66
- package/dist/strategy-executor.js.map +1 -1
- package/dist/strategy-prompt-builder.d.ts.map +1 -1
- package/dist/strategy-prompt-builder.js +4 -0
- package/dist/strategy-prompt-builder.js.map +1 -1
- package/dist/unified-shell.d.ts +1 -1
- package/dist/unified-shell.d.ts.map +1 -1
- package/dist/unified-shell.js +56 -1
- package/dist/unified-shell.js.map +1 -1
- 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":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EACL,gCAAgC,EAChC,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,cAAc,CAAC;AAUtB;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,UAAkB;IAC5D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,gCAAgC,EAChC,gCAAgC,EAChC,EAAE,UAAU,EAAE,CACf,CAAC;IAEF,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnC,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,GAAG;QACnC,eAAe,EAAE,CAAC,CAAC,eAAe;QAClC,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;QACxC,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,sBAAsB,EAAE,CAAC,CAAC,sBAAsB,IAAI,IAAI;QACxD,cAAc,EAAE,CAAC,CAAC,cAAc,IAAI,IAAI;QACxC,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI;QAC5B,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,IAAI,IAAI;KAC7C,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAkB;IACxD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,4BAA4B,EAC5B,4BAA4B,EAC5B,EAAE,UAAU,EAAE,CACf,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,SAAiB,EACjB,UAAkB;IAElB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,cAAc,EACd,4BAA4B,EAC5B,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAC1C,CAAC;IAEF,OAAO,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACpC,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,UAAkB,EAClB,eAAuB;IAEvB,MAAM,OAAO,CAAC,mCAAmC,EAAE;QACjD,UAAU;QACV,eAAe;KAChB,CAAC,CAAC;AACL,CAAC;AAcD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mCAAmC,CACvD,SAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,yCAAyC,EACzC,EAAE,SAAS,EAAE,CACd,CAAC;IACF,OAAO,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,UAAkB,EAClB,MAAc,EACd,sBAAsC,EACtC,WAAmD;IAEnD,MAAM,MAAM,GAA4B,EAAE,MAAM,EAAE,CAAC;IACnD,IAAI,sBAAsB,KAAK,SAAS,EAAE,CAAC;QACzC,MAAM,CAAC,sBAAsB,GAAG,sBAAsB,CAAC;IACzD,CAAC;IACD,IAAI,WAAW,EAAE,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACjD,MAAM,CAAC,iBAAiB,GAAG,WAAW,CAAC,iBAAiB,CAAC;IAC3D,CAAC;IACD,MAAM,OAAO,CAAC,+BAA+B,EAAE;QAC7C,UAAU;QACV,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAsBD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,UAAkB;IAC5D,MAAM,MAAM,GAAG,MAAM,OAAO,CAezB,8BAA8B,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IAEnD,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE;QACtB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC;YACrE,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,UAAU,EAAE,CAAC,CAAC,SAAS;YACvB,cAAc,EAAE,CAAC,CAAC,cAAc,IAAI,IAAI;SACzC,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oCAAoC,CAAC,UAAkB;IAC3E,MAAM,MAAM,GAAG,MAAM,OAAO,CAmBzB,8BAA8B,EAAE,EAAE,UAAU,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7E,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE;QACtB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAiB,EAAE,CAAC,CAAC;YACxD,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,UAAU,EAAE,CAAC,CAAC,SAAS;SACxB,CAAC,CAAC;QACH,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAsB,EAAE,CAAC,CAAC;YAC/E,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,WAAW,EAAE,CAAC,CAAC,UAAU;YACzB,aAAa,EAAE,CAAC,CAAC,WAAW;YAC5B,WAAW,EAAE,CAAC,CAAC,SAAS;YACxB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,YAAY,EAAE,CAAC,CAAC,WAAW;YAC3B,UAAU,EAAE,CAAC,CAAC,SAAS;SACxB,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"strategies.js","sourceRoot":"","sources":["../../src/queries/strategies.ts"],"names":[],"mappings":"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"}
|
package/dist/state-cascade.d.ts
CHANGED
|
@@ -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
|
|
46
|
-
*
|
|
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
|
|
58
|
-
* 3. Check for
|
|
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;
|
|
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"}
|
package/dist/state-cascade.js
CHANGED
|
@@ -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', '
|
|
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
|
|
142
|
-
*
|
|
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
|
|
157
|
-
|
|
158
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
205
|
-
* 3. Check for
|
|
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":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,qBAAqB,IAAI,sBAAsB,EAAE,oBAAoB,IAAI,qBAAqB,EAAE,oCAAoC,IAAI,qCAAqC,EAAE,MAAM,yBAAyB,CAAC;AACxN,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"state-cascade.js","sourceRoot":"","sources":["../src/state-cascade.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,qBAAqB,IAAI,sBAAsB,EAAE,oBAAoB,IAAI,qBAAqB,EAAE,oCAAoC,IAAI,qCAAqC,EAAE,MAAM,yBAAyB,CAAC;AACxN,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,kEAAkE;AAClE,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAE/D,4DAA4D;AAC5D,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAE1D,wEAAwE;AACxE,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AASlE,MAAM,WAAW,GAAgB;IAC/B,qBAAqB,EAAE,sBAAsB;IAC7C,oBAAoB,EAAE,qBAAqB;IAC3C,oCAAoC,EAAE,qCAAqC;CAC5E,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,MAAoB,EACpB,UAAkB,EAClB,cAAsB,EACtB,OAAoB,WAAW;IAE/B,kDAAkD;IAClD,IAAI,cAAc,KAAK,UAAU;QAAE,OAAO;IAE1C,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAEhE,+DAA+D;QAC/D,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CACxC,CAAC,CAAC,EAAE,CAAC,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,IAAI,EAAE,CAAC,CAC9D,CAAC;QAEF,gDAAgD;QAChD,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE1C,sEAAsE;QACtE,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CACxC,CAAC,CAAC,EAAE,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,IAAI,EAAE,CAAC,CAC7D,CAAC;QAEF,IAAI,CAAC,WAAW;YAAE,OAAO;QAEzB,4EAA4E;QAC5E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,oCAAoC,CAAC,UAAU,CAAC,CAAC;QAE7E,sCAAsC;QACtC,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAEnE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;YAC7F,OAAO;QACT,CAAC;QAED,qDAAqD;QACrD,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAC1C,CAAC,CAAC,EAAE,CAAC,aAAa,IAAI,CAAC,CAAC,aAAa,KAAK,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,EAAE,CAC/F,CAAC;YACF,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;gBAC1F,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CACT,4BAA4B,UAAU,gCAAgC;YACtE,OAAO,gBAAgB,CAAC,MAAM,2CAA2C,CAC1E,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,kEAAkE,UAAU,GAAG,EAC9E,GAAa,CAAC,OAAO,CACvB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAoB,EACpB,UAAkB,EAClB,cAAsB,EACtB,OAAoB,WAAW;IAE/B,mDAAmD;IACnD,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,cAAc,CAAC;QAAE,OAAO;IAE1D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAEhE,kEAAkE;QAClE,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CACxC,CAAC,CAAC,EAAE,CAAC,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,IAAI,EAAE,CAAC,CAC9D,CAAC;QAEF,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CACzC,CAAC,CAAC,EAAE,CAAC,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,IAAI,EAAE,CAAC,CAC9D,CAAC;QAEF,IAAI,CAAC,aAAa;YAAE,OAAO;QAE3B,+DAA+D;QAC/D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,oCAAoC,CAAC,UAAU,CAAC,CAAC;QAC7E,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QAEvE,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAC;YAC/F,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;QACvG,OAAO,CAAC,GAAG,CACT,4BAA4B,UAAU,cAAc,cAAc,gBAAgB;YAClF,sEAAsE,CACvE,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,2DAA2D,UAAU,GAAG,EACvE,GAAa,CAAC,OAAO,CACvB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAoB,EACpB,UAAkB,EAClB,cAAsB,EACtB,cAAqC,EACrC,OAAoB,WAAW;IAE/B,uEAAuE;IACvE,IAAI,cAAc,KAAK,QAAQ;QAAE,OAAO;IACxC,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO;QAAE,OAAO;IAE7C,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CACxC,CAAC,CAAC,EAAE,CAAC,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,IAAI,EAAE,CAAC,CAC9D,CAAC;QAEF,2EAA2E;QAC3E,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CACxC,CAAC,CAAC,EAAE,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,IAAI,EAAE,CAAC,CAC7D,CAAC;QACF,IAAI,CAAC,WAAW;YAAE,OAAO;QACzB,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE1C,+DAA+D;QAC/D,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,oCAAoC,CAAC,UAAU,CAAC,CAAC;QACrF,MAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QAChF,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;YACrF,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,oBAAoB,CAC7B,UAAU,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,EACzC,EAAE,iBAAiB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAChD,CAAC;QACF,OAAO,CAAC,GAAG,CACT,sDAAsD,UAAU,IAAI;YACpE,oCAAoC,CACrC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,mDAAmD,UAAU,GAAG,EAC/D,GAAa,CAAC,OAAO,CACvB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAoB;IACzD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,EAAE,GAAG,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAE7C,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YAE5E,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;gBAClC,qCAAqC;gBACrC,MAAM,8BAA8B,CAAC,EAAE,EAAE,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAEhF,0DAA0D;gBAC1D,MAAM,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;gBAE3F,gCAAgC;gBAChC,MAAM,wBAAwB,CAAC,EAAE,EAAE,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CACV,4DAA4D,OAAO,CAAC,EAAE,GAAG,EACxE,GAAa,CAAC,OAAO,CACvB,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -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;
|
|
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'
|
|
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
|