@artblocks/abx-cli 0.1.0-alpha.34 → 0.1.0-alpha.36

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/CHANGELOG.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # @artblocks/abx-cli
2
2
 
3
+ ## 0.1.0-alpha.36
4
+
5
+ ### Minor Changes
6
+
7
+ - baa7d17: Add `abx auth logout` for first-party and named OAuth remotes. The command discovers the provider's
8
+ RFC 7009 revocation endpoint, revokes the current API key, and only then removes the matching local
9
+ `.env` assignment; provider failures keep the credential available for a safe retry. The bundled
10
+ skill and public docs also teach agents to yield immediately after device-login handoff output and
11
+ resume the same polling process instead of starting duplicate login or retry loops. Normal key
12
+ rotation now points through logout so `login --force` does not silently orphan an active key.
13
+
14
+ ## 0.1.0-alpha.35
15
+
16
+ ### Minor Changes
17
+
18
+ - 4072f0c: Add `abx auth login`, an OAuth 2.0 Device Authorization Grant flow for first-party and named remote
19
+ services. Human email/OTP approval stays in the browser; the CLI polls according to RFC 8628 and
20
+ writes the resulting bearer key to a Git-ignored `.env` without printing it. The bundled ABX skill
21
+ now recommends this agent-safe flow and keeps manual signup only as a recovery path. The SDK's
22
+ service-descriptor documentation likewise distinguishes provider recovery URLs from standard OAuth
23
+ discovery.
24
+
25
+ ### Patch Changes
26
+
27
+ - 4072f0c: `deploy-code --dry-run` now treats a resolver-declared attached renderer as the owner of rendered stills and traits, without contradicting that managed path with local runner, backend, or `fs` warnings.
28
+
29
+ The managed lane now prints one truthful verification path instead of asking creators to stand up infrastructure the provider already supplies. Reported during the 2026-08-26 fresh onboarding test (feedback `5b7c3f10-e08f-4fb8-85de-ec509f4f33f6`).
30
+
31
+ - Updated dependencies [4072f0c]
32
+ - @artblocks/abx-sdk@0.1.0-alpha.27
33
+ - @artblocks/abx-indexer@0.1.0-alpha.28
34
+ - @artblocks/abx-storage@0.1.0-alpha.27
35
+ - @artblocks/abx-token-api@0.1.0-alpha.30
36
+
3
37
  ## 0.1.0-alpha.34
4
38
 
5
39
  ### Minor Changes
