@artblocks/abx-cli 0.1.0-alpha.4 → 0.1.0-alpha.40
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 +16 -0
- package/assets/renderer-scaffold/README.md +29 -11
- package/assets/renderer-scaffold/foundry.toml +1 -0
- package/assets/renderer-scaffold/remappings.txt +1 -1
- package/assets/renderer-scaffold/script/DeployHooks.s.sol +24 -0
- package/assets/renderer-scaffold/src/MyHooks.sol +20 -0
- package/assets/renderer-scaffold/src/MyRenderer.sol +4 -4
- package/assets/renderer-scaffold/src/MyTraits.sol +2 -2
- package/assets/renderer-scaffold/test/MyRenderer.t.sol +60 -3
- package/dist/bin.d.ts +26 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +63 -0
- package/dist/bin.js.map +1 -0
- package/dist/capabilities.d.ts +94 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +135 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/commands/auth.d.ts +54 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +447 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/deploy.d.ts +242 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +4763 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/feedback.d.ts +7 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +147 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/project.d.ts +257 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +1414 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/reads.d.ts +64 -0
- package/dist/commands/reads.d.ts.map +1 -0
- package/dist/commands/reads.js +701 -0
- package/dist/commands/reads.js.map +1 -0
- package/dist/commands/scaffold.d.ts +89 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/scaffold.js +733 -0
- package/dist/commands/scaffold.js.map +1 -0
- package/dist/commands/service.d.ts +67 -0
- package/dist/commands/service.d.ts.map +1 -0
- package/dist/commands/service.js +741 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/storage.d.ts +51 -0
- package/dist/commands/storage.d.ts.map +1 -0
- package/dist/commands/storage.js +370 -0
- package/dist/commands/storage.js.map +1 -0
- package/dist/commands/submit-app.d.ts +59 -0
- package/dist/commands/submit-app.d.ts.map +1 -0
- package/dist/commands/submit-app.js +513 -0
- package/dist/commands/submit-app.js.map +1 -0
- package/dist/config.d.ts +90 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +284 -11
- package/dist/config.js.map +1 -1
- package/dist/conformance.d.ts +31 -0
- package/dist/conformance.d.ts.map +1 -0
- package/dist/conformance.js +390 -0
- package/dist/conformance.js.map +1 -0
- package/dist/contract-read-error.d.ts +5 -0
- package/dist/contract-read-error.d.ts.map +1 -0
- package/dist/contract-read-error.js +37 -0
- package/dist/contract-read-error.js.map +1 -0
- package/dist/deps.d.ts +6 -39
- package/dist/deps.d.ts.map +1 -1
- package/dist/deps.js +4 -68
- package/dist/deps.js.map +1 -1
- package/dist/errors.d.ts +20 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +25 -0
- package/dist/errors.js.map +1 -0
- package/dist/flag-allowlists.d.ts +53 -0
- package/dist/flag-allowlists.d.ts.map +1 -0
- package/dist/flag-allowlists.js +180 -0
- package/dist/flag-allowlists.js.map +1 -0
- package/dist/flags.d.ts +41 -0
- package/dist/flags.d.ts.map +1 -1
- package/dist/flags.js +111 -1
- package/dist/flags.js.map +1 -1
- package/dist/jsonout.d.ts +37 -0
- package/dist/jsonout.d.ts.map +1 -0
- package/dist/jsonout.js +68 -0
- package/dist/jsonout.js.map +1 -0
- package/dist/kind.d.ts +57 -0
- package/dist/kind.d.ts.map +1 -0
- package/dist/kind.js +122 -0
- package/dist/kind.js.map +1 -0
- package/dist/main.js +747 -4838
- package/dist/main.js.map +1 -1
- package/dist/mintpage.d.ts +17 -2
- package/dist/mintpage.d.ts.map +1 -1
- package/dist/mintpage.js +241 -54
- package/dist/mintpage.js.map +1 -1
- package/dist/output.d.ts +179 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +780 -0
- package/dist/output.js.map +1 -0
- package/dist/ownerops.d.ts +312 -57
- package/dist/ownerops.d.ts.map +1 -1
- package/dist/ownerops.js +1808 -357
- package/dist/ownerops.js.map +1 -1
- package/dist/preview.d.ts +23 -5
- package/dist/preview.d.ts.map +1 -1
- package/dist/preview.js +95 -43
- package/dist/preview.js.map +1 -1
- package/dist/prompt.d.ts +17 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +19 -0
- package/dist/prompt.js.map +1 -0
- package/dist/provision.d.ts +3 -13
- package/dist/provision.d.ts.map +1 -1
- package/dist/provision.js +19 -21
- package/dist/provision.js.map +1 -1
- package/dist/remote.d.ts +157 -52
- package/dist/remote.d.ts.map +1 -1
- package/dist/remote.js +435 -46
- package/dist/remote.js.map +1 -1
- package/dist/riskgate.d.ts +62 -0
- package/dist/riskgate.d.ts.map +1 -0
- package/dist/riskgate.js +234 -0
- package/dist/riskgate.js.map +1 -0
- package/dist/scaffold.d.ts +12 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +56 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/schema.d.ts +36 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +121 -26
- package/dist/schema.js.map +1 -1
- package/dist/script-chunks.d.ts +8 -0
- package/dist/script-chunks.d.ts.map +1 -0
- package/dist/script-chunks.js +35 -0
- package/dist/script-chunks.js.map +1 -0
- package/dist/served.d.ts +30 -0
- package/dist/served.d.ts.map +1 -0
- package/dist/served.js +112 -0
- package/dist/served.js.map +1 -0
- package/dist/signer.d.ts +13 -0
- package/dist/signer.d.ts.map +1 -1
- package/dist/signer.js +84 -15
- package/dist/signer.js.map +1 -1
- package/dist/update-check.d.ts +86 -5
- package/dist/update-check.d.ts.map +1 -1
- package/dist/update-check.js +161 -20
- package/dist/update-check.js.map +1 -1
- package/package.json +13 -12
- package/skill/SKILL.md +179 -347
- package/skill/agents/openai.yaml +4 -0
- package/skill/reference/capabilities.md +188 -0
- package/skill/reference/code.md +211 -0
- package/skill/reference/creator-token.md +94 -0
- package/skill/reference/deploy.md +167 -0
- package/skill/reference/diagnose.md +165 -0
- package/skill/reference/hosting.md +161 -94
- package/skill/reference/operate.md +181 -0
- package/skill/reference/services.md +121 -0
- package/skill/reference/setup.md +140 -36
- package/assets/renderer-scaffold/src/interfaces/IAbxFieldRenderer.sol +0 -32
- package/assets/renderer-scaffold/src/interfaces/IAbxParams.sol +0 -26
- package/dist/inspect.d.ts +0 -48
- package/dist/inspect.d.ts.map +0 -1
- package/dist/inspect.js +0 -184
- package/dist/inspect.js.map +0 -1
- package/dist/migrate.d.ts +0 -65
- package/dist/migrate.d.ts.map +0 -1
- package/dist/migrate.js +0 -180
- package/dist/migrate.js.map +0 -1
- package/dist/onchain-uri.d.ts +0 -97
- package/dist/onchain-uri.d.ts.map +0 -1
- package/dist/onchain-uri.js +0 -243
- package/dist/onchain-uri.js.map +0 -1
- package/dist/upload.d.ts +0 -28
- package/dist/upload.d.ts.map +0 -1
- package/dist/upload.js +0 -41
- package/dist/upload.js.map +0 -1
- package/skill/reference/code-projects.md +0 -246
- package/skill/reference/operating.md +0 -116
- package/skill/reference/troubleshooting.md +0 -28
|
@@ -0,0 +1,54 @@
|
|
|
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
|
+
/** Refuse the two silent secret-exposure modes: replacing a tracked file, or creating an unignored
|
|
33
|
+
* .env inside a Git worktree. A non-Git directory is fine. */
|
|
34
|
+
export declare function assertPrivateEnvPath(envPath: string): void;
|
|
35
|
+
/** Bearer-token grammar (RFC 6750) — the default value shape {@link saveEnvSecret} accepts. Exported
|
|
36
|
+
* so a caller writing something differently-shaped (a URL, say) can pass its own `valuePattern`
|
|
37
|
+
* instead of fighting this one. */
|
|
38
|
+
export declare const BEARER_TOKEN_PATTERN: RegExp;
|
|
39
|
+
export declare function saveEnvSecret(envPath: string, key: string, value: string, valuePattern?: RegExp): void;
|
|
40
|
+
/** Validate and replace several env values with one atomic rename. A credential pair must never
|
|
41
|
+
* land half-updated because the process stopped between two individually-atomic writes. */
|
|
42
|
+
export declare function saveEnvSecrets(envPath: string, entries: Array<{
|
|
43
|
+
key: string;
|
|
44
|
+
value: string;
|
|
45
|
+
valuePattern?: RegExp;
|
|
46
|
+
}>): void;
|
|
47
|
+
/** Standards-only core, dependency-injected for a no-secret-output regression test. */
|
|
48
|
+
export declare function deviceLogin(options: DeviceLoginOptions, deps?: DeviceLoginDeps): Promise<void>;
|
|
49
|
+
/** RFC 7009 logout: revoke remotely first, then remove the matching local assignment. Keeping the
|
|
50
|
+
* credential when discovery or revocation fails preserves the user's ability to retry safely. */
|
|
51
|
+
export declare function oauthLogout(options: OAuthLogoutOptions, deps?: OAuthLogoutDeps): Promise<OAuthLogoutResult>;
|
|
52
|
+
export declare function cmdAuth(args: string[], flags: Flags): Promise<void>;
|
|
53
|
+
export declare const AUTH_HELP: string;
|
|
54
|
+
//# 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;AAqGtE;8DAC8D;AAC9D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAc1D;AAED;;oCAEoC;AACpC,eAAO,MAAM,oBAAoB,QAA8B,CAAA;AAE/D,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,GAAE,MAA6B,GAAG,IAAI,CAE5H;AAED;2FAC2F;AAC3F,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC,GAClE,IAAI,CA+CN;AA4DD,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,447 @@
|
|
|
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
|
+
export 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
|
+
/** Bearer-token grammar (RFC 6750) — the default value shape {@link saveEnvSecret} accepts. Exported
|
|
118
|
+
* so a caller writing something differently-shaped (a URL, say) can pass its own `valuePattern`
|
|
119
|
+
* instead of fighting this one. */
|
|
120
|
+
export const BEARER_TOKEN_PATTERN = /^[A-Za-z0-9._~+/-]+={0,}$/;
|
|
121
|
+
export function saveEnvSecret(envPath, key, value, valuePattern = BEARER_TOKEN_PATTERN) {
|
|
122
|
+
saveEnvSecrets(envPath, [{ key, value, valuePattern }]);
|
|
123
|
+
}
|
|
124
|
+
/** Validate and replace several env values with one atomic rename. A credential pair must never
|
|
125
|
+
* land half-updated because the process stopped between two individually-atomic writes. */
|
|
126
|
+
export function saveEnvSecrets(envPath, entries) {
|
|
127
|
+
if (!entries.length)
|
|
128
|
+
return;
|
|
129
|
+
const values = new Map();
|
|
130
|
+
for (const { key, value, valuePattern = BEARER_TOKEN_PATTERN } of entries) {
|
|
131
|
+
// Safe to round-trip through the CLI's minimal .env parser. Reject anything broader instead of
|
|
132
|
+
// quoting a provider-controlled value incorrectly — this is a plain `KEY=value` writer, no shell
|
|
133
|
+
// quoting, so a value that could ever contain a newline (or otherwise break the line grammar) is
|
|
134
|
+
// the actual risk `valuePattern` guards against, not "this specific value doesn't look like X".
|
|
135
|
+
if (!/^[A-Z][A-Z0-9_]*$/.test(key) || !valuePattern.test(value) || values.has(key)) {
|
|
136
|
+
throw new Error('the provided values cannot be stored safely in an environment file');
|
|
137
|
+
}
|
|
138
|
+
values.set(key, value);
|
|
139
|
+
}
|
|
140
|
+
const source = existsSync(envPath) ? readFileSync(envPath, 'utf8') : '';
|
|
141
|
+
const eol = source.includes('\r\n') ? '\r\n' : '\n';
|
|
142
|
+
const lines = source ? source.split(/\r?\n/) : [];
|
|
143
|
+
const next = [];
|
|
144
|
+
const replaced = new Set();
|
|
145
|
+
for (const line of lines) {
|
|
146
|
+
const found = [...values.keys()].find((key) => {
|
|
147
|
+
const escaped = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
148
|
+
return new RegExp(`^\\s*(?:export\\s+)?${escaped}\\s*=`).test(line);
|
|
149
|
+
});
|
|
150
|
+
if (!found) {
|
|
151
|
+
next.push(line);
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (!replaced.has(found))
|
|
155
|
+
next.push(`${found}=${values.get(found)}`);
|
|
156
|
+
replaced.add(found);
|
|
157
|
+
}
|
|
158
|
+
let appended = false;
|
|
159
|
+
for (const [key, value] of values) {
|
|
160
|
+
if (replaced.has(key))
|
|
161
|
+
continue;
|
|
162
|
+
if (!appended && next.length && next[next.length - 1] !== '')
|
|
163
|
+
next.push('');
|
|
164
|
+
next.push(`${key}=${value}`);
|
|
165
|
+
appended = true;
|
|
166
|
+
}
|
|
167
|
+
while (next[next.length - 1] === '')
|
|
168
|
+
next.pop();
|
|
169
|
+
const output = `${next.join(eol)}${eol}`;
|
|
170
|
+
const temp = resolvePath(dirname(envPath), `.${basename(envPath)}.${process.pid}.${randomBytes(6).toString('hex')}.tmp`);
|
|
171
|
+
try {
|
|
172
|
+
writeFileSync(temp, output, { encoding: 'utf8', mode: 0o600 });
|
|
173
|
+
renameSync(temp, envPath);
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
if (existsSync(temp))
|
|
177
|
+
unlinkSync(temp);
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function envFileValue(envPath, key) {
|
|
182
|
+
if (!existsSync(envPath))
|
|
183
|
+
return undefined;
|
|
184
|
+
return parseEnvContent(readFileSync(envPath, 'utf8')).entries.find(([entryKey]) => entryKey === key)?.[1];
|
|
185
|
+
}
|
|
186
|
+
function envAssignmentKey(line) {
|
|
187
|
+
let candidate = line.trim();
|
|
188
|
+
if (!candidate || candidate.startsWith('#'))
|
|
189
|
+
return undefined;
|
|
190
|
+
candidate = candidate.replace(/^export\s+/, '');
|
|
191
|
+
const equals = candidate.indexOf('=');
|
|
192
|
+
return equals === -1 ? undefined : candidate.slice(0, equals).trim();
|
|
193
|
+
}
|
|
194
|
+
/** Remove every active assignment for one key. If conflicting duplicates existed, leaving a hidden
|
|
195
|
+
* assignment behind would silently log the next process back in, so logout removes the whole set. */
|
|
196
|
+
function removeEnvSecret(envPath, key, expectedValue) {
|
|
197
|
+
if (!existsSync(envPath))
|
|
198
|
+
return false;
|
|
199
|
+
if (lstatSync(envPath).isSymbolicLink()) {
|
|
200
|
+
throw new Error(`API key was revoked at the provider, but refusing to modify symbolic-link ${basename(envPath)}`);
|
|
201
|
+
}
|
|
202
|
+
const source = readFileSync(envPath, 'utf8');
|
|
203
|
+
if (!activeEnvLine(source, key) || envFileValue(envPath, key) !== expectedValue)
|
|
204
|
+
return false;
|
|
205
|
+
const eol = source.includes('\r\n') ? '\r\n' : '\n';
|
|
206
|
+
const output = source
|
|
207
|
+
.split(/\r?\n/)
|
|
208
|
+
.filter((line) => envAssignmentKey(line) !== key)
|
|
209
|
+
.join(eol);
|
|
210
|
+
const temp = resolvePath(dirname(envPath), `.${basename(envPath)}.${process.pid}.${randomBytes(6).toString('hex')}.tmp`);
|
|
211
|
+
try {
|
|
212
|
+
writeFileSync(temp, output, { encoding: 'utf8', mode: 0o600 });
|
|
213
|
+
renameSync(temp, envPath);
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
if (existsSync(temp))
|
|
217
|
+
unlinkSync(temp);
|
|
218
|
+
const detail = error instanceof Error ? safeDescription(error.message) : '';
|
|
219
|
+
throw new Error(`API key was revoked at the provider, but ${key} could not be removed from ${basename(envPath)}: ${detail || 'filesystem error'}`);
|
|
220
|
+
}
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
function assertLoginDestination(options) {
|
|
224
|
+
assertPrivateEnvPath(options.envPath);
|
|
225
|
+
const source = existsSync(options.envPath) ? readFileSync(options.envPath, 'utf8') : '';
|
|
226
|
+
const fileValue = parseEnvContent(source).entries.find(([key]) => key === options.envVar)?.[1];
|
|
227
|
+
if (activeEnvLine(source, options.envVar) && !options.force) {
|
|
228
|
+
throw new Error(`${options.envVar} already exists in ${basename(options.envPath)}; run \`abx auth logout\` before login to revoke it, ` +
|
|
229
|
+
'or pass --force to replace only the local value without revoking the old key');
|
|
230
|
+
}
|
|
231
|
+
if (process.env[options.envVar] !== undefined && process.env[options.envVar] !== fileValue) {
|
|
232
|
+
throw new Error(`${options.envVar} is already set outside ${basename(options.envPath)}. Unset it before login so it cannot shadow the newly issued key.`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/** Standards-only core, dependency-injected for a no-secret-output regression test. */
|
|
236
|
+
export async function deviceLogin(options, deps = {}) {
|
|
237
|
+
assertLoginDestination(options);
|
|
238
|
+
const fetchImpl = deps.fetchImpl ?? fetch;
|
|
239
|
+
const sleep = deps.sleep ?? defaultSleep;
|
|
240
|
+
const now = deps.now ?? Date.now;
|
|
241
|
+
const openBrowser = deps.openBrowser ?? defaultOpenBrowser;
|
|
242
|
+
const line = deps.line ?? console.log;
|
|
243
|
+
const warning = deps.warning ?? console.warn;
|
|
244
|
+
const metadata = await discoverOAuthMetadata(options.baseUrl, fetchImpl);
|
|
245
|
+
if (!metadata.grant_types_supported?.includes(DEVICE_GRANT_TYPE)) {
|
|
246
|
+
throw new Error('the provider does not advertise the OAuth device authorization grant');
|
|
247
|
+
}
|
|
248
|
+
const deviceEndpoint = assertUrl(metadata.device_authorization_endpoint, 'device_authorization_endpoint');
|
|
249
|
+
const tokenEndpoint = assertUrl(metadata.token_endpoint, 'token_endpoint');
|
|
250
|
+
const startResponse = await fetchImpl(deviceEndpoint, {
|
|
251
|
+
method: 'POST',
|
|
252
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded', accept: 'application/json' },
|
|
253
|
+
body: new URLSearchParams({ client_id: DEVICE_CLIENT_ID }),
|
|
254
|
+
signal: AbortSignal.timeout(15_000)
|
|
255
|
+
});
|
|
256
|
+
const startBody = await jsonObject(startResponse);
|
|
257
|
+
if (!startResponse.ok)
|
|
258
|
+
throw oauthFailure('device authorization failed', startResponse, startBody);
|
|
259
|
+
const grant = startBody;
|
|
260
|
+
if (typeof grant.device_code !== 'string' ||
|
|
261
|
+
typeof grant.user_code !== 'string' ||
|
|
262
|
+
typeof grant.expires_in !== 'number' ||
|
|
263
|
+
!Number.isFinite(grant.expires_in) ||
|
|
264
|
+
grant.expires_in <= 0) {
|
|
265
|
+
throw new Error('the provider returned an invalid device authorization response');
|
|
266
|
+
}
|
|
267
|
+
const verificationUrl = assertUrl(grant.verification_uri_complete ?? grant.verification_uri, 'verification_uri');
|
|
268
|
+
let pollSeconds = typeof grant.interval === 'number' && Number.isFinite(grant.interval) && grant.interval >= 1
|
|
269
|
+
? grant.interval
|
|
270
|
+
: 5;
|
|
271
|
+
const deadline = now() + grant.expires_in * 1000;
|
|
272
|
+
line(`Browser approval: ${verificationUrl}`);
|
|
273
|
+
line(`Confirm code: ${grant.user_code}`);
|
|
274
|
+
if (!options.noOpen && !openBrowser(verificationUrl)) {
|
|
275
|
+
warning('Could not open a browser automatically; open the approval URL above.');
|
|
276
|
+
}
|
|
277
|
+
line('Waiting for human approval…');
|
|
278
|
+
while (now() < deadline) {
|
|
279
|
+
await sleep(pollSeconds * 1000);
|
|
280
|
+
// Re-check before polling so a destination changed during the human approval wait normally
|
|
281
|
+
// aborts before the provider consumes a one-time grant and issues an orphaned credential.
|
|
282
|
+
assertLoginDestination(options);
|
|
283
|
+
let response;
|
|
284
|
+
try {
|
|
285
|
+
response = await fetchImpl(tokenEndpoint, {
|
|
286
|
+
method: 'POST',
|
|
287
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded', accept: 'application/json' },
|
|
288
|
+
body: new URLSearchParams({
|
|
289
|
+
grant_type: DEVICE_GRANT_TYPE,
|
|
290
|
+
client_id: DEVICE_CLIENT_ID,
|
|
291
|
+
device_code: grant.device_code
|
|
292
|
+
}),
|
|
293
|
+
signal: AbortSignal.timeout(15_000)
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
pollSeconds = Math.min(Math.max(pollSeconds * 2, 5), 30);
|
|
298
|
+
warning(`The provider is temporarily unreachable; retrying in ${pollSeconds}s.`);
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
const body = await jsonObject(response);
|
|
302
|
+
if (response.ok) {
|
|
303
|
+
const accessToken = body.access_token;
|
|
304
|
+
if (typeof accessToken !== 'string' || !accessToken || /[\r\n]/.test(accessToken)) {
|
|
305
|
+
throw new Error('the provider returned an invalid OAuth access token');
|
|
306
|
+
}
|
|
307
|
+
if (typeof body.token_type !== 'string' || body.token_type.toLowerCase() !== 'bearer') {
|
|
308
|
+
throw new Error('the provider returned an unsupported OAuth token type');
|
|
309
|
+
}
|
|
310
|
+
// Re-check after the human wait: another process must not have tracked, unignored, symlinked,
|
|
311
|
+
// or newly populated the destination while this command was polling.
|
|
312
|
+
assertLoginDestination(options);
|
|
313
|
+
saveEnvSecret(options.envPath, options.envVar, accessToken);
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const code = safeDescription(body.error);
|
|
317
|
+
if (code === 'authorization_pending')
|
|
318
|
+
continue;
|
|
319
|
+
if (code === 'slow_down') {
|
|
320
|
+
pollSeconds += 5;
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
if (response.status === 429 || response.status >= 500) {
|
|
324
|
+
const retryAfter = Number(response.headers.get('retry-after'));
|
|
325
|
+
pollSeconds = Number.isFinite(retryAfter) && retryAfter > 0 ? retryAfter : Math.min(pollSeconds * 2, 30);
|
|
326
|
+
warning(`The provider asked the CLI to wait; retrying in ${pollSeconds}s.`);
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
if (code === 'access_denied')
|
|
330
|
+
throw new Error('device authorization was denied');
|
|
331
|
+
if (code === 'expired_token')
|
|
332
|
+
throw new Error('device authorization expired; run login again');
|
|
333
|
+
throw oauthFailure('OAuth token exchange failed', response, body, [grant.device_code]);
|
|
334
|
+
}
|
|
335
|
+
throw new Error('device authorization expired; run login again');
|
|
336
|
+
}
|
|
337
|
+
/** RFC 7009 logout: revoke remotely first, then remove the matching local assignment. Keeping the
|
|
338
|
+
* credential when discovery or revocation fails preserves the user's ability to retry safely. */
|
|
339
|
+
export async function oauthLogout(options, deps = {}) {
|
|
340
|
+
const fileValue = envFileValue(options.envPath, options.envVar);
|
|
341
|
+
const token = options.token || fileValue;
|
|
342
|
+
if (!token)
|
|
343
|
+
return { status: 'absent' };
|
|
344
|
+
const fetchImpl = deps.fetchImpl ?? fetch;
|
|
345
|
+
const metadata = await discoverOAuthMetadata(options.baseUrl, fetchImpl);
|
|
346
|
+
const revocationEndpoint = assertUrl(metadata.revocation_endpoint, 'revocation_endpoint');
|
|
347
|
+
const response = await fetchImpl(revocationEndpoint, {
|
|
348
|
+
method: 'POST',
|
|
349
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded', accept: 'application/json' },
|
|
350
|
+
body: new URLSearchParams({
|
|
351
|
+
client_id: DEVICE_CLIENT_ID,
|
|
352
|
+
token,
|
|
353
|
+
token_type_hint: 'access_token'
|
|
354
|
+
}),
|
|
355
|
+
signal: AbortSignal.timeout(15_000)
|
|
356
|
+
});
|
|
357
|
+
if (!response.ok) {
|
|
358
|
+
const body = await jsonObject(response);
|
|
359
|
+
throw oauthFailure('OAuth token revocation failed', response, body, [token]);
|
|
360
|
+
}
|
|
361
|
+
const currentFileValue = envFileValue(options.envPath, options.envVar);
|
|
362
|
+
const local = currentFileValue === token && removeEnvSecret(options.envPath, options.envVar, token)
|
|
363
|
+
? 'removed'
|
|
364
|
+
: currentFileValue === undefined
|
|
365
|
+
? 'external'
|
|
366
|
+
: 'different';
|
|
367
|
+
if (process.env[options.envVar] === token)
|
|
368
|
+
delete process.env[options.envVar];
|
|
369
|
+
return { status: 'revoked', local };
|
|
370
|
+
}
|
|
371
|
+
function targetForAuth(spec, action) {
|
|
372
|
+
const target = resolveRemote(spec);
|
|
373
|
+
if (!target)
|
|
374
|
+
throw new Error(`auth ${action} needs a remote`);
|
|
375
|
+
if (target.source === 'url' || target.source === 'default') {
|
|
376
|
+
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>\`.`);
|
|
377
|
+
}
|
|
378
|
+
return target;
|
|
379
|
+
}
|
|
380
|
+
export async function cmdAuth(args, flags) {
|
|
381
|
+
const positions = positionalArgs(args);
|
|
382
|
+
const subcommand = positions[0];
|
|
383
|
+
if ((subcommand !== 'login' && subcommand !== 'logout') || positions.length > 2) {
|
|
384
|
+
throw new Error('usage: abx auth <login|logout> [<remote-name>]');
|
|
385
|
+
}
|
|
386
|
+
if (flags.remote === 'true')
|
|
387
|
+
throw new Error('--remote needs a named remote, for example `--remote abx`');
|
|
388
|
+
const positionalTarget = positions[1];
|
|
389
|
+
const flagTarget = typeof flags.remote === 'string' && flags.remote !== 'true' ? flags.remote : undefined;
|
|
390
|
+
if (positionalTarget && flagTarget)
|
|
391
|
+
throw new Error('choose a positional remote name or --remote, not both');
|
|
392
|
+
const spec = positionalTarget ?? flagTarget ?? 'abx';
|
|
393
|
+
const target = targetForAuth(spec, subcommand);
|
|
394
|
+
const envPath = resolvePath(process.cwd(), '.env');
|
|
395
|
+
if (subcommand === 'logout') {
|
|
396
|
+
console.log(`\n ${bold('ABX logout')} ${dim(`→ ${target.url}`)}`);
|
|
397
|
+
const result = await oauthLogout({
|
|
398
|
+
baseUrl: target.url,
|
|
399
|
+
envVar: target.tokenVar,
|
|
400
|
+
envPath,
|
|
401
|
+
token: target.token
|
|
402
|
+
});
|
|
403
|
+
if (result.status === 'absent') {
|
|
404
|
+
info(`no ${target.tokenVar} credential is active; already logged out locally`);
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
ok('revoked the current API key at the provider');
|
|
408
|
+
if (result.local === 'removed')
|
|
409
|
+
ok(`removed ${target.tokenVar} from ${basename(envPath)}`);
|
|
410
|
+
else if (result.local === 'external') {
|
|
411
|
+
info(`${target.tokenVar} came from your shell or another environment source; unset it there (the value is now revoked).`);
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
info(`${basename(envPath)} contains a different ${target.tokenVar}; it is still active and was left unchanged. ` +
|
|
415
|
+
`Unset the shadowing environment value, then run logout again to revoke the file credential too.`);
|
|
416
|
+
}
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
console.log(`\n ${bold('ABX device login')} ${dim(`→ ${target.url}`)}`);
|
|
420
|
+
info('Email and the one-time code stay in your browser. The CLI receives the API key after approval and never prints it.');
|
|
421
|
+
await deviceLogin({
|
|
422
|
+
baseUrl: target.url,
|
|
423
|
+
envVar: target.tokenVar,
|
|
424
|
+
envPath,
|
|
425
|
+
force: flags.force !== undefined,
|
|
426
|
+
noOpen: flags['no-open'] !== undefined
|
|
427
|
+
});
|
|
428
|
+
ok(`authorized and saved ${target.tokenVar} in your private .env (the key was not printed)`);
|
|
429
|
+
info(`verify it with ${g(`abx remote ${target.name?.toLowerCase() ?? spec}`)}`);
|
|
430
|
+
}
|
|
431
|
+
export const AUTH_HELP = `
|
|
432
|
+
${bold('abx auth login')} [<remote-name>] ${dim('— authorize this CLI with OAuth 2.0 Device Authorization Grant')}
|
|
433
|
+
${g('abx auth login')} first-party ABX Services (default)
|
|
434
|
+
${g('abx auth login <name>')} another named remote configured by ABX_REMOTE_<NAME>_URL
|
|
435
|
+
${g('--remote <name>')} equivalent target spelling for agent workflows
|
|
436
|
+
${g('--no-open')} print the browser URL and code without trying to open it
|
|
437
|
+
${g('--force')} recovery only: replace the local value without revoking the displaced key
|
|
438
|
+
${dim(`The browser owns email + OTP approval. Only the waiting CLI receives the key, stores it as ${ABX_SERVICES_API_KEY_VAR}`)}
|
|
439
|
+
${dim('(or the named remote\'s token variable), and never prints it. .env must be Git-ignored and must not be tracked.')}
|
|
440
|
+
${dim('The stored key remains valid until revoked; reuse it across normal tasks and agent sessions.')}
|
|
441
|
+
|
|
442
|
+
${bold('abx auth logout')} [<remote-name>] ${dim('— revoke the current API key, then remove its matching .env entry')}
|
|
443
|
+
${g('abx auth logout')} first-party ABX Services (default)
|
|
444
|
+
${g('abx auth logout <name>')} another named remote with OAuth revocation discovery
|
|
445
|
+
${g('--remote <name>')} equivalent target spelling for agent workflows
|
|
446
|
+
${dim('Use for teardown, compromise, rotation, or cleanup—not after each task. Remote revocation happens before local removal.')}`;
|
|
447
|
+
//# 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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"}
|