@kalphq/cli 0.0.0-dev-20260509012111 → 0.0.0-dev-20260510044447

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 (60) hide show
  1. package/dist/{add-KRHLYYTO.js → add-XTXSSGC5.js} +3 -2
  2. package/dist/{add-KRHLYYTO.js.map → add-XTXSSGC5.js.map} +1 -1
  3. package/dist/chunk-5RODADXW.js +65 -0
  4. package/dist/chunk-5RODADXW.js.map +1 -0
  5. package/dist/chunk-FO24J6XL.js +23 -0
  6. package/dist/chunk-FO24J6XL.js.map +1 -0
  7. package/dist/chunk-MM6CND3O.js +84 -0
  8. package/dist/chunk-MM6CND3O.js.map +1 -0
  9. package/dist/chunk-TTKFK7NJ.js +232 -0
  10. package/dist/chunk-TTKFK7NJ.js.map +1 -0
  11. package/dist/{delete-47ZP6XRB.js → delete-N4OSUK3X.js} +3 -2
  12. package/dist/{delete-47ZP6XRB.js.map → delete-N4OSUK3X.js.map} +1 -1
  13. package/dist/deploy-PKK545YR.js +63 -0
  14. package/dist/deploy-PKK545YR.js.map +1 -0
  15. package/dist/dev-LE5FR6BF.js +74 -0
  16. package/dist/dev-LE5FR6BF.js.map +1 -0
  17. package/dist/index.js +15 -10
  18. package/dist/index.js.map +1 -1
  19. package/dist/{list-3ZQIFUOT.js → list-VMJPWHIH.js} +3 -2
  20. package/dist/{list-3ZQIFUOT.js.map → list-VMJPWHIH.js.map} +1 -1
  21. package/dist/login-M5Y57ZZU.js +73 -0
  22. package/dist/login-M5Y57ZZU.js.map +1 -0
  23. package/dist/{logout-V67DZZXO.js → logout-U5V5K775.js} +5 -4
  24. package/dist/logout-U5V5K775.js.map +1 -0
  25. package/dist/push-EI646ZVZ.js +289 -0
  26. package/dist/push-EI646ZVZ.js.map +1 -0
  27. package/dist/runtime-template/studio/assets/QueryClientProvider-D-LxTiBd.js +1 -0
  28. package/dist/runtime-template/studio/assets/index-DpfZiZAs.js +75 -0
  29. package/dist/runtime-template/studio/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  30. package/dist/runtime-template/studio/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  31. package/dist/runtime-template/studio/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  32. package/dist/runtime-template/studio/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  33. package/dist/runtime-template/studio/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  34. package/dist/runtime-template/studio/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  35. package/dist/runtime-template/studio/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  36. package/dist/runtime-template/studio/assets/replay._executionId-Cs7M_t4A.js +41 -0
  37. package/dist/runtime-template/studio/assets/routes-DM2dr3uc.js +1 -0
  38. package/dist/runtime-template/studio/assets/styles-DnCmVxlg.css +2 -0
  39. package/dist/runtime-template/studio/assets/useAuth-CNMCKtPc.js +1 -0
  40. package/dist/runtime-template/studio/favicon.ico +0 -0
  41. package/dist/runtime-template/studio/index.html +13 -0
  42. package/dist/runtime-template/studio/logo192.png +0 -0
  43. package/dist/runtime-template/studio/logo512.png +0 -0
  44. package/dist/runtime-template/studio/manifest.json +25 -0
  45. package/dist/runtime-template/studio/robots.txt +3 -0
  46. package/dist/runtime-template/worker-entry.js +2 -0
  47. package/dist/{secrets-KFMVBKJQ.js → secrets-P7ADVLOS.js} +5 -5
  48. package/dist/{sync-YFM5P3IS.js → sync-OTO44GQS.js} +3 -2
  49. package/dist/{sync-YFM5P3IS.js.map → sync-OTO44GQS.js.map} +1 -1
  50. package/package.json +8 -5
  51. package/dist/chunk-6LLXGS2P.js +0 -25
  52. package/dist/chunk-6LLXGS2P.js.map +0 -1
  53. package/dist/login-JYPWGL6P.js +0 -38
  54. package/dist/login-JYPWGL6P.js.map +0 -1
  55. package/dist/logout-V67DZZXO.js.map +0 -1
  56. package/dist/push-UZADV7TZ.js +0 -255
  57. package/dist/push-UZADV7TZ.js.map +0 -1
  58. package/dist/studio-SSJ27ZHR.js +0 -103
  59. package/dist/studio-SSJ27ZHR.js.map +0 -1
  60. /package/dist/{secrets-KFMVBKJQ.js.map → secrets-P7ADVLOS.js.map} +0 -0
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ensureSecretKey,
4
+ materializeRuntime
5
+ } from "./chunk-TTKFK7NJ.js";
6
+
7
+ // src/commands/dev.ts
8
+ import { copyFile } from "fs/promises";
9
+ import { join } from "path";
10
+ import { setTimeout as delay } from "timers/promises";
11
+ import { defineCommand } from "citty";
12
+ import * as p from "@clack/prompts";
13
+ import pc from "picocolors";
14
+ import { execa } from "execa";
15
+ import open from "open";
16
+
17
+ // src/utils/studio-token.ts
18
+ import { SignJWT } from "jose";
19
+ async function createStudioToken(secretKey) {
20
+ const secret = new TextEncoder().encode(secretKey);
21
+ return new SignJWT({
22
+ sub: "cli-user",
23
+ aud: "kalp-studio",
24
+ iat: Math.floor(Date.now() / 1e3),
25
+ exp: Math.floor(Date.now() / 1e3) + 3600
26
+ }).setProtectedHeader({ alg: "HS256" }).sign(secret);
27
+ }
28
+
29
+ // src/commands/dev.ts
30
+ var LOGO = "\u{1F98B}";
31
+ var dev_default = defineCommand({
32
+ meta: { name: "dev", description: "Run Worker + Studio local environment" },
33
+ async run() {
34
+ const cwd = process.cwd();
35
+ p.intro(`${LOGO} ${pc.bold("kalp dev")}`);
36
+ const { key } = await ensureSecretKey(cwd);
37
+ await copyFile(join(cwd, ".env"), join(cwd, ".dev.vars"));
38
+ const token = await createStudioToken(key);
39
+ const runtime = await materializeRuntime(cwd);
40
+ p.note("Starting local runtime (wrangler dev :8787)");
41
+ const backend = execa(
42
+ "npx",
43
+ [
44
+ "wrangler",
45
+ "dev",
46
+ "--port",
47
+ "8787",
48
+ "--config",
49
+ runtime.wranglerConfigPath
50
+ ],
51
+ { cwd, stdio: "inherit" }
52
+ );
53
+ const shutdown = () => {
54
+ backend.kill("SIGINT");
55
+ };
56
+ process.on("SIGINT", shutdown);
57
+ process.on("SIGTERM", shutdown);
58
+ await delay(2500);
59
+ const studioUrl = `http://localhost:8787/studio/?token=${token}`;
60
+ await open(studioUrl);
61
+ p.log.success(`Studio opened at ${pc.cyan(studioUrl)}`);
62
+ try {
63
+ await backend;
64
+ } finally {
65
+ shutdown();
66
+ process.off("SIGINT", shutdown);
67
+ process.off("SIGTERM", shutdown);
68
+ }
69
+ }
70
+ });
71
+ export {
72
+ dev_default as default
73
+ };
74
+ //# sourceMappingURL=dev-LE5FR6BF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/dev.ts","../src/utils/studio-token.ts"],"sourcesContent":["import { copyFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { execa } from \"execa\";\nimport open from \"open\";\nimport { ensureSecretKey } from \"@/utils/secret\";\nimport { createStudioToken } from \"@/utils/studio-token\";\nimport { materializeRuntime } from \"@/utils/runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"dev\", description: \"Run Worker + Studio local environment\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp dev\")}`);\n\n const { key } = await ensureSecretKey(cwd);\n await copyFile(join(cwd, \".env\"), join(cwd, \".dev.vars\"));\n const token = await createStudioToken(key);\n const runtime = await materializeRuntime(cwd);\n\n p.note(\"Starting local runtime (wrangler dev :8787)\");\n\n const backend = execa(\n \"npx\",\n [\n \"wrangler\",\n \"dev\",\n \"--port\",\n \"8787\",\n \"--config\",\n runtime.wranglerConfigPath,\n ],\n { cwd, stdio: \"inherit\" },\n );\n\n const shutdown = () => {\n backend.kill(\"SIGINT\");\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n await delay(2500);\n const studioUrl = `http://localhost:8787/studio/?token=${token}`;\n await open(studioUrl);\n p.log.success(`Studio opened at ${pc.cyan(studioUrl)}`);\n\n try {\n await backend;\n } finally {\n shutdown();\n process.off(\"SIGINT\", shutdown);\n process.off(\"SIGTERM\", shutdown);\n }\n },\n});\n","import { SignJWT } from \"jose\";\n\nexport async function createStudioToken(secretKey: string): Promise<string> {\n const secret = new TextEncoder().encode(secretKey);\n\n return new SignJWT({\n sub: \"cli-user\",\n aud: \"kalp-studio\",\n iat: Math.floor(Date.now() / 1000),\n exp: Math.floor(Date.now() / 1000) + 3600,\n })\n .setProtectedHeader({ alg: \"HS256\" })\n .sign(secret);\n}\n"],"mappings":";;;;;;;AAAA,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,cAAc,aAAa;AACpC,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,aAAa;AACtB,OAAO,UAAU;;;ACPjB,SAAS,eAAe;AAExB,eAAsB,kBAAkB,WAAoC;AAC1E,QAAM,SAAS,IAAI,YAAY,EAAE,OAAO,SAAS;AAEjD,SAAO,IAAI,QAAQ;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,IACjC,KAAK,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,IAAI;AAAA,EACvC,CAAC,EACE,mBAAmB,EAAE,KAAK,QAAQ,CAAC,EACnC,KAAK,MAAM;AAChB;;;ADDA,IAAM,OAAO;AAEb,IAAO,cAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,OAAO,aAAa,wCAAwC;AAAA,EAC1E,MAAM,MAAM;AACV,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,UAAU,CAAC,EAAE;AAExC,UAAM,EAAE,IAAI,IAAI,MAAM,gBAAgB,GAAG;AACzC,UAAM,SAAS,KAAK,KAAK,MAAM,GAAG,KAAK,KAAK,WAAW,CAAC;AACxD,UAAM,QAAQ,MAAM,kBAAkB,GAAG;AACzC,UAAM,UAAU,MAAM,mBAAmB,GAAG;AAE5C,IAAE,OAAK,6CAA6C;AAEpD,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,MACA,EAAE,KAAK,OAAO,UAAU;AAAA,IAC1B;AAEA,UAAM,WAAW,MAAM;AACrB,cAAQ,KAAK,QAAQ;AAAA,IACvB;AAEA,YAAQ,GAAG,UAAU,QAAQ;AAC7B,YAAQ,GAAG,WAAW,QAAQ;AAE9B,UAAM,MAAM,IAAI;AAChB,UAAM,YAAY,uCAAuC,KAAK;AAC9D,UAAM,KAAK,SAAS;AACpB,IAAE,MAAI,QAAQ,oBAAoB,GAAG,KAAK,SAAS,CAAC,EAAE;AAEtD,QAAI;AACF,YAAM;AAAA,IACR,UAAE;AACA,eAAS;AACT,cAAQ,IAAI,UAAU,QAAQ;AAC9B,cAAQ,IAAI,WAAW,QAAQ;AAAA,IACjC;AAAA,EACF;AACF,CAAC;","names":[]}
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@ import pc from "picocolors";
8
8
  // package.json
