@urateam/core 0.1.26 → 0.1.28
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/dist/__tests__/bec-183-pre-stream-stall.test.d.ts +2 -0
- package/dist/__tests__/bec-183-pre-stream-stall.test.d.ts.map +1 -0
- package/dist/__tests__/bec-183-pre-stream-stall.test.js +139 -0
- package/dist/__tests__/bec-183-pre-stream-stall.test.js.map +1 -0
- package/dist/__tests__/extract-handoff.test.js +74 -0
- package/dist/__tests__/extract-handoff.test.js.map +1 -1
- package/dist/__tests__/gh-linear-sync.test.d.ts +2 -0
- package/dist/__tests__/gh-linear-sync.test.d.ts.map +1 -0
- package/dist/__tests__/gh-linear-sync.test.js +325 -0
- package/dist/__tests__/gh-linear-sync.test.js.map +1 -0
- package/dist/__tests__/pm-slack-interface.test.js +40 -1
- package/dist/__tests__/pm-slack-interface.test.js.map +1 -1
- package/dist/__tests__/post-fanout-comments.test.js +52 -0
- package/dist/__tests__/post-fanout-comments.test.js.map +1 -1
- package/dist/__tests__/select-repo-config.test.d.ts +2 -0
- package/dist/__tests__/select-repo-config.test.d.ts.map +1 -0
- package/dist/__tests__/select-repo-config.test.js +132 -0
- package/dist/__tests__/select-repo-config.test.js.map +1 -0
- package/dist/__tests__/start-todo.test.js +124 -0
- package/dist/__tests__/start-todo.test.js.map +1 -1
- package/dist/__tests__/validate-review-models.test.d.ts +2 -0
- package/dist/__tests__/validate-review-models.test.d.ts.map +1 -0
- package/dist/__tests__/validate-review-models.test.js +155 -0
- package/dist/__tests__/validate-review-models.test.js.map +1 -0
- package/dist/executor/agent-stream.d.ts +29 -4
- package/dist/executor/agent-stream.d.ts.map +1 -1
- package/dist/executor/agent-stream.js +65 -17
- package/dist/executor/agent-stream.js.map +1 -1
- package/dist/executor/executor.d.ts.map +1 -1
- package/dist/executor/executor.js +71 -15
- package/dist/executor/executor.js.map +1 -1
- package/dist/executor/index.d.ts +1 -1
- package/dist/executor/index.d.ts.map +1 -1
- package/dist/executor/index.js +1 -1
- package/dist/executor/index.js.map +1 -1
- package/dist/executor/prompt/templates.d.ts.map +1 -1
- package/dist/executor/prompt/templates.js +7 -7
- package/dist/executor/prompt/templates.js.map +1 -1
- package/dist/executor/review/post-fanout-comments.d.ts +7 -0
- package/dist/executor/review/post-fanout-comments.d.ts.map +1 -1
- package/dist/executor/review/post-fanout-comments.js +17 -3
- package/dist/executor/review/post-fanout-comments.js.map +1 -1
- package/dist/executor/review/review-provider.d.ts +15 -0
- package/dist/executor/review/review-provider.d.ts.map +1 -1
- package/dist/executor/review/review-provider.js +78 -1
- package/dist/executor/review/review-provider.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/pipeline/runner.js +1 -1
- package/dist/pipeline/runner.js.map +1 -1
- package/dist/pm/actions/select-repo-config.d.ts +22 -0
- package/dist/pm/actions/select-repo-config.d.ts.map +1 -0
- package/dist/pm/actions/select-repo-config.js +38 -0
- package/dist/pm/actions/select-repo-config.js.map +1 -0
- package/dist/pm/actions/start-todo.d.ts.map +1 -1
- package/dist/pm/actions/start-todo.js +13 -8
- package/dist/pm/actions/start-todo.js.map +1 -1
- package/dist/pm/linear-helpers.d.ts +14 -0
- package/dist/pm/linear-helpers.d.ts.map +1 -1
- package/dist/pm/linear-helpers.js +23 -0
- package/dist/pm/linear-helpers.js.map +1 -1
- package/dist/pm/scheduler.d.ts.map +1 -1
- package/dist/pm/scheduler.js +16 -20
- package/dist/pm/scheduler.js.map +1 -1
- package/dist/pm/slack-interface.d.ts +12 -0
- package/dist/pm/slack-interface.d.ts.map +1 -1
- package/dist/pm/slack-interface.js +16 -10
- package/dist/pm/slack-interface.js.map +1 -1
- package/dist/security/review-checklist.d.ts +8 -2
- package/dist/security/review-checklist.d.ts.map +1 -1
- package/dist/security/review-checklist.js +39 -9
- package/dist/security/review-checklist.js.map +1 -1
- package/dist/sync/gh-linear-sync.d.ts +189 -0
- package/dist/sync/gh-linear-sync.d.ts.map +1 -0
- package/dist/sync/gh-linear-sync.js +279 -0
- package/dist/sync/gh-linear-sync.js.map +1 -0
- package/dist/sync/index.d.ts +2 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +3 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -1
- package/dist/webhook/handler.d.ts.map +1 -1
- package/dist/webhook/handler.js +4 -2
- package/dist/webhook/handler.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
* Shared helpers for consuming Agent SDK message streams and parsing
|
|
3
3
|
* JSON blocks from agent output.
|
|
4
4
|
*/
|
|
5
|
+
import { createLogger } from "../logger.js";
|
|
6
|
+
const log = createLogger({ component: "AgentStream" });
|
|
5
7
|
/**
|
|
6
8
|
* Thrown when a stage's agent stream makes no observable progress
|
|
7
9
|
* (no new output tokens or assistant turns) for `progressTimeoutMs`.
|
|
@@ -19,6 +21,23 @@ export class StageStalledError extends Error {
|
|
|
19
21
|
this.name = "StageStalledError";
|
|
20
22
|
}
|
|
21
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Thrown when no message is received from the agent stream before the
|
|
26
|
+
* `firstMessageTimeoutMs` deadline. This covers the pre-stream hang class
|
|
27
|
+
* (BEC-183) where query() returns an iterator that never yields its first
|
|
28
|
+
* message — e.g., blocked on an SDK-internal auth-retry loop, MCP init
|
|
29
|
+
* failure, or a never-resolving Promise before the iterator advances.
|
|
30
|
+
*
|
|
31
|
+
* Distinct from StageStalledError (mid-stream silence after ≥1 message).
|
|
32
|
+
*/
|
|
33
|
+
export class StagePreStreamStalledError extends Error {
|
|
34
|
+
timeoutMs;
|
|
35
|
+
constructor(timeoutMs) {
|
|
36
|
+
super(`stage pre-stream stall — no message received within ${Math.round(timeoutMs / 1000)}s of starting`);
|
|
37
|
+
this.timeoutMs = timeoutMs;
|
|
38
|
+
this.name = "StagePreStreamStalledError";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
22
41
|
/**
|
|
23
42
|
* Consume an Agent SDK message stream, accumulating token usage and
|
|
24
43
|
* extracting the last assistant text content.
|
|
@@ -39,10 +58,23 @@ export async function consumeAgentStream(messages, options) {
|
|
|
39
58
|
let lastTokenAdvanceAt = Date.now();
|
|
40
59
|
const progressInterval = options?.progressIntervalMs ?? 30_000;
|
|
41
60
|
const stallTimeoutMs = options?.progressTimeoutMs ?? 30 * 60_000;
|
|
61
|
+
// BEC-183: first-message timeout — fires if the iterator never yields its
|
|
62
|
+
// first message (pre-stream hang). Default 5 min; covers auth refresh,
|
|
63
|
+
// MCP boot, and model warmup latencies while still detecting SDK deadlocks.
|
|
64
|
+
const firstMsgTimeoutMs = options?.firstMessageTimeoutMs ?? 5 * 60_000;
|
|
65
|
+
const streamStartAt = Date.now();
|
|
66
|
+
let firstMessageReceived = false;
|
|
42
67
|
const iterator = messages[Symbol.asyncIterator]();
|
|
43
68
|
const STALLED = { __stalled: true };
|
|
44
69
|
while (true) {
|
|
45
|
-
const
|
|
70
|
+
const stallRemaining = stallTimeoutMs - (Date.now() - lastTokenAdvanceAt);
|
|
71
|
+
// First-message timeout: only active until the first real message arrives.
|
|
72
|
+
const firstMsgRemaining = firstMessageReceived
|
|
73
|
+
? Infinity
|
|
74
|
+
: firstMsgTimeoutMs - (Date.now() - streamStartAt);
|
|
75
|
+
// Use whichever deadline is sooner; clamp to 0 to fire immediately if
|
|
76
|
+
// either has already elapsed.
|
|
77
|
+
const remainingUntilTimeout = Math.max(Math.min(stallRemaining, firstMsgRemaining), 0);
|
|
46
78
|
let stallTimer;
|
|
47
79
|
let nextSettled = false;
|
|
48
80
|
let nextValue;
|
|
@@ -52,7 +84,7 @@ export async function consumeAgentStream(messages, options) {
|
|
|
52
84
|
return v;
|
|
53
85
|
});
|
|
54
86
|
const stallPromise = new Promise((resolve) => {
|
|
55
|
-
stallTimer = setTimeout(() => resolve(STALLED),
|
|
87
|
+
stallTimer = setTimeout(() => resolve(STALLED), remainingUntilTimeout);
|
|
56
88
|
});
|
|
57
89
|
const raced = await Promise.race([next, stallPromise]);
|
|
58
90
|
if (stallTimer)
|
|
@@ -67,7 +99,13 @@ export async function consumeAgentStream(messages, options) {
|
|
|
67
99
|
// never-resolving await (the exact zombie pattern from urateam#122),
|
|
68
100
|
// awaiting iterator.return() would hang forever waiting for that
|
|
69
101
|
// await to settle. Best-effort signal; let the GC handle the rest.
|
|
70
|
-
iterator.return?.()
|
|
102
|
+
iterator.return?.()?.catch((err) => log.debug({ err }, "iterator cleanup failed"));
|
|
103
|
+
if (!firstMessageReceived) {
|
|
104
|
+
// Pre-stream hang: the iterator never yielded its first message
|
|
105
|
+
// within firstMsgTimeoutMs. Throw StagePreStreamStalledError so
|
|
106
|
+
// callers can distinguish this from a mid-stream stall. BEC-183.
|
|
107
|
+
throw new StagePreStreamStalledError(firstMsgTimeoutMs);
|
|
108
|
+
}
|
|
71
109
|
throw new StageStalledError(Date.now() - lastTokenAdvanceAt, {
|
|
72
110
|
messageCount,
|
|
73
111
|
turns,
|
|
@@ -79,6 +117,8 @@ export async function consumeAgentStream(messages, options) {
|
|
|
79
117
|
const result = (raced === STALLED ? nextValue : raced);
|
|
80
118
|
if (result.done)
|
|
81
119
|
break;
|
|
120
|
+
// Mark that at least one message has arrived; deactivates first-message timer.
|
|
121
|
+
firstMessageReceived = true;
|
|
82
122
|
const message = result.value;
|
|
83
123
|
messageCount++;
|
|
84
124
|
if (options?.onProgress && Date.now() - lastProgressTime >= progressInterval) {
|
|
@@ -138,33 +178,41 @@ export function extractText(content) {
|
|
|
138
178
|
: String(content);
|
|
139
179
|
}
|
|
140
180
|
/**
|
|
141
|
-
*
|
|
142
|
-
* Returns null if
|
|
181
|
+
* Internal helper: apply `regex` to `text`, then JSON-parse the capture group
|
|
182
|
+
* at `groupIndex`. Returns null if the regex doesn't match or parsing fails.
|
|
183
|
+
* Eliminates the try-catch boilerplate duplicated in parseJsonObject and
|
|
184
|
+
* parseJsonBlock.
|
|
143
185
|
*/
|
|
144
|
-
|
|
145
|
-
const match = text.match(
|
|
186
|
+
function parseJsonWithRegex(text, regex, groupIndex = 0) {
|
|
187
|
+
const match = text.match(regex);
|
|
146
188
|
if (!match)
|
|
147
189
|
return null;
|
|
148
190
|
try {
|
|
149
|
-
return JSON.parse(match[
|
|
191
|
+
return JSON.parse(match[groupIndex]);
|
|
150
192
|
}
|
|
151
193
|
catch {
|
|
152
194
|
return null;
|
|
153
195
|
}
|
|
154
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* Extract and parse a bare JSON object from text (finds first `{...}` match).
|
|
199
|
+
* Returns null if no object is found or if parsing fails.
|
|
200
|
+
*
|
|
201
|
+
* Uses non-greedy matching so that if the text contains multiple top-level
|
|
202
|
+
* JSON-like blocks separated by non-JSON content (e.g. log lines), the first
|
|
203
|
+
* parseable object is returned rather than a greedy span that crosses all of
|
|
204
|
+
* them and fails to parse. Trade-off: non-greedy does not correctly handle
|
|
205
|
+
* deeply nested objects — for those, prefer `parseJsonBlock` (fenced block).
|
|
206
|
+
* In practice, PM-agent Haiku responses are flat JSON, so non-greedy is safe.
|
|
207
|
+
*/
|
|
208
|
+
export function parseJsonObject(text) {
|
|
209
|
+
return parseJsonWithRegex(text, /\{[\s\S]*?\}/, 0);
|
|
210
|
+
}
|
|
155
211
|
/**
|
|
156
212
|
* Extract and parse a ```json fenced code block from agent output text.
|
|
157
213
|
* Returns null if no block is found or if parsing fails.
|
|
158
214
|
*/
|
|
159
215
|
export function parseJsonBlock(text) {
|
|
160
|
-
|
|
161
|
-
if (!match)
|
|
162
|
-
return null;
|
|
163
|
-
try {
|
|
164
|
-
return JSON.parse(match[1]);
|
|
165
|
-
}
|
|
166
|
-
catch {
|
|
167
|
-
return null;
|
|
168
|
-
}
|
|
216
|
+
return parseJsonWithRegex(text, /```json\s*\n([\s\S]*?)\n```/, 1);
|
|
169
217
|
}
|
|
170
218
|
//# sourceMappingURL=agent-stream.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-stream.js","sourceRoot":"","sources":["../../src/executor/agent-stream.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"agent-stream.js","sourceRoot":"","sources":["../../src/executor/agent-stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/executor/executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,UAAU,EACV,eAAe,EACf,WAAW,EACX,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,EAAE,EAAS,MAAM,iBAAiB,CAAC;AAOjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/executor/executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,UAAU,EACV,eAAe,EACf,WAAW,EACX,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,EAAE,EAAS,MAAM,iBAAiB,CAAC;AAOjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAqBnE;;;;;;GAMG;AACH,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,SAAS,EAChB,iBAAiB,EAAE,OAAO,GACzB,YAAY,CAKd;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,EAAE,CAAC;IACP,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;kEAC8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC;;mFAE+E;IAC/E,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC;;;kEAG8D;IAC9D,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,WAAW,CAAC,CA4QtB"}
|
|
@@ -7,8 +7,22 @@ import { extractHandoff } from "./extract-handoff.js";
|
|
|
7
7
|
import { buildStagePermissionOptions } from "./permissions.js";
|
|
8
8
|
import { resolveTooling } from "./mcp-resolver.js";
|
|
9
9
|
import { createLogger } from "../logger.js";
|
|
10
|
-
import { consumeAgentStream } from "./agent-stream.js";
|
|
10
|
+
import { consumeAgentStream, StagePreStreamStalledError } from "./agent-stream.js";
|
|
11
11
|
import { isClaudeAuthValid } from "./auth-check.js";
|
|
12
|
+
/**
|
|
13
|
+
* BEC-183: wall-clock stage timeouts. Independent of the in-stream watchdog
|
|
14
|
+
* (StageStalledError / StagePreStreamStalledError inside consumeAgentStream),
|
|
15
|
+
* this is a second defensive layer that covers the case where the SDK's
|
|
16
|
+
* query() or iterator setup hangs before any message arrives and the
|
|
17
|
+
* firstMessageTimeoutMs timer inside consumeAgentStream somehow fails to fire.
|
|
18
|
+
* Default: 60 min for implement (longest legitimate stage), 30 min for others.
|
|
19
|
+
*/
|
|
20
|
+
const WALL_CLOCK_STAGE_TIMEOUT_MS = {
|
|
21
|
+
implement: 60 * 60_000, // 60 min — longest legitimate stage
|
|
22
|
+
};
|
|
23
|
+
const DEFAULT_WALL_CLOCK_STAGE_TIMEOUT_MS = 30 * 60_000; // 30 min for all others
|
|
24
|
+
/** First-message timeout passed to consumeAgentStream (BEC-183). */
|
|
25
|
+
const FIRST_MESSAGE_TIMEOUT_MS = 5 * 60_000; // 5 min
|
|
12
26
|
/**
|
|
13
27
|
* BEC-182: review-feedback runs are bounded — N comments, push, done.
|
|
14
28
|
* Override the implement profile's maxTurns / maxInputTokens to prevent
|
|
@@ -108,21 +122,63 @@ Do NOT run build, test, or lint commands directly on the host — always use \`d
|
|
|
108
122
|
await db.insert(agentLogs).values(logBatch);
|
|
109
123
|
logBatch = [];
|
|
110
124
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if (logBatch.length >= BATCH_SIZE) {
|
|
123
|
-
flushLogBatch().catch((err) => log.warn({ err }, "mid-stream log batch flush failed"));
|
|
124
|
-
}
|
|
125
|
+
// BEC-183: capture the iterator that consumeAgentStream will create so we
|
|
126
|
+
// can call .return() for cleanup if the wall-clock timeout fires before the
|
|
127
|
+
// inner firstMessageTimeoutMs guard does. consumeAgentStream calls
|
|
128
|
+
// messages[Symbol.asyncIterator]() exactly once — the wrapper intercepts
|
|
129
|
+
// that call and stores the reference.
|
|
130
|
+
let capturedMessagesIterator;
|
|
131
|
+
const messagesWithCapture = {
|
|
132
|
+
[Symbol.asyncIterator]() {
|
|
133
|
+
const iter = messages[Symbol.asyncIterator]();
|
|
134
|
+
capturedMessagesIterator = iter;
|
|
135
|
+
return iter;
|
|
125
136
|
},
|
|
137
|
+
};
|
|
138
|
+
// BEC-183: wall-clock stage timeout — second defensive layer independent
|
|
139
|
+
// of the in-stream watchdog. Fires as StagePreStreamStalledError so the
|
|
140
|
+
// catch block below sets status=failed with a clear message.
|
|
141
|
+
const stageTimeoutMs = WALL_CLOCK_STAGE_TIMEOUT_MS[stage] ?? DEFAULT_WALL_CLOCK_STAGE_TIMEOUT_MS;
|
|
142
|
+
let stageTimeoutTimer;
|
|
143
|
+
const stageTimeoutPromise = new Promise((_, reject) => {
|
|
144
|
+
stageTimeoutTimer = setTimeout(() => {
|
|
145
|
+
reject(new StagePreStreamStalledError(stageTimeoutMs));
|
|
146
|
+
}, stageTimeoutMs);
|
|
147
|
+
});
|
|
148
|
+
const result = await Promise.race([
|
|
149
|
+
consumeAgentStream(messagesWithCapture, {
|
|
150
|
+
onProgress: (stats) => {
|
|
151
|
+
log.info(stats, "stage still in progress");
|
|
152
|
+
},
|
|
153
|
+
onToolMessage: (msg) => {
|
|
154
|
+
logBatch.push({
|
|
155
|
+
id: nanoid(),
|
|
156
|
+
stageRunId: stageRunId,
|
|
157
|
+
type: msg.type,
|
|
158
|
+
content: JSON.stringify(msg).slice(0, 2048),
|
|
159
|
+
});
|
|
160
|
+
if (logBatch.length >= BATCH_SIZE) {
|
|
161
|
+
flushLogBatch().catch((err) => log.warn({ err }, "mid-stream log batch flush failed"));
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
firstMessageTimeoutMs: FIRST_MESSAGE_TIMEOUT_MS,
|
|
165
|
+
}),
|
|
166
|
+
stageTimeoutPromise,
|
|
167
|
+
]).catch((err) => {
|
|
168
|
+
// When the wall-clock timeout fires before consumeAgentStream's own
|
|
169
|
+
// firstMessageTimeoutMs guard, the internal iterator is still pending.
|
|
170
|
+
// Signal it to release any SDK network connections or event listeners.
|
|
171
|
+
// Best-effort: if the generator is truly blocked on a never-resolving
|
|
172
|
+
// Promise, .return() won't unblock it, but the GC will eventually
|
|
173
|
+
// collect it once this run's references are dropped.
|
|
174
|
+
capturedMessagesIterator?.return?.()?.catch(() => { });
|
|
175
|
+
throw err;
|
|
176
|
+
}).finally(() => {
|
|
177
|
+
// Always clear the wall-clock timer whether the stream succeeds, stalls,
|
|
178
|
+
// or throws any other error — prevents the timer from dangling after the
|
|
179
|
+
// stage exits the happy path.
|
|
180
|
+
if (stageTimeoutTimer)
|
|
181
|
+
clearTimeout(stageTimeoutTimer);
|
|
126
182
|
});
|
|
127
183
|
// Flush remaining log entries
|
|
128
184
|
await flushLogBatch();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/executor/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAYhC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAsB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/executor/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAYhC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAsB,MAAM,mBAAmB,CAAC;AACvG,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD;;;;;;;GAOG;AACH,MAAM,2BAA2B,GAAoC;IACnE,SAAS,EAAE,EAAE,GAAG,MAAM,EAAE,oCAAoC;CAC7D,CAAC;AACF,MAAM,mCAAmC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,wBAAwB;AAEjF,oEAAoE;AACpE,MAAM,wBAAwB,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,QAAQ;AAErD;;;;;;GAMG;AACH,MAAM,UAAU,kCAAkC,CAChD,OAAqB,EACrB,KAAgB,EAChB,iBAA0B;IAE1B,IAAI,iBAAiB,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QAC/C,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;IAC9D,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AA6BD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAA4B;IAE5B,MAAM,EACJ,KAAK,EACL,OAAO,EACP,KAAK,EACL,cAAc,EACd,UAAU,EACV,OAAO,EACP,OAAO,EACP,EAAE,EAAE,KAAK,GACV,GAAG,OAAO,CAAC;IAEZ,IAAI,KAAK,KAAK,gBAAgB,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,gBAAgB,GAAG,kCAAkC,CACzD,OAAO,EACP,KAAK,EACL,CAAC,CAAC,OAAO,CAAC,cAAc,CACzB,CAAC;IAEF,oEAAoE;IACpE,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAE3E,MAAM,EAAE,GAAG,KAAc,CAAC;IAC1B,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC;IAC5B,IAAI,MAAM,GAAG,cAAc,CACzB,KAAK,EACL,cAAc,EACd,UAAU,EACV,OAAO,EACP,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,oBAAoB,CAC7B,CAAC;IAEF,oFAAoF;IACpF,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,eAAe,CAAC;QACvD,MAAM,IAAI;;yCAE2B,OAAO,CAAC,mBAAmB,CAAC,YAAY;gDACjC,EAAE;;wBAE1B,CAAC;IACvB,CAAC;IAED,6DAA6D;IAC7D,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,IAAI,OAAO,OAAO,CAAC,YAAY,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QAChC,EAAE,EAAE,UAAU;QACd,aAAa,EAAE,KAAK;QACpB,KAAK;QACL,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;IAEH,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,IAAI,wBAAwB,GAAG,CAAC,CAAC;IACjC,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAE7B,IAAI,CAAC;QACH,qEAAqE;QACrE,kCAAkC;QAClC,IAAI,CAAC,CAAC,MAAM,iBAAiB,EAAE,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACb,iGAAiG,CAClG,CAAC;QACJ,CAAC;QAED,yDAAyD;QACzD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,qBAAqB,CAAC,CAAC;QAC7C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;QACjE,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,sBAAsB,CAAC,CAAC;QAE9C,sDAAsD;QACtD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS;YAC/B,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC;YAC9D,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAEpC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACvD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,EAAE,sBAAsB,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC;YACrB,MAAM;YACN,OAAO,EAAE;gBACP,YAAY,EAAE,gBAAgB,CAAC,KAAK;gBACpC,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;gBACnC,GAAG,EAAE,OAAO;gBACZ,GAAG,2BAA2B,CAAC,KAAK,CAAC;gBACrC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC,KAAK;oBACxD,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC,KAAM,EAAE;oBACpE,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpE;SACF,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAErC,0CAA0C;QAC1C,MAAM,UAAU,GAAG,EAAE,CAAC;QACtB,IAAI,QAAQ,GAA6E,EAAE,CAAC;QAE5F,KAAK,UAAU,aAAa;YAC1B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAClC,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5C,QAAQ,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,0EAA0E;QAC1E,4EAA4E;QAC5E,mEAAmE;QACnE,yEAAyE;QACzE,sCAAsC;QACtC,IAAI,wBAA4D,CAAC;QACjE,MAAM,mBAAmB,GAA2B;YAClD,CAAC,MAAM,CAAC,aAAa,CAAC;gBACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC9C,wBAAwB,GAAG,IAAI,CAAC;gBAChC,OAAO,IAAI,CAAC;YACd,CAAC;SACF,CAAC;QAEF,yEAAyE;QACzE,wEAAwE;QACxE,6DAA6D;QAC7D,MAAM,cAAc,GAAG,2BAA2B,CAAC,KAAK,CAAC,IAAI,mCAAmC,CAAC;QACjG,IAAI,iBAA4D,CAAC;QACjE,MAAM,mBAAmB,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YAC3D,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE;gBAClC,MAAM,CAAC,IAAI,0BAA0B,CAAC,cAAc,CAAC,CAAC,CAAC;YACzD,CAAC,EAAE,cAAc,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAChC,kBAAkB,CAAC,mBAAmB,EAAE;gBACtC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;oBACpB,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;gBAC7C,CAAC;gBACD,aAAa,EAAE,CAAC,GAAkB,EAAE,EAAE;oBACpC,QAAQ,CAAC,IAAI,CAAC;wBACZ,EAAE,EAAE,MAAM,EAAE;wBACZ,UAAU,EAAE,UAAU;wBACtB,IAAI,EAAE,GAAG,CAAC,IAAK;wBACf,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;qBAC5C,CAAC,CAAC;oBACH,IAAI,QAAQ,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;wBAClC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,mCAAmC,CAAC,CAAC,CAAC;oBACzF,CAAC;gBACH,CAAC;gBACD,qBAAqB,EAAE,wBAAwB;aAChD,CAAC;YACF,mBAAmB;SACpB,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACxB,oEAAoE;YACpE,uEAAuE;YACvE,uEAAuE;YACvE,sEAAsE;YACtE,kEAAkE;YAClE,qDAAqD;YACrD,wBAAwB,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACtD,MAAM,GAAG,CAAC;QACZ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACd,yEAAyE;YACzE,yEAAyE;YACzE,8BAA8B;YAC9B,IAAI,iBAAiB;gBAAE,YAAY,CAAC,iBAAiB,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,8BAA8B;QAC9B,MAAM,aAAa,EAAE,CAAC;QAEtB,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACjC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACnC,wBAAwB,GAAG,MAAM,CAAC,wBAAwB,CAAC;QAC3D,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAC;QACnD,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACrB,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC;QAElC,+DAA+D;QAC/D,qEAAqE;QACrE,qEAAqE;QACrE,qEAAqE;QACrE,oEAAoE;QACpE,gDAAgD;QAChD,MAAM,aAAa,GAAG,MAAM,cAAc,CACxC,eAAe,EACf,KAAK,EACL,OAAO,EACP,KAAK,EACL,OAAO,EACP,UAAU,UAAU,CAAC,aAAa,EAAE,CACrC,CAAC;QAEF,MAAM,EAAE;aACL,MAAM,CAAC,SAAS,CAAC;aACjB,GAAG,CAAC;YACH,MAAM,EAAE,WAAW;YACnB,WAAW,EAAE,IAAI,IAAI,EAAE;YACvB,WAAW;YACX,YAAY;YACZ,wBAAwB;YACxB,oBAAoB;YACpB,KAAK;YACL,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC;SACxD,CAAC;aACD,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QAEvC,GAAG,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,iBAAiB,CAAC,CAAC;QAClE,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,eAAe,EAAE,aAAa,CAAC,QAAQ;YACvC,mBAAmB,EAAE,aAAa,CAAC,UAAU;YAC7C,WAAW;YACX,YAAY;YACZ,KAAK;YACL,UAAU;SACX,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzD,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,cAAc,CAAC,CAAC;QAE1C,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;YAChC,EAAE,EAAE,MAAM,EAAE;YACZ,UAAU,EAAE,UAAU;YACtB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;SACrC,CAAC,CAAC;QAEH,MAAM,EAAE;aACL,MAAM,CAAC,SAAS,CAAC;aACjB,GAAG,CAAC;YACH,MAAM,EAAE,QAAQ;YAChB,WAAW,EAAE,IAAI,IAAI,EAAE;YACvB,WAAW;YACX,YAAY;YACZ,wBAAwB;YACxB,oBAAoB;YACpB,KAAK;YACL,YAAY;SACb,CAAC;aACD,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QAEvC,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,WAAW;YACX,YAAY;YACZ,KAAK;YACL,YAAY;YACZ,UAAU;SACX,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/executor/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export { agentProfiles, getAgentProfiles, DEFAULT_AGENT_PROFILES } from "./profi
|
|
|
2
2
|
export { checkTestQuality, analyzeTestFile, isTestFile, extractTestBlocks, TRIVIAL_MATCHERS, BEHAVIORAL_MATCHERS, TRIVIAL_THRESHOLD, type TestFileAnalysis, type TestQualityResult, } from "./test-quality.js";
|
|
3
3
|
export { parseHandoffArtifact } from "./handoff.js";
|
|
4
4
|
export { executeStage, type ExecuteStageContext } from "./executor.js";
|
|
5
|
-
export { consumeAgentStream, parseJsonBlock } from "./agent-stream.js";
|
|
5
|
+
export { consumeAgentStream, parseJsonBlock, StageStalledError, StagePreStreamStalledError } from "./agent-stream.js";
|
|
6
6
|
export { sanitize, mapIssueToSchema, assemblePrompt } from "./prompt/index.js";
|
|
7
7
|
export { runDeepReview, deepFindingsToReviewFindings, buildDeepReviewContext, type DeepReviewFinding, type DeepReviewResult, } from "./deep-review.js";
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AACtH,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EACL,aAAa,EACb,4BAA4B,EAC5B,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC"}
|
package/dist/executor/index.js
CHANGED
|
@@ -2,7 +2,7 @@ export { agentProfiles, getAgentProfiles, DEFAULT_AGENT_PROFILES } from "./profi
|
|
|
2
2
|
export { checkTestQuality, analyzeTestFile, isTestFile, extractTestBlocks, TRIVIAL_MATCHERS, BEHAVIORAL_MATCHERS, TRIVIAL_THRESHOLD, } from "./test-quality.js";
|
|
3
3
|
export { parseHandoffArtifact } from "./handoff.js";
|
|
4
4
|
export { executeStage } from "./executor.js";
|
|
5
|
-
export { consumeAgentStream, parseJsonBlock } from "./agent-stream.js";
|
|
5
|
+
export { consumeAgentStream, parseJsonBlock, StageStalledError, StagePreStreamStalledError } from "./agent-stream.js";
|
|
6
6
|
export { sanitize, mapIssueToSchema, assemblePrompt } from "./prompt/index.js";
|
|
7
7
|
export { runDeepReview, deepFindingsToReviewFindings, buildDeepReviewContext, } from "./deep-review.js";
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GAGlB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,YAAY,EAA4B,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GAGlB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,YAAY,EAA4B,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AACtH,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EACL,aAAa,EACb,4BAA4B,EAC5B,sBAAsB,GAGvB,MAAM,kBAAkB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/executor/prompt/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,eAAe,EACf,qBAAqB,EAErB,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AAWxB;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ9C;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAyB5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAOzD;
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/executor/prompt/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,eAAe,EACf,qBAAqB,EAErB,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AAWxB;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ9C;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAyB5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAOzD;AAKD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,CA4C9D;AAuBD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,qBAAqB,GAAG,MAAM,CA4B5E;AAMD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,eAAe,GACxB,MAAM,CAeR;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,eAAe,GACxB,MAAM,CAcR;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,eAAe,EACzB,cAAc,CAAC,EAAE,qBAAqB,EACtC,aAAa,CAAC,EAAE,oBAAoB,GACnC,MAAM,CA6ER;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,eAAe,GACxB,MAAM,CAgBR;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,eAAe,GACxB,MAAM,CAqBR"}
|
|
@@ -61,6 +61,8 @@ Test command: ${repo.testCommand}
|
|
|
61
61
|
Build command: ${repo.buildCommand}${repo.setupCommands ? `\nSetup commands: ${repo.setupCommands.join(" && ")}` : ""}${repo.workingDirectory ? `\nWorking directory: ${repo.workingDirectory}` : ""}
|
|
62
62
|
</repo-context>`;
|
|
63
63
|
}
|
|
64
|
+
/** Maximum length of an error snippet included in a handoff block. Caps the snippet so prompt size stays predictable even when build/test errors are verbose. */
|
|
65
|
+
const MAX_ERROR_SNIPPET_LENGTH = 500;
|
|
64
66
|
/**
|
|
65
67
|
* Wraps handoff artifact in a `<previous-stage-context>` block.
|
|
66
68
|
* Returns empty string when handoff is undefined.
|
|
@@ -85,18 +87,16 @@ Constraints: ${handoff.context.constraints.map(sanitizeField).join("; ") || "non
|
|
|
85
87
|
const tr = handoff.context.testResults;
|
|
86
88
|
block += `\nTest results: ${tr.passed} passed, ${tr.failed} failed`;
|
|
87
89
|
if (tr.firstFailure) {
|
|
88
|
-
const errorTrimmed = tr.firstFailure.error.length >
|
|
89
|
-
? tr.firstFailure.error.slice(0,
|
|
90
|
+
const errorTrimmed = tr.firstFailure.error.length > MAX_ERROR_SNIPPET_LENGTH
|
|
91
|
+
? tr.firstFailure.error.slice(0, MAX_ERROR_SNIPPET_LENGTH) + "… (trimmed)"
|
|
90
92
|
: tr.firstFailure.error;
|
|
91
93
|
block += `\nFirst failure: ${sanitizeField(tr.firstFailure.test)} in ${sanitizeField(tr.firstFailure.file)} — ${sanitizeField(errorTrimmed)}`;
|
|
92
94
|
}
|
|
93
95
|
}
|
|
94
96
|
const blockingFindings = handoff.context.reviewFindings?.filter(f => f.severity === "blocking") ?? [];
|
|
95
97
|
if (blockingFindings.length > 0) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
block += `\n [${f.severity}] ${sanitizeField(f.file)}:${f.line} — ${sanitizeField(f.category)}: ${sanitizeField(f.description)} (fix: ${sanitizeField(f.fix)})`;
|
|
99
|
-
}
|
|
98
|
+
const findingLines = blockingFindings.map(f => ` [${f.severity}] ${sanitizeField(f.file)}:${f.line} — ${sanitizeField(f.category)}: ${sanitizeField(f.description)} (fix: ${sanitizeField(f.fix)})`);
|
|
99
|
+
block += `\nBlocking review findings (${blockingFindings.length}):\n${findingLines.join("\n")}`;
|
|
100
100
|
const skipped = (handoff.context.reviewFindings?.length ?? 0) - blockingFindings.length;
|
|
101
101
|
if (skipped > 0) {
|
|
102
102
|
block += `\n (${skipped} non-blocking findings omitted)`;
|
|
@@ -294,7 +294,7 @@ Instructions:
|
|
|
294
294
|
- IMPORTANT: Cross-reference the implementation against the acceptance criteria listed in the issue data above. For each criterion, verify there is corresponding code in the diff. If any acceptance criterion is NOT addressed by the code changes, report it as a blocking finding with category "incomplete-implementation".
|
|
295
295
|
- DEAD CODE CHECK: For every new export (function, class, constant) in the changed files, use Grep to check if it is imported and called from at least one file other than its own test file. Re-exports in index/barrel files do NOT count as callers — there must be an actual invocation. Exception: side-effect-only registrations that run at import time are acceptable. If a new export has no callers outside its definition and test files, report it as a BLOCKING finding with category "dead-code" — the implementation is not wired into the pipeline and will have no effect at runtime.
|
|
296
296
|
- DOCUMENTATION CHECK: If the changes introduce new configuration options, CLI flags, environment variables, or change existing behavior, check whether CLAUDE.md, README.md, or deploy/README.md were updated. If documentation was not updated, report it as a warning finding with category "missing-documentation".
|
|
297
|
-
-
|
|
297
|
+
- FINAL OUTPUT: After completing your review, emit a single HandoffArtifact JSON block as your last output (format below). The \`summary\` field must be 1–2 sentences of prose describing what was reviewed and the overall verdict — NOT JSON. All fields are required even when there are no findings.
|
|
298
298
|
|
|
299
299
|
${REVIEW_OUTPUT_FORMAT}
|
|
300
300
|
`.trim();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/executor/prompt/templates.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/executor/prompt/templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,13 @@ import type { ReviewModelRun } from "./review-provider.js";
|
|
|
3
3
|
export interface PostFanoutResult {
|
|
4
4
|
/** Number of runs where raw-output fallback was used (structured parse failed). */
|
|
5
5
|
fallbackCount: number;
|
|
6
|
+
/**
|
|
7
|
+
* Number of per-model comments suppressed because the model returned empty findings
|
|
8
|
+
* with no rawOutput (i.e. the model legitimately found nothing to report).
|
|
9
|
+
* Suppression rule: `findings.length === 0 && rawOutput === undefined && status !== "failed"`.
|
|
10
|
+
* Audit events (`review.fanout_model_completed`) still fire for suppressed runs.
|
|
11
|
+
*/
|
|
12
|
+
suppressedEmptyCount: number;
|
|
6
13
|
}
|
|
7
14
|
export declare function postFanoutCommentsToPR(octokit: Octokit, owner: string, repo: string, prNumber: number, runs: ReviewModelRun[]): Promise<PostFanoutResult>;
|
|
8
15
|
export declare function renderRunMarkdown(run: ReviewModelRun): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post-fanout-comments.d.ts","sourceRoot":"","sources":["../../../src/executor/review/post-fanout-comments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAK3D,MAAM,WAAW,gBAAgB;IAC/B,mFAAmF;IACnF,aAAa,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"post-fanout-comments.d.ts","sourceRoot":"","sources":["../../../src/executor/review/post-fanout-comments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAK3D,MAAM,WAAW,gBAAgB;IAC/B,mFAAmF;IACnF,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,cAAc,EAAE,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAoC3B;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CA2C7D"}
|
|
@@ -2,15 +2,29 @@ import { addPRComment } from "../../repo/github.js";
|
|
|
2
2
|
import { createLogger } from "../../logger.js";
|
|
3
3
|
const log = createLogger({ component: "PostFanoutComments" });
|
|
4
4
|
export async function postFanoutCommentsToPR(octokit, owner, repo, prNumber, runs) {
|
|
5
|
-
const
|
|
5
|
+
const toPost = [];
|
|
6
|
+
let suppressedEmptyCount = 0;
|
|
7
|
+
for (const run of runs) {
|
|
8
|
+
const shouldSuppress = run.status !== "failed" &&
|
|
9
|
+
run.findings.length === 0 &&
|
|
10
|
+
run.rawOutput === undefined;
|
|
11
|
+
if (shouldSuppress) {
|
|
12
|
+
suppressedEmptyCount++;
|
|
13
|
+
log.debug({ modelId: run.modelId }, "fanout: suppressing empty-findings comment (no findings, no rawOutput)");
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
toPost.push(run);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const results = await Promise.allSettled(toPost.map((run) => addPRComment(octokit, owner, repo, prNumber, renderRunMarkdown(run))));
|
|
6
20
|
results.forEach((res, i) => {
|
|
7
21
|
if (res.status === "rejected") {
|
|
8
22
|
const err = res.reason instanceof Error ? res.reason.message : String(res.reason);
|
|
9
|
-
log.warn({ modelId:
|
|
23
|
+
log.warn({ modelId: toPost[i].modelId, err }, "failed to post fanout PR comment");
|
|
10
24
|
}
|
|
11
25
|
});
|
|
12
26
|
const fallbackCount = runs.filter((r) => r.rawOutput !== undefined).length;
|
|
13
|
-
return { fallbackCount };
|
|
27
|
+
return { fallbackCount, suppressedEmptyCount };
|
|
14
28
|
}
|
|
15
29
|
export function renderRunMarkdown(run) {
|
|
16
30
|
const tokens = `${run.inputTokens.toLocaleString()} in / ${run.outputTokens.toLocaleString()} out tokens`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post-fanout-comments.js","sourceRoot":"","sources":["../../../src/executor/review/post-fanout-comments.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"post-fanout-comments.js","sourceRoot":"","sources":["../../../src/executor/review/post-fanout-comments.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,4 +26,19 @@ export interface ReviewProvider {
|
|
|
26
26
|
runReview(ctx: ReviewContext): Promise<ReviewModelRun[]>;
|
|
27
27
|
}
|
|
28
28
|
export declare function getEnabledProviders(env: NodeJS.ProcessEnv): ReviewProvider[];
|
|
29
|
+
/**
|
|
30
|
+
* Validates that every model ID in env.REVIEW_MODELS exists in the OpenRouter
|
|
31
|
+
* catalog. Called at CLI startup (packages/cli/src/commands/start.ts and
|
|
32
|
+
* packages/cli/src/commands/dev.ts) when both REVIEW_MODELS and
|
|
33
|
+
* OPENROUTER_API_KEY are set.
|
|
34
|
+
*
|
|
35
|
+
* Never throws and never blocks startup — if the catalog endpoint is
|
|
36
|
+
* unreachable, a debug log is emitted and validation is skipped. For each
|
|
37
|
+
* unknown model ID a warn is emitted with up to 3 closest-name suggestions so
|
|
38
|
+
* operators can correct typos before they burn API budget on silent 404s.
|
|
39
|
+
*
|
|
40
|
+
* @param env - The process environment (NodeJS.ProcessEnv)
|
|
41
|
+
* @returns Promise<void> — always resolves.
|
|
42
|
+
*/
|
|
43
|
+
export declare function validateReviewModels(env: NodeJS.ProcessEnv): Promise<void>;
|
|
29
44
|
//# sourceMappingURL=review-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-provider.d.ts","sourceRoot":"","sources":["../../../src/executor/review/review-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAOrE,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,YAAY,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,gBAAgB,CAAC;IAC9B,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;CAC1D;
|
|
1
|
+
{"version":3,"file":"review-provider.d.ts","sourceRoot":"","sources":["../../../src/executor/review/review-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAOrE,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,YAAY,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,gBAAgB,CAAC;IAC9B,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;CAC1D;AAsBD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,cAAc,EAAE,CA+C5E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAyChF"}
|