@kalphq/cli 0.0.0-dev-20260513002723 → 0.0.0-dev-20260513005156

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.
Files changed (49) hide show
  1. package/dist/add-NDU352FV.js +124 -0
  2. package/dist/add-NDU352FV.js.map +1 -0
  3. package/dist/chunk-5ZRVO3TQ.js +70 -0
  4. package/dist/chunk-5ZRVO3TQ.js.map +1 -0
  5. package/dist/{chunk-GW6MLHK7.js → chunk-DHCCSWJN.js} +48 -145
  6. package/dist/chunk-DHCCSWJN.js.map +1 -0
  7. package/dist/{chunk-TNKYKA7N.js → chunk-GNQI376N.js} +118 -18
  8. package/dist/chunk-GNQI376N.js.map +1 -0
  9. package/dist/chunk-NV2IZ4XM.js +102 -0
  10. package/dist/chunk-NV2IZ4XM.js.map +1 -0
  11. package/dist/{chunk-TY5UW4IZ.js → chunk-X56YSZGT.js} +43 -8
  12. package/dist/chunk-X56YSZGT.js.map +1 -0
  13. package/dist/delete-DY5FQAHW.js +127 -0
  14. package/dist/delete-DY5FQAHW.js.map +1 -0
  15. package/dist/{deploy-TX6SP5M4.js → deploy-AD3F3BN7.js} +27 -22
  16. package/dist/deploy-AD3F3BN7.js.map +1 -0
  17. package/dist/{dev-APJ32K2Y.js → dev-X43HHIYV.js} +5 -3
  18. package/dist/{dev-APJ32K2Y.js.map → dev-X43HHIYV.js.map} +1 -1
  19. package/dist/index.js +6 -8
  20. package/dist/index.js.map +1 -1
  21. package/dist/list-4X735L5X.js +90 -0
  22. package/dist/list-4X735L5X.js.map +1 -0
  23. package/dist/{login-DGX55YZ6.js → login-RAN2I7YT.js} +3 -5
  24. package/dist/{login-DGX55YZ6.js.map → login-RAN2I7YT.js.map} +1 -1
  25. package/dist/{push-APZG653E.js → push-RA6GEUV4.js} +21 -10
  26. package/dist/push-RA6GEUV4.js.map +1 -0
  27. package/dist/{secrets-P7ADVLOS.js → secrets-5ZPPASCH.js} +10 -10
  28. package/dist/secrets-5ZPPASCH.js.map +1 -0
  29. package/dist/sync-2NLWWGI2.js +69 -0
  30. package/dist/sync-2NLWWGI2.js.map +1 -0
  31. package/package.json +4 -4
  32. package/dist/add-XTXSSGC5.js +0 -139
  33. package/dist/add-XTXSSGC5.js.map +0 -1
  34. package/dist/chunk-5RODADXW.js +0 -65
  35. package/dist/chunk-5RODADXW.js.map +0 -1
  36. package/dist/chunk-GW6MLHK7.js.map +0 -1
  37. package/dist/chunk-TNKYKA7N.js.map +0 -1
  38. package/dist/chunk-TY5UW4IZ.js.map +0 -1
  39. package/dist/delete-N4OSUK3X.js +0 -145
  40. package/dist/delete-N4OSUK3X.js.map +0 -1
  41. package/dist/deploy-TX6SP5M4.js.map +0 -1
  42. package/dist/link-WZQSR2TM.js +0 -36
  43. package/dist/link-WZQSR2TM.js.map +0 -1
  44. package/dist/list-VMJPWHIH.js +0 -120
  45. package/dist/list-VMJPWHIH.js.map +0 -1
  46. package/dist/push-APZG653E.js.map +0 -1
  47. package/dist/secrets-P7ADVLOS.js.map +0 -1
  48. package/dist/sync-OTO44GQS.js +0 -121
  49. package/dist/sync-OTO44GQS.js.map +0 -1
