@on-par/factory-core 0.9.8-next.10 → 0.9.8-next.11
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/router/breaker.d.ts
CHANGED
|
@@ -13,14 +13,21 @@ export type BreakerStatus = {
|
|
|
13
13
|
open: false;
|
|
14
14
|
justClosed?: BreakerEntry;
|
|
15
15
|
};
|
|
16
|
-
/**
|
|
17
|
-
*
|
|
16
|
+
/** Longest cooldown the breaker accepts from a provider-reported reset hint (31 days),
|
|
17
|
+
* so a typo'd or hostile far-future date can't park a provider indefinitely. */
|
|
18
|
+
export declare const MAX_REPORTED_COOLDOWN_MS: number;
|
|
19
|
+
/** Extracts a provider-reported reset time so the breaker can cool down for as
|
|
18
20
|
* long as the provider actually says, instead of the flat default cooldown
|
|
19
|
-
* meant for transient rate limits.
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
|
|
21
|
+
* meant for transient rate limits. Understands the relative form ("Resets in
|
|
22
|
+
* 3hr 17min", opencode.ai's weekly-usage-cap error) and the absolute form
|
|
23
|
+
* ("resets at 2026-11-01T00:00:00Z", OpenCode Go's monthly cap), the latter
|
|
24
|
+
* measured against `now`. Returns null when the text has no parseable hint
|
|
25
|
+
* (relative hour and minute groups absent or zero; absolute instant
|
|
26
|
+
* unparseable, offset-less, or at or before `now`), so the caller falls back
|
|
27
|
+
* to its own default. `bufferMs` pads the parsed duration so the breaker
|
|
28
|
+
* doesn't reopen a few seconds before the real reset. Results are capped at
|
|
29
|
+
* MAX_REPORTED_COOLDOWN_MS. */
|
|
30
|
+
export declare function parseResetCooldownMs(text: string, bufferMs?: number, now?: number): number | null;
|
|
24
31
|
export declare class ProviderBreaker {
|
|
25
32
|
private file;
|
|
26
33
|
private now;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"breaker.d.ts","sourceRoot":"","sources":["../../src/router/breaker.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,aAAa,GACvB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,YAAY,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,UAAU,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"breaker.d.ts","sourceRoot":"","sources":["../../src/router/breaker.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,aAAa,GACvB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,YAAY,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,UAAU,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC;AAYxG;iFACiF;AACjF,eAAO,MAAM,wBAAwB,QAAwB,CAAC;AAE9D;;;;;;;;;;gCAUgC;AAChC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAa,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,GAAG,IAAI,CAcjH;AAED,qBAAa,eAAe;IAExB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,GAAG;IAFb,YACU,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAM,MAAyB,EAC1C;IAEJ,0GAA0G;IACpG,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAItF;IAED;;;8DAG0D;IACpD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAWrD;IAED;qEACiE;IAC3D,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAUhH;YAEa,IAAI;YAUJ,KAAK;CAQpB;AAED;;;yDAGyD;AACzD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,GAAG,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C,GAAG,OAAO,CAAC;IAAE,YAAY,EAAE,OAAO,CAAA;CAAE,CAAC,CAmBrC"}
|
package/dist/router/breaker.js
CHANGED
|
@@ -4,22 +4,37 @@
|
|
|
4
4
|
import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
5
5
|
import { dirname } from 'node:path';
|
|
6
6
|
const RESET_HINT_PATTERN = /resets?\s+in\s+(?:(\d+)\s*hr)?\s*(?:(\d+)\s*min)?/i;
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
const ABSOLUTE_RESET_PATTERN = /resets?\s+at\s+(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2}))/i;
|
|
8
|
+
/** Longest cooldown the breaker accepts from a provider-reported reset hint (31 days),
|
|
9
|
+
* so a typo'd or hostile far-future date can't park a provider indefinitely. */
|
|
10
|
+
export const MAX_REPORTED_COOLDOWN_MS = 31 * 24 * 60 * 60_000;
|
|
11
|
+
/** Extracts a provider-reported reset time so the breaker can cool down for as
|
|
9
12
|
* long as the provider actually says, instead of the flat default cooldown
|
|
10
|
-
* meant for transient rate limits.
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
|
|
13
|
+
* meant for transient rate limits. Understands the relative form ("Resets in
|
|
14
|
+
* 3hr 17min", opencode.ai's weekly-usage-cap error) and the absolute form
|
|
15
|
+
* ("resets at 2026-11-01T00:00:00Z", OpenCode Go's monthly cap), the latter
|
|
16
|
+
* measured against `now`. Returns null when the text has no parseable hint
|
|
17
|
+
* (relative hour and minute groups absent or zero; absolute instant
|
|
18
|
+
* unparseable, offset-less, or at or before `now`), so the caller falls back
|
|
19
|
+
* to its own default. `bufferMs` pads the parsed duration so the breaker
|
|
20
|
+
* doesn't reopen a few seconds before the real reset. Results are capped at
|
|
21
|
+
* MAX_REPORTED_COOLDOWN_MS. */
|
|
22
|
+
export function parseResetCooldownMs(text, bufferMs = 2 * 60_000, now = Date.now()) {
|
|
15
23
|
const match = RESET_HINT_PATTERN.exec(text);
|
|
16
|
-
if (
|
|
24
|
+
if (match) {
|
|
25
|
+
const hours = match[1] ? Number(match[1]) : 0;
|
|
26
|
+
const minutes = match[2] ? Number(match[2]) : 0;
|
|
27
|
+
if (hours !== 0 || minutes !== 0) {
|
|
28
|
+
return Math.min((hours * 60 + minutes) * 60_000 + bufferMs, MAX_REPORTED_COOLDOWN_MS);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const absolute = ABSOLUTE_RESET_PATTERN.exec(text);
|
|
32
|
+
if (!absolute)
|
|
17
33
|
return null;
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
if (hours === 0 && minutes === 0)
|
|
34
|
+
const resetAt = Date.parse(absolute[1]);
|
|
35
|
+
if (Number.isNaN(resetAt) || resetAt <= now)
|
|
21
36
|
return null;
|
|
22
|
-
return (
|
|
37
|
+
return Math.min(resetAt - now + bufferMs, MAX_REPORTED_COOLDOWN_MS);
|
|
23
38
|
}
|
|
24
39
|
export class ProviderBreaker {
|
|
25
40
|
file;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"breaker.js","sourceRoot":"","sources":["../../src/router/breaker.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,4EAA4E;AAC5E,qCAAqC;AAErC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC,MAAM,kBAAkB,GAAG,oDAAoD,CAAC;AAEhF
|
|
1
|
+
{"version":3,"file":"breaker.js","sourceRoot":"","sources":["../../src/router/breaker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@on-par/factory-core",
|
|
3
|
-
"version": "0.9.8-next.
|
|
3
|
+
"version": "0.9.8-next.11",
|
|
4
4
|
"description": "Core engine: model router, constitutions, checkers, and pipeline phases for the Software Factory.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -54,10 +54,10 @@
|
|
|
54
54
|
"prepack": "node ../../scripts/pack-hygiene-cli.ts prepack"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"@on-par/adr-kit": "0.9.8-next.
|
|
58
|
-
"@on-par/contracts": "0.9.8-next.
|
|
59
|
-
"@on-par/factory-config": "0.9.8-next.
|
|
60
|
-
"@on-par/repo-context": "0.9.8-next.
|
|
57
|
+
"@on-par/adr-kit": "0.9.8-next.11",
|
|
58
|
+
"@on-par/contracts": "0.9.8-next.11",
|
|
59
|
+
"@on-par/factory-config": "0.9.8-next.11",
|
|
60
|
+
"@on-par/repo-context": "0.9.8-next.11",
|
|
61
61
|
"@octokit/rest": "^22.0.0",
|
|
62
62
|
"execa": "^10.1.0",
|
|
63
63
|
"gray-matter": "^4.0.3",
|