@@ -0,0 +1,39 @@
1
+ import { type Flags } from '../flags.js';
2
+ export interface DeviceLoginDeps {
3
+ fetchImpl?: typeof fetch;
4
+ sleep?: (ms: number) => Promise<void>;
5
+ now?: () => number;
6
+ openBrowser?: (url: string) => boolean;
7
+ line?: (message: string) => void;
8
+ warning?: (message: string) => void;
9
+ }
10
+ export interface DeviceLoginOptions {
11
+ baseUrl: string;
12
+ envVar: string;
13
+ envPath: string;
14
+ force?: boolean;
15
+ noOpen?: boolean;
16
+ }
17
+ export interface OAuthLogoutOptions {
18
+ baseUrl: string;
19
+ envVar: string;
20
+ envPath: string;
21
+ token?: string;
22
+ }
23
+ export interface OAuthLogoutDeps {
24
+ fetchImpl?: typeof fetch;
25
+ }
26
+ export type OAuthLogoutResult = {
27
+ status: 'absent';
28
+ } | {
29
+ status: 'revoked';
30
+ local: 'removed' | 'external' | 'different';
31
+ };
32
+ /** Standards-only core, dependency-injected for a no-secret-output regression test. */
33
+ export declare function deviceLogin(options: DeviceLoginOptions, deps?: DeviceLoginDeps): Promise<void>;
34
+ /** RFC 7009 logout: revoke remotely first, then remove the matching local assignment. Keeping the
35
+ * credential when discovery or revocation fails preserves the user's ability to retry safely. */
36
+ export declare function oauthLogout(options: OAuthLogoutOptions, deps?: OAuthLogoutDeps): Promise<OAuthLogoutResult>;
37
+ export declare function cmdAuth(args: string[], flags: Flags): Promise<void>;
38
+ export declare const AUTH_HELP: string;
39
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,KAAK,EAAkB,MAAM,aAAa,CAAA;AA4BxD,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;IACxB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;IACtC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACzB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GACpB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAA;CAAE,CAAA;AAsNtE,uFAAuF;AACvF,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuGxG;AAED;iGACiG;AACjG,wBAAsB,WAAW,CAC/B,OAAO,EAAE,kBAAkB,EAC3B,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,iBAAiB,CAAC,CAgC5B;AAaD,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDzE;AAED,eAAO,MAAM,SAAS,QAegH,CAAA"}
@@ -0,0 +1,424 @@
1
+ import { execFileSync, spawn } from 'node:child_process';
2
+ import { existsSync, lstatSync, readFileSync, renameSync, unlinkSync, writeFileSync } from 'node:fs';
3
+ import { basename, dirname, resolve as resolvePath } from 'node:path';
4
+ import { randomBytes } from 'node:crypto';
5
+ import { parseEnvContent } from '@artblocks/abx-sdk/node';
6
+ import { positionalArgs } from '../flags.js';
7
+ import { ABX_SERVICES_API_KEY_VAR, resolveRemote } from '../remote.js';
8
+ import { bold, dim, g, info, ok } from '../output.js';
9
+ const DEVICE_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:device_code';
10
+ const DEVICE_CLIENT_ID = 'abx-cli';
11
+ function cleanBaseUrl(value) {
12
+ return value.replace(/\/+$/, '');
13
+ }
14
+ function safeDescription(value) {
15
+ return typeof value === 'string' ? value.replace(/[\r\n\t]+/g, ' ').slice(0, 240) : '';
16
+ }
17
+ async function jsonObject(response) {
18
+ const body = (await response.json().catch(() => null));
19
+ return body && typeof body === 'object' && !Array.isArray(body) ? body : {};
20
+ }
21
+ function oauthFailure(prefix, response, body, sensitiveValues = []) {
22
+ const code = safeDescription(body.error) || `HTTP ${response.status}`;
23
+ let detail = safeDescription(body.error_description);
24
+ for (const value of sensitiveValues)
25
+ if (value)
26
+ detail = detail.replaceAll(value, '[redacted]');
27
+ return new Error(`${prefix}: ${code}${detail ? ` — ${detail}` : ''}`);
28
+ }
29
+ function assertUrl(value, field) {
30
+ if (typeof value !== 'string')
31
+ throw new Error(`OAuth discovery omitted ${field}`);
32
+ const parsed = new URL(value);
33
+ if (parsed.username || parsed.password)
34
+ throw new Error(`OAuth discovery returned credentials in ${field}`);
35
+ if (parsed.protocol !== 'https:' && !(parsed.protocol === 'http:' && ['127.0.0.1', 'localhost'].includes(parsed.hostname))) {
36
+ throw new Error(`OAuth discovery returned an insecure ${field}; HTTPS is required outside localhost`);
37
+ }
38
+ return parsed.toString();
39
+ }
40
+ function discoverUrl(baseUrl) {
41
+ const parsed = new URL(cleanBaseUrl(baseUrl));
42
+ const issuerPath = parsed.pathname.replace(/\/+$/, '');
43
+ parsed.pathname = `/.well-known/oauth-authorization-server${issuerPath}`;
44
+ parsed.search = '';
45
+ parsed.hash = '';
46
+ return parsed.toString();
47
+ }
48
+ async function discoverOAuthMetadata(baseUrl, fetchImpl) {
49
+ const expectedIssuer = cleanBaseUrl(assertUrl(baseUrl, 'provider base URL'));
50
+ const response = await fetchImpl(discoverUrl(expectedIssuer), {
51
+ headers: { accept: 'application/json' },
52
+ signal: AbortSignal.timeout(15_000)
53
+ });
54
+ const body = await jsonObject(response);
55
+ if (!response.ok)
56
+ throw oauthFailure('OAuth discovery failed', response, body);
57
+ const metadata = body;
58
+ assertUrl(metadata.issuer, 'issuer');
59
+ if (metadata.issuer !== expectedIssuer) {
60
+ throw new Error(`OAuth issuer mismatch: expected ${expectedIssuer}, received ${safeDescription(metadata.issuer)}`);
61
+ }
62
+ return metadata;
63
+ }
64
+ function defaultSleep(ms) {
65
+ return new Promise((resolve) => setTimeout(resolve, ms));
66
+ }
67
+ /** Best-effort only: the complete verification link is always printed, so headless and sandboxed
68
+ * agents still have a correct handoff when the OS refuses to launch a browser. */
69
+ function defaultOpenBrowser(url) {
70
+ if (process.env.CI)
71
+ return false;
72
+ try {
73
+ const command = process.platform === 'darwin'
74
+ ? { file: 'open', args: [url] }
75
+ : process.platform === 'win32'
76
+ ? { file: 'rundll32', args: ['url.dll,FileProtocolHandler', url] }
77
+ : { file: 'xdg-open', args: [url] };
78
+ const child = spawn(command.file, command.args, { detached: true, stdio: 'ignore' });
79
+ child.on('error', () => { });
80
+ child.unref();
81
+ return true;
82
+ }
83
+ catch {
84
+ return false;
85
+ }
86
+ }
87
+ function activeEnvLine(source, key) {
88
+ const escaped = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
89
+ return new RegExp(`^\\s*(?:export\\s+)?${escaped}\\s*=`, 'm').test(source);
90
+ }
91
+ function gitCheck(cwd, args) {
92
+ try {
93
+ execFileSync('git', args, { cwd, stdio: 'ignore' });
94
+ return true;
95
+ }
96
+ catch (error) {
97
+ const status = error.status;
98
+ return status === 1 || status === 128 ? false : null;
99
+ }
100
+ }
101
+ /** Refuse the two silent secret-exposure modes: replacing a tracked file, or creating an unignored
102
+ * .env inside a Git worktree. A non-Git directory is fine. */
103
+ function assertPrivateEnvPath(envPath) {
104
+ const cwd = dirname(envPath);
105
+ if (existsSync(envPath) && lstatSync(envPath).isSymbolicLink()) {
106
+ throw new Error(`refusing to store an API key through symbolic-link ${basename(envPath)}`);
107
+ }
108
+ if (!gitCheck(cwd, ['rev-parse', '--is-inside-work-tree']))
109
+ return;
110
+ if (gitCheck(cwd, ['ls-files', '--error-unmatch', '--', basename(envPath)])) {
111
+ throw new Error(`refusing to store an API key in tracked ${basename(envPath)} — remove it from Git history first`);
112
+ }
113
+ if (!gitCheck(cwd, ['check-ignore', '--quiet', '--', basename(envPath)])) {
114
+ throw new Error(`${basename(envPath)} is not Git-ignored. Add '${basename(envPath)}' to .gitignore, then run login again.`);
115
+ }
116
+ }
117
+ function saveEnvSecret(envPath, key, value) {
118
+ // RFC 6750 bearer-token grammar is safe to round-trip through the CLI's minimal .env parser.
119
+ // Reject anything broader instead of quoting a provider-controlled value incorrectly.
120
+ if (!/^[A-Z][A-Z0-9_]*$/.test(key) || !/^[A-Za-z0-9._~+/-]+={0,}$/.test(value)) {
121
+ throw new Error('the provider returned a credential that cannot be stored safely in an environment file');
122
+ }
123
+ const source = existsSync(envPath) ? readFileSync(envPath, 'utf8') : '';
124
+ const eol = source.includes('\r\n') ? '\r\n' : '\n';
125
+ const escaped = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
126
+ const lineRe = new RegExp(`^\\s*(?:export\\s+)?${escaped}\\s*=`);
127
+ const lines = source ? source.split(/\r?\n/) : [];
128
+ const next = [];
129
+ let replaced = false;
130
+ for (const line of lines) {
131
+ if (!lineRe.test(line)) {
132
+ next.push(line);
133
+ continue;
134
+ }
135
+ if (!replaced)
136
+ next.push(`${key}=${value}`);
137
+ replaced = true;
138
+ }
139
+ if (!replaced) {
140
+ if (next.length && next[next.length - 1] !== '')
141
+ next.push('');
142
+ next.push(`${key}=${value}`);
143
+ }
144
+ while (next[next.length - 1] === '')
145
+ next.pop();
146
+ const output = `${next.join(eol)}${eol}`;
147
+ const temp = resolvePath(dirname(envPath), `.${basename(envPath)}.${process.pid}.${randomBytes(6).toString('hex')}.tmp`);
148
+ try {
149
+ writeFileSync(temp, output, { encoding: 'utf8', mode: 0o600 });
150
+ renameSync(temp, envPath);
151
+ }
152
+ catch (error) {
153
+ if (existsSync(temp))
154
+ unlinkSync(temp);
155
+ throw error;
156
+ }
157
+ }
158
+ function envFileValue(envPath, key) {
159
+ if (!existsSync(envPath))
160
+ return undefined;
161
+ return parseEnvContent(readFileSync(envPath, 'utf8')).entries.find(([entryKey]) => entryKey === key)?.[1];
162
+ }
163
+ function envAssignmentKey(line) {
164
+ let candidate = line.trim();
165
+ if (!candidate || candidate.startsWith('#'))
166
+ return undefined;
167
+ candidate = candidate.replace(/^export\s+/, '');
168
+ const equals = candidate.indexOf('=');
169
+ return equals === -1 ? undefined : candidate.slice(0, equals).trim();
170
+ }
171
+ /** Remove every active assignment for one key. If conflicting duplicates existed, leaving a hidden
172
+ * assignment behind would silently log the next process back in, so logout removes the whole set. */
173
+ function removeEnvSecret(envPath, key, expectedValue) {
174
+ if (!existsSync(envPath))
175
+ return false;
176
+ if (lstatSync(envPath).isSymbolicLink()) {
177
+ throw new Error(`API key was revoked at the provider, but refusing to modify symbolic-link ${basename(envPath)}`);
178
+ }
179
+ const source = readFileSync(envPath, 'utf8');
180
+ if (!activeEnvLine(source, key) || envFileValue(envPath, key) !== expectedValue)
181
+ return false;
182
+ const eol = source.includes('\r\n') ? '\r\n' : '\n';
183
+ const output = source
184
+ .split(/\r?\n/)
185
+ .filter((line) => envAssignmentKey(line) !== key)
186
+ .join(eol);
187
+ const temp = resolvePath(dirname(envPath), `.${basename(envPath)}.${process.pid}.${randomBytes(6).toString('hex')}.tmp`);
188
+ try {
189
+ writeFileSync(temp, output, { encoding: 'utf8', mode: 0o600 });
190
+ renameSync(temp, envPath);
191
+ }
192
+ catch (error) {
193
+ if (existsSync(temp))
194
+ unlinkSync(temp);
195
+ const detail = error instanceof Error ? safeDescription(error.message) : '';
196
+ throw new Error(`API key was revoked at the provider, but ${key} could not be removed from ${basename(envPath)}: ${detail || 'filesystem error'}`);
197
+ }
198
+ return true;
199
+ }
200
+ function assertLoginDestination(options) {
201
+ assertPrivateEnvPath(options.envPath);
202
+ const source = existsSync(options.envPath) ? readFileSync(options.envPath, 'utf8') : '';
203
+ const fileValue = parseEnvContent(source).entries.find(([key]) => key === options.envVar)?.[1];
204
+ if (activeEnvLine(source, options.envVar) && !options.force) {
205
+ throw new Error(`${options.envVar} already exists in ${basename(options.envPath)}; run \`abx auth logout\` before login to revoke it, ` +
206
+ 'or pass --force to replace only the local value without revoking the old key');
207
+ }
208
+ if (process.env[options.envVar] !== undefined && process.env[options.envVar] !== fileValue) {
209
+ throw new Error(`${options.envVar} is already set outside ${basename(options.envPath)}. Unset it before login so it cannot shadow the newly issued key.`);
210
+ }
211
+ }
212
+ /** Standards-only core, dependency-injected for a no-secret-output regression test. */
213
+ export async function deviceLogin(options, deps = {}) {
214
+ assertLoginDestination(options);
215
+ const fetchImpl = deps.fetchImpl ?? fetch;
216
+ const sleep = deps.sleep ?? defaultSleep;
217
+ const now = deps.now ?? Date.now;
218
+ const openBrowser = deps.openBrowser ?? defaultOpenBrowser;
219
+ const line = deps.line ?? console.log;
220
+ const warning = deps.warning ?? console.warn;
221
+ const metadata = await discoverOAuthMetadata(options.baseUrl, fetchImpl);
222
+ if (!metadata.grant_types_supported?.includes(DEVICE_GRANT_TYPE)) {
223
+ throw new Error('the provider does not advertise the OAuth device authorization grant');
224
+ }
225
+ const deviceEndpoint = assertUrl(metadata.device_authorization_endpoint, 'device_authorization_endpoint');
226
+ const tokenEndpoint = assertUrl(metadata.token_endpoint, 'token_endpoint');
227
+ const startResponse = await fetchImpl(deviceEndpoint, {
228
+ method: 'POST',
229
+ headers: { 'content-type': 'application/x-www-form-urlencoded', accept: 'application/json' },
230
+ body: new URLSearchParams({ client_id: DEVICE_CLIENT_ID }),
231
+ signal: AbortSignal.timeout(15_000)
232
+ });
233
+ const startBody = await jsonObject(startResponse);
234
+ if (!startResponse.ok)
235
+ throw oauthFailure('device authorization failed', startResponse, startBody);
236
+ const grant = startBody;
237
+ if (typeof grant.device_code !== 'string' ||
238
+ typeof grant.user_code !== 'string' ||
239
+ typeof grant.expires_in !== 'number' ||
240
+ !Number.isFinite(grant.expires_in) ||
241
+ grant.expires_in <= 0) {
242
+ throw new Error('the provider returned an invalid device authorization response');
243
+ }
244
+ const verificationUrl = assertUrl(grant.verification_uri_complete ?? grant.verification_uri, 'verification_uri');
245
+ let pollSeconds = typeof grant.interval === 'number' && Number.isFinite(grant.interval) && grant.interval >= 1
246
+ ? grant.interval
247
+ : 5;
248
+ const deadline = now() + grant.expires_in * 1000;
249
+ line(`Browser approval: ${verificationUrl}`);
250
+ line(`Confirm code: ${grant.user_code}`);
251
+ if (!options.noOpen && !openBrowser(verificationUrl)) {
252
+ warning('Could not open a browser automatically; open the approval URL above.');
253
+ }
254
+ line('Waiting for human approval…');
255
+ while (now() < deadline) {
256
+ await sleep(pollSeconds * 1000);
257
+ // Re-check before polling so a destination changed during the human approval wait normally
258
+ // aborts before the provider consumes a one-time grant and issues an orphaned credential.
259
+ assertLoginDestination(options);
260
+ let response;
261
+ try {
262
+ response = await fetchImpl(tokenEndpoint, {
263
+ method: 'POST',
264
+ headers: { 'content-type': 'application/x-www-form-urlencoded', accept: 'application/json' },
265
+ body: new URLSearchParams({
266
+ grant_type: DEVICE_GRANT_TYPE,
267
+ client_id: DEVICE_CLIENT_ID,
268
+ device_code: grant.device_code
269
+ }),
270
+ signal: AbortSignal.timeout(15_000)
271
+ });
272
+ }
273
+ catch {
274
+ pollSeconds = Math.min(Math.max(pollSeconds * 2, 5), 30);
275
+ warning(`The provider is temporarily unreachable; retrying in ${pollSeconds}s.`);
276
+ continue;
277
+ }
278
+ const body = await jsonObject(response);
279
+ if (response.ok) {
280
+ const accessToken = body.access_token;
281
+ if (typeof accessToken !== 'string' || !accessToken || /[\r\n]/.test(accessToken)) {
282
+ throw new Error('the provider returned an invalid OAuth access token');
283
+ }
284
+ if (typeof body.token_type !== 'string' || body.token_type.toLowerCase() !== 'bearer') {
285
+ throw new Error('the provider returned an unsupported OAuth token type');
286
+ }
287
+ // Re-check after the human wait: another process must not have tracked, unignored, symlinked,
288
+ // or newly populated the destination while this command was polling.
289
+ assertLoginDestination(options);
290
+ saveEnvSecret(options.envPath, options.envVar, accessToken);
291
+ return;
292
+ }
293
+ const code = safeDescription(body.error);
294
+ if (code === 'authorization_pending')
295
+ continue;
296
+ if (code === 'slow_down') {
297
+ pollSeconds += 5;
298
+ continue;
299
+ }
300
+ if (response.status === 429 || response.status >= 500) {
301
+ const retryAfter = Number(response.headers.get('retry-after'));
302
+ pollSeconds = Number.isFinite(retryAfter) && retryAfter > 0 ? retryAfter : Math.min(pollSeconds * 2, 30);
303
+ warning(`The provider asked the CLI to wait; retrying in ${pollSeconds}s.`);
304
+ continue;
305
+ }
306
+ if (code === 'access_denied')
307
+ throw new Error('device authorization was denied');
308
+ if (code === 'expired_token')
309
+ throw new Error('device authorization expired; run login again');
310
+ throw oauthFailure('OAuth token exchange failed', response, body, [grant.device_code]);
311
+ }
312
+ throw new Error('device authorization expired; run login again');
313
+ }
314
+ /** RFC 7009 logout: revoke remotely first, then remove the matching local assignment. Keeping the
315
+ * credential when discovery or revocation fails preserves the user's ability to retry safely. */
316
+ export async function oauthLogout(options, deps = {}) {
317
+ const fileValue = envFileValue(options.envPath, options.envVar);
318
+ const token = options.token || fileValue;
319
+ if (!token)
320
+ return { status: 'absent' };
321
+ const fetchImpl = deps.fetchImpl ?? fetch;
322
+ const metadata = await discoverOAuthMetadata(options.baseUrl, fetchImpl);
323
+ const revocationEndpoint = assertUrl(metadata.revocation_endpoint, 'revocation_endpoint');
324
+ const response = await fetchImpl(revocationEndpoint, {
325
+ method: 'POST',
326
+ headers: { 'content-type': 'application/x-www-form-urlencoded', accept: 'application/json' },
327
+ body: new URLSearchParams({
328
+ client_id: DEVICE_CLIENT_ID,
329
+ token,
330
+ token_type_hint: 'access_token'
331
+ }),
332
+ signal: AbortSignal.timeout(15_000)
333
+ });
334
+ if (!response.ok) {
335
+ const body = await jsonObject(response);
336
+ throw oauthFailure('OAuth token revocation failed', response, body, [token]);
337
+ }
338
+ const currentFileValue = envFileValue(options.envPath, options.envVar);
339
+ const local = currentFileValue === token && removeEnvSecret(options.envPath, options.envVar, token)
340
+ ? 'removed'
341
+ : currentFileValue === undefined
342
+ ? 'external'
343
+ : 'different';
344
+ if (process.env[options.envVar] === token)
345
+ delete process.env[options.envVar];
346
+ return { status: 'revoked', local };
347
+ }
348
+ function targetForAuth(spec, action) {
349
+ const target = resolveRemote(spec);
350
+ if (!target)
351
+ throw new Error(`auth ${action} needs a remote`);
352
+ if (target.source === 'url' || target.source === 'default') {
353
+ throw new Error(`auth ${action} needs a named remote so the credential has an unambiguous env var. Configure ABX_REMOTE_<NAME>_URL, then run \`abx auth ${action} <name>\`.`);
354
+ }
355
+ return target;
356
+ }
357
+ export async function cmdAuth(args, flags) {
358
+ const positions = positionalArgs(args);
359
+ const subcommand = positions[0];
360
+ if ((subcommand !== 'login' && subcommand !== 'logout') || positions.length > 2) {
361
+ throw new Error('usage: abx auth <login|logout> [<remote-name>]');
362
+ }
363
+ if (flags.remote === 'true')
364
+ throw new Error('--remote needs a named remote, for example `--remote abx`');
365
+ const positionalTarget = positions[1];
366
+ const flagTarget = typeof flags.remote === 'string' && flags.remote !== 'true' ? flags.remote : undefined;
367
+ if (positionalTarget && flagTarget)
368
+ throw new Error('choose a positional remote name or --remote, not both');
369
+ const spec = positionalTarget ?? flagTarget ?? 'abx';
370
+ const target = targetForAuth(spec, subcommand);
371
+ const envPath = resolvePath(process.cwd(), '.env');
372
+ if (subcommand === 'logout') {
373
+ console.log(`\n ${bold('ABX logout')} ${dim(`→ ${target.url}`)}`);
374
+ const result = await oauthLogout({
375
+ baseUrl: target.url,
376
+ envVar: target.tokenVar,
377
+ envPath,
378
+ token: target.token
379
+ });
380
+ if (result.status === 'absent') {
381
+ info(`no ${target.tokenVar} credential is active; already logged out locally`);
382
+ return;
383
+ }
384
+ ok('revoked the current API key at the provider');
385
+ if (result.local === 'removed')
386
+ ok(`removed ${target.tokenVar} from ${basename(envPath)}`);
387
+ else if (result.local === 'external') {
388
+ info(`${target.tokenVar} came from your shell or another environment source; unset it there (the value is now revoked).`);
389
+ }
390
+ else {
391
+ info(`${basename(envPath)} contains a different ${target.tokenVar}; it is still active and was left unchanged. ` +
392
+ `Unset the shadowing environment value, then run logout again to revoke the file credential too.`);
393
+ }
394
+ return;
395
+ }
396
+ console.log(`\n ${bold('ABX device login')} ${dim(`→ ${target.url}`)}`);
397
+ info('Email and the one-time code stay in your browser. The CLI receives the API key after approval and never prints it.');
398
+ await deviceLogin({
399
+ baseUrl: target.url,
400
+ envVar: target.tokenVar,
401
+ envPath,
402
+ force: flags.force !== undefined,
403
+ noOpen: flags['no-open'] !== undefined
404
+ });
405
+ ok(`authorized and saved ${target.tokenVar} in your private .env (the key was not printed)`);
406
+ info(`verify it with ${g(`abx remote ${target.name?.toLowerCase() ?? spec}`)}`);
407
+ }
408
+ export const AUTH_HELP = `
409
+ ${bold('abx auth login')} [<remote-name>] ${dim('— authorize this CLI with OAuth 2.0 Device Authorization Grant')}
410
+ ${g('abx auth login')} first-party ABX Services (default)
411
+ ${g('abx auth login <name>')} another named remote configured by ABX_REMOTE_<NAME>_URL
412
+ ${g('--remote <name>')} equivalent target spelling for agent workflows
413
+ ${g('--no-open')} print the browser URL and code without trying to open it
414
+ ${g('--force')} recovery only: replace the local value without revoking the displaced key
415
+ ${dim(`The browser owns email + OTP approval. Only the waiting CLI receives the key, stores it as ${ABX_SERVICES_API_KEY_VAR}`)}
416
+ ${dim('(or the named remote\'s token variable), and never prints it. .env must be Git-ignored and must not be tracked.')}
417
+ ${dim('The stored key remains valid until revoked; reuse it across normal tasks and agent sessions.')}
418
+
419
+ ${bold('abx auth logout')} [<remote-name>] ${dim('— revoke the current API key, then remove its matching .env entry')}
420
+ ${g('abx auth logout')} first-party ABX Services (default)
421
+ ${g('abx auth logout <name>')} another named remote with OAuth revocation discovery
422
+ ${g('--remote <name>')} equivalent target spelling for agent workflows
423
+ ${dim('Use for teardown, compromise, rotation, or cleanup—not after each task. Remote revocation happens before local removal.')}`;
424
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
@@ -3658,7 +3658,8 @@ export async function cmdDeployCodeBody(flags, emit) {
3658
3658
  info(` ${dim('render mode (a still is never on-chain):')} ${bold('service')} (auto-render every mint/param change — a live/for-sale drop) · ${bold('once')} (fixed supply) · ${bold('none')} (placeholder). ${dim('freshness: no resolver ⇒ no chain-watcher ⇒ MANUAL/backfill (`abx render` after mints + each param change; the on-chain animation updates live, the bucket still does NOT). Continuous/live stills ⇒ run a resolver.')}`);
3659
3659
  // A managed provider whose descriptor says `render.attached` owns rendering — local
3660
3660
  // ABX_STORAGE_BACKEND is irrelevant, and warning "placeholder forever" is a lie.
3661
- if (hasPublicUrl && !loopbackBaseUrl(baseUrl)) {
3661
+ if (hasPublicUrl &&
3662
+ (!loopbackBaseUrl(baseUrl) || process.env.ABX_DEV_ALLOW_LOCALHOST_URI === '1')) {
3662
3663
  try {
3663
3664
  const d = await new AbxServiceClient({ baseUrl, timeoutMs: 2_500 }).descriptor();
3664
3665
  renderAttached = !!d.render?.attached;
@@ -3666,7 +3667,7 @@ export async function cmdDeployCodeBody(flags, emit) {
3666
3667
  catch { /* advisory — a down/non-ABX URL must not fail the dry run */ }
3667
3668
  }
3668
3669
  if (renderAttached) {
3669
- info(` ${dim('render storage home:')} ${bold('managed by the resolver')} ${dim(`(${baseUrl}) — local ABX_STORAGE_BACKEND is irrelevant; skip abx deploy-effects`)}`);
3670
+ info(` ${dim('render storage home:')} ${bold('managed by the resolver')} ${dim(`(${baseUrl}) — nothing local to configure`)}`);
3670
3671
  }
3671
3672
  else if (renderHome === 'fs') {
3672
3673
  // The fs render-home footgun bites the RESOLVER lane hardest (a hosted resolver can't read your
@@ -3699,6 +3700,10 @@ export async function cmdDeployCodeBody(flags, emit) {
3699
3700
  info(` ${g('nothing to render')} — the thumbnail is computed on-chain${hasProgram ? ' and the animation assembles on-chain from your script' : ''}; no runner, no bucket, no refresh. ` +
3700
3701
  `verify from chain: ${bold('abx tokenuri ' + (shownAddr ?? '<address>'))} ${dim('(decodes name + on-chain SVG + traits)')}`);
3701
3702
  }
3703
+ else if (renderAttached) {
3704
+ info(` ${dim('managed renderer:')} ${bold(baseUrl)} ${dim('owns the still + traits — no local runner, storage backend, or render command.')} ` +
3705
+ `verify: ${bold('abx verify ' + (shownAddr ?? '<address>') + ' --remote ' + baseUrl)}`);
3706
+ }
3702
3707
  else {
3703
3708
  const remoteRender = !(onChainUri && hasImageBase);
3704
3709
  info(` ${dim('stand up the runner:')} ${bold('abx deploy-effects --resolver-url ' + baseUrl)} · one-shot: ${bold('abx render ' + (shownAddr ?? '<address>') + (remoteRender ? ' --remote ' + baseUrl : ''))} · verify: ${bold('abx verify ' + (shownAddr ?? '<address>'))}`);
@@ -3714,7 +3719,10 @@ export async function cmdDeployCodeBody(flags, emit) {
3714
3719
  // combo, with what `abx render --remote`/`abx effects` enforce later — deploy-code can't know FOR
3715
3720
  // CERTAIN whether a future render will be remote or co-located, so this best-effort signal
3716
3721
  // mirrors the nudge above rather than hard-refusing a legitimate co-located workflow).
3717
- {
3722
+ if (renderAttached) {
3723
+ info(`render/storage ✓ managed by the resolver ${dim(`(${baseUrl}); local ABX_STORAGE_BACKEND is irrelevant`)}`);
3724
+ }
3725
+ else {
3718
3726
  const renderStorageBackendId = backendResolution(storageOverrides(flags)).backend;
3719
3727
  const renderStorageOpts = storageOptions(storageOverrides(flags));
3720
3728
  const renderStorageCombo = validateRenderStorageCombo({
@@ -3735,7 +3743,7 @@ export async function cmdDeployCodeBody(flags, emit) {
3735
3743
  // bare `✓ fs + --image-base` sat a few lines under "render storage home is fs … placeholder
3736
3744
  // forever" and read as though it overruled it. Name what the ✓ covers, and point at the other
3737
3745
  // line when that one is unhappy, so one setup stops producing two verdicts.
3738
- const fsHomeUnresolved = renderHome === 'fs' && !renderAttached && !imageOrphaned && !hasImageRenderer;
3746
+ const fsHomeUnresolved = renderHome === 'fs' && !imageOrphaned && !hasImageRenderer;
3739
3747
  if (renderStorageCombo.ok) {
3740
3748
  const scope = hasImageBase ? '--image-base is a valid mutable target' : `${renderStorageBackendId} can serve what it stores`;
3741
3749
  info(`render/storage ✓ ${scope}` +