@kalphq/cli 0.0.0-dev-20260509010940 → 0.0.0-dev-20260509012111
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@ import pc from "picocolors";
|
|
|
8
8
|
// package.json
|
|
9
9
|
var package_default = {
|
|
10
10
|
name: "@kalphq/cli",
|
|
11
|
-
version: "0.0.0-dev-
|
|
11
|
+
version: "0.0.0-dev-20260509012111",
|
|
12
12
|
description: "Zero-config CLI for deploying Kalp agents",
|
|
13
13
|
type: "module",
|
|
14
14
|
license: "MIT",
|
|
@@ -93,7 +93,7 @@ var main = defineCommand({
|
|
|
93
93
|
secrets: () => import("./secrets-KFMVBKJQ.js").then((r) => r.default),
|
|
94
94
|
login: () => import("./login-JYPWGL6P.js").then((r) => r.default),
|
|
95
95
|
logout: () => import("./logout-V67DZZXO.js").then((r) => r.default),
|
|
96
|
-
studio: () => import("./studio-
|
|
96
|
+
studio: () => import("./studio-SSJ27ZHR.js").then((r) => r.default)
|
|
97
97
|
},
|
|
98
98
|
run({ args }) {
|
|
99
99
|
const firstArg = process.argv[2];
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport pkg from \"../package.json\";\n\nconst LOGO = \"🦋\";\n\nconst COMMANDS = [\n [\"create\", \"Add a new agent\"],\n [\"push\", \"Push agent to Kalp\"],\n [\"link\", \"Link project to Kalp cloud\"],\n [\"secrets\", \"Manage secrets\"],\n [\"login\", \"Authenticate with Kalp\"],\n [\"logout\", \"Sign out from Kalp\"],\n [\"studio\", \"Open Kalp Studio\"],\n] as const;\n\nfunction printHelp(): void {\n p.log.info(`${pc.bold(\"Usage\")}: kalp <command> [options]`);\n console.log(\"\");\n p.log.info(pc.bold(\"Commands\"));\n\n for (const [name, desc] of COMMANDS) {\n console.log(` ${pc.cyan(name.padEnd(10))}${desc}`);\n }\n\n console.log(\"\");\n p.log.info(`Run ${pc.cyan(\"kalp <command> --help\")} for more info.`);\n}\n\nconst main = defineCommand({\n meta: {\n name: \"kalp\",\n version: pkg.version,\n description: \"🦋 Zero-config agent infrastructure\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n create: () => import(\"./commands/create\").then((r) => r.default),\n push: () => import(\"./commands/push\").then((r) => r.default),\n link: () => import(\"./commands/link\").then((r) => r.default),\n secrets: () => import(\"./commands/secrets\").then((r) => r.default),\n login: () => import(\"./commands/login\").then((r) => r.default),\n logout: () => import(\"./commands/logout\").then((r) => r.default),\n studio: () => import(\"./commands/studio\").then((r) => r.default),\n },\n run({ args }) {\n const firstArg = process.argv[2];\n\n if (args.help) {\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n return;\n }\n\n if (firstArg) {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n },\n});\n\nrunMain(main);\n","{\n \"name\": \"@kalphq/cli\",\n \"version\": \"0.0.0-dev-
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport pkg from \"../package.json\";\n\nconst LOGO = \"🦋\";\n\nconst COMMANDS = [\n [\"create\", \"Add a new agent\"],\n [\"push\", \"Push agent to Kalp\"],\n [\"link\", \"Link project to Kalp cloud\"],\n [\"secrets\", \"Manage secrets\"],\n [\"login\", \"Authenticate with Kalp\"],\n [\"logout\", \"Sign out from Kalp\"],\n [\"studio\", \"Open Kalp Studio\"],\n] as const;\n\nfunction printHelp(): void {\n p.log.info(`${pc.bold(\"Usage\")}: kalp <command> [options]`);\n console.log(\"\");\n p.log.info(pc.bold(\"Commands\"));\n\n for (const [name, desc] of COMMANDS) {\n console.log(` ${pc.cyan(name.padEnd(10))}${desc}`);\n }\n\n console.log(\"\");\n p.log.info(`Run ${pc.cyan(\"kalp <command> --help\")} for more info.`);\n}\n\nconst main = defineCommand({\n meta: {\n name: \"kalp\",\n version: pkg.version,\n description: \"🦋 Zero-config agent infrastructure\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n create: () => import(\"./commands/create\").then((r) => r.default),\n push: () => import(\"./commands/push\").then((r) => r.default),\n link: () => import(\"./commands/link\").then((r) => r.default),\n secrets: () => import(\"./commands/secrets\").then((r) => r.default),\n login: () => import(\"./commands/login\").then((r) => r.default),\n logout: () => import(\"./commands/logout\").then((r) => r.default),\n studio: () => import(\"./commands/studio\").then((r) => r.default),\n },\n run({ args }) {\n const firstArg = process.argv[2];\n\n if (args.help) {\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n return;\n }\n\n if (firstArg) {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n },\n});\n\nrunMain(main);\n","{\n \"name\": \"@kalphq/cli\",\n \"version\": \"0.0.0-dev-20260509012111\",\n \"description\": \"Zero-config CLI for deploying Kalp agents\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"author\": \"Kalp HQ\",\n \"bin\": {\n \"kalp\": \"./dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"tsc --noEmit\",\n \"prepublishOnly\": \"pnpm build\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"24.4.0\",\n \"@clack/prompts\": \"0.9.1\",\n \"@kalphq/compiler\": \"workspace:*\",\n \"@kalphq/project\": \"workspace:*\",\n \"@kalphq/sdk\": \"workspace:*\",\n \"citty\": \"0.1.6\",\n \"esbuild\": \"0.25.0\",\n \"jose\": \"^5.10.0\",\n \"json-stable-stringify\": \"1.3.0\",\n \"open\": \"^11.0.0\",\n \"picocolors\": \"1.1.1\",\n \"zod\": \"3.25.76\"\n },\n \"devDependencies\": {\n \"@types/json-stable-stringify\": \"1.2.0\",\n \"@types/node\": \"^22.15.3\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.0.0\"\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -55,16 +55,22 @@ var studio_default = defineCommand({
|
|
|
55
55
|
const { key: secretKey, isNew: isNewSecret } = await ensureSecretKey(cwd);
|
|
56
56
|
s.stop("Authentication secret ready");
|
|
57
57
|
if (isNewSecret) {
|
|
58
|
-
p.log.warning(
|
|
59
|
-
"No KALP_SECRET_KEY found. Generated a new one in .env"
|
|
60
|
-
);
|
|
58
|
+
p.log.warning("No KALP_SECRET_KEY found. Generated a new one in .env");
|
|
61
59
|
p.note(
|
|
62
60
|
"Please run 'kalp push' to sync the new secret with Cloudflare",
|
|
63
61
|
"Action Required"
|
|
64
62
|
);
|
|
65
63
|
}
|
|
66
64
|
const workerUrl = args.url || await readWorkerUrl(cwd);
|
|
67
|
-
|
|
65
|
+
const isDev = !args.url;
|
|
66
|
+
const studioBaseUrl = isDev ? "http://localhost:5173" : workerUrl;
|
|
67
|
+
if (isDev) {
|
|
68
|
+
p.log.info("Using local Studio dev server (http://localhost:5173)");
|
|
69
|
+
p.note(
|
|
70
|
+
"Make sure to run 'pnpm --filter=@kalphq/studio dev' first",
|
|
71
|
+
"Dev Mode"
|
|
72
|
+
);
|
|
73
|
+
} else if (!studioBaseUrl) {
|
|
68
74
|
p.log.error(
|
|
69
75
|
"No worker URL found. Run 'kalp push' first or use --url flag"
|
|
70
76
|
);
|
|
@@ -80,7 +86,12 @@ var studio_default = defineCommand({
|
|
|
80
86
|
// 1 hour
|
|
81
87
|
}).setProtectedHeader({ alg: "HS256" }).sign(secret);
|
|
82
88
|
s.stop("Token generated");
|
|
83
|
-
|
|
89
|
+
let studioUrl;
|
|
90
|
+
if (isDev) {
|
|
91
|
+
studioUrl = `${studioBaseUrl}/?token=${token}`;
|
|
92
|
+
} else {
|
|
93
|
+
studioUrl = studioBaseUrl.replace(/\/a\//, "/studio/a/") + `?token=${token}`;
|
|
94
|
+
}
|
|
84
95
|
p.log.info(`Opening Studio at ${pc.cyan(studioUrl)}`);
|
|
85
96
|
await open(studioUrl);
|
|
86
97
|
p.outro(`${LOGO} ${pc.green("Studio opened")}`);
|
|
@@ -89,4 +100,4 @@ var studio_default = defineCommand({
|
|
|
89
100
|
export {
|
|
90
101
|
studio_default as default
|
|
91
102
|
};
|
|
92
|
-
//# sourceMappingURL=studio-
|
|
103
|
+
//# sourceMappingURL=studio-SSJ27ZHR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/studio.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { SignJWT } from \"jose\";\nimport open from \"open\";\n\nconst LOGO = \"🦋\";\n\n/**\n * Generate KALP_SECRET_KEY if not exists.\n * Returns the key and whether it was newly created.\n */\nasync function ensureSecretKey(\n cwd: string,\n): Promise<{ key: string; isNew: boolean }> {\n const envPath = join(cwd, \".env\");\n\n try {\n const envContent = await readFile(envPath, \"utf-8\");\n const match = envContent.match(/^KALP_SECRET_KEY=(.+)$/m);\n if (match && match[1]) {\n return { key: match[1].trim(), isNew: false };\n }\n } catch {\n // .env doesn't exist, create it\n }\n\n // Generate new secret\n const secretKey = randomBytes(32).toString(\"hex\");\n const envContent = `# Kalp Studio Authentication Secret\nKALP_SECRET_KEY=${secretKey}\n`;\n\n await writeFile(envPath, envContent, \"utf-8\");\n return { key: secretKey, isNew: true };\n}\n\n/**\n * Read worker URL from .kalp/state.json.\n */\nasync function readWorkerUrl(cwd: string): Promise<string | null> {\n try {\n const statePath = join(cwd, \".kalp\", \"state.json\");\n const content = await readFile(statePath, \"utf-8\");\n const state = JSON.parse(content);\n return state.workerUrl || null;\n } catch {\n return null;\n }\n}\n\nexport default defineCommand({\n meta: { name: \"studio\", description: \"Open Kalp Studio in browser\" },\n args: {\n url: {\n type: \"string\",\n alias: \"u\",\n description: \"Worker URL (overrides saved state)\",\n required: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp studio\")}`);\n\n // 1. Ensure KALP_SECRET_KEY exists\n const s = p.spinner();\n s.start(\"Checking authentication secret\");\n\n const { key: secretKey, isNew: isNewSecret } = await ensureSecretKey(cwd);\n\n s.stop(\"Authentication secret ready\");\n\n if (isNewSecret) {\n p.log.warning(\"No KALP_SECRET_KEY found. Generated a new one in .env\");\n p.note(\n \"Please run 'kalp push' to sync the new secret with Cloudflare\",\n \"Action Required\",\n );\n }\n\n // 2. Get worker URL (for production Cloudflare deployment)\n // For development, use the local Studio dev server\n const workerUrl = args.url || (await readWorkerUrl(cwd));\n\n // For local development, use the Studio dev server on port 5173\n // For production, the Studio is embedded in the Cloudflare Worker\n const isDev = !args.url; // If user didn't provide --url, assume dev mode\n const studioBaseUrl = isDev ? \"http://localhost:5173\" : workerUrl;\n\n if (isDev) {\n p.log.info(\"Using local Studio dev server (http://localhost:5173)\");\n p.note(\n \"Make sure to run 'pnpm --filter=@kalphq/studio dev' first\",\n \"Dev Mode\",\n );\n } else if (!studioBaseUrl) {\n p.log.error(\n \"No worker URL found. Run 'kalp push' first or use --url flag\",\n );\n process.exit(1);\n }\n\n // 3. Generate JWT (1 hour expiry)\n s.start(\"Generating authentication token\");\n\n const secret = new TextEncoder().encode(secretKey);\n const token = await new SignJWT({\n sub: \"cli-user\",\n aud: \"kalp-studio\",\n iat: Date.now(),\n exp: Math.floor(Date.now() / 1000) + 3600, // 1 hour\n })\n .setProtectedHeader({ alg: \"HS256\" })\n .sign(secret);\n\n s.stop(\"Token generated\");\n\n // 4. Open browser\n let studioUrl: string;\n if (isDev) {\n // Dev mode: use local Studio dev server\n studioUrl = `${studioBaseUrl}/?token=${token}`;\n } else {\n // Production: construct URL by inserting /studio before /a/agentName\n // workerUrl is like http://localhost:3000/a/support\n // We want http://localhost:3000/studio/a/support\n studioUrl =\n studioBaseUrl!.replace(/\\/a\\//, \"/studio/a/\") + `?token=${token}`;\n }\n p.log.info(`Opening Studio at ${pc.cyan(studioUrl)}`);\n\n await open(studioUrl);\n\n p.outro(`${LOGO} ${pc.green(\"Studio opened\")}`);\n },\n});\n"],"mappings":"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","names":["envContent"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kalphq/cli",
|
|
3
|
-
"version": "0.0.0-dev-
|
|
3
|
+
"version": "0.0.0-dev-20260509012111",
|
|
4
4
|
"description": "Zero-config CLI for deploying Kalp agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
"open": "^11.0.0",
|
|
26
26
|
"picocolors": "1.1.1",
|
|
27
27
|
"zod": "3.25.76",
|
|
28
|
-
"@kalphq/compiler": "0.0.0-dev-
|
|
29
|
-
"@kalphq/
|
|
30
|
-
"@kalphq/
|
|
28
|
+
"@kalphq/compiler": "0.0.0-dev-20260509012111",
|
|
29
|
+
"@kalphq/sdk": "0.0.0-dev-20260509012111",
|
|
30
|
+
"@kalphq/project": "0.0.0-dev-20260509012111"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/json-stable-stringify": "1.2.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/studio.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { SignJWT } from \"jose\";\nimport open from \"open\";\n\nconst LOGO = \"🦋\";\n\n/**\n * Generate KALP_SECRET_KEY if not exists.\n * Returns the key and whether it was newly created.\n */\nasync function ensureSecretKey(cwd: string): Promise<{ key: string, isNew: boolean }> {\n const envPath = join(cwd, \".env\");\n \n try {\n const envContent = await readFile(envPath, \"utf-8\");\n const match = envContent.match(/^KALP_SECRET_KEY=(.+)$/m);\n if (match && match[1]) {\n return { key: match[1].trim(), isNew: false };\n }\n } catch {\n // .env doesn't exist, create it\n }\n\n // Generate new secret\n const secretKey = randomBytes(32).toString(\"hex\");\n const envContent = `# Kalp Studio Authentication Secret\nKALP_SECRET_KEY=${secretKey}\n`;\n \n await writeFile(envPath, envContent, \"utf-8\");\n return { key: secretKey, isNew: true };\n}\n\n/**\n * Read worker URL from .kalp/state.json.\n */\nasync function readWorkerUrl(cwd: string): Promise<string | null> {\n try {\n const statePath = join(cwd, \".kalp\", \"state.json\");\n const content = await readFile(statePath, \"utf-8\");\n const state = JSON.parse(content);\n return state.workerUrl || null;\n } catch {\n return null;\n }\n}\n\nexport default defineCommand({\n meta: { name: \"studio\", description: \"Open Kalp Studio in browser\" },\n args: {\n url: {\n type: \"string\",\n alias: \"u\",\n description: \"Worker URL (overrides saved state)\",\n required: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n \n p.intro(`${LOGO} ${pc.bold(\"kalp studio\")}`);\n\n // 1. Ensure KALP_SECRET_KEY exists\n const s = p.spinner();\n s.start(\"Checking authentication secret\");\n \n const { key: secretKey, isNew: isNewSecret } = await ensureSecretKey(cwd);\n \n s.stop(\"Authentication secret ready\");\n\n if (isNewSecret) {\n p.log.warning(\n \"No KALP_SECRET_KEY found. Generated a new one in .env\"\n );\n p.note(\n \"Please run 'kalp push' to sync the new secret with Cloudflare\",\n \"Action Required\"\n );\n }\n\n // 2. Get worker URL\n const workerUrl = args.url || (await readWorkerUrl(cwd));\n \n if (!workerUrl) {\n p.log.error(\n \"No worker URL found. Run 'kalp push' first or use --url flag\"\n );\n process.exit(1);\n }\n\n // 3. Generate JWT (1 hour expiry)\n s.start(\"Generating authentication token\");\n \n const secret = new TextEncoder().encode(secretKey);\n const token = await new SignJWT({\n sub: \"cli-user\",\n aud: \"kalp-studio\",\n iat: Date.now(),\n exp: Math.floor(Date.now() / 1000) + 3600, // 1 hour\n })\n .setProtectedHeader({ alg: \"HS256\" })\n .sign(secret);\n \n s.stop(\"Token generated\");\n\n // 4. Open browser\n const studioUrl = `${workerUrl}/studio?token=${token}`;\n p.log.info(`Opening Studio at ${pc.cyan(studioUrl)}`);\n \n await open(studioUrl);\n \n p.outro(`${LOGO} ${pc.green(\"Studio opened\")}`);\n },\n});\n"],"mappings":";;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,UAAU,iBAAiB;AACpC,SAAS,YAAY;AACrB,SAAS,mBAAmB;AAC5B,SAAS,eAAe;AACxB,OAAO,UAAU;AAEjB,IAAM,OAAO;AAMb,eAAe,gBAAgB,KAAuD;AACpF,QAAM,UAAU,KAAK,KAAK,MAAM;AAEhC,MAAI;AACF,UAAMA,cAAa,MAAM,SAAS,SAAS,OAAO;AAClD,UAAM,QAAQA,YAAW,MAAM,yBAAyB;AACxD,QAAI,SAAS,MAAM,CAAC,GAAG;AACrB,aAAO,EAAE,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,OAAO,MAAM;AAAA,IAC9C;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,QAAM,YAAY,YAAY,EAAE,EAAE,SAAS,KAAK;AAChD,QAAM,aAAa;AAAA,kBACH,SAAS;AAAA;AAGzB,QAAM,UAAU,SAAS,YAAY,OAAO;AAC5C,SAAO,EAAE,KAAK,WAAW,OAAO,KAAK;AACvC;AAKA,eAAe,cAAc,KAAqC;AAChE,MAAI;AACF,UAAM,YAAY,KAAK,KAAK,SAAS,YAAY;AACjD,UAAM,UAAU,MAAM,SAAS,WAAW,OAAO;AACjD,UAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,WAAO,MAAM,aAAa;AAAA,EAC5B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,8BAA8B;AAAA,EACnE,MAAM;AAAA,IACJ,KAAK;AAAA,MACH,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,aAAa,CAAC,EAAE;AAG3C,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,gCAAgC;AAExC,UAAM,EAAE,KAAK,WAAW,OAAO,YAAY,IAAI,MAAM,gBAAgB,GAAG;AAExE,MAAE,KAAK,6BAA6B;AAEpC,QAAI,aAAa;AACf,MAAE,MAAI;AAAA,QACJ;AAAA,MACF;AACA,MAAE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,YAAY,KAAK,OAAQ,MAAM,cAAc,GAAG;AAEtD,QAAI,CAAC,WAAW;AACd,MAAE,MAAI;AAAA,QACJ;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,MAAE,MAAM,iCAAiC;AAEzC,UAAM,SAAS,IAAI,YAAY,EAAE,OAAO,SAAS;AACjD,UAAM,QAAQ,MAAM,IAAI,QAAQ;AAAA,MAC9B,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,KAAK,IAAI;AAAA,MACd,KAAK,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,IAAI;AAAA;AAAA,IACvC,CAAC,EACE,mBAAmB,EAAE,KAAK,QAAQ,CAAC,EACnC,KAAK,MAAM;AAEd,MAAE,KAAK,iBAAiB;AAGxB,UAAM,YAAY,GAAG,SAAS,iBAAiB,KAAK;AACpD,IAAE,MAAI,KAAK,qBAAqB,GAAG,KAAK,SAAS,CAAC,EAAE;AAEpD,UAAM,KAAK,SAAS;AAEpB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,MAAM,eAAe,CAAC,EAAE;AAAA,EAChD;AACF,CAAC;","names":["envContent"]}
|