@tokenfactory/acc-runner 0.8.1 → 0.12.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.
Files changed (53) hide show
  1. package/README.md +175 -69
  2. package/dist/cli.js +42 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config.d.ts +22 -1
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/config.js +89 -3
  7. package/dist/config.js.map +1 -1
  8. package/dist/doctor.d.ts.map +1 -1
  9. package/dist/doctor.js +64 -5
  10. package/dist/doctor.js.map +1 -1
  11. package/dist/failure-classifier.d.ts +33 -0
  12. package/dist/failure-classifier.d.ts.map +1 -0
  13. package/dist/failure-classifier.js +128 -0
  14. package/dist/failure-classifier.js.map +1 -0
  15. package/dist/login.d.ts +3 -0
  16. package/dist/login.d.ts.map +1 -1
  17. package/dist/login.js +5 -2
  18. package/dist/login.js.map +1 -1
  19. package/dist/runtime/conflict-resolver.d.ts +65 -0
  20. package/dist/runtime/conflict-resolver.d.ts.map +1 -0
  21. package/dist/runtime/conflict-resolver.js +477 -0
  22. package/dist/runtime/conflict-resolver.js.map +1 -0
  23. package/dist/runtime/quarantine.d.ts +16 -0
  24. package/dist/runtime/quarantine.d.ts.map +1 -0
  25. package/dist/runtime/quarantine.js +50 -0
  26. package/dist/runtime/quarantine.js.map +1 -0
  27. package/dist/runtime/reviewer.d.ts +4 -0
  28. package/dist/runtime/reviewer.d.ts.map +1 -1
  29. package/dist/runtime/reviewer.js +102 -30
  30. package/dist/runtime/reviewer.js.map +1 -1
  31. package/dist/runtime/rework.d.ts +48 -0
  32. package/dist/runtime/rework.d.ts.map +1 -0
  33. package/dist/runtime/rework.js +136 -0
  34. package/dist/runtime/rework.js.map +1 -0
  35. package/dist/runtime/worktree.d.ts +11 -0
  36. package/dist/runtime/worktree.d.ts.map +1 -1
  37. package/dist/runtime/worktree.js +11 -5
  38. package/dist/runtime/worktree.js.map +1 -1
  39. package/dist/task-runner.d.ts +21 -0
  40. package/dist/task-runner.d.ts.map +1 -1
  41. package/dist/task-runner.js +347 -19
  42. package/dist/task-runner.js.map +1 -1
  43. package/dist/token-provider.d.ts +50 -0
  44. package/dist/token-provider.d.ts.map +1 -0
  45. package/dist/token-provider.js +177 -0
  46. package/dist/token-provider.js.map +1 -0
  47. package/dist/types.d.ts +11 -0
  48. package/dist/types.d.ts.map +1 -1
  49. package/dist/watch.d.ts +30 -0
  50. package/dist/watch.d.ts.map +1 -1
  51. package/dist/watch.js +358 -45
  52. package/dist/watch.js.map +1 -1
  53. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-provider.d.ts","sourceRoot":"","sources":["../src/token-provider.ts"],"names":[],"mappings":"AAqDA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB;kEAC8D;IAC9D,UAAU,IAAI,OAAO,CAAC;IACtB,IAAI,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3B;AAED,mEAAmE;AACnE,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAElD,+DAA+D;AAC/D,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,UAAU,SAAS;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAiB7D;AAkBD,qBAAa,gBAAiB,YAAW,aAAa;IACpD,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAU;IAC/B,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,SAAS,CAAuB;gBAE5B,GAAG,GAAE,MAAM,CAAC,UAAwB;IA+BhD,UAAU,IAAI,OAAO;IAIf,IAAI,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAKrC,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3C,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;CAKhC;AAED,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,SAAS,CAOhF;AAID;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAOhD;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAEvE"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * v0.12.0 (T-52-7): token-provider abstraction for ephemeral runners.
