@voicethere/cli 0.1.0 → 0.2.2
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 +105 -50
- package/dist/cli.js +41 -30
- package/dist/cli.js.map +1 -1
- package/dist/commands/build/list.d.ts +3 -2
- package/dist/commands/build/list.d.ts.map +1 -1
- package/dist/commands/build/list.js +12 -7
- package/dist/commands/build/list.js.map +1 -1
- package/dist/commands/build/promote.d.ts +1 -2
- package/dist/commands/build/promote.d.ts.map +1 -1
- package/dist/commands/build/promote.js +48 -7
- package/dist/commands/build/promote.js.map +1 -1
- package/dist/commands/build/upload.d.ts +0 -1
- package/dist/commands/build/upload.d.ts.map +1 -1
- package/dist/commands/build/upload.js +18 -5
- package/dist/commands/build/upload.js.map +1 -1
- package/dist/commands/build/validate.d.ts +2 -0
- package/dist/commands/build/validate.d.ts.map +1 -1
- package/dist/commands/build/validate.js +11 -14
- package/dist/commands/build/validate.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +7 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/projects/create.d.ts.map +1 -1
- package/dist/commands/projects/create.js +7 -2
- package/dist/commands/projects/create.js.map +1 -1
- package/dist/commands/projects/delete.d.ts +6 -0
- package/dist/commands/projects/delete.d.ts.map +1 -0
- package/dist/commands/projects/delete.js +39 -0
- package/dist/commands/projects/delete.js.map +1 -0
- package/dist/commands/projects/list.d.ts.map +1 -1
- package/dist/commands/projects/list.js +3 -0
- package/dist/commands/projects/list.js.map +1 -1
- package/dist/commands/projects/show.d.ts.map +1 -1
- package/dist/commands/projects/show.js +3 -1
- package/dist/commands/projects/show.js.map +1 -1
- package/dist/commands/projects/use.d.ts +2 -1
- package/dist/commands/projects/use.d.ts.map +1 -1
- package/dist/commands/projects/use.js +70 -10
- package/dist/commands/projects/use.js.map +1 -1
- package/dist/lib/api.d.ts +4 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +21 -0
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/command-log.d.ts +19 -0
- package/dist/lib/command-log.d.ts.map +1 -0
- package/dist/lib/command-log.js +60 -0
- package/dist/lib/command-log.js.map +1 -0
- package/dist/lib/project-config.d.ts +26 -4
- package/dist/lib/project-config.d.ts.map +1 -1
- package/dist/lib/project-config.js +49 -17
- package/dist/lib/project-config.js.map +1 -1
- package/dist/lib/prompt.d.ts +9 -0
- package/dist/lib/prompt.d.ts.map +1 -0
- package/dist/lib/prompt.js +49 -0
- package/dist/lib/prompt.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export declare const PROJECT_CONFIG_DIR = ".voicethere";
|
|
2
2
|
export declare const PROJECT_CONFIG_FILENAME = "config.json";
|
|
3
|
+
export declare const DEFAULT_BUNDLE = "dist/agent.js";
|
|
3
4
|
export interface ProjectConfig {
|
|
4
5
|
/** Platform project UUID — safe to commit; links this repo to a cloud project. */
|
|
5
6
|
project_id: string;
|
|
@@ -15,7 +16,23 @@ export interface ProjectConfigFile {
|
|
|
15
16
|
name?: string;
|
|
16
17
|
bundle?: string;
|
|
17
18
|
}
|
|
19
|
+
export type BundlePathSource = "argument" | "config" | "default";
|
|
20
|
+
export interface ResolvedBundlePath {
|
|
21
|
+
relativePath: string;
|
|
22
|
+
absolutePath: string;
|
|
23
|
+
source: BundlePathSource;
|
|
24
|
+
configPath?: string;
|
|
25
|
+
}
|
|
26
|
+
export type ProjectIdSource = "config";
|
|
27
|
+
export interface ResolvedProjectId {
|
|
28
|
+
projectId: string;
|
|
29
|
+
source: ProjectIdSource;
|
|
30
|
+
configPath: string;
|
|
31
|
+
}
|
|
32
|
+
export declare const NO_PROJECT_SELECTED_MESSAGE = "No project selected. Commit .voicethere/config.json in this repo or run: voicethere projects use <projectId>";
|
|
18
33
|
export declare function getProjectConfigOverridePath(): string | null;
|
|
34
|
+
/** Repo root: parent of `.voicethere/` containing config.json. */
|
|
35
|
+
export declare function repoRootFromConfigPath(configPath: string): string;
|
|
19
36
|
/** Walk upward from startDir to find `.voicethere/config.json`. */
|
|
20
37
|
export declare function findProjectConfigPath(startDir?: string): Promise<string | null>;
|
|
21
38
|
export declare function parseProjectConfig(raw: string): ProjectConfig;
|
|
@@ -23,14 +40,19 @@ export declare function readProjectConfig(startDir?: string): Promise<{
|
|
|
23
40
|
config: ProjectConfig;
|
|
24
41
|
path: string;
|
|
25
42
|
} | null>;
|
|
26
|
-
export declare function
|
|
27
|
-
|
|
43
|
+
export declare function resolveProjectId(options?: {
|
|
44
|
+
startDir?: string;
|
|
45
|
+
}): Promise<ResolvedProjectId>;
|
|
46
|
+
export declare function requireProjectId(options?: {
|
|
28
47
|
startDir?: string;
|
|
29
48
|
}): Promise<string>;
|
|
30
49
|
export declare function writeProjectConfig(config: ProjectConfig, options?: {
|
|
31
50
|
startDir?: string;
|
|
32
51
|
path?: string;
|
|
33
52
|
}): Promise<string>;
|
|
34
|
-
/** Bundle path: CLI
|
|
35
|
-
export declare function
|
|
53
|
+
/** Bundle path: CLI arg → `.voicethere/config.json` bundle → default `dist/agent.js`. */
|
|
54
|
+
export declare function resolveBundlePathDetailed(fileArg?: string, startDir?: string): Promise<ResolvedBundlePath>;
|
|
55
|
+
/** @deprecated Prefer resolveBundlePathDetailed for logging and absolute paths. */
|
|
56
|
+
export declare function resolveBundlePath(fileArg?: string, startDir?: string): Promise<string>;
|
|
57
|
+
export declare function assertBundleExists(absolutePath: string): Promise<void>;
|
|
36
58
|
//# sourceMappingURL=project-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../src/lib/project-config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../src/lib/project-config.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAChD,eAAO,MAAM,uBAAuB,gBAAgB,CAAC;AACrD,eAAO,MAAM,cAAc,kBAAkB,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;AAEvC,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,2BAA2B,iHACwE,CAAC;AAEjH,wBAAgB,4BAA4B,IAAI,MAAM,GAAG,IAAI,CAG5D;AAED,kEAAkE;AAClE,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,mEAAmE;AACnE,wBAAsB,qBAAqB,CACzC,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA4BxB;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAyB7D;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAQzD;AAED,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAW7B;AAED,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CAGlB;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACjD,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAED,yFAAyF;AACzF,wBAAsB,yBAAyB,CAC7C,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,CAsB7B;AAED,mFAAmF;AACnF,wBAAsB,iBAAiB,CACrC,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ5E"}
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
import { access, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { constants } from "node:fs";
|
|
2
3
|
import { dirname, join, resolve } from "node:path";
|
|
3
4
|
export const PROJECT_CONFIG_DIR = ".voicethere";
|
|
4
5
|
export const PROJECT_CONFIG_FILENAME = "config.json";
|
|
6
|
+
export const DEFAULT_BUNDLE = "dist/agent.js";
|
|
7
|
+
export const NO_PROJECT_SELECTED_MESSAGE = "No project selected. Commit .voicethere/config.json in this repo or run: voicethere projects use <projectId>";
|
|
5
8
|
export function getProjectConfigOverridePath() {
|
|
6
9
|
const override = process.env.VOICETHERE_PROJECT_CONFIG?.trim();
|
|
7
10
|
return override || null;
|
|
8
11
|
}
|
|
12
|
+
/** Repo root: parent of `.voicethere/` containing config.json. */
|
|
13
|
+
export function repoRootFromConfigPath(configPath) {
|
|
14
|
+
return dirname(dirname(configPath));
|
|
15
|
+
}
|
|
9
16
|
/** Walk upward from startDir to find `.voicethere/config.json`. */
|
|
10
17
|
export async function findProjectConfigPath(startDir = process.cwd()) {
|
|
11
18
|
const override = getProjectConfigOverridePath();
|
|
@@ -66,16 +73,20 @@ export async function readProjectConfig(startDir) {
|
|
|
66
73
|
const raw = await readFile(path, "utf8");
|
|
67
74
|
return { config: parseProjectConfig(raw), path };
|
|
68
75
|
}
|
|
69
|
-
export async function
|
|
70
|
-
const
|
|
71
|
-
if (fromFlag) {
|
|
72
|
-
return fromFlag;
|
|
73
|
-
}
|
|
74
|
-
const linked = await readProjectConfig(options.startDir);
|
|
76
|
+
export async function resolveProjectId(options) {
|
|
77
|
+
const linked = await readProjectConfig(options?.startDir);
|
|
75
78
|
if (linked?.config.project_id) {
|
|
76
|
-
return
|
|
79
|
+
return {
|
|
80
|
+
projectId: linked.config.project_id,
|
|
81
|
+
source: "config",
|
|
82
|
+
configPath: linked.path,
|
|
83
|
+
};
|
|
77
84
|
}
|
|
78
|
-
throw new Error(
|
|
85
|
+
throw new Error(NO_PROJECT_SELECTED_MESSAGE);
|
|
86
|
+
}
|
|
87
|
+
export async function requireProjectId(options) {
|
|
88
|
+
const resolved = await resolveProjectId(options);
|
|
89
|
+
return resolved.projectId;
|
|
79
90
|
}
|
|
80
91
|
export async function writeProjectConfig(config, options = {}) {
|
|
81
92
|
const dir = resolve(options.startDir ?? process.cwd());
|
|
@@ -97,17 +108,38 @@ export async function writeProjectConfig(config, options = {}) {
|
|
|
97
108
|
await writeFile(path, `${JSON.stringify(payload, null, 2)}\n`, "utf8");
|
|
98
109
|
return path;
|
|
99
110
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
const
|
|
104
|
-
if (
|
|
105
|
-
return
|
|
111
|
+
/** Bundle path: CLI arg → `.voicethere/config.json` bundle → default `dist/agent.js`. */
|
|
112
|
+
export async function resolveBundlePathDetailed(fileArg, startDir) {
|
|
113
|
+
const cwd = resolve(startDir ?? process.cwd());
|
|
114
|
+
const fromArg = fileArg?.trim();
|
|
115
|
+
if (fromArg) {
|
|
116
|
+
return {
|
|
117
|
+
relativePath: fromArg,
|
|
118
|
+
absolutePath: resolve(cwd, fromArg),
|
|
119
|
+
source: "argument",
|
|
120
|
+
};
|
|
106
121
|
}
|
|
107
122
|
const linked = await readProjectConfig(startDir);
|
|
108
|
-
|
|
109
|
-
|
|
123
|
+
const relativePath = linked?.config.bundle?.trim() || DEFAULT_BUNDLE;
|
|
124
|
+
const baseDir = linked ? repoRootFromConfigPath(linked.path) : cwd;
|
|
125
|
+
return {
|
|
126
|
+
relativePath,
|
|
127
|
+
absolutePath: resolve(baseDir, relativePath),
|
|
128
|
+
source: linked?.config.bundle ? "config" : "default",
|
|
129
|
+
configPath: linked?.path,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/** @deprecated Prefer resolveBundlePathDetailed for logging and absolute paths. */
|
|
133
|
+
export async function resolveBundlePath(fileArg, startDir) {
|
|
134
|
+
const resolved = await resolveBundlePathDetailed(fileArg, startDir);
|
|
135
|
+
return resolved.absolutePath;
|
|
136
|
+
}
|
|
137
|
+
export async function assertBundleExists(absolutePath) {
|
|
138
|
+
try {
|
|
139
|
+
await access(absolutePath, constants.R_OK);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
throw new Error(`Bundle not found or not readable: ${absolutePath} — run: npx @voicethere/agent build`);
|
|
110
143
|
}
|
|
111
|
-
return DEFAULT_BUNDLE;
|
|
112
144
|
}
|
|
113
145
|
//# sourceMappingURL=project-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-config.js","sourceRoot":"","sources":["../../src/lib/project-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnD,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAC;AAChD,MAAM,CAAC,MAAM,uBAAuB,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"project-config.js","sourceRoot":"","sources":["../../src/lib/project-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface PromptChoice {
|
|
2
|
+
label: string;
|
|
3
|
+
value: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function isInteractive(): boolean;
|
|
6
|
+
export declare function promptChoice(prompt: string, choices: PromptChoice[]): Promise<string>;
|
|
7
|
+
/** Prompt until the user types exactly `expected` (used for destructive confirmations). */
|
|
8
|
+
export declare function promptConfirmText(prompt: string, expected: string): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/lib/prompt.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,YAAY,EAAE,GACtB,OAAO,CAAC,MAAM,CAAC,CA4BjB;AAED,2FAA2F;AAC3F,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAiBf"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import * as readline from "node:readline/promises";
|
|
2
|
+
export function isInteractive() {
|
|
3
|
+
return Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
4
|
+
}
|
|
5
|
+
export async function promptChoice(prompt, choices) {
|
|
6
|
+
if (choices.length === 0) {
|
|
7
|
+
throw new Error("No choices available.");
|
|
8
|
+
}
|
|
9
|
+
for (const [index, choice] of choices.entries()) {
|
|
10
|
+
console.error(` ${index + 1}. ${choice.label}`);
|
|
11
|
+
}
|
|
12
|
+
const rl = readline.createInterface({
|
|
13
|
+
input: process.stdin,
|
|
14
|
+
output: process.stderr,
|
|
15
|
+
});
|
|
16
|
+
try {
|
|
17
|
+
while (true) {
|
|
18
|
+
const answer = await rl.question(`${prompt} [1-${choices.length}]: `);
|
|
19
|
+
const index = Number.parseInt(answer.trim(), 10);
|
|
20
|
+
if (index >= 1 && index <= choices.length) {
|
|
21
|
+
return choices[index - 1].value;
|
|
22
|
+
}
|
|
23
|
+
console.error("Invalid choice — enter a number from the list.");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
rl.close();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Prompt until the user types exactly `expected` (used for destructive confirmations). */
|
|
31
|
+
export async function promptConfirmText(prompt, expected) {
|
|
32
|
+
const rl = readline.createInterface({
|
|
33
|
+
input: process.stdin,
|
|
34
|
+
output: process.stderr,
|
|
35
|
+
});
|
|
36
|
+
try {
|
|
37
|
+
while (true) {
|
|
38
|
+
const answer = await rl.question(prompt);
|
|
39
|
+
if (answer.trim() === expected) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
console.error("Confirmation did not match — try again or Ctrl+C to cancel.");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
rl.close();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/lib/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AAOnD,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,OAAuB;IAEvB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAChD,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAC9B,GAAG,MAAM,OAAO,OAAO,CAAC,MAAM,KAAK,CACpC,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACjD,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC1C,OAAO,OAAO,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC,KAAK,CAAC;YACnC,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAc,EACd,QAAgB;IAEhB,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAC/B,OAAO;YACT,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
|