@telora/daemon 0.13.17 → 0.13.19

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 (45) hide show
  1. package/build-info.json +2 -2
  2. package/dist/assembly-resolvers.js +219 -0
  3. package/dist/assembly-resolvers.js.map +1 -1
  4. package/dist/delivery-lifecycle.d.ts.map +1 -1
  5. package/dist/delivery-lifecycle.js.map +1 -1
  6. package/dist/listener.d.ts.map +1 -1
  7. package/dist/listener.js +6 -61
  8. package/dist/listener.js.map +1 -1
  9. package/dist/loop-engine.d.ts +115 -0
  10. package/dist/loop-engine.d.ts.map +1 -0
  11. package/dist/loop-engine.js +498 -0
  12. package/dist/loop-engine.js.map +1 -0
  13. package/dist/loop-event-bus.d.ts +28 -0
  14. package/dist/loop-event-bus.d.ts.map +1 -0
  15. package/dist/loop-event-bus.js +35 -0
  16. package/dist/loop-event-bus.js.map +1 -0
  17. package/dist/loop-llm-client.d.ts +16 -0
  18. package/dist/loop-llm-client.d.ts.map +1 -0
  19. package/dist/loop-llm-client.js +80 -0
  20. package/dist/loop-llm-client.js.map +1 -0
  21. package/dist/loop-prompt-builder.d.ts +39 -0
  22. package/dist/loop-prompt-builder.d.ts.map +1 -0
  23. package/dist/loop-prompt-builder.js +168 -0
  24. package/dist/loop-prompt-builder.js.map +1 -0
  25. package/dist/loop-variance.d.ts +89 -0
  26. package/dist/loop-variance.d.ts.map +1 -0
  27. package/dist/loop-variance.js +283 -0
  28. package/dist/loop-variance.js.map +1 -0
  29. package/dist/review-spawner.d.ts +32 -0
  30. package/dist/review-spawner.d.ts.map +1 -0
  31. package/dist/review-spawner.js +153 -0
  32. package/dist/review-spawner.js.map +1 -0
  33. package/dist/state-cascade.d.ts.map +1 -1
  34. package/dist/state-cascade.js +16 -0
  35. package/dist/state-cascade.js.map +1 -1
  36. package/dist/strategy-completion.d.ts.map +1 -1
  37. package/dist/strategy-completion.js +22 -28
  38. package/dist/strategy-completion.js.map +1 -1
  39. package/dist/team-spawner.d.ts.map +1 -1
  40. package/dist/team-spawner.js +15 -6
  41. package/dist/team-spawner.js.map +1 -1
  42. package/dist/unified-shell.d.ts.map +1 -1
  43. package/dist/unified-shell.js +43 -0
  44. package/dist/unified-shell.js.map +1 -1
  45. package/package.json +1 -1