@@ -0,0 +1,124 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ generateTypes
4
+ } from "./chunk-MMS3GWBG.js";
5
+ import {
6
+ mergeSecrets,
7
+ readLocalSecretsFromConfig,
8
+ resolveSecretsRuntimeConfigPath,
9
+ writeLocalSecretsToConfig
10
+ } from "./chunk-5ZRVO3TQ.js";
11
+ import "./chunk-INB3LG6O.js";
12
+ import {
13
+ requireAuth,
14
+ resolveProvider
15
+ } from "./chunk-GNQI376N.js";
16
+ import "./chunk-FO24J6XL.js";
17
+ import "./chunk-DHCCSWJN.js";
18
+
19
+ // src/commands/secrets/add.ts
20
+ import { defineCommand } from "citty";
21
+ import * as p from "@clack/prompts";
22
+ import pc from "picocolors";
23
+ var LOGO = "\u{1F98B}";
24
+ var add_default = defineCommand({
25
+ meta: {
26
+ name: "add",
27
+ description: "Add a secret to remote runtime and local config"
28
+ },
29
+ args: {
30
+ key: {
31
+ type: "string",
32
+ alias: "k",
33
+ description: "Secret key (UPPER_SNAKE_CASE)"
34
+ },
35
+ value: {
36
+ type: "string",
37
+ alias: "v",
38
+ description: "Secret value"
39
+ },
40
+ help: {
41
+ type: "boolean",
42
+ alias: "h",
43
+ description: "Show help",
44
+ default: false
45
+ }
46
+ },
47
+ async run({ args }) {
48
+ const cwd = process.cwd();
49
+ if (args.help) {
50
+ p.log.info(`${pc.bold("Usage")}: kalp secrets add -k <KEY> -v <VALUE>`);
51
+ return;
52
+ }
53
+ p.intro(`${LOGO} ${pc.bold("kalp secrets add")}`);
54
+ await requireAuth().catch(() => {
55
+ p.log.error("Not authenticated. Run `kalp login` first.");
56
+ process.exit(1);
57
+ });
58
+ let key = args.key?.trim();
59
+ let value = args.value;
60
+ if (!key) {
61
+ const input = await p.text({
62
+ message: "Secret key name",
63
+ placeholder: "STRIPE_SECRET_KEY",
64
+ validate: (v) => {
65
+ if (!v) return "Key is required";
66
+ if (!/^[A-Z_][A-Z0-9_]*$/.test(v)) {
67
+ return "Key must be UPPER_SNAKE_CASE";
68
+ }
69
+ }
70
+ });
71
+ if (p.isCancel(input)) {
72
+ p.outro("Cancelled");
73
+ return;
74
+ }
75
+ key = String(input).trim();
76
+ }
77
+ if (!/^[A-Z_][A-Z0-9_]*$/.test(key)) {
78
+ p.log.error("Invalid key. Use UPPER_SNAKE_CASE.");
79
+ process.exit(1);
80
+ }
81
+ if (!value) {
82
+ const input = await p.password({
83
+ message: `Enter value for ${key}`,
84
+ mask: "*"
85
+ });
86
+ if (p.isCancel(input)) {
87
+ p.outro("Cancelled");
88
+ return;
89
+ }
90
+ value = String(input);
91
+ }
92
+ const trimmedValue = value.trim();
93
+ if (!trimmedValue) {
94
+ p.log.error("Secret value cannot be empty.");
95
+ process.exit(1);
96
+ }
97
+ const spinner2 = p.spinner();
98
+ spinner2.start(`Adding ${pc.cyan(key)} to remote runtime`);
99
+ try {
100
+ const configPath = await resolveSecretsRuntimeConfigPath(cwd);
101
+ const provider = resolveProvider();
102
+ await provider.putSecret({
103
+ cwd,
104
+ configPath,
105
+ name: key,
106
+ value: trimmedValue
107
+ });
108
+ const localSecrets = await readLocalSecretsFromConfig(cwd);
109
+ const merged = mergeSecrets(localSecrets, [key]);
110
+ await writeLocalSecretsToConfig(cwd, merged);
111
+ await generateTypes(cwd);
112
+ spinner2.stop(`Secret ${pc.cyan(key)} added`);
113
+ p.outro("Done");
114
+ } catch (error) {
115
+ spinner2.stop("Failed to add secret");
116
+ p.log.error(error instanceof Error ? error.message : String(error));
117
+ process.exit(1);
118
+ }
119
+ }
120
+ });
121
+ export {
122
+ add_default as default
123
+ };
124
+ //# sourceMappingURL=add-NDU352FV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/secrets/add.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { generateTypes } from \"@/utils/codegen\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport {\n mergeSecrets,\n readLocalSecretsFromConfig,\n writeLocalSecretsToConfig,\n} from \"@/utils/secrets-config\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"add\",\n description: \"Add a secret to remote runtime and local config\",\n },\n args: {\n key: {\n type: \"string\",\n alias: \"k\",\n description: \"Secret key (UPPER_SNAKE_CASE)\",\n },\n value: {\n type: \"string\",\n alias: \"v\",\n description: \"Secret value\",\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp secrets add -k <KEY> -v <VALUE>`);\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets add\")}`);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n let key = args.key?.trim();\n let value = args.value;\n\n if (!key) {\n const input = await p.text({\n message: \"Secret key name\",\n placeholder: \"STRIPE_SECRET_KEY\",\n validate: (v) => {\n if (!v) return \"Key is required\";\n if (!/^[A-Z_][A-Z0-9_]*$/.test(v)) {\n return \"Key must be UPPER_SNAKE_CASE\";\n }\n },\n });\n if (p.isCancel(input)) {\n p.outro(\"Cancelled\");\n return;\n }\n key = String(input).trim();\n }\n\n if (!/^[A-Z_][A-Z0-9_]*$/.test(key)) {\n p.log.error(\"Invalid key. Use UPPER_SNAKE_CASE.\");\n process.exit(1);\n }\n\n if (!value) {\n const input = await p.password({\n message: `Enter value for ${key}`,\n mask: \"*\",\n });\n if (p.isCancel(input)) {\n p.outro(\"Cancelled\");\n return;\n }\n value = String(input);\n }\n\n const trimmedValue = value.trim();\n if (!trimmedValue) {\n p.log.error(\"Secret value cannot be empty.\");\n process.exit(1);\n }\n\n const spinner = p.spinner();\n spinner.start(`Adding ${pc.cyan(key)} to remote runtime`);\n\n try {\n const configPath = await resolveSecretsRuntimeConfigPath(cwd);\n const provider = resolveProvider();\n await provider.putSecret({\n cwd,\n configPath,\n name: key,\n value: trimmedValue,\n });\n\n const localSecrets = await readLocalSecretsFromConfig(cwd);\n const merged = mergeSecrets(localSecrets, [key]);\n await writeLocalSecretsToConfig(cwd, merged);\n await generateTypes(cwd);\n\n spinner.stop(`Secret ${pc.cyan(key)} added`);\n p.outro(\"Done\");\n } catch (error) {\n spinner.stop(\"Failed to add secret\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["spinner"]}
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ensureConfig
4
+ } from "./chunk-INB3LG6O.js";
5
+ import {
6
+ materializeRuntime,
7
+ readProjectState
8
+ } from "./chunk-DHCCSWJN.js";
9
+
10
+ // src/utils/secrets-config.ts
11
+ import { readFile, writeFile } from "fs/promises";
12
+ import { join } from "path";
13
+ var SECRETS_ARRAY_REGEX = /secrets:\s*\[([\s\S]*?)\]/m;
14
+ var SECRET_LITERAL_REGEX = /["'`]([^"'`]+)["'`]/g;
15
+ async function readLocalSecretsFromConfig(cwd) {
16
+ const configPath = join(cwd, "kalp.config.ts");
17
+ const content = await readFile(configPath, "utf-8").catch(() => {
18
+ throw new Error("kalp.config.ts not found. Run create-kalp first.");
19
+ });
20
+ const match = content.match(SECRETS_ARRAY_REGEX);
21
+ if (!match) return [];
22
+ const body = match[1] ?? "";
23
+ const values = [];
24
+ let item;
25
+ while ((item = SECRET_LITERAL_REGEX.exec(body)) !== null) {
26
+ if (item[1]) values.push(item[1]);
27
+ }
28
+ return [...new Set(values)].sort((a, b) => a.localeCompare(b));
29
+ }
30
+ async function writeLocalSecretsToConfig(cwd, secrets) {
31
+ const configPath = join(cwd, "kalp.config.ts");
32
+ const content = await readFile(configPath, "utf-8").catch(() => {
33
+ throw new Error("kalp.config.ts not found. Run create-kalp first.");
34
+ });
35
+ if (!SECRETS_ARRAY_REGEX.test(content)) {
36
+ throw new Error(
37
+ "Could not find `secrets: []` in kalp.config.ts. Add a secrets array first."
38
+ );
39
+ }
40
+ const sorted = [...new Set(secrets)].map((value) => value.trim()).filter(Boolean).sort((a, b) => a.localeCompare(b));
41
+ const serialized = sorted.length > 0 ? sorted.map((secret) => `"${secret}"`).join(", ") : "";
42
+ const next = content.replace(SECRETS_ARRAY_REGEX, `secrets: [${serialized}]`);
43
+ await writeFile(configPath, next, "utf-8");
44
+ }
45
+ function mergeSecrets(base, incoming) {
46
+ return [...new Set([...base, ...incoming].map((value) => value.trim()).filter(Boolean))].sort((a, b) => a.localeCompare(b));
47
+ }
48
+
49
+ // src/utils/secrets-runtime.ts
50
+ async function resolveSecretsRuntimeConfigPath(cwd) {
51
+ await ensureConfig(cwd).catch(() => {
52
+ throw new Error("kalp.config.ts not found.");
53
+ });
54
+ const state = await readProjectState(cwd);
55
+ if (!state?.workerUrl) {
56
+ throw new Error(
57
+ "No remote runtime found for this project. Run `kalp deploy` first."
58
+ );
59
+ }
60
+ const runtime = await materializeRuntime(cwd, { mode: "remote" });
61
+ return runtime.wranglerConfigPath;
62
+ }
63
+
64
+ export {
65
+ readLocalSecretsFromConfig,
66
+ writeLocalSecretsToConfig,
67
+ mergeSecrets,
68
+ resolveSecretsRuntimeConfigPath
69
+ };
70
+ //# sourceMappingURL=chunk-5ZRVO3TQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/secrets-config.ts","../src/utils/secrets-runtime.ts"],"sourcesContent":["import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nconst SECRETS_ARRAY_REGEX = /secrets:\\s*\\[([\\s\\S]*?)\\]/m;\nconst SECRET_LITERAL_REGEX = /[\"'`]([^\"'`]+)[\"'`]/g;\n\nexport async function readLocalSecretsFromConfig(cwd: string): Promise<string[]> {\n const configPath = join(cwd, \"kalp.config.ts\");\n const content = await readFile(configPath, \"utf-8\").catch(() => {\n throw new Error(\"kalp.config.ts not found. Run create-kalp first.\");\n });\n\n const match = content.match(SECRETS_ARRAY_REGEX);\n if (!match) return [];\n const body = match[1] ?? \"\";\n const values: string[] = [];\n let item: RegExpExecArray | null;\n while ((item = SECRET_LITERAL_REGEX.exec(body)) !== null) {\n if (item[1]) values.push(item[1]);\n }\n return [...new Set(values)].sort((a, b) => a.localeCompare(b));\n}\n\nexport async function writeLocalSecretsToConfig(\n cwd: string,\n secrets: string[],\n): Promise<void> {\n const configPath = join(cwd, \"kalp.config.ts\");\n const content = await readFile(configPath, \"utf-8\").catch(() => {\n throw new Error(\"kalp.config.ts not found. Run create-kalp first.\");\n });\n\n if (!SECRETS_ARRAY_REGEX.test(content)) {\n throw new Error(\n \"Could not find `secrets: []` in kalp.config.ts. Add a secrets array first.\",\n );\n }\n\n const sorted = [...new Set(secrets)]\n .map((value) => value.trim())\n .filter(Boolean)\n .sort((a, b) => a.localeCompare(b));\n\n const serialized =\n sorted.length > 0 ? sorted.map((secret) => `\"${secret}\"`).join(\", \") : \"\";\n const next = content.replace(SECRETS_ARRAY_REGEX, `secrets: [${serialized}]`);\n await writeFile(configPath, next, \"utf-8\");\n}\n\nexport function mergeSecrets(\n base: string[],\n incoming: string[],\n): string[] {\n return [...new Set([...base, ...incoming].map((value) => value.trim()).filter(Boolean))]\n .sort((a, b) => a.localeCompare(b));\n}\n","import { ensureConfig } from \"@/utils/fs\";\nimport { readProjectState } from \"@/utils/project-state\";\nimport { materializeRuntime } from \"@/utils/runtime\";\n\nexport async function resolveSecretsRuntimeConfigPath(cwd: string): Promise<string> {\n await ensureConfig(cwd).catch(() => {\n throw new Error(\"kalp.config.ts not found.\");\n });\n\n const state = await readProjectState(cwd);\n if (!state?.workerUrl) {\n throw new Error(\n \"No remote runtime found for this project. Run `kalp deploy` first.\",\n );\n }\n\n const runtime = await materializeRuntime(cwd, { mode: \"remote\" });\n return runtime.wranglerConfigPath;\n}\n"],"mappings":";;;;;;;;;;AAAA,SAAS,UAAU,iBAAiB;AACpC,SAAS,YAAY;AAErB,IAAM,sBAAsB;AAC5B,IAAM,uBAAuB;AAE7B,eAAsB,2BAA2B,KAAgC;AAC/E,QAAM,aAAa,KAAK,KAAK,gBAAgB;AAC7C,QAAM,UAAU,MAAM,SAAS,YAAY,OAAO,EAAE,MAAM,MAAM;AAC9D,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE,CAAC;AAED,QAAM,QAAQ,QAAQ,MAAM,mBAAmB;AAC/C,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,QAAM,OAAO,MAAM,CAAC,KAAK;AACzB,QAAM,SAAmB,CAAC;AAC1B,MAAI;AACJ,UAAQ,OAAO,qBAAqB,KAAK,IAAI,OAAO,MAAM;AACxD,QAAI,KAAK,CAAC,EAAG,QAAO,KAAK,KAAK,CAAC,CAAC;AAAA,EAClC;AACA,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAC/D;AAEA,eAAsB,0BACpB,KACA,SACe;AACf,QAAM,aAAa,KAAK,KAAK,gBAAgB;AAC7C,QAAM,UAAU,MAAM,SAAS,YAAY,OAAO,EAAE,MAAM,MAAM;AAC9D,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE,CAAC;AAED,MAAI,CAAC,oBAAoB,KAAK,OAAO,GAAG;AACtC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,EAChC,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO,EACd,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAEpC,QAAM,aACJ,OAAO,SAAS,IAAI,OAAO,IAAI,CAAC,WAAW,IAAI,MAAM,GAAG,EAAE,KAAK,IAAI,IAAI;AACzE,QAAM,OAAO,QAAQ,QAAQ,qBAAqB,aAAa,UAAU,GAAG;AAC5E,QAAM,UAAU,YAAY,MAAM,OAAO;AAC3C;AAEO,SAAS,aACd,MACA,UACU;AACV,SAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,MAAM,GAAG,QAAQ,EAAE,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC,EACpF,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AACtC;;;ACnDA,eAAsB,gCAAgC,KAA8B;AAClF,QAAM,aAAa,GAAG,EAAE,MAAM,MAAM;AAClC,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C,CAAC;AAED,QAAM,QAAQ,MAAM,iBAAiB,GAAG;AACxC,MAAI,CAAC,OAAO,WAAW;AACrB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,mBAAmB,KAAK,EAAE,MAAM,SAAS,CAAC;AAChE,SAAO,QAAQ;AACjB;","names":[]}
@@ -1,103 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // src/utils/secret.ts
4
- import { randomBytes } from "crypto";
5
- import { readFile, writeFile } from "fs/promises";
6
- import { join } from "path";
7
- var SECRET_KEY = "KALP_SECRET_KEY";
8
- var STUDIO_PASSWORD = "KALP_STUDIO_PASSWORD";
9
- var STUDIO_ADMIN_USER = "KALP_STUDIO_ADMIN_USER";
10
- var SERVICE_KEY = "KALP_SERVICE_KEY";
11
- function escapeRegExp(value) {
12
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
13
- }
14
- function parseEnv(content) {
15
- const result = {};
16
- for (const line of content.split(/\r?\n/g)) {
17
- const trimmed = line.trim();
18
- if (!trimmed || trimmed.startsWith("#")) continue;
19
- const eqIndex = trimmed.indexOf("=");
20
- if (eqIndex <= 0) continue;
21
- const key = trimmed.slice(0, eqIndex).trim();
22
- const value = trimmed.slice(eqIndex + 1).trim();
23
- result[key] = value;
24
- }
25
- return result;
26
- }
27
- function applyEnvUpdates(content, updates) {
28
- let next = content;
29
- for (const [key, value] of Object.entries(updates)) {
30
- const line = `${key}=${value}`;
31
- const pattern = new RegExp(`^${escapeRegExp(key)}=.*$`, "m");
32
- if (pattern.test(next)) {
33
- next = next.replace(pattern, line);
34
- continue;
35
- }
36
- const trimmed = next.trimEnd();
37
- next = trimmed.length > 0 ? `${trimmed}
38
- ${line}
39
- ` : `${line}
40
- `;
41
- }
42
- return next.trimEnd() + "\n";
43
- }
44
- async function readEnvFile(cwd) {
45
- const envPath = join(cwd, ".env");
46
- try {
47
- return await readFile(envPath, "utf-8");
48
- } catch {
49
- return "";
50
- }
51
- }
52
- async function readDevVarsFile(cwd) {
53
- const devVarsPath = join(cwd, ".dev.vars");
54
- try {
55
- return await readFile(devVarsPath, "utf-8");
56
- } catch {
57
- return "";
58
- }
59
- }
60
- function generateStudioPassword() {
61
- return randomBytes(24).toString("base64url");
62
- }
63
- function generateServiceKey() {
64
- return `kalp_sk_live_${randomBytes(32).toString("base64url")}`;
65
- }
66
- async function ensureStudioSecrets(cwd) {
67
- const envPath = join(cwd, ".env");
68
- const devVarsPath = join(cwd, ".dev.vars");
69
- const content = await readEnvFile(cwd);
70
- const parsed = parseEnv(content);
71
- const key = parsed[SECRET_KEY]?.trim() || randomBytes(32).toString("hex");
72
- const studioPassword = parsed[STUDIO_PASSWORD]?.trim() || generateStudioPassword();
73
- const studioAdminUser = parsed[STUDIO_ADMIN_USER]?.trim() || "admin";
74
- const serviceKey = parsed[SERVICE_KEY]?.trim() || generateServiceKey();
75
- const isNew = !parsed[SECRET_KEY]?.trim() || !parsed[STUDIO_PASSWORD]?.trim() || !parsed[STUDIO_ADMIN_USER]?.trim() || !parsed[SERVICE_KEY]?.trim();
76
- const next = applyEnvUpdates(content, {
77
- [SECRET_KEY]: key,
78
- [STUDIO_PASSWORD]: studioPassword,
79
- [STUDIO_ADMIN_USER]: studioAdminUser,
80
- [SERVICE_KEY]: serviceKey
81
- });
82
- await writeFile(envPath, next, "utf-8");
83
- const devVarsContent = await readDevVarsFile(cwd);
84
- const nextDevVars = applyEnvUpdates(devVarsContent, {
85
- [SECRET_KEY]: key,
86
- [STUDIO_PASSWORD]: studioPassword,
87
- [STUDIO_ADMIN_USER]: studioAdminUser,
88
- [SERVICE_KEY]: serviceKey
89
- });
90
- await writeFile(devVarsPath, nextDevVars, "utf-8");
91
- return { key, studioPassword, studioAdminUser, serviceKey, isNew };
92
- }
93
- async function ensureSecretKey(cwd) {
94
- const secrets = await ensureStudioSecrets(cwd);
95
- return { key: secrets.key, isNew: secrets.isNew };
96
- }
97
-
98
3
  // src/utils/project-state.ts
