@tokenfactory/acc-runner 0.47.10 → 0.47.12

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 (48) hide show
  1. package/dist/build-info.generated.d.ts +1 -1
  2. package/dist/build-info.generated.js +2 -2
  3. package/dist/chat-lane.d.ts +20 -0
  4. package/dist/chat-lane.d.ts.map +1 -1
  5. package/dist/chat-lane.js +18 -1
  6. package/dist/chat-lane.js.map +1 -1
  7. package/dist/chat-transport.d.ts +1 -5
  8. package/dist/chat-transport.d.ts.map +1 -1
  9. package/dist/chat-transport.js +49 -0
  10. package/dist/chat-transport.js.map +1 -1
  11. package/dist/cost-pricing.d.ts +15 -0
  12. package/dist/cost-pricing.d.ts.map +1 -1
  13. package/dist/cost-pricing.js +77 -3
  14. package/dist/cost-pricing.js.map +1 -1
  15. package/dist/doctor.d.ts.map +1 -1
  16. package/dist/doctor.js +15 -9
  17. package/dist/doctor.js.map +1 -1
  18. package/dist/engines/claude-code.d.ts +9 -0
  19. package/dist/engines/claude-code.d.ts.map +1 -1
  20. package/dist/engines/claude-code.js +11 -2
  21. package/dist/engines/claude-code.js.map +1 -1
  22. package/dist/mcp-spawn.d.ts +1 -1
  23. package/dist/mcp-spawn.js +1 -1
  24. package/dist/program.d.ts.map +1 -1
  25. package/dist/program.js +8 -1
  26. package/dist/program.js.map +1 -1
  27. package/dist/runtime/janitor.d.ts +48 -0
  28. package/dist/runtime/janitor.d.ts.map +1 -0
  29. package/dist/runtime/janitor.js +166 -0
  30. package/dist/runtime/janitor.js.map +1 -0
  31. package/dist/runtime/locks.d.ts +9 -0
  32. package/dist/runtime/locks.d.ts.map +1 -1
  33. package/dist/runtime/locks.js +23 -0
  34. package/dist/runtime/locks.js.map +1 -1
  35. package/dist/supervisor.d.ts +24 -10
  36. package/dist/supervisor.d.ts.map +1 -1
  37. package/dist/supervisor.js +20 -11
  38. package/dist/supervisor.js.map +1 -1
  39. package/dist/task-runner.d.ts +7 -0
  40. package/dist/task-runner.d.ts.map +1 -1
  41. package/dist/task-runner.js +69 -4
  42. package/dist/task-runner.js.map +1 -1
  43. package/dist/watch.d.ts +30 -11
  44. package/dist/watch.d.ts.map +1 -1
  45. package/dist/watch.js +94 -17
  46. package/dist/watch.js.map +1 -1
  47. package/package.json +1 -1
  48. package/scripts/setup-dedicated-runner-linux.sh +17 -35
