@kalphq/cli 0.0.0-dev-20260513153020 → 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.
Files changed (75) hide show
  1. package/dist/{add-YZSIMRPC.js → add-5WUS5HGV.js} +16 -8
  2. package/dist/add-5WUS5HGV.js.map +1 -0
  3. package/dist/{agents-WYK6WNQP.js → agents-L22L47II.js} +3 -3
  4. package/dist/ai-7EBQF25Y.js +12 -0
  5. package/dist/ai-7EBQF25Y.js.map +1 -0
  6. package/dist/{chunk-IZXCZ3IA.js → chunk-4CPUJ537.js} +2 -2
  7. package/dist/chunk-5YUU3KLB.js +40 -0
  8. package/dist/chunk-5YUU3KLB.js.map +1 -0
  9. package/dist/chunk-7KVCCBPJ.js +139 -0
  10. package/dist/chunk-7KVCCBPJ.js.map +1 -0
  11. package/dist/{chunk-S3KAVLVM.js → chunk-D53K6UE6.js} +2 -2
  12. package/dist/chunk-D53K6UE6.js.map +1 -0
  13. package/dist/{chunk-4CEJYSJY.js → chunk-DLUULDXW.js} +12 -45
  14. package/dist/chunk-DLUULDXW.js.map +1 -0
  15. package/dist/chunk-DXNHT4HF.js +99 -0
  16. package/dist/chunk-DXNHT4HF.js.map +1 -0
  17. package/dist/{chunk-XVD3FFOJ.js → chunk-JXR6TPR5.js} +51 -72
  18. package/dist/chunk-JXR6TPR5.js.map +1 -0
  19. package/dist/chunk-LEKRFM4Q.js +49 -0
  20. package/dist/chunk-LEKRFM4Q.js.map +1 -0
  21. package/dist/chunk-QT2JFINP.js +99 -0
  22. package/dist/chunk-QT2JFINP.js.map +1 -0
  23. package/dist/{chunk-5SZMD7E6.js → chunk-TNNBTSDC.js} +2 -2
  24. package/dist/{chunk-5SZMD7E6.js.map → chunk-TNNBTSDC.js.map} +1 -1
  25. package/dist/{generate-JW2DMJ3W.js → chunk-ZX7TIQM7.js} +127 -120
  26. package/dist/chunk-ZX7TIQM7.js.map +1 -0
  27. package/dist/{create-UCJ77P62.js → create-ILPQCRA2.js} +2 -2
  28. package/dist/{delete-QPYVL4OU.js → delete-AJFAAGYJ.js} +9 -8
  29. package/dist/{delete-QPYVL4OU.js.map → delete-AJFAAGYJ.js.map} +1 -1
  30. package/dist/{delete-FIXMFFNZ.js → delete-IFVGULOA.js} +21 -13
  31. package/dist/delete-IFVGULOA.js.map +1 -0
  32. package/dist/{deploy-DRZZ3YRB.js → deploy-EWYNN3VU.js} +9 -6
  33. package/dist/{deploy-DRZZ3YRB.js.map → deploy-EWYNN3VU.js.map} +1 -1
  34. package/dist/{dev-5YY6W4WM.js → dev-3IEEUVYM.js} +66 -11
  35. package/dist/dev-3IEEUVYM.js.map +1 -0
  36. package/dist/generate-2MO7PZBT.js +69 -0
  37. package/dist/generate-2MO7PZBT.js.map +1 -0
  38. package/dist/generate-ODZUKTF2.js +146 -0
  39. package/dist/generate-ODZUKTF2.js.map +1 -0
  40. package/dist/index.js +32 -12
  41. package/dist/index.js.map +1 -1
  42. package/dist/{list-FKH4DWCF.js → list-BNQ34QG3.js} +6 -5
  43. package/dist/{list-FKH4DWCF.js.map → list-BNQ34QG3.js.map} +1 -1
  44. package/dist/{list-GZBBOFX5.js → list-WHYV5JZ4.js} +5 -4
  45. package/dist/{list-GZBBOFX5.js.map → list-WHYV5JZ4.js.map} +1 -1
  46. package/dist/{login-MGPA2VYV.js → login-BDLHS4HC.js} +13 -8
  47. package/dist/login-BDLHS4HC.js.map +1 -0
  48. package/dist/{mcp-DRMQYA7E.js → mcp-77OLNT5R.js} +2 -2
  49. package/dist/{pull-V7QJBVNZ.js → pull-CFDZS6VB.js} +8 -7
  50. package/dist/{pull-V7QJBVNZ.js.map → pull-CFDZS6VB.js.map} +1 -1
  51. package/dist/{push-P6CKRYT7.js → push-OL7562HM.js} +159 -47
  52. package/dist/push-OL7562HM.js.map +1 -0
  53. package/dist/runtime-template/studio/index.html +3 -0
  54. package/dist/{secrets-M43LLCTB.js → secrets-BPESLXMK.js} +6 -6
  55. package/dist/{sync-LTBH6DI5.js → sync-JJDODKMO.js} +8 -7
  56. package/dist/{sync-LTBH6DI5.js.map → sync-JJDODKMO.js.map} +1 -1
  57. package/package.json +5 -4
  58. package/dist/add-YZSIMRPC.js.map +0 -1
  59. package/dist/chunk-4CEJYSJY.js.map +0 -1
  60. package/dist/chunk-LPEV4QH2.js +0 -208
  61. package/dist/chunk-LPEV4QH2.js.map +0 -1
  62. package/dist/chunk-S3KAVLVM.js.map +0 -1
  63. package/dist/chunk-VCFH3R34.js +0 -103
  64. package/dist/chunk-VCFH3R34.js.map +0 -1
  65. package/dist/chunk-XVD3FFOJ.js.map +0 -1
  66. package/dist/delete-FIXMFFNZ.js.map +0 -1
  67. package/dist/dev-5YY6W4WM.js.map +0 -1
  68. package/dist/generate-JW2DMJ3W.js.map +0 -1
  69. package/dist/login-MGPA2VYV.js.map +0 -1
  70. package/dist/push-P6CKRYT7.js.map +0 -1
  71. /package/dist/{agents-WYK6WNQP.js.map → agents-L22L47II.js.map} +0 -0
  72. /package/dist/{chunk-IZXCZ3IA.js.map → chunk-4CPUJ537.js.map} +0 -0
  73. /package/dist/{create-UCJ77P62.js.map → create-ILPQCRA2.js.map} +0 -0
  74. /package/dist/{mcp-DRMQYA7E.js.map → mcp-77OLNT5R.js.map} +0 -0
  75. /package/dist/{secrets-M43LLCTB.js.map → secrets-BPESLXMK.js.map} +0 -0