9
9
  var package_default = {
10
10
  name: "@kalphq/cli",
11
- version: "0.0.0-dev-20260509012111",
11
+ version: "0.0.0-dev-20260510044447",
12
12
  description: "Zero-config CLI for deploying Kalp agents",
13
13
  type: "module",
14
14
  license: "MIT",
@@ -24,7 +24,9 @@ var package_default = {
24
24
  access: "public"
25
25
  },
26
26
  scripts: {
27
- build: "tsup",
27
+ build: "tsup && pnpm run build:studio && pnpm run build:runtime-template",
28
+ "build:studio": "pnpm --filter=@kalphq/studio build",
29
+ "build:runtime-template": "node ./scripts/prepare-runtime-template.mjs",
28
30
  dev: "tsup --watch",
29
31
  lint: "tsc --noEmit",
30
32
  prepublishOnly: "pnpm build"
@@ -37,6 +39,7 @@ var package_default = {
37
39
  "@kalphq/sdk": "workspace:*",
38
40
  citty: "0.1.6",
39
41
  esbuild: "0.25.0",
42
+ execa: "^9.6.1",
40
43
  jose: "^5.10.0",
41
44
  "json-stable-stringify": "1.3.0",
42
45
  open: "^11.0.0",
@@ -55,12 +58,13 @@ var package_default = {
55
58
  var LOGO = "\u{1F98B}";
56
59
  var COMMANDS = [
57
60
  ["create", "Add a new agent"],
58
- ["push", "Push agent to Kalp"],
61
+ ["deploy", "Deploy runtime to Cloudflare"],
62
+ ["push", "Push agent manifest to Cloudflare"],
59
63
  ["link", "Link project to Kalp cloud"],
60
64
  ["secrets", "Manage secrets"],
61
- ["login", "Authenticate with Kalp"],
65
+ ["login", "Authenticate with Cloudflare"],
62
66
  ["logout", "Sign out from Kalp"],
63
- ["studio", "Open Kalp Studio"]
67
+ ["dev", "Run Worker + Studio locally"]
64
68
  ];
65
69
  function printHelp() {
66
70
  p.log.info(`${pc.bold("Usage")}: kalp <command> [options]`);
@@ -88,12 +92,13 @@ var main = defineCommand({
88
92
  },
89
93
  subCommands: {
90
94
  create: () => import("./create-QTVTQ6QL.js").then((r) => r.default),
91
- push: () => import("./push-UZADV7TZ.js").then((r) => r.default),
95
+ deploy: () => import("./deploy-PKK545YR.js").then((r) => r.default),
96
+ push: () => import("./push-EI646ZVZ.js").then((r) => r.default),
92
97
  link: () => import("./link-WZQSR2TM.js").then((r) => r.default),
93
- secrets: () => import("./secrets-KFMVBKJQ.js").then((r) => r.default),
94
- login: () => import("./login-JYPWGL6P.js").then((r) => r.default),
95
- logout: () => import("./logout-V67DZZXO.js").then((r) => r.default),
96
- studio: () => import("./studio-SSJ27ZHR.js").then((r) => r.default)
98
+ secrets: () => import("./secrets-P7ADVLOS.js").then((r) => r.default),
99
+ login: () => import("./login-M5Y57ZZU.js").then((r) => r.default),
100
+ logout: () => import("./logout-U5V5K775.js").then((r) => r.default),
101
+ dev: () => import("./dev-LE5FR6BF.js").then((r) => r.default)
97
102
  },
98
103
  run({ args }) {
99
104
  const firstArg = process.argv[2];
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport pkg from \"../package.json\";\n\nconst LOGO = \"🦋\";\n\nconst COMMANDS = [\n [\"create\", \"Add a new agent\"],\n [\"push\", \"Push agent to Kalp\"],\n [\"link\", \"Link project to Kalp cloud\"],\n [\"secrets\", \"Manage secrets\"],\n [\"login\", \"Authenticate with Kalp\"],\n [\"logout\", \"Sign out from Kalp\"],\n [\"studio\", \"Open Kalp Studio\"],\n] as const;\n\nfunction printHelp(): void {\n p.log.info(`${pc.bold(\"Usage\")}: kalp <command> [options]`);\n console.log(\"\");\n p.log.info(pc.bold(\"Commands\"));\n\n for (const [name, desc] of COMMANDS) {\n console.log(` ${pc.cyan(name.padEnd(10))}${desc}`);\n }\n\n console.log(\"\");\n p.log.info(`Run ${pc.cyan(\"kalp <command> --help\")} for more info.`);\n}\n\nconst main = defineCommand({\n meta: {\n name: \"kalp\",\n version: pkg.version,\n description: \"🦋 Zero-config agent infrastructure\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n create: () => import(\"./commands/create\").then((r) => r.default),\n push: () => import(\"./commands/push\").then((r) => r.default),\n link: () => import(\"./commands/link\").then((r) => r.default),\n secrets: () => import(\"./commands/secrets\").then((r) => r.default),\n login: () => import(\"./commands/login\").then((r) => r.default),\n logout: () => import(\"./commands/logout\").then((r) => r.default),\n studio: () => import(\"./commands/studio\").then((r) => r.default),\n },\n run({ args }) {\n const firstArg = process.argv[2];\n\n if (args.help) {\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n return;\n }\n\n if (firstArg) {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n },\n});\n\nrunMain(main);\n","{\n \"name\": \"@kalphq/cli\",\n \"version\": \"0.0.0-dev-20260509012111\",\n \"description\": \"Zero-config CLI for deploying Kalp agents\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"author\": \"Kalp HQ\",\n \"bin\": {\n \"kalp\": \"./dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"tsc --noEmit\",\n \"prepublishOnly\": \"pnpm build\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"24.4.0\",\n \"@clack/prompts\": \"0.9.1\",\n \"@kalphq/compiler\": \"workspace:*\",\n \"@kalphq/project\": \"workspace:*\",\n \"@kalphq/sdk\": \"workspace:*\",\n \"citty\": \"0.1.6\",\n \"esbuild\": \"0.25.0\",\n \"jose\": \"^5.10.0\",\n \"json-stable-stringify\": \"1.3.0\",\n \"open\": \"^11.0.0\",\n \"picocolors\": \"1.1.1\",\n \"zod\": \"3.25.76\"\n },\n \"devDependencies\": {\n \"@types/json-stable-stringify\": \"1.2.0\",\n \"@types/node\": \"^22.15.3\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.0.0\"\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport pkg from \"../package.json\";\n\nconst LOGO = \"🦋\";\n\nconst COMMANDS = [\n [\"create\", \"Add a new agent\"],\n [\"deploy\", \"Deploy runtime to Cloudflare\"],\n [\"push\", \"Push agent manifest to Cloudflare\"],\n [\"link\", \"Link project to Kalp cloud\"],\n [\"secrets\", \"Manage secrets\"],\n [\"login\", \"Authenticate with Cloudflare\"],\n [\"logout\", \"Sign out from Kalp\"],\n [\"dev\", \"Run Worker + Studio locally\"],\n] as const;\n\nfunction printHelp(): void {\n p.log.info(`${pc.bold(\"Usage\")}: kalp <command> [options]`);\n console.log(\"\");\n p.log.info(pc.bold(\"Commands\"));\n\n for (const [name, desc] of COMMANDS) {\n console.log(` ${pc.cyan(name.padEnd(10))}${desc}`);\n }\n\n console.log(\"\");\n p.log.info(`Run ${pc.cyan(\"kalp <command> --help\")} for more info.`);\n}\n\nconst main = defineCommand({\n meta: {\n name: \"kalp\",\n version: pkg.version,\n description: \"🦋 Zero-config agent infrastructure\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n create: () => import(\"./commands/create\").then((r) => r.default),\n deploy: () => import(\"./commands/deploy\").then((r) => r.default),\n push: () => import(\"./commands/push\").then((r) => r.default),\n link: () => import(\"./commands/link\").then((r) => r.default),\n secrets: () => import(\"./commands/secrets\").then((r) => r.default),\n login: () => import(\"./commands/login\").then((r) => r.default),\n logout: () => import(\"./commands/logout\").then((r) => r.default),\n dev: () => import(\"./commands/dev\").then((r) => r.default),\n },\n run({ args }) {\n const firstArg = process.argv[2];\n\n if (args.help) {\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n return;\n }\n\n if (firstArg) {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n },\n});\n\nrunMain(main);\n","{\n \"name\": \"@kalphq/cli\",\n \"version\": \"0.0.0-dev-20260510044447\",\n \"description\": \"Zero-config CLI for deploying Kalp agents\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"author\": \"Kalp HQ\",\n \"bin\": {\n \"kalp\": \"./dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup && pnpm run build:studio && pnpm run build:runtime-template\",\n \"build:studio\": \"pnpm --filter=@kalphq/studio build\",\n \"build:runtime-template\": \"node ./scripts/prepare-runtime-template.mjs\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"tsc --noEmit\",\n \"prepublishOnly\": \"pnpm build\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"24.4.0\",\n \"@clack/prompts\": \"0.9.1\",\n \"@kalphq/compiler\": \"workspace:*\",\n \"@kalphq/project\": \"workspace:*\",\n \"@kalphq/sdk\": \"workspace:*\",\n \"citty\": \"0.1.6\",\n \"esbuild\": \"0.25.0\",\n \"execa\": \"^9.6.1\",\n \"jose\": \"^5.10.0\",\n \"json-stable-stringify\": \"1.3.0\",\n \"open\": \"^11.0.0\",\n \"picocolors\": \"1.1.1\",\n \"zod\": \"3.25.76\"\n },\n \"devDependencies\": {\n \"@types/json-stable-stringify\": \"1.2.0\",\n \"@types/node\": \"^22.15.3\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.0.0\"\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getAuthToken
4
- } from "./chunk-6LLXGS2P.js";
4
+ } from "./chunk-5RODADXW.js";
5
+ import "./chunk-FO24J6XL.js";
5
6
 
6
7
  // src/commands/secrets/list.ts
7
8
  import { defineCommand } from "citty";
@@ -116,4 +117,4 @@ var list_default = defineCommand({
116
117
  export {
117
118
  list_default as default
118
119
  };
119
- //# sourceMappingURL=list-3ZQIFUOT.js.map
120
+ //# sourceMappingURL=list-VMJPWHIH.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/secrets/list.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAuthToken } from \"@/utils/auth\";\n\nconst LOGO = \"🦋\";\n\ninterface CloudSecret {\n key: string;\n createdAt: string;\n}\n\nasync function fetchSecretsFromCloud(): Promise<CloudSecret[]> {\n return [\n { key: \"STRIPE_SECRET_KEY\", createdAt: \"2024-01-15T10:30:00Z\" },\n { key: \"OPENAI_API_KEY\", createdAt: \"2024-01-16T14:22:00Z\" },\n ];\n}\n\nasync function readLocalSecrets(cwd: string): Promise<string[]> {\n try {\n const configPath = join(cwd, \"kalp.config.ts\");\n const content = await readFile(configPath, \"utf-8\");\n // Extract secrets array from config\n const match = content.match(/secrets:\\s*\\[([^\\]]*)\\]/);\n if (!match) return [];\n const secretsStr = match[1];\n // Extract quoted strings\n const secrets: string[] = [];\n const regex = /[\"']([^\"']+)[\"']/g;\n\n if (!secretsStr) {\n return [];\n }\n\n let m: RegExpExecArray | null;\n while ((m = regex.exec(secretsStr)) !== null) {\n if (m[1]) {\n secrets.push(m[1]);\n }\n }\n return secrets;\n } catch {\n return [];\n }\n}\n\nexport default defineCommand({\n meta: {\n name: \"list\",\n description: \"List all secrets from Kalp Cloud\",\n },\n args: {\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 list`);\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets list\")}`);\n\n const token = await getAuthToken();\n if (!token) {\n p.log.warn(pc.yellow(\"Not logged in. Run `kalp login` first.\"));\n p.outro(\"Authentication required\");\n return;\n }\n\n const s = p.spinner();\n s.start(\"Fetching secrets from Kalp Cloud...\");\n\n try {\n const [cloudSecrets, localSecrets] = await Promise.all([\n fetchSecretsFromCloud(),\n readLocalSecrets(cwd),\n ]);\n\n s.stop(`Found ${cloudSecrets.length} secrets`);\n\n if (cloudSecrets.length === 0) {\n p.log.info(pc.dim(\"No secrets found in Kalp Cloud.\"));\n p.log.info(pc.dim(`Add secrets with: ${pc.cyan(\"kalp secrets add\")}`));\n } else {\n console.log(\"\");\n p.log.info(pc.bold(\"Cloud Secrets:\"));\n for (const secret of cloudSecrets) {\n const isSynced = localSecrets.includes(secret.key);\n const syncIcon = isSynced ? pc.green(\"✓\") : pc.yellow(\"○\");\n console.log(\n ` ${syncIcon} ${pc.cyan(secret.key)} ${pc.dim(`(${secret.createdAt})`)}`,\n );\n }\n\n if (localSecrets.length > 0) {\n const unsynced = localSecrets.filter(\n (k) => !cloudSecrets.some((s) => s.key === k),\n );\n if (unsynced.length > 0) {\n console.log(\"\");\n p.log.warn(\n pc.yellow(\n `Local-only secrets (not synced): ${unsynced.join(\", \")}`,\n ),\n );\n }\n }\n }\n\n p.outro(\"Done\");\n } catch (error) {\n s.stop(\"Failed to fetch secrets\");\n p.log.error(\n pc.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n p.outro(\"Failed\");\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["s"]}
1
+ {"version":3,"sources":["../src/commands/secrets/list.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAuthToken } from \"@/utils/auth\";\n\nconst LOGO = \"🦋\";\n\ninterface CloudSecret {\n key: string;\n createdAt: string;\n}\n\nasync function fetchSecretsFromCloud(): Promise<CloudSecret[]> {\n return [\n { key: \"STRIPE_SECRET_KEY\", createdAt: \"2024-01-15T10:30:00Z\" },\n { key: \"OPENAI_API_KEY\", createdAt: \"2024-01-16T14:22:00Z\" },\n ];\n}\n\nasync function readLocalSecrets(cwd: string): Promise<string[]> {\n try {\n const configPath = join(cwd, \"kalp.config.ts\");\n const content = await readFile(configPath, \"utf-8\");\n // Extract secrets array from config\n const match = content.match(/secrets:\\s*\\[([^\\]]*)\\]/);\n if (!match) return [];\n const secretsStr = match[1];\n // Extract quoted strings\n const secrets: string[] = [];\n const regex = /[\"']([^\"']+)[\"']/g;\n\n if (!secretsStr) {\n return [];\n }\n\n let m: RegExpExecArray | null;\n while ((m = regex.exec(secretsStr)) !== null) {\n if (m[1]) {\n secrets.push(m[1]);\n }\n }\n return secrets;\n } catch {\n return [];\n }\n}\n\nexport default defineCommand({\n meta: {\n name: \"list\",\n description: \"List all secrets from Kalp Cloud\",\n },\n args: {\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 list`);\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets list\")}`);\n\n const token = await getAuthToken();\n if (!token) {\n p.log.warn(pc.yellow(\"Not logged in. Run `kalp login` first.\"));\n p.outro(\"Authentication required\");\n return;\n }\n\n const s = p.spinner();\n s.start(\"Fetching secrets from Kalp Cloud...\");\n\n try {\n const [cloudSecrets, localSecrets] = await Promise.all([\n fetchSecretsFromCloud(),\n readLocalSecrets(cwd),\n ]);\n\n s.stop(`Found ${cloudSecrets.length} secrets`);\n\n if (cloudSecrets.length === 0) {\n p.log.info(pc.dim(\"No secrets found in Kalp Cloud.\"));\n p.log.info(pc.dim(`Add secrets with: ${pc.cyan(\"kalp secrets add\")}`));\n } else {\n console.log(\"\");\n p.log.info(pc.bold(\"Cloud Secrets:\"));\n for (const secret of cloudSecrets) {\n const isSynced = localSecrets.includes(secret.key);\n const syncIcon = isSynced ? pc.green(\"✓\") : pc.yellow(\"○\");\n console.log(\n ` ${syncIcon} ${pc.cyan(secret.key)} ${pc.dim(`(${secret.createdAt})`)}`,\n );\n }\n\n if (localSecrets.length > 0) {\n const unsynced = localSecrets.filter(\n (k) => !cloudSecrets.some((s) => s.key === k),\n );\n if (unsynced.length > 0) {\n console.log(\"\");\n p.log.warn(\n pc.yellow(\n `Local-only secrets (not synced): ${unsynced.join(\", \")}`,\n ),\n );\n }\n }\n }\n\n p.outro(\"Done\");\n } catch (error) {\n s.stop(\"Failed to fetch secrets\");\n p.log.error(\n pc.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n p.outro(\"Failed\");\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["s"]}
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ getCloudflareIdentity,
4
+ saveAuthConfig
5
+ } from "./chunk-5RODADXW.js";
6
+ import "./chunk-FO24J6XL.js";
7
+
8
+ // src/commands/login.ts
9
+ import { defineCommand } from "citty";
10
+ import * as p from "@clack/prompts";
11
+ import pc from "picocolors";
12
+ import { execa } from "execa";
13
+ var LOGO = "\u{1F98B}";
14
+ var login_default = defineCommand({
15
+ meta: { name: "login", description: "Authenticate with Cloudflare" },
16
+ async run() {
17
+ p.intro(`${LOGO} ${pc.bold("kalp login")}`);
18
+ const provider = await p.select({
19
+ message: "Choose login provider",
20
+ options: [
21
+ { label: "Cloudflare (Recommended)", value: "cloudflare" },
22
+ { label: "Kalp Cloud", value: "kalp-cloud" }
23
+ ]
24
+ });
25
+ if (p.isCancel(provider)) {
26
+ p.outro("Cancelled");
27
+ return;
28
+ }
29
+ if (provider === "kalp-cloud") {
30
+ p.note(
31
+ "Coming soon. Enterprise cloud execution is currently waitlisted.",
32
+ "Kalp Cloud"
33
+ );
34
+ p.outro(pc.dim("No login executed."));
35
+ return;
36
+ }
37
+ const s = p.spinner();
38
+ s.start("Opening Cloudflare OAuth login");
39
+ try {
40
+ await execa("npx", ["wrangler", "login"], {
41
+ stdio: "inherit"
42
+ });
43
+ } catch {
44
+ s.stop(pc.red("Cloudflare login failed"));
45
+ process.exit(1);
46
+ }
47
+ s.stop("Cloudflare login complete");
48
+ s.start("Reading Cloudflare identity");
49
+ const identity = await getCloudflareIdentity();
50
+ const account = identity?.accounts?.[0];
51
+ const accountId = account?.id ?? account?.account_tag;
52
+ const email = identity?.email;
53
+ if (!accountId || !email) {
54
+ s.stop(pc.red("Could not resolve account identity from wrangler whoami"));
55
+ process.exit(1);
56
+ }
57
+ const authConfig = {
58
+ provider: "cloudflare",
59
+ accountId,
60
+ email,
61
+ expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1e3).toISOString()
62
+ };
63
+ await saveAuthConfig(authConfig);
64
+ s.stop("Cloudflare authentication saved");
65
+ p.log.success(`Logged in as ${pc.cyan(authConfig.email)}`);
66
+ p.note(`Account ID: ${pc.cyan(authConfig.accountId)}`, "Cloudflare");
67
+ p.outro(pc.green("Ready to deploy with Cloudflare Workers"));
68
+ }
69
+ });
70
+ export {
71
+ login_default as default
72
+ };
73
+ //# sourceMappingURL=login-M5Y57ZZU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/login.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { execa } from \"execa\";\nimport {\n getCloudflareIdentity,\n saveAuthConfig,\n type AuthConfig,\n} from \"@/utils/auth\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"login\", description: \"Authenticate with Cloudflare\" },\n async run() {\n p.intro(`${LOGO} ${pc.bold(\"kalp login\")}`);\n\n const provider = await p.select({\n message: \"Choose login provider\",\n options: [\n { label: \"Cloudflare (Recommended)\", value: \"cloudflare\" },\n { label: \"Kalp Cloud\", value: \"kalp-cloud\" },\n ],\n });\n\n if (p.isCancel(provider)) {\n p.outro(\"Cancelled\");\n return;\n }\n\n if (provider === \"kalp-cloud\") {\n p.note(\n \"Coming soon. Enterprise cloud execution is currently waitlisted.\",\n \"Kalp Cloud\",\n );\n p.outro(pc.dim(\"No login executed.\"));\n return;\n }\n\n const s = p.spinner();\n s.start(\"Opening Cloudflare OAuth login\");\n\n try {\n await execa(\"npx\", [\"wrangler\", \"login\"], {\n stdio: \"inherit\",\n });\n } catch {\n s.stop(pc.red(\"Cloudflare login failed\"));\n process.exit(1);\n }\n\n s.stop(\"Cloudflare login complete\");\n s.start(\"Reading Cloudflare identity\");\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\n if (!accountId || !email) {\n s.stop(pc.red(\"Could not resolve account identity from wrangler whoami\"));\n process.exit(1);\n }\n\n const authConfig: AuthConfig = {\n provider: \"cloudflare\",\n accountId,\n email,\n expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),\n };\n\n await saveAuthConfig(authConfig);\n\n s.stop(\"Cloudflare authentication saved\");\n p.log.success(`Logged in as ${pc.cyan(authConfig.email)}`);\n p.note(`Account ID: ${pc.cyan(authConfig.accountId)}`, \"Cloudflare\");\n p.outro(pc.green(\"Ready to deploy with Cloudflare Workers\"));\n },\n});\n"],"mappings":";;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,aAAa;AAOtB,IAAM,OAAO;AAEb,IAAO,gBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,SAAS,aAAa,+BAA+B;AAAA,EACnE,MAAM,MAAM;AACV,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,YAAY,CAAC,EAAE;AAE1C,UAAM,WAAW,MAAQ,SAAO;AAAA,MAC9B,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,OAAO,4BAA4B,OAAO,aAAa;AAAA,QACzD,EAAE,OAAO,cAAc,OAAO,aAAa;AAAA,MAC7C;AAAA,IACF,CAAC;AAED,QAAM,WAAS,QAAQ,GAAG;AACxB,MAAE,QAAM,WAAW;AACnB;AAAA,IACF;AAEA,QAAI,aAAa,cAAc;AAC7B,MAAE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,MAAE,QAAM,GAAG,IAAI,oBAAoB,CAAC;AACpC;AAAA,IACF;AAEA,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,gCAAgC;AAExC,QAAI;AACF,YAAM,MAAM,OAAO,CAAC,YAAY,OAAO,GAAG;AAAA,QACxC,OAAO;AAAA,MACT,CAAC;AAAA,IACH,QAAQ;AACN,QAAE,KAAK,GAAG,IAAI,yBAAyB,CAAC;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,MAAE,KAAK,2BAA2B;AAClC,MAAE,MAAM,6BAA6B;AACrC,UAAM,WAAW,MAAM,sBAAsB;AAC7C,UAAM,UAAU,UAAU,WAAW,CAAC;AACtC,UAAM,YAAY,SAAS,MAAM,SAAS;AAC1C,UAAM,QAAQ,UAAU;AAExB,QAAI,CAAC,aAAa,CAAC,OAAO;AACxB,QAAE,KAAK,GAAG,IAAI,yDAAyD,CAAC;AACxE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,aAAyB;AAAA,MAC7B,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,WAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,GAAI,EAAE,YAAY;AAAA,IACzE;AAEA,UAAM,eAAe,UAAU;AAE/B,MAAE,KAAK,iCAAiC;AACxC,IAAE,MAAI,QAAQ,gBAAgB,GAAG,KAAK,WAAW,KAAK,CAAC,EAAE;AACzD,IAAE,OAAK,eAAe,GAAG,KAAK,WAAW,SAAS,CAAC,IAAI,YAAY;AACnE,IAAE,QAAM,GAAG,MAAM,yCAAyC,CAAC;AAAA,EAC7D;AACF,CAAC;","names":[]}
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ getGlobalConfigDir
4
+ } from "./chunk-FO24J6XL.js";
2
5
 
3
6
  // src/commands/logout.ts
4
7
  import { defineCommand } from "citty";
@@ -6,17 +9,15 @@ import * as p from "@clack/prompts";
6
9
  import pc from "picocolors";
7
10
  import { rm } from "fs/promises";
8
11
  import { join } from "path";
9
- import { homedir } from "os";
10
12
  var LOGO = "\u{1F98B}";
11
13
  var logout_default = defineCommand({
12
14
  meta: { name: "logout", description: "Sign out from Kalp" },
13
15
  async run() {
14
- const home = homedir();
15
16
  p.intro(`${LOGO} ${pc.bold("kalp logout")}`);
16
17
  const s = p.spinner();
17
18
  s.start("Signing out...");
18
19
  try {
19
- await rm(join(home, ".kalp", "auth.json"), { force: true });
20
+ await rm(join(getGlobalConfigDir(), "auth.json"), { force: true });
20
21
  s.stop("Signed out successfully");
21
22
  p.outro(pc.green("Logged out from Kalp"));
22
23
  } catch {
@@ -28,4 +29,4 @@ var logout_default = defineCommand({
28
29
  export {
29
30
  logout_default as default
30
31
  };
31
- //# sourceMappingURL=logout-V67DZZXO.js.map
32
+ //# sourceMappingURL=logout-U5V5K775.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/logout.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getGlobalConfigDir } from \"@/utils/config\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"logout\", description: \"Sign out from Kalp\" },\n async run() {\n p.intro(`${LOGO} ${pc.bold(\"kalp logout\")}`);\n\n const s = p.spinner();\n s.start(\"Signing out...\");\n\n try {\n await rm(join(getGlobalConfigDir(), \"auth.json\"), { force: true });\n s.stop(\"Signed out successfully\");\n p.outro(pc.green(\"Logged out from Kalp\"));\n } catch {\n s.stop(\"Nothing to do\");\n p.outro(pc.dim(\"No active session found\"));\n }\n },\n});\n"],"mappings":";;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,UAAU;AACnB,SAAS,YAAY;AAGrB,IAAM,OAAO;AAEb,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,EAC1D,MAAM,MAAM;AACV,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,aAAa,CAAC,EAAE;AAE3C,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,gBAAgB;AAExB,QAAI;AACF,YAAM,GAAG,KAAK,mBAAmB,GAAG,WAAW,GAAG,EAAE,OAAO,KAAK,CAAC;AACjE,QAAE,KAAK,yBAAyB;AAChC,MAAE,QAAM,GAAG,MAAM,sBAAsB,CAAC;AAAA,IAC1C,QAAQ;AACN,QAAE,KAAK,eAAe;AACtB,MAAE,QAAM,GAAG,IAAI,yBAAyB,CAAC;AAAA,IAC3C;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -0,0 +1,289 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ensureConfig
4
+ } from "./chunk-INB3LG6O.js";
5
+ import {
6
+ readProjectState,
7
+ runInitialDeploy
8
+ } from "./chunk-MM6CND3O.js";
9
+ import {
10
+ materializeRuntime
11
+ } from "./chunk-TTKFK7NJ.js";
12
+ import {
13
+ requireAuth
14
+ } from "./chunk-5RODADXW.js";
15
+ import {
16
+ ensureGlobalConfigDir
17
+ } from "./chunk-FO24J6XL.js";
18
+
19
+ // src/commands/push.ts
20
+ import { access as access2, mkdir, rm as rm2, writeFile as writeFile2 } from "fs/promises";
21
+ import { join as join3 } from "path";
22
+ import { defineCommand } from "citty";
23
+ import * as p from "@clack/prompts";
24
+ import pc from "picocolors";
25
+ import { execa } from "execa";
26
+
27
+ // src/utils/manifest/index.ts
28
+ import { access, readFile, rm, mkdtemp } from "fs/promises";
29
+ import { join } from "path";
30
+ import { tmpdir } from "os";
31
+ import { buildAgent } from "@kalphq/compiler";
32
+
33
+ // src/utils/ir/hashIR.ts
34
+ import { calculateAgentHash } from "@kalphq/compiler";
35
+ function computePushHash(ir) {
36
+ const bundles = ir.bundles || {};
37
+ const handlers = Object.keys(bundles).reduce(
38
+ (acc, hash) => ({
39
+ ...acc,
40
+ [hash]: { hash }
41
+ }),
42
+ {}
43
+ );
44
+ return calculateAgentHash(ir, handlers);
45
+ }
46
+
47
+ // src/utils/manifest/index.ts
48
+ async function readAgentManifest(params) {
49
+ const { cwd, agentName } = params;
50
+ const agentPath = join(cwd, "agents", agentName, "index.ts");
51
+ await access(agentPath);
52
+ const tempOutDir = await mkdtemp(join(tmpdir(), "kalp-build-"));
53
+ try {
54
+ await buildAgent(agentPath, tempOutDir, cwd);
55
+ const irContent = await readFile(join(tempOutDir, "ir.json"), "utf-8");
56
+ const ir = JSON.parse(irContent);
57
+ return {
58
+ format: "kalp-agent-manifest",
59
+ schemaVersion: 3,
60
+ ir,
61
+ metadata: {
62
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString()
63
+ }
64
+ };
65
+ } finally {
66
+ await rm(tempOutDir, { recursive: true, force: true });
67
+ }
68
+ }
69
+
70
+ // src/utils/validate.ts
71
+ import {
72
+ analyzeHandler,
73
+ calculateAgentHash as calculateAgentHash2,
74
+ validateIR,
75
+ validateIRBindings
76
+ } from "@kalphq/compiler";
77
+ function validateCompiledIR(input) {
78
+ const { ir, hash } = input;
79
+ const bundles = ir.bundles || {};
80
+ const bundleHashes = Object.keys(bundles);
81
+ const irValidation = validateIR(ir);
82
+ if (!irValidation.valid) {
83
+ return { ok: false, phase: "ir", errors: irValidation.errors };
84
+ }
85
+ const bindingsValidation = validateIRBindings(ir, bundleHashes);
86
+ if (!bindingsValidation.valid) {
87
+ return { ok: false, phase: "bindings", errors: bindingsValidation.errors };
88
+ }
89
+ const handlers = bundleHashes.reduce(
90
+ (acc, key) => ({ ...acc, [key]: { hash: key } }),
91
+ {}
92
+ );
93
+ const expectedHash = calculateAgentHash2(ir, handlers);
94
+ if (expectedHash !== hash) {
95
+ return {
96
+ ok: false,
97
+ phase: "hash",
98
+ errors: [
99
+ `Hash mismatch: client provided ${hash}, calculated ${expectedHash}`
100
+ ]
101
+ };
102
+ }
103
+ const analysis = Object.entries(bundles).map(
104
+ ([name, bundle]) => ({
105
+ name,
106
+ ...analyzeHandler(bundle.code)
107
+ })
108
+ );
109
+ const blockers = analysis.flatMap(
110
+ (entry) => entry.blockers.map((blocker) => `${blocker} in ${entry.name}`)
111
+ );
112
+ if (blockers.length > 0) {
113
+ return {
114
+ ok: false,
115
+ phase: "analysis",
116
+ blockers,
117
+ errors: blockers.map((b) => `[Analysis Blocker] ${b}`),
118
+ analysis
119
+ };
120
+ }
121
+ return { ok: true, analysis };
122
+ }
123
+
124
+ // src/utils/agent-store.ts
125
+ import { readFile as readFile2, writeFile } from "fs/promises";
126
+ import { join as join2 } from "path";
127
+ async function getStorePath() {
128
+ return join2(await ensureGlobalConfigDir(), "agents.json");
129
+ }
130
+ async function readAgentStore() {
131
+ try {
132
+ const storePath = await getStorePath();
133
+ const content = await readFile2(storePath, "utf-8");
134
+ return JSON.parse(content);
135
+ } catch {
136
+ return {};
137
+ }
138
+ }
139
+ async function getAgentStoreEntry(agentName) {
140
+ const store = await readAgentStore();
141
+ return store[agentName] ?? null;
142
+ }
143
+ async function writeAgentStoreEntry(agentName, entry) {
144
+ const storePath = await getStorePath();
145
+ const store = await readAgentStore();
146
+ store[agentName] = entry;
147
+ await writeFile(storePath, JSON.stringify(store, null, 2), "utf-8");
148
+ }
149
+
150
+ // src/commands/push.ts
151
+ var LOGO = "\u{1F98B}";
152
+ function formatBytes(bytes) {
153
+ if (bytes < 1024) return `${bytes} B`;
154
+ return `${(bytes / 1024).toFixed(1)} KB`;
155
+ }
156
+ var push_default = defineCommand({
157
+ meta: { name: "push", description: "Push agent manifest to Cloudflare KV" },
158
+ args: {
159
+ agent: {
160
+ type: "string",
161
+ alias: "a",
162
+ description: "Agent name to push",
163
+ required: false
164
+ }
165
+ },
166
+ async run({ args }) {
167
+ const cwd = process.cwd();
168
+ const agentName = args.agent;
169
+ p.intro(`${LOGO} ${pc.bold("kalp push")}`);
170
+ if (!agentName) {
171
+ p.log.error(`Missing required flag ${pc.cyan("-a <agent-name>")}`);
172
+ process.exit(1);
173
+ }
174
+ await requireAuth().catch(() => {
175
+ p.log.error("Not authenticated. Run `kalp login` first.");
176
+ process.exit(1);
177
+ });
178
+ await ensureConfig(cwd).catch(() => {
179
+ p.log.error(`${pc.cyan("kalp.config.ts")} not found`);
180
+ process.exit(1);
181
+ });
182
+ const agentPath = join3(cwd, "agents", agentName, "index.ts");
183
+ await access2(agentPath).catch(() => {
184
+ p.log.error(`Agent ${pc.cyan(agentName)} not found`);
185
+ process.exit(1);
186
+ });
187
+ let state = await readProjectState(cwd);
188
+ if (!state) {
189
+ p.log.warn("No .kalp/state.json found. Running initial deploy first...");
190
+ const deploy = await runInitialDeploy(cwd);
191
+ state = {
192
+ workerUrl: deploy.workerUrl,
193
+ deployedAt: (/* @__PURE__ */ new Date()).toISOString(),
194
+ accountId: deploy.accountId
195
+ };
196
+ }
197
+ const runtime = await materializeRuntime(cwd);
198
+ const s = p.spinner();
199
+ s.start(`Compiling ${pc.cyan(agentName)}`);
200
+ const manifest = await readAgentManifest({ cwd, agentName });
201
+ const hash = computePushHash(manifest.ir);
202
+ s.stop(`Compiled ${pc.cyan(agentName)} (${hash.slice(0, 8)})`);
203
+ const validation = validateCompiledIR({ agentName, ir: manifest.ir, hash });
204
+ if (!validation.ok) {
205
+ p.log.error(`Validation failed at phase: ${validation.phase}`);
206
+ for (const err of validation.errors ?? []) {
207
+ p.log.error(err);
208
+ }
209
+ process.exit(1);
210
+ }
211
+ const previous = await getAgentStoreEntry(agentName);
212
+ const agentWorkerUrl = `${state.workerUrl.replace(/\/$/, "")}/a/${agentName}`;
213
+ if (previous?.hash === hash && previous.workerUrl === agentWorkerUrl) {
214
+ p.note(
215
+ `No changes detected for ${pc.cyan(agentName)} (${hash.slice(0, 8)}).`,
216
+ "Skipped"
217
+ );
218
+ p.outro(`${LOGO} ${pc.green("Nothing to push")}`);
219
+ return;
220
+ }
221
+ const manifestKey = `${agentName}:${hash}`;
222
+ const latestKey = `${agentName}:latest`;
223
+ const manifestPath = join3(cwd, ".kalp", `${agentName}-${hash}.json`);
224
+ await mkdir(join3(cwd, ".kalp"), { recursive: true });
225
+ await writeFile2(manifestPath, JSON.stringify(manifest.ir), "utf-8");
226
+ try {
227
+ s.start("Uploading manifest to Cloudflare KV");
228
+ await execa(
229
+ "npx",
230
+ [
231
+ "wrangler",
232
+ "kv",
233
+ "key",
234
+ "put",
235
+ "--binding",
236
+ "KALP_MANIFESTS",
237
+ manifestKey,
238
+ "--path",
239
+ manifestPath,
240
+ "--remote",
241
+ "--config",
242
+ runtime.wranglerConfigPath
243
+ ],
244
+ { cwd }
245
+ );
246
+ await execa(
247
+ "npx",
248
+ [
249
+ "wrangler",
250
+ "kv",
251
+ "key",
252
+ "put",
253
+ "--binding",
254
+ "KALP_MANIFESTS",
255
+ latestKey,
256
+ hash,
257
+ "--remote",
258
+ "--config",
259
+ runtime.wranglerConfigPath
260
+ ],
261
+ { cwd }
262
+ );
263
+ s.stop("Manifest uploaded");
264
+ } finally {
265
+ await rm2(manifestPath, { force: true });
266
+ }
267
+ const bundles = manifest.ir.bundles || {};
268
+ const totalSize = Object.values(bundles).reduce(
269
+ (sum, bundle) => sum + Buffer.byteLength(bundle.code),
270
+ 0
271
+ );
272
+ const handlerCount = Object.keys(bundles).length;
273
+ await writeAgentStoreEntry(agentName, {
274
+ hash,
275
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
276
+ workerUrl: agentWorkerUrl,
277
+ localPath: agentPath
278
+ });
279
+ p.log.success(
280
+ `${pc.bold(agentName)} pushed \xB7 ${handlerCount} handlers \xB7 ${formatBytes(totalSize)}`
281
+ );
282
+ p.note(`KV keys updated: ${manifestKey}, ${latestKey}`, "Cloudflare KV");
283
+ p.outro(`${LOGO} ${pc.green("Live at")} ${pc.cyan(agentWorkerUrl)}`);
284
+ }
285
+ });
286
+ export {
287
+ push_default as default
288
+ };
289
+ //# sourceMappingURL=push-EI646ZVZ.js.map