@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,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";
@@ -19,10 +19,10 @@ var secrets_default = defineCommand({
19
19
  }
20
20
  },
21
21
  subCommands: {
22
- list: () => import("./list-3ZQIFUOT.js").then((r) => r.default),
23
- add: () => import("./add-KRHLYYTO.js").then((r) => r.default),
24
- delete: () => import("./delete-47ZP6XRB.js").then((r) => r.default),
25
- sync: () => import("./sync-YFM5P3IS.js").then((r) => r.default)
22
+ list: () => import("./list-VMJPWHIH.js").then((r) => r.default),
23
+ add: () => import("./add-XTXSSGC5.js").then((r) => r.default),
24
+ delete: () => import("./delete-N4OSUK3X.js").then((r) => r.default),
25
+ sync: () => import("./sync-OTO44GQS.js").then((r) => r.default)
26
26
  },
27
27
  run({ args }) {
28
28
  if (!args.help) {
@@ -46,4 +46,4 @@ var secrets_default = defineCommand({
46
46
  export {
47
47
  secrets_default as default
48
48
  };
49
- //# sourceMappingURL=secrets-KFMVBKJQ.js.map
49
+ //# sourceMappingURL=secrets-P7ADVLOS.js.map
@@ -4,7 +4,8 @@ import {
4
4
  } from "./chunk-MMS3GWBG.js";
5
5
  import {
6
6
  getAuthToken
7
- } from "./chunk-6LLXGS2P.js";
7
+ } from "./chunk-5RODADXW.js";
8
+ import "./chunk-FO24J6XL.js";
8
9
 
9
10
  // src/commands/secrets/sync.ts
10
11
  import { defineCommand } from "citty";
@@ -117,4 +118,4 @@ var sync_default = defineCommand({
117
118
  export {
118
119
  sync_default as default
119
120
  };
120
- //# sourceMappingURL=sync-YFM5P3IS.js.map
121
+ //# sourceMappingURL=sync-OTO44GQS.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/secrets/sync.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAuthToken } from \"@/utils/auth\";\nimport { generateTypes } from \"@/utils/codegen\";\n\nconst LOGO = \"🦋\";\n\ninterface SecretFromCloud {\n key: string;\n createdAt: string;\n}\n\nasync function fetchSecretsFromCloud(): Promise<SecretFromCloud[]> {\n // TODO: Implement real API call to Kalp Cloud\n console.log(pc.dim(\"[Simulated] Fetching secrets from Kalp Cloud...\"));\n // Simulated response - in real implementation, this would call the API\n return [\n { key: \"STRIPE_SECRET_KEY\", createdAt: \"2024-01-15T10:30:00Z\" },\n { key: \"OPENAI_API_KEY\", createdAt: \"2024-01-16T14:20:00Z\" },\n ];\n}\n\nasync function replaceSecretsInConfig(\n cwd: string,\n secrets: string[],\n): Promise<void> {\n const configPath = join(cwd, \"kalp.config.ts\");\n let content: string;\n\n try {\n content = await readFile(configPath, \"utf-8\");\n } catch {\n // Create new config if doesn't exist\n content = `import { defineConfig } from \"@kalphq/sdk\";\n\nexport default defineConfig({\n secrets: [],\n});\n`;\n }\n\n // Replace secrets array with new ones\n const secretsArray =\n secrets.length > 0 ? secrets.map((s) => `\"${s}\"`).join(\", \") : \"\";\n\n const newArray = `secrets: [${secretsArray}]`;\n\n // Check if config has secrets array\n if (content.match(/secrets:\\s*\\[([^\\]]*)\\]/)) {\n content = content.replace(/secrets:\\s*\\[([^\\]]*)\\]/, newArray);\n } else {\n // Add secrets array if not present\n content = content.replace(\n /defineConfig\\({/,\n `defineConfig({\\n secrets: [${secretsArray}],`,\n );\n }\n\n await writeFile(configPath, content, \"utf-8\");\n}\n\nexport default defineCommand({\n meta: {\n name: \"sync\",\n description: \"Sync secrets from Kalp Cloud to local config\",\n },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets sync\")}`);\n\n // Check authentication\n const token = await getAuthToken();\n if (!token) {\n p.log.error(\"Not authenticated. Run 'kalp login' first.\");\n process.exit(1);\n }\n\n const s = p.spinner();\n\n try {\n s.start(\"Fetching secrets from Kalp Cloud\");\n const cloudSecrets = await fetchSecretsFromCloud();\n s.stop(`Found ${pc.cyan(String(cloudSecrets.length))} secrets in cloud`);\n\n if (cloudSecrets.length === 0) {\n p.log.warn(\"No secrets found in Kalp Cloud\");\n\n const shouldClear = await p.confirm({\n message: \"Clear local secrets config?\",\n initialValue: false,\n });\n\n if (p.isCancel(shouldClear) || !shouldClear) {\n p.outro(\"Cancelled\");\n return;\n }\n\n s.start(\"Clearing local secrets\");\n await replaceSecretsInConfig(cwd, []);\n await generateTypes(cwd);\n s.stop(\"Local secrets cleared\");\n p.outro(\"Done\");\n return;\n }\n\n // Show secrets that will be synced\n p.log.info(pc.bold(\"Secrets to sync:\"));\n for (const secret of cloudSecrets) {\n console.log(` ${pc.dim(\"•\")} ${pc.cyan(secret.key)}`);\n }\n\n const confirm = await p.confirm({\n message: `Replace local secrets with ${cloudSecrets.length} secrets from cloud?`,\n initialValue: true,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n p.outro(\"Cancelled\");\n return;\n }\n\n s.start(\"Updating local config\");\n const secretKeys = cloudSecrets.map((s) => s.key);\n await replaceSecretsInConfig(cwd, secretKeys);\n s.stop(\"Config updated\");\n\n s.start(\"Regenerating types\");\n await generateTypes(cwd);\n s.stop(\"Types regenerated\");\n\n p.log.success(pc.green(`Synced ${cloudSecrets.length} secrets`));\n p.outro(\"Done\");\n } catch (error) {\n s.stop(\"Sync failed\");\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":["confirm","s"]}
1
+ {"version":3,"sources":["../src/commands/secrets/sync.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAuthToken } from \"@/utils/auth\";\nimport { generateTypes } from \"@/utils/codegen\";\n\nconst LOGO = \"🦋\";\n\ninterface SecretFromCloud {\n key: string;\n createdAt: string;\n}\n\nasync function fetchSecretsFromCloud(): Promise<SecretFromCloud[]> {\n // TODO: Implement real API call to Kalp Cloud\n console.log(pc.dim(\"[Simulated] Fetching secrets from Kalp Cloud...\"));\n // Simulated response - in real implementation, this would call the API\n return [\n { key: \"STRIPE_SECRET_KEY\", createdAt: \"2024-01-15T10:30:00Z\" },\n { key: \"OPENAI_API_KEY\", createdAt: \"2024-01-16T14:20:00Z\" },\n ];\n}\n\nasync function replaceSecretsInConfig(\n cwd: string,\n secrets: string[],\n): Promise<void> {\n const configPath = join(cwd, \"kalp.config.ts\");\n let content: string;\n\n try {\n content = await readFile(configPath, \"utf-8\");\n } catch {\n // Create new config if doesn't exist\n content = `import { defineConfig } from \"@kalphq/sdk\";\n\nexport default defineConfig({\n secrets: [],\n});\n`;\n }\n\n // Replace secrets array with new ones\n const secretsArray =\n secrets.length > 0 ? secrets.map((s) => `\"${s}\"`).join(\", \") : \"\";\n\n const newArray = `secrets: [${secretsArray}]`;\n\n // Check if config has secrets array\n if (content.match(/secrets:\\s*\\[([^\\]]*)\\]/)) {\n content = content.replace(/secrets:\\s*\\[([^\\]]*)\\]/, newArray);\n } else {\n // Add secrets array if not present\n content = content.replace(\n /defineConfig\\({/,\n `defineConfig({\\n secrets: [${secretsArray}],`,\n );\n }\n\n await writeFile(configPath, content, \"utf-8\");\n}\n\nexport default defineCommand({\n meta: {\n name: \"sync\",\n description: \"Sync secrets from Kalp Cloud to local config\",\n },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets sync\")}`);\n\n // Check authentication\n const token = await getAuthToken();\n if (!token) {\n p.log.error(\"Not authenticated. Run 'kalp login' first.\");\n process.exit(1);\n }\n\n const s = p.spinner();\n\n try {\n s.start(\"Fetching secrets from Kalp Cloud\");\n const cloudSecrets = await fetchSecretsFromCloud();\n s.stop(`Found ${pc.cyan(String(cloudSecrets.length))} secrets in cloud`);\n\n if (cloudSecrets.length === 0) {\n p.log.warn(\"No secrets found in Kalp Cloud\");\n\n const shouldClear = await p.confirm({\n message: \"Clear local secrets config?\",\n initialValue: false,\n });\n\n if (p.isCancel(shouldClear) || !shouldClear) {\n p.outro(\"Cancelled\");\n return;\n }\n\n s.start(\"Clearing local secrets\");\n await replaceSecretsInConfig(cwd, []);\n await generateTypes(cwd);\n s.stop(\"Local secrets cleared\");\n p.outro(\"Done\");\n return;\n }\n\n // Show secrets that will be synced\n p.log.info(pc.bold(\"Secrets to sync:\"));\n for (const secret of cloudSecrets) {\n console.log(` ${pc.dim(\"•\")} ${pc.cyan(secret.key)}`);\n }\n\n const confirm = await p.confirm({\n message: `Replace local secrets with ${cloudSecrets.length} secrets from cloud?`,\n initialValue: true,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n p.outro(\"Cancelled\");\n return;\n }\n\n s.start(\"Updating local config\");\n const secretKeys = cloudSecrets.map((s) => s.key);\n await replaceSecretsInConfig(cwd, secretKeys);\n s.stop(\"Config updated\");\n\n s.start(\"Regenerating types\");\n await generateTypes(cwd);\n s.stop(\"Types regenerated\");\n\n p.log.success(pc.green(`Synced ${cloudSecrets.length} secrets`));\n p.outro(\"Done\");\n } catch (error) {\n s.stop(\"Sync failed\");\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":["confirm","s"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kalphq/cli",
3
- "version": "0.0.0-dev-20260509012111",
3
+ "version": "0.0.0-dev-20260510044447",
4
4
  "description": "Zero-config CLI for deploying Kalp agents",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -20,14 +20,15 @@
20
20
  "@clack/prompts": "0.9.1",
21
21
  "citty": "0.1.6",
22
22
  "esbuild": "0.25.0",
23
+ "execa": "^9.6.1",
23
24
  "jose": "^5.10.0",
24
25
  "json-stable-stringify": "1.3.0",
25
26
  "open": "^11.0.0",
26
27
  "picocolors": "1.1.1",
27
28
  "zod": "3.25.76",
28
- "@kalphq/compiler": "0.0.0-dev-20260509012111",
29
- "@kalphq/sdk": "0.0.0-dev-20260509012111",
30
- "@kalphq/project": "0.0.0-dev-20260509012111"
29
+ "@kalphq/compiler": "0.0.0-dev-20260510044447",
30
+ "@kalphq/project": "0.0.0-dev-20260510044447",
31
+ "@kalphq/sdk": "0.0.0-dev-20260510044447"
31
32
  },
32
33
  "devDependencies": {
33
34
  "@types/json-stable-stringify": "1.2.0",
@@ -36,7 +37,9 @@
36
37
  "typescript": "^5.0.0"
37
38
  },
38
39
  "scripts": {
39
- "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",
40
43
  "dev": "tsup --watch",
41
44
  "lint": "tsc --noEmit"
42
45
  }
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // src/utils/auth.ts
4
- import { readFile } from "fs/promises";
5
- import { homedir } from "os";
6
- import { join } from "path";
7
- var KALP_DIR = join(homedir(), ".kalp");
8
- var AUTH_FILE = join(KALP_DIR, "auth.json");
9
- async function getAuthToken() {
10
- try {
11
- const content = await readFile(AUTH_FILE, "utf-8");
12
- const auth = JSON.parse(content);
13
- if (new Date(auth.expiresAt) < /* @__PURE__ */ new Date()) {
14
- return null;
15
- }
16
- return auth.token;
17
- } catch {
18
- return null;
19
- }
20
- }
21
-
22
- export {
23
- getAuthToken
24
- };
25
- //# sourceMappingURL=chunk-6LLXGS2P.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/auth.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst KALP_DIR = join(homedir(), \".kalp\");\nconst AUTH_FILE = join(KALP_DIR, \"auth.json\");\n\ninterface AuthData {\n token: string;\n email: string;\n expiresAt: string;\n}\n\nexport async function getAuthToken(): Promise<string | null> {\n try {\n const content = await readFile(AUTH_FILE, \"utf-8\");\n const auth = JSON.parse(content) as AuthData;\n\n // Check if token is expired\n if (new Date(auth.expiresAt) < new Date()) {\n return null;\n }\n\n return auth.token;\n } catch {\n return null;\n }\n}\n\nexport async function isAuthenticated(): Promise<boolean> {\n const token = await getAuthToken();\n return token !== null;\n}\n"],"mappings":";;;AAAA,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,YAAY;AAErB,IAAM,WAAW,KAAK,QAAQ,GAAG,OAAO;AACxC,IAAM,YAAY,KAAK,UAAU,WAAW;AAQ5C,eAAsB,eAAuC;AAC3D,MAAI;AACF,UAAM,UAAU,MAAM,SAAS,WAAW,OAAO;AACjD,UAAM,OAAO,KAAK,MAAM,OAAO;AAG/B,QAAI,IAAI,KAAK,KAAK,SAAS,IAAI,oBAAI,KAAK,GAAG;AACzC,aAAO;AAAA,IACT;AAEA,WAAO,KAAK;AAAA,EACd,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -1,38 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // src/commands/login.ts
4
- import { defineCommand } from "citty";
5
- import * as p from "@clack/prompts";
6
- import pc from "picocolors";
7
- import { mkdir, writeFile } from "fs/promises";
8
- import { join } from "path";
9
- import { homedir } from "os";
10
- var LOGO = "\u{1F98B}";
11
- var login_default = defineCommand({
12
- meta: { name: "login", description: "Authenticate with Kalp" },
13
- async run() {
14
- const home = homedir();
15
- p.intro(`${LOGO} ${pc.bold("kalp login")}`);
16
- const s = p.spinner();
17
- s.start("Authenticating...");
18
- const kalpDir = join(home, ".kalp");
19
- await mkdir(kalpDir, { recursive: true });
20
- const authData = {
21
- token: "mock-token-" + Date.now(),
22
- email: "user@example.com",
23
- expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1e3).toISOString()
24
- };
25
- await writeFile(
26
- join(kalpDir, "auth.json"),
27
- JSON.stringify(authData, null, 2),
28
- "utf-8"
29
- );
30
- s.stop("Authenticated successfully");
31
- p.log.success(`Logged in as ${pc.cyan(authData.email)}`);
32
- p.outro(pc.green("Ready to use Kalp Cloud"));
33
- }
34
- });
35
- export {
36
- login_default as default
37
- };
38
- //# sourceMappingURL=login-JYPWGL6P.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/login.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"login\", description: \"Authenticate with Kalp\" },\n async run() {\n const home = homedir();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp login\")}`);\n\n const s = p.spinner();\n s.start(\"Authenticating...\");\n\n // Create ~/.kalp directory (global user config)\n const kalpDir = join(home, \".kalp\");\n await mkdir(kalpDir, { recursive: true });\n\n // Create mock auth.json\n const authData = {\n token: \"mock-token-\" + Date.now(),\n email: \"user@example.com\",\n expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),\n };\n\n await writeFile(\n join(kalpDir, \"auth.json\"),\n JSON.stringify(authData, null, 2),\n \"utf-8\",\n );\n\n s.stop(\"Authenticated successfully\");\n p.log.success(`Logged in as ${pc.cyan(authData.email)}`);\n p.outro(pc.green(\"Ready to use Kalp Cloud\"));\n },\n});\n"],"mappings":";;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,OAAO,iBAAiB;AACjC,SAAS,YAAY;AACrB,SAAS,eAAe;AAExB,IAAM,OAAO;AAEb,IAAO,gBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,SAAS,aAAa,yBAAyB;AAAA,EAC7D,MAAM,MAAM;AACV,UAAM,OAAO,QAAQ;AAErB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,YAAY,CAAC,EAAE;AAE1C,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,mBAAmB;AAG3B,UAAM,UAAU,KAAK,MAAM,OAAO;AAClC,UAAM,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAGxC,UAAM,WAAW;AAAA,MACf,OAAO,gBAAgB,KAAK,IAAI;AAAA,MAChC,OAAO;AAAA,MACP,WAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,GAAI,EAAE,YAAY;AAAA,IACzE;AAEA,UAAM;AAAA,MACJ,KAAK,SAAS,WAAW;AAAA,MACzB,KAAK,UAAU,UAAU,MAAM,CAAC;AAAA,MAChC;AAAA,IACF;AAEA,MAAE,KAAK,4BAA4B;AACnC,IAAE,MAAI,QAAQ,gBAAgB,GAAG,KAAK,SAAS,KAAK,CAAC,EAAE;AACvD,IAAE,QAAM,GAAG,MAAM,yBAAyB,CAAC;AAAA,EAC7C;AACF,CAAC;","names":[]}
@@ -1 +0,0 @@
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 { homedir } from \"node:os\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"logout\", description: \"Sign out from Kalp\" },\n async run() {\n const home = homedir();\n\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(home, \".kalp\", \"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;AACrB,SAAS,eAAe;AAExB,IAAM,OAAO;AAEb,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,EAC1D,MAAM,MAAM;AACV,UAAM,OAAO,QAAQ;AAErB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,aAAa,CAAC,EAAE;AAE3C,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,gBAAgB;AAExB,QAAI;AACF,YAAM,GAAG,KAAK,MAAM,SAAS,WAAW,GAAG,EAAE,OAAO,KAAK,CAAC;AAC1D,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":[]}
@@ -1,255 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- ensureConfig
4
- } from "./chunk-INB3LG6O.js";
5
-
6
- // src/commands/push.ts
7
- import { access as access2, mkdir, writeFile, readFile as readFile2 } from "fs/promises";
8
- import { join as join2 } from "path";
9
- import { defineCommand } from "citty";
10
- import * as p2 from "@clack/prompts";
11
- import pc from "picocolors";
12
-
13
- // src/utils/manifest/index.ts
14
- import { access, readFile, rm, mkdtemp } from "fs/promises";
15
- import { join } from "path";
16
- import { tmpdir } from "os";
17
- import { buildAgent } from "@kalphq/compiler";
18
-
19
- // src/utils/ir/hashIR.ts
20
- import { calculateAgentHash } from "@kalphq/compiler";
21
- function computePushHash(ir) {
22
- const bundles = ir.bundles || {};
23
- const handlers = Object.keys(bundles).reduce(
24
- (acc, hash) => ({
25
- ...acc,
26
- [hash]: { hash }
27
- }),
28
- {}
29
- );
30
- return calculateAgentHash(ir, handlers);
31
- }
32
-
33
- // src/utils/manifest/index.ts
34
- async function readAgentManifest(params) {
35
- const { cwd, agentName } = params;
36
- const agentPath = join(cwd, "agents", agentName, "index.ts");
37
- await access(agentPath);
38
- const tempOutDir = await mkdtemp(join(tmpdir(), "kalp-build-"));
39
- try {
40
- await buildAgent(agentPath, tempOutDir, cwd);
41
- const irContent = await readFile(join(tempOutDir, "ir.json"), "utf-8");
42
- const ir = JSON.parse(irContent);
43
- return {
44
- format: "kalp-agent-manifest",
45
- schemaVersion: 3,
46
- ir,
47
- metadata: {
48
- generatedAt: (/* @__PURE__ */ new Date()).toISOString()
49
- }
50
- };
51
- } finally {
52
- await rm(tempOutDir, { recursive: true, force: true });
53
- }
54
- }
55
-
56
- // src/utils/issues.ts
57
- import p from "picocolors";
58
- var severityIcons = {
59
- error: p.red("\u2718"),
60
- warning: p.yellow("\u26A0"),
61
- info: p.blue("\u2139")
62
- };
63
- var severityLabels = {
64
- error: p.red("Error"),
65
- warning: p.yellow("Warning"),
66
- info: p.blue("Info")
67
- };
68
- function renderLegacyError(error, showDebug = true) {
69
- const lines = [];
70
- const debugMatch = error.match(/\(debug: (.+)\)$/);
71
- const debug = debugMatch ? debugMatch[1] : void 0;
72
- const mainError = debugMatch ? error.replace(/\(debug: .+\)$/, "").trim() : error;
73
- lines.push(p.red(p.bold(`\u2718 ${mainError.split("\n")[0]}`)));
74
- const fixMatch = mainError.match(/Fix:\n((?:- .+\n?)+)/);
75
- if (fixMatch) {
76
- lines.push("");
77
- lines.push(p.green(" Fix:"));
78
- const fixLines = fixMatch[1]?.split("\n").filter(Boolean) ?? [];
79
- for (const line of fixLines) {
80
- lines.push(` ${line.replace(/^- /, "")}`);
81
- }
82
- }
83
- if (showDebug && debug) {
84
- lines.push("");
85
- lines.push(p.dim(` (debug: ${debug})`));
86
- }
87
- return lines.join("\n");
88
- }
89
-
90
- // src/commands/push.ts
91
- var LOGO = "\u{1F98B}";
92
- function formatBytes(bytes) {
93
- if (bytes < 1024) return `${bytes} B`;
94
- return `${(bytes / 1024).toFixed(1)} KB`;
95
- }
96
- function printPushResult(agentName, hash, handlers) {
97
- const div = pc.dim("\u2500".repeat(48));
98
- const handlerCount = Object.keys(handlers).length;
99
- const totalSize = Object.values(handlers).reduce((sum, h) => sum + h.size, 0);
100
- console.log("\n" + div);
101
- console.log(pc.green("\u2714 Deployed"));
102
- console.log("");
103
- console.log(` ${pc.bold(agentName)} ${pc.dim(hash.slice(0, 7))}...`);
104
- console.log(
105
- ` ${pc.dim(String(handlerCount))} handlers \xB7 ${formatBytes(totalSize)}`
106
- );
107
- console.log(div + "\n");
108
- }
109
- function printPushError(phase, errors, blockers, verbose) {
110
- const div = pc.dim("\u2500".repeat(48));
111
- console.log("\n" + div);
112
- for (const e of errors) {
113
- console.log(renderLegacyError(e, verbose));
114
- console.log("");
115
- }
116
- if (phase === "analysis" && blockers) {
117
- for (const b of blockers) {
118
- console.log(pc.red(`\u2718 Blocker: ${b}`));
119
- }
120
- }
121
- if (!verbose) {
122
- console.log(pc.dim(`
123
- Run with --verbose for more details.
124
- `));
125
- }
126
- console.log(div + "\n");
127
- }
128
- var push_default = defineCommand({
129
- meta: { name: "push", description: "Push agent to Kalp cloud" },
130
- args: {
131
- agent: {
132
- type: "string",
133
- alias: "a",
134
- description: "Agent name to push",
135
- required: false
136
- },
137
- verbose: {
138
- type: "boolean",
139
- alias: "v",
140
- description: "Show debug information",
141
- default: false
142
- }
143
- },
144
- async run({ args }) {
145
- const cwd = process.cwd();
146
- const agentName = args.agent;
147
- p2.intro(`${LOGO} ${pc.bold("kalp push")}`);
148
- if (!agentName) {
149
- p2.log.error(`Missing required flag ${pc.cyan("-a <agent-name>")}`);
150
- process.exit(1);
151
- }
152
- try {
153
- await ensureConfig(cwd);
154
- } catch {
155
- p2.log.error(`${pc.cyan("kalp.config.ts")} not found`);
156
- process.exit(1);
157
- }
158
- const agentPath = join2(cwd, "agents", agentName, "index.ts");
159
- try {
160
- await access2(agentPath);
161
- } catch {
162
- p2.log.error(`Agent ${pc.cyan(agentName)} not found`);
163
- process.exit(1);
164
- }
165
- const s = p2.spinner();
166
- s.start(`Compiling ${pc.cyan(agentName)}`);
167
- const manifest = await readAgentManifest({ cwd, agentName });
168
- const bundles = manifest.ir.bundles || {};
169
- const handlerCount = Object.keys(bundles).length;
170
- const hash = computePushHash(manifest.ir);
171
- s.stop(`Compiled ${pc.cyan(agentName)} \u2014 ${handlerCount} handlers`);
172
- s.start(`Checking for changes`);
173
- const statusResponse = await fetch(
174
- `http://localhost:3000/api/agents/${agentName}/status`
175
- );
176
- const statusData = await statusResponse.json().catch(() => null);
177
- if (statusData?.exists && statusData.hash === hash) {
178
- s.stop(pc.green("No changes detected"));
179
- p2.note(
180
- `Agent ${pc.cyan(agentName)} is already deployed with the same logic.`,
181
- "Skipped"
182
- );
183
- p2.outro(`${LOGO} ${pc.green("No deployment needed")}`);
184
- return;
185
- }
186
- s.start(`Pushing to cloud`);
187
- let secretKey;
188
- try {
189
- const envPath = join2(cwd, ".env");
190
- const envContent = await readFile2(envPath, "utf-8");
191
- const match = envContent.match(/^KALP_SECRET_KEY=(.+)$/m);
192
- if (match && match[1]) {
193
- secretKey = match[1].trim();
194
- }
195
- } catch {
196
- }
197
- if (!secretKey) {
198
- p2.log.warning(
199
- "KALP_SECRET_KEY not found in .env. Studio authentication will not work."
200
- );
201
- p2.note("Run 'kalp studio' to generate a new secret.", "Action");
202
- }
203
- const response = await fetch(`http://localhost:3000/api/agents/push`, {
204
- method: "POST",
205
- headers: { "Content-Type": "application/json" },
206
- body: JSON.stringify({
207
- agentName,
208
- ir: manifest.ir,
209
- hash,
210
- secretKey
211
- // Send secret for injection into Cloudflare
212
- })
213
- });
214
- const body = await response.json().catch(() => null);
215
- if (!response.ok) {
216
- s.stop(pc.red("Push failed"));
217
- const phase = body?.phase ?? "unknown";
218
- const errors = body?.errors ?? [`HTTP ${response.status}`];
219
- const blockers = body?.blockers;
220
- printPushError(phase, errors, blockers);
221
- process.exit(1);
222
- }
223
- const displayHandlers = Object.entries(bundles).reduce(
224
- (acc, [hash2, bundle]) => ({
225
- ...acc,
226
- [hash2]: {
227
- size: Buffer.byteLength(bundle.code)
228
- }
229
- }),
230
- {}
231
- );
232
- s.stop(pc.green("Pushed successfully"));
233
- printPushResult(agentName, hash, displayHandlers);
234
- const kalpDir = join2(cwd, ".kalp");
235
- await mkdir(kalpDir, { recursive: true });
236
- const stateData = {
237
- agentName,
238
- workerUrl: `http://localhost:3000/a/${agentName}`,
239
- lastPush: (/* @__PURE__ */ new Date()).toISOString(),
240
- hash
241
- };
242
- await writeFile(
243
- join2(kalpDir, "state.json"),
244
- JSON.stringify(stateData, null, 2),
245
- "utf-8"
246
- );
247
- const dashboardUrl = `http://localhost:3000/a/${agentName}`;
248
- p2.outro(`${LOGO} ${pc.green("Agent live at")} ${pc.cyan(dashboardUrl)}`);
249
- process.exit(0);
250
- }
251
- });
252
- export {
253
- push_default as default
254
- };
255
- //# sourceMappingURL=push-UZADV7TZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/push.ts","../src/utils/manifest/index.ts","../src/utils/ir/hashIR.ts","../src/utils/issues.ts"],"sourcesContent":["import { access, mkdir, writeFile, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { ensureConfig } from \"@/utils/fs\";\nimport { readAgentManifest, computePushHash } from \"@/utils/manifest\";\nimport { renderLegacyError } from \"@/utils/issues\";\n\nconst LOGO = \"🦋\";\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n return `${(bytes / 1024).toFixed(1)} KB`;\n}\n\nfunction printPushResult(\n agentName: string,\n hash: string,\n handlers: Record<string, { size: number }>,\n) {\n const div = pc.dim(\"─\".repeat(48));\n const handlerCount = Object.keys(handlers).length;\n const totalSize = Object.values(handlers).reduce((sum, h) => sum + h.size, 0);\n\n console.log(\"\\n\" + div);\n console.log(pc.green(\"✔ Deployed\"));\n console.log(\"\");\n console.log(` ${pc.bold(agentName)} ${pc.dim(hash.slice(0, 7))}...`);\n console.log(\n ` ${pc.dim(String(handlerCount))} handlers · ${formatBytes(totalSize)}`,\n );\n console.log(div + \"\\n\");\n}\n\nfunction printPushError(\n phase: string,\n errors: string[],\n blockers?: string[],\n verbose?: boolean,\n) {\n const div = pc.dim(\"─\".repeat(48));\n console.log(\"\\n\" + div);\n\n for (const e of errors) {\n console.log(renderLegacyError(e, verbose));\n console.log(\"\");\n }\n\n if (phase === \"analysis\" && blockers) {\n for (const b of blockers) {\n console.log(pc.red(`✘ Blocker: ${b}`));\n }\n }\n\n if (!verbose) {\n console.log(pc.dim(`\\nRun with --verbose for more details.\\n`));\n }\n\n console.log(div + \"\\n\");\n}\n\nexport default defineCommand({\n meta: { name: \"push\", description: \"Push agent to Kalp cloud\" },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name to push\",\n required: false,\n },\n verbose: {\n type: \"boolean\",\n alias: \"v\",\n description: \"Show debug information\",\n default: 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 try {\n await ensureConfig(cwd);\n } 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 try {\n await access(agentPath);\n } catch {\n p.log.error(`Agent ${pc.cyan(agentName)} not found`);\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(`Compiling ${pc.cyan(agentName)}`);\n\n const manifest = await readAgentManifest({ cwd, agentName });\n\n const bundles = (manifest.ir.bundles || {}) as Record<\n string,\n { code: string }\n >;\n const handlerCount = Object.keys(bundles).length;\n\n const hash = computePushHash(manifest.ir);\n\n s.stop(`Compiled ${pc.cyan(agentName)} — ${handlerCount} handlers`);\n\n s.start(`Checking for changes`);\n\n const statusResponse = await fetch(\n `http://localhost:3000/api/agents/${agentName}/status`,\n );\n\n const statusData = (await statusResponse.json().catch(() => null)) as {\n agentName: string;\n hash?: string;\n exists: boolean;\n } | null;\n\n if (statusData?.exists && statusData.hash === hash) {\n s.stop(pc.green(\"No changes detected\"));\n p.note(\n `Agent ${pc.cyan(agentName)} is already deployed with the same logic.`,\n \"Skipped\",\n );\n p.outro(`${LOGO} ${pc.green(\"No deployment needed\")}`);\n return;\n }\n\n s.start(`Pushing to cloud`);\n\n // Read KALP_SECRET_KEY from .env local\n let secretKey: string | undefined;\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 if (match && match[1]) {\n secretKey = match[1].trim();\n }\n } catch {\n // .env doesn't exist\n }\n\n if (!secretKey) {\n p.log.warning(\n \"KALP_SECRET_KEY not found in .env. Studio authentication will not work.\",\n );\n p.note(\"Run 'kalp studio' to generate a new secret.\", \"Action\");\n }\n\n const response = await fetch(`http://localhost:3000/api/agents/push`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n agentName,\n ir: manifest.ir,\n hash,\n secretKey, // Send secret for injection into Cloudflare\n }),\n });\n\n const body = (await response.json().catch(() => null)) as Record<\n string,\n unknown\n > | null;\n\n if (!response.ok) {\n s.stop(pc.red(\"Push failed\"));\n const phase = (body?.phase as string) ?? \"unknown\";\n const errors = (body?.errors as string[]) ?? [`HTTP ${response.status}`];\n const blockers = body?.blockers as string[] | undefined;\n printPushError(phase, errors, blockers);\n process.exit(1);\n }\n\n const displayHandlers = Object.entries(bundles).reduce(\n (acc, [hash, bundle]) => ({\n ...acc,\n [hash]: {\n size: Buffer.byteLength(bundle.code),\n },\n }),\n {} as Record<string, { size: number }>,\n );\n\n s.stop(pc.green(\"Pushed successfully\"));\n printPushResult(agentName, hash, displayHandlers);\n\n // Save worker URL to .kalp/state.json\n const kalpDir = join(cwd, \".kalp\");\n await mkdir(kalpDir, { recursive: true });\n\n const stateData = {\n agentName,\n workerUrl: `http://localhost:3000/a/${agentName}`,\n lastPush: new Date().toISOString(),\n hash,\n };\n\n await writeFile(\n join(kalpDir, \"state.json\"),\n JSON.stringify(stateData, null, 2),\n \"utf-8\",\n );\n\n const dashboardUrl = `http://localhost:3000/a/${agentName}`;\n p.outro(`${LOGO} ${pc.green(\"Agent live at\")} ${pc.cyan(dashboardUrl)}`);\n\n process.exit(0);\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 p from \"picocolors\";\n\n/**\n * Severity level for a validation issue.\n */\nexport type Severity = \"error\" | \"warning\" | \"info\";\n\n/**\n * A structured validation issue found during agent analysis or compilation.\n */\nexport interface ValidationIssue {\n severity: Severity;\n message: string;\n context?: string;\n location?: string;\n fix?: string;\n debug?: string;\n}\n\ninterface RenderOptions {\n format?: \"pretty\" | \"json\" | \"minimal\";\n showDebug?: boolean;\n}\n\nconst severityIcons: Record<Severity, string> = {\n error: p.red(\"✘\"),\n warning: p.yellow(\"⚠\"),\n info: p.blue(\"ℹ\"),\n};\n\nconst severityLabels: Record<Severity, string> = {\n error: p.red(\"Error\"),\n warning: p.yellow(\"Warning\"),\n info: p.blue(\"Info\"),\n};\n\nfunction groupByContext(\n issues: ValidationIssue[],\n): Map<string, ValidationIssue[]> {\n const groups = new Map<string, ValidationIssue[]>();\n\n for (const issue of issues) {\n const context = issue.context ?? \"General\";\n const existing = groups.get(context) ?? [];\n existing.push(issue);\n groups.set(context, existing);\n }\n\n return groups;\n}\n\nfunction renderPrettyIssue(issue: ValidationIssue, showDebug: boolean): string {\n const lines: string[] = [];\n\n // Header with icon, severity label, and message\n lines.push(\n `${severityIcons[issue.severity]} ${severityLabels[issue.severity]}: ${p.bold(issue.message)}`,\n );\n\n // Context (location in code)\n if (issue.context) {\n lines.push(p.dim(` Found in: ${issue.context}`));\n }\n if (issue.location) {\n lines.push(p.dim(` Location: ${issue.location}`));\n }\n\n // Empty line before fix\n lines.push(\"\");\n\n // Fix section\n if (issue.fix) {\n lines.push(p.green(\" Fix:\"));\n const fixLines = issue.fix.split(\"\\n\");\n for (const fixLine of fixLines) {\n lines.push(` ${fixLine}`);\n }\n }\n\n // Debug info (optional)\n if (showDebug && issue.debug) {\n lines.push(\"\");\n lines.push(p.dim(` (debug: ${issue.debug})`));\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction renderGroupedIssues(\n issues: ValidationIssue[],\n showDebug: boolean,\n): string {\n const groups = groupByContext(issues);\n const output: string[] = [];\n\n for (const [context, contextIssues] of groups) {\n // Context header\n output.push(p.cyan(p.bold(`→ ${context}`)));\n output.push(\"\");\n\n // Issues in this context\n for (const issue of contextIssues) {\n output.push(renderPrettyIssue(issue, showDebug));\n output.push(\"\"); // Empty line between issues\n }\n }\n\n return output.join(\"\\n\");\n}\n\nfunction renderMinimalIssue(issue: ValidationIssue): string {\n const icon =\n issue.severity === \"error\" ? \"✘\" : issue.severity === \"warning\" ? \"⚠\" : \"ℹ\";\n const context = issue.context ? ` [${issue.context}]` : \"\";\n return `${icon} ${issue.message}${context}`;\n}\n\nexport function renderIssues(\n issues: ValidationIssue[],\n options: RenderOptions = {},\n): string {\n const { format = \"pretty\", showDebug = false } = options;\n\n if (issues.length === 0) {\n return p.green(\"✓ No issues found\");\n }\n\n // Sort by severity: errors first, then warnings, then info\n const sorted = [...issues].sort((a, b) => {\n const severityOrder: Record<Severity, number> = {\n error: 0,\n warning: 1,\n info: 2,\n };\n return severityOrder[a.severity]! - severityOrder[b.severity]!;\n });\n\n switch (format) {\n case \"json\":\n return JSON.stringify(sorted, null, 2);\n\n case \"minimal\":\n return sorted.map(renderMinimalIssue).join(\"\\n\");\n\n case \"pretty\":\n default: {\n const output: string[] = [];\n\n // Summary header\n const errorCount = issues.filter((i) => i.severity === \"error\").length;\n const warningCount = issues.filter(\n (i) => i.severity === \"warning\",\n ).length;\n const infoCount = issues.filter((i) => i.severity === \"info\").length;\n\n if (errorCount > 0) {\n output.push(\n p.red(\n p.bold(`Found ${errorCount} error${errorCount > 1 ? \"s\" : \"\"}`),\n ),\n );\n }\n if (warningCount > 0) {\n output.push(\n p.yellow(`${warningCount} warning${warningCount > 1 ? \"s\" : \"\"}`),\n );\n }\n if (infoCount > 0) {\n output.push(p.blue(`${infoCount} info`));\n }\n output.push(\"\");\n\n // Grouped issues\n output.push(renderGroupedIssues(sorted, showDebug));\n\n return output.join(\"\\n\");\n }\n }\n}\n\n// Render legacy error strings in DX-first format\nexport function renderLegacyError(\n error: string,\n showDebug: boolean = true,\n): string {\n const lines: string[] = [];\n\n // Extract debug info if present\n const debugMatch = error.match(/\\(debug: (.+)\\)$/);\n const debug = debugMatch ? debugMatch[1] : undefined;\n const mainError = debugMatch\n ? error.replace(/\\(debug: .+\\)$/, \"\").trim()\n : error;\n\n lines.push(p.red(p.bold(`✘ ${mainError.split(\"\\n\")[0]}`)));\n\n // Show fix if present in the error\n const fixMatch = mainError.match(/Fix:\\n((?:- .+\\n?)+)/);\n if (fixMatch) {\n lines.push(\"\");\n lines.push(p.green(\" Fix:\"));\n const fixLines = fixMatch[1]?.split(\"\\n\").filter(Boolean) ?? [];\n for (const line of fixLines) {\n lines.push(` ${line.replace(/^- /, \"\")}`);\n }\n }\n\n if (showDebug && debug) {\n lines.push(\"\");\n lines.push(p.dim(` (debug: ${debug})`));\n }\n\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":["access","readFile","join","p","join","access","readFile","hash"]}