@@ -0,0 +1,166 @@
1
+ /**
2
+ * RUNNER-HOOK-DIR-AND-LOCK-JANITOR-1 — lane cleanup janitor (watch start +
3
+ * hourly, wired in watch.ts). Removes the RR-4 commit guard's orphan
4
+ * `.acc-commit-hooks-<id>` dirs and stale `<id>.pid` locks whose task is not
5
+ * running on THIS runner — the union of the in-memory set and a board read of
6
+ * running/claimed tasks for this runner_id. I/O boundaries are injectable.
7
+ */
8
+ import fs from "node:fs/promises";
9
+ import path from "node:path";
10
+ import { commitHooksDirFor } from "../commit-guard.js";
11
+ import { workDir } from "./worktree.js";
12
+ import { locksDir, clearLocalTaskLock } from "./locks.js";
13
+ const HOOK_DIR_PREFIX = ".acc-commit-hooks-";
14
+ /** Absolute path of a task's commit-guard hooks dir (sibling of its worktree). */
15
+ export function taskHookDir(taskId) {
16
+ return commitHooksDirFor(path.join(workDir(), taskId));
17
+ }
18
+ export async function removeTaskHookDir(taskId) {
19
+ await fs.rm(taskHookDir(taskId), { recursive: true, force: true });
20
+ }
21
+ async function readdirIds(dir, pick) {
22
+ let entries;
23
+ try {
24
+ entries = await fs.readdir(dir);
25
+ }
26
+ catch (err) {
27
+ if (err.code === "ENOENT")
28
+ return [];
29
+ throw err;
30
+ }
31
+ return entries.map(pick).filter((id) => !!id);
32
+ }
33
+ function defaultListHookDirTaskIds() {
34
+ return readdirIds(workDir(), (n) => n.startsWith(HOOK_DIR_PREFIX) ? n.slice(HOOK_DIR_PREFIX.length) : null);
35
+ }
36
+ function defaultListLockTaskIds() {
37
+ return readdirIds(locksDir(), (n) => (n.endsWith(".pid") ? n.slice(0, -4) : null));
38
+ }
39
+ /**
40
+ * Reconcile hook dirs + locks against what is still running here. Exactly one
41
+ * `runner.janitor` row per run, always — a run that finds no artifact logs
42
+ * zeroed counts (and skips the board read it would not use). A board-read
43
+ * failure removes NOTHING: the in-memory set alone cannot prove a task is not
44
+ * running for this runner (a sibling process sharing the cache dir, a task
45
+ * claimed on the board but not yet in memory), so every artifact is kept and
46
+ * the row carries `board_read_failed: true`; the next hourly run retries.
47
+ */
48
+ export async function runJanitor(deps) {
49
+ const listHookDirTaskIds = deps.listHookDirTaskIds ?? defaultListHookDirTaskIds;
50
+ const listLockTaskIds = deps.listLockTaskIds ?? defaultListLockTaskIds;
51
+ const removeHookDir = deps.removeHookDir ?? removeTaskHookDir;
52
+ const removeLockFile = deps.removeLockFile ?? ((id) => clearLocalTaskLock(id));
53
+ const log = deps.log ?? (() => { });
54
+ const emit = async (counts) => {
55
+ try {
56
+ await deps.logJanitor(counts);
57
+ }
58
+ catch (err) {
59
+ log(`[acc-runner] janitor activity log failed: ${err.message}`);
60
+ }
61
+ return counts;
62
+ };
63
+ const hookDirIds = await listHookDirTaskIds();
64
+ const lockIds = await listLockTaskIds();
65
+ if (hookDirIds.length === 0 && lockIds.length === 0) {
66
+ return emit({ hook_dirs_removed: 0, locks_removed: 0, kept: [] });
67
+ }
68
+ const keep = new Set(deps.localRunning);
69
+ try {
70
+ for (const id of await deps.boardRunningTaskIds())
71
+ if (id)
72
+ keep.add(id);
73
+ }
74
+ catch (err) {
75
+ log(`[acc-runner] janitor board read failed; nothing removed this run: ${err.message}`);
76
+ return emit({
77
+ hook_dirs_removed: 0,
78
+ locks_removed: 0,
79
+ kept: [...new Set([...hookDirIds, ...lockIds])].sort(),
80
+ board_read_failed: true,
81
+ });
82
+ }
83
+ const kept = new Set();
84
+ let hookDirsRemoved = 0;
85
+ for (const id of hookDirIds) {
86
+ if (keep.has(id)) {
87
+ kept.add(id);
88
+ continue;
89
+ }
90
+ try {
91
+ await removeHookDir(id);
92
+ hookDirsRemoved++;
93
+ }
94
+ catch (err) {
95
+ log(`[acc-runner] janitor hook-dir rm ${id}: ${err.message}`);
96
+ }
97
+ }
98
+ let locksRemoved = 0;
99
+ for (const id of lockIds) {
100
+ if (keep.has(id)) {
101
+ kept.add(id);
102
+ continue;
103
+ }
104
+ try {
105
+ if (await removeLockFile(id))
106
+ locksRemoved++;
107
+ }
108
+ catch (err) {
109
+ log(`[acc-runner] janitor lock rm ${id}: ${err.message}`);
110
+ }
111
+ }
112
+ return emit({
113
+ hook_dirs_removed: hookDirsRemoved,
114
+ locks_removed: locksRemoved,
115
+ kept: [...kept].sort(),
116
+ });
117
+ }
118
+ // Production entry: default FS + board + activity seams around a live client.
119
+ export async function runRunnerJanitor(opts) {
120
+ const { supabase, runnerId, localRunning } = opts;
121
+ return runJanitor({
122
+ localRunning,
123
+ boardRunningTaskIds: async () => {
124
+ const { data, error } = await supabase
125
+ .from("tasks")
126
+ .select("id")
127
+ .eq("runner_id", runnerId)
128
+ .in("status", ["running", "claimed"]);
129
+ if (error)
130
+ throw new Error(error.message);
131
+ return (data ?? []).map((r) => r.id);
132
+ },
133
+ logJanitor: async (counts) => {
134
+ // A refused insert is a failed log, not a logged run: surface it so the
135
+ // caller's log line names it (runJanitor catches and reports it).
136
+ const { error } = await supabase.rpc("log_activity", {
137
+ p_verb: "runner.janitor",
138
+ p_target_id: runnerId,
139
+ p_target_type: "runner",
140
+ p_payload: { runner_id: runnerId, ...counts },
141
+ });
142
+ if (error)
143
+ throw new Error(error.message ?? String(error));
144
+ },
145
+ log: opts.log,
146
+ });
147
+ }
148
+ /** Startup-pass ceiling: the watch loop waits this long for the first sweep. */
149
+ export const JANITOR_STARTUP_TIMEOUT_MS = 15_000;
150
+ /** Await the watch-start pass, bounded: "done" when it settled (ok or failed),
151
+ * "timeout" if still running after `timeoutMs` — so startup never hangs. */
152
+ export async function awaitStartupJanitor(run, timeoutMs = JANITOR_STARTUP_TIMEOUT_MS) {
153
+ let timer;
154
+ const timeout = new Promise((resolve) => {
155
+ timer = setTimeout(() => resolve("timeout"), timeoutMs);
156
+ timer.unref?.();
157
+ });
158
+ try {
159
+ return await Promise.race([run.then(() => "done", () => "done"), timeout]);
160
+ }
161
+ finally {
162
+ if (timer)
163
+ clearTimeout(timer);
164
+ }
165
+ }
166
+ //# sourceMappingURL=janitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"janitor.js","sourceRoot":"","sources":["../../src/runtime/janitor.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,15 @@ export declare class TaskLockHeldError extends Error {
12
12
  export declare function lockPath(taskId: string): string;
