@asiyst/cli 1.0.4 → 1.0.6
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 +1 -1
- package/dist/index.js +46 -36
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,7 +18,7 @@ Interactive startup performs a lightweight npm version check. If a newer release
|
|
|
18
18
|
|
|
19
19
|
The CLI creates a short-lived, single-use session through `POST /api/cli/sessions`, opens its returned URL, and polls `GET /api/cli/sessions/:sessionId/status`. Passwords, AI provider keys, Supabase keys, and private API credentials are never requested, placed in URLs, or logged.
|
|
20
20
|
|
|
21
|
-
Set `ASIIYST_API_URL` for
|
|
21
|
+
Set `ASIIYST_API_URL` only for a controlled non-production deployment (production defaults to `https://asiyst.com/api/v1`). The current SDK accepts `projectId` and `publicKey` through its public `Asiyst.init({ ... })` API. For verification, configure `ASIIYST_PROJECT_ID` and `ASIIYST_PUBLIC_KEY` in the project environment.
|
|
22
22
|
|
|
23
23
|
## Required web API
|
|
24
24
|
|
package/dist/index.js
CHANGED
|
@@ -58,18 +58,6 @@ function detectFramework(cwd, pkg) {
|
|
|
58
58
|
if (existsSync(resolve(cwd, "next.config.js")) || existsSync(resolve(cwd, "next.config.mjs"))) return "Next.js";
|
|
59
59
|
return "Vanilla JavaScript/TypeScript";
|
|
60
60
|
}
|
|
61
|
-
function readEnv(cwd) {
|
|
62
|
-
const result = {};
|
|
63
|
-
const path = resolve(cwd, ".env");
|
|
64
|
-
if (!existsSync(path)) return result;
|
|
65
|
-
for (const line of readFileSync(path, "utf8").split(/\r?\n/)) {
|
|
66
|
-
const match = /^\s*(?:export\s+)?([A-Z0-9_]+)\s*=\s*(.*?)\s*$/.exec(line);
|
|
67
|
-
if (match && !match[1].toLowerCase().includes("secret") && !match[1].toLowerCase().includes("token")) {
|
|
68
|
-
result[match[1]] = match[2].replace(/^(['"])(.*)\1$/, "$2");
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
return result;
|
|
72
|
-
}
|
|
73
61
|
function detectProject(cwd = process.cwd()) {
|
|
74
62
|
const path = resolve(cwd, "package.json");
|
|
75
63
|
let packageJson = null;
|
|
@@ -81,7 +69,7 @@ function detectProject(cwd = process.cwd()) {
|
|
|
81
69
|
packageJson = null;
|
|
82
70
|
}
|
|
83
71
|
}
|
|
84
|
-
const env =
|
|
72
|
+
const env = process.env;
|
|
85
73
|
const packageManager = existsSync(resolve(cwd, "pnpm-lock.yaml")) ? "pnpm" : existsSync(resolve(cwd, "yarn.lock")) ? "yarn" : existsSync(resolve(cwd, "bun.lockb")) || existsSync(resolve(cwd, "bun.lock")) ? "bun" : "npm";
|
|
86
74
|
const sourceFiles = ["tsconfig.json", "src", "app"].some((entry) => existsSync(resolve(cwd, entry)));
|
|
87
75
|
return {
|
|
@@ -98,6 +86,10 @@ function detectProject(cwd = process.cwd()) {
|
|
|
98
86
|
};
|
|
99
87
|
}
|
|
100
88
|
|
|
89
|
+
// src/config/api.ts
|
|
90
|
+
var CLI_API_BASE_URL = "https://asiyst.com/api/v1";
|
|
91
|
+
var ASIIYST_WEB_URL = "https://asiyst.com";
|
|
92
|
+
|
|
101
93
|
// src/api/client.ts
|
|
102
94
|
var ApiError = class extends Error {
|
|
103
95
|
constructor(message, status) {
|
|
@@ -108,7 +100,7 @@ var ApiError = class extends Error {
|
|
|
108
100
|
status;
|
|
109
101
|
};
|
|
110
102
|
var ApiClient = class {
|
|
111
|
-
constructor(baseUrl = process.env.ASIIYST_API_URL ||
|
|
103
|
+
constructor(baseUrl = process.env.ASIIYST_API_URL || CLI_API_BASE_URL, fetcher = fetch) {
|
|
112
104
|
this.fetcher = fetcher;
|
|
113
105
|
this.baseUrl = baseUrl.replace(/\/+$/, "");
|
|
114
106
|
}
|
|
@@ -122,35 +114,40 @@ var ApiClient = class {
|
|
|
122
114
|
headers: { Accept: "application/json", "Content-Type": "application/json", ...init?.headers }
|
|
123
115
|
});
|
|
124
116
|
} catch (error) {
|
|
125
|
-
throw new ApiError(`Unable to reach Asiyst API
|
|
117
|
+
throw new ApiError(`Unable to reach Asiyst API at ${this.baseUrl}${path}. Check your internet connection, DNS, TLS/HTTPS, or whether the service is unavailable.`);
|
|
126
118
|
}
|
|
127
119
|
const body = await response.json().catch(() => void 0);
|
|
128
|
-
if (!response.ok)
|
|
120
|
+
if (!response.ok) {
|
|
121
|
+
const detail = response.status === 401 ? "Authentication is required." : response.status === 403 ? "The request is not authorized." : response.status === 404 ? "The requested resource was not found." : response.status === 409 ? "The request conflicts with the current project state." : response.status === 429 ? "Too many requests; try again shortly." : response.status >= 500 ? "Asiyst is temporarily unavailable." : "The request was rejected.";
|
|
122
|
+
throw new ApiError(`Asiyst API returned HTTP ${response.status}. ${detail}`, response.status);
|
|
123
|
+
}
|
|
129
124
|
return body;
|
|
130
125
|
}
|
|
126
|
+
health() {
|
|
127
|
+
return this.request("/health");
|
|
128
|
+
}
|
|
131
129
|
createSession() {
|
|
132
|
-
return this.request("/
|
|
130
|
+
return this.request("/cli/sessions", { method: "POST", body: JSON.stringify({}) }).then((value) => {
|
|
133
131
|
if (!value || typeof value !== "object") throw new ApiError("Asiyst returned an invalid session response");
|
|
134
132
|
const session = value;
|
|
135
133
|
if (typeof session.sessionId !== "string" || typeof session.connectUrl !== "string" || typeof session.expiresAt !== "string") {
|
|
136
134
|
throw new ApiError("Asiyst returned an invalid session response");
|
|
137
135
|
}
|
|
138
136
|
const url = new URL(session.connectUrl);
|
|
139
|
-
|
|
140
|
-
if (url.protocol !== "https:" && !(localApi && url.protocol === "http:")) {
|
|
137
|
+
if (url.protocol !== "https:") {
|
|
141
138
|
throw new ApiError("Asiyst returned an insecure connection URL");
|
|
142
139
|
}
|
|
143
140
|
return { sessionId: session.sessionId, connectUrl: url.toString(), expiresAt: session.expiresAt };
|
|
144
141
|
});
|
|
145
142
|
}
|
|
146
143
|
sessionStatus(sessionId) {
|
|
147
|
-
return this.request(`/
|
|
144
|
+
return this.request(`/cli/sessions/${encodeURIComponent(sessionId)}/status`);
|
|
148
145
|
}
|
|
149
146
|
projectInfo(projectId) {
|
|
150
|
-
return this.request(`/
|
|
147
|
+
return this.request(`/cli/projects/${encodeURIComponent(projectId)}`);
|
|
151
148
|
}
|
|
152
149
|
verify(projectId, publicKey, domain) {
|
|
153
|
-
return this.request("/
|
|
150
|
+
return this.request("/cli/verification", {
|
|
154
151
|
method: "POST",
|
|
155
152
|
body: JSON.stringify({ projectId, publicKey, domain })
|
|
156
153
|
}).then((value) => {
|
|
@@ -241,8 +238,7 @@ function selectOption(title, options, prompt = "> ") {
|
|
|
241
238
|
if (key.ctrl && key.name === "c") return finish({ type: "cancelled", input });
|
|
242
239
|
if (key.ctrl && key.name === "d") return finish({ type: "exit", input });
|
|
243
240
|
if (key.name === "escape") {
|
|
244
|
-
|
|
245
|
-
return render();
|
|
241
|
+
return finish({ type: "cancelled", input });
|
|
246
242
|
}
|
|
247
243
|
if (key.name === "up" || key.name === "down") {
|
|
248
244
|
const matches = filtered();
|
|
@@ -254,7 +250,7 @@ function selectOption(title, options, prompt = "> ") {
|
|
|
254
250
|
const matches = filtered();
|
|
255
251
|
const selected = matches[active];
|
|
256
252
|
if (selected) return finish({ type: "selected", value: selected.value, input });
|
|
257
|
-
return finish({ type: "
|
|
253
|
+
return finish({ type: "cancelled", input });
|
|
258
254
|
}
|
|
259
255
|
if (key.name === "tab") {
|
|
260
256
|
const matches = filtered();
|
|
@@ -343,7 +339,8 @@ function revokeTrust(cwd) {
|
|
|
343
339
|
// src/commands/trust.ts
|
|
344
340
|
async function ensureTrusted(cwd = process.cwd()) {
|
|
345
341
|
if (isTrusted(cwd)) return true;
|
|
346
|
-
if (!await confirm(`
|
|
342
|
+
if (!await confirm(`Trust this project folder?
|
|
343
|
+
|
|
347
344
|
${cwd}
|
|
348
345
|
|
|
349
346
|
Asiyst may read project files and modify Asiyst configuration during setup.`)) {
|
|
@@ -402,14 +399,19 @@ function logoutCommand() {
|
|
|
402
399
|
// src/commands/status.ts
|
|
403
400
|
async function statusCommand(cwd = process.cwd(), api = new ApiClient()) {
|
|
404
401
|
const project = detectProject(cwd);
|
|
405
|
-
console.log(`Project
|
|
406
|
-
SDK
|
|
407
|
-
if (!project.config.projectId) {
|
|
408
|
-
console.log("
|
|
402
|
+
console.log(`Project: ${typeof project.packageJson?.name === "string" ? project.packageJson.name : "Unknown"}
|
|
403
|
+
SDK: ${project.sdkVersion || "Not connected"}`);
|
|
404
|
+
if (!project.config.projectId || !project.config.publicKey) {
|
|
405
|
+
console.log("\nProject: Not connected\nSDK: Not connected\nAvatar: Not configured\n\nStatistics:\nConnect your website to show stats.");
|
|
409
406
|
return;
|
|
410
407
|
}
|
|
411
408
|
const info = await api.projectInfo(project.config.projectId);
|
|
412
|
-
|
|
409
|
+
console.log(`
|
|
410
|
+
Project: ${info.connectionStatus || "Connected"}
|
|
411
|
+
SDK: ${project.sdkVersion}
|
|
412
|
+
Avatar: ${info.avatarStatus || "Not configured"}`);
|
|
413
|
+
console.log("\nStatistics:");
|
|
414
|
+
console.log(info.lastSdkConnection ? `Last SDK heartbeat: ${info.lastSdkConnection}` : "No SDK heartbeat recorded.");
|
|
413
415
|
}
|
|
414
416
|
|
|
415
417
|
// src/commands/verify.ts
|
|
@@ -452,18 +454,26 @@ async function doctorCommand(cwd = process.cwd(), api = new ApiClient()) {
|
|
|
452
454
|
project.sdkVersion ? ok("SDK", project.sdkVersion) : fail("SDK", "not installed");
|
|
453
455
|
project.config.projectId && project.config.publicKey ? ok("Configuration") : fail("Configuration", "public project values are missing");
|
|
454
456
|
try {
|
|
455
|
-
await api.
|
|
456
|
-
ok("Asiyst API");
|
|
457
|
+
await api.health();
|
|
458
|
+
ok("Asiyst API", "HTTPS health endpoint reachable");
|
|
457
459
|
} catch (error) {
|
|
458
460
|
fail("Asiyst API", error instanceof Error ? error.message : "unreachable");
|
|
459
461
|
}
|
|
462
|
+
if (project.config.projectId && project.config.publicKey) {
|
|
463
|
+
try {
|
|
464
|
+
await api.projectInfo(project.config.projectId);
|
|
465
|
+
ok("Project connection");
|
|
466
|
+
} catch (error) {
|
|
467
|
+
fail("Project connection", error instanceof Error ? error.message : "unavailable");
|
|
468
|
+
}
|
|
469
|
+
}
|
|
460
470
|
}
|
|
461
471
|
|
|
462
472
|
// src/commands/dashboard.ts
|
|
463
473
|
async function dashboardCommand() {
|
|
464
|
-
const configured = process.env.ASIIYST_DASHBOARD_URL ||
|
|
474
|
+
const configured = process.env.ASIIYST_DASHBOARD_URL || ASIIYST_WEB_URL;
|
|
465
475
|
const parsed = new URL(configured);
|
|
466
|
-
if (parsed.protocol !== "https:"
|
|
476
|
+
if (parsed.protocol !== "https:") throw new Error("Configured dashboard URL must use HTTPS.");
|
|
467
477
|
const url = parsed.toString();
|
|
468
478
|
if (!await openBrowser(url)) console.log(`Open ${url}`);
|
|
469
479
|
else console.log(`Opening ${url}`);
|
|
@@ -474,7 +484,7 @@ async function avatarCommand(cwd = process.cwd(), api = new ApiClient()) {
|
|
|
474
484
|
const project = detectProject(cwd);
|
|
475
485
|
if (!project.config.projectId) {
|
|
476
486
|
console.log("Avatar\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nNo avatar configured.\n\nCreate your avatar in the Asiyst dashboard.");
|
|
477
|
-
const url =
|
|
487
|
+
const url = ASIIYST_WEB_URL;
|
|
478
488
|
if (await openBrowser(url)) console.log(`Opening ${url}`);
|
|
479
489
|
else console.log(`Open ${url}`);
|
|
480
490
|
return;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/output.ts","../src/detection/project.ts","../src/api/client.ts","../src/config/local.ts","../src/browser/open.ts","../src/ui/selector.ts","../src/commands/shared.ts","../src/config/trust.ts","../src/commands/trust.ts","../src/commands/init.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/status.ts","../src/commands/verify.ts","../src/commands/doctor.ts","../src/commands/dashboard.ts","../src/commands/avatar.ts","../src/update/check.ts","../src/config/version.ts","../src/commands/update.ts","../src/commands/interactive.ts","../src/index.ts"],"sourcesContent":["import type { ProjectDetection, VerificationResult } from \"../types.js\";\n\nexport const ok = (label: string, detail = \"\") => console.log(` ✓ ${label}${detail ? ` (${detail})` : \"\"}`);\nexport const fail = (label: string, detail = \"\") => console.log(` ✗ ${label}${detail ? `: ${detail}` : \"\"}`);\n\nexport function projectChecks(project: ProjectDetection): void {\n project.packageJson\n ? ok(\"Project detected\", typeof project.packageJson.name === \"string\" ? project.packageJson.name : project.cwd)\n : fail(\"Project not detected\", \"package.json is missing\");\n ok(\"Framework detected\", project.framework);\n ok(\"Language detected\", project.language);\n ok(\"Node.js detected\", process.version);\n ok(\"Package manager detected\", project.packageManager);\n project.sdkVersion\n ? ok(\"@asiyst/sdk detected\", project.sdkVersion)\n : fail(\"@asiyst/sdk is not installed\", \"npm install @asiyst/sdk\");\n}\n\nexport function homeStatus(project: ProjectDetection, connection = \"Not connected\"): void {\n console.log(\"\\n PROJECT STATUS\");\n console.log(` Project ${typeof project.packageJson?.name === \"string\" ? project.packageJson.name : \"Not detected\"}`);\n console.log(` Framework ${project.framework}`);\n console.log(` Language ${project.language}`);\n console.log(` Node.js ${process.version}`);\n console.log(` Package Manager ${project.packageManager}`);\n console.log(` @asiyst/sdk ${project.sdkVersion || \"Not installed\"}`);\n console.log(\"\\n ASIYST STATUS\");\n console.log(` Connection ${connection}`);\n console.log(` Avatar Not configured`);\n console.log(` AI Provider Not configured`);\n console.log(` Project ID ${project.config.projectId || \"—\"}`);\n if (connection === \"Not connected\") console.log(\"\\n Run 'connect' to link this project.\");\n}\n\nexport function printVerification(results: VerificationResult[]): boolean {\n console.log(\"\\n Asiyst Installation Verification\\n\");\n for (const result of results) result.ok ? ok(result.name, result.detail) : fail(result.name, result.detail);\n const success = results.length > 0 && results.every((result) => result.ok);\n if (success) console.log(\"\\n ────────────────────────────\\n\\n ASIYST IS READY ✓\");\n return success;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\r\nimport { resolve } from \"node:path\";\r\nimport type { ProjectDetection } from \"../types.js\";\r\n\r\nfunction dependencyVersion(pkg: Record<string, unknown>): string | undefined {\r\n const sections = [\"dependencies\", \"devDependencies\", \"peerDependencies\", \"optionalDependencies\"];\r\n for (const section of sections) {\r\n const values = pkg[section];\r\n if (values && typeof values === \"object\" && \"@asiyst/sdk\" in values) {\r\n const version = (values as Record<string, unknown>)[\"@asiyst/sdk\"];\r\n return typeof version === \"string\" ? version : undefined;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function detectFramework(cwd: string, pkg: Record<string, unknown> | null): string {\r\n const deps: Record<string, unknown> = Object.assign({}, pkg?.dependencies, pkg?.devDependencies);\r\n if (typeof deps.next === \"string\") return \"Next.js\";\r\n if (typeof deps.react === \"string\") return \"React\";\r\n if (typeof deps.vite === \"string\") return \"Vite\";\r\n if (typeof deps.vue === \"string\") return \"Vue\";\r\n if (existsSync(resolve(cwd, \"vite.config.ts\")) || existsSync(resolve(cwd, \"vite.config.js\"))) return \"Vite\";\r\n if (existsSync(resolve(cwd, \"next.config.js\")) || existsSync(resolve(cwd, \"next.config.mjs\"))) return \"Next.js\";\r\n return \"Vanilla JavaScript/TypeScript\";\r\n}\r\n\r\nfunction readEnv(cwd: string): Record<string, string> {\r\n const result: Record<string, string> = {};\r\n const path = resolve(cwd, \".env\");\r\n if (!existsSync(path)) return result;\r\n for (const line of readFileSync(path, \"utf8\").split(/\\r?\\n/)) {\r\n const match = /^\\s*(?:export\\s+)?([A-Z0-9_]+)\\s*=\\s*(.*?)\\s*$/.exec(line);\r\n if (match && !match[1].toLowerCase().includes(\"secret\") && !match[1].toLowerCase().includes(\"token\")) {\r\n result[match[1]] = match[2].replace(/^(['\"])(.*)\\1$/, \"$2\");\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nexport function detectProject(cwd = process.cwd()): ProjectDetection {\r\n const path = resolve(cwd, \"package.json\");\r\n let packageJson: Record<string, unknown> | null = null;\r\n if (existsSync(path)) {\r\n try {\r\n const value: unknown = JSON.parse(readFileSync(path, \"utf8\"));\r\n if (value && typeof value === \"object\" && !Array.isArray(value)) packageJson = value as Record<string, unknown>;\r\n } catch {\r\n packageJson = null;\r\n }\r\n }\r\n const env = { ...readEnv(cwd), ...process.env } as Record<string, string | undefined>;\r\n const packageManager = existsSync(resolve(cwd, \"pnpm-lock.yaml\")) ? \"pnpm\" :\r\n existsSync(resolve(cwd, \"yarn.lock\")) ? \"yarn\" :\r\n existsSync(resolve(cwd, \"bun.lockb\")) || existsSync(resolve(cwd, \"bun.lock\")) ? \"bun\" : \"npm\";\r\n const sourceFiles = [\"tsconfig.json\", \"src\", \"app\"].some((entry) => existsSync(resolve(cwd, entry)));\r\n return {\r\n cwd,\r\n packageJson,\r\n sdkVersion: packageJson ? dependencyVersion(packageJson) : undefined,\r\n framework: detectFramework(cwd, packageJson),\r\n language: sourceFiles ? \"TypeScript\" : \"JavaScript\",\r\n packageManager,\r\n config: {\r\n projectId: env.ASIIYST_PROJECT_ID,\r\n publicKey: env.ASIIYST_PUBLIC_KEY,\r\n },\r\n };\r\n}\r\n","import type { CliSession, SafeProjectInfo, SessionState, VerificationResult } from \"../types.js\";\r\n\r\nexport class ApiError extends Error {\r\n constructor(message: string, readonly status?: number) {\r\n super(message);\r\n this.name = \"ApiError\";\r\n }\r\n}\r\n\r\nexport class ApiClient {\r\n readonly baseUrl: string;\r\n constructor(baseUrl = process.env.ASIIYST_API_URL || \"https://asiyst.com\", private readonly fetcher: typeof fetch = fetch) {\r\n this.baseUrl = baseUrl.replace(/\\/+$/, \"\");\r\n }\r\n\r\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\r\n let response: Response;\r\n try {\r\n response = await this.fetcher(`${this.baseUrl}${path}`, {\r\n ...init,\r\n headers: { Accept: \"application/json\", \"Content-Type\": \"application/json\", ...init?.headers },\r\n });\r\n } catch (error) {\r\n throw new ApiError(`Unable to reach Asiyst API: ${error instanceof Error ? error.message : \"network error\"}`);\r\n }\r\n const body: unknown = await response.json().catch(() => undefined);\r\n if (!response.ok) throw new ApiError(`Asiyst API returned HTTP ${response.status}`, response.status);\r\n return body as T;\r\n }\r\n\r\n createSession(): Promise<CliSession> {\r\n return this.request<unknown>(\"/api/cli/sessions\", { method: \"POST\", body: JSON.stringify({}) }).then((value) => {\r\n if (!value || typeof value !== \"object\") throw new ApiError(\"Asiyst returned an invalid session response\");\r\n const session = value as Record<string, unknown>;\r\n if (typeof session.sessionId !== \"string\" || typeof session.connectUrl !== \"string\" || typeof session.expiresAt !== \"string\") {\r\n throw new ApiError(\"Asiyst returned an invalid session response\");\r\n }\r\n const url = new URL(session.connectUrl);\r\n const localApi = this.baseUrl.startsWith(\"http://localhost\") || this.baseUrl.startsWith(\"http://127.0.0.1\");\r\n if (url.protocol !== \"https:\" && !(localApi && url.protocol === \"http:\")) {\r\n throw new ApiError(\"Asiyst returned an insecure connection URL\");\r\n }\r\n return { sessionId: session.sessionId, connectUrl: url.toString(), expiresAt: session.expiresAt };\r\n });\r\n }\r\n\r\n sessionStatus(sessionId: string): Promise<{ state: SessionState; project?: SafeProjectInfo }> {\r\n return this.request(`/api/cli/sessions/${encodeURIComponent(sessionId)}/status`);\r\n }\r\n\r\n projectInfo(projectId: string): Promise<SafeProjectInfo> {\r\n return this.request(`/api/cli/projects/${encodeURIComponent(projectId)}`);\r\n }\r\n\r\n verify(projectId: string, publicKey: string, domain?: string): Promise<VerificationResult[]> {\r\n return this.request<unknown>(\"/api/cli/verification\", {\r\n method: \"POST\",\r\n body: JSON.stringify({ projectId, publicKey, domain }),\r\n }).then((value) => {\r\n if (!Array.isArray(value) || !value.every((item) => item && typeof item === \"object\" && typeof (item as Record<string, unknown>).name === \"string\" && typeof (item as Record<string, unknown>).ok === \"boolean\")) {\r\n throw new ApiError(\"Asiyst returned an invalid verification response\");\r\n }\r\n return value as VerificationResult[];\r\n });\r\n }\r\n}\r\n","import { existsSync, readFileSync } from \"node:fs\";\r\nimport { resolve } from \"node:path\";\r\nimport type { ProjectDetection } from \"../types.js\";\r\n\r\nexport function hasConfiguration(project: ProjectDetection): boolean {\r\n return Boolean(project.config.projectId && project.config.publicKey);\r\n}\r\n\r\nexport function configWarning(cwd: string): string | undefined {\r\n const envPath = resolve(cwd, \".env\");\r\n if (existsSync(envPath)) {\r\n const ignored = existsSync(resolve(cwd, \".gitignore\")) &&\r\n readFileSync(resolve(cwd, \".gitignore\"), \"utf8\").split(/\\r?\\n/).some((line) => line.trim() === \".env\" || line.trim() === \".env.*\");\r\n if (!ignored) return \"Your .env file is not clearly ignored by .gitignore; do not commit public or private configuration accidentally.\";\r\n }\r\n return undefined;\r\n}\r\n","import { execFile } from \"node:child_process\";\r\nimport { promisify } from \"node:util\";\r\nconst execFileAsync = promisify(execFile);\r\n\r\nexport async function openBrowser(url: string): Promise<boolean> {\r\n const command = process.platform === \"win32\" ? \"rundll32.exe\" : process.platform === \"darwin\" ? \"open\" : \"xdg-open\";\r\n const args = process.platform === \"win32\" ? [\"url.dll,FileProtocolHandler\", url] : [url];\r\n try {\r\n await execFileAsync(command, args);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n","import { stdin, stdout } from \"node:process\";\r\nimport { emitKeypressEvents } from \"node:readline\";\r\n\r\nexport interface SelectorOption<T> {\r\n label: string;\r\n value: T;\r\n disabled?: boolean;\r\n}\r\n\r\nexport type SelectorResult<T> = { type: \"selected\"; value: T; input: string } | { type: \"cancelled\" | \"exit\"; input: string };\r\n\r\nconst escape = \"\\x1b[\";\r\nconst width = () => Math.max(40, (stdout.columns || 80) - 2);\r\nconst fit = (value: string) => value.length > width() ? `${value.slice(0, width() - 1)}…` : value;\r\n\r\nexport function selectOption<T>(title: string, options: SelectorOption<T>[], prompt = \"> \"): Promise<SelectorResult<T>> {\r\n if (!stdin.isTTY || !stdout.isTTY) return Promise.resolve({ type: \"cancelled\", input: \"\" });\r\n return new Promise((resolve) => {\r\n let input = \"\";\r\n let active = 0;\r\n let visible = true;\r\n let renderedLines = 0;\r\n let settled = false;\r\n const filtered = () => {\r\n const query = input.trim().toLowerCase();\r\n return query ? options.filter((option) => option.label.toLowerCase().includes(query) || String(option.value).toLowerCase().includes(query)) : options;\r\n };\r\n const clear = () => {\r\n if (renderedLines === 0) return;\r\n stdout.write(`${escape}${renderedLines}A`);\r\n for (let line = 0; line < renderedLines; line += 1) stdout.write(`${escape}2K${line < renderedLines - 1 ? `${escape}1B` : \"\"}`);\r\n stdout.write(`${escape}${renderedLines}A`);\r\n };\r\n const render = () => {\r\n clear();\r\n const matches = filtered();\r\n if (active >= matches.length) active = Math.max(0, matches.length - 1);\r\n const lines = [`${title}`, `${prompt}${fit(input)}`];\r\n if (visible) {\r\n if (matches.length === 0) lines.push(\" No matching commands.\");\r\n else lines.push(...matches.map((option, index) => `${index === active ? \"❯\" : \" \"} ${fit(option.label)}`));\r\n lines.push(\"↑↓ Navigate Enter Select Esc Cancel\");\r\n }\r\n stdout.write(`${lines.join(\"\\n\")}\\n`);\r\n renderedLines = lines.length;\r\n };\r\n const finish = (result: SelectorResult<T>) => {\r\n if (settled) return;\r\n settled = true;\r\n stdin.off(\"keypress\", onKeypress);\r\n clear();\r\n stdin.setRawMode?.(false);\r\n stdin.pause();\r\n stdout.write(\"\\n\");\r\n resolve(result);\r\n };\r\n const onKeypress = (value: string, key: { name?: string; ctrl?: boolean; sequence?: string }) => {\r\n if (key.ctrl && key.name === \"c\") return finish({ type: \"cancelled\", input });\r\n if (key.ctrl && key.name === \"d\") return finish({ type: \"exit\", input });\r\n if (key.name === \"escape\") {\r\n visible = false;\r\n return render();\r\n }\r\n if (key.name === \"up\" || key.name === \"down\") {\r\n const matches = filtered();\r\n if (matches.length > 0) active = key.name === \"up\" ? (active + matches.length - 1) % matches.length : (active + 1) % matches.length;\r\n visible = true;\r\n return render();\r\n }\r\n if (key.name === \"return\" || key.name === \"enter\") {\r\n const matches = filtered();\r\n const selected = matches[active];\r\n if (selected) return finish({ type: \"selected\", value: selected.value, input });\r\n return finish({ type: \"selected\", value: input as unknown as T, input });\r\n }\r\n if (key.name === \"tab\") {\r\n const matches = filtered();\r\n if (matches.length === 1) input = matches[0].value as unknown as string;\r\n else if (matches.length > 1) active = (active + 1) % matches.length;\r\n visible = true;\r\n return render();\r\n }\r\n if (key.name === \"backspace\") {\r\n input = input.slice(0, -1);\r\n visible = true;\r\n return render();\r\n }\r\n const sequence = key.sequence || value;\r\n if (/^[\\x20-\\x7e]+$/.test(sequence)) {\r\n input += sequence;\r\n active = 0;\r\n visible = true;\r\n return render();\r\n }\r\n };\r\n emitKeypressEvents(stdin);\r\n stdin.setRawMode?.(true);\r\n stdin.resume();\r\n stdin.on(\"keypress\", onKeypress);\r\n render();\r\n });\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { openBrowser } from \"../browser/open.js\";\r\nimport type { CliSession, SafeProjectInfo } from \"../types.js\";\r\nimport { selectOption } from \"../ui/selector.js\";\r\n\r\nexport async function connect(api = new ApiClient()): Promise<{ session: CliSession; project?: SafeProjectInfo }> {\r\n const session = await api.createSession();\r\n console.log(`Opening Asiyst...\\n${session.connectUrl}`);\r\n if (!(await openBrowser(session.connectUrl))) console.log(\"Automatic browser opening failed; open the URL above.\");\r\n console.log(\"● Waiting for authentication\\n● Waiting for project selection\\n● Waiting for connection\");\r\n const expires = Date.parse(session.expiresAt);\r\n for (;;) {\r\n const result = await api.sessionStatus(session.sessionId);\r\n if (result.state === \"completed\") return { session, project: result.project };\r\n if (result.state === \"expired\") throw new Error(\"Connection session expired.\");\r\n if (result.state === \"cancelled\") throw new Error(\"Connection session was cancelled.\");\r\n if (Number.isFinite(expires) && Date.now() >= expires) throw new Error(\"Connection session expired.\");\r\n await new Promise((resolve) => setTimeout(resolve, 2000));\r\n }\r\n}\r\n\r\nexport async function confirm(question: string): Promise<boolean> {\r\n if (!process.stdin.isTTY || !process.stdout.isTTY) return true;\r\n const result = await selectOption(question, [\r\n { label: \"Yes\", value: true },\r\n { label: \"No\", value: false },\r\n ]);\r\n return result.type === \"selected\" && result.value;\r\n}\r\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { join, resolve } from \"node:path\";\r\n\r\nconst trustFile = join(homedir(), \".config\", \"asiyst\", \"trusted-folders.json\");\r\n\r\nfunction readTrusted(): string[] {\r\n if (!existsSync(trustFile)) return [];\r\n try {\r\n const parsed: unknown = JSON.parse(readFileSync(trustFile, \"utf8\"));\r\n return Array.isArray(parsed) && parsed.every((item) => typeof item === \"string\") ? parsed : [];\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nexport function isTrusted(cwd: string): boolean {\r\n return readTrusted().includes(resolve(cwd));\r\n}\r\n\r\nexport function trustFolder(cwd: string): void {\r\n const folder = resolve(cwd);\r\n const trusted = readTrusted();\r\n if (!trusted.includes(folder)) trusted.push(folder);\r\n mkdirSync(join(homedir(), \".config\", \"asiyst\"), { recursive: true, mode: 0o700 });\r\n writeFileSync(trustFile, JSON.stringify(trusted, null, 2), { encoding: \"utf8\", mode: 0o600 });\r\n}\r\n\r\nexport function revokeTrust(cwd: string): void {\r\n const folder = resolve(cwd);\r\n const trusted = readTrusted().filter((item) => item !== folder);\r\n if (existsSync(trustFile)) writeFileSync(trustFile, JSON.stringify(trusted, null, 2), { encoding: \"utf8\", mode: 0o600 });\r\n}\r\n","import { isTrusted, revokeTrust, trustFolder } from \"../config/trust.js\";\r\nimport { confirm } from \"./shared.js\";\r\nexport async function ensureTrusted(cwd = process.cwd()): Promise<boolean> {\r\n if (isTrusted(cwd)) return true;\r\n if (!(await confirm(`Do you trust this project folder?\\n${cwd}\\n\\nAsiyst may read project files and modify Asiyst configuration during setup.`))) {\r\n console.log(\"Folder not trusted.\\nExiting...\");\r\n return false;\r\n }\r\n trustFolder(cwd);\r\n console.log(\"✓ Folder trusted.\");\r\n return true;\r\n}\r\nexport async function trustCommand(cwd = process.cwd()): Promise<void> { await ensureTrusted(cwd); }\r\nexport function revokeTrustCommand(cwd = process.cwd()): void { revokeTrust(cwd); console.log(\"✓ Folder trust revoked.\"); }\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { configWarning, hasConfiguration } from \"../config/local.js\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nimport { ok } from \"../ui/output.js\";\r\nimport { connect, confirm } from \"./shared.js\";\r\nimport { ensureTrusted } from \"./trust.js\";\r\n\r\nexport async function initCommand(cwd = process.cwd(), api = new ApiClient()): Promise<void> {\r\n if (!(await ensureTrusted(cwd))) return;\r\n const project = detectProject(cwd);\r\n if (!project.packageJson) throw new Error(\"No package.json found. Run this command from your website project.\");\r\n console.log(`Detected ${project.framework} project.`);\r\n if (!project.sdkVersion) {\r\n console.log(\"\\n@asiyst/sdk is not installed.\\nRun: npm install @asiyst/sdk\");\r\n return;\r\n }\r\n if (!(await confirm(\"Connect this project to Asiyst?\"))) return;\r\n const result = await connect(api);\r\n ok(\"Asiyst account connected\");\r\n ok(\"Project connected\", result.project?.projectName);\r\n if (result.project?.projectId) {\r\n console.log(`\\nProject ID: ${result.project.projectId}\\nPublic Key: ${result.project.publicKey || project.config.publicKey || \"Use the public key from the Asiyst project settings.\"}`);\r\n }\r\n const warning = configWarning(cwd);\r\n if (warning) console.log(`\\nWarning: ${warning}`);\r\n console.log(\"\\nUse the public SDK API:\\n\\nimport { Asiyst } from \\\"@asiyst/sdk\\\";\\n\\nawait Asiyst.init({ projectId: \\\"PROJECT_ID\\\", publicKey: \\\"PUBLIC_KEY\\\" });\");\r\n console.log(\"\\nRun `npx asiyst verify` after starting your website.\");\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { connect } from \"./shared.js\";\r\nexport async function loginCommand(api = new ApiClient()): Promise<void> {\r\n await connect(api);\r\n console.log(\"✓ Already connected to Asiyst.\");\r\n}\r\n","export function logoutCommand(): void {\r\n console.log(\"✓ Local CLI session information removed (the CLI does not store passwords or private credentials).\");\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nexport async function statusCommand(cwd = process.cwd(), api = new ApiClient()): Promise<void> {\r\n const project = detectProject(cwd);\r\n console.log(`Project name: ${typeof project.packageJson?.name === \"string\" ? project.packageJson.name : \"Unknown\"}\\nSDK version: ${project.sdkVersion || \"Not installed\"}`);\r\n if (!project.config.projectId) { console.log(\"Connection status: Not configured\"); return; }\r\n const info = await api.projectInfo(project.config.projectId);\r\n for (const [key, value] of Object.entries(info)) if (value !== undefined) console.log(`${key}: ${value}`);\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nimport { printVerification, ok, fail } from \"../ui/output.js\";\r\nexport async function verifyCommand(cwd = process.cwd(), api = new ApiClient()): Promise<void> {\r\n const project = detectProject(cwd);\r\n if (!project.packageJson) { fail(\"Project detected\", \"package.json is missing\"); process.exitCode = 1; return; }\r\n ok(\"Project detected\");\r\n if (!project.sdkVersion) { fail(\"SDK installed\", \"npm install @asiyst/sdk\"); process.exitCode = 1; return; }\r\n ok(\"SDK installed\", project.sdkVersion);\r\n if (!project.config.projectId || !project.config.publicKey) { fail(\"Configuration found\", \"set ASIIYST_PROJECT_ID and ASIIYST_PUBLIC_KEY\"); process.exitCode = 1; return; }\r\n ok(\"Configuration found\");\r\n try {\r\n const results = await api.verify(project.config.projectId, project.config.publicKey, process.env.ASIIYST_DOMAIN);\r\n if (!printVerification(results)) process.exitCode = 1;\r\n } catch (error) {\r\n fail(\"API reachable\", error instanceof Error ? error.message : \"verification failed\");\r\n process.exitCode = 1;\r\n }\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nimport { ok, fail } from \"../ui/output.js\";\r\nexport async function doctorCommand(cwd = process.cwd(), api = new ApiClient()): Promise<void> {\r\n const project = detectProject(cwd);\r\n ok(\"System\", process.platform);\r\n ok(\"Node.js\", process.version);\r\n ok(\"npm\", \"available through npm\");\r\n project.packageJson ? ok(\"Project\", cwd) : fail(\"Project\", \"package.json is missing\");\r\n project.sdkVersion ? ok(\"SDK\", project.sdkVersion) : fail(\"SDK\", \"not installed\");\r\n project.config.projectId && project.config.publicKey ? ok(\"Configuration\") : fail(\"Configuration\", \"public project values are missing\");\r\n try { await api.projectInfo(project.config.projectId || \"\"); ok(\"Asiyst API\"); } catch (error) { fail(\"Asiyst API\", error instanceof Error ? error.message : \"unreachable\"); }\r\n}\r\n","import { openBrowser } from \"../browser/open.js\";\r\nexport async function dashboardCommand(): Promise<void> {\r\n const configured = process.env.ASIIYST_DASHBOARD_URL || \"https://asiyst.com/dashboard\";\r\n const parsed = new URL(configured);\r\n if (parsed.protocol !== \"https:\" && !(parsed.hostname === \"localhost\" && parsed.protocol === \"http:\")) throw new Error(\"Configured dashboard URL must use HTTPS.\");\r\n const url = parsed.toString();\r\n if (!(await openBrowser(url))) console.log(`Open ${url}`);\r\n else console.log(`Opening ${url}`);\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nimport { openBrowser } from \"../browser/open.js\";\r\nexport async function avatarCommand(cwd = process.cwd(), api = new ApiClient()): Promise<void> {\r\n const project = detectProject(cwd);\r\n if (!project.config.projectId) {\r\n console.log(\"Avatar\\n─────────────────────────────\\nNo avatar configured.\\n\\nCreate your avatar in the Asiyst dashboard.\");\r\n const url = \"https://asiyst.com/dashboard/avatar\";\r\n if (await openBrowser(url)) console.log(`Opening ${url}`); else console.log(`Open ${url}`);\r\n return;\r\n }\r\n const info = await api.projectInfo(project.config.projectId);\r\n console.log(`Avatar\\n─────────────────────────────\\nStatus ${info.avatarStatus || \"Not configured\"}\\n\\nConfigure your avatar in the Asiyst dashboard.`);\r\n}\r\n","import { execFileSync } from \"node:child_process\";\r\nimport { readFileSync } from \"node:fs\";\r\nimport { readCurrentVersion } from \"../config/version.js\";\r\n\r\nconst PACKAGE_NAME = \"@asiyst/cli\";\r\nconst REGISTRY_URL = \"https://registry.npmjs.org/%40asiyst%2Fcli/latest\";\r\nconst TIMEOUT_MS = 800;\r\ntype CommandRunner = (file: string, args: string[], options: { encoding?: BufferEncoding; stdio?: \"inherit\" }) => string | Buffer | undefined;\r\nconst defaultRunner: CommandRunner = (file, args, options) => execFileSync(file, args, options);\r\n\r\nexport interface UpdateInfo {\r\n currentVersion: string;\r\n latestVersion?: string;\r\n}\r\n\r\nfunction parseVersion(value: string): { numbers: number[]; prerelease: string[] } | undefined {\r\n const match = /^[v=]?(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?$/.exec(value.trim());\r\n return match\r\n ? { numbers: [Number(match[1]), Number(match[2]), Number(match[3])], prerelease: match[4]?.split(\".\") ?? [] }\r\n : undefined;\r\n}\r\n\r\nexport function compareVersions(left: string, right: string): number {\r\n const a = parseVersion(left);\r\n const b = parseVersion(right);\r\n if (!a || !b) return 0;\r\n for (let index = 0; index < 3; index += 1) {\r\n if (a.numbers[index] !== b.numbers[index]) return a.numbers[index] > b.numbers[index] ? 1 : -1;\r\n }\r\n if (a.prerelease.length === 0 && b.prerelease.length > 0) return 1;\r\n if (a.prerelease.length > 0 && b.prerelease.length === 0) return -1;\r\n for (let index = 0; index < Math.max(a.prerelease.length, b.prerelease.length); index += 1) {\r\n const leftPart = a.prerelease[index];\r\n const rightPart = b.prerelease[index];\r\n if (leftPart === undefined) return -1;\r\n if (rightPart === undefined) return 1;\r\n if (leftPart === rightPart) continue;\r\n const leftNumber = /^\\d+$/.test(leftPart) ? Number(leftPart) : undefined;\r\n const rightNumber = /^\\d+$/.test(rightPart) ? Number(rightPart) : undefined;\r\n if (leftNumber !== undefined && rightNumber !== undefined) return leftNumber > rightNumber ? 1 : -1;\r\n if (leftNumber !== undefined) return -1;\r\n if (rightNumber !== undefined) return 1;\r\n return leftPart > rightPart ? 1 : -1;\r\n }\r\n return 0;\r\n}\r\n\r\nexport async function checkForUpdate(\r\n currentVersion = readCurrentVersion(),\r\n fetcher: typeof fetch = fetch,\r\n): Promise<UpdateInfo> {\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\r\n try {\r\n const response = await fetcher(REGISTRY_URL, { headers: { Accept: \"application/json\" }, signal: controller.signal });\r\n if (!response.ok) return { currentVersion };\r\n const body: unknown = await response.json();\r\n const latestVersion = body && typeof body === \"object\" && typeof (body as Record<string, unknown>).version === \"string\"\r\n ? (body as Record<string, string>).version\r\n : undefined;\r\n return latestVersion && parseVersion(latestVersion) ? { currentVersion, latestVersion } : { currentVersion };\r\n } catch {\r\n return { currentVersion };\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n}\r\n\r\nexport async function notifyIfUpdateAvailable(): Promise<void> {\r\n const result = await checkForUpdate();\r\n if (result.latestVersion && compareVersions(result.latestVersion, result.currentVersion) > 0) {\r\n console.log(`\\n⚠ New Asiyst CLI version available: ${result.currentVersion} → ${result.latestVersion}\\nRun \\`update\\` to install the latest version.\\n`);\r\n }\r\n}\r\n\r\nexport type InstallKind = \"npx\" | \"global\" | \"local\";\r\n\r\nexport function detectInstallKind(\r\n executablePath = process.argv[1] ?? \"\",\r\n env: NodeJS.ProcessEnv = process.env,\r\n globalRootResolver: () => string | undefined = () => {\r\n try {\r\n return execFileSync(process.platform === \"win32\" ? \"npm.cmd\" : \"npm\", [\"root\", \"--global\"], { encoding: \"utf8\" }).trim();\r\n } catch {\r\n return undefined;\r\n }\r\n },\r\n): InstallKind {\r\n if (env.npm_command === \"exec\" || /[\\\\/]_npx[\\\\/]/i.test(executablePath)) return \"npx\";\r\n const globalRoot = globalRootResolver();\r\n if (globalRoot && executablePath.toLowerCase().startsWith(`${globalRoot.toLowerCase()}\\\\`)) return \"global\";\r\n if (globalRoot && executablePath.toLowerCase().startsWith(`${globalRoot.toLowerCase()}/`)) return \"global\";\r\n return \"local\";\r\n}\r\n\r\nfunction installedVersion(packageRoot: string): string | undefined {\r\n try {\r\n const value: unknown = JSON.parse(readFileSync(`${packageRoot}/package.json`, \"utf8\"));\r\n return value && typeof value === \"object\" && typeof (value as Record<string, unknown>).version === \"string\"\r\n ? (value as Record<string, string>).version\r\n : undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nexport function installLatest(\r\n latestVersion: string,\r\n kind: InstallKind,\r\n executablePath = process.argv[1] ?? \"\",\r\n runner: CommandRunner = defaultRunner,\r\n): string | undefined {\r\n const executable = process.platform === \"win32\" ? \"npm.cmd\" : \"npm\";\r\n if (kind === \"global\") {\r\n runner(executable, [\"install\", \"--global\", `${PACKAGE_NAME}@${latestVersion}`], { stdio: \"inherit\" });\r\n const packageRoot = executablePath.replace(/[\\\\/]dist[\\\\/][^\\\\/]+$/, \"\");\r\n return installedVersion(packageRoot);\r\n }\r\n if (kind === \"npx\") {\r\n const npx = process.platform === \"win32\" ? \"npx.cmd\" : \"npx\";\r\n const output = runner(npx, [\"--yes\", `${PACKAGE_NAME}@${latestVersion}`, \"--version\"], { encoding: \"utf8\" });\r\n return typeof output === \"string\" ? output.trim().split(/\\r?\\n/).pop() : undefined;\r\n }\r\n return undefined;\r\n}\r\n","import { readFileSync } from \"node:fs\";\r\nimport { fileURLToPath } from \"node:url\";\r\n\r\nexport function readCurrentVersion(): string {\r\n for (const packageUrl of [\r\n new URL(\"../package.json\", import.meta.url),\r\n new URL(\"../../package.json\", import.meta.url),\r\n new URL(\"../../../package.json\", import.meta.url),\r\n ]) {\r\n try {\r\n const packageJson: unknown = JSON.parse(readFileSync(fileURLToPath(packageUrl), \"utf8\"));\r\n if (packageJson && typeof packageJson === \"object\" && typeof (packageJson as Record<string, unknown>).version === \"string\") {\r\n return (packageJson as Record<string, string>).version;\r\n }\r\n } catch {\r\n // Keep CLI commands available if package metadata cannot be read.\r\n }\r\n }\r\n return \"0.2.0\";\r\n}\r\n","import { checkForUpdate, compareVersions, detectInstallKind, installLatest } from \"../update/check.js\";\r\nimport { readCurrentVersion } from \"../config/version.js\";\r\nimport { confirm } from \"./shared.js\";\r\n\r\nexport async function updateCommand(): Promise<void> {\r\n const result = await checkForUpdate();\r\n if (!result.latestVersion || compareVersions(result.latestVersion, result.currentVersion) <= 0) {\r\n console.log(`✓ Asiyst CLI is already up to date.\\n\\nCurrent version: ${result.currentVersion}`);\r\n return;\r\n }\r\n console.log(`\\nUpdate available\\n\\nCurrent version: ${result.currentVersion}\\nNew version: ${result.latestVersion}\\n`);\r\n if (!process.stdin.isTTY || !(await confirm(`Update Asiyst CLI from ${result.currentVersion} to ${result.latestVersion}?`))) {\r\n console.log(\"Update cancelled.\");\r\n return;\r\n }\r\n const kind = detectInstallKind();\r\n if (kind === \"local\") {\r\n console.log(\"This CLI is installed locally. Update it through its package manager; no project files were changed.\");\r\n return;\r\n }\r\n try {\r\n console.log(\"\\nUpdating Asiyst CLI...\\n✓ Downloading and installing\");\r\n const installed = installLatest(result.latestVersion, kind);\r\n if (!installed || compareVersions(installed, result.latestVersion) !== 0) {\r\n throw new Error(\"installed version could not be verified\");\r\n }\r\n console.log(`✓ Verifying installation\\n\\nAsiyst CLI successfully updated.\\n\\nVersion: ${installed}`);\r\n } catch {\r\n console.log(\"✗ Update failed. Your current CLI is unchanged.\");\r\n }\r\n}\r\n\r\nexport function currentVersion(): string {\r\n return readCurrentVersion();\r\n}\r\n","import { detectProject } from \"../detection/project.js\";\r\nimport { homeStatus } from \"../ui/output.js\";\r\nimport { selectOption } from \"../ui/selector.js\";\r\nimport { avatarCommand } from \"./avatar.js\";\r\nimport { dashboardCommand } from \"./dashboard.js\";\r\nimport { doctorCommand } from \"./doctor.js\";\r\nimport { initCommand } from \"./init.js\";\r\nimport { logoutCommand } from \"./logout.js\";\r\nimport { statusCommand } from \"./status.js\";\r\nimport { revokeTrustCommand, trustCommand, ensureTrusted } from \"./trust.js\";\r\nimport { updateCommand } from \"./update.js\";\r\nimport { readCurrentVersion } from \"../config/version.js\";\r\n\r\nexport function resolveInput(value: string): string {\r\n const input = value.trim().toLowerCase();\r\n if (/^(connect|connect my website|connect this website|connect website|init)/.test(input)) return \"connect\";\r\n if (/^(status|check status|check .*installation)/.test(input)) return \"status\";\r\n if (/diagnos|doctor/.test(input)) return \"diagnostics\";\r\n if (/dashboard/.test(input)) return \"dashboard\";\r\n if (/avatar|configure my avatar|create avatar/.test(input)) return \"avatar\";\r\n if (/update|upgrade/.test(input)) return \"update\";\r\n if (/^(help|\\?)$/.test(input)) return \"help\";\r\n if (/^(version|--version)$/.test(input)) return \"version\";\r\n return input;\r\n}\r\n\r\nexport function interactiveHelp(): void {\r\n console.log(\"\\nASIYST CLI\\n\\nUsage: asiyst [command]\\n\\nCommands\\n connect Connect this project to Asiyst\\n status Show project and Asiyst status\\n diagnostics Run diagnostics\\n dashboard Open Asiyst dashboard\\n avatar Configure avatar\\n update Check for and install CLI updates\\n help Show available commands\\n version Show CLI version\\n trust Trust this project folder\\n revoke-trust Revoke folder trust\\n logout Remove local CLI session information\\n\\nExamples\\n asiyst connect\\n asiyst status\\n asiyst update\");\r\n}\r\n\r\nexport async function interactiveHome(): Promise<void> {\r\n if (!(await ensureTrusted())) return;\r\n homeStatus(detectProject());\r\n console.log(\"\\nWelcome to Asiyst CLI.\\nUse UP/DOWN to select a command, or type a command.\\n\");\r\n const suggestions = [\r\n { label: \"Connect this project\", value: \"connect\" },\r\n { label: \"Check project status\", value: \"status\" },\r\n { label: \"Run diagnostics\", value: \"diagnostics\" },\r\n { label: \"Open dashboard\", value: \"dashboard\" },\r\n { label: \"Configure avatar\", value: \"avatar\" },\r\n { label: \"Update CLI\", value: \"update\" },\r\n { label: \"Help\", value: \"help\" },\r\n { label: \"Exit\", value: \"exit\" },\r\n ];\r\n for (;;) {\r\n const result = await selectOption(\"What would you like to do?\", suggestions, \"› \");\r\n if (result.type === \"exit\") break;\r\n if (result.type !== \"selected\") continue;\r\n const command = resolveInput(result.input || String(result.value));\r\n if (command === \"exit\" || command === \"quit\") {\r\n const confirmed = await selectOption(\"Exit Asiyst?\", [\r\n { label: \"Yes\", value: true },\r\n { label: \"No\", value: false },\r\n ]);\r\n if (confirmed.type === \"selected\") {\r\n if (confirmed.value) break;\r\n }\r\n continue;\r\n }\r\n if (command === \"connect\") await initCommand();\r\n else if (command === \"status\") await statusCommand();\r\n else if (command === \"diagnostics\") await doctorCommand();\r\n else if (command === \"dashboard\") await dashboardCommand();\r\n else if (command === \"avatar\") await avatarCommand();\r\n else if (command === \"update\") await updateCommand();\r\n else if (command === \"logout\") logoutCommand();\r\n else if (command === \"trust\") await trustCommand();\r\n else if (command === \"revoke-trust\") revokeTrustCommand();\r\n else if (command === \"help\") interactiveHelp();\r\n else if (command === \"version\") console.log(readCurrentVersion());\r\n else console.log(`I don't recognize that command: ${result.input}\\nRun 'asiyst help' for available commands.`);\r\n }\r\n}\r\n","import { projectChecks } from \"./ui/output.js\";\r\nimport { detectProject } from \"./detection/project.js\";\r\nimport { initCommand } from \"./commands/init.js\";\r\nimport { loginCommand } from \"./commands/login.js\";\r\nimport { logoutCommand } from \"./commands/logout.js\";\r\nimport { statusCommand } from \"./commands/status.js\";\r\nimport { verifyCommand } from \"./commands/verify.js\";\r\nimport { doctorCommand } from \"./commands/doctor.js\";\r\nimport { dashboardCommand } from \"./commands/dashboard.js\";\r\nimport { avatarCommand } from \"./commands/avatar.js\";\r\nimport { revokeTrustCommand, trustCommand } from \"./commands/trust.js\";\r\nimport { interactiveHelp, interactiveHome } from \"./commands/interactive.js\";\r\nimport { readCurrentVersion } from \"./config/version.js\";\r\nimport { notifyIfUpdateAvailable } from \"./update/check.js\";\r\nimport { updateCommand } from \"./commands/update.js\";\r\nimport { fileURLToPath } from \"node:url\";\r\n\r\nexport const CLI_VERSION = readCurrentVersion();\r\nfunction help(): void { interactiveHelp(); }\r\nexport async function main(argv = process.argv.slice(2)): Promise<void> {\r\n const command = argv[0] || \"\";\r\n if (command !== \"update\" && !argv.includes(\"--version\") && !argv.includes(\"-v\") && !argv.includes(\"--help\") && !argv.includes(\"-h\")) {\r\n await notifyIfUpdateAvailable();\r\n }\r\n if (command === \"--help\" || command === \"-h\") return help();\r\n if (command === \"--version\" || command === \"-v\") return console.log(CLI_VERSION);\r\n if (command === \"init\" || command === \"connect\") return initCommand();\r\n if (command === \"login\") return loginCommand();\r\n if (command === \"logout\") return logoutCommand();\r\n if (command === \"status\") return statusCommand();\r\n if (command === \"verify\") return verifyCommand();\r\n if (command === \"doctor\") return doctorCommand();\r\n if (command === \"diagnostics\") return doctorCommand();\r\n if (command === \"dashboard\") return dashboardCommand();\r\n if (command === \"avatar\") return avatarCommand();\r\n if (command === \"trust\") return trustCommand();\r\n if (command === \"revoke-trust\") return revokeTrustCommand();\r\n if (command === \"update\") return updateCommand();\r\n if (command === \"help\") return help();\r\n if (command === \"version\") return console.log(CLI_VERSION);\r\n if (!process.stdin.isTTY) {\r\n const project = detectProject();\r\n projectChecks(project);\r\n console.log(\"\\nRun `npx asiyst init` to connect this project, or `npx asiyst --help` for commands.\");\r\n return;\r\n }\r\n return interactiveHome();\r\n}\r\nif (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {\r\n main().catch((error: unknown) => { console.error(`\\nError: ${error instanceof Error ? error.message : \"command failed\"}`); process.exitCode = 1; });\r\n}\r\n"],"mappings":"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","names":["existsSync","readFileSync","resolve","resolve","existsSync","readFileSync","resolve","resolve","existsSync","readFileSync","resolve","readFileSync","readFileSync","readFileSync","fileURLToPath"]}
|
|
1
|
+
{"version":3,"sources":["../src/ui/output.ts","../src/detection/project.ts","../src/config/api.ts","../src/api/client.ts","../src/config/local.ts","../src/browser/open.ts","../src/ui/selector.ts","../src/commands/shared.ts","../src/config/trust.ts","../src/commands/trust.ts","../src/commands/init.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/status.ts","../src/commands/verify.ts","../src/commands/doctor.ts","../src/commands/dashboard.ts","../src/commands/avatar.ts","../src/update/check.ts","../src/config/version.ts","../src/commands/update.ts","../src/commands/interactive.ts","../src/index.ts"],"sourcesContent":["import type { ProjectDetection, VerificationResult } from \"../types.js\";\n\nexport const ok = (label: string, detail = \"\") => console.log(` ✓ ${label}${detail ? ` (${detail})` : \"\"}`);\nexport const fail = (label: string, detail = \"\") => console.log(` ✗ ${label}${detail ? `: ${detail}` : \"\"}`);\n\nexport function projectChecks(project: ProjectDetection): void {\n project.packageJson\n ? ok(\"Project detected\", typeof project.packageJson.name === \"string\" ? project.packageJson.name : project.cwd)\n : fail(\"Project not detected\", \"package.json is missing\");\n ok(\"Framework detected\", project.framework);\n ok(\"Language detected\", project.language);\n ok(\"Node.js detected\", process.version);\n ok(\"Package manager detected\", project.packageManager);\n project.sdkVersion\n ? ok(\"@asiyst/sdk detected\", project.sdkVersion)\n : fail(\"@asiyst/sdk is not installed\", \"npm install @asiyst/sdk\");\n}\n\nexport function homeStatus(project: ProjectDetection, connection = \"Not connected\"): void {\n console.log(\"\\n PROJECT STATUS\");\n console.log(` Project ${typeof project.packageJson?.name === \"string\" ? project.packageJson.name : \"Not detected\"}`);\n console.log(` Framework ${project.framework}`);\n console.log(` Language ${project.language}`);\n console.log(` Node.js ${process.version}`);\n console.log(` Package Manager ${project.packageManager}`);\n console.log(` @asiyst/sdk ${project.sdkVersion || \"Not installed\"}`);\n console.log(\"\\n ASIYST STATUS\");\n console.log(` Connection ${connection}`);\n console.log(` Avatar Not configured`);\n console.log(` AI Provider Not configured`);\n console.log(` Project ID ${project.config.projectId || \"—\"}`);\n if (connection === \"Not connected\") console.log(\"\\n Run 'connect' to link this project.\");\n}\n\nexport function printVerification(results: VerificationResult[]): boolean {\n console.log(\"\\n Asiyst Installation Verification\\n\");\n for (const result of results) result.ok ? ok(result.name, result.detail) : fail(result.name, result.detail);\n const success = results.length > 0 && results.every((result) => result.ok);\n if (success) console.log(\"\\n ────────────────────────────\\n\\n ASIYST IS READY ✓\");\n return success;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\r\nimport { resolve } from \"node:path\";\r\nimport type { ProjectDetection } from \"../types.js\";\r\n\r\nfunction dependencyVersion(pkg: Record<string, unknown>): string | undefined {\r\n const sections = [\"dependencies\", \"devDependencies\", \"peerDependencies\", \"optionalDependencies\"];\r\n for (const section of sections) {\r\n const values = pkg[section];\r\n if (values && typeof values === \"object\" && \"@asiyst/sdk\" in values) {\r\n const version = (values as Record<string, unknown>)[\"@asiyst/sdk\"];\r\n return typeof version === \"string\" ? version : undefined;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function detectFramework(cwd: string, pkg: Record<string, unknown> | null): string {\r\n const deps: Record<string, unknown> = Object.assign({}, pkg?.dependencies, pkg?.devDependencies);\r\n if (typeof deps.next === \"string\") return \"Next.js\";\r\n if (typeof deps.react === \"string\") return \"React\";\r\n if (typeof deps.vite === \"string\") return \"Vite\";\r\n if (typeof deps.vue === \"string\") return \"Vue\";\r\n if (existsSync(resolve(cwd, \"vite.config.ts\")) || existsSync(resolve(cwd, \"vite.config.js\"))) return \"Vite\";\r\n if (existsSync(resolve(cwd, \"next.config.js\")) || existsSync(resolve(cwd, \"next.config.mjs\"))) return \"Next.js\";\r\n return \"Vanilla JavaScript/TypeScript\";\r\n}\r\n\r\nexport function detectProject(cwd = process.cwd()): ProjectDetection {\r\n const path = resolve(cwd, \"package.json\");\r\n let packageJson: Record<string, unknown> | null = null;\r\n if (existsSync(path)) {\r\n try {\r\n const value: unknown = JSON.parse(readFileSync(path, \"utf8\"));\r\n if (value && typeof value === \"object\" && !Array.isArray(value)) packageJson = value as Record<string, unknown>;\r\n } catch {\r\n packageJson = null;\r\n }\r\n }\r\n // Never inspect dotenv files; public project values can be supplied by the invoking environment.\r\n const env = process.env as Record<string, string | undefined>;\r\n const packageManager = existsSync(resolve(cwd, \"pnpm-lock.yaml\")) ? \"pnpm\" :\r\n existsSync(resolve(cwd, \"yarn.lock\")) ? \"yarn\" :\r\n existsSync(resolve(cwd, \"bun.lockb\")) || existsSync(resolve(cwd, \"bun.lock\")) ? \"bun\" : \"npm\";\r\n const sourceFiles = [\"tsconfig.json\", \"src\", \"app\"].some((entry) => existsSync(resolve(cwd, entry)));\r\n return {\r\n cwd,\r\n packageJson,\r\n sdkVersion: packageJson ? dependencyVersion(packageJson) : undefined,\r\n framework: detectFramework(cwd, packageJson),\r\n language: sourceFiles ? \"TypeScript\" : \"JavaScript\",\r\n packageManager,\r\n config: {\r\n projectId: env.ASIIYST_PROJECT_ID,\r\n publicKey: env.ASIIYST_PUBLIC_KEY,\r\n },\r\n };\r\n}\r\n","export const CLI_API_BASE_URL = \"https://asiyst.com/api/v1\";\r\nexport const ASIIYST_WEB_URL = \"https://asiyst.com\";\r\n","import type { CliSession, SafeProjectInfo, SessionState, VerificationResult } from \"../types.js\";\r\nimport { CLI_API_BASE_URL } from \"../config/api.js\";\r\n\r\nexport class ApiError extends Error {\r\n constructor(message: string, readonly status?: number) {\r\n super(message);\r\n this.name = \"ApiError\";\r\n }\r\n}\r\n\r\nexport class ApiClient {\r\n readonly baseUrl: string;\r\n constructor(baseUrl = process.env.ASIIYST_API_URL || CLI_API_BASE_URL, private readonly fetcher: typeof fetch = fetch) {\r\n this.baseUrl = baseUrl.replace(/\\/+$/, \"\");\r\n }\r\n\r\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\r\n let response: Response;\r\n try {\r\n response = await this.fetcher(`${this.baseUrl}${path}`, {\r\n ...init,\r\n headers: { Accept: \"application/json\", \"Content-Type\": \"application/json\", ...init?.headers },\r\n });\r\n } catch (error) {\r\n throw new ApiError(`Unable to reach Asiyst API at ${this.baseUrl}${path}. Check your internet connection, DNS, TLS/HTTPS, or whether the service is unavailable.`);\r\n }\r\n const body: unknown = await response.json().catch(() => undefined);\r\n if (!response.ok) {\r\n const detail = response.status === 401 ? \"Authentication is required.\" :\r\n response.status === 403 ? \"The request is not authorized.\" :\r\n response.status === 404 ? \"The requested resource was not found.\" :\r\n response.status === 409 ? \"The request conflicts with the current project state.\" :\r\n response.status === 429 ? \"Too many requests; try again shortly.\" :\r\n response.status >= 500 ? \"Asiyst is temporarily unavailable.\" : \"The request was rejected.\";\r\n throw new ApiError(`Asiyst API returned HTTP ${response.status}. ${detail}`, response.status);\r\n }\r\n return body as T;\r\n }\r\n\r\n health(): Promise<{ status?: string }> {\r\n return this.request(\"/health\");\r\n }\r\n\r\n createSession(): Promise<CliSession> {\r\n return this.request<unknown>(\"/cli/sessions\", { method: \"POST\", body: JSON.stringify({}) }).then((value) => {\r\n if (!value || typeof value !== \"object\") throw new ApiError(\"Asiyst returned an invalid session response\");\r\n const session = value as Record<string, unknown>;\r\n if (typeof session.sessionId !== \"string\" || typeof session.connectUrl !== \"string\" || typeof session.expiresAt !== \"string\") {\r\n throw new ApiError(\"Asiyst returned an invalid session response\");\r\n }\r\n const url = new URL(session.connectUrl);\r\n if (url.protocol !== \"https:\") {\r\n throw new ApiError(\"Asiyst returned an insecure connection URL\");\r\n }\r\n return { sessionId: session.sessionId, connectUrl: url.toString(), expiresAt: session.expiresAt };\r\n });\r\n }\r\n\r\n sessionStatus(sessionId: string): Promise<{ state: SessionState; project?: SafeProjectInfo }> {\r\n return this.request(`/cli/sessions/${encodeURIComponent(sessionId)}/status`);\r\n }\r\n\r\n projectInfo(projectId: string): Promise<SafeProjectInfo> {\r\n return this.request(`/cli/projects/${encodeURIComponent(projectId)}`);\r\n }\r\n\r\n verify(projectId: string, publicKey: string, domain?: string): Promise<VerificationResult[]> {\r\n return this.request<unknown>(\"/cli/verification\", {\r\n method: \"POST\",\r\n body: JSON.stringify({ projectId, publicKey, domain }),\r\n }).then((value) => {\r\n if (!Array.isArray(value) || !value.every((item) => item && typeof item === \"object\" && typeof (item as Record<string, unknown>).name === \"string\" && typeof (item as Record<string, unknown>).ok === \"boolean\")) {\r\n throw new ApiError(\"Asiyst returned an invalid verification response\");\r\n }\r\n return value as VerificationResult[];\r\n });\r\n }\r\n}\r\n","import { existsSync, readFileSync } from \"node:fs\";\r\nimport { resolve } from \"node:path\";\r\nimport type { ProjectDetection } from \"../types.js\";\r\n\r\nexport function hasConfiguration(project: ProjectDetection): boolean {\r\n return Boolean(project.config.projectId && project.config.publicKey);\r\n}\r\n\r\nexport function configWarning(cwd: string): string | undefined {\r\n const envPath = resolve(cwd, \".env\");\r\n if (existsSync(envPath)) {\r\n const ignored = existsSync(resolve(cwd, \".gitignore\")) &&\r\n readFileSync(resolve(cwd, \".gitignore\"), \"utf8\").split(/\\r?\\n/).some((line) => line.trim() === \".env\" || line.trim() === \".env.*\");\r\n if (!ignored) return \"Your .env file is not clearly ignored by .gitignore; do not commit public or private configuration accidentally.\";\r\n }\r\n return undefined;\r\n}\r\n","import { execFile } from \"node:child_process\";\r\nimport { promisify } from \"node:util\";\r\nconst execFileAsync = promisify(execFile);\r\n\r\nexport async function openBrowser(url: string): Promise<boolean> {\r\n const command = process.platform === \"win32\" ? \"rundll32.exe\" : process.platform === \"darwin\" ? \"open\" : \"xdg-open\";\r\n const args = process.platform === \"win32\" ? [\"url.dll,FileProtocolHandler\", url] : [url];\r\n try {\r\n await execFileAsync(command, args);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n","import { stdin, stdout } from \"node:process\";\r\nimport { emitKeypressEvents } from \"node:readline\";\r\n\r\nexport interface SelectorOption<T> {\r\n label: string;\r\n value: T;\r\n disabled?: boolean;\r\n}\r\n\r\nexport type SelectorResult<T> = { type: \"selected\"; value: T; input: string } | { type: \"cancelled\" | \"exit\"; input: string };\r\n\r\nconst escape = \"\\x1b[\";\r\nconst width = () => Math.max(40, (stdout.columns || 80) - 2);\r\nconst fit = (value: string) => value.length > width() ? `${value.slice(0, width() - 1)}…` : value;\r\n\r\nexport function selectOption<T>(title: string, options: SelectorOption<T>[], prompt = \"> \"): Promise<SelectorResult<T>> {\r\n if (!stdin.isTTY || !stdout.isTTY) return Promise.resolve({ type: \"cancelled\", input: \"\" });\r\n return new Promise((resolve) => {\r\n let input = \"\";\r\n let active = 0;\r\n let visible = true;\r\n let renderedLines = 0;\r\n let settled = false;\r\n const filtered = () => {\r\n const query = input.trim().toLowerCase();\r\n return query ? options.filter((option) => option.label.toLowerCase().includes(query) || String(option.value).toLowerCase().includes(query)) : options;\r\n };\r\n const clear = () => {\r\n if (renderedLines === 0) return;\r\n stdout.write(`${escape}${renderedLines}A`);\r\n for (let line = 0; line < renderedLines; line += 1) stdout.write(`${escape}2K${line < renderedLines - 1 ? `${escape}1B` : \"\"}`);\r\n stdout.write(`${escape}${renderedLines}A`);\r\n };\r\n const render = () => {\r\n clear();\r\n const matches = filtered();\r\n if (active >= matches.length) active = Math.max(0, matches.length - 1);\r\n const lines = [`${title}`, `${prompt}${fit(input)}`];\r\n if (visible) {\r\n if (matches.length === 0) lines.push(\" No matching commands.\");\r\n else lines.push(...matches.map((option, index) => `${index === active ? \"❯\" : \" \"} ${fit(option.label)}`));\r\n lines.push(\"↑↓ Navigate Enter Select Esc Cancel\");\r\n }\r\n stdout.write(`${lines.join(\"\\n\")}\\n`);\r\n renderedLines = lines.length;\r\n };\r\n const finish = (result: SelectorResult<T>) => {\r\n if (settled) return;\r\n settled = true;\r\n stdin.off(\"keypress\", onKeypress);\r\n clear();\r\n stdin.setRawMode?.(false);\r\n stdin.pause();\r\n stdout.write(\"\\n\");\r\n resolve(result);\r\n };\r\n const onKeypress = (value: string, key: { name?: string; ctrl?: boolean; sequence?: string }) => {\r\n if (key.ctrl && key.name === \"c\") return finish({ type: \"cancelled\", input });\r\n if (key.ctrl && key.name === \"d\") return finish({ type: \"exit\", input });\r\n if (key.name === \"escape\") {\r\n return finish({ type: \"cancelled\", input });\r\n }\r\n if (key.name === \"up\" || key.name === \"down\") {\r\n const matches = filtered();\r\n if (matches.length > 0) active = key.name === \"up\" ? (active + matches.length - 1) % matches.length : (active + 1) % matches.length;\r\n visible = true;\r\n return render();\r\n }\r\n if (key.name === \"return\" || key.name === \"enter\") {\r\n const matches = filtered();\r\n const selected = matches[active];\r\n if (selected) return finish({ type: \"selected\", value: selected.value, input });\r\n return finish({ type: \"cancelled\", input });\r\n }\r\n if (key.name === \"tab\") {\r\n const matches = filtered();\r\n if (matches.length === 1) input = matches[0].value as unknown as string;\r\n else if (matches.length > 1) active = (active + 1) % matches.length;\r\n visible = true;\r\n return render();\r\n }\r\n if (key.name === \"backspace\") {\r\n input = input.slice(0, -1);\r\n visible = true;\r\n return render();\r\n }\r\n const sequence = key.sequence || value;\r\n if (/^[\\x20-\\x7e]+$/.test(sequence)) {\r\n input += sequence;\r\n active = 0;\r\n visible = true;\r\n return render();\r\n }\r\n };\r\n emitKeypressEvents(stdin);\r\n stdin.setRawMode?.(true);\r\n stdin.resume();\r\n stdin.on(\"keypress\", onKeypress);\r\n render();\r\n });\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { openBrowser } from \"../browser/open.js\";\r\nimport type { CliSession, SafeProjectInfo } from \"../types.js\";\r\nimport { selectOption } from \"../ui/selector.js\";\r\n\r\nexport async function connect(api = new ApiClient()): Promise<{ session: CliSession; project?: SafeProjectInfo }> {\r\n const session = await api.createSession();\r\n console.log(`Opening Asiyst...\\n${session.connectUrl}`);\r\n if (!(await openBrowser(session.connectUrl))) console.log(\"Automatic browser opening failed; open the URL above.\");\r\n console.log(\"● Waiting for authentication\\n● Waiting for project selection\\n● Waiting for connection\");\r\n const expires = Date.parse(session.expiresAt);\r\n for (;;) {\r\n const result = await api.sessionStatus(session.sessionId);\r\n if (result.state === \"completed\") return { session, project: result.project };\r\n if (result.state === \"expired\") throw new Error(\"Connection session expired.\");\r\n if (result.state === \"cancelled\") throw new Error(\"Connection session was cancelled.\");\r\n if (Number.isFinite(expires) && Date.now() >= expires) throw new Error(\"Connection session expired.\");\r\n await new Promise((resolve) => setTimeout(resolve, 2000));\r\n }\r\n}\r\n\r\nexport async function confirm(question: string): Promise<boolean> {\r\n if (!process.stdin.isTTY || !process.stdout.isTTY) return true;\r\n const result = await selectOption(question, [\r\n { label: \"Yes\", value: true },\r\n { label: \"No\", value: false },\r\n ]);\r\n return result.type === \"selected\" && result.value;\r\n}\r\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { join, resolve } from \"node:path\";\r\n\r\nconst trustFile = join(homedir(), \".config\", \"asiyst\", \"trusted-folders.json\");\r\n\r\nfunction readTrusted(): string[] {\r\n if (!existsSync(trustFile)) return [];\r\n try {\r\n const parsed: unknown = JSON.parse(readFileSync(trustFile, \"utf8\"));\r\n return Array.isArray(parsed) && parsed.every((item) => typeof item === \"string\") ? parsed : [];\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nexport function isTrusted(cwd: string): boolean {\r\n return readTrusted().includes(resolve(cwd));\r\n}\r\n\r\nexport function trustFolder(cwd: string): void {\r\n const folder = resolve(cwd);\r\n const trusted = readTrusted();\r\n if (!trusted.includes(folder)) trusted.push(folder);\r\n mkdirSync(join(homedir(), \".config\", \"asiyst\"), { recursive: true, mode: 0o700 });\r\n writeFileSync(trustFile, JSON.stringify(trusted, null, 2), { encoding: \"utf8\", mode: 0o600 });\r\n}\r\n\r\nexport function revokeTrust(cwd: string): void {\r\n const folder = resolve(cwd);\r\n const trusted = readTrusted().filter((item) => item !== folder);\r\n if (existsSync(trustFile)) writeFileSync(trustFile, JSON.stringify(trusted, null, 2), { encoding: \"utf8\", mode: 0o600 });\r\n}\r\n","import { isTrusted, revokeTrust, trustFolder } from \"../config/trust.js\";\r\nimport { confirm } from \"./shared.js\";\r\nexport async function ensureTrusted(cwd = process.cwd()): Promise<boolean> {\r\n if (isTrusted(cwd)) return true;\r\n if (!(await confirm(`Trust this project folder?\\n\\n${cwd}\\n\\nAsiyst may read project files and modify Asiyst configuration during setup.`))) {\r\n console.log(\"Folder not trusted.\\nExiting...\");\r\n return false;\r\n }\r\n trustFolder(cwd);\r\n console.log(\"✓ Folder trusted.\");\r\n return true;\r\n}\r\nexport async function trustCommand(cwd = process.cwd()): Promise<void> { await ensureTrusted(cwd); }\r\nexport function revokeTrustCommand(cwd = process.cwd()): void { revokeTrust(cwd); console.log(\"✓ Folder trust revoked.\"); }\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { configWarning, hasConfiguration } from \"../config/local.js\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nimport { ok } from \"../ui/output.js\";\r\nimport { connect, confirm } from \"./shared.js\";\r\nimport { ensureTrusted } from \"./trust.js\";\r\n\r\nexport async function initCommand(cwd = process.cwd(), api = new ApiClient()): Promise<void> {\r\n if (!(await ensureTrusted(cwd))) return;\r\n const project = detectProject(cwd);\r\n if (!project.packageJson) throw new Error(\"No package.json found. Run this command from your website project.\");\r\n console.log(`Detected ${project.framework} project.`);\r\n if (!project.sdkVersion) {\r\n console.log(\"\\n@asiyst/sdk is not installed.\\nRun: npm install @asiyst/sdk\");\r\n return;\r\n }\r\n if (!(await confirm(\"Connect this project to Asiyst?\"))) return;\r\n const result = await connect(api);\r\n ok(\"Asiyst account connected\");\r\n ok(\"Project connected\", result.project?.projectName);\r\n if (result.project?.projectId) {\r\n console.log(`\\nProject ID: ${result.project.projectId}\\nPublic Key: ${result.project.publicKey || project.config.publicKey || \"Use the public key from the Asiyst project settings.\"}`);\r\n }\r\n const warning = configWarning(cwd);\r\n if (warning) console.log(`\\nWarning: ${warning}`);\r\n console.log(\"\\nUse the public SDK API:\\n\\nimport { Asiyst } from \\\"@asiyst/sdk\\\";\\n\\nawait Asiyst.init({ projectId: \\\"PROJECT_ID\\\", publicKey: \\\"PUBLIC_KEY\\\" });\");\r\n console.log(\"\\nRun `npx asiyst verify` after starting your website.\");\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { connect } from \"./shared.js\";\r\nexport async function loginCommand(api = new ApiClient()): Promise<void> {\r\n await connect(api);\r\n console.log(\"✓ Already connected to Asiyst.\");\r\n}\r\n","export function logoutCommand(): void {\r\n console.log(\"✓ Local CLI session information removed (the CLI does not store passwords or private credentials).\");\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nexport async function statusCommand(cwd = process.cwd(), api = new ApiClient()): Promise<void> {\r\n const project = detectProject(cwd);\r\n console.log(`Project: ${typeof project.packageJson?.name === \"string\" ? project.packageJson.name : \"Unknown\"}\\nSDK: ${project.sdkVersion || \"Not connected\"}`);\r\n if (!project.config.projectId || !project.config.publicKey) {\r\n console.log(\"\\nProject: Not connected\\nSDK: Not connected\\nAvatar: Not configured\\n\\nStatistics:\\nConnect your website to show stats.\");\r\n return;\r\n }\r\n const info = await api.projectInfo(project.config.projectId);\r\n console.log(`\\nProject: ${info.connectionStatus || \"Connected\"}\\nSDK: ${project.sdkVersion}\\nAvatar: ${info.avatarStatus || \"Not configured\"}`);\r\n console.log(\"\\nStatistics:\");\r\n console.log(info.lastSdkConnection ? `Last SDK heartbeat: ${info.lastSdkConnection}` : \"No SDK heartbeat recorded.\");\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nimport { printVerification, ok, fail } from \"../ui/output.js\";\r\nexport async function verifyCommand(cwd = process.cwd(), api = new ApiClient()): Promise<void> {\r\n const project = detectProject(cwd);\r\n if (!project.packageJson) { fail(\"Project detected\", \"package.json is missing\"); process.exitCode = 1; return; }\r\n ok(\"Project detected\");\r\n if (!project.sdkVersion) { fail(\"SDK installed\", \"npm install @asiyst/sdk\"); process.exitCode = 1; return; }\r\n ok(\"SDK installed\", project.sdkVersion);\r\n if (!project.config.projectId || !project.config.publicKey) { fail(\"Configuration found\", \"set ASIIYST_PROJECT_ID and ASIIYST_PUBLIC_KEY\"); process.exitCode = 1; return; }\r\n ok(\"Configuration found\");\r\n try {\r\n const results = await api.verify(project.config.projectId, project.config.publicKey, process.env.ASIIYST_DOMAIN);\r\n if (!printVerification(results)) process.exitCode = 1;\r\n } catch (error) {\r\n fail(\"API reachable\", error instanceof Error ? error.message : \"verification failed\");\r\n process.exitCode = 1;\r\n }\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nimport { ok, fail } from \"../ui/output.js\";\r\nexport async function doctorCommand(cwd = process.cwd(), api = new ApiClient()): Promise<void> {\r\n const project = detectProject(cwd);\r\n ok(\"System\", process.platform);\r\n ok(\"Node.js\", process.version);\r\n ok(\"npm\", \"available through npm\");\r\n project.packageJson ? ok(\"Project\", cwd) : fail(\"Project\", \"package.json is missing\");\r\n project.sdkVersion ? ok(\"SDK\", project.sdkVersion) : fail(\"SDK\", \"not installed\");\r\n project.config.projectId && project.config.publicKey ? ok(\"Configuration\") : fail(\"Configuration\", \"public project values are missing\");\r\n try { await api.health(); ok(\"Asiyst API\", \"HTTPS health endpoint reachable\"); }\r\n catch (error) { fail(\"Asiyst API\", error instanceof Error ? error.message : \"unreachable\"); }\r\n if (project.config.projectId && project.config.publicKey) {\r\n try { await api.projectInfo(project.config.projectId); ok(\"Project connection\"); }\r\n catch (error) { fail(\"Project connection\", error instanceof Error ? error.message : \"unavailable\"); }\r\n }\r\n}\r\n","import { openBrowser } from \"../browser/open.js\";\r\nimport { ASIIYST_WEB_URL } from \"../config/api.js\";\r\nexport async function dashboardCommand(): Promise<void> {\r\n const configured = process.env.ASIIYST_DASHBOARD_URL || ASIIYST_WEB_URL;\r\n const parsed = new URL(configured);\r\n if (parsed.protocol !== \"https:\") throw new Error(\"Configured dashboard URL must use HTTPS.\");\r\n const url = parsed.toString();\r\n if (!(await openBrowser(url))) console.log(`Open ${url}`);\r\n else console.log(`Opening ${url}`);\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nimport { openBrowser } from \"../browser/open.js\";\r\nimport { ASIIYST_WEB_URL } from \"../config/api.js\";\r\nexport async function avatarCommand(cwd = process.cwd(), api = new ApiClient()): Promise<void> {\r\n const project = detectProject(cwd);\r\n if (!project.config.projectId) {\r\n console.log(\"Avatar\\n─────────────────────────────\\nNo avatar configured.\\n\\nCreate your avatar in the Asiyst dashboard.\");\r\n const url = ASIIYST_WEB_URL;\r\n if (await openBrowser(url)) console.log(`Opening ${url}`); else console.log(`Open ${url}`);\r\n return;\r\n }\r\n const info = await api.projectInfo(project.config.projectId);\r\n console.log(`Avatar\\n─────────────────────────────\\nStatus ${info.avatarStatus || \"Not configured\"}\\n\\nConfigure your avatar in the Asiyst dashboard.`);\r\n}\r\n","import { execFileSync } from \"node:child_process\";\r\nimport { readFileSync } from \"node:fs\";\r\nimport { readCurrentVersion } from \"../config/version.js\";\r\n\r\nconst PACKAGE_NAME = \"@asiyst/cli\";\r\nconst REGISTRY_URL = \"https://registry.npmjs.org/%40asiyst%2Fcli/latest\";\r\nconst TIMEOUT_MS = 800;\r\ntype CommandRunner = (file: string, args: string[], options: { encoding?: BufferEncoding; stdio?: \"inherit\" }) => string | Buffer | undefined;\r\nconst defaultRunner: CommandRunner = (file, args, options) => execFileSync(file, args, options);\r\n\r\nexport interface UpdateInfo {\r\n currentVersion: string;\r\n latestVersion?: string;\r\n}\r\n\r\nfunction parseVersion(value: string): { numbers: number[]; prerelease: string[] } | undefined {\r\n const match = /^[v=]?(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?$/.exec(value.trim());\r\n return match\r\n ? { numbers: [Number(match[1]), Number(match[2]), Number(match[3])], prerelease: match[4]?.split(\".\") ?? [] }\r\n : undefined;\r\n}\r\n\r\nexport function compareVersions(left: string, right: string): number {\r\n const a = parseVersion(left);\r\n const b = parseVersion(right);\r\n if (!a || !b) return 0;\r\n for (let index = 0; index < 3; index += 1) {\r\n if (a.numbers[index] !== b.numbers[index]) return a.numbers[index] > b.numbers[index] ? 1 : -1;\r\n }\r\n if (a.prerelease.length === 0 && b.prerelease.length > 0) return 1;\r\n if (a.prerelease.length > 0 && b.prerelease.length === 0) return -1;\r\n for (let index = 0; index < Math.max(a.prerelease.length, b.prerelease.length); index += 1) {\r\n const leftPart = a.prerelease[index];\r\n const rightPart = b.prerelease[index];\r\n if (leftPart === undefined) return -1;\r\n if (rightPart === undefined) return 1;\r\n if (leftPart === rightPart) continue;\r\n const leftNumber = /^\\d+$/.test(leftPart) ? Number(leftPart) : undefined;\r\n const rightNumber = /^\\d+$/.test(rightPart) ? Number(rightPart) : undefined;\r\n if (leftNumber !== undefined && rightNumber !== undefined) return leftNumber > rightNumber ? 1 : -1;\r\n if (leftNumber !== undefined) return -1;\r\n if (rightNumber !== undefined) return 1;\r\n return leftPart > rightPart ? 1 : -1;\r\n }\r\n return 0;\r\n}\r\n\r\nexport async function checkForUpdate(\r\n currentVersion = readCurrentVersion(),\r\n fetcher: typeof fetch = fetch,\r\n): Promise<UpdateInfo> {\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\r\n try {\r\n const response = await fetcher(REGISTRY_URL, { headers: { Accept: \"application/json\" }, signal: controller.signal });\r\n if (!response.ok) return { currentVersion };\r\n const body: unknown = await response.json();\r\n const latestVersion = body && typeof body === \"object\" && typeof (body as Record<string, unknown>).version === \"string\"\r\n ? (body as Record<string, string>).version\r\n : undefined;\r\n return latestVersion && parseVersion(latestVersion) ? { currentVersion, latestVersion } : { currentVersion };\r\n } catch {\r\n return { currentVersion };\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n}\r\n\r\nexport async function notifyIfUpdateAvailable(): Promise<void> {\r\n const result = await checkForUpdate();\r\n if (result.latestVersion && compareVersions(result.latestVersion, result.currentVersion) > 0) {\r\n console.log(`\\n⚠ New Asiyst CLI version available: ${result.currentVersion} → ${result.latestVersion}\\nRun \\`update\\` to install the latest version.\\n`);\r\n }\r\n}\r\n\r\nexport type InstallKind = \"npx\" | \"global\" | \"local\";\r\n\r\nexport function detectInstallKind(\r\n executablePath = process.argv[1] ?? \"\",\r\n env: NodeJS.ProcessEnv = process.env,\r\n globalRootResolver: () => string | undefined = () => {\r\n try {\r\n return execFileSync(process.platform === \"win32\" ? \"npm.cmd\" : \"npm\", [\"root\", \"--global\"], { encoding: \"utf8\" }).trim();\r\n } catch {\r\n return undefined;\r\n }\r\n },\r\n): InstallKind {\r\n if (env.npm_command === \"exec\" || /[\\\\/]_npx[\\\\/]/i.test(executablePath)) return \"npx\";\r\n const globalRoot = globalRootResolver();\r\n if (globalRoot && executablePath.toLowerCase().startsWith(`${globalRoot.toLowerCase()}\\\\`)) return \"global\";\r\n if (globalRoot && executablePath.toLowerCase().startsWith(`${globalRoot.toLowerCase()}/`)) return \"global\";\r\n return \"local\";\r\n}\r\n\r\nfunction installedVersion(packageRoot: string): string | undefined {\r\n try {\r\n const value: unknown = JSON.parse(readFileSync(`${packageRoot}/package.json`, \"utf8\"));\r\n return value && typeof value === \"object\" && typeof (value as Record<string, unknown>).version === \"string\"\r\n ? (value as Record<string, string>).version\r\n : undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nexport function installLatest(\r\n latestVersion: string,\r\n kind: InstallKind,\r\n executablePath = process.argv[1] ?? \"\",\r\n runner: CommandRunner = defaultRunner,\r\n): string | undefined {\r\n const executable = process.platform === \"win32\" ? \"npm.cmd\" : \"npm\";\r\n if (kind === \"global\") {\r\n runner(executable, [\"install\", \"--global\", `${PACKAGE_NAME}@${latestVersion}`], { stdio: \"inherit\" });\r\n const packageRoot = executablePath.replace(/[\\\\/]dist[\\\\/][^\\\\/]+$/, \"\");\r\n return installedVersion(packageRoot);\r\n }\r\n if (kind === \"npx\") {\r\n const npx = process.platform === \"win32\" ? \"npx.cmd\" : \"npx\";\r\n const output = runner(npx, [\"--yes\", `${PACKAGE_NAME}@${latestVersion}`, \"--version\"], { encoding: \"utf8\" });\r\n return typeof output === \"string\" ? output.trim().split(/\\r?\\n/).pop() : undefined;\r\n }\r\n return undefined;\r\n}\r\n","import { readFileSync } from \"node:fs\";\r\nimport { fileURLToPath } from \"node:url\";\r\n\r\nexport function readCurrentVersion(): string {\r\n for (const packageUrl of [\r\n new URL(\"../package.json\", import.meta.url),\r\n new URL(\"../../package.json\", import.meta.url),\r\n new URL(\"../../../package.json\", import.meta.url),\r\n ]) {\r\n try {\r\n const packageJson: unknown = JSON.parse(readFileSync(fileURLToPath(packageUrl), \"utf8\"));\r\n if (packageJson && typeof packageJson === \"object\" && typeof (packageJson as Record<string, unknown>).version === \"string\") {\r\n return (packageJson as Record<string, string>).version;\r\n }\r\n } catch {\r\n // Keep CLI commands available if package metadata cannot be read.\r\n }\r\n }\r\n return \"0.2.0\";\r\n}\r\n","import { checkForUpdate, compareVersions, detectInstallKind, installLatest } from \"../update/check.js\";\r\nimport { readCurrentVersion } from \"../config/version.js\";\r\nimport { confirm } from \"./shared.js\";\r\n\r\nexport async function updateCommand(): Promise<void> {\r\n const result = await checkForUpdate();\r\n if (!result.latestVersion || compareVersions(result.latestVersion, result.currentVersion) <= 0) {\r\n console.log(`✓ Asiyst CLI is already up to date.\\n\\nCurrent version: ${result.currentVersion}`);\r\n return;\r\n }\r\n console.log(`\\nUpdate available\\n\\nCurrent version: ${result.currentVersion}\\nNew version: ${result.latestVersion}\\n`);\r\n if (!process.stdin.isTTY || !(await confirm(`Update Asiyst CLI from ${result.currentVersion} to ${result.latestVersion}?`))) {\r\n console.log(\"Update cancelled.\");\r\n return;\r\n }\r\n const kind = detectInstallKind();\r\n if (kind === \"local\") {\r\n console.log(\"This CLI is installed locally. Update it through its package manager; no project files were changed.\");\r\n return;\r\n }\r\n try {\r\n console.log(\"\\nUpdating Asiyst CLI...\\n✓ Downloading and installing\");\r\n const installed = installLatest(result.latestVersion, kind);\r\n if (!installed || compareVersions(installed, result.latestVersion) !== 0) {\r\n throw new Error(\"installed version could not be verified\");\r\n }\r\n console.log(`✓ Verifying installation\\n\\nAsiyst CLI successfully updated.\\n\\nVersion: ${installed}`);\r\n } catch {\r\n console.log(\"✗ Update failed. Your current CLI is unchanged.\");\r\n }\r\n}\r\n\r\nexport function currentVersion(): string {\r\n return readCurrentVersion();\r\n}\r\n","import { detectProject } from \"../detection/project.js\";\r\nimport { homeStatus } from \"../ui/output.js\";\r\nimport { selectOption } from \"../ui/selector.js\";\r\nimport { avatarCommand } from \"./avatar.js\";\r\nimport { dashboardCommand } from \"./dashboard.js\";\r\nimport { doctorCommand } from \"./doctor.js\";\r\nimport { initCommand } from \"./init.js\";\r\nimport { logoutCommand } from \"./logout.js\";\r\nimport { statusCommand } from \"./status.js\";\r\nimport { revokeTrustCommand, trustCommand, ensureTrusted } from \"./trust.js\";\r\nimport { updateCommand } from \"./update.js\";\r\nimport { readCurrentVersion } from \"../config/version.js\";\r\n\r\nexport function resolveInput(value: string): string {\r\n const input = value.trim().toLowerCase();\r\n if (/^(connect|connect my website|connect this website|connect website|init)/.test(input)) return \"connect\";\r\n if (/^(status|check status|check .*installation)/.test(input)) return \"status\";\r\n if (/diagnos|doctor/.test(input)) return \"diagnostics\";\r\n if (/dashboard/.test(input)) return \"dashboard\";\r\n if (/avatar|configure my avatar|create avatar/.test(input)) return \"avatar\";\r\n if (/update|upgrade/.test(input)) return \"update\";\r\n if (/^(help|\\?)$/.test(input)) return \"help\";\r\n if (/^(version|--version)$/.test(input)) return \"version\";\r\n return input;\r\n}\r\n\r\nexport function interactiveHelp(): void {\r\n console.log(\"\\nASIYST CLI\\n\\nUsage: asiyst [command]\\n\\nCommands\\n connect Connect this project to Asiyst\\n status Show project and Asiyst status\\n diagnostics Run diagnostics\\n dashboard Open Asiyst dashboard\\n avatar Configure avatar\\n update Check for and install CLI updates\\n help Show available commands\\n version Show CLI version\\n trust Trust this project folder\\n revoke-trust Revoke folder trust\\n logout Remove local CLI session information\\n\\nExamples\\n asiyst connect\\n asiyst status\\n asiyst update\");\r\n}\r\n\r\nexport async function interactiveHome(): Promise<void> {\r\n if (!(await ensureTrusted())) return;\r\n homeStatus(detectProject());\r\n console.log(\"\\nWelcome to Asiyst CLI.\\nUse UP/DOWN to select a command, or type a command.\\n\");\r\n const suggestions = [\r\n { label: \"Connect this project\", value: \"connect\" },\r\n { label: \"Check project status\", value: \"status\" },\r\n { label: \"Run diagnostics\", value: \"diagnostics\" },\r\n { label: \"Open dashboard\", value: \"dashboard\" },\r\n { label: \"Configure avatar\", value: \"avatar\" },\r\n { label: \"Update CLI\", value: \"update\" },\r\n { label: \"Help\", value: \"help\" },\r\n { label: \"Exit\", value: \"exit\" },\r\n ];\r\n for (;;) {\r\n const result = await selectOption(\"What would you like to do?\", suggestions, \"› \");\r\n if (result.type === \"exit\") break;\r\n if (result.type !== \"selected\") continue;\r\n const command = resolveInput(result.input || String(result.value));\r\n if (command === \"exit\" || command === \"quit\") {\r\n const confirmed = await selectOption(\"Exit Asiyst?\", [\r\n { label: \"Yes\", value: true },\r\n { label: \"No\", value: false },\r\n ]);\r\n if (confirmed.type === \"selected\") {\r\n if (confirmed.value) break;\r\n }\r\n continue;\r\n }\r\n if (command === \"connect\") await initCommand();\r\n else if (command === \"status\") await statusCommand();\r\n else if (command === \"diagnostics\") await doctorCommand();\r\n else if (command === \"dashboard\") await dashboardCommand();\r\n else if (command === \"avatar\") await avatarCommand();\r\n else if (command === \"update\") await updateCommand();\r\n else if (command === \"logout\") logoutCommand();\r\n else if (command === \"trust\") await trustCommand();\r\n else if (command === \"revoke-trust\") revokeTrustCommand();\r\n else if (command === \"help\") interactiveHelp();\r\n else if (command === \"version\") console.log(readCurrentVersion());\r\n else console.log(`I don't recognize that command: ${result.input}\\nRun 'asiyst help' for available commands.`);\r\n }\r\n}\r\n","import { projectChecks } from \"./ui/output.js\";\r\nimport { detectProject } from \"./detection/project.js\";\r\nimport { initCommand } from \"./commands/init.js\";\r\nimport { loginCommand } from \"./commands/login.js\";\r\nimport { logoutCommand } from \"./commands/logout.js\";\r\nimport { statusCommand } from \"./commands/status.js\";\r\nimport { verifyCommand } from \"./commands/verify.js\";\r\nimport { doctorCommand } from \"./commands/doctor.js\";\r\nimport { dashboardCommand } from \"./commands/dashboard.js\";\r\nimport { avatarCommand } from \"./commands/avatar.js\";\r\nimport { revokeTrustCommand, trustCommand } from \"./commands/trust.js\";\r\nimport { interactiveHelp, interactiveHome } from \"./commands/interactive.js\";\r\nimport { readCurrentVersion } from \"./config/version.js\";\r\nimport { notifyIfUpdateAvailable } from \"./update/check.js\";\r\nimport { updateCommand } from \"./commands/update.js\";\r\nimport { fileURLToPath } from \"node:url\";\r\n\r\nexport const CLI_VERSION = readCurrentVersion();\r\nfunction help(): void { interactiveHelp(); }\r\nexport async function main(argv = process.argv.slice(2)): Promise<void> {\r\n const command = argv[0] || \"\";\r\n if (command !== \"update\" && !argv.includes(\"--version\") && !argv.includes(\"-v\") && !argv.includes(\"--help\") && !argv.includes(\"-h\")) {\r\n await notifyIfUpdateAvailable();\r\n }\r\n if (command === \"--help\" || command === \"-h\") return help();\r\n if (command === \"--version\" || command === \"-v\") return console.log(CLI_VERSION);\r\n if (command === \"init\" || command === \"connect\") return initCommand();\r\n if (command === \"login\") return loginCommand();\r\n if (command === \"logout\") return logoutCommand();\r\n if (command === \"status\") return statusCommand();\r\n if (command === \"verify\") return verifyCommand();\r\n if (command === \"doctor\") return doctorCommand();\r\n if (command === \"diagnostics\") return doctorCommand();\r\n if (command === \"dashboard\") return dashboardCommand();\r\n if (command === \"avatar\") return avatarCommand();\r\n if (command === \"trust\") return trustCommand();\r\n if (command === \"revoke-trust\") return revokeTrustCommand();\r\n if (command === \"update\") return updateCommand();\r\n if (command === \"help\") return help();\r\n if (command === \"version\") return console.log(CLI_VERSION);\r\n if (!process.stdin.isTTY) {\r\n const project = detectProject();\r\n projectChecks(project);\r\n console.log(\"\\nRun `npx asiyst init` to connect this project, or `npx asiyst --help` for commands.\");\r\n return;\r\n }\r\n return interactiveHome();\r\n}\r\nif (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {\r\n main().catch((error: unknown) => { console.error(`\\nError: ${error instanceof Error ? error.message : \"command failed\"}`); process.exitCode = 1; });\r\n}\r\n"],"mappings":";;;AAEO,IAAM,KAAK,CAAC,OAAe,SAAS,OAAO,QAAQ,IAAI,YAAO,KAAK,GAAG,SAAS,KAAK,MAAM,MAAM,EAAE,EAAE;AACpG,IAAM,OAAO,CAAC,OAAe,SAAS,OAAO,QAAQ,IAAI,YAAO,KAAK,GAAG,SAAS,KAAK,MAAM,KAAK,EAAE,EAAE;AAErG,SAAS,cAAc,SAAiC;AAC7D,UAAQ,cACJ,GAAG,oBAAoB,OAAO,QAAQ,YAAY,SAAS,WAAW,QAAQ,YAAY,OAAO,QAAQ,GAAG,IAC5G,KAAK,wBAAwB,yBAAyB;AAC1D,KAAG,sBAAsB,QAAQ,SAAS;AAC1C,KAAG,qBAAqB,QAAQ,QAAQ;AACxC,KAAG,oBAAoB,QAAQ,OAAO;AACtC,KAAG,4BAA4B,QAAQ,cAAc;AACrD,UAAQ,aACJ,GAAG,wBAAwB,QAAQ,UAAU,IAC7C,KAAK,gCAAgC,yBAAyB;AACpE;AAEO,SAAS,WAAW,SAA2B,aAAa,iBAAuB;AACxF,UAAQ,IAAI,oBAAoB;AAChC,UAAQ,IAAI,wBAAwB,OAAO,QAAQ,aAAa,SAAS,WAAW,QAAQ,YAAY,OAAO,cAAc,EAAE;AAC/H,UAAQ,IAAI,wBAAwB,QAAQ,SAAS,EAAE;AACvD,UAAQ,IAAI,wBAAwB,QAAQ,QAAQ,EAAE;AACtD,UAAQ,IAAI,wBAAwB,QAAQ,OAAO,EAAE;AACrD,UAAQ,IAAI,wBAAwB,QAAQ,cAAc,EAAE;AAC5D,UAAQ,IAAI,wBAAwB,QAAQ,cAAc,eAAe,EAAE;AAC3E,UAAQ,IAAI,mBAAmB;AAC/B,UAAQ,IAAI,wBAAwB,UAAU,EAAE;AAChD,UAAQ,IAAI,qCAAqC;AACjD,UAAQ,IAAI,qCAAqC;AACjD,UAAQ,IAAI,wBAAwB,QAAQ,OAAO,aAAa,QAAG,EAAE;AACrE,MAAI,eAAe,gBAAiB,SAAQ,IAAI,yCAAyC;AAC3F;AAEO,SAAS,kBAAkB,SAAwC;AACxE,UAAQ,IAAI,wCAAwC;AACpD,aAAW,UAAU,QAAS,QAAO,KAAK,GAAG,OAAO,MAAM,OAAO,MAAM,IAAI,KAAK,OAAO,MAAM,OAAO,MAAM;AAC1G,QAAM,UAAU,QAAQ,SAAS,KAAK,QAAQ,MAAM,CAAC,WAAW,OAAO,EAAE;AACzE,MAAI,QAAS,SAAQ,IAAI,0MAAyD;AAClF,SAAO;AACT;;;ACxCA,SAAS,YAAY,oBAAoB;AACzC,SAAS,eAAe;AAGxB,SAAS,kBAAkB,KAAkD;AAC3E,QAAM,WAAW,CAAC,gBAAgB,mBAAmB,oBAAoB,sBAAsB;AAC/F,aAAW,WAAW,UAAU;AAC9B,UAAM,SAAS,IAAI,OAAO;AAC1B,QAAI,UAAU,OAAO,WAAW,YAAY,iBAAiB,QAAQ;AACnE,YAAM,UAAW,OAAmC,aAAa;AACjE,aAAO,OAAO,YAAY,WAAW,UAAU;AAAA,IACjD;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,KAAa,KAA6C;AACxF,QAAM,OAAgC,OAAO,OAAO,CAAC,GAAG,KAAK,cAAc,KAAK,eAAe;AAC/F,MAAI,OAAO,KAAK,SAAS,SAAU,QAAO;AAC1C,MAAI,OAAO,KAAK,UAAU,SAAU,QAAO;AAC3C,MAAI,OAAO,KAAK,SAAS,SAAU,QAAO;AAC1C,MAAI,OAAO,KAAK,QAAQ,SAAU,QAAO;AACzC,MAAI,WAAW,QAAQ,KAAK,gBAAgB,CAAC,KAAK,WAAW,QAAQ,KAAK,gBAAgB,CAAC,EAAG,QAAO;AACrG,MAAI,WAAW,QAAQ,KAAK,gBAAgB,CAAC,KAAK,WAAW,QAAQ,KAAK,iBAAiB,CAAC,EAAG,QAAO;AACtG,SAAO;AACT;AAEO,SAAS,cAAc,MAAM,QAAQ,IAAI,GAAqB;AACnE,QAAM,OAAO,QAAQ,KAAK,cAAc;AACxC,MAAI,cAA8C;AAClD,MAAI,WAAW,IAAI,GAAG;AACpB,QAAI;AACF,YAAM,QAAiB,KAAK,MAAM,aAAa,MAAM,MAAM,CAAC;AAC5D,UAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,EAAG,eAAc;AAAA,IACjF,QAAQ;AACN,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,MAAM,QAAQ;AACpB,QAAM,iBAAiB,WAAW,QAAQ,KAAK,gBAAgB,CAAC,IAAI,SAClE,WAAW,QAAQ,KAAK,WAAW,CAAC,IAAI,SACtC,WAAW,QAAQ,KAAK,WAAW,CAAC,KAAK,WAAW,QAAQ,KAAK,UAAU,CAAC,IAAI,QAAQ;AAC5F,QAAM,cAAc,CAAC,iBAAiB,OAAO,KAAK,EAAE,KAAK,CAAC,UAAU,WAAW,QAAQ,KAAK,KAAK,CAAC,CAAC;AACnG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,cAAc,kBAAkB,WAAW,IAAI;AAAA,IAC3D,WAAW,gBAAgB,KAAK,WAAW;AAAA,IAC3C,UAAU,cAAc,eAAe;AAAA,IACvC;AAAA,IACA,QAAQ;AAAA,MACN,WAAW,IAAI;AAAA,MACf,WAAW,IAAI;AAAA,IACjB;AAAA,EACF;AACF;;;ACxDO,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;;;ACExB,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YAAY,SAA0B,QAAiB;AACrD,UAAM,OAAO;AADuB;AAEpC,SAAK,OAAO;AAAA,EACd;AAAA,EAHsC;AAIxC;AAEO,IAAM,YAAN,MAAgB;AAAA,EAErB,YAAY,UAAU,QAAQ,IAAI,mBAAmB,kBAAmC,UAAwB,OAAO;AAA/B;AACtF,SAAK,UAAU,QAAQ,QAAQ,QAAQ,EAAE;AAAA,EAC3C;AAAA,EAFwF;AAAA,EAD/E;AAAA,EAKT,MAAc,QAAW,MAAc,MAAgC;AACrE,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,KAAK,QAAQ,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,QACtD,GAAG;AAAA,QACH,SAAS,EAAE,QAAQ,oBAAoB,gBAAgB,oBAAoB,GAAG,MAAM,QAAQ;AAAA,MAC9F,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,iCAAiC,KAAK,OAAO,GAAG,IAAI,0FAA0F;AAAA,IACnK;AACA,UAAM,OAAgB,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,MAAS;AACjE,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,SAAS,SAAS,WAAW,MAAM,gCACvC,SAAS,WAAW,MAAM,mCACxB,SAAS,WAAW,MAAM,0CACxB,SAAS,WAAW,MAAM,0DACxB,SAAS,WAAW,MAAM,0CACxB,SAAS,UAAU,MAAM,uCAAuC;AAC1E,YAAM,IAAI,SAAS,4BAA4B,SAAS,MAAM,KAAK,MAAM,IAAI,SAAS,MAAM;AAAA,IAC9F;AACA,WAAO;AAAA,EACT;AAAA,EAEA,SAAuC;AACrC,WAAO,KAAK,QAAQ,SAAS;AAAA,EAC/B;AAAA,EAEA,gBAAqC;AACnC,WAAO,KAAK,QAAiB,iBAAiB,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,UAAU;AAC1G,UAAI,CAAC,SAAS,OAAO,UAAU,SAAU,OAAM,IAAI,SAAS,6CAA6C;AACzG,YAAM,UAAU;AAChB,UAAI,OAAO,QAAQ,cAAc,YAAY,OAAO,QAAQ,eAAe,YAAY,OAAO,QAAQ,cAAc,UAAU;AAC5H,cAAM,IAAI,SAAS,6CAA6C;AAAA,MAClE;AACA,YAAM,MAAM,IAAI,IAAI,QAAQ,UAAU;AACtC,UAAI,IAAI,aAAa,UAAU;AAC7B,cAAM,IAAI,SAAS,4CAA4C;AAAA,MACjE;AACA,aAAO,EAAE,WAAW,QAAQ,WAAW,YAAY,IAAI,SAAS,GAAG,WAAW,QAAQ,UAAU;AAAA,IAClG,CAAC;AAAA,EACH;AAAA,EAEA,cAAc,WAAgF;AAC5F,WAAO,KAAK,QAAQ,iBAAiB,mBAAmB,SAAS,CAAC,SAAS;AAAA,EAC7E;AAAA,EAEA,YAAY,WAA6C;AACvD,WAAO,KAAK,QAAQ,iBAAiB,mBAAmB,SAAS,CAAC,EAAE;AAAA,EACtE;AAAA,EAEA,OAAO,WAAmB,WAAmB,QAAgD;AAC3F,WAAO,KAAK,QAAiB,qBAAqB;AAAA,MAChD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,WAAW,WAAW,OAAO,CAAC;AAAA,IACvD,CAAC,EAAE,KAAK,CAAC,UAAU;AACjB,UAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,MAAM,CAAC,SAAS,QAAQ,OAAO,SAAS,YAAY,OAAQ,KAAiC,SAAS,YAAY,OAAQ,KAAiC,OAAO,SAAS,GAAG;AAChN,cAAM,IAAI,SAAS,kDAAkD;AAAA,MACvE;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;;;AC7EA,SAAS,cAAAA,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,WAAAC,gBAAe;AAOjB,SAAS,cAAc,KAAiC;AAC7D,QAAM,UAAUC,SAAQ,KAAK,MAAM;AACnC,MAAIC,YAAW,OAAO,GAAG;AACvB,UAAM,UAAUA,YAAWD,SAAQ,KAAK,YAAY,CAAC,KACnDE,cAAaF,SAAQ,KAAK,YAAY,GAAG,MAAM,EAAE,MAAM,OAAO,EAAE,KAAK,CAAC,SAAS,KAAK,KAAK,MAAM,UAAU,KAAK,KAAK,MAAM,QAAQ;AACnI,QAAI,CAAC,QAAS,QAAO;AAAA,EACvB;AACA,SAAO;AACT;;;AChBA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAC1B,IAAM,gBAAgB,UAAU,QAAQ;AAExC,eAAsB,YAAY,KAA+B;AAC/D,QAAM,UAAU,QAAQ,aAAa,UAAU,iBAAiB,QAAQ,aAAa,WAAW,SAAS;AACzG,QAAM,OAAO,QAAQ,aAAa,UAAU,CAAC,+BAA+B,GAAG,IAAI,CAAC,GAAG;AACvF,MAAI;AACF,UAAM,cAAc,SAAS,IAAI;AACjC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACbA,SAAS,OAAO,cAAc;AAC9B,SAAS,0BAA0B;AAUnC,IAAM,SAAS;AACf,IAAM,QAAQ,MAAM,KAAK,IAAI,KAAK,OAAO,WAAW,MAAM,CAAC;AAC3D,IAAM,MAAM,CAAC,UAAkB,MAAM,SAAS,MAAM,IAAI,GAAG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC,WAAM;AAErF,SAAS,aAAgB,OAAe,SAA8B,SAAS,MAAkC;AACtH,MAAI,CAAC,MAAM,SAAS,CAAC,OAAO,MAAO,QAAO,QAAQ,QAAQ,EAAE,MAAM,aAAa,OAAO,GAAG,CAAC;AAC1F,SAAO,IAAI,QAAQ,CAACG,aAAY;AAC9B,QAAI,QAAQ;AACZ,QAAI,SAAS;AACb,QAAI,UAAU;AACd,QAAI,gBAAgB;AACpB,QAAI,UAAU;AACd,UAAM,WAAW,MAAM;AACrB,YAAM,QAAQ,MAAM,KAAK,EAAE,YAAY;AACvC,aAAO,QAAQ,QAAQ,OAAO,CAAC,WAAW,OAAO,MAAM,YAAY,EAAE,SAAS,KAAK,KAAK,OAAO,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,KAAK,CAAC,IAAI;AAAA,IAChJ;AACA,UAAM,QAAQ,MAAM;AAClB,UAAI,kBAAkB,EAAG;AACzB,aAAO,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG;AACzC,eAAS,OAAO,GAAG,OAAO,eAAe,QAAQ,EAAG,QAAO,MAAM,GAAG,MAAM,KAAK,OAAO,gBAAgB,IAAI,GAAG,MAAM,OAAO,EAAE,EAAE;AAC9H,aAAO,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG;AAAA,IAC3C;AACA,UAAM,SAAS,MAAM;AACnB,YAAM;AACN,YAAM,UAAU,SAAS;AACzB,UAAI,UAAU,QAAQ,OAAQ,UAAS,KAAK,IAAI,GAAG,QAAQ,SAAS,CAAC;AACrE,YAAM,QAAQ,CAAC,GAAG,KAAK,IAAI,GAAG,MAAM,GAAG,IAAI,KAAK,CAAC,EAAE;AACnD,UAAI,SAAS;AACX,YAAI,QAAQ,WAAW,EAAG,OAAM,KAAK,yBAAyB;AAAA,YACzD,OAAM,KAAK,GAAG,QAAQ,IAAI,CAAC,QAAQ,UAAU,GAAG,UAAU,SAAS,WAAM,GAAG,IAAI,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;AACzG,cAAM,KAAK,iDAAuC;AAAA,MACpD;AACA,aAAO,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,CAAI;AACpC,sBAAgB,MAAM;AAAA,IACxB;AACA,UAAM,SAAS,CAAC,WAA8B;AAC5C,UAAI,QAAS;AACb,gBAAU;AACV,YAAM,IAAI,YAAY,UAAU;AAChC,YAAM;AACN,YAAM,aAAa,KAAK;AACxB,YAAM,MAAM;AACZ,aAAO,MAAM,IAAI;AACjB,MAAAA,SAAQ,MAAM;AAAA,IAChB;AACA,UAAM,aAAa,CAAC,OAAe,QAA8D;AAC/F,UAAI,IAAI,QAAQ,IAAI,SAAS,IAAK,QAAO,OAAO,EAAE,MAAM,aAAa,MAAM,CAAC;AAC5E,UAAI,IAAI,QAAQ,IAAI,SAAS,IAAK,QAAO,OAAO,EAAE,MAAM,QAAQ,MAAM,CAAC;AACvE,UAAI,IAAI,SAAS,UAAU;AACzB,eAAO,OAAO,EAAE,MAAM,aAAa,MAAM,CAAC;AAAA,MAC5C;AACA,UAAI,IAAI,SAAS,QAAQ,IAAI,SAAS,QAAQ;AAC5C,cAAM,UAAU,SAAS;AACzB,YAAI,QAAQ,SAAS,EAAG,UAAS,IAAI,SAAS,QAAQ,SAAS,QAAQ,SAAS,KAAK,QAAQ,UAAU,SAAS,KAAK,QAAQ;AAC7H,kBAAU;AACV,eAAO,OAAO;AAAA,MAChB;AACA,UAAI,IAAI,SAAS,YAAY,IAAI,SAAS,SAAS;AACjD,cAAM,UAAU,SAAS;AACzB,cAAM,WAAW,QAAQ,MAAM;AAC/B,YAAI,SAAU,QAAO,OAAO,EAAE,MAAM,YAAY,OAAO,SAAS,OAAO,MAAM,CAAC;AAC9E,eAAO,OAAO,EAAE,MAAM,aAAa,MAAM,CAAC;AAAA,MAC5C;AACA,UAAI,IAAI,SAAS,OAAO;AACtB,cAAM,UAAU,SAAS;AACzB,YAAI,QAAQ,WAAW,EAAG,SAAQ,QAAQ,CAAC,EAAE;AAAA,iBACpC,QAAQ,SAAS,EAAG,WAAU,SAAS,KAAK,QAAQ;AAC7D,kBAAU;AACV,eAAO,OAAO;AAAA,MAChB;AACA,UAAI,IAAI,SAAS,aAAa;AAC5B,gBAAQ,MAAM,MAAM,GAAG,EAAE;AACzB,kBAAU;AACV,eAAO,OAAO;AAAA,MAChB;AACA,YAAM,WAAW,IAAI,YAAY;AACjC,UAAI,iBAAiB,KAAK,QAAQ,GAAG;AACnC,iBAAS;AACT,iBAAS;AACT,kBAAU;AACV,eAAO,OAAO;AAAA,MAChB;AAAA,IACF;AACA,uBAAmB,KAAK;AACxB,UAAM,aAAa,IAAI;AACvB,UAAM,OAAO;AACb,UAAM,GAAG,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT,CAAC;AACH;;;AC/FA,eAAsB,QAAQ,MAAM,IAAI,UAAU,GAAgE;AAChH,QAAM,UAAU,MAAM,IAAI,cAAc;AACxC,UAAQ,IAAI;AAAA,EAAsB,QAAQ,UAAU,EAAE;AACtD,MAAI,CAAE,MAAM,YAAY,QAAQ,UAAU,EAAI,SAAQ,IAAI,uDAAuD;AACjH,UAAQ,IAAI,wGAAyF;AACrG,QAAM,UAAU,KAAK,MAAM,QAAQ,SAAS;AAC5C,aAAS;AACP,UAAM,SAAS,MAAM,IAAI,cAAc,QAAQ,SAAS;AACxD,QAAI,OAAO,UAAU,YAAa,QAAO,EAAE,SAAS,SAAS,OAAO,QAAQ;AAC5E,QAAI,OAAO,UAAU,UAAW,OAAM,IAAI,MAAM,6BAA6B;AAC7E,QAAI,OAAO,UAAU,YAAa,OAAM,IAAI,MAAM,mCAAmC;AACrF,QAAI,OAAO,SAAS,OAAO,KAAK,KAAK,IAAI,KAAK,QAAS,OAAM,IAAI,MAAM,6BAA6B;AACpG,UAAM,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAAS,GAAI,CAAC;AAAA,EAC1D;AACF;AAEA,eAAsB,QAAQ,UAAoC;AAChE,MAAI,CAAC,QAAQ,MAAM,SAAS,CAAC,QAAQ,OAAO,MAAO,QAAO;AAC1D,QAAM,SAAS,MAAM,aAAa,UAAU;AAAA,IAC1C,EAAE,OAAO,OAAO,OAAO,KAAK;AAAA,IAC5B,EAAE,OAAO,MAAM,OAAO,MAAM;AAAA,EAC9B,CAAC;AACD,SAAO,OAAO,SAAS,cAAc,OAAO;AAC9C;;;AC5BA,SAAS,cAAAC,aAAY,WAAW,gBAAAC,eAAc,qBAAqB;AACnE,SAAS,eAAe;AACxB,SAAS,MAAM,WAAAC,gBAAe;AAE9B,IAAM,YAAY,KAAK,QAAQ,GAAG,WAAW,UAAU,sBAAsB;AAE7E,SAAS,cAAwB;AAC/B,MAAI,CAACF,YAAW,SAAS,EAAG,QAAO,CAAC;AACpC,MAAI;AACF,UAAM,SAAkB,KAAK,MAAMC,cAAa,WAAW,MAAM,CAAC;AAClE,WAAO,MAAM,QAAQ,MAAM,KAAK,OAAO,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ,IAAI,SAAS,CAAC;AAAA,EAC/F,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,UAAU,KAAsB;AAC9C,SAAO,YAAY,EAAE,SAASC,SAAQ,GAAG,CAAC;AAC5C;AAEO,SAAS,YAAY,KAAmB;AAC7C,QAAM,SAASA,SAAQ,GAAG;AAC1B,QAAM,UAAU,YAAY;AAC5B,MAAI,CAAC,QAAQ,SAAS,MAAM,EAAG,SAAQ,KAAK,MAAM;AAClD,YAAU,KAAK,QAAQ,GAAG,WAAW,QAAQ,GAAG,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAChF,gBAAc,WAAW,KAAK,UAAU,SAAS,MAAM,CAAC,GAAG,EAAE,UAAU,QAAQ,MAAM,IAAM,CAAC;AAC9F;AAEO,SAAS,YAAY,KAAmB;AAC7C,QAAM,SAASA,SAAQ,GAAG;AAC1B,QAAM,UAAU,YAAY,EAAE,OAAO,CAAC,SAAS,SAAS,MAAM;AAC9D,MAAIF,YAAW,SAAS,EAAG,eAAc,WAAW,KAAK,UAAU,SAAS,MAAM,CAAC,GAAG,EAAE,UAAU,QAAQ,MAAM,IAAM,CAAC;AACzH;;;AC9BA,eAAsB,cAAc,MAAM,QAAQ,IAAI,GAAqB;AACzE,MAAI,UAAU,GAAG,EAAG,QAAO;AAC3B,MAAI,CAAE,MAAM,QAAQ;AAAA;AAAA,EAAiC,GAAG;AAAA;AAAA,4EAAiF,GAAI;AAC3I,YAAQ,IAAI,iCAAiC;AAC7C,WAAO;AAAA,EACT;AACA,cAAY,GAAG;AACf,UAAQ,IAAI,wBAAmB;AAC/B,SAAO;AACT;AACA,eAAsB,aAAa,MAAM,QAAQ,IAAI,GAAkB;AAAE,QAAM,cAAc,GAAG;AAAG;AAC5F,SAAS,mBAAmB,MAAM,QAAQ,IAAI,GAAS;AAAE,cAAY,GAAG;AAAG,UAAQ,IAAI,8BAAyB;AAAG;;;ACN1H,eAAsB,YAAY,MAAM,QAAQ,IAAI,GAAG,MAAM,IAAI,UAAU,GAAkB;AAC3F,MAAI,CAAE,MAAM,cAAc,GAAG,EAAI;AACjC,QAAM,UAAU,cAAc,GAAG;AACjC,MAAI,CAAC,QAAQ,YAAa,OAAM,IAAI,MAAM,oEAAoE;AAC9G,UAAQ,IAAI,YAAY,QAAQ,SAAS,WAAW;AACpD,MAAI,CAAC,QAAQ,YAAY;AACvB,YAAQ,IAAI,+DAA+D;AAC3E;AAAA,EACF;AACA,MAAI,CAAE,MAAM,QAAQ,iCAAiC,EAAI;AACzD,QAAM,SAAS,MAAM,QAAQ,GAAG;AAChC,KAAG,0BAA0B;AAC7B,KAAG,qBAAqB,OAAO,SAAS,WAAW;AACnD,MAAI,OAAO,SAAS,WAAW;AAC7B,YAAQ,IAAI;AAAA,cAAiB,OAAO,QAAQ,SAAS;AAAA,cAAiB,OAAO,QAAQ,aAAa,QAAQ,OAAO,aAAa,sDAAsD,EAAE;AAAA,EACxL;AACA,QAAM,UAAU,cAAc,GAAG;AACjC,MAAI,QAAS,SAAQ,IAAI;AAAA,WAAc,OAAO,EAAE;AAChD,UAAQ,IAAI,gJAAsJ;AAClK,UAAQ,IAAI,wDAAwD;AACtE;;;ACzBA,eAAsB,aAAa,MAAM,IAAI,UAAU,GAAkB;AACvE,QAAM,QAAQ,GAAG;AACjB,UAAQ,IAAI,qCAAgC;AAC9C;;;ACLO,SAAS,gBAAsB;AACpC,UAAQ,IAAI,yGAAoG;AAClH;;;ACAA,eAAsB,cAAc,MAAM,QAAQ,IAAI,GAAG,MAAM,IAAI,UAAU,GAAkB;AAC7F,QAAM,UAAU,cAAc,GAAG;AACjC,UAAQ,IAAI,YAAY,OAAO,QAAQ,aAAa,SAAS,WAAW,QAAQ,YAAY,OAAO,SAAS;AAAA,OAAU,QAAQ,cAAc,eAAe,EAAE;AAC7J,MAAI,CAAC,QAAQ,OAAO,aAAa,CAAC,QAAQ,OAAO,WAAW;AAC1D,YAAQ,IAAI,0HAA0H;AACtI;AAAA,EACF;AACA,QAAM,OAAO,MAAM,IAAI,YAAY,QAAQ,OAAO,SAAS;AAC3D,UAAQ,IAAI;AAAA,WAAc,KAAK,oBAAoB,WAAW;AAAA,OAAU,QAAQ,UAAU;AAAA,UAAa,KAAK,gBAAgB,gBAAgB,EAAE;AAC9I,UAAQ,IAAI,eAAe;AAC3B,UAAQ,IAAI,KAAK,oBAAoB,uBAAuB,KAAK,iBAAiB,KAAK,4BAA4B;AACrH;;;ACVA,eAAsB,cAAc,MAAM,QAAQ,IAAI,GAAG,MAAM,IAAI,UAAU,GAAkB;AAC7F,QAAM,UAAU,cAAc,GAAG;AACjC,MAAI,CAAC,QAAQ,aAAa;AAAE,SAAK,oBAAoB,yBAAyB;AAAG,YAAQ,WAAW;AAAG;AAAA,EAAQ;AAC/G,KAAG,kBAAkB;AACrB,MAAI,CAAC,QAAQ,YAAY;AAAE,SAAK,iBAAiB,yBAAyB;AAAG,YAAQ,WAAW;AAAG;AAAA,EAAQ;AAC3G,KAAG,iBAAiB,QAAQ,UAAU;AACtC,MAAI,CAAC,QAAQ,OAAO,aAAa,CAAC,QAAQ,OAAO,WAAW;AAAE,SAAK,uBAAuB,+CAA+C;AAAG,YAAQ,WAAW;AAAG;AAAA,EAAQ;AAC1K,KAAG,qBAAqB;AACxB,MAAI;AACF,UAAM,UAAU,MAAM,IAAI,OAAO,QAAQ,OAAO,WAAW,QAAQ,OAAO,WAAW,QAAQ,IAAI,cAAc;AAC/G,QAAI,CAAC,kBAAkB,OAAO,EAAG,SAAQ,WAAW;AAAA,EACtD,SAAS,OAAO;AACd,SAAK,iBAAiB,iBAAiB,QAAQ,MAAM,UAAU,qBAAqB;AACpF,YAAQ,WAAW;AAAA,EACrB;AACF;;;ACfA,eAAsB,cAAc,MAAM,QAAQ,IAAI,GAAG,MAAM,IAAI,UAAU,GAAkB;AAC7F,QAAM,UAAU,cAAc,GAAG;AACjC,KAAG,UAAU,QAAQ,QAAQ;AAC7B,KAAG,WAAW,QAAQ,OAAO;AAC7B,KAAG,OAAO,uBAAuB;AACjC,UAAQ,cAAc,GAAG,WAAW,GAAG,IAAI,KAAK,WAAW,yBAAyB;AACpF,UAAQ,aAAa,GAAG,OAAO,QAAQ,UAAU,IAAI,KAAK,OAAO,eAAe;AAChF,UAAQ,OAAO,aAAa,QAAQ,OAAO,YAAY,GAAG,eAAe,IAAI,KAAK,iBAAiB,mCAAmC;AACtI,MAAI;AAAE,UAAM,IAAI,OAAO;AAAG,OAAG,cAAc,iCAAiC;AAAA,EAAG,SACxE,OAAO;AAAE,SAAK,cAAc,iBAAiB,QAAQ,MAAM,UAAU,aAAa;AAAA,EAAG;AAC5F,MAAI,QAAQ,OAAO,aAAa,QAAQ,OAAO,WAAW;AACxD,QAAI;AAAE,YAAM,IAAI,YAAY,QAAQ,OAAO,SAAS;AAAG,SAAG,oBAAoB;AAAA,IAAG,SAC1E,OAAO;AAAE,WAAK,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,aAAa;AAAA,IAAG;AAAA,EACtG;AACF;;;ACfA,eAAsB,mBAAkC;AACtD,QAAM,aAAa,QAAQ,IAAI,yBAAyB;AACxD,QAAM,SAAS,IAAI,IAAI,UAAU;AACjC,MAAI,OAAO,aAAa,SAAU,OAAM,IAAI,MAAM,0CAA0C;AAC5F,QAAM,MAAM,OAAO,SAAS;AAC5B,MAAI,CAAE,MAAM,YAAY,GAAG,EAAI,SAAQ,IAAI,QAAQ,GAAG,EAAE;AAAA,MACnD,SAAQ,IAAI,WAAW,GAAG,EAAE;AACnC;;;ACLA,eAAsB,cAAc,MAAM,QAAQ,IAAI,GAAG,MAAM,IAAI,UAAU,GAAkB;AAC7F,QAAM,UAAU,cAAc,GAAG;AACjC,MAAI,CAAC,QAAQ,OAAO,WAAW;AAC7B,YAAQ,IAAI,8PAA6G;AACzH,UAAM,MAAM;AACZ,QAAI,MAAM,YAAY,GAAG,EAAG,SAAQ,IAAI,WAAW,GAAG,EAAE;AAAA,QAAQ,SAAQ,IAAI,QAAQ,GAAG,EAAE;AACzF;AAAA,EACF;AACA,QAAM,OAAO,MAAM,IAAI,YAAY,QAAQ,OAAO,SAAS;AAC3D,UAAQ,IAAI;AAAA;AAAA,gBAAwD,KAAK,gBAAgB,gBAAgB;AAAA;AAAA,+CAAoD;AAC/J;;;ACdA,SAAS,oBAAoB;AAC7B,SAAS,gBAAAG,qBAAoB;;;ACD7B,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,qBAAqB;AAEvB,SAAS,qBAA6B;AAC3C,aAAW,cAAc;AAAA,IACvB,IAAI,IAAI,mBAAmB,YAAY,GAAG;AAAA,IAC1C,IAAI,IAAI,sBAAsB,YAAY,GAAG;AAAA,IAC7C,IAAI,IAAI,yBAAyB,YAAY,GAAG;AAAA,EAClD,GAAG;AACD,QAAI;AACF,YAAM,cAAuB,KAAK,MAAMA,cAAa,cAAc,UAAU,GAAG,MAAM,CAAC;AACvF,UAAI,eAAe,OAAO,gBAAgB,YAAY,OAAQ,YAAwC,YAAY,UAAU;AAC1H,eAAQ,YAAuC;AAAA,MACjD;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;;;ADfA,IAAM,eAAe;AACrB,IAAM,eAAe;AACrB,IAAM,aAAa;AAEnB,IAAM,gBAA+B,CAAC,MAAM,MAAM,YAAY,aAAa,MAAM,MAAM,OAAO;AAO9F,SAAS,aAAa,OAAwE;AAC5F,QAAM,QAAQ,mDAAmD,KAAK,MAAM,KAAK,CAAC;AAClF,SAAO,QACH,EAAE,SAAS,CAAC,OAAO,MAAM,CAAC,CAAC,GAAG,OAAO,MAAM,CAAC,CAAC,GAAG,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,YAAY,MAAM,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,EAAE,IAC1G;AACN;AAEO,SAAS,gBAAgB,MAAc,OAAuB;AACnE,QAAM,IAAI,aAAa,IAAI;AAC3B,QAAM,IAAI,aAAa,KAAK;AAC5B,MAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AACrB,WAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;AACzC,QAAI,EAAE,QAAQ,KAAK,MAAM,EAAE,QAAQ,KAAK,EAAG,QAAO,EAAE,QAAQ,KAAK,IAAI,EAAE,QAAQ,KAAK,IAAI,IAAI;AAAA,EAC9F;AACA,MAAI,EAAE,WAAW,WAAW,KAAK,EAAE,WAAW,SAAS,EAAG,QAAO;AACjE,MAAI,EAAE,WAAW,SAAS,KAAK,EAAE,WAAW,WAAW,EAAG,QAAO;AACjE,WAAS,QAAQ,GAAG,QAAQ,KAAK,IAAI,EAAE,WAAW,QAAQ,EAAE,WAAW,MAAM,GAAG,SAAS,GAAG;AAC1F,UAAM,WAAW,EAAE,WAAW,KAAK;AACnC,UAAM,YAAY,EAAE,WAAW,KAAK;AACpC,QAAI,aAAa,OAAW,QAAO;AACnC,QAAI,cAAc,OAAW,QAAO;AACpC,QAAI,aAAa,UAAW;AAC5B,UAAM,aAAa,QAAQ,KAAK,QAAQ,IAAI,OAAO,QAAQ,IAAI;AAC/D,UAAM,cAAc,QAAQ,KAAK,SAAS,IAAI,OAAO,SAAS,IAAI;AAClE,QAAI,eAAe,UAAa,gBAAgB,OAAW,QAAO,aAAa,cAAc,IAAI;AACjG,QAAI,eAAe,OAAW,QAAO;AACrC,QAAI,gBAAgB,OAAW,QAAO;AACtC,WAAO,WAAW,YAAY,IAAI;AAAA,EACpC;AACA,SAAO;AACT;AAEA,eAAsB,eACpB,iBAAiB,mBAAmB,GACpC,UAAwB,OACH;AACrB,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,UAAU;AAC7D,MAAI;AACF,UAAM,WAAW,MAAM,QAAQ,cAAc,EAAE,SAAS,EAAE,QAAQ,mBAAmB,GAAG,QAAQ,WAAW,OAAO,CAAC;AACnH,QAAI,CAAC,SAAS,GAAI,QAAO,EAAE,eAAe;AAC1C,UAAM,OAAgB,MAAM,SAAS,KAAK;AAC1C,UAAM,gBAAgB,QAAQ,OAAO,SAAS,YAAY,OAAQ,KAAiC,YAAY,WAC1G,KAAgC,UACjC;AACJ,WAAO,iBAAiB,aAAa,aAAa,IAAI,EAAE,gBAAgB,cAAc,IAAI,EAAE,eAAe;AAAA,EAC7G,QAAQ;AACN,WAAO,EAAE,eAAe;AAAA,EAC1B,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AACF;AAEA,eAAsB,0BAAyC;AAC7D,QAAM,SAAS,MAAM,eAAe;AACpC,MAAI,OAAO,iBAAiB,gBAAgB,OAAO,eAAe,OAAO,cAAc,IAAI,GAAG;AAC5F,YAAQ,IAAI;AAAA,2CAAyC,OAAO,cAAc,WAAM,OAAO,aAAa;AAAA;AAAA,CAAmD;AAAA,EACzJ;AACF;AAIO,SAAS,kBACd,iBAAiB,QAAQ,KAAK,CAAC,KAAK,IACpC,MAAyB,QAAQ,KACjC,qBAA+C,MAAM;AACnD,MAAI;AACF,WAAO,aAAa,QAAQ,aAAa,UAAU,YAAY,OAAO,CAAC,QAAQ,UAAU,GAAG,EAAE,UAAU,OAAO,CAAC,EAAE,KAAK;AAAA,EACzH,QAAQ;AACN,WAAO;AAAA,EACT;AACF,GACa;AACb,MAAI,IAAI,gBAAgB,UAAU,kBAAkB,KAAK,cAAc,EAAG,QAAO;AACjF,QAAM,aAAa,mBAAmB;AACtC,MAAI,cAAc,eAAe,YAAY,EAAE,WAAW,GAAG,WAAW,YAAY,CAAC,IAAI,EAAG,QAAO;AACnG,MAAI,cAAc,eAAe,YAAY,EAAE,WAAW,GAAG,WAAW,YAAY,CAAC,GAAG,EAAG,QAAO;AAClG,SAAO;AACT;AAEA,SAAS,iBAAiB,aAAyC;AACjE,MAAI;AACF,UAAM,QAAiB,KAAK,MAAMC,cAAa,GAAG,WAAW,iBAAiB,MAAM,CAAC;AACrF,WAAO,SAAS,OAAO,UAAU,YAAY,OAAQ,MAAkC,YAAY,WAC9F,MAAiC,UAClC;AAAA,EACN,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,cACd,eACA,MACA,iBAAiB,QAAQ,KAAK,CAAC,KAAK,IACpC,SAAwB,eACJ;AACpB,QAAM,aAAa,QAAQ,aAAa,UAAU,YAAY;AAC9D,MAAI,SAAS,UAAU;AACrB,WAAO,YAAY,CAAC,WAAW,YAAY,GAAG,YAAY,IAAI,aAAa,EAAE,GAAG,EAAE,OAAO,UAAU,CAAC;AACpG,UAAM,cAAc,eAAe,QAAQ,0BAA0B,EAAE;AACvE,WAAO,iBAAiB,WAAW;AAAA,EACrC;AACA,MAAI,SAAS,OAAO;AAClB,UAAM,MAAM,QAAQ,aAAa,UAAU,YAAY;AACvD,UAAM,SAAS,OAAO,KAAK,CAAC,SAAS,GAAG,YAAY,IAAI,aAAa,IAAI,WAAW,GAAG,EAAE,UAAU,OAAO,CAAC;AAC3G,WAAO,OAAO,WAAW,WAAW,OAAO,KAAK,EAAE,MAAM,OAAO,EAAE,IAAI,IAAI;AAAA,EAC3E;AACA,SAAO;AACT;;;AExHA,eAAsB,gBAA+B;AACnD,QAAM,SAAS,MAAM,eAAe;AACpC,MAAI,CAAC,OAAO,iBAAiB,gBAAgB,OAAO,eAAe,OAAO,cAAc,KAAK,GAAG;AAC9F,YAAQ,IAAI;AAAA;AAAA,mBAA2D,OAAO,cAAc,EAAE;AAC9F;AAAA,EACF;AACA,UAAQ,IAAI;AAAA;AAAA;AAAA,mBAA0C,OAAO,cAAc;AAAA,eAAkB,OAAO,aAAa;AAAA,CAAI;AACrH,MAAI,CAAC,QAAQ,MAAM,SAAS,CAAE,MAAM,QAAQ,0BAA0B,OAAO,cAAc,OAAO,OAAO,aAAa,GAAG,GAAI;AAC3H,YAAQ,IAAI,mBAAmB;AAC/B;AAAA,EACF;AACA,QAAM,OAAO,kBAAkB;AAC/B,MAAI,SAAS,SAAS;AACpB,YAAQ,IAAI,sGAAsG;AAClH;AAAA,EACF;AACA,MAAI;AACF,YAAQ,IAAI,6DAAwD;AACpE,UAAM,YAAY,cAAc,OAAO,eAAe,IAAI;AAC1D,QAAI,CAAC,aAAa,gBAAgB,WAAW,OAAO,aAAa,MAAM,GAAG;AACxE,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AACA,YAAQ,IAAI;AAAA;AAAA;AAAA;AAAA,WAA4E,SAAS,EAAE;AAAA,EACrG,QAAQ;AACN,YAAQ,IAAI,sDAAiD;AAAA,EAC/D;AACF;;;ACjBO,SAAS,aAAa,OAAuB;AAClD,QAAM,QAAQ,MAAM,KAAK,EAAE,YAAY;AACvC,MAAI,0EAA0E,KAAK,KAAK,EAAG,QAAO;AAClG,MAAI,8CAA8C,KAAK,KAAK,EAAG,QAAO;AACtE,MAAI,iBAAiB,KAAK,KAAK,EAAG,QAAO;AACzC,MAAI,YAAY,KAAK,KAAK,EAAG,QAAO;AACpC,MAAI,2CAA2C,KAAK,KAAK,EAAG,QAAO;AACnE,MAAI,iBAAiB,KAAK,KAAK,EAAG,QAAO;AACzC,MAAI,cAAc,KAAK,KAAK,EAAG,QAAO;AACtC,MAAI,wBAAwB,KAAK,KAAK,EAAG,QAAO;AAChD,SAAO;AACT;AAEO,SAAS,kBAAwB;AACtC,UAAQ,IAAI,mkBAAmkB;AACjlB;AAEA,eAAsB,kBAAiC;AACrD,MAAI,CAAE,MAAM,cAAc,EAAI;AAC9B,aAAW,cAAc,CAAC;AAC1B,UAAQ,IAAI,iFAAiF;AAC7F,QAAM,cAAc;AAAA,IAClB,EAAE,OAAO,wBAAwB,OAAO,UAAU;AAAA,IAClD,EAAE,OAAO,wBAAwB,OAAO,SAAS;AAAA,IACjD,EAAE,OAAO,mBAAmB,OAAO,cAAc;AAAA,IACjD,EAAE,OAAO,kBAAkB,OAAO,YAAY;AAAA,IAC9C,EAAE,OAAO,oBAAoB,OAAO,SAAS;AAAA,IAC7C,EAAE,OAAO,cAAc,OAAO,SAAS;AAAA,IACvC,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,IAC/B,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EACjC;AACA,aAAS;AACP,UAAM,SAAS,MAAM,aAAa,8BAA8B,aAAa,SAAI;AACjF,QAAI,OAAO,SAAS,OAAQ;AAC5B,QAAI,OAAO,SAAS,WAAY;AAChC,UAAM,UAAU,aAAa,OAAO,SAAS,OAAO,OAAO,KAAK,CAAC;AACjE,QAAI,YAAY,UAAU,YAAY,QAAQ;AAC5C,YAAM,YAAY,MAAM,aAAa,gBAAgB;AAAA,QACnD,EAAE,OAAO,OAAO,OAAO,KAAK;AAAA,QAC5B,EAAE,OAAO,MAAM,OAAO,MAAM;AAAA,MAC9B,CAAC;AACD,UAAI,UAAU,SAAS,YAAY;AACjC,YAAI,UAAU,MAAO;AAAA,MACvB;AACA;AAAA,IACF;AACA,QAAI,YAAY,UAAW,OAAM,YAAY;AAAA,aACpC,YAAY,SAAU,OAAM,cAAc;AAAA,aAC1C,YAAY,cAAe,OAAM,cAAc;AAAA,aAC/C,YAAY,YAAa,OAAM,iBAAiB;AAAA,aAChD,YAAY,SAAU,OAAM,cAAc;AAAA,aAC1C,YAAY,SAAU,OAAM,cAAc;AAAA,aAC1C,YAAY,SAAU,eAAc;AAAA,aACpC,YAAY,QAAS,OAAM,aAAa;AAAA,aACxC,YAAY,eAAgB,oBAAmB;AAAA,aAC/C,YAAY,OAAQ,iBAAgB;AAAA,aACpC,YAAY,UAAW,SAAQ,IAAI,mBAAmB,CAAC;AAAA,QAC3D,SAAQ,IAAI,mCAAmC,OAAO,KAAK;AAAA,0CAA6C;AAAA,EAC/G;AACF;;;ACzDA,SAAS,iBAAAC,sBAAqB;AAEvB,IAAM,cAAc,mBAAmB;AAC9C,SAAS,OAAa;AAAE,kBAAgB;AAAG;AAC3C,eAAsB,KAAK,OAAO,QAAQ,KAAK,MAAM,CAAC,GAAkB;AACtE,QAAM,UAAU,KAAK,CAAC,KAAK;AAC3B,MAAI,YAAY,YAAY,CAAC,KAAK,SAAS,WAAW,KAAK,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,SAAS,QAAQ,KAAK,CAAC,KAAK,SAAS,IAAI,GAAG;AACnI,UAAM,wBAAwB;AAAA,EAChC;AACA,MAAI,YAAY,YAAY,YAAY,KAAM,QAAO,KAAK;AAC1D,MAAI,YAAY,eAAe,YAAY,KAAM,QAAO,QAAQ,IAAI,WAAW;AAC/E,MAAI,YAAY,UAAU,YAAY,UAAW,QAAO,YAAY;AACpE,MAAI,YAAY,QAAS,QAAO,aAAa;AAC7C,MAAI,YAAY,SAAU,QAAO,cAAc;AAC/C,MAAI,YAAY,SAAU,QAAO,cAAc;AAC/C,MAAI,YAAY,SAAU,QAAO,cAAc;AAC/C,MAAI,YAAY,SAAU,QAAO,cAAc;AAC/C,MAAI,YAAY,cAAe,QAAO,cAAc;AACpD,MAAI,YAAY,YAAa,QAAO,iBAAiB;AACrD,MAAI,YAAY,SAAU,QAAO,cAAc;AAC/C,MAAI,YAAY,QAAS,QAAO,aAAa;AAC7C,MAAI,YAAY,eAAgB,QAAO,mBAAmB;AAC1D,MAAI,YAAY,SAAU,QAAO,cAAc;AAC/C,MAAI,YAAY,OAAQ,QAAO,KAAK;AACpC,MAAI,YAAY,UAAW,QAAO,QAAQ,IAAI,WAAW;AACzD,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,UAAM,UAAU,cAAc;AAC9B,kBAAc,OAAO;AACrB,YAAQ,IAAI,uFAAuF;AACnG;AAAA,EACF;AACA,SAAO,gBAAgB;AACzB;AACA,IAAI,QAAQ,KAAK,CAAC,KAAKA,eAAc,YAAY,GAAG,MAAM,QAAQ,KAAK,CAAC,GAAG;AACzE,OAAK,EAAE,MAAM,CAAC,UAAmB;AAAE,YAAQ,MAAM;AAAA,SAAY,iBAAiB,QAAQ,MAAM,UAAU,gBAAgB,EAAE;AAAG,YAAQ,WAAW;AAAA,EAAG,CAAC;AACpJ;","names":["existsSync","readFileSync","resolve","resolve","existsSync","readFileSync","resolve","resolve","existsSync","readFileSync","resolve","readFileSync","readFileSync","readFileSync","fileURLToPath"]}
|