99
- import { mkdir, readFile as readFile2, writeFile as writeFile2 } from "fs/promises";
100
- import { join as join2 } from "path";
4
+ import { mkdir, readFile, writeFile } from "fs/promises";
5
+ import { join } from "path";
101
6
  var KALP_DIR = ".kalp";
102
7
  var STATE_FILE = "state.json";
103
8
  function normalizeProjectState(raw) {
@@ -138,17 +43,17 @@ function normalizeProjectState(raw) {
138
43
  }
139
44
  async function readProjectState(cwd) {
140
45
  try {
141
- const statePath = join2(cwd, KALP_DIR, STATE_FILE);
142
- const content = await readFile2(statePath, "utf-8");
46
+ const statePath = join(cwd, KALP_DIR, STATE_FILE);
47
+ const content = await readFile(statePath, "utf-8");
143
48
  return normalizeProjectState(JSON.parse(content));
144
49
  } catch {
145
50
  return null;
146
51
  }
147
52
  }
148
53
  async function writeProjectState(cwd, state) {
149
- const dir = join2(cwd, KALP_DIR);
54
+ const dir = join(cwd, KALP_DIR);
150
55
  await mkdir(dir, { recursive: true });
151
- await writeFile2(join2(dir, STATE_FILE), `${JSON.stringify(state, null, 2)}
56
+ await writeFile(join(dir, STATE_FILE), `${JSON.stringify(state, null, 2)}
152
57
  `, "utf-8");
153
58
  }
154
59
 
@@ -159,19 +64,19 @@ import {
159
64
  cp,
160
65
  mkdir as mkdir2,
161
66
  readdir,
162
- readFile as readFile4,
67
+ readFile as readFile3,
163
68
  rm,
164
69
  stat,
165
- writeFile as writeFile4
70
+ writeFile as writeFile3
166
71
  } from "fs/promises";
167
- import { basename, dirname, join as join6, resolve as resolve2 } from "path";
72
+ import { basename, dirname, join as join5, resolve as resolve2 } from "path";
168
73
  import { fileURLToPath } from "url";
169
74
  import { deriveLabelFromName } from "@kalphq/project";
170
75
 
171
76
  // src/utils/ai.ts
172
- import { access, readFile as readFile3 } from "fs/promises";
77
+ import { access, readFile as readFile2 } from "fs/promises";
173
78
  import { constants } from "fs";
174
- import { join as join3 } from "path";
79
+ import { join as join2 } from "path";
175
80
  import { createJiti } from "jiti";
176
81
  var PROVIDER_SECRET_MAP = {
177
82
  openai: "OPENAI_API_KEY",
@@ -179,7 +84,7 @@ var PROVIDER_SECRET_MAP = {
179
84
  openrouter: "OPENROUTER_API_KEY",
180
85
  custom: "CUSTOM_AI_API_KEY"
181
86
  };
182
- function parseEnv2(content) {
87
+ function parseEnv(content) {
183
88
  const env = {};
184
89
  for (const raw of content.split(/\r?\n/g)) {
185
90
  const line = raw.trim();
@@ -191,7 +96,7 @@ function parseEnv2(content) {
191
96
  return env;
192
97
  }
193
98
  async function resolveProviderFromConfig(cwd) {
194
- const configPath = join3(cwd, "kalp.config.ts");
99
+ const configPath = join2(cwd, "kalp.config.ts");
195
100
  await access(configPath, constants.F_OK);
196
101
  const jiti = createJiti(cwd, { interopDefault: true });
197
102
  const config = await jiti.import(configPath);
@@ -199,9 +104,9 @@ async function resolveProviderFromConfig(cwd) {
199
104
  return provider;
200
105
  }
201
106
  async function readDotEnv(cwd) {
202
- const envPath = join3(cwd, ".env");
203
- const content = await readFile3(envPath, "utf-8").catch(() => "");
204
- return parseEnv2(content);
107
+ const envPath = join2(cwd, ".env");
108
+ const content = await readFile2(envPath, "utf-8").catch(() => "");
109
+ return parseEnv(content);
205
110
  }
206
111
  function getRequiredSecretForProvider(provider) {
207
112
  return PROVIDER_SECRET_MAP[provider];
@@ -211,7 +116,7 @@ function getRequiredSecretForProvider(provider) {
211
116
  import { createJiti as createJiti2 } from "jiti";
212
117
  import { access as access2 } from "fs/promises";
213
118
  import { constants as constants2 } from "fs";
214
- import { join as join4, resolve } from "path";
119
+ import { join as join3, resolve } from "path";
215
120
  function normalizeStrategy(strategy) {
216
121
  if (!strategy) return null;
217
122
  if (strategy.type === "jwks") {
@@ -235,7 +140,7 @@ function normalizeStrategy(strategy) {
235
140
  };
236
141
  }
237
142
  async function loadProjectConfig(cwd) {
238
- const configPath = resolve(join4(cwd, "kalp.config.ts"));
143
+ const configPath = resolve(join3(cwd, "kalp.config.ts"));
239
144
  await access2(configPath, constants2.F_OK);
240
145
  const jiti = createJiti2(cwd, { interopDefault: true });
241
146
  const moduleValue = await jiti.import(configPath);
@@ -278,8 +183,8 @@ function resolveIdentityAuthRequirements(identity) {
278
183
 
279
184
  // src/utils/runtime-identity.ts
280
185
  import { build } from "esbuild";
281
- import { writeFile as writeFile3 } from "fs/promises";
282
- import { join as join5 } from "path";
186
+ import { writeFile as writeFile2 } from "fs/promises";
187
+ import { join as join4 } from "path";
283
188
  var DEFAULT_IDENTITY_MAP_SOURCE = `export default function mapIdentity(payload) {
284
189
  const sub =
285
190
  payload && typeof payload === "object" && typeof payload.sub === "string"
@@ -307,7 +212,7 @@ function assertEdgeSafeSource(mapIdentitySource) {
307
212
  );
308
213
  }
309
214
  async function writeDefaultIdentityMap(identityMapPath) {
310
- await writeFile3(identityMapPath, DEFAULT_IDENTITY_MAP_SOURCE, "utf-8");
215
+ await writeFile2(identityMapPath, DEFAULT_IDENTITY_MAP_SOURCE, "utf-8");
311
216
  }
312
217
  async function bundleIdentityMap(params) {
313
218
  const { cwd, mapIdentitySource, identityMapPath } = params;
@@ -353,8 +258,8 @@ export default mapIdentity;
353
258
  }
354
259
  async function materializeRuntimeIdentity(params) {
355
260
  const { cwd, runtimeDir } = params;
356
- const identityConfigPath = join5(runtimeDir, "identity.config.json");
357
- const identityMapPath = join5(runtimeDir, "identity.map.mjs");
261
+ const identityConfigPath = join4(runtimeDir, "identity.config.json");
262
+ const identityMapPath = join4(runtimeDir, "identity.map.mjs");
358
263
  let rawConfig = {};
359
264
  try {
360
265
  const loaded = await loadProjectConfig(cwd);
@@ -363,7 +268,7 @@ async function materializeRuntimeIdentity(params) {
363
268
  rawConfig = {};
364
269
  }
365
270
  const identityConfig = resolveRuntimeIdentityConfig(rawConfig);
366
- await writeFile3(
271
+ await writeFile2(
367
272
  identityConfigPath,
368
273
  `${JSON.stringify(identityConfig, null, 2)}
369
274
  `,
@@ -400,9 +305,9 @@ function sanitizeSegment(input) {
400
305
  }
401
306
  async function resolveProjectSlug(cwd) {
402
307
  const fallback = sanitizeSegment(basename(cwd)) || "agent";
403
- const packageJsonPath = join6(cwd, "package.json");
308
+ const packageJsonPath = join5(cwd, "package.json");
404
309
  try {
405
- const content = await readFile4(packageJsonPath, "utf-8");
310
+ const content = await readFile3(packageJsonPath, "utf-8");
406
311
  const pkg = JSON.parse(content);
407
312
  const name = typeof pkg.name === "string" ? pkg.name : "";
408
313
  const sanitized = sanitizeSegment(name);
@@ -480,20 +385,20 @@ function runtimeTemplateCandidates() {
480
385
  );
481
386
  return [
482
387
  {
483
- studioTemplateDir: join6(distTemplateRoot, STUDIO_DIR),
484
- workerEntryPath: join6(distTemplateRoot, WORKER_ENTRY_FILE)
388
+ studioTemplateDir: join5(distTemplateRoot, STUDIO_DIR),
389
+ workerEntryPath: join5(distTemplateRoot, WORKER_ENTRY_FILE)
485
390
  },
486
391
  {
487
- studioTemplateDir: join6(packageRootTemplate, STUDIO_DIR),
488
- workerEntryPath: join6(packageRootTemplate, WORKER_ENTRY_FILE)
392
+ studioTemplateDir: join5(packageRootTemplate, STUDIO_DIR),
393
+ workerEntryPath: join5(packageRootTemplate, WORKER_ENTRY_FILE)
489
394
  },
490
395
  {
491
- studioTemplateDir: join6(sourceTemplateRoot, STUDIO_DIR),
492
- workerEntryPath: join6(sourceTemplateRoot, WORKER_ENTRY_FILE)
396
+ studioTemplateDir: join5(sourceTemplateRoot, STUDIO_DIR),
397
+ workerEntryPath: join5(sourceTemplateRoot, WORKER_ENTRY_FILE)
493
398
  },
494
399
  {
495
400
  studioTemplateDir: monorepoStudioDist,
496
- workerEntryPath: join6(sourceTemplateRoot, WORKER_ENTRY_FILE)
401
+ workerEntryPath: join5(sourceTemplateRoot, WORKER_ENTRY_FILE)
497
402
  }
498
403
  ];
499
404
  }
@@ -528,13 +433,13 @@ ${cssLinks}
528
433
  `;
529
434
  }
530
435
  async function ensureStudioIndex(studioDir) {
531
- const indexPath = join6(studioDir, "index.html");
436
+ const indexPath = join5(studioDir, "index.html");
532
437
  try {
533
438
  await access3(indexPath);
534
439
  return;
535
440
  } catch {
536
441
  }
537
- const assetsDir = join6(studioDir, "assets");
442
+ const assetsDir = join5(studioDir, "assets");
538
443
  const assetFiles = await readdir(assetsDir);
539
444
  const entryScript = assetFiles.find((file) => /^index-.*\.js$/i.test(file)) ?? assetFiles.find((file) => file.endsWith(".js"));
540
445
  if (!entryScript) {
@@ -544,16 +449,16 @@ async function ensureStudioIndex(studioDir) {
544
449
  }
545
450
  const cssFiles = assetFiles.filter((file) => file.endsWith(".css")).sort();
546
451
  const html = createStudioShell(entryScript, cssFiles);
547
- await writeFile4(indexPath, html, "utf-8");
452
+ await writeFile3(indexPath, html, "utf-8");
548
453
  }
549
454
  async function readLocalAgentNames(cwd) {
550
- const agentsDir = join6(cwd, "agents");
455
+ const agentsDir = join5(cwd, "agents");
551
456
  try {
552
457
  const entries = await readdir(agentsDir, { withFileTypes: true });
553
458
  const names = [];
554
459
  for (const entry of entries) {
555
460
  if (!entry.isDirectory()) continue;
556
- const indexPath = join6(agentsDir, entry.name, "index.ts");
461
+ const indexPath = join5(agentsDir, entry.name, "index.ts");
557
462
  const exists = await stat(indexPath).then(() => true).catch(() => false);
558
463
  if (exists) names.push(entry.name);
559
464
  }
@@ -568,7 +473,7 @@ async function createAgentsSnapshot(cwd, mode) {
568
473
  const byName = /* @__PURE__ */ new Map();
569
474
  const stateAgents = state?.agents ?? {};
570
475
  for (const name of localAgentNames) {
571
- const localPath = join6(cwd, "agents", name, "index.ts");
476
+ const localPath = join5(cwd, "agents", name, "index.ts");
572
477
  const saved = stateAgents[name];
573
478
  const hasRemoteVersion = !!saved?.lastRemoteHash && (saved?.currentVersion ?? 0) > 0;
574
479
  if (mode === "remote" && !hasRemoteVersion) {
@@ -596,7 +501,7 @@ async function createAgentsSnapshot(cwd, mode) {
596
501
  for (const [name, saved] of Object.entries(stateAgents)) {
597
502
  const hasRemoteVersion = !!saved.lastRemoteHash && (saved.currentVersion ?? 0) > 0;
598
503
  if (!hasRemoteVersion || byName.has(name)) continue;
599
- const localPath = saved.localPath ?? join6(cwd, "agents", name, "index.ts");
504
+ const localPath = saved.localPath ?? join5(cwd, "agents", name, "index.ts");
600
505
  const workerUrl = saved.workerUrl ?? (state?.workerUrl ? `${state.workerUrl.replace(/\/$/, "")}/a/${name}` : null);
601
506
  const versionNumber = saved.currentVersion > 0 ? saved.currentVersion : null;
602
507
  byName.set(name, {
@@ -626,8 +531,8 @@ async function createAgentsSnapshot(cwd, mode) {
626
531
  }
627
532
  async function writeRuntimeAgentsSnapshot(params) {
628
533
  const snapshot = await createAgentsSnapshot(params.cwd, params.mode);
629
- await writeFile4(
630
- join6(params.runtimeDir, "agents.snapshot.json"),
534
+ await writeFile3(
535
+ join5(params.runtimeDir, "agents.snapshot.json"),
631
536
  `${JSON.stringify(snapshot, null, 2)}
632
537
  `,
633
538
  "utf-8"
@@ -635,10 +540,10 @@ async function writeRuntimeAgentsSnapshot(params) {
635
540
  }
636
541
  async function materializeRuntime(cwd, options = {}) {
637
542
  const mode = options.mode ?? "remote";
638
- const runtimeDir = join6(cwd, RUNTIME_ROOT, RUNTIME_DIR);
639
- const studioDir = join6(runtimeDir, STUDIO_DIR);
640
- const workerEntrypointPath = join6(runtimeDir, WORKER_ENTRY_FILE);
641
- const wranglerConfigPath = join6(runtimeDir, WRANGLER_CONFIG_FILE);
543
+ const runtimeDir = join5(cwd, RUNTIME_ROOT, RUNTIME_DIR);
544
+ const studioDir = join5(runtimeDir, STUDIO_DIR);
545
+ const workerEntrypointPath = join5(runtimeDir, WORKER_ENTRY_FILE);
546
+ const wranglerConfigPath = join5(runtimeDir, WRANGLER_CONFIG_FILE);
642
547
  const template = await resolveRuntimeTemplate();
643
548
  await rm(runtimeDir, { recursive: true, force: true });
644
549
  await mkdir2(runtimeDir, { recursive: true });
@@ -669,7 +574,7 @@ async function materializeRuntime(cwd, options = {}) {
669
574
  mode,
670
575
  [...requiredSecrets].sort((a, b) => a.localeCompare(b))
671
576
  );
672
- await writeFile4(
577
+ await writeFile3(
673
578
  wranglerConfigPath,
674
579
  `${JSON.stringify(wranglerConfig, null, 2)}
675
580
  `,
@@ -685,8 +590,6 @@ async function materializeRuntime(cwd, options = {}) {
685
590
  }
686
591
 
687
592
  export {
688
- ensureStudioSecrets,
689
- ensureSecretKey,
690
593
  readProjectState,
691
594
  writeProjectState,
692
595
  resolveProviderFromConfig,
@@ -699,4 +602,4 @@ export {
699
602
  writeRuntimeAgentsSnapshot,
700
603
  materializeRuntime
701
604
  };
702
- //# sourceMappingURL=chunk-GW6MLHK7.js.map
605
+ //# sourceMappingURL=chunk-DHCCSWJN.js.map