@usenaive-sdk/cli 0.15.1 → 1.0.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 +43 -402
- package/dist/index.js +51796 -502
- package/package.json +22 -18
- package/dist/client.d.ts +0 -108
- package/dist/client.js +0 -458
- package/dist/client.js.map +0 -1
- package/dist/commands/account-kits.d.ts +0 -2
- package/dist/commands/account-kits.js +0 -71
- package/dist/commands/account-kits.js.map +0 -1
- package/dist/commands/aeo.d.ts +0 -2
- package/dist/commands/aeo.js +0 -451
- package/dist/commands/aeo.js.map +0 -1
- package/dist/commands/agent-profiles.d.ts +0 -11
- package/dist/commands/agent-profiles.js +0 -120
- package/dist/commands/agent-profiles.js.map +0 -1
- package/dist/commands/agents.d.ts +0 -2
- package/dist/commands/agents.js +0 -916
- package/dist/commands/agents.js.map +0 -1
- package/dist/commands/app-data.d.ts +0 -2
- package/dist/commands/app-data.js +0 -445
- package/dist/commands/app-data.js.map +0 -1
- package/dist/commands/approvals.d.ts +0 -2
- package/dist/commands/approvals.js +0 -242
- package/dist/commands/approvals.js.map +0 -1
- package/dist/commands/apps.d.ts +0 -9
- package/dist/commands/apps.js +0 -844
- package/dist/commands/apps.js.map +0 -1
- package/dist/commands/audio.d.ts +0 -9
- package/dist/commands/audio.js +0 -391
- package/dist/commands/audio.js.map +0 -1
- package/dist/commands/auth.d.ts +0 -31
- package/dist/commands/auth.js +0 -428
- package/dist/commands/auth.js.map +0 -1
- package/dist/commands/billing.d.ts +0 -2
- package/dist/commands/billing.js +0 -250
- package/dist/commands/billing.js.map +0 -1
- package/dist/commands/brain.d.ts +0 -2
- package/dist/commands/brain.js +0 -1300
- package/dist/commands/brain.js.map +0 -1
- package/dist/commands/browser.d.ts +0 -2
- package/dist/commands/browser.js +0 -378
- package/dist/commands/browser.js.map +0 -1
- package/dist/commands/business.d.ts +0 -2
- package/dist/commands/business.js +0 -566
- package/dist/commands/business.js.map +0 -1
- package/dist/commands/cards.d.ts +0 -2
- package/dist/commands/cards.js +0 -419
- package/dist/commands/cards.js.map +0 -1
- package/dist/commands/ceo.d.ts +0 -2
- package/dist/commands/ceo.js +0 -369
- package/dist/commands/ceo.js.map +0 -1
- package/dist/commands/clone.d.ts +0 -2
- package/dist/commands/clone.js +0 -203
- package/dist/commands/clone.js.map +0 -1
- package/dist/commands/companies.d.ts +0 -10
- package/dist/commands/companies.js +0 -283
- package/dist/commands/companies.js.map +0 -1
- package/dist/commands/company-data.d.ts +0 -2
- package/dist/commands/company-data.js +0 -168
- package/dist/commands/company-data.js.map +0 -1
- package/dist/commands/compute.d.ts +0 -2
- package/dist/commands/compute.js +0 -498
- package/dist/commands/compute.js.map +0 -1
- package/dist/commands/config.d.ts +0 -2
- package/dist/commands/config.js +0 -36
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/connections.d.ts +0 -8
- package/dist/commands/connections.js +0 -137
- package/dist/commands/connections.js.map +0 -1
- package/dist/commands/cron-jobs.d.ts +0 -2
- package/dist/commands/cron-jobs.js +0 -245
- package/dist/commands/cron-jobs.js.map +0 -1
- package/dist/commands/domains.d.ts +0 -2
- package/dist/commands/domains.js +0 -474
- package/dist/commands/domains.js.map +0 -1
- package/dist/commands/ecommerce.d.ts +0 -2
- package/dist/commands/ecommerce.js +0 -277
- package/dist/commands/ecommerce.js.map +0 -1
- package/dist/commands/email.d.ts +0 -2
- package/dist/commands/email.js +0 -336
- package/dist/commands/email.js.map +0 -1
- package/dist/commands/employees.d.ts +0 -2
- package/dist/commands/employees.js +0 -190
- package/dist/commands/employees.js.map +0 -1
- package/dist/commands/env.d.ts +0 -7
- package/dist/commands/env.js +0 -112
- package/dist/commands/env.js.map +0 -1
- package/dist/commands/formation.d.ts +0 -2
- package/dist/commands/formation.js +0 -273
- package/dist/commands/formation.js.map +0 -1
- package/dist/commands/identity.d.ts +0 -2
- package/dist/commands/identity.js +0 -110
- package/dist/commands/identity.js.map +0 -1
- package/dist/commands/images.d.ts +0 -2
- package/dist/commands/images.js +0 -371
- package/dist/commands/images.js.map +0 -1
- package/dist/commands/init.d.ts +0 -5
- package/dist/commands/init.js +0 -43
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/jobs.d.ts +0 -2
- package/dist/commands/jobs.js +0 -144
- package/dist/commands/jobs.js.map +0 -1
- package/dist/commands/keys.d.ts +0 -2
- package/dist/commands/keys.js +0 -156
- package/dist/commands/keys.js.map +0 -1
- package/dist/commands/legacy-auth.d.ts +0 -27
- package/dist/commands/legacy-auth.js +0 -64
- package/dist/commands/legacy-auth.js.map +0 -1
- package/dist/commands/llm.d.ts +0 -2
- package/dist/commands/llm.js +0 -125
- package/dist/commands/llm.js.map +0 -1
- package/dist/commands/login.d.ts +0 -2
- package/dist/commands/login.js +0 -65
- package/dist/commands/login.js.map +0 -1
- package/dist/commands/logout.d.ts +0 -7
- package/dist/commands/logout.js +0 -55
- package/dist/commands/logout.js.map +0 -1
- package/dist/commands/logs.d.ts +0 -2
- package/dist/commands/logs.js +0 -42
- package/dist/commands/logs.js.map +0 -1
- package/dist/commands/loops.d.ts +0 -2
- package/dist/commands/loops.js +0 -260
- package/dist/commands/loops.js.map +0 -1
- package/dist/commands/media.d.ts +0 -2
- package/dist/commands/media.js +0 -183
- package/dist/commands/media.js.map +0 -1
- package/dist/commands/memory.d.ts +0 -2
- package/dist/commands/memory.js +0 -151
- package/dist/commands/memory.js.map +0 -1
- package/dist/commands/mobile.d.ts +0 -4
- package/dist/commands/mobile.js +0 -382
- package/dist/commands/mobile.js.map +0 -1
- package/dist/commands/module.d.ts +0 -8
- package/dist/commands/module.js +0 -48
- package/dist/commands/module.js.map +0 -1
- package/dist/commands/objectives.d.ts +0 -2
- package/dist/commands/objectives.js +0 -243
- package/dist/commands/objectives.js.map +0 -1
- package/dist/commands/payments.d.ts +0 -2
- package/dist/commands/payments.js +0 -131
- package/dist/commands/payments.js.map +0 -1
- package/dist/commands/people.d.ts +0 -2
- package/dist/commands/people.js +0 -197
- package/dist/commands/people.js.map +0 -1
- package/dist/commands/phone.d.ts +0 -2
- package/dist/commands/phone.js +0 -289
- package/dist/commands/phone.js.map +0 -1
- package/dist/commands/projects.d.ts +0 -13
- package/dist/commands/projects.js +0 -220
- package/dist/commands/projects.js.map +0 -1
- package/dist/commands/queue.d.ts +0 -2
- package/dist/commands/queue.js +0 -121
- package/dist/commands/queue.js.map +0 -1
- package/dist/commands/register.d.ts +0 -2
- package/dist/commands/register.js +0 -88
- package/dist/commands/register.js.map +0 -1
- package/dist/commands/report.d.ts +0 -17
- package/dist/commands/report.js +0 -109
- package/dist/commands/report.js.map +0 -1
- package/dist/commands/sandbox.d.ts +0 -2
- package/dist/commands/sandbox.js +0 -558
- package/dist/commands/sandbox.js.map +0 -1
- package/dist/commands/search.d.ts +0 -2
- package/dist/commands/search.js +0 -223
- package/dist/commands/search.js.map +0 -1
- package/dist/commands/seo.d.ts +0 -2
- package/dist/commands/seo.js +0 -528
- package/dist/commands/seo.js.map +0 -1
- package/dist/commands/sessions.d.ts +0 -6
- package/dist/commands/sessions.js +0 -109
- package/dist/commands/sessions.js.map +0 -1
- package/dist/commands/social-data.d.ts +0 -2
- package/dist/commands/social-data.js +0 -245
- package/dist/commands/social-data.js.map +0 -1
- package/dist/commands/social.d.ts +0 -2
- package/dist/commands/social.js +0 -407
- package/dist/commands/social.js.map +0 -1
- package/dist/commands/status.d.ts +0 -2
- package/dist/commands/status.js +0 -79
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/support.d.ts +0 -2
- package/dist/commands/support.js +0 -134
- package/dist/commands/support.js.map +0 -1
- package/dist/commands/tasks.d.ts +0 -2
- package/dist/commands/tasks.js +0 -409
- package/dist/commands/tasks.js.map +0 -1
- package/dist/commands/teams.d.ts +0 -69
- package/dist/commands/teams.js +0 -503
- package/dist/commands/teams.js.map +0 -1
- package/dist/commands/trading.d.ts +0 -2
- package/dist/commands/trading.js +0 -333
- package/dist/commands/trading.js.map +0 -1
- package/dist/commands/up.d.ts +0 -551
- package/dist/commands/up.js +0 -1149
- package/dist/commands/up.js.map +0 -1
- package/dist/commands/usage.d.ts +0 -2
- package/dist/commands/usage.js +0 -73
- package/dist/commands/usage.js.map +0 -1
- package/dist/commands/use.d.ts +0 -12
- package/dist/commands/use.js +0 -96
- package/dist/commands/use.js.map +0 -1
- package/dist/commands/users.d.ts +0 -10
- package/dist/commands/users.js +0 -82
- package/dist/commands/users.js.map +0 -1
- package/dist/commands/vault.d.ts +0 -2
- package/dist/commands/vault.js +0 -101
- package/dist/commands/vault.js.map +0 -1
- package/dist/commands/verification.d.ts +0 -2
- package/dist/commands/verification.js +0 -152
- package/dist/commands/verification.js.map +0 -1
- package/dist/commands/verify-email.d.ts +0 -19
- package/dist/commands/verify-email.js +0 -130
- package/dist/commands/verify-email.js.map +0 -1
- package/dist/commands/video.d.ts +0 -2
- package/dist/commands/video.js +0 -417
- package/dist/commands/video.js.map +0 -1
- package/dist/commands/voice.d.ts +0 -2
- package/dist/commands/voice.js +0 -516
- package/dist/commands/voice.js.map +0 -1
- package/dist/commands/wallet.d.ts +0 -2
- package/dist/commands/wallet.js +0 -244
- package/dist/commands/wallet.js.map +0 -1
- package/dist/commands/webhooks.d.ts +0 -13
- package/dist/commands/webhooks.js +0 -119
- package/dist/commands/webhooks.js.map +0 -1
- package/dist/commands/whoami.d.ts +0 -2
- package/dist/commands/whoami.js +0 -53
- package/dist/commands/whoami.js.map +0 -1
- package/dist/config.d.ts +0 -42
- package/dist/config.js +0 -83
- package/dist/config.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.js.map +0 -1
- package/dist/lib/brain-select.d.ts +0 -193
- package/dist/lib/brain-select.js +0 -403
- package/dist/lib/brain-select.js.map +0 -1
- package/dist/lib/cli-validation.d.ts +0 -12
- package/dist/lib/cli-validation.js +0 -46
- package/dist/lib/cli-validation.js.map +0 -1
- package/dist/lib/config-errors.d.ts +0 -4
- package/dist/lib/config-errors.js +0 -13
- package/dist/lib/config-errors.js.map +0 -1
- package/dist/lib/deprecation.d.ts +0 -158
- package/dist/lib/deprecation.js +0 -140
- package/dist/lib/deprecation.js.map +0 -1
- package/dist/lib/duration.d.ts +0 -8
- package/dist/lib/duration.js +0 -11
- package/dist/lib/duration.js.map +0 -1
- package/dist/lib/http-response.d.ts +0 -11
- package/dist/lib/http-response.js +0 -96
- package/dist/lib/http-response.js.map +0 -1
- package/dist/lib/llm-paywall.d.ts +0 -82
- package/dist/lib/llm-paywall.js +0 -231
- package/dist/lib/llm-paywall.js.map +0 -1
- package/dist/lib/pricing.d.ts +0 -132
- package/dist/lib/pricing.js +0 -148
- package/dist/lib/pricing.js.map +0 -1
- package/dist/lib/starter-config.d.ts +0 -13
- package/dist/lib/starter-config.js +0 -71
- package/dist/lib/starter-config.js.map +0 -1
- package/dist/lib/stream-frames.d.ts +0 -114
- package/dist/lib/stream-frames.js +0 -169
- package/dist/lib/stream-frames.js.map +0 -1
- package/dist/lib/teams-catalog.d.ts +0 -141
- package/dist/lib/teams-catalog.js +0 -841
- package/dist/lib/teams-catalog.js.map +0 -1
- package/dist/lib/unknown-command.d.ts +0 -71
- package/dist/lib/unknown-command.js +0 -132
- package/dist/lib/unknown-command.js.map +0 -1
- package/dist/lib/version-check.d.ts +0 -26
- package/dist/lib/version-check.js +0 -21
- package/dist/lib/version-check.js.map +0 -1
- package/dist/output.d.ts +0 -246
- package/dist/output.js +0 -539
- package/dist/output.js.map +0 -1
- package/dist/prompt.d.ts +0 -17
- package/dist/prompt.js +0 -70
- package/dist/prompt.js.map +0 -1
- package/dist/version.d.ts +0 -2
- package/dist/version.js +0 -14
- package/dist/version.js.map +0 -1
package/dist/commands/auth.js
DELETED
|
@@ -1,428 +0,0 @@
|
|
|
1
|
-
import { Command } from "commander";
|
|
2
|
-
import http from "node:http";
|
|
3
|
-
import { randomBytes } from "node:crypto";
|
|
4
|
-
import { spawn } from "node:child_process";
|
|
5
|
-
import { apiRequest, sessionLogin, sessionRequest } from "../client.js";
|
|
6
|
-
import { loadConfig, saveConfig, clearSession } from "../config.js";
|
|
7
|
-
import { agentError, agentOutput } from "../output.js";
|
|
8
|
-
/**
|
|
9
|
-
* Build the server authorize URL for the CLI loopback Google flow.
|
|
10
|
-
*
|
|
11
|
-
* The `redirect` value is the bare loopback origin `http://127.0.0.1:<port>` with
|
|
12
|
-
* NO trailing slash and NO query — the server re-validates this exact shape
|
|
13
|
-
* (`isLoopbackRedirect`) before it will hand a code back, so any drift here is
|
|
14
|
-
* rejected server-side. `URLSearchParams` percent-encodes the redirect and leaves
|
|
15
|
-
* the base64url `cliState` untouched (it only uses `A-Za-z0-9-_`).
|
|
16
|
-
*/
|
|
17
|
-
export function buildAuthorizeUrl(baseUrl, port, cliState) {
|
|
18
|
-
const redirect = `http://127.0.0.1:${port}`;
|
|
19
|
-
const params = new URLSearchParams({ mode: "cli", redirect, cli_state: cliState });
|
|
20
|
-
return `${baseUrl.replace(/\/+$/, "")}/v1/auth/oauth/google?${params.toString()}`;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Parse the request the server bounced back to our loopback listener.
|
|
24
|
-
*
|
|
25
|
-
* Order matters: the server's ERROR redirect carries `?error=...` with NO
|
|
26
|
-
* `cli_state`, so `error` must be checked first or every error would surface as a
|
|
27
|
-
* spurious `state_mismatch`. The `cli_state` check is the CSRF guard [D8] — a
|
|
28
|
-
* mismatch means the callback wasn't initiated by this process, so we abort
|
|
29
|
-
* without saving anything.
|
|
30
|
-
*/
|
|
31
|
-
export function parseLoopbackRequest(reqUrl, expectedState) {
|
|
32
|
-
let params;
|
|
33
|
-
try {
|
|
34
|
-
params = new URL(reqUrl, "http://127.0.0.1").searchParams;
|
|
35
|
-
}
|
|
36
|
-
catch {
|
|
37
|
-
return { ok: false, reason: "invalid_request" };
|
|
38
|
-
}
|
|
39
|
-
const error = params.get("error");
|
|
40
|
-
if (error)
|
|
41
|
-
return { ok: false, reason: error };
|
|
42
|
-
if (params.get("cli_state") !== expectedState)
|
|
43
|
-
return { ok: false, reason: "state_mismatch" };
|
|
44
|
-
const code = params.get("code");
|
|
45
|
-
if (!code)
|
|
46
|
-
return { ok: false, reason: "missing_code" };
|
|
47
|
-
return { ok: true, code };
|
|
48
|
-
}
|
|
49
|
-
const TIMEOUT_MS = 180_000;
|
|
50
|
-
const SUCCESS_PAGE = `<!doctype html><html lang="en"><head><meta charset="utf-8">` +
|
|
51
|
-
`<meta name="viewport" content="width=device-width,initial-scale=1">` +
|
|
52
|
-
`<meta name="referrer" content="no-referrer"><title>Naive CLI</title></head>` +
|
|
53
|
-
`<body style="font-family:system-ui,-apple-system,sans-serif;text-align:center;padding:3rem;color:#111">` +
|
|
54
|
-
`<h1>Signed in</h1><p>Signed in — you can close this tab and return to your terminal.</p></body></html>`;
|
|
55
|
-
const FAILURE_PAGE = `<!doctype html><html lang="en"><head><meta charset="utf-8">` +
|
|
56
|
-
`<meta name="viewport" content="width=device-width,initial-scale=1">` +
|
|
57
|
-
`<meta name="referrer" content="no-referrer"><title>Naive CLI</title></head>` +
|
|
58
|
-
`<body style="font-family:system-ui,-apple-system,sans-serif;text-align:center;padding:3rem;color:#111">` +
|
|
59
|
-
`<h1>Sign-in failed</h1><p>Something went wrong. Return to your terminal for details.</p></body></html>`;
|
|
60
|
-
/** Map an internal/raw reason to a human-facing message. */
|
|
61
|
-
function describeReason(reason) {
|
|
62
|
-
switch (reason) {
|
|
63
|
-
case "state_mismatch":
|
|
64
|
-
return "Sign-in state did not match the request that started this flow (possible CSRF). Aborted without saving.";
|
|
65
|
-
case "missing_code":
|
|
66
|
-
return "Sign-in did not return an authorization code.";
|
|
67
|
-
case "invalid_request":
|
|
68
|
-
return "The browser callback could not be parsed.";
|
|
69
|
-
default:
|
|
70
|
-
// A message the server bounced back (e.g. "access_denied").
|
|
71
|
-
return reason;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Shared browser-loopback login used by BOTH `auth google` and `auth email`:
|
|
76
|
-
* 1. start a one-shot loopback listener on a random 127.0.0.1 port,
|
|
77
|
-
* 2. let the flow turn (port, cliState) into a URL to open (or an emailed-link
|
|
78
|
-
* message, or an error),
|
|
79
|
-
* 3. accept the single callback, exchange the one-time code for an API key at
|
|
80
|
-
* POST /v1/auth/cli/exchange (identical for both flows),
|
|
81
|
-
* 4. persist the key and print structured success — or fail loudly.
|
|
82
|
-
*
|
|
83
|
-
* The raw API key and the one-time code are NEVER written to stdout/stderr.
|
|
84
|
-
*/
|
|
85
|
-
async function runLoopbackLogin(action, start) {
|
|
86
|
-
const cliState = randomBytes(32).toString("base64url");
|
|
87
|
-
await new Promise((resolve) => {
|
|
88
|
-
let settled = false;
|
|
89
|
-
let port = 0;
|
|
90
|
-
let timer;
|
|
91
|
-
const server = http.createServer(handler);
|
|
92
|
-
function teardown() {
|
|
93
|
-
clearTimeout(timer);
|
|
94
|
-
server.close();
|
|
95
|
-
server.closeAllConnections?.();
|
|
96
|
-
}
|
|
97
|
-
function succeed(data) {
|
|
98
|
-
if (settled)
|
|
99
|
-
return;
|
|
100
|
-
settled = true;
|
|
101
|
-
teardown();
|
|
102
|
-
const companies = data.companies ?? [];
|
|
103
|
-
const hasMultiple = companies.length > 1;
|
|
104
|
-
agentOutput({
|
|
105
|
-
action,
|
|
106
|
-
result: {
|
|
107
|
-
agent_id: data.agent_id,
|
|
108
|
-
company_id: data.company_id,
|
|
109
|
-
company_name: data.company_name,
|
|
110
|
-
credentials_saved: "~/.naive/config.json",
|
|
111
|
-
companies,
|
|
112
|
-
},
|
|
113
|
-
next_steps: [
|
|
114
|
-
{ command: "naive status", description: "Check current credits and resources" },
|
|
115
|
-
{ command: "naive identity", description: "View available resources for this company" },
|
|
116
|
-
...(hasMultiple
|
|
117
|
-
? [{ command: "naive companies select <id>", description: "Switch to a different company", when: "You want to operate under a different company" }]
|
|
118
|
-
: []),
|
|
119
|
-
],
|
|
120
|
-
hints: [
|
|
121
|
-
"Signed in — API key saved to ~/.naive/config.json for automatic auth",
|
|
122
|
-
...(hasMultiple
|
|
123
|
-
? [`You have ${companies.length} companies. Currently using "${data.company_name}". Use 'naive companies' to see all.`]
|
|
124
|
-
: []),
|
|
125
|
-
],
|
|
126
|
-
related_commands: ["naive whoami", "naive companies", "naive status", "naive keys list"],
|
|
127
|
-
});
|
|
128
|
-
resolve();
|
|
129
|
-
}
|
|
130
|
-
function fail(error) {
|
|
131
|
-
if (settled)
|
|
132
|
-
return;
|
|
133
|
-
settled = true;
|
|
134
|
-
teardown();
|
|
135
|
-
agentError({
|
|
136
|
-
action,
|
|
137
|
-
error,
|
|
138
|
-
recovery_steps: [
|
|
139
|
-
{ command: "naive auth google", description: "Sign in with Google in the browser" },
|
|
140
|
-
{ command: "naive auth email <email>", description: "Sign in with an email magic link" },
|
|
141
|
-
{ command: "naive login --email <email> --password <pw>", description: "Sign in with email and password instead" },
|
|
142
|
-
],
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
function writePage(res, status, body, onDone) {
|
|
146
|
-
res.writeHead(status, {
|
|
147
|
-
"Content-Type": "text/html; charset=utf-8",
|
|
148
|
-
"Referrer-Policy": "no-referrer",
|
|
149
|
-
Connection: "close",
|
|
150
|
-
});
|
|
151
|
-
res.end(body, onDone);
|
|
152
|
-
}
|
|
153
|
-
async function exchange(code, res) {
|
|
154
|
-
let resp;
|
|
155
|
-
try {
|
|
156
|
-
resp = await apiRequest("POST", "/v1/auth/cli/exchange", { code }, { noAuth: true });
|
|
157
|
-
}
|
|
158
|
-
catch {
|
|
159
|
-
writePage(res, 502, FAILURE_PAGE, () => fail({ code: "network_error", message: "Could not reach the Naive API to complete sign-in." }));
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
if (resp.status !== 200) {
|
|
163
|
-
const err = resp.data?.error;
|
|
164
|
-
writePage(res, 401, FAILURE_PAGE, () => fail({ code: err?.code ?? "unauthorized", message: err?.message ?? "Sign-in code exchange failed." }));
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
const data = resp.data;
|
|
168
|
-
saveConfig({
|
|
169
|
-
api_key: data.api_key,
|
|
170
|
-
agent_id: data.agent_id,
|
|
171
|
-
company_id: data.company_id,
|
|
172
|
-
company_name: data.company_name,
|
|
173
|
-
});
|
|
174
|
-
writePage(res, 200, SUCCESS_PAGE, () => succeed(data));
|
|
175
|
-
}
|
|
176
|
-
function handler(req, res) {
|
|
177
|
-
// Anti-DNS-rebind: a real browser hitting our loopback sends
|
|
178
|
-
// `Host: 127.0.0.1:<port>`. Anything else is a rebind attempt [SEC-4].
|
|
179
|
-
if (req.headers.host !== `127.0.0.1:${port}`) {
|
|
180
|
-
writePage(res, 404, FAILURE_PAGE, () => { });
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
const path = (req.url ?? "").split("?")[0];
|
|
184
|
-
if (path !== "/") {
|
|
185
|
-
// Ignore incidental requests (favicon, etc.) without settling the flow.
|
|
186
|
-
writePage(res, 404, FAILURE_PAGE, () => { });
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
const parsed = parseLoopbackRequest(req.url ?? "", cliState);
|
|
190
|
-
if (!parsed.ok) {
|
|
191
|
-
writePage(res, 400, FAILURE_PAGE, () => fail({ code: "oauth_failed", message: describeReason(parsed.reason) }));
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
void exchange(parsed.code, res);
|
|
195
|
-
}
|
|
196
|
-
server.listen(0, "127.0.0.1", () => {
|
|
197
|
-
// The port is only known once listening, so the URL and browser open must
|
|
198
|
-
// happen inside this callback [FAL-4/SEC-4].
|
|
199
|
-
port = server.address().port;
|
|
200
|
-
start(port, cliState)
|
|
201
|
-
.then((result) => {
|
|
202
|
-
if ("error" in result) {
|
|
203
|
-
fail({ code: "start_failed", message: result.error });
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
if ("url" in result) {
|
|
207
|
-
openBrowser(result.url);
|
|
208
|
-
const copied = copyToClipboard(result.url);
|
|
209
|
-
// ALWAYS surface the URL so a headless/locked-down environment can finish
|
|
210
|
-
// the flow manually. Printed to stderr to keep stdout a single JSON doc.
|
|
211
|
-
process.stderr.write(`Opening your browser to sign in...\nIf it didn't open${copied ? " (the link is also copied to your clipboard)" : ""}, visit:\n${result.url}\n`);
|
|
212
|
-
}
|
|
213
|
-
else {
|
|
214
|
-
// No URL to open here (e.g. prod emailed the link) — tell the user.
|
|
215
|
-
process.stderr.write(`${result.message}\n`);
|
|
216
|
-
}
|
|
217
|
-
})
|
|
218
|
-
.catch((e) => fail({ code: "start_failed", message: e instanceof Error ? e.message : "Failed to start sign-in" }));
|
|
219
|
-
});
|
|
220
|
-
server.on("error", (err) => {
|
|
221
|
-
fail({ code: "listen_failed", message: `Could not start the local sign-in listener: ${err.message}` });
|
|
222
|
-
});
|
|
223
|
-
timer = setTimeout(() => {
|
|
224
|
-
fail({ code: "timeout", message: `Timed out after ${TIMEOUT_MS / 1000}s waiting for sign-in. Please try again.` });
|
|
225
|
-
}, TIMEOUT_MS);
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* Open the system browser at `url`. Uses an argv array (never a shell string) so
|
|
230
|
-
* the URL can't be interpreted as a shell command [SEC-5]. Best-effort: any failure
|
|
231
|
-
* is swallowed because the URL is always printed as a fallback.
|
|
232
|
-
*/
|
|
233
|
-
function openBrowser(url) {
|
|
234
|
-
try {
|
|
235
|
-
const { command, args } = process.platform === "darwin"
|
|
236
|
-
? { command: "open", args: [url] }
|
|
237
|
-
: process.platform === "win32"
|
|
238
|
-
? { command: "cmd", args: ["/c", "start", "", url] }
|
|
239
|
-
: { command: "xdg-open", args: [url] };
|
|
240
|
-
const child = spawn(command, args, { stdio: "ignore", detached: true });
|
|
241
|
-
child.on("error", () => { });
|
|
242
|
-
child.unref();
|
|
243
|
-
}
|
|
244
|
-
catch {
|
|
245
|
-
// Ignore — the URL was/will be printed as a manual fallback.
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* Best-effort copy of `text` to the system clipboard (argv array, never a shell
|
|
250
|
-
* string). Returns whether the copy was attempted; failures are swallowed because
|
|
251
|
-
* the URL is always printed too.
|
|
252
|
-
*/
|
|
253
|
-
function copyToClipboard(text) {
|
|
254
|
-
try {
|
|
255
|
-
const { command, args } = process.platform === "darwin"
|
|
256
|
-
? { command: "pbcopy", args: [] }
|
|
257
|
-
: process.platform === "win32"
|
|
258
|
-
? { command: "clip", args: [] }
|
|
259
|
-
: { command: "xclip", args: ["-selection", "clipboard"] };
|
|
260
|
-
const child = spawn(command, args, { stdio: ["pipe", "ignore", "ignore"] });
|
|
261
|
-
child.on("error", () => { });
|
|
262
|
-
child.stdin?.end(text);
|
|
263
|
-
return true;
|
|
264
|
-
}
|
|
265
|
-
catch {
|
|
266
|
-
return false;
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
export async function runEmailLogin(email, action = "auth_email") {
|
|
270
|
-
await runLoopbackLogin(action, async (port, cliState) => {
|
|
271
|
-
let resp;
|
|
272
|
-
try {
|
|
273
|
-
resp = await apiRequest("POST", "/v1/auth/magic/start", { email, redirect: `http://127.0.0.1:${port}`, cli_state: cliState }, { noAuth: true });
|
|
274
|
-
}
|
|
275
|
-
catch {
|
|
276
|
-
return { error: "Could not reach the Naive API to start email sign-in." };
|
|
277
|
-
}
|
|
278
|
-
if (resp.status !== 200) {
|
|
279
|
-
const err = resp.data?.error;
|
|
280
|
-
return { error: err?.message ?? "Could not start email sign-in." };
|
|
281
|
-
}
|
|
282
|
-
const data = resp.data;
|
|
283
|
-
if (data.magic_url)
|
|
284
|
-
return { url: data.magic_url };
|
|
285
|
-
return { message: data.message ?? "Check your email for the sign-in link, then return here." };
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
|
-
export const authCmd = new Command("auth")
|
|
289
|
-
.description("Browser-based authentication (Google / email magic-link sign-in)")
|
|
290
|
-
.addHelpText("after", `
|
|
291
|
-
Subcommands:
|
|
292
|
-
google Sign in or sign up with Google in your browser
|
|
293
|
-
email <email> Sign in or sign up with an email magic link
|
|
294
|
-
|
|
295
|
-
Examples:
|
|
296
|
-
$ naive auth google
|
|
297
|
-
$ naive auth email you@example.com
|
|
298
|
-
`);
|
|
299
|
-
authCmd
|
|
300
|
-
.command("google")
|
|
301
|
-
.description("Sign in or sign up with Google via your browser (no password)")
|
|
302
|
-
.addHelpText("after", `
|
|
303
|
-
What this does:
|
|
304
|
-
1. Opens your browser to Google's consent screen
|
|
305
|
-
2. Google redirects back to a one-time local listener on 127.0.0.1
|
|
306
|
-
3. Exchanges the returned code for an API key (signup provisions a new account)
|
|
307
|
-
4. Saves credentials to ~/.naive/config.json (mode 0600)
|
|
308
|
-
`)
|
|
309
|
-
.action(async () => {
|
|
310
|
-
await runLoopbackLogin("auth_google", async (port, cliState) => ({
|
|
311
|
-
url: buildAuthorizeUrl(loadConfig().base_url, port, cliState),
|
|
312
|
-
}));
|
|
313
|
-
});
|
|
314
|
-
authCmd
|
|
315
|
-
.command("email")
|
|
316
|
-
.argument("<email>", "Email address to sign in / sign up with")
|
|
317
|
-
.description("Sign in or sign up with an email magic link (no password)")
|
|
318
|
-
.addHelpText("after", `
|
|
319
|
-
What this does:
|
|
320
|
-
1. Asks the API for a one-time sign-in link for <email>
|
|
321
|
-
2. In dev the link is returned and opened automatically (and copied to your clipboard);
|
|
322
|
-
in production it is emailed to you to click
|
|
323
|
-
3. Opening the link bounces a one-time code back to a local listener on 127.0.0.1
|
|
324
|
-
4. Exchanges it for an API key and saves it to ~/.naive/config.json (mode 0600)
|
|
325
|
-
|
|
326
|
-
Notes:
|
|
327
|
-
- New emails are provisioned a fresh account automatically; existing ones sign in
|
|
328
|
-
- Respects NAIVE_BASE_URL for local/staging targets
|
|
329
|
-
`)
|
|
330
|
-
.action(async (email) => {
|
|
331
|
-
await runEmailLogin(email);
|
|
332
|
-
});
|
|
333
|
-
// ── Human session auth (session-login / logout) — from the clone/voice branch ──
|
|
334
|
-
// Distinct from the agent api_key and the browser sign-in above; needed for
|
|
335
|
-
// human-only ops like `naive voice clone`/`revoke`.
|
|
336
|
-
authCmd
|
|
337
|
-
.command("session-login")
|
|
338
|
-
.description("Log in as a human (session cookie) — needed for `naive voice clone`/`revoke`")
|
|
339
|
-
.requiredOption("--email <email>", "Account email (same as the Studio dashboard)")
|
|
340
|
-
.requiredOption("--password <password>", "Account password")
|
|
341
|
-
.addHelpText("after", `
|
|
342
|
-
What this does:
|
|
343
|
-
1. Authenticates as a HUMAN (not an agent key) and stores a session token (~/.naive/config.json, 0600)
|
|
344
|
-
2. Unlocks human-only commands: naive voice clone / naive voice revoke
|
|
345
|
-
3. The agent api_key (from 'naive login') is unaffected and still used for agent commands
|
|
346
|
-
|
|
347
|
-
Note: this is separate from 'naive login'. Cloning a voice is a human-only action by design.
|
|
348
|
-
`)
|
|
349
|
-
.action(async (opts) => {
|
|
350
|
-
const { token, data } = await sessionLogin(opts.email, opts.password);
|
|
351
|
-
const user = (data.user ?? {});
|
|
352
|
-
const company = (data.company ?? {});
|
|
353
|
-
saveConfig({
|
|
354
|
-
session_token: token,
|
|
355
|
-
user_email: user.email,
|
|
356
|
-
session_company_id: company.id,
|
|
357
|
-
session_company_name: company.name,
|
|
358
|
-
});
|
|
359
|
-
agentOutput({
|
|
360
|
-
action: "auth.session-login",
|
|
361
|
-
result: {
|
|
362
|
-
// deliberately NOT returning the token
|
|
363
|
-
user_email: user.email,
|
|
364
|
-
company_id: company.id,
|
|
365
|
-
company_name: company.name,
|
|
366
|
-
session_saved: "~/.naive/config.json (0600)",
|
|
367
|
-
},
|
|
368
|
-
next_steps: [
|
|
369
|
-
{ command: "naive voice clone <file> --name <name> --consent-type self --i-affirm --consenter-name <you> --attestation <text>", description: "Clone a voice you have consent for" },
|
|
370
|
-
{ command: "naive auth logout", description: "End the human session" },
|
|
371
|
-
],
|
|
372
|
-
hints: ["Human session active — voice clone/revoke are now available."],
|
|
373
|
-
});
|
|
374
|
-
});
|
|
375
|
-
authCmd
|
|
376
|
-
.command("logout")
|
|
377
|
-
.description("End the human session (server-side + local)")
|
|
378
|
-
.action(async () => {
|
|
379
|
-
const cfg = loadConfig();
|
|
380
|
-
if (!cfg.session_token) {
|
|
381
|
-
// Dogfood auth-32dd: agents ran `auth logout` after `naive register`/`login`
|
|
382
|
-
// (agent key only) and got silent `no_session` while `whoami` still worked.
|
|
383
|
-
agentOutput({
|
|
384
|
-
action: "auth.logout",
|
|
385
|
-
result: { status: "no_session" },
|
|
386
|
-
next_steps: [
|
|
387
|
-
{ command: "naive auth session-login --email <e> --password <p>", description: "Start a human session" },
|
|
388
|
-
...(cfg.api_key
|
|
389
|
-
? [
|
|
390
|
-
{
|
|
391
|
-
command: "naive logout",
|
|
392
|
-
description: "Clear the saved agent API key (auth logout only ends human sessions)",
|
|
393
|
-
},
|
|
394
|
-
]
|
|
395
|
-
: []),
|
|
396
|
-
],
|
|
397
|
-
hints: cfg.api_key
|
|
398
|
-
? [
|
|
399
|
-
"No human session was active. Agent commands still use the saved API key — run 'naive logout' to clear it.",
|
|
400
|
-
]
|
|
401
|
-
: undefined,
|
|
402
|
-
});
|
|
403
|
-
return;
|
|
404
|
-
}
|
|
405
|
-
// Invalidate server-side first; clearing only the local file would leave the token
|
|
406
|
-
// live for its full 30-day TTL.
|
|
407
|
-
try {
|
|
408
|
-
await sessionRequest("POST", "/v1/auth/session/logout");
|
|
409
|
-
}
|
|
410
|
-
catch {
|
|
411
|
-
// even if the server call fails, still clear local state below
|
|
412
|
-
}
|
|
413
|
-
clearSession();
|
|
414
|
-
agentOutput({
|
|
415
|
-
action: "auth.logout",
|
|
416
|
-
result: { status: "logged_out" },
|
|
417
|
-
next_steps: [
|
|
418
|
-
{ command: "naive auth session-login --email <e> --password <p>", description: "Start a new human session" },
|
|
419
|
-
...(cfg.api_key
|
|
420
|
-
? [{ command: "naive logout", description: "Also clear the saved agent API key" }]
|
|
421
|
-
: []),
|
|
422
|
-
],
|
|
423
|
-
hints: cfg.api_key
|
|
424
|
-
? ["Human session ended. The agent API key is still saved — use 'naive logout' to clear it."]
|
|
425
|
-
: undefined,
|
|
426
|
-
});
|
|
427
|
-
});
|
|
428
|
-
//# sourceMappingURL=auth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,IAAmD,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEvD;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,IAAY,EAAE,QAAgB;IAC/E,MAAM,QAAQ,GAAG,oBAAoB,IAAI,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnF,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,yBAAyB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AACpF,CAAC;AAID;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,aAAqB;IACxE,IAAI,MAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,YAAY,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAClD,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC/C,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,aAAa;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC9F,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACxD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,GAAG,OAAO,CAAC;AAE3B,MAAM,YAAY,GAChB,6DAA6D;IAC7D,qEAAqE;IACrE,6EAA6E;IAC7E,yGAAyG;IACzG,8GAA8G,CAAC;AAEjH,MAAM,YAAY,GAChB,6DAA6D;IAC7D,qEAAqE;IACrE,6EAA6E;IAC7E,yGAAyG;IACzG,wGAAwG,CAAC;AAE3G,4DAA4D;AAC5D,SAAS,cAAc,CAAC,MAAc;IACpC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,gBAAgB;YACnB,OAAO,yGAAyG,CAAC;QACnH,KAAK,cAAc;YACjB,OAAO,+CAA+C,CAAC;QACzD,KAAK,iBAAiB;YACpB,OAAO,2CAA2C,CAAC;QACrD;YACE,4DAA4D;YAC5D,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAaD;;;;;;;;;;GAUG;AACH,KAAK,UAAU,gBAAgB,CAC7B,MAAc,EACd,KAA+D;IAE/D,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAEvD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,KAAqB,CAAC;QAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAE1C,SAAS,QAAQ;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;QACjC,CAAC;QAED,SAAS,OAAO,CAAC,IAAsB;YACrC,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,QAAQ,EAAE,CAAC;YACX,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;YACvC,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YACzC,WAAW,CAAC;gBACV,MAAM;gBACN,MAAM,EAAE;oBACN,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;oBAC/B,iBAAiB,EAAE,sBAAsB;oBACzC,SAAS;iBACV;gBACD,UAAU,EAAE;oBACV,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,qCAAqC,EAAE;oBAC/E,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,2CAA2C,EAAE;oBACvF,GAAG,CAAC,WAAW;wBACb,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,6BAA6B,EAAE,WAAW,EAAE,+BAA+B,EAAE,IAAI,EAAE,+CAA+C,EAAE,CAAC;wBACnJ,CAAC,CAAC,EAAE,CAAC;iBACR;gBACD,KAAK,EAAE;oBACL,sEAAsE;oBACtE,GAAG,CAAC,WAAW;wBACb,CAAC,CAAC,CAAC,YAAY,SAAS,CAAC,MAAM,gCAAgC,IAAI,CAAC,YAAY,sCAAsC,CAAC;wBACvH,CAAC,CAAC,EAAE,CAAC;iBACR;gBACD,gBAAgB,EAAE,CAAC,cAAc,EAAE,iBAAiB,EAAE,cAAc,EAAE,iBAAiB,CAAC;aACzF,CAAC,CAAC;YACH,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,SAAS,IAAI,CAAC,KAA0C;YACtD,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,QAAQ,EAAE,CAAC;YACX,UAAU,CAAC;gBACT,MAAM;gBACN,KAAK;gBACL,cAAc,EAAE;oBACd,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,oCAAoC,EAAE;oBACnF,EAAE,OAAO,EAAE,0BAA0B,EAAE,WAAW,EAAE,kCAAkC,EAAE;oBACxF,EAAE,OAAO,EAAE,6CAA6C,EAAE,WAAW,EAAE,yCAAyC,EAAE;iBACnH;aACF,CAAC,CAAC;QACL,CAAC;QAED,SAAS,SAAS,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAY,EAAE,MAAkB;YACtF,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;gBACpB,cAAc,EAAE,0BAA0B;gBAC1C,iBAAiB,EAAE,aAAa;gBAChC,UAAU,EAAE,OAAO;aACpB,CAAC,CAAC;YACH,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxB,CAAC;QAED,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,GAAmB;YACvD,IAAI,IAAuC,CAAC;YAC5C,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,uBAAuB,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACvF,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,CACrC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,oDAAoD,EAAE,CAAC,CAC/F,CAAC;gBACF,OAAO;YACT,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAI,IAAI,CAAC,IAAwD,EAAE,KAAK,CAAC;gBAClF,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,CACrC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,cAAc,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,+BAA+B,EAAE,CAAC,CACtG,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAwB,CAAC;YAC3C,UAAU,CAAC;gBACT,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;aAChC,CAAC,CAAC;YACH,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,SAAS,OAAO,CAAC,GAAoB,EAAE,GAAmB;YACxD,6DAA6D;YAC7D,uEAAuE;YACvE,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,aAAa,IAAI,EAAE,EAAE,CAAC;gBAC7C,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,wEAAwE;gBACxE,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,CACrC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CACvE,CAAC;gBACF,OAAO;YACT,CAAC;YACD,KAAK,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,0EAA0E;YAC1E,6CAA6C;YAC7C,IAAI,GAAI,MAAM,CAAC,OAAO,EAAkB,CAAC,IAAI,CAAC;YAC9C,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC;iBAClB,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACf,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;oBACtB,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;oBACtD,OAAO;gBACT,CAAC;gBACD,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;oBACpB,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACxB,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC3C,0EAA0E;oBAC1E,yEAAyE;oBACzE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wDAAwD,MAAM,CAAC,CAAC,CAAC,8CAA8C,CAAC,CAAC,CAAC,EAAE,aAAa,MAAM,CAAC,GAAG,IAAI,CAChJ,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,oEAAoE;oBACpE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE,CACpB,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,EAAE,CAAC,CACpG,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,+CAA+C,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACzG,CAAC,CAAC,CAAC;QAEH,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB,UAAU,GAAG,IAAI,0CAA0C,EAAE,CAAC,CAAC;QACrH,CAAC,EAAE,UAAU,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GACrB,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAC3B,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE;YAClC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;gBAC5B,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE;gBACpD,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC5B,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,6DAA6D;IAC/D,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GACrB,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAC3B,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAc,EAAE;YAC7C,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;gBAC5B,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAc,EAAE;gBAC3C,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC;QAChE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5E,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC5B,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAa,EAAE,MAAM,GAAG,YAAY;IACtE,MAAM,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QACtD,IAAI,IAAuC,CAAC;QAC5C,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,UAAU,CACrB,MAAM,EACN,sBAAsB,EACtB,EAAE,KAAK,EAAE,QAAQ,EAAE,oBAAoB,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EACpE,EAAE,MAAM,EAAE,IAAI,EAAE,CACjB,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,KAAK,EAAE,uDAAuD,EAAE,CAAC;QAC5E,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACxB,MAAM,GAAG,GAAI,IAAI,CAAC,IAAyC,EAAE,KAAK,CAAC;YACnE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,gCAAgC,EAAE,CAAC;QACrE,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAgD,CAAC;QACnE,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QACnD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,0DAA0D,EAAE,CAAC;IACjG,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KACvC,WAAW,CAAC,kEAAkE,CAAC;KAC/E,WAAW,CAAC,OAAO,EAAE;;;;;;;;CAQvB,CAAC,CAAC;AAEH,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,+DAA+D,CAAC;KAC5E,WAAW,CAAC,OAAO,EAAE;;;;;;CAMvB,CAAC;KACC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,gBAAgB,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC/D,GAAG,EAAE,iBAAiB,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC;KAC9D,CAAC,CAAC,CAAC;AACN,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,QAAQ,CAAC,SAAS,EAAE,yCAAyC,CAAC;KAC9D,WAAW,CAAC,2DAA2D,CAAC;KACxE,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;CAWvB,CAAC;KACC,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;IAC9B,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEL,kFAAkF;AAClF,4EAA4E;AAC5E,oDAAoD;AACpD,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,8EAA8E,CAAC;KAC3F,cAAc,CAAC,iBAAiB,EAAE,8CAA8C,CAAC;KACjF,cAAc,CAAC,uBAAuB,EAAE,kBAAkB,CAAC;KAC3D,WAAW,CAAC,OAAO,EAAE;;;;;;;CAOvB,CAAC;KACC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAuB,CAAC;IACrD,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAmC,CAAC;IAEvE,UAAU,CAAC;QACT,aAAa,EAAE,KAAK;QACpB,UAAU,EAAE,IAAI,CAAC,KAAK;QACtB,kBAAkB,EAAE,OAAO,CAAC,EAAE;QAC9B,oBAAoB,EAAE,OAAO,CAAC,IAAI;KACnC,CAAC,CAAC;IAEH,WAAW,CAAC;QACV,MAAM,EAAE,oBAAoB;QAC5B,MAAM,EAAE;YACN,uCAAuC;YACvC,UAAU,EAAE,IAAI,CAAC,KAAK;YACtB,UAAU,EAAE,OAAO,CAAC,EAAE;YACtB,YAAY,EAAE,OAAO,CAAC,IAAI;YAC1B,aAAa,EAAE,6BAA6B;SAC7C;QACD,UAAU,EAAE;YACV,EAAE,OAAO,EAAE,mHAAmH,EAAE,WAAW,EAAE,oCAAoC,EAAE;YACnL,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,uBAAuB,EAAE;SACvE;QACD,KAAK,EAAE,CAAC,8DAA8D,CAAC;KACxE,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACvB,6EAA6E;QAC7E,4EAA4E;QAC5E,WAAW,CAAC;YACV,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE;YAChC,UAAU,EAAE;gBACV,EAAE,OAAO,EAAE,qDAAqD,EAAE,WAAW,EAAE,uBAAuB,EAAE;gBACxG,GAAG,CAAC,GAAG,CAAC,OAAO;oBACb,CAAC,CAAC;wBACE;4BACE,OAAO,EAAE,cAAc;4BACvB,WAAW,EAAE,sEAAsE;yBACpF;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;aACR;YACD,KAAK,EAAE,GAAG,CAAC,OAAO;gBAChB,CAAC,CAAC;oBACE,2GAA2G;iBAC5G;gBACH,CAAC,CAAC,SAAS;SACd,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,mFAAmF;IACnF,gCAAgC;IAChC,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;IACD,YAAY,EAAE,CAAC;IACf,WAAW,CAAC;QACV,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE;QAChC,UAAU,EAAE;YACV,EAAE,OAAO,EAAE,qDAAqD,EAAE,WAAW,EAAE,2BAA2B,EAAE;YAC5G,GAAG,CAAC,GAAG,CAAC,OAAO;gBACb,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,oCAAoC,EAAE,CAAC;gBAClF,CAAC,CAAC,EAAE,CAAC;SACR;QACD,KAAK,EAAE,GAAG,CAAC,OAAO;YAChB,CAAC,CAAC,CAAC,yFAAyF,CAAC;YAC7F,CAAC,CAAC,SAAS;KACd,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|