@kalphq/cli 0.0.0-dev-20260510030416 → 0.0.0-dev-20260510045606

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 (38) hide show
  1. package/dist/{chunk-NJ3OTDOX.js → chunk-MM6CND3O.js} +22 -31
  2. package/dist/chunk-MM6CND3O.js.map +1 -0
  3. package/dist/chunk-TTKFK7NJ.js +232 -0
  4. package/dist/chunk-TTKFK7NJ.js.map +1 -0
  5. package/dist/{deploy-HRUJDN2F.js → deploy-PKK545YR.js} +3 -3
  6. package/dist/{dev-ZKXOQ2GQ.js → dev-LE5FR6BF.js} +16 -13
  7. package/dist/dev-LE5FR6BF.js.map +1 -0
  8. package/dist/index.js +7 -5
  9. package/dist/index.js.map +1 -1
  10. package/dist/{push-P2NWWXGL.js → push-EI646ZVZ.js} +8 -6
  11. package/dist/push-EI646ZVZ.js.map +1 -0
  12. package/dist/runtime-template/studio/assets/QueryClientProvider-D-LxTiBd.js +1 -0
  13. package/dist/runtime-template/studio/assets/index-DpfZiZAs.js +75 -0
  14. package/dist/runtime-template/studio/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  15. package/dist/runtime-template/studio/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  16. package/dist/runtime-template/studio/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  17. package/dist/runtime-template/studio/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  18. package/dist/runtime-template/studio/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  19. package/dist/runtime-template/studio/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  20. package/dist/runtime-template/studio/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  21. package/dist/runtime-template/studio/assets/replay._executionId-Cs7M_t4A.js +41 -0
  22. package/dist/runtime-template/studio/assets/routes-DM2dr3uc.js +1 -0
  23. package/dist/runtime-template/studio/assets/styles-DnCmVxlg.css +2 -0
  24. package/dist/runtime-template/studio/assets/useAuth-CNMCKtPc.js +1 -0
  25. package/dist/runtime-template/studio/favicon.ico +0 -0
  26. package/dist/runtime-template/studio/index.html +13 -0
  27. package/dist/runtime-template/studio/logo192.png +0 -0
  28. package/dist/runtime-template/studio/logo512.png +0 -0
  29. package/dist/runtime-template/studio/manifest.json +25 -0
  30. package/dist/runtime-template/studio/robots.txt +3 -0
  31. package/dist/runtime-template/worker-entry.js +2 -0
  32. package/package.json +7 -5
  33. package/dist/chunk-E7V5UMX7.js +0 -28
  34. package/dist/chunk-E7V5UMX7.js.map +0 -1
  35. package/dist/chunk-NJ3OTDOX.js.map +0 -1
  36. package/dist/dev-ZKXOQ2GQ.js.map +0 -1
  37. package/dist/push-P2NWWXGL.js.map +0 -1
  38. /package/dist/{deploy-HRUJDN2F.js.map → deploy-PKK545YR.js.map} +0 -0
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Kalp Studio</title>
7
+ <link rel="stylesheet" href="/studio/assets/styles-DnCmVxlg.css" />
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ <script type="module" src="/studio/assets/index-DpfZiZAs.js"></script>
12
+ </body>
13
+ </html>
@@ -0,0 +1,25 @@
1
+ {
2
+ "short_name": "TanStack App",
3
+ "name": "Create TanStack App Sample",
4
+ "icons": [
5
+ {
6
+ "src": "favicon.ico",
7
+ "sizes": "64x64 32x32 24x24 16x16",
8
+ "type": "image/x-icon"
9
+ },
10
+ {
11
+ "src": "logo192.png",
12
+ "type": "image/png",
13
+ "sizes": "192x192"
14
+ },
15
+ {
16
+ "src": "logo512.png",
17
+ "type": "image/png",
18
+ "sizes": "512x512"
19
+ }
20
+ ],
21
+ "start_url": ".",
22
+ "display": "standalone",
23
+ "theme_color": "#000000",
24
+ "background_color": "#ffffff"
25
+ }
@@ -0,0 +1,3 @@
1
+ # https://www.robotstxt.org/robotstxt.html
2
+ User-agent: *
3
+ Disallow:
@@ -0,0 +1,2 @@
1
+ export { AgentDurableObject } from "@kalphq/cloudflare";
2
+ export { default } from "@kalphq/cloudflare";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kalphq/cli",
3
- "version": "0.0.0-dev-20260510030416",
3
+ "version": "0.0.0-dev-20260510045606",
4
4
  "description": "Zero-config CLI for deploying Kalp agents",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -26,9 +26,9 @@
