@kalphq/cli 0.0.0-dev-20260422003724 → 0.0.0-dev-20260423023800

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/{add-LVQAW23G.js → add-KRHLYYTO.js} +4 -3
  2. package/dist/add-KRHLYYTO.js.map +1 -0
  3. package/dist/chunk-INB3LG6O.js +25 -0
  4. package/dist/chunk-INB3LG6O.js.map +1 -0
  5. package/dist/{create-VTJKDUMA.js → create-7J5R6OVF.js} +44 -35
  6. package/dist/create-7J5R6OVF.js.map +1 -0
  7. package/dist/{delete-AFDTCA52.js → delete-47ZP6XRB.js} +4 -3
  8. package/dist/delete-47ZP6XRB.js.map +1 -0
  9. package/dist/index.js +6 -10
  10. package/dist/index.js.map +1 -1
  11. package/dist/{link-YCIA4JJ3.js → link-WZQSR2TM.js} +1 -2
  12. package/dist/{link-YCIA4JJ3.js.map → link-WZQSR2TM.js.map} +1 -1
  13. package/dist/{list-OKKHGKJA.js → list-3ZQIFUOT.js} +1 -2
  14. package/dist/{list-OKKHGKJA.js.map → list-3ZQIFUOT.js.map} +1 -1
  15. package/dist/{login-SIKUBDGO.js → login-JYPWGL6P.js} +1 -2
  16. package/dist/{login-SIKUBDGO.js.map → login-JYPWGL6P.js.map} +1 -1
  17. package/dist/{logout-OJM3VAOF.js → logout-V67DZZXO.js} +1 -2
  18. package/dist/{logout-OJM3VAOF.js.map → logout-V67DZZXO.js.map} +1 -1
  19. package/dist/push-OYGYU55M.js +434 -0
  20. package/dist/push-OYGYU55M.js.map +1 -0
  21. package/dist/{secrets-PXU3BYSN.js → secrets-KFMVBKJQ.js} +5 -6
  22. package/dist/{secrets-PXU3BYSN.js.map → secrets-KFMVBKJQ.js.map} +1 -1
  23. package/dist/{sync-HEIRRPCA.js → sync-YFM5P3IS.js} +1 -2
  24. package/dist/{sync-HEIRRPCA.js.map → sync-YFM5P3IS.js.map} +1 -1
  25. package/package.json +7 -5
  26. package/dist/acorn-I3UGQPDC.js +0 -3132
  27. package/dist/acorn-I3UGQPDC.js.map +0 -1
  28. package/dist/add-LVQAW23G.js.map +0 -1
  29. package/dist/angular-5QCYWYQS.js +0 -3032
  30. package/dist/angular-5QCYWYQS.js.map +0 -1
  31. package/dist/babel-VVMWCS4G.js +0 -7298
  32. package/dist/babel-VVMWCS4G.js.map +0 -1
  33. package/dist/chunk-2H7UOFLK.js +0 -11
  34. package/dist/chunk-2H7UOFLK.js.map +0 -1
  35. package/dist/chunk-3DCOV57B.js +0 -19947
  36. package/dist/chunk-3DCOV57B.js.map +0 -1
  37. package/dist/chunk-TMVNFUDA.js +0 -452
  38. package/dist/chunk-TMVNFUDA.js.map +0 -1
  39. package/dist/chunk-TPTPZH2W.js +0 -40
  40. package/dist/chunk-TPTPZH2W.js.map +0 -1
  41. package/dist/create-VTJKDUMA.js.map +0 -1
  42. package/dist/delete-AFDTCA52.js.map +0 -1
  43. package/dist/estree-3QNQSWX3.js +0 -4614
  44. package/dist/estree-3QNQSWX3.js.map +0 -1
  45. package/dist/flow-CCY52CGJ.js +0 -27548
  46. package/dist/flow-CCY52CGJ.js.map +0 -1
  47. package/dist/glimmer-WEH5BTZ2.js +0 -2896
  48. package/dist/glimmer-WEH5BTZ2.js.map +0 -1
  49. package/dist/graphql-UERTLN2S.js +0 -1268
  50. package/dist/graphql-UERTLN2S.js.map +0 -1
  51. package/dist/html-2G7A573F.js +0 -2928
  52. package/dist/html-2G7A573F.js.map +0 -1
  53. package/dist/init-O2XMITQ6.js +0 -73
  54. package/dist/init-O2XMITQ6.js.map +0 -1
  55. package/dist/markdown-XILCBMG4.js +0 -3553
  56. package/dist/markdown-XILCBMG4.js.map +0 -1
  57. package/dist/meriyah-THC5AUEQ.js +0 -2686
  58. package/dist/meriyah-THC5AUEQ.js.map +0 -1
  59. package/dist/migrate-CIEU36X6.js +0 -94
  60. package/dist/migrate-CIEU36X6.js.map +0 -1
  61. package/dist/postcss-WBGWHY5F.js +0 -5082
  62. package/dist/postcss-WBGWHY5F.js.map +0 -1
  63. package/dist/push-Y57MBTBB.js +0 -81
  64. package/dist/push-Y57MBTBB.js.map +0 -1
  65. package/dist/typescript-NS3CY6IL.js +0 -13205
  66. package/dist/typescript-NS3CY6IL.js.map +0 -1
  67. package/dist/yaml-2RE4A77K.js +0 -4226
  68. package/dist/yaml-2RE4A77K.js.map +0 -1
  69. package/templates/project/meta/snapshot.json +0 -1
  70. package/templates/project/package.json +0 -16
  71. package/templates/project/tsconfig.json +0 -18