13
13
  export declare function isProcessAlive(pid: number): boolean;
14
14
  export declare function acquireTaskLock(taskId: string, pid?: number): Promise<TaskLock>;
15
+ /**
16
+ * RUNNER-HOOK-DIR-AND-LOCK-JANITOR-1: remove this lane's local PID lock for
17
+ * `taskId` when safe — the recorded pid is dead/absent or is our own (an
18
+ * orphaned self-lock). A LIVE FOREIGN pid is left untouched (a sibling process
19
+ * sharing this cache dir may still hold it). Returns true when removed. Used by
20
+ * the janitor and by the claim path when a refusal names a DIFFERENT runner as
21
+ * holder (the stale lock a reassignment left behind must be dropped).
22
+ */
23
+ export declare function clearLocalTaskLock(taskId: string, pid?: number): Promise<boolean>;
15
24
  export interface StaleLock {
16
25
  taskId: string;
17
26
  pidFile: string;
@@ -1 +1 @@
1
- {"version":3,"file":"locks.d.ts","sourceRoot":"","sources":["../../src/runtime/locks.ts"],"names":[],"mappings":"AAgBA,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,qBAAa,iBAAkB,SAAQ,KAAK;aACd,MAAM,EAAE,MAAM;aAAkB,SAAS,EAAE,MAAM;gBAAjD,MAAM,EAAE,MAAM,EAAkB,SAAS,EAAE,MAAM;CAI9E;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CASnD;AAaD,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,GAAG,GAAE,MAAoB,GACxB,OAAO,CAAC,QAAQ,CAAC,CAqBnB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAkB3D"}
1
+ {"version":3,"file":"locks.d.ts","sourceRoot":"","sources":["../../src/runtime/locks.ts"],"names":[],"mappings":"AAgBA,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,qBAAa,iBAAkB,SAAQ,KAAK;aACd,MAAM,EAAE,MAAM;aAAkB,SAAS,EAAE,MAAM;gBAAjD,MAAM,EAAE,MAAM,EAAkB,SAAS,EAAE,MAAM;CAI9E;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CASnD;AAaD,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,GAAG,GAAE,MAAoB,GACxB,OAAO,CAAC,QAAQ,CAAC,CAqBnB;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,GAAG,GAAE,MAAoB,GACxB,OAAO,CAAC,OAAO,CAAC,CAWlB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAkB3D"}
@@ -78,6 +78,29 @@ export async function acquireTaskLock(taskId, pid = process.pid) {
78
78
  },
79
79
  };
80
80
  }
