@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.
- package/dist/build-info.generated.d.ts +1 -1
- package/dist/build-info.generated.js +2 -2
- package/dist/chat-lane.d.ts +20 -0
- package/dist/chat-lane.d.ts.map +1 -1
- package/dist/chat-lane.js +18 -1
- package/dist/chat-lane.js.map +1 -1
- package/dist/chat-transport.d.ts +1 -5
- package/dist/chat-transport.d.ts.map +1 -1
- package/dist/chat-transport.js +49 -0
- package/dist/chat-transport.js.map +1 -1
- package/dist/cost-pricing.d.ts +15 -0
- package/dist/cost-pricing.d.ts.map +1 -1
- package/dist/cost-pricing.js +77 -3
- package/dist/cost-pricing.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +15 -9
- package/dist/doctor.js.map +1 -1
- package/dist/engines/claude-code.d.ts +9 -0
- package/dist/engines/claude-code.d.ts.map +1 -1
- package/dist/engines/claude-code.js +11 -2
- package/dist/engines/claude-code.js.map +1 -1
- package/dist/mcp-spawn.d.ts +1 -1
- package/dist/mcp-spawn.js +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +8 -1
- package/dist/program.js.map +1 -1
- package/dist/runtime/janitor.d.ts +48 -0
- package/dist/runtime/janitor.d.ts.map +1 -0
- package/dist/runtime/janitor.js +166 -0
- package/dist/runtime/janitor.js.map +1 -0
- package/dist/runtime/locks.d.ts +9 -0
- package/dist/runtime/locks.d.ts.map +1 -1
- package/dist/runtime/locks.js +23 -0
- package/dist/runtime/locks.js.map +1 -1
- package/dist/supervisor.d.ts +24 -10
- package/dist/supervisor.d.ts.map +1 -1
- package/dist/supervisor.js +20 -11
- package/dist/supervisor.js.map +1 -1
- package/dist/task-runner.d.ts +7 -0
- package/dist/task-runner.d.ts.map +1 -1
- package/dist/task-runner.js +69 -4
- package/dist/task-runner.js.map +1 -1
- package/dist/watch.d.ts +30 -11
- package/dist/watch.d.ts.map +1 -1
- package/dist/watch.js +94 -17
- package/dist/watch.js.map +1 -1
- package/package.json +1 -1
- 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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"}
|
package/dist/runtime/locks.d.ts
CHANGED
|
@@ -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"}
|
package/dist/runtime/locks.js
CHANGED
|
@@ -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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"}
|
package/dist/supervisor.d.ts
CHANGED
|
@@ -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
|
|
36
|
-
* restart-loop half of the incident;
|
|
37
|
-
* shape. Pure and fs-free like the
|
|
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
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
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
|
package/dist/supervisor.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/supervisor.js
CHANGED
|
@@ -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
|
|
69
|
-
* restart-loop half of the incident;
|
|
70
|
-
* shape. Pure and fs-free like the
|
|
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
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
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=${
|
|
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.
|
package/dist/supervisor.js.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../src/supervisor.ts"],"names":[],"mappings":"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"}
|
package/dist/task-runner.d.ts
CHANGED
|
@@ -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":"AAsBA,OAAO,EAAS,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAwF,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1J,OAAO,
|
|
1
|
+
{"version":3,"file":"task-runner.d.ts","sourceRoot":"","sources":["../src/task-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/task-runner.js
CHANGED
|
@@ -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
|
-
|
|
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:
|
|
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 {
|