@tokenfactory/acc-runner 0.41.7 → 0.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +87 -4
- package/dist/acc.d.ts +3 -0
- package/dist/acc.d.ts.map +1 -0
- package/dist/acc.js +21 -0
- package/dist/acc.js.map +1 -0
- package/dist/cli-name.d.ts +29 -0
- package/dist/cli-name.d.ts.map +1 -0
- package/dist/cli-name.js +17 -0
- package/dist/cli-name.js.map +1 -0
- package/dist/cli.d.ts +20 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +45 -289
- package/dist/cli.js.map +1 -1
- package/dist/keychain.d.ts +17 -0
- package/dist/keychain.d.ts.map +1 -1
- package/dist/keychain.js +36 -0
- package/dist/keychain.js.map +1 -1
- package/dist/login.d.ts +45 -1
- package/dist/login.d.ts.map +1 -1
- package/dist/login.js +91 -4
- package/dist/login.js.map +1 -1
- package/dist/program.d.ts +16 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +342 -0
- package/dist/program.js.map +1 -0
- package/dist/user-auth/device-login.d.ts +47 -0
- package/dist/user-auth/device-login.d.ts.map +1 -0
- package/dist/user-auth/device-login.js +189 -0
- package/dist/user-auth/device-login.js.map +1 -0
- package/dist/user-auth/liveness.d.ts +27 -0
- package/dist/user-auth/liveness.d.ts.map +1 -0
- package/dist/user-auth/liveness.js +128 -0
- package/dist/user-auth/liveness.js.map +1 -0
- package/dist/user-auth/session.d.ts +82 -0
- package/dist/user-auth/session.d.ts.map +1 -0
- package/dist/user-auth/session.js +172 -0
- package/dist/user-auth/session.js.map +1 -0
- package/dist/user-cli/chat.d.ts +44 -0
- package/dist/user-cli/chat.d.ts.map +1 -0
- package/dist/user-cli/chat.js +199 -0
- package/dist/user-cli/chat.js.map +1 -0
- package/dist/user-cli/client.d.ts +20 -0
- package/dist/user-cli/client.d.ts.map +1 -0
- package/dist/user-cli/client.js +60 -0
- package/dist/user-cli/client.js.map +1 -0
- package/dist/user-cli/tasks.d.ts +37 -0
- package/dist/user-cli/tasks.d.ts.map +1 -0
- package/dist/user-cli/tasks.js +131 -0
- package/dist/user-cli/tasks.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type GoTrueDeps, type StoredUserSession } from "./session.js";
|
|
2
|
+
export declare const DEVICE_CODE_PATH = "/api/auth/device-code";
|
|
3
|
+
/** Consecutive transient exchange failures tolerated before giving up. */
|
|
4
|
+
export declare const MAX_POLL_FAILURES = 5;
|
|
5
|
+
export interface DeviceLoginDeps extends GoTrueDeps {
|
|
6
|
+
sleep?: (ms: number) => Promise<unknown>;
|
|
7
|
+
openBrowser?: (url: string) => Promise<unknown>;
|
|
8
|
+
log?: (line: string) => void;
|
|
9
|
+
/** Override the polling cadence / deadline (tests). */
|
|
10
|
+
intervalSeconds?: number;
|
|
11
|
+
timeoutSeconds?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Run the whole handshake and return the session, WITHOUT persisting it — so the
|
|
15
|
+
* flow is testable end to end and the keychain write stays one explicit step in
|
|
16
|
+
* the command below.
|
|
17
|
+
*
|
|
18
|
+
* A transient failure (503 `retry`, a cold function, a pooler hiccup) must not
|
|
19
|
+
* abort a login whose code is still valid: it is counted, not fatal, and the
|
|
20
|
+
* real deadline is the code's TTL. This is the DEVICE-BIND-FIX rule the runner
|
|
21
|
+
* lane learned the hard way — only `expired` is terminal.
|
|
22
|
+
*/
|
|
23
|
+
export declare function deviceLogin(deps?: DeviceLoginDeps): Promise<StoredUserSession>;
|
|
24
|
+
export declare function authLoginCommand(deps?: DeviceLoginDeps): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* "Am I still signed in?" — which is a question about the SERVER's copy of the
|
|
27
|
+
* session, not this machine's. A keychain entry alone proves nothing: the session
|
|
28
|
+
* may have been revoked from Settings → Sessions while this terminal was closed,
|
|
29
|
+
* and the stored access token would still look perfectly valid. So the local facts
|
|
30
|
+
* are printed first (they work offline) and then the server is asked.
|
|
31
|
+
*/
|
|
32
|
+
export declare function authStatusCommand(deps?: DeviceLoginDeps): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Sign out for real. Deleting the keychain entry alone would leave the session
|
|
35
|
+
* live in `auth.sessions` — visible on the sessions surface, refreshable by
|
|
36
|
+
* anyone who had copied the token. So GoTrue is told first, and the local copy
|
|
37
|
+
* is removed whether or not that call reached it (an offline machine must still
|
|
38
|
+
* be able to drop its credential).
|
|
39
|
+
*
|
|
40
|
+
* `scope=local` is not a nicety, it is the whole contract of this command:
|
|
41
|
+
* GoTrue's default scope is GLOBAL, which would also sign the operator out of
|
|
42
|
+
* their browser and every other terminal. "Log this terminal out" must mean
|
|
43
|
+
* exactly one session — the one this keychain entry holds.
|
|
44
|
+
*/
|
|
45
|
+
export declare const LOGOUT_PATH = "/auth/v1/logout?scope=local";
|
|
46
|
+
export declare function authLogoutCommand(deps?: DeviceLoginDeps): Promise<void>;
|
|
47
|
+
//# sourceMappingURL=device-login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-login.d.ts","sourceRoot":"","sources":["../../src/user-auth/device-login.ts"],"names":[],"mappings":"AAqBA,OAAO,EAML,KAAK,UAAU,EACf,KAAK,iBAAiB,EACvB,MAAM,cAAc,CAAC;AAGtB,eAAO,MAAM,gBAAgB,0BAA0B,CAAC;AAuBxD,0EAA0E;AAC1E,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,MAAM,WAAW,eAAgB,SAAQ,UAAU;IACjD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,uDAAuD;IACvD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAwBD;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiExF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAahF;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBjF;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,gCAAgC,CAAC;AAEzD,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BjF"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `acc-runner auth login|status|logout` — the device-code flow for a PERSON
|
|
3
|
+
* (AX-G1 DEVICE-FLOW-GENERALIZE, gap G-16).
|
|
4
|
+
*
|
|
5
|
+
* Same three beats as `acc-runner login`, and deliberately so — an operator who
|
|
6
|
+
* has enrolled a runner already knows this flow:
|
|
7
|
+
*
|
|
8
|
+
* 1. ask /api/auth/device-code for a pair, print the short code
|
|
9
|
+
* 2. poll the exchange while the human binds it in a browser
|
|
10
|
+
* 3. spend the returned one-time grant against GoTrue, keychain the session
|
|
11
|
+
*
|
|
12
|
+
* What is NOT here is the fourth beat the runner flow has: no runner row, no
|
|
13
|
+
* `register_runner`, no fleet membership. This terminal is a person, not a
|
|
14
|
+
* machine, and `acc-runner login` is untouched by it.
|
|
15
|
+
*/
|
|
16
|
+
import chalk from "chalk";
|
|
17
|
+
import open from "open";
|
|
18
|
+
import { setTimeout as sleep } from "node:timers/promises";
|
|
19
|
+
import { loadConfig } from "../config.js";
|
|
20
|
+
import { cliName, signInCommand } from "../cli-name.js";
|
|
21
|
+
import { PROTOCOL_VERSION } from "../types.js";
|
|
22
|
+
import { clearUserSession, cliUserAgent, loadUserSession, saveUserSession, verifyEmailOtp, } from "./session.js";
|
|
23
|
+
import { probeUserSession, revokedMessage } from "./liveness.js";
|
|
24
|
+
export const DEVICE_CODE_PATH = "/api/auth/device-code";
|
|
25
|
+
/** Consecutive transient exchange failures tolerated before giving up. */
|
|
26
|
+
export const MAX_POLL_FAILURES = 5;
|
|
27
|
+
async function post(doFetch, url, body) {
|
|
28
|
+
const res = await doFetch(url, {
|
|
29
|
+
method: "POST",
|
|
30
|
+
headers: {
|
|
31
|
+
"Content-Type": "application/json",
|
|
32
|
+
"User-Agent": `acc-runner/${PROTOCOL_VERSION}`,
|
|
33
|
+
},
|
|
34
|
+
body: JSON.stringify(body ?? {}),
|
|
35
|
+
});
|
|
36
|
+
let json = {};
|
|
37
|
+
try {
|
|
38
|
+
json = (await res.json());
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
/* callers judge on status + shape */
|
|
42
|
+
}
|
|
43
|
+
return { status: res.status, json };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Run the whole handshake and return the session, WITHOUT persisting it — so the
|
|
47
|
+
* flow is testable end to end and the keychain write stays one explicit step in
|
|
48
|
+
* the command below.
|
|
49
|
+
*
|
|
50
|
+
* A transient failure (503 `retry`, a cold function, a pooler hiccup) must not
|
|
51
|
+
* abort a login whose code is still valid: it is counted, not fatal, and the
|
|
52
|
+
* real deadline is the code's TTL. This is the DEVICE-BIND-FIX rule the runner
|
|
53
|
+
* lane learned the hard way — only `expired` is terminal.
|
|
54
|
+
*/
|
|
55
|
+
export async function deviceLogin(deps = {}) {
|
|
56
|
+
const cfg = loadConfig();
|
|
57
|
+
const doFetch = deps.fetch ?? fetch;
|
|
58
|
+
const nap = deps.sleep ?? ((ms) => sleep(ms));
|
|
59
|
+
const say = deps.log ?? ((line) => console.log(line));
|
|
60
|
+
const endpoint = `${cfg.publicUrl.replace(/\/+$/, "")}${DEVICE_CODE_PATH}`;
|
|
61
|
+
const created = await post(doFetch, endpoint, { action: "create" });
|
|
62
|
+
if (created.status !== 200 || !created.json.device_code) {
|
|
63
|
+
throw new Error(`Could not start device login (HTTP ${created.status}).`);
|
|
64
|
+
}
|
|
65
|
+
const start = created.json;
|
|
66
|
+
say("");
|
|
67
|
+
say(chalk.bold("To sign in to ACC from this terminal:"));
|
|
68
|
+
say("");
|
|
69
|
+
say(` ${chalk.cyan("1.")} Visit ${chalk.underline(start.verification_url)}`);
|
|
70
|
+
say(` ${chalk.cyan("2.")} Enter code: ${chalk.bold.green(start.user_code)}`);
|
|
71
|
+
say("");
|
|
72
|
+
say(chalk.gray("Waiting for confirmation…"));
|
|
73
|
+
const openBrowser = deps.openBrowser ?? ((url) => open(url));
|
|
74
|
+
void Promise.resolve(openBrowser(start.verification_url)).catch(() => {
|
|
75
|
+
/* headless box; the printed URL is the fallback */
|
|
76
|
+
});
|
|
77
|
+
const interval = (deps.intervalSeconds ?? start.interval) * 1000;
|
|
78
|
+
const now = () => deps.now?.() ?? Date.now();
|
|
79
|
+
const deadline = now() + (deps.timeoutSeconds ?? start.expires_in) * 1000;
|
|
80
|
+
let failures = 0;
|
|
81
|
+
let lastFailure = null;
|
|
82
|
+
while (now() < deadline) {
|
|
83
|
+
await nap(interval);
|
|
84
|
+
const { status, json } = await post(doFetch, endpoint, {
|
|
85
|
+
action: "exchange",
|
|
86
|
+
device_code: start.device_code,
|
|
87
|
+
});
|
|
88
|
+
if (status !== 200 || json.status === "retry") {
|
|
89
|
+
failures += 1;
|
|
90
|
+
lastFailure = json.status === "retry" ? (json.error ?? "retry") : `HTTP ${status}`;
|
|
91
|
+
if (failures >= MAX_POLL_FAILURES) {
|
|
92
|
+
throw new Error(`Device-code exchange failed ${failures} times in a row: ${lastFailure}`);
|
|
93
|
+
}
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
failures = 0;
|
|
97
|
+
if (json.status === "expired") {
|
|
98
|
+
throw new Error("Device code expired before sign-in completed. Run the command again.");
|
|
99
|
+
}
|
|
100
|
+
if (json.status === "ok") {
|
|
101
|
+
if (!json.email) {
|
|
102
|
+
throw new Error("This account has no email address, so a CLI session cannot be issued.");
|
|
103
|
+
}
|
|
104
|
+
// The grant is spent from HERE, not on the server: GoTrue records this
|
|
105
|
+
// machine's agent and address on the session row, which is what makes the
|
|
106
|
+
// session recognisable (and therefore revocable) on Settings → Sessions.
|
|
107
|
+
return verifyEmailOtp({ supabaseUrl: json.supabase_url, anonKey: json.anon_key }, { email: json.email, token: json.token }, deps);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
throw new Error("Device code timed out before sign-in completed.");
|
|
111
|
+
}
|
|
112
|
+
export async function authLoginCommand(deps = {}) {
|
|
113
|
+
const session = await deviceLogin(deps);
|
|
114
|
+
await saveUserSession(session);
|
|
115
|
+
const say = deps.log ?? ((line) => console.log(line));
|
|
116
|
+
say(chalk.green(`✓ Signed in as ${session.email ?? session.user_id}`));
|
|
117
|
+
say(chalk.green("✓ Stored session in OS keychain (acc-runner · user)"));
|
|
118
|
+
say("");
|
|
119
|
+
say(chalk.gray(`This session appears on Settings → Sessions as "${cliUserAgent()}".`));
|
|
120
|
+
say(chalk.gray(`Revoke it there, or run \`${cliName() === "acc" ? "acc logout" : "acc-runner auth logout"}\`.`));
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* "Am I still signed in?" — which is a question about the SERVER's copy of the
|
|
124
|
+
* session, not this machine's. A keychain entry alone proves nothing: the session
|
|
125
|
+
* may have been revoked from Settings → Sessions while this terminal was closed,
|
|
126
|
+
* and the stored access token would still look perfectly valid. So the local facts
|
|
127
|
+
* are printed first (they work offline) and then the server is asked.
|
|
128
|
+
*/
|
|
129
|
+
export async function authStatusCommand(deps = {}) {
|
|
130
|
+
const say = deps.log ?? ((line) => console.log(line));
|
|
131
|
+
const session = await loadUserSession();
|
|
132
|
+
if (!session) {
|
|
133
|
+
say(`Not signed in. Run \`${signInCommand()}\`.`);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
say(`Signed in as ${session.email ?? session.user_id}`);
|
|
137
|
+
say(`Access token expires ${session.access_expires_at}`);
|
|
138
|
+
const verdict = await probeUserSession(session, deps);
|
|
139
|
+
if (!verdict.live) {
|
|
140
|
+
await clearUserSession();
|
|
141
|
+
say(chalk.yellow(`✗ ${revokedMessage()}`));
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
say(verdict.verified
|
|
145
|
+
? chalk.green("✓ The session is still live server-side.")
|
|
146
|
+
: chalk.gray("Could not reach ACC to confirm the session; treating it as live."));
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Sign out for real. Deleting the keychain entry alone would leave the session
|
|
150
|
+
* live in `auth.sessions` — visible on the sessions surface, refreshable by
|
|
151
|
+
* anyone who had copied the token. So GoTrue is told first, and the local copy
|
|
152
|
+
* is removed whether or not that call reached it (an offline machine must still
|
|
153
|
+
* be able to drop its credential).
|
|
154
|
+
*
|
|
155
|
+
* `scope=local` is not a nicety, it is the whole contract of this command:
|
|
156
|
+
* GoTrue's default scope is GLOBAL, which would also sign the operator out of
|
|
157
|
+
* their browser and every other terminal. "Log this terminal out" must mean
|
|
158
|
+
* exactly one session — the one this keychain entry holds.
|
|
159
|
+
*/
|
|
160
|
+
export const LOGOUT_PATH = "/auth/v1/logout?scope=local";
|
|
161
|
+
export async function authLogoutCommand(deps = {}) {
|
|
162
|
+
const say = deps.log ?? ((line) => console.log(line));
|
|
163
|
+
const session = await loadUserSession();
|
|
164
|
+
if (!session) {
|
|
165
|
+
say("Not signed in.");
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
let revoked = false;
|
|
169
|
+
try {
|
|
170
|
+
const doFetch = deps.fetch ?? fetch;
|
|
171
|
+
const res = await doFetch(`${session.supabase_url.replace(/\/+$/, "")}${LOGOUT_PATH}`, {
|
|
172
|
+
method: "POST",
|
|
173
|
+
headers: {
|
|
174
|
+
apikey: session.anon_key,
|
|
175
|
+
Authorization: `Bearer ${session.access_token}`,
|
|
176
|
+
"User-Agent": deps.userAgent ?? cliUserAgent(),
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
revoked = res.status < 400;
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
revoked = false;
|
|
183
|
+
}
|
|
184
|
+
await clearUserSession();
|
|
185
|
+
say(revoked
|
|
186
|
+
? chalk.green("✓ Signed out (session revoked server-side).")
|
|
187
|
+
: chalk.yellow("✓ Local session cleared. The server session may still be live — revoke it on Settings → Sessions."));
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=device-login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-login.js","sourceRoot":"","sources":["../../src/user-auth/device-login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type GoTrueDeps, type StoredUserSession } from "./session.js";
|
|
2
|
+
export declare const SESSION_STATUS_PATH = "/api/auth/session-status";
|
|
3
|
+
/** What the probe concluded. `verified` false means "could not check". */
|
|
4
|
+
export interface LivenessVerdict {
|
|
5
|
+
live: boolean;
|
|
6
|
+
verified: boolean;
|
|
7
|
+
reason: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Map one HTTP answer onto a verdict. Pure, so every branch is asserted directly
|
|
11
|
+
* rather than through a fetch double.
|
|
12
|
+
*/
|
|
13
|
+
export declare function decideLiveness(status: number, body: unknown): LivenessVerdict;
|
|
14
|
+
/** Ask the control plane about this session. Never throws — a transport failure
|
|
15
|
+
* is an unverified verdict, not a sign-out. */
|
|
16
|
+
export declare function probeUserSession(session: StoredUserSession, deps?: GoTrueDeps): Promise<LivenessVerdict>;
|
|
17
|
+
/** The message an operator sees when their terminal was revoked from the web. */
|
|
18
|
+
export declare function revokedMessage(): string;
|
|
19
|
+
/** Test seam: forget the memoized verdict. */
|
|
20
|
+
export declare function resetSessionLivenessProbe(): void;
|
|
21
|
+
/**
|
|
22
|
+
* Called at the top of every person-lane command. Throws SignedOutError when the
|
|
23
|
+
* session has been revoked; returns silently in every other case, including every
|
|
24
|
+
* case where we could not tell.
|
|
25
|
+
*/
|
|
26
|
+
export declare function ensureUserSessionLive(deps?: GoTrueDeps): Promise<void>;
|
|
27
|
+
//# sourceMappingURL=liveness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liveness.d.ts","sourceRoot":"","sources":["../../src/user-auth/liveness.ts"],"names":[],"mappings":"AA0BA,OAAO,EAML,KAAK,UAAU,EACf,KAAK,iBAAiB,EACvB,MAAM,cAAc,CAAC;AAEtB,eAAO,MAAM,mBAAmB,6BAA6B,CAAC;AAE9D,0EAA0E;AAC1E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,eAAe,CAuB7E;AAED;gDACgD;AAChD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,iBAAiB,EAC1B,IAAI,GAAE,UAAe,GACpB,OAAO,CAAC,eAAe,CAAC,CAqB1B;AAED,iFAAiF;AACjF,wBAAgB,cAAc,IAAI,MAAM,CAKvC;AASD,8CAA8C;AAC9C,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAoBD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAK1E"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Does this terminal's session still exist server-side? (AX-G3, gap G-16.)
|
|
3
|
+
*
|
|
4
|
+
* THE PROBLEM. Revoking a CLI login on Settings → Sessions deletes the
|
|
5
|
+
* `auth.sessions` row and cascades its refresh-token family, so this machine can
|
|
6
|
+
* never mint another access token. But the access token already in the keychain
|
|
7
|
+
* stays cryptographically valid until it expires — and PostgREST, which every
|
|
8
|
+
* `acc task` read goes through, verifies a JWT's signature without ever looking at
|
|
9
|
+
* the session table. So a revoked terminal would keep reading the board for the
|
|
10
|
+
* rest of the token's life, which is up to an hour of a revoke not being a revoke.
|
|
11
|
+
*
|
|
12
|
+
* The refresh path already handles the other half: once the token IS stale,
|
|
13
|
+
* refreshUserSession gets a 4xx and raises SignedOutError. This module covers the
|
|
14
|
+
* window before that — one cheap read of /api/auth/session-status per command.
|
|
15
|
+
*
|
|
16
|
+
* FAIL OPEN, ON PURPOSE. Only a positive `live: false` signs the operator out.
|
|
17
|
+
* An unreachable control plane, a 5xx, a deployment that predates the endpoint
|
|
18
|
+
* (404), an unwired session directory, a token with no session claim — all of
|
|
19
|
+
* those leave the session alone. The alternative is a pooler hiccup logging out
|
|
20
|
+
* every terminal in the fleet at once, which is a worse failure than the one this
|
|
21
|
+
* module exists to fix. The only thing we treat as definitive besides `live:false`
|
|
22
|
+
* is a 401 whose reason is `invalid_token`: that is the auth authority itself
|
|
23
|
+
* saying this credential is not a credential.
|
|
24
|
+
*/
|
|
25
|
+
import { loadConfig } from "../config.js";
|
|
26
|
+
import { signInCommand } from "../cli-name.js";
|
|
27
|
+
import { accessTokenIsFresh, clearUserSession, cliUserAgent, loadUserSession, SignedOutError, } from "./session.js";
|
|
28
|
+
export const SESSION_STATUS_PATH = "/api/auth/session-status";
|
|
29
|
+
/**
|
|
30
|
+
* Map one HTTP answer onto a verdict. Pure, so every branch is asserted directly
|
|
31
|
+
* rather than through a fetch double.
|
|
32
|
+
*/
|
|
33
|
+
export function decideLiveness(status, body) {
|
|
34
|
+
const b = (body ?? {});
|
|
35
|
+
if (status === 401) {
|
|
36
|
+
// requireUser answers 401 with a discriminated reason. `invalid_token` is the
|
|
37
|
+
// authority rejecting the credential — definitive. `auth_unreachable` and the
|
|
38
|
+
// header-shape classes are not about this session at all.
|
|
39
|
+
const reason = typeof b.reason === "string" ? b.reason : "unauthenticated";
|
|
40
|
+
if (reason === "invalid_token")
|
|
41
|
+
return { live: false, verified: true, reason };
|
|
42
|
+
return { live: true, verified: false, reason };
|
|
43
|
+
}
|
|
44
|
+
if (status !== 200) {
|
|
45
|
+
// 404 = an older deployment without this endpoint. 5xx = the control plane.
|
|
46
|
+
// Neither is evidence about the session.
|
|
47
|
+
return { live: true, verified: false, reason: `http_${status}` };
|
|
48
|
+
}
|
|
49
|
+
if (b.live === false && b.verified === true) {
|
|
50
|
+
return { live: false, verified: true, reason: typeof b.reason === "string" ? b.reason : "revoked" };
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
live: true,
|
|
54
|
+
verified: b.verified === true,
|
|
55
|
+
reason: typeof b.reason === "string" ? b.reason : "live",
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** Ask the control plane about this session. Never throws — a transport failure
|
|
59
|
+
* is an unverified verdict, not a sign-out. */
|
|
60
|
+
export async function probeUserSession(session, deps = {}) {
|
|
61
|
+
const doFetch = deps.fetch ?? fetch;
|
|
62
|
+
const base = loadConfig().publicUrl.replace(/\/+$/, "");
|
|
63
|
+
try {
|
|
64
|
+
const res = await doFetch(`${base}${SESSION_STATUS_PATH}`, {
|
|
65
|
+
method: "GET",
|
|
66
|
+
headers: {
|
|
67
|
+
Accept: "application/json",
|
|
68
|
+
Authorization: `Bearer ${session.access_token}`,
|
|
69
|
+
"User-Agent": deps.userAgent ?? cliUserAgent(),
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
const body = await res.json().catch(() => ({}));
|
|
73
|
+
return decideLiveness(res.status, body);
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
return {
|
|
77
|
+
live: true,
|
|
78
|
+
verified: false,
|
|
79
|
+
reason: `unreachable: ${err.message?.slice(0, 120) ?? "error"}`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** The message an operator sees when their terminal was revoked from the web. */
|
|
84
|
+
export function revokedMessage() {
|
|
85
|
+
return ("This terminal's ACC session is no longer valid — it was revoked from " +
|
|
86
|
+
`Settings → Sessions, or it expired. Run \`${signInCommand()}\` to sign in again.`);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* One probe per process, so two calls inside a single command do not both go to
|
|
90
|
+
* the network. A new command is a new process, which is what "takes effect on its
|
|
91
|
+
* next call" means for a CLI.
|
|
92
|
+
*/
|
|
93
|
+
let inFlight = null;
|
|
94
|
+
/** Test seam: forget the memoized verdict. */
|
|
95
|
+
export function resetSessionLivenessProbe() {
|
|
96
|
+
inFlight = null;
|
|
97
|
+
}
|
|
98
|
+
async function runCheck(deps) {
|
|
99
|
+
const session = await loadUserSession();
|
|
100
|
+
// No session at all: the command's own "not signed in" error is the right
|
|
101
|
+
// message, and it does not need a network call to say it.
|
|
102
|
+
if (!session)
|
|
103
|
+
return;
|
|
104
|
+
// A stale token is about to be refreshed, and a refresh against a revoked
|
|
105
|
+
// session already fails with the same error. Probing would be a second network
|
|
106
|
+
// call to learn what the first one is about to tell us.
|
|
107
|
+
if (!accessTokenIsFresh(session, deps.now?.() ?? Date.now()))
|
|
108
|
+
return;
|
|
109
|
+
const verdict = await probeUserSession(session, deps);
|
|
110
|
+
if (verdict.live)
|
|
111
|
+
return;
|
|
112
|
+
// Drop the dead credential: leaving it would make every later command fail the
|
|
113
|
+
// same way, and would make `whoami` claim a session that no longer exists.
|
|
114
|
+
await clearUserSession();
|
|
115
|
+
throw new SignedOutError(revokedMessage());
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Called at the top of every person-lane command. Throws SignedOutError when the
|
|
119
|
+
* session has been revoked; returns silently in every other case, including every
|
|
120
|
+
* case where we could not tell.
|
|
121
|
+
*/
|
|
122
|
+
export function ensureUserSessionLive(deps = {}) {
|
|
123
|
+
// A rejected memo is deliberately kept: a second caller in the same process
|
|
124
|
+
// should see the same sign-out, not probe a session we already know is gone.
|
|
125
|
+
inFlight ??= runCheck(deps);
|
|
126
|
+
return inFlight;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=liveness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liveness.js","sourceRoot":"","sources":["../../src/user-auth/liveness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/** Keychain account for the person session. The runner's is "default". */
|
|
2
|
+
export declare const USER_SESSION_SLOT: "user";
|
|
3
|
+
/** Refresh this far ahead of expiry, so a long RPC never straddles it. */
|
|
4
|
+
export declare const REFRESH_SKEW_SECONDS = 120;
|
|
5
|
+
export interface StoredUserSession {
|
|
6
|
+
access_token: string;
|
|
7
|
+
refresh_token: string;
|
|
8
|
+
/** ISO-8601 instant at which access_token expires. */
|
|
9
|
+
access_expires_at: string;
|
|
10
|
+
user_id: string;
|
|
11
|
+
email: string | null;
|
|
12
|
+
/** Resolved by the exchange, so a fresh machine needs no connection env. */
|
|
13
|
+
supabase_url: string;
|
|
14
|
+
anon_key: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* `acc-cli/1.2.3 (darwin; my-laptop)`. The hostname is filtered to header-safe
|
|
18
|
+
* characters — a hostname with a stray byte must not make an auth call throw
|
|
19
|
+
* where it would otherwise have succeeded.
|
|
20
|
+
*/
|
|
21
|
+
export declare function cliUserAgent(hostname?: string): string;
|
|
22
|
+
/** Raised when the session is gone for good — revoked, expired, or never there. */
|
|
23
|
+
export declare class SignedOutError extends Error {
|
|
24
|
+
constructor(message: string);
|
|
25
|
+
}
|
|
26
|
+
export declare function saveUserSession(session: StoredUserSession): Promise<void>;
|
|
27
|
+
export declare function loadUserSession(): Promise<StoredUserSession | null>;
|
|
28
|
+
export declare function clearUserSession(): Promise<boolean>;
|
|
29
|
+
/** The token payload GoTrue answers `/verify` and `/token` with. */
|
|
30
|
+
export interface GoTrueTokenResponse {
|
|
31
|
+
access_token?: string;
|
|
32
|
+
refresh_token?: string;
|
|
33
|
+
expires_in?: number;
|
|
34
|
+
expires_at?: number;
|
|
35
|
+
user?: {
|
|
36
|
+
id?: string;
|
|
37
|
+
email?: string | null;
|
|
38
|
+
} | null;
|
|
39
|
+
}
|
|
40
|
+
export interface GoTrueTarget {
|
|
41
|
+
supabaseUrl: string;
|
|
42
|
+
anonKey: string;
|
|
43
|
+
}
|
|
44
|
+
/** Injectable so the tests drive the rules without a network. */
|
|
45
|
+
export interface GoTrueDeps {
|
|
46
|
+
fetch?: typeof fetch;
|
|
47
|
+
now?: () => number;
|
|
48
|
+
userAgent?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Fold a token response into a session, or fail loudly. A response missing
|
|
52
|
+
* either token, or the user id, is not a session however cheerful its status
|
|
53
|
+
* code was — better to refuse than to persist a credential we cannot refresh.
|
|
54
|
+
*/
|
|
55
|
+
export declare function toStoredSession(json: GoTrueTokenResponse, target: GoTrueTarget, now: number): StoredUserSession;
|
|
56
|
+
/** Spend the one-time grant from /api/auth/device-code for a real session. */
|
|
57
|
+
export declare function verifyEmailOtp(target: GoTrueTarget, params: {
|
|
58
|
+
email: string;
|
|
59
|
+
token: string;
|
|
60
|
+
}, deps?: GoTrueDeps): Promise<StoredUserSession>;
|
|
61
|
+
/**
|
|
62
|
+
* Trade the refresh token for a fresh pair. A 4xx here is the revocation path,
|
|
63
|
+
* not an outage: GoTrue answers 400/401 for a token that was revoked (the
|
|
64
|
+
* sessions surface deleted the row) or already rotated, and both mean the same
|
|
65
|
+
* thing to the operator — sign in again.
|
|
66
|
+
*/
|
|
67
|
+
export declare function refreshUserSession(session: StoredUserSession, deps?: GoTrueDeps): Promise<StoredUserSession>;
|
|
68
|
+
export declare function accessTokenIsFresh(session: StoredUserSession, now?: number): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* The accessor everything downstream should use: a live access token for the
|
|
71
|
+
* signed-in human, refreshed and re-persisted when it is close to expiry.
|
|
72
|
+
*
|
|
73
|
+
* The rotated successor is written back BEFORE the token is returned, because a
|
|
74
|
+
* caller that used a token whose refresh partner never landed would be one crash
|
|
75
|
+
* away from replaying a spent token — which GoTrue treats as reuse.
|
|
76
|
+
*
|
|
77
|
+
* A revoked session clears the keychain slot on the way out. Leaving a dead
|
|
78
|
+
* credential in the keychain would make every later command fail the same way
|
|
79
|
+
* with nothing to show for it; removing it makes `auth status` honest.
|
|
80
|
+
*/
|
|
81
|
+
export declare function getUserAccessToken(deps?: GoTrueDeps): Promise<string>;
|
|
82
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/user-auth/session.ts"],"names":[],"mappings":"AAmCA,0EAA0E;AAC1E,eAAO,MAAM,iBAAiB,EAAG,MAAe,CAAC;AAEjD,0EAA0E;AAC1E,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,CAGrE;AAED,mFAAmF;AACnF,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAI5B;AAID,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzE;AAED,wBAAgB,eAAe,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAEnE;AAED,wBAAgB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAEnD;AAID,oEAAoE;AACpE,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;CACtD;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,iEAAiE;AACjE,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA4BD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,mBAAmB,EACzB,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,MAAM,GACV,iBAAiB,CAoBnB;AAED,8EAA8E;AAC9E,wBAAsB,cAAc,CAClC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EACxC,IAAI,GAAE,UAAe,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAW5B;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,iBAAiB,EAC1B,IAAI,GAAE,UAAe,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAiB5B;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,iBAAiB,EAC1B,GAAG,GAAE,MAAmB,GACvB,OAAO,CAIT;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAc/E"}
|