@@ -0,0 +1,283 @@
1
+ /**
2
+ * Variance computation for the Loop Agent differential receiver.
3
+ *
4
+ * Compares intent (loop data) against forecasted reality (metrics + projections)
5
+ * and produces a structured VarianceResult. Pure function, no side effects.
6
+ */
7
+ // ---------------------------------------------------------------------------
8
+ // Computation
9
+ // ---------------------------------------------------------------------------
10
+ /**
11
+ * Compute variance between intent and forecasted reality.
12
+ *
13
+ * @param intent - Loop data (documents, questions, answers, persona)
14
+ * @param reality - Reality metrics and projections
15
+ * @param targetDate - Strategy target date (ISO string or null)
16
+ * @param previousVariance - Previous variance result for trend computation (optional)
17
+ * @returns Structured variance result
18
+ */
19
+ export function computeVariance(intent, reality, targetDate, previousVariance) {
20
+ const metrics = reality.metrics;
21
+ const completion = reality.projections.completion;
22
+ const cost = reality.projections.cost;
23
+ const schedule = computeScheduleVariance(targetDate, completion);
24
+ const throughput = computeThroughputVariance(metrics, completion, targetDate);
25
+ const costVar = computeCostVariance(cost);
26
+ const staleness = computeStaleness(intent);
27
+ const completionConfidence = completion
28
+ ? completion.confidence ?? null
29
+ : null;
30
+ const dimensions = {
31
+ schedule,
32
+ throughput,
33
+ cost: costVar,
34
+ staleness,
35
+ completionConfidence,
36
+ };
37
+ const noiseFlags = computeNoiseFlags(metrics);
38
+ const lockStatus = determineLockStatus(dimensions, noiseFlags);
39
+ const trendDirection = computeTrendDirection(dimensions, previousVariance ?? null);
40
+ const summary = buildSummary(lockStatus, dimensions, noiseFlags, trendDirection);
41
+ return { lockStatus, dimensions, noiseFlags, summary, trendDirection };
42
+ }
43
+ // ---------------------------------------------------------------------------
44
+ // Dimension computations
45
+ // ---------------------------------------------------------------------------
46
+ function computeScheduleVariance(targetDate, completion) {
47
+ if (!targetDate) {
48
+ return { targetDate: null, projectedDate: null, varianceDays: 0, direction: 'unknown' };
49
+ }
50
+ const target = new Date(targetDate);
51
+ if (isNaN(target.getTime())) {
52
+ return { targetDate, projectedDate: null, varianceDays: 0, direction: 'unknown' };
53
+ }
54
+ if (!completion || completion.status === 'complete') {
55
+ return { targetDate, projectedDate: null, varianceDays: 0, direction: 'on_track' };
56
+ }
57
+ if (completion.status === 'stalled') {
58
+ // Stalled means we can't project -- treat as behind
59
+ return { targetDate, projectedDate: null, varianceDays: Infinity, direction: 'behind' };
60
+ }
61
+ const projectedDateStr = completion.projectedCompletionDate;
62
+ if (!projectedDateStr) {
63
+ return { targetDate, projectedDate: null, varianceDays: 0, direction: 'unknown' };
64
+ }
65
+ const projected = new Date(projectedDateStr);
66
+ const diffMs = projected.getTime() - target.getTime();
67
+ const diffDays = Math.round(diffMs / (24 * 60 * 60 * 1000));
68
+ let direction;
69
+ if (diffDays <= 0)
70
+ direction = 'ahead';
71
+ else if (diffDays <= 2)
72
+ direction = 'on_track';
73
+ else
74
+ direction = 'behind';
75
+ return {
76
+ targetDate,
77
+ projectedDate: projectedDateStr,
78
+ varianceDays: diffDays,
79
+ direction,
80
+ };
81
+ }
82
+ function computeThroughputVariance(metrics, completion, targetDate) {
83
+ if (!metrics)
84
+ return null;
85
+ const currentVelocity = completion
86
+ ? completion.velocity ?? 0
87
+ : 0;
88
+ const remainingIssues = completion
89
+ ? completion.remainingIssues ?? 0
90
+ : (metrics.issues_todo ?? 0) + (metrics.issues_in_progress ?? 0);
91
+ // Calculate required velocity if we have a target date
92
+ let requiredVelocity = null;
93
+ if (targetDate && remainingIssues > 0) {
94
+ const target = new Date(targetDate);
95
+ const daysToTarget = Math.max(1, (target.getTime() - Date.now()) / (24 * 60 * 60 * 1000));
96
+ requiredVelocity = remainingIssues / daysToTarget;
97
+ }
98
+ // Determine trend from windowed throughput
99
+ const done7d = metrics.issues_done_7d ?? 0;
100
+ const done14d = metrics.issues_done_14d ?? 0;
101
+ const done30d = metrics.issues_done_30d ?? 0;
102
+ let trend;
103
+ if (done7d === 0 && done14d === 0) {
104
+ trend = 'stalled';
105
+ }
106
+ else if (done14d > 0) {
107
+ // Compare first-half vs second-half velocity
108
+ const firstHalf = done14d - done7d; // issues 7-14 days ago
109
+ const secondHalf = done7d; // issues in last 7 days
110
+ if (secondHalf > firstHalf * 1.2)
111
+ trend = 'accelerating';
112
+ else if (secondHalf < firstHalf * 0.8)
113
+ trend = 'decelerating';
114
+ else
115
+ trend = 'steady';
116
+ }
117
+ else if (done30d > 0) {
118
+ trend = 'decelerating'; // Only older completions
119
+ }
120
+ else {
121
+ trend = 'stalled';
122
+ }
123
+ return { currentVelocity, requiredVelocity, trend, remainingIssues };
124
+ }
125
+ function computeCostVariance(cost) {
126
+ if (!cost)
127
+ return null;
128
+ return {
129
+ costToDate: cost.costToDate ?? 0,
130
+ projectedTotal: cost.projectedTotalCost ?? null,
131
+ burnRatePerDay: cost.burnRatePerDay ?? 0,
132
+ };
133
+ }
134
+ function computeStaleness(intent) {
135
+ // If there are no documents, loop data hasn't been initialized yet
136
+ if (intent.documents.length === 0) {
137
+ return { isStale: true, reason: 'No loop documents exist yet' };
138
+ }
139
+ // Check if many questions are unanswered
140
+ const unanswered = intent.questions.filter(q => !q.answer && !q.isRetired);
141
+ if (unanswered.length > intent.questions.length * 0.5 && intent.questions.length > 0) {
142
+ return { isStale: true, reason: `${unanswered.length}/${intent.questions.length} questions unanswered` };
143
+ }
144
+ return { isStale: false, reason: null };
145
+ }
146
+ // ---------------------------------------------------------------------------
147
+ // Noise detection
148
+ // ---------------------------------------------------------------------------
149
+ function computeNoiseFlags(metrics) {
150
+ if (!metrics) {
151
+ return { activityWithoutProgress: false, extendedCodingNoVerify: false, highEscalationRate: false };
152
+ }
153
+ // High activity without progress: many sessions but no recent completions
154
+ const sessions = metrics.session_count ?? 0;
155
+ const done7d = metrics.issues_done_7d ?? 0;
156
+ const activityWithoutProgress = sessions > 5 && done7d === 0;
157
+ // Extended coding without verify: all deliveries in coding, none in verify/done
158
+ const coding = metrics.deliveries_coding ?? 0;
159
+ const verify = metrics.deliveries_verify ?? 0;
160
+ const done = metrics.deliveries_done ?? 0;
161
+ const total = metrics.total_deliveries ?? 0;
162
+ const extendedCodingNoVerify = coding > 0 && verify === 0 && done === 0 && total > 0;
163
+ // High escalation rate
164
+ const escalations = metrics.escalation_count ?? 0;
165
+ const highEscalationRate = sessions > 3 && escalations > sessions * 0.3;
166
+ return { activityWithoutProgress, extendedCodingNoVerify, highEscalationRate };
167
+ }
168
+ // ---------------------------------------------------------------------------
169
+ // Trend direction: is the gap converging or diverging?
170
+ // ---------------------------------------------------------------------------
171
+ function computeTrendDirection(current, previous) {
172
+ if (!previous)
173
+ return 'stable';
174
+ // Compute a simple "gap score" for current and previous.
175
+ // Higher score = larger gap between intent and reality.
176
+ const currentScore = gapScore(current);
177
+ const previousScore = gapScore(previous.dimensions);
178
+ // If both are zero, stable
179
+ if (currentScore === 0 && previousScore === 0)
180
+ return 'stable';
181
+ const delta = currentScore - previousScore;
182
+ // Threshold: 10% relative change or absolute change > 0.5
183
+ const threshold = Math.max(previousScore * 0.1, 0.5);
184
+ if (delta < -threshold)
185
+ return 'converging';
186
+ if (delta > threshold)
187
+ return 'diverging';
188
+ return 'stable';
189
+ }
190
+ function gapScore(dimensions) {
191
+ let score = 0;
192
+ // Schedule: days behind adds to gap score
193
+ if (dimensions.schedule) {
194
+ const days = dimensions.schedule.varianceDays;
195
+ if (days === Infinity)
196
+ score += 10;
197
+ else if (dimensions.schedule.direction === 'behind')
198
+ score += Math.min(days, 30);
199
+ }
200
+ // Throughput: stalled or decelerating increases gap
201
+ if (dimensions.throughput) {
202
+ const remaining = dimensions.throughput.remainingIssues;
203
+ if (dimensions.throughput.trend === 'stalled' && remaining > 0)
204
+ score += 5;
205
+ else if (dimensions.throughput.trend === 'decelerating')
206
+ score += 2;
207
+ // Velocity deficit
208
+ if (dimensions.throughput.requiredVelocity != null && dimensions.throughput.requiredVelocity > 0) {
209
+ const deficit = Math.max(0, dimensions.throughput.requiredVelocity - dimensions.throughput.currentVelocity);
210
+ score += deficit;
211
+ }
212
+ }
213
+ // Confidence: lower confidence = larger gap
214
+ if (dimensions.completionConfidence != null) {
215
+ score += (1 - dimensions.completionConfidence) * 5;
216
+ }
217
+ return score;
218
+ }
219
+ // ---------------------------------------------------------------------------
220
+ // Lock status determination
221
+ // ---------------------------------------------------------------------------
222
+ function determineLockStatus(dimensions, noiseFlags) {
223
+ // Unlocked: significant divergence
224
+ if (dimensions.schedule?.direction === 'behind' && dimensions.schedule.varianceDays > 7) {
225
+ return 'unlocked';
226
+ }
227
+ if (dimensions.throughput?.trend === 'stalled' && (dimensions.throughput.remainingIssues ?? 0) > 0) {
228
+ return 'unlocked';
229
+ }
230
+ if (dimensions.completionConfidence !== null && dimensions.completionConfidence < 0.3) {
231
+ return 'unlocked';
232
+ }
233
+ // Drifting: some divergence
234
+ if (dimensions.schedule?.direction === 'behind') {
235
+ return 'drifting';
236
+ }
237
+ if (dimensions.throughput?.trend === 'decelerating') {
238
+ return 'drifting';
239
+ }
240
+ if (dimensions.staleness?.isStale) {
241
+ return 'drifting';
242
+ }
243
+ if (noiseFlags.activityWithoutProgress || noiseFlags.extendedCodingNoVerify) {
244
+ return 'drifting';
245
+ }
246
+ // Locked: within thresholds
247
+ return 'locked';
248
+ }
249
+ // ---------------------------------------------------------------------------
250
+ // Summary builder
251
+ // ---------------------------------------------------------------------------
252
+ function buildSummary(lockStatus, dimensions, noiseFlags, trendDirection) {
253
+ const parts = [];
254
+ parts.push(`Lock status: ${lockStatus}`);
255
+ if (trendDirection !== 'stable') {
256
+ parts.push(`Trend: ${trendDirection}`);
257
+ }
258
+ if (dimensions.schedule) {
259
+ if (dimensions.schedule.direction === 'behind') {
260
+ parts.push(`Schedule: ${dimensions.schedule.varianceDays === Infinity ? 'stalled (no projection)' : `${dimensions.schedule.varianceDays}d behind target`}`);
261
+ }
262
+ else if (dimensions.schedule.direction === 'ahead') {
263
+ parts.push(`Schedule: ${Math.abs(dimensions.schedule.varianceDays)}d ahead of target`);
264
+ }
265
+ }
266
+ if (dimensions.throughput) {
267
+ parts.push(`Throughput: ${dimensions.throughput.trend} (${dimensions.throughput.currentVelocity.toFixed(2)} issues/day, ${dimensions.throughput.remainingIssues} remaining)`);
268
+ }
269
+ if (dimensions.cost && dimensions.cost.costToDate > 0) {
270
+ parts.push(`Cost: $${dimensions.cost.costToDate.toFixed(2)} spent${dimensions.cost.projectedTotal ? `, $${dimensions.cost.projectedTotal.toFixed(2)} projected` : ''}`);
271
+ }
272
+ if (dimensions.completionConfidence !== null) {
273
+ parts.push(`Confidence: ${dimensions.completionConfidence}`);
274
+ }
275
+ if (noiseFlags.activityWithoutProgress)
276
+ parts.push('Noise: activity without progress');
277
+ if (noiseFlags.extendedCodingNoVerify)
278
+ parts.push('Noise: extended coding without verification');
279
+ if (noiseFlags.highEscalationRate)
280
+ parts.push('Noise: high escalation rate');
281
+ return parts.join('. ');
282
+ }
283
+ //# sourceMappingURL=loop-variance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-variance.js","sourceRoot":"","sources":["../src/loop-variance.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyFH,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAsB,EACtB,OAAoB,EACpB,UAAyB,EACzB,gBAAwC;IAExC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAwD,CAAC;IACjF,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,UAA4C,CAAC;IACpF,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,IAAsC,CAAC;IAExE,MAAM,QAAQ,GAAG,uBAAuB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,yBAAyB,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,oBAAoB,GAAG,UAAU;QACrC,CAAC,CAAE,UAAU,CAAC,UAA4B,IAAI,IAAI;QAClD,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,UAAU,GAAuB;QACrC,QAAQ;QACR,UAAU;QACV,IAAI,EAAE,OAAO;QACb,SAAS;QACT,oBAAoB;KACrB,CAAC;IAEF,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAG,qBAAqB,CAAC,UAAU,EAAE,gBAAgB,IAAI,IAAI,CAAC,CAAC;IACnF,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;IAEjF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;AACzE,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,SAAS,uBAAuB,CAC9B,UAAyB,EACzB,UAA0C;IAE1C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IAC1F,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IACpF,CAAC;IAED,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACpD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;IACrF,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACpC,oDAAoD;QACpD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC1F,CAAC;IAED,MAAM,gBAAgB,GAAG,UAAU,CAAC,uBAAwC,CAAC;IAC7E,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IACpF,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAE5D,IAAI,SAAwC,CAAC;IAC7C,IAAI,QAAQ,IAAI,CAAC;QAAE,SAAS,GAAG,OAAO,CAAC;SAClC,IAAI,QAAQ,IAAI,CAAC;QAAE,SAAS,GAAG,UAAU,CAAC;;QAC1C,SAAS,GAAG,QAAQ,CAAC;IAE1B,OAAO;QACL,UAAU;QACV,aAAa,EAAE,gBAAgB;QAC/B,YAAY,EAAE,QAAQ;QACtB,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAChC,OAAsD,EACtD,UAA0C,EAC1C,UAAyB;IAEzB,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,eAAe,GAAG,UAAU;QAChC,CAAC,CAAE,UAAU,CAAC,QAA0B,IAAI,CAAC;QAC7C,CAAC,CAAC,CAAC,CAAC;IAEN,MAAM,eAAe,GAAG,UAAU;QAChC,CAAC,CAAE,UAAU,CAAC,eAAiC,IAAI,CAAC;QACpD,CAAC,CAAC,CAAC,OAAO,CAAC,WAAqB,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,kBAA4B,IAAI,CAAC,CAAC,CAAC;IAEvF,uDAAuD;IACvD,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAC3C,IAAI,UAAU,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;QACpC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAC1F,gBAAgB,GAAG,eAAe,GAAG,YAAY,CAAC;IACpD,CAAC;IAED,2CAA2C;IAC3C,MAAM,MAAM,GAAI,OAAO,CAAC,cAAyB,IAAI,CAAC,CAAC;IACvD,MAAM,OAAO,GAAI,OAAO,CAAC,eAA0B,IAAI,CAAC,CAAC;IACzD,MAAM,OAAO,GAAI,OAAO,CAAC,eAA0B,IAAI,CAAC,CAAC;IAEzD,IAAI,KAAkC,CAAC;IACvC,IAAI,MAAM,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAClC,KAAK,GAAG,SAAS,CAAC;IACpB,CAAC;SAAM,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QACvB,6CAA6C;QAC7C,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC,uBAAuB;QAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,wBAAwB;QACnD,IAAI,UAAU,GAAG,SAAS,GAAG,GAAG;YAAE,KAAK,GAAG,cAAc,CAAC;aACpD,IAAI,UAAU,GAAG,SAAS,GAAG,GAAG;YAAE,KAAK,GAAG,cAAc,CAAC;;YACzD,KAAK,GAAG,QAAQ,CAAC;IACxB,CAAC;SAAM,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,GAAG,cAAc,CAAC,CAAC,yBAAyB;IACnD,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,SAAS,CAAC;IACpB,CAAC;IAED,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,mBAAmB,CAC1B,IAAoC;IAEpC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,OAAO;QACL,UAAU,EAAG,IAAI,CAAC,UAAqB,IAAI,CAAC;QAC5C,cAAc,EAAG,IAAI,CAAC,kBAAoC,IAAI,IAAI;QAClE,cAAc,EAAG,IAAI,CAAC,cAAyB,IAAI,CAAC;KACrD,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAsB;IAC9C,mEAAmE;IACnE,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC;IAClE,CAAC;IAED,yCAAyC;IACzC,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3E,IAAI,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,uBAAuB,EAAE,CAAC;IAC3G,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,SAAS,iBAAiB,CACxB,OAAsD;IAEtD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,uBAAuB,EAAE,KAAK,EAAE,sBAAsB,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC;IACtG,CAAC;IAED,0EAA0E;IAC1E,MAAM,QAAQ,GAAI,OAAO,CAAC,aAAwB,IAAI,CAAC,CAAC;IACxD,MAAM,MAAM,GAAI,OAAO,CAAC,cAAyB,IAAI,CAAC,CAAC;IACvD,MAAM,uBAAuB,GAAG,QAAQ,GAAG,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC;IAE7D,gFAAgF;IAChF,MAAM,MAAM,GAAI,OAAO,CAAC,iBAA4B,IAAI,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAI,OAAO,CAAC,iBAA4B,IAAI,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAI,OAAO,CAAC,eAA0B,IAAI,CAAC,CAAC;IACtD,MAAM,KAAK,GAAI,OAAO,CAAC,gBAA2B,IAAI,CAAC,CAAC;IACxD,MAAM,sBAAsB,GAAG,MAAM,GAAG,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;IAErF,uBAAuB;IACvB,MAAM,WAAW,GAAI,OAAO,CAAC,gBAA2B,IAAI,CAAC,CAAC;IAC9D,MAAM,kBAAkB,GAAG,QAAQ,GAAG,CAAC,IAAI,WAAW,GAAG,QAAQ,GAAG,GAAG,CAAC;IAExE,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,CAAC;AACjF,CAAC;AAED,8EAA8E;AAC9E,uDAAuD;AACvD,8EAA8E;AAE9E,SAAS,qBAAqB,CAC5B,OAA2B,EAC3B,QAA+B;IAE/B,IAAI,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE/B,yDAAyD;IACzD,wDAAwD;IACxD,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAEpD,2BAA2B;IAC3B,IAAI,YAAY,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAE/D,MAAM,KAAK,GAAG,YAAY,GAAG,aAAa,CAAC;IAC3C,0DAA0D;IAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;IAErD,IAAI,KAAK,GAAG,CAAC,SAAS;QAAE,OAAO,YAAY,CAAC;IAC5C,IAAI,KAAK,GAAG,SAAS;QAAE,OAAO,WAAW,CAAC;IAC1C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,QAAQ,CAAC,UAA8B;IAC9C,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,0CAA0C;IAC1C,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC9C,IAAI,IAAI,KAAK,QAAQ;YAAE,KAAK,IAAI,EAAE,CAAC;aAC9B,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,KAAK,QAAQ;YAAE,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,oDAAoD;IACpD,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC;QACxD,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,KAAK,SAAS,IAAI,SAAS,GAAG,CAAC;YAAE,KAAK,IAAI,CAAC,CAAC;aACtE,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,KAAK,cAAc;YAAE,KAAK,IAAI,CAAC,CAAC;QACpE,mBAAmB;QACnB,IAAI,UAAU,CAAC,UAAU,CAAC,gBAAgB,IAAI,IAAI,IAAI,UAAU,CAAC,UAAU,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;YACjG,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,gBAAgB,GAAG,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;YAC5G,KAAK,IAAI,OAAO,CAAC;QACnB,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,IAAI,UAAU,CAAC,oBAAoB,IAAI,IAAI,EAAE,CAAC;QAC5C,KAAK,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAE9E,SAAS,mBAAmB,CAC1B,UAA8B,EAC9B,UAAsB;IAEtB,mCAAmC;IACnC,IAAI,UAAU,CAAC,QAAQ,EAAE,SAAS,KAAK,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QACxF,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,UAAU,CAAC,UAAU,EAAE,KAAK,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,eAAe,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACnG,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,UAAU,CAAC,oBAAoB,KAAK,IAAI,IAAI,UAAU,CAAC,oBAAoB,GAAG,GAAG,EAAE,CAAC;QACtF,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,4BAA4B;IAC5B,IAAI,UAAU,CAAC,QAAQ,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,UAAU,CAAC,UAAU,EAAE,KAAK,KAAK,cAAc,EAAE,CAAC;QACpD,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;QAClC,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,UAAU,CAAC,uBAAuB,IAAI,UAAU,CAAC,sBAAsB,EAAE,CAAC;QAC5E,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,4BAA4B;IAC5B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,SAAS,YAAY,CACnB,UAAsB,EACtB,UAA8B,EAC9B,UAAsB,EACtB,cAA8B;IAE9B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,gBAAgB,UAAU,EAAE,CAAC,CAAC;IACzC,IAAI,cAAc,KAAK,QAAQ,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,UAAU,cAAc,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxB,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,aAAa,UAAU,CAAC,QAAQ,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,YAAY,iBAAiB,EAAE,CAAC,CAAC;QAC9J,CAAC;aAAM,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,eAAe,UAAU,CAAC,UAAU,CAAC,KAAK,KAAK,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,UAAU,CAAC,UAAU,CAAC,eAAe,aAAa,CAAC,CAAC;IAChL,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,UAAU,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1K,CAAC;IAED,IAAI,UAAU,CAAC,oBAAoB,KAAK,IAAI,EAAE,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,eAAe,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,UAAU,CAAC,uBAAuB;QAAE,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACvF,IAAI,UAAU,CAAC,sBAAsB;QAAE,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IACjG,IAAI,UAAU,CAAC,kBAAkB;QAAE,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAE7E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Review spawner.
3
+ *
4
+ * First-class review handling in the poll loop. Detects strategies
5
+ * in `in_review` status and spawns a review team directly -- no
6
+ * directive executor, no pending spawn directives, no special seeding.
7
+ *
8
+ * The review team examines diffs against acceptance criteria and creates
9
+ * issues on specific deliveries where it finds gaps. When the team exits,
10
+ * the exit handler moves the strategy back to verify. The existing
11
+ * checkVerifyDeliveriesForOpenIssues poll handles delivery-level routing
12
+ * to iterating.
13
+ */
14
+ import type { DaemonConfig, AgentRole } from './types.js';
15
+ import './assembly-resolvers.js';
16
+ /**
17
+ * Consume a pending review message for a strategy.
18
+ * Returns the message and removes it from the map.
19
+ */
20
+ export declare function consumePendingReviewMessage(strategyId: string): string | undefined;
21
+ /**
22
+ * Check if a strategy has a pending review message.
23
+ */
24
+ export declare function hasPendingReview(strategyId: string): boolean;
25
+ /**
26
+ * Detect strategies in `in_review` status and spawn review teams.
27
+ *
28
+ * Called from the daemon poll loop. For each in_review strategy without
29
+ * an active team, assembles the review prompt and spawns a review team.
30
+ */
31
+ export declare function processReviewStrategies(config: DaemonConfig, roles: ReadonlyMap<string, AgentRole>): Promise<void>;
32
+ //# sourceMappingURL=review-spawner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-spawner.d.ts","sourceRoot":"","sources":["../src/review-spawner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAK1D,OAAO,yBAAyB,CAAC;AAsFjC;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMlF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CAqCf"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Review spawner.
3
+ *
4
+ * First-class review handling in the poll loop. Detects strategies
5
+ * in `in_review` status and spawns a review team directly -- no
6
+ * directive executor, no pending spawn directives, no special seeding.
7
+ *
8
+ * The review team examines diffs against acceptance criteria and creates
9
+ * issues on specific deliveries where it finds gaps. When the team exits,
10
+ * the exit handler moves the strategy back to verify. The existing
11
+ * checkVerifyDeliveriesForOpenIssues poll handles delivery-level routing
12
+ * to iterating.
13
+ */
14
+ import { getActiveStrategies } from './queries/deliveries.js';
15
+ import { getStrategyDeliveries } from './queries/strategies.js';
16
+ import { resolveAssemblyRecipe } from './assembly-engine.js';
17
+ // Ensure resolvers are registered
18
+ import './assembly-resolvers.js';
19
+ import { hasActiveTeam, getActiveTeamCount } from './strategy-executor.js';
20
+ import { spawnStrategyTeam } from './team-spawner.js';
21
+ import { isInSpawnCooldown } from './spawn-cooldown.js';
22
+ import { configForProduct } from './config.js';
23
+ /**
24
+ * Assembly recipe for review context.
25
+ * Gathers acceptance criteria, the git diff, and delivery descriptions.
26
+ */
27
+ const REVIEW_ASSEMBLY_RECIPE = [
28
+ 'delivery.acceptance_criteria',
29
+ 'delivery.description',
30
+ 'delivery.listing',
31
+ 'git.diff_against_base',
32
+ ];
33
+ /**
34
+ * Build the review prompt that gets sent to the review team after the
35
+ * standard strategy prompt.
36
+ */
37
+ async function buildReviewMessage(config, strategyId, worktreePath) {
38
+ const deliveries = await getStrategyDeliveries(strategyId);
39
+ const assemblyContext = {
40
+ strategyId,
41
+ deliveryIds: deliveries.map(d => d.id),
42
+ worktreePath,
43
+ config,
44
+ organizationId: config.organizationId,
45
+ productId: config.productId,
46
+ };
47
+ let assembledContext = '';
48
+ try {
49
+ assembledContext = await resolveAssemblyRecipe(REVIEW_ASSEMBLY_RECIPE, assemblyContext);
50
+ }
51
+ catch (err) {
52
+ console.warn(`[review-spawner] Assembly failed for strategy ${strategyId.slice(0, 8)}: ${err.message}`);
53
+ }
54
+ const prompt = `# Review Directive
55
+
56
+ You are reviewing this strategy's deliveries. Your job is to examine the code changes (git diff) against the acceptance criteria for each delivery and identify any gaps.
57
+
58
+ ## Instructions
59
+
60
+ 1. Read the acceptance criteria and delivery descriptions above carefully.
61
+ 2. Examine the git diff to understand what was actually built.
62
+ 3. For each delivery, compare what was built against what was specified.
63
+ 4. If you find gaps -- missing functionality, incomplete implementation, or deviations from acceptance criteria -- create issues on the specific delivery where the gap exists using \`telora_product_issue_create\`.
64
+ 5. If a delivery fully meets its acceptance criteria, do nothing for that delivery.
65
+ 6. When you are done reviewing all deliveries, exit cleanly.
66
+
67
+ ## Issue Creation Guidelines
68
+
69
+ - Create issues as type "Task" with status "To Do"
70
+ - Be specific: describe exactly what is missing or incomplete
71
+ - Reference the acceptance criterion that is not met
72
+ - One issue per distinct gap (don't bundle unrelated gaps)
73
+ - Do NOT create issues for style preferences or nice-to-haves -- only for acceptance criteria gaps
74
+
75
+ ## Important
76
+
77
+ - Do NOT modify any code. This is a review, not a fix.
78
+ - Do NOT change delivery or strategy statuses.
79
+ - Do NOT create new deliveries.
80
+ - Focus only on acceptance criteria gaps in the actual code changes.`;
81
+ const parts = [];
82
+ if (assembledContext.trim()) {
83
+ parts.push(assembledContext);
84
+ }
85
+ parts.push(prompt);
86
+ return parts.join('\n\n');
87
+ }
88
+ // Store pending review messages for strategies that need a review team spawned.
89
+ // Keyed by strategyId. Consumed by spawnStrategyTeam via consumePendingReviewMessage.
90
+ const pendingReviewMessages = new Map();
91
+ /**
92
+ * Consume a pending review message for a strategy.
93
+ * Returns the message and removes it from the map.
94
+ */
95
+ export function consumePendingReviewMessage(strategyId) {
96
+ const message = pendingReviewMessages.get(strategyId);
97
+ if (message) {
98
+ pendingReviewMessages.delete(strategyId);
99
+ }
100
+ return message;
101
+ }
102
+ /**
103
+ * Check if a strategy has a pending review message.
104
+ */
105
+ export function hasPendingReview(strategyId) {
106
+ return pendingReviewMessages.has(strategyId);
107
+ }
108
+ /**
109
+ * Detect strategies in `in_review` status and spawn review teams.
110
+ *
111
+ * Called from the daemon poll loop. For each in_review strategy without
112
+ * an active team, assembles the review prompt and spawns a review team.
113
+ */
114
+ export async function processReviewStrategies(config, roles) {
115
+ for (const product of config.products) {
116
+ const pc = configForProduct(config, product);
117
+ try {
118
+ const strategies = await getActiveStrategies(pc.organizationId, product.id);
119
+ for (const strategy of strategies) {
120
+ if (strategy.status !== 'in_review')
121
+ continue;
122
+ if (hasActiveTeam(strategy.strategy_id))
123
+ continue;
124
+ if (isInSpawnCooldown(strategy.strategy_id))
125
+ continue;
126
+ if (!strategy.assigned_agent_role_id)
127
+ continue;
128
+ if (getActiveTeamCount() >= config.maxTotalSessions)
129
+ break;
130
+ const role = roles.get(strategy.assigned_agent_role_id);
131
+ if (!role)
132
+ continue;
133
+ // Build the review message before spawning so it's ready when the team starts
134
+ console.log(`[review-spawner] Preparing review for "${strategy.strategy_name}"`);
135
+ const reviewMessage = await buildReviewMessage(pc, strategy.strategy_id, null);
136
+ pendingReviewMessages.set(strategy.strategy_id, reviewMessage);
137
+ await spawnStrategyTeam({
138
+ config: pc,
139
+ strategyId: strategy.strategy_id,
140
+ strategyName: strategy.strategy_name,
141
+ role,
142
+ pipelineConfig: strategy.pipeline_config,
143
+ readOnly: strategy.read_only,
144
+ lastClaudeSessionId: null,
145
+ });
146
+ }
147
+ }
148
+ catch (err) {
149
+ console.warn(`[review-spawner] Failed to process review strategies for product ${product.id}: ${err.message}`);
150
+ }
151
+ }
152
+ }
153
+ //# sourceMappingURL=review-spawner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-spawner.js","sourceRoot":"","sources":["../src/review-spawner.ts"],"names":[],"mappings":"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"}
@@ -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;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"}
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;AAevD,+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,CA8Df;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,CA4Cf;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,CA8Cf;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB1E"}
@@ -15,6 +15,7 @@
15
15
  import { getActiveStrategies } from './supabase.js';
