jonah-fleet 1.31.1 → 1.31.3
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/CHANGELOG.md +23 -0
- package/dist/index.js +114 -27
- package/dist/lib/daemon.d.ts +3 -0
- package/dist/lib/daemon.d.ts.map +1 -1
- package/dist/lib/loop-guard.d.ts +4 -0
- package/dist/lib/loop-guard.d.ts.map +1 -1
- package/dist/lib/runner.d.ts +5 -0
- package/dist/lib/runner.d.ts.map +1 -1
- package/package.json +1 -1
- package/templates/prompts/autowork.md +2 -1
- package/templates/scripts/run-with-loop-guard.js +33 -17
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,29 @@ All notable changes to `jonah-fleet` will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.31.3](https://github.com/Jonah-Projects/jonah-fleet/compare/v1.31.2...v1.31.3) (2026-10-02)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* **loop-guard,prompts:** exempt read-only status polling from loop guard and streamline local autowork handoff ([#580](https://github.com/Jonah-Projects/jonah-fleet/issues/580)) ([ff38bdb](https://github.com/Jonah-Projects/jonah-fleet/commit/ff38bdb6bc3ffccde890df958a2feda0db1effd6))
|
|
14
|
+
|
|
15
|
+
## [1.31.2](https://github.com/Jonah-Projects/jonah-fleet/compare/v1.31.1...v1.31.2) (2026-10-02)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Bug Fixes
|
|
19
|
+
|
|
20
|
+
* **runner,daemon:** add startup transient 503 retry and exempt from PR failure cooldown ([#575](https://github.com/Jonah-Projects/jonah-fleet/issues/575)) ([c6f37eb](https://github.com/Jonah-Projects/jonah-fleet/commit/c6f37ebd4bc7072f267c77c42eba255aa71b2d78))
|
|
21
|
+
|
|
22
|
+
## [Unreleased] - 2026-10-02
|
|
23
|
+
|
|
24
|
+
### Bug Fixes
|
|
25
|
+
|
|
26
|
+
* **runner:** introduce `detectTransientServiceError` and add startup retry loop (up to 2 retries with backoff) when `agy` encounters transient 503 UNAVAILABLE or handshake EOF during initialization
|
|
27
|
+
* **daemon:** exempt transient service errors (503 UNAVAILABLE) from PR failure cooldowns to avoid penalizing PR review schedules on momentary upstream cloud blips
|
|
28
|
+
* **loop-guard:** exempt read-only CLI status polling commands (`gh run view`, `gh run watch`, `gh pr view`, `gh pr checks`, `git status`) from repetition and ping-pong loop circuit breakers
|
|
29
|
+
* **prompts:** clarify fast autonomous handoff in autowork Step 15 for local daemon runs so completed PRs hand off cleanly to peer-review without 12-minute polling wait
|
|
30
|
+
|
|
8
31
|
## [1.31.1](https://github.com/Jonah-Projects/jonah-fleet/compare/v1.31.0...v1.31.1) (2026-10-01)
|
|
9
32
|
|
|
10
33
|
|
package/dist/index.js
CHANGED
|
@@ -3992,6 +3992,20 @@ function computeActionHash(toolName, args) {
|
|
|
3992
3992
|
const canonicalArgs = canonicalStringify(args);
|
|
3993
3993
|
return crypto.createHash("sha256").update(`${toolName}:${canonicalArgs}`).digest("hex");
|
|
3994
3994
|
}
|
|
3995
|
+
function isStatusPollingAction(toolName, args) {
|
|
3996
|
+
if (toolName === "manage_task" && (args?.Action === "status" || args?.action === "status" || args?.Action === "list" || args?.action === "list")) {
|
|
3997
|
+
return true;
|
|
3998
|
+
}
|
|
3999
|
+
if (toolName === "manage_subagents" && (args?.Action === "list" || args?.action === "list")) {
|
|
4000
|
+
return true;
|
|
4001
|
+
}
|
|
4002
|
+
if (toolName === "run_command" && typeof (args?.CommandLine || args?.command) === "string" && /^\s*(?:gh\s+(?:run\s+(?:view|watch|list)|pr\s+(?:view|checks|status|list))|git\s+(?:status|log))\b/i.test(
|
|
4003
|
+
args?.CommandLine || args?.command || ""
|
|
4004
|
+
)) {
|
|
4005
|
+
return true;
|
|
4006
|
+
}
|
|
4007
|
+
return false;
|
|
4008
|
+
}
|
|
3995
4009
|
var LoopGuard = class {
|
|
3996
4010
|
routine;
|
|
3997
4011
|
repetitionThreshold;
|
|
@@ -4036,7 +4050,7 @@ var LoopGuard = class {
|
|
|
4036
4050
|
if (this.trippedResult) {
|
|
4037
4051
|
return this.trippedResult;
|
|
4038
4052
|
}
|
|
4039
|
-
const isStatusPolling =
|
|
4053
|
+
const isStatusPolling = isStatusPollingAction(toolName, args);
|
|
4040
4054
|
const isAnalyticsRoutine = this.routine === "analytics-review";
|
|
4041
4055
|
const isExemptFromRepetition = isStatusPolling || isAnalyticsRoutine || toolName === "view_file" || toolName === "read_file" || toolName === "replace_file_content" || toolName === "write_to_file";
|
|
4042
4056
|
const hash = computeActionHash(toolName, args);
|
|
@@ -4093,7 +4107,7 @@ var LoopGuard = class {
|
|
|
4093
4107
|
if (this.history.length >= requiredPingPongLength) {
|
|
4094
4108
|
const pingPongSlice = this.history.slice(-requiredPingPongLength);
|
|
4095
4109
|
const hasExemptPingPongAction = isAnalyticsRoutine || pingPongSlice.some(
|
|
4096
|
-
(item) =>
|
|
4110
|
+
(item) => isStatusPollingAction(item.toolName, item.args) || item.toolName === "replace_file_content" || item.toolName === "write_to_file"
|
|
4097
4111
|
);
|
|
4098
4112
|
if (!hasExemptPingPongAction) {
|
|
4099
4113
|
const hashA = pingPongSlice[0].hash;
|
|
@@ -4345,7 +4359,7 @@ function buildRoutinePrompt(targetDir, routine, options = {}) {
|
|
|
4345
4359
|
const promptFile = `.github/prompts/${routine}.md`;
|
|
4346
4360
|
const repoContext = `Working repository is located at ${targetDir}. All git, gh, and workspace commands must execute strictly within this repository.`;
|
|
4347
4361
|
const logPrompt = options.routineIssueNumber ? ` Tracking run log issue: #${options.routineIssueNumber}.` : "";
|
|
4348
|
-
const headlessGuardrail = ` Execution Guardrail: You are executing in a headless autonomous session. You MUST NEVER call schedule or yield your turn with plain text to wait on background tasks or verification checks. If a verification command (tests, type-check, lint) runs in the background, inspect its completion with manage_task(Action='status') or manage_subagents(Action='list') (status polling with these tools is explicitly exempted from loop guard circuit breakers), or execute commands with sufficient WaitMsBeforeAsync (up to 10000 ms). DO NOT busy-wait by repeatedly calling read tools (such as view_file) on unchanged files to pass time while waiting, as calling non-polling tools with identical parameters will trip the loop circuit breaker. Never stop calling tools or yield your turn until the routine's terminal Definition of Done is fully reached.`;
|
|
4362
|
+
const headlessGuardrail = ` Execution Guardrail: You are executing in a headless autonomous session. You MUST NEVER call schedule or yield your turn with plain text to wait on background tasks or verification checks. If a verification command (tests, type-check, lint) runs in the background, inspect its completion with manage_task(Action='status') or manage_subagents(Action='list') (status polling with these tools is explicitly exempted from loop guard circuit breakers), or execute commands with sufficient WaitMsBeforeAsync (up to 10000 ms). DO NOT busy-wait by repeatedly calling read tools (such as view_file) on unchanged files to pass time while waiting, as calling non-polling tools with identical parameters will trip the loop circuit breaker. Read-only status commands (gh run view, gh pr view, gh pr checks, git status) are also exempted from loop guard repetition limits. Never stop calling tools or yield your turn until the routine's terminal Definition of Done is fully reached.`;
|
|
4349
4363
|
if (routine === "autowork") {
|
|
4350
4364
|
if (options.issue) {
|
|
4351
4365
|
return `You are the Autowork routine for this repository. ${repoContext} Read and follow the instructions in ${promptFile} exactly. ${skillsPrompt}Your target is issue #${options.issue}. You are in Targeted mode: work issue #${options.issue} directly, ahead of Phase 1 convergence and priority scan.${logPrompt}${headlessGuardrail}`;
|
|
@@ -4446,6 +4460,11 @@ ${stderr}`;
|
|
|
4446
4460
|
}
|
|
4447
4461
|
return { isQuota: false };
|
|
4448
4462
|
}
|
|
4463
|
+
function detectTransientServiceError(output, stderr) {
|
|
4464
|
+
const combined = `${output}
|
|
4465
|
+
${stderr}`;
|
|
4466
|
+
return /UNAVAILABLE\s*\((?:code\s*)?503\)/i.test(combined) || /\bcode\s*503\b/i.test(combined) || /The service is currently unavailable/i.test(combined) || /Eligibility check failed/i.test(combined) || /status(?:\s*code)?\s*[:=]?\s*503\b/i.test(combined) || /503\s+Service\s+Unavailable/i.test(combined) || /daily-cloudcode-pa\.googleapis\.com.*EOF/i.test(combined) || /oauth2\/v2\/userinfo.*EOF/i.test(combined);
|
|
4467
|
+
}
|
|
4449
4468
|
function tryReconcileLocalRunIssue(cwd, issueNumber, reportContent, exitCode, hostname, routine, quotaInfo) {
|
|
4450
4469
|
try {
|
|
4451
4470
|
if (quotaInfo?.isQuota) {
|
|
@@ -4918,6 +4937,7 @@ Timeout: ${printTimeout}`,
|
|
|
4918
4937
|
}
|
|
4919
4938
|
}
|
|
4920
4939
|
});
|
|
4940
|
+
let executedAnyTool = false;
|
|
4921
4941
|
const stdoutParser = new LineBufferedStreamParser((line) => {
|
|
4922
4942
|
const event = parseStreamJsonEvent(line);
|
|
4923
4943
|
if (event) {
|
|
@@ -4948,6 +4968,7 @@ Timeout: ${printTimeout}`,
|
|
|
4948
4968
|
spinner.update(`${targetLabel}: ${activePhase}`);
|
|
4949
4969
|
}
|
|
4950
4970
|
} else if (su.state === "DONE") {
|
|
4971
|
+
executedAnyTool = true;
|
|
4951
4972
|
lastActionDesc = null;
|
|
4952
4973
|
if (su.tool_info?.output) {
|
|
4953
4974
|
checkTargetDetection(su.tool_info.output);
|
|
@@ -5045,29 +5066,61 @@ Timeout: ${printTimeout}`,
|
|
|
5045
5066
|
stdoutParser.feed(chunk);
|
|
5046
5067
|
}
|
|
5047
5068
|
};
|
|
5069
|
+
const maxStartupAttempts = 3;
|
|
5070
|
+
let attempt = 0;
|
|
5048
5071
|
try {
|
|
5049
|
-
|
|
5050
|
-
|
|
5051
|
-
|
|
5052
|
-
|
|
5053
|
-
|
|
5054
|
-
|
|
5055
|
-
|
|
5056
|
-
|
|
5057
|
-
|
|
5058
|
-
}
|
|
5059
|
-
|
|
5060
|
-
|
|
5061
|
-
|
|
5062
|
-
|
|
5063
|
-
|
|
5064
|
-
|
|
5065
|
-
|
|
5066
|
-
|
|
5067
|
-
|
|
5068
|
-
|
|
5072
|
+
while (attempt < maxStartupAttempts) {
|
|
5073
|
+
attempt++;
|
|
5074
|
+
if (attempt > 1) {
|
|
5075
|
+
accumulatedOutput = "";
|
|
5076
|
+
accumulatedStderr = "";
|
|
5077
|
+
finalResponseText = "";
|
|
5078
|
+
lastActionDesc = null;
|
|
5079
|
+
executedAnyTool = false;
|
|
5080
|
+
loopGuardTrip = null;
|
|
5081
|
+
}
|
|
5082
|
+
exitCode = await new Promise((resolve, reject) => {
|
|
5083
|
+
const child = spawn("agy", args, {
|
|
5084
|
+
cwd: executionDir,
|
|
5085
|
+
env: childEnv,
|
|
5086
|
+
stdio: ["inherit", "pipe", "pipe"]
|
|
5087
|
+
});
|
|
5088
|
+
activeChild = child;
|
|
5089
|
+
child.stdout?.on("data", (data) => {
|
|
5090
|
+
processChunk(data.toString(), false);
|
|
5091
|
+
});
|
|
5092
|
+
child.stderr?.on("data", (data) => {
|
|
5093
|
+
processChunk(data.toString(), true);
|
|
5094
|
+
});
|
|
5095
|
+
child.on("error", (err) => {
|
|
5096
|
+
spinner?.stop();
|
|
5097
|
+
reject(err);
|
|
5098
|
+
});
|
|
5099
|
+
child.on("close", (code, signal) => {
|
|
5100
|
+
spinner?.stop();
|
|
5101
|
+
resolve(resolveExitCode(code, signal));
|
|
5102
|
+
});
|
|
5069
5103
|
});
|
|
5070
|
-
|
|
5104
|
+
stdoutParser.flush();
|
|
5105
|
+
stderrParser.flush();
|
|
5106
|
+
const isTransient = detectTransientServiceError(
|
|
5107
|
+
finalResponseText || accumulatedOutput,
|
|
5108
|
+
accumulatedStderr
|
|
5109
|
+
);
|
|
5110
|
+
if (exitCode !== 0 && isTransient && !executedAnyTool && attempt < maxStartupAttempts) {
|
|
5111
|
+
const delaySec = attempt * 2;
|
|
5112
|
+
const retryMsg = `Transient service error (503 UNAVAILABLE). Retrying startup in ${delaySec}s (attempt ${attempt + 1}/${maxStartupAttempts})...`;
|
|
5113
|
+
if (spinner) {
|
|
5114
|
+
spinner.update(`${targetLabel}: ${retryMsg}`);
|
|
5115
|
+
} else {
|
|
5116
|
+
console.warn(pc11.yellow(`
|
|
5117
|
+
[runner] ${retryMsg}`));
|
|
5118
|
+
}
|
|
5119
|
+
await new Promise((r) => setTimeout(r, delaySec * 1e3));
|
|
5120
|
+
continue;
|
|
5121
|
+
}
|
|
5122
|
+
break;
|
|
5123
|
+
}
|
|
5071
5124
|
} finally {
|
|
5072
5125
|
spinner?.stop();
|
|
5073
5126
|
process.removeListener("SIGINT", sigintHandler);
|
|
@@ -5076,8 +5129,6 @@ Timeout: ${printTimeout}`,
|
|
|
5076
5129
|
await cleanup();
|
|
5077
5130
|
}
|
|
5078
5131
|
}
|
|
5079
|
-
stdoutParser.flush();
|
|
5080
|
-
stderrParser.flush();
|
|
5081
5132
|
output = finalResponseText || accumulatedOutput;
|
|
5082
5133
|
const durationMs = Date.now() - startTime;
|
|
5083
5134
|
const durationSec = Math.round(durationMs / 1e3);
|
|
@@ -5181,6 +5232,7 @@ Timeout: ${printTimeout}`,
|
|
|
5181
5232
|
);
|
|
5182
5233
|
}
|
|
5183
5234
|
}
|
|
5235
|
+
const transientServiceError = exitCode !== 0 && detectTransientServiceError(output, accumulatedStderr);
|
|
5184
5236
|
return {
|
|
5185
5237
|
success: exitCode === 0,
|
|
5186
5238
|
exitCode,
|
|
@@ -5190,7 +5242,8 @@ Timeout: ${printTimeout}`,
|
|
|
5190
5242
|
branchName,
|
|
5191
5243
|
issueNumber: routineIssueNumber,
|
|
5192
5244
|
quotaPaused: quotaInfo.isQuota,
|
|
5193
|
-
quotaResetInfo: quotaInfo.resetInfo
|
|
5245
|
+
quotaResetInfo: quotaInfo.resetInfo,
|
|
5246
|
+
transientServiceError
|
|
5194
5247
|
};
|
|
5195
5248
|
}
|
|
5196
5249
|
|
|
@@ -6155,6 +6208,17 @@ async function drainReviewQueue(drainOptions) {
|
|
|
6155
6208
|
onQuotaExhausted?.(resetInfo);
|
|
6156
6209
|
break;
|
|
6157
6210
|
}
|
|
6211
|
+
const isTransient = result.transientServiceError || !result.success && detectTransientServiceError(result.output || "", result.stderr || "");
|
|
6212
|
+
if (isTransient) {
|
|
6213
|
+
console.warn(
|
|
6214
|
+
pc14.yellow(
|
|
6215
|
+
`
|
|
6216
|
+
\u26A0\uFE0F Peer Review on ${targetLabel} encountered transient service error (503 UNAVAILABLE). PR will remain eligible for next sweep without failure cooldown.
|
|
6217
|
+
`
|
|
6218
|
+
)
|
|
6219
|
+
);
|
|
6220
|
+
break;
|
|
6221
|
+
}
|
|
6158
6222
|
if (result.success) {
|
|
6159
6223
|
console.log(pc14.green(`\u2713 Local peer-review on ${targetLabel} completed successfully.
|
|
6160
6224
|
`));
|
|
@@ -6170,6 +6234,17 @@ async function drainReviewQueue(drainOptions) {
|
|
|
6170
6234
|
}
|
|
6171
6235
|
}
|
|
6172
6236
|
} catch (err) {
|
|
6237
|
+
const isTransientErr = detectTransientServiceError(err.message || "", "");
|
|
6238
|
+
if (isTransientErr) {
|
|
6239
|
+
console.warn(
|
|
6240
|
+
pc14.yellow(
|
|
6241
|
+
`
|
|
6242
|
+
\u26A0\uFE0F Peer Review on ${targetLabel} encountered transient service error (${err.message}). PR will remain eligible for next sweep without failure cooldown.
|
|
6243
|
+
`
|
|
6244
|
+
)
|
|
6245
|
+
);
|
|
6246
|
+
break;
|
|
6247
|
+
}
|
|
6173
6248
|
console.error(pc14.red(`\u2717 Error in peer-review on ${targetLabel}: ${err.message}`));
|
|
6174
6249
|
if (currentPR) {
|
|
6175
6250
|
attemptedPRNumbers.add(currentPR.number);
|
|
@@ -6287,6 +6362,17 @@ async function performAutoworkScan(scanOptions) {
|
|
|
6287
6362
|
scanOptions.onQuotaExhausted?.(resetInfo);
|
|
6288
6363
|
return { executed: true, reason: "quota_exhausted" };
|
|
6289
6364
|
}
|
|
6365
|
+
const isTransient = result.transientServiceError || !result.success && detectTransientServiceError(result.output || "", result.stderr || "");
|
|
6366
|
+
if (isTransient) {
|
|
6367
|
+
console.warn(
|
|
6368
|
+
pc14.yellow(
|
|
6369
|
+
`
|
|
6370
|
+
\u26A0\uFE0F Autowork encountered transient service error (503 UNAVAILABLE). Routine will retry on next cycle without failure penalty.
|
|
6371
|
+
`
|
|
6372
|
+
)
|
|
6373
|
+
);
|
|
6374
|
+
return { executed: true, reason: "transient_service_error" };
|
|
6375
|
+
}
|
|
6290
6376
|
if (result.success) {
|
|
6291
6377
|
console.log(pc14.green(`\u2713 Local autowork completed successfully.
|
|
6292
6378
|
`));
|
|
@@ -7238,5 +7324,6 @@ export {
|
|
|
7238
7324
|
formatLoopGuardReport,
|
|
7239
7325
|
getFleetFooter,
|
|
7240
7326
|
getFleetRunBadge,
|
|
7327
|
+
isStatusPollingAction,
|
|
7241
7328
|
renderFleetBanner
|
|
7242
7329
|
};
|
package/dist/lib/daemon.d.ts
CHANGED
|
@@ -32,6 +32,7 @@ export interface DaemonOptions {
|
|
|
32
32
|
exitCode?: number;
|
|
33
33
|
quotaPaused?: boolean;
|
|
34
34
|
quotaResetInfo?: string;
|
|
35
|
+
transientServiceError?: boolean;
|
|
35
36
|
output?: string;
|
|
36
37
|
stderr?: string;
|
|
37
38
|
}>;
|
|
@@ -152,6 +153,7 @@ export interface DrainReviewQueueOptions {
|
|
|
152
153
|
exitCode?: number;
|
|
153
154
|
quotaPaused?: boolean;
|
|
154
155
|
quotaResetInfo?: string;
|
|
156
|
+
transientServiceError?: boolean;
|
|
155
157
|
output?: string;
|
|
156
158
|
stderr?: string;
|
|
157
159
|
}>;
|
|
@@ -177,6 +179,7 @@ export interface PerformAutoworkScanOptions {
|
|
|
177
179
|
exitCode?: number;
|
|
178
180
|
quotaPaused?: boolean;
|
|
179
181
|
quotaResetInfo?: string;
|
|
182
|
+
transientServiceError?: boolean;
|
|
180
183
|
output?: string;
|
|
181
184
|
stderr?: string;
|
|
182
185
|
}>;
|
package/dist/lib/daemon.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/lib/daemon.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/lib/daemon.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/loop-guard.d.ts
CHANGED
|
@@ -30,6 +30,10 @@ export declare function canonicalStringify(value: any): string;
|
|
|
30
30
|
* Computes a deterministic SHA-256 action hash: SHA-256(tool_name + canonicalString(args))
|
|
31
31
|
*/
|
|
32
32
|
export declare function computeActionHash(toolName: string, args: any): string;
|
|
33
|
+
/**
|
|
34
|
+
* Checks whether an action is a read-only status or task polling action exempt from repetition / ping-pong loops.
|
|
35
|
+
*/
|
|
36
|
+
export declare function isStatusPollingAction(toolName: string, args: any): boolean;
|
|
33
37
|
/**
|
|
34
38
|
* Deterministic Loop Guard & Circuit Breaker monitoring tool calls and execution events.
|
|
35
39
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop-guard.d.ts","sourceRoot":"","sources":["../../src/lib/loop-guard.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,GAAG,YAAY,GAAG,WAAW,GAAG,oBAAoB,CAAC;AAEpF,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,GAAG,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;CACxC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAarD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,MAAM,CAGrE;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,yBAAyB,CAAS;IAC1C,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,MAAM,CAAC,CAAgC;IAE/C,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,qBAAqB,CAAa;IAC1C,OAAO,CAAC,aAAa,CAA8B;IAEnD,YAAY,OAAO,GAAE,gBAAqB,EAOzC;IAEM,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,GAAG,IAAI,CAE9D;IAEM,SAAS,IAAI,OAAO,CAE1B;IAEM,OAAO,IAAI,aAAa,GAAG,IAAI,CAErC;IAEM,UAAU,IAAI,YAAY,EAAE,CAElC;IAEM,KAAK,IAAI,IAAI,CAKnB;IAED;;OAEG;IACI,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,GAAE,OAAe,GAAG,aAAa,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"loop-guard.d.ts","sourceRoot":"","sources":["../../src/lib/loop-guard.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,GAAG,YAAY,GAAG,WAAW,GAAG,oBAAoB,CAAC;AAEpF,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,GAAG,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;CACxC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAarD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,MAAM,CAGrE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CA6B1E;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,yBAAyB,CAAS;IAC1C,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,MAAM,CAAC,CAAgC;IAE/C,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,qBAAqB,CAAa;IAC1C,OAAO,CAAC,aAAa,CAA8B;IAEnD,YAAY,OAAO,GAAE,gBAAqB,EAOzC;IAEM,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,GAAG,IAAI,CAE9D;IAEM,SAAS,IAAI,OAAO,CAE1B;IAEM,OAAO,IAAI,aAAa,GAAG,IAAI,CAErC;IAEM,UAAU,IAAI,YAAY,EAAE,CAElC;IAEM,KAAK,IAAI,IAAI,CAKnB;IAED;;OAEG;IACI,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,GAAE,OAAe,GAAG,aAAa,GAAG,IAAI,CAyH/F;IAED;;OAEG;IACI,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAwBlD;IAED,OAAO,CAAC,WAAW;CAWpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,MAAM,CAWvE;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM,CA0BvF;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,aAAa,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,CAmC7E"}
|
package/dist/lib/runner.d.ts
CHANGED
|
@@ -25,6 +25,7 @@ export interface RunLocalRoutineResult {
|
|
|
25
25
|
issueNumber?: number;
|
|
26
26
|
quotaPaused?: boolean;
|
|
27
27
|
quotaResetInfo?: string;
|
|
28
|
+
transientServiceError?: boolean;
|
|
28
29
|
}
|
|
29
30
|
export interface StreamJsonEvent {
|
|
30
31
|
event?: string;
|
|
@@ -167,6 +168,10 @@ export interface QuotaDetectionResult {
|
|
|
167
168
|
* Detects whether routine runner stdout/stderr failed due to LLM quota exhaustion.
|
|
168
169
|
*/
|
|
169
170
|
export declare function detectQuotaExceeded(output: string, stderr: string): QuotaDetectionResult;
|
|
171
|
+
/**
|
|
172
|
+
* Detects whether routine runner stdout/stderr failed due to transient upstream service unavailability (e.g. 503, handshake EOF).
|
|
173
|
+
*/
|
|
174
|
+
export declare function detectTransientServiceError(output: string, stderr: string): boolean;
|
|
170
175
|
/**
|
|
171
176
|
* Reconciles a GitHub issue for local routine execution.
|
|
172
177
|
* Closes the issue if success, leaves it open with needs-attention if failure.
|
package/dist/lib/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/lib/runner.ts"],"names":[],"mappings":"AAgCA,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/lib/runner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -306,7 +306,8 @@ _Generated by [Antigravity](${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/ru
|
|
|
306
306
|
```
|
|
307
307
|
14. If run aborts before opening PR, release claim (unassign).
|
|
308
308
|
15. **In-Session Peer Review Wait & Immediate Convergence (Warm Context):**
|
|
309
|
-
-
|
|
309
|
+
- **Local Daemon Environment**: If running locally under `jonah-fleet daemon` or with local runner (`runner:local`): Do NOT busy-wait or poll PR status. Autonomous handoff is complete. Proceed immediately to Step 16 / Logging, unassign yourself from the PR (`gh pr edit <PR> --remove-assignee <login>`), record terminal SUCCESS, and exit cleanly so the daemon's Peer Review Watchdog can review the PR without delay.
|
|
310
|
+
- **Cloud CI Environment**: Poll PR status for up to 10–12 minutes using read-only status checks (`gh pr view`, `gh pr checks`, `gh run view`).
|
|
310
311
|
- If merged: unassign yourself, resolve and close any open past failed routine run issues for `#<TARGET_ISSUE>`, record terminal SUCCESS and exit cleanly:
|
|
311
312
|
```bash
|
|
312
313
|
PAST_FAILURES=$(gh issue list --label routine-log --search "Issue #<TARGET_ISSUE>" --state open --json number --jq '.[].number' || true)
|
|
@@ -38,6 +38,37 @@ export function computeActionHash(toolName, args) {
|
|
|
38
38
|
return crypto.createHash('sha256').update(`${toolName}:${canonicalArgs}`).digest('hex');
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
export function isStatusPollingAction(toolName, args) {
|
|
42
|
+
if (
|
|
43
|
+
toolName === 'manage_task' &&
|
|
44
|
+
(args?.Action === 'status' ||
|
|
45
|
+
args?.action === 'status' ||
|
|
46
|
+
args?.Action === 'list' ||
|
|
47
|
+
args?.action === 'list')
|
|
48
|
+
) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (
|
|
53
|
+
toolName === 'manage_subagents' &&
|
|
54
|
+
(args?.Action === 'list' || args?.action === 'list')
|
|
55
|
+
) {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (
|
|
60
|
+
toolName === 'run_command' &&
|
|
61
|
+
typeof (args?.CommandLine || args?.command) === 'string' &&
|
|
62
|
+
/^\s*(?:gh\s+(?:run\s+(?:view|watch|list)|pr\s+(?:view|checks|status|list))|git\s+(?:status|log))\b/i.test(
|
|
63
|
+
args?.CommandLine || args?.command || ''
|
|
64
|
+
)
|
|
65
|
+
) {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
|
|
41
72
|
export class LoopGuard {
|
|
42
73
|
constructor(options = {}) {
|
|
43
74
|
this.routine = options.routine;
|
|
@@ -64,15 +95,7 @@ export class LoopGuard {
|
|
|
64
95
|
recordAction(toolName, args, isError = false) {
|
|
65
96
|
if (this.trippedResult) return this.trippedResult;
|
|
66
97
|
|
|
67
|
-
const isStatusPolling =
|
|
68
|
-
(toolName === 'manage_task' &&
|
|
69
|
-
(args?.Action === 'status' ||
|
|
70
|
-
args?.action === 'status' ||
|
|
71
|
-
args?.Action === 'list' ||
|
|
72
|
-
args?.action === 'list')) ||
|
|
73
|
-
(toolName === 'manage_subagents' &&
|
|
74
|
-
(args?.Action === 'list' ||
|
|
75
|
-
args?.action === 'list'));
|
|
98
|
+
const isStatusPolling = isStatusPollingAction(toolName, args);
|
|
76
99
|
|
|
77
100
|
const isAnalyticsRoutine = this.routine === 'analytics-review';
|
|
78
101
|
|
|
@@ -151,14 +174,7 @@ export class LoopGuard {
|
|
|
151
174
|
isAnalyticsRoutine ||
|
|
152
175
|
pingPongSlice.some(
|
|
153
176
|
(item) =>
|
|
154
|
-
(item.toolName
|
|
155
|
-
(item.args?.Action === 'status' ||
|
|
156
|
-
item.args?.action === 'status' ||
|
|
157
|
-
item.args?.Action === 'list' ||
|
|
158
|
-
item.args?.action === 'list')) ||
|
|
159
|
-
(item.toolName === 'manage_subagents' &&
|
|
160
|
-
(item.args?.Action === 'list' ||
|
|
161
|
-
item.args?.action === 'list')) ||
|
|
177
|
+
isStatusPollingAction(item.toolName, item.args) ||
|
|
162
178
|
item.toolName === 'replace_file_content' ||
|
|
163
179
|
item.toolName === 'write_to_file'
|
|
164
180
|
);
|