@kalphq/cli 0.0.0-dev-20260513152102 → 0.0.0-dev-20260517015600

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/{add-YZSIMRPC.js → add-5WUS5HGV.js} +16 -8
  2. package/dist/add-5WUS5HGV.js.map +1 -0
  3. package/dist/{agents-WYK6WNQP.js → agents-L22L47II.js} +3 -3
  4. package/dist/ai-7EBQF25Y.js +12 -0
  5. package/dist/ai-7EBQF25Y.js.map +1 -0
  6. package/dist/{chunk-IZXCZ3IA.js → chunk-4CPUJ537.js} +2 -2
  7. package/dist/chunk-5YUU3KLB.js +40 -0
  8. package/dist/chunk-5YUU3KLB.js.map +1 -0
  9. package/dist/chunk-7KVCCBPJ.js +139 -0
  10. package/dist/chunk-7KVCCBPJ.js.map +1 -0
  11. package/dist/{chunk-S3KAVLVM.js → chunk-D53K6UE6.js} +2 -2
  12. package/dist/chunk-D53K6UE6.js.map +1 -0
  13. package/dist/{chunk-4CEJYSJY.js → chunk-DLUULDXW.js} +12 -45
  14. package/dist/chunk-DLUULDXW.js.map +1 -0
  15. package/dist/chunk-DXNHT4HF.js +99 -0
  16. package/dist/chunk-DXNHT4HF.js.map +1 -0
  17. package/dist/{chunk-XVD3FFOJ.js → chunk-JXR6TPR5.js} +51 -72
  18. package/dist/chunk-JXR6TPR5.js.map +1 -0
  19. package/dist/chunk-LEKRFM4Q.js +49 -0
  20. package/dist/chunk-LEKRFM4Q.js.map +1 -0
  21. package/dist/chunk-QT2JFINP.js +99 -0
  22. package/dist/chunk-QT2JFINP.js.map +1 -0
  23. package/dist/{chunk-5SZMD7E6.js → chunk-TNNBTSDC.js} +2 -2
  24. package/dist/{chunk-5SZMD7E6.js.map → chunk-TNNBTSDC.js.map} +1 -1
  25. package/dist/{generate-JW2DMJ3W.js → chunk-ZX7TIQM7.js} +127 -120
  26. package/dist/chunk-ZX7TIQM7.js.map +1 -0
  27. package/dist/{create-UCJ77P62.js → create-ILPQCRA2.js} +2 -2
  28. package/dist/{delete-QPYVL4OU.js → delete-AJFAAGYJ.js} +9 -8
  29. package/dist/{delete-QPYVL4OU.js.map → delete-AJFAAGYJ.js.map} +1 -1
  30. package/dist/{delete-FIXMFFNZ.js → delete-IFVGULOA.js} +21 -13
  31. package/dist/delete-IFVGULOA.js.map +1 -0
  32. package/dist/{deploy-DRZZ3YRB.js → deploy-EWYNN3VU.js} +9 -6
  33. package/dist/{deploy-DRZZ3YRB.js.map → deploy-EWYNN3VU.js.map} +1 -1
  34. package/dist/{dev-5YY6W4WM.js → dev-3IEEUVYM.js} +66 -11
  35. package/dist/dev-3IEEUVYM.js.map +1 -0
  36. package/dist/generate-2MO7PZBT.js +69 -0
  37. package/dist/generate-2MO7PZBT.js.map +1 -0
  38. package/dist/generate-ODZUKTF2.js +146 -0
  39. package/dist/generate-ODZUKTF2.js.map +1 -0
  40. package/dist/index.js +32 -12
  41. package/dist/index.js.map +1 -1
  42. package/dist/{list-FKH4DWCF.js → list-BNQ34QG3.js} +6 -5
  43. package/dist/{list-FKH4DWCF.js.map → list-BNQ34QG3.js.map} +1 -1
  44. package/dist/{list-GZBBOFX5.js → list-WHYV5JZ4.js} +5 -4
  45. package/dist/{list-GZBBOFX5.js.map → list-WHYV5JZ4.js.map} +1 -1
  46. package/dist/{login-MGPA2VYV.js → login-BDLHS4HC.js} +13 -8
  47. package/dist/login-BDLHS4HC.js.map +1 -0
  48. package/dist/{mcp-DRMQYA7E.js → mcp-77OLNT5R.js} +2 -2
  49. package/dist/{pull-V7QJBVNZ.js → pull-CFDZS6VB.js} +8 -7
  50. package/dist/{pull-V7QJBVNZ.js.map → pull-CFDZS6VB.js.map} +1 -1
  51. package/dist/{push-P6CKRYT7.js → push-OL7562HM.js} +159 -47
  52. package/dist/push-OL7562HM.js.map +1 -0
  53. package/dist/runtime-template/studio/index.html +3 -0
  54. package/dist/{secrets-M43LLCTB.js → secrets-BPESLXMK.js} +6 -6
  55. package/dist/{sync-LTBH6DI5.js → sync-JJDODKMO.js} +8 -7
  56. package/dist/{sync-LTBH6DI5.js.map → sync-JJDODKMO.js.map} +1 -1
  57. package/package.json +5 -4
  58. package/dist/add-YZSIMRPC.js.map +0 -1
  59. package/dist/chunk-4CEJYSJY.js.map +0 -1
  60. package/dist/chunk-LPEV4QH2.js +0 -208
  61. package/dist/chunk-LPEV4QH2.js.map +0 -1
  62. package/dist/chunk-S3KAVLVM.js.map +0 -1
  63. package/dist/chunk-VCFH3R34.js +0 -103
  64. package/dist/chunk-VCFH3R34.js.map +0 -1
  65. package/dist/chunk-XVD3FFOJ.js.map +0 -1
  66. package/dist/delete-FIXMFFNZ.js.map +0 -1
  67. package/dist/dev-5YY6W4WM.js.map +0 -1
  68. package/dist/generate-JW2DMJ3W.js.map +0 -1
  69. package/dist/login-MGPA2VYV.js.map +0 -1
  70. package/dist/push-P6CKRYT7.js.map +0 -1
  71. /package/dist/{agents-WYK6WNQP.js.map → agents-L22L47II.js.map} +0 -0
  72. /package/dist/{chunk-IZXCZ3IA.js.map → chunk-4CPUJ537.js.map} +0 -0
  73. /package/dist/{create-UCJ77P62.js.map → create-ILPQCRA2.js.map} +0 -0
  74. /package/dist/{mcp-DRMQYA7E.js.map → mcp-77OLNT5R.js.map} +0 -0
  75. /package/dist/{secrets-M43LLCTB.js.map → secrets-BPESLXMK.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/agents-remote.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { writeFile, rm } from \"node:fs/promises\";\nimport { resolveProvider } from \"@/utils/providers\";\n\nexport interface RemoteAgentIndexEntry {\n name: string;\n hash: string;\n version: string | null;\n versionNumber: number | null;\n updatedAt: string;\n workerUrl: string | null;\n label?: string;\n tags?: string[];\n}\n\ninterface ManifestMetadata {\n name?: string;\n label?: string;\n tags?: string[];\n}\n\nexport async function readRemoteAgentsIndex(\n cwd: string,\n wranglerConfigPath: string,\n): Promise<RemoteAgentIndexEntry[]> {\n const provider = resolveProvider();\n const output = await provider\n .getValue({\n cwd,\n configPath: wranglerConfigPath,\n key: \"agents:index\",\n })\n .catch(() => null);\n if (!output) return [];\n try {\n const parsed = JSON.parse(output) as unknown;\n if (!Array.isArray(parsed)) return [];\n return parsed as RemoteAgentIndexEntry[];\n } catch {\n return [];\n }\n}\n\nexport async function writeRemoteAgentsIndex(\n cwd: string,\n wranglerConfigPath: string,\n entries: RemoteAgentIndexEntry[],\n): Promise<void> {\n const path = join(cwd, \".kalp\", \"agents-index.json\");\n await writeFile(path, JSON.stringify(entries, null, 2), \"utf-8\");\n const provider = resolveProvider();\n try {\n await provider.putManifest({\n cwd,\n configPath: wranglerConfigPath,\n key: \"agents:index\",\n jsonPath: path,\n });\n } finally {\n await rm(path, { force: true });\n }\n}\n\nexport async function readRemoteAgentPointers(\n cwd: string,\n wranglerConfigPath: string,\n): Promise<Array<{ name: string; hash: string }>> {\n const provider = resolveProvider();\n const keys = await provider.listKeys({\n cwd,\n configPath: wranglerConfigPath,\n prefix: \"\",\n });\n const latestKeys = keys\n .map((item) => item.name)\n .filter((key) => key.endsWith(\":latest\"));\n\n const pointers: Array<{ name: string; hash: string }> = [];\n for (const latestKey of latestKeys) {\n const name = latestKey.slice(0, -7);\n if (!name) continue;\n const hash = await provider\n .getValue({ cwd, configPath: wranglerConfigPath, key: latestKey })\n .catch(() => null);\n if (!hash) continue;\n pointers.push({ name, hash });\n }\n return pointers.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport async function readRemoteManifestMetadata(params: {\n cwd: string;\n wranglerConfigPath: string;\n agentName: string;\n hash: string;\n}): Promise<ManifestMetadata | null> {\n const provider = resolveProvider();\n const raw = await provider\n .getValue({\n cwd: params.cwd,\n configPath: params.wranglerConfigPath,\n key: `${params.agentName}:${params.hash}`,\n })\n .catch(() => null);\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as { metadata?: ManifestMetadata };\n return parsed.metadata ?? null;\n } catch {\n return null;\n }\n}\n"],"mappings":";;;;;;AAAA,SAAS,YAAY;AACrB,SAAS,WAAW,UAAU;AAoB9B,eAAsB,sBACpB,KACA,oBACkC;AAClC,QAAM,WAAW,gBAAgB;AACjC,QAAM,SAAS,MAAM,SAClB,SAAS;AAAA,IACR;AAAA,IACA,YAAY;AAAA,IACZ,KAAK;AAAA,EACP,CAAC,EACA,MAAM,MAAM,IAAI;AACnB,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,MAAM;AAChC,QAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO,CAAC;AACpC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAsB,uBACpB,KACA,oBACA,SACe;AACf,QAAM,OAAO,KAAK,KAAK,SAAS,mBAAmB;AACnD,QAAM,UAAU,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC,GAAG,OAAO;AAC/D,QAAM,WAAW,gBAAgB;AACjC,MAAI;AACF,UAAM,SAAS,YAAY;AAAA,MACzB;AAAA,MACA,YAAY;AAAA,MACZ,KAAK;AAAA,MACL,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,UAAE;AACA,UAAM,GAAG,MAAM,EAAE,OAAO,KAAK,CAAC;AAAA,EAChC;AACF;AAEA,eAAsB,wBACpB,KACA,oBACgD;AAChD,QAAM,WAAW,gBAAgB;AACjC,QAAM,OAAO,MAAM,SAAS,SAAS;AAAA,IACnC;AAAA,IACA,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV,CAAC;AACD,QAAM,aAAa,KAChB,IAAI,CAAC,SAAS,KAAK,IAAI,EACvB,OAAO,CAAC,QAAQ,IAAI,SAAS,SAAS,CAAC;AAE1C,QAAM,WAAkD,CAAC;AACzD,aAAW,aAAa,YAAY;AAClC,UAAM,OAAO,UAAU,MAAM,GAAG,EAAE;AAClC,QAAI,CAAC,KAAM;AACX,UAAM,OAAO,MAAM,SAChB,SAAS,EAAE,KAAK,YAAY,oBAAoB,KAAK,UAAU,CAAC,EAChE,MAAM,MAAM,IAAI;AACnB,QAAI,CAAC,KAAM;AACX,aAAS,KAAK,EAAE,MAAM,KAAK,CAAC;AAAA,EAC9B;AACA,SAAO,SAAS,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAC7D;","names":[]}
