@kalphq/cli 0.0.0-dev-20260513152102 → 0.0.0-dev-20260517015600
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-YZSIMRPC.js → add-5WUS5HGV.js} +16 -8
- package/dist/add-5WUS5HGV.js.map +1 -0
- package/dist/{agents-WYK6WNQP.js → agents-L22L47II.js} +3 -3
- package/dist/ai-7EBQF25Y.js +12 -0
- package/dist/ai-7EBQF25Y.js.map +1 -0
- package/dist/{chunk-IZXCZ3IA.js → chunk-4CPUJ537.js} +2 -2
- package/dist/chunk-5YUU3KLB.js +40 -0
- package/dist/chunk-5YUU3KLB.js.map +1 -0
- package/dist/chunk-7KVCCBPJ.js +139 -0
- package/dist/chunk-7KVCCBPJ.js.map +1 -0
- package/dist/{chunk-S3KAVLVM.js → chunk-D53K6UE6.js} +2 -2
- package/dist/chunk-D53K6UE6.js.map +1 -0
- package/dist/{chunk-4CEJYSJY.js → chunk-DLUULDXW.js} +12 -45
- package/dist/chunk-DLUULDXW.js.map +1 -0
- package/dist/chunk-DXNHT4HF.js +99 -0
- package/dist/chunk-DXNHT4HF.js.map +1 -0
- package/dist/{chunk-XVD3FFOJ.js → chunk-JXR6TPR5.js} +51 -72
- package/dist/chunk-JXR6TPR5.js.map +1 -0
- package/dist/chunk-LEKRFM4Q.js +49 -0
- package/dist/chunk-LEKRFM4Q.js.map +1 -0
- package/dist/chunk-QT2JFINP.js +99 -0
- package/dist/chunk-QT2JFINP.js.map +1 -0
- package/dist/{chunk-5SZMD7E6.js → chunk-TNNBTSDC.js} +2 -2
- package/dist/{chunk-5SZMD7E6.js.map → chunk-TNNBTSDC.js.map} +1 -1
- package/dist/{generate-JW2DMJ3W.js → chunk-ZX7TIQM7.js} +127 -120
- package/dist/chunk-ZX7TIQM7.js.map +1 -0
- package/dist/{create-UCJ77P62.js → create-ILPQCRA2.js} +2 -2
- package/dist/{delete-QPYVL4OU.js → delete-AJFAAGYJ.js} +9 -8
- package/dist/{delete-QPYVL4OU.js.map → delete-AJFAAGYJ.js.map} +1 -1
- package/dist/{delete-FIXMFFNZ.js → delete-IFVGULOA.js} +21 -13
- package/dist/delete-IFVGULOA.js.map +1 -0
- package/dist/{deploy-DRZZ3YRB.js → deploy-EWYNN3VU.js} +9 -6
- package/dist/{deploy-DRZZ3YRB.js.map → deploy-EWYNN3VU.js.map} +1 -1
- package/dist/{dev-5YY6W4WM.js → dev-3IEEUVYM.js} +66 -11
- package/dist/dev-3IEEUVYM.js.map +1 -0
- package/dist/generate-2MO7PZBT.js +69 -0
- package/dist/generate-2MO7PZBT.js.map +1 -0
- package/dist/generate-ODZUKTF2.js +146 -0
- package/dist/generate-ODZUKTF2.js.map +1 -0
- package/dist/index.js +32 -12
- package/dist/index.js.map +1 -1
- package/dist/{list-FKH4DWCF.js → list-BNQ34QG3.js} +6 -5
- package/dist/{list-FKH4DWCF.js.map → list-BNQ34QG3.js.map} +1 -1
- package/dist/{list-GZBBOFX5.js → list-WHYV5JZ4.js} +5 -4
- package/dist/{list-GZBBOFX5.js.map → list-WHYV5JZ4.js.map} +1 -1
- package/dist/{login-MGPA2VYV.js → login-BDLHS4HC.js} +13 -8
- package/dist/login-BDLHS4HC.js.map +1 -0
- package/dist/{mcp-DRMQYA7E.js → mcp-77OLNT5R.js} +2 -2
- package/dist/{pull-V7QJBVNZ.js → pull-CFDZS6VB.js} +8 -7
- package/dist/{pull-V7QJBVNZ.js.map → pull-CFDZS6VB.js.map} +1 -1
- package/dist/{push-P6CKRYT7.js → push-OL7562HM.js} +159 -47
- package/dist/push-OL7562HM.js.map +1 -0
- package/dist/runtime-template/studio/index.html +3 -0
- package/dist/{secrets-M43LLCTB.js → secrets-BPESLXMK.js} +6 -6
- package/dist/{sync-LTBH6DI5.js → sync-JJDODKMO.js} +8 -7
- package/dist/{sync-LTBH6DI5.js.map → sync-JJDODKMO.js.map} +1 -1
- package/package.json +5 -4
- package/dist/add-YZSIMRPC.js.map +0 -1
- package/dist/chunk-4CEJYSJY.js.map +0 -1
- package/dist/chunk-LPEV4QH2.js +0 -208
- package/dist/chunk-LPEV4QH2.js.map +0 -1
- package/dist/chunk-S3KAVLVM.js.map +0 -1
- package/dist/chunk-VCFH3R34.js +0 -103
- package/dist/chunk-VCFH3R34.js.map +0 -1
- package/dist/chunk-XVD3FFOJ.js.map +0 -1
- package/dist/delete-FIXMFFNZ.js.map +0 -1
- package/dist/dev-5YY6W4WM.js.map +0 -1
- package/dist/generate-JW2DMJ3W.js.map +0 -1
- package/dist/login-MGPA2VYV.js.map +0 -1
- package/dist/push-P6CKRYT7.js.map +0 -1
- /package/dist/{agents-WYK6WNQP.js.map → agents-L22L47II.js.map} +0 -0
- /package/dist/{chunk-IZXCZ3IA.js.map → chunk-4CPUJ537.js.map} +0 -0
- /package/dist/{create-UCJ77P62.js.map → create-ILPQCRA2.js.map} +0 -0
- /package/dist/{mcp-DRMQYA7E.js.map → mcp-77OLNT5R.js.map} +0 -0
- /package/dist/{secrets-M43LLCTB.js.map → secrets-BPESLXMK.js.map} +0 -0
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
generateTypes
|
|
4
|
-
} from "./chunk-LPEV4QH2.js";
|
|
5
2
|
import {
|
|
6
3
|
filterInternalSecrets,
|
|
7
4
|
mergeSecrets,
|
|
8
5
|
readLocalSecretsFromConfig,
|
|
9
6
|
writeLocalSecretsToConfig
|
|
10
7
|
} from "./chunk-YE2SFYAJ.js";
|
|
8
|
+
import {
|
|
9
|
+
generateTypes
|
|
10
|
+
} from "./chunk-DXNHT4HF.js";
|
|
11
11
|
import {
|
|
12
12
|
resolveSecretsRuntimeConfigPath
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-4CPUJ537.js";
|
|
14
14
|
import "./chunk-INB3LG6O.js";
|
|
15
|
-
import "./chunk-XVD3FFOJ.js";
|
|
16
15
|
import {
|
|
17
16
|
requireAuth,
|
|
18
17
|
resolveProvider
|
|
19
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-D53K6UE6.js";
|
|
20
19
|
import "./chunk-FO24J6XL.js";
|
|
20
|
+
import "./chunk-JXR6TPR5.js";
|
|
21
21
|
import "./chunk-EXXTCGKR.js";
|
|
22
|
+
import "./chunk-LEKRFM4Q.js";
|
|
22
23
|
|
|
23
24
|
// src/commands/secrets/sync.ts
|
|
24
25
|
import { defineCommand } from "citty";
|
|
@@ -80,4 +81,4 @@ var sync_default = defineCommand({
|
|
|
80
81
|
export {
|
|
81
82
|
sync_default as default
|
|
82
83
|
};
|
|
83
|
-
//# sourceMappingURL=sync-
|
|
84
|
+
//# sourceMappingURL=sync-JJDODKMO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/secrets/sync.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 filterInternalSecrets,\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: \"sync\",\n description: \"Merge remote secrets into local kalp.config.ts\",\n },\n args: {\n includeInternal: {\n type: \"boolean\",\n description: \"Include internal Kalp runtime secrets (KALP_*)\",\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets sync\")}`);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n const spinner = p.spinner();\n spinner.start(\"Reading remote secrets\");\n\n try {\n const configPath = await resolveSecretsRuntimeConfigPath(cwd);\n const provider = resolveProvider();\n const [remoteSecrets, localSecrets] = await Promise.all([\n provider.listSecrets({ cwd, configPath }),\n readLocalSecretsFromConfig(cwd),\n ]);\n\n const remoteNames = filterInternalSecrets(\n remoteSecrets.map((secret) => secret.name),\n args.includeInternal,\n );\n const merged = mergeSecrets(localSecrets, remoteNames);\n const added = merged.filter((name) => !localSecrets.includes(name));\n\n await writeLocalSecretsToConfig(cwd, merged);\n await generateTypes(cwd);\n\n spinner.stop(`Synced ${remoteNames.length} remote secrets`);\n if (added.length > 0) {\n p.log.success(\n `Added to local config: ${added.map((name) => pc.cyan(name)).join(\", \")}`,\n );\n } else {\n p.log.info(pc.dim(\"Local config already up to date.\"));\n }\n p.outro(\"Done\");\n } catch (error) {\n spinner.stop(\"Sync failed\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/commands/secrets/sync.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 filterInternalSecrets,\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: \"sync\",\n description: \"Merge remote secrets into local kalp.config.ts\",\n },\n args: {\n includeInternal: {\n type: \"boolean\",\n description: \"Include internal Kalp runtime secrets (KALP_*)\",\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets sync\")}`);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n const spinner = p.spinner();\n spinner.start(\"Reading remote secrets\");\n\n try {\n const configPath = await resolveSecretsRuntimeConfigPath(cwd);\n const provider = resolveProvider();\n const [remoteSecrets, localSecrets] = await Promise.all([\n provider.listSecrets({ cwd, configPath }),\n readLocalSecretsFromConfig(cwd),\n ]);\n\n const remoteNames = filterInternalSecrets(\n remoteSecrets.map((secret) => secret.name),\n args.includeInternal,\n );\n const merged = mergeSecrets(localSecrets, remoteNames);\n const added = merged.filter((name) => !localSecrets.includes(name));\n\n await writeLocalSecretsToConfig(cwd, merged);\n await generateTypes(cwd);\n\n spinner.stop(`Synced ${remoteNames.length} remote secrets`);\n if (added.length > 0) {\n p.log.success(\n `Added to local config: ${added.map((name) => pc.cyan(name)).join(\", \")}`,\n );\n } else {\n p.log.info(pc.dim(\"Local config already up to date.\"));\n }\n p.outro(\"Done\");\n } catch (error) {\n spinner.stop(\"Sync failed\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAYf,IAAM,OAAO;AAEb,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,mBAAmB,CAAC,EAAE;AAEjD,UAAM,YAAY,EAAE,MAAM,MAAM;AAC9B,MAAE,MAAI,MAAM,4CAA4C;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAED,UAAMA,WAAY,UAAQ;AAC1B,IAAAA,SAAQ,MAAM,wBAAwB;AAEtC,QAAI;AACF,YAAM,aAAa,MAAM,gCAAgC,GAAG;AAC5D,YAAM,WAAW,gBAAgB;AACjC,YAAM,CAAC,eAAe,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,QACtD,SAAS,YAAY,EAAE,KAAK,WAAW,CAAC;AAAA,QACxC,2BAA2B,GAAG;AAAA,MAChC,CAAC;AAED,YAAM,cAAc;AAAA,QAClB,cAAc,IAAI,CAAC,WAAW,OAAO,IAAI;AAAA,QACzC,KAAK;AAAA,MACP;AACA,YAAM,SAAS,aAAa,cAAc,WAAW;AACrD,YAAM,QAAQ,OAAO,OAAO,CAAC,SAAS,CAAC,aAAa,SAAS,IAAI,CAAC;AAElE,YAAM,0BAA0B,KAAK,MAAM;AAC3C,YAAM,cAAc,GAAG;AAEvB,MAAAA,SAAQ,KAAK,UAAU,YAAY,MAAM,iBAAiB;AAC1D,UAAI,MAAM,SAAS,GAAG;AACpB,QAAE,MAAI;AAAA,UACJ,0BAA0B,MAAM,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,QACzE;AAAA,MACF,OAAO;AACL,QAAE,MAAI,KAAK,GAAG,IAAI,kCAAkC,CAAC;AAAA,MACvD;AACA,MAAE,QAAM,MAAM;AAAA,IAChB,SAAS,OAAO;AACd,MAAAA,SAAQ,KAAK,aAAa;AAC1B,MAAE,MAAI,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;","names":["spinner"]}
|
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-20260517015600",
|
|
4
4
|
"description": "Zero-config CLI for deploying Kalp agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -22,15 +22,16 @@
|
|
|
22
22
|
"esbuild": "0.25.0",
|
|
23
23
|
"execa": "^9.6.1",
|
|
24
24
|
"jiti": "^2.6.1",
|
|
25
|
+
"hono": "^4.12.18",
|
|
25
26
|
"jose": "^5.10.0",
|
|
26
27
|
"json-schema-to-typescript": "^15.0.4",
|
|
27
28
|
"json-stable-stringify": "1.3.0",
|
|
28
29
|
"open": "^11.0.0",
|
|
29
30
|
"picocolors": "1.1.1",
|
|
30
31
|
"zod": "3.25.76",
|
|
31
|
-
"@kalphq/compiler": "0.0.0-dev-
|
|
32
|
-
"@kalphq/
|
|
33
|
-
"@kalphq/
|
|
32
|
+
"@kalphq/compiler": "0.0.0-dev-20260517015600",
|
|
33
|
+
"@kalphq/project": "0.0.0-dev-20260517015600",
|
|
34
|
+
"@kalphq/sdk": "0.0.0-dev-20260517015600"
|
|
34
35
|
},
|
|
35
36
|
"devDependencies": {
|
|
36
37
|
"@types/json-stable-stringify": "1.2.0",
|
package/dist/add-YZSIMRPC.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/deploy.ts","../src/utils/deploy-target.ts"],"sourcesContent":["import { readFile, writeFile } from \"node:fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { ensureStudioSecrets } from \"@/utils/secret\";\nimport { readProjectState, writeProjectState } from \"@/utils/project-state\";\nimport { materializeRuntime } from \"@/utils/runtime\";\nimport {\n getRequiredSecretForProvider,\n readDotEnv,\n resolveProviderFromConfig,\n} from \"@/utils/ai\";\nimport {\n loadProjectConfig,\n resolveIdentityAuthRequirements,\n resolveRuntimeIdentityConfig,\n} from \"@/utils/project-config\";\nimport { resolveProvider } from \"@/utils/providers\";\n\ninterface RuntimeWranglerConfig {\n name?: string;\n kv_namespaces?: Array<{ binding: string; id?: string }>;\n}\n\ninterface KvNamespaceInfo {\n id: string;\n title: string;\n}\n\nasync function readWranglerConfig(\n configPath: string,\n): Promise<RuntimeWranglerConfig> {\n const text = await readFile(configPath, \"utf-8\");\n return JSON.parse(text) as RuntimeWranglerConfig;\n}\n\nasync function writeWranglerConfig(\n configPath: string,\n config: RuntimeWranglerConfig,\n): Promise<void> {\n await writeFile(configPath, `${JSON.stringify(config, null, 2)}\\n`, \"utf-8\");\n}\n\nfunction deriveKvNamespaceTitle(workerName: string, binding: string): string {\n return `${workerName}-${binding.toLowerCase().replace(/_/g, \"-\")}`;\n}\n\nasync function listKvNamespaces(\n cwd: string,\n configPath: string,\n): Promise<KvNamespaceInfo[]> {\n const provider = resolveProvider();\n const namespaces = await provider.listNamespaces({ cwd, configPath });\n return namespaces.map((item) => ({\n id: item.id,\n title: item.title,\n }));\n}\n\nasync function ensureKvNamespaceBindingId(\n cwd: string,\n configPath: string,\n): Promise<string | null> {\n const config = await readWranglerConfig(configPath);\n const binding = config.kv_namespaces?.find(\n (item) => item.binding === \"KALP_MANIFESTS\",\n );\n\n if (!binding || !config.name) return null;\n if (binding.id) return binding.id;\n\n const expectedTitle = deriveKvNamespaceTitle(config.name, binding.binding);\n const namespaces = await listKvNamespaces(cwd, configPath);\n const existing = namespaces.find((item) => item.title === expectedTitle);\n if (!existing) return null;\n\n binding.id = existing.id;\n await writeWranglerConfig(configPath, config);\n return existing.id;\n}\n\nfunction isNamespaceAlreadyExistsError(output: string): boolean {\n return output.includes(\"[code: 10014]\") && output.includes(\"already exists\");\n}\n\nexport async function runInitialDeploy(cwd: string): Promise<{\n workerUrl: string;\n customDomains: string[];\n accountId: string;\n studioAdminUser: string;\n studioPassword: string;\n serviceKey: string;\n credentialsChanged: boolean;\n serviceKeyChanged: boolean;\n}> {\n const auth = await requireAuth();\n const loadedConfig = await loadProjectConfig(cwd);\n const identityConfig = resolveRuntimeIdentityConfig(loadedConfig.raw);\n const identitySecretRequirements = resolveIdentityAuthRequirements(identityConfig);\n const aiProvider = await resolveProviderFromConfig(cwd);\n const requiredProviderSecret = getRequiredSecretForProvider(aiProvider);\n const secrets = await ensureStudioSecrets(cwd);\n const envMap = await readDotEnv(cwd);\n const providerSecretValue = envMap[requiredProviderSecret]?.trim();\n if (!providerSecretValue) {\n throw new Error(\n `Missing required secret ${requiredProviderSecret} for provider \"${aiProvider}\". Add it to .env before deploy.`,\n );\n }\n\n const resolvedIdentitySecrets = identitySecretRequirements.map((requirement) => {\n const value = envMap[requirement.envKey]?.trim();\n if (!value) {\n throw new Error(\n `Missing required secret ${requirement.envKey} for ${requirement.reason}. Add it to .env before deploy.`,\n );\n }\n return { name: requirement.envKey, value };\n });\n\n const runtimeProvider = resolveProvider();\n const runtime = await materializeRuntime(cwd);\n let secretSyncFailed = false;\n const secretEntries = [\n [\"KALP_SECRET_KEY\", secrets.key],\n [\"KALP_STUDIO_PASSWORD\", secrets.studioPassword],\n [\"KALP_STUDIO_ADMIN_USER\", secrets.studioAdminUser],\n [\"KALP_SERVICE_KEY\", secrets.serviceKey],\n [requiredProviderSecret, providerSecretValue],\n ...resolvedIdentitySecrets.map((item) => [item.name, item.value] as const),\n ];\n const dedupedSecrets = new Map<string, string>();\n for (const [name, value] of secretEntries) {\n dedupedSecrets.set(name, value);\n }\n\n for (const [name, value] of dedupedSecrets.entries()) {\n try {\n await runtimeProvider.putSecret({\n cwd,\n configPath: runtime.wranglerConfigPath,\n name,\n value,\n });\n } catch {\n secretSyncFailed = true;\n break;\n }\n }\n\n await ensureKvNamespaceBindingId(cwd, runtime.wranglerConfigPath).catch(\n () => null,\n );\n\n let deploy = await runtimeProvider\n .deployRuntime({\n cwd,\n configPath: runtime.wranglerConfigPath,\n useSecretsFile: secretSyncFailed,\n })\n .catch((error) => error);\n if (deploy instanceof Error) {\n const combined = deploy.message;\n if (isNamespaceAlreadyExistsError(combined)) {\n await ensureKvNamespaceBindingId(cwd, runtime.wranglerConfigPath);\n deploy = await runtimeProvider.deployRuntime({\n cwd,\n configPath: runtime.wranglerConfigPath,\n useSecretsFile: secretSyncFailed,\n });\n } else {\n throw deploy;\n }\n }\n\n const workerUrl = deploy.workerUrl;\n const customDomains = deploy.customDomains ?? [];\n\n const existingState = await readProjectState(cwd);\n\n const credentialsFingerprint = createHash(\"sha256\")\n .update(`${secrets.studioAdminUser}:${secrets.studioPassword}`)\n .digest(\"hex\");\n const credentialsChanged =\n existingState?.studioCredentialsFingerprint !== credentialsFingerprint;\n const serviceKeyFingerprint = createHash(\"sha256\")\n .update(secrets.serviceKey)\n .digest(\"hex\");\n const serviceKeyChanged =\n existingState?.serviceKeyFingerprint !== serviceKeyFingerprint;\n\n await writeProjectState(cwd, {\n workerUrl,\n deployedAt: new Date().toISOString(),\n accountId: auth.accountId,\n studioCredentialsFingerprint: credentialsFingerprint,\n serviceKeyFingerprint,\n agents: existingState?.agents ?? {},\n });\n\n return {\n workerUrl,\n customDomains,\n accountId: auth.accountId,\n studioAdminUser: secrets.studioAdminUser,\n studioPassword: secrets.studioPassword,\n serviceKey: secrets.serviceKey,\n credentialsChanged,\n serviceKeyChanged,\n };\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\n\nexport type DeployTarget = \"cloudflare\" | \"kalp-cloud\";\n\nexport async function promptDeployTarget(message: string): Promise<DeployTarget | null> {\n const selected = await p.select({\n message,\n options: [\n {\n value: \"cloudflare\",\n label: \"Cloudflare\",\n hint: \"Available now\",\n },\n {\n value: \"kalp-cloud\",\n label: \"Kalp Cloud\",\n hint: \"Coming soon\",\n },\n ],\n });\n\n if (p.isCancel(selected)) return null;\n return selected as DeployTarget;\n}\n\nexport function showKalpCloudWaitlist(): void {\n p.note(\n [\n `${pc.bold(\"Kalp Cloud is coming soon 🚀\")}`,\n pc.dim(\"Join the waitlist for early access:\"),\n pc.cyan(\"https://usekalp.com/waitlist\"),\n ].join(\"\\n\"),\n \"Kalp Cloud\",\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,UAAU,iBAAiB;AACpC,SAAS,kBAAkB;AA2B3B,eAAe,mBACb,YACgC;AAChC,QAAM,OAAO,MAAM,SAAS,YAAY,OAAO;AAC/C,SAAO,KAAK,MAAM,IAAI;AACxB;AAEA,eAAe,oBACb,YACA,QACe;AACf,QAAM,UAAU,YAAY,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,GAAM,OAAO;AAC7E;AAEA,SAAS,uBAAuB,YAAoB,SAAyB;AAC3E,SAAO,GAAG,UAAU,IAAI,QAAQ,YAAY,EAAE,QAAQ,MAAM,GAAG,CAAC;AAClE;AAEA,eAAe,iBACb,KACA,YAC4B;AAC5B,QAAM,WAAW,gBAAgB;AACjC,QAAM,aAAa,MAAM,SAAS,eAAe,EAAE,KAAK,WAAW,CAAC;AACpE,SAAO,WAAW,IAAI,CAAC,UAAU;AAAA,IAC/B,IAAI,KAAK;AAAA,IACT,OAAO,KAAK;AAAA,EACd,EAAE;AACJ;AAEA,eAAe,2BACb,KACA,YACwB;AACxB,QAAM,SAAS,MAAM,mBAAmB,UAAU;AAClD,QAAM,UAAU,OAAO,eAAe;AAAA,IACpC,CAAC,SAAS,KAAK,YAAY;AAAA,EAC7B;AAEA,MAAI,CAAC,WAAW,CAAC,OAAO,KAAM,QAAO;AACrC,MAAI,QAAQ,GAAI,QAAO,QAAQ;AAE/B,QAAM,gBAAgB,uBAAuB,OAAO,MAAM,QAAQ,OAAO;AACzE,QAAM,aAAa,MAAM,iBAAiB,KAAK,UAAU;AACzD,QAAM,WAAW,WAAW,KAAK,CAAC,SAAS,KAAK,UAAU,aAAa;AACvE,MAAI,CAAC,SAAU,QAAO;AAEtB,UAAQ,KAAK,SAAS;AACtB,QAAM,oBAAoB,YAAY,MAAM;AAC5C,SAAO,SAAS;AAClB;AAEA,SAAS,8BAA8B,QAAyB;AAC9D,SAAO,OAAO,SAAS,eAAe,KAAK,OAAO,SAAS,gBAAgB;AAC7E;AAEA,eAAsB,iBAAiB,KASpC;AACD,QAAM,OAAO,MAAM,YAAY;AAC/B,QAAM,eAAe,MAAM,kBAAkB,GAAG;AAChD,QAAM,iBAAiB,6BAA6B,aAAa,GAAG;AACpE,QAAM,6BAA6B,gCAAgC,cAAc;AACjF,QAAM,aAAa,MAAM,0BAA0B,GAAG;AACtD,QAAM,yBAAyB,6BAA6B,UAAU;AACtE,QAAM,UAAU,MAAM,oBAAoB,GAAG;AAC7C,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,QAAM,sBAAsB,OAAO,sBAAsB,GAAG,KAAK;AACjE,MAAI,CAAC,qBAAqB;AACxB,UAAM,IAAI;AAAA,MACR,2BAA2B,sBAAsB,kBAAkB,UAAU;AAAA,IAC/E;AAAA,EACF;AAEA,QAAM,0BAA0B,2BAA2B,IAAI,CAAC,gBAAgB;AAC9E,UAAM,QAAQ,OAAO,YAAY,MAAM,GAAG,KAAK;AAC/C,QAAI,CAAC,OAAO;AACV,YAAM,IAAI;AAAA,QACR,2BAA2B,YAAY,MAAM,QAAQ,YAAY,MAAM;AAAA,MACzE;AAAA,IACF;AACA,WAAO,EAAE,MAAM,YAAY,QAAQ,MAAM;AAAA,EAC3C,CAAC;AAED,QAAM,kBAAkB,gBAAgB;AACxC,QAAM,UAAU,MAAM,mBAAmB,GAAG;AAC5C,MAAI,mBAAmB;AACvB,QAAM,gBAAgB;AAAA,IACpB,CAAC,mBAAmB,QAAQ,GAAG;AAAA,IAC/B,CAAC,wBAAwB,QAAQ,cAAc;AAAA,IAC/C,CAAC,0BAA0B,QAAQ,eAAe;AAAA,IAClD,CAAC,oBAAoB,QAAQ,UAAU;AAAA,IACvC,CAAC,wBAAwB,mBAAmB;AAAA,IAC5C,GAAG,wBAAwB,IAAI,CAAC,SAAS,CAAC,KAAK,MAAM,KAAK,KAAK,CAAU;AAAA,EAC3E;AACA,QAAM,iBAAiB,oBAAI,IAAoB;AAC/C,aAAW,CAAC,MAAM,KAAK,KAAK,eAAe;AACzC,mBAAe,IAAI,MAAM,KAAK;AAAA,EAChC;AAEA,aAAW,CAAC,MAAM,KAAK,KAAK,eAAe,QAAQ,GAAG;AACpD,QAAI;AACF,YAAM,gBAAgB,UAAU;AAAA,QAC9B;AAAA,QACA,YAAY,QAAQ;AAAA,QACpB;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,QAAQ;AACN,yBAAmB;AACnB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,2BAA2B,KAAK,QAAQ,kBAAkB,EAAE;AAAA,IAChE,MAAM;AAAA,EACR;AAEA,MAAI,SAAS,MAAM,gBAChB,cAAc;AAAA,IACb;AAAA,IACA,YAAY,QAAQ;AAAA,IACpB,gBAAgB;AAAA,EAClB,CAAC,EACA,MAAM,CAAC,UAAU,KAAK;AACzB,MAAI,kBAAkB,OAAO;AAC3B,UAAM,WAAW,OAAO;AACxB,QAAI,8BAA8B,QAAQ,GAAG;AAC3C,YAAM,2BAA2B,KAAK,QAAQ,kBAAkB;AAChE,eAAS,MAAM,gBAAgB,cAAc;AAAA,QAC3C;AAAA,QACA,YAAY,QAAQ;AAAA,QACpB,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH,OAAO;AACL,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,YAAY,OAAO;AACzB,QAAM,gBAAgB,OAAO,iBAAiB,CAAC;AAE/C,QAAM,gBAAgB,MAAM,iBAAiB,GAAG;AAEhD,QAAM,yBAAyB,WAAW,QAAQ,EAC/C,OAAO,GAAG,QAAQ,eAAe,IAAI,QAAQ,cAAc,EAAE,EAC7D,OAAO,KAAK;AACf,QAAM,qBACJ,eAAe,iCAAiC;AAClD,QAAM,wBAAwB,WAAW,QAAQ,EAC9C,OAAO,QAAQ,UAAU,EACzB,OAAO,KAAK;AACf,QAAM,oBACJ,eAAe,0BAA0B;AAE3C,QAAM,kBAAkB,KAAK;AAAA,IAC3B;AAAA,IACA,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IACnC,WAAW,KAAK;AAAA,IAChB,8BAA8B;AAAA,IAC9B;AAAA,IACA,QAAQ,eAAe,UAAU,CAAC;AAAA,EACpC,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW,KAAK;AAAA,IAChB,iBAAiB,QAAQ;AAAA,IACzB,gBAAgB,QAAQ;AAAA,IACxB,YAAY,QAAQ;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AACF;;;ACjNA,YAAY,OAAO;AACnB,OAAO,QAAQ;AAIf,eAAsB,mBAAmB,SAA+C;AACtF,QAAM,WAAW,MAAQ,SAAO;AAAA,IAC9B;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAM,WAAS,QAAQ,EAAG,QAAO;AACjC,SAAO;AACT;AAEO,SAAS,wBAA8B;AAC5C,EAAE;AAAA,IACA;AAAA,MACE,GAAG,GAAG,KAAK,qCAA8B,CAAC;AAAA,MAC1C,GAAG,IAAI,qCAAqC;AAAA,MAC5C,GAAG,KAAK,8BAA8B;AAAA,IACxC,EAAE,KAAK,IAAI;AAAA,IACX;AAAA,EACF;AACF;","names":[]}
|
package/dist/chunk-LPEV4QH2.js
DELETED
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
loadProjectConfig
|
|
4
|
-
} from "./chunk-EXXTCGKR.js";
|
|
5
|
-
|
|
6
|
-
// src/utils/codegen.ts
|
|
7
|
-
import { access, mkdir, readFile, writeFile } from "fs/promises";
|
|
8
|
-
import { join } from "path";
|
|
9
|
-
var GENERATED_HEADER = `// \u{1F98B} Kalp Generated Types
|
|
10
|
-
// This file is auto-generated. Do not edit manually.
|
|
11
|
-
`;
|
|
12
|
-
var GENERATED_MCP_HEADER = `// \u{1F98B} Kalp Generated MCP Types
|
|
13
|
-
// This file is auto-generated by \`kalp mcp generate\`.
|
|
14
|
-
// Do not edit manually.
|
|
15
|
-
`;
|
|
16
|
-
var DEFAULT_PROVIDER = "openai";
|
|
17
|
-
function sanitizeSecrets(input) {
|
|
18
|
-
if (!Array.isArray(input)) return [];
|
|
19
|
-
return input.filter((value) => typeof value === "string").map((value) => value.trim()).filter(Boolean).sort((a, b) => a.localeCompare(b));
|
|
20
|
-
}
|
|
21
|
-
function sanitizeCustomModels(input) {
|
|
22
|
-
if (!Array.isArray(input)) return [];
|
|
23
|
-
return input.filter((value) => typeof value === "string").map((value) => value.trim()).filter(Boolean).sort((a, b) => a.localeCompare(b));
|
|
24
|
-
}
|
|
25
|
-
function sanitizeProvider(input) {
|
|
26
|
-
if (input === "openai" || input === "anthropic" || input === "openrouter" || input === "custom") {
|
|
27
|
-
return input;
|
|
28
|
-
}
|
|
29
|
-
return DEFAULT_PROVIDER;
|
|
30
|
-
}
|
|
31
|
-
function parseSecretsFromConfigText(configContent) {
|
|
32
|
-
const secretsMatch = configContent.match(/secrets:\s*\[([^\]]*)\]/);
|
|
33
|
-
if (!secretsMatch) return [];
|
|
34
|
-
const secretsArray = secretsMatch[1] ?? "";
|
|
35
|
-
const secretMatches = secretsArray.match(/"([^"]+)"/g);
|
|
36
|
-
if (!secretMatches) return [];
|
|
37
|
-
return secretMatches.map((match) => match.replace(/"/g, "").trim()).filter(Boolean).sort((a, b) => a.localeCompare(b));
|
|
38
|
-
}
|
|
39
|
-
function parseProviderFromConfigText(configContent) {
|
|
40
|
-
const providerMatch = configContent.match(
|
|
41
|
-
/provider:\s*"(openai|anthropic|openrouter|custom)"/
|
|
42
|
-
);
|
|
43
|
-
return sanitizeProvider(providerMatch?.[1]);
|
|
44
|
-
}
|
|
45
|
-
function parseCustomModelsFromConfigText(configContent) {
|
|
46
|
-
const modelsMatch = configContent.match(/customModels:\s*\[([^\]]*)\]/);
|
|
47
|
-
if (!modelsMatch) return [];
|
|
48
|
-
const modelsArray = modelsMatch[1] ?? "";
|
|
49
|
-
const modelMatches = modelsArray.match(/"([^"]+)"/g);
|
|
50
|
-
if (!modelMatches) return [];
|
|
51
|
-
return modelMatches.map((match) => match.replace(/"/g, "").trim()).filter(Boolean).sort((a, b) => a.localeCompare(b));
|
|
52
|
-
}
|
|
53
|
-
async function readConfigForTypes(cwd) {
|
|
54
|
-
try {
|
|
55
|
-
const { raw } = await loadProjectConfig(cwd);
|
|
56
|
-
const aiConfig = raw.ai && typeof raw.ai === "object" ? raw.ai : {};
|
|
57
|
-
return {
|
|
58
|
-
secrets: sanitizeSecrets(raw.secrets),
|
|
59
|
-
provider: sanitizeProvider(aiConfig.provider),
|
|
60
|
-
customModels: sanitizeCustomModels(aiConfig.customModels)
|
|
61
|
-
};
|
|
62
|
-
} catch {
|
|
63
|
-
const configPath = join(cwd, "kalp.config.ts");
|
|
64
|
-
const configContent = await readFile(configPath, "utf-8").catch(() => "");
|
|
65
|
-
return {
|
|
66
|
-
secrets: parseSecretsFromConfigText(configContent),
|
|
67
|
-
provider: parseProviderFromConfigText(configContent),
|
|
68
|
-
customModels: parseCustomModelsFromConfigText(configContent)
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
function toStringTuple(values) {
|
|
73
|
-
if (values.length === 0) return "readonly []";
|
|
74
|
-
return `readonly [${values.map((value) => JSON.stringify(value)).join(", ")}]`;
|
|
75
|
-
}
|
|
76
|
-
function buildKalpDtsContent() {
|
|
77
|
-
return `import "@kalphq/sdk";
|
|
78
|
-
import "./.kalp/mcp.types";
|
|
79
|
-
import type {
|
|
80
|
-
RegisteredSecretKeys,
|
|
81
|
-
ConfiguredAIProvider,
|
|
82
|
-
ConfiguredAICustomModels,
|
|
83
|
-
} from "./.kalp/types";
|
|
84
|
-
|
|
85
|
-
declare module "@kalphq/sdk" {
|
|
86
|
-
interface SecretsRegistry {
|
|
87
|
-
keys: RegisteredSecretKeys;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
interface KalpAIEnvironment {
|
|
91
|
-
provider: ConfiguredAIProvider;
|
|
92
|
-
customModels: ConfiguredAICustomModels;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function parseTsconfigJson(content: string): { include?: string[] } | null {
|
|
97
|
-
try {
|
|
98
|
-
return JSON.parse(content) as { include?: string[] };
|
|
99
|
-
} catch {
|
|
100
|
-
const withoutComments = content
|
|
101
|
-
.replace(//*[sS]*?*//g, "")
|
|
102
|
-
.replace(/^s*//.*$/gm, "");
|
|
103
|
-
const withoutTrailingCommas = withoutComments
|
|
104
|
-
.replace(/,s*}/g, "}")
|
|
105
|
-
.replace(/,s*]/g, "]");
|
|
106
|
-
|
|
107
|
-
try {
|
|
108
|
-
return JSON.parse(withoutTrailingCommas) as { include?: string[] };
|
|
109
|
-
} catch {
|
|
110
|
-
return null;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
`;
|
|
115
|
-
}
|
|
116
|
-
function buildEmptyMcpTypesContent() {
|
|
117
|
-
return `${GENERATED_MCP_HEADER}import "@kalphq/sdk";
|
|
118
|
-
|
|
119
|
-
declare module "@kalphq/sdk" {
|
|
120
|
-
interface McpRegistry {}
|
|
121
|
-
}
|
|
122
|
-
`;
|
|
123
|
-
}
|
|
124
|
-
async function writeMcpTypes(cwd, content) {
|
|
125
|
-
const kalpDir = join(cwd, ".kalp");
|
|
126
|
-
const mcpTypesPath = join(kalpDir, "mcp.types.d.ts");
|
|
127
|
-
await mkdir(kalpDir, { recursive: true });
|
|
128
|
-
await writeFile(mcpTypesPath, content, "utf-8");
|
|
129
|
-
await updateKalpDts(cwd);
|
|
130
|
-
await updateTsconfig(cwd);
|
|
131
|
-
return mcpTypesPath;
|
|
132
|
-
}
|
|
133
|
-
async function ensureMcpTypesFile(cwd) {
|
|
134
|
-
const kalpDir = join(cwd, ".kalp");
|
|
135
|
-
const mcpTypesPath = join(kalpDir, "mcp.types.d.ts");
|
|
136
|
-
try {
|
|
137
|
-
await access(mcpTypesPath);
|
|
138
|
-
return;
|
|
139
|
-
} catch {
|
|
140
|
-
await writeMcpTypes(cwd, buildEmptyMcpTypesContent());
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
async function generateTypes(cwd) {
|
|
144
|
-
const kalpDir = join(cwd, ".kalp");
|
|
145
|
-
const typesPath = join(kalpDir, "types.d.ts");
|
|
146
|
-
const config = await readConfigForTypes(cwd);
|
|
147
|
-
await mkdir(kalpDir, { recursive: true });
|
|
148
|
-
const typesContent = `${GENERATED_HEADER}/**
|
|
149
|
-
* Registered secrets from kalp.config.ts
|
|
150
|
-
* @generated
|
|
151
|
-
*/
|
|
152
|
-
export type RegisteredSecretKeys = ${toStringTuple(config.secrets)};
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* AI provider resolved from kalp.config.ts
|
|
156
|
-
* @generated
|
|
157
|
-
*/
|
|
158
|
-
export type ConfiguredAIProvider = ${JSON.stringify(config.provider)};
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Custom model suggestions resolved from kalp.config.ts
|
|
162
|
-
* @generated
|
|
163
|
-
*/
|
|
164
|
-
export type ConfiguredAICustomModels = ${toStringTuple(config.customModels)};
|
|
165
|
-
`;
|
|
166
|
-
await writeFile(typesPath, typesContent, "utf-8");
|
|
167
|
-
await ensureMcpTypesFile(cwd);
|
|
168
|
-
await updateKalpDts(cwd);
|
|
169
|
-
await updateTsconfig(cwd);
|
|
170
|
-
}
|
|
171
|
-
async function updateKalpDts(cwd) {
|
|
172
|
-
const kalpDtsPath = join(cwd, "kalp.d.ts");
|
|
173
|
-
const content = buildKalpDtsContent();
|
|
174
|
-
try {
|
|
175
|
-
await access(kalpDtsPath);
|
|
176
|
-
const current = await readFile(kalpDtsPath, "utf-8");
|
|
177
|
-
if (current.trim() === content.trim()) {
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
} catch {
|
|
181
|
-
}
|
|
182
|
-
await writeFile(kalpDtsPath, content, "utf-8");
|
|
183
|
-
}
|
|
184
|
-
async function updateTsconfig(cwd) {
|
|
185
|
-
const tsconfigPath = join(cwd, "tsconfig.json");
|
|
186
|
-
try {
|
|
187
|
-
const content = await readFile(tsconfigPath, "utf-8");
|
|
188
|
-
const config = parseTsconfigJson(content);
|
|
189
|
-
if (!config) return;
|
|
190
|
-
if (!Array.isArray(config.include)) {
|
|
191
|
-
config.include = [];
|
|
192
|
-
}
|
|
193
|
-
const required = ["kalp.d.ts", ".kalp/types.d.ts", ".kalp/mcp.types.d.ts"];
|
|
194
|
-
for (const includePath of required) {
|
|
195
|
-
if (!config.include.includes(includePath)) {
|
|
196
|
-
config.include.push(includePath);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
await writeFile(tsconfigPath, JSON.stringify(config, null, 2), "utf-8");
|
|
200
|
-
} catch {
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
export {
|
|
205
|
-
writeMcpTypes,
|
|
206
|
-
generateTypes
|
|
207
|
-
};
|
|
208
|
-
//# sourceMappingURL=chunk-LPEV4QH2.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/codegen.ts"],"sourcesContent":["import { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { loadProjectConfig } from \"@/utils/project-config\";\n\nconst GENERATED_HEADER = `// 🦋 Kalp Generated Types\n// This file is auto-generated. Do not edit manually.\n`;\n\nconst GENERATED_MCP_HEADER = `// 🦋 Kalp Generated MCP Types\n// This file is auto-generated by \\`kalp mcp generate\\`.\n// Do not edit manually.\n`;\n\ntype AIProvider = \"openai\" | \"anthropic\" | \"openrouter\" | \"custom\";\n\ninterface GeneratedTypeConfig {\n secrets: string[];\n provider: AIProvider;\n customModels: string[];\n}\n\nconst DEFAULT_PROVIDER: AIProvider = \"openai\";\n\nfunction sanitizeSecrets(input: unknown): string[] {\n if (!Array.isArray(input)) return [];\n return input\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n .sort((a, b) => a.localeCompare(b));\n}\n\nfunction sanitizeCustomModels(input: unknown): string[] {\n if (!Array.isArray(input)) return [];\n return input\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n .sort((a, b) => a.localeCompare(b));\n}\n\nfunction sanitizeProvider(input: unknown): AIProvider {\n if (\n input === \"openai\" ||\n input === \"anthropic\" ||\n input === \"openrouter\" ||\n input === \"custom\"\n ) {\n return input;\n }\n return DEFAULT_PROVIDER;\n}\n\nfunction parseSecretsFromConfigText(configContent: string): string[] {\n const secretsMatch = configContent.match(/secrets:\\s*\\[([^\\]]*)\\]/);\n if (!secretsMatch) return [];\n const secretsArray = secretsMatch[1] ?? \"\";\n const secretMatches = secretsArray.match(/\"([^\"]+)\"/g);\n if (!secretMatches) return [];\n return secretMatches\n .map((match) => match.replace(/\"/g, \"\").trim())\n .filter(Boolean)\n .sort((a, b) => a.localeCompare(b));\n}\n\nfunction parseProviderFromConfigText(configContent: string): AIProvider {\n const providerMatch = configContent.match(\n /provider:\\s*\"(openai|anthropic|openrouter|custom)\"/,\n );\n return sanitizeProvider(providerMatch?.[1]);\n}\n\nfunction parseCustomModelsFromConfigText(configContent: string): string[] {\n const modelsMatch = configContent.match(/customModels:\\s*\\[([^\\]]*)\\]/);\n if (!modelsMatch) return [];\n const modelsArray = modelsMatch[1] ?? \"\";\n const modelMatches = modelsArray.match(/\"([^\"]+)\"/g);\n if (!modelMatches) return [];\n return modelMatches\n .map((match) => match.replace(/\"/g, \"\").trim())\n .filter(Boolean)\n .sort((a, b) => a.localeCompare(b));\n}\n\nasync function readConfigForTypes(cwd: string): Promise<GeneratedTypeConfig> {\n try {\n const { raw } = await loadProjectConfig(cwd);\n const aiConfig =\n raw.ai && typeof raw.ai === \"object\" ? (raw.ai as Record<string, unknown>) : {};\n\n return {\n secrets: sanitizeSecrets(raw.secrets),\n provider: sanitizeProvider(aiConfig.provider),\n customModels: sanitizeCustomModels(aiConfig.customModels),\n };\n } catch {\n const configPath = join(cwd, \"kalp.config.ts\");\n const configContent = await readFile(configPath, \"utf-8\").catch(() => \"\");\n return {\n secrets: parseSecretsFromConfigText(configContent),\n provider: parseProviderFromConfigText(configContent),\n customModels: parseCustomModelsFromConfigText(configContent),\n };\n }\n}\n\nfunction toStringTuple(values: string[]): string {\n if (values.length === 0) return \"readonly []\";\n return `readonly [${values.map((value) => JSON.stringify(value)).join(\", \")}]`;\n}\n\nfunction buildKalpDtsContent(): string {\n return `import \"@kalphq/sdk\";\nimport \"./.kalp/mcp.types\";\nimport type {\n RegisteredSecretKeys,\n ConfiguredAIProvider,\n ConfiguredAICustomModels,\n} from \"./.kalp/types\";\n\ndeclare module \"@kalphq/sdk\" {\n interface SecretsRegistry {\n keys: RegisteredSecretKeys;\n }\n\n interface KalpAIEnvironment {\n provider: ConfiguredAIProvider;\n customModels: ConfiguredAICustomModels;\n }\n}\n\nfunction parseTsconfigJson(content: string): { include?: string[] } | null {\n try {\n return JSON.parse(content) as { include?: string[] };\n } catch {\n const withoutComments = content\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/^\\s*\\/\\/.*$/gm, \"\");\n const withoutTrailingCommas = withoutComments\n .replace(/,\\s*}/g, \"}\")\n .replace(/,\\s*]/g, \"]\");\n\n try {\n return JSON.parse(withoutTrailingCommas) as { include?: string[] };\n } catch {\n return null;\n }\n }\n}\n`;\n}\n\nfunction buildEmptyMcpTypesContent(): string {\n return `${GENERATED_MCP_HEADER}import \"@kalphq/sdk\";\n\ndeclare module \"@kalphq/sdk\" {\n interface McpRegistry {}\n}\n`;\n}\n\nexport async function writeMcpTypes(cwd: string, content: string): Promise<string> {\n const kalpDir = join(cwd, \".kalp\");\n const mcpTypesPath = join(kalpDir, \"mcp.types.d.ts\");\n await mkdir(kalpDir, { recursive: true });\n await writeFile(mcpTypesPath, content, \"utf-8\");\n await updateKalpDts(cwd);\n await updateTsconfig(cwd);\n return mcpTypesPath;\n}\n\nasync function ensureMcpTypesFile(cwd: string): Promise<void> {\n const kalpDir = join(cwd, \".kalp\");\n const mcpTypesPath = join(kalpDir, \"mcp.types.d.ts\");\n\n try {\n await access(mcpTypesPath);\n return;\n } catch {\n await writeMcpTypes(cwd, buildEmptyMcpTypesContent());\n }\n}\n\n/**\n * Generate .kalp/types.d.ts and ensure local module augmentations are wired.\n */\nexport async function generateTypes(cwd: string): Promise<void> {\n const kalpDir = join(cwd, \".kalp\");\n const typesPath = join(kalpDir, \"types.d.ts\");\n const config = await readConfigForTypes(cwd);\n\n await mkdir(kalpDir, { recursive: true });\n\n const typesContent = `${GENERATED_HEADER}/**\n * Registered secrets from kalp.config.ts\n * @generated\n */\nexport type RegisteredSecretKeys = ${toStringTuple(config.secrets)};\n\n/**\n * AI provider resolved from kalp.config.ts\n * @generated\n */\nexport type ConfiguredAIProvider = ${JSON.stringify(config.provider)};\n\n/**\n * Custom model suggestions resolved from kalp.config.ts\n * @generated\n */\nexport type ConfiguredAICustomModels = ${toStringTuple(config.customModels)};\n`;\n\n await writeFile(typesPath, typesContent, \"utf-8\");\n await ensureMcpTypesFile(cwd);\n await updateKalpDts(cwd);\n await updateTsconfig(cwd);\n}\n\n/**\n * Ensure kalp.d.ts exists and contains SDK module augmentations.\n */\nexport async function updateKalpDts(cwd: string): Promise<void> {\n const kalpDtsPath = join(cwd, \"kalp.d.ts\");\n const content = buildKalpDtsContent();\n\n try {\n await access(kalpDtsPath);\n const current = await readFile(kalpDtsPath, \"utf-8\");\n if (current.trim() === content.trim()) {\n return;\n }\n } catch {\n // file does not exist yet\n }\n\n await writeFile(kalpDtsPath, content, \"utf-8\");\n}\n\n/**\n * Ensure tsconfig includes kalp.d.ts and generated .kalp types.\n */\nexport async function updateTsconfig(cwd: string): Promise<void> {\n const tsconfigPath = join(cwd, \"tsconfig.json\");\n\n try {\n const content = await readFile(tsconfigPath, \"utf-8\");\n const config = parseTsconfigJson(content);\n if (!config) return;\n\n if (!Array.isArray(config.include)) {\n config.include = [];\n }\n\n const required = [\"kalp.d.ts\", \".kalp/types.d.ts\", \".kalp/mcp.types.d.ts\"];\n for (const includePath of required) {\n if (!config.include.includes(includePath)) {\n config.include.push(includePath);\n }\n }\n\n await writeFile(tsconfigPath, JSON.stringify(config, null, 2), \"utf-8\");\n } catch {\n // no-op\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/auth.ts","../src/utils/providers/cloudflare.ts","../src/utils/providers/index.ts"],"sourcesContent":["import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { execa } from \"execa\";\nimport { ensureGlobalConfigDir } from \"@/utils/config\";\n\nconst AUTH_FILE = async () => join(await ensureGlobalConfigDir(), \"auth.json\");\n\nexport interface AuthConfig {\n provider: \"cloudflare\";\n accountId: string;\n email: string;\n expiresAt: string;\n}\n\ninterface CloudflareIdentity {\n loggedIn?: boolean;\n email?: string;\n accounts?: Array<{ id?: string; account_tag?: string; name?: string }>;\n}\n\nexport async function getCloudflareIdentity(): Promise<CloudflareIdentity | null> {\n try {\n const run = async (args: string[]) =>\n execa(\"npx\", args, {\n env: { FORCE_COLOR: \"0\", CLOUDFLARE_OUTPUT_FORMAT: \"json\" },\n });\n\n const firstAttempt = await run([\n \"wrangler\",\n \"whoami\",\n \"--output-format\",\n \"json\",\n ]).catch(() => null);\n\n if (firstAttempt) {\n return JSON.parse(firstAttempt.stdout) as CloudflareIdentity;\n }\n\n const fallback = await run([\"wrangler\", \"whoami\", \"--json\"]);\n return JSON.parse(fallback.stdout) as CloudflareIdentity;\n } catch {\n return null;\n }\n}\n\nexport async function saveAuthConfig(config: AuthConfig): Promise<void> {\n const authPath = await AUTH_FILE();\n await writeFile(authPath, JSON.stringify(config, null, 2), \"utf-8\");\n}\n\nexport async function getAuthConfig(): Promise<AuthConfig | null> {\n try {\n const authPath = await AUTH_FILE();\n const content = await readFile(authPath, \"utf-8\");\n return JSON.parse(content) as AuthConfig;\n } catch {\n return null;\n }\n}\n\nexport async function isLoggedIn(): Promise<boolean> {\n const auth = await getAuthConfig();\n if (!auth) return false;\n return new Date(auth.expiresAt).getTime() > Date.now();\n}\n\nexport async function requireAuth(): Promise<AuthConfig> {\n const auth = await getAuthConfig();\n if (!auth || new Date(auth.expiresAt).getTime() <= Date.now()) {\n throw new Error(\"Not authenticated. Run `kalp login` first.\");\n }\n return auth;\n}\n\n/**\n * Backward-compatible helper for legacy commands.\n * Returns a pseudo-token when Cloudflare auth is present.\n */\nexport async function getAuthToken(): Promise<string | null> {\n const auth = await getAuthConfig();\n if (!auth || new Date(auth.expiresAt).getTime() <= Date.now()) {\n return null;\n }\n return `${auth.provider}:${auth.accountId}`;\n}\n","import { execa } from \"execa\";\nimport { mkdtemp, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { RuntimeProvider, RemoteSecret } from \"@/utils/providers/types\";\nimport { getCloudflareIdentity } from \"@/utils/auth\";\n\nfunction parseNamespaceList(stdout: string): Array<{ id: string; title: string }> {\n try {\n const parsed = JSON.parse(stdout);\n if (Array.isArray(parsed)) {\n return parsed\n .map((item) => ({\n id: String((item as { id?: string }).id ?? \"\"),\n title: String((item as { title?: string }).title ?? \"\"),\n }))\n .filter((item) => !!item.id && !!item.title);\n }\n } catch {}\n return [];\n}\n\nfunction parseKvKeyList(stdout: string): Array<{ name: string }> {\n const trimmed = stdout.trim();\n if (!trimmed) return [];\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (!Array.isArray(parsed)) return [];\n return parsed\n .map((item) => {\n const record = item as Record<string, unknown>;\n const name = record.name;\n return typeof name === \"string\" && name.length > 0 ? { name } : null;\n })\n .filter((item): item is { name: string } => !!item);\n } catch {\n return [];\n }\n}\n\nfunction parseSecretsList(stdout: string): RemoteSecret[] {\n const trimmed = stdout.trim();\n if (!trimmed) return [];\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (!Array.isArray(parsed)) return [];\n const secrets: RemoteSecret[] = [];\n for (const item of parsed) {\n const record = item as Record<string, unknown>;\n const name = record.name;\n if (typeof name !== \"string\" || name.length === 0) continue;\n const type = typeof record.type === \"string\" ? record.type : undefined;\n if (type) {\n secrets.push({ name, type });\n } else {\n secrets.push({ name });\n }\n }\n return secrets;\n } catch {\n return [];\n }\n}\n\nfunction findWorkerUrl(output: string): string | null {\n const match = output.match(/https:\\/\\/[^\\s]+\\.workers\\.dev/);\n return match?.[0] ?? null;\n}\n\nfunction normalizeDomainCandidate(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed || trimmed.includes(\"@\")) return null;\n\n const fromUrl = trimmed.match(/^https?:\\/\\/([^/\\s]+)/i)?.[1];\n const candidate = (fromUrl ?? trimmed).replace(/^https?:\\/\\//i, \"\").split(\"/\")[0] ?? \"\";\n const host = candidate.replace(/^\\*\\./, \"\").toLowerCase();\n\n if (!host) return null;\n if (host.includes(\"*\")) return null;\n if (host.endsWith(\".workers.dev\")) return null;\n if (host.endsWith(\".pages.dev\")) return null;\n if (!/^[a-z0-9.-]+\\.[a-z]{2,}$/i.test(host)) return null;\n return host;\n}\n\nfunction extractCustomDomainsFromRoutesConfig(configText: string): string[] {\n const routesMatch = configText.match(/\"routes\"\\s*:\\s*(\\[[\\s\\S]*?\\])/);\n if (!routesMatch) return [];\n const serializedRoutes = routesMatch[1];\n if (!serializedRoutes) return [];\n\n try {\n const routes = JSON.parse(serializedRoutes) as Array<{\n pattern?: string;\n custom_domain?: boolean;\n }>;\n if (!Array.isArray(routes)) return [];\n const domains = routes\n .filter((route) => route?.custom_domain === true)\n .map((route) => normalizeDomainCandidate(String(route.pattern ?? \"\")))\n .filter((domain): domain is string => !!domain);\n return [...new Set(domains)];\n } catch {\n return [];\n }\n}\n\nfunction collectDomainsFromStatusNode(\n node: unknown,\n keyHint: string | null,\n out: Set<string>,\n): void {\n if (typeof node === \"string\") {\n if (keyHint && /(domain|route|pattern)/i.test(keyHint)) {\n const normalized = normalizeDomainCandidate(node);\n if (normalized) out.add(normalized);\n }\n return;\n }\n\n if (Array.isArray(node)) {\n for (const item of node) {\n collectDomainsFromStatusNode(item, keyHint, out);\n }\n return;\n }\n\n if (!node || typeof node !== \"object\") return;\n for (const [key, value] of Object.entries(node as Record<string, unknown>)) {\n collectDomainsFromStatusNode(value, key, out);\n }\n}\n\nfunction parseCustomDomainsFromStatusOutput(statusJson: string): string[] {\n try {\n const parsed = JSON.parse(statusJson) as unknown;\n const domains = new Set<string>();\n collectDomainsFromStatusNode(parsed, null, domains);\n return [...domains].sort((a, b) => a.localeCompare(b));\n } catch {\n return [];\n }\n}\n\nasync function resolveCustomDomains(params: {\n cwd: string;\n configPath: string;\n workerName: string;\n}): Promise<string[]> {\n const { cwd, configPath, workerName } = params;\n\n const status = await execa(\n \"npx\",\n [\n \"wrangler\",\n \"deployments\",\n \"status\",\n \"--name\",\n workerName,\n \"--json\",\n \"--config\",\n configPath,\n ],\n { cwd },\n ).catch(() => null);\n\n const fromStatus = status ? parseCustomDomainsFromStatusOutput(status.stdout) : [];\n if (fromStatus.length > 0) return fromStatus;\n\n const configText = await readFile(configPath, \"utf-8\").catch(() => \"\");\n return extractCustomDomainsFromRoutesConfig(configText);\n}\n\nexport const cloudflareProvider: RuntimeProvider = {\n name: \"cloudflare\",\n async login() {\n await execa(\"npx\", [\"wrangler\", \"login\"], { stdio: \"inherit\" });\n },\n async whoami() {\n const identity = await getCloudflareIdentity();\n const account = identity?.accounts?.[0];\n const accountId = account?.id ?? account?.account_tag;\n const email = identity?.email;\n if (!accountId || !email) return null;\n return { provider: \"cloudflare\", accountId, email };\n },\n async putSecret({ cwd, configPath, name, value }) {\n await execa(\n \"npx\",\n [\"wrangler\", \"secret\", \"put\", name, \"--config\", configPath],\n { cwd, input: `${value}\\n` },\n );\n },\n async listSecrets({ cwd, configPath }) {\n const jsonAttempt = await execa(\n \"npx\",\n [\n \"wrangler\",\n \"secret\",\n \"list\",\n \"--config\",\n configPath,\n \"--format\",\n \"json\",\n ],\n { cwd },\n ).catch(() => null);\n if (jsonAttempt) return parseSecretsList(jsonAttempt.stdout);\n\n const fallback = await execa(\n \"npx\",\n [\"wrangler\", \"secret\", \"list\", \"--config\", configPath],\n { cwd },\n );\n return parseSecretsList(fallback.stdout);\n },\n async deleteSecret({ cwd, configPath, name }) {\n await execa(\n \"npx\",\n [\"wrangler\", \"secret\", \"delete\", name, \"--config\", configPath],\n { cwd },\n );\n },\n async deployRuntime({ cwd, configPath, useSecretsFile }) {\n const args = useSecretsFile\n ? [\"wrangler\", \"deploy\", \"--config\", configPath, \"--secrets-file\", \".env\"]\n : [\"wrangler\", \"deploy\", \"--config\", configPath];\n const deploy = await execa(\"npx\", args, { cwd });\n const rawOutput = [deploy.stdout, deploy.stderr].filter(Boolean).join(\"\\n\");\n const workerUrl = findWorkerUrl(rawOutput);\n const configText = await readFile(configPath, \"utf-8\").catch(() => null);\n const workerName = configText?.match(/\"name\"\\s*:\\s*\"([^\"]+)\"/)?.[1];\n const customDomains = workerName\n ? await resolveCustomDomains({ cwd, configPath, workerName }).catch(() => [])\n : [];\n\n if (!workerUrl) {\n if (!workerName) {\n throw new Error(\"Could not resolve runtime URL from deployment output.\");\n }\n return {\n workerUrl: `https://${workerName}.workers.dev`,\n customDomains,\n rawOutput,\n };\n }\n return { workerUrl, customDomains, rawOutput };\n },\n async putManifest({ cwd, configPath, key, jsonPath }) {\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n \"--binding\",\n \"KALP_MANIFESTS\",\n key,\n \"--path\",\n jsonPath,\n \"--remote\",\n \"--config\",\n configPath,\n ],\n { cwd },\n );\n },\n async putValue({ cwd, configPath, key, value }) {\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n \"--binding\",\n \"KALP_MANIFESTS\",\n key,\n value,\n \"--remote\",\n \"--config\",\n configPath,\n ],\n { cwd },\n );\n },\n async deleteValue({ cwd, configPath, key }) {\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"delete\",\n \"--binding\",\n \"KALP_MANIFESTS\",\n key,\n \"--remote\",\n \"--config\",\n configPath,\n ],\n { cwd },\n );\n },\n async getValue({ cwd, configPath, key }) {\n const result = await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"get\",\n \"--binding\",\n \"KALP_MANIFESTS\",\n key,\n \"--remote\",\n \"--config\",\n configPath,\n ],\n { cwd },\n ).catch(() => null);\n const output = result?.stdout?.trim();\n return output ? output : null;\n },\n async listNamespaces({ cwd, configPath }) {\n const json = await execa(\n \"npx\",\n [\"wrangler\", \"kv\", \"namespace\", \"list\", \"--config\", configPath, \"--json\"],\n { cwd },\n ).catch(() => null);\n if (json) return parseNamespaceList(json.stdout);\n const plain = await execa(\n \"npx\",\n [\"wrangler\", \"kv\", \"namespace\", \"list\", \"--config\", configPath],\n { cwd },\n );\n return parseNamespaceList(plain.stdout);\n },\n async listKeys({ cwd, configPath, prefix }) {\n const args = [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"list\",\n \"--binding\",\n \"KALP_MANIFESTS\",\n \"--remote\",\n \"--config\",\n configPath,\n ];\n if (prefix && prefix.trim()) {\n args.push(\"--prefix\", prefix.trim());\n }\n const jsonAttempt = await execa(\"npx\", [...args, \"--format\", \"json\"], {\n cwd,\n }).catch(() => null);\n if (jsonAttempt) return parseKvKeyList(jsonAttempt.stdout);\n\n const fallback = await execa(\"npx\", args, { cwd });\n return parseKvKeyList(fallback.stdout);\n },\n};\n\nexport async function withTempJsonFile<T>(\n prefix: string,\n payload: unknown,\n fn: (path: string) => Promise<T>,\n): Promise<T> {\n const dir = await mkdtemp(join(tmpdir(), prefix));\n const filePath = join(dir, \"payload.json\");\n await writeFile(filePath, JSON.stringify(payload), \"utf-8\");\n try {\n return await fn(filePath);\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n}\n","import { cloudflareProvider } from \"@/utils/providers/cloudflare\";\nimport type { RuntimeProvider } from \"@/utils/providers/types\";\n\nexport function resolveProvider(): RuntimeProvider {\n return cloudflareProvider;\n}\n\nexport type {\n RuntimeProvider,\n ProviderIdentity,\n DeployResult,\n RemoteSecret,\n} from \"@/utils/providers/types\";\n"],"mappings":";;;;;;AAAA,SAAS,UAAU,iBAAiB;AACpC,SAAS,YAAY;AACrB,SAAS,aAAa;AAGtB,IAAM,YAAY,YAAY,KAAK,MAAM,sBAAsB,GAAG,WAAW;AAe7E,eAAsB,wBAA4D;AAChF,MAAI;AACF,UAAM,MAAM,OAAO,SACjB,MAAM,OAAO,MAAM;AAAA,MACjB,KAAK,EAAE,aAAa,KAAK,0BAA0B,OAAO;AAAA,IAC5D,CAAC;AAEH,UAAM,eAAe,MAAM,IAAI;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC,EAAE,MAAM,MAAM,IAAI;AAEnB,QAAI,cAAc;AAChB,aAAO,KAAK,MAAM,aAAa,MAAM;AAAA,IACvC;AAEA,UAAM,WAAW,MAAM,IAAI,CAAC,YAAY,UAAU,QAAQ,CAAC;AAC3D,WAAO,KAAK,MAAM,SAAS,MAAM;AAAA,EACnC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,eAAe,QAAmC;AACtE,QAAM,WAAW,MAAM,UAAU;AACjC,QAAM,UAAU,UAAU,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AACpE;AAEA,eAAsB,gBAA4C;AAChE,MAAI;AACF,UAAM,WAAW,MAAM,UAAU;AACjC,UAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAChD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAQA,eAAsB,cAAmC;AACvD,QAAM,OAAO,MAAM,cAAc;AACjC,MAAI,CAAC,QAAQ,IAAI,KAAK,KAAK,SAAS,EAAE,QAAQ,KAAK,KAAK,IAAI,GAAG;AAC7D,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,SAAO;AACT;;;ACxEA,SAAS,SAAAA,cAAa;AACtB,SAAS,SAAS,YAAAC,WAAU,IAAI,aAAAC,kBAAiB;AACjD,SAAS,QAAAC,aAAY;AACrB,SAAS,cAAc;AAIvB,SAAS,mBAAmB,QAAsD;AAChF,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,MAAM;AAChC,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,aAAO,OACJ,IAAI,CAAC,UAAU;AAAA,QACd,IAAI,OAAQ,KAAyB,MAAM,EAAE;AAAA,QAC7C,OAAO,OAAQ,KAA4B,SAAS,EAAE;AAAA,MACxD,EAAE,EACD,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,KAAK,KAAK;AAAA,IAC/C;AAAA,EACF,QAAQ;AAAA,EAAC;AACT,SAAO,CAAC;AACV;AAEA,SAAS,eAAe,QAAyC;AAC/D,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,QAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO,CAAC;AACpC,WAAO,OACJ,IAAI,CAAC,SAAS;AACb,YAAM,SAAS;AACf,YAAM,OAAO,OAAO;AACpB,aAAO,OAAO,SAAS,YAAY,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI;AAAA,IAClE,CAAC,EACA,OAAO,CAAC,SAAmC,CAAC,CAAC,IAAI;AAAA,EACtD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,iBAAiB,QAAgC;AACxD,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,CAAC,QAAS,QAAO,CAAC;AAEtB,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,QAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO,CAAC;AACpC,UAAM,UAA0B,CAAC;AACjC,eAAW,QAAQ,QAAQ;AACzB,YAAM,SAAS;AACf,YAAM,OAAO,OAAO;AACpB,UAAI,OAAO,SAAS,YAAY,KAAK,WAAW,EAAG;AACnD,YAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAC7D,UAAI,MAAM;AACR,gBAAQ,KAAK,EAAE,MAAM,KAAK,CAAC;AAAA,MAC7B,OAAO;AACL,gBAAQ,KAAK,EAAE,KAAK,CAAC;AAAA,MACvB;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,cAAc,QAA+B;AACpD,QAAM,QAAQ,OAAO,MAAM,gCAAgC;AAC3D,SAAO,QAAQ,CAAC,KAAK;AACvB;AAEA,SAAS,yBAAyB,OAA8B;AAC9D,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,WAAW,QAAQ,SAAS,GAAG,EAAG,QAAO;AAE9C,QAAM,UAAU,QAAQ,MAAM,wBAAwB,IAAI,CAAC;AAC3D,QAAM,aAAa,WAAW,SAAS,QAAQ,iBAAiB,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK;AACrF,QAAM,OAAO,UAAU,QAAQ,SAAS,EAAE,EAAE,YAAY;AAExD,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,KAAK,SAAS,GAAG,EAAG,QAAO;AAC/B,MAAI,KAAK,SAAS,cAAc,EAAG,QAAO;AAC1C,MAAI,KAAK,SAAS,YAAY,EAAG,QAAO;AACxC,MAAI,CAAC,4BAA4B,KAAK,IAAI,EAAG,QAAO;AACpD,SAAO;AACT;AAEA,SAAS,qCAAqC,YAA8B;AAC1E,QAAM,cAAc,WAAW,MAAM,+BAA+B;AACpE,MAAI,CAAC,YAAa,QAAO,CAAC;AAC1B,QAAM,mBAAmB,YAAY,CAAC;AACtC,MAAI,CAAC,iBAAkB,QAAO,CAAC;AAE/B,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,gBAAgB;AAI1C,QAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO,CAAC;AACpC,UAAM,UAAU,OACb,OAAO,CAAC,UAAU,OAAO,kBAAkB,IAAI,EAC/C,IAAI,CAAC,UAAU,yBAAyB,OAAO,MAAM,WAAW,EAAE,CAAC,CAAC,EACpE,OAAO,CAAC,WAA6B,CAAC,CAAC,MAAM;AAChD,WAAO,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC;AAAA,EAC7B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,6BACP,MACA,SACA,KACM;AACN,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI,WAAW,0BAA0B,KAAK,OAAO,GAAG;AACtD,YAAM,aAAa,yBAAyB,IAAI;AAChD,UAAI,WAAY,KAAI,IAAI,UAAU;AAAA,IACpC;AACA;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,eAAW,QAAQ,MAAM;AACvB,mCAA6B,MAAM,SAAS,GAAG;AAAA,IACjD;AACA;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAA+B,GAAG;AAC1E,iCAA6B,OAAO,KAAK,GAAG;AAAA,EAC9C;AACF;AAEA,SAAS,mCAAmC,YAA8B;AACxE,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,UAAU;AACpC,UAAM,UAAU,oBAAI,IAAY;AAChC,iCAA6B,QAAQ,MAAM,OAAO;AAClD,WAAO,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAAA,EACvD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,qBAAqB,QAId;AACpB,QAAM,EAAE,KAAK,YAAY,WAAW,IAAI;AAExC,QAAM,SAAS,MAAMC;AAAA,IACnB;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,EAAE,IAAI;AAAA,EACR,EAAE,MAAM,MAAM,IAAI;AAElB,QAAM,aAAa,SAAS,mCAAmC,OAAO,MAAM,IAAI,CAAC;AACjF,MAAI,WAAW,SAAS,EAAG,QAAO;AAElC,QAAM,aAAa,MAAMC,UAAS,YAAY,OAAO,EAAE,MAAM,MAAM,EAAE;AACrE,SAAO,qCAAqC,UAAU;AACxD;AAEO,IAAM,qBAAsC;AAAA,EACjD,MAAM;AAAA,EACN,MAAM,QAAQ;AACZ,UAAMD,OAAM,OAAO,CAAC,YAAY,OAAO,GAAG,EAAE,OAAO,UAAU,CAAC;AAAA,EAChE;AAAA,EACA,MAAM,SAAS;AACb,UAAM,WAAW,MAAM,sBAAsB;AAC7C,UAAM,UAAU,UAAU,WAAW,CAAC;AACtC,UAAM,YAAY,SAAS,MAAM,SAAS;AAC1C,UAAM,QAAQ,UAAU;AACxB,QAAI,CAAC,aAAa,CAAC,MAAO,QAAO;AACjC,WAAO,EAAE,UAAU,cAAc,WAAW,MAAM;AAAA,EACpD;AAAA,EACA,MAAM,UAAU,EAAE,KAAK,YAAY,MAAM,MAAM,GAAG;AAChD,UAAMA;AAAA,MACJ;AAAA,MACA,CAAC,YAAY,UAAU,OAAO,MAAM,YAAY,UAAU;AAAA,MAC1D,EAAE,KAAK,OAAO,GAAG,KAAK;AAAA,EAAK;AAAA,IAC7B;AAAA,EACF;AAAA,EACA,MAAM,YAAY,EAAE,KAAK,WAAW,GAAG;AACrC,UAAM,cAAc,MAAMA;AAAA,MACxB;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,EAAE,IAAI;AAAA,IACR,EAAE,MAAM,MAAM,IAAI;AAClB,QAAI,YAAa,QAAO,iBAAiB,YAAY,MAAM;AAE3D,UAAM,WAAW,MAAMA;AAAA,MACrB;AAAA,MACA,CAAC,YAAY,UAAU,QAAQ,YAAY,UAAU;AAAA,MACrD,EAAE,IAAI;AAAA,IACR;AACA,WAAO,iBAAiB,SAAS,MAAM;AAAA,EACzC;AAAA,EACA,MAAM,aAAa,EAAE,KAAK,YAAY,KAAK,GAAG;AAC5C,UAAMA;AAAA,MACJ;AAAA,MACA,CAAC,YAAY,UAAU,UAAU,MAAM,YAAY,UAAU;AAAA,MAC7D,EAAE,IAAI;AAAA,IACR;AAAA,EACF;AAAA,EACA,MAAM,cAAc,EAAE,KAAK,YAAY,eAAe,GAAG;AACvD,UAAM,OAAO,iBACT,CAAC,YAAY,UAAU,YAAY,YAAY,kBAAkB,MAAM,IACvE,CAAC,YAAY,UAAU,YAAY,UAAU;AACjD,UAAM,SAAS,MAAMA,OAAM,OAAO,MAAM,EAAE,IAAI,CAAC;AAC/C,UAAM,YAAY,CAAC,OAAO,QAAQ,OAAO,MAAM,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAC1E,UAAM,YAAY,cAAc,SAAS;AACzC,UAAM,aAAa,MAAMC,UAAS,YAAY,OAAO,EAAE,MAAM,MAAM,IAAI;AACvE,UAAM,aAAa,YAAY,MAAM,wBAAwB,IAAI,CAAC;AAClE,UAAM,gBAAgB,aAClB,MAAM,qBAAqB,EAAE,KAAK,YAAY,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC,CAAC,IAC1E,CAAC;AAEL,QAAI,CAAC,WAAW;AACd,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,MAAM,uDAAuD;AAAA,MACzE;AACA,aAAO;AAAA,QACL,WAAW,WAAW,UAAU;AAAA,QAChC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,WAAW,eAAe,UAAU;AAAA,EAC/C;AAAA,EACA,MAAM,YAAY,EAAE,KAAK,YAAY,KAAK,SAAS,GAAG;AACpD,UAAMD;AAAA,MACJ;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,EAAE,IAAI;AAAA,IACR;AAAA,EACF;AAAA,EACA,MAAM,SAAS,EAAE,KAAK,YAAY,KAAK,MAAM,GAAG;AAC9C,UAAMA;AAAA,MACJ;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,EAAE,IAAI;AAAA,IACR;AAAA,EACF;AAAA,EACA,MAAM,YAAY,EAAE,KAAK,YAAY,IAAI,GAAG;AAC1C,UAAMA;AAAA,MACJ;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,EAAE,IAAI;AAAA,IACR;AAAA,EACF;AAAA,EACA,MAAM,SAAS,EAAE,KAAK,YAAY,IAAI,GAAG;AACvC,UAAM,SAAS,MAAMA;AAAA,MACnB;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,EAAE,IAAI;AAAA,IACR,EAAE,MAAM,MAAM,IAAI;AAClB,UAAM,SAAS,QAAQ,QAAQ,KAAK;AACpC,WAAO,SAAS,SAAS;AAAA,EAC3B;AAAA,EACA,MAAM,eAAe,EAAE,KAAK,WAAW,GAAG;AACxC,UAAM,OAAO,MAAMA;AAAA,MACjB;AAAA,MACA,CAAC,YAAY,MAAM,aAAa,QAAQ,YAAY,YAAY,QAAQ;AAAA,MACxE,EAAE,IAAI;AAAA,IACR,EAAE,MAAM,MAAM,IAAI;AAClB,QAAI,KAAM,QAAO,mBAAmB,KAAK,MAAM;AAC/C,UAAM,QAAQ,MAAMA;AAAA,MAClB;AAAA,MACA,CAAC,YAAY,MAAM,aAAa,QAAQ,YAAY,UAAU;AAAA,MAC9D,EAAE,IAAI;AAAA,IACR;AACA,WAAO,mBAAmB,MAAM,MAAM;AAAA,EACxC;AAAA,EACA,MAAM,SAAS,EAAE,KAAK,YAAY,OAAO,GAAG;AAC1C,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,UAAU,OAAO,KAAK,GAAG;AAC3B,WAAK,KAAK,YAAY,OAAO,KAAK,CAAC;AAAA,IACrC;AACA,UAAM,cAAc,MAAMA,OAAM,OAAO,CAAC,GAAG,MAAM,YAAY,MAAM,GAAG;AAAA,MACpE;AAAA,IACF,CAAC,EAAE,MAAM,MAAM,IAAI;AACnB,QAAI,YAAa,QAAO,eAAe,YAAY,MAAM;AAEzD,UAAM,WAAW,MAAMA,OAAM,OAAO,MAAM,EAAE,IAAI,CAAC;AACjD,WAAO,eAAe,SAAS,MAAM;AAAA,EACvC;AACF;;;ACxWO,SAAS,kBAAmC;AACjD,SAAO;AACT;","names":["execa","readFile","writeFile","join","execa","readFile"]}
|
package/dist/chunk-VCFH3R34.js
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// src/utils/ir/hashIR.ts
|
|
4
|
-
import { calculateAgentHash } from "@kalphq/compiler";
|
|
5
|
-
function computePushHash(ir) {
|
|
6
|
-
const bundles = ir.bundles || {};
|
|
7
|
-
const handlers = Object.keys(bundles).reduce(
|
|
8
|
-
(acc, hash) => ({
|
|
9
|
-
...acc,
|
|
10
|
-
[hash]: { hash }
|
|
11
|
-
}),
|
|
12
|
-
{}
|
|
13
|
-
);
|
|
14
|
-
return calculateAgentHash(ir, handlers);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// src/utils/manifest/index.ts
|
|
18
|
-
import { access, readFile, rm, mkdtemp } from "fs/promises";
|
|
19
|
-
import { join } from "path";
|
|
20
|
-
import { tmpdir } from "os";
|
|
21
|
-
import { buildAgent } from "@kalphq/compiler";
|
|
22
|
-
async function readAgentManifest(params) {
|
|
23
|
-
const { cwd, agentName } = params;
|
|
24
|
-
const agentPath = join(cwd, "agents", agentName, "index.ts");
|
|
25
|
-
await access(agentPath);
|
|
26
|
-
const tempOutDir = await mkdtemp(join(tmpdir(), "kalp-build-"));
|
|
27
|
-
try {
|
|
28
|
-
await buildAgent(agentPath, tempOutDir, cwd);
|
|
29
|
-
const irContent = await readFile(join(tempOutDir, "ir.json"), "utf-8");
|
|
30
|
-
const ir = JSON.parse(irContent);
|
|
31
|
-
return {
|
|
32
|
-
format: "kalp-agent-manifest",
|
|
33
|
-
schemaVersion: 3,
|
|
34
|
-
ir,
|
|
35
|
-
metadata: {
|
|
36
|
-
generatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
} finally {
|
|
40
|
-
await rm(tempOutDir, { recursive: true, force: true });
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// src/utils/validate.ts
|
|
45
|
-
import {
|
|
46
|
-
analyzeHandler,
|
|
47
|
-
calculateAgentHash as calculateAgentHash2,
|
|
48
|
-
validateIR,
|
|
49
|
-
validateIRBindings
|
|
50
|
-
} from "@kalphq/compiler";
|
|
51
|
-
function validateCompiledIR(input) {
|
|
52
|
-
const { ir, hash } = input;
|
|
53
|
-
const bundles = ir.bundles || {};
|
|
54
|
-
const bundleHashes = Object.keys(bundles);
|
|
55
|
-
const irValidation = validateIR(ir);
|
|
56
|
-
if (!irValidation.valid) {
|
|
57
|
-
return { ok: false, phase: "ir", errors: irValidation.errors };
|
|
58
|
-
}
|
|
59
|
-
const bindingsValidation = validateIRBindings(ir, bundleHashes);
|
|
60
|
-
if (!bindingsValidation.valid) {
|
|
61
|
-
return { ok: false, phase: "bindings", errors: bindingsValidation.errors };
|
|
62
|
-
}
|
|
63
|
-
const handlers = bundleHashes.reduce(
|
|
64
|
-
(acc, key) => ({ ...acc, [key]: { hash: key } }),
|
|
65
|
-
{}
|
|
66
|
-
);
|
|
67
|
-
const expectedHash = calculateAgentHash2(ir, handlers);
|
|
68
|
-
if (expectedHash !== hash) {
|
|
69
|
-
return {
|
|
70
|
-
ok: false,
|
|
71
|
-
phase: "hash",
|
|
72
|
-
errors: [
|
|
73
|
-
`Hash mismatch: client provided ${hash}, calculated ${expectedHash}`
|
|
74
|
-
]
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
const analysis = Object.entries(bundles).map(
|
|
78
|
-
([name, bundle]) => ({
|
|
79
|
-
name,
|
|
80
|
-
...analyzeHandler(bundle.code)
|
|
81
|
-
})
|
|
82
|
-
);
|
|
83
|
-
const blockers = analysis.flatMap(
|
|
84
|
-
(entry) => entry.blockers.map((blocker) => `${blocker} in ${entry.name}`)
|
|
85
|
-
);
|
|
86
|
-
if (blockers.length > 0) {
|
|
87
|
-
return {
|
|
88
|
-
ok: false,
|
|
89
|
-
phase: "analysis",
|
|
90
|
-
blockers,
|
|
91
|
-
errors: blockers.map((b) => `[Analysis Blocker] ${b}`),
|
|
92
|
-
analysis
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
return { ok: true, analysis };
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
export {
|
|
99
|
-
computePushHash,
|
|
100
|
-
readAgentManifest,
|
|
101
|
-
validateCompiledIR
|
|
102
|
-
};
|
|
103
|
-
//# sourceMappingURL=chunk-VCFH3R34.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/ir/hashIR.ts","../src/utils/manifest/index.ts","../src/utils/validate.ts"],"sourcesContent":["import type { IRGraph } from \"@kalphq/sdk\";\nimport { calculateAgentHash } from \"@kalphq/compiler\";\n\nexport function getIRHash(ir: IRGraph): string {\n const { calculateIRHash } = require(\"@kalphq/compiler\");\n return calculateIRHash(ir);\n}\n\nexport function computePushHash(\n ir: IRGraph & { bundles?: Record<string, { code: string }> },\n): string {\n const bundles = ir.bundles || {};\n const handlers = Object.keys(bundles).reduce(\n (acc, hash) => ({\n ...acc,\n [hash]: { hash },\n }),\n {} as Record<string, { hash: string }>,\n );\n\n return calculateAgentHash(ir, handlers);\n}\n","import { access, readFile, rm, mkdtemp } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport { buildAgent } from \"@kalphq/compiler\";\n\nimport type { AgentManifestV3 } from \"@/utils/manifest/types\";\nexport type { AgentManifestV3 } from \"@/utils/manifest/types\";\nexport { computePushHash } from \"@/utils/ir/hashIR\";\n\n/**\n * Reads and compiles an agent into a pushable manifest.\n */\nexport async function readAgentManifest(params: {\n cwd: string;\n agentName: string;\n}): Promise<AgentManifestV3> {\n const { cwd, agentName } = params;\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n await access(agentPath);\n\n // Use a temporary directory for the compiler output\n const tempOutDir = await mkdtemp(join(tmpdir(), \"kalp-build-\"));\n\n try {\n // Build the agent - compiler produces ir.bundles with all handler code\n await buildAgent(agentPath, tempOutDir, cwd);\n\n // Load the IR generated by the compiler (includes bundles with code)\n const irContent = await readFile(join(tempOutDir, \"ir.json\"), \"utf-8\");\n const ir = JSON.parse(irContent);\n\n return {\n format: \"kalp-agent-manifest\",\n schemaVersion: 3,\n ir,\n metadata: {\n generatedAt: new Date().toISOString(),\n },\n };\n } finally {\n // Cleanup temp build directory\n await rm(tempOutDir, { recursive: true, force: true });\n }\n}\n","import {\n analyzeHandler,\n calculateAgentHash,\n validateIR,\n validateIRBindings,\n} from \"@kalphq/compiler\";\nimport type { IRGraph } from \"@kalphq/sdk\";\n\nexport interface NamedAnalysis {\n name: string;\n capabilities: string[];\n imports: { external: string[]; internal: string[] };\n blockers: string[];\n warnings: string[];\n}\n\ntype IRWithBundles = IRGraph & {\n bundles?: Record<string, { code: string }>;\n};\n\nexport function validateCompiledIR(input: {\n agentName: string;\n ir: IRWithBundles;\n hash: string;\n}): {\n ok: boolean;\n phase?: \"ir\" | \"bindings\" | \"hash\" | \"analysis\";\n errors?: string[];\n blockers?: string[];\n analysis?: NamedAnalysis[];\n} {\n const { ir, hash } = input;\n const bundles = ir.bundles || {};\n const bundleHashes = Object.keys(bundles);\n\n const irValidation = validateIR(ir);\n if (!irValidation.valid) {\n return { ok: false, phase: \"ir\", errors: irValidation.errors };\n }\n\n const bindingsValidation = validateIRBindings(ir, bundleHashes);\n if (!bindingsValidation.valid) {\n return { ok: false, phase: \"bindings\", errors: bindingsValidation.errors };\n }\n\n const handlers = bundleHashes.reduce(\n (acc, key) => ({ ...acc, [key]: { hash: key } }),\n {} as Record<string, { hash: string }>,\n );\n const expectedHash = calculateAgentHash(ir, handlers);\n\n if (expectedHash !== hash) {\n return {\n ok: false,\n phase: \"hash\",\n errors: [\n `Hash mismatch: client provided ${hash}, calculated ${expectedHash}`,\n ],\n };\n }\n\n const analysis: NamedAnalysis[] = Object.entries(bundles).map(\n ([name, bundle]) => ({\n name,\n ...analyzeHandler(bundle.code),\n }),\n );\n\n const blockers = analysis.flatMap((entry) =>\n entry.blockers.map((blocker) => `${blocker} in ${entry.name}`),\n );\n\n if (blockers.length > 0) {\n return {\n ok: false,\n phase: \"analysis\",\n blockers,\n errors: blockers.map((b) => `[Analysis Blocker] ${b}`),\n analysis,\n };\n }\n\n return { ok: true, analysis };\n}\n"],"mappings":";;;AACA,SAAS,0BAA0B;AAO5B,SAAS,gBACd,IACQ;AACR,QAAM,UAAU,GAAG,WAAW,CAAC;AAC/B,QAAM,WAAW,OAAO,KAAK,OAAO,EAAE;AAAA,IACpC,CAAC,KAAK,UAAU;AAAA,MACd,GAAG;AAAA,MACH,CAAC,IAAI,GAAG,EAAE,KAAK;AAAA,IACjB;AAAA,IACA,CAAC;AAAA,EACH;AAEA,SAAO,mBAAmB,IAAI,QAAQ;AACxC;;;ACrBA,SAAS,QAAQ,UAAU,IAAI,eAAe;AAC9C,SAAS,YAAY;AACrB,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAS3B,eAAsB,kBAAkB,QAGX;AAC3B,QAAM,EAAE,KAAK,UAAU,IAAI;AAC3B,QAAM,YAAY,KAAK,KAAK,UAAU,WAAW,UAAU;AAC3D,QAAM,OAAO,SAAS;AAGtB,QAAM,aAAa,MAAM,QAAQ,KAAK,OAAO,GAAG,aAAa,CAAC;AAE9D,MAAI;AAEF,UAAM,WAAW,WAAW,YAAY,GAAG;AAG3C,UAAM,YAAY,MAAM,SAAS,KAAK,YAAY,SAAS,GAAG,OAAO;AACrE,UAAM,KAAK,KAAK,MAAM,SAAS;AAE/B,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,eAAe;AAAA,MACf;AAAA,MACA,UAAU;AAAA,QACR,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACtC;AAAA,IACF;AAAA,EACF,UAAE;AAEA,UAAM,GAAG,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACvD;AACF;;;AC3CA;AAAA,EACE;AAAA,EACA,sBAAAA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAeA,SAAS,mBAAmB,OAUjC;AACA,QAAM,EAAE,IAAI,KAAK,IAAI;AACrB,QAAM,UAAU,GAAG,WAAW,CAAC;AAC/B,QAAM,eAAe,OAAO,KAAK,OAAO;AAExC,QAAM,eAAe,WAAW,EAAE;AAClC,MAAI,CAAC,aAAa,OAAO;AACvB,WAAO,EAAE,IAAI,OAAO,OAAO,MAAM,QAAQ,aAAa,OAAO;AAAA,EAC/D;AAEA,QAAM,qBAAqB,mBAAmB,IAAI,YAAY;AAC9D,MAAI,CAAC,mBAAmB,OAAO;AAC7B,WAAO,EAAE,IAAI,OAAO,OAAO,YAAY,QAAQ,mBAAmB,OAAO;AAAA,EAC3E;AAEA,QAAM,WAAW,aAAa;AAAA,IAC5B,CAAC,KAAK,SAAS,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,EAAE,MAAM,IAAI,EAAE;AAAA,IAC9C,CAAC;AAAA,EACH;AACA,QAAM,eAAeA,oBAAmB,IAAI,QAAQ;AAEpD,MAAI,iBAAiB,MAAM;AACzB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,QACN,kCAAkC,IAAI,gBAAgB,YAAY;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAA4B,OAAO,QAAQ,OAAO,EAAE;AAAA,IACxD,CAAC,CAAC,MAAM,MAAM,OAAO;AAAA,MACnB;AAAA,MACA,GAAG,eAAe,OAAO,IAAI;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,WAAW,SAAS;AAAA,IAAQ,CAAC,UACjC,MAAM,SAAS,IAAI,CAAC,YAAY,GAAG,OAAO,OAAO,MAAM,IAAI,EAAE;AAAA,EAC/D;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,MACA,QAAQ,SAAS,IAAI,CAAC,MAAM,sBAAsB,CAAC,EAAE;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,IAAI,MAAM,SAAS;AAC9B;","names":["calculateAgentHash"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/project-state.ts","../src/utils/runtime.ts","../src/utils/ai.ts","../src/utils/runtime-identity.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface ProjectAgentState {\n currentHash: string | null;\n currentVersion: number;\n lastLocalHash: string | null;\n lastRemoteHash: string | null;\n lastPushedAt: string | null;\n localPath: string;\n workerUrl: string | null;\n}\n\nexport interface ProjectState {\n workerUrl: string | null;\n deployedAt: string | null;\n accountId: string | null;\n studioCredentialsFingerprint?: string | null;\n serviceKeyFingerprint?: string | null;\n agents: Record<string, ProjectAgentState>;\n}\n\nconst KALP_DIR = \".kalp\";\nconst STATE_FILE = \"state.json\";\n\nfunction normalizeProjectState(raw: unknown): ProjectState | null {\n if (!raw || typeof raw !== \"object\") return null;\n const value = raw as Record<string, unknown>;\n const workerUrl =\n typeof value.workerUrl === \"string\" && value.workerUrl.length > 0\n ? value.workerUrl\n : null;\n const deployedAt =\n typeof value.deployedAt === \"string\" && value.deployedAt.length > 0\n ? value.deployedAt\n : null;\n const accountId =\n typeof value.accountId === \"string\" && value.accountId.length > 0\n ? value.accountId\n : null;\n const studioCredentialsFingerprint =\n typeof value.studioCredentialsFingerprint === \"string\" &&\n value.studioCredentialsFingerprint.length > 0\n ? value.studioCredentialsFingerprint\n : null;\n const serviceKeyFingerprint =\n typeof value.serviceKeyFingerprint === \"string\" &&\n value.serviceKeyFingerprint.length > 0\n ? value.serviceKeyFingerprint\n : null;\n\n const agents: Record<string, ProjectAgentState> = {};\n const rawAgents =\n value.agents && typeof value.agents === \"object\"\n ? (value.agents as Record<string, unknown>)\n : {};\n\n for (const [name, entry] of Object.entries(rawAgents)) {\n if (!entry || typeof entry !== \"object\") continue;\n const item = entry as Record<string, unknown>;\n if (typeof item.localPath !== \"string\" || item.localPath.length === 0) {\n continue;\n }\n\n const currentVersion =\n typeof item.currentVersion === \"number\" && Number.isFinite(item.currentVersion)\n ? Math.max(0, Math.floor(item.currentVersion))\n : 0;\n\n agents[name] = {\n currentHash: typeof item.currentHash === \"string\" ? item.currentHash : null,\n currentVersion,\n lastLocalHash: typeof item.lastLocalHash === \"string\" ? item.lastLocalHash : null,\n lastRemoteHash:\n typeof item.lastRemoteHash === \"string\" ? item.lastRemoteHash : null,\n lastPushedAt: typeof item.lastPushedAt === \"string\" ? item.lastPushedAt : null,\n localPath: item.localPath,\n workerUrl: typeof item.workerUrl === \"string\" ? item.workerUrl : null,\n };\n }\n\n return {\n workerUrl,\n deployedAt,\n accountId,\n studioCredentialsFingerprint,\n serviceKeyFingerprint,\n agents,\n };\n}\n\nexport async function readProjectState(cwd: string): Promise<ProjectState | null> {\n try {\n const statePath = join(cwd, KALP_DIR, STATE_FILE);\n const content = await readFile(statePath, \"utf-8\");\n return normalizeProjectState(JSON.parse(content));\n } catch {\n return null;\n }\n}\n\nexport async function writeProjectState(\n cwd: string,\n state: ProjectState,\n): Promise<void> {\n const dir = join(cwd, KALP_DIR);\n await mkdir(dir, { recursive: true });\n await writeFile(join(dir, STATE_FILE), `${JSON.stringify(state, null, 2)}\\n`, \"utf-8\");\n}\n","import { createHash } from \"node:crypto\";\nimport {\n access,\n cp,\n mkdir,\n readdir,\n readFile,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { deriveLabelFromName } from \"@kalphq/project\";\nimport { getRequiredSecretForProvider, resolveProviderFromConfig } from \"@/utils/ai\";\nimport {\n resolveIdentityAuthRequirements,\n} from \"@/utils/project-config\";\nimport { readProjectState } from \"@/utils/project-state\";\nimport { materializeRuntimeIdentity } from \"@/utils/runtime-identity\";\n\nconst RUNTIME_ROOT = \".kalp\";\nconst RUNTIME_DIR = \"runtime\";\nconst STUDIO_DIR = \"studio\";\nconst WRANGLER_CONFIG_FILE = \"wrangler.jsonc\";\nconst WORKER_ENTRY_FILE = \"worker-entry.js\";\nconst COMPATIBILITY_DATE = \"2026-05-10\";\n\nexport interface RuntimePaths {\n runtimeDir: string;\n studioDir: string;\n workerEntrypointPath: string;\n wranglerConfigPath: string;\n workerName: string;\n}\n\ninterface RuntimeAgentRecord {\n name: string;\n label?: string;\n tags?: string[];\n environment: \"local\" | \"remote\" | \"both\";\n status: \"online\" | \"offline\";\n hash: string | null;\n version: string | null;\n versionNumber: number | null;\n lastRemoteHash: string | null;\n lastLocalHash: string | null;\n workerUrl: string | null;\n localPath: string | null;\n updatedAt: string | null;\n}\n\ninterface RuntimeAgentsSnapshot {\n generatedAt: string;\n projectPath: string;\n workerUrl: string | null;\n mode: \"local\" | \"remote\";\n agents: RuntimeAgentRecord[];\n}\n\nexport interface MaterializeRuntimeOptions {\n mode?: \"local\" | \"remote\";\n}\n\ninterface WranglerConfig {\n $schema: string;\n name: string;\n main: string;\n compatibility_date: string;\n compatibility_flags: string[];\n migrations: Array<{ tag: string; new_sqlite_classes: string[] }>;\n durable_objects: {\n bindings: Array<{ name: string; class_name: string }>;\n };\n kv_namespaces: Array<{ binding: string }>;\n assets: {\n directory: string;\n binding: string;\n run_worker_first: boolean;\n };\n observability: { enabled: boolean };\n upload_source_maps: boolean;\n vars: {\n KALP_ENV: \"local\" | \"remote\";\n };\n secrets: { required: string[] };\n}\n\ninterface RuntimeTemplatePaths {\n studioTemplateDir: string;\n workerEntryPath: string;\n}\n\nfunction sanitizeSegment(input: string): string {\n return input\n .toLowerCase()\n .replace(/^@/, \"\")\n .replace(/\\//g, \"-\")\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nasync function resolveProjectSlug(cwd: string): Promise<string> {\n const fallback = sanitizeSegment(basename(cwd)) || \"agent\";\n const packageJsonPath = join(cwd, \"package.json\");\n\n try {\n const content = await readFile(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content) as { name?: string };\n const name = typeof pkg.name === \"string\" ? pkg.name : \"\";\n const sanitized = sanitizeSegment(name);\n return sanitized || fallback;\n } catch {\n return fallback;\n }\n}\n\nfunction buildWorkerName(slug: string, cwd: string): string {\n const cwdHash = createHash(\"sha1\").update(cwd).digest(\"hex\").slice(0, 8);\n const withPrefix = `kalp-${slug}-${cwdHash}`;\n const maxLen = 63;\n if (withPrefix.length <= maxLen) {\n return withPrefix;\n }\n\n const clipped = withPrefix.slice(0, maxLen).replace(/-+$/g, \"\");\n return clipped || `kalp-${cwdHash}`;\n}\n\nfunction createRuntimeConfig(\n workerName: string,\n mode: \"local\" | \"remote\",\n requiredSecrets: string[],\n): WranglerConfig {\n return {\n $schema: \"node_modules/wrangler/config-schema.json\",\n name: workerName,\n main: `./${WORKER_ENTRY_FILE}`,\n compatibility_date: COMPATIBILITY_DATE,\n compatibility_flags: [\"nodejs_compat\"],\n migrations: [\n {\n tag: \"v1\",\n new_sqlite_classes: [\"AgentDurableObject\"],\n },\n ],\n durable_objects: {\n bindings: [\n {\n name: \"KALP_RUNTIME_CLOUDFLARE\",\n class_name: \"AgentDurableObject\",\n },\n ],\n },\n kv_namespaces: [\n {\n binding: \"KALP_MANIFESTS\",\n },\n ],\n assets: {\n directory: `./${STUDIO_DIR}`,\n binding: \"ASSETS\",\n run_worker_first: true,\n },\n observability: { enabled: true },\n upload_source_maps: true,\n vars: {\n KALP_ENV: mode,\n },\n secrets: {\n required: requiredSecrets,\n },\n };\n}\n\nfunction runtimeTemplateCandidates(): Array<{\n studioTemplateDir: string;\n workerEntryPath: string;\n}> {\n const here = dirname(fileURLToPath(import.meta.url));\n const distTemplateRoot = resolve(here, \"runtime-template\");\n const packageRootTemplate = resolve(here, \"..\", \"runtime-template\");\n const sourceTemplateRoot = resolve(here, \"..\", \"..\", \"runtime-template\");\n const monorepoStudioDist = resolve(\n here,\n \"..\",\n \"..\",\n \"..\",\n \"..\",\n \"apps\",\n \"studio\",\n \"dist\",\n \"client\",\n );\n\n return [\n {\n studioTemplateDir: join(distTemplateRoot, STUDIO_DIR),\n workerEntryPath: join(distTemplateRoot, WORKER_ENTRY_FILE),\n },\n {\n studioTemplateDir: join(packageRootTemplate, STUDIO_DIR),\n workerEntryPath: join(packageRootTemplate, WORKER_ENTRY_FILE),\n },\n {\n studioTemplateDir: join(sourceTemplateRoot, STUDIO_DIR),\n workerEntryPath: join(sourceTemplateRoot, WORKER_ENTRY_FILE),\n },\n {\n studioTemplateDir: monorepoStudioDist,\n workerEntryPath: join(sourceTemplateRoot, WORKER_ENTRY_FILE),\n },\n ];\n}\n\nasync function resolveRuntimeTemplate(): Promise<RuntimeTemplatePaths> {\n for (const candidate of runtimeTemplateCandidates()) {\n try {\n await access(candidate.studioTemplateDir);\n await access(candidate.workerEntryPath);\n return candidate;\n } catch {\n // continue\n }\n }\n\n throw new Error(\n \"Kalp runtime template not found in CLI package. Reinstall @kalphq/cli.\",\n );\n}\n\nfunction createStudioShell(entryScript: string, cssFiles: string[]): string {\n const cssLinks = cssFiles\n .map((file) => ` <link rel=\"stylesheet\" href=\"/studio/assets/${file}\" />`)\n .join(\"\\n\");\n\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>Kalp Studio</title>\n${cssLinks}\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/studio/assets/${entryScript}\"></script>\n </body>\n</html>\n`;\n}\n\nasync function ensureStudioIndex(studioDir: string): Promise<void> {\n const indexPath = join(studioDir, \"index.html\");\n try {\n await access(indexPath);\n return;\n } catch {\n // index.html is missing on some TanStack Start static builds.\n }\n\n const assetsDir = join(studioDir, \"assets\");\n const assetFiles = await readdir(assetsDir);\n const entryScript =\n assetFiles.find((file) => /^index-.*\\.js$/i.test(file)) ??\n assetFiles.find((file) => file.endsWith(\".js\"));\n\n if (!entryScript) {\n throw new Error(\n \"Studio runtime template is missing an entry JS bundle in studio/assets.\",\n );\n }\n\n const cssFiles = assetFiles.filter((file) => file.endsWith(\".css\")).sort();\n const html = createStudioShell(entryScript, cssFiles);\n await writeFile(indexPath, html, \"utf-8\");\n}\n\nexport async function readLocalAgentNames(cwd: string): Promise<string[]> {\n const agentsDir = join(cwd, \"agents\");\n try {\n const entries = await readdir(agentsDir, { withFileTypes: true });\n const names: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const indexPath = join(agentsDir, entry.name, \"index.ts\");\n const exists = await stat(indexPath)\n .then(() => true)\n .catch(() => false);\n if (exists) names.push(entry.name);\n }\n return names.sort((a, b) => a.localeCompare(b));\n } catch {\n return [];\n }\n}\n\nasync function createAgentsSnapshot(\n cwd: string,\n mode: \"local\" | \"remote\",\n): Promise<RuntimeAgentsSnapshot> {\n const localAgentNames = await readLocalAgentNames(cwd);\n const state = await readProjectState(cwd);\n\n const byName = new Map<string, RuntimeAgentRecord>();\n const stateAgents = state?.agents ?? {};\n\n for (const name of localAgentNames) {\n const localPath = join(cwd, \"agents\", name, \"index.ts\");\n const saved = stateAgents[name];\n const hasRemoteVersion = !!saved?.lastRemoteHash && (saved?.currentVersion ?? 0) > 0;\n\n if (mode === \"remote\" && !hasRemoteVersion) {\n continue;\n }\n\n const resolvedWorkerUrl =\n saved?.workerUrl ??\n (state?.workerUrl ? `${state.workerUrl.replace(/\\/$/, \"\")}/a/${name}` : null);\n const versionNumber =\n typeof saved?.currentVersion === \"number\" && saved.currentVersion > 0\n ? saved.currentVersion\n : null;\n\n byName.set(name, {\n name,\n label: deriveLabelFromName(name),\n tags: [],\n environment:\n mode === \"remote\"\n ? \"remote\"\n : hasRemoteVersion\n ? \"both\"\n : \"local\",\n status: resolvedWorkerUrl ? \"online\" : \"offline\",\n hash: saved?.currentHash ?? null,\n version: versionNumber ? `v${versionNumber}` : null,\n versionNumber,\n lastRemoteHash: saved?.lastRemoteHash ?? null,\n lastLocalHash: saved?.lastLocalHash ?? null,\n workerUrl: resolvedWorkerUrl,\n localPath,\n updatedAt: saved?.lastPushedAt ?? state?.deployedAt ?? null,\n });\n }\n\n if (mode === \"remote\") {\n for (const [name, saved] of Object.entries(stateAgents)) {\n const hasRemoteVersion =\n !!saved.lastRemoteHash && (saved.currentVersion ?? 0) > 0;\n if (!hasRemoteVersion || byName.has(name)) continue;\n\n const localPath = saved.localPath ?? join(cwd, \"agents\", name, \"index.ts\");\n const workerUrl =\n saved.workerUrl ??\n (state?.workerUrl ? `${state.workerUrl.replace(/\\/$/, \"\")}/a/${name}` : null);\n const versionNumber = saved.currentVersion > 0 ? saved.currentVersion : null;\n\n byName.set(name, {\n name,\n label: deriveLabelFromName(name),\n tags: [],\n environment: \"remote\",\n status: workerUrl ? \"online\" : \"offline\",\n hash: saved.currentHash ?? null,\n version: versionNumber ? `v${versionNumber}` : null,\n versionNumber,\n lastRemoteHash: saved.lastRemoteHash ?? null,\n lastLocalHash: saved.lastLocalHash ?? null,\n workerUrl,\n localPath,\n updatedAt: saved.lastPushedAt ?? state?.deployedAt ?? null,\n });\n }\n }\n\n return {\n generatedAt: new Date().toISOString(),\n projectPath: cwd,\n workerUrl: state?.workerUrl ?? null,\n mode,\n agents: Array.from(byName.values()).sort((a, b) => a.name.localeCompare(b.name)),\n };\n}\n\nexport async function writeRuntimeAgentsSnapshot(params: {\n cwd: string;\n runtimeDir: string;\n mode: \"local\" | \"remote\";\n}): Promise<void> {\n const snapshot = await createAgentsSnapshot(params.cwd, params.mode);\n await writeFile(\n join(params.runtimeDir, \"agents.snapshot.json\"),\n `${JSON.stringify(snapshot, null, 2)}\\n`,\n \"utf-8\",\n );\n}\n\nexport async function materializeRuntime(\n cwd: string,\n options: MaterializeRuntimeOptions = {},\n): Promise<RuntimePaths> {\n const mode = options.mode ?? \"remote\";\n const runtimeDir = join(cwd, RUNTIME_ROOT, RUNTIME_DIR);\n const studioDir = join(runtimeDir, STUDIO_DIR);\n const workerEntrypointPath = join(runtimeDir, WORKER_ENTRY_FILE);\n const wranglerConfigPath = join(runtimeDir, WRANGLER_CONFIG_FILE);\n\n const template = await resolveRuntimeTemplate();\n await rm(runtimeDir, { recursive: true, force: true });\n await mkdir(runtimeDir, { recursive: true });\n\n await cp(template.studioTemplateDir, studioDir, { recursive: true });\n await cp(template.workerEntryPath, workerEntrypointPath);\n await ensureStudioIndex(studioDir);\n await writeRuntimeAgentsSnapshot({ cwd, runtimeDir, mode });\n const identity = await materializeRuntimeIdentity({ cwd, runtimeDir });\n\n const projectSlug = await resolveProjectSlug(cwd);\n const workerName = buildWorkerName(projectSlug, cwd);\n const requiredSecrets = new Set<string>([\n \"KALP_SECRET_KEY\",\n \"KALP_STUDIO_PASSWORD\",\n \"KALP_STUDIO_ADMIN_USER\",\n \"KALP_SERVICE_KEY\",\n ]);\n\n try {\n const provider = await resolveProviderFromConfig(cwd);\n requiredSecrets.add(getRequiredSecretForProvider(provider));\n } catch {\n // Ignore provider resolution errors here; deploy preflight handles strict checks.\n }\n\n const identityRequirements = resolveIdentityAuthRequirements(identity.identityConfig);\n for (const requirement of identityRequirements) {\n requiredSecrets.add(requirement.envKey);\n }\n\n const wranglerConfig = createRuntimeConfig(\n workerName,\n mode,\n [...requiredSecrets].sort((a, b) => a.localeCompare(b)),\n );\n await writeFile(\n wranglerConfigPath,\n `${JSON.stringify(wranglerConfig, null, 2)}\\n`,\n \"utf-8\",\n );\n\n return {\n runtimeDir,\n studioDir,\n workerEntrypointPath,\n wranglerConfigPath,\n workerName,\n };\n}\n","import { access, readFile } from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createJiti } from \"jiti\";\n\nexport type AIProvider = \"openai\" | \"anthropic\" | \"openrouter\" | \"custom\";\n\nconst PROVIDER_SECRET_MAP: Record<AIProvider, string> = {\n openai: \"OPENAI_API_KEY\",\n anthropic: \"ANTHROPIC_API_KEY\",\n openrouter: \"OPENROUTER_API_KEY\",\n custom: \"CUSTOM_AI_API_KEY\",\n};\n\nfunction parseEnv(content: string): Record<string, string> {\n const env: Record<string, string> = {};\n for (const raw of content.split(/\\r?\\n/g)) {\n const line = raw.trim();\n if (!line || line.startsWith(\"#\")) continue;\n const idx = line.indexOf(\"=\");\n if (idx <= 0) continue;\n env[line.slice(0, idx).trim()] = line.slice(idx + 1);\n }\n return env;\n}\n\nexport async function resolveProviderFromConfig(cwd: string): Promise<AIProvider> {\n const configPath = join(cwd, \"kalp.config.ts\");\n await access(configPath, constants.F_OK);\n const jiti = createJiti(cwd, { interopDefault: true });\n const config = (await jiti.import(configPath)) as\n | { default?: { ai?: { provider?: AIProvider } }; ai?: { provider?: AIProvider } }\n | undefined;\n const provider = config?.default?.ai?.provider ?? config?.ai?.provider ?? \"openai\";\n return provider;\n}\n\nexport async function readDotEnv(cwd: string): Promise<Record<string, string>> {\n const envPath = join(cwd, \".env\");\n const content = await readFile(envPath, \"utf-8\").catch(() => \"\");\n return parseEnv(content);\n}\n\nexport function getRequiredSecretForProvider(provider: AIProvider): string {\n return PROVIDER_SECRET_MAP[provider];\n}\n","import { build } from \"esbuild\";\nimport { writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n loadProjectConfig,\n resolveRuntimeIdentityConfig,\n type RuntimeIdentityConfig,\n} from \"@/utils/project-config\";\n\nexport interface MaterializeRuntimeIdentityResult {\n identityConfig: RuntimeIdentityConfig;\n identityConfigPath: string;\n identityMapPath: string;\n}\n\nconst DEFAULT_IDENTITY_MAP_SOURCE = `export default function mapIdentity(payload) {\n const sub =\n payload && typeof payload === \"object\" && typeof payload.sub === \"string\"\n ? payload.sub\n : \"anonymous\";\n return { userId: sub, claims: {} };\n}\n`;\n\nfunction readIdentityMapCandidate(rawConfig: Record<string, unknown>): unknown {\n if (!rawConfig.identity || typeof rawConfig.identity !== \"object\") return null;\n return (rawConfig.identity as Record<string, unknown>).mapIdentity;\n}\n\nfunction assertEdgeSafeSource(mapIdentitySource: string): void {\n const blockedPatterns: Array<{ regex: RegExp; label: string }> = [\n { regex: /\\brequire\\s*\\(/, label: \"require(...)\" },\n { regex: /\\bnode:/, label: \"node:* imports\" },\n { regex: /\\bprocess\\./, label: \"process.*\" },\n { regex: /\\bBuffer\\b/, label: \"Buffer\" },\n { regex: /\\bimport\\s*\\(/, label: \"dynamic import(...)\" },\n ];\n\n const hit = blockedPatterns.find((item) => item.regex.test(mapIdentitySource));\n if (!hit) return;\n\n throw new Error(\n `mapIdentity uses \"${hit.label}\", which is not supported in edge runtime.`,\n );\n}\n\nasync function writeDefaultIdentityMap(identityMapPath: string): Promise<void> {\n await writeFile(identityMapPath, DEFAULT_IDENTITY_MAP_SOURCE, \"utf-8\");\n}\n\nasync function bundleIdentityMap(params: {\n cwd: string;\n mapIdentitySource: string;\n identityMapPath: string;\n}): Promise<void> {\n const { cwd, mapIdentitySource, identityMapPath } = params;\n assertEdgeSafeSource(mapIdentitySource);\n\n const entrySource = `\nconst mapIdentity = (${mapIdentitySource});\nif (typeof mapIdentity !== \"function\") {\n throw new Error(\"identity.mapIdentity must be a function.\");\n}\nexport default mapIdentity;\n`;\n\n try {\n await build({\n absWorkingDir: cwd,\n bundle: true,\n format: \"esm\",\n platform: \"browser\",\n target: [\"es2022\"],\n write: true,\n outfile: identityMapPath,\n logLevel: \"silent\",\n stdin: {\n contents: entrySource,\n resolveDir: cwd,\n sourcefile: \"kalp-identity-map-entry.mjs\",\n loader: \"js\",\n },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n [\n \"Could not bundle identity.mapIdentity for runtime.\",\n \"Please verify:\",\n \" • kalp.config.ts exists and exports default defineConfig(...)\",\n \" • mapIdentity is declared inline and does not capture external variables\",\n \" • mapIdentity does not use Node-specific APIs\",\n \" • kalp.config.ts has no broken imports\",\n `Technical details: ${message}`,\n ].join(\"\\n\"),\n );\n }\n}\n\nexport async function materializeRuntimeIdentity(params: {\n cwd: string;\n runtimeDir: string;\n}): Promise<MaterializeRuntimeIdentityResult> {\n const { cwd, runtimeDir } = params;\n const identityConfigPath = join(runtimeDir, \"identity.config.json\");\n const identityMapPath = join(runtimeDir, \"identity.map.mjs\");\n\n let rawConfig: Record<string, unknown> = {};\n try {\n const loaded = await loadProjectConfig(cwd);\n rawConfig = loaded.raw;\n } catch {\n rawConfig = {};\n }\n\n const identityConfig = resolveRuntimeIdentityConfig(rawConfig);\n await writeFile(\n identityConfigPath,\n `${JSON.stringify(identityConfig, null, 2)}\\n`,\n \"utf-8\",\n );\n\n const mapIdentity = readIdentityMapCandidate(rawConfig);\n if (typeof mapIdentity === \"function\") {\n const mapIdentitySource = mapIdentity.toString();\n if (!mapIdentitySource || /\\[native code\\]/.test(mapIdentitySource)) {\n throw new Error(\n \"Could not serialize identity.mapIdentity. Define it inline in kalp.config.ts as a regular function.\",\n );\n }\n await bundleIdentityMap({\n cwd,\n mapIdentitySource,\n identityMapPath,\n });\n } else {\n await writeDefaultIdentityMap(identityMapPath);\n }\n\n return { identityConfig, identityConfigPath, identityMapPath };\n}\n"],"mappings":"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","names":["access","mkdir","readFile","writeFile","join","readFile","join","writeFile","join","writeFile","join","join","readFile","access","writeFile","mkdir"]}
|