@@ -0,0 +1,434 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ensureConfig
4
+ } from "./chunk-INB3LG6O.js";
5
+
6
+ // src/commands/push.ts
7
+ import { access as access2 } from "fs/promises";
8
+ import { join as join4 } from "path";
9
+ import { defineCommand } from "citty";
10
+ import * as p from "@clack/prompts";
11
+ import pc from "picocolors";
12
+
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";
17
+
18
+ // src/utils/manifest/build.ts
19
+ import { existsSync } from "fs";
20
+ import { mkdtemp, readFile, rm } from "fs/promises";
21
+ import { join, resolve } from "path";
22
+ import { pathToFileURL } from "url";
23
+ import { build } from "esbuild";
24
+ async function getHash(payload) {
25
+ const { createHash: createHash3 } = await import("crypto");
26
+ return createHash3("sha256").update(payload).digest("hex");
27
+ }
28
+ async function loadAgentModule(agentPath, cwd) {
29
+ const tempDir = await mkdtemp(join(cwd, ".kalp-temp-"));
30
+ const outFile = join(tempDir, "agent.manifest.mjs");
31
+ await build({
32
+ entryPoints: [agentPath],
33
+ outfile: outFile,
34
+ bundle: true,
35
+ format: "esm",
36
+ platform: "node",
37
+ target: "node18",
38
+ logLevel: "silent",
39
+ packages: "external",
40
+ plugins: [
41
+ {
42
+ name: "relative-js-to-ts",
43
+ setup(buildCtx) {
44
+ buildCtx.onResolve({ filter: /^\.\/.*\.js$/ }, (args) => {
45
+ const resolved = resolve(args.resolveDir, args.path);
46
+ if (existsSync(resolved)) {
47
+ return { path: resolved };
48
+ }
49
+ const tsPath = resolved.replace(/\.js$/, ".ts");
50
+ if (existsSync(tsPath)) {
51
+ return { path: tsPath };
52
+ }
53
+ const tsxPath = resolved.replace(/\.js$/, ".tsx");
54
+ if (existsSync(tsxPath)) {
55
+ return { path: tsxPath };
56
+ }
57
+ return null;
58
+ });
59
+ }
60
+ },
61
+ {
62
+ name: "tsconfig-paths",
63
+ setup(buildCtx) {
64
+ buildCtx.onResolve({ filter: /^@\// }, (args) => {
65
+ const withoutPrefix = args.path.replace(/^@\//, "");
66
+ const resolved = resolve(cwd, withoutPrefix);
67
+ if (existsSync(resolved)) {
68
+ return { path: resolved };
69
+ }
70
+ const tsPath = resolved + ".ts";
71
+ if (existsSync(tsPath)) {
72
+ return { path: tsPath };
73
+ }
74
+ const tsxPath = resolved + ".tsx";
75
+ if (existsSync(tsxPath)) {
76
+ return { path: tsxPath };
77
+ }
78
+ const indexTsPath = join(resolved, "index.ts");
79
+ if (existsSync(indexTsPath)) {
80
+ return { path: indexTsPath };
81
+ }
82
+ return null;
83
+ });
84
+ }
85
+ }
86
+ ]
87
+ });
88
+ const loaded = await import(`${pathToFileURL(outFile).href}?t=${Date.now()}`);
89
+ const bundledCode = await readFile(outFile, "utf-8");
90
+ const codeHash = await getHash(bundledCode);
91
+ return {
92
+ agent: loaded.default,
93
+ tempDir,
94
+ codeHash
95
+ };
96
+ }
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
+ format: "esm",
239
+ platform: "browser",
240
+ target: "es2020",
241
+ logLevel: "silent",
242
+ packages: "external",
243
+ splitting: false,
244
+ write: false,
245
+ plugins: makePlugins(cwd)
246
+ });
247
+ const handlerMap = {};
248
+ for (const outputFile of result.outputFiles) {
249
+ const fileName = basename(outputFile.path, ".js");
250
+ const handlerName = fileName.replace(/_/g, ".");
251
+ const wrapper = wrappers.find(
252
+ (w) => w.name.replace(/\./g, "_") === fileName
253
+ );
254
+ if (!wrapper) continue;
255
+ const code = outputFile.text;
256
+ handlerMap[wrapper.name] = {
257
+ name: wrapper.name,
258
+ code,
259
+ hash: sha256(code),
260
+ size: outputFile.contents.byteLength
261
+ };
262
+ }
263
+ return handlerMap;
264
+ } finally {
265
+ await rm2(tempDir, { recursive: true, force: true });
266
+ }
267
+ }
268
+
269
+ // src/utils/ir/hashIR.ts
270
+ import { createHash as createHash2 } from "crypto";
271
+ import stableStringify from "json-stable-stringify";
272
+ function computePushHash(ir, handlers) {
273
+ const sortedHandlerHashes = Object.keys(handlers).sort().map((k) => handlers[k].hash).join("|");
274
+ const bundleHash = createHash2("sha256").update(sortedHandlerHashes).digest("hex");
275
+ const payload = stableStringify({ ir, bundleHash }) ?? JSON.stringify({ ir, bundleHash });
276
+ return createHash2("sha256").update(payload).digest("hex");
277
+ }
278
+
279
+ // src/utils/manifest/index.ts
280
+ async function readAgentManifest(params) {
281
+ const { cwd, agentName } = params;
282
+ const agentPath = join3(cwd, "agents", agentName, "index.ts");
283
+ await access(agentPath);
284
+ let tempDir;
285
+ try {
286
+ const loaded = await loadAgentModule(agentPath, cwd);
287
+ tempDir = loaded.tempDir;
288
+ const [ir, handlers] = await Promise.all([
289
+ compileAgent(loaded.agent),
290
+ extractHandlers(agentPath, loaded.agent, cwd)
291
+ ]);
292
+ return {
293
+ format: "kalp-agent-manifest",
294
+ schemaVersion: 2,
295
+ codeHash: loaded.codeHash,
296
+ ir,
297
+ handlers,
298
+ metadata: {
299
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString()
300
+ }
301
+ };
302
+ } finally {
303
+ if (tempDir) {
304
+ await cleanupTempDir(tempDir);
305
+ }
306
+ }
307
+ }
308
+
309
+ // src/commands/push.ts
310
+ var LOGO = "\u{1F98B}";
311
+ var CLOUD_API = process.env.KALP_CLOUD_URL || "http://localhost:3000";
312
+ function formatBytes(bytes) {
313
+ if (bytes < 1024) return `${bytes} B`;
314
+ return `${(bytes / 1024).toFixed(1)} KB`;
315
+ }
316
+ function printPushResult(agentName, hash, handlers, analysis) {
317
+ const div = pc.dim("\u2500".repeat(48));
318
+ console.log("\n" + div);
319
+ console.log(pc.green("\u2714 Deployed"));
320
+ console.log("");
321
+ console.log(`${pc.bold("agent:")} ${agentName}`);
322
+ console.log(`${pc.bold("hash:")} ${hash.slice(0, 16)}...`);
323
+ console.log(`${pc.bold("handlers:")} ${Object.keys(handlers).length}`);
324
+ for (const [name, h] of Object.entries(handlers)) {
325
+ const padded = name.padEnd(28);
326
+ console.log(` ${pc.dim(padded)} ${formatBytes(h.size)}`);
327
+ }
328
+ const allCaps = [...new Set(analysis.flatMap((a) => a.capabilities))];
329
+ if (allCaps.length > 0) {
330
+ console.log("");
331
+ console.log(`${pc.bold("capabilities:")}`);
332
+ console.log(` ${pc.cyan(allCaps.join(", "))}`);
333
+ }
334
+ const allWarnings = analysis.flatMap(
335
+ (a) => a.warnings.map((w) => `${w} in ${a.name}`)
336
+ );
337
+ if (allWarnings.length > 0) {
338
+ console.log("");
339
+ console.log(pc.yellow("\u26A0 warnings:"));
340
+ for (const w of allWarnings) {
341
+ console.log(` ${pc.yellow(w)}`);
342
+ }
343
+ }
344
+ const allBlockers = analysis.flatMap(
345
+ (a) => a.blockers.map((b) => `${b} in ${a.name}`)
346
+ );
347
+ if (allBlockers.length === 0) {
348
+ console.log("");
349
+ console.log(pc.green("\u2714 blockers: none"));
350
+ }
351
+ console.log(div + "\n");
352
+ }
353
+ function printPushError(phase, errors, blockers) {
354
+ const div = pc.dim("\u2500".repeat(48));
355
+ console.log("\n" + div);
356
+ if (phase === "ir") {
357
+ for (const e of errors) console.log(pc.red(`\u2718 invalid IR: ${e}`));
358
+ } else if (phase === "bindings") {
359
+ for (const e of errors) console.log(pc.red(`\u2718 handler missing: ${e}`));
360
+ } else if (phase === "analysis" && blockers) {
361
+ for (const b of blockers) console.log(pc.red(`\u2718 blockers found: ${b}`));
362
+ } else {
363
+ for (const e of errors) console.log(pc.red(`\u2718 ${e}`));
364
+ }
365
+ console.log(div + "\n");
366
+ }
367
+ var push_default = defineCommand({
368
+ meta: { name: "push", description: "Push agent to Kalp cloud" },
369
+ args: {
370
+ agent: {
371
+ type: "string",
372
+ alias: "a",
373
+ description: "Agent name to push",
374
+ required: false
375
+ }
376
+ },
377
+ async run({ args }) {
378
+ const cwd = process.cwd();
379
+ const agentName = args.agent;
380
+ p.intro(`${LOGO} ${pc.bold("kalp push")}`);
381
+ if (!agentName) {
382
+ p.log.error(`Missing required flag ${pc.cyan("-a <agent-name>")}`);
383
+ process.exit(1);
384
+ }
385
+ try {
386
+ await ensureConfig(cwd);
387
+ } catch {
388
+ p.log.error(`${pc.cyan("kalp.config.ts")} not found`);
389
+ process.exit(1);
390
+ }
391
+ const agentPath = join4(cwd, "agents", agentName, "index.ts");
392
+ try {
393
+ await access2(agentPath);
394
+ } catch {
395
+ p.log.error(`Agent ${pc.cyan(agentName)} not found`);
396
+ process.exit(1);
397
+ }
398
+ const s = p.spinner();
399
+ s.start(`Compiling ${pc.cyan(agentName)}`);
400
+ const manifest = await readAgentManifest({ cwd, agentName });
401
+ const hash = computePushHash(manifest.ir, manifest.handlers);
402
+ s.stop(
403
+ `Compiled ${pc.cyan(agentName)} \u2014 ${Object.keys(manifest.handlers).length} handlers`
404
+ );
405
+ s.start(`Pushing to cloud`);
406
+ const response = await fetch(`${CLOUD_API}/api/agents/push`, {
407
+ method: "POST",
408
+ headers: { "Content-Type": "application/json" },
409
+ body: JSON.stringify({
410
+ agentName,
411
+ ir: manifest.ir,
412
+ hash,
413
+ bundle: { handlers: manifest.handlers }
414
+ })
415
+ });
416
+ const body = await response.json().catch(() => null);
417
+ if (!response.ok) {
418
+ s.stop(pc.red("Push failed"));
419
+ const phase = body?.phase ?? "unknown";
420
+ const errors = body?.errors ?? [`HTTP ${response.status}`];
421
+ const blockers = body?.blockers;
422
+ printPushError(phase, errors, blockers);
423
+ process.exit(1);
424
+ }
425
+ s.stop(pc.green("Pushed successfully"));
426
+ const analysis = body?.analysis ?? [];
427
+ printPushResult(agentName, hash, manifest.handlers, analysis);
428
+ p.outro(`${LOGO} ${pc.green("Agent pushed to cloud")}`);
429
+ }
430
+ });
431
+ export {
432
+ push_default as default
433
+ };
434
+ //# sourceMappingURL=push-OYGYU55M.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/manifest/handlers.ts","../src/utils/ir/hashIR.ts"],"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\";\n\nconst LOGO = \"🦋\";\nconst CLOUD_API = process.env.KALP_CLOUD_URL || \"http://localhost:3000\";\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 analysis: Array<{\n name: string;\n capabilities: string[];\n warnings: string[];\n blockers: string[];\n }>,\n) {\n const div = pc.dim(\"─\".repeat(48));\n console.log(\"\\n\" + div);\n console.log(pc.green(\"✔ Deployed\"));\n console.log(\"\");\n console.log(`${pc.bold(\"agent:\")} ${agentName}`);\n console.log(`${pc.bold(\"hash:\")} ${hash.slice(0, 16)}...`);\n console.log(`${pc.bold(\"handlers:\")} ${Object.keys(handlers).length}`);\n\n for (const [name, h] of Object.entries(handlers)) {\n const padded = name.padEnd(28);\n console.log(` ${pc.dim(padded)} ${formatBytes(h.size)}`);\n }\n\n const allCaps = [...new Set(analysis.flatMap((a) => a.capabilities))];\n if (allCaps.length > 0) {\n console.log(\"\");\n console.log(`${pc.bold(\"capabilities:\")}`);\n console.log(` ${pc.cyan(allCaps.join(\", \"))}`);\n }\n\n const allWarnings = analysis.flatMap((a) =>\n a.warnings.map((w) => `${w} in ${a.name}`),\n );\n if (allWarnings.length > 0) {\n console.log(\"\");\n console.log(pc.yellow(\"⚠ warnings:\"));\n for (const w of allWarnings) {\n console.log(` ${pc.yellow(w)}`);\n }\n }\n\n const allBlockers = analysis.flatMap((a) =>\n a.blockers.map((b) => `${b} in ${a.name}`),\n );\n if (allBlockers.length === 0) {\n console.log(\"\");\n console.log(pc.green(\"✔ blockers: none\"));\n }\n\n console.log(div + \"\\n\");\n}\n\nfunction printPushError(phase: string, errors: string[], blockers?: string[]) {\n const div = pc.dim(\"─\".repeat(48));\n console.log(\"\\n\" + div);\n if (phase === \"ir\") {\n for (const e of errors) console.log(pc.red(`✘ invalid IR: ${e}`));\n } else if (phase === \"bindings\") {\n for (const e of errors) console.log(pc.red(`✘ handler missing: ${e}`));\n } else if (phase === \"analysis\" && blockers) {\n for (const b of blockers) console.log(pc.red(`✘ blockers found: ${b}`));\n } else {\n for (const e of errors) console.log(pc.red(`✘ ${e}`));\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 },\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\n const analysis =\n (body?.analysis as Array<{\n name: string;\n capabilities: string[];\n warnings: string[];\n blockers: string[];\n }>) ?? [];\n printPushResult(agentName, hash, manifest.handlers, analysis);\n\n p.outro(`${LOGO} ${pc.green(\"Agent pushed to cloud\")}`);\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\n// ─── Types ────────────────────────────────────────────────────────────────────\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\n// ─── Helpers ──────────────────────────────────────────────────────────────────\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\n// ─── Wrapper generation ───────────────────────────────────────────────────────\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\n// ─── esbuild plugins (reused from build.ts) ───────────────────────────────────\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\n// ─── Main export ──────────────────────────────────────────────────────────────\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 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 handlerName = fileName.replace(/_/g, \".\");\n const wrapper = wrappers.find(\n (w) => w.name.replace(/\\./g, \"_\") === fileName,\n );\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"],"mappings":"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","names":["access","join","join","createHash","existsSync","mkdtemp","rm","join","resolve","build","createHash","createHash","join","join","access"]}
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import "./chunk-2H7UOFLK.js";
3
2
 
