@tokenfactory/acc-runner 0.2.0-internal
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/README.md +116 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +77 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +48 -0
- package/dist/config.js.map +1 -0
- package/dist/doctor.d.ts +13 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +251 -0
- package/dist/doctor.js.map +1 -0
- package/dist/gh.d.ts +16 -0
- package/dist/gh.d.ts.map +1 -0
- package/dist/gh.js +37 -0
- package/dist/gh.js.map +1 -0
- package/dist/git.d.ts +9 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +25 -0
- package/dist/git.js.map +1 -0
- package/dist/keychain.d.ts +21 -0
- package/dist/keychain.d.ts.map +1 -0
- package/dist/keychain.js +45 -0
- package/dist/keychain.js.map +1 -0
- package/dist/login.d.ts +8 -0
- package/dist/login.d.ts.map +1 -0
- package/dist/login.js +124 -0
- package/dist/login.js.map +1 -0
- package/dist/logout.d.ts +2 -0
- package/dist/logout.d.ts.map +1 -0
- package/dist/logout.js +31 -0
- package/dist/logout.js.map +1 -0
- package/dist/prompt.d.ts +38 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +78 -0
- package/dist/prompt.js.map +1 -0
- package/dist/supabase.d.ts +4 -0
- package/dist/supabase.d.ts.map +1 -0
- package/dist/supabase.js +22 -0
- package/dist/supabase.js.map +1 -0
- package/dist/task-runner.d.ts +48 -0
- package/dist/task-runner.d.ts.map +1 -0
- package/dist/task-runner.js +222 -0
- package/dist/task-runner.js.map +1 -0
- package/dist/types.d.ts +77 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/version-check.d.ts +17 -0
- package/dist/version-check.d.ts.map +1 -0
- package/dist/version-check.js +40 -0
- package/dist/version-check.js.map +1 -0
- package/dist/watch.d.ts +12 -0
- package/dist/watch.d.ts.map +1 -0
- package/dist/watch.js +132 -0
- package/dist/watch.js.map +1 -0
- package/package.json +36 -0
package/dist/git.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin git wrappers using execa. The CLI never edits the user's git
|
|
3
|
+
* config — it relies on whatever credentials they already have set up.
|
|
4
|
+
*/
|
|
5
|
+
import { execa } from "execa";
|
|
6
|
+
async function run(repoPath, args) {
|
|
7
|
+
return execa("git", args, { cwd: repoPath, env: process.env });
|
|
8
|
+
}
|
|
9
|
+
export const git = {
|
|
10
|
+
async fetch(repoPath) {
|
|
11
|
+
await run(repoPath, ["fetch", "--prune", "--all"]);
|
|
12
|
+
},
|
|
13
|
+
async checkout(repoPath, branch) {
|
|
14
|
+
// First try `checkout -B`, which also creates the branch if missing.
|
|
15
|
+
await run(repoPath, ["checkout", "-B", branch]);
|
|
16
|
+
},
|
|
17
|
+
async push(repoPath, branch) {
|
|
18
|
+
await run(repoPath, ["push", "-u", "origin", branch]);
|
|
19
|
+
},
|
|
20
|
+
async isClean(repoPath) {
|
|
21
|
+
const { stdout } = await run(repoPath, ["status", "--porcelain"]);
|
|
22
|
+
return stdout.trim().length === 0;
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=git.js.map
|
package/dist/git.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,KAAK,EAA0B,MAAM,OAAO,CAAC;AAUtD,KAAK,UAAU,GAAG,CAAC,QAAgB,EAAE,IAAc;IACjD,OAAO,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAc;IAC5B,KAAK,CAAC,KAAK,CAAC,QAAQ;QAClB,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM;QAC7B,qEAAqE;QACrE,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM;QACzB,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,QAAQ;QACpB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;QAClE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;IACpC,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OS-keychain wrapper around `keytar`. The CLI never persists a JWT to
|
|
3
|
+
* disk in plaintext — keychain is the only writable surface.
|
|
4
|
+
*
|
|
5
|
+
* keytar is a native module; we lazy-import so commands that don't need
|
|
6
|
+
* credentials (`--version`, `--help`) still work on systems where the
|
|
7
|
+
* binding has not built (`linux` headless CI without libsecret, etc).
|
|
8
|
+
*/
|
|
9
|
+
import { type StoredSession } from "./types.js";
|
|
10
|
+
type KeytarLike = {
|
|
11
|
+
setPassword(service: string, account: string, password: string): Promise<void>;
|
|
12
|
+
getPassword(service: string, account: string): Promise<string | null>;
|
|
13
|
+
deletePassword(service: string, account: string): Promise<boolean>;
|
|
14
|
+
};
|
|
15
|
+
export declare function saveSession(session: StoredSession): Promise<void>;
|
|
16
|
+
export declare function loadSession(): Promise<StoredSession | null>;
|
|
17
|
+
export declare function clearSession(): Promise<boolean>;
|
|
18
|
+
/** Test-only seam used by the keychain test (overrides the lazy import). */
|
|
19
|
+
export declare function __setKeytar(impl: KeytarLike | null): void;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=keychain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAA2B,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAIzE,KAAK,UAAU,GAAG;IAChB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACtE,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpE,CAAC;AAYF,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvE;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAUjE;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAGrD;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAEzD"}
|
package/dist/keychain.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OS-keychain wrapper around `keytar`. The CLI never persists a JWT to
|
|
3
|
+
* disk in plaintext — keychain is the only writable surface.
|
|
4
|
+
*
|
|
5
|
+
* keytar is a native module; we lazy-import so commands that don't need
|
|
6
|
+
* credentials (`--version`, `--help`) still work on systems where the
|
|
7
|
+
* binding has not built (`linux` headless CI without libsecret, etc).
|
|
8
|
+
*/
|
|
9
|
+
import { RUNNER_KEYCHAIN_SERVICE } from "./types.js";
|
|
10
|
+
const ACCOUNT = "default";
|
|
11
|
+
let cached = null;
|
|
12
|
+
async function getKeytar() {
|
|
13
|
+
if (cached)
|
|
14
|
+
return cached;
|
|
15
|
+
// Dynamic import keeps native-binding failures out of the cold path.
|
|
16
|
+
const mod = (await import("keytar"));
|
|
17
|
+
cached = (mod.default ?? mod);
|
|
18
|
+
return cached;
|
|
19
|
+
}
|
|
20
|
+
export async function saveSession(session) {
|
|
21
|
+
const k = await getKeytar();
|
|
22
|
+
await k.setPassword(RUNNER_KEYCHAIN_SERVICE, ACCOUNT, JSON.stringify(session));
|
|
23
|
+
}
|
|
24
|
+
export async function loadSession() {
|
|
25
|
+
const k = await getKeytar();
|
|
26
|
+
const raw = await k.getPassword(RUNNER_KEYCHAIN_SERVICE, ACCOUNT);
|
|
27
|
+
if (!raw)
|
|
28
|
+
return null;
|
|
29
|
+
try {
|
|
30
|
+
return JSON.parse(raw);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// Corrupted entry — treat as "not logged in" rather than crashing.
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export async function clearSession() {
|
|
38
|
+
const k = await getKeytar();
|
|
39
|
+
return k.deletePassword(RUNNER_KEYCHAIN_SERVICE, ACCOUNT);
|
|
40
|
+
}
|
|
41
|
+
/** Test-only seam used by the keychain test (overrides the lazy import). */
|
|
42
|
+
export function __setKeytar(impl) {
|
|
43
|
+
cached = impl;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=keychain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,uBAAuB,EAAsB,MAAM,YAAY,CAAC;AAEzE,MAAM,OAAO,GAAG,SAAkB,CAAC;AAQnC,IAAI,MAAM,GAAsB,IAAI,CAAC;AAErC,KAAK,UAAU,SAAS;IACtB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,qEAAqE;IACrE,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAqD,CAAC;IACzF,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAe,CAAC;IAC5C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAsB;IACtD,MAAM,CAAC,GAAG,MAAM,SAAS,EAAE,CAAC;IAC5B,MAAM,CAAC,CAAC,WAAW,CAAC,uBAAuB,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,CAAC,GAAG,MAAM,SAAS,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,WAAW,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;IAClE,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,CAAC,GAAG,MAAM,SAAS,EAAE,CAAC;IAC5B,OAAO,CAAC,CAAC,cAAc,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,WAAW,CAAC,IAAuB;IACjD,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC"}
|
package/dist/login.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface LoginOptions {
|
|
2
|
+
/** Override the polling interval seconds (mostly for tests). */
|
|
3
|
+
intervalSeconds?: number;
|
|
4
|
+
/** Override the timeout (seconds) to abort polling. */
|
|
5
|
+
timeoutSeconds?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function loginCommand(options?: LoginOptions): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAwEA,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqE5E"}
|
package/dist/login.js
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `acc-runner login` — device-code OAuth flow.
|
|
3
|
+
*
|
|
4
|
+
* 1. Ask the server for a (device_code, user_code) pair.
|
|
5
|
+
* 2. Print the verification URL + user_code.
|
|
6
|
+
* 3. Poll the exchange endpoint until the user signs in via the browser.
|
|
7
|
+
* 4. Store the resulting JWT in the OS keychain.
|
|
8
|
+
* 5. Register a runner row in acc.runners via the existing register_runner
|
|
9
|
+
* RPC so the user sees this machine in the Runners page.
|
|
10
|
+
*/
|
|
11
|
+
import os from "node:os";
|
|
12
|
+
import { setTimeout as sleep } from "node:timers/promises";
|
|
13
|
+
import chalk from "chalk";
|
|
14
|
+
import { execa } from "execa";
|
|
15
|
+
import { loadConfig } from "./config.js";
|
|
16
|
+
import { saveSession } from "./keychain.js";
|
|
17
|
+
import { createRunnerClient } from "./supabase.js";
|
|
18
|
+
import { PROTOCOL_VERSION } from "./types.js";
|
|
19
|
+
const RUNNER_CAPS = {
|
|
20
|
+
branch: true,
|
|
21
|
+
push: true,
|
|
22
|
+
pr: true,
|
|
23
|
+
typecheck: true,
|
|
24
|
+
readFiles: true,
|
|
25
|
+
executeQueue: true,
|
|
26
|
+
};
|
|
27
|
+
function randomSuffix(n = 4) {
|
|
28
|
+
const alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
|
|
29
|
+
let out = "";
|
|
30
|
+
for (let i = 0; i < n; i++)
|
|
31
|
+
out += alphabet[Math.floor(Math.random() * alphabet.length)];
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
async function detectInstalledModels() {
|
|
35
|
+
const out = [];
|
|
36
|
+
for (const bin of ["claude", "codex"]) {
|
|
37
|
+
try {
|
|
38
|
+
await execa(bin, ["--version"], { env: process.env });
|
|
39
|
+
if (bin === "claude") {
|
|
40
|
+
out.push("claude-sonnet-4", "claude-code");
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
out.push("codex");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// not installed
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
async function postJson(url, body) {
|
|
53
|
+
const res = await fetch(url, {
|
|
54
|
+
method: "POST",
|
|
55
|
+
headers: {
|
|
56
|
+
"Content-Type": "application/json",
|
|
57
|
+
"User-Agent": `acc-runner/${PROTOCOL_VERSION}`,
|
|
58
|
+
},
|
|
59
|
+
body: JSON.stringify(body ?? {}),
|
|
60
|
+
});
|
|
61
|
+
if (!res.ok) {
|
|
62
|
+
throw new Error(`POST ${url} failed: ${res.status} ${await res.text()}`);
|
|
63
|
+
}
|
|
64
|
+
return (await res.json());
|
|
65
|
+
}
|
|
66
|
+
export async function loginCommand(options = {}) {
|
|
67
|
+
const cfg = loadConfig();
|
|
68
|
+
// 1. Request a device code.
|
|
69
|
+
const start = await postJson(`${cfg.publicUrl.replace(/\/+$/, "")}/api/runner/device-code`, {});
|
|
70
|
+
console.log("");
|
|
71
|
+
console.log(chalk.bold("To continue, sign in with your ACC account:"));
|
|
72
|
+
console.log("");
|
|
73
|
+
console.log(` ${chalk.cyan("1.")} Visit ${chalk.underline(start.verification_url)}`);
|
|
74
|
+
console.log(` ${chalk.cyan("2.")} Enter code: ${chalk.bold.green(start.user_code)}`);
|
|
75
|
+
console.log("");
|
|
76
|
+
console.log(chalk.gray("Waiting for confirmation…"));
|
|
77
|
+
// 2. Poll the exchange endpoint.
|
|
78
|
+
const interval = (options.intervalSeconds ?? start.interval) * 1000;
|
|
79
|
+
const deadline = Date.now() + (options.timeoutSeconds ?? start.expires_in) * 1000;
|
|
80
|
+
let exchanged = null;
|
|
81
|
+
while (Date.now() < deadline) {
|
|
82
|
+
await sleep(interval);
|
|
83
|
+
const exchange = await postJson(`${cfg.publicUrl.replace(/\/+$/, "")}/api/runner/device-code/exchange`, { device_code: start.device_code });
|
|
84
|
+
if (exchange.status === "expired") {
|
|
85
|
+
throw new Error("Device code expired before sign-in completed. Run `acc-runner login` again.");
|
|
86
|
+
}
|
|
87
|
+
if (exchange.status === "ok") {
|
|
88
|
+
exchanged = exchange;
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (!exchanged || exchanged.status !== "ok") {
|
|
93
|
+
throw new Error("Device code timed out before sign-in completed.");
|
|
94
|
+
}
|
|
95
|
+
console.log(chalk.green(`✓ Logged in as ${exchanged.email ?? exchanged.user_id}`));
|
|
96
|
+
// 3. Build runner identity and save the session.
|
|
97
|
+
const hostname = os.hostname().replace(/[^a-z0-9-]+/gi, "-").toLowerCase().slice(0, 32);
|
|
98
|
+
const runnerId = `local-${hostname}-${randomSuffix(4)}`;
|
|
99
|
+
await saveSession({
|
|
100
|
+
jwt: exchanged.jwt,
|
|
101
|
+
email: exchanged.email,
|
|
102
|
+
user_id: exchanged.user_id,
|
|
103
|
+
runner_id: runnerId,
|
|
104
|
+
});
|
|
105
|
+
console.log(chalk.green(`✓ Stored token in OS keychain (acc-runner)`));
|
|
106
|
+
// 4. Register the runner row. RPC is provided by migration 0019.
|
|
107
|
+
const supabase = createRunnerClient(cfg, exchanged.jwt);
|
|
108
|
+
const models = await detectInstalledModels();
|
|
109
|
+
const { error } = await supabase.rpc("register_runner", {
|
|
110
|
+
p_id: runnerId,
|
|
111
|
+
p_name: `${exchanged.email ?? exchanged.user_id}'s ${os.hostname()}`,
|
|
112
|
+
p_owner: exchanged.email ?? exchanged.user_id,
|
|
113
|
+
p_machine: `${process.platform}-${process.arch}`,
|
|
114
|
+
p_models: models,
|
|
115
|
+
p_caps: RUNNER_CAPS,
|
|
116
|
+
});
|
|
117
|
+
if (error) {
|
|
118
|
+
throw new Error(`register_runner failed: ${error.message}`);
|
|
119
|
+
}
|
|
120
|
+
console.log(chalk.green(`✓ Registered runner: ${runnerId}`));
|
|
121
|
+
console.log("");
|
|
122
|
+
console.log(`Run ${chalk.bold("acc-runner watch")} to start receiving tasks.`);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
|
package/dist/logout.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../src/logout.ts"],"names":[],"mappings":"AAQA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA2BnD"}
|
package/dist/logout.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `acc-runner logout` — clear keychain entry, mark runner offline.
|
|
3
|
+
*/
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import { loadConfig } from "./config.js";
|
|
6
|
+
import { clearSession, loadSession } from "./keychain.js";
|
|
7
|
+
import { createRunnerClient } from "./supabase.js";
|
|
8
|
+
export async function logoutCommand() {
|
|
9
|
+
const session = await loadSession();
|
|
10
|
+
if (!session) {
|
|
11
|
+
console.log(chalk.gray("Already signed out."));
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
// Best-effort: mark the runner offline. Don't block the logout if the
|
|
15
|
+
// server is unreachable.
|
|
16
|
+
try {
|
|
17
|
+
const cfg = loadConfig();
|
|
18
|
+
const supabase = createRunnerClient(cfg, session.jwt);
|
|
19
|
+
await supabase.rpc("set_runner_status", {
|
|
20
|
+
p_id: session.runner_id,
|
|
21
|
+
p_status: "offline",
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
console.log(chalk.yellow(`! Could not mark runner offline (${err.message}). Clearing local session anyway.`));
|
|
26
|
+
}
|
|
27
|
+
await clearSession();
|
|
28
|
+
console.log(chalk.green("✓ Cleared keychain entry."));
|
|
29
|
+
console.log(chalk.green(`✓ Runner ${session.runner_id} marked offline.`));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../src/logout.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;IACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,sEAAsE;IACtE,yBAAyB;IACzB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,QAAQ,CAAC,GAAG,CAAC,mBAAmB,EAAE;YACtC,IAAI,EAAE,OAAO,CAAC,SAAS;YACvB,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,oCAAqC,GAAa,CAAC,OAAO,mCAAmC,CAC9F,CACF,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,EAAE,CAAC;IACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,SAAS,kBAAkB,CAAC,CAAC,CAAC;AAC5E,CAAC"}
|
package/dist/prompt.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* renderTaskPrompt — duplicated slim copy of src/lib/promptTemplate.ts.
|
|
3
|
+
*
|
|
4
|
+
* Adds the two RUNNER_PROTOCOL §3.2 mandatory header lines (Branch + PR
|
|
5
|
+
* title + base branch) so the agent emits a PR ACC can match by webhook.
|
|
6
|
+
*
|
|
7
|
+
* v0.3 dedupes via a shared workspace package; for now we keep the small
|
|
8
|
+
* function here so the CLI stays a single-package install.
|
|
9
|
+
*/
|
|
10
|
+
export interface RenderTaskInput {
|
|
11
|
+
task: {
|
|
12
|
+
id: string;
|
|
13
|
+
title: string;
|
|
14
|
+
description?: string | null;
|
|
15
|
+
branch?: string | null;
|
|
16
|
+
typecheck_cmd?: string | null;
|
|
17
|
+
acceptance: string[];
|
|
18
|
+
allowed: string[];
|
|
19
|
+
forbidden: string[];
|
|
20
|
+
};
|
|
21
|
+
agent: {
|
|
22
|
+
name?: string;
|
|
23
|
+
} | null;
|
|
24
|
+
model: {
|
|
25
|
+
name?: string;
|
|
26
|
+
} | null;
|
|
27
|
+
contracts?: Array<{
|
|
28
|
+
name: string;
|
|
29
|
+
version?: string;
|
|
30
|
+
status?: string;
|
|
31
|
+
}>;
|
|
32
|
+
integrationBranch?: string;
|
|
33
|
+
targetRepo?: string;
|
|
34
|
+
}
|
|
35
|
+
export declare function branchForTask(taskId: string, title: string, branch: string | null | undefined): string;
|
|
36
|
+
export declare function prTitleForTask(taskId: string, title: string): string;
|
|
37
|
+
export declare function renderTaskPrompt(input: RenderTaskInput): string;
|
|
38
|
+
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAChC,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAChC,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAUD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAGtG;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAsE/D"}
|
package/dist/prompt.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* renderTaskPrompt — duplicated slim copy of src/lib/promptTemplate.ts.
|
|
3
|
+
*
|
|
4
|
+
* Adds the two RUNNER_PROTOCOL §3.2 mandatory header lines (Branch + PR
|
|
5
|
+
* title + base branch) so the agent emits a PR ACC can match by webhook.
|
|
6
|
+
*
|
|
7
|
+
* v0.3 dedupes via a shared workspace package; for now we keep the small
|
|
8
|
+
* function here so the CLI stays a single-package install.
|
|
9
|
+
*/
|
|
10
|
+
function slug(title) {
|
|
11
|
+
return title
|
|
12
|
+
.toLowerCase()
|
|
13
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
14
|
+
.replace(/^-+|-+$/g, "")
|
|
15
|
+
.slice(0, 40) || "task";
|
|
16
|
+
}
|
|
17
|
+
export function branchForTask(taskId, title, branch) {
|
|
18
|
+
if (branch && branch.trim())
|
|
19
|
+
return branch.trim();
|
|
20
|
+
return `acc/${taskId}-${slug(title)}`;
|
|
21
|
+
}
|
|
22
|
+
export function prTitleForTask(taskId, title) {
|
|
23
|
+
return `[${taskId}] ${title}`;
|
|
24
|
+
}
|
|
25
|
+
export function renderTaskPrompt(input) {
|
|
26
|
+
const { task, agent, model } = input;
|
|
27
|
+
const integrationBranch = input.integrationBranch ?? "acc/integration";
|
|
28
|
+
const targetRepo = input.targetRepo ?? "tokenfactory-pvt-ltd/TechArch";
|
|
29
|
+
const branch = branchForTask(task.id, task.title, task.branch);
|
|
30
|
+
const prTitle = prTitleForTask(task.id, task.title);
|
|
31
|
+
const lines = [];
|
|
32
|
+
// Mandatory protocol header — RUNNER_PROTOCOL §3.2.
|
|
33
|
+
lines.push(`**Branch:** ${branch}`);
|
|
34
|
+
lines.push(`**PR title:** ${prTitle}`);
|
|
35
|
+
lines.push(`**Open the PR against:** ${integrationBranch} on ${targetRepo}.`);
|
|
36
|
+
lines.push("");
|
|
37
|
+
lines.push(`# Task ${task.id}: ${task.title}`);
|
|
38
|
+
lines.push("");
|
|
39
|
+
if (agent?.name || model?.name) {
|
|
40
|
+
lines.push(`You are ${agent?.name ?? "an AI agent"}. You will be running this task on ${model?.name ?? "a model"}.`);
|
|
41
|
+
lines.push("");
|
|
42
|
+
}
|
|
43
|
+
if (task.description) {
|
|
44
|
+
lines.push("## Description");
|
|
45
|
+
lines.push(task.description);
|
|
46
|
+
lines.push("");
|
|
47
|
+
}
|
|
48
|
+
lines.push("## Allowed file scope");
|
|
49
|
+
lines.push(...(task.allowed.length ? task.allowed.map((f) => `- ${f}`) : ["- (no scope restrictions)"]));
|
|
50
|
+
lines.push("");
|
|
51
|
+
lines.push("## Forbidden files (DO NOT TOUCH)");
|
|
52
|
+
lines.push(...(task.forbidden.length ? task.forbidden.map((f) => `- ${f}`) : ["- (none)"]));
|
|
53
|
+
lines.push("");
|
|
54
|
+
if (input.contracts?.length) {
|
|
55
|
+
lines.push("## Contracts in force");
|
|
56
|
+
lines.push(...input.contracts.map((c) => `- ${c.name}${c.version ? ` ${c.version}` : ""}${c.status ? ` (${c.status})` : ""}`));
|
|
57
|
+
lines.push("");
|
|
58
|
+
}
|
|
59
|
+
lines.push("## Acceptance criteria");
|
|
60
|
+
lines.push(...(task.acceptance.length ? task.acceptance.map((a) => `- ${a}`) : ["- (none)"]));
|
|
61
|
+
lines.push("");
|
|
62
|
+
lines.push("## Required report format (PR body)");
|
|
63
|
+
lines.push("- Summary (3 sentences)");
|
|
64
|
+
lines.push("- Files changed (path, +added/-removed)");
|
|
65
|
+
lines.push("- Implemented");
|
|
66
|
+
lines.push("- Not implemented");
|
|
67
|
+
lines.push("- Risks");
|
|
68
|
+
lines.push("- Follow-ups");
|
|
69
|
+
lines.push("- Verification (typecheck/lint/build/test/manual)");
|
|
70
|
+
lines.push("");
|
|
71
|
+
if (task.typecheck_cmd) {
|
|
72
|
+
lines.push("## Typecheck");
|
|
73
|
+
lines.push(`Run \`${task.typecheck_cmd}\` after edits and include the result in the report.`);
|
|
74
|
+
lines.push("");
|
|
75
|
+
}
|
|
76
|
+
return lines.join("\n");
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { RunnerConfig } from "./config.js";
|
|
2
|
+
export declare function createRunnerClient(cfg: RunnerConfig, jwt: string): import("@supabase/supabase-js").SupabaseClient<any, "public", "acc", any, any>;
|
|
3
|
+
export type RunnerSupabaseClient = ReturnType<typeof createRunnerClient>;
|
|
4
|
+
//# sourceMappingURL=supabase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../src/supabase.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,kFAchE;AAED,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
|
package/dist/supabase.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supabase client factory for the CLI. Authenticates with the user's
|
|
3
|
+
* stored JWT (loaded from keychain) so RLS / acc.is_member() resolve
|
|
4
|
+
* correctly on every RPC.
|
|
5
|
+
*/
|
|
6
|
+
import { createClient } from "@supabase/supabase-js";
|
|
7
|
+
export function createRunnerClient(cfg, jwt) {
|
|
8
|
+
return createClient(cfg.supabaseUrl, cfg.supabaseAnonKey, {
|
|
9
|
+
db: { schema: "acc" },
|
|
10
|
+
auth: {
|
|
11
|
+
persistSession: false,
|
|
12
|
+
autoRefreshToken: false,
|
|
13
|
+
detectSessionInUrl: false,
|
|
14
|
+
},
|
|
15
|
+
global: {
|
|
16
|
+
headers: {
|
|
17
|
+
Authorization: `Bearer ${jwt}`,
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=supabase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.js","sourceRoot":"","sources":["../src/supabase.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,MAAM,UAAU,kBAAkB,CAAC,GAAiB,EAAE,GAAW;IAC/D,OAAO,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,eAAe,EAAE;QACxD,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACrB,IAAI,EAAE;YACJ,cAAc,EAAE,KAAK;YACrB,gBAAgB,EAAE,KAAK;YACvB,kBAAkB,EAAE,KAAK;SAC1B;QACD,MAAM,EAAE;YACN,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,GAAG,EAAE;aAC/B;SACF;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task execution path. Called by watch.ts when a task_assigned broadcast
|
|
3
|
+
* lands on the runner channel.
|
|
4
|
+
*
|
|
5
|
+
* 1. Transition task → running (RPC).
|
|
6
|
+
* 2. fetch_task_for_runner to get the task + adjacent agent/model/runner.
|
|
7
|
+
* 3. Render the prompt, ensure repo is fresh, branch is checked out.
|
|
8
|
+
* 4. Spawn `claude --print` with the prompt on stdin; pipe stdout/stderr
|
|
9
|
+
* to acc.append_task_event so the History tab updates live.
|
|
10
|
+
* 5. On success, push the branch and open a PR via `gh`.
|
|
11
|
+
* 6. On failure, transition → failed and emit an error task_event.
|
|
12
|
+
*
|
|
13
|
+
* Cancellation: watch.ts holds a reference to the running child via the
|
|
14
|
+
* returned controller and SIGTERMs it on task_cancelled.
|
|
15
|
+
*/
|
|
16
|
+
import { type ExecaChildProcess } from "execa";
|
|
17
|
+
import type { RunnerConfig } from "./config.js";
|
|
18
|
+
import { type GitRunner } from "./git.js";
|
|
19
|
+
import { type GhRunner } from "./gh.js";
|
|
20
|
+
import type { RunnerSupabaseClient } from "./supabase.js";
|
|
21
|
+
export interface RunTaskDeps {
|
|
22
|
+
supabase: RunnerSupabaseClient;
|
|
23
|
+
cfg: RunnerConfig;
|
|
24
|
+
git?: GitRunner;
|
|
25
|
+
gh?: GhRunner;
|
|
26
|
+
/** Override for tests — defaults to execa('claude', ['--print']). */
|
|
27
|
+
spawnClaude?: (cwd: string) => ExecaChildProcess;
|
|
28
|
+
}
|
|
29
|
+
export interface RunTaskController {
|
|
30
|
+
taskId: string;
|
|
31
|
+
promise: Promise<RunTaskOutcome>;
|
|
32
|
+
cancel(): void;
|
|
33
|
+
}
|
|
34
|
+
export interface RunTaskOutcome {
|
|
35
|
+
taskId: string;
|
|
36
|
+
status: "ok" | "failed" | "cancelled";
|
|
37
|
+
prUrl?: string;
|
|
38
|
+
exitCode?: number | null;
|
|
39
|
+
error?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Pull the structured report block from claude's stdout. Falls back to
|
|
43
|
+
* the entire stdout (capped) if no `## Summary` heading is present —
|
|
44
|
+
* that way the PR body still tells the reviewer what happened.
|
|
45
|
+
*/
|
|
46
|
+
export declare function extractReportFromOutput(stdout: string): string;
|
|
47
|
+
export declare function runTask(taskId: string, deps: RunTaskDeps): RunTaskController;
|
|
48
|
+
//# sourceMappingURL=task-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-runner.d.ts","sourceRoot":"","sources":["../src/task-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAS,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAMzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAG1D,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,qEAAqE;IACrE,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,iBAAiB,CAAC;CAClD;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACjC,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,IAAI,GAAG,QAAQ,GAAG,WAAW,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAwDD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ9D;AAED,wBAAgB,OAAO,CACrB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,WAAW,GAChB,iBAAiB,CAwJnB"}
|