1
+ {"version":3,"sources":["../src/utils/agents-remote.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { writeFile, rm } from \"node:fs/promises\";\nimport { resolveProvider } from \"@/utils/providers\";\n\nexport interface RemoteAgentIndexEntry {\n name: string;\n hash: string;\n version: string | null;\n versionNumber: number | null;\n updatedAt: string;\n workerUrl: string | null;\n label?: string;\n tags?: string[];\n}\n\ninterface ManifestMetadata {\n name?: string;\n label?: string;\n tags?: string[];\n}\n\nexport async function readRemoteAgentsIndex(\n cwd: string,\n wranglerConfigPath: string,\n): Promise<RemoteAgentIndexEntry[]> {\n const provider = resolveProvider();\n const output = await provider\n .getValue({\n cwd,\n configPath: wranglerConfigPath,\n key: \"agents:index\",\n })\n .catch(() => null);\n if (!output) return [];\n try {\n const parsed = JSON.parse(output) as unknown;\n if (!Array.isArray(parsed)) return [];\n return parsed as RemoteAgentIndexEntry[];\n } catch {\n return [];\n }\n}\n\nexport async function writeRemoteAgentsIndex(\n cwd: string,\n wranglerConfigPath: string,\n entries: RemoteAgentIndexEntry[],\n): Promise<void> {\n const path = join(cwd, \".kalp\", \"agents-index.json\");\n await writeFile(path, JSON.stringify(entries, null, 2), \"utf-8\");\n const provider = resolveProvider();\n try {\n await provider.putManifest({\n cwd,\n configPath: wranglerConfigPath,\n key: \"agents:index\",\n jsonPath: path,\n });\n } finally {\n await rm(path, { force: true });\n }\n}\n\nexport async function readRemoteAgentPointers(\n cwd: string,\n wranglerConfigPath: string,\n): Promise<Array<{ name: string; hash: string }>> {\n const provider = resolveProvider();\n const keys = await provider.listKeys({\n cwd,\n configPath: wranglerConfigPath,\n prefix: \"\",\n });\n const latestKeys = keys\n .map((item) => item.name)\n .filter((key) => key.endsWith(\":latest\"));\n\n const pointers: Array<{ name: string; hash: string }> = [];\n for (const latestKey of latestKeys) {\n const name = latestKey.slice(0, -7);\n if (!name) continue;\n const hash = await provider\n .getValue({ cwd, configPath: wranglerConfigPath, key: latestKey })\n .catch(() => null);\n if (!hash) continue;\n pointers.push({ name, hash });\n }\n return pointers.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport async function readRemoteManifestMetadata(params: {\n cwd: string;\n wranglerConfigPath: string;\n agentName: string;\n hash: string;\n}): Promise<ManifestMetadata | null> {\n const provider = resolveProvider();\n const raw = await provider\n .getValue({\n cwd: params.cwd,\n configPath: params.wranglerConfigPath,\n key: `${params.agentName}:${params.hash}:semantic-ir`,\n })\n .catch(() => null);\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as { agent?: ManifestMetadata };\n return parsed.agent ?? null;\n } catch {\n return null;\n }\n}\n"],"mappings":";;;;;;AAAA,SAAS,YAAY;AACrB,SAAS,WAAW,UAAU;AAoB9B,eAAsB,sBACpB,KACA,oBACkC;AAClC,QAAM,WAAW,gBAAgB;AACjC,QAAM,SAAS,MAAM,SAClB,SAAS;AAAA,IACR;AAAA,IACA,YAAY;AAAA,IACZ,KAAK;AAAA,EACP,CAAC,EACA,MAAM,MAAM,IAAI;AACnB,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,MAAM;AAChC,QAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO,CAAC;AACpC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAsB,uBACpB,KACA,oBACA,SACe;AACf,QAAM,OAAO,KAAK,KAAK,SAAS,mBAAmB;AACnD,QAAM,UAAU,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC,GAAG,OAAO;AAC/D,QAAM,WAAW,gBAAgB;AACjC,MAAI;AACF,UAAM,SAAS,YAAY;AAAA,MACzB;AAAA,MACA,YAAY;AAAA,MACZ,KAAK;AAAA,MACL,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,UAAE;AACA,UAAM,GAAG,MAAM,EAAE,OAAO,KAAK,CAAC;AAAA,EAChC;AACF;AAEA,eAAsB,wBACpB,KACA,oBACgD;AAChD,QAAM,WAAW,gBAAgB;AACjC,QAAM,OAAO,MAAM,SAAS,SAAS;AAAA,IACnC;AAAA,IACA,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV,CAAC;AACD,QAAM,aAAa,KAChB,IAAI,CAAC,SAAS,KAAK,IAAI,EACvB,OAAO,CAAC,QAAQ,IAAI,SAAS,SAAS,CAAC;AAE1C,QAAM,WAAkD,CAAC;AACzD,aAAW,aAAa,YAAY;AAClC,UAAM,OAAO,UAAU,MAAM,GAAG,EAAE;AAClC,QAAI,CAAC,KAAM;AACX,UAAM,OAAO,MAAM,SAChB,SAAS,EAAE,KAAK,YAAY,oBAAoB,KAAK,UAAU,CAAC,EAChE,MAAM,MAAM,IAAI;AACnB,QAAI,CAAC,KAAM;AACX,aAAS,KAAK,EAAE,MAAM,KAAK,CAAC;AAAA,EAC9B;AACA,SAAO,SAAS,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAC7D;","names":[]}
@@ -1,48 +1,61 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- generateTypes,
4
- writeMcpTypes
5
- } from "./chunk-LPEV4QH2.js";
3
+ normalizeMcpServer
4
+ } from "./chunk-QT2JFINP.js";
6
5
  import {
7
6
  loadProjectConfig
8
7
  } from "./chunk-EXXTCGKR.js";