81
+ /**
82
+ * RUNNER-HOOK-DIR-AND-LOCK-JANITOR-1: remove this lane's local PID lock for
83
+ * `taskId` when safe — the recorded pid is dead/absent or is our own (an
84
+ * orphaned self-lock). A LIVE FOREIGN pid is left untouched (a sibling process
85
+ * sharing this cache dir may still hold it). Returns true when removed. Used by
86
+ * the janitor and by the claim path when a refusal names a DIFFERENT runner as
87
+ * holder (the stale lock a reassignment left behind must be dropped).
88
+ */
89
+ export async function clearLocalTaskLock(taskId, pid = process.pid) {
90
+ const file = lockPath(taskId);
91
+ const existing = await readPid(file);
92
+ if (existing !== null && existing !== pid && isProcessAlive(existing))
93
+ return false;
94
+ try {
95
+ await fs.unlink(file);
96
+ return true;
97
+ }
98
+ catch (err) {
99
+ if (err.code === "ENOENT")
100
+ return false;
101
+ throw err;
102
+ }
103
+ }
81
104
  export async function listStaleLocks() {
82
105
  let entries;
83
106
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"locks.js","sourceRoot":"","sources":["../../src/runtime/locks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"locks.js","sourceRoot":"","sources":["../../src/runtime/locks.ts"],"names":[],"mappings":"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"}
@@ -29,19 +29,33 @@ export interface SystemdUnitOptions {
29
29
  instance?: string | null;
30
30
  /** Absolute path to the acc-runner launcher (ExecStart). */
31
31
  accRunnerPath?: string;
32
+ /**
33
+ * Absolute path to `systemd-inhibit`. When set, ExecStart is wrapped so
34
+ * logind's automatic idle action is blocked while `watch` runs (see the
35
+ * installer's `--what=idle` rationale). Omitted → the bare runner invocation,
36
+ * exactly as on a host with no `systemd-inhibit`.
37
+ */
38
+ inhibitPath?: string;
39
+ /**
40
+ * Value for `Environment=PATH=` in the unit. The installer prepends the
41
+ * resolved node bin dir to the system PATH so a `node` installed via
42
+ * nvm/fnm/volta (under $HOME, off the unit's default PATH) still resolves.
43
+ * Omitted → no PATH directive (the unit inherits systemd's default).
44
+ */
45
+ envPath?: string;
32
46
  }
33
47
  /**
34
- * RUNNER-REFRESH-ROTATION-LOST: the CANONICAL systemd --user unit template.
35
- * The `RestartPreventExitStatus=78` directive it carries is the fix for the
36
- * restart-loop half of the incident; `tests/linux-supervisor.test.ts` pins its
37
- * shape. Pure and fs-free like the rest of this module — it renders text, it
38
- * does not write it.
48
+ * RUNNER-REFRESH-ROTATION-LOST: the CANONICAL systemd --user unit template, and
49
+ * the SINGLE renderer of it. The `RestartPreventExitStatus=78` directive it
50
+ * carries is the fix for the restart-loop half of the incident;
51
+ * `tests/linux-supervisor.test.ts` pins its shape. Pure and fs-free like the
52
+ * rest of this module — it renders text, it does not write it.
39
53
  *
40
- * NOTE: the bash installer (`scripts/setup-dedicated-runner-linux.sh`) is the
41
- * process that actually writes the unit on a host and is outside this task's
42
- * allowed scope; adopting this renderer there (so there is exactly one unit
43
- * template) is a tracked follow-up. Until then, `acc-runner doctor` flags an
44
- * installed unit that lacks the directive and names the re-install fix.
54
+ * The bash installer (`scripts/setup-dedicated-runner-linux.sh`) writes the
55
+ * unit on a host by piping this renderer through `acc-runner print-systemd-unit`
56
+ * (`--instance`, `--exec-path`, `--inhibit-path`, `--env-path`) — it no longer
57
+ * maintains its own heredoc, so there is exactly one unit template. An installed
58
+ * unit that predates the directive is still flagged by `acc-runner doctor`.
45
59
  */
46
60
  export declare function renderSystemdUnit(opts?: SystemdUnitOptions): string;
47
61
  //# sourceMappingURL=supervisor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../src/supervisor.ts"],"names":[],"mappings":"AAgCA,qFAAqF;AACrF,eAAO,MAAM,iBAAiB,EAAG,YAAqB,CAAC;AAEvD,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE/D;AAED,2DAA2D;AAC3D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE7E;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAElF;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,EAAG,EAAW,CAAC;AAEvD,0EAA0E;AAC1E,eAAO,MAAM,mBAAmB,EAAG,KAAc,CAAC;AAElD,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,kBAAuB,GAAG,MAAM,CA8BvE"}
1
+ {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../src/supervisor.ts"],"names":[],"mappings":"AAgCA,qFAAqF;AACrF,eAAO,MAAM,iBAAiB,EAAG,YAAqB,CAAC;AAEvD,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE/D;AAED,2DAA2D;AAC3D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE7E;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAElF;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,EAAG,EAAW,CAAC;AAEvD,0EAA0E;AAC1E,eAAO,MAAM,mBAAmB,EAAG,KAAc,CAAC;AAElD,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,kBAAuB,GAAG,MAAM,CAuCvE"}
@@ -64,24 +64,33 @@ export const RESTART_PREVENT_EXIT_STATUS = 78;
64
64
  /** How long the installed unit waits before a (non-prevented) restart. */
65
65
  export const SYSTEMD_RESTART_SEC = "60s";
66
66
  /**
67
- * RUNNER-REFRESH-ROTATION-LOST: the CANONICAL systemd --user unit template.
68
- * The `RestartPreventExitStatus=78` directive it carries is the fix for the
69
- * restart-loop half of the incident; `tests/linux-supervisor.test.ts` pins its
70
- * shape. Pure and fs-free like the rest of this module — it renders text, it
71
- * does not write it.
67
+ * RUNNER-REFRESH-ROTATION-LOST: the CANONICAL systemd --user unit template, and
68
+ * the SINGLE renderer of it. The `RestartPreventExitStatus=78` directive it
69
+ * carries is the fix for the restart-loop half of the incident;
70
+ * `tests/linux-supervisor.test.ts` pins its shape. Pure and fs-free like the
71
+ * rest of this module — it renders text, it does not write it.
72
72
  *
73
- * NOTE: the bash installer (`scripts/setup-dedicated-runner-linux.sh`) is the
74
- * process that actually writes the unit on a host and is outside this task's
75
- * allowed scope; adopting this renderer there (so there is exactly one unit
76
- * template) is a tracked follow-up. Until then, `acc-runner doctor` flags an
77
- * installed unit that lacks the directive and names the re-install fix.
73
+ * The bash installer (`scripts/setup-dedicated-runner-linux.sh`) writes the
74
+ * unit on a host by piping this renderer through `acc-runner print-systemd-unit`
75
+ * (`--instance`, `--exec-path`, `--inhibit-path`, `--env-path`) — it no longer
76
+ * maintains its own heredoc, so there is exactly one unit template. An installed
77
+ * unit that predates the directive is still flagged by `acc-runner doctor`.
78
78
  */
79
79
  export function renderSystemdUnit(opts = {}) {
80
80
  const instance = opts.instance ?? null;
81
81
  const accRunnerPath = opts.accRunnerPath ?? "acc-runner";
82
+ const service = instance ? `${SYSTEMD_UNIT_BASE}-${instance}` : SYSTEMD_UNIT_BASE;
82
83
  const watchArgs = instance ? `watch --instance ${instance}` : "watch";
84
+ const runnerInvocation = `${accRunnerPath} ${watchArgs}`;
85
+ // systemd-inhibit wrapper: `--what=idle`, NOT `idle:sleep` — see the
86
+ // installer for why the two polkit actions differ. Matches the old heredoc's
87
+ // ExecStart line shape exactly.
88
+ const execStart = opts.inhibitPath
89
+ ? `${opts.inhibitPath} --what=idle --who=${service} --why=ACC-runner-watch ${runnerInvocation}`
90
+ : runnerInvocation;
83
91
  const envLines = [
84
92
  "Environment=ACC_RUNNER_DEDICATED=1",
93
+ ...(opts.envPath ? [`Environment=PATH=${opts.envPath}`] : []),
85
94
  ...(instance ? [`Environment=ACC_RUNNER_INSTANCE=${instance}`] : []),
86
95
  ].join("\n");
87
96
  return [
@@ -93,7 +102,7 @@ export function renderSystemdUnit(opts = {}) {
93
102
  "",
94
103
  "[Service]",
95
104
  "Type=simple",
96
- `ExecStart=${accRunnerPath} ${watchArgs}`,
105
+ `ExecStart=${execStart}`,
97
106
  "Restart=always",
98
107
  `RestartSec=${SYSTEMD_RESTART_SEC}`,
99
108
  // The fix: a terminal auth refusal exits 78; do not restart that.
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../src/supervisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,qFAAqF;AACrF,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAqB,CAAC;AAEvD,wEAAwE;AACxE,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,QAAuB;IACrD,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,iBAAiB,IAAI,QAAQ,UAAU,CAAC,CAAC,CAAC,GAAG,iBAAiB,UAAU,CAAC;AAChG,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,QAAuB;IACnE,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,qBAAqB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACxE,OAAO,eAAe,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAW,CAAC;AAEvD,0EAA0E;AAC1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAc,CAAC;AASlD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAA2B,EAAE;IAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;IACvC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,YAAY,CAAC;IACzD,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IACtE,MAAM,QAAQ,GAAG;QACf,oCAAoC;QACpC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACrE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,OAAO;QACL,QAAQ;QACR,sCAAsC,QAAQ,CAAC,CAAC,CAAC,eAAe,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;QACjF,4EAA4E;QAC5E,6BAA6B;QAC7B,6BAA6B;QAC7B,EAAE;QACF,WAAW;QACX,aAAa;QACb,aAAa,aAAa,IAAI,SAAS,EAAE;QACzC,gBAAgB;QAChB,cAAc,mBAAmB,EAAE;QACnC,kEAAkE;QAClE,4BAA4B,2BAA2B,EAAE;QACzD,wBAAwB;QACxB,uBAAuB;QACvB,QAAQ;QACR,EAAE;QACF,WAAW;QACX,yBAAyB;QACzB,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../src/supervisor.ts"],"names":[],"mappings":"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"}
@@ -80,6 +80,13 @@ export interface RunTaskDeps {
80
80
  * worktree side-effect lands.
81
81
  */
82
82
  acquireLock?: (taskId: string) => Promise<TaskLock>;
83
+ /** RUNNER-HOOK-DIR-AND-LOCK-JANITOR-1: remove this task's commit-guard hooks
84
+ * dir on every exit path. Default `removeTaskHookDir`; tests inject a spy. */
85
+ removeHookDir?: (taskId: string) => Promise<void>;
86
+ /** RUNNER-HOOK-DIR-AND-LOCK-JANITOR-1: drop this lane's stale local PID lock
87
+ * when a claim is refused because a DIFFERENT runner holds the task. Default
88
+ * `clearLocalTaskLock` (never touches a live foreign holder); tests spy. */
89
+ releaseLocalLock?: (taskId: string) => Promise<boolean>;
83
90
  /**
84
91
  * v0.41.4 (claim-livelock hardening): given the conflicting task ids from a
85
92
  * failed `claim_task_with_locks`, release the file-locks held by holders that
@@ -1 +1 @@
1
- {"version":3,"file":"task-runner.d.ts","sourceRoot":"","sources":["../src/task-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"task-runner.d.ts","sourceRoot":"","sources":["../src/task-runner.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAS,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAwF,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1J,OAAO,EASL,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,yBAAyB,CAAC;AAYjC,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAkBzD,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,gBAAgB,CAAC;AAOxB,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC5B,MAAM,uBAAuB,CAAC;AAS/B,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAIL,KAAK,sBAAsB,EAC5B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAOL,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAIL,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC/B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAaL,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,0BAA0B,CAAC;AAOlC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAA6B,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAiB9F,eAAO,MAAM,wBAAwB,EAAG,oBAA6B,CAAC;AAEtE,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,OAAO,EAAK,MAAM,CAAC;IACnB,KAAK,EAAO,MAAM,CAAC;IACnB,SAAS,EAAG,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,GAAG,EAAE,YAAY,CAAC;IAClB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,EAAE,CAAC,EAAE,QAAQ,CAAC;IACd;;;;;;;oDAOgD;IAChD,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,iBAAiB,CAAC;IACnE;;;;0CAIsC;IACtC,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,8EAA8E;IAC9E,cAAc,CAAC,EAAE,OAAO,cAAc,CAAC;IACvC;;;;;;OAMG;IACH,OAAO,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC5D,gEAAgE;IAChE,cAAc,CAAC,EAAE,CACf,IAAI,EAAE,eAAe,EACrB,IAAI,CAAC,EAAE,kBAAkB,KACtB,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpD;mFAC+E;IAC/E,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD;;iFAE6E;IAC7E,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD;;;;;;;;OAQG;IACH,yBAAyB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvE;;;;;;;;;OASG;IACH,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACjD,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC9E;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnE;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,4EAA4E;IAC5E,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAAC;IAC5E;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,aAAa,GAAG,IAAI,CAAC;IACzC;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACzD;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrE;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7D;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E;;;;;;;OAOG;IACH,yBAAyB,CAAC,EAAE,CAC1B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,uBAAuB,EAC7B,IAAI,CAAC,EAAE,uBAAuB,KAC3B,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACxC;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IAC/E;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC9F;;;;;OAKG;IACH,2BAA2B,CAAC,EAAE,CAC5B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC1C;;;;;;OAMG;IACH,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IACnF;;;;;;;;OAQG;IACH,sBAAsB,CAAC,EAAE,CACvB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,eAAe,KAClB,OAAO,CAAC,cAAc,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACjC,MAAM,IAAI,IAAI,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,GACpB,aAAa,GACb,uBAAuB,GACvB,OAAO,GAIP,OAAO,GACP,eAAe,GACf,KAAK,GACL,aAAa,GAKb,YAAY,GAIZ,kBAAkB,GAClB,MAAM,GACN,SAAS,GAIT,QAAQ,GAIR,YAAY,GAMZ,iBAAiB,CAAC;AAEtB,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,IAAI,GAAG,QAAQ,GAAG,WAAW,GAAG,iBAAiB,GAAG,UAAU,GAAG,SAAS,CAAC;IACnF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;qCAEiC;IACjC,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,eAAe,CAAC;IACnC;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;;;;;;;;;OAYG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;;;;;OAOG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;;;;OAQG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,yBAAyB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3C;AAkBD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAuE3D,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAgC/B;AAUD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAIhD;AAsBD,iFAAiF;AACjF,MAAM,WAAW,wBAAwB;IACvC,4EAA4E;IAC5E,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,6DAA6D;IAC7D,SAAS,EAAE,OAAO,CAAC;IACnB,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,0EAA0E;AAC1E,eAAO,MAAM,oBAAoB,gCAAgC,CAAC;AAElE;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASrE;AA0ED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IACJ,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACpB,GACL,OAAO,CAAC,wBAAwB,CAAC,CAoFnC;AAOD,0FAA0F;AAC1F,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAO1E;AAED,oFAAoF;AACpF,MAAM,WAAW,2BAA2B;IAC1C,4HAA4H;IAC5H,KAAK,EAAE,OAAO,CAAC;IACf,0EAA0E;IAC1E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,8FAA8F;IAC9F,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,kEAAkE;IAClE,SAAS,EAAE,OAAO,CAAC;IACnB,kIAAkI;IAClI,WAAW,EAAE,OAAO,CAAC;IACrB,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IACJ,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC,GACL,OAAO,CAAC,2BAA2B,CAAC,CAuCtC;AAqCD;;;;;;;;;GASG;AACH,wBAAsB,gCAAgC,CACpD,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,EACjC,SAAS,EAAE,MAAM,EAAE,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CA2BnB;AAQD;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,cAAc,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,aAAa,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;CACtB;AAkBD,8EAA8E;AAC9E,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAEzF;AAED,yEAAyE;AACzE,wBAAgB,2BAA2B,IAAI,IAAI,CAIlD;AAED,MAAM,WAAW,yBAAyB;IACxC,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,KAAK,EAAE,OAAO,CAAC;IACf,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,yBAAyB,CAgB9E;AAmHD;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAUxF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAM3E;AAgHD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACxC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,EACxB,MAAM,SAAK,EACX,sBAAsB,GAAE,MAAM,GAAG,IAAW,GAC3C,gBAAgB,CA+BlB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB/E;AA+KD,wBAAgB,OAAO,CACrB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,WAAW,GAChB,iBAAiB,CAsnGnB"}
@@ -22,7 +22,7 @@ import { join } from "node:path";
22
22
  import { fileURLToPath, pathToFileURL } from "node:url";
23
23
  import { execa } from "execa";
24
24
  import { canServeRepo, loadProfile as defaultLoadProfile, localRepoPathFor, resolveBaseBranch } from "./config.js";
25
- import { UNRESOLVED_MODEL, engineResultModel, isPlaceholderModel, normalizeUsage, priceUsdCents, resolveSpawnModel, shouldLogPinRefusal, } from "./cost-pricing.js";
25
+ import { UNRESOLVED_MODEL, engineResultModel, isPlaceholderModel, normalizeUsage, priceUsdCents, resolveSpawnModel, shouldLogPinRefusal, toReviewerApiId, } from "./cost-pricing.js";
26
26
  import { extractResetTime, isGitProvisionContention, } from "./failure-classifier.js";
27
27
  import { getEngine, hasEngine } from "./engines/registry.js";
28
28
  import { codexReportedModelFromStderr, resolveCodexCostEventFallbackModel } from "./engines/codex.js";
@@ -41,7 +41,10 @@ import { writeMcpConfig as defaultWriteMcpConfig, readMcpConfig as defaultReadMc
41
41
  import { postRunnerStateMessage as defaultPostRunnerStateMessage, } from "./messaging.js";
42
42
  import { branchForTask, prTitleForTask, renderTaskPrompt, } from "./prompt.js";
43
43
  import { buildMemoryContext } from "./memory-context.js";
44
- import { acquireTaskLock as defaultAcquireTaskLock, TaskLockHeldError, } from "./runtime/locks.js";
44
+ import { acquireTaskLock as defaultAcquireTaskLock, clearLocalTaskLock as defaultClearLocalTaskLock, TaskLockHeldError, } from "./runtime/locks.js";
45
+ // RUNNER-HOOK-DIR-AND-LOCK-JANITOR-1: remove this task's commit-guard hooks dir
46
+ // on every exit path (the janitor is the hourly backstop for leaks a crash left).
47
+ import { removeTaskHookDir as defaultRemoveTaskHookDir } from "./runtime/janitor.js";
45
48
  import { prepareTaskWorktree as defaultPrepareTaskWorktree, WorktreeBranchTakenError, } from "./runtime/worktree.js";
46
49
  // v0.21 T-66-1: serialize the per-task worktree-provisioning critical section
47
50
  // against the shared clone so concurrent tasks can't collide on git's
@@ -726,6 +729,20 @@ async function recordPreprGateMissing(supabase, taskId, payload) {
726
729
  ...payload,
727
730
  });
728
731
  }
732
+ /**
733
+ * PREPR-GATE-MISSING-HOLD-DEAD-END-1: the head the runner OBSERVED for a branch
734
+ * whose pre-PR gate never ran, so the `prepr_gate_missing` event can carry
735
+ * `head_sha`. Prefers the open PR's head (`origin/<branch>`), falls back to the
736
+ * worktree HEAD, then null. Best-effort — the classifier tolerates its absence.
737
+ */
738
+ async function observedBranchHead(git, workdir, branch) {
739
+ if (!git.headSha)
740
+ return null;
741
+ const remote = await git.headSha(workdir, `origin/${branch}`).catch(() => null);
742
+ if (remote)
743
+ return remote;
744
+ return git.headSha(workdir, "HEAD").catch(() => null);
745
+ }
729
746
  /**
730
747
  * v0.53 T-53-4: emit a `task.first_commit` activity event the first time a
731
748
  * task's worktree produces a commit on its branch (the SLO funnel signal
@@ -786,7 +803,12 @@ export function buildCostEvent(taskId, stdout, fallbackModel, runnerId, engineId
786
803
  const parsed = getEngine(engineId).parseResult(stdout);
787
804
  const reported = engineResultModel(parsed) ??
788
805
  ((engineId ?? "claude-code") === "codex" ? codexReportedModelFromStderr(stderr) : null);
789
- const pinned = isPlaceholderModel(fallbackModel) ? "" : (fallbackModel ?? "").trim();
806
+ // MODEL-CATALOG-CLAUDE-5-5-1 (AC4): resolve the task's pinned id through the
807
+ // mirror's API channel so the cost row prices on the CONCRETE model the pin
808
+ // maps to (e.g. the short alias `opus` → claude-opus-5-5), not a stale family
809
+ // substring. A canonical id and an unknown id pass through unchanged.
810
+ const pinnedRaw = isPlaceholderModel(fallbackModel) ? "" : (fallbackModel ?? "").trim();
811
+ const pinned = pinnedRaw ? toReviewerApiId(pinnedRaw) : "";
790
812
  const codexFallback = !reported && !pinned && (engineId ?? "claude-code") === "codex"
791
813
  ? resolveCodexCostEventFallbackModel()
792
814
  : "";
@@ -1008,6 +1030,8 @@ export function runTask(taskId, deps) {
1008
1030
  // `deps.spawnClaude` (test override) is unaffected either way.
1009
1031
  const checkoutBase = deps.checkoutBase ?? defaultCheckoutBase;
1010
1032
  const acquireLock = deps.acquireLock ?? defaultAcquireTaskLock;
1033
+ const removeHookDir = deps.removeHookDir ?? defaultRemoveTaskHookDir;
1034
+ const releaseLocalLock = deps.releaseLocalLock ?? defaultClearLocalTaskLock;
1011
1035
  const prepareWorktree = deps.prepareWorktree ?? defaultPrepareTaskWorktree;
1012
1036
  const provisionRepoClone = deps.provisionRepoClone ?? ensureRepoClone;
1013
1037
  const postCostEvent = deps.postCostEvent ?? ((event) => defaultPostCostEvent(deps.supabase, event));
@@ -1379,6 +1403,18 @@ export function runTask(taskId, deps) {
1379
1403
  message: `file-lock claim race - ${taskId} is already locked by another runner; abandoning this attempt and leaving the task to the lock holder`,
1380
1404
  runner_id: deps.session.runnerId,
1381
1405
  });
1406
+ // RUNNER-HOOK-DIR-AND-LOCK-JANITOR-1: a DIFFERENT runner holds this
1407
+ // task, so any local PID lock this lane still carries is a stale
1408
+ // leftover (a reassignment) — drop it so the old lane's next claim
1409
+ // doesn't trip on a self-held lock. Only this lane's local file; a live
1410
+ // foreign holder and the holder's DB row are untouched.
1411
+ let releasedOwnLock = false;
1412
+ try {
1413
+ releasedOwnLock = await releaseLocalLock(taskId);
1414
+ }
1415
+ catch (err) {
1416
+ process.stderr.write(`[acc-runner] local lock release for reassigned ${taskId} failed: ${err.message}\n`);
1417
+ }
1382
1418
  // Greppable breadcrumb for the shape that has twice sent an
1383
1419
  // investigation to the wrong subsystem. Best-effort only.
1384
1420
  // `benign`/`released_own_locks` are the diagnostic trail this
@@ -1393,7 +1429,7 @@ export function runTask(taskId, deps) {
1393
1429
  conflicts,
1394
1430
  cause: "same_task_different_runner",
1395
1431
  benign: true,
1396
- released_own_locks: false,
1432
+ released_own_locks: releasedOwnLock,
1397
1433
  },
1398
1434
  p_target_type: "runner",
1399
1435
  });
@@ -1419,6 +1455,16 @@ export function runTask(taskId, deps) {
1419
1455
  eventRecorded: decision.eventRecorded,
1420
1456
  firstConflictAtMs: decision.firstConflictAtMs,
1421
1457
  });
1458
+ // RUNNER-HOOK-DIR-AND-LOCK-JANITOR-1 (AC3): a refusal naming OTHER holders
1459
+ // ends this attempt before acquireLock ran, so any local lock file is a
1460
+ // leftover; drop it (never a live foreign pid; the holders' rows untouched).
1461
+ let releasedOwnLock = false;
1462
+ try {
1463
+ releasedOwnLock = await releaseLocalLock(taskId);
1464
+ }
1465
+ catch (err) {
1466
+ process.stderr.write(`[acc-runner] local lock release after claim refusal for ${taskId} failed: ${err.message}\n`);
1467
+ }
1422
1468
  if (decision.event) {
1423
1469
  await appendEvent(deps.supabase, taskId, "log", {
1424
1470
  phase: decision.event.phase,
@@ -1427,6 +1473,7 @@ export function runTask(taskId, deps) {
1427
1473
  // human message below names only the OTHER holders.
1428
1474
  conflicts,
1429
1475
  lock_paths: claimLockScope,
1476
+ released_own_locks: releasedOwnLock,
1430
1477
  message: `file-lock conflict - other tasks hold overlapping paths: ${otherConflicts.join(", ")}`,
1431
1478
  runner_id: deps.session.runnerId,
1432
1479
  });
@@ -2578,6 +2625,7 @@ export function runTask(taskId, deps) {
2578
2625
  pr_url: existingPrUrl,
2579
2626
  reason: "retry_pr_exists_before_spawn",
2580
2627
  runner_id: deps.session.runnerId,
2628
+ head_sha: await observedBranchHead(git, workdir, branch),
2581
2629
  });
2582
2630
  // v0.35-B: stamp pr_number + transition running→needs-review on
2583
2631
  // the recovered task. On any failure the webhook-driven flow
@@ -2945,6 +2993,7 @@ export function runTask(taskId, deps) {
2945
2993
  pr_url: linkedPrUrl,
2946
2994
  reason: "capacity_exit_after_pr_open",
2947
2995
  runner_id: deps.session.runnerId,
2996
+ head_sha: await observedBranchHead(git, workdir, branch),
2948
2997
  });
2949
2998
  if (linkedPrUrl)
2950
2999
  await setTaskPr(deps.supabase, taskId, linkedPrUrl);
@@ -3952,6 +4001,22 @@ export function runTask(taskId, deps) {
3952
4001
  catch (err) {
3953
4002
  process.stderr.write(`[acc-runner] lock release failed: ${err.message}\n`);
3954
4003
  }
4004
+ // RUNNER-HOOK-DIR-AND-LOCK-JANITOR-1 (AC2): every exit path funnels here —
4005
+ // clear this task's lock FILE (own/dead-pid leftover; never a live foreign
4006
+ // holder) and its commit-guard hooks dir. The hourly janitor backstops a
4007
+ // crash that skips it. Best-effort.
4008
+ try {
4009
+ await releaseLocalLock(taskId);
4010
+ }
4011
+ catch (err) {
4012
+ process.stderr.write(`[acc-runner] lock file cleanup failed: ${err.message}\n`);
4013
+ }
4014
+ try {
4015
+ await removeHookDir(taskId);
4016
+ }
4017
+ catch (err) {
4018
+ process.stderr.write(`[acc-runner] hooks-dir cleanup failed: ${err.message}\n`);
4019
+ }
3955
4020
  }
3956
4021
  }
3957
4022
  finally {