@kalphq/cli 0.0.0-dev-20260513002723 → 0.0.0-dev-20260513005628
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/add-NDU352FV.js +124 -0
- package/dist/add-NDU352FV.js.map +1 -0
- package/dist/chunk-5ZRVO3TQ.js +70 -0
- package/dist/chunk-5ZRVO3TQ.js.map +1 -0
- package/dist/{chunk-GW6MLHK7.js → chunk-DHCCSWJN.js} +48 -145
- package/dist/chunk-DHCCSWJN.js.map +1 -0
- package/dist/{chunk-TNKYKA7N.js → chunk-GNQI376N.js} +118 -18
- package/dist/chunk-GNQI376N.js.map +1 -0
- package/dist/chunk-NV2IZ4XM.js +102 -0
- package/dist/chunk-NV2IZ4XM.js.map +1 -0
- package/dist/{chunk-TY5UW4IZ.js → chunk-X56YSZGT.js} +43 -8
- package/dist/chunk-X56YSZGT.js.map +1 -0
- package/dist/delete-DY5FQAHW.js +127 -0
- package/dist/delete-DY5FQAHW.js.map +1 -0
- package/dist/{deploy-TX6SP5M4.js → deploy-AD3F3BN7.js} +27 -22
- package/dist/deploy-AD3F3BN7.js.map +1 -0
- package/dist/{dev-APJ32K2Y.js → dev-X43HHIYV.js} +5 -3
- package/dist/{dev-APJ32K2Y.js.map → dev-X43HHIYV.js.map} +1 -1
- package/dist/index.js +6 -8
- package/dist/index.js.map +1 -1
- package/dist/list-4X735L5X.js +90 -0
- package/dist/list-4X735L5X.js.map +1 -0
- package/dist/{login-DGX55YZ6.js → login-RAN2I7YT.js} +3 -5
- package/dist/{login-DGX55YZ6.js.map → login-RAN2I7YT.js.map} +1 -1
- package/dist/{push-APZG653E.js → push-VUW7C4HO.js} +38 -14
- package/dist/push-VUW7C4HO.js.map +1 -0
- package/dist/{secrets-P7ADVLOS.js → secrets-5ZPPASCH.js} +10 -10
- package/dist/secrets-5ZPPASCH.js.map +1 -0
- package/dist/sync-2NLWWGI2.js +69 -0
- package/dist/sync-2NLWWGI2.js.map +1 -0
- package/package.json +4 -4
- package/dist/add-XTXSSGC5.js +0 -139
- package/dist/add-XTXSSGC5.js.map +0 -1
- package/dist/chunk-5RODADXW.js +0 -65
- package/dist/chunk-5RODADXW.js.map +0 -1
- package/dist/chunk-GW6MLHK7.js.map +0 -1
- package/dist/chunk-TNKYKA7N.js.map +0 -1
- package/dist/chunk-TY5UW4IZ.js.map +0 -1
- package/dist/delete-N4OSUK3X.js +0 -145
- package/dist/delete-N4OSUK3X.js.map +0 -1
- package/dist/deploy-TX6SP5M4.js.map +0 -1
- package/dist/link-WZQSR2TM.js +0 -36
- package/dist/link-WZQSR2TM.js.map +0 -1
- package/dist/list-VMJPWHIH.js +0 -120
- package/dist/list-VMJPWHIH.js.map +0 -1
- package/dist/push-APZG653E.js.map +0 -1
- package/dist/secrets-P7ADVLOS.js.map +0 -1
- package/dist/sync-OTO44GQS.js +0 -121
- 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
|
|
100
|
-
import { join
|
|
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 =
|
|
142
|
-
const content = await
|
|
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 =
|
|
54
|
+
const dir = join(cwd, KALP_DIR);
|
|
150
55
|
await mkdir(dir, { recursive: true });
|
|
151
|
-
await
|
|
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
|
|
67
|
+
readFile as readFile3,
|
|
163
68
|
rm,
|
|
164
69
|
stat,
|
|
165
|
-
writeFile as
|
|
70
|
+
writeFile as writeFile3
|
|
166
71
|
} from "fs/promises";
|
|
167
|
-
import { basename, dirname, join as
|
|
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
|
|
77
|
+
import { access, readFile as readFile2 } from "fs/promises";
|
|
173
78
|
import { constants } from "fs";
|
|
174
|
-
import { join as
|
|
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
|
|
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 =
|
|
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 =
|
|
203
|
-
const content = await
|
|
204
|
-
return
|
|
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
|
|
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(
|
|
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
|
|
282
|
-
import { join as
|
|
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
|
|
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 =
|
|
357
|
-
const identityMapPath =
|
|
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
|
|
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 =
|
|
308
|
+
const packageJsonPath = join5(cwd, "package.json");
|
|
404
309
|
try {
|
|
405
|
-
const content = await
|
|
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:
|
|
484
|
-
workerEntryPath:
|
|
388
|
+
studioTemplateDir: join5(distTemplateRoot, STUDIO_DIR),
|
|
389
|
+
workerEntryPath: join5(distTemplateRoot, WORKER_ENTRY_FILE)
|
|
485
390
|
},
|
|
486
391
|
{
|
|
487
|
-
studioTemplateDir:
|
|
488
|
-
workerEntryPath:
|
|
392
|
+
studioTemplateDir: join5(packageRootTemplate, STUDIO_DIR),
|
|
393
|
+
workerEntryPath: join5(packageRootTemplate, WORKER_ENTRY_FILE)
|
|
489
394
|
},
|
|
490
395
|
{
|
|
491
|
-
studioTemplateDir:
|
|
492
|
-
workerEntryPath:
|
|
396
|
+
studioTemplateDir: join5(sourceTemplateRoot, STUDIO_DIR),
|
|
397
|
+
workerEntryPath: join5(sourceTemplateRoot, WORKER_ENTRY_FILE)
|
|
493
398
|
},
|
|
494
399
|
{
|
|
495
400
|
studioTemplateDir: monorepoStudioDist,
|
|
496
|
-
workerEntryPath:
|
|
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 =
|
|
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 =
|
|
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
|
|
452
|
+
await writeFile3(indexPath, html, "utf-8");
|
|
548
453
|
}
|
|
549
454
|
async function readLocalAgentNames(cwd) {
|
|
550
|
-
const agentsDir =
|
|
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 =
|
|
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 =
|
|
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 ??
|
|
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
|
|
630
|
-
|
|
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 =
|
|
639
|
-
const studioDir =
|
|
640
|
-
const workerEntrypointPath =
|
|
641
|
-
const wranglerConfigPath =
|
|
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
|
|
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-
|
|
605
|
+
//# sourceMappingURL=chunk-DHCCSWJN.js.map
|