3
+ *
4
+ * Two modes, selected by ACC_RUNNER_TOKEN_MODE:
5
+ *
6
+ * "keychain" (default, or unset) — delegates byte-for-byte to the
7
+ * existing keychain.ts functions. The OS-keychain entry schema
8
+ * (service "acc-runner", account "default", JSON StoredSession) is a
9
+ * FROZEN contract; this module never touches its shape. Desktop
10
+ * runners see identical behavior to v0.11.
11
+ *
12
+ * "env" — containerized / ephemeral runners. The session is sourced
13
+ * from env vars instead of keytar (containers have no OS keychain
14
+ * and keytar's native binding is never imported on this path):
15
+ *
16
+ * ACC_RUNNER_ACCESS_TOKEN (required) the Supabase-compatible JWT
17
+ * minted by the device-code exchange,
18
+ * /api/runner/refresh, or the autoscale
19
+ * provider. user_id / email / expiry are
20
+ * decoded from the JWT payload (sub,
21
+ * email, exp) — no extra env needed.
22
+ * ACC_RUNNER_REFRESH_TOKEN (optional) enables in-process token
23
+ * rotation via /api/runner/refresh.
24
+ * Rotated successors live in process
25
+ * memory only — they are NEVER written
26
+ * to disk. Restarting a container with a
27
+ * previously-rotated refresh token trips
28
+ * the server's reuse detection and
29
+ * revokes the chain, so provision a
30
+ * fresh pair per container (see
31
+ * docs/acc/RUNNER_AUTOSCALE.md). When
32
+ * absent the runner simply cannot
33
+ * refresh and exits when the 8h access
34
+ * token expires — fine for idle-TTL
35
+ * bounded ephemeral runners.
36
+ * ACC_RUNNER_ID (optional) pre-assigned runner id.
37
+ * Defaults to a fresh `acc-eph-<hex8>`
38
+ * minted once per process. The acc-eph-
39
+ * prefix is the autoscale sweep's
40
+ * "ephemeral fleet" discriminator — do
41
+ * not reuse it for desktop runners.
42
+ *
43
+ * save() in env mode updates the in-memory session (so refresh rotation
44
+ * works for the life of the process) and deliberately does NOT persist:
45
+ * an ephemeral runner that writes credentials to its writable layer
46
+ * would leak them into image diffs / volume snapshots.
47
+ */
48
+ import crypto from "node:crypto";
49
+ import { clearSession as keychainClear, loadSession as keychainLoad, saveSession as keychainSave, } from "./keychain.js";
50
+ /** Prefix marking a runner as ephemeral to the autoscale sweep. */
51
+ export const EPHEMERAL_RUNNER_PREFIX = "acc-eph-";
52
+ /** Mint a fresh ephemeral runner id: acc-eph-<8 hex chars>. */
53
+ export function mintEphemeralRunnerId() {
54
+ return `${EPHEMERAL_RUNNER_PREFIX}${crypto.randomBytes(4).toString("hex")}`;
55
+ }
56
+ export function isEphemeralRunnerId(id) {
57
+ return id.startsWith(EPHEMERAL_RUNNER_PREFIX);
58
+ }
59
+ /**
60
+ * Decode the payload segment of a JWT without verifying the signature.
61
+ * The runner is the token's *bearer*, not its verifier — PostgREST does
62
+ * the real verification server-side. Returns null on any shape problem
63
+ * so a malformed env token fails loudly at startup with a clear message
64
+ * rather than an opaque 401 on the first RPC.
65
+ */
66
+ export function decodeJwtClaims(jwt) {
67
+ const parts = jwt.split(".");
68
+ if (parts.length !== 3)
69
+ return null;
70
+ try {
71
+ const payload = Buffer.from(parts[1].replace(/-/g, "+").replace(/_/g, "/"), "base64").toString("utf8");
72
+ const parsed = JSON.parse(payload);
73
+ return {
74
+ sub: typeof parsed.sub === "string" ? parsed.sub : undefined,
75
+ email: typeof parsed.email === "string" ? parsed.email : undefined,
76
+ exp: typeof parsed.exp === "number" ? parsed.exp : undefined,
77
+ };
78
+ }
79
+ catch {
80
+ return null;
81
+ }
82
+ }
83
+ class KeychainTokenProvider {
84
+ mode = "keychain";
85
+ canRefresh() {
86
+ return true;
87
+ }
88
+ load() {
89
+ return keychainLoad();
90
+ }
91
+ save(session) {
92
+ return keychainSave(session);
93
+ }
94
+ clear() {
95
+ return keychainClear();
96
+ }
97
+ }
98
+ export class EnvTokenProvider {
99
+ mode = "env";
100
+ session = null;
101
+ initError = null;
102
+ constructor(env = process.env) {
103
+ const accessToken = env.ACC_RUNNER_ACCESS_TOKEN?.trim() ?? "";
104
+ if (!accessToken) {
105
+ this.initError =
106
+ "ACC_RUNNER_TOKEN_MODE=env requires ACC_RUNNER_ACCESS_TOKEN to be set";
107
+ return;
108
+ }
109
+ const claims = decodeJwtClaims(accessToken);
110
+ if (!claims?.sub) {
111
+ this.initError =
112
+ "ACC_RUNNER_ACCESS_TOKEN is not a decodable JWT (expected the access token minted by the device-code exchange or the autoscale provider)";
113
+ return;
114
+ }
115
+ const refreshToken = env.ACC_RUNNER_REFRESH_TOKEN?.trim() ?? "";
116
+ const runnerId = env.ACC_RUNNER_ID?.trim() || mintEphemeralRunnerId();
117
+ this.session = {
118
+ access_token: accessToken,
119
+ // Empty string when refresh is unavailable; canRefresh() gates every
120
+ // 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()
124
+ : // No exp claim: treat as far-future so the watch loop doesn't
125
+ // spin on refresh attempts it can't perform.
126
+ new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString(),
127
+ email: claims.email ?? null,
128
+ user_id: claims.sub,
129
+ runner_id: runnerId,
130
+ };
131
+ }
132
+ canRefresh() {
133
+ return Boolean(this.session?.refresh_token);
134
+ }
135
+ async load() {
136
+ if (this.initError)
137
+ throw new Error(this.initError);
138
+ return this.session;
139
+ }
140
+ async save(session) {
141
+ // In-memory only — see module docstring.
142
+ this.session = session;
143
+ }
144
+ async clear() {
145
+ const had = this.session !== null;
146
+ this.session = null;
147
+ return had;
148
+ }
149
+ }
150
+ export function resolveTokenMode(env = process.env) {
151
+ const raw = env.ACC_RUNNER_TOKEN_MODE?.trim().toLowerCase();
152
+ if (!raw || raw === "keychain")
153
+ return "keychain";
154
+ if (raw === "env")
155
+ return "env";
156
+ throw new Error(`ACC_RUNNER_TOKEN_MODE=${JSON.stringify(raw)} is not supported (expected "keychain" or "env")`);
157
+ }
158
+ let cachedProvider = null;
159
+ /**
160
+ * Resolve the process-wide token provider. Cached so the ephemeral
161
+ * runner id minted by EnvTokenProvider is stable across watch.ts,
162
+ * doctor.ts, and any future consumer in the same process.
163
+ */
164
+ export function getTokenProvider() {
165
+ if (cachedProvider)
166
+ return cachedProvider;
167
+ cachedProvider =
168
+ resolveTokenMode() === "env"
169
+ ? new EnvTokenProvider()
170
+ : new KeychainTokenProvider();
171
+ return cachedProvider;
172
+ }
173
+ /** Test-only seam: override or reset the cached provider. */
174
+ export function __setTokenProvider(provider) {
175
+ cachedProvider = provider;
176
+ }
177
+ //# sourceMappingURL=token-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-provider.js","sourceRoot":"","sources":["../src/token-provider.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -63,6 +63,17 @@ export interface FetchTaskResult {
63
63
  allowed: string[];
64
64
  forbidden: string[];
65
65
  contracts?: string[] | null;
66
+ /**
67
+ * v0.48 T-48-5: task type discriminator. 'conflict_resolution' tasks
68
+ * bypass Claude and are handled by runtime/conflict-resolver.ts.
69
+ * Populated from acc.tasks.type; acc.fetch_task_for_runner already
70
+ * returns the full task row via to_jsonb(v_task) — no migration needed.
71
+ */
72
+ type?: string | null;
73
+ /** v0.48 T-48-5: PR number the conflict_resolution task is resolving.
74
+ * Set by acc.create_conflict_task (Sweep C) so the runner can count
75
+ * prior attempts and fetch PR details. */
76
+ pr_number?: number | null;
66
77
  /** v0.6.1 REG-295: per-task GitHub slug (owner/name) — overrides
67
78
  * cfg.targetRepo so a single runner can service tasks spanning
68
79
  * multiple repos. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/watch.d.ts CHANGED
@@ -33,11 +33,41 @@ export interface WatchOptions {
33
33
  reviewerFactory?: (assignment: ReviewAssignment, deps: {
34
34
  supabase: RunnerSupabaseClient;
35
35
  }) => Promise<ReviewerOutcome>;
36
+ /**
37
+ * v0.10 T-49-2: max tasks this runner may execute in parallel. Each
38
+ * concurrent task runs in an isolated git worktree so there is zero
39
+ * file bleed between them. The database-side `claim_task_with_locks`
40
+ * RPC provides a second layer: it rejects a claim when the task's file
41
+ * scope overlaps another in-flight task.
42
+ *
43
+ * Defaults to 2 (the v0.10 autonomous-dispatch default). Set to 1 to
44
+ * restore the strict serial v0.9 behaviour.
45
+ */
46
+ concurrencyLimit?: number;
47
+ /**
48
+ * v0.12.0 (T-52-7): idle TTL in ms. Overrides ACC_RUNNER_IDLE_TTL_MIN
49
+ * for tests. null/undefined falls back to the env var; when neither is
50
+ * set the idle-TTL machinery is never armed (desktop default — byte-
51
+ * identical v0.11 behaviour).
52
+ */
53
+ idleTtlMs?: number | null;
54
+ /** v0.12.0 (T-52-7): idle-check cadence override for tests. */
55
+ idleCheckMs?: number;
56
+ /** v0.12.0 (T-52-7): exit hook for tests. Defaults to process.exit. */
57
+ exit?: (code: number) => void;
36
58
  }