16
16
  import { getStrategyDeliveries as _getStrategyDeliveries, updateStrategyStatus as _updateStrategyStatus, fetchStrategyWorkflowWithTransitions as _fetchStrategyWorkflowWithTransitions } from './queries/strategies.js';
17
17
  import { configForProduct } from './config.js';
18
+ import { emitLoopTrigger } from './loop-event-bus.js';
18
19
  // Delivery statuses that count as "complete" for cascade purposes
19
20
  const DELIVERY_COMPLETE_STATUSES = new Set(['verify', 'done']);
20
21
  // Delivery statuses to exclude from cascade checks entirely
@@ -65,6 +66,11 @@ export async function checkDeliveryToStrategyCascade(config, strategyId, strateg
65
66
  await deps.updateStrategyStatus(strategyId, 'verify', verifyStage.id);
66
67
  console.log(`[state-cascade] Strategy ${strategyId} cascaded building -> verify: ` +
67
68
  `all ${activeDeliveries.length} active delivery(ies) in verify or beyond`);
69
+ emitLoopTrigger({
70
+ type: 'strategy_status_changed',
71
+ strategyId,
72
+ detail: 'building -> verify (all deliveries complete)',
73
+ });
68
74
  }
69
75
  catch (err) {
70
76
  console.warn(`[state-cascade] Failed to check delivery->strategy cascade for ${strategyId}:`, err.message);
@@ -95,6 +101,11 @@ export async function handleStrategyRegression(config, strategyId, strategyStatu
95
101
  await deps.updateStrategyStatus(strategyId, 'building', buildingStage.id, { reviewRequestedAt: null });
96
102
  console.log(`[state-cascade] Strategy ${strategyId} regressed ${strategyStatus} -> building: ` +
97
103
  `delivery reverted to non-verify status (review_requested_at cleared)`);
104
+ emitLoopTrigger({
105
+ type: 'review_completed',
106
+ strategyId,
107
+ detail: `${strategyStatus} -> building (delivery regression, review cleared)`,
108
+ });
98
109
  }
99
110
  catch (err) {
100
111
  console.warn(`[state-cascade] Failed to check strategy regression for ${strategyId}:`, err.message);
@@ -130,6 +141,11 @@ export async function checkAutoReview(config, strategyId, strategyStatus, pipeli
130
141
  await deps.updateStrategyStatus(strategyId, 'in_review', inReviewStage.id, { reviewRequestedAt: new Date().toISOString() });
131
142
  console.log(`[state-cascade] Auto-review triggered for strategy ${strategyId}: ` +
132
143
  `strategy transitioned to in_review`);
144
+ emitLoopTrigger({
145
+ type: 'strategy_status_changed',
146
+ strategyId,
147
+ detail: 'verify -> in_review (auto-review triggered)',
148
+ });
133
149
  }
134
150
  catch (err) {
135
151
  console.warn(`[state-cascade] Failed to check auto-review for ${strategyId}:`, err.message);
@@ -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;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,CAoRtF;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;AAclE;;;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,CAoQtF;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,CAqHf"}