9
8
 
10
- // src/commands/mcp/generate.ts
11
- import { defineCommand } from "citty";
12
- import * as p from "@clack/prompts";
13
- import pc from "picocolors";
14
- import { cwd } from "process";
15
-
16
9
  // src/utils/mcp-codegen.ts
10
+ import { mkdir, readFile, writeFile } from "fs/promises";
11
+ import { join } from "path";
17
12
  import { compile } from "json-schema-to-typescript";
18
13
  var MCP_CLIENT_NAME = "kalp-cli";
19
14
  var MCP_PROTOCOL_VERSION = "2025-06-18";
20
15
  function asRecord(value) {
21
16
  return value && typeof value === "object" ? value : null;
22
17
  }
23
- function isMcpTransport(value) {
24
- return value === "sse" || value === "stdio";
25
- }
26
18
  function toPascalCase(value) {
27
19
  const normalized = value.replace(/[^a-zA-Z0-9]+/g, " ").trim().split(/\s+/g).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
28
20
  if (!normalized) return "Generated";
29
21
  return /^[0-9]/.test(normalized) ? `N${normalized}` : normalized;
30
22
  }
31
23
  function getServerConfigs(raw) {
32
- const mcp = asRecord(raw.mcp);
33
- if (!mcp) return {};
24
+ const mcpInput = raw.mcp || {};
34
25
  const servers = {};
35
- for (const [serverName, serverConfigRaw] of Object.entries(mcp)) {
36
- const serverConfig = asRecord(serverConfigRaw);
37
- if (!serverConfig) continue;
38
- const transport = serverConfig.transport;
39
- const url = serverConfig.url;
40
- if (!isMcpTransport(transport) || typeof url !== "string" || !url.trim()) {
41
- continue;
26
+ for (const [serverName, serverInput] of Object.entries(mcpInput)) {
27
+ const normalized = normalizeMcpServer(serverInput);
28
+ const { url, transport, auth } = normalized;
29
+ if (!url || !url.trim()) continue;
30
+ const headers = {};
31
+ let skipAuth = false;
32
+ if (auth) {
33
+ if (auth.type === "bearer") {
34
+ if (auth.tokenEnv && !process.env[auth.tokenEnv]) {
35
+ console.warn(`[MCP] \u26A0\uFE0F Warning: Missing local environment variable "${auth.tokenEnv}" for server "${serverName}". Skipping authenticated introspection.`);
36
+ skipAuth = true;
37
+ } else if (auth.token) {
38
+ headers["authorization"] = `Bearer ${auth.token}`;
39
+ }
40
+ } else if (auth.type === "headers") {
41
+ for (const [k, v] of Object.entries(auth.headers)) {
42
+ headers[k.toLowerCase()] = v;
43
+ }
44
+ for (const [k, envName] of Object.entries(auth.headersEnv)) {
45
+ if (!process.env[envName]) {
46
+ console.warn(`[MCP] \u26A0\uFE0F Warning: Missing local environment variable "${envName}" for header "${k}" in server "${serverName}". Skipping authenticated introspection.`);
47
+ skipAuth = true;
48
+ }
49
+ }
50
+ }
51
+ }
52
+ if (skipAuth) {
53
+ for (const k in headers) delete headers[k];
42
54
  }
43
55
  servers[serverName] = {
44
56
  transport,
45
- url: url.trim()
57
+ url: url.trim(),
58
+ headers
46
59
  };
47
60
  }
48
61
  return servers;
@@ -62,23 +75,51 @@ function createRpcPayload(id, method, params) {
62
75
  method
63
76
  };
64
77
  }
65
- async function postJsonRpc(url, body, protocolVersion) {
78
+ var MCP_SESSIONS = /* @__PURE__ */ new Map();
79
+ async function postJsonRpc(url, body, protocolVersion, extraHeaders = {}) {
80
+ const headers = {
81
+ ...extraHeaders,
82
+ "content-type": "application/json",
83
+ accept: "application/json, text/event-stream",
84
+ "MCP-Protocol-Version": protocolVersion
85
+ };
86
+ const sessionId = MCP_SESSIONS.get(url);
87
+ if (sessionId) {
88
+ headers["MCP-Session-Id"] = sessionId;
89
+ }
66
90
  const response = await fetch(url, {
67
91
  method: "POST",
68
- headers: {
69
- "content-type": "application/json",
70
- accept: "application/json",
71
- "MCP-Protocol-Version": protocolVersion
72
- },
92
+ headers,
73
93
  body: JSON.stringify(body)
74
94
  });
75
95
  const text = await response.text();
76
96
  if (!response.ok) {
77
97
  throw new Error(`Request failed with HTTP ${response.status}: ${text.slice(0, 300)}`);
78
98
  }
99
+ const sessionHeader = response.headers.get("mcp-session-id");
100
+ if (sessionHeader) {
101
+ MCP_SESSIONS.set(url, sessionHeader);
102
+ }
103
+ let jsonText = text;
104
+ if (text.includes("event: message") && text.includes("data: {")) {
105
+ const lines = text.split(/\r?\n/);
106
+ if (!sessionHeader) {
107
+ const idLine = lines.find((line) => line.startsWith("id: "));
108
+ if (idLine) {
109
+ const capturedId = idLine.slice(4).trim();
110
+ if (capturedId) {
111
+ MCP_SESSIONS.set(url, capturedId);
112
+ }
113
+ }
114
+ }
115
+ const dataLine = lines.find((line) => line.startsWith("data: "));
116
+ if (dataLine) {
117
+ jsonText = dataLine.slice(6).trim();
118
+ }
119
+ }
79
120
  let parsed;
80
121
  try {
81
- parsed = JSON.parse(text);
122
+ parsed = JSON.parse(jsonText);
82
123
  } catch {
83
124
  throw new Error(`Invalid JSON-RPC response payload: ${text.slice(0, 300)}`);
84
125
  }
@@ -88,7 +129,7 @@ async function postJsonRpc(url, body, protocolVersion) {
88
129
  }
89
130
  return record;
90
131
  }
91
- async function initializeServer(url) {
132
+ async function initializeServer(url, headers) {
92
133
  const initResponse = await postJsonRpc(
93
134
  url,
94
135
  createRpcPayload(1, "initialize", {
@@ -96,7 +137,8 @@ async function initializeServer(url) {
96
137
  capabilities: {},
97
138
  clientInfo: { name: MCP_CLIENT_NAME, version: "0.1.0" }
98
139
  }),
99
- MCP_PROTOCOL_VERSION
140
+ MCP_PROTOCOL_VERSION,
141
+ headers
100
142
  );
101
143
  if ("error" in initResponse) {
102
144
  throw new Error(
@@ -110,7 +152,8 @@ async function initializeServer(url) {
110
152
  jsonrpc: "2.0",
111
153
  method: "notifications/initialized"
112
154
  },
113
- negotiatedVersion
155
+ negotiatedVersion,
156
+ headers
114
157
  ).catch(() => {
115
158
  });
116
159
  return negotiatedVersion;
@@ -138,7 +181,7 @@ async function fetchServerTools(serverName, config) {
138
181
  const warnings = [];
139
182
  if (config.transport !== "sse") {
140
183
  warnings.push(
141
- `Server "${serverName}" uses "${config.transport}" transport and was skipped. Only "sse" transport is supported by kalp mcp generate.`
184
+ `Server "${serverName}" uses "${config.transport}" transport and was skipped. Only "sse" transport is supported.`
142
185
  );
143
186
  return {
144
187
  serverName,
@@ -148,7 +191,7 @@ async function fetchServerTools(serverName, config) {
148
191
  warnings
149
192
  };
150
193
  }
151
- const protocolVersion = await initializeServer(config.url);
194
+ const protocolVersion = await initializeServer(config.url, config.headers);
152
195
  const tools = [];
153
196
  let cursor;
154
197
  let page = 0;
@@ -158,7 +201,8 @@ async function fetchServerTools(serverName, config) {
158
201
  const response = await postJsonRpc(
159
202
  config.url,
160
203
  createRpcPayload(`tools-list-${page + 1}`, "tools/list", params),
161
- protocolVersion
204
+ protocolVersion,
205
+ config.headers
162
206
  );
163
207
  if ("error" in response) {
164
208
  throw new Error(
@@ -269,8 +313,7 @@ async function compileServerToolTypes(serverResults, warnings) {
269
313
  function renderMcpTypes(declarations, servers) {
270
314
  const lines = [
271
315
  "// \u{1F98B} Kalp Generated MCP Types",
272
- "// This file is auto-generated by `kalp mcp generate`.",
273
- "// Do not edit manually.",
316
+ "// This file is auto-generated. Do not edit manually.",
274
317
  "",
275
318
  'import "@kalphq/sdk";',
276
319
  ""
@@ -297,95 +340,59 @@ function renderMcpTypes(declarations, servers) {
297
340
  lines.push("");
298
341
  return lines.join("\n");
299
342
  }
300
- async function generateMcpTypes(cwd2, options = {}) {
301
- const { raw } = await loadProjectConfig(cwd2);
302
- const servers = getServerConfigs(raw);
303
- const warnings = [];
304
- const serverResults = [];
305
- for (const [serverName, config] of Object.entries(servers).sort(
306
- (a, b) => a[0].localeCompare(b[0])
307
- )) {
308
- try {
309
- const result = await fetchServerTools(serverName, config);
310
- serverResults.push(result);
311
- warnings.push(...result.warnings);
312
- } catch (error) {
313
- const message = `Failed to introspect "${serverName}" (${config.url}): ${error instanceof Error ? error.message : String(error)}`;
314
- if (options.strict) {
315
- throw new Error(message);
343
+ var McpTypesGenerator = class {
344
+ id = "mcp";
345
+ name = "MCP Types";
346
+ async generate(cwd) {
347
+ const generatedDir = join(cwd, ".kalp", "generated");
348
+ const mcpPath = join(generatedDir, "mcp.d.ts");
349
+ await mkdir(generatedDir, { recursive: true });
350
+ const { raw } = await loadProjectConfig(cwd);
351
+ const servers = getServerConfigs(raw);
352
+ const warnings = [];
353
+ const serverResults = [];
354
+ for (const [serverName, config] of Object.entries(servers).sort(
355
+ (a, b) => a[0].localeCompare(b[0])
356
+ )) {
357
+ try {
358
+ const result = await fetchServerTools(serverName, config);
359
+ serverResults.push(result);
360
+ warnings.push(...result.warnings);
361
+ } catch (error) {
362
+ const message = `Failed to introspect "${serverName}" (${config.url}): ${error instanceof Error ? error.message : String(error)}`;
363
+ warnings.push(message);
364
+ serverResults.push({
365
+ serverName,
366
+ transport: config.transport,
367
+ url: config.url,
368
+ tools: [],
369
+ warnings: [message]
370
+ });
316
371
  }
317
- warnings.push(message);
318
- serverResults.push({
319
- serverName,
320
- transport: config.transport,
321
- url: config.url,
322
- tools: [],
323
- warnings: [message]
324
- });
325
372
  }
373
+ const compiled = await compileServerToolTypes(serverResults, warnings);
374
+ const content = renderMcpTypes(compiled.declarations, compiled.servers);
375
+ const existing = await readFile(mcpPath, "utf-8").catch(() => null);
376
+ if (existing === content) {
377
+ return { updated: false, warnings };
378
+ }
379
+ await writeFile(mcpPath, content, "utf-8");
380
+ return { updated: true, warnings };
326
381
  }
327
- const compiled = await compileServerToolTypes(serverResults, warnings);
328
- const content = renderMcpTypes(compiled.declarations, compiled.servers);
329
- const outputPath = await writeMcpTypes(cwd2, content);
382
+ };
383
+ async function generateMcpTypes(cwd, options = {}) {
384
+ const gen = new McpTypesGenerator();
385
+ const res = await gen.generate(cwd);
330
386
  return {
331
- outputPath,
332
- servers: serverResults,
333
- warnings
387
+ outputPath: join(cwd, ".kalp", "generated", "mcp.d.ts"),
388
+ servers: [],
389
+ // Not fully compatible legacy shape, but fine for now
390
+ warnings: res.warnings || []
334
391
  };
335
392
  }
336
393
 
337
- // src/commands/mcp/generate.ts
338
- var LOGO = "\u{1F98B}";
339
- var generate_default = defineCommand({
340
- meta: {
341
- name: "generate",
342
- description: "Generate MCP tool types into .kalp/mcp.types.d.ts"
343
- },
344
- args: {
345
- strict: {
346
- type: "boolean",
347
- description: "Fail when at least one MCP server cannot be introspected",
348
- default: false
349
- }
350
- },
351
- async run({ args }) {
352
- p.intro(`${LOGO} ${pc.bold("kalp mcp generate")}`);
353
- const spinner2 = p.spinner();
354
- spinner2.start("Discovering MCP servers and generating types");
355
- try {
356
- const projectCwd = cwd();
357
- await generateTypes(projectCwd);
358
- const result = await generateMcpTypes(projectCwd, {
359
- strict: args.strict
360
- });
361
- spinner2.stop("MCP type generation completed");
362
- if (result.servers.length === 0) {
363
- p.log.warn(
364
- "No MCP servers found in kalp.config.ts. Generated an empty McpRegistry."
365
- );
366
- } else {
367
- for (const server of result.servers) {
368
- p.log.info(
369
- `${pc.bold(server.serverName)} (${server.transport}) -> ${server.tools.length} tools`
370
- );
371
- }
372
- }
373
- if (result.warnings.length > 0) {
374
- p.log.warn(pc.bold("Warnings:"));
375
- for (const warning of result.warnings) {
376
- p.log.warn(`- ${warning}`);
377
- }
378
- }
379
- p.outro(`Types written to ${pc.cyan(result.outputPath)}`);
380
- } catch (error) {
381
- spinner2.stop("MCP type generation failed");
382
- const message = error instanceof Error ? error.message : String(error);
383
- p.cancel(message);
384
- process.exitCode = 1;
385
- }
386
- }
387
- });
388
394
  export {
389
- generate_default as default
395
+ McpTypesGenerator,
396
+ generateMcpTypes
390
397
  };
391
- //# sourceMappingURL=generate-JW2DMJ3W.js.map
398
+ //# sourceMappingURL=chunk-ZX7TIQM7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/mcp-codegen.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { loadProjectConfig } from \"@/utils/project-config\";\nimport { compile } from \"json-schema-to-typescript\";\nimport { normalizeMcpServer, type NormalizedMcpServer } from \"@kalphq/sdk\";\nimport type { ProjectGenerator, GeneratorResult } from \"./sync\";\n\nconst MCP_CLIENT_NAME = \"kalp-cli\";\nconst MCP_PROTOCOL_VERSION = \"2025-06-18\";\n\ntype McpTransport = \"sse\" | \"stdio\";\n\ninterface McpServerConfigInput {\n transport: McpTransport;\n url: string;\n headers: Record<string, string>;\n}\n\ninterface McpToolDefinition {\n name: string;\n inputSchema?: unknown;\n outputSchema?: unknown;\n}\n\ninterface McpServerTypesResult {\n serverName: string;\n transport: McpTransport;\n url: string;\n tools: McpToolDefinition[];\n warnings: string[];\n}\n\nexport interface McpGenerateResult {\n outputPath: string;\n servers: McpServerTypesResult[];\n warnings: string[];\n}\n\ninterface JsonRpcSuccess<T> {\n jsonrpc: \"2.0\";\n id?: string | number;\n result: T;\n}\n\ninterface JsonRpcFailure {\n jsonrpc: \"2.0\";\n id?: string | number;\n error: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\ntype JsonRpcResponse<T> = JsonRpcSuccess<T> | JsonRpcFailure;\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" ? (value as Record<string, unknown>) : null;\n}\n\nfunction toPascalCase(value: string): string {\n const normalized = value\n .replace(/[^a-zA-Z0-9]+/g, \" \")\n .trim()\n .split(/\\s+/g)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n\n if (!normalized) return \"Generated\";\n return /^[0-9]/.test(normalized) ? `N${normalized}` : normalized;\n}\n\nfunction getServerConfigs(raw: Record<string, unknown>): Record<string, McpServerConfigInput> {\n const mcpInput = (raw.mcp || {}) as Record<string, any>;\n const servers: Record<string, McpServerConfigInput> = {};\n\n for (const [serverName, serverInput] of Object.entries(mcpInput)) {\n const normalized = normalizeMcpServer(serverInput);\n const { url, transport, auth } = normalized;\n\n if (!url || !url.trim()) continue;\n\n const headers: Record<string, string> = {};\n let skipAuth = false;\n\n if (auth) {\n if (auth.type === \"bearer\") {\n if (auth.tokenEnv && !process.env[auth.tokenEnv]) {\n console.warn(`[MCP] ⚠️ Warning: Missing local environment variable \"${auth.tokenEnv}\" for server \"${serverName}\". Skipping authenticated introspection.`);\n skipAuth = true;\n } else if (auth.token) {\n headers[\"authorization\"] = `Bearer ${auth.token}`;\n }\n } else if (auth.type === \"headers\") {\n for (const [k, v] of Object.entries(auth.headers)) {\n headers[k.toLowerCase()] = v;\n }\n // Check if any required env vars for headers are missing\n for (const [k, envName] of Object.entries(auth.headersEnv)) {\n if (!process.env[envName]) {\n console.warn(`[MCP] ⚠️ Warning: Missing local environment variable \"${envName}\" for header \"${k}\" in server \"${serverName}\". Skipping authenticated introspection.`);\n skipAuth = true;\n }\n }\n }\n }\n\n if (skipAuth) {\n // Clear all headers if auth is broken\n for (const k in headers) delete headers[k];\n }\n\n servers[serverName] = {\n transport,\n url: url.trim(),\n headers,\n };\n }\n\n return servers;\n}\n\nfunction createRpcPayload(\n id: number | string,\n method: string,\n params?: Record<string, unknown>,\n): Record<string, unknown> {\n if (params) {\n return {\n jsonrpc: \"2.0\",\n id,\n method,\n params,\n };\n }\n\n return {\n jsonrpc: \"2.0\",\n id,\n method,\n };\n}\n\n\nconst MCP_SESSIONS = new Map<string, string>();\n\nasync function postJsonRpc<T>(\n url: string,\n body: Record<string, unknown>,\n protocolVersion: string,\n extraHeaders: Record<string, string> = {},\n): Promise<JsonRpcResponse<T>> {\n const headers: Record<string, string> = {\n ...extraHeaders,\n \"content-type\": \"application/json\",\n accept: \"application/json, text/event-stream\",\n \"MCP-Protocol-Version\": protocolVersion,\n };\n\n const sessionId = MCP_SESSIONS.get(url);\n if (sessionId) {\n headers[\"MCP-Session-Id\"] = sessionId;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n });\n\n const text = await response.text();\n\n if (!response.ok) {\n throw new Error(`Request failed with HTTP ${response.status}: ${text.slice(0, 300)}`);\n }\n\n // Capture session ID from headers if present\n const sessionHeader = response.headers.get(\"mcp-session-id\");\n if (sessionHeader) {\n MCP_SESSIONS.set(url, sessionHeader);\n }\n\n let jsonText = text;\n\n if (text.includes(\"event: message\") && text.includes(\"data: {\")) {\n const lines = text.split(/\\r?\\n/);\n\n if (!sessionHeader) {\n const idLine = lines.find((line) => line.startsWith(\"id: \"));\n if (idLine) {\n const capturedId = idLine.slice(4).trim();\n if (capturedId) {\n MCP_SESSIONS.set(url, capturedId);\n }\n }\n }\n\n const dataLine = lines.find((line) => line.startsWith(\"data: \"));\n if (dataLine) {\n jsonText = dataLine.slice(6).trim();\n }\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(jsonText);\n } catch {\n throw new Error(`Invalid JSON-RPC response payload: ${text.slice(0, 300)}`);\n }\n\n const record = asRecord(parsed);\n if (!record) {\n throw new Error(\"Invalid JSON-RPC response shape.\");\n }\n\n return record as unknown as JsonRpcResponse<T>;\n}\n\nasync function initializeServer(\n url: string,\n headers: Record<string, string>,\n): Promise<string> {\n const initResponse = await postJsonRpc<{ protocolVersion?: string }>(\n url,\n createRpcPayload(1, \"initialize\", {\n protocolVersion: MCP_PROTOCOL_VERSION,\n capabilities: {},\n clientInfo: { name: MCP_CLIENT_NAME, version: \"0.1.0\" },\n }),\n MCP_PROTOCOL_VERSION,\n headers,\n );\n\n if (\"error\" in initResponse) {\n throw new Error(\n `initialize failed (${initResponse.error.code}): ${initResponse.error.message}`,\n );\n }\n\n const negotiatedVersion =\n typeof initResponse.result?.protocolVersion === \"string\"\n ? initResponse.result.protocolVersion\n : MCP_PROTOCOL_VERSION;\n\n await postJsonRpc(\n url,\n {\n jsonrpc: \"2.0\",\n method: \"notifications/initialized\",\n },\n negotiatedVersion,\n headers,\n ).catch(() => {\n });\n\n return negotiatedVersion;\n}\n\nfunction parseToolsFromResponse(value: unknown): {\n tools: McpToolDefinition[];\n nextCursor?: string;\n} {\n const record = asRecord(value);\n if (!record) return { tools: [] };\n\n const nextCursor =\n typeof record.nextCursor === \"string\" ? record.nextCursor : undefined;\n const rawTools = Array.isArray(record.tools) ? record.tools : [];\n\n const tools: McpToolDefinition[] = [];\n for (const item of rawTools) {\n const tool = asRecord(item);\n if (!tool) continue;\n const name = typeof tool.name === \"string\" ? tool.name.trim() : \"\";\n if (!name) continue;\n\n tools.push({\n name,\n inputSchema: tool.inputSchema,\n outputSchema: tool.outputSchema,\n });\n }\n\n return { tools, nextCursor };\n}\n\nasync function fetchServerTools(\n serverName: string,\n config: McpServerConfigInput,\n): Promise<McpServerTypesResult> {\n const warnings: string[] = [];\n\n if (config.transport !== \"sse\") {\n warnings.push(\n `Server \"${serverName}\" uses \"${config.transport}\" transport and was skipped. Only \"sse\" transport is supported.`,\n );\n return {\n serverName,\n transport: config.transport,\n url: config.url,\n tools: [],\n warnings,\n };\n }\n\n const protocolVersion = await initializeServer(config.url, config.headers);\n const tools: McpToolDefinition[] = [];\n\n let cursor: string | undefined;\n let page = 0;\n const seen = new Set<string>();\n\n while (page < 200) {\n const params = cursor ? { cursor } : {};\n const response = await postJsonRpc<{ tools?: unknown[]; nextCursor?: string }>(\n config.url,\n createRpcPayload(`tools-list-${page + 1}`, \"tools/list\", params),\n protocolVersion,\n config.headers,\n );\n\n if (\"error\" in response) {\n throw new Error(\n `tools/list failed (${response.error.code}): ${response.error.message}`,\n );\n }\n\n const parsed = parseToolsFromResponse(response.result);\n for (const tool of parsed.tools) {\n if (seen.has(tool.name)) continue;\n seen.add(tool.name);\n tools.push(tool);\n }\n\n page += 1;\n if (!parsed.nextCursor || parsed.nextCursor === cursor) {\n break;\n }\n cursor = parsed.nextCursor;\n }\n\n if (page >= 200) {\n warnings.push(\n `Server \"${serverName}\" reached the pagination safety limit while listing tools.`,\n );\n }\n\n return {\n serverName,\n transport: config.transport,\n url: config.url,\n tools: tools.sort((a, b) => a.name.localeCompare(b.name)),\n warnings,\n };\n}\n\nfunction isSchemaObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nasync function compileSchemaType(\n schema: unknown,\n typeName: string,\n): Promise<{ declaration: string; warning?: string } | null> {\n if (!isSchemaObject(schema)) return null;\n\n try {\n const declaration = await compile(schema as any, typeName, {\n bannerComment: \"\",\n unreachableDefinitions: true,\n style: {\n semi: true,\n },\n unknownAny: true,\n });\n return { declaration: declaration.trim() };\n } catch (error) {\n return {\n declaration: `export type ${typeName} = unknown;`,\n warning: `Could not compile schema for ${typeName}. Falling back to unknown.`,\n };\n }\n}\n\ninterface CompiledMcpTool {\n name: string;\n inputTypeName: string;\n outputTypeName: string;\n}\n\ninterface CompiledServer {\n result: McpServerTypesResult;\n tools: CompiledMcpTool[];\n}\n\nasync function compileServerToolTypes(\n serverResults: McpServerTypesResult[],\n warnings: string[],\n): Promise<{\n declarations: string[];\n servers: CompiledServer[];\n}> {\n const declarationMap = new Map<string, string>();\n const usedTypeNames = new Set<string>();\n const servers: CompiledServer[] = [];\n\n const reserveTypeName = (baseName: string): string => {\n if (!usedTypeNames.has(baseName)) {\n usedTypeNames.add(baseName);\n return baseName;\n }\n let suffix = 2;\n while (usedTypeNames.has(`${baseName}${suffix}`)) {\n suffix += 1;\n }\n const nextName = `${baseName}${suffix}`;\n usedTypeNames.add(nextName);\n return nextName;\n };\n\n for (const server of serverResults) {\n const tools: CompiledMcpTool[] = [];\n for (const tool of server.tools) {\n const baseName = `${toPascalCase(server.serverName)}${toPascalCase(tool.name)}`;\n const inputTypeName = reserveTypeName(`${baseName}Input`);\n const outputTypeName = reserveTypeName(`${baseName}Output`);\n\n const inputDeclaration = await compileSchemaType(tool.inputSchema, inputTypeName);\n if (inputDeclaration?.declaration) {\n declarationMap.set(inputTypeName, inputDeclaration.declaration);\n } else {\n declarationMap.set(inputTypeName, `export type ${inputTypeName} = unknown;`);\n }\n if (inputDeclaration?.warning) {\n warnings.push(inputDeclaration.warning);\n }\n\n const outputDeclaration = await compileSchemaType(tool.outputSchema, outputTypeName);\n if (outputDeclaration?.declaration) {\n declarationMap.set(outputTypeName, outputDeclaration.declaration);\n } else {\n declarationMap.set(outputTypeName, `export type ${outputTypeName} = unknown;`);\n }\n if (outputDeclaration?.warning) {\n warnings.push(outputDeclaration.warning);\n }\n\n tools.push({\n name: tool.name,\n inputTypeName,\n outputTypeName,\n });\n }\n servers.push({ result: server, tools });\n }\n\n return {\n declarations: Array.from(declarationMap.values()),\n servers,\n };\n}\n\nfunction renderMcpTypes(\n declarations: string[],\n servers: CompiledServer[],\n): string {\n const lines: string[] = [\n \"// 🦋 Kalp Generated MCP Types\",\n \"// This file is auto-generated. Do not edit manually.\",\n \"\",\n \"import \\\"@kalphq/sdk\\\";\",\n \"\",\n ];\n\n if (declarations.length > 0) {\n for (const declaration of declarations) {\n lines.push(declaration.trim());\n lines.push(\"\");\n }\n }\n\n lines.push('declare module \"@kalphq/sdk\" {');\n lines.push(\" interface McpRegistry {\");\n for (const server of servers) {\n lines.push(` ${JSON.stringify(server.result.serverName)}: {`);\n for (const tool of server.tools) {\n lines.push(\n ` ${JSON.stringify(tool.name)}: (input: ${tool.inputTypeName}) => Promise<${tool.outputTypeName}>;`,\n );\n }\n lines.push(\" };\");\n }\n lines.push(\" }\");\n lines.push(\"}\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\nexport class McpTypesGenerator implements ProjectGenerator {\n id = \"mcp\";\n name = \"MCP Types\";\n\n async generate(cwd: string): Promise<GeneratorResult> {\n const generatedDir = join(cwd, \".kalp\", \"generated\");\n const mcpPath = join(generatedDir, \"mcp.d.ts\");\n\n await mkdir(generatedDir, { recursive: true });\n\n const { raw } = await loadProjectConfig(cwd);\n const servers = getServerConfigs(raw);\n const warnings: string[] = [];\n\n const serverResults: McpServerTypesResult[] = [];\n for (const [serverName, config] of Object.entries(servers).sort((a, b) =>\n a[0].localeCompare(b[0]),\n )) {\n try {\n const result = await fetchServerTools(serverName, config);\n serverResults.push(result);\n warnings.push(...result.warnings);\n } catch (error) {\n const message = `Failed to introspect \"${serverName}\" (${config.url}): ${\n error instanceof Error ? error.message : String(error)\n }`;\n warnings.push(message);\n serverResults.push({\n serverName,\n transport: config.transport,\n url: config.url,\n tools: [],\n warnings: [message],\n });\n }\n }\n\n const compiled = await compileServerToolTypes(serverResults, warnings);\n const content = renderMcpTypes(compiled.declarations, compiled.servers);\n\n // Check if update is needed\n const existing = await readFile(mcpPath, \"utf-8\").catch(() => null);\n if (existing === content) {\n return { updated: false, warnings };\n }\n\n await writeFile(mcpPath, content, \"utf-8\");\n return { updated: true, warnings };\n }\n}\n\n/**\n * Legacy export for backward compatibility during refactor.\n * @deprecated Use ProjectSynchronizer instead.\n */\nexport async function generateMcpTypes(\n cwd: string,\n options: { strict?: boolean } = {},\n): Promise<McpGenerateResult> {\n const gen = new McpTypesGenerator();\n const res = await gen.generate(cwd);\n \n return {\n outputPath: join(cwd, \".kalp\", \"generated\", \"mcp.d.ts\"),\n servers: [], // Not fully compatible legacy shape, but fine for now\n warnings: res.warnings || [],\n };\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  generateTypes
4
- } from "./chunk-LPEV4QH2.js";
4
+ } from "./chunk-DXNHT4HF.js";
5
5
  import {
6
6
  isProjectInitialized
7
7
  } from "./chunk-INB3LG6O.js";
@@ -148,4 +148,4 @@ var create_default = defineCommand({
148
148
  export {
149
149
  create_default as default
150
150
  };
151
- //# sourceMappingURL=create-UCJ77P62.js.map
151
+ //# sourceMappingURL=create-ILPQCRA2.js.map
@@ -3,21 +3,22 @@ import {
3
3
  readRemoteAgentPointers,
4
4
  readRemoteAgentsIndex,
5
5
  writeRemoteAgentsIndex
6
- } from "./chunk-5SZMD7E6.js";
6
+ } from "./chunk-TNNBTSDC.js";
7
7
  import {
8
8
  resolveSecretsRuntimeConfigPath
9
- } from "./chunk-IZXCZ3IA.js";
9
+ } from "./chunk-4CPUJ537.js";
10
10
  import "./chunk-INB3LG6O.js";
11
- import {
12
- readProjectState,
13
- writeProjectState
14
- } from "./chunk-XVD3FFOJ.js";
15
11
  import {
16
12
  requireAuth,
17
13
  resolveProvider
18
- } from "./chunk-S3KAVLVM.js";
14
+ } from "./chunk-D53K6UE6.js";
19
15
  import "./chunk-FO24J6XL.js";
16
+ import {
17
+ readProjectState,
18
+ writeProjectState
19
+ } from "./chunk-JXR6TPR5.js";
20
20
  import "./chunk-EXXTCGKR.js";
21
+ import "./chunk-LEKRFM4Q.js";
21
22
 
22
23
  // src/commands/agents/delete.ts
23
24
  import { defineCommand } from "citty";
@@ -142,4 +143,4 @@ var delete_default = defineCommand({
142
143
  export {
143
144
  delete_default as default
144
145
  };
145
- //# sourceMappingURL=delete-QPYVL4OU.js.map
146
+ //# sourceMappingURL=delete-AJFAAGYJ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/agents/delete.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport {\n readRemoteAgentPointers,\n readRemoteAgentsIndex,\n writeRemoteAgentsIndex,\n} from \"@/utils/agents-remote\";\nimport { readProjectState, writeProjectState } from \"@/utils/project-state\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete an agent from remote runtime\",\n },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name to delete from remote runtime\",\n required: true,\n },\n yes: {\n type: \"boolean\",\n alias: \"y\",\n description: \"Skip confirmation\",\n default: false,\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp agents delete -a <agent>`);\n return;\n }\n\n const cwd = process.cwd();\n p.intro(`${LOGO} ${pc.bold(\"kalp agents delete\")}`);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n const spinner = p.spinner();\n spinner.start(\"Loading remote agents\");\n\n try {\n const configPath = await resolveSecretsRuntimeConfigPath(cwd);\n const provider = resolveProvider();\n const [indexEntries, pointers] = await Promise.all([\n readRemoteAgentsIndex(cwd, configPath),\n readRemoteAgentPointers(cwd, configPath),\n ]);\n\n const indexByName = new Map(\n indexEntries.map((entry) => [entry.name, entry]),\n );\n const pointerByName = new Map(\n pointers.map((entry) => [entry.name, entry.hash]),\n );\n const remoteNames = [...new Set([...indexByName.keys(), ...pointerByName.keys()])].sort(\n (a, b) => a.localeCompare(b),\n );\n\n spinner.stop(`Found ${remoteNames.length} remote agents`);\n if (remoteNames.length === 0) {\n p.log.info(pc.dim(\"No remote agents available to delete.\"));\n p.outro(\"Done\");\n return;\n }\n\n const agentName = args.agent?.trim();\n if (!agentName) {\n p.log.error(\n `Agent name is required. Use ${pc.cyan(\"kalp agents delete -a <agent>\")}.`,\n );\n process.exit(1);\n }\n\n if (!remoteNames.includes(agentName)) {\n p.log.error(`Agent ${pc.cyan(agentName)} is not deployed remotely.`);\n process.exit(1);\n }\n\n if (!args.yes) {\n const confirm = await p.confirm({\n message: `Delete ${pc.cyan(agentName)} from remote runtime?`,\n initialValue: false,\n });\n if (p.isCancel(confirm) || !confirm) {\n p.log.info(\"Cancelled.\");\n return;\n }\n }\n\n const hashes = new Set<string>();\n const pointerHash = pointerByName.get(agentName);\n if (pointerHash) hashes.add(pointerHash);\n const indexedHash = indexByName.get(agentName)?.hash;\n if (indexedHash) hashes.add(indexedHash);\n\n spinner.start(`Deleting ${pc.cyan(agentName)} from remote runtime`);\n const latestKey = `${agentName}:latest`;\n await provider\n .deleteValue({ cwd, configPath, key: latestKey })\n .catch(() => null);\n for (const hash of hashes) {\n await provider\n .deleteValue({ cwd, configPath, key: `${agentName}:${hash}` })\n .catch(() => null);\n }\n\n const filteredIndex = indexEntries.filter(\n (entry) => entry.name !== agentName,\n );\n await writeRemoteAgentsIndex(cwd, configPath, filteredIndex);\n\n const state = await readProjectState(cwd);\n if (state?.agents?.[agentName]) {\n state.agents[agentName].lastRemoteHash = null;\n state.agents[agentName].workerUrl = null;\n await writeProjectState(cwd, state);\n }\n\n spinner.stop(`Deleted remote agent ${pc.cyan(agentName)}`);\n p.log.info(\n pc.dim(\n `Local files were not changed. Delete ./agents/${agentName} manually if you no longer need it.`,\n ),\n );\n } catch (error) {\n spinner.stop(\"Failed to delete remote agent\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["spinner","confirm"]}
1
+ {"version":3,"sources":["../src/commands/agents/delete.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport {\n readRemoteAgentPointers,\n readRemoteAgentsIndex,\n writeRemoteAgentsIndex,\n} from \"@/utils/agents-remote\";\nimport { readProjectState, writeProjectState } from \"@/utils/project-state\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete an agent from remote runtime\",\n },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name to delete from remote runtime\",\n required: true,\n },\n yes: {\n type: \"boolean\",\n alias: \"y\",\n description: \"Skip confirmation\",\n default: false,\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp agents delete -a <agent>`);\n return;\n }\n\n const cwd = process.cwd();\n p.intro(`${LOGO} ${pc.bold(\"kalp agents delete\")}`);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n const spinner = p.spinner();\n spinner.start(\"Loading remote agents\");\n\n try {\n const configPath = await resolveSecretsRuntimeConfigPath(cwd);\n const provider = resolveProvider();\n const [indexEntries, pointers] = await Promise.all([\n readRemoteAgentsIndex(cwd, configPath),\n readRemoteAgentPointers(cwd, configPath),\n ]);\n\n const indexByName = new Map(\n indexEntries.map((entry) => [entry.name, entry]),\n );\n const pointerByName = new Map(\n pointers.map((entry) => [entry.name, entry.hash]),\n );\n const remoteNames = [...new Set([...indexByName.keys(), ...pointerByName.keys()])].sort(\n (a, b) => a.localeCompare(b),\n );\n\n spinner.stop(`Found ${remoteNames.length} remote agents`);\n if (remoteNames.length === 0) {\n p.log.info(pc.dim(\"No remote agents available to delete.\"));\n p.outro(\"Done\");\n return;\n }\n\n const agentName = args.agent?.trim();\n if (!agentName) {\n p.log.error(\n `Agent name is required. Use ${pc.cyan(\"kalp agents delete -a <agent>\")}.`,\n );\n process.exit(1);\n }\n\n if (!remoteNames.includes(agentName)) {\n p.log.error(`Agent ${pc.cyan(agentName)} is not deployed remotely.`);\n process.exit(1);\n }\n\n if (!args.yes) {\n const confirm = await p.confirm({\n message: `Delete ${pc.cyan(agentName)} from remote runtime?`,\n initialValue: false,\n });\n if (p.isCancel(confirm) || !confirm) {\n p.log.info(\"Cancelled.\");\n return;\n }\n }\n\n const hashes = new Set<string>();\n const pointerHash = pointerByName.get(agentName);\n if (pointerHash) hashes.add(pointerHash);\n const indexedHash = indexByName.get(agentName)?.hash;\n if (indexedHash) hashes.add(indexedHash);\n\n spinner.start(`Deleting ${pc.cyan(agentName)} from remote runtime`);\n const latestKey = `${agentName}:latest`;\n await provider\n .deleteValue({ cwd, configPath, key: latestKey })\n .catch(() => null);\n for (const hash of hashes) {\n await provider\n .deleteValue({ cwd, configPath, key: `${agentName}:${hash}` })\n .catch(() => null);\n }\n\n const filteredIndex = indexEntries.filter(\n (entry) => entry.name !== agentName,\n );\n await writeRemoteAgentsIndex(cwd, configPath, filteredIndex);\n\n const state = await readProjectState(cwd);\n if (state?.agents?.[agentName]) {\n state.agents[agentName].lastRemoteHash = null;\n state.agents[agentName].workerUrl = null;\n await writeProjectState(cwd, state);\n }\n\n spinner.stop(`Deleted remote agent ${pc.cyan(agentName)}`);\n p.log.info(\n pc.dim(\n `Local files were not changed. Delete ./agents/${agentName} manually if you no longer need it.`,\n ),\n );\n } catch (error) {\n spinner.stop(\"Failed to delete remote agent\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["spinner","confirm"]}
@@ -1,22 +1,23 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- generateTypes
4
- } from "./chunk-LPEV4QH2.js";
5
2
  import {
6
3
  readLocalSecretsFromConfig,
7
4
  writeLocalSecretsToConfig
8
5
  } from "./chunk-YE2SFYAJ.js";
6
+ import {
7
+ generateTypes
8
+ } from "./chunk-DXNHT4HF.js";
9
9
  import {
10
10
  resolveSecretsRuntimeConfigPath
11
- } from "./chunk-IZXCZ3IA.js";
11
+ } from "./chunk-4CPUJ537.js";
12
12
  import "./chunk-INB3LG6O.js";
13
- import "./chunk-XVD3FFOJ.js";
14
13
  import {
15
14
  requireAuth,
16
15
  resolveProvider
17
- } from "./chunk-S3KAVLVM.js";
16
+ } from "./chunk-D53K6UE6.js";
18
17
  import "./chunk-FO24J6XL.js";
18
+ import "./chunk-JXR6TPR5.js";
19
19
  import "./chunk-EXXTCGKR.js";
20
+ import "./chunk-LEKRFM4Q.js";
20
21
 
21
22
  // src/commands/secrets/delete.ts
22
23
  import { defineCommand } from "citty";
@@ -78,17 +79,24 @@ var delete_default = defineCommand({
78
79
  p.outro("Done");
79
80
  return;
80
81
  }
81
- let key = args.key?.trim();
82
+ let key = args._[0]?.trim() || args.key?.trim();
82
83
  if (!key) {
83
- const selected = await p.select({
84
- message: "Select a secret to delete",
85
- options: remoteSecrets.map((secret) => secret.name).sort((a, b) => a.localeCompare(b)).map((name) => ({ value: name, label: name }))
84
+ const input = await p.text({
85
+ message: "Enter the name of the secret to delete",
86
+ placeholder: "STRIPE_SECRET_KEY",
87
+ validate: (v) => {
88
+ if (!v) return "Key is required";
89
+ }
86
90
  });
87
- if (p.isCancel(selected)) {
91
+ if (p.isCancel(input)) {
88
92
  p.outro("Cancelled");
89
93
  return;
90
94
  }
91
- key = String(selected);
95
+ key = String(input).trim();
96
+ }
97
+ if (key.startsWith("KALP_")) {
98
+ p.log.error("Secrets starting with KALP_ are reserved and cannot be deleted.");
99
+ process.exit(1);
92
100
  }
93
101
  const existsRemote = remoteSecrets.some((secret) => secret.name === key);
94
102
  if (!existsRemote) {
@@ -127,4 +135,4 @@ var delete_default = defineCommand({
127
135
  export {
128
136
  delete_default as default
129
137
  };
130
- //# sourceMappingURL=delete-FIXMFFNZ.js.map
138
+ //# sourceMappingURL=delete-IFVGULOA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/secrets/delete.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { generateTypes } from \"@/utils/codegen\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport { readLocalSecretsFromConfig, writeLocalSecretsToConfig } from \"@/utils/secrets-config\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete a secret from remote runtime and local config\",\n },\n args: {\n key: {\n type: \"string\",\n alias: \"k\",\n description: \"Secret key to delete\",\n },\n yes: {\n type: \"boolean\",\n alias: \"y\",\n description: \"Skip confirmation prompt\",\n default: false,\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp secrets delete -k <KEY>`);\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets delete\")}`);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n let configPath: string;\n try {\n configPath = await resolveSecretsRuntimeConfigPath(cwd);\n } catch (error) {\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n const provider = resolveProvider();\n let remoteSecrets;\n try {\n remoteSecrets = await provider.listSecrets({ cwd, configPath });\n } catch (error) {\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n if (!remoteSecrets || remoteSecrets.length === 0) {\n p.log.info(pc.dim(\"No remote secrets to delete.\"));\n p.outro(\"Done\");\n return;\n }\n\n let key = args._[0]?.trim() || args.key?.trim();\n if (!key) {\n const input = await p.text({\n message: \"Enter the name of the secret to delete\",\n placeholder: \"STRIPE_SECRET_KEY\",\n validate: (v) => {\n if (!v) return \"Key is required\";\n },\n });\n if (p.isCancel(input)) {\n p.outro(\"Cancelled\");\n return;\n }\n key = String(input).trim();\n }\n\n if (key.startsWith(\"KALP_\")) {\n p.log.error(\"Secrets starting with KALP_ are reserved and cannot be deleted.\");\n process.exit(1);\n }\n\n const existsRemote = remoteSecrets.some((secret) => secret.name === key);\n if (!existsRemote) {\n p.log.error(`Secret ${pc.cyan(key)} not found in remote runtime.`);\n process.exit(1);\n }\n\n if (!args.yes) {\n const confirmed = await p.confirm({\n message: `Delete ${pc.cyan(key)} from remote runtime and local config?`,\n initialValue: false,\n });\n if (p.isCancel(confirmed) || !confirmed) {\n p.outro(\"Cancelled\");\n return;\n }\n }\n\n const spinner = p.spinner();\n spinner.start(`Deleting ${pc.cyan(key)}`);\n\n try {\n await provider.deleteSecret({ cwd, configPath, name: key });\n const localSecrets = await readLocalSecretsFromConfig(cwd);\n await writeLocalSecretsToConfig(\n cwd,\n localSecrets.filter((secret) => secret !== key),\n );\n await generateTypes(cwd);\n\n spinner.stop(`Secret ${pc.cyan(key)} deleted`);\n p.outro(\"Done\");\n } catch (error) {\n spinner.stop(\"Failed to delete secret\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["spinner"]}
@@ -1,19 +1,22 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ runInitialDeploy
4
+ } from "./chunk-DLUULDXW.js";
2
5
  import {
3
6
  promptDeployTarget,
4
- runInitialDeploy,
5
7
  showKalpCloudWaitlist
6
- } from "./chunk-4CEJYSJY.js";
8
+ } from "./chunk-5YUU3KLB.js";
7
9
  import "./chunk-NV2IZ4XM.js";
8
10
  import {
9
11
  generateTypes
10
- } from "./chunk-LPEV4QH2.js";
11
- import "./chunk-XVD3FFOJ.js";
12
+ } from "./chunk-DXNHT4HF.js";
12
13
  import {
13
14
  requireAuth
14
- } from "./chunk-S3KAVLVM.js";
15
+ } from "./chunk-D53K6UE6.js";
15
16
  import "./chunk-FO24J6XL.js";
17
+ import "./chunk-JXR6TPR5.js";
16
18
  import "./chunk-EXXTCGKR.js";
19
+ import "./chunk-LEKRFM4Q.js";
17
20
 
18
21
  // src/commands/deploy.ts
19
22
  import { defineCommand } from "citty";
@@ -87,4 +90,4 @@ var deploy_default = defineCommand({
87
90
  export {
88
91
  deploy_default as default
89
92
  };
90
- //# sourceMappingURL=deploy-DRZZ3YRB.js.map
93
+ //# sourceMappingURL=deploy-EWYNN3VU.js.map