@generacy-ai/cockpit 0.3.0 → 0.5.0
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/gh/cache.d.ts +15 -0
- package/dist/gh/cache.d.ts.map +1 -0
- package/dist/gh/cache.js +48 -0
- package/dist/gh/cache.js.map +1 -0
- package/dist/gh/command-runner.d.ts +7 -0
- package/dist/gh/command-runner.d.ts.map +1 -1
- package/dist/gh/command-runner.js +43 -1
- package/dist/gh/command-runner.js.map +1 -1
- package/dist/gh/rate-limit-scheduler.d.ts +31 -0
- package/dist/gh/rate-limit-scheduler.d.ts.map +1 -0
- package/dist/gh/rate-limit-scheduler.js +204 -0
- package/dist/gh/rate-limit-scheduler.js.map +1 -0
- package/dist/gh/wrapper.d.ts +16 -1
- package/dist/gh/wrapper.d.ts.map +1 -1
- package/dist/gh/wrapper.js +90 -40
- package/dist/gh/wrapper.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/resolver/parse-epic-body.d.ts.map +1 -1
- package/dist/resolver/parse-epic-body.js +25 -3
- package/dist/resolver/parse-epic-body.js.map +1 -1
- package/dist/resolver/resolve.js +3 -3
- package/dist/resolver/resolve.js.map +1 -1
- package/dist/resolver/types.d.ts +8 -1
- package/dist/resolver/types.d.ts.map +1 -1
- package/dist/state/label-map.d.ts.map +1 -1
- package/dist/state/label-map.js +9 -0
- package/dist/state/label-map.js.map +1 -1
- package/dist/state/precedence.d.ts +1 -0
- package/dist/state/precedence.d.ts.map +1 -1
- package/dist/state/precedence.js +20 -0
- package/dist/state/precedence.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface GhCacheOptions {
|
|
2
|
+
ttlMs?: number;
|
|
3
|
+
now?: () => number;
|
|
4
|
+
logger?: {
|
|
5
|
+
debug?: (msg: string) => void;
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export interface GhResponseCache {
|
|
9
|
+
getOrFetch<T>(key: string, fetcher: () => Promise<T>): Promise<T>;
|
|
10
|
+
invalidate(key: string): void;
|
|
11
|
+
invalidatePrefix(prefix: string): void;
|
|
12
|
+
size(): number;
|
|
13
|
+
}
|
|
14
|
+
export declare function createGhResponseCache(opts?: GhCacheOptions): GhResponseCache;
|
|
15
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/gh/cache.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;CAC5C;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAClE,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,IAAI,IAAI,MAAM,CAAC;CAChB;AASD,wBAAgB,qBAAqB,CAAC,IAAI,GAAE,cAAmB,GAAG,eAAe,CAkDhF"}
|
package/dist/gh/cache.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
const DEFAULT_TTL_MS = 20_000;
|
|
2
|
+
export function createGhResponseCache(opts = {}) {
|
|
3
|
+
const ttlMs = opts.ttlMs ?? DEFAULT_TTL_MS;
|
|
4
|
+
if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
|
|
5
|
+
throw new Error(`GhResponseCache: ttlMs must be positive, got ${ttlMs}`);
|
|
6
|
+
}
|
|
7
|
+
const now = opts.now ?? Date.now;
|
|
8
|
+
const entries = new Map();
|
|
9
|
+
const inflight = new Map();
|
|
10
|
+
function getOrFetch(key, fetcher) {
|
|
11
|
+
const existing = entries.get(key);
|
|
12
|
+
if (existing != null && existing.expiresAt > now()) {
|
|
13
|
+
return Promise.resolve(existing.value);
|
|
14
|
+
}
|
|
15
|
+
if (existing != null) {
|
|
16
|
+
entries.delete(key);
|
|
17
|
+
}
|
|
18
|
+
const pending = inflight.get(key);
|
|
19
|
+
if (pending != null) {
|
|
20
|
+
return pending;
|
|
21
|
+
}
|
|
22
|
+
const promise = fetcher()
|
|
23
|
+
.then((value) => {
|
|
24
|
+
entries.set(key, { value, expiresAt: now() + ttlMs });
|
|
25
|
+
return value;
|
|
26
|
+
})
|
|
27
|
+
.finally(() => {
|
|
28
|
+
inflight.delete(key);
|
|
29
|
+
});
|
|
30
|
+
inflight.set(key, promise);
|
|
31
|
+
return promise;
|
|
32
|
+
}
|
|
33
|
+
function invalidate(key) {
|
|
34
|
+
entries.delete(key);
|
|
35
|
+
}
|
|
36
|
+
function invalidatePrefix(prefix) {
|
|
37
|
+
for (const key of entries.keys()) {
|
|
38
|
+
if (key.startsWith(prefix)) {
|
|
39
|
+
entries.delete(key);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function size() {
|
|
44
|
+
return entries.size;
|
|
45
|
+
}
|
|
46
|
+
return { getOrFetch, invalidate, invalidatePrefix, size };
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/gh/cache.ts"],"names":[],"mappings":"AAkBA,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B,MAAM,UAAU,qBAAqB,CAAC,OAAuB,EAAE;IAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,cAAc,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,gDAAgD,KAAK,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IAErD,SAAS,UAAU,CAAI,GAAW,EAAE,OAAyB;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,CAAC,SAAS,GAAG,GAAG,EAAE,EAAE,CAAC;YACnD,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAU,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;QACD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,OAAO,OAAqB,CAAC;QAC/B,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,EAAE;aACtB,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;YACtD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QACL,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAA2B,CAAC,CAAC;QAC/C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,SAAS,UAAU,CAAC,GAAW;QAC7B,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,SAAS,gBAAgB,CAAC,MAAc;QACtC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACjC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,IAAI;QACX,OAAO,OAAO,CAAC,IAAI,CAAC;IACtB,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;AAC5D,CAAC"}
|
|
@@ -2,6 +2,12 @@ export interface CommandRunnerOptions {
|
|
|
2
2
|
env?: Record<string, string>;
|
|
3
3
|
cwd?: string;
|
|
4
4
|
timeoutMs?: number;
|
|
5
|
+
/**
|
|
6
|
+
* Optional UTF-8 payload piped to the child's stdin. When set the runner
|
|
7
|
+
* uses `spawn` (execFile's callback API does not expose stdin ergonomically);
|
|
8
|
+
* otherwise the child inherits/ignores stdin as before.
|
|
9
|
+
*/
|
|
10
|
+
stdin?: string;
|
|
5
11
|
}
|
|
6
12
|
export interface CommandResult {
|
|
7
13
|
stdout: string;
|
|
@@ -12,6 +18,7 @@ export type CommandRunner = (cmd: string, args: string[], opts?: CommandRunnerOp
|
|
|
12
18
|
/**
|
|
13
19
|
* Default runner using `node:child_process.execFile` with a 30s timeout.
|
|
14
20
|
* Does not throw on non-zero exit code — the wrapper inspects `exitCode`.
|
|
21
|
+
* Switches to `spawn` when the caller supplies `stdin`.
|
|
15
22
|
*/
|
|
16
23
|
export declare const nodeChildProcessRunner: CommandRunner;
|
|
17
24
|
//# sourceMappingURL=command-runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-runner.d.ts","sourceRoot":"","sources":["../../src/gh/command-runner.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"command-runner.d.ts","sourceRoot":"","sources":["../../src/gh/command-runner.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,aAAa,GAAG,CAC1B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,CAAC,EAAE,oBAAoB,KACxB,OAAO,CAAC,aAAa,CAAC,CAAC;AA8C5B;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAAE,aAiCpC,CAAC"}
|
|
@@ -1,9 +1,51 @@
|
|
|
1
|
-
import { execFile } from 'node:child_process';
|
|
1
|
+
import { execFile, spawn } from 'node:child_process';
|
|
2
|
+
function runWithStdin(cmd, args, stdin, opts) {
|
|
3
|
+
const timeoutMs = opts?.timeoutMs ?? 30_000;
|
|
4
|
+
return new Promise((resolve) => {
|
|
5
|
+
const child = spawn(cmd, args, {
|
|
6
|
+
env: opts?.env != null ? { ...process.env, ...opts.env } : process.env,
|
|
7
|
+
cwd: opts?.cwd,
|
|
8
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
9
|
+
});
|
|
10
|
+
let stdout = '';
|
|
11
|
+
let stderr = '';
|
|
12
|
+
let killed = false;
|
|
13
|
+
const timer = setTimeout(() => {
|
|
14
|
+
killed = true;
|
|
15
|
+
child.kill('SIGTERM');
|
|
16
|
+
}, timeoutMs);
|
|
17
|
+
child.stdout.setEncoding('utf-8');
|
|
18
|
+
child.stderr.setEncoding('utf-8');
|
|
19
|
+
child.stdout.on('data', (chunk) => {
|
|
20
|
+
stdout += chunk;
|
|
21
|
+
});
|
|
22
|
+
child.stderr.on('data', (chunk) => {
|
|
23
|
+
stderr += chunk;
|
|
24
|
+
});
|
|
25
|
+
child.on('error', () => {
|
|
26
|
+
clearTimeout(timer);
|
|
27
|
+
resolve({ stdout, stderr, exitCode: 1 });
|
|
28
|
+
});
|
|
29
|
+
child.on('close', (code) => {
|
|
30
|
+
clearTimeout(timer);
|
|
31
|
+
const exitCode = typeof code === 'number' ? code : killed ? 124 : 1;
|
|
32
|
+
resolve({ stdout, stderr, exitCode });
|
|
33
|
+
});
|
|
34
|
+
child.stdin.on('error', () => {
|
|
35
|
+
// Ignore EPIPE: child may exit before we finish writing.
|
|
36
|
+
});
|
|
37
|
+
child.stdin.end(stdin);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
2
40
|
/**
|
|
3
41
|
* Default runner using `node:child_process.execFile` with a 30s timeout.
|
|
4
42
|
* Does not throw on non-zero exit code — the wrapper inspects `exitCode`.
|
|
43
|
+
* Switches to `spawn` when the caller supplies `stdin`.
|
|
5
44
|
*/
|
|
6
45
|
export const nodeChildProcessRunner = (cmd, args, opts) => {
|
|
46
|
+
if (opts?.stdin != null) {
|
|
47
|
+
return runWithStdin(cmd, args, opts.stdin, opts);
|
|
48
|
+
}
|
|
7
49
|
const timeoutMs = opts?.timeoutMs ?? 30_000;
|
|
8
50
|
return new Promise((resolve) => {
|
|
9
51
|
execFile(cmd, args, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-runner.js","sourceRoot":"","sources":["../../src/gh/command-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"command-runner.js","sourceRoot":"","sources":["../../src/gh/command-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { CommandRunner } from './command-runner.js';
|
|
2
|
+
export interface RateLimitSchedulerOptions {
|
|
3
|
+
baseIntervalMs?: number;
|
|
4
|
+
ceilingMs?: number;
|
|
5
|
+
probeCadenceMs?: number;
|
|
6
|
+
fastProbeCadenceMs?: number;
|
|
7
|
+
lowWatermarkRatio?: number;
|
|
8
|
+
criticalWatermarkRatio?: number;
|
|
9
|
+
resetWatermarkRatio?: number;
|
|
10
|
+
runner?: CommandRunner;
|
|
11
|
+
now?: () => number;
|
|
12
|
+
logger?: {
|
|
13
|
+
warn?: (msg: string) => void;
|
|
14
|
+
info?: (msg: string) => void;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface RateLimitProbeResult {
|
|
18
|
+
remaining: number;
|
|
19
|
+
limit: number;
|
|
20
|
+
resetAt: number;
|
|
21
|
+
}
|
|
22
|
+
export interface RateLimitScheduler {
|
|
23
|
+
getCurrentIntervalMs(): number;
|
|
24
|
+
probeNow(): Promise<RateLimitProbeResult | null>;
|
|
25
|
+
noteRetryAfter(seconds: number): void;
|
|
26
|
+
noteResponseHeaders(headers: Record<string, string>): void;
|
|
27
|
+
start(): void;
|
|
28
|
+
stop(): void;
|
|
29
|
+
}
|
|
30
|
+
export declare function createRateLimitScheduler(opts?: RateLimitSchedulerOptions): RateLimitScheduler;
|
|
31
|
+
//# sourceMappingURL=rate-limit-scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit-scheduler.d.ts","sourceRoot":"","sources":["../../src/gh/rate-limit-scheduler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,yBAAyB;IACxC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;CACzE;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,oBAAoB,IAAI,MAAM,CAAC;IAC/B,QAAQ,IAAI,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IACjD,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC3D,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,IAAI,CAAC;CACd;AAsBD,wBAAgB,wBAAwB,CACtC,IAAI,GAAE,yBAA8B,GACnC,kBAAkB,CAkNpB"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const DEFAULTS = {
|
|
3
|
+
baseIntervalMs: 30_000,
|
|
4
|
+
ceilingMs: 300_000,
|
|
5
|
+
probeCadenceMs: 300_000,
|
|
6
|
+
fastProbeCadenceMs: 60_000,
|
|
7
|
+
lowWatermarkRatio: 0.20,
|
|
8
|
+
criticalWatermarkRatio: 0.05,
|
|
9
|
+
resetWatermarkRatio: 0.30,
|
|
10
|
+
};
|
|
11
|
+
const RateLimitApiSchema = z.object({
|
|
12
|
+
resources: z.object({
|
|
13
|
+
graphql: z.object({
|
|
14
|
+
remaining: z.number(),
|
|
15
|
+
limit: z.number(),
|
|
16
|
+
reset: z.number(),
|
|
17
|
+
}),
|
|
18
|
+
}),
|
|
19
|
+
});
|
|
20
|
+
export function createRateLimitScheduler(opts = {}) {
|
|
21
|
+
const baseIntervalMs = opts.baseIntervalMs ?? DEFAULTS.baseIntervalMs;
|
|
22
|
+
const ceilingMs = opts.ceilingMs ?? DEFAULTS.ceilingMs;
|
|
23
|
+
const probeCadenceMs = opts.probeCadenceMs ?? DEFAULTS.probeCadenceMs;
|
|
24
|
+
const fastProbeCadenceMs = opts.fastProbeCadenceMs ?? DEFAULTS.fastProbeCadenceMs;
|
|
25
|
+
const lowWatermarkRatio = opts.lowWatermarkRatio ?? DEFAULTS.lowWatermarkRatio;
|
|
26
|
+
const criticalWatermarkRatio = opts.criticalWatermarkRatio ?? DEFAULTS.criticalWatermarkRatio;
|
|
27
|
+
const resetWatermarkRatio = opts.resetWatermarkRatio ?? DEFAULTS.resetWatermarkRatio;
|
|
28
|
+
const runner = opts.runner;
|
|
29
|
+
const now = opts.now ?? Date.now;
|
|
30
|
+
const logger = opts.logger;
|
|
31
|
+
if (!(resetWatermarkRatio > lowWatermarkRatio)) {
|
|
32
|
+
throw new Error(`RateLimitScheduler: resetWatermarkRatio (${resetWatermarkRatio}) must be > lowWatermarkRatio (${lowWatermarkRatio})`);
|
|
33
|
+
}
|
|
34
|
+
if (!(lowWatermarkRatio > criticalWatermarkRatio)) {
|
|
35
|
+
throw new Error(`RateLimitScheduler: lowWatermarkRatio (${lowWatermarkRatio}) must be > criticalWatermarkRatio (${criticalWatermarkRatio})`);
|
|
36
|
+
}
|
|
37
|
+
if (!(criticalWatermarkRatio > 0)) {
|
|
38
|
+
throw new Error(`RateLimitScheduler: criticalWatermarkRatio (${criticalWatermarkRatio}) must be > 0`);
|
|
39
|
+
}
|
|
40
|
+
if (!(ceilingMs >= baseIntervalMs)) {
|
|
41
|
+
throw new Error(`RateLimitScheduler: ceilingMs (${ceilingMs}) must be >= baseIntervalMs (${baseIntervalMs})`);
|
|
42
|
+
}
|
|
43
|
+
if (!(probeCadenceMs > 0) || !(fastProbeCadenceMs > 0)) {
|
|
44
|
+
throw new Error(`RateLimitScheduler: probeCadenceMs and fastProbeCadenceMs must be > 0`);
|
|
45
|
+
}
|
|
46
|
+
let currentIntervalMs = baseIntervalMs;
|
|
47
|
+
let retryAfterUntilMs = 0;
|
|
48
|
+
let lastRatio = null;
|
|
49
|
+
let currentCadenceMs = probeCadenceMs;
|
|
50
|
+
let probeTimer = null;
|
|
51
|
+
function clamp(ms) {
|
|
52
|
+
return Math.min(Math.max(ms, baseIntervalMs), ceilingMs);
|
|
53
|
+
}
|
|
54
|
+
function recomputeInterval() {
|
|
55
|
+
const nowMs = now();
|
|
56
|
+
if (retryAfterUntilMs > nowMs) {
|
|
57
|
+
currentIntervalMs = clamp(retryAfterUntilMs - nowMs);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (lastRatio == null) {
|
|
61
|
+
currentIntervalMs = baseIntervalMs;
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (lastRatio >= resetWatermarkRatio) {
|
|
65
|
+
currentIntervalMs = baseIntervalMs;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (lastRatio < criticalWatermarkRatio) {
|
|
69
|
+
currentIntervalMs = clamp(4 * baseIntervalMs);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (lastRatio < lowWatermarkRatio) {
|
|
73
|
+
currentIntervalMs = clamp(2 * baseIntervalMs);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// Hysteresis band: lowWatermarkRatio <= r < resetWatermarkRatio; retain.
|
|
77
|
+
}
|
|
78
|
+
function selectCadenceMs() {
|
|
79
|
+
if (lastRatio != null && lastRatio < lowWatermarkRatio)
|
|
80
|
+
return fastProbeCadenceMs;
|
|
81
|
+
return probeCadenceMs;
|
|
82
|
+
}
|
|
83
|
+
function armTimer() {
|
|
84
|
+
if (probeTimer != null) {
|
|
85
|
+
clearInterval(probeTimer);
|
|
86
|
+
probeTimer = null;
|
|
87
|
+
}
|
|
88
|
+
const t = setInterval(() => {
|
|
89
|
+
void probeNow();
|
|
90
|
+
}, currentCadenceMs);
|
|
91
|
+
if (typeof t.unref === 'function') {
|
|
92
|
+
t.unref();
|
|
93
|
+
}
|
|
94
|
+
probeTimer = t;
|
|
95
|
+
}
|
|
96
|
+
function maybeRescheduleCadence() {
|
|
97
|
+
const next = selectCadenceMs();
|
|
98
|
+
if (next !== currentCadenceMs) {
|
|
99
|
+
currentCadenceMs = next;
|
|
100
|
+
if (probeTimer != null) {
|
|
101
|
+
armTimer();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async function probeNow() {
|
|
106
|
+
if (runner == null) {
|
|
107
|
+
logger?.warn?.('rate-limit-scheduler: probeNow called without runner; skipping');
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const result = await runner('gh', ['api', 'rate_limit']);
|
|
112
|
+
if (result.exitCode !== 0) {
|
|
113
|
+
logger?.warn?.(`rate-limit-scheduler: probe exit ${result.exitCode}: ${result.stderr.trim()}`);
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
let parsed;
|
|
117
|
+
try {
|
|
118
|
+
parsed = JSON.parse(result.stdout);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
logger?.warn?.('rate-limit-scheduler: probe returned malformed JSON');
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
const shape = RateLimitApiSchema.safeParse(parsed);
|
|
125
|
+
if (!shape.success) {
|
|
126
|
+
logger?.warn?.(`rate-limit-scheduler: probe shape mismatch: ${shape.error.message}`);
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
const g = shape.data.resources.graphql;
|
|
130
|
+
const remaining = Math.max(0, Math.min(g.remaining, g.limit));
|
|
131
|
+
const probeResult = {
|
|
132
|
+
remaining,
|
|
133
|
+
limit: g.limit,
|
|
134
|
+
resetAt: g.reset,
|
|
135
|
+
};
|
|
136
|
+
lastRatio = g.limit > 0 ? remaining / g.limit : 1;
|
|
137
|
+
recomputeInterval();
|
|
138
|
+
maybeRescheduleCadence();
|
|
139
|
+
logger?.info?.(`rate-limit-scheduler: probe remaining=${remaining}/${g.limit} interval=${currentIntervalMs}ms`);
|
|
140
|
+
return probeResult;
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
logger?.warn?.(`rate-limit-scheduler: probe error: ${err instanceof Error ? err.message : String(err)}`);
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function noteRetryAfter(seconds) {
|
|
148
|
+
if (!Number.isFinite(seconds) || seconds <= 0)
|
|
149
|
+
return;
|
|
150
|
+
retryAfterUntilMs = now() + Math.min(seconds * 1000, ceilingMs);
|
|
151
|
+
recomputeInterval();
|
|
152
|
+
currentCadenceMs = fastProbeCadenceMs;
|
|
153
|
+
if (probeTimer != null)
|
|
154
|
+
armTimer();
|
|
155
|
+
}
|
|
156
|
+
function noteResponseHeaders(headers) {
|
|
157
|
+
const lower = {};
|
|
158
|
+
for (const [k, v] of Object.entries(headers)) {
|
|
159
|
+
lower[k.toLowerCase()] = v;
|
|
160
|
+
}
|
|
161
|
+
const retryAfter = lower['retry-after'];
|
|
162
|
+
if (retryAfter != null) {
|
|
163
|
+
const seconds = Number.parseInt(retryAfter, 10);
|
|
164
|
+
if (Number.isFinite(seconds) && seconds > 0) {
|
|
165
|
+
noteRetryAfter(seconds);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const remainingRaw = lower['x-ratelimit-remaining'];
|
|
169
|
+
const limitRaw = lower['x-ratelimit-limit'];
|
|
170
|
+
if (remainingRaw != null && limitRaw != null) {
|
|
171
|
+
const remaining = Number.parseInt(remainingRaw, 10);
|
|
172
|
+
const limit = Number.parseInt(limitRaw, 10);
|
|
173
|
+
if (Number.isFinite(remaining) && Number.isFinite(limit) && limit > 0) {
|
|
174
|
+
lastRatio = Math.max(0, Math.min(remaining, limit)) / limit;
|
|
175
|
+
recomputeInterval();
|
|
176
|
+
maybeRescheduleCadence();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function start() {
|
|
181
|
+
if (probeTimer != null)
|
|
182
|
+
return;
|
|
183
|
+
armTimer();
|
|
184
|
+
}
|
|
185
|
+
function stop() {
|
|
186
|
+
if (probeTimer != null) {
|
|
187
|
+
clearInterval(probeTimer);
|
|
188
|
+
probeTimer = null;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function getCurrentIntervalMs() {
|
|
192
|
+
recomputeInterval();
|
|
193
|
+
return currentIntervalMs;
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
getCurrentIntervalMs,
|
|
197
|
+
probeNow,
|
|
198
|
+
noteRetryAfter,
|
|
199
|
+
noteResponseHeaders,
|
|
200
|
+
start,
|
|
201
|
+
stop,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=rate-limit-scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit-scheduler.js","sourceRoot":"","sources":["../../src/gh/rate-limit-scheduler.ts"],"names":[],"mappings":"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"}
|
package/dist/gh/wrapper.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { type CommandRunner } from './command-runner.js';
|
|
2
|
+
import type { GhResponseCache } from './cache.js';
|
|
3
|
+
import type { RateLimitScheduler } from './rate-limit-scheduler.js';
|
|
2
4
|
export interface Issue {
|
|
3
5
|
number: number;
|
|
4
6
|
title: string;
|
|
@@ -139,6 +141,7 @@ export interface PullRequestSummary {
|
|
|
139
141
|
url: string;
|
|
140
142
|
isDraft: boolean;
|
|
141
143
|
labels: string[];
|
|
144
|
+
headRefOid?: string;
|
|
142
145
|
}
|
|
143
146
|
export interface IssueLabelsResult {
|
|
144
147
|
labels: string[];
|
|
@@ -193,11 +196,22 @@ export interface GhWrapper {
|
|
|
193
196
|
findOpenPrForBranch(repo: string, branch: string): Promise<OpenPrForBranch | null>;
|
|
194
197
|
prDiffNames(repo: string, prNumber: number): Promise<string[]>;
|
|
195
198
|
prDiffPatch(repo: string, prNumber: number): Promise<string>;
|
|
199
|
+
/**
|
|
200
|
+
* Overwrite the body of an issue. Not conditional — callers implement
|
|
201
|
+
* their own read-modify-verify loop for concurrent-safe append/remove.
|
|
202
|
+
*/
|
|
203
|
+
updateIssueBody(repo: string, issue: number, body: string): Promise<void>;
|
|
204
|
+
}
|
|
205
|
+
export interface GhCliWrapperOptions {
|
|
206
|
+
cache?: GhResponseCache;
|
|
207
|
+
rateLimitScheduler?: RateLimitScheduler;
|
|
196
208
|
}
|
|
197
209
|
export declare class GhCliWrapper implements GhWrapper {
|
|
198
210
|
private readonly runner;
|
|
199
211
|
private readonly logger;
|
|
200
|
-
|
|
212
|
+
private readonly cache;
|
|
213
|
+
private readonly rateLimitScheduler;
|
|
214
|
+
constructor(runner?: CommandRunner, logger?: GhWrapperLogger, options?: GhCliWrapperOptions);
|
|
201
215
|
listIssues(query: string, options?: ListIssuesOptions): Promise<Issue[]>;
|
|
202
216
|
getIssue(repo: string, number: number): Promise<Issue>;
|
|
203
217
|
addLabels(repo: string, issue: number, labels: string[]): Promise<void>;
|
|
@@ -234,6 +248,7 @@ export declare class GhCliWrapper implements GhWrapper {
|
|
|
234
248
|
findOpenPrForBranch(repo: string, branch: string): Promise<OpenPrForBranch | null>;
|
|
235
249
|
prDiffNames(repo: string, prNumber: number): Promise<string[]>;
|
|
236
250
|
prDiffPatch(repo: string, prNumber: number): Promise<string>;
|
|
251
|
+
updateIssueBody(repo: string, issue: number, body: string): Promise<void>;
|
|
237
252
|
}
|
|
238
253
|
export type { CommandRunner } from './command-runner.js';
|
|
239
254
|
//# sourceMappingURL=wrapper.d.ts.map
|
package/dist/gh/wrapper.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../../src/gh/wrapper.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../../src/gh/wrapper.ts"],"names":[],"mappings":"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"}
|