@arizeai/phoenix-cli 1.9.0 → 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -7
- package/build/authFetch.d.ts +24 -0
- package/build/authFetch.d.ts.map +1 -0
- package/build/authFetch.js +44 -0
- package/build/authFetch.js.map +1 -0
- package/build/client.d.ts.map +1 -1
- package/build/client.js +5 -1
- package/build/client.js.map +1 -1
- package/build/commands/api.d.ts.map +1 -1
- package/build/commands/api.js +12 -1
- package/build/commands/api.js.map +1 -1
- package/build/commands/auth.d.ts +4 -1
- package/build/commands/auth.d.ts.map +1 -1
- package/build/commands/auth.js +326 -13
- package/build/commands/auth.js.map +1 -1
- package/build/commands/formatSetup.d.ts +6 -0
- package/build/commands/formatSetup.d.ts.map +1 -1
- package/build/commands/formatSetup.js +10 -1
- package/build/commands/formatSetup.js.map +1 -1
- package/build/commands/setup.d.ts.map +1 -1
- package/build/commands/setup.js +4 -0
- package/build/commands/setup.js.map +1 -1
- package/build/config.d.ts +15 -0
- package/build/config.d.ts.map +1 -1
- package/build/config.js +54 -7
- package/build/config.js.map +1 -1
- package/build/exitCodes.d.ts +6 -0
- package/build/exitCodes.d.ts.map +1 -1
- package/build/exitCodes.js +18 -0
- package/build/exitCodes.js.map +1 -1
- package/build/index.js +2 -1
- package/build/index.js.map +1 -1
- package/build/oauth.d.ts +138 -0
- package/build/oauth.d.ts.map +1 -0
- package/build/oauth.js +465 -0
- package/build/oauth.js.map +1 -0
- package/build/oauthCallbackPage.d.ts +9 -0
- package/build/oauthCallbackPage.d.ts.map +1 -0
- package/build/oauthCallbackPage.js +111 -0
- package/build/oauthCallbackPage.js.map +1 -0
- package/build/pxi/client.d.ts.map +1 -1
- package/build/pxi/client.js +11 -2
- package/build/pxi/client.js.map +1 -1
- package/build/settings.d.ts +19 -0
- package/build/settings.d.ts.map +1 -1
- package/build/settings.js +21 -0
- package/build/settings.js.map +1 -1
- package/build/setup/agents/registry.d.ts +57 -0
- package/build/setup/agents/registry.d.ts.map +1 -1
- package/build/setup/agents/registry.js +45 -0
- package/build/setup/agents/registry.js.map +1 -1
- package/build/setup/copy.d.ts +32 -0
- package/build/setup/copy.d.ts.map +1 -1
- package/build/setup/copy.js +44 -0
- package/build/setup/copy.js.map +1 -1
- package/build/setup/deps/buildDefaultDeps.d.ts.map +1 -1
- package/build/setup/deps/buildDefaultDeps.js +2 -0
- package/build/setup/deps/buildDefaultDeps.js.map +1 -1
- package/build/setup/deps/index.d.ts +4 -0
- package/build/setup/deps/index.d.ts.map +1 -1
- package/build/setup/deps/index.js.map +1 -1
- package/build/setup/deps/oauthLogin.d.ts +64 -0
- package/build/setup/deps/oauthLogin.d.ts.map +1 -0
- package/build/setup/deps/oauthLogin.js +82 -0
- package/build/setup/deps/oauthLogin.js.map +1 -0
- package/build/setup/deps/prompter.d.ts +7 -0
- package/build/setup/deps/prompter.d.ts.map +1 -1
- package/build/setup/options.d.ts +11 -0
- package/build/setup/options.d.ts.map +1 -1
- package/build/setup/options.js +1 -0
- package/build/setup/options.js.map +1 -1
- package/build/setup/prompts/instrumentationPrompt.d.ts +7 -1
- package/build/setup/prompts/instrumentationPrompt.d.ts.map +1 -1
- package/build/setup/prompts/instrumentationPrompt.js +6 -2
- package/build/setup/prompts/instrumentationPrompt.js.map +1 -1
- package/build/setup/runSetup.d.ts +3 -0
- package/build/setup/runSetup.d.ts.map +1 -1
- package/build/setup/runSetup.js +13 -12
- package/build/setup/runSetup.js.map +1 -1
- package/build/setup/steps/establishConnection.d.ts +6 -3
- package/build/setup/steps/establishConnection.d.ts.map +1 -1
- package/build/setup/steps/establishConnection.js +120 -11
- package/build/setup/steps/establishConnection.js.map +1 -1
- package/build/setup/steps/instrumentApp.d.ts +23 -4
- package/build/setup/steps/instrumentApp.d.ts.map +1 -1
- package/build/setup/steps/instrumentApp.js +89 -41
- package/build/setup/steps/instrumentApp.js.map +1 -1
- package/build/setup/steps/offerDocsMcp.d.ts +48 -0
- package/build/setup/steps/offerDocsMcp.d.ts.map +1 -0
- package/build/setup/steps/offerDocsMcp.js +133 -0
- package/build/setup/steps/offerDocsMcp.js.map +1 -0
- package/build/setup/ui/clackPrompter.d.ts.map +1 -1
- package/build/setup/ui/clackPrompter.js +15 -0
- package/build/setup/ui/clackPrompter.js.map +1 -1
- package/build/setup/util/mcpConfig.d.ts +31 -0
- package/build/setup/util/mcpConfig.d.ts.map +1 -0
- package/build/setup/util/mcpConfig.js +62 -0
- package/build/setup/util/mcpConfig.js.map +1 -0
- package/package.json +3 -3
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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Phoenix bird mark, inlined so the loopback callback page renders
|
|
3
|
+
* without any network access to the Phoenix server.
|
|
4
|
+
*/
|
|
5
|
+
const PHOENIX_MARK_SVG = `<svg width="44" height="50" viewBox="0 0 148 169" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Phoenix"><path d="M147.458 105.593C147.022 103.63 146.028 101.824 144.492 100.222C143.901 99.6064 143.244 99.0233 142.529 98.4978C142.184 98.2432 141.815 98.005 141.437 97.7669C140.969 97.4712 140.484 97.192 139.95 96.921C137.995 95.9191 136.328 94.909 134.866 93.825C134.274 93.3897 133.699 92.9299 133.157 92.4535C131.851 91.312 130.972 90.3348 130.315 89.3C130.102 88.9715 129.913 88.6102 129.732 88.2653C129.658 88.1175 129.543 87.9943 129.412 87.8957C129.173 87.7233 128.869 87.6494 128.565 87.6986C128.097 87.789 127.736 88.1667 127.678 88.6431C127.637 89.0126 127.637 89.4068 127.687 89.8092C127.719 90.0474 127.588 90.2773 127.366 90.3758C127.317 90.4005 127.259 90.4087 127.21 90.4169C126.898 90.4498 126.619 90.6222 126.438 90.885C126.257 91.1478 126.208 91.4681 126.282 91.7719C126.348 92.0347 126.438 92.2236 126.512 92.3714L126.578 92.5028C126.627 92.5931 126.676 92.6917 126.726 92.782C126.873 93.0612 127.021 93.3405 127.202 93.6033C127.547 94.1042 127.933 94.6052 128.393 95.1389C128.541 95.3114 128.565 95.5578 128.459 95.7549C128.352 95.952 128.13 96.0669 127.908 96.0341C125.321 95.681 122.996 95.0979 120.836 94.3013C120.59 94.211 120.335 94.1206 120.097 94.0221C118.158 93.2009 121.658 89.7189 123.259 87.247C130.282 76.4479 131.736 64.0802 131.794 51.5647C131.851 39.4681 130.545 27.5357 128.138 15.7593V15.7429C126.569 5.87173 125.239 2.168 124.401 0.796558C124.22 0.435219 124.023 0.205276 123.818 0.0985162C123.588 -0.0575166 123.465 0.0163937 123.465 0.0163937C123.013 0.0328182 122.495 0.435219 121.871 1.08399C119.251 3.83509 119.399 7.11178 120.122 10.5363C123.432 26.0903 125.921 41.7346 124.787 57.7157C124.007 68.7365 121.953 79.3468 114.248 87.9779C113.789 88.4952 113.287 88.9798 112.786 89.4725C112.211 90.0391 111.316 91.1396 110.651 90.6797C109.764 90.0638 110.552 88.7991 110.831 88.1421C115.341 77.5729 116.639 66.5275 115.949 55.1453C115.932 54.8825 115.908 54.6197 115.891 54.3569V54.3405C115.883 54.1269 115.858 53.9298 115.842 53.7245C115.727 52.2217 115.587 50.7189 115.398 49.2242C113.46 31.1655 111.127 29.9911 111.127 29.9911C110.971 29.8515 110.782 29.7448 110.528 29.6955C109.304 29.4409 108.638 30.5167 108.096 31.3297C105.648 34.9924 106.733 38.8932 107.521 42.753C110.289 56.2703 110.33 69.6645 105.583 82.8124C105.147 84.0113 104.63 85.1775 104.08 86.3272C103.496 87.5508 103.119 89.0783 101.131 88.4213C99.2662 87.8054 99.7918 86.3929 100.03 85.1036C100.654 81.8269 101.155 78.542 101.467 75.2489V75.2653C101.509 74.9368 101.525 74.6247 101.55 74.3127C101.599 73.746 101.632 73.1712 101.665 72.6045C101.689 72.1282 101.714 71.6601 101.739 71.2002C101.747 70.9621 101.763 70.7321 101.763 70.494C102.141 60.0562 100.383 55.3095 99.7179 53.9052C99.644 53.7328 99.5619 53.5767 99.4715 53.4371C98.7815 52.4024 97.6398 52.5256 96.6541 53.5028C94.8388 55.2931 93.8367 57.4118 94.2967 60.0808C95.6438 67.8496 94.8552 75.5445 93.4096 83.1983C93.2124 84.2249 92.7524 86.0973 90.5593 85.6127C89.0644 85.2842 88.7194 84.6437 88.6372 83.3461C88.6537 82.3689 88.6372 81.3916 88.6044 80.4144C88.6044 80.3897 88.6044 80.3651 88.6044 80.3405C88.6044 80.2009 88.588 80.0612 88.588 79.9299C88.588 79.8559 88.5797 79.7902 88.5715 79.7245C88.5058 78.3942 88.399 77.0556 88.2347 75.717C88.2183 75.5856 88.1937 75.4624 88.1773 75.331C87.3394 67.7921 86.247 67.0612 86.247 67.0612C85.5488 66.1497 84.4563 66.3057 83.5117 67.2419C81.6964 69.0322 80.7764 71.1427 81.1543 73.8199C81.4336 75.7745 81.3596 75.175 81.5568 76.8831C81.7128 77.7618 81.8771 79.3632 81.8935 79.8724C81.8525 80.324 81.7375 80.7182 81.4582 81.0139C80.53 82.0076 79.0351 80.9892 77.9015 80.5211C55.9209 71.4302 37.1108 58.6683 20.691 42.523C14.2513 35.945 3.25273 22.6329 3.25273 22.6329C2.84203 22.1566 2.33276 21.8856 1.55243 22.2223C0.114982 22.8383 0.156052 24.6778 0.0246278 26.2217C-0.23822 29.3177 1.42101 31.5597 3.21987 33.662C28.0179 62.5856 58.2783 83.3708 94.8059 93.7675L101.377 95.5085C101.451 95.5249 101.533 95.5496 101.607 95.566C101.624 95.566 101.632 95.566 101.64 95.5742L107.299 97.077L107.456 97.1181C107.267 97.1756 107.061 97.2167 106.839 97.2577C100.613 98.4895 88.2923 96.223 78.3944 93.9153C73.4988 92.8888 68.6854 91.6405 63.9788 90.1541C63.7653 90.0884 63.642 90.0556 63.642 90.0556C45.3577 84.2331 28.6093 74.7972 13.9556 60.4093C12.5674 59.0461 11.286 57.5761 10.0211 56.0897C8.86289 54.71 6.47262 51.8275 5.643 50.8338C5.55265 50.7024 5.45408 50.5875 5.35551 50.4807C5.10909 50.2261 4.80517 50.0619 4.36983 50.1604C3.3513 50.3986 3.05559 51.4498 2.86667 52.3367C2.1192 55.9008 3.25273 58.8983 5.65122 61.5755C20.6582 78.3942 39.4929 89.1358 60.6439 96.1819C72.6528 100.181 85.0067 102.612 97.6069 104.164C90.0911 106.595 82.3617 107.334 74.5667 107.137C59.4775 106.759 45.3248 103.138 32.0264 96.6746C27.1226 94.1535 22.5556 91.3449 21.3564 90.5894C20.6664 90.1213 19.9518 89.8338 19.2454 90.3758C17.9229 91.4024 18.8347 93.2009 19.2618 94.6051C20.075 97.307 21.956 99.1712 24.3956 100.46C46.0641 111.917 68.9401 116.499 93.2946 112.434C95.7588 112.023 98.0998 111.572 100.679 110.701C96.6048 114.224 91.89 116.524 86.9369 118.339C71.6835 123.915 56.5287 123.693 41.4314 119.915C36.5851 118.618 30.9668 116.507 30.9668 116.507C30.1536 116.154 29.3486 116.031 28.7243 116.926C27.6237 118.503 28.5847 120.145 29.5375 121.632C31.7882 125.138 36.1416 125.483 39.5832 126.674C40.7578 127.052 37.5544 129.187 36.5276 129.975C31.5335 133.794 26.6462 137.284 21.6767 140.98L18.424 143.378C17.8654 143.764 17.3726 144.199 17.6272 145.004C17.9229 145.915 18.8675 146.08 19.7875 146.268C23.3442 147.008 26.3833 145.825 29.1925 143.723C35.2134 139.214 41.3493 134.837 47.2387 130.156C49.4811 128.374 51.5182 128.522 54.582 129.31C46.9183 135.083 39.7475 140.495 32.5685 145.899C25.2827 151.376 17.9969 156.854 10.711 162.323L5.89764 165.888C5.82371 165.937 5.758 165.986 5.69229 166.044L5.61836 166.093C5.20766 166.421 4.90374 166.791 4.9941 167.267C5.19123 168.351 6.4644 168.622 7.50758 168.803C11.8117 169.542 14.4813 167.924 17.4219 165.715C32.1496 154.661 46.9266 143.682 61.5721 132.521C64.8577 130.016 68.2337 128.604 72.9731 129.138C68.9401 132.152 65.0631 135.051 61.2436 137.908L50.8611 145.587C50.7871 145.636 50.7132 145.694 50.6475 145.751C50.0972 146.186 49.7111 146.695 49.9247 147.451C50.3189 148.822 51.97 148.987 53.3745 149.2C55.9537 149.586 58.1387 148.675 60.1675 147.164C61.3339 146.293 62.5085 145.439 63.6831 144.593L79.5361 132.004C79.5361 132.004 83.2817 129.327 87.6187 126.871C88.0048 126.633 88.3908 126.387 88.7851 126.148C88.9494 126.075 89.3601 125.886 89.9843 125.59C90.4525 125.352 90.9207 125.114 91.3807 124.892C92.0625 124.547 92.851 124.128 93.7381 123.644C96.2927 122.584 103.611 119.168 109.657 112.73C112.532 110.512 116.581 107.613 119.735 106.217H119.752C119.99 106.111 120.228 106.012 120.458 105.93C120.458 105.93 120.475 105.93 120.483 105.922C120.639 105.864 120.787 105.815 120.935 105.766L121.337 105.61C122.479 105.289 124.335 105.166 124.582 107.679C124.623 108.295 124.615 108.927 124.541 109.593C124.491 110.093 124.393 110.627 124.319 111.054C124.245 111.465 124.417 111.876 124.746 112.122C124.795 112.163 124.853 112.196 124.91 112.22C125.346 112.434 125.871 112.335 126.2 111.974C126.323 111.834 126.446 111.703 126.569 111.572C128.122 109.937 129.699 108.804 131.375 108.114C133.822 107.104 136.303 107.096 138.94 108.106C140.197 108.582 141.379 109.239 142.554 110.102C143.055 110.471 143.556 110.882 144.057 111.334C144.353 111.605 144.648 111.9 144.911 112.163L144.952 112.204L145.166 112.418C145.166 112.418 145.248 112.491 145.289 112.524C145.536 112.705 145.856 112.779 146.168 112.713C146.529 112.631 146.825 112.376 146.957 112.032C146.981 111.966 147.006 111.9 147.031 111.834C147.778 109.617 147.934 107.581 147.499 105.593H147.458Z" fill="url(#px_mark_gradient)"/><defs><linearGradient id="px_mark_gradient" x1="22.0956" y1="10.3474" x2="97.4433" y2="140.879" gradientUnits="userSpaceOnUse"><stop stop-color="#14BAB6"/><stop offset="0.5" stop-color="#00ADEE"/><stop offset="1" stop-color="#0095C4"/></linearGradient></defs></svg>`;
|
|
6
|
+
const CHECK_ICON = `<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M5 12.5L10 17.5L19 7" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/></svg>`;
|
|
7
|
+
const CROSS_ICON = `<svg width="14" height="14" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M6 6L18 18M18 6L6 18" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"/></svg>`;
|
|
8
|
+
function escapeHtml(text) {
|
|
9
|
+
return text
|
|
10
|
+
.replace(/&/g, "&")
|
|
11
|
+
.replace(/</g, "<")
|
|
12
|
+
.replace(/>/g, ">")
|
|
13
|
+
.replace(/"/g, """)
|
|
14
|
+
.replace(/'/g, "'");
|
|
15
|
+
}
|
|
16
|
+
function getCallbackPageContent(result) {
|
|
17
|
+
switch (result.status) {
|
|
18
|
+
case "success":
|
|
19
|
+
return {
|
|
20
|
+
badgeVariant: "success",
|
|
21
|
+
badgeIcon: CHECK_ICON,
|
|
22
|
+
title: "You're all set",
|
|
23
|
+
body: "The Phoenix CLI is now connected. You can close this tab and return to your terminal.",
|
|
24
|
+
};
|
|
25
|
+
case "access_denied":
|
|
26
|
+
return {
|
|
27
|
+
badgeVariant: "neutral",
|
|
28
|
+
badgeIcon: CROSS_ICON,
|
|
29
|
+
title: "Authorization cancelled",
|
|
30
|
+
body: "No access was granted. You can close this tab — rerun px auth login if this was a mistake.",
|
|
31
|
+
};
|
|
32
|
+
case "invalid":
|
|
33
|
+
return {
|
|
34
|
+
badgeVariant: "danger",
|
|
35
|
+
badgeIcon: CROSS_ICON,
|
|
36
|
+
title: "Something went wrong",
|
|
37
|
+
body: `${escapeHtml(result.message)} Return to your terminal and try running px auth login again.`,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Render the standalone HTML page shown in the browser after the OAuth2
|
|
43
|
+
* authorization redirect lands on the CLI's loopback callback server. The
|
|
44
|
+
* page is fully self-contained (inline styles and SVG) because the loopback
|
|
45
|
+
* server serves nothing else.
|
|
46
|
+
*/
|
|
47
|
+
export function renderOAuthCallbackPage(result) {
|
|
48
|
+
const content = getCallbackPageContent(result);
|
|
49
|
+
return `<!doctype html>
|
|
50
|
+
<html lang="en">
|
|
51
|
+
<head>
|
|
52
|
+
<meta charset="utf-8" />
|
|
53
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
54
|
+
<meta name="color-scheme" content="light dark" />
|
|
55
|
+
<title>Phoenix CLI login</title>
|
|
56
|
+
<style>
|
|
57
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
58
|
+
html { color-scheme: light dark; }
|
|
59
|
+
html, body { height: 100%; }
|
|
60
|
+
body {
|
|
61
|
+
font-family: system-ui, sans-serif;
|
|
62
|
+
background-color: Canvas;
|
|
63
|
+
color: CanvasText;
|
|
64
|
+
display: flex;
|
|
65
|
+
flex-direction: column;
|
|
66
|
+
align-items: center;
|
|
67
|
+
justify-content: center;
|
|
68
|
+
padding: 24px;
|
|
69
|
+
}
|
|
70
|
+
main {
|
|
71
|
+
max-width: 420px;
|
|
72
|
+
display: flex;
|
|
73
|
+
flex-direction: column;
|
|
74
|
+
align-items: center;
|
|
75
|
+
text-align: center;
|
|
76
|
+
}
|
|
77
|
+
.mark { position: relative; margin-bottom: 24px; }
|
|
78
|
+
.badge {
|
|
79
|
+
position: absolute;
|
|
80
|
+
right: -10px;
|
|
81
|
+
bottom: -6px;
|
|
82
|
+
width: 22px;
|
|
83
|
+
height: 22px;
|
|
84
|
+
border-radius: 50%;
|
|
85
|
+
display: flex;
|
|
86
|
+
align-items: center;
|
|
87
|
+
justify-content: center;
|
|
88
|
+
background-color: Canvas;
|
|
89
|
+
box-shadow: inset 0 0 0 1.5px currentColor;
|
|
90
|
+
}
|
|
91
|
+
.badge--success { color: #3d9a63; }
|
|
92
|
+
.badge--danger { color: #d64545; }
|
|
93
|
+
.badge--neutral { color: GrayText; }
|
|
94
|
+
h1 { font-size: 20px; font-weight: 600; margin-bottom: 10px; }
|
|
95
|
+
p { font-size: 14px; line-height: 1.6; color: GrayText; overflow-wrap: anywhere; }
|
|
96
|
+
p code { font-family: ui-monospace, monospace; font-size: 13px; }
|
|
97
|
+
</style>
|
|
98
|
+
</head>
|
|
99
|
+
<body>
|
|
100
|
+
<main>
|
|
101
|
+
<div class="mark">
|
|
102
|
+
${PHOENIX_MARK_SVG}
|
|
103
|
+
<div class="badge badge--${content.badgeVariant}">${content.badgeIcon}</div>
|
|
104
|
+
</div>
|
|
105
|
+
<h1>${content.title}</h1>
|
|
106
|
+
<p>${content.body.replace(/px auth login/g, "<code>px auth login</code>")}</p>
|
|
107
|
+
</main>
|
|
108
|
+
</body>
|
|
109
|
+
</html>`;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=oauthCallbackPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauthCallbackPage.js","sourceRoot":"","sources":["../src/oauthCallbackPage.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,gBAAgB,GAAG,48PAA48P,CAAC;AAEt+P,MAAM,UAAU,GAAG,kPAAkP,CAAC;AAEtQ,MAAM,UAAU,GAAG,0NAA0N,CAAC;AAS9O,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,sBAAsB,CAC7B,MAA2B;IAE3B,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,SAAS;YACZ,OAAO;gBACL,YAAY,EAAE,SAAS;gBACvB,SAAS,EAAE,UAAU;gBACrB,KAAK,EAAE,gBAAgB;gBACvB,IAAI,EAAE,uFAAuF;aAC9F,CAAC;QACJ,KAAK,eAAe;YAClB,OAAO;gBACL,YAAY,EAAE,SAAS;gBACvB,SAAS,EAAE,UAAU;gBACrB,KAAK,EAAE,yBAAyB;gBAChC,IAAI,EAAE,4FAA4F;aACnG,CAAC;QACJ,KAAK,SAAS;YACZ,OAAO;gBACL,YAAY,EAAE,QAAQ;gBACtB,SAAS,EAAE,UAAU;gBACrB,KAAK,EAAE,sBAAsB;gBAC7B,IAAI,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,+DAA+D;aACnG,CAAC;IACN,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAA2B;IACjE,MAAM,OAAO,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAqDD,gBAAgB;iCACS,OAAO,CAAC,YAAY,KAAK,OAAO,CAAC,SAAS;;UAEjE,OAAO,CAAC,KAAK;SACd,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,4BAA4B,CAAC;;;QAGrE,CAAC;AACT,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/pxi/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/pxi/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,IAAI,CAAC;AAGZ,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,YAAY,EACb,MAAM,SAAS,CAAC;AAsCjB;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,QAAQ,EACR,SAAS,GACV,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,CAIT;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAC9B,MAAM,GACP,EAAE;IACD,MAAM,EAAE,aAAa,CAAC;CACvB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASzB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,GAAgB,EAChB,QAA2D,GAC5D,EAAE;IACD,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,sBAAsB,EAAE,OAAO,CAAC;IAChC,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,UAAU,EAAE,CAoBf;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,OAAO,EAAE,iBAAiB,CAAC;CAC5B,GAAG,cAAc,CAgBjB;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,EACzC,OAAO,EACP,KAAK,GACN,EAAE;IACD,OAAO,EAAE,iBAAiB,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC,GAAG,YAAY,CAsBf;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,EAC3C,MAAM,EACN,kBAAkB,GACnB,EAAE;IACD,MAAM,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;IACvC,kBAAkB,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;CACnD,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAO7B;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,SAAmD,GACpD,EAAE;IACD,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,CAAC,EAAE,YAAY,CAAC;CAC1B,GAAG,aAAa,CAoBhB;AAED,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAMxE"}
|