@kalphq/cli 0.0.0-dev-20260423092034 → 0.0.0-dev-20260505065504

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/index.js CHANGED
@@ -42,7 +42,7 @@ var main = defineCommand({
42
42
  },
43
43
  subCommands: {
44
44
  create: () => import("./create-7J5R6OVF.js").then((r) => r.default),
45
- push: () => import("./push-GXUEZVOW.js").then((r) => r.default),
45
+ push: () => import("./push-MZ55IFSD.js").then((r) => r.default),
46
46
  link: () => import("./link-WZQSR2TM.js").then((r) => r.default),
47
47
  secrets: () => import("./secrets-KFMVBKJQ.js").then((r) => r.default),
48
48
  login: () => import("./login-JYPWGL6P.js").then((r) => r.default),
@@ -5,15 +5,16 @@ import {
5
5
 
6
6
  // src/commands/push.ts
7
7
  import { access as access2 } from "fs/promises";
8
- import { join as join4 } from "path";
8
+ import { join as join3 } from "path";
9
9
  import { defineCommand } from "citty";
10
10
  import * as p2 from "@clack/prompts";
11
11
  import pc from "picocolors";
12
12
 
13
13
  // src/utils/manifest/index.ts
14
- import { access } from "fs/promises";
15
- import { join as join3 } from "path";
16
- import { compileAgent } from "@kalphq/compiler";
14
+ import { access, readFile as readFile2, readdir, rm as rm2, mkdtemp as mkdtemp2 } from "fs/promises";
15
+ import { join as join2 } from "path";
16
+ import { tmpdir } from "os";
17
+ import { buildAgent } from "@kalphq/compiler";
17
18
 
18
19
  // src/utils/manifest/build.ts
19
20
  import { existsSync } from "fs";
@@ -22,8 +23,8 @@ import { join, resolve } from "path";
22
23
  import { pathToFileURL } from "url";
23
24
  import { build } from "esbuild";
24
25
  async function getHash(payload) {
25
- const { createHash: createHash3 } = await import("crypto");
26
- return createHash3("sha256").update(payload).digest("hex");
26
+ const { createHash: createHash2 } = await import("crypto");
27
+ return createHash2("sha256").update(payload).digest("hex");
27
28
  }
28
29
  async function loadAgentModule(agentPath, cwd) {
29
30
  const tempDir = await mkdtemp(join(cwd, ".kalp-temp-"));
@@ -94,199 +95,44 @@ async function loadAgentModule(agentPath, cwd) {
94
95
  codeHash
95
96
  };
96
97
  }
97
- async function cleanupTempDir(tempDir) {
98
- await rm(tempDir, { recursive: true, force: true });
99
- }
100
-
101
- // src/utils/manifest/handlers.ts
102
- import { existsSync as existsSync2 } from "fs";
103
- import { mkdtemp as mkdtemp2, rm as rm2, writeFile } from "fs/promises";
104
- import { createHash } from "crypto";
105
- import { basename, join as join2, resolve as resolve2 } from "path";
106
- import { build as build2 } from "esbuild";
107
- function sha256(content) {
108
- return createHash("sha256").update(content).digest("hex");
109
- }
110
- var asRecord = (v) => v != null && typeof v === "object" && !Array.isArray(v) ? v : void 0;
111
- var asString = (v) => typeof v === "string" ? v : void 0;
112
- var asArray = (v) => Array.isArray(v) ? v : [];
113
- function buildWrappers(agentPath, agentConfig) {
114
- const raw = asRecord(agentConfig);
115
- if (!raw) return [];
116
- const wrappers = [];
117
- const escapedPath = agentPath.replace(/\\/g, "/");
118
- if (raw.onMessage != null) {
119
- wrappers.push({
120
- name: "onMessage",
121
- code: `import agent from "${escapedPath}";
122
- export default agent.onMessage;
123
- `
124
- });
125
- }
126
- if (raw.onInit != null) {
127
- wrappers.push({
128
- name: "onInit",
129
- code: `import agent from "${escapedPath}";
130
- export default agent.onInit;
131
- `
132
- });
133
- }
134
- if (raw.onTick != null) {
135
- wrappers.push({
136
- name: "onTick",
137
- code: `import agent from "${escapedPath}";
138
- export default agent.onTick;
139
- `
140
- });
141
- }
142
- for (const step of asArray(raw.steps)) {
143
- const rec = asRecord(step);
144
- const id = rec ? asString(rec.id) : void 0;
145
- if (!id) continue;
146
- const safeName = `steps.${id}`;
147
- wrappers.push({
148
- name: safeName,
149
- code: `import agent from "${escapedPath}";
150
- const _s = Array.isArray(agent.steps) ? agent.steps.find((s) => s.id === "${id}") : null;
151
- export default _s?.run ?? null;
152
- `
153
- });
154
- }
155
- for (const tool of asArray(raw.tools)) {
156
- const rec = asRecord(tool);
157
- const id = rec ? asString(rec.id) : void 0;
158
- if (!id) continue;
159
- const safeName = `tools.${id}`;
160
- wrappers.push({
161
- name: safeName,
162
- code: `import agent from "${escapedPath}";
163
- const _t = Array.isArray(agent.tools) ? agent.tools.find((t) => t.id === "${id}") : null;
164
- export default _t?.execute ?? null;
165
- `
166
- });
167
- }
168
- for (const flow of asArray(raw.flows)) {
169
- const rec = asRecord(flow);
170
- if (!rec) continue;
171
- for (const fs of asArray(rec.steps)) {
172
- const frec = asRecord(fs);
173
- const id = frec ? asString(frec.id) : void 0;
174
- if (!id) continue;
175
- const safeName = `steps.${id}`;
176
- if (wrappers.some((w) => w.name === safeName)) continue;
177
- wrappers.push({
178
- name: safeName,
179
- code: `import agent from "${escapedPath}";
180
- const _s = Array.isArray(agent.steps) ? agent.steps.find((s) => s.id === "${id}") : null;
181
- export default _s?.run ?? null;
182
- `
183
- });
184
- }
185
- }
186
- return wrappers;
187
- }
188
- function makePlugins(cwd) {
189
- return [
190
- {
191
- name: "relative-js-to-ts",
192
- setup(buildCtx) {
193
- buildCtx.onResolve({ filter: /^\.\/.*\.js$/ }, (args) => {
194
- const resolved = resolve2(args.resolveDir, args.path);
195
- if (existsSync2(resolved)) return { path: resolved };
196
- const tsPath = resolved.replace(/\.js$/, ".ts");
197
- if (existsSync2(tsPath)) return { path: tsPath };
198
- const tsxPath = resolved.replace(/\.js$/, ".tsx");
199
- if (existsSync2(tsxPath)) return { path: tsxPath };
200
- return null;
201
- });
202
- }
203
- },
204
- {
205
- name: "tsconfig-paths",
206
- setup(buildCtx) {
207
- buildCtx.onResolve({ filter: /^@\// }, (args) => {
208
- const withoutPrefix = args.path.replace(/^@\//, "");
209
- const resolved = resolve2(cwd, withoutPrefix);
210
- if (existsSync2(resolved)) return { path: resolved };
211
- const tsPath = resolved + ".ts";
212
- if (existsSync2(tsPath)) return { path: tsPath };
213
- const tsxPath = resolved + ".tsx";
214
- if (existsSync2(tsxPath)) return { path: tsxPath };
215
- const indexTsPath = join2(resolved, "index.ts");
216
- if (existsSync2(indexTsPath)) return { path: indexTsPath };
217
- return null;
218
- });
219
- }
220
- }
221
- ];
222
- }
223
- async function extractHandlers(agentPath, agentConfig, cwd) {
224
- const wrappers = buildWrappers(agentPath, agentConfig);
225
- if (wrappers.length === 0) return {};
226
- const tempDir = await mkdtemp2(join2(cwd, ".kalp-handlers-"));
227
- try {
228
- const entryPoints = {};
229
- for (const wrapper of wrappers) {
230
- const safeFileName = wrapper.name.replace(/\./g, "_") + ".ts";
231
- const wrapperPath = join2(tempDir, safeFileName);
232
- await writeFile(wrapperPath, wrapper.code, "utf-8");
233
- entryPoints[wrapper.name] = wrapperPath;
234
- }
235
- const result = await build2({
236
- entryPoints,
237
- bundle: true,
238
- outdir: tempDir,
239
- format: "esm",
240
- platform: "browser",
241
- target: "es2020",
242
- logLevel: "silent",
243
- packages: "external",
244
- splitting: false,
245
- write: false,
246
- plugins: makePlugins(cwd)
247
- });
248
- const handlerMap = {};
249
- for (const outputFile of result.outputFiles) {
250
- const fileName = basename(outputFile.path, ".js");
251
- const wrapper = wrappers.find((w) => w.name === fileName);
252
- if (!wrapper) continue;
253
- const code = outputFile.text;
254
- handlerMap[wrapper.name] = {
255
- name: wrapper.name,
256
- code,
257
- hash: sha256(code),
258
- size: outputFile.contents.byteLength
259
- };
260
- }
261
- return handlerMap;
262
- } finally {
263
- await rm2(tempDir, { recursive: true, force: true });
264
- }
265
- }
266
98
 
267
99
  // src/utils/ir/hashIR.ts
268
- import { createHash as createHash2 } from "crypto";
100
+ import { createHash } from "crypto";
269
101
  import stableStringify from "json-stable-stringify";
270
102
  function computePushHash(ir, handlers) {
271
103
  const sortedHandlerHashes = Object.keys(handlers).sort().map((k) => handlers[k].hash).join("|");
272
- const bundleHash = createHash2("sha256").update(sortedHandlerHashes).digest("hex");
104
+ const bundleHash = createHash("sha256").update(sortedHandlerHashes).digest("hex");
273
105
  const payload = stableStringify({ ir, bundleHash }) ?? JSON.stringify({ ir, bundleHash });
274
- return createHash2("sha256").update(payload).digest("hex");
106
+ return createHash("sha256").update(payload).digest("hex");
275
107
  }
276
108
 
277
109
  // src/utils/manifest/index.ts
278
110
  async function readAgentManifest(params) {
279
111
  const { cwd, agentName } = params;
280
- const agentPath = join3(cwd, "agents", agentName, "index.ts");
112
+ const agentPath = join2(cwd, "agents", agentName, "index.ts");
281
113
  await access(agentPath);
282
- let tempDir;
114
+ const tempOutDir = await mkdtemp2(join2(tmpdir(), "kalp-build-"));
283
115
  try {
116
+ await buildAgent(agentPath, tempOutDir);
117
+ const irContent = await readFile2(join2(tempOutDir, "ir.json"), "utf-8");
118
+ const ir = JSON.parse(irContent);
119
+ const handlersDir = join2(tempOutDir, "handlers");
120
+ const handlerFiles = await readdir(handlersDir);
121
+ const handlers = {};
122
+ for (const file of handlerFiles) {
123
+ if (!file.endsWith(".js")) continue;
124
+ const code = await readFile2(join2(handlersDir, file), "utf-8");
125
+ const parts = file.split(".");
126
+ const name = parts[0];
127
+ const hash = parts[1] || "no-hash";
128
+ handlers[file] = {
129
+ name: file,
130
+ code,
131
+ hash,
132
+ size: Buffer.byteLength(code)
133
+ };
134
+ }
284
135
  const loaded = await loadAgentModule(agentPath, cwd);
285
- tempDir = loaded.tempDir;
286
- const [ir, handlers] = await Promise.all([
287
- compileAgent(loaded.agent),
288
- extractHandlers(agentPath, loaded.agent, cwd)
289
- ]);
290
136
  return {
291
137
  format: "kalp-agent-manifest",
292
138
  schemaVersion: 2,
@@ -298,9 +144,7 @@ async function readAgentManifest(params) {
298
144
  }
299
145
  };
300
146
  } finally {
301
- if (tempDir) {
302
- await cleanupTempDir(tempDir);
303
- }
147
+ await rm2(tempOutDir, { recursive: true, force: true });
304
148
  }
305
149
  }
306
150
 
@@ -341,7 +185,7 @@ function renderLegacyError(error, showDebug = true) {
341
185
  // package.json
342
186
  var package_default = {
343
187
  name: "@kalphq/cli",
344
- version: "0.0.0-dev-20260423092034",
188
+ version: "0.0.0-dev-20260505065504",
345
189
  description: "Zero-config CLI for deploying Kalp agents",
346
190
  type: "module",
347
191
  license: "MIT",
@@ -453,7 +297,7 @@ var push_default = defineCommand({
453
297
  p2.log.error(`${pc.cyan("kalp.config.ts")} not found`);
454
298
  process.exit(1);
455
299
  }
456
- const agentPath = join4(cwd, "agents", agentName, "index.ts");
300
+ const agentPath = join3(cwd, "agents", agentName, "index.ts");
457
301
  try {
458
302
  await access2(agentPath);
459
303
  } catch {
@@ -496,4 +340,4 @@ var push_default = defineCommand({
496
340
  export {
497
341
  push_default as default
498
342
  };
499
- //# sourceMappingURL=push-GXUEZVOW.js.map
343
+ //# sourceMappingURL=push-MZ55IFSD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/push.ts","../src/utils/manifest/index.ts","../src/utils/manifest/build.ts","../src/utils/ir/hashIR.ts","../src/utils/issues.ts","../package.json"],"sourcesContent":["import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { ensureConfig } from \"@/utils/fs\";\nimport { readAgentManifest, computePushHash } from \"@/utils/manifest\";\nimport { renderLegacyError } from \"@/utils/issues\";\nimport packageJson from \"../../package.json\" with { type: \"json\" };\n\nconst LOGO = \"🦋\";\n\nconst CLI_VERSION: string = packageJson.version;\nconst IS_DEV_VERSION = CLI_VERSION.includes(\"dev\");\nconst CLOUD_API =\n process.env.KALP_CLOUD_URL ||\n (IS_DEV_VERSION ? \"http://localhost:3000\" : \"https://app.usekalp.com\");\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n return `${(bytes / 1024).toFixed(1)} KB`;\n}\n\nfunction printPushResult(\n agentName: string,\n hash: string,\n handlers: Record<string, { size: number }>,\n) {\n const div = pc.dim(\"─\".repeat(48));\n const handlerCount = Object.keys(handlers).length;\n const totalSize = Object.values(handlers).reduce((sum, h) => sum + h.size, 0);\n\n console.log(\"\\n\" + div);\n console.log(pc.green(\"✔ Deployed\"));\n console.log(\"\");\n console.log(` ${pc.bold(agentName)} ${pc.dim(hash.slice(0, 7))}...`);\n console.log(\n ` ${pc.dim(String(handlerCount))} handlers · ${formatBytes(totalSize)}`,\n );\n console.log(div + \"\\n\");\n}\n\nfunction printPushError(\n phase: string,\n errors: string[],\n blockers?: string[],\n verbose?: boolean,\n) {\n const div = pc.dim(\"─\".repeat(48));\n console.log(\"\\n\" + div);\n\n // Use DX-first rendering for all errors\n for (const e of errors) {\n console.log(renderLegacyError(e, verbose));\n console.log(\"\"); // Empty line between errors\n }\n\n if (phase === \"analysis\" && blockers) {\n for (const b of blockers) {\n console.log(pc.red(`✘ Blocker: ${b}`));\n }\n }\n\n if (!verbose) {\n console.log(pc.dim(`\\nRun with --verbose for more details.\\n`));\n }\n\n console.log(div + \"\\n\");\n}\n\nexport default defineCommand({\n meta: { name: \"push\", description: \"Push agent to Kalp cloud\" },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name to push\",\n required: false,\n },\n verbose: {\n type: \"boolean\",\n alias: \"v\",\n description: \"Show debug information\",\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n const agentName = args.agent;\n\n p.intro(`${LOGO} ${pc.bold(\"kalp push\")}`);\n\n if (!agentName) {\n p.log.error(`Missing required flag ${pc.cyan(\"-a <agent-name>\")}`);\n process.exit(1);\n }\n\n try {\n await ensureConfig(cwd);\n } catch {\n p.log.error(`${pc.cyan(\"kalp.config.ts\")} not found`);\n process.exit(1);\n }\n\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n try {\n await access(agentPath);\n } catch {\n p.log.error(`Agent ${pc.cyan(agentName)} not found`);\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(`Compiling ${pc.cyan(agentName)}`);\n\n const manifest = await readAgentManifest({ cwd, agentName });\n const hash = computePushHash(manifest.ir, manifest.handlers);\n\n s.stop(\n `Compiled ${pc.cyan(agentName)} — ${Object.keys(manifest.handlers).length} handlers`,\n );\n s.start(`Pushing to cloud`);\n\n const response = await fetch(`${CLOUD_API}/api/agents/push`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n agentName,\n ir: manifest.ir,\n hash,\n bundle: { handlers: manifest.handlers },\n }),\n });\n\n const body = (await response.json().catch(() => null)) as Record<\n string,\n unknown\n > | null;\n\n if (!response.ok) {\n s.stop(pc.red(\"Push failed\"));\n const phase = (body?.phase as string) ?? \"unknown\";\n const errors = (body?.errors as string[]) ?? [`HTTP ${response.status}`];\n const blockers = body?.blockers as string[] | undefined;\n printPushError(phase, errors, blockers);\n process.exit(1);\n }\n\n s.stop(pc.green(\"Pushed successfully\"));\n printPushResult(agentName, hash, manifest.handlers);\n\n const dashboardUrl = `${CLOUD_API}/a/${agentName}`;\n p.outro(`${LOGO} ${pc.green(\"Agent live at\")} ${pc.cyan(dashboardUrl)}`);\n },\n});\n","// packages/cli/src/utils/manifest/index.ts\nimport { access, readFile, readdir, rm, mkdtemp } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport { buildAgent } from \"@kalphq/compiler\";\nimport { loadAgentModule } from \"@/utils/manifest/build\";\nimport type { AgentManifestV2 } from \"@/utils/manifest/types\";\n\nexport type {\n AgentManifestV2,\n LoadedAgentModule,\n} from \"@/utils/manifest/types\";\nexport type { HandlerMap, HandlerEntry } from \"@/utils/manifest/handlers\";\nexport { computePushHash } from \"@/utils/ir/hashIR\";\n\n/**\n * Reads and compiles an agent into a pushable manifest.\n */\nexport async function readAgentManifest(params: {\n cwd: string;\n agentName: string;\n}): Promise<AgentManifestV2> {\n const { cwd, agentName } = params;\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n await access(agentPath);\n\n // Use a temporary directory for the compiler output\n const tempOutDir = await mkdtemp(join(tmpdir(), \"kalp-build-\"));\n\n try {\n // 1. Build the agent using the official compiler pipeline\n await buildAgent(agentPath, tempOutDir);\n\n // 2. Load the IR generated by the compiler\n const irContent = await readFile(join(tempOutDir, \"ir.json\"), \"utf-8\");\n const ir = JSON.parse(irContent);\n\n // 3. Collect bundled handlers\n const handlersDir = join(tempOutDir, \"handlers\");\n const handlerFiles = await readdir(handlersDir);\n const handlers: any = {};\n\n for (const file of handlerFiles) {\n if (!file.endsWith(\".js\")) continue;\n const code = await readFile(join(handlersDir, file), \"utf-8\");\n \n // Filename format: name.hash.js\n const parts = file.split(\".\");\n const name = parts[0];\n const hash = parts[1] || \"no-hash\";\n\n handlers[file] = {\n name: file,\n code,\n hash,\n size: Buffer.byteLength(code),\n };\n }\n\n // 4. Also load the module to get the codeHash (for legacy reasons)\n const loaded = await loadAgentModule(agentPath, cwd);\n\n return {\n format: \"kalp-agent-manifest\",\n schemaVersion: 2,\n codeHash: loaded.codeHash,\n ir,\n handlers,\n metadata: {\n generatedAt: new Date().toISOString(),\n },\n };\n } finally {\n // Cleanup temp build directory\n await rm(tempOutDir, { recursive: true, force: true });\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdtemp, readFile, rm } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { build } from \"esbuild\";\nimport type { LoadedAgentModule } from \"@/utils/manifest/types\";\n\nasync function getHash(payload: string): Promise<string> {\n const { createHash } = await import(\"node:crypto\");\n return createHash(\"sha256\").update(payload).digest(\"hex\");\n}\n\nexport async function loadAgentModule(\n agentPath: string,\n cwd: string,\n): Promise<LoadedAgentModule> {\n const tempDir = await mkdtemp(join(cwd, \".kalp-temp-\"));\n const outFile = join(tempDir, \"agent.manifest.mjs\");\n\n await build({\n entryPoints: [agentPath],\n outfile: outFile,\n bundle: true,\n format: \"esm\",\n platform: \"node\",\n target: \"node18\",\n logLevel: \"silent\",\n packages: \"external\",\n plugins: [\n {\n name: \"relative-js-to-ts\",\n setup(buildCtx) {\n buildCtx.onResolve({ filter: /^\\.\\/.*\\.js$/ }, (args) => {\n const resolved = resolve(args.resolveDir, args.path);\n if (existsSync(resolved)) {\n return { path: resolved };\n }\n\n const tsPath = resolved.replace(/\\.js$/, \".ts\");\n if (existsSync(tsPath)) {\n return { path: tsPath };\n }\n\n const tsxPath = resolved.replace(/\\.js$/, \".tsx\");\n if (existsSync(tsxPath)) {\n return { path: tsxPath };\n }\n\n return null;\n });\n },\n },\n {\n name: \"tsconfig-paths\",\n setup(buildCtx) {\n buildCtx.onResolve({ filter: /^@\\// }, (args) => {\n const withoutPrefix = args.path.replace(/^@\\//, \"\");\n const resolved = resolve(cwd, withoutPrefix);\n\n if (existsSync(resolved)) {\n return { path: resolved };\n }\n\n const tsPath = resolved + \".ts\";\n if (existsSync(tsPath)) {\n return { path: tsPath };\n }\n\n const tsxPath = resolved + \".tsx\";\n if (existsSync(tsxPath)) {\n return { path: tsxPath };\n }\n\n const indexTsPath = join(resolved, \"index.ts\");\n if (existsSync(indexTsPath)) {\n return { path: indexTsPath };\n }\n\n return null;\n });\n },\n },\n ],\n });\n\n const loaded = (await import(\n `${pathToFileURL(outFile).href}?t=${Date.now()}`\n )) as { default?: unknown };\n\n const bundledCode = await readFile(outFile, \"utf-8\");\n const codeHash = await getHash(bundledCode);\n\n return {\n agent: loaded.default,\n tempDir,\n codeHash,\n };\n}\n\nexport async function cleanupTempDir(tempDir: string): Promise<void> {\n await rm(tempDir, { recursive: true, force: true });\n}\n","import type { IRGraph } from \"@kalphq/sdk\";\nimport { createHash } from \"crypto\";\nimport stableStringify from \"json-stable-stringify\";\nimport type { HandlerMap } from \"@/utils/manifest/handlers\";\n\nexport function getIRHash(ir: IRGraph): string {\n return createHash(\"sha256\")\n .update(stableStringify(ir) ?? JSON.stringify(ir))\n .digest(\"hex\");\n}\n\nexport function computePushHash(ir: IRGraph, handlers: HandlerMap): string {\n const sortedHandlerHashes = Object.keys(handlers)\n .sort()\n .map((k) => handlers[k]!.hash)\n .join(\"|\");\n const bundleHash = createHash(\"sha256\")\n .update(sortedHandlerHashes)\n .digest(\"hex\");\n const payload =\n stableStringify({ ir, bundleHash }) ?? JSON.stringify({ ir, bundleHash });\n return createHash(\"sha256\").update(payload).digest(\"hex\");\n}\n","import type { ValidationIssue, Severity } from \"@kalphq/compiler\";\nimport p from \"picocolors\";\n\ninterface RenderOptions {\n format?: \"pretty\" | \"json\" | \"minimal\";\n showDebug?: boolean;\n}\n\nconst severityIcons: Record<Severity, string> = {\n error: p.red(\"✘\"),\n warning: p.yellow(\"⚠\"),\n info: p.blue(\"ℹ\"),\n};\n\nconst severityLabels: Record<Severity, string> = {\n error: p.red(\"Error\"),\n warning: p.yellow(\"Warning\"),\n info: p.blue(\"Info\"),\n};\n\nfunction groupByContext(\n issues: ValidationIssue[],\n): Map<string, ValidationIssue[]> {\n const groups = new Map<string, ValidationIssue[]>();\n\n for (const issue of issues) {\n const context = issue.context ?? \"General\";\n const existing = groups.get(context) ?? [];\n existing.push(issue);\n groups.set(context, existing);\n }\n\n return groups;\n}\n\nfunction renderPrettyIssue(issue: ValidationIssue, showDebug: boolean): string {\n const lines: string[] = [];\n\n // Header with icon, severity label, and message\n lines.push(\n `${severityIcons[issue.severity]} ${severityLabels[issue.severity]}: ${p.bold(issue.message)}`,\n );\n\n // Context (location in code)\n if (issue.context) {\n lines.push(p.dim(` Found in: ${issue.context}`));\n }\n if (issue.location) {\n lines.push(p.dim(` Location: ${issue.location}`));\n }\n\n // Empty line before fix\n lines.push(\"\");\n\n // Fix section\n if (issue.fix) {\n lines.push(p.green(\" Fix:\"));\n const fixLines = issue.fix.split(\"\\n\");\n for (const fixLine of fixLines) {\n lines.push(` ${fixLine}`);\n }\n }\n\n // Debug info (optional)\n if (showDebug && issue.debug) {\n lines.push(\"\");\n lines.push(p.dim(` (debug: ${issue.debug})`));\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction renderGroupedIssues(\n issues: ValidationIssue[],\n showDebug: boolean,\n): string {\n const groups = groupByContext(issues);\n const output: string[] = [];\n\n for (const [context, contextIssues] of groups) {\n // Context header\n output.push(p.cyan(p.bold(`→ ${context}`)));\n output.push(\"\");\n\n // Issues in this context\n for (const issue of contextIssues) {\n output.push(renderPrettyIssue(issue, showDebug));\n output.push(\"\"); // Empty line between issues\n }\n }\n\n return output.join(\"\\n\");\n}\n\nfunction renderMinimalIssue(issue: ValidationIssue): string {\n const icon =\n issue.severity === \"error\" ? \"✘\" : issue.severity === \"warning\" ? \"⚠\" : \"ℹ\";\n const context = issue.context ? ` [${issue.context}]` : \"\";\n return `${icon} ${issue.message}${context}`;\n}\n\nexport function renderIssues(\n issues: ValidationIssue[],\n options: RenderOptions = {},\n): string {\n const { format = \"pretty\", showDebug = false } = options;\n\n if (issues.length === 0) {\n return p.green(\"✓ No issues found\");\n }\n\n // Sort by severity: errors first, then warnings, then info\n const sorted = [...issues].sort((a, b) => {\n const severityOrder = { error: 0, warning: 1, info: 2 };\n return severityOrder[a.severity] - severityOrder[b.severity];\n });\n\n switch (format) {\n case \"json\":\n return JSON.stringify(sorted, null, 2);\n\n case \"minimal\":\n return sorted.map(renderMinimalIssue).join(\"\\n\");\n\n case \"pretty\":\n default: {\n const output: string[] = [];\n\n // Summary header\n const errorCount = issues.filter((i) => i.severity === \"error\").length;\n const warningCount = issues.filter(\n (i) => i.severity === \"warning\",\n ).length;\n const infoCount = issues.filter((i) => i.severity === \"info\").length;\n\n if (errorCount > 0) {\n output.push(\n p.red(\n p.bold(`Found ${errorCount} error${errorCount > 1 ? \"s\" : \"\"}`),\n ),\n );\n }\n if (warningCount > 0) {\n output.push(\n p.yellow(`${warningCount} warning${warningCount > 1 ? \"s\" : \"\"}`),\n );\n }\n if (infoCount > 0) {\n output.push(p.blue(`${infoCount} info`));\n }\n output.push(\"\");\n\n // Grouped issues\n output.push(renderGroupedIssues(sorted, showDebug));\n\n return output.join(\"\\n\");\n }\n }\n}\n\n// Render legacy error strings in DX-first format\nexport function renderLegacyError(\n error: string,\n showDebug: boolean = true,\n): string {\n const lines: string[] = [];\n\n // Extract debug info if present\n const debugMatch = error.match(/\\(debug: (.+)\\)$/);\n const debug = debugMatch ? debugMatch[1] : undefined;\n const mainError = debugMatch\n ? error.replace(/\\(debug: .+\\)$/, \"\").trim()\n : error;\n\n lines.push(p.red(p.bold(`✘ ${mainError.split(\"\\n\")[0]}`)));\n\n // Show fix if present in the error\n const fixMatch = mainError.match(/Fix:\\n((?:- .+\\n?)+)/);\n if (fixMatch) {\n lines.push(\"\");\n lines.push(p.green(\" Fix:\"));\n const fixLines = fixMatch[1]?.split(\"\\n\").filter(Boolean) ?? [];\n for (const line of fixLines) {\n lines.push(` ${line.replace(/^- /, \"\")}`);\n }\n }\n\n if (showDebug && debug) {\n lines.push(\"\");\n lines.push(p.dim(` (debug: ${debug})`));\n }\n\n return lines.join(\"\\n\");\n}\n","{\n \"name\": \"@kalphq/cli\",\n \"version\": \"0.0.0-dev-20260505065504\",\n \"description\": \"Zero-config CLI for deploying Kalp agents\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"author\": \"Kalp HQ\",\n \"bin\": {\n \"kalp\": \"./dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"tsc --noEmit\",\n \"prepublishOnly\": \"pnpm build\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"24.4.0\",\n \"@clack/prompts\": \"0.9.1\",\n \"@kalphq/compiler\": \"workspace:*\",\n \"@kalphq/project\": \"workspace:*\",\n \"@kalphq/sdk\": \"workspace:*\",\n \"citty\": \"0.1.6\",\n \"esbuild\": \"0.25.0\",\n \"json-stable-stringify\": \"1.3.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":["access","join","p","readFile","rm","mkdtemp","join","createHash","join","mkdtemp","readFile","rm","join","access"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kalphq/cli",
3
- "version": "0.0.0-dev-20260423092034",
3
+ "version": "0.0.0-dev-20260505065504",
4
4
  "description": "Zero-config CLI for deploying Kalp agents",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -23,9 +23,9 @@
23
23
  "json-stable-stringify": "1.3.0",
24
24
  "picocolors": "1.1.1",
25
25
  "zod": "3.25.76",
26
- "@kalphq/compiler": "0.0.0-dev-20260423092034",
27
- "@kalphq/project": "0.0.0-dev-20260423092034",
28
- "@kalphq/sdk": "0.0.0-dev-20260423092034"
26
+ "@kalphq/compiler": "0.0.0-dev-20260505065504",
27
+ "@kalphq/project": "0.0.0-dev-20260505065504",
28
+ "@kalphq/sdk": "0.0.0-dev-20260505065504"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/json-stable-stringify": "1.2.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/push.ts","../src/utils/manifest/index.ts","../src/utils/manifest/build.ts","../src/utils/manifest/handlers.ts","../src/utils/ir/hashIR.ts","../src/utils/issues.ts","../package.json"],"sourcesContent":["import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { ensureConfig } from \"@/utils/fs\";\nimport { readAgentManifest, computePushHash } from \"@/utils/manifest\";\nimport { renderLegacyError } from \"@/utils/issues\";\nimport packageJson from \"../../package.json\" with { type: \"json\" };\n\nconst LOGO = \"🦋\";\n\nconst CLI_VERSION: string = packageJson.version;\nconst IS_DEV_VERSION = CLI_VERSION.includes(\"dev\");\nconst CLOUD_API =\n process.env.KALP_CLOUD_URL ||\n (IS_DEV_VERSION ? \"http://localhost:3000\" : \"https://app.usekalp.com\");\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n return `${(bytes / 1024).toFixed(1)} KB`;\n}\n\nfunction printPushResult(\n agentName: string,\n hash: string,\n handlers: Record<string, { size: number }>,\n) {\n const div = pc.dim(\"─\".repeat(48));\n const handlerCount = Object.keys(handlers).length;\n const totalSize = Object.values(handlers).reduce((sum, h) => sum + h.size, 0);\n\n console.log(\"\\n\" + div);\n console.log(pc.green(\"✔ Deployed\"));\n console.log(\"\");\n console.log(` ${pc.bold(agentName)} ${pc.dim(hash.slice(0, 7))}...`);\n console.log(\n ` ${pc.dim(String(handlerCount))} handlers · ${formatBytes(totalSize)}`,\n );\n console.log(div + \"\\n\");\n}\n\nfunction printPushError(\n phase: string,\n errors: string[],\n blockers?: string[],\n verbose?: boolean,\n) {\n const div = pc.dim(\"─\".repeat(48));\n console.log(\"\\n\" + div);\n\n // Use DX-first rendering for all errors\n for (const e of errors) {\n console.log(renderLegacyError(e, verbose));\n console.log(\"\"); // Empty line between errors\n }\n\n if (phase === \"analysis\" && blockers) {\n for (const b of blockers) {\n console.log(pc.red(`✘ Blocker: ${b}`));\n }\n }\n\n if (!verbose) {\n console.log(pc.dim(`\\nRun with --verbose for more details.\\n`));\n }\n\n console.log(div + \"\\n\");\n}\n\nexport default defineCommand({\n meta: { name: \"push\", description: \"Push agent to Kalp cloud\" },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name to push\",\n required: false,\n },\n verbose: {\n type: \"boolean\",\n alias: \"v\",\n description: \"Show debug information\",\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n const agentName = args.agent;\n\n p.intro(`${LOGO} ${pc.bold(\"kalp push\")}`);\n\n if (!agentName) {\n p.log.error(`Missing required flag ${pc.cyan(\"-a <agent-name>\")}`);\n process.exit(1);\n }\n\n try {\n await ensureConfig(cwd);\n } catch {\n p.log.error(`${pc.cyan(\"kalp.config.ts\")} not found`);\n process.exit(1);\n }\n\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n try {\n await access(agentPath);\n } catch {\n p.log.error(`Agent ${pc.cyan(agentName)} not found`);\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(`Compiling ${pc.cyan(agentName)}`);\n\n const manifest = await readAgentManifest({ cwd, agentName });\n const hash = computePushHash(manifest.ir, manifest.handlers);\n\n s.stop(\n `Compiled ${pc.cyan(agentName)} — ${Object.keys(manifest.handlers).length} handlers`,\n );\n s.start(`Pushing to cloud`);\n\n const response = await fetch(`${CLOUD_API}/api/agents/push`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n agentName,\n ir: manifest.ir,\n hash,\n bundle: { handlers: manifest.handlers },\n }),\n });\n\n const body = (await response.json().catch(() => null)) as Record<\n string,\n unknown\n > | null;\n\n if (!response.ok) {\n s.stop(pc.red(\"Push failed\"));\n const phase = (body?.phase as string) ?? \"unknown\";\n const errors = (body?.errors as string[]) ?? [`HTTP ${response.status}`];\n const blockers = body?.blockers as string[] | undefined;\n printPushError(phase, errors, blockers);\n process.exit(1);\n }\n\n s.stop(pc.green(\"Pushed successfully\"));\n printPushResult(agentName, hash, manifest.handlers);\n\n const dashboardUrl = `${CLOUD_API}/a/${agentName}`;\n p.outro(`${LOGO} ${pc.green(\"Agent live at\")} ${pc.cyan(dashboardUrl)}`);\n },\n});\n","import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { compileAgent } from \"@kalphq/compiler\";\nimport { loadAgentModule, cleanupTempDir } from \"@/utils/manifest/build\";\nimport { extractHandlers } from \"@/utils/manifest/handlers\";\nimport type { AgentManifestV2 } from \"@/utils/manifest/types\";\nexport type {\n AgentManifestV2,\n LoadedAgentModule,\n} from \"@/utils/manifest/types\";\nexport type { HandlerMap, HandlerEntry } from \"@/utils/manifest/handlers\";\nexport { asRecord, asString, asArray } from \"@/utils/manifest/types\";\nexport { loadAgentModule, cleanupTempDir } from \"@/utils/manifest/build\";\nexport { extractHandlers } from \"@/utils/manifest/handlers\";\nexport { getManifestHash } from \"@/utils/manifest/hash\";\nexport { getIRHash, computePushHash } from \"@/utils/ir/hashIR\";\n\nexport async function readAgentManifest(params: {\n cwd: string;\n agentName: string;\n}): Promise<AgentManifestV2> {\n const { cwd, agentName } = params;\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n await access(agentPath);\n\n let tempDir: string | undefined;\n\n try {\n const loaded = await loadAgentModule(agentPath, cwd);\n tempDir = loaded.tempDir;\n\n const [ir, handlers] = await Promise.all([\n compileAgent(loaded.agent),\n extractHandlers(agentPath, loaded.agent, cwd),\n ]);\n\n return {\n format: \"kalp-agent-manifest\",\n schemaVersion: 2,\n codeHash: loaded.codeHash,\n ir,\n handlers,\n metadata: {\n generatedAt: new Date().toISOString(),\n },\n };\n } finally {\n if (tempDir) {\n await cleanupTempDir(tempDir);\n }\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdtemp, readFile, rm } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { build } from \"esbuild\";\nimport type { LoadedAgentModule } from \"@/utils/manifest/types\";\n\nasync function getHash(payload: string): Promise<string> {\n const { createHash } = await import(\"node:crypto\");\n return createHash(\"sha256\").update(payload).digest(\"hex\");\n}\n\nexport async function loadAgentModule(\n agentPath: string,\n cwd: string,\n): Promise<LoadedAgentModule> {\n const tempDir = await mkdtemp(join(cwd, \".kalp-temp-\"));\n const outFile = join(tempDir, \"agent.manifest.mjs\");\n\n await build({\n entryPoints: [agentPath],\n outfile: outFile,\n bundle: true,\n format: \"esm\",\n platform: \"node\",\n target: \"node18\",\n logLevel: \"silent\",\n packages: \"external\",\n plugins: [\n {\n name: \"relative-js-to-ts\",\n setup(buildCtx) {\n buildCtx.onResolve({ filter: /^\\.\\/.*\\.js$/ }, (args) => {\n const resolved = resolve(args.resolveDir, args.path);\n if (existsSync(resolved)) {\n return { path: resolved };\n }\n\n const tsPath = resolved.replace(/\\.js$/, \".ts\");\n if (existsSync(tsPath)) {\n return { path: tsPath };\n }\n\n const tsxPath = resolved.replace(/\\.js$/, \".tsx\");\n if (existsSync(tsxPath)) {\n return { path: tsxPath };\n }\n\n return null;\n });\n },\n },\n {\n name: \"tsconfig-paths\",\n setup(buildCtx) {\n buildCtx.onResolve({ filter: /^@\\// }, (args) => {\n const withoutPrefix = args.path.replace(/^@\\//, \"\");\n const resolved = resolve(cwd, withoutPrefix);\n\n if (existsSync(resolved)) {\n return { path: resolved };\n }\n\n const tsPath = resolved + \".ts\";\n if (existsSync(tsPath)) {\n return { path: tsPath };\n }\n\n const tsxPath = resolved + \".tsx\";\n if (existsSync(tsxPath)) {\n return { path: tsxPath };\n }\n\n const indexTsPath = join(resolved, \"index.ts\");\n if (existsSync(indexTsPath)) {\n return { path: indexTsPath };\n }\n\n return null;\n });\n },\n },\n ],\n });\n\n const loaded = (await import(\n `${pathToFileURL(outFile).href}?t=${Date.now()}`\n )) as { default?: unknown };\n\n const bundledCode = await readFile(outFile, \"utf-8\");\n const codeHash = await getHash(bundledCode);\n\n return {\n agent: loaded.default,\n tempDir,\n codeHash,\n };\n}\n\nexport async function cleanupTempDir(tempDir: string): Promise<void> {\n await rm(tempDir, { recursive: true, force: true });\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport { basename, join, resolve } from \"node:path\";\nimport { build } from \"esbuild\";\n\nexport interface HandlerEntry {\n name: string;\n code: string;\n hash: string;\n size: number;\n}\n\nexport type HandlerMap = Record<string, HandlerEntry>;\n\nfunction sha256(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nconst asRecord = (v: unknown): Record<string, unknown> | undefined =>\n v != null && typeof v === \"object\" && !Array.isArray(v)\n ? (v as Record<string, unknown>)\n : undefined;\n\nconst asString = (v: unknown): string | undefined =>\n typeof v === \"string\" ? v : undefined;\n\nconst asArray = (v: unknown): unknown[] => (Array.isArray(v) ? v : []);\n\ninterface WrapperSpec {\n name: string;\n code: string;\n}\n\nfunction buildWrappers(agentPath: string, agentConfig: unknown): WrapperSpec[] {\n const raw = asRecord(agentConfig);\n if (!raw) return [];\n\n const wrappers: WrapperSpec[] = [];\n const escapedPath = agentPath.replace(/\\\\/g, \"/\");\n\n if (raw.onMessage != null) {\n wrappers.push({\n name: \"onMessage\",\n code: `import agent from \"${escapedPath}\";\\nexport default agent.onMessage;\\n`,\n });\n }\n\n if (raw.onInit != null) {\n wrappers.push({\n name: \"onInit\",\n code: `import agent from \"${escapedPath}\";\\nexport default agent.onInit;\\n`,\n });\n }\n\n if (raw.onTick != null) {\n wrappers.push({\n name: \"onTick\",\n code: `import agent from \"${escapedPath}\";\\nexport default agent.onTick;\\n`,\n });\n }\n\n for (const step of asArray(raw.steps)) {\n const rec = asRecord(step);\n const id = rec ? asString(rec.id) : undefined;\n if (!id) continue;\n const safeName = `steps.${id}`;\n wrappers.push({\n name: safeName,\n code: `import agent from \"${escapedPath}\";\\nconst _s = Array.isArray(agent.steps) ? agent.steps.find((s) => s.id === \"${id}\") : null;\\nexport default _s?.run ?? null;\\n`,\n });\n }\n\n for (const tool of asArray(raw.tools)) {\n const rec = asRecord(tool);\n const id = rec ? asString(rec.id) : undefined;\n if (!id) continue;\n const safeName = `tools.${id}`;\n wrappers.push({\n name: safeName,\n code: `import agent from \"${escapedPath}\";\\nconst _t = Array.isArray(agent.tools) ? agent.tools.find((t) => t.id === \"${id}\") : null;\\nexport default _t?.execute ?? null;\\n`,\n });\n }\n\n for (const flow of asArray(raw.flows)) {\n const rec = asRecord(flow);\n if (!rec) continue;\n for (const fs of asArray(rec.steps)) {\n const frec = asRecord(fs);\n const id = frec ? asString(frec.id) : undefined;\n if (!id) continue;\n const safeName = `steps.${id}`;\n if (wrappers.some((w) => w.name === safeName)) continue;\n wrappers.push({\n name: safeName,\n code: `import agent from \"${escapedPath}\";\\nconst _s = Array.isArray(agent.steps) ? agent.steps.find((s) => s.id === \"${id}\") : null;\\nexport default _s?.run ?? null;\\n`,\n });\n }\n }\n\n return wrappers;\n}\n\nfunction makePlugins(cwd: string) {\n return [\n {\n name: \"relative-js-to-ts\",\n setup(buildCtx: any) {\n buildCtx.onResolve({ filter: /^\\.\\/.*\\.js$/ }, (args: any) => {\n const resolved = resolve(args.resolveDir, args.path);\n if (existsSync(resolved)) return { path: resolved };\n const tsPath = resolved.replace(/\\.js$/, \".ts\");\n if (existsSync(tsPath)) return { path: tsPath };\n const tsxPath = resolved.replace(/\\.js$/, \".tsx\");\n if (existsSync(tsxPath)) return { path: tsxPath };\n return null;\n });\n },\n },\n {\n name: \"tsconfig-paths\",\n setup(buildCtx: any) {\n buildCtx.onResolve({ filter: /^@\\// }, (args: any) => {\n const withoutPrefix = args.path.replace(/^@\\//, \"\");\n const resolved = resolve(cwd, withoutPrefix);\n if (existsSync(resolved)) return { path: resolved };\n const tsPath = resolved + \".ts\";\n if (existsSync(tsPath)) return { path: tsPath };\n const tsxPath = resolved + \".tsx\";\n if (existsSync(tsxPath)) return { path: tsxPath };\n const indexTsPath = join(resolved, \"index.ts\");\n if (existsSync(indexTsPath)) return { path: indexTsPath };\n return null;\n });\n },\n },\n ];\n}\n\nexport async function extractHandlers(\n agentPath: string,\n agentConfig: unknown,\n cwd: string,\n): Promise<HandlerMap> {\n const wrappers = buildWrappers(agentPath, agentConfig);\n if (wrappers.length === 0) return {};\n\n const tempDir = await mkdtemp(join(cwd, \".kalp-handlers-\"));\n\n try {\n const entryPoints: Record<string, string> = {};\n\n for (const wrapper of wrappers) {\n const safeFileName = wrapper.name.replace(/\\./g, \"_\") + \".ts\";\n const wrapperPath = join(tempDir, safeFileName);\n await writeFile(wrapperPath, wrapper.code, \"utf-8\");\n entryPoints[wrapper.name] = wrapperPath;\n }\n\n const result = await build({\n entryPoints,\n bundle: true,\n outdir: tempDir,\n format: \"esm\",\n platform: \"browser\",\n target: \"es2020\",\n logLevel: \"silent\",\n packages: \"external\",\n splitting: false,\n write: false,\n plugins: makePlugins(cwd),\n });\n\n const handlerMap: HandlerMap = {};\n\n for (const outputFile of result.outputFiles) {\n const fileName = basename(outputFile.path, \".js\");\n const wrapper = wrappers.find((w) => w.name === fileName);\n if (!wrapper) continue;\n\n const code = outputFile.text;\n handlerMap[wrapper.name] = {\n name: wrapper.name,\n code,\n hash: sha256(code),\n size: outputFile.contents.byteLength,\n };\n }\n\n return handlerMap;\n } finally {\n await rm(tempDir, { recursive: true, force: true });\n }\n}\n","import type { IRGraph } from \"@kalphq/sdk\";\nimport { createHash } from \"crypto\";\nimport stableStringify from \"json-stable-stringify\";\nimport type { HandlerMap } from \"@/utils/manifest/handlers\";\n\nexport function getIRHash(ir: IRGraph): string {\n return createHash(\"sha256\")\n .update(stableStringify(ir) ?? JSON.stringify(ir))\n .digest(\"hex\");\n}\n\nexport function computePushHash(ir: IRGraph, handlers: HandlerMap): string {\n const sortedHandlerHashes = Object.keys(handlers)\n .sort()\n .map((k) => handlers[k]!.hash)\n .join(\"|\");\n const bundleHash = createHash(\"sha256\")\n .update(sortedHandlerHashes)\n .digest(\"hex\");\n const payload =\n stableStringify({ ir, bundleHash }) ?? JSON.stringify({ ir, bundleHash });\n return createHash(\"sha256\").update(payload).digest(\"hex\");\n}\n","import type { ValidationIssue, Severity } from \"@kalphq/compiler\";\nimport p from \"picocolors\";\n\ninterface RenderOptions {\n format?: \"pretty\" | \"json\" | \"minimal\";\n showDebug?: boolean;\n}\n\nconst severityIcons: Record<Severity, string> = {\n error: p.red(\"✘\"),\n warning: p.yellow(\"⚠\"),\n info: p.blue(\"ℹ\"),\n};\n\nconst severityLabels: Record<Severity, string> = {\n error: p.red(\"Error\"),\n warning: p.yellow(\"Warning\"),\n info: p.blue(\"Info\"),\n};\n\nfunction groupByContext(\n issues: ValidationIssue[],\n): Map<string, ValidationIssue[]> {\n const groups = new Map<string, ValidationIssue[]>();\n\n for (const issue of issues) {\n const context = issue.context ?? \"General\";\n const existing = groups.get(context) ?? [];\n existing.push(issue);\n groups.set(context, existing);\n }\n\n return groups;\n}\n\nfunction renderPrettyIssue(issue: ValidationIssue, showDebug: boolean): string {\n const lines: string[] = [];\n\n // Header with icon, severity label, and message\n lines.push(\n `${severityIcons[issue.severity]} ${severityLabels[issue.severity]}: ${p.bold(issue.message)}`,\n );\n\n // Context (location in code)\n if (issue.context) {\n lines.push(p.dim(` Found in: ${issue.context}`));\n }\n if (issue.location) {\n lines.push(p.dim(` Location: ${issue.location}`));\n }\n\n // Empty line before fix\n lines.push(\"\");\n\n // Fix section\n if (issue.fix) {\n lines.push(p.green(\" Fix:\"));\n const fixLines = issue.fix.split(\"\\n\");\n for (const fixLine of fixLines) {\n lines.push(` ${fixLine}`);\n }\n }\n\n // Debug info (optional)\n if (showDebug && issue.debug) {\n lines.push(\"\");\n lines.push(p.dim(` (debug: ${issue.debug})`));\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction renderGroupedIssues(\n issues: ValidationIssue[],\n showDebug: boolean,\n): string {\n const groups = groupByContext(issues);\n const output: string[] = [];\n\n for (const [context, contextIssues] of groups) {\n // Context header\n output.push(p.cyan(p.bold(`→ ${context}`)));\n output.push(\"\");\n\n // Issues in this context\n for (const issue of contextIssues) {\n output.push(renderPrettyIssue(issue, showDebug));\n output.push(\"\"); // Empty line between issues\n }\n }\n\n return output.join(\"\\n\");\n}\n\nfunction renderMinimalIssue(issue: ValidationIssue): string {\n const icon =\n issue.severity === \"error\" ? \"✘\" : issue.severity === \"warning\" ? \"⚠\" : \"ℹ\";\n const context = issue.context ? ` [${issue.context}]` : \"\";\n return `${icon} ${issue.message}${context}`;\n}\n\nexport function renderIssues(\n issues: ValidationIssue[],\n options: RenderOptions = {},\n): string {\n const { format = \"pretty\", showDebug = false } = options;\n\n if (issues.length === 0) {\n return p.green(\"✓ No issues found\");\n }\n\n // Sort by severity: errors first, then warnings, then info\n const sorted = [...issues].sort((a, b) => {\n const severityOrder = { error: 0, warning: 1, info: 2 };\n return severityOrder[a.severity] - severityOrder[b.severity];\n });\n\n switch (format) {\n case \"json\":\n return JSON.stringify(sorted, null, 2);\n\n case \"minimal\":\n return sorted.map(renderMinimalIssue).join(\"\\n\");\n\n case \"pretty\":\n default: {\n const output: string[] = [];\n\n // Summary header\n const errorCount = issues.filter((i) => i.severity === \"error\").length;\n const warningCount = issues.filter(\n (i) => i.severity === \"warning\",\n ).length;\n const infoCount = issues.filter((i) => i.severity === \"info\").length;\n\n if (errorCount > 0) {\n output.push(\n p.red(\n p.bold(`Found ${errorCount} error${errorCount > 1 ? \"s\" : \"\"}`),\n ),\n );\n }\n if (warningCount > 0) {\n output.push(\n p.yellow(`${warningCount} warning${warningCount > 1 ? \"s\" : \"\"}`),\n );\n }\n if (infoCount > 0) {\n output.push(p.blue(`${infoCount} info`));\n }\n output.push(\"\");\n\n // Grouped issues\n output.push(renderGroupedIssues(sorted, showDebug));\n\n return output.join(\"\\n\");\n }\n }\n}\n\n// Render legacy error strings in DX-first format\nexport function renderLegacyError(\n error: string,\n showDebug: boolean = true,\n): string {\n const lines: string[] = [];\n\n // Extract debug info if present\n const debugMatch = error.match(/\\(debug: (.+)\\)$/);\n const debug = debugMatch ? debugMatch[1] : undefined;\n const mainError = debugMatch\n ? error.replace(/\\(debug: .+\\)$/, \"\").trim()\n : error;\n\n lines.push(p.red(p.bold(`✘ ${mainError.split(\"\\n\")[0]}`)));\n\n // Show fix if present in the error\n const fixMatch = mainError.match(/Fix:\\n((?:- .+\\n?)+)/);\n if (fixMatch) {\n lines.push(\"\");\n lines.push(p.green(\" Fix:\"));\n const fixLines = fixMatch[1]?.split(\"\\n\").filter(Boolean) ?? [];\n for (const line of fixLines) {\n lines.push(` ${line.replace(/^- /, \"\")}`);\n }\n }\n\n if (showDebug && debug) {\n lines.push(\"\");\n lines.push(p.dim(` (debug: ${debug})`));\n }\n\n return lines.join(\"\\n\");\n}\n","{\n \"name\": \"@kalphq/cli\",\n \"version\": \"0.0.0-dev-20260423092034\",\n \"description\": \"Zero-config CLI for deploying Kalp agents\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"author\": \"Kalp HQ\",\n \"bin\": {\n \"kalp\": \"./dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"tsc --noEmit\",\n \"prepublishOnly\": \"pnpm build\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"24.4.0\",\n \"@clack/prompts\": \"0.9.1\",\n \"@kalphq/compiler\": \"workspace:*\",\n \"@kalphq/project\": \"workspace:*\",\n \"@kalphq/sdk\": \"workspace:*\",\n \"citty\": \"0.1.6\",\n \"esbuild\": \"0.25.0\",\n \"json-stable-stringify\": \"1.3.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":["access","join","p","join","createHash","existsSync","mkdtemp","rm","join","resolve","build","createHash","createHash","join","join","access"]}