@@ -1,23 +1,24 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- generateTypes
4
- } from "./chunk-LPEV4QH2.js";
5
2
  import {
6
3
  mergeSecrets,
7
4
  readLocalSecretsFromConfig,
8
5
  writeLocalSecretsToConfig
9
6
  } from "./chunk-YE2SFYAJ.js";
7
+ import {
8
+ generateTypes
9
+ } from "./chunk-DXNHT4HF.js";
10
10
  import {
11
11
  resolveSecretsRuntimeConfigPath
12
- } from "./chunk-IZXCZ3IA.js";
12
+ } from "./chunk-4CPUJ537.js";
13
13
  import "./chunk-INB3LG6O.js";
14
- import "./chunk-XVD3FFOJ.js";
15
14
  import {
16
15
  requireAuth,
17
16
  resolveProvider
18
- } from "./chunk-S3KAVLVM.js";
17
+ } from "./chunk-D53K6UE6.js";
19
18
  import "./chunk-FO24J6XL.js";
19
+ import "./chunk-JXR6TPR5.js";
20
20
  import "./chunk-EXXTCGKR.js";
21
+ import "./chunk-LEKRFM4Q.js";
21
22
 
22
23
  // src/commands/secrets/add.ts
23
24
  import { defineCommand } from "citty";
@@ -58,7 +59,7 @@ var add_default = defineCommand({
58
59
  p.log.error("Not authenticated. Run `kalp login` first.");
59
60
  process.exit(1);
60
61
  });
61
- let key = args.key?.trim();
62
+ let key = args._[0]?.trim() || args.key?.trim();
62
63
  let value = args.value;