4
3
  // src/commands/secrets/index.ts
5
4
  import { defineCommand } from "citty";
@@ -20,10 +19,10 @@ var secrets_default = defineCommand({
20
19
  }
21
20
  },
22
21
  subCommands: {
23
- list: () => import("./list-OKKHGKJA.js").then((r) => r.default),
24
- add: () => import("./add-LVQAW23G.js").then((r) => r.default),
25
- delete: () => import("./delete-AFDTCA52.js").then((r) => r.default),
26
- sync: () => import("./sync-HEIRRPCA.js").then((r) => r.default)
22
+ list: () => import("./list-3ZQIFUOT.js").then((r) => r.default),
23
+ add: () => import("./add-KRHLYYTO.js").then((r) => r.default),
24
+ delete: () => import("./delete-47ZP6XRB.js").then((r) => r.default),
25
+ sync: () => import("./sync-YFM5P3IS.js").then((r) => r.default)
27
26
  },
28
27
  run({ args }) {
29
28
  if (!args.help) {
@@ -47,4 +46,4 @@ var secrets_default = defineCommand({
47
46
  export {
48
47
  secrets_default as default
49
48
  };
50
- //# sourceMappingURL=secrets-PXU3BYSN.js.map
49
+ //# sourceMappingURL=secrets-KFMVBKJQ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/secrets/index.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"secrets\",\n description: \"Manage Kalp Cloud secrets\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n list: () => import(\"./list\").then((r) => r.default),\n add: () => import(\"./add\").then((r) => r.default),\n delete: () => import(\"./delete\").then((r) => r.default),\n sync: () => import(\"./sync\").then((r) => r.default),\n },\n run({ args }) {\n if (!args.help) {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets\")}`);\n p.log.message(pc.bold(\"Available subcommands:\"));\n p.log.message(` ${pc.cyan(\"list\")} List secrets from Kalp Cloud`);\n p.log.message(` ${pc.cyan(\"add\")} Add a secret to Kalp Cloud`);\n p.log.message(` ${pc.cyan(\"delete\")} Delete a secret from Kalp Cloud`);\n p.log.message(\n ` ${pc.cyan(\"sync\")} Sync secrets from Kalp Cloud to local config`,\n );\n p.log.message(\"\");\n p.log.message(\n `Run ${pc.cyan(\"kalp secrets <subcommand> --help\")} for more info.`,\n );\n p.outro(pc.dim(\"Done\"));\n },\n});\n"],"mappings":";;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAEf,IAAM,OAAO;AAEb,IAAO,kBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,MAAM,MAAM,OAAO,oBAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAClD,KAAK,MAAM,OAAO,mBAAO,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAChD,QAAQ,MAAM,OAAO,sBAAU,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IACtD,MAAM,MAAM,OAAO,oBAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,EACpD;AAAA,EACA,IAAI,EAAE,KAAK,GAAG;AACZ,QAAI,CAAC,KAAK,MAAM;AACd;AAAA,IACF;AAEA,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,cAAc,CAAC,EAAE;AAC5C,IAAE,MAAI,QAAQ,GAAG,KAAK,wBAAwB,CAAC;AAC/C,IAAE,MAAI,QAAQ,KAAK,GAAG,KAAK,MAAM,CAAC,iCAAiC;AACnE,IAAE,MAAI,QAAQ,KAAK,GAAG,KAAK,KAAK,CAAC,gCAAgC;AACjE,IAAE,MAAI,QAAQ,KAAK,GAAG,KAAK,QAAQ,CAAC,kCAAkC;AACtE,IAAE,MAAI;AAAA,MACJ,KAAK,GAAG,KAAK,MAAM,CAAC;AAAA,IACtB;AACA,IAAE,MAAI,QAAQ,EAAE;AAChB,IAAE,MAAI;AAAA,MACJ,OAAO,GAAG,KAAK,kCAAkC,CAAC;AAAA,IACpD;AACA,IAAE,QAAM,GAAG,IAAI,MAAM,CAAC;AAAA,EACxB;AACF,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/commands/secrets/index.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"secrets\",\n description: \"Manage Kalp Cloud secrets\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n list: () => import(\"./list\").then((r) => r.default),\n add: () => import(\"./add\").then((r) => r.default),\n delete: () => import(\"./delete\").then((r) => r.default),\n sync: () => import(\"./sync\").then((r) => r.default),\n },\n run({ args }) {\n if (!args.help) {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets\")}`);\n p.log.message(pc.bold(\"Available subcommands:\"));\n p.log.message(` ${pc.cyan(\"list\")} List secrets from Kalp Cloud`);\n p.log.message(` ${pc.cyan(\"add\")} Add a secret to Kalp Cloud`);\n p.log.message(` ${pc.cyan(\"delete\")} Delete a secret from Kalp Cloud`);\n p.log.message(\n ` ${pc.cyan(\"sync\")} Sync secrets from Kalp Cloud to local config`,\n );\n p.log.message(\"\");\n p.log.message(\n `Run ${pc.cyan(\"kalp secrets <subcommand> --help\")} for more info.`,\n );\n p.outro(pc.dim(\"Done\"));\n },\n});\n"],"mappings":";;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAEf,IAAM,OAAO;AAEb,IAAO,kBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,MAAM,MAAM,OAAO,oBAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAClD,KAAK,MAAM,OAAO,mBAAO,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAChD,QAAQ,MAAM,OAAO,sBAAU,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IACtD,MAAM,MAAM,OAAO,oBAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,EACpD;AAAA,EACA,IAAI,EAAE,KAAK,GAAG;AACZ,QAAI,CAAC,KAAK,MAAM;AACd;AAAA,IACF;AAEA,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,cAAc,CAAC,EAAE;AAC5C,IAAE,MAAI,QAAQ,GAAG,KAAK,wBAAwB,CAAC;AAC/C,IAAE,MAAI,QAAQ,KAAK,GAAG,KAAK,MAAM,CAAC,iCAAiC;AACnE,IAAE,MAAI,QAAQ,KAAK,GAAG,KAAK,KAAK,CAAC,gCAAgC;AACjE,IAAE,MAAI,QAAQ,KAAK,GAAG,KAAK,QAAQ,CAAC,kCAAkC;AACtE,IAAE,MAAI;AAAA,MACJ,KAAK,GAAG,KAAK,MAAM,CAAC;AAAA,IACtB;AACA,IAAE,MAAI,QAAQ,EAAE;AAChB,IAAE,MAAI;AAAA,MACJ,OAAO,GAAG,KAAK,kCAAkC,CAAC;AAAA,IACpD;AACA,IAAE,QAAM,GAAG,IAAI,MAAM,CAAC;AAAA,EACxB;AACF,CAAC;","names":[]}
@@ -5,7 +5,6 @@ import {
5
5
  import {
6
6
  getAuthToken
7
7
  } from "./chunk-6LLXGS2P.js";
8
- import "./chunk-2H7UOFLK.js";
9
8
 
10
9
  // src/commands/secrets/sync.ts
11
10
  import { defineCommand } from "citty";
@@ -118,4 +117,4 @@ var sync_default = defineCommand({
118
117
  export {
119
118
  sync_default as default
120
119
  };
121
- //# sourceMappingURL=sync-HEIRRPCA.js.map
120
+ //# sourceMappingURL=sync-YFM5P3IS.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/secrets/sync.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAuthToken } from \"@/utils/auth\";\nimport { generateTypes } from \"@/utils/codegen\";\n\nconst LOGO = \"🦋\";\n\ninterface SecretFromCloud {\n key: string;\n createdAt: string;\n}\n\nasync function fetchSecretsFromCloud(): Promise<SecretFromCloud[]> {\n // TODO: Implement real API call to Kalp Cloud\n console.log(pc.dim(\"[Simulated] Fetching secrets from Kalp Cloud...\"));\n // Simulated response - in real implementation, this would call the API\n return [\n { key: \"STRIPE_SECRET_KEY\", createdAt: \"2024-01-15T10:30:00Z\" },\n { key: \"OPENAI_API_KEY\", createdAt: \"2024-01-16T14:20:00Z\" },\n ];\n}\n\nasync function replaceSecretsInConfig(\n cwd: string,\n secrets: string[],\n): Promise<void> {\n const configPath = join(cwd, \"kalp.config.ts\");\n let content: string;\n\n try {\n content = await readFile(configPath, \"utf-8\");\n } catch {\n // Create new config if doesn't exist\n content = `import { defineConfig } from \"@kalphq/sdk\";\n\nexport default defineConfig({\n secrets: [],\n});\n`;\n }\n\n // Replace secrets array with new ones\n const secretsArray =\n secrets.length > 0 ? secrets.map((s) => `\"${s}\"`).join(\", \") : \"\";\n\n const newArray = `secrets: [${secretsArray}]`;\n\n // Check if config has secrets array\n if (content.match(/secrets:\\s*\\[([^\\]]*)\\]/)) {\n content = content.replace(/secrets:\\s*\\[([^\\]]*)\\]/, newArray);\n } else {\n // Add secrets array if not present\n content = content.replace(\n /defineConfig\\({/,\n `defineConfig({\\n secrets: [${secretsArray}],`,\n );\n }\n\n await writeFile(configPath, content, \"utf-8\");\n}\n\nexport default defineCommand({\n meta: {\n name: \"sync\",\n description: \"Sync secrets from Kalp Cloud to local config\",\n },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets sync\")}`);\n\n // Check authentication\n const token = await getAuthToken();\n if (!token) {\n p.log.error(\"Not authenticated. Run 'kalp login' first.\");\n process.exit(1);\n }\n\n const s = p.spinner();\n\n try {\n s.start(\"Fetching secrets from Kalp Cloud\");\n const cloudSecrets = await fetchSecretsFromCloud();\n s.stop(`Found ${pc.cyan(String(cloudSecrets.length))} secrets in cloud`);\n\n if (cloudSecrets.length === 0) {\n p.log.warn(\"No secrets found in Kalp Cloud\");\n\n const shouldClear = await p.confirm({\n message: \"Clear local secrets config?\",\n initialValue: false,\n });\n\n if (p.isCancel(shouldClear) || !shouldClear) {\n p.outro(\"Cancelled\");\n return;\n }\n\n s.start(\"Clearing local secrets\");\n await replaceSecretsInConfig(cwd, []);\n await generateTypes(cwd);\n s.stop(\"Local secrets cleared\");\n p.outro(\"Done\");\n return;\n }\n\n // Show secrets that will be synced\n p.log.info(pc.bold(\"Secrets to sync:\"));\n for (const secret of cloudSecrets) {\n console.log(` ${pc.dim(\"•\")} ${pc.cyan(secret.key)}`);\n }\n\n const confirm = await p.confirm({\n message: `Replace local secrets with ${cloudSecrets.length} secrets from cloud?`,\n initialValue: true,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n p.outro(\"Cancelled\");\n return;\n }\n\n s.start(\"Updating local config\");\n const secretKeys = cloudSecrets.map((s) => s.key);\n await replaceSecretsInConfig(cwd, secretKeys);\n s.stop(\"Config updated\");\n\n s.start(\"Regenerating types\");\n await generateTypes(cwd);\n s.stop(\"Types regenerated\");\n\n p.log.success(pc.green(`Synced ${cloudSecrets.length} secrets`));\n p.outro(\"Done\");\n } catch (error) {\n s.stop(\"Sync failed\");\n p.log.error(\n pc.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n p.outro(\"Failed\");\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["confirm","s"]}
1
+ {"version":3,"sources":["../src/commands/secrets/sync.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAuthToken } from \"@/utils/auth\";\nimport { generateTypes } from \"@/utils/codegen\";\n\nconst LOGO = \"🦋\";\n\ninterface SecretFromCloud {\n key: string;\n createdAt: string;\n}\n\nasync function fetchSecretsFromCloud(): Promise<SecretFromCloud[]> {\n // TODO: Implement real API call to Kalp Cloud\n console.log(pc.dim(\"[Simulated] Fetching secrets from Kalp Cloud...\"));\n // Simulated response - in real implementation, this would call the API\n return [\n { key: \"STRIPE_SECRET_KEY\", createdAt: \"2024-01-15T10:30:00Z\" },\n { key: \"OPENAI_API_KEY\", createdAt: \"2024-01-16T14:20:00Z\" },\n ];\n}\n\nasync function replaceSecretsInConfig(\n cwd: string,\n secrets: string[],\n): Promise<void> {\n const configPath = join(cwd, \"kalp.config.ts\");\n let content: string;\n\n try {\n content = await readFile(configPath, \"utf-8\");\n } catch {\n // Create new config if doesn't exist\n content = `import { defineConfig } from \"@kalphq/sdk\";\n\nexport default defineConfig({\n secrets: [],\n});\n`;\n }\n\n // Replace secrets array with new ones\n const secretsArray =\n secrets.length > 0 ? secrets.map((s) => `\"${s}\"`).join(\", \") : \"\";\n\n const newArray = `secrets: [${secretsArray}]`;\n\n // Check if config has secrets array\n if (content.match(/secrets:\\s*\\[([^\\]]*)\\]/)) {\n content = content.replace(/secrets:\\s*\\[([^\\]]*)\\]/, newArray);\n } else {\n // Add secrets array if not present\n content = content.replace(\n /defineConfig\\({/,\n `defineConfig({\\n secrets: [${secretsArray}],`,\n );\n }\n\n await writeFile(configPath, content, \"utf-8\");\n}\n\nexport default defineCommand({\n meta: {\n name: \"sync\",\n description: \"Sync secrets from Kalp Cloud to local config\",\n },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets sync\")}`);\n\n // Check authentication\n const token = await getAuthToken();\n if (!token) {\n p.log.error(\"Not authenticated. Run 'kalp login' first.\");\n process.exit(1);\n }\n\n const s = p.spinner();\n\n try {\n s.start(\"Fetching secrets from Kalp Cloud\");\n const cloudSecrets = await fetchSecretsFromCloud();\n s.stop(`Found ${pc.cyan(String(cloudSecrets.length))} secrets in cloud`);\n\n if (cloudSecrets.length === 0) {\n p.log.warn(\"No secrets found in Kalp Cloud\");\n\n const shouldClear = await p.confirm({\n message: \"Clear local secrets config?\",\n initialValue: false,\n });\n\n if (p.isCancel(shouldClear) || !shouldClear) {\n p.outro(\"Cancelled\");\n return;\n }\n\n s.start(\"Clearing local secrets\");\n await replaceSecretsInConfig(cwd, []);\n await generateTypes(cwd);\n s.stop(\"Local secrets cleared\");\n p.outro(\"Done\");\n return;\n }\n\n // Show secrets that will be synced\n p.log.info(pc.bold(\"Secrets to sync:\"));\n for (const secret of cloudSecrets) {\n console.log(` ${pc.dim(\"•\")} ${pc.cyan(secret.key)}`);\n }\n\n const confirm = await p.confirm({\n message: `Replace local secrets with ${cloudSecrets.length} secrets from cloud?`,\n initialValue: true,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n p.outro(\"Cancelled\");\n return;\n }\n\n s.start(\"Updating local config\");\n const secretKeys = cloudSecrets.map((s) => s.key);\n await replaceSecretsInConfig(cwd, secretKeys);\n s.stop(\"Config updated\");\n\n s.start(\"Regenerating types\");\n await generateTypes(cwd);\n s.stop(\"Types regenerated\");\n\n p.log.success(pc.green(`Synced ${cloudSecrets.length} secrets`));\n p.outro(\"Done\");\n } catch (error) {\n s.stop(\"Sync failed\");\n p.log.error(\n pc.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n p.outro(\"Failed\");\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["confirm","s"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kalphq/cli",
3
- "version": "0.0.0-dev-20260422003724",
3
+ "version": "0.0.0-dev-20260423023800",
4
4
  "description": "Zero-config CLI for deploying Kalp agents",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -10,8 +10,7 @@
10
10
  },
11
11
  "main": "./dist/index.js",
12
12
  "files": [
13
- "dist",
14
- "templates"
13
+ "dist"
15
14
  ],
16
15
  "publishConfig": {
17
16
  "access": "public"
@@ -21,12 +20,15 @@
21
20
  "@clack/prompts": "0.9.1",
22
21
  "citty": "0.1.6",
23
22
  "esbuild": "0.25.0",
23
+ "json-stable-stringify": "1.3.0",
24
24
  "picocolors": "1.1.1",
25
25
  "zod": "3.25.76",
26
- "zod-to-json-schema": "3.25.2",
27
- "@kalphq/sdk": "0.0.0-dev-20260422003724"
26
+ "@kalphq/compiler": "0.0.0-dev-20260423023800",
27
+ "@kalphq/project": "0.0.0-dev-20260423023800",
28
+ "@kalphq/sdk": "0.0.0-dev-20260423023800"
28
29
  },
29
30
  "devDependencies": {
31
+ "@types/json-stable-stringify": "1.2.0",
30
32
  "@types/node": "^22.15.3",
31
33
  "tsup": "^8.3.5",
32
34
  "typescript": "^5.0.0"