@tokenfactory/acc-runner 0.28.4 → 0.28.6
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/config.d.ts +31 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +60 -0
- package/dist/config.js.map +1 -1
- package/dist/doctor.d.ts +12 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +129 -2
- package/dist/doctor.js.map +1 -1
- package/dist/prepr-gate.d.ts +81 -0
- package/dist/prepr-gate.d.ts.map +1 -0
- package/dist/prepr-gate.js +173 -0
- package/dist/prepr-gate.js.map +1 -0
- package/dist/runtime/cache-dir.d.ts +8 -0
- package/dist/runtime/cache-dir.d.ts.map +1 -1
- package/dist/runtime/cache-dir.js +29 -2
- package/dist/runtime/cache-dir.js.map +1 -1
- package/dist/runtime/locks.d.ts.map +1 -1
- package/dist/runtime/locks.js +12 -6
- package/dist/runtime/locks.js.map +1 -1
- package/dist/runtime/quarantine.d.ts +5 -1
- package/dist/runtime/quarantine.d.ts.map +1 -1
- package/dist/runtime/quarantine.js +7 -4
- package/dist/runtime/quarantine.js.map +1 -1
- package/dist/runtime/reviewer.d.ts +24 -0
- package/dist/runtime/reviewer.d.ts.map +1 -1
- package/dist/runtime/reviewer.js +99 -13
- package/dist/runtime/reviewer.js.map +1 -1
- package/dist/runtime/singleton.d.ts +27 -8
- package/dist/runtime/singleton.d.ts.map +1 -1
- package/dist/runtime/singleton.js +43 -16
- package/dist/runtime/singleton.js.map +1 -1
- package/dist/runtime/worktree.d.ts +48 -0
- package/dist/runtime/worktree.d.ts.map +1 -1
- package/dist/runtime/worktree.js +92 -9
- package/dist/runtime/worktree.js.map +1 -1
- package/dist/task-runner.d.ts +13 -2
- package/dist/task-runner.d.ts.map +1 -1
- package/dist/task-runner.js +182 -10
- package/dist/task-runner.js.map +1 -1
- package/dist/token-provider.d.ts +34 -0
- package/dist/token-provider.d.ts.map +1 -1
- package/dist/token-provider.js +124 -15
- package/dist/token-provider.js.map +1 -1
- package/dist/watch.d.ts +33 -0
- package/dist/watch.d.ts.map +1 -1
- package/dist/watch.js +250 -19
- package/dist/watch.js.map +1 -1
- package/package.json +1 -1
package/dist/token-provider.js
CHANGED
|
@@ -44,6 +44,24 @@
|
|
|
44
44
|
* works for the life of the process) and deliberately does NOT persist:
|
|
45
45
|
* an ephemeral runner that writes credentials to its writable layer
|
|
46
46
|
* would leak them into image diffs / volume snapshots.
|
|
47
|
+
*
|
|
48
|
+
* v1.08 (T-1780801080001, V4/E2): API-key fleet failover. An env-token
|
|
49
|
+
* runner can be given a FLEET of access tokens instead of a single one:
|
|
50
|
+
*
|
|
51
|
+
* ACC_RUNNER_ACCESS_TOKEN primary JWT (still required)
|
|
52
|
+
* ACC_RUNNER_ACCESS_TOKEN_FALLBACKS comma/whitespace-separated spare JWTs
|
|
53
|
+
* ACC_RUNNER_REFRESH_TOKEN_FALLBACKS optional spare refresh tokens, paired
|
|
54
|
+
* positionally with the access fallbacks
|
|
55
|
+
*
|
|
56
|
+
* When the active credential's access token expires (or an RPC/heartbeat
|
|
57
|
+
* comes back auth-shaped) and it cannot be refreshed in place, the runner
|
|
58
|
+
* calls failover() to advance to the next NON-EXPIRED credential in the
|
|
59
|
+
* fleet and rebuilds its Supabase client around the new JWT — recovering
|
|
60
|
+
* instead of quarantining. The runner identity (runner_id) is preserved
|
|
61
|
+
* across a failover so the realtime channel, heartbeats, and the registered
|
|
62
|
+
* acc.runners row all stay pointed at the same id; only the bearer rotates.
|
|
63
|
+
* The keychain (desktop) path has no fleet — failover() is a null there and
|
|
64
|
+
* recovery stays `acc-runner login`.
|
|
47
65
|
*/
|
|
48
66
|
import crypto from "node:crypto";
|
|
49
67
|
import { clearSession as keychainClear, loadSession as keychainLoad, saveSession as keychainSave, } from "./keychain.js";
|
|
@@ -94,39 +112,95 @@ class KeychainTokenProvider {
|
|
|
94
112
|
clear() {
|
|
95
113
|
return keychainClear();
|
|
96
114
|
}
|
|
115
|
+
// Desktop keychain holds a single credential — recovery is `acc-runner
|
|
116
|
+
// login`, not a fleet rotation. v1.08: a no-op so the watch loop can call
|
|
117
|
+
// failover() uniformly without branching on mode.
|
|
118
|
+
async failover() {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
fleetSize() {
|
|
122
|
+
return 1;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* v1.08 (T-1780801080001): split a fallback env value into individual tokens.
|
|
127
|
+
* Tolerant of commas, whitespace, and newlines so an operator can list the
|
|
128
|
+
* fleet however a deployment template renders it. Blank entries are dropped.
|
|
129
|
+
*/
|
|
130
|
+
export function splitTokenList(raw) {
|
|
131
|
+
if (!raw)
|
|
132
|
+
return [];
|
|
133
|
+
return raw
|
|
134
|
+
.split(/[\s,]+/)
|
|
135
|
+
.map((s) => s.trim())
|
|
136
|
+
.filter(Boolean);
|
|
137
|
+
}
|
|
138
|
+
/** v1.08: true when a JWT's `exp` claim is in the past (no exp = never). */
|
|
139
|
+
function credentialExpired(claims, now = Date.now()) {
|
|
140
|
+
if (typeof claims.exp !== "number")
|
|
141
|
+
return false;
|
|
142
|
+
return claims.exp * 1000 <= now;
|
|
97
143
|
}
|
|
98
144
|
export class EnvTokenProvider {
|
|
99
145
|
mode = "env";
|
|
100
146
|
session = null;
|
|
101
147
|
initError = null;
|
|
148
|
+
// v1.08 (T-1780801080001): the credential fleet and the index of the
|
|
149
|
+
// active credential. fleet holds only decodable candidates, in env order
|
|
150
|
+
// (primary first, then ACC_RUNNER_ACCESS_TOKEN_FALLBACKS). runnerId is
|
|
151
|
+
// minted once and preserved across failover so the runner identity is
|
|
152
|
+
// stable while the bearer rotates.
|
|
153
|
+
fleet = [];
|
|
154
|
+
index = 0;
|
|
155
|
+
runnerId = "";
|
|
102
156
|
constructor(env = process.env) {
|
|
103
|
-
const
|
|
104
|
-
if (!
|
|
157
|
+
const primary = env.ACC_RUNNER_ACCESS_TOKEN?.trim() ?? "";
|
|
158
|
+
if (!primary) {
|
|
105
159
|
this.initError =
|
|
106
160
|
"ACC_RUNNER_TOKEN_MODE=env requires ACC_RUNNER_ACCESS_TOKEN to be set";
|
|
107
161
|
return;
|
|
108
162
|
}
|
|
109
|
-
const
|
|
110
|
-
|
|
163
|
+
const accessTokens = [primary, ...splitTokenList(env.ACC_RUNNER_ACCESS_TOKEN_FALLBACKS)];
|
|
164
|
+
const refreshTokens = [
|
|
165
|
+
env.ACC_RUNNER_REFRESH_TOKEN?.trim() ?? "",
|
|
166
|
+
...splitTokenList(env.ACC_RUNNER_REFRESH_TOKEN_FALLBACKS),
|
|
167
|
+
];
|
|
168
|
+
for (let i = 0; i < accessTokens.length; i++) {
|
|
169
|
+
const claims = decodeJwtClaims(accessTokens[i]);
|
|
170
|
+
// Skip an undecodable fallback rather than poison the whole fleet; the
|
|
171
|
+
// primary's decodability still gates initError below so a lone garbage
|
|
172
|
+
// token fails loudly exactly as before.
|
|
173
|
+
if (!claims?.sub)
|
|
174
|
+
continue;
|
|
175
|
+
this.fleet.push({
|
|
176
|
+
accessToken: accessTokens[i],
|
|
177
|
+
refreshToken: refreshTokens[i]?.trim() ?? "",
|
|
178
|
+
claims: { ...claims, sub: claims.sub },
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
if (this.fleet.length === 0) {
|
|
111
182
|
this.initError =
|
|
112
183
|
"ACC_RUNNER_ACCESS_TOKEN is not a decodable JWT (expected the access token minted by the device-code exchange or the autoscale provider)";
|
|
113
184
|
return;
|
|
114
185
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
186
|
+
this.runnerId = env.ACC_RUNNER_ID?.trim() || mintEphemeralRunnerId();
|
|
187
|
+
this.session = this.sessionFromCredential(this.fleet[0]);
|
|
188
|
+
}
|
|
189
|
+
/** v1.08: build a StoredSession from a fleet credential (runner id preserved). */
|
|
190
|
+
sessionFromCredential(cred) {
|
|
191
|
+
return {
|
|
192
|
+
access_token: cred.accessToken,
|
|
119
193
|
// Empty string when refresh is unavailable; canRefresh() gates every
|
|
120
194
|
// consumer so the placeholder is never sent to /api/runner/refresh.
|
|
121
|
-
refresh_token: refreshToken,
|
|
122
|
-
access_expires_at: claims.exp
|
|
123
|
-
? new Date(claims.exp * 1000).toISOString()
|
|
195
|
+
refresh_token: cred.refreshToken,
|
|
196
|
+
access_expires_at: cred.claims.exp
|
|
197
|
+
? new Date(cred.claims.exp * 1000).toISOString()
|
|
124
198
|
: // No exp claim: treat as far-future so the watch loop doesn't
|
|
125
199
|
// spin on refresh attempts it can't perform.
|
|
126
200
|
new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString(),
|
|
127
|
-
email: claims.email ?? null,
|
|
128
|
-
user_id: claims.sub,
|
|
129
|
-
runner_id: runnerId,
|
|
201
|
+
email: cred.claims.email ?? null,
|
|
202
|
+
user_id: cred.claims.sub,
|
|
203
|
+
runner_id: this.runnerId,
|
|
130
204
|
};
|
|
131
205
|
}
|
|
132
206
|
canRefresh() {
|
|
@@ -138,14 +212,49 @@ export class EnvTokenProvider {
|
|
|
138
212
|
return this.session;
|
|
139
213
|
}
|
|
140
214
|
async save(session) {
|
|
141
|
-
// In-memory only — see module docstring.
|
|
215
|
+
// In-memory only — see module docstring. Mirror a rotated access/refresh
|
|
216
|
+
// token back into the active fleet slot so a later failover-and-return
|
|
217
|
+
// doesn't drop the rotation.
|
|
142
218
|
this.session = session;
|
|
219
|
+
const active = this.fleet[this.index];
|
|
220
|
+
if (active) {
|
|
221
|
+
active.accessToken = session.access_token;
|
|
222
|
+
active.refreshToken = session.refresh_token;
|
|
223
|
+
const decoded = decodeJwtClaims(session.access_token);
|
|
224
|
+
if (decoded?.sub)
|
|
225
|
+
active.claims = { ...decoded, sub: decoded.sub };
|
|
226
|
+
}
|
|
143
227
|
}
|
|
144
228
|
async clear() {
|
|
145
229
|
const had = this.session !== null;
|
|
146
230
|
this.session = null;
|
|
147
231
|
return had;
|
|
148
232
|
}
|
|
233
|
+
/**
|
|
234
|
+
* v1.08 (T-1780801080001): advance to the next NON-EXPIRED credential in
|
|
235
|
+
* the fleet and return its session. Linear, forward-only: each call walks
|
|
236
|
+
* past the current index looking for a healthy spare, so repeated auth
|
|
237
|
+
* failures exhaust the fleet predictably instead of cycling. Returns null
|
|
238
|
+
* (leaving the current session intact) when no healthy spare remains, which
|
|
239
|
+
* is the watch loop's signal to fall through to quarantine. reason is for
|
|
240
|
+
* the caller's log line only.
|
|
241
|
+
*/
|
|
242
|
+
async failover(_reason) {
|
|
243
|
+
if (this.initError || this.fleet.length === 0)
|
|
244
|
+
return null;
|
|
245
|
+
const now = Date.now();
|
|
246
|
+
for (let next = this.index + 1; next < this.fleet.length; next++) {
|
|
247
|
+
if (credentialExpired(this.fleet[next].claims, now))
|
|
248
|
+
continue;
|
|
249
|
+
this.index = next;
|
|
250
|
+
this.session = this.sessionFromCredential(this.fleet[next]);
|
|
251
|
+
return this.session;
|
|
252
|
+
}
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
fleetSize() {
|
|
256
|
+
return this.fleet.length;
|
|
257
|
+
}
|
|
149
258
|
}
|
|
150
259
|
export function resolveTokenMode(env = process.env) {
|
|
151
260
|
const raw = env.ACC_RUNNER_TOKEN_MODE?.trim().toLowerCase();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-provider.js","sourceRoot":"","sources":["../src/token-provider.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"token-provider.js","sourceRoot":"","sources":["../src/token-provider.ts"],"names":[],"mappings":"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"}
|
package/dist/watch.d.ts
CHANGED
|
@@ -9,6 +9,24 @@ import type { StoredSession } from "./types.js";
|
|
|
9
9
|
export declare class RefreshReuseDetectedError extends Error {
|
|
10
10
|
constructor(message: string);
|
|
11
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* REVFB (G1): resolve ACC_REVIEW_RESERVED_SLOT. Blank/absent ⇒ default; "0" ⇒
|
|
14
|
+
* disabled; negative/non-numeric ⇒ default (a typo must not starve reviews).
|
|
15
|
+
* Mirrors resolveReservedReviewSlots in api/_lib/review-retry.ts — the runner is
|
|
16
|
+
* a standalone package and must NOT import from api/_lib. // keep in sync
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveReservedReviewSlots(raw: string | undefined | null): number;
|
|
19
|
+
/**
|
|
20
|
+
* REVFB (G1): TASK slots pump() may fill, leaving `reserved` free for reviews.
|
|
21
|
+
* Always leaves ≥1 task slot (no-op on a 1-slot runner); the post-capacity probe
|
|
22
|
+
* window pins it to 1. Mirrors computeTaskClaimLimit in api/_lib/review-retry.ts.
|
|
23
|
+
* // keep in sync
|
|
24
|
+
*/
|
|
25
|
+
export declare function computeTaskClaimLimit(opts: {
|
|
26
|
+
concurrencyLimit: number;
|
|
27
|
+
reservedReviewSlots: number;
|
|
28
|
+
capacityProbe?: boolean;
|
|
29
|
+
}): number;
|
|
12
30
|
export type HeartbeatErrorKind = "auth" | "dns" | "tls" | "reset" | "timeout" | "network" | "unknown";
|
|
13
31
|
/**
|
|
14
32
|
* v0.6.0: classify the heartbeat RPC error so we (a) emit a useful
|
|
@@ -208,6 +226,12 @@ interface WatchState {
|
|
|
208
226
|
* the limit.
|
|
209
227
|
*/
|
|
210
228
|
concurrencyLimit: number;
|
|
229
|
+
/**
|
|
230
|
+
* REVFB (G1): TASK slots to leave free so a review broadcast is never starved
|
|
231
|
+
* by a full task queue. Resolved once from ACC_REVIEW_RESERVED_SLOT (default
|
|
232
|
+
* 1). Clamped away on a single-slot runner — see computeTaskClaimLimit.
|
|
233
|
+
*/
|
|
234
|
+
reservedReviewSlots: number;
|
|
211
235
|
queue: string[];
|
|
212
236
|
/** Every task_id we've ever enqueued in this process — Realtime OR poll. */
|
|
213
237
|
seen: Set<string>;
|
|
@@ -271,6 +295,14 @@ interface WatchState {
|
|
|
271
295
|
pausedCapacity: boolean;
|
|
272
296
|
/** Epoch ms the runner intends to resume at (null when not paused). */
|
|
273
297
|
pausedUntil: number | null;
|
|
298
|
+
/**
|
|
299
|
+
* FH-1a: the task that triggered the current capacity pause (the one
|
|
300
|
+
* runTask cleanly requeued running→queued on a mid-task 429), or null when
|
|
301
|
+
* the pause was triggered by a review or when not paused. Stashed so the
|
|
302
|
+
* resume path can emit a task-scoped `task.capacity_resumed` audit event
|
|
303
|
+
* for the same task once the window reopens.
|
|
304
|
+
*/
|
|
305
|
+
capacityTriggerTaskId: string | null;
|
|
274
306
|
/** Resume timer; cleared on stop() and on re-pause. */
|
|
275
307
|
pauseTimer: NodeJS.Timeout | null;
|
|
276
308
|
/**
|
|
@@ -290,6 +322,7 @@ interface WatchState {
|
|
|
290
322
|
singletonLock: SingletonLock | null;
|
|
291
323
|
}
|
|
292
324
|
export declare function resubscribeChannel(state: WatchState, factory: typeof runTask): Promise<void>;
|
|
325
|
+
export declare function reassertRunningClaims(state: WatchState): Promise<void>;
|
|
293
326
|
export declare function watchCommand(options?: WatchOptions): Promise<WatchHandle>;
|
|
294
327
|
export {};
|
|
295
328
|
//# sourceMappingURL=watch.d.ts.map
|
package/dist/watch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EAAsB,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAK/B,OAAO,
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"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"}
|