26
26
  "open": "^11.0.0",
27
27
  "picocolors": "1.1.1",
28
28
  "zod": "3.25.76",
29
- "@kalphq/compiler": "0.0.0-dev-20260510030416",
30
- "@kalphq/project": "0.0.0-dev-20260510030416",
31
- "@kalphq/sdk": "0.0.0-dev-20260510030416"
29
+ "@kalphq/compiler": "0.0.0-dev-20260510045606",
30
+ "@kalphq/sdk": "0.0.0-dev-20260510045606",
31
+ "@kalphq/project": "0.0.0-dev-20260510045606"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@types/json-stable-stringify": "1.2.0",
@@ -37,7 +37,9 @@
37
37
  "typescript": "^5.0.0"
38
38
  },
39
39
  "scripts": {
40
- "build": "tsup",
40
+ "build": "tsup && pnpm run build:studio && pnpm run build:runtime-template",
41
+ "build:studio": "pnpm --filter=@kalphq/studio build",
42
+ "build:runtime-template": "node ./scripts/prepare-runtime-template.mjs",
41
43
  "dev": "tsup --watch",
42
44
  "lint": "tsc --noEmit"
43
45
  }
@@ -1,28 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // src/utils/secret.ts
4
- import { randomBytes } from "crypto";
5
- import { readFile, writeFile } from "fs/promises";
6
- import { join } from "path";
7
- async function ensureSecretKey(cwd) {
8
- const envPath = join(cwd, ".env");
9
- try {
10
- const envContent = await readFile(envPath, "utf-8");
11
- const match = envContent.match(/^KALP_SECRET_KEY=(.+)$/m);
12
- if (match?.[1]) {
13
- return { key: match[1].trim(), isNew: false };
14
- }
15
- } catch {
16
- }
17
- const secretKey = randomBytes(32).toString("hex");
18
- const content = `# Kalp Studio Authentication Secret
19
- KALP_SECRET_KEY=${secretKey}
20
- `;
21
- await writeFile(envPath, content, "utf-8");
22
- return { key: secretKey, isNew: true };
23
- }
24
-
25
- export {
26
- ensureSecretKey
27
- };
28
- //# sourceMappingURL=chunk-E7V5UMX7.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/secret.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport async function ensureSecretKey(\n cwd: string,\n): Promise<{ key: string; isNew: boolean }> {\n const envPath = join(cwd, \".env\");\n\n try {\n const envContent = await readFile(envPath, \"utf-8\");\n const match = envContent.match(/^KALP_SECRET_KEY=(.+)$/m);\n if (match?.[1]) {\n return { key: match[1].trim(), isNew: false };\n }\n } catch {\n // continue\n }\n\n const secretKey = randomBytes(32).toString(\"hex\");\n const content = `# Kalp Studio Authentication Secret\nKALP_SECRET_KEY=${secretKey}\n`;\n await writeFile(envPath, content, \"utf-8\");\n return { key: secretKey, isNew: true };\n}\n\nexport async function readSecretKey(cwd: string): Promise<string | null> {\n try {\n const envPath = join(cwd, \".env\");\n const envContent = await readFile(envPath, \"utf-8\");\n const match = envContent.match(/^KALP_SECRET_KEY=(.+)$/m);\n return match?.[1]?.trim() ?? null;\n } catch {\n return null;\n }\n}\n"],"mappings":";;;AAAA,SAAS,mBAAmB;AAC5B,SAAS,UAAU,iBAAiB;AACpC,SAAS,YAAY;AAErB,eAAsB,gBACpB,KAC0C;AAC1C,QAAM,UAAU,KAAK,KAAK,MAAM;AAEhC,MAAI;AACF,UAAM,aAAa,MAAM,SAAS,SAAS,OAAO;AAClD,UAAM,QAAQ,WAAW,MAAM,yBAAyB;AACxD,QAAI,QAAQ,CAAC,GAAG;AACd,aAAO,EAAE,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,OAAO,MAAM;AAAA,IAC9C;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,QAAM,YAAY,YAAY,EAAE,EAAE,SAAS,KAAK;AAChD,QAAM,UAAU;AAAA,kBACA,SAAS;AAAA;AAEzB,QAAM,UAAU,SAAS,SAAS,OAAO;AACzC,SAAO,EAAE,KAAK,WAAW,OAAO,KAAK;AACvC;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/project-state.ts","../src/utils/deploy.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface ProjectState {\n workerUrl: string;\n deployedAt: string;\n accountId: string;\n}\n\nconst KALP_DIR = \".kalp\";\nconst STATE_FILE = \"state.json\";\n\nexport async function readProjectState(cwd: string): Promise<ProjectState | null> {\n try {\n const statePath = join(cwd, KALP_DIR, STATE_FILE);\n const content = await readFile(statePath, \"utf-8\");\n return JSON.parse(content) as ProjectState;\n } catch {\n return null;\n }\n}\n\nexport async function writeProjectState(\n cwd: string,\n state: ProjectState,\n): Promise<void> {\n const dir = join(cwd, KALP_DIR);\n await mkdir(dir, { recursive: true });\n await writeFile(join(dir, STATE_FILE), JSON.stringify(state, null, 2), \"utf-8\");\n}\n","import { cp, mkdir, readFile, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { execa } from \"execa\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { ensureSecretKey } from \"@/utils/secret\";\nimport { writeProjectState } from \"@/utils/project-state\";\n\nconst WRANGLER_CONFIG = \"packages/cloudflare/wrangler.jsonc\";\n\nfunction findWorkersUrl(output: string): string | null {\n const match = output.match(/https:\\/\\/[^\\s]+\\.workers\\.dev/);\n return match?.[0] ?? null;\n}\n\nasync function resolveWorkerUrl(cwd: string, deployOutput: string): Promise<string> {\n const fromOutput = findWorkersUrl(deployOutput);\n if (fromOutput) return fromOutput;\n\n const configText = await readFile(join(cwd, WRANGLER_CONFIG), \"utf-8\").catch(\n () => null as string | null,\n );\n const workerName = configText?.match(/\"name\"\\s*:\\s*\"([^\"]+)\"/)?.[1];\n\n if (workerName) {\n return `https://${workerName}.workers.dev`;\n }\n\n throw new Error(\"Could not resolve worker URL from wrangler deploy output.\");\n}\n\nexport async function runInitialDeploy(cwd: string): Promise<{\n workerUrl: string;\n accountId: string;\n}> {\n const auth = await requireAuth();\n const { key: secretKey } = await ensureSecretKey(cwd);\n\n await execa(\"pnpm\", [\"--filter=@kalphq/studio\", \"build\"], {\n cwd,\n stdio: \"inherit\",\n });\n\n const studioDist = join(cwd, \"apps/studio/dist\");\n const workerStudioDist = join(cwd, \"packages/cloudflare/dist/studio\");\n await rm(workerStudioDist, { recursive: true, force: true });\n await mkdir(workerStudioDist, { recursive: true });\n await cp(studioDist, workerStudioDist, { recursive: true });\n\n let deployStdout = \"\";\n const secretResult = await execa(\n \"npx\",\n [\"wrangler\", \"secret\", \"put\", \"KALP_SECRET_KEY\", \"--config\", WRANGLER_CONFIG],\n {\n cwd,\n input: `${secretKey}\\n`,\n },\n );\n\n const deploy = await execa(\n \"npx\",\n [\"wrangler\", \"deploy\", \"--config\", WRANGLER_CONFIG],\n {\n cwd,\n },\n );\n\n deployStdout = [secretResult.stdout, deploy.stdout, deploy.stderr]\n .filter(Boolean)\n .join(\"\\n\");\n\n const workerUrl = await resolveWorkerUrl(cwd, deployStdout);\n\n await writeProjectState(cwd, {\n workerUrl,\n deployedAt: new Date().toISOString(),\n accountId: auth.accountId,\n });\n\n return { workerUrl, accountId: auth.accountId };\n}\n"],"mappings":";;;;;;;;;AAAA,SAAS,OAAO,UAAU,iBAAiB;AAC3C,SAAS,YAAY;AAQrB,IAAM,WAAW;AACjB,IAAM,aAAa;AAEnB,eAAsB,iBAAiB,KAA2C;AAChF,MAAI;AACF,UAAM,YAAY,KAAK,KAAK,UAAU,UAAU;AAChD,UAAM,UAAU,MAAM,SAAS,WAAW,OAAO;AACjD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,kBACpB,KACA,OACe;AACf,QAAM,MAAM,KAAK,KAAK,QAAQ;AAC9B,QAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,QAAM,UAAU,KAAK,KAAK,UAAU,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,OAAO;AAChF;;;AC7BA,SAAS,IAAI,SAAAA,QAAO,YAAAC,WAAU,UAAU;AACxC,SAAS,QAAAC,aAAY;AACrB,SAAS,aAAa;AAKtB,IAAM,kBAAkB;AAExB,SAAS,eAAe,QAA+B;AACrD,QAAM,QAAQ,OAAO,MAAM,gCAAgC;AAC3D,SAAO,QAAQ,CAAC,KAAK;AACvB;AAEA,eAAe,iBAAiB,KAAa,cAAuC;AAClF,QAAM,aAAa,eAAe,YAAY;AAC9C,MAAI,WAAY,QAAO;AAEvB,QAAM,aAAa,MAAMC,UAASC,MAAK,KAAK,eAAe,GAAG,OAAO,EAAE;AAAA,IACrE,MAAM;AAAA,EACR;AACA,QAAM,aAAa,YAAY,MAAM,wBAAwB,IAAI,CAAC;AAElE,MAAI,YAAY;AACd,WAAO,WAAW,UAAU;AAAA,EAC9B;AAEA,QAAM,IAAI,MAAM,2DAA2D;AAC7E;AAEA,eAAsB,iBAAiB,KAGpC;AACD,QAAM,OAAO,MAAM,YAAY;AAC/B,QAAM,EAAE,KAAK,UAAU,IAAI,MAAM,gBAAgB,GAAG;AAEpD,QAAM,MAAM,QAAQ,CAAC,2BAA2B,OAAO,GAAG;AAAA,IACxD;AAAA,IACA,OAAO;AAAA,EACT,CAAC;AAED,QAAM,aAAaA,MAAK,KAAK,kBAAkB;AAC/C,QAAM,mBAAmBA,MAAK,KAAK,iCAAiC;AACpE,QAAM,GAAG,kBAAkB,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC3D,QAAMC,OAAM,kBAAkB,EAAE,WAAW,KAAK,CAAC;AACjD,QAAM,GAAG,YAAY,kBAAkB,EAAE,WAAW,KAAK,CAAC;AAE1D,MAAI,eAAe;AACnB,QAAM,eAAe,MAAM;AAAA,IACzB;AAAA,IACA,CAAC,YAAY,UAAU,OAAO,mBAAmB,YAAY,eAAe;AAAA,IAC5E;AAAA,MACE;AAAA,MACA,OAAO,GAAG,SAAS;AAAA;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA,CAAC,YAAY,UAAU,YAAY,eAAe;AAAA,IAClD;AAAA,MACE;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,CAAC,aAAa,QAAQ,OAAO,QAAQ,OAAO,MAAM,EAC9D,OAAO,OAAO,EACd,KAAK,IAAI;AAEZ,QAAM,YAAY,MAAM,iBAAiB,KAAK,YAAY;AAE1D,QAAM,kBAAkB,KAAK;AAAA,IAC3B;AAAA,IACA,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IACnC,WAAW,KAAK;AAAA,EAClB,CAAC;AAED,SAAO,EAAE,WAAW,WAAW,KAAK,UAAU;AAChD;","names":["mkdir","readFile","join","readFile","join","mkdir"]}
@@ -1 +0,0 @@
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\";\n\nconst LOGO = \"🦋\";\nconst WRANGLER_CONFIG = \"packages/cloudflare/wrangler.jsonc\";\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\n p.note(\"Starting backend (wrangler dev :8787) and frontend (Vite :5173)\");\n\n const backend = execa(\n \"npx\",\n [\"wrangler\", \"dev\", \"--port\", \"8787\", \"--config\", WRANGLER_CONFIG],\n { cwd, stdio: \"inherit\" },\n );\n\n const frontend = execa(\"pnpm\", [\"--filter=@kalphq/studio\", \"dev\"], {\n cwd,\n stdio: \"inherit\",\n });\n\n const shutdown = () => {\n backend.kill(\"SIGINT\");\n frontend.kill(\"SIGINT\");\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n await delay(2500);\n const studioUrl = `http://localhost:5173/studio/?token=${token}`;\n await open(studioUrl);\n p.log.success(`Studio opened at ${pc.cyan(studioUrl)}`);\n\n try {\n await Promise.race([backend, frontend]);\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;;;ADFA,IAAM,OAAO;AACb,IAAM,kBAAkB;AAExB,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;AAEzC,IAAE,OAAK,iEAAiE;AAExE,UAAM,UAAU;AAAA,MACd;AAAA,MACA,CAAC,YAAY,OAAO,UAAU,QAAQ,YAAY,eAAe;AAAA,MACjE,EAAE,KAAK,OAAO,UAAU;AAAA,IAC1B;AAEA,UAAM,WAAW,MAAM,QAAQ,CAAC,2BAA2B,KAAK,GAAG;AAAA,MACjE;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAED,UAAM,WAAW,MAAM;AACrB,cAAQ,KAAK,QAAQ;AACrB,eAAS,KAAK,QAAQ;AAAA,IACxB;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,QAAQ,KAAK,CAAC,SAAS,QAAQ,CAAC;AAAA,IACxC,UAAE;AACA,eAAS;AACT,cAAQ,IAAI,UAAU,QAAQ;AAC9B,cAAQ,IAAI,WAAW,QAAQ;AAAA,IACjC;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/push.ts","../src/utils/manifest/index.ts","../src/utils/ir/hashIR.ts","../src/utils/validate.ts","../src/utils/agent-store.ts"],"sourcesContent":["import { access, mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { execa } from \"execa\";\nimport { ensureConfig } from \"@/utils/fs\";\nimport { readAgentManifest, computePushHash } from \"@/utils/manifest\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { runInitialDeploy } from \"@/utils/deploy\";\nimport { readProjectState } from \"@/utils/project-state\";\nimport { validateCompiledIR } from \"@/utils/validate\";\nimport { getAgentStoreEntry, writeAgentStoreEntry } from \"@/utils/agent-store\";\n\nconst LOGO = \"🦋\";\nconst WRANGLER_CONFIG = \"packages/cloudflare/wrangler.jsonc\";\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n return `${(bytes / 1024).toFixed(1)} KB`;\n}\n\nexport default defineCommand({\n meta: { name: \"push\", description: \"Push agent manifest to Cloudflare KV\" },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name to push\",\n required: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n const agentName = args.agent;\n\n p.intro(`${LOGO} ${pc.bold(\"kalp push\")}`);\n\n if (!agentName) {\n p.log.error(`Missing required flag ${pc.cyan(\"-a <agent-name>\")}`);\n process.exit(1);\n }\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n await ensureConfig(cwd).catch(() => {\n p.log.error(`${pc.cyan(\"kalp.config.ts\")} not found`);\n process.exit(1);\n });\n\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n await access(agentPath).catch(() => {\n p.log.error(`Agent ${pc.cyan(agentName)} not found`);\n process.exit(1);\n });\n\n let state = await readProjectState(cwd);\n if (!state) {\n p.log.warn(\"No .kalp/state.json found. Running initial deploy first...\");\n const deploy = await runInitialDeploy(cwd);\n state = {\n workerUrl: deploy.workerUrl,\n deployedAt: new Date().toISOString(),\n accountId: deploy.accountId,\n };\n }\n\n const s = p.spinner();\n s.start(`Compiling ${pc.cyan(agentName)}`);\n const manifest = await readAgentManifest({ cwd, agentName });\n const hash = computePushHash(manifest.ir);\n s.stop(`Compiled ${pc.cyan(agentName)} (${hash.slice(0, 8)})`);\n\n const validation = validateCompiledIR({ agentName, ir: manifest.ir, hash });\n if (!validation.ok) {\n p.log.error(`Validation failed at phase: ${validation.phase}`);\n for (const err of validation.errors ?? []) {\n p.log.error(err);\n }\n process.exit(1);\n }\n\n const previous = await getAgentStoreEntry(agentName);\n const agentWorkerUrl = `${state.workerUrl.replace(/\\/$/, \"\")}/a/${agentName}`;\n if (previous?.hash === hash && previous.workerUrl === agentWorkerUrl) {\n p.note(\n `No changes detected for ${pc.cyan(agentName)} (${hash.slice(0, 8)}).`,\n \"Skipped\",\n );\n p.outro(`${LOGO} ${pc.green(\"Nothing to push\")}`);\n return;\n }\n\n const manifestKey = `${agentName}:${hash}`;\n const latestKey = `${agentName}:latest`;\n const manifestPath = join(cwd, \".kalp\", `${agentName}-${hash}.json`);\n\n await mkdir(join(cwd, \".kalp\"), { recursive: true });\n await writeFile(manifestPath, JSON.stringify(manifest.ir), \"utf-8\");\n\n try {\n s.start(\"Uploading manifest to Cloudflare KV\");\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n \"--binding\",\n \"KALP_MANIFESTS\",\n manifestKey,\n \"--path\",\n manifestPath,\n \"--remote\",\n \"--config\",\n WRANGLER_CONFIG,\n ],\n { cwd },\n );\n\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n \"--binding\",\n \"KALP_MANIFESTS\",\n latestKey,\n hash,\n \"--remote\",\n \"--config\",\n WRANGLER_CONFIG,\n ],\n { cwd },\n );\n s.stop(\"Manifest uploaded\");\n } finally {\n await rm(manifestPath, { force: true });\n }\n\n const bundles = manifest.ir.bundles || {};\n const totalSize = Object.values(bundles).reduce(\n (sum, bundle) => sum + Buffer.byteLength(bundle.code),\n 0,\n );\n const handlerCount = Object.keys(bundles).length;\n\n await writeAgentStoreEntry(agentName, {\n hash,\n timestamp: new Date().toISOString(),\n workerUrl: agentWorkerUrl,\n localPath: agentPath,\n });\n\n p.log.success(\n `${pc.bold(agentName)} pushed · ${handlerCount} handlers · ${formatBytes(totalSize)}`,\n );\n p.note(`KV keys updated: ${manifestKey}, ${latestKey}`, \"Cloudflare KV\");\n p.outro(`${LOGO} ${pc.green(\"Live at\")} ${pc.cyan(agentWorkerUrl)}`);\n },\n});\n","import { access, readFile, rm, mkdtemp } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport { buildAgent } from \"@kalphq/compiler\";\n\nimport type { AgentManifestV3 } from \"@/utils/manifest/types\";\nexport type { AgentManifestV3 } from \"@/utils/manifest/types\";\nexport { computePushHash } from \"@/utils/ir/hashIR\";\n\n/**\n * Reads and compiles an agent into a pushable manifest.\n */\nexport async function readAgentManifest(params: {\n cwd: string;\n agentName: string;\n}): Promise<AgentManifestV3> {\n const { cwd, agentName } = params;\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n await access(agentPath);\n\n // Use a temporary directory for the compiler output\n const tempOutDir = await mkdtemp(join(tmpdir(), \"kalp-build-\"));\n\n try {\n // Build the agent - compiler produces ir.bundles with all handler code\n await buildAgent(agentPath, tempOutDir, cwd);\n\n // Load the IR generated by the compiler (includes bundles with code)\n const irContent = await readFile(join(tempOutDir, \"ir.json\"), \"utf-8\");\n const ir = JSON.parse(irContent);\n\n return {\n format: \"kalp-agent-manifest\",\n schemaVersion: 3,\n ir,\n metadata: {\n generatedAt: new Date().toISOString(),\n },\n };\n } finally {\n // Cleanup temp build directory\n await rm(tempOutDir, { recursive: true, force: true });\n }\n}\n","import type { IRGraph } from \"@kalphq/sdk\";\nimport { calculateAgentHash } from \"@kalphq/compiler\";\n\nexport function getIRHash(ir: IRGraph): string {\n const { calculateIRHash } = require(\"@kalphq/compiler\");\n return calculateIRHash(ir);\n}\n\nexport function computePushHash(\n ir: IRGraph & { bundles?: Record<string, { code: string }> },\n): string {\n const bundles = ir.bundles || {};\n const handlers = Object.keys(bundles).reduce(\n (acc, hash) => ({\n ...acc,\n [hash]: { hash },\n }),\n {} as Record<string, { hash: string }>,\n );\n\n return calculateAgentHash(ir, handlers);\n}\n","import {\n analyzeHandler,\n calculateAgentHash,\n validateIR,\n validateIRBindings,\n} from \"@kalphq/compiler\";\nimport type { IRGraph } from \"@kalphq/sdk\";\n\nexport interface NamedAnalysis {\n name: string;\n capabilities: string[];\n imports: { external: string[]; internal: string[] };\n blockers: string[];\n warnings: string[];\n}\n\ntype IRWithBundles = IRGraph & {\n bundles?: Record<string, { code: string }>;\n};\n\nexport function validateCompiledIR(input: {\n agentName: string;\n ir: IRWithBundles;\n hash: string;\n}): {\n ok: boolean;\n phase?: \"ir\" | \"bindings\" | \"hash\" | \"analysis\";\n errors?: string[];\n blockers?: string[];\n analysis?: NamedAnalysis[];\n} {\n const { ir, hash } = input;\n const bundles = ir.bundles || {};\n const bundleHashes = Object.keys(bundles);\n\n const irValidation = validateIR(ir);\n if (!irValidation.valid) {\n return { ok: false, phase: \"ir\", errors: irValidation.errors };\n }\n\n const bindingsValidation = validateIRBindings(ir, bundleHashes);\n if (!bindingsValidation.valid) {\n return { ok: false, phase: \"bindings\", errors: bindingsValidation.errors };\n }\n\n const handlers = bundleHashes.reduce(\n (acc, key) => ({ ...acc, [key]: { hash: key } }),\n {} as Record<string, { hash: string }>,\n );\n const expectedHash = calculateAgentHash(ir, handlers);\n\n if (expectedHash !== hash) {\n return {\n ok: false,\n phase: \"hash\",\n errors: [\n `Hash mismatch: client provided ${hash}, calculated ${expectedHash}`,\n ],\n };\n }\n\n const analysis: NamedAnalysis[] = Object.entries(bundles).map(\n ([name, bundle]) => ({\n name,\n ...analyzeHandler(bundle.code),\n }),\n );\n\n const blockers = analysis.flatMap((entry) =>\n entry.blockers.map((blocker) => `${blocker} in ${entry.name}`),\n );\n\n if (blockers.length > 0) {\n return {\n ok: false,\n phase: \"analysis\",\n blockers,\n errors: blockers.map((b) => `[Analysis Blocker] ${b}`),\n analysis,\n };\n }\n\n return { ok: true, analysis };\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { ensureGlobalConfigDir } from \"@/utils/config\";\n\nexport interface AgentStoreEntry {\n hash: string;\n timestamp: string;\n workerUrl: string;\n localPath: string;\n}\n\nexport type AgentStore = Record<string, AgentStoreEntry>;\n\nasync function getStorePath(): Promise<string> {\n return join(await ensureGlobalConfigDir(), \"agents.json\");\n}\n\nexport async function readAgentStore(): Promise<AgentStore> {\n try {\n const storePath = await getStorePath();\n const content = await readFile(storePath, \"utf-8\");\n return JSON.parse(content) as AgentStore;\n } catch {\n return {};\n }\n}\n\nexport async function getAgentStoreEntry(\n agentName: string,\n): Promise<AgentStoreEntry | null> {\n const store = await readAgentStore();\n return store[agentName] ?? null;\n}\n\nexport async function writeAgentStoreEntry(\n agentName: string,\n entry: AgentStoreEntry,\n): Promise<void> {\n const storePath = await getStorePath();\n const store = await readAgentStore();\n store[agentName] = entry;\n await writeFile(storePath, JSON.stringify(store, null, 2), \"utf-8\");\n}\n"],"mappings":"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","names":["access","rm","writeFile","join","calculateAgentHash","readFile","join","join","readFile","join","access","writeFile","rm"]}