@arizeai/phoenix-cli 1.9.0 → 1.10.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.
Files changed (119) hide show
  1. package/README.md +82 -7
  2. package/build/authFetch.d.ts +24 -0
  3. package/build/authFetch.d.ts.map +1 -0
  4. package/build/authFetch.js +44 -0
  5. package/build/authFetch.js.map +1 -0
  6. package/build/client.d.ts.map +1 -1
  7. package/build/client.js +5 -1
  8. package/build/client.js.map +1 -1
  9. package/build/commands/api.d.ts.map +1 -1
  10. package/build/commands/api.js +12 -1
  11. package/build/commands/api.js.map +1 -1
  12. package/build/commands/auth.d.ts +4 -1
  13. package/build/commands/auth.d.ts.map +1 -1
  14. package/build/commands/auth.js +326 -13
  15. package/build/commands/auth.js.map +1 -1
  16. package/build/commands/formatSetup.d.ts +12 -0
  17. package/build/commands/formatSetup.d.ts.map +1 -1
  18. package/build/commands/formatSetup.js +32 -1
  19. package/build/commands/formatSetup.js.map +1 -1
  20. package/build/commands/setup.d.ts.map +1 -1
  21. package/build/commands/setup.js +14 -38
  22. package/build/commands/setup.js.map +1 -1
  23. package/build/commands/setupErrors.d.ts +10 -0
  24. package/build/commands/setupErrors.d.ts.map +1 -0
  25. package/build/commands/setupErrors.js +54 -0
  26. package/build/commands/setupErrors.js.map +1 -0
  27. package/build/commands/setupMcp.d.ts +15 -0
  28. package/build/commands/setupMcp.d.ts.map +1 -0
  29. package/build/commands/setupMcp.js +141 -0
  30. package/build/commands/setupMcp.js.map +1 -0
  31. package/build/config.d.ts +15 -0
  32. package/build/config.d.ts.map +1 -1
  33. package/build/config.js +54 -7
  34. package/build/config.js.map +1 -1
  35. package/build/exitCodes.d.ts +6 -0
  36. package/build/exitCodes.d.ts.map +1 -1
  37. package/build/exitCodes.js +18 -0
  38. package/build/exitCodes.js.map +1 -1
  39. package/build/index.js +2 -1
  40. package/build/index.js.map +1 -1
  41. package/build/oauth.d.ts +138 -0
  42. package/build/oauth.d.ts.map +1 -0
  43. package/build/oauth.js +465 -0
  44. package/build/oauth.js.map +1 -0
  45. package/build/oauthCallbackPage.d.ts +9 -0
  46. package/build/oauthCallbackPage.d.ts.map +1 -0
  47. package/build/oauthCallbackPage.js +111 -0
  48. package/build/oauthCallbackPage.js.map +1 -0
  49. package/build/pxi/client.d.ts.map +1 -1
  50. package/build/pxi/client.js +11 -2
  51. package/build/pxi/client.js.map +1 -1
  52. package/build/settings.d.ts +19 -0
  53. package/build/settings.d.ts.map +1 -1
  54. package/build/settings.js +21 -0
  55. package/build/settings.js.map +1 -1
  56. package/build/setup/agents/registry.d.ts +61 -0
  57. package/build/setup/agents/registry.d.ts.map +1 -1
  58. package/build/setup/agents/registry.js +52 -3
  59. package/build/setup/agents/registry.js.map +1 -1
  60. package/build/setup/copy.d.ts +32 -0
  61. package/build/setup/copy.d.ts.map +1 -1
  62. package/build/setup/copy.js +44 -0
  63. package/build/setup/copy.js.map +1 -1
  64. package/build/setup/deps/buildDefaultDeps.d.ts.map +1 -1
  65. package/build/setup/deps/buildDefaultDeps.js +2 -0
  66. package/build/setup/deps/buildDefaultDeps.js.map +1 -1
  67. package/build/setup/deps/index.d.ts +4 -0
  68. package/build/setup/deps/index.d.ts.map +1 -1
  69. package/build/setup/deps/index.js.map +1 -1
  70. package/build/setup/deps/oauthLogin.d.ts +64 -0
  71. package/build/setup/deps/oauthLogin.d.ts.map +1 -0
  72. package/build/setup/deps/oauthLogin.js +82 -0
  73. package/build/setup/deps/oauthLogin.js.map +1 -0
  74. package/build/setup/deps/prompter.d.ts +7 -0
  75. package/build/setup/deps/prompter.d.ts.map +1 -1
  76. package/build/setup/mcp/agents.d.ts +91 -0
  77. package/build/setup/mcp/agents.d.ts.map +1 -0
  78. package/build/setup/mcp/agents.js +265 -0
  79. package/build/setup/mcp/agents.js.map +1 -0
  80. package/build/setup/mcp/install.d.ts +34 -0
  81. package/build/setup/mcp/install.d.ts.map +1 -0
  82. package/build/setup/mcp/install.js +76 -0
  83. package/build/setup/mcp/install.js.map +1 -0
  84. package/build/setup/mcp/runSetupMcp.d.ts +68 -0
  85. package/build/setup/mcp/runSetupMcp.d.ts.map +1 -0
  86. package/build/setup/mcp/runSetupMcp.js +235 -0
  87. package/build/setup/mcp/runSetupMcp.js.map +1 -0
  88. package/build/setup/options.d.ts +11 -0
  89. package/build/setup/options.d.ts.map +1 -1
  90. package/build/setup/options.js +1 -0
  91. package/build/setup/options.js.map +1 -1
  92. package/build/setup/prompts/instrumentationPrompt.d.ts +7 -1
  93. package/build/setup/prompts/instrumentationPrompt.d.ts.map +1 -1
  94. package/build/setup/prompts/instrumentationPrompt.js +6 -2
  95. package/build/setup/prompts/instrumentationPrompt.js.map +1 -1
  96. package/build/setup/runSetup.d.ts +3 -0
  97. package/build/setup/runSetup.d.ts.map +1 -1
  98. package/build/setup/runSetup.js +13 -12
  99. package/build/setup/runSetup.js.map +1 -1
  100. package/build/setup/steps/establishConnection.d.ts +6 -3
  101. package/build/setup/steps/establishConnection.d.ts.map +1 -1
  102. package/build/setup/steps/establishConnection.js +120 -11
  103. package/build/setup/steps/establishConnection.js.map +1 -1
  104. package/build/setup/steps/instrumentApp.d.ts +23 -4
  105. package/build/setup/steps/instrumentApp.d.ts.map +1 -1
  106. package/build/setup/steps/instrumentApp.js +89 -41
  107. package/build/setup/steps/instrumentApp.js.map +1 -1
  108. package/build/setup/steps/offerDocsMcp.d.ts +48 -0
  109. package/build/setup/steps/offerDocsMcp.d.ts.map +1 -0
  110. package/build/setup/steps/offerDocsMcp.js +134 -0
  111. package/build/setup/steps/offerDocsMcp.js.map +1 -0
  112. package/build/setup/ui/clackPrompter.d.ts.map +1 -1
  113. package/build/setup/ui/clackPrompter.js +15 -0
  114. package/build/setup/ui/clackPrompter.js.map +1 -1
  115. package/build/setup/util/mcpConfig.d.ts +38 -0
  116. package/build/setup/util/mcpConfig.d.ts.map +1 -0
  117. package/build/setup/util/mcpConfig.js +64 -0
  118. package/build/setup/util/mcpConfig.js.map +1 -0
  119. package/package.json +3 -3