59
+ /**
60
+ * v0.12.0 (T-52-7): resolve ACC_RUNNER_IDLE_TTL_MIN into ms. Returns null
61
+ * (TTL disabled) when unset; warns and returns null on junk so a typo'd
62
+ * env never strands a container in "never exits" mode silently.
63
+ */
64
+ export declare function resolveIdleTtlMs(env?: NodeJS.ProcessEnv): number | null;
37
65
  export interface WatchHandle {
38
66
  stop(): Promise<void>;
39
67
  /** Test hook: forces one polling pass and resolves when it finishes. */
40
68
  pollOnce(): Promise<void>;
69
+ /** v0.10 T-49-2: number of tasks currently executing. Useful for tests. */
70
+ runningCount(): number;
41
71
  }
42
72
  export declare function watchCommand(options?: WatchOptions): Promise<WatchHandle>;
43
73
  //# sourceMappingURL=watch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAsB,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,OAAO,EAA0B,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAM/B,qBAAa,yBAA0B,SAAQ,KAAK;gBACtC,OAAO,EAAE,MAAM;CAI5B;AAuBD,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN,KAAK,GACL,KAAK,GACL,OAAO,GACP,SAAS,GACT,SAAS,GACT,SAAS,CAAC;AAEd;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GACxE,kBAAkB,CA2CpB;AAED;;;6CAG6C;AAC7C,wBAAgB,oBAAoB,CAAC,mBAAmB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAIxF;AAED,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,OAAO,OAAO,CAAC;IACnC,yEAAyE;IACzE,eAAe,CAAC,EAAE,CAChB,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE;QAAE,QAAQ,EAAE,oBAAoB,CAAA;KAAE,KACrC,OAAO,CAAC,eAAe,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,wEAAwE;IACxE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAiOD,wBAAsB,YAAY,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CA0NnF"}
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAsB,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,OAAO,EAA0B,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAY/B,qBAAa,yBAA0B,SAAQ,KAAK;gBACtC,OAAO,EAAE,MAAM;CAI5B;AA0BD,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN,KAAK,GACL,KAAK,GACL,OAAO,GACP,SAAS,GACT,SAAS,GACT,SAAS,CAAC;AAEd;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GACxE,kBAAkB,CA2CpB;AAED;;;6CAG6C;AAC7C,wBAAgB,oBAAoB,CAAC,mBAAmB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAIxF;AAED,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,OAAO,OAAO,CAAC;IACnC,yEAAyE;IACzE,eAAe,CAAC,EAAE,CAChB,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE;QAAE,QAAQ,EAAE,oBAAoB,CAAA;KAAE,KACrC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9B;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,IAAI,CAWf;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,wEAAwE;IACxE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,2EAA2E;IAC3E,YAAY,IAAI,MAAM,CAAC;CACxB;AA8RD,wBAAsB,YAAY,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAgUnF"}