63
64
  if (!key) {
64
65
  const input = await p.text({
@@ -69,6 +70,9 @@ var add_default = defineCommand({
69
70
  if (!/^[A-Z_][A-Z0-9_]*$/.test(v)) {
70
71
  return "Key must be UPPER_SNAKE_CASE";
71
72
  }
73
+ if (v.startsWith("KALP_")) {
74
+ return "Secrets starting with KALP_ are reserved";
75
+ }
72
76
  }
73
77
  });
74
78
  if (p.isCancel(input)) {
@@ -81,6 +85,10 @@ var add_default = defineCommand({
81
85
  p.log.error("Invalid key. Use UPPER_SNAKE_CASE.");
82
86
  process.exit(1);
83
87
  }
88
+ if (key.startsWith("KALP_")) {
89
+ p.log.error("Secrets starting with KALP_ are reserved and cannot be added.");
90
+ process.exit(1);
91
+ }
84
92
  if (!value) {
85
93
  const input = await p.password({
86
94
  message: `Enter value for ${key}`,
@@ -124,4 +132,4 @@ var add_default = defineCommand({
124
132
  export {
125
133
  add_default as default
126
134
  };
127
- //# sourceMappingURL=add-YZSIMRPC.js.map
135
+ //# sourceMappingURL=add-5WUS5HGV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/secrets/add.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { generateTypes } from \"@/utils/codegen\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport {\n mergeSecrets,\n readLocalSecretsFromConfig,\n writeLocalSecretsToConfig,\n} from \"@/utils/secrets-config\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"add\",\n description: \"Add a secret to remote runtime and local config\",\n },\n args: {\n key: {\n type: \"string\",\n alias: \"k\",\n description: \"Secret key (UPPER_SNAKE_CASE)\",\n },\n value: {\n type: \"string\",\n alias: \"v\",\n description: \"Secret value\",\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp secrets add -k <KEY> -v <VALUE>`);\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets add\")}`);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n let key = args._[0]?.trim() || 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 if (v.startsWith(\"KALP_\")) {\n return \"Secrets starting with KALP_ are reserved\";\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 (key.startsWith(\"KALP_\")) {\n p.log.error(\"Secrets starting with KALP_ are reserved and cannot be added.\");\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"]}
@@ -19,8 +19,8 @@ var agents_default = defineCommand({
19
19
  }
20
20
  },
21
21
  subCommands: {
22
- list: () => import("./list-FKH4DWCF.js").then((r) => r.default),
23
- delete: () => import("./delete-QPYVL4OU.js").then((r) => r.default)
22
+ list: () => import("./list-BNQ34QG3.js").then((r) => r.default),
23
+ delete: () => import("./delete-AJFAAGYJ.js").then((r) => r.default)
24
24
  },
25
25
  run({ args }) {
26
26
  const subcommand = process.argv[3];
@@ -40,4 +40,4 @@ var agents_default = defineCommand({
40
40
  export {
41
41
  agents_default as default
42
42
  };
43
- //# sourceMappingURL=agents-WYK6WNQP.js.map
43
+ //# sourceMappingURL=agents-L22L47II.js.map
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ getRequiredSecretForProvider,
4
+ readDotEnv,
5
+ resolveProviderFromConfig
6
+ } from "./chunk-LEKRFM4Q.js";
7
+ export {
8
+ getRequiredSecretForProvider,
9
+ readDotEnv,
10
+ resolveProviderFromConfig
11
+ };
12
+ //# sourceMappingURL=ai-7EBQF25Y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  materializeRuntime,
7
7
  readProjectState
8
- } from "./chunk-XVD3FFOJ.js";
8
+ } from "./chunk-JXR6TPR5.js";
9
9
 
10
10
  // src/utils/secrets-runtime.ts
11
11
  async function resolveSecretsRuntimeConfigPath(cwd) {
@@ -25,4 +25,4 @@ async function resolveSecretsRuntimeConfigPath(cwd) {
25
25
  export {
26
26
  resolveSecretsRuntimeConfigPath
27
27
  };
28
- //# sourceMappingURL=chunk-IZXCZ3IA.js.map
28
+ //# sourceMappingURL=chunk-4CPUJ537.js.map
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/utils/deploy-target.ts
4
+ import * as p from "@clack/prompts";
5
+ import pc from "picocolors";
6
+ async function promptDeployTarget(message) {
7
+ const selected = await p.select({
8
+ message,
9
+ options: [
10
+ {
11
+ value: "cloudflare",
12
+ label: "Cloudflare",
13
+ hint: "Available now"
14
+ },
15
+ {
16
+ value: "kalp-cloud",
17
+ label: "Kalp Cloud",
18
+ hint: "Coming soon"
19
+ }
20
+ ]
21
+ });
22
+ if (p.isCancel(selected)) return null;
23
+ return selected;
24
+ }
25
+ function showKalpCloudWaitlist() {
26
+ p.note(
27
+ [
28
+ `${pc.bold("Kalp Cloud is coming soon \u{1F680}")}`,
29
+ pc.dim("Join the waitlist for early access:"),
30
+ pc.cyan("https://usekalp.com/waitlist")
31
+ ].join("\n"),
32
+ "Kalp Cloud"
33
+ );
34
+ }
35
+
36
+ export {
37
+ promptDeployTarget,
38
+ showKalpCloudWaitlist
39
+ };
40
+ //# sourceMappingURL=chunk-5YUU3KLB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/deploy-target.ts"],"sourcesContent":["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,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":[]}
@@ -0,0 +1,139 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/utils/ir/hashIR.ts
4
+ function computePushHash(manifest, target = "default") {
5
+ const deploymentHash = manifest.artifactManifest.targets[target]?.deploymentHash;
6
+ if (!deploymentHash) {
7
+ throw new Error(`Missing deployment hash for target "${target}"`);
8
+ }
9
+ return deploymentHash;
10
+ }
11
+
12
+ // src/utils/manifest/index.ts
13
+ import { access, mkdtemp, readFile, rm } from "fs/promises";
14
+ import { join } from "path";
15
+ import { tmpdir } from "os";
16
+ import { buildAgent } from "@kalphq/compiler";
17
+ async function loadJson(filePath) {
18
+ const content = await readFile(filePath, "utf-8");
19
+ return JSON.parse(content);
20
+ }
21
+ async function readAgentManifest(params) {
22
+ const { cwd, agentName } = params;
23
+ const agentPath = join(cwd, "agents", agentName, "index.ts");
24
+ await access(agentPath);
25
+ const tempOutDir = await mkdtemp(join(tmpdir(), "kalp-build-"));
26
+ try {
27
+ await buildAgent(agentPath, tempOutDir, cwd, { includeDebug: false });
28
+ const artifactsDir = join(tempOutDir, ".kalp", "artifacts");
29
+ const artifactManifest = await loadJson(
30
+ join(artifactsDir, "artifact-manifest.json")
31
+ );
32
+ const semanticIr = await loadJson(join(artifactsDir, "semantic-ir.json"));
33
+ const schemas = await loadJson(join(artifactsDir, "schemas.json"));
34
+ const bundleManifest = await loadJson(
35
+ join(artifactsDir, "bundle-manifest.json")
36
+ );
37
+ const bundles = {};
38
+ const targetBundles = bundleManifest.targets.default?.nodes ?? {};
39
+ for (const binding of Object.values(targetBundles)) {
40
+ if (bundles[binding.bundle]) {
41
+ continue;
42
+ }
43
+ const filePath = join(artifactsDir, binding.file.replace(/^\.\//, "").replace(/\//g, "\\"));
44
+ bundles[binding.bundle] = {
45
+ file: binding.file,
46
+ code: await readFile(filePath, "utf-8"),
47
+ size: binding.size,
48
+ sha256: binding.sha256
49
+ };
50
+ }
51
+ return {
52
+ format: "kalp-agent-manifest",
53
+ schemaVersion: 3,
54
+ artifactManifest,
55
+ semanticIr,
56
+ schemas,
57
+ bundleManifest,
58
+ bundles,
59
+ metadata: {
60
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString()
61
+ }
62
+ };
63
+ } finally {
64
+ await rm(tempOutDir, { recursive: true, force: true });
65
+ }
66
+ }
67
+
68
+ // src/utils/validate.ts
69
+ import {
70
+ analyzeHandler,
71
+ calculateArtifactHash,
72
+ calculateDeploymentHash,
73
+ calculateSemanticHash,
74
+ validateIR,
75
+ validateIRBindings
76
+ } from "@kalphq/compiler";
77
+ function validateCompiledIR(input) {
78
+ const { manifest, hash, target = "default" } = input;
79
+ const targetManifest = manifest.bundleManifest.targets[target];
80
+ const irValidation = validateIR(manifest.semanticIr);
81
+ if (!irValidation.valid) {
82
+ return { ok: false, phase: "ir", errors: irValidation.errors };
83
+ }
84
+ if (!targetManifest) {
85
+ return {
86
+ ok: false,
87
+ phase: "bindings",
88
+ errors: [`Missing bundle target manifest for "${target}"`]
89
+ };
90
+ }
91
+ const bindingsValidation = validateIRBindings(
92
+ manifest.semanticIr,
93
+ manifest.bundleManifest,
94
+ manifest.schemas
95
+ );
96
+ if (!bindingsValidation.valid) {
97
+ return { ok: false, phase: "bindings", errors: bindingsValidation.errors };
98
+ }
99
+ const semanticHash = calculateSemanticHash(manifest.semanticIr, manifest.schemas);
100
+ const artifactHash = calculateArtifactHash(targetManifest);
101
+ const deploymentHash = calculateDeploymentHash(
102
+ semanticHash,
103
+ artifactHash,
104
+ manifest.artifactManifest.targets[target]?.abiVersion ?? targetManifest.abiVersion
105
+ );
106
+ if (deploymentHash !== hash) {
107
+ return {
108
+ ok: false,
109
+ phase: "hash",
110
+ errors: [`Hash mismatch: client provided ${hash}, calculated ${deploymentHash}`]
111
+ };
112
+ }
113
+ const analysis = Object.entries(manifest.bundles).map(
114
+ ([name, bundle]) => ({
115
+ name,
116
+ ...analyzeHandler(bundle.code)
117
+ })
118
+ );
119
+ const blockers = analysis.flatMap(
120
+ (entry) => entry.blockers.map((blocker) => `${blocker} in ${entry.name}`)
121
+ );
122
+ if (blockers.length > 0) {
123
+ return {
124
+ ok: false,
125
+ phase: "analysis",
126
+ blockers,
127
+ errors: blockers.map((blocker) => `[Analysis Blocker] ${blocker}`),
128
+ analysis
129
+ };
130
+ }
131
+ return { ok: true, analysis };
132
+ }
133
+
134
+ export {
135
+ computePushHash,
136
+ readAgentManifest,
137
+ validateCompiledIR
138
+ };
139
+ //# sourceMappingURL=chunk-7KVCCBPJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/ir/hashIR.ts","../src/utils/manifest/index.ts","../src/utils/validate.ts"],"sourcesContent":["import type { AgentManifestV3 } from \"@/utils/manifest/types\";\n\nexport function getSemanticHash(manifest: Pick<AgentManifestV3, \"artifactManifest\">): string {\n return manifest.artifactManifest.semanticHash;\n}\n\nexport function computePushHash(\n manifest: Pick<AgentManifestV3, \"artifactManifest\">,\n target = \"default\",\n): string {\n const deploymentHash = manifest.artifactManifest.targets[target]?.deploymentHash;\n if (!deploymentHash) {\n throw new Error(`Missing deployment hash for target \"${target}\"`);\n }\n\n return deploymentHash;\n}\n\n","import { access, mkdtemp, readFile, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport { buildAgent } from \"@kalphq/compiler\";\nimport type {\n ArtifactManifest,\n BundleManifest,\n IRGraph,\n SchemaRegistry,\n} from \"@kalphq/sdk\";\nimport type { AgentManifestV3 } from \"@/utils/manifest/types\";\n\nexport type { AgentManifestV3 } from \"@/utils/manifest/types\";\nexport { computePushHash } from \"@/utils/ir/hashIR\";\n\nasync function loadJson<T>(filePath: string): Promise<T> {\n const content = await readFile(filePath, \"utf-8\");\n return JSON.parse(content) as T;\n}\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 const tempOutDir = await mkdtemp(join(tmpdir(), \"kalp-build-\"));\n\n try {\n await buildAgent(agentPath, tempOutDir, cwd, { includeDebug: false });\n\n const artifactsDir = join(tempOutDir, \".kalp\", \"artifacts\");\n const artifactManifest = await loadJson<ArtifactManifest>(\n join(artifactsDir, \"artifact-manifest.json\"),\n );\n const semanticIr = await loadJson<IRGraph>(join(artifactsDir, \"semantic-ir.json\"));\n const schemas = await loadJson<SchemaRegistry>(join(artifactsDir, \"schemas.json\"));\n const bundleManifest = await loadJson<BundleManifest>(\n join(artifactsDir, \"bundle-manifest.json\"),\n );\n\n const bundles: AgentManifestV3[\"bundles\"] = {};\n const targetBundles = bundleManifest.targets.default?.nodes ?? {};\n\n for (const binding of Object.values(targetBundles)) {\n if (bundles[binding.bundle]) {\n continue;\n }\n\n const filePath = join(artifactsDir, binding.file.replace(/^\\.\\//, \"\").replace(/\\//g, \"\\\\\"));\n bundles[binding.bundle] = {\n file: binding.file,\n code: await readFile(filePath, \"utf-8\"),\n size: binding.size,\n sha256: binding.sha256,\n };\n }\n\n return {\n format: \"kalp-agent-manifest\",\n schemaVersion: 3,\n artifactManifest,\n semanticIr,\n schemas,\n bundleManifest,\n bundles,\n metadata: {\n generatedAt: new Date().toISOString(),\n },\n };\n } finally {\n await rm(tempOutDir, { recursive: true, force: true });\n }\n}\n\n","import {\n analyzeHandler,\n calculateArtifactHash,\n calculateDeploymentHash,\n calculateSemanticHash,\n validateIR,\n validateIRBindings,\n} from \"@kalphq/compiler\";\nimport type { AgentManifestV3 } from \"@/utils/manifest/types\";\n\nexport interface NamedAnalysis {\n name: string;\n capabilities: string[];\n imports: { external: string[]; internal: string[] };\n blockers: string[];\n warnings: string[];\n}\n\nexport function validateCompiledIR(input: {\n agentName: string;\n manifest: AgentManifestV3;\n hash: string;\n target?: string;\n}): {\n ok: boolean;\n phase?: \"ir\" | \"bindings\" | \"hash\" | \"analysis\";\n errors?: string[];\n blockers?: string[];\n analysis?: NamedAnalysis[];\n} {\n const { manifest, hash, target = \"default\" } = input;\n const targetManifest = manifest.bundleManifest.targets[target];\n\n const irValidation = validateIR(manifest.semanticIr);\n if (!irValidation.valid) {\n return { ok: false, phase: \"ir\", errors: irValidation.errors };\n }\n\n if (!targetManifest) {\n return {\n ok: false,\n phase: \"bindings\",\n errors: [`Missing bundle target manifest for \"${target}\"`],\n };\n }\n\n const bindingsValidation = validateIRBindings(\n manifest.semanticIr,\n manifest.bundleManifest,\n manifest.schemas,\n );\n if (!bindingsValidation.valid) {\n return { ok: false, phase: \"bindings\", errors: bindingsValidation.errors };\n }\n\n const semanticHash = calculateSemanticHash(manifest.semanticIr, manifest.schemas);\n const artifactHash = calculateArtifactHash(targetManifest);\n const deploymentHash = calculateDeploymentHash(\n semanticHash,\n artifactHash,\n manifest.artifactManifest.targets[target]?.abiVersion ?? targetManifest.abiVersion,\n );\n\n if (deploymentHash !== hash) {\n return {\n ok: false,\n phase: \"hash\",\n errors: [`Hash mismatch: client provided ${hash}, calculated ${deploymentHash}`],\n };\n }\n\n const analysis: NamedAnalysis[] = Object.entries(manifest.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((blocker) => `[Analysis Blocker] ${blocker}`),\n analysis,\n };\n }\n\n return { ok: true, analysis };\n}\n\n"],"mappings":"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","names":[]}
@@ -189,7 +189,7 @@ async function resolveCustomDomains(params) {
189
189
  var cloudflareProvider = {
190
190
  name: "cloudflare",
191
191
  async login() {
192
- await execa2("npx", ["wrangler", "login"], { stdio: "inherit" });
192
+ await execa2("npx", ["wrangler", "login"]);
193
193
  },
194
194
  async whoami() {
195
195
  const identity = await getCloudflareIdentity();
@@ -381,4 +381,4 @@ export {
381
381
  requireAuth,
382
382
  resolveProvider
383
383
  };
384
- //# sourceMappingURL=chunk-S3KAVLVM.js.map
384
+ //# sourceMappingURL=chunk-D53K6UE6.js.map
@@ -0,0 +1 @@
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\"]);\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":"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","names":["execa","readFile","writeFile","join","execa","readFile"]}
@@ -3,22 +3,24 @@ import {
3
3
  ensureStudioSecrets
4
4
  } from "./chunk-NV2IZ4XM.js";
5
5
  import {
6
- getRequiredSecretForProvider,
6
+ requireAuth,
7
+ resolveProvider
8
+ } from "./chunk-D53K6UE6.js";
9
+ import {
7
10
  materializeRuntime,
8
- readDotEnv,
9
11
  readProjectState,
10
- resolveProviderFromConfig,
11
12
  writeProjectState
12
- } from "./chunk-XVD3FFOJ.js";
13
- import {
14
- requireAuth,
15
- resolveProvider
16
- } from "./chunk-S3KAVLVM.js";
13
+ } from "./chunk-JXR6TPR5.js";
17
14
  import {
18
15
  loadProjectConfig,
19
16
  resolveIdentityAuthRequirements,
20
17
  resolveRuntimeIdentityConfig
21
18
  } from "./chunk-EXXTCGKR.js";
19
+ import {
20
+ getRequiredSecretForProvider,
21
+ readDotEnv,
22
+ resolveProviderFromConfig
23
+ } from "./chunk-LEKRFM4Q.js";
22
24
 
23
25
  // src/utils/deploy.ts
24
26
  import { readFile, writeFile } from "fs/promises";
@@ -160,42 +162,7 @@ async function runInitialDeploy(cwd) {
160
162
  };
161
163
  }
162
164
 
163
- // src/utils/deploy-target.ts
164
- import * as p from "@clack/prompts";
165
- import pc from "picocolors";
166
- async function promptDeployTarget(message) {
167
- const selected = await p.select({
168
- message,
169
- options: [
170
- {
171
- value: "cloudflare",
172
- label: "Cloudflare",
173
- hint: "Available now"
174
- },
175
- {
176
- value: "kalp-cloud",
177
- label: "Kalp Cloud",
178
- hint: "Coming soon"
179
- }
180
- ]
181
- });
182
- if (p.isCancel(selected)) return null;
183
- return selected;
184
- }
185
- function showKalpCloudWaitlist() {
186
- p.note(
187
- [
188
- `${pc.bold("Kalp Cloud is coming soon \u{1F680}")}`,
189
- pc.dim("Join the waitlist for early access:"),
190
- pc.cyan("https://usekalp.com/waitlist")
191
- ].join("\n"),
192
- "Kalp Cloud"
193
- );
194
- }
195
-
196
165
  export {
197
- runInitialDeploy,
198
- promptDeployTarget,
199
- showKalpCloudWaitlist
166
+ runInitialDeploy
200
167
  };
201
- //# sourceMappingURL=chunk-4CEJYSJY.js.map
168
+ //# sourceMappingURL=chunk-DLUULDXW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/deploy.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"],"mappings":"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","names":[]}
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ loadProjectConfig
4
+ } from "./chunk-EXXTCGKR.js";
5
+
6
+ // src/utils/codegen.ts
7
+ import { 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 DEFAULT_PROVIDER = "openai";
13
+ function sanitizeSecrets(input) {
14
+ if (!Array.isArray(input)) return [];
15
+ return input.filter((value) => typeof value === "string").map((value) => value.trim()).filter(Boolean).sort((a, b) => a.localeCompare(b));
16
+ }
17
+ function sanitizeCustomModels(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 sanitizeProvider(input) {
22
+ if (typeof input === "string" && input.trim()) {
23
+ return input.trim();
24
+ }
25
+ return DEFAULT_PROVIDER;
26
+ }
27
+ async function readConfigForTypes(cwd) {
28
+ const { raw } = await loadProjectConfig(cwd);
29
+ const aiConfig = raw.ai && typeof raw.ai === "object" ? raw.ai : {};
30
+ return {
31
+ secrets: sanitizeSecrets(raw.secrets),
32
+ provider: sanitizeProvider(aiConfig.provider),
33
+ customModels: sanitizeCustomModels(aiConfig.customModels)
34
+ };
35
+ }
36
+ function toStringTuple(values) {
37
+ if (values.length === 0) return "readonly []";
38
+ return `readonly [${values.map((value) => JSON.stringify(value)).join(", ")}]`;
39
+ }
40
+ function buildKalpGeneratedTypes(config) {
41
+ return `${GENERATED_HEADER}import "@kalphq/sdk";
42
+
43
+ /**
44
+ * Registered secrets from kalp.config.ts
45
+ * @generated
46
+ */
47
+ export type RegisteredSecretKeys = ${toStringTuple(config.secrets)};
48
+
49
+ /**
50
+ * AI provider resolved from kalp.config.ts
51
+ * @generated
52
+ */
53
+ export type ConfiguredAIProvider = ${JSON.stringify(config.provider)};
54
+
55
+ /**
56
+ * Custom model suggestions resolved from kalp.config.ts
57
+ * @generated
58
+ */
59
+ export type ConfiguredAICustomModels = ${toStringTuple(config.customModels)};
60
+
61
+ declare module "@kalphq/sdk" {
62
+ interface SecretsRegistry {
63
+ keys: RegisteredSecretKeys;
64
+ }
65
+
66
+ interface KalpAIEnvironment {
67
+ provider: ConfiguredAIProvider;
68
+ customModels: ConfiguredAICustomModels;
69
+ }
70
+ }
71
+ `;
72
+ }
73
+ var ProjectTypesGenerator = class {
74
+ id = "project";
75
+ name = "Project Types";
76
+ async generate(cwd) {
77
+ const generatedDir = join(cwd, ".kalp", "generated");
78
+ const typesPath = join(generatedDir, "project.d.ts");
79
+ await mkdir(generatedDir, { recursive: true });
80
+ const config = await readConfigForTypes(cwd);
81
+ const content = buildKalpGeneratedTypes(config);
82
+ const existing = await readFile(typesPath, "utf-8").catch(() => null);
83
+ if (existing === content) {
84
+ return { updated: false };
85
+ }
86
+ await writeFile(typesPath, content, "utf-8");
87
+ return { updated: true };
88
+ }
89
+ };
90
+ async function generateTypes(cwd) {
91
+ const gen = new ProjectTypesGenerator();
92
+ await gen.generate(cwd);
93
+ }
94
+
95
+ export {
96
+ ProjectTypesGenerator,
97
+ generateTypes
98
+ };
99
+ //# sourceMappingURL=chunk-DXNHT4HF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/codegen.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from \"node:fs/promises\";\r\nimport { join } from \"node:path\";\r\nimport { loadProjectConfig } from \"@/utils/project-config\";\r\nimport type { ProjectGenerator, GeneratorResult } from \"./sync\";\r\n\r\nconst GENERATED_HEADER = `// 🦋 Kalp Generated Types\r\n// This file is auto-generated. Do not edit manually.\r\n`;\r\n\r\ntype AIProvider = string;\r\n\r\ninterface GeneratedTypeConfig {\r\n secrets: string[];\r\n provider: AIProvider;\r\n customModels: string[];\r\n}\r\n\r\nconst DEFAULT_PROVIDER: AIProvider = \"openai\";\r\n\r\nfunction sanitizeSecrets(input: unknown): string[] {\r\n if (!Array.isArray(input)) return [];\r\n return input\r\n .filter((value): value is string => typeof value === \"string\")\r\n .map((value) => value.trim())\r\n .filter(Boolean)\r\n .sort((a, b) => a.localeCompare(b));\r\n}\r\n\r\nfunction sanitizeCustomModels(input: unknown): string[] {\r\n if (!Array.isArray(input)) return [];\r\n return input\r\n .filter((value): value is string => typeof value === \"string\")\r\n .map((value) => value.trim())\r\n .filter(Boolean)\r\n .sort((a, b) => a.localeCompare(b));\r\n}\r\n\r\nfunction sanitizeProvider(input: unknown): string {\r\n if (typeof input === \"string\" && input.trim()) {\r\n return input.trim();\r\n }\r\n return DEFAULT_PROVIDER;\r\n}\r\n\r\nasync function readConfigForTypes(cwd: string): Promise<GeneratedTypeConfig> {\r\n const { raw } = await loadProjectConfig(cwd);\r\n const aiConfig =\r\n raw.ai && typeof raw.ai === \"object\"\r\n ? (raw.ai as Record<string, unknown>)\r\n : {};\r\n\r\n return {\r\n secrets: sanitizeSecrets(raw.secrets),\r\n provider: sanitizeProvider(aiConfig.provider),\r\n customModels: sanitizeCustomModels(aiConfig.customModels),\r\n };\r\n}\r\n\r\nfunction toStringTuple(values: string[]): string {\r\n if (values.length === 0) return \"readonly []\";\r\n return `readonly [${values.map((value) => JSON.stringify(value)).join(\", \")}]`;\r\n}\r\n\r\nfunction buildKalpGeneratedTypes(config: GeneratedTypeConfig): string {\r\n return `${GENERATED_HEADER}import \"@kalphq/sdk\";\r\n\r\n/**\r\n * Registered secrets from kalp.config.ts\r\n * @generated\r\n */\r\nexport type RegisteredSecretKeys = ${toStringTuple(config.secrets)};\r\n\r\n/**\r\n * AI provider resolved from kalp.config.ts\r\n * @generated\r\n */\r\nexport type ConfiguredAIProvider = ${JSON.stringify(config.provider)};\r\n\r\n/**\r\n * Custom model suggestions resolved from kalp.config.ts\r\n * @generated\r\n */\r\nexport type ConfiguredAICustomModels = ${toStringTuple(config.customModels)};\r\n\r\ndeclare module \"@kalphq/sdk\" {\r\n interface SecretsRegistry {\r\n keys: RegisteredSecretKeys;\r\n }\r\n\r\n interface KalpAIEnvironment {\r\n provider: ConfiguredAIProvider;\r\n customModels: ConfiguredAICustomModels;\r\n }\r\n}\r\n`;\r\n}\r\n\r\n/**\r\n * Generator for core project types (AI, Secrets, Models).\r\n */\r\nexport class ProjectTypesGenerator implements ProjectGenerator {\r\n id = \"project\";\r\n name = \"Project Types\";\r\n\r\n async generate(cwd: string): Promise<GeneratorResult> {\r\n const generatedDir = join(cwd, \".kalp\", \"generated\");\r\n const typesPath = join(generatedDir, \"project.d.ts\");\r\n\r\n await mkdir(generatedDir, { recursive: true });\r\n\r\n const config = await readConfigForTypes(cwd);\r\n const content = buildKalpGeneratedTypes(config);\r\n\r\n // Check if update is needed\r\n const existing = await readFile(typesPath, \"utf-8\").catch(() => null);\r\n if (existing === content) {\r\n return { updated: false };\r\n }\r\n\r\n await writeFile(typesPath, content, \"utf-8\");\r\n return { updated: true };\r\n }\r\n}\r\n\r\n/**\r\n * Legacy export for backward compatibility during refactor.\r\n * @deprecated Use ProjectSynchronizer instead.\r\n */\r\nexport async function generateTypes(cwd: string): Promise<void> {\r\n const gen = new ProjectTypesGenerator();\r\n await gen.generate(cwd);\r\n}\r\n"],"mappings":";;;;;;AAAA,SAAS,OAAO,UAAU,iBAAiB;AAC3C,SAAS,YAAY;AAIrB,IAAM,mBAAmB;AAAA;AAAA;AAYzB,IAAM,mBAA+B;AAErC,SAAS,gBAAgB,OAA0B;AACjD,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,SAAO,MACJ,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,EAC5D,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO,EACd,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AACtC;AAEA,SAAS,qBAAqB,OAA0B;AACtD,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,SAAO,MACJ,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,EAC5D,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO,EACd,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AACtC;AAEA,SAAS,iBAAiB,OAAwB;AAChD,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,GAAG;AAC7C,WAAO,MAAM,KAAK;AAAA,EACpB;AACA,SAAO;AACT;AAEA,eAAe,mBAAmB,KAA2C;AAC3E,QAAM,EAAE,IAAI,IAAI,MAAM,kBAAkB,GAAG;AAC3C,QAAM,WACJ,IAAI,MAAM,OAAO,IAAI,OAAO,WACvB,IAAI,KACL,CAAC;AAEP,SAAO;AAAA,IACL,SAAS,gBAAgB,IAAI,OAAO;AAAA,IACpC,UAAU,iBAAiB,SAAS,QAAQ;AAAA,IAC5C,cAAc,qBAAqB,SAAS,YAAY;AAAA,EAC1D;AACF;AAEA,SAAS,cAAc,QAA0B;AAC/C,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,SAAO,aAAa,OAAO,IAAI,CAAC,UAAU,KAAK,UAAU,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC;AAC7E;AAEA,SAAS,wBAAwB,QAAqC;AACpE,SAAO,GAAG,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAMS,cAAc,OAAO,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAM7B,KAAK,UAAU,OAAO,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAM3B,cAAc,OAAO,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAa3E;AAKO,IAAM,wBAAN,MAAwD;AAAA,EAC7D,KAAK;AAAA,EACL,OAAO;AAAA,EAEP,MAAM,SAAS,KAAuC;AACpD,UAAM,eAAe,KAAK,KAAK,SAAS,WAAW;AACnD,UAAM,YAAY,KAAK,cAAc,cAAc;AAEnD,UAAM,MAAM,cAAc,EAAE,WAAW,KAAK,CAAC;AAE7C,UAAM,SAAS,MAAM,mBAAmB,GAAG;AAC3C,UAAM,UAAU,wBAAwB,MAAM;AAG9C,UAAM,WAAW,MAAM,SAAS,WAAW,OAAO,EAAE,MAAM,MAAM,IAAI;AACpE,QAAI,aAAa,SAAS;AACxB,aAAO,EAAE,SAAS,MAAM;AAAA,IAC1B;AAEA,UAAM,UAAU,WAAW,SAAS,OAAO;AAC3C,WAAO,EAAE,SAAS,KAAK;AAAA,EACzB;AACF;AAMA,eAAsB,cAAc,KAA4B;AAC9D,QAAM,MAAM,IAAI,sBAAsB;AACtC,QAAM,IAAI,SAAS,GAAG;AACxB;","names":[]}