jonah-fleet 1.31.0 β 1.31.2
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 +24 -0
- package/dist/index.js +189 -34
- package/dist/lib/daemon.d.ts +26 -0
- package/dist/lib/daemon.d.ts.map +1 -1
- package/dist/lib/runner.d.ts +7 -0
- package/dist/lib/runner.d.ts.map +1 -1
- package/package.json +1 -1
- package/templates/prompts/analytics-review.md +1 -1
- package/templates/prompts/design-review.md +1 -1
- package/templates/prompts/product-planning.md +1 -1
- package/templates/workflows/analytics-review-cron.yml +1 -1
- package/templates/workflows/autowork-cron.yml +1 -1
- package/templates/workflows/dependency-check-cron.yml +1 -1
- package/templates/workflows/design-review-cron.yml +1 -1
- package/templates/workflows/issues-housekeeping-cron.yml +1 -1
- package/templates/workflows/prompt-optimizer-cron.yml +1 -1
- package/templates/workflows/trigger-autowork-manual.yml +1 -1
- package/templates/workflows/trigger-autowork-on-assign.yml +1 -1
- package/templates/workflows/trigger-autowork-on-bug.yml +1 -1
- package/templates/workflows/trigger-autowork-on-merge.yml +1 -1
- package/templates/workflows/trigger-review-routine.yml +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,27 @@ 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.2](https://github.com/Jonah-Projects/jonah-fleet/compare/v1.31.1...v1.31.2) (2026-10-02)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* **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))
|
|
14
|
+
|
|
15
|
+
## [Unreleased] - 2026-10-02
|
|
16
|
+
|
|
17
|
+
### Bug Fixes
|
|
18
|
+
|
|
19
|
+
* **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
|
|
20
|
+
* **daemon:** exempt transient service errors (503 UNAVAILABLE) from PR failure cooldowns to avoid penalizing PR review schedules on momentary upstream cloud blips
|
|
21
|
+
|
|
22
|
+
## [1.31.1](https://github.com/Jonah-Projects/jonah-fleet/compare/v1.31.0...v1.31.1) (2026-10-01)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
### Bug Fixes
|
|
26
|
+
|
|
27
|
+
* **daemon:** add quota exhaustion cooldown and PR failure backoff ([#549](https://github.com/Jonah-Projects/jonah-fleet/issues/549)) ([9806a28](https://github.com/Jonah-Projects/jonah-fleet/commit/9806a283900c81769a2d565b88dd9e6486eee9e5))
|
|
28
|
+
|
|
8
29
|
## [1.31.0](https://github.com/Jonah-Projects/jonah-fleet/compare/v1.30.5...v1.31.0) (2026-10-01)
|
|
9
30
|
|
|
10
31
|
|
|
@@ -45,6 +66,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
45
66
|
|
|
46
67
|
### Bug Fixes
|
|
47
68
|
|
|
69
|
+
* **daemon:** add LLM quota exhaustion backoff (15m cooldown) and PR failure tracking to prevent infinite retry loops on exhausted or failing PRs
|
|
70
|
+
* **runner:** expand detectQuotaExceeded to match RESOURCE_EXHAUSTED, code 429, and rate_limit_exceeded CLI errors
|
|
71
|
+
* **workflows:** expand quota-pause regex to detect RESOURCE_EXHAUSTED and code 429 across all routine workflows
|
|
48
72
|
* **workflows:** mark quota-paused workflow runs as failed (`exit 1`) with an error annotation and keep routine issues open with `status:quota-paused` instead of falsely reporting success
|
|
49
73
|
|
|
50
74
|
## [1.30.2](https://github.com/Jonah-Projects/jonah-fleet/compare/v1.30.1...v1.30.2) (2026-09-30)
|
package/dist/index.js
CHANGED
|
@@ -4435,8 +4435,10 @@ async function tryPostLocalRunMilestoneAsync(cwd, issueNumber, cardContent) {
|
|
|
4435
4435
|
function detectQuotaExceeded(output, stderr) {
|
|
4436
4436
|
const combined = `${output}
|
|
4437
4437
|
${stderr}`;
|
|
4438
|
-
if (/individual quota reached|quota reached/i.test(
|
|
4439
|
-
|
|
4438
|
+
if (/individual quota reached|quota reached|RESOURCE_EXHAUSTED|resource has been exhausted|rate_limit_exceeded|rate limit exceeded|code 429|check quota/i.test(
|
|
4439
|
+
combined
|
|
4440
|
+
)) {
|
|
4441
|
+
const match = combined.match(/(?:Resets in|resets in|retry after)\s+([^.\n]+)/i);
|
|
4440
4442
|
return {
|
|
4441
4443
|
isQuota: true,
|
|
4442
4444
|
resetInfo: match ? `Resets in ${match[1].trim()}` : void 0
|
|
@@ -4444,6 +4446,11 @@ ${stderr}`;
|
|
|
4444
4446
|
}
|
|
4445
4447
|
return { isQuota: false };
|
|
4446
4448
|
}
|
|
4449
|
+
function detectTransientServiceError(output, stderr) {
|
|
4450
|
+
const combined = `${output}
|
|
4451
|
+
${stderr}`;
|
|
4452
|
+
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);
|
|
4453
|
+
}
|
|
4447
4454
|
function tryReconcileLocalRunIssue(cwd, issueNumber, reportContent, exitCode, hostname, routine, quotaInfo) {
|
|
4448
4455
|
try {
|
|
4449
4456
|
if (quotaInfo?.isQuota) {
|
|
@@ -4916,6 +4923,7 @@ Timeout: ${printTimeout}`,
|
|
|
4916
4923
|
}
|
|
4917
4924
|
}
|
|
4918
4925
|
});
|
|
4926
|
+
let executedAnyTool = false;
|
|
4919
4927
|
const stdoutParser = new LineBufferedStreamParser((line) => {
|
|
4920
4928
|
const event = parseStreamJsonEvent(line);
|
|
4921
4929
|
if (event) {
|
|
@@ -4946,6 +4954,7 @@ Timeout: ${printTimeout}`,
|
|
|
4946
4954
|
spinner.update(`${targetLabel}: ${activePhase}`);
|
|
4947
4955
|
}
|
|
4948
4956
|
} else if (su.state === "DONE") {
|
|
4957
|
+
executedAnyTool = true;
|
|
4949
4958
|
lastActionDesc = null;
|
|
4950
4959
|
if (su.tool_info?.output) {
|
|
4951
4960
|
checkTargetDetection(su.tool_info.output);
|
|
@@ -5043,29 +5052,61 @@ Timeout: ${printTimeout}`,
|
|
|
5043
5052
|
stdoutParser.feed(chunk);
|
|
5044
5053
|
}
|
|
5045
5054
|
};
|
|
5055
|
+
const maxStartupAttempts = 3;
|
|
5056
|
+
let attempt = 0;
|
|
5046
5057
|
try {
|
|
5047
|
-
|
|
5048
|
-
|
|
5049
|
-
|
|
5050
|
-
|
|
5051
|
-
|
|
5052
|
-
|
|
5053
|
-
|
|
5054
|
-
|
|
5055
|
-
|
|
5056
|
-
}
|
|
5057
|
-
|
|
5058
|
-
|
|
5059
|
-
|
|
5060
|
-
|
|
5061
|
-
|
|
5062
|
-
|
|
5063
|
-
|
|
5064
|
-
|
|
5065
|
-
|
|
5066
|
-
|
|
5058
|
+
while (attempt < maxStartupAttempts) {
|
|
5059
|
+
attempt++;
|
|
5060
|
+
if (attempt > 1) {
|
|
5061
|
+
accumulatedOutput = "";
|
|
5062
|
+
accumulatedStderr = "";
|
|
5063
|
+
finalResponseText = "";
|
|
5064
|
+
lastActionDesc = null;
|
|
5065
|
+
executedAnyTool = false;
|
|
5066
|
+
loopGuardTrip = null;
|
|
5067
|
+
}
|
|
5068
|
+
exitCode = await new Promise((resolve, reject) => {
|
|
5069
|
+
const child = spawn("agy", args, {
|
|
5070
|
+
cwd: executionDir,
|
|
5071
|
+
env: childEnv,
|
|
5072
|
+
stdio: ["inherit", "pipe", "pipe"]
|
|
5073
|
+
});
|
|
5074
|
+
activeChild = child;
|
|
5075
|
+
child.stdout?.on("data", (data) => {
|
|
5076
|
+
processChunk(data.toString(), false);
|
|
5077
|
+
});
|
|
5078
|
+
child.stderr?.on("data", (data) => {
|
|
5079
|
+
processChunk(data.toString(), true);
|
|
5080
|
+
});
|
|
5081
|
+
child.on("error", (err) => {
|
|
5082
|
+
spinner?.stop();
|
|
5083
|
+
reject(err);
|
|
5084
|
+
});
|
|
5085
|
+
child.on("close", (code, signal) => {
|
|
5086
|
+
spinner?.stop();
|
|
5087
|
+
resolve(resolveExitCode(code, signal));
|
|
5088
|
+
});
|
|
5067
5089
|
});
|
|
5068
|
-
|
|
5090
|
+
stdoutParser.flush();
|
|
5091
|
+
stderrParser.flush();
|
|
5092
|
+
const isTransient = detectTransientServiceError(
|
|
5093
|
+
finalResponseText || accumulatedOutput,
|
|
5094
|
+
accumulatedStderr
|
|
5095
|
+
);
|
|
5096
|
+
if (exitCode !== 0 && isTransient && !executedAnyTool && attempt < maxStartupAttempts) {
|
|
5097
|
+
const delaySec = attempt * 2;
|
|
5098
|
+
const retryMsg = `Transient service error (503 UNAVAILABLE). Retrying startup in ${delaySec}s (attempt ${attempt + 1}/${maxStartupAttempts})...`;
|
|
5099
|
+
if (spinner) {
|
|
5100
|
+
spinner.update(`${targetLabel}: ${retryMsg}`);
|
|
5101
|
+
} else {
|
|
5102
|
+
console.warn(pc11.yellow(`
|
|
5103
|
+
[runner] ${retryMsg}`));
|
|
5104
|
+
}
|
|
5105
|
+
await new Promise((r) => setTimeout(r, delaySec * 1e3));
|
|
5106
|
+
continue;
|
|
5107
|
+
}
|
|
5108
|
+
break;
|
|
5109
|
+
}
|
|
5069
5110
|
} finally {
|
|
5070
5111
|
spinner?.stop();
|
|
5071
5112
|
process.removeListener("SIGINT", sigintHandler);
|
|
@@ -5074,8 +5115,6 @@ Timeout: ${printTimeout}`,
|
|
|
5074
5115
|
await cleanup();
|
|
5075
5116
|
}
|
|
5076
5117
|
}
|
|
5077
|
-
stdoutParser.flush();
|
|
5078
|
-
stderrParser.flush();
|
|
5079
5118
|
output = finalResponseText || accumulatedOutput;
|
|
5080
5119
|
const durationMs = Date.now() - startTime;
|
|
5081
5120
|
const durationSec = Math.round(durationMs / 1e3);
|
|
@@ -5179,6 +5218,7 @@ Timeout: ${printTimeout}`,
|
|
|
5179
5218
|
);
|
|
5180
5219
|
}
|
|
5181
5220
|
}
|
|
5221
|
+
const transientServiceError = exitCode !== 0 && detectTransientServiceError(output, accumulatedStderr);
|
|
5182
5222
|
return {
|
|
5183
5223
|
success: exitCode === 0,
|
|
5184
5224
|
exitCode,
|
|
@@ -5186,7 +5226,10 @@ Timeout: ${printTimeout}`,
|
|
|
5186
5226
|
stderr: accumulatedStderr,
|
|
5187
5227
|
worktreePath,
|
|
5188
5228
|
branchName,
|
|
5189
|
-
issueNumber: routineIssueNumber
|
|
5229
|
+
issueNumber: routineIssueNumber,
|
|
5230
|
+
quotaPaused: quotaInfo.isQuota,
|
|
5231
|
+
quotaResetInfo: quotaInfo.resetInfo,
|
|
5232
|
+
transientServiceError
|
|
5190
5233
|
};
|
|
5191
5234
|
}
|
|
5192
5235
|
|
|
@@ -6049,7 +6092,9 @@ async function drainReviewQueue(drainOptions) {
|
|
|
6049
6092
|
clearTicker,
|
|
6050
6093
|
getPRs = getOpenReviewablePRs,
|
|
6051
6094
|
runRoutine = runLocalRoutine,
|
|
6052
|
-
onAttempted
|
|
6095
|
+
onAttempted,
|
|
6096
|
+
failureCooldowns,
|
|
6097
|
+
onQuotaExhausted
|
|
6053
6098
|
} = drainOptions;
|
|
6054
6099
|
if (isStopping()) return;
|
|
6055
6100
|
if (state) {
|
|
@@ -6070,13 +6115,22 @@ async function drainReviewQueue(drainOptions) {
|
|
|
6070
6115
|
return;
|
|
6071
6116
|
}
|
|
6072
6117
|
const attemptedPRNumbers = /* @__PURE__ */ new Set();
|
|
6118
|
+
const cooldownDurationMs = (options.prFailureCooldownMinutes ?? 15) * 60 * 1e3;
|
|
6073
6119
|
while (!isStopping() && reviewablePRs.length > 0) {
|
|
6074
|
-
const
|
|
6120
|
+
const now = Date.now();
|
|
6121
|
+
const candidatePRs = reviewablePRs.filter((pr) => {
|
|
6122
|
+
if (attemptedPRNumbers.has(pr.number)) return false;
|
|
6123
|
+
const cooldown = failureCooldowns?.get(pr.number);
|
|
6124
|
+
if (cooldown && now - cooldown.failedAt < cooldownDurationMs) {
|
|
6125
|
+
return false;
|
|
6126
|
+
}
|
|
6127
|
+
return true;
|
|
6128
|
+
});
|
|
6075
6129
|
if (candidatePRs.length === 0) {
|
|
6076
6130
|
if (options.verbose) {
|
|
6077
6131
|
console.log(
|
|
6078
6132
|
pc14.dim(
|
|
6079
|
-
`[${(/* @__PURE__ */ new Date()).toLocaleTimeString()}] All ${reviewablePRs.length} remaining ready PR(s) were already evaluated in this drain pass.`
|
|
6133
|
+
`[${(/* @__PURE__ */ new Date()).toLocaleTimeString()}] All ${reviewablePRs.length} remaining ready PR(s) were already evaluated or in failure cooldown in this drain pass.`
|
|
6080
6134
|
)
|
|
6081
6135
|
);
|
|
6082
6136
|
}
|
|
@@ -6124,18 +6178,65 @@ async function drainReviewQueue(drainOptions) {
|
|
|
6124
6178
|
attemptedPRNumbers.add(prNum);
|
|
6125
6179
|
onAttempted?.(prNum);
|
|
6126
6180
|
}
|
|
6181
|
+
const isQuota = result.quotaPaused || !result.success && detectQuotaExceeded(result.output || "", result.stderr || "").isQuota;
|
|
6182
|
+
if (isQuota) {
|
|
6183
|
+
const resetInfo = result.quotaResetInfo || detectQuotaExceeded(result.output || "", result.stderr || "").resetInfo;
|
|
6184
|
+
console.warn(
|
|
6185
|
+
pc14.yellow(
|
|
6186
|
+
`
|
|
6187
|
+
\u26A0\uFE0F Peer Review on ${targetLabel} paused due to LLM quota exhaustion (${resetInfo || "RESOURCE_EXHAUSTED / 429"}).`
|
|
6188
|
+
)
|
|
6189
|
+
);
|
|
6190
|
+
if (typeof prNum === "number") {
|
|
6191
|
+
const prev = failureCooldowns?.get(prNum);
|
|
6192
|
+
failureCooldowns?.set(prNum, { failedAt: Date.now(), count: (prev?.count || 0) + 1 });
|
|
6193
|
+
}
|
|
6194
|
+
onQuotaExhausted?.(resetInfo);
|
|
6195
|
+
break;
|
|
6196
|
+
}
|
|
6197
|
+
const isTransient = result.transientServiceError || !result.success && detectTransientServiceError(result.output || "", result.stderr || "");
|
|
6198
|
+
if (isTransient) {
|
|
6199
|
+
console.warn(
|
|
6200
|
+
pc14.yellow(
|
|
6201
|
+
`
|
|
6202
|
+
\u26A0\uFE0F Peer Review on ${targetLabel} encountered transient service error (503 UNAVAILABLE). PR will remain eligible for next sweep without failure cooldown.
|
|
6203
|
+
`
|
|
6204
|
+
)
|
|
6205
|
+
);
|
|
6206
|
+
break;
|
|
6207
|
+
}
|
|
6127
6208
|
if (result.success) {
|
|
6128
6209
|
console.log(pc14.green(`\u2713 Local peer-review on ${targetLabel} completed successfully.
|
|
6129
6210
|
`));
|
|
6211
|
+
if (typeof prNum === "number") {
|
|
6212
|
+
failureCooldowns?.delete(prNum);
|
|
6213
|
+
}
|
|
6130
6214
|
} else {
|
|
6131
6215
|
console.warn(pc14.yellow(`\u26A0\uFE0F Local peer-review on ${targetLabel} completed with code ${result.exitCode}.
|
|
6132
6216
|
`));
|
|
6217
|
+
if (typeof prNum === "number") {
|
|
6218
|
+
const prev = failureCooldowns?.get(prNum);
|
|
6219
|
+
failureCooldowns?.set(prNum, { failedAt: Date.now(), count: (prev?.count || 0) + 1 });
|
|
6220
|
+
}
|
|
6133
6221
|
}
|
|
6134
6222
|
} catch (err) {
|
|
6223
|
+
const isTransientErr = detectTransientServiceError(err.message || "", "");
|
|
6224
|
+
if (isTransientErr) {
|
|
6225
|
+
console.warn(
|
|
6226
|
+
pc14.yellow(
|
|
6227
|
+
`
|
|
6228
|
+
\u26A0\uFE0F Peer Review on ${targetLabel} encountered transient service error (${err.message}). PR will remain eligible for next sweep without failure cooldown.
|
|
6229
|
+
`
|
|
6230
|
+
)
|
|
6231
|
+
);
|
|
6232
|
+
break;
|
|
6233
|
+
}
|
|
6135
6234
|
console.error(pc14.red(`\u2717 Error in peer-review on ${targetLabel}: ${err.message}`));
|
|
6136
6235
|
if (currentPR) {
|
|
6137
6236
|
attemptedPRNumbers.add(currentPR.number);
|
|
6138
6237
|
onAttempted?.(currentPR.number);
|
|
6238
|
+
const prev = failureCooldowns?.get(currentPR.number);
|
|
6239
|
+
failureCooldowns?.set(currentPR.number, { failedAt: Date.now(), count: (prev?.count || 0) + 1 });
|
|
6139
6240
|
}
|
|
6140
6241
|
} finally {
|
|
6141
6242
|
if (state) {
|
|
@@ -6183,7 +6284,10 @@ async function performAutoworkScan(scanOptions) {
|
|
|
6183
6284
|
isStopping,
|
|
6184
6285
|
clearTicker,
|
|
6185
6286
|
getPRs,
|
|
6186
|
-
runRoutine
|
|
6287
|
+
runRoutine,
|
|
6288
|
+
onAttempted: scanOptions.onAttempted,
|
|
6289
|
+
failureCooldowns: scanOptions.failureCooldowns,
|
|
6290
|
+
onQuotaExhausted: scanOptions.onQuotaExhausted
|
|
6187
6291
|
});
|
|
6188
6292
|
const remainingPRs = (await getPRs(repoRoot)).length;
|
|
6189
6293
|
if (remainingPRs > 0) {
|
|
@@ -6232,6 +6336,29 @@ async function performAutoworkScan(scanOptions) {
|
|
|
6232
6336
|
}
|
|
6233
6337
|
}
|
|
6234
6338
|
});
|
|
6339
|
+
const isQuota = result.quotaPaused || !result.success && detectQuotaExceeded(result.output || "", result.stderr || "").isQuota;
|
|
6340
|
+
if (isQuota) {
|
|
6341
|
+
const resetInfo = result.quotaResetInfo || detectQuotaExceeded(result.output || "", result.stderr || "").resetInfo;
|
|
6342
|
+
console.warn(
|
|
6343
|
+
pc14.yellow(
|
|
6344
|
+
`
|
|
6345
|
+
\u26A0\uFE0F Autowork paused due to LLM quota exhaustion (${resetInfo || "RESOURCE_EXHAUSTED / 429"}).`
|
|
6346
|
+
)
|
|
6347
|
+
);
|
|
6348
|
+
scanOptions.onQuotaExhausted?.(resetInfo);
|
|
6349
|
+
return { executed: true, reason: "quota_exhausted" };
|
|
6350
|
+
}
|
|
6351
|
+
const isTransient = result.transientServiceError || !result.success && detectTransientServiceError(result.output || "", result.stderr || "");
|
|
6352
|
+
if (isTransient) {
|
|
6353
|
+
console.warn(
|
|
6354
|
+
pc14.yellow(
|
|
6355
|
+
`
|
|
6356
|
+
\u26A0\uFE0F Autowork encountered transient service error (503 UNAVAILABLE). Routine will retry on next cycle without failure penalty.
|
|
6357
|
+
`
|
|
6358
|
+
)
|
|
6359
|
+
);
|
|
6360
|
+
return { executed: true, reason: "transient_service_error" };
|
|
6361
|
+
}
|
|
6235
6362
|
if (result.success) {
|
|
6236
6363
|
console.log(pc14.green(`\u2713 Local autowork completed successfully.
|
|
6237
6364
|
`));
|
|
@@ -6282,6 +6409,22 @@ async function runDaemonLoop(repoRoot, options = {}) {
|
|
|
6282
6409
|
let stopResolve;
|
|
6283
6410
|
const reviewIntervalMs = reviewInterval * 60 * 1e3;
|
|
6284
6411
|
const autoworkIntervalMs = autoworkInterval * 60 * 1e3;
|
|
6412
|
+
const failureCooldowns = /* @__PURE__ */ new Map();
|
|
6413
|
+
const quotaCooldownMs = (options.quotaCooldownMinutes ?? 15) * 60 * 1e3;
|
|
6414
|
+
let quotaCooldownUntil;
|
|
6415
|
+
const handleQuotaPause = (resetInfo) => {
|
|
6416
|
+
const until = Date.now() + quotaCooldownMs;
|
|
6417
|
+
quotaCooldownUntil = until;
|
|
6418
|
+
nextReviewCheckTime = until;
|
|
6419
|
+
nextAutoworkCheckTime = Math.max(nextAutoworkCheckTime, until);
|
|
6420
|
+
const resetMsg = resetInfo || "RESOURCE_EXHAUSTED / 429";
|
|
6421
|
+
console.warn(
|
|
6422
|
+
pc14.yellow(
|
|
6423
|
+
`
|
|
6424
|
+
[${(/* @__PURE__ */ new Date()).toLocaleTimeString()}] \u23F8\uFE0F LLM quota exhausted (${resetMsg}). Deferring checks for ${Math.round(quotaCooldownMs / 6e4)}m...`
|
|
6425
|
+
)
|
|
6426
|
+
);
|
|
6427
|
+
};
|
|
6285
6428
|
let nextReviewCheckTime = Date.now() + (routines.includes("peer-review") ? reviewIntervalMs : Infinity);
|
|
6286
6429
|
let nextAutoworkCheckTime = Date.now() + (routines.includes("autowork") ? autoworkIntervalMs : Infinity);
|
|
6287
6430
|
let lastOpenPRCount = void 0;
|
|
@@ -6336,7 +6479,9 @@ Stopping local agent daemon...`));
|
|
|
6336
6479
|
isStopping: () => isStopping,
|
|
6337
6480
|
clearTicker,
|
|
6338
6481
|
getPRs: getPRsFn,
|
|
6339
|
-
runRoutine: runRoutineFn
|
|
6482
|
+
runRoutine: runRoutineFn,
|
|
6483
|
+
failureCooldowns,
|
|
6484
|
+
onQuotaExhausted: handleQuotaPause
|
|
6340
6485
|
});
|
|
6341
6486
|
try {
|
|
6342
6487
|
const prs = await getPRsFn(repoRoot);
|
|
@@ -6352,7 +6497,11 @@ Stopping local agent daemon...`));
|
|
|
6352
6497
|
state.activeRoutine = void 0;
|
|
6353
6498
|
state.activeTarget = void 0;
|
|
6354
6499
|
writeDaemonState(repoRoot, state);
|
|
6355
|
-
|
|
6500
|
+
if (quotaCooldownUntil && Date.now() < quotaCooldownUntil) {
|
|
6501
|
+
nextReviewCheckTime = quotaCooldownUntil;
|
|
6502
|
+
} else {
|
|
6503
|
+
nextReviewCheckTime = Date.now() + reviewIntervalMs;
|
|
6504
|
+
}
|
|
6356
6505
|
updateTicker();
|
|
6357
6506
|
if (isGracefulStopping) {
|
|
6358
6507
|
await handleStop();
|
|
@@ -6388,7 +6537,9 @@ Stopping local agent daemon...`));
|
|
|
6388
6537
|
clearTicker,
|
|
6389
6538
|
getPRs: getPRsFn,
|
|
6390
6539
|
getBacklog: options.getBacklog || getBacklogTriageReport,
|
|
6391
|
-
runRoutine: runRoutineFn
|
|
6540
|
+
runRoutine: runRoutineFn,
|
|
6541
|
+
failureCooldowns,
|
|
6542
|
+
onQuotaExhausted: handleQuotaPause
|
|
6392
6543
|
});
|
|
6393
6544
|
try {
|
|
6394
6545
|
const prs = await getPRsFn(repoRoot);
|
|
@@ -6404,7 +6555,11 @@ Stopping local agent daemon...`));
|
|
|
6404
6555
|
state.activeRoutine = void 0;
|
|
6405
6556
|
state.activeTarget = void 0;
|
|
6406
6557
|
writeDaemonState(repoRoot, state);
|
|
6407
|
-
|
|
6558
|
+
if (quotaCooldownUntil && Date.now() < quotaCooldownUntil) {
|
|
6559
|
+
nextAutoworkCheckTime = quotaCooldownUntil;
|
|
6560
|
+
} else {
|
|
6561
|
+
nextAutoworkCheckTime = Date.now() + autoworkIntervalMs;
|
|
6562
|
+
}
|
|
6408
6563
|
updateTicker();
|
|
6409
6564
|
if (!isStopping && routines.includes("peer-review")) {
|
|
6410
6565
|
try {
|
package/dist/lib/daemon.d.ts
CHANGED
|
@@ -18,6 +18,8 @@ export interface DaemonOptions {
|
|
|
18
18
|
interval?: number;
|
|
19
19
|
reviewInterval?: number;
|
|
20
20
|
autoworkInterval?: number;
|
|
21
|
+
quotaCooldownMinutes?: number;
|
|
22
|
+
prFailureCooldownMinutes?: number;
|
|
21
23
|
routines?: string[];
|
|
22
24
|
model?: string;
|
|
23
25
|
foreground?: boolean;
|
|
@@ -28,6 +30,11 @@ export interface DaemonOptions {
|
|
|
28
30
|
runRoutine?: (opts: any) => Promise<{
|
|
29
31
|
success: boolean;
|
|
30
32
|
exitCode?: number;
|
|
33
|
+
quotaPaused?: boolean;
|
|
34
|
+
quotaResetInfo?: string;
|
|
35
|
+
transientServiceError?: boolean;
|
|
36
|
+
output?: string;
|
|
37
|
+
stderr?: string;
|
|
31
38
|
}>;
|
|
32
39
|
}
|
|
33
40
|
export declare function getDaemonStatePath(repoRoot: string): string;
|
|
@@ -130,6 +137,10 @@ export declare function queryOrphanedLocalRunIssues(repoRoot: string): Promise<A
|
|
|
130
137
|
* Operates asynchronously and fails gracefully on network / CLI errors without preventing daemon startup.
|
|
131
138
|
*/
|
|
132
139
|
export declare function reconcileOrphanedLocalRuns(optionsOrRepoRoot: string | ReconcileOrphanedRunsOptions): Promise<number>;
|
|
140
|
+
export interface PRFailureRecord {
|
|
141
|
+
failedAt: number;
|
|
142
|
+
count: number;
|
|
143
|
+
}
|
|
133
144
|
export interface DrainReviewQueueOptions {
|
|
134
145
|
repoRoot: string;
|
|
135
146
|
state?: DaemonState;
|
|
@@ -140,8 +151,15 @@ export interface DrainReviewQueueOptions {
|
|
|
140
151
|
runRoutine?: (opts: any) => Promise<{
|
|
141
152
|
success: boolean;
|
|
142
153
|
exitCode?: number;
|
|
154
|
+
quotaPaused?: boolean;
|
|
155
|
+
quotaResetInfo?: string;
|
|
156
|
+
transientServiceError?: boolean;
|
|
157
|
+
output?: string;
|
|
158
|
+
stderr?: string;
|
|
143
159
|
}>;
|
|
144
160
|
onAttempted?: (prNumber: number) => void;
|
|
161
|
+
failureCooldowns?: Map<number, PRFailureRecord>;
|
|
162
|
+
onQuotaExhausted?: (resetInfo?: string) => void;
|
|
145
163
|
}
|
|
146
164
|
/**
|
|
147
165
|
* Sequentially drains all open reviewable PRs by executing peer-review in isolated worktrees.
|
|
@@ -159,8 +177,16 @@ export interface PerformAutoworkScanOptions {
|
|
|
159
177
|
runRoutine?: (opts: any) => Promise<{
|
|
160
178
|
success: boolean;
|
|
161
179
|
exitCode?: number;
|
|
180
|
+
quotaPaused?: boolean;
|
|
181
|
+
quotaResetInfo?: string;
|
|
182
|
+
transientServiceError?: boolean;
|
|
183
|
+
output?: string;
|
|
184
|
+
stderr?: string;
|
|
162
185
|
}>;
|
|
163
186
|
onDiagnosticCard?: (card: string) => void;
|
|
187
|
+
onAttempted?: (prNumber: number) => void;
|
|
188
|
+
failureCooldowns?: Map<number, PRFailureRecord>;
|
|
189
|
+
onQuotaExhausted?: (resetInfo?: string) => void;
|
|
164
190
|
}
|
|
165
191
|
/**
|
|
166
192
|
* Performs an autowork backlog scan with zero-token preflight check.
|
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/runner.d.ts
CHANGED
|
@@ -23,6 +23,9 @@ export interface RunLocalRoutineResult {
|
|
|
23
23
|
worktreePath?: string;
|
|
24
24
|
branchName?: string;
|
|
25
25
|
issueNumber?: number;
|
|
26
|
+
quotaPaused?: boolean;
|
|
27
|
+
quotaResetInfo?: string;
|
|
28
|
+
transientServiceError?: boolean;
|
|
26
29
|
}
|
|
27
30
|
export interface StreamJsonEvent {
|
|
28
31
|
event?: string;
|
|
@@ -165,6 +168,10 @@ export interface QuotaDetectionResult {
|
|
|
165
168
|
* Detects whether routine runner stdout/stderr failed due to LLM quota exhaustion.
|
|
166
169
|
*/
|
|
167
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;
|
|
168
175
|
/**
|
|
169
176
|
* Reconciles a GitHub issue for local routine execution.
|
|
170
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;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/lib/runner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -147,7 +147,7 @@ When conclusive measurement directives (`RECOMMENDATION: [PIVOT | DEPRECATE | IT
|
|
|
147
147
|
---
|
|
148
148
|
[](${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID})
|
|
149
149
|
|
|
150
|
-
|
|
150
|
+
_Generated by [Antigravity](${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID})_"
|
|
151
151
|
|
|
152
152
|
STAGING_URL=$(gh issue create --title "$STAGING_TITLE" --body "$STAGING_BODY" --label "routine:product-planning,status:staging")
|
|
153
153
|
STAGING_ISSUE_NUMBER=$(echo "$STAGING_URL" | grep -oE '[0-9]+$')
|
|
@@ -151,7 +151,7 @@ For the surfaces being audited:
|
|
|
151
151
|
---
|
|
152
152
|
[](${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID})
|
|
153
153
|
|
|
154
|
-
|
|
154
|
+
_Generated by [Antigravity](${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID})_"
|
|
155
155
|
|
|
156
156
|
STAGING_URL=$(gh issue create --title "$STAGING_TITLE" --body "$STAGING_BODY" --label "routine:product-planning,status:staging")
|
|
157
157
|
STAGING_ISSUE_NUMBER=$(echo "$STAGING_URL" | grep -oE '[0-9]+$')
|
|
@@ -20,7 +20,7 @@ This routine runs in two modes: **Propose** (scheduled cron sweep / unapproved f
|
|
|
20
20
|
|
|
21
21
|
In **Propose mode**, SUCCESS requires:
|
|
22
22
|
- [ ] Located or initialized the active open staging issue (`routine:product-planning`, `status:staging`) and ingested all accumulated comment directives streamed by `analytics-review` and `design-review`
|
|
23
|
-
- [ ] Read current roadmap, domain documentation, closed measurement trackers across the trailing cycle lookback window (`closed:>=$(date -u -d '16 days ago' +%Y-%m-%d)`), recent analytics reviews (`routine:analytics-review`), and
|
|
23
|
+
- [ ] Read current roadmap, domain documentation, closed measurement trackers across the trailing cycle lookback window (`closed:>=$(date -u -d '16 days ago' +%Y-%m-%d)`), recent analytics reviews (`routine:analytics-review`), and recent design-review routine run issues (`routine:design-review`)
|
|
24
24
|
- [ ] Performed Feature Pruning & Deprecation Audit: evaluated shipped features, measurement outcomes (<2% user adoption or >50% failure rate), and Design Review pruning/clutter directives, drafting deprecation, removal, or simplification proposals
|
|
25
25
|
- [ ] Synthesized all accumulated directives into exactly one dated staging issue (`πΊοΈ Product Plan β {date}`) containing:
|
|
26
26
|
- All relevant well-scoped proposals (Summary/Tasks/Why/Complexity) warranted by evidence, covering additions, pivots, or deprecations (the operator owns deciding which proposals get promoted)
|
|
@@ -226,7 +226,7 @@ jobs:
|
|
|
226
226
|
set -e
|
|
227
227
|
|
|
228
228
|
if [ "$AGY_EXIT_CODE" -ne 0 ]; then
|
|
229
|
-
if grep -qiE "Individual quota reached|quota reached" /tmp/agy.log; then
|
|
229
|
+
if grep -qiE "Individual quota reached|quota reached|RESOURCE_EXHAUSTED|code 429|Resource has been exhausted|rate_limit_exceeded" /tmp/agy.log; then
|
|
230
230
|
RESET_INFO=$(grep -oE "Resets in [^.]+" /tmp/agy.log | head -n 1 || echo "Resets in future window")
|
|
231
231
|
echo "QUOTA_PAUSED=true" >> "$GITHUB_ENV"
|
|
232
232
|
echo "QUOTA_RESET_INFO=$RESET_INFO" >> "$GITHUB_ENV"
|
|
@@ -236,7 +236,7 @@ jobs:
|
|
|
236
236
|
set -e
|
|
237
237
|
|
|
238
238
|
if [ "$AGY_EXIT_CODE" -ne 0 ]; then
|
|
239
|
-
if grep -qiE "Individual quota reached|quota reached" /tmp/agy.log; then
|
|
239
|
+
if grep -qiE "Individual quota reached|quota reached|RESOURCE_EXHAUSTED|code 429|Resource has been exhausted|rate_limit_exceeded" /tmp/agy.log; then
|
|
240
240
|
RESET_INFO=$(grep -oE "Resets in [^.]+" /tmp/agy.log | head -n 1 || echo "Resets in future window")
|
|
241
241
|
echo "QUOTA_PAUSED=true" >> "$GITHUB_ENV"
|
|
242
242
|
echo "QUOTA_RESET_INFO=$RESET_INFO" >> "$GITHUB_ENV"
|
|
@@ -186,7 +186,7 @@ jobs:
|
|
|
186
186
|
set -e
|
|
187
187
|
|
|
188
188
|
if [ "$AGY_EXIT_CODE" -ne 0 ]; then
|
|
189
|
-
if grep -qiE "Individual quota reached|quota reached" /tmp/agy.log; then
|
|
189
|
+
if grep -qiE "Individual quota reached|quota reached|RESOURCE_EXHAUSTED|code 429|Resource has been exhausted|rate_limit_exceeded" /tmp/agy.log; then
|
|
190
190
|
RESET_INFO=$(grep -oE "Resets in [^.]+" /tmp/agy.log | head -n 1 || echo "Resets in future window")
|
|
191
191
|
echo "QUOTA_PAUSED=true" >> "$GITHUB_ENV"
|
|
192
192
|
echo "QUOTA_RESET_INFO=$RESET_INFO" >> "$GITHUB_ENV"
|
|
@@ -171,7 +171,7 @@ jobs:
|
|
|
171
171
|
set -e
|
|
172
172
|
|
|
173
173
|
if [ "$AGY_EXIT_CODE" -ne 0 ]; then
|
|
174
|
-
if grep -qiE "Individual quota reached|quota reached" /tmp/agy.log; then
|
|
174
|
+
if grep -qiE "Individual quota reached|quota reached|RESOURCE_EXHAUSTED|code 429|Resource has been exhausted|rate_limit_exceeded" /tmp/agy.log; then
|
|
175
175
|
RESET_INFO=$(grep -oE "Resets in [^.]+" /tmp/agy.log | head -n 1 || echo "Resets in future window")
|
|
176
176
|
echo "QUOTA_PAUSED=true" >> "$GITHUB_ENV"
|
|
177
177
|
echo "QUOTA_RESET_INFO=$RESET_INFO" >> "$GITHUB_ENV"
|
|
@@ -186,7 +186,7 @@ jobs:
|
|
|
186
186
|
set -e
|
|
187
187
|
|
|
188
188
|
if [ "$AGY_EXIT_CODE" -ne 0 ]; then
|
|
189
|
-
if grep -qiE "Individual quota reached|quota reached" /tmp/agy.log; then
|
|
189
|
+
if grep -qiE "Individual quota reached|quota reached|RESOURCE_EXHAUSTED|code 429|Resource has been exhausted|rate_limit_exceeded" /tmp/agy.log; then
|
|
190
190
|
RESET_INFO=$(grep -oE "Resets in [^.]+" /tmp/agy.log | head -n 1 || echo "Resets in future window")
|
|
191
191
|
echo "QUOTA_PAUSED=true" >> "$GITHUB_ENV"
|
|
192
192
|
echo "QUOTA_RESET_INFO=$RESET_INFO" >> "$GITHUB_ENV"
|
|
@@ -186,7 +186,7 @@ jobs:
|
|
|
186
186
|
set -e
|
|
187
187
|
|
|
188
188
|
if [ "$AGY_EXIT_CODE" -ne 0 ]; then
|
|
189
|
-
if grep -qiE "Individual quota reached|quota reached" /tmp/agy.log; then
|
|
189
|
+
if grep -qiE "Individual quota reached|quota reached|RESOURCE_EXHAUSTED|code 429|Resource has been exhausted|rate_limit_exceeded" /tmp/agy.log; then
|
|
190
190
|
RESET_INFO=$(grep -oE "Resets in [^.]+" /tmp/agy.log | head -n 1 || echo "Resets in future window")
|
|
191
191
|
echo "QUOTA_PAUSED=true" >> "$GITHUB_ENV"
|
|
192
192
|
echo "QUOTA_RESET_INFO=$RESET_INFO" >> "$GITHUB_ENV"
|
|
@@ -234,7 +234,7 @@ jobs:
|
|
|
234
234
|
set -e
|
|
235
235
|
|
|
236
236
|
if [ "$AGY_EXIT_CODE" -ne 0 ]; then
|
|
237
|
-
if grep -qiE "Individual quota reached|quota reached" /tmp/agy.log; then
|
|
237
|
+
if grep -qiE "Individual quota reached|quota reached|RESOURCE_EXHAUSTED|code 429|Resource has been exhausted|rate_limit_exceeded" /tmp/agy.log; then
|
|
238
238
|
RESET_INFO=$(grep -oE "Resets in [^.]+" /tmp/agy.log | head -n 1 || echo "Resets in future window")
|
|
239
239
|
echo "QUOTA_PAUSED=true" >> "$GITHUB_ENV"
|
|
240
240
|
echo "QUOTA_RESET_INFO=$RESET_INFO" >> "$GITHUB_ENV"
|
|
@@ -195,7 +195,7 @@ jobs:
|
|
|
195
195
|
set -e
|
|
196
196
|
|
|
197
197
|
if [ "$AGY_EXIT_CODE" -ne 0 ]; then
|
|
198
|
-
if grep -qiE "Individual quota reached|quota reached" /tmp/agy.log; then
|
|
198
|
+
if grep -qiE "Individual quota reached|quota reached|RESOURCE_EXHAUSTED|code 429|Resource has been exhausted|rate_limit_exceeded" /tmp/agy.log; then
|
|
199
199
|
RESET_INFO=$(grep -oE "Resets in [^.]+" /tmp/agy.log | head -n 1 || echo "Resets in future window")
|
|
200
200
|
echo "QUOTA_PAUSED=true" >> "$GITHUB_ENV"
|
|
201
201
|
echo "QUOTA_RESET_INFO=$RESET_INFO" >> "$GITHUB_ENV"
|
|
@@ -191,7 +191,7 @@ jobs:
|
|
|
191
191
|
set -e
|
|
192
192
|
|
|
193
193
|
if [ "$AGY_EXIT_CODE" -ne 0 ]; then
|
|
194
|
-
if grep -qiE "Individual quota reached|quota reached" /tmp/agy.log; then
|
|
194
|
+
if grep -qiE "Individual quota reached|quota reached|RESOURCE_EXHAUSTED|code 429|Resource has been exhausted|rate_limit_exceeded" /tmp/agy.log; then
|
|
195
195
|
RESET_INFO=$(grep -oE "Resets in [^.]+" /tmp/agy.log | head -n 1 || echo "Resets in future window")
|
|
196
196
|
echo "QUOTA_PAUSED=true" >> "$GITHUB_ENV"
|
|
197
197
|
echo "QUOTA_RESET_INFO=$RESET_INFO" >> "$GITHUB_ENV"
|
|
@@ -221,7 +221,7 @@ jobs:
|
|
|
221
221
|
set -e
|
|
222
222
|
|
|
223
223
|
if [ "$AGY_EXIT_CODE" -ne 0 ]; then
|
|
224
|
-
if grep -qiE "Individual quota reached|quota reached" /tmp/agy.log; then
|
|
224
|
+
if grep -qiE "Individual quota reached|quota reached|RESOURCE_EXHAUSTED|code 429|Resource has been exhausted|rate_limit_exceeded" /tmp/agy.log; then
|
|
225
225
|
RESET_INFO=$(grep -oE "Resets in [^.]+" /tmp/agy.log | head -n 1 || echo "Resets in future window")
|
|
226
226
|
echo "QUOTA_PAUSED=true" >> "$GITHUB_ENV"
|
|
227
227
|
echo "QUOTA_RESET_INFO=$RESET_INFO" >> "$GITHUB_ENV"
|
|
@@ -299,7 +299,7 @@ jobs:
|
|
|
299
299
|
set -e
|
|
300
300
|
|
|
301
301
|
if [ "$AGY_EXIT_CODE" -ne 0 ]; then
|
|
302
|
-
if grep -qiE "Individual quota reached|quota reached" /tmp/agy.log; then
|
|
302
|
+
if grep -qiE "Individual quota reached|quota reached|RESOURCE_EXHAUSTED|code 429|Resource has been exhausted|rate_limit_exceeded" /tmp/agy.log; then
|
|
303
303
|
RESET_INFO=$(grep -oE "Resets in [^.]+" /tmp/agy.log | head -n 1 || echo "Resets in future window")
|
|
304
304
|
echo "QUOTA_PAUSED=true" >> "$GITHUB_ENV"
|
|
305
305
|
echo "QUOTA_RESET_INFO=$RESET_INFO" >> "$GITHUB_ENV"
|