@dexto/tui 1.6.8 → 1.6.10
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/dist/components/overlays/LoginOverlay.cjs +41 -50
- package/dist/components/overlays/LoginOverlay.d.ts.map +1 -1
- package/dist/components/overlays/LoginOverlay.js +43 -44
- package/dist/components/overlays/ModelSelectorRefactored.cjs +543 -221
- package/dist/components/overlays/ModelSelectorRefactored.d.ts.map +1 -1
- package/dist/components/overlays/ModelSelectorRefactored.js +553 -223
- package/dist/components/overlays/SessionSelectorRefactored.cjs +3 -0
- package/dist/components/overlays/SessionSelectorRefactored.d.ts.map +1 -1
- package/dist/components/overlays/SessionSelectorRefactored.js +3 -0
- package/dist/containers/OverlayContainer.cjs +35 -3
- package/dist/containers/OverlayContainer.d.ts.map +1 -1
- package/dist/containers/OverlayContainer.js +36 -3
- package/dist/hooks/useInputOrchestrator.cjs +1 -1
- package/dist/hooks/useInputOrchestrator.d.ts.map +1 -1
- package/dist/hooks/useInputOrchestrator.js +1 -1
- package/dist/host/index.cjs +12 -13
- package/dist/host/index.d.ts +23 -15
- package/dist/host/index.d.ts.map +1 -1
- package/dist/host/index.js +10 -11
- package/dist/index.d.cts +17 -12
- package/dist/interactive-commands/auth/index.d.ts +1 -1
- package/dist/interactive-commands/commands.cjs +2 -0
- package/dist/interactive-commands/commands.d.ts.map +1 -1
- package/dist/interactive-commands/commands.js +3 -1
- package/dist/interactive-commands/model/index.cjs +1 -1
- package/dist/interactive-commands/model/index.js +1 -1
- package/dist/interactive-commands/session/index.cjs +2 -0
- package/dist/interactive-commands/session/index.d.ts +2 -1
- package/dist/interactive-commands/session/index.d.ts.map +1 -1
- package/dist/interactive-commands/session/index.js +2 -1
- package/dist/interactive-commands/session/session-commands.cjs +26 -0
- package/dist/interactive-commands/session/session-commands.d.ts +5 -0
- package/dist/interactive-commands/session/session-commands.d.ts.map +1 -1
- package/dist/interactive-commands/session/session-commands.js +25 -0
- package/dist/utils/modelOrdering.cjs +106 -0
- package/dist/utils/modelOrdering.d.ts +7 -0
- package/dist/utils/modelOrdering.d.ts.map +1 -0
- package/dist/utils/modelOrdering.js +81 -0
- package/dist/utils/modelOrdering.test.cjs +59 -0
- package/dist/utils/modelOrdering.test.d.ts +2 -0
- package/dist/utils/modelOrdering.test.d.ts.map +1 -0
- package/dist/utils/modelOrdering.test.js +61 -0
- package/package.json +4 -4
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __create = Object.create;
|
|
3
2
|
var __defProp = Object.defineProperty;
|
|
4
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
6
|
var __export = (target, all) => {
|
|
9
7
|
for (var name in all)
|
|
@@ -17,14 +15,6 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
15
|
}
|
|
18
16
|
return to;
|
|
19
17
|
};
|
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
-
mod
|
|
27
|
-
));
|
|
28
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
19
|
var LoginOverlay_exports = {};
|
|
30
20
|
__export(LoginOverlay_exports, {
|
|
@@ -39,6 +29,7 @@ const LoginOverlay = (0, import_react.forwardRef)(function LoginOverlay2({ isVis
|
|
|
39
29
|
const [step, setStep] = (0, import_react.useState)("checking");
|
|
40
30
|
const [existingUser, setExistingUser] = (0, import_react.useState)(null);
|
|
41
31
|
const [authUrl, setAuthUrl] = (0, import_react.useState)(null);
|
|
32
|
+
const [devicePrompt, setDevicePrompt] = (0, import_react.useState)(null);
|
|
42
33
|
const [status, setStatus] = (0, import_react.useState)("Preparing login...");
|
|
43
34
|
const [error, setError] = (0, import_react.useState)(null);
|
|
44
35
|
const abortControllerRef = (0, import_react.useRef)(null);
|
|
@@ -57,57 +48,48 @@ const LoginOverlay = (0, import_react.forwardRef)(function LoginOverlay2({ isVis
|
|
|
57
48
|
abortControllerRef.current?.abort(new Error("Authentication cancelled"));
|
|
58
49
|
abortControllerRef.current = null;
|
|
59
50
|
}, []);
|
|
51
|
+
const runDeviceLogin = (0, import_react.useCallback)(
|
|
52
|
+
async (abortController) => {
|
|
53
|
+
setStep("starting");
|
|
54
|
+
safeSetStatus("Starting device code login...");
|
|
55
|
+
setAuthUrl(null);
|
|
56
|
+
setDevicePrompt(null);
|
|
57
|
+
return (0, import_host.performDeviceCodeLogin)({
|
|
58
|
+
signal: abortController.signal,
|
|
59
|
+
onPrompt: (prompt) => {
|
|
60
|
+
if (!isActiveRef.current || abortController.signal.aborted) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
setDevicePrompt(prompt);
|
|
64
|
+
setAuthUrl(prompt.verificationUrlComplete ?? prompt.verificationUrl);
|
|
65
|
+
setStep("waiting");
|
|
66
|
+
safeSetStatus("Open the URL below and approve login.");
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
},
|
|
70
|
+
[safeSetStatus]
|
|
71
|
+
);
|
|
60
72
|
const startLogin = (0, import_react.useCallback)(async () => {
|
|
61
73
|
cancelInFlight();
|
|
62
74
|
setError(null);
|
|
63
75
|
setAuthUrl(null);
|
|
76
|
+
setDevicePrompt(null);
|
|
64
77
|
const abortController = new AbortController();
|
|
65
78
|
abortControllerRef.current = abortController;
|
|
66
79
|
try {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const session = await (0, import_host.beginOAuthLogin)((0, import_host.getDefaultOAuthConfig)(), {
|
|
70
|
-
signal: abortController.signal
|
|
71
|
-
});
|
|
72
|
-
if (!isActiveRef.current || abortController.signal.aborted) return;
|
|
73
|
-
setAuthUrl(session.authUrl);
|
|
74
|
-
setStep("opening-browser");
|
|
75
|
-
safeSetStatus("Opening browser for authentication...");
|
|
76
|
-
let browserOpened = false;
|
|
77
|
-
try {
|
|
78
|
-
const { default: open } = await import("open");
|
|
79
|
-
await open(session.authUrl);
|
|
80
|
-
browserOpened = true;
|
|
81
|
-
} catch {
|
|
82
|
-
}
|
|
83
|
-
if (!isActiveRef.current || abortController.signal.aborted) return;
|
|
84
|
-
setStep("waiting");
|
|
85
|
-
safeSetStatus(
|
|
86
|
-
browserOpened ? "Waiting for authentication..." : "Browser did not open automatically. Open the URL below to continue."
|
|
87
|
-
);
|
|
88
|
-
const result = await session.result;
|
|
89
|
-
if (!isActiveRef.current || abortController.signal.aborted) return;
|
|
80
|
+
const result = await runDeviceLogin(abortController);
|
|
81
|
+
if (!result || !isActiveRef.current || abortController.signal.aborted) return;
|
|
90
82
|
setStep("finalizing");
|
|
91
83
|
safeSetStatus("Finalizing login...");
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
token: result.accessToken,
|
|
95
|
-
refreshToken: result.refreshToken,
|
|
96
|
-
userId: result.user?.id,
|
|
97
|
-
email: result.user?.email,
|
|
98
|
-
createdAt: Date.now(),
|
|
99
|
-
expiresAt
|
|
100
|
-
});
|
|
101
|
-
safeSetStatus("Provisioning Dexto API key (DEXTO_API_KEY)...");
|
|
102
|
-
const ensured = await (0, import_host.ensureDextoApiKeyForAuthToken)(result.accessToken, {
|
|
103
|
-
onStatus: handleProvisionStatus
|
|
84
|
+
const persisted = await (0, import_host.persistOAuthLoginResult)(result, {
|
|
85
|
+
onProvisionStatus: handleProvisionStatus
|
|
104
86
|
});
|
|
105
87
|
if (!isActiveRef.current || abortController.signal.aborted) return;
|
|
106
88
|
onDone({
|
|
107
89
|
outcome: "success",
|
|
108
|
-
email:
|
|
109
|
-
keyId:
|
|
110
|
-
hasDextoApiKey:
|
|
90
|
+
email: persisted.email,
|
|
91
|
+
keyId: persisted.keyId,
|
|
92
|
+
hasDextoApiKey: persisted.hasDextoApiKey
|
|
111
93
|
});
|
|
112
94
|
} catch (err) {
|
|
113
95
|
if (abortController.signal.aborted) {
|
|
@@ -120,13 +102,14 @@ const LoginOverlay = (0, import_react.forwardRef)(function LoginOverlay2({ isVis
|
|
|
120
102
|
} finally {
|
|
121
103
|
abortControllerRef.current = null;
|
|
122
104
|
}
|
|
123
|
-
}, [cancelInFlight, handleProvisionStatus, onDone, safeSetStatus]);
|
|
105
|
+
}, [cancelInFlight, handleProvisionStatus, onDone, runDeviceLogin, safeSetStatus]);
|
|
124
106
|
(0, import_react.useEffect)(() => {
|
|
125
107
|
if (!isVisible) return;
|
|
126
108
|
isActiveRef.current = true;
|
|
127
109
|
setStep("checking");
|
|
128
110
|
setExistingUser(null);
|
|
129
111
|
setAuthUrl(null);
|
|
112
|
+
setDevicePrompt(null);
|
|
130
113
|
setStatus("Preparing login...");
|
|
131
114
|
setError(null);
|
|
132
115
|
void (async () => {
|
|
@@ -195,7 +178,15 @@ const LoginOverlay = (0, import_react.forwardRef)(function LoginOverlay2({ isVis
|
|
|
195
178
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ink.Text, { color: "gray", children: "Status: " }),
|
|
196
179
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ink.Text, { children: status })
|
|
197
180
|
] }),
|
|
198
|
-
|
|
181
|
+
devicePrompt && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_ink.Box, { flexDirection: "column", marginBottom: 1, children: [
|
|
182
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ink.Text, { color: "gray", children: "Open this URL on any device:" }),
|
|
183
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ink.Text, { color: "yellowBright", children: devicePrompt.verificationUrlComplete ?? devicePrompt.verificationUrl }),
|
|
184
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_ink.Text, { color: "gray", children: [
|
|
185
|
+
"Code: ",
|
|
186
|
+
devicePrompt.userCode
|
|
187
|
+
] })
|
|
188
|
+
] }),
|
|
189
|
+
authUrl && !devicePrompt && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_ink.Box, { flexDirection: "column", marginBottom: 1, children: [
|
|
199
190
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ink.Text, { color: "gray", children: "If your browser didn't open, use this URL:" }),
|
|
200
191
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ink.Text, { color: "yellowBright", children: authUrl })
|
|
201
192
|
] }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginOverlay.d.ts","sourceRoot":"","sources":["../../../src/components/overlays/LoginOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAU/D,MAAM,MAAM,mBAAmB,GACzB;IACI,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;CAC3B,GACD;IAAE,OAAO,EAAE,WAAW,CAAA;CAAE,GACxB;IAAE,OAAO,EAAE,QAAQ,CAAA;CAAE,CAAC;AAE5B,MAAM,WAAW,iBAAiB;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,kBAAkB;IAC/B,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;
|
|
1
|
+
{"version":3,"file":"LoginOverlay.d.ts","sourceRoot":"","sources":["../../../src/components/overlays/LoginOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAU/D,MAAM,MAAM,mBAAmB,GACzB;IACI,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;CAC3B,GACD;IAAE,OAAO,EAAE,WAAW,CAAA;CAAE,GACxB;IAAE,OAAO,EAAE,QAAQ,CAAA;CAAE,CAAC;AAE5B,MAAM,WAAW,iBAAiB;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,kBAAkB;IAC/B,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAUD,QAAA,MAAM,YAAY,8FAmOhB,CAAC;AAEH,eAAe,YAAY,CAAC"}
|
|
@@ -9,16 +9,15 @@ import {
|
|
|
9
9
|
} from "react";
|
|
10
10
|
import { Box, Text } from "ink";
|
|
11
11
|
import {
|
|
12
|
-
beginOAuthLogin,
|
|
13
|
-
getDefaultOAuthConfig,
|
|
14
|
-
ensureDextoApiKeyForAuthToken,
|
|
15
12
|
loadAuth,
|
|
16
|
-
|
|
13
|
+
performDeviceCodeLogin,
|
|
14
|
+
persistOAuthLoginResult
|
|
17
15
|
} from "../../host/index.js";
|
|
18
16
|
const LoginOverlay = forwardRef(function LoginOverlay2({ isVisible, onDone }, ref) {
|
|
19
17
|
const [step, setStep] = useState("checking");
|
|
20
18
|
const [existingUser, setExistingUser] = useState(null);
|
|
21
19
|
const [authUrl, setAuthUrl] = useState(null);
|
|
20
|
+
const [devicePrompt, setDevicePrompt] = useState(null);
|
|
22
21
|
const [status, setStatus] = useState("Preparing login...");
|
|
23
22
|
const [error, setError] = useState(null);
|
|
24
23
|
const abortControllerRef = useRef(null);
|
|
@@ -37,57 +36,48 @@ const LoginOverlay = forwardRef(function LoginOverlay2({ isVisible, onDone }, re
|
|
|
37
36
|
abortControllerRef.current?.abort(new Error("Authentication cancelled"));
|
|
38
37
|
abortControllerRef.current = null;
|
|
39
38
|
}, []);
|
|
39
|
+
const runDeviceLogin = useCallback(
|
|
40
|
+
async (abortController) => {
|
|
41
|
+
setStep("starting");
|
|
42
|
+
safeSetStatus("Starting device code login...");
|
|
43
|
+
setAuthUrl(null);
|
|
44
|
+
setDevicePrompt(null);
|
|
45
|
+
return performDeviceCodeLogin({
|
|
46
|
+
signal: abortController.signal,
|
|
47
|
+
onPrompt: (prompt) => {
|
|
48
|
+
if (!isActiveRef.current || abortController.signal.aborted) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
setDevicePrompt(prompt);
|
|
52
|
+
setAuthUrl(prompt.verificationUrlComplete ?? prompt.verificationUrl);
|
|
53
|
+
setStep("waiting");
|
|
54
|
+
safeSetStatus("Open the URL below and approve login.");
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
},
|
|
58
|
+
[safeSetStatus]
|
|
59
|
+
);
|
|
40
60
|
const startLogin = useCallback(async () => {
|
|
41
61
|
cancelInFlight();
|
|
42
62
|
setError(null);
|
|
43
63
|
setAuthUrl(null);
|
|
64
|
+
setDevicePrompt(null);
|
|
44
65
|
const abortController = new AbortController();
|
|
45
66
|
abortControllerRef.current = abortController;
|
|
46
67
|
try {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const session = await beginOAuthLogin(getDefaultOAuthConfig(), {
|
|
50
|
-
signal: abortController.signal
|
|
51
|
-
});
|
|
52
|
-
if (!isActiveRef.current || abortController.signal.aborted) return;
|
|
53
|
-
setAuthUrl(session.authUrl);
|
|
54
|
-
setStep("opening-browser");
|
|
55
|
-
safeSetStatus("Opening browser for authentication...");
|
|
56
|
-
let browserOpened = false;
|
|
57
|
-
try {
|
|
58
|
-
const { default: open } = await import("open");
|
|
59
|
-
await open(session.authUrl);
|
|
60
|
-
browserOpened = true;
|
|
61
|
-
} catch {
|
|
62
|
-
}
|
|
63
|
-
if (!isActiveRef.current || abortController.signal.aborted) return;
|
|
64
|
-
setStep("waiting");
|
|
65
|
-
safeSetStatus(
|
|
66
|
-
browserOpened ? "Waiting for authentication..." : "Browser did not open automatically. Open the URL below to continue."
|
|
67
|
-
);
|
|
68
|
-
const result = await session.result;
|
|
69
|
-
if (!isActiveRef.current || abortController.signal.aborted) return;
|
|
68
|
+
const result = await runDeviceLogin(abortController);
|
|
69
|
+
if (!result || !isActiveRef.current || abortController.signal.aborted) return;
|
|
70
70
|
setStep("finalizing");
|
|
71
71
|
safeSetStatus("Finalizing login...");
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
token: result.accessToken,
|
|
75
|
-
refreshToken: result.refreshToken,
|
|
76
|
-
userId: result.user?.id,
|
|
77
|
-
email: result.user?.email,
|
|
78
|
-
createdAt: Date.now(),
|
|
79
|
-
expiresAt
|
|
80
|
-
});
|
|
81
|
-
safeSetStatus("Provisioning Dexto API key (DEXTO_API_KEY)...");
|
|
82
|
-
const ensured = await ensureDextoApiKeyForAuthToken(result.accessToken, {
|
|
83
|
-
onStatus: handleProvisionStatus
|
|
72
|
+
const persisted = await persistOAuthLoginResult(result, {
|
|
73
|
+
onProvisionStatus: handleProvisionStatus
|
|
84
74
|
});
|
|
85
75
|
if (!isActiveRef.current || abortController.signal.aborted) return;
|
|
86
76
|
onDone({
|
|
87
77
|
outcome: "success",
|
|
88
|
-
email:
|
|
89
|
-
keyId:
|
|
90
|
-
hasDextoApiKey:
|
|
78
|
+
email: persisted.email,
|
|
79
|
+
keyId: persisted.keyId,
|
|
80
|
+
hasDextoApiKey: persisted.hasDextoApiKey
|
|
91
81
|
});
|
|
92
82
|
} catch (err) {
|
|
93
83
|
if (abortController.signal.aborted) {
|
|
@@ -100,13 +90,14 @@ const LoginOverlay = forwardRef(function LoginOverlay2({ isVisible, onDone }, re
|
|
|
100
90
|
} finally {
|
|
101
91
|
abortControllerRef.current = null;
|
|
102
92
|
}
|
|
103
|
-
}, [cancelInFlight, handleProvisionStatus, onDone, safeSetStatus]);
|
|
93
|
+
}, [cancelInFlight, handleProvisionStatus, onDone, runDeviceLogin, safeSetStatus]);
|
|
104
94
|
useEffect(() => {
|
|
105
95
|
if (!isVisible) return;
|
|
106
96
|
isActiveRef.current = true;
|
|
107
97
|
setStep("checking");
|
|
108
98
|
setExistingUser(null);
|
|
109
99
|
setAuthUrl(null);
|
|
100
|
+
setDevicePrompt(null);
|
|
110
101
|
setStatus("Preparing login...");
|
|
111
102
|
setError(null);
|
|
112
103
|
void (async () => {
|
|
@@ -175,7 +166,15 @@ const LoginOverlay = forwardRef(function LoginOverlay2({ isVisible, onDone }, re
|
|
|
175
166
|
/* @__PURE__ */ jsx(Text, { color: "gray", children: "Status: " }),
|
|
176
167
|
/* @__PURE__ */ jsx(Text, { children: status })
|
|
177
168
|
] }),
|
|
178
|
-
|
|
169
|
+
devicePrompt && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [
|
|
170
|
+
/* @__PURE__ */ jsx(Text, { color: "gray", children: "Open this URL on any device:" }),
|
|
171
|
+
/* @__PURE__ */ jsx(Text, { color: "yellowBright", children: devicePrompt.verificationUrlComplete ?? devicePrompt.verificationUrl }),
|
|
172
|
+
/* @__PURE__ */ jsxs(Text, { color: "gray", children: [
|
|
173
|
+
"Code: ",
|
|
174
|
+
devicePrompt.userCode
|
|
175
|
+
] })
|
|
176
|
+
] }),
|
|
177
|
+
authUrl && !devicePrompt && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [
|
|
179
178
|
/* @__PURE__ */ jsx(Text, { color: "gray", children: "If your browser didn't open, use this URL:" }),
|
|
180
179
|
/* @__PURE__ */ jsx(Text, { color: "yellowBright", children: authUrl })
|
|
181
180
|
] }),
|