@kalphq/cli 0.0.0-dev-20260513145227 → 0.0.0-dev-20260513152102
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.
- package/dist/{add-KTFK7GHV.js → add-YZSIMRPC.js} +3 -4
- package/dist/{add-KTFK7GHV.js.map → add-YZSIMRPC.js.map} +1 -1
- package/dist/{agents-QLWNNAXD.js → agents-WYK6WNQP.js} +3 -4
- package/dist/{agents-QLWNNAXD.js.map → agents-WYK6WNQP.js.map} +1 -1
- package/dist/{chunk-5J2WLD3O.js → chunk-4CEJYSJY.js} +5 -5
- package/dist/chunk-LPEV4QH2.js +208 -0
- package/dist/chunk-LPEV4QH2.js.map +1 -0
- package/dist/{create-265DBQ72.js → create-UCJ77P62.js} +2 -3
- package/dist/{create-265DBQ72.js.map → create-UCJ77P62.js.map} +1 -1
- package/dist/{delete-5RN5RRDK.js → delete-FIXMFFNZ.js} +3 -4
- package/dist/{delete-5RN5RRDK.js.map → delete-FIXMFFNZ.js.map} +1 -1
- package/dist/{delete-AF2GT6S4.js → delete-QPYVL4OU.js} +5 -6
- package/dist/{delete-AF2GT6S4.js.map → delete-QPYVL4OU.js.map} +1 -1
- package/dist/{deploy-RWZFKSHR.js → deploy-DRZZ3YRB.js} +4 -5
- package/dist/{deploy-RWZFKSHR.js.map → deploy-DRZZ3YRB.js.map} +1 -1
- package/dist/{dev-XI5WA3NA.js → dev-5YY6W4WM.js} +2 -3
- package/dist/{dev-XI5WA3NA.js.map → dev-5YY6W4WM.js.map} +1 -1
- package/dist/generate-JW2DMJ3W.js +391 -0
- package/dist/generate-JW2DMJ3W.js.map +1 -0
- package/dist/index.js +12 -10
- package/dist/index.js.map +1 -1
- package/dist/{list-NM727WK3.js → list-FKH4DWCF.js} +2 -3
- package/dist/{list-NM727WK3.js.map → list-FKH4DWCF.js.map} +1 -1
- package/dist/{list-SU5CSX3P.js → list-GZBBOFX5.js} +2 -3
- package/dist/{list-SU5CSX3P.js.map → list-GZBBOFX5.js.map} +1 -1
- package/dist/{login-G3RY64KU.js → login-MGPA2VYV.js} +1 -2
- package/dist/{login-G3RY64KU.js.map → login-MGPA2VYV.js.map} +1 -1
- package/dist/{logout-VVQ6OD4D.js → logout-U5V5K775.js} +1 -2
- package/dist/{logout-VVQ6OD4D.js.map → logout-U5V5K775.js.map} +1 -1
- package/dist/mcp-DRMQYA7E.js +39 -0
- package/dist/mcp-DRMQYA7E.js.map +1 -0
- package/dist/{pull-2ODHRCHG.js → pull-V7QJBVNZ.js} +3 -4
- package/dist/{pull-2ODHRCHG.js.map → pull-V7QJBVNZ.js.map} +1 -1
- package/dist/{push-7DIL7IRB.js → push-P6CKRYT7.js} +8 -9
- package/dist/{push-7DIL7IRB.js.map → push-P6CKRYT7.js.map} +1 -1
- package/dist/{secrets-RNM6LSXT.js → secrets-M43LLCTB.js} +6 -7
- package/dist/{secrets-RNM6LSXT.js.map → secrets-M43LLCTB.js.map} +1 -1
- package/dist/{sync-6EXHV3IT.js → sync-LTBH6DI5.js} +3 -4
- package/dist/{sync-6EXHV3IT.js.map → sync-LTBH6DI5.js.map} +1 -1
- package/package.json +5 -4
- package/dist/chunk-5ATINSVP.js +0 -210904
- package/dist/chunk-5ATINSVP.js.map +0 -1
- package/dist/chunk-ZWE3DS7E.js +0 -39
- package/dist/chunk-ZWE3DS7E.js.map +0 -1
- /package/dist/{chunk-5J2WLD3O.js.map → chunk-4CEJYSJY.js.map} +0 -0
|
@@ -9,14 +9,13 @@ import {
|
|
|
9
9
|
} from "./chunk-NV2IZ4XM.js";
|
|
10
10
|
import {
|
|
11
11
|
generateTypes
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-LPEV4QH2.js";
|
|
13
13
|
import {
|
|
14
14
|
materializeRuntime,
|
|
15
15
|
readLocalAgentNames,
|
|
16
16
|
writeRuntimeAgentsSnapshot
|
|
17
17
|
} from "./chunk-XVD3FFOJ.js";
|
|
18
18
|
import "./chunk-EXXTCGKR.js";
|
|
19
|
-
import "./chunk-ZWE3DS7E.js";
|
|
20
19
|
|
|
21
20
|
// src/commands/dev.ts
|
|
22
21
|
import { watch } from "fs";
|
|
@@ -241,4 +240,4 @@ KALP_RUNTIME_MODE=local
|
|
|
241
240
|
export {
|
|
242
241
|
dev_default as default
|
|
243
242
|
};
|
|
244
|
-
//# sourceMappingURL=dev-
|
|
243
|
+
//# sourceMappingURL=dev-5YY6W4WM.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/dev.ts"],"sourcesContent":["import { watch, type FSWatcher } from \"node:fs\";\nimport { copyFile, mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { execa } from \"execa\";\nimport open from \"open\";\nimport { generateTypes } from \"@/utils/codegen\";\nimport { ensureSecretKey } from \"@/utils/secret\";\nimport { readAgentManifest, computePushHash } from \"@/utils/manifest\";\nimport { validateCompiledIR } from \"@/utils/validate\";\nimport {\n materializeRuntime,\n readLocalAgentNames,\n writeRuntimeAgentsSnapshot,\n} from \"@/utils/runtime\";\n\nconst LOGO = \"🦋\";\nconst LOCAL_MANIFESTS_DIR = \".kalp/runtime/local-manifests\";\nconst HOT_RELOAD_DEBOUNCE_MS = 450;\n\nasync function putLocalManifest(params: {\n cwd: string;\n configPath: string;\n key: string;\n manifestPath: string;\n}): Promise<void> {\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n params.key,\n \"--path\",\n params.manifestPath,\n \"--binding\",\n \"KALP_MANIFESTS\",\n \"--local\",\n \"--config\",\n params.configPath,\n ],\n { cwd: params.cwd },\n );\n}\n\nasync function putLocalValue(params: {\n cwd: string;\n configPath: string;\n key: string;\n value: string;\n}): Promise<void> {\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n params.key,\n params.value,\n \"--binding\",\n \"KALP_MANIFESTS\",\n \"--local\",\n \"--config\",\n params.configPath,\n ],\n { cwd: params.cwd },\n );\n}\n\nasync function syncLocalRuntimeState(params: {\n cwd: string;\n runtimeDir: string;\n configPath: string;\n}): Promise<{ synced: number; failed: string[] }> {\n const { cwd, runtimeDir, configPath } = params;\n await writeRuntimeAgentsSnapshot({ cwd, runtimeDir, mode: \"local\" });\n\n const manifestDir = join(cwd, LOCAL_MANIFESTS_DIR);\n await rm(manifestDir, { recursive: true, force: true });\n await mkdir(manifestDir, { recursive: true });\n\n const agentNames = await readLocalAgentNames(cwd);\n const failed: string[] = [];\n let synced = 0;\n\n for (const agentName of agentNames) {\n try {\n const manifest = await readAgentManifest({ cwd, agentName });\n const hash = computePushHash(manifest.ir);\n const validation = validateCompiledIR({ agentName, ir: manifest.ir, hash });\n if (!validation.ok) {\n const details = (validation.errors ?? []).join(\" | \");\n throw new Error(\n `validation failed (${validation.phase})${details ? `: ${details}` : \"\"}`,\n );\n }\n\n const manifestKey = `${agentName}:${hash}`;\n const latestKey = `${agentName}:latest`;\n const manifestPath = join(manifestDir, `${agentName}-${hash}.json`);\n await writeFile(manifestPath, JSON.stringify(manifest.ir), \"utf-8\");\n\n await putLocalManifest({\n cwd,\n configPath,\n key: manifestKey,\n manifestPath,\n });\n await putLocalValue({\n cwd,\n configPath,\n key: latestKey,\n value: hash,\n });\n synced += 1;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n failed.push(`${agentName}: ${reason}`);\n }\n }\n\n return { synced, failed };\n}\n\nexport default defineCommand({\n meta: { name: \"dev\", description: \"Run Worker + Studio local environment\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp dev\")}`);\n\n await generateTypes(cwd);\n await ensureSecretKey(cwd);\n await copyFile(join(cwd, \".env\"), join(cwd, \".dev.vars\"));\n const devVarsPath = join(cwd, \".dev.vars\");\n const devVarsContent = await readFile(devVarsPath, \"utf-8\");\n const nextDevVars = devVarsContent\n .replace(/^KALP_ENV=.*$/m, \"\")\n .replace(/^KALP_RUNTIME_MODE=.*$/m, \"\")\n .trimEnd();\n await writeFile(\n devVarsPath,\n `${nextDevVars}\\nKALP_ENV=local\\nKALP_RUNTIME_MODE=local\\n`,\n \"utf-8\",\n );\n const runtime = await materializeRuntime(cwd, { mode: \"local\" });\n const initialSync = await syncLocalRuntimeState({\n cwd,\n runtimeDir: runtime.runtimeDir,\n configPath: runtime.wranglerConfigPath,\n });\n if (initialSync.failed.length > 0) {\n for (const failure of initialSync.failed) {\n p.log.warn(`Local sync skipped ${failure}`);\n }\n }\n p.log.info(\n `${pc.dim(\"Local agent runtime synced:\")} ${pc.cyan(String(initialSync.synced))}`,\n );\n\n p.note(\"Starting local runtime (wrangler dev :8787)\");\n\n const backend = execa(\n \"npx\",\n [\n \"wrangler\",\n \"dev\",\n \"--port\",\n \"8787\",\n \"--local\",\n \"--config\",\n runtime.wranglerConfigPath,\n ],\n { cwd, stdio: \"inherit\" },\n );\n\n let hotReloadTimer: NodeJS.Timeout | null = null;\n let hotReloadRunning = false;\n let hotReloadPending = false;\n\n const runHotReloadSync = async () => {\n if (hotReloadRunning) {\n hotReloadPending = true;\n return;\n }\n\n hotReloadRunning = true;\n try {\n const sync = await syncLocalRuntimeState({\n cwd,\n runtimeDir: runtime.runtimeDir,\n configPath: runtime.wranglerConfigPath,\n });\n if (sync.failed.length > 0) {\n p.log.warn(\n `Local hot reload synced ${sync.synced} agents with ${sync.failed.length} warnings.`,\n );\n for (const failure of sync.failed) {\n p.log.warn(`Hot reload skipped ${failure}`);\n }\n } else {\n p.log.info(pc.dim(`Local hot reload synced ${sync.synced} agents.`));\n }\n } finally {\n hotReloadRunning = false;\n if (hotReloadPending) {\n hotReloadPending = false;\n void runHotReloadSync();\n }\n }\n };\n\n const scheduleHotReloadSync = () => {\n if (hotReloadTimer) clearTimeout(hotReloadTimer);\n hotReloadTimer = setTimeout(() => {\n void runHotReloadSync();\n }, HOT_RELOAD_DEBOUNCE_MS);\n };\n\n const watchers: FSWatcher[] = [];\n const watchTargets = [join(cwd, \"agents\"), join(cwd, \".kalp\", \"state.json\")];\n for (const target of watchTargets) {\n try {\n const watcher = watch(\n target,\n target.endsWith(\".json\") ? undefined : { recursive: true },\n () => scheduleHotReloadSync(),\n );\n watchers.push(watcher);\n } catch {\n // Ignore missing targets (e.g. no agents yet)\n }\n }\n\n const shutdown = () => {\n if (hotReloadTimer) {\n clearTimeout(hotReloadTimer);\n hotReloadTimer = null;\n }\n for (const watcher of watchers) {\n watcher.close();\n }\n backend.kill(\"SIGINT\");\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n await delay(2500);\n const studioUrl = \"http://localhost:8787/studio/login\";\n await open(studioUrl);\n p.log.success(`Studio opened at ${pc.cyan(studioUrl)}`);\n\n try {\n await backend;\n } finally {\n shutdown();\n process.off(\"SIGINT\", shutdown);\n process.off(\"SIGTERM\", shutdown);\n }\n },\n});\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/dev.ts"],"sourcesContent":["import { watch, type FSWatcher } from \"node:fs\";\nimport { copyFile, mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { execa } from \"execa\";\nimport open from \"open\";\nimport { generateTypes } from \"@/utils/codegen\";\nimport { ensureSecretKey } from \"@/utils/secret\";\nimport { readAgentManifest, computePushHash } from \"@/utils/manifest\";\nimport { validateCompiledIR } from \"@/utils/validate\";\nimport {\n materializeRuntime,\n readLocalAgentNames,\n writeRuntimeAgentsSnapshot,\n} from \"@/utils/runtime\";\n\nconst LOGO = \"🦋\";\nconst LOCAL_MANIFESTS_DIR = \".kalp/runtime/local-manifests\";\nconst HOT_RELOAD_DEBOUNCE_MS = 450;\n\nasync function putLocalManifest(params: {\n cwd: string;\n configPath: string;\n key: string;\n manifestPath: string;\n}): Promise<void> {\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n params.key,\n \"--path\",\n params.manifestPath,\n \"--binding\",\n \"KALP_MANIFESTS\",\n \"--local\",\n \"--config\",\n params.configPath,\n ],\n { cwd: params.cwd },\n );\n}\n\nasync function putLocalValue(params: {\n cwd: string;\n configPath: string;\n key: string;\n value: string;\n}): Promise<void> {\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n params.key,\n params.value,\n \"--binding\",\n \"KALP_MANIFESTS\",\n \"--local\",\n \"--config\",\n params.configPath,\n ],\n { cwd: params.cwd },\n );\n}\n\nasync function syncLocalRuntimeState(params: {\n cwd: string;\n runtimeDir: string;\n configPath: string;\n}): Promise<{ synced: number; failed: string[] }> {\n const { cwd, runtimeDir, configPath } = params;\n await writeRuntimeAgentsSnapshot({ cwd, runtimeDir, mode: \"local\" });\n\n const manifestDir = join(cwd, LOCAL_MANIFESTS_DIR);\n await rm(manifestDir, { recursive: true, force: true });\n await mkdir(manifestDir, { recursive: true });\n\n const agentNames = await readLocalAgentNames(cwd);\n const failed: string[] = [];\n let synced = 0;\n\n for (const agentName of agentNames) {\n try {\n const manifest = await readAgentManifest({ cwd, agentName });\n const hash = computePushHash(manifest.ir);\n const validation = validateCompiledIR({ agentName, ir: manifest.ir, hash });\n if (!validation.ok) {\n const details = (validation.errors ?? []).join(\" | \");\n throw new Error(\n `validation failed (${validation.phase})${details ? `: ${details}` : \"\"}`,\n );\n }\n\n const manifestKey = `${agentName}:${hash}`;\n const latestKey = `${agentName}:latest`;\n const manifestPath = join(manifestDir, `${agentName}-${hash}.json`);\n await writeFile(manifestPath, JSON.stringify(manifest.ir), \"utf-8\");\n\n await putLocalManifest({\n cwd,\n configPath,\n key: manifestKey,\n manifestPath,\n });\n await putLocalValue({\n cwd,\n configPath,\n key: latestKey,\n value: hash,\n });\n synced += 1;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n failed.push(`${agentName}: ${reason}`);\n }\n }\n\n return { synced, failed };\n}\n\nexport default defineCommand({\n meta: { name: \"dev\", description: \"Run Worker + Studio local environment\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp dev\")}`);\n\n await generateTypes(cwd);\n await ensureSecretKey(cwd);\n await copyFile(join(cwd, \".env\"), join(cwd, \".dev.vars\"));\n const devVarsPath = join(cwd, \".dev.vars\");\n const devVarsContent = await readFile(devVarsPath, \"utf-8\");\n const nextDevVars = devVarsContent\n .replace(/^KALP_ENV=.*$/m, \"\")\n .replace(/^KALP_RUNTIME_MODE=.*$/m, \"\")\n .trimEnd();\n await writeFile(\n devVarsPath,\n `${nextDevVars}\\nKALP_ENV=local\\nKALP_RUNTIME_MODE=local\\n`,\n \"utf-8\",\n );\n const runtime = await materializeRuntime(cwd, { mode: \"local\" });\n const initialSync = await syncLocalRuntimeState({\n cwd,\n runtimeDir: runtime.runtimeDir,\n configPath: runtime.wranglerConfigPath,\n });\n if (initialSync.failed.length > 0) {\n for (const failure of initialSync.failed) {\n p.log.warn(`Local sync skipped ${failure}`);\n }\n }\n p.log.info(\n `${pc.dim(\"Local agent runtime synced:\")} ${pc.cyan(String(initialSync.synced))}`,\n );\n\n p.note(\"Starting local runtime (wrangler dev :8787)\");\n\n const backend = execa(\n \"npx\",\n [\n \"wrangler\",\n \"dev\",\n \"--port\",\n \"8787\",\n \"--local\",\n \"--config\",\n runtime.wranglerConfigPath,\n ],\n { cwd, stdio: \"inherit\" },\n );\n\n let hotReloadTimer: NodeJS.Timeout | null = null;\n let hotReloadRunning = false;\n let hotReloadPending = false;\n\n const runHotReloadSync = async () => {\n if (hotReloadRunning) {\n hotReloadPending = true;\n return;\n }\n\n hotReloadRunning = true;\n try {\n const sync = await syncLocalRuntimeState({\n cwd,\n runtimeDir: runtime.runtimeDir,\n configPath: runtime.wranglerConfigPath,\n });\n if (sync.failed.length > 0) {\n p.log.warn(\n `Local hot reload synced ${sync.synced} agents with ${sync.failed.length} warnings.`,\n );\n for (const failure of sync.failed) {\n p.log.warn(`Hot reload skipped ${failure}`);\n }\n } else {\n p.log.info(pc.dim(`Local hot reload synced ${sync.synced} agents.`));\n }\n } finally {\n hotReloadRunning = false;\n if (hotReloadPending) {\n hotReloadPending = false;\n void runHotReloadSync();\n }\n }\n };\n\n const scheduleHotReloadSync = () => {\n if (hotReloadTimer) clearTimeout(hotReloadTimer);\n hotReloadTimer = setTimeout(() => {\n void runHotReloadSync();\n }, HOT_RELOAD_DEBOUNCE_MS);\n };\n\n const watchers: FSWatcher[] = [];\n const watchTargets = [join(cwd, \"agents\"), join(cwd, \".kalp\", \"state.json\")];\n for (const target of watchTargets) {\n try {\n const watcher = watch(\n target,\n target.endsWith(\".json\") ? undefined : { recursive: true },\n () => scheduleHotReloadSync(),\n );\n watchers.push(watcher);\n } catch {\n // Ignore missing targets (e.g. no agents yet)\n }\n }\n\n const shutdown = () => {\n if (hotReloadTimer) {\n clearTimeout(hotReloadTimer);\n hotReloadTimer = null;\n }\n for (const watcher of watchers) {\n watcher.close();\n }\n backend.kill(\"SIGINT\");\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n await delay(2500);\n const studioUrl = \"http://localhost:8787/studio/login\";\n await open(studioUrl);\n p.log.success(`Studio opened at ${pc.cyan(studioUrl)}`);\n\n try {\n await backend;\n } finally {\n shutdown();\n process.off(\"SIGINT\", shutdown);\n process.off(\"SIGTERM\", shutdown);\n }\n },\n});\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
generateTypes,
|
|
4
|
+
writeMcpTypes
|
|
5
|
+
} from "./chunk-LPEV4QH2.js";
|
|
6
|
+
import {
|
|
7
|
+
loadProjectConfig
|
|
8
|
+
} from "./chunk-EXXTCGKR.js";
|
|
9
|
+
|
|
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
|
+
// src/utils/mcp-codegen.ts
|
|
17
|
+
import { compile } from "json-schema-to-typescript";
|
|
18
|
+
var MCP_CLIENT_NAME = "kalp-cli";
|
|
19
|
+
var MCP_PROTOCOL_VERSION = "2025-06-18";
|
|
20
|
+
function asRecord(value) {
|
|
21
|
+
return value && typeof value === "object" ? value : null;
|
|
22
|
+
}
|
|
23
|
+
function isMcpTransport(value) {
|
|
24
|
+
return value === "sse" || value === "stdio";
|
|
25
|
+
}
|
|
26
|
+
function toPascalCase(value) {
|
|
27
|
+
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
|
+
if (!normalized) return "Generated";
|
|
29
|
+
return /^[0-9]/.test(normalized) ? `N${normalized}` : normalized;
|
|
30
|
+
}
|
|
31
|
+
function getServerConfigs(raw) {
|
|
32
|
+
const mcp = asRecord(raw.mcp);
|
|
33
|
+
if (!mcp) return {};
|
|
34
|
+
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;
|
|
42
|
+
}
|
|
43
|
+
servers[serverName] = {
|
|
44
|
+
transport,
|
|
45
|
+
url: url.trim()
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return servers;
|
|
49
|
+
}
|
|
50
|
+
function createRpcPayload(id, method, params) {
|
|
51
|
+
if (params) {
|
|
52
|
+
return {
|
|
53
|
+
jsonrpc: "2.0",
|
|
54
|
+
id,
|
|
55
|
+
method,
|
|
56
|
+
params
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
jsonrpc: "2.0",
|
|
61
|
+
id,
|
|
62
|
+
method
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
async function postJsonRpc(url, body, protocolVersion) {
|
|
66
|
+
const response = await fetch(url, {
|
|
67
|
+
method: "POST",
|
|
68
|
+
headers: {
|
|
69
|
+
"content-type": "application/json",
|
|
70
|
+
accept: "application/json",
|
|
71
|
+
"MCP-Protocol-Version": protocolVersion
|
|
72
|
+
},
|
|
73
|
+
body: JSON.stringify(body)
|
|
74
|
+
});
|
|
75
|
+
const text = await response.text();
|
|
76
|
+
if (!response.ok) {
|
|
77
|
+
throw new Error(`Request failed with HTTP ${response.status}: ${text.slice(0, 300)}`);
|
|
78
|
+
}
|
|
79
|
+
let parsed;
|
|
80
|
+
try {
|
|
81
|
+
parsed = JSON.parse(text);
|
|
82
|
+
} catch {
|
|
83
|
+
throw new Error(`Invalid JSON-RPC response payload: ${text.slice(0, 300)}`);
|
|
84
|
+
}
|
|
85
|
+
const record = asRecord(parsed);
|
|
86
|
+
if (!record) {
|
|
87
|
+
throw new Error("Invalid JSON-RPC response shape.");
|
|
88
|
+
}
|
|
89
|
+
return record;
|
|
90
|
+
}
|
|
91
|
+
async function initializeServer(url) {
|
|
92
|
+
const initResponse = await postJsonRpc(
|
|
93
|
+
url,
|
|
94
|
+
createRpcPayload(1, "initialize", {
|
|
95
|
+
protocolVersion: MCP_PROTOCOL_VERSION,
|
|
96
|
+
capabilities: {},
|
|
97
|
+
clientInfo: { name: MCP_CLIENT_NAME, version: "0.1.0" }
|
|
98
|
+
}),
|
|
99
|
+
MCP_PROTOCOL_VERSION
|
|
100
|
+
);
|
|
101
|
+
if ("error" in initResponse) {
|
|
102
|
+
throw new Error(
|
|
103
|
+
`initialize failed (${initResponse.error.code}): ${initResponse.error.message}`
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
const negotiatedVersion = typeof initResponse.result?.protocolVersion === "string" ? initResponse.result.protocolVersion : MCP_PROTOCOL_VERSION;
|
|
107
|
+
await postJsonRpc(
|
|
108
|
+
url,
|
|
109
|
+
{
|
|
110
|
+
jsonrpc: "2.0",
|
|
111
|
+
method: "notifications/initialized"
|
|
112
|
+
},
|
|
113
|
+
negotiatedVersion
|
|
114
|
+
).catch(() => {
|
|
115
|
+
});
|
|
116
|
+
return negotiatedVersion;
|
|
117
|
+
}
|
|
118
|
+
function parseToolsFromResponse(value) {
|
|
119
|
+
const record = asRecord(value);
|
|
120
|
+
if (!record) return { tools: [] };
|
|
121
|
+
const nextCursor = typeof record.nextCursor === "string" ? record.nextCursor : void 0;
|
|
122
|
+
const rawTools = Array.isArray(record.tools) ? record.tools : [];
|
|
123
|
+
const tools = [];
|
|
124
|
+
for (const item of rawTools) {
|
|
125
|
+
const tool = asRecord(item);
|
|
126
|
+
if (!tool) continue;
|
|
127
|
+
const name = typeof tool.name === "string" ? tool.name.trim() : "";
|
|
128
|
+
if (!name) continue;
|
|
129
|
+
tools.push({
|
|
130
|
+
name,
|
|
131
|
+
inputSchema: tool.inputSchema,
|
|
132
|
+
outputSchema: tool.outputSchema
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return { tools, nextCursor };
|
|
136
|
+
}
|
|
137
|
+
async function fetchServerTools(serverName, config) {
|
|
138
|
+
const warnings = [];
|
|
139
|
+
if (config.transport !== "sse") {
|
|
140
|
+
warnings.push(
|
|
141
|
+
`Server "${serverName}" uses "${config.transport}" transport and was skipped. Only "sse" transport is supported by kalp mcp generate.`
|
|
142
|
+
);
|
|
143
|
+
return {
|
|
144
|
+
serverName,
|
|
145
|
+
transport: config.transport,
|
|
146
|
+
url: config.url,
|
|
147
|
+
tools: [],
|
|
148
|
+
warnings
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
const protocolVersion = await initializeServer(config.url);
|
|
152
|
+
const tools = [];
|
|
153
|
+
let cursor;
|
|
154
|
+
let page = 0;
|
|
155
|
+
const seen = /* @__PURE__ */ new Set();
|
|
156
|
+
while (page < 200) {
|
|
157
|
+
const params = cursor ? { cursor } : {};
|
|
158
|
+
const response = await postJsonRpc(
|
|
159
|
+
config.url,
|
|
160
|
+
createRpcPayload(`tools-list-${page + 1}`, "tools/list", params),
|
|
161
|
+
protocolVersion
|
|
162
|
+
);
|
|
163
|
+
if ("error" in response) {
|
|
164
|
+
throw new Error(
|
|
165
|
+
`tools/list failed (${response.error.code}): ${response.error.message}`
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
const parsed = parseToolsFromResponse(response.result);
|
|
169
|
+
for (const tool of parsed.tools) {
|
|
170
|
+
if (seen.has(tool.name)) continue;
|
|
171
|
+
seen.add(tool.name);
|
|
172
|
+
tools.push(tool);
|
|
173
|
+
}
|
|
174
|
+
page += 1;
|
|
175
|
+
if (!parsed.nextCursor || parsed.nextCursor === cursor) {
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
cursor = parsed.nextCursor;
|
|
179
|
+
}
|
|
180
|
+
if (page >= 200) {
|
|
181
|
+
warnings.push(
|
|
182
|
+
`Server "${serverName}" reached the pagination safety limit while listing tools.`
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
serverName,
|
|
187
|
+
transport: config.transport,
|
|
188
|
+
url: config.url,
|
|
189
|
+
tools: tools.sort((a, b) => a.name.localeCompare(b.name)),
|
|
190
|
+
warnings
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
function isSchemaObject(value) {
|
|
194
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
195
|
+
}
|
|
196
|
+
async function compileSchemaType(schema, typeName) {
|
|
197
|
+
if (!isSchemaObject(schema)) return null;
|
|
198
|
+
try {
|
|
199
|
+
const declaration = await compile(schema, typeName, {
|
|
200
|
+
bannerComment: "",
|
|
201
|
+
unreachableDefinitions: true,
|
|
202
|
+
style: {
|
|
203
|
+
semi: true
|
|
204
|
+
},
|
|
205
|
+
unknownAny: true
|
|
206
|
+
});
|
|
207
|
+
return { declaration: declaration.trim() };
|
|
208
|
+
} catch (error) {
|
|
209
|
+
return {
|
|
210
|
+
declaration: `export type ${typeName} = unknown;`,
|
|
211
|
+
warning: `Could not compile schema for ${typeName}. Falling back to unknown.`
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
async function compileServerToolTypes(serverResults, warnings) {
|
|
216
|
+
const declarationMap = /* @__PURE__ */ new Map();
|
|
217
|
+
const usedTypeNames = /* @__PURE__ */ new Set();
|
|
218
|
+
const servers = [];
|
|
219
|
+
const reserveTypeName = (baseName) => {
|
|
220
|
+
if (!usedTypeNames.has(baseName)) {
|
|
221
|
+
usedTypeNames.add(baseName);
|
|
222
|
+
return baseName;
|
|
223
|
+
}
|
|
224
|
+
let suffix = 2;
|
|
225
|
+
while (usedTypeNames.has(`${baseName}${suffix}`)) {
|
|
226
|
+
suffix += 1;
|
|
227
|
+
}
|
|
228
|
+
const nextName = `${baseName}${suffix}`;
|
|
229
|
+
usedTypeNames.add(nextName);
|
|
230
|
+
return nextName;
|
|
231
|
+
};
|
|
232
|
+
for (const server of serverResults) {
|
|
233
|
+
const tools = [];
|
|
234
|
+
for (const tool of server.tools) {
|
|
235
|
+
const baseName = `${toPascalCase(server.serverName)}${toPascalCase(tool.name)}`;
|
|
236
|
+
const inputTypeName = reserveTypeName(`${baseName}Input`);
|
|
237
|
+
const outputTypeName = reserveTypeName(`${baseName}Output`);
|
|
238
|
+
const inputDeclaration = await compileSchemaType(tool.inputSchema, inputTypeName);
|
|
239
|
+
if (inputDeclaration?.declaration) {
|
|
240
|
+
declarationMap.set(inputTypeName, inputDeclaration.declaration);
|
|
241
|
+
} else {
|
|
242
|
+
declarationMap.set(inputTypeName, `export type ${inputTypeName} = unknown;`);
|
|
243
|
+
}
|
|
244
|
+
if (inputDeclaration?.warning) {
|
|
245
|
+
warnings.push(inputDeclaration.warning);
|
|
246
|
+
}
|
|
247
|
+
const outputDeclaration = await compileSchemaType(tool.outputSchema, outputTypeName);
|
|
248
|
+
if (outputDeclaration?.declaration) {
|
|
249
|
+
declarationMap.set(outputTypeName, outputDeclaration.declaration);
|
|
250
|
+
} else {
|
|
251
|
+
declarationMap.set(outputTypeName, `export type ${outputTypeName} = unknown;`);
|
|
252
|
+
}
|
|
253
|
+
if (outputDeclaration?.warning) {
|
|
254
|
+
warnings.push(outputDeclaration.warning);
|
|
255
|
+
}
|
|
256
|
+
tools.push({
|
|
257
|
+
name: tool.name,
|
|
258
|
+
inputTypeName,
|
|
259
|
+
outputTypeName
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
servers.push({ result: server, tools });
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
declarations: Array.from(declarationMap.values()),
|
|
266
|
+
servers
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
function renderMcpTypes(declarations, servers) {
|
|
270
|
+
const lines = [
|
|
271
|
+
"// \u{1F98B} Kalp Generated MCP Types",
|
|
272
|
+
"// This file is auto-generated by `kalp mcp generate`.",
|
|
273
|
+
"// Do not edit manually.",
|
|
274
|
+
"",
|
|
275
|
+
'import "@kalphq/sdk";',
|
|
276
|
+
""
|
|
277
|
+
];
|
|
278
|
+
if (declarations.length > 0) {
|
|
279
|
+
for (const declaration of declarations) {
|
|
280
|
+
lines.push(declaration.trim());
|
|
281
|
+
lines.push("");
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
lines.push('declare module "@kalphq/sdk" {');
|
|
285
|
+
lines.push(" interface McpRegistry {");
|
|
286
|
+
for (const server of servers) {
|
|
287
|
+
lines.push(` ${JSON.stringify(server.result.serverName)}: {`);
|
|
288
|
+
for (const tool of server.tools) {
|
|
289
|
+
lines.push(
|
|
290
|
+
` ${JSON.stringify(tool.name)}: (input: ${tool.inputTypeName}) => Promise<${tool.outputTypeName}>;`
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
lines.push(" };");
|
|
294
|
+
}
|
|
295
|
+
lines.push(" }");
|
|
296
|
+
lines.push("}");
|
|
297
|
+
lines.push("");
|
|
298
|
+
return lines.join("\n");
|
|
299
|
+
}
|
|
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);
|
|
316
|
+
}
|
|
317
|
+
warnings.push(message);
|
|
318
|
+
serverResults.push({
|
|
319
|
+
serverName,
|
|
320
|
+
transport: config.transport,
|
|
321
|
+
url: config.url,
|
|
322
|
+
tools: [],
|
|
323
|
+
warnings: [message]
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
const compiled = await compileServerToolTypes(serverResults, warnings);
|
|
328
|
+
const content = renderMcpTypes(compiled.declarations, compiled.servers);
|
|
329
|
+
const outputPath = await writeMcpTypes(cwd2, content);
|
|
330
|
+
return {
|
|
331
|
+
outputPath,
|
|
332
|
+
servers: serverResults,
|
|
333
|
+
warnings
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
|
|
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
|
+
export {
|
|
389
|
+
generate_default as default
|
|
390
|
+
};
|
|
391
|
+
//# sourceMappingURL=generate-JW2DMJ3W.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/mcp/generate.ts","../src/utils/mcp-codegen.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { cwd } from \"node:process\";\nimport { generateMcpTypes } from \"@/utils/mcp-codegen\";\nimport { generateTypes } from \"@/utils/codegen\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"generate\",\n description: \"Generate MCP tool types into .kalp/mcp.types.d.ts\",\n },\n args: {\n strict: {\n type: \"boolean\",\n description: \"Fail when at least one MCP server cannot be introspected\",\n default: false,\n },\n },\n async run({ args }) {\n p.intro(`${LOGO} ${pc.bold(\"kalp mcp generate\")}`);\n const spinner = p.spinner();\n spinner.start(\"Discovering MCP servers and generating types\");\n\n try {\n const projectCwd = cwd();\n await generateTypes(projectCwd);\n const result = await generateMcpTypes(projectCwd, {\n strict: args.strict,\n });\n\n spinner.stop(\"MCP type generation completed\");\n\n if (result.servers.length === 0) {\n p.log.warn(\n \"No MCP servers found in kalp.config.ts. Generated an empty McpRegistry.\",\n );\n } else {\n for (const server of result.servers) {\n p.log.info(\n `${pc.bold(server.serverName)} (${server.transport}) -> ${server.tools.length} tools`,\n );\n }\n }\n\n if (result.warnings.length > 0) {\n p.log.warn(pc.bold(\"Warnings:\"));\n for (const warning of result.warnings) {\n p.log.warn(`- ${warning}`);\n }\n }\n\n p.outro(`Types written to ${pc.cyan(result.outputPath)}`);\n } catch (error) {\n spinner.stop(\"MCP type generation failed\");\n const message = error instanceof Error ? error.message : String(error);\n p.cancel(message);\n process.exitCode = 1;\n }\n },\n});\n","import { writeMcpTypes } from \"@/utils/codegen\";\nimport { loadProjectConfig } from \"@/utils/project-config\";\nimport { compile } from \"json-schema-to-typescript\";\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}\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 isMcpTransport(value: unknown): value is McpTransport {\n return value === \"sse\" || value === \"stdio\";\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 mcp = asRecord(raw.mcp);\n if (!mcp) return {};\n\n const servers: Record<string, McpServerConfigInput> = {};\n for (const [serverName, serverConfigRaw] of Object.entries(mcp)) {\n const serverConfig = asRecord(serverConfigRaw);\n if (!serverConfig) continue;\n\n const transport = serverConfig.transport;\n const url = serverConfig.url;\n if (!isMcpTransport(transport) || typeof url !== \"string\" || !url.trim()) {\n continue;\n }\n\n servers[serverName] = {\n transport,\n url: url.trim(),\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\nasync function postJsonRpc<T>(\n url: string,\n body: Record<string, unknown>,\n protocolVersion: string,\n): Promise<JsonRpcResponse<T>> {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n \"MCP-Protocol-Version\": protocolVersion,\n },\n body: JSON.stringify(body),\n });\n\n const text = await response.text();\n if (!response.ok) {\n throw new Error(`Request failed with HTTP ${response.status}: ${text.slice(0, 300)}`);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\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 JsonRpcResponse<T>;\n}\n\nasync function initializeServer(url: string): 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 );\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 ).catch(() => {\n // Notification failures should not block type generation.\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 by kalp mcp generate.`,\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);\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 );\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 // eslint-disable-next-line no-await-in-loop\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 // eslint-disable-next-line no-await-in-loop\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 by `kalp mcp generate`.\",\n \"// 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 async function generateMcpTypes(\n cwd: string,\n options: { strict?: boolean } = {},\n): Promise<McpGenerateResult> {\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 // eslint-disable-next-line no-await-in-loop\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 if (options.strict) {\n throw new Error(message);\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 const outputPath = await writeMcpTypes(cwd, content);\n\n return {\n outputPath,\n servers: serverResults,\n warnings,\n };\n}\n"],"mappings":"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","names":["cwd","spinner"]}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import "./chunk-ZWE3DS7E.js";
|
|
3
2
|
|
|
4
3
|
// src/index.ts
|
|
5
4
|
import { defineCommand, runMain } from "citty";
|
|
@@ -9,7 +8,7 @@ import pc from "picocolors";
|
|
|
9
8
|
// package.json
|
|
10
9
|
var package_default = {
|
|
11
10
|
name: "@kalphq/cli",
|
|
12
|
-
version: "0.0.0-dev-
|
|
11
|
+
version: "0.0.0-dev-20260513152102",
|
|
13
12
|
description: "Zero-config CLI for deploying Kalp agents",
|
|
14
13
|
type: "module",
|
|
15
14
|
license: "MIT",
|
|
@@ -43,6 +42,7 @@ var package_default = {
|
|
|
43
42
|
execa: "^9.6.1",
|
|
44
43
|
jiti: "^2.6.1",
|
|
45
44
|
jose: "^5.10.0",
|
|
45
|
+
"json-schema-to-typescript": "^15.0.4",
|
|
46
46
|
"json-stable-stringify": "1.3.0",
|
|
47
47
|
open: "^11.0.0",
|
|
48
48
|
picocolors: "1.1.1",
|
|
@@ -64,6 +64,7 @@ var COMMANDS = [
|
|
|
64
64
|
["push", "Upload updated agents"],
|
|
65
65
|
["agents", "List and manage agents"],
|
|
66
66
|
["secrets", "Manage secrets"],
|
|
67
|
+
["mcp", "Generate MCP types"],
|
|
67
68
|
["login", "Sign in to remote runtime"],
|
|
68
69
|
["logout", "Sign out from Kalp"],
|
|
69
70
|
["dev", "Run Worker + Studio locally"]
|
|
@@ -93,14 +94,15 @@ var main = defineCommand({
|
|
|
93
94
|
}
|
|
94
95
|
},
|
|
95
96
|
subCommands: {
|
|
96
|
-
create: () => import("./create-
|
|
97
|
-
deploy: () => import("./deploy-
|
|
98
|
-
push: () => import("./push-
|
|
99
|
-
agents: () => import("./agents-
|
|
100
|
-
secrets: () => import("./secrets-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
97
|
+
create: () => import("./create-UCJ77P62.js").then((r) => r.default),
|
|
98
|
+
deploy: () => import("./deploy-DRZZ3YRB.js").then((r) => r.default),
|
|
99
|
+
push: () => import("./push-P6CKRYT7.js").then((r) => r.default),
|
|
100
|
+
agents: () => import("./agents-WYK6WNQP.js").then((r) => r.default),
|
|
101
|
+
secrets: () => import("./secrets-M43LLCTB.js").then((r) => r.default),
|
|
102
|
+
mcp: () => import("./mcp-DRMQYA7E.js").then((r) => r.default),
|
|
103
|
+
login: () => import("./login-MGPA2VYV.js").then((r) => r.default),
|
|
104
|
+
logout: () => import("./logout-U5V5K775.js").then((r) => r.default),
|
|
105
|
+
dev: () => import("./dev-5YY6W4WM.js").then((r) => r.default)
|
|
104
106
|
},
|
|
105
107
|
run({ args }) {
|
|
106
108
|
const firstArg = process.argv[2];
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport pkg from \"../package.json\";\n\nconst LOGO = \"🦋\";\n\nconst COMMANDS = [\n [\"create\", \"Add a new agent\"],\n [\"deploy\", \"Deploy your agents runtime\"],\n [\"push\", \"Upload updated agents\"],\n [\"agents\", \"List and manage agents\"],\n [\"secrets\", \"Manage secrets\"],\n [\"login\", \"Sign in to remote runtime\"],\n [\"logout\", \"Sign out from Kalp\"],\n [\"dev\", \"Run Worker + Studio locally\"],\n] as const;\n\nfunction printHelp(): void {\n p.log.info(`${pc.bold(\"Usage\")}: kalp <command> [options]`);\n console.log(\"\");\n p.log.info(pc.bold(\"Commands\"));\n\n for (const [name, desc] of COMMANDS) {\n console.log(` ${pc.cyan(name.padEnd(10))}${desc}`);\n }\n\n console.log(\"\");\n p.log.info(`Run ${pc.cyan(\"kalp <command> --help\")} for more info.`);\n}\n\nconst main = defineCommand({\n meta: {\n name: \"kalp\",\n version: pkg.version,\n description: \"🦋 Zero-config agent infrastructure\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n create: () => import(\"./commands/create\").then((r) => r.default),\n deploy: () => import(\"./commands/deploy\").then((r) => r.default),\n push: () => import(\"./commands/push\").then((r) => r.default),\n agents: () => import(\"./commands/agents\").then((r) => r.default),\n secrets: () => import(\"./commands/secrets\").then((r) => r.default),\n login: () => import(\"./commands/login\").then((r) => r.default),\n logout: () => import(\"./commands/logout\").then((r) => r.default),\n dev: () => import(\"./commands/dev\").then((r) => r.default),\n },\n run({ args }) {\n const firstArg = process.argv[2];\n\n if (args.help) {\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n return;\n }\n\n if (firstArg) {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n },\n});\n\nrunMain(main);\n","{\n \"name\": \"@kalphq/cli\",\n \"version\": \"0.0.0-dev-
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport pkg from \"../package.json\";\n\nconst LOGO = \"🦋\";\n\nconst COMMANDS = [\n [\"create\", \"Add a new agent\"],\n [\"deploy\", \"Deploy your agents runtime\"],\n [\"push\", \"Upload updated agents\"],\n [\"agents\", \"List and manage agents\"],\n [\"secrets\", \"Manage secrets\"],\n [\"mcp\", \"Generate MCP types\"],\n [\"login\", \"Sign in to remote runtime\"],\n [\"logout\", \"Sign out from Kalp\"],\n [\"dev\", \"Run Worker + Studio locally\"],\n] as const;\n\nfunction printHelp(): void {\n p.log.info(`${pc.bold(\"Usage\")}: kalp <command> [options]`);\n console.log(\"\");\n p.log.info(pc.bold(\"Commands\"));\n\n for (const [name, desc] of COMMANDS) {\n console.log(` ${pc.cyan(name.padEnd(10))}${desc}`);\n }\n\n console.log(\"\");\n p.log.info(`Run ${pc.cyan(\"kalp <command> --help\")} for more info.`);\n}\n\nconst main = defineCommand({\n meta: {\n name: \"kalp\",\n version: pkg.version,\n description: \"🦋 Zero-config agent infrastructure\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n create: () => import(\"./commands/create\").then((r) => r.default),\n deploy: () => import(\"./commands/deploy\").then((r) => r.default),\n push: () => import(\"./commands/push\").then((r) => r.default),\n agents: () => import(\"./commands/agents\").then((r) => r.default),\n secrets: () => import(\"./commands/secrets\").then((r) => r.default),\n mcp: () => import(\"./commands/mcp\").then((r) => r.default),\n login: () => import(\"./commands/login\").then((r) => r.default),\n logout: () => import(\"./commands/logout\").then((r) => r.default),\n dev: () => import(\"./commands/dev\").then((r) => r.default),\n },\n run({ args }) {\n const firstArg = process.argv[2];\n\n if (args.help) {\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n return;\n }\n\n if (firstArg) {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n },\n});\n\nrunMain(main);\n","{\n \"name\": \"@kalphq/cli\",\n \"version\": \"0.0.0-dev-20260513152102\",\n \"description\": \"Zero-config CLI for deploying Kalp agents\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"author\": \"Kalp HQ\",\n \"bin\": {\n \"kalp\": \"./dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup && pnpm run build:studio && pnpm run build:runtime-template\",\n \"build:studio\": \"pnpm --filter=@kalphq/studio build\",\n \"build:runtime-template\": \"node ./scripts/prepare-runtime-template.mjs\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"tsc --noEmit\",\n \"prepublishOnly\": \"pnpm build\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"24.4.0\",\n \"@clack/prompts\": \"0.9.1\",\n \"@kalphq/compiler\": \"workspace:*\",\n \"@kalphq/project\": \"workspace:*\",\n \"@kalphq/sdk\": \"workspace:*\",\n \"citty\": \"0.1.6\",\n \"esbuild\": \"0.25.0\",\n \"execa\": \"^9.6.1\",\n \"jiti\": \"^2.6.1\",\n \"jose\": \"^5.10.0\",\n \"json-schema-to-typescript\": \"^15.0.4\",\n \"json-stable-stringify\": \"1.3.0\",\n \"open\": \"^11.0.0\",\n \"picocolors\": \"1.1.1\",\n \"zod\": \"3.25.76\"\n },\n \"devDependencies\": {\n \"@types/json-stable-stringify\": \"1.2.0\",\n \"@types/node\": \"^22.15.3\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.0.0\"\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -6,13 +6,12 @@ import {
|
|
|
6
6
|
resolveSecretsRuntimeConfigPath
|
|
7
7
|
} from "./chunk-IZXCZ3IA.js";
|
|
8
8
|
import "./chunk-INB3LG6O.js";
|
|
9
|
+
import "./chunk-XVD3FFOJ.js";
|
|
9
10
|
import {
|
|
10
11
|
requireAuth
|
|
11
12
|
} from "./chunk-S3KAVLVM.js";
|
|
12
13
|
import "./chunk-FO24J6XL.js";
|
|
13
|
-
import "./chunk-XVD3FFOJ.js";
|
|
14
14
|
import "./chunk-EXXTCGKR.js";
|
|
15
|
-
import "./chunk-ZWE3DS7E.js";
|
|
16
15
|
|
|
17
16
|
// src/commands/agents/list.ts
|
|
18
17
|
import { access, mkdir, readFile, writeFile } from "fs/promises";
|
|
@@ -158,4 +157,4 @@ var list_default = defineCommand({
|
|
|
158
157
|
export {
|
|
159
158
|
list_default as default
|
|
160
159
|
};
|
|
161
|
-
//# sourceMappingURL=list-
|
|
160
|
+
//# sourceMappingURL=list-FKH4DWCF.js.map
|