package/build/index.js CHANGED
@@ -1,12 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  // Phoenix CLI Entry Point
3
3
  import { main } from "./cli.js";
4
+ import { getExitCodeForError } from "./exitCodes.js";
4
5
  import { writeError } from "./io.js";
5
6
  // Run CLI when executed directly
6
7
  void main().catch((error) => {
7
8
  writeError({
8
9
  message: `Error: ${error instanceof Error ? error.message : String(error)}`,
9
10
  });
10
- process.exit(1);
11
+ process.exit(getExitCodeForError(error));
11
12
  });
12
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,0BAA0B;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAElC,iCAAiC;AACjC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC1B,UAAU,CAAC;QACT,OAAO,EAAE,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;KAC5E,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,0BAA0B;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAElC,iCAAiC;AACjC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC1B,UAAU,CAAC;QACT,OAAO,EAAE,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;KAC5E,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC"}
@@ -0,0 +1,138 @@
1
+ import { z } from "zod";
2
+ import { type OAuthTokens, type SettingsFile } from "./settings.js";
3
+ export declare const OAUTH_CLIENT_ID = "phoenix-cli";
4
+ export declare const OAUTH_CALLBACK_PATH = "/callback";
5
+ /**
6
+ * Bounds every token-endpoint round trip. Without it a proxy that accepts the
7
+ * socket but never answers strands the CLI for undici's 300s default, long
8
+ * past the point where the user has already consented in the browser. Generous
9
+ * because the code is single-use: aborting a slow-but-live exchange costs the
10
+ * user the whole browser consent, so this must clear a cold-starting server.
11
+ */
12
+ export declare const OAUTH_TOKEN_REQUEST_TIMEOUT_MS: number;
13
+ /** Best-effort and blocking a wizard, so it gives up sooner than a token call. */
14
+ export declare const OAUTH_REVOKE_TIMEOUT_MS: number;
15
+ export declare const OAUTH_REFRESH_BUFFER_MS: number;
16
+ export declare const OAuthTokenEndpointResponseSchema: z.ZodObject<{
17
+ access_token: z.ZodString;
18
+ refresh_token: z.ZodString;
19
+ expires_in: z.ZodNumber;
20
+ token_type: z.ZodString;
21
+ scope: z.ZodDefault<z.ZodOptional<z.ZodString>>;
22
+ }, z.core.$strip>;
23
+ export type OAuthTokenEndpointResponse = z.infer<typeof OAuthTokenEndpointResponseSchema>;
24
+ /**
25
+ * The RFC 8414 discovery fields the login flow depends on. Only a document
26
+ * that parses proves an authorization server is really there: a Phoenix
27
+ * without one answers unknown paths with the SPA's index.html and a 200.
28
+ */
29
+ export declare const OAuthAuthorizationServerMetadataSchema: z.ZodObject<{
30
+ issuer: z.ZodString;
31
+ authorization_endpoint: z.ZodString;
32
+ token_endpoint: z.ZodString;
33
+ }, z.core.$strip>;
34
+ export interface PkcePair {
35
+ verifier: string;
36
+ challenge: string;
37
+ }
38
+ export interface CallbackSuccess {
39
+ status: "success";
40
+ code: string;
41
+ }
42
+ export interface CallbackDenied {
43
+ status: "access_denied";
44
+ }
45
+ export interface CallbackInvalid {
46
+ status: "invalid";
47
+ message: string;
48
+ }
49
+ export type CallbackParseResult = CallbackSuccess | CallbackDenied | CallbackInvalid;
50
+ export declare function base64Url(bytes: Buffer): string;
51
+ export declare function generatePkcePair(): PkcePair;
52
+ export declare function generateState(): string;
53
+ export declare function parseOAuthCallbackUrl({ redirectUrl, expectedState, }: {
54
+ redirectUrl: string;
55
+ expectedState: string;
56
+ }): CallbackParseResult;
57
+ export declare function buildAuthorizationUrl({ endpoint, redirectUri, state, codeChallenge, }: {
58
+ endpoint: string;
59
+ redirectUri: string;
60
+ state: string;
61
+ codeChallenge: string;
62
+ }): string;
63
+ export declare function normalizeEndpoint(endpoint: string): string;
64
+ export declare function tokenResponseToOAuthTokens({ response, now, }: {
65
+ response: OAuthTokenEndpointResponse;
66
+ now?: Date;
67
+ }): OAuthTokens;
68
+ export declare function isOAuthTokenExpiring({ tokens, now, bufferMs, }: {
69
+ tokens: OAuthTokens;
70
+ now?: Date;
71
+ bufferMs?: number;
72
+ }): boolean;
73
+ export declare function exchangeAuthorizationCode({ endpoint, code, redirectUri, verifier, fetchImpl, }: {
74
+ endpoint: string;
75
+ code: string;
76
+ redirectUri: string;
77
+ verifier: string;
78
+ fetchImpl?: typeof fetch;
79
+ }): Promise<OAuthTokenEndpointResponse>;
80
+ export interface BrowserLoginFlowArgs {
81
+ endpoint: string;
82
+ /**
83
+ * Called with the authorization URL before the browser opens, so the user
84
+ * can complete the login by hand when the launch fails or goes unnoticed.
85
+ */
86
+ onAuthorizationUrl: (url: string) => void;
87
+ /** False keeps the browser shut, leaving the pasted-URL lane (if allowed). */
88
+ openBrowserWindow?: boolean;
89
+ /** Narrates a failed launch; the pasted-redirect prompt is the fallback. */
90
+ onBrowserOpenFailed?: (error: unknown) => void;
91
+ /**
92
+ * Accept a hand-pasted redirect URL when no browser was opened — the only
93
+ * way to finish a login over SSH or in a container.
94
+ */
95
+ allowPastedRedirect?: boolean;
96
+ /** Abandon the wait — the caller's escape hatch from an unanswered login. */
97
+ signal?: AbortSignal;
98
+ }
99
+ export type BrowserLoginFlowResult = {
100
+ status: "success";
101
+ tokens: OAuthTokenEndpointResponse;
102
+ }
103
+ /** The user declined consent, or abandoned the wait via `signal`. */
104
+ | {
105
+ status: "cancelled";
106
+ } | {
107
+ status: "invalid";
108
+ message: string;
109
+ };
110
+ /**
111
+ * The Authorization Code + PKCE browser login, end to end: callback server,
112
+ * browser launch, the wait, and the token exchange. Both `px auth login` (which
113
+ * persists the tokens) and `px setup` (which spends the access token once to
114
+ * mint an API key) drive it — the differences between them are the arguments
115
+ * above, not a second copy of the sequence.
116
+ */
117
+ export declare function runBrowserLoginFlow({ endpoint, onAuthorizationUrl, openBrowserWindow, onBrowserOpenFailed, allowPastedRedirect, signal, }: BrowserLoginFlowArgs): Promise<BrowserLoginFlowResult>;
118
+ export declare function refreshOAuthToken({ endpoint, refreshToken, fetchImpl, }: {
119
+ endpoint: string;
120
+ refreshToken: string;
121
+ fetchImpl?: typeof fetch;
122
+ }): Promise<OAuthTokenEndpointResponse>;
123
+ export declare function revokeOAuthToken({ endpoint, refreshToken, fetchImpl, }: {
124
+ endpoint: string;
125
+ refreshToken: string;
126
+ fetchImpl?: typeof fetch;
127
+ }): Promise<void>;
128
+ export declare function refreshOAuthTokensForProfile({ endpoint, profileName, currentTokens, force, settingsPath, fetchImpl, }: {
129
+ endpoint: string;
130
+ profileName: string;
131
+ currentTokens: OAuthTokens;
132
+ force?: boolean;
133
+ settingsPath?: string;
134
+ fetchImpl?: typeof fetch;
135
+ }): Promise<OAuthTokens>;
136
+ export declare function resolveTargetProfileName(settings: SettingsFile, explicit?: string): string;
137
+ export declare function withSettingsLock<T>(settingsPath: string, action: () => Promise<T>): Promise<T>;
138
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
package/build/oauth.js ADDED
@@ -0,0 +1,465 @@
1
+ import { spawn } from "child_process";
2
+ import { createHash, randomBytes } from "crypto";
3
+ import * as fs from "fs";
4
+ import * as http from "http";
5
+ import * as path from "path";
6
+ import * as readline from "readline";
7
+ import { z } from "zod";
8
+ import { AuthRequiredError, NetworkError } from "./exitCodes.js";
9
+ import { renderOAuthCallbackPage } from "./oauthCallbackPage.js";
10
+ import { getProfileByName, getSettingsPath, getStoredActiveProfile, loadSettings, saveSettings, } from "./settings.js";
11
+ export const OAUTH_CLIENT_ID = "phoenix-cli";
12
+ export const OAUTH_CALLBACK_PATH = "/callback";
13
+ const OAUTH_LOGIN_TIMEOUT_MS = 10 * 60 * 1000;
14
+ /**
15
+ * Bounds every token-endpoint round trip. Without it a proxy that accepts the
16
+ * socket but never answers strands the CLI for undici's 300s default, long
17
+ * past the point where the user has already consented in the browser. Generous
18
+ * because the code is single-use: aborting a slow-but-live exchange costs the
19
+ * user the whole browser consent, so this must clear a cold-starting server.
20
+ */
21
+ export const OAUTH_TOKEN_REQUEST_TIMEOUT_MS = 30 * 1000;
22
+ /** Best-effort and blocking a wizard, so it gives up sooner than a token call. */
23
+ export const OAUTH_REVOKE_TIMEOUT_MS = 10 * 1000;
24
+ export const OAUTH_REFRESH_BUFFER_MS = 60 * 1000;
25
+ const SETTINGS_LOCK_TIMEOUT_MS = 10 * 1000;
26
+ const SETTINGS_LOCK_RETRY_MS = 50;
27
+ export const OAuthTokenEndpointResponseSchema = z.object({
28
+ access_token: z.string().min(1),
29
+ refresh_token: z.string().min(1),
30
+ expires_in: z.number().int().positive(),
31
+ token_type: z.string().regex(/^bearer$/i),
32
+ scope: z.string().optional().default(""),
33
+ });
34
+ /**
35
+ * The RFC 8414 discovery fields the login flow depends on. Only a document
36
+ * that parses proves an authorization server is really there: a Phoenix
37
+ * without one answers unknown paths with the SPA's index.html and a 200.
38
+ */
39
+ export const OAuthAuthorizationServerMetadataSchema = z.object({
40
+ issuer: z.string().min(1),
41
+ authorization_endpoint: z.string().min(1),
42
+ token_endpoint: z.string().min(1),
43
+ });
44
+ export function base64Url(bytes) {
45
+ return bytes.toString("base64url");
46
+ }
47
+ export function generatePkcePair() {
48
+ const verifier = base64Url(randomBytes(64));
49
+ const challenge = createHash("sha256").update(verifier).digest("base64url");
50
+ return { verifier, challenge };
51
+ }
52
+ export function generateState() {
53
+ return base64Url(randomBytes(32));
54
+ }
55
+ export function parseOAuthCallbackUrl({ redirectUrl, expectedState, }) {
56
+ let url;
57
+ try {
58
+ url = new URL(redirectUrl);
59
+ }
60
+ catch {
61
+ return { status: "invalid", message: "Invalid redirect URL." };
62
+ }
63
+ const state = url.searchParams.get("state");
64
+ if (state !== expectedState) {
65
+ return {
66
+ status: "invalid",
67
+ message: "OAuth state mismatch; possible CSRF.",
68
+ };
69
+ }
70
+ const error = url.searchParams.get("error");
71
+ if (error === "access_denied") {
72
+ return { status: "access_denied" };
73
+ }
74
+ if (error) {
75
+ return {
76
+ status: "invalid",
77
+ message: `OAuth authorization failed: ${error}`,
78
+ };
79
+ }
80
+ const code = url.searchParams.get("code");
81
+ if (!code) {
82
+ return {
83
+ status: "invalid",
84
+ message: "OAuth callback did not include a code.",
85
+ };
86
+ }
87
+ return { status: "success", code };
88
+ }
89
+ export function buildAuthorizationUrl({ endpoint, redirectUri, state, codeChallenge, }) {
90
+ const authorizationUrl = new URL("oauth2/authorize", normalizeEndpoint(endpoint));
91
+ authorizationUrl.searchParams.set("response_type", "code");
92
+ authorizationUrl.searchParams.set("client_id", OAUTH_CLIENT_ID);
93
+ authorizationUrl.searchParams.set("redirect_uri", redirectUri);
94
+ authorizationUrl.searchParams.set("state", state);
95
+ authorizationUrl.searchParams.set("code_challenge", codeChallenge);
96
+ authorizationUrl.searchParams.set("code_challenge_method", "S256");
97
+ return authorizationUrl.toString();
98
+ }
99
+ export function normalizeEndpoint(endpoint) {
100
+ return endpoint.endsWith("/") ? endpoint : `${endpoint}/`;
101
+ }
102
+ export function tokenResponseToOAuthTokens({ response, now = new Date(), }) {
103
+ return {
104
+ accessToken: response.access_token,
105
+ refreshToken: response.refresh_token,
106
+ expiresAt: new Date(now.getTime() + response.expires_in * 1000).toISOString(),
107
+ scope: response.scope,
108
+ };
109
+ }
110
+ export function isOAuthTokenExpiring({ tokens, now = new Date(), bufferMs = OAUTH_REFRESH_BUFFER_MS, }) {
111
+ return Date.parse(tokens.expiresAt) - now.getTime() <= bufferMs;
112
+ }
113
+ async function startLoginCallbackServer({ expectedState, }) {
114
+ let resolveResult;
115
+ const resultPromise = new Promise((resolve) => {
116
+ resolveResult = resolve;
117
+ });
118
+ const server = http.createServer((request, response) => {
119
+ // Parse against a fixed loopback base: the Host header is untrusted input,
120
+ // and a malformed value would make the URL constructor throw inside the
121
+ // request handler, crashing the CLI mid-login.
122
+ let requestUrl;
123
+ try {
124
+ requestUrl = new URL(request.url ?? "/", "http://127.0.0.1");
125
+ }
126
+ catch {
127
+ response.writeHead(400, { "Content-Type": "text/plain; charset=utf-8" });
128
+ response.end("Bad request");
129
+ return;
130
+ }
131
+ if (requestUrl.pathname !== OAUTH_CALLBACK_PATH) {
132
+ response.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
133
+ response.end("Not found");
134
+ return;
135
+ }
136
+ const result = parseOAuthCallbackUrl({
137
+ redirectUrl: requestUrl.toString(),
138
+ expectedState,
139
+ });
140
+ resolveResult(result);
141
+ response.writeHead(result.status === "invalid" ? 400 : 200, {
142
+ "Content-Type": "text/html; charset=utf-8",
143
+ });
144
+ response.end(renderOAuthCallbackPage(result));
145
+ });
146
+ await new Promise((resolve, reject) => {
147
+ server.once("error", reject);
148
+ server.listen(0, "127.0.0.1", () => {
149
+ server.off("error", reject);
150
+ resolve();
151
+ });
152
+ });
153
+ const address = server.address();
154
+ if (address === null || typeof address === "string") {
155
+ await closeServer(server);
156
+ throw new Error("Could not bind OAuth callback server.");
157
+ }
158
+ return {
159
+ redirectUri: `http://127.0.0.1:${address.port}${OAUTH_CALLBACK_PATH}`,
160
+ resultPromise,
161
+ close: () => closeServer(server),
162
+ };
163
+ }
164
+ function waitForPastedRedirectUrl({ expectedState, input = process.stdin, output = process.stderr, }) {
165
+ output.write("Paste the full redirect URL and press Enter: ");
166
+ const reader = readline.createInterface({ input, output });
167
+ const resultPromise = new Promise((resolve) => {
168
+ reader.once("line", (line) => {
169
+ reader.close();
170
+ resolve(parseOAuthCallbackUrl({
171
+ redirectUrl: line.trim(),
172
+ expectedState,
173
+ }));
174
+ });
175
+ });
176
+ return { resultPromise, close: () => reader.close() };
177
+ }
178
+ function withTimeout({ promise, timeoutMs, }) {
179
+ return new Promise((resolve, reject) => {
180
+ const timeout = setTimeout(() => {
181
+ reject(new NetworkError("OAuth login timed out."));
182
+ }, timeoutMs);
183
+ promise.then((value) => {
184
+ clearTimeout(timeout);
185
+ resolve(value);
186
+ }, (error) => {
187
+ clearTimeout(timeout);
188
+ reject(error);
189
+ });
190
+ });
191
+ }
192
+ async function openBrowser(url) {
193
+ const platform = process.platform;
194
+ const command = platform === "darwin" ? "open" : platform === "win32" ? "cmd" : "xdg-open";
195
+ const args = platform === "win32" ? ["/c", "start", "", url] : [url];
196
+ await new Promise((resolve, reject) => {
197
+ const child = spawn(command, args, {
198
+ detached: true,
199
+ stdio: "ignore",
200
+ });
201
+ child.once("error", reject);
202
+ child.once("spawn", () => {
203
+ child.unref();
204
+ resolve();
205
+ });
206
+ });
207
+ }
208
+ export async function exchangeAuthorizationCode({ endpoint, code, redirectUri, verifier, fetchImpl = fetch, }) {
209
+ const body = new URLSearchParams({
210
+ grant_type: "authorization_code",
211
+ client_id: OAUTH_CLIENT_ID,
212
+ code,
213
+ redirect_uri: redirectUri,
214
+ code_verifier: verifier,
215
+ });
216
+ return postTokenRequest({ endpoint, body, fetchImpl });
217
+ }
218
+ /**
219
+ * The Authorization Code + PKCE browser login, end to end: callback server,
220
+ * browser launch, the wait, and the token exchange. Both `px auth login` (which
221
+ * persists the tokens) and `px setup` (which spends the access token once to
222
+ * mint an API key) drive it — the differences between them are the arguments
223
+ * above, not a second copy of the sequence.
224
+ */
225
+ export async function runBrowserLoginFlow({ endpoint, onAuthorizationUrl, openBrowserWindow = true, onBrowserOpenFailed, allowPastedRedirect = false, signal, }) {
226
+ // Bail before binding a port or launching a browser for a login the caller
227
+ // has already given up on.
228
+ if (signal?.aborted) {
229
+ return { status: "cancelled" };
230
+ }
231
+ const pkce = generatePkcePair();
232
+ const state = generateState();
233
+ const callbackServer = await startLoginCallbackServer({
234
+ expectedState: state,
235
+ });
236
+ let pastedRedirectPrompt;
237
+ try {
238
+ const authorizationUrl = buildAuthorizationUrl({
239
+ endpoint,
240
+ redirectUri: callbackServer.redirectUri,
241
+ state,
242
+ codeChallenge: pkce.challenge,
243
+ });
244
+ onAuthorizationUrl(authorizationUrl);
245
+ let browserOpened = false;
246
+ if (openBrowserWindow) {
247
+ try {
248
+ await openBrowser(authorizationUrl);
249
+ browserOpened = true;
250
+ }
251
+ catch (error) {
252
+ onBrowserOpenFailed?.(error);
253
+ }
254
+ }
255
+ // Only when no browser opened: otherwise the prompt would hold stdin for a
256
+ // login the browser is about to complete on its own.
257
+ pastedRedirectPrompt =
258
+ allowPastedRedirect && !browserOpened
259
+ ? waitForPastedRedirectUrl({ expectedState: state })
260
+ : undefined;
261
+ const races = [
262
+ callbackServer.resultPromise,
263
+ ];
264
+ if (pastedRedirectPrompt !== undefined) {
265
+ races.push(pastedRedirectPrompt.resultPromise);
266
+ }
267
+ if (signal !== undefined) {
268
+ races.push(abortedPromise(signal));
269
+ }
270
+ const callbackResult = await withTimeout({
271
+ promise: Promise.race(races),
272
+ timeoutMs: OAUTH_LOGIN_TIMEOUT_MS,
273
+ });
274
+ if (callbackResult === "aborted" ||
275
+ callbackResult.status === "access_denied") {
276
+ return { status: "cancelled" };
277
+ }
278
+ if (callbackResult.status === "invalid") {
279
+ return { status: "invalid", message: callbackResult.message };
280
+ }
281
+ const tokens = await exchangeAuthorizationCode({
282
+ endpoint,
283
+ code: callbackResult.code,
284
+ redirectUri: callbackServer.redirectUri,
285
+ verifier: pkce.verifier,
286
+ });
287
+ return { status: "success", tokens };
288
+ }
289
+ finally {
290
+ // Release stdin when the loopback callback won the race — an open readline
291
+ // interface would keep the process alive after success.
292
+ pastedRedirectPrompt?.close();
293
+ await callbackServer.close();
294
+ }
295
+ }
296
+ /** Resolves — never rejects — so it can lose a `Promise.race` harmlessly. */
297
+ function abortedPromise(signal) {
298
+ return new Promise((resolve) => {
299
+ if (signal.aborted) {
300
+ resolve("aborted");
301
+ return;
302
+ }
303
+ signal.addEventListener("abort", () => resolve("aborted"), { once: true });
304
+ });
305
+ }
306
+ export async function refreshOAuthToken({ endpoint, refreshToken, fetchImpl = fetch, }) {
307
+ const body = new URLSearchParams({
308
+ grant_type: "refresh_token",
309
+ client_id: OAUTH_CLIENT_ID,
310
+ refresh_token: refreshToken,
311
+ });
312
+ return postTokenRequest({ endpoint, body, fetchImpl });
313
+ }
314
+ async function postTokenRequest({ endpoint, body, fetchImpl, }) {
315
+ let response;
316
+ try {
317
+ response = await fetchImpl(new URL("oauth2/token", normalizeEndpoint(endpoint)), {
318
+ method: "POST",
319
+ headers: {
320
+ "Content-Type": "application/x-www-form-urlencoded",
321
+ },
322
+ body,
323
+ signal: AbortSignal.timeout(OAUTH_TOKEN_REQUEST_TIMEOUT_MS),
324
+ });
325
+ }
326
+ catch (error) {
327
+ // A bare AbortError/DOMException is neither actionable nor mapped to an
328
+ // exit code by the callers, which recognize NetworkError.
329
+ if (error instanceof Error && error.name === "TimeoutError") {
330
+ throw new NetworkError(`The OAuth token endpoint at ${endpoint} did not respond within ${OAUTH_TOKEN_REQUEST_TIMEOUT_MS / 1000}s.`);
331
+ }
332
+ throw error;
333
+ }
334
+ if (response.status === 404) {
335
+ throw new AuthRequiredError("This Phoenix server does not support OAuth login; use an API key.");
336
+ }
337
+ if (!response.ok) {
338
+ const text = await response.text();
339
+ throw new AuthRequiredError(text || `OAuth token exchange failed with HTTP ${response.status}.`);
340
+ }
341
+ const json = await response.json();
342
+ return OAuthTokenEndpointResponseSchema.parse(json);
343
+ }
344
+ export async function revokeOAuthToken({ endpoint, refreshToken, fetchImpl = fetch, }) {
345
+ const body = new URLSearchParams({
346
+ token: refreshToken,
347
+ token_type_hint: "refresh_token",
348
+ });
349
+ await fetchImpl(new URL("oauth2/revoke", normalizeEndpoint(endpoint)), {
350
+ method: "POST",
351
+ headers: {
352
+ "Content-Type": "application/x-www-form-urlencoded",
353
+ },
354
+ body,
355
+ signal: AbortSignal.timeout(OAUTH_REVOKE_TIMEOUT_MS),
356
+ });
357
+ }
358
+ export async function refreshOAuthTokensForProfile({ endpoint, profileName, currentTokens, force = false, settingsPath = getSettingsPath(), fetchImpl = fetch, }) {
359
+ return withSettingsLock(settingsPath, async () => {
360
+ const settings = loadSettings({ strict: true, settingsPath });
361
+ const profile = getProfileByName(settings, profileName);
362
+ const latestTokens = profile?.entry.oauthTokens ?? currentTokens;
363
+ if (!force && !isOAuthTokenExpiring({ tokens: latestTokens })) {
364
+ return latestTokens;
365
+ }
366
+ const response = await refreshOAuthToken({
367
+ endpoint,
368
+ refreshToken: latestTokens.refreshToken,
369
+ fetchImpl,
370
+ });
371
+ const rotatedTokens = tokenResponseToOAuthTokens({ response });
372
+ if (!profile) {
373
+ return rotatedTokens;
374
+ }
375
+ const updatedSettings = {
376
+ ...settings,
377
+ profiles: {
378
+ ...settings.profiles,
379
+ [profileName]: {
380
+ ...profile.entry,
381
+ oauthTokens: rotatedTokens,
382
+ },
383
+ },
384
+ };
385
+ saveSettings(updatedSettings, { settingsPath });
386
+ return rotatedTokens;
387
+ });
388
+ }
389
+ export function resolveTargetProfileName(settings, explicit) {
390
+ if (explicit !== undefined) {
391
+ return explicit;
392
+ }
393
+ return getStoredActiveProfile(settings)?.name ?? "default";
394
+ }
395
+ export async function withSettingsLock(settingsPath, action) {
396
+ const lockPath = `${settingsPath}.lock`;
397
+ const startedAt = Date.now();
398
+ let descriptor;
399
+ while (descriptor === undefined) {
400
+ try {
401
+ fs.mkdirSync(path.dirname(lockPath), { recursive: true, mode: 0o700 });
402
+ descriptor = fs.openSync(lockPath, "wx", 0o600);
403
+ }
404
+ catch (error) {
405
+ if (typeof error !== "object" ||
406
+ error === null ||
407
+ error.code !== "EEXIST") {
408
+ throw error;
409
+ }
410
+ // A lock left behind by a killed process would otherwise block every
411
+ // future settings write; steal it once it is older than the timeout.
412
+ if (isLockStale(lockPath)) {
413
+ try {
414
+ fs.unlinkSync(lockPath);
415
+ }
416
+ catch {
417
+ // Another process stole it first; retry the open.
418
+ }
419
+ continue;
420
+ }
421
+ if (Date.now() - startedAt >= SETTINGS_LOCK_TIMEOUT_MS) {
422
+ throw new Error(`Timed out waiting for the settings lock at ${lockPath}. ` +
423
+ "If no other px process is running, delete the file and retry.");
424
+ }
425
+ await sleep(SETTINGS_LOCK_RETRY_MS);
426
+ }
427
+ }
428
+ try {
429
+ return await action();
430
+ }
431
+ finally {
432
+ fs.closeSync(descriptor);
433
+ try {
434
+ fs.unlinkSync(lockPath);
435
+ }
436
+ catch {
437
+ // Another process may have cleaned up the lock after the refresh was persisted.
438
+ }
439
+ }
440
+ }
441
+ function isLockStale(lockPath) {
442
+ try {
443
+ return (Date.now() - fs.statSync(lockPath).mtimeMs > SETTINGS_LOCK_TIMEOUT_MS);
444
+ }
445
+ catch {
446
+ // The lock disappeared; the next open attempt will settle it.
447
+ return false;
448
+ }
449
+ }
450
+ function sleep(milliseconds) {
451
+ return new Promise((resolve) => setTimeout(resolve, milliseconds));
452
+ }
453
+ function closeServer(server) {
454
+ return new Promise((resolve, reject) => {
455
+ server.close((error) => {
456
+ if (error) {
457
+ reject(error);
458
+ }
459
+ else {
460
+ resolve();
461
+ }
462
+ });
463
+ });
464
+ }
465
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { CallbackParseResult } from "./oauth.js";
2
+ /**
3
+ * Render the standalone HTML page shown in the browser after the OAuth2
4
+ * authorization redirect lands on the CLI's loopback callback server. The
5
+ * page is fully self-contained (inline styles and SVG) because the loopback
6
+ * server serves nothing else.
7
+ */
8
+ export declare function renderOAuthCallbackPage(result: CallbackParseResult): string;
9
+ //# sourceMappingURL=oauthCallbackPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauthCallbackPage.d.ts","sourceRoot":"","sources":["../src/oauthCallbackPage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAwDnD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CA+D3E"}