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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/{add-CTF5QIGY.js → add-YZSIMRPC.js} +6 -5
  2. package/dist/{add-CTF5QIGY.js.map → add-YZSIMRPC.js.map} +1 -1
  3. package/dist/{agents-NN2FLBZM.js → agents-WYK6WNQP.js} +3 -3
  4. package/dist/{chunk-TPG7QMXB.js → chunk-4CEJYSJY.js} +11 -9
  5. package/dist/{chunk-TPG7QMXB.js.map → chunk-4CEJYSJY.js.map} +1 -1
  6. package/dist/chunk-EXXTCGKR.js +77 -0
  7. package/dist/chunk-EXXTCGKR.js.map +1 -0
  8. package/dist/{chunk-FP3ZLBYT.js → chunk-IZXCZ3IA.js} +2 -2
  9. package/dist/chunk-LPEV4QH2.js +208 -0
  10. package/dist/chunk-LPEV4QH2.js.map +1 -0
  11. package/dist/{chunk-DHCCSWJN.js → chunk-XVD3FFOJ.js} +37 -104
  12. package/dist/chunk-XVD3FFOJ.js.map +1 -0
  13. package/dist/{chunk-EHNC6ITP.js → chunk-YE2SFYAJ.js} +10 -1
  14. package/dist/chunk-YE2SFYAJ.js.map +1 -0
  15. package/dist/{create-XC55BUCS.js → create-UCJ77P62.js} +6 -1
  16. package/dist/create-UCJ77P62.js.map +1 -0
  17. package/dist/{delete-BQFFYYWZ.js → delete-FIXMFFNZ.js} +6 -5
  18. package/dist/{delete-BQFFYYWZ.js.map → delete-FIXMFFNZ.js.map} +1 -1
  19. package/dist/{delete-LW2G4GCN.js → delete-QPYVL4OU.js} +7 -6
  20. package/dist/{delete-LW2G4GCN.js.map → delete-QPYVL4OU.js.map} +1 -1
  21. package/dist/{deploy-2JMOUTWG.js → deploy-DRZZ3YRB.js} +8 -3
  22. package/dist/deploy-DRZZ3YRB.js.map +1 -0
  23. package/dist/{dev-X43HHIYV.js → dev-5YY6W4WM.js} +7 -2
  24. package/dist/dev-5YY6W4WM.js.map +1 -0
  25. package/dist/generate-JW2DMJ3W.js +391 -0
  26. package/dist/generate-JW2DMJ3W.js.map +1 -0
  27. package/dist/index.js +10 -7
  28. package/dist/index.js.map +1 -1
  29. package/dist/{list-5RQZ3JVG.js → list-FKH4DWCF.js} +4 -3
  30. package/dist/{list-5RQZ3JVG.js.map → list-FKH4DWCF.js.map} +1 -1
  31. package/dist/{list-JXR4IULK.js → list-GZBBOFX5.js} +29 -9
  32. package/dist/list-GZBBOFX5.js.map +1 -0
  33. package/dist/mcp-DRMQYA7E.js +39 -0
  34. package/dist/mcp-DRMQYA7E.js.map +1 -0
  35. package/dist/pull-V7QJBVNZ.js +83 -0
  36. package/dist/pull-V7QJBVNZ.js.map +1 -0
  37. package/dist/{push-WHPQXAY7.js → push-P6CKRYT7.js} +13 -8
  38. package/dist/push-P6CKRYT7.js.map +1 -0
  39. package/dist/{secrets-Z53FLH56.js → secrets-M43LLCTB.js} +9 -5
  40. package/dist/secrets-M43LLCTB.js.map +1 -0
  41. package/dist/{sync-RPXLLOTK.js → sync-LTBH6DI5.js} +19 -7
  42. package/dist/sync-LTBH6DI5.js.map +1 -0
  43. package/package.json +5 -4
  44. package/dist/chunk-DHCCSWJN.js.map +0 -1
  45. package/dist/chunk-EHNC6ITP.js.map +0 -1
  46. package/dist/chunk-MMS3GWBG.js +0 -50
  47. package/dist/chunk-MMS3GWBG.js.map +0 -1
  48. package/dist/create-XC55BUCS.js.map +0 -1
  49. package/dist/deploy-2JMOUTWG.js.map +0 -1
  50. package/dist/dev-X43HHIYV.js.map +0 -1
  51. package/dist/list-JXR4IULK.js.map +0 -1
  52. package/dist/push-WHPQXAY7.js.map +0 -1
  53. package/dist/secrets-Z53FLH56.js.map +0 -1
  54. package/dist/sync-RPXLLOTK.js.map +0 -1
  55. /package/dist/{agents-NN2FLBZM.js.map → agents-WYK6WNQP.js.map} +0 -0
  56. /package/dist/{chunk-FP3ZLBYT.js.map → chunk-IZXCZ3IA.js.map} +0 -0
@@ -1,4 +1,9 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ loadProjectConfig,
4
+ resolveIdentityAuthRequirements,
5
+ resolveRuntimeIdentityConfig
6
+ } from "./chunk-EXXTCGKR.js";
2
7
 
3
8
  // src/utils/project-state.ts
4
9
  import { mkdir, readFile, writeFile } from "fs/promises";
@@ -60,7 +65,7 @@ async function writeProjectState(cwd, state) {
60
65
  // src/utils/runtime.ts
61
66
  import { createHash } from "crypto";
62
67
  import {
63
- access as access3,
68
+ access as access2,
64
69
  cp,
65
70
  mkdir as mkdir2,
66
71
  readdir,
@@ -69,7 +74,7 @@ import {
69
74
  stat,
70
75
  writeFile as writeFile3
71
76
  } from "fs/promises";
72
- import { basename, dirname, join as join5, resolve as resolve2 } from "path";
77
+ import { basename, dirname, join as join4, resolve } from "path";
73
78
  import { fileURLToPath } from "url";
74
79
  import { deriveLabelFromName } from "@kalphq/project";
75
80
 
@@ -112,79 +117,10 @@ function getRequiredSecretForProvider(provider) {
112
117
  return PROVIDER_SECRET_MAP[provider];
113
118
  }
114
119
 
115
- // src/utils/project-config.ts
116
- import { createJiti as createJiti2 } from "jiti";
117
- import { access as access2 } from "fs/promises";
118
- import { constants as constants2 } from "fs";
119
- import { join as join3, resolve } from "path";
120
- function normalizeStrategy(strategy) {
121
- if (!strategy) return null;
122
- if (strategy.type === "jwks") {
123
- return {
124
- type: "jwks",
125
- jwksUrl: strategy.jwksUrl,
126
- issuer: strategy.issuer,
127
- audience: strategy.audience
128
- };
129
- }
130
- if (strategy.type === "symmetric") {
131
- return {
132
- type: "symmetric",
133
- secretEnvKey: strategy.secretEnvKey
134
- };
135
- }
136
- return {
137
- type: "apiKey",
138
- headerName: strategy.headerName,
139
- envKey: strategy.envKey
140
- };
141
- }
142
- async function loadProjectConfig(cwd) {
143
- const configPath = resolve(join3(cwd, "kalp.config.ts"));
144
- await access2(configPath, constants2.F_OK);
145
- const jiti = createJiti2(cwd, { interopDefault: true });
146
- const moduleValue = await jiti.import(configPath);
147
- const raw = moduleValue && typeof moduleValue === "object" && "default" in moduleValue ? moduleValue.default ?? moduleValue : moduleValue;
148
- return { path: configPath, raw };
149
- }
150
- function resolveRuntimeIdentityConfig(rawConfig) {
151
- const identity = rawConfig.identity && typeof rawConfig.identity === "object" ? rawConfig.identity : void 0;
152
- const enforceGlobalAuth = typeof rawConfig.enforceGlobalAuth === "boolean" ? rawConfig.enforceGlobalAuth : true;
153
- return {
154
- enforceGlobalAuth,
155
- identityId: identity && typeof identity.id === "string" && identity.id.length > 0 ? identity.id : null,
156
- strategy: normalizeStrategy(identity?.strategy)
157
- };
158
- }
159
- function resolveIdentityAuthRequirements(identity) {
160
- if (!identity.strategy) return [];
161
- if (identity.strategy.type === "symmetric") {
162
- return [
163
- {
164
- envKey: identity.strategy.secretEnvKey?.trim() || "JWT_SIGNING_SECRET",
165
- reason: "symmetric JWT validation"
166
- }
167
- ];
168
- }
169
- if (identity.strategy.type === "apiKey") {
170
- const envKey = identity.strategy.envKey?.trim();
171
- if (!envKey) {
172
- return [
173
- {
174
- envKey: "KALP_API_KEY",
175
- reason: "apiKey strategy (default env key)"
176
- }
177
- ];
178
- }
179
- return [{ envKey, reason: "apiKey strategy" }];
180
- }
181
- return [];
182
- }
183
-
184
120
  // src/utils/runtime-identity.ts
185
121
  import { build } from "esbuild";
186
122
  import { writeFile as writeFile2 } from "fs/promises";
187
- import { join as join4 } from "path";
123
+ import { join as join3 } from "path";
188
124
  var DEFAULT_IDENTITY_MAP_SOURCE = `export default function mapIdentity(payload) {
189
125
  const sub =
190
126
  payload && typeof payload === "object" && typeof payload.sub === "string"
@@ -258,8 +194,8 @@ export default mapIdentity;
258
194
  }
259
195
  async function materializeRuntimeIdentity(params) {
260
196
  const { cwd, runtimeDir } = params;
261
- const identityConfigPath = join4(runtimeDir, "identity.config.json");
262
- const identityMapPath = join4(runtimeDir, "identity.map.mjs");
197
+ const identityConfigPath = join3(runtimeDir, "identity.config.json");
198
+ const identityMapPath = join3(runtimeDir, "identity.map.mjs");
263
199
  let rawConfig = {};
264
200
  try {
265
201
  const loaded = await loadProjectConfig(cwd);
@@ -305,7 +241,7 @@ function sanitizeSegment(input) {
305
241
  }
306
242
  async function resolveProjectSlug(cwd) {
307
243
  const fallback = sanitizeSegment(basename(cwd)) || "agent";
308
- const packageJsonPath = join5(cwd, "package.json");
244
+ const packageJsonPath = join4(cwd, "package.json");
309
245
  try {
310
246
  const content = await readFile3(packageJsonPath, "utf-8");
311
247
  const pkg = JSON.parse(content);
@@ -369,10 +305,10 @@ function createRuntimeConfig(workerName, mode, requiredSecrets) {
369
305
  }
370
306
  function runtimeTemplateCandidates() {
371
307
  const here = dirname(fileURLToPath(import.meta.url));
372
- const distTemplateRoot = resolve2(here, "runtime-template");
373
- const packageRootTemplate = resolve2(here, "..", "runtime-template");
374
- const sourceTemplateRoot = resolve2(here, "..", "..", "runtime-template");
375
- const monorepoStudioDist = resolve2(
308
+ const distTemplateRoot = resolve(here, "runtime-template");
309
+ const packageRootTemplate = resolve(here, "..", "runtime-template");
310
+ const sourceTemplateRoot = resolve(here, "..", "..", "runtime-template");
311
+ const monorepoStudioDist = resolve(
376
312
  here,
377
313
  "..",
378
314
  "..",
@@ -385,28 +321,28 @@ function runtimeTemplateCandidates() {
385
321
  );
386
322
  return [
387
323
  {
388
- studioTemplateDir: join5(distTemplateRoot, STUDIO_DIR),
389
- workerEntryPath: join5(distTemplateRoot, WORKER_ENTRY_FILE)
324
+ studioTemplateDir: join4(distTemplateRoot, STUDIO_DIR),
325
+ workerEntryPath: join4(distTemplateRoot, WORKER_ENTRY_FILE)
390
326
  },
391
327
  {
392
- studioTemplateDir: join5(packageRootTemplate, STUDIO_DIR),
393
- workerEntryPath: join5(packageRootTemplate, WORKER_ENTRY_FILE)
328
+ studioTemplateDir: join4(packageRootTemplate, STUDIO_DIR),
329
+ workerEntryPath: join4(packageRootTemplate, WORKER_ENTRY_FILE)
394
330
  },
395
331
  {
396
- studioTemplateDir: join5(sourceTemplateRoot, STUDIO_DIR),
397
- workerEntryPath: join5(sourceTemplateRoot, WORKER_ENTRY_FILE)
332
+ studioTemplateDir: join4(sourceTemplateRoot, STUDIO_DIR),
333
+ workerEntryPath: join4(sourceTemplateRoot, WORKER_ENTRY_FILE)
398
334
  },
399
335
  {
400
336
  studioTemplateDir: monorepoStudioDist,
401
- workerEntryPath: join5(sourceTemplateRoot, WORKER_ENTRY_FILE)
337
+ workerEntryPath: join4(sourceTemplateRoot, WORKER_ENTRY_FILE)
402
338
  }
403
339
  ];
404
340
  }
405
341
  async function resolveRuntimeTemplate() {
406
342
  for (const candidate of runtimeTemplateCandidates()) {
407
343
  try {
408
- await access3(candidate.studioTemplateDir);
409
- await access3(candidate.workerEntryPath);
344
+ await access2(candidate.studioTemplateDir);
345
+ await access2(candidate.workerEntryPath);
410
346
  return candidate;
411
347
  } catch {
412
348
  }
@@ -433,13 +369,13 @@ ${cssLinks}
433
369
  `;
434
370
  }
435
371
  async function ensureStudioIndex(studioDir) {
436
- const indexPath = join5(studioDir, "index.html");
372
+ const indexPath = join4(studioDir, "index.html");
437
373
  try {
438
- await access3(indexPath);
374
+ await access2(indexPath);
439
375
  return;
440
376
  } catch {
441
377
  }
442
- const assetsDir = join5(studioDir, "assets");
378
+ const assetsDir = join4(studioDir, "assets");
443
379
  const assetFiles = await readdir(assetsDir);
444
380
  const entryScript = assetFiles.find((file) => /^index-.*\.js$/i.test(file)) ?? assetFiles.find((file) => file.endsWith(".js"));
445
381
  if (!entryScript) {
@@ -452,13 +388,13 @@ async function ensureStudioIndex(studioDir) {
452
388
  await writeFile3(indexPath, html, "utf-8");
453
389
  }
454
390
  async function readLocalAgentNames(cwd) {
455
- const agentsDir = join5(cwd, "agents");
391
+ const agentsDir = join4(cwd, "agents");
456
392
  try {
457
393
  const entries = await readdir(agentsDir, { withFileTypes: true });
458
394
  const names = [];
459
395
  for (const entry of entries) {
460
396
  if (!entry.isDirectory()) continue;
461
- const indexPath = join5(agentsDir, entry.name, "index.ts");
397
+ const indexPath = join4(agentsDir, entry.name, "index.ts");
462
398
  const exists = await stat(indexPath).then(() => true).catch(() => false);
463
399
  if (exists) names.push(entry.name);
464
400
  }
@@ -473,7 +409,7 @@ async function createAgentsSnapshot(cwd, mode) {
473
409
  const byName = /* @__PURE__ */ new Map();
474
410
  const stateAgents = state?.agents ?? {};
475
411
  for (const name of localAgentNames) {
476
- const localPath = join5(cwd, "agents", name, "index.ts");
412
+ const localPath = join4(cwd, "agents", name, "index.ts");
477
413
  const saved = stateAgents[name];
478
414
  const hasRemoteVersion = !!saved?.lastRemoteHash && (saved?.currentVersion ?? 0) > 0;
479
415
  if (mode === "remote" && !hasRemoteVersion) {
@@ -501,7 +437,7 @@ async function createAgentsSnapshot(cwd, mode) {
501
437
  for (const [name, saved] of Object.entries(stateAgents)) {
502
438
  const hasRemoteVersion = !!saved.lastRemoteHash && (saved.currentVersion ?? 0) > 0;
503
439
  if (!hasRemoteVersion || byName.has(name)) continue;
504
- const localPath = saved.localPath ?? join5(cwd, "agents", name, "index.ts");
440
+ const localPath = saved.localPath ?? join4(cwd, "agents", name, "index.ts");
505
441
  const workerUrl = saved.workerUrl ?? (state?.workerUrl ? `${state.workerUrl.replace(/\/$/, "")}/a/${name}` : null);
506
442
  const versionNumber = saved.currentVersion > 0 ? saved.currentVersion : null;
507
443
  byName.set(name, {
@@ -532,7 +468,7 @@ async function createAgentsSnapshot(cwd, mode) {
532
468
  async function writeRuntimeAgentsSnapshot(params) {
533
469
  const snapshot = await createAgentsSnapshot(params.cwd, params.mode);
534
470
  await writeFile3(
535
- join5(params.runtimeDir, "agents.snapshot.json"),
471
+ join4(params.runtimeDir, "agents.snapshot.json"),
536
472
  `${JSON.stringify(snapshot, null, 2)}
537
473
  `,
538
474
  "utf-8"
@@ -540,10 +476,10 @@ async function writeRuntimeAgentsSnapshot(params) {
540
476
  }
541
477
  async function materializeRuntime(cwd, options = {}) {
542
478
  const mode = options.mode ?? "remote";
543
- const runtimeDir = join5(cwd, RUNTIME_ROOT, RUNTIME_DIR);
544
- const studioDir = join5(runtimeDir, STUDIO_DIR);
545
- const workerEntrypointPath = join5(runtimeDir, WORKER_ENTRY_FILE);
546
- const wranglerConfigPath = join5(runtimeDir, WRANGLER_CONFIG_FILE);
479
+ const runtimeDir = join4(cwd, RUNTIME_ROOT, RUNTIME_DIR);
480
+ const studioDir = join4(runtimeDir, STUDIO_DIR);
481
+ const workerEntrypointPath = join4(runtimeDir, WORKER_ENTRY_FILE);
482
+ const wranglerConfigPath = join4(runtimeDir, WRANGLER_CONFIG_FILE);
547
483
  const template = await resolveRuntimeTemplate();
548
484
  await rm(runtimeDir, { recursive: true, force: true });
549
485
  await mkdir2(runtimeDir, { recursive: true });
@@ -595,11 +531,8 @@ export {
595
531
  resolveProviderFromConfig,
596
532
  readDotEnv,
597
533
  getRequiredSecretForProvider,
598
- loadProjectConfig,
599
- resolveRuntimeIdentityConfig,
600
- resolveIdentityAuthRequirements,
601
534
  readLocalAgentNames,
602
535
  writeRuntimeAgentsSnapshot,
603
536
  materializeRuntime
604
537
  };
605
- //# sourceMappingURL=chunk-DHCCSWJN.js.map
538
+ //# sourceMappingURL=chunk-XVD3FFOJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/project-state.ts","../src/utils/runtime.ts","../src/utils/ai.ts","../src/utils/runtime-identity.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface ProjectAgentState {\n currentHash: string | null;\n currentVersion: number;\n lastLocalHash: string | null;\n lastRemoteHash: string | null;\n lastPushedAt: string | null;\n localPath: string;\n workerUrl: string | null;\n}\n\nexport interface ProjectState {\n workerUrl: string | null;\n deployedAt: string | null;\n accountId: string | null;\n studioCredentialsFingerprint?: string | null;\n serviceKeyFingerprint?: string | null;\n agents: Record<string, ProjectAgentState>;\n}\n\nconst KALP_DIR = \".kalp\";\nconst STATE_FILE = \"state.json\";\n\nfunction normalizeProjectState(raw: unknown): ProjectState | null {\n if (!raw || typeof raw !== \"object\") return null;\n const value = raw as Record<string, unknown>;\n const workerUrl =\n typeof value.workerUrl === \"string\" && value.workerUrl.length > 0\n ? value.workerUrl\n : null;\n const deployedAt =\n typeof value.deployedAt === \"string\" && value.deployedAt.length > 0\n ? value.deployedAt\n : null;\n const accountId =\n typeof value.accountId === \"string\" && value.accountId.length > 0\n ? value.accountId\n : null;\n const studioCredentialsFingerprint =\n typeof value.studioCredentialsFingerprint === \"string\" &&\n value.studioCredentialsFingerprint.length > 0\n ? value.studioCredentialsFingerprint\n : null;\n const serviceKeyFingerprint =\n typeof value.serviceKeyFingerprint === \"string\" &&\n value.serviceKeyFingerprint.length > 0\n ? value.serviceKeyFingerprint\n : null;\n\n const agents: Record<string, ProjectAgentState> = {};\n const rawAgents =\n value.agents && typeof value.agents === \"object\"\n ? (value.agents as Record<string, unknown>)\n : {};\n\n for (const [name, entry] of Object.entries(rawAgents)) {\n if (!entry || typeof entry !== \"object\") continue;\n const item = entry as Record<string, unknown>;\n if (typeof item.localPath !== \"string\" || item.localPath.length === 0) {\n continue;\n }\n\n const currentVersion =\n typeof item.currentVersion === \"number\" && Number.isFinite(item.currentVersion)\n ? Math.max(0, Math.floor(item.currentVersion))\n : 0;\n\n agents[name] = {\n currentHash: typeof item.currentHash === \"string\" ? item.currentHash : null,\n currentVersion,\n lastLocalHash: typeof item.lastLocalHash === \"string\" ? item.lastLocalHash : null,\n lastRemoteHash:\n typeof item.lastRemoteHash === \"string\" ? item.lastRemoteHash : null,\n lastPushedAt: typeof item.lastPushedAt === \"string\" ? item.lastPushedAt : null,\n localPath: item.localPath,\n workerUrl: typeof item.workerUrl === \"string\" ? item.workerUrl : null,\n };\n }\n\n return {\n workerUrl,\n deployedAt,\n accountId,\n studioCredentialsFingerprint,\n serviceKeyFingerprint,\n agents,\n };\n}\n\nexport async function readProjectState(cwd: string): Promise<ProjectState | null> {\n try {\n const statePath = join(cwd, KALP_DIR, STATE_FILE);\n const content = await readFile(statePath, \"utf-8\");\n return normalizeProjectState(JSON.parse(content));\n } catch {\n return null;\n }\n}\n\nexport async function writeProjectState(\n cwd: string,\n state: ProjectState,\n): Promise<void> {\n const dir = join(cwd, KALP_DIR);\n await mkdir(dir, { recursive: true });\n await writeFile(join(dir, STATE_FILE), `${JSON.stringify(state, null, 2)}\\n`, \"utf-8\");\n}\n","import { createHash } from \"node:crypto\";\nimport {\n access,\n cp,\n mkdir,\n readdir,\n readFile,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { deriveLabelFromName } from \"@kalphq/project\";\nimport { getRequiredSecretForProvider, resolveProviderFromConfig } from \"@/utils/ai\";\nimport {\n resolveIdentityAuthRequirements,\n} from \"@/utils/project-config\";\nimport { readProjectState } from \"@/utils/project-state\";\nimport { materializeRuntimeIdentity } from \"@/utils/runtime-identity\";\n\nconst RUNTIME_ROOT = \".kalp\";\nconst RUNTIME_DIR = \"runtime\";\nconst STUDIO_DIR = \"studio\";\nconst WRANGLER_CONFIG_FILE = \"wrangler.jsonc\";\nconst WORKER_ENTRY_FILE = \"worker-entry.js\";\nconst COMPATIBILITY_DATE = \"2026-05-10\";\n\nexport interface RuntimePaths {\n runtimeDir: string;\n studioDir: string;\n workerEntrypointPath: string;\n wranglerConfigPath: string;\n workerName: string;\n}\n\ninterface RuntimeAgentRecord {\n name: string;\n label?: string;\n tags?: string[];\n environment: \"local\" | \"remote\" | \"both\";\n status: \"online\" | \"offline\";\n hash: string | null;\n version: string | null;\n versionNumber: number | null;\n lastRemoteHash: string | null;\n lastLocalHash: string | null;\n workerUrl: string | null;\n localPath: string | null;\n updatedAt: string | null;\n}\n\ninterface RuntimeAgentsSnapshot {\n generatedAt: string;\n projectPath: string;\n workerUrl: string | null;\n mode: \"local\" | \"remote\";\n agents: RuntimeAgentRecord[];\n}\n\nexport interface MaterializeRuntimeOptions {\n mode?: \"local\" | \"remote\";\n}\n\ninterface WranglerConfig {\n $schema: string;\n name: string;\n main: string;\n compatibility_date: string;\n compatibility_flags: string[];\n migrations: Array<{ tag: string; new_sqlite_classes: string[] }>;\n durable_objects: {\n bindings: Array<{ name: string; class_name: string }>;\n };\n kv_namespaces: Array<{ binding: string }>;\n assets: {\n directory: string;\n binding: string;\n run_worker_first: boolean;\n };\n observability: { enabled: boolean };\n upload_source_maps: boolean;\n vars: {\n KALP_ENV: \"local\" | \"remote\";\n };\n secrets: { required: string[] };\n}\n\ninterface RuntimeTemplatePaths {\n studioTemplateDir: string;\n workerEntryPath: string;\n}\n\nfunction sanitizeSegment(input: string): string {\n return input\n .toLowerCase()\n .replace(/^@/, \"\")\n .replace(/\\//g, \"-\")\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nasync function resolveProjectSlug(cwd: string): Promise<string> {\n const fallback = sanitizeSegment(basename(cwd)) || \"agent\";\n const packageJsonPath = join(cwd, \"package.json\");\n\n try {\n const content = await readFile(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content) as { name?: string };\n const name = typeof pkg.name === \"string\" ? pkg.name : \"\";\n const sanitized = sanitizeSegment(name);\n return sanitized || fallback;\n } catch {\n return fallback;\n }\n}\n\nfunction buildWorkerName(slug: string, cwd: string): string {\n const cwdHash = createHash(\"sha1\").update(cwd).digest(\"hex\").slice(0, 8);\n const withPrefix = `kalp-${slug}-${cwdHash}`;\n const maxLen = 63;\n if (withPrefix.length <= maxLen) {\n return withPrefix;\n }\n\n const clipped = withPrefix.slice(0, maxLen).replace(/-+$/g, \"\");\n return clipped || `kalp-${cwdHash}`;\n}\n\nfunction createRuntimeConfig(\n workerName: string,\n mode: \"local\" | \"remote\",\n requiredSecrets: string[],\n): WranglerConfig {\n return {\n $schema: \"node_modules/wrangler/config-schema.json\",\n name: workerName,\n main: `./${WORKER_ENTRY_FILE}`,\n compatibility_date: COMPATIBILITY_DATE,\n compatibility_flags: [\"nodejs_compat\"],\n migrations: [\n {\n tag: \"v1\",\n new_sqlite_classes: [\"AgentDurableObject\"],\n },\n ],\n durable_objects: {\n bindings: [\n {\n name: \"KALP_RUNTIME_CLOUDFLARE\",\n class_name: \"AgentDurableObject\",\n },\n ],\n },\n kv_namespaces: [\n {\n binding: \"KALP_MANIFESTS\",\n },\n ],\n assets: {\n directory: `./${STUDIO_DIR}`,\n binding: \"ASSETS\",\n run_worker_first: true,\n },\n observability: { enabled: true },\n upload_source_maps: true,\n vars: {\n KALP_ENV: mode,\n },\n secrets: {\n required: requiredSecrets,\n },\n };\n}\n\nfunction runtimeTemplateCandidates(): Array<{\n studioTemplateDir: string;\n workerEntryPath: string;\n}> {\n const here = dirname(fileURLToPath(import.meta.url));\n const distTemplateRoot = resolve(here, \"runtime-template\");\n const packageRootTemplate = resolve(here, \"..\", \"runtime-template\");\n const sourceTemplateRoot = resolve(here, \"..\", \"..\", \"runtime-template\");\n const monorepoStudioDist = resolve(\n here,\n \"..\",\n \"..\",\n \"..\",\n \"..\",\n \"apps\",\n \"studio\",\n \"dist\",\n \"client\",\n );\n\n return [\n {\n studioTemplateDir: join(distTemplateRoot, STUDIO_DIR),\n workerEntryPath: join(distTemplateRoot, WORKER_ENTRY_FILE),\n },\n {\n studioTemplateDir: join(packageRootTemplate, STUDIO_DIR),\n workerEntryPath: join(packageRootTemplate, WORKER_ENTRY_FILE),\n },\n {\n studioTemplateDir: join(sourceTemplateRoot, STUDIO_DIR),\n workerEntryPath: join(sourceTemplateRoot, WORKER_ENTRY_FILE),\n },\n {\n studioTemplateDir: monorepoStudioDist,\n workerEntryPath: join(sourceTemplateRoot, WORKER_ENTRY_FILE),\n },\n ];\n}\n\nasync function resolveRuntimeTemplate(): Promise<RuntimeTemplatePaths> {\n for (const candidate of runtimeTemplateCandidates()) {\n try {\n await access(candidate.studioTemplateDir);\n await access(candidate.workerEntryPath);\n return candidate;\n } catch {\n // continue\n }\n }\n\n throw new Error(\n \"Kalp runtime template not found in CLI package. Reinstall @kalphq/cli.\",\n );\n}\n\nfunction createStudioShell(entryScript: string, cssFiles: string[]): string {\n const cssLinks = cssFiles\n .map((file) => ` <link rel=\"stylesheet\" href=\"/studio/assets/${file}\" />`)\n .join(\"\\n\");\n\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>Kalp Studio</title>\n${cssLinks}\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/studio/assets/${entryScript}\"></script>\n </body>\n</html>\n`;\n}\n\nasync function ensureStudioIndex(studioDir: string): Promise<void> {\n const indexPath = join(studioDir, \"index.html\");\n try {\n await access(indexPath);\n return;\n } catch {\n // index.html is missing on some TanStack Start static builds.\n }\n\n const assetsDir = join(studioDir, \"assets\");\n const assetFiles = await readdir(assetsDir);\n const entryScript =\n assetFiles.find((file) => /^index-.*\\.js$/i.test(file)) ??\n assetFiles.find((file) => file.endsWith(\".js\"));\n\n if (!entryScript) {\n throw new Error(\n \"Studio runtime template is missing an entry JS bundle in studio/assets.\",\n );\n }\n\n const cssFiles = assetFiles.filter((file) => file.endsWith(\".css\")).sort();\n const html = createStudioShell(entryScript, cssFiles);\n await writeFile(indexPath, html, \"utf-8\");\n}\n\nexport async function readLocalAgentNames(cwd: string): Promise<string[]> {\n const agentsDir = join(cwd, \"agents\");\n try {\n const entries = await readdir(agentsDir, { withFileTypes: true });\n const names: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const indexPath = join(agentsDir, entry.name, \"index.ts\");\n const exists = await stat(indexPath)\n .then(() => true)\n .catch(() => false);\n if (exists) names.push(entry.name);\n }\n return names.sort((a, b) => a.localeCompare(b));\n } catch {\n return [];\n }\n}\n\nasync function createAgentsSnapshot(\n cwd: string,\n mode: \"local\" | \"remote\",\n): Promise<RuntimeAgentsSnapshot> {\n const localAgentNames = await readLocalAgentNames(cwd);\n const state = await readProjectState(cwd);\n\n const byName = new Map<string, RuntimeAgentRecord>();\n const stateAgents = state?.agents ?? {};\n\n for (const name of localAgentNames) {\n const localPath = join(cwd, \"agents\", name, \"index.ts\");\n const saved = stateAgents[name];\n const hasRemoteVersion = !!saved?.lastRemoteHash && (saved?.currentVersion ?? 0) > 0;\n\n if (mode === \"remote\" && !hasRemoteVersion) {\n continue;\n }\n\n const resolvedWorkerUrl =\n saved?.workerUrl ??\n (state?.workerUrl ? `${state.workerUrl.replace(/\\/$/, \"\")}/a/${name}` : null);\n const versionNumber =\n typeof saved?.currentVersion === \"number\" && saved.currentVersion > 0\n ? saved.currentVersion\n : null;\n\n byName.set(name, {\n name,\n label: deriveLabelFromName(name),\n tags: [],\n environment:\n mode === \"remote\"\n ? \"remote\"\n : hasRemoteVersion\n ? \"both\"\n : \"local\",\n status: resolvedWorkerUrl ? \"online\" : \"offline\",\n hash: saved?.currentHash ?? null,\n version: versionNumber ? `v${versionNumber}` : null,\n versionNumber,\n lastRemoteHash: saved?.lastRemoteHash ?? null,\n lastLocalHash: saved?.lastLocalHash ?? null,\n workerUrl: resolvedWorkerUrl,\n localPath,\n updatedAt: saved?.lastPushedAt ?? state?.deployedAt ?? null,\n });\n }\n\n if (mode === \"remote\") {\n for (const [name, saved] of Object.entries(stateAgents)) {\n const hasRemoteVersion =\n !!saved.lastRemoteHash && (saved.currentVersion ?? 0) > 0;\n if (!hasRemoteVersion || byName.has(name)) continue;\n\n const localPath = saved.localPath ?? join(cwd, \"agents\", name, \"index.ts\");\n const workerUrl =\n saved.workerUrl ??\n (state?.workerUrl ? `${state.workerUrl.replace(/\\/$/, \"\")}/a/${name}` : null);\n const versionNumber = saved.currentVersion > 0 ? saved.currentVersion : null;\n\n byName.set(name, {\n name,\n label: deriveLabelFromName(name),\n tags: [],\n environment: \"remote\",\n status: workerUrl ? \"online\" : \"offline\",\n hash: saved.currentHash ?? null,\n version: versionNumber ? `v${versionNumber}` : null,\n versionNumber,\n lastRemoteHash: saved.lastRemoteHash ?? null,\n lastLocalHash: saved.lastLocalHash ?? null,\n workerUrl,\n localPath,\n updatedAt: saved.lastPushedAt ?? state?.deployedAt ?? null,\n });\n }\n }\n\n return {\n generatedAt: new Date().toISOString(),\n projectPath: cwd,\n workerUrl: state?.workerUrl ?? null,\n mode,\n agents: Array.from(byName.values()).sort((a, b) => a.name.localeCompare(b.name)),\n };\n}\n\nexport async function writeRuntimeAgentsSnapshot(params: {\n cwd: string;\n runtimeDir: string;\n mode: \"local\" | \"remote\";\n}): Promise<void> {\n const snapshot = await createAgentsSnapshot(params.cwd, params.mode);\n await writeFile(\n join(params.runtimeDir, \"agents.snapshot.json\"),\n `${JSON.stringify(snapshot, null, 2)}\\n`,\n \"utf-8\",\n );\n}\n\nexport async function materializeRuntime(\n cwd: string,\n options: MaterializeRuntimeOptions = {},\n): Promise<RuntimePaths> {\n const mode = options.mode ?? \"remote\";\n const runtimeDir = join(cwd, RUNTIME_ROOT, RUNTIME_DIR);\n const studioDir = join(runtimeDir, STUDIO_DIR);\n const workerEntrypointPath = join(runtimeDir, WORKER_ENTRY_FILE);\n const wranglerConfigPath = join(runtimeDir, WRANGLER_CONFIG_FILE);\n\n const template = await resolveRuntimeTemplate();\n await rm(runtimeDir, { recursive: true, force: true });\n await mkdir(runtimeDir, { recursive: true });\n\n await cp(template.studioTemplateDir, studioDir, { recursive: true });\n await cp(template.workerEntryPath, workerEntrypointPath);\n await ensureStudioIndex(studioDir);\n await writeRuntimeAgentsSnapshot({ cwd, runtimeDir, mode });\n const identity = await materializeRuntimeIdentity({ cwd, runtimeDir });\n\n const projectSlug = await resolveProjectSlug(cwd);\n const workerName = buildWorkerName(projectSlug, cwd);\n const requiredSecrets = new Set<string>([\n \"KALP_SECRET_KEY\",\n \"KALP_STUDIO_PASSWORD\",\n \"KALP_STUDIO_ADMIN_USER\",\n \"KALP_SERVICE_KEY\",\n ]);\n\n try {\n const provider = await resolveProviderFromConfig(cwd);\n requiredSecrets.add(getRequiredSecretForProvider(provider));\n } catch {\n // Ignore provider resolution errors here; deploy preflight handles strict checks.\n }\n\n const identityRequirements = resolveIdentityAuthRequirements(identity.identityConfig);\n for (const requirement of identityRequirements) {\n requiredSecrets.add(requirement.envKey);\n }\n\n const wranglerConfig = createRuntimeConfig(\n workerName,\n mode,\n [...requiredSecrets].sort((a, b) => a.localeCompare(b)),\n );\n await writeFile(\n wranglerConfigPath,\n `${JSON.stringify(wranglerConfig, null, 2)}\\n`,\n \"utf-8\",\n );\n\n return {\n runtimeDir,\n studioDir,\n workerEntrypointPath,\n wranglerConfigPath,\n workerName,\n };\n}\n","import { access, readFile } from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createJiti } from \"jiti\";\n\nexport type AIProvider = \"openai\" | \"anthropic\" | \"openrouter\" | \"custom\";\n\nconst PROVIDER_SECRET_MAP: Record<AIProvider, string> = {\n openai: \"OPENAI_API_KEY\",\n anthropic: \"ANTHROPIC_API_KEY\",\n openrouter: \"OPENROUTER_API_KEY\",\n custom: \"CUSTOM_AI_API_KEY\",\n};\n\nfunction parseEnv(content: string): Record<string, string> {\n const env: Record<string, string> = {};\n for (const raw of content.split(/\\r?\\n/g)) {\n const line = raw.trim();\n if (!line || line.startsWith(\"#\")) continue;\n const idx = line.indexOf(\"=\");\n if (idx <= 0) continue;\n env[line.slice(0, idx).trim()] = line.slice(idx + 1);\n }\n return env;\n}\n\nexport async function resolveProviderFromConfig(cwd: string): Promise<AIProvider> {\n const configPath = join(cwd, \"kalp.config.ts\");\n await access(configPath, constants.F_OK);\n const jiti = createJiti(cwd, { interopDefault: true });\n const config = (await jiti.import(configPath)) as\n | { default?: { ai?: { provider?: AIProvider } }; ai?: { provider?: AIProvider } }\n | undefined;\n const provider = config?.default?.ai?.provider ?? config?.ai?.provider ?? \"openai\";\n return provider;\n}\n\nexport async function readDotEnv(cwd: string): Promise<Record<string, string>> {\n const envPath = join(cwd, \".env\");\n const content = await readFile(envPath, \"utf-8\").catch(() => \"\");\n return parseEnv(content);\n}\n\nexport function getRequiredSecretForProvider(provider: AIProvider): string {\n return PROVIDER_SECRET_MAP[provider];\n}\n","import { build } from \"esbuild\";\nimport { writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n loadProjectConfig,\n resolveRuntimeIdentityConfig,\n type RuntimeIdentityConfig,\n} from \"@/utils/project-config\";\n\nexport interface MaterializeRuntimeIdentityResult {\n identityConfig: RuntimeIdentityConfig;\n identityConfigPath: string;\n identityMapPath: string;\n}\n\nconst DEFAULT_IDENTITY_MAP_SOURCE = `export default function mapIdentity(payload) {\n const sub =\n payload && typeof payload === \"object\" && typeof payload.sub === \"string\"\n ? payload.sub\n : \"anonymous\";\n return { userId: sub, claims: {} };\n}\n`;\n\nfunction readIdentityMapCandidate(rawConfig: Record<string, unknown>): unknown {\n if (!rawConfig.identity || typeof rawConfig.identity !== \"object\") return null;\n return (rawConfig.identity as Record<string, unknown>).mapIdentity;\n}\n\nfunction assertEdgeSafeSource(mapIdentitySource: string): void {\n const blockedPatterns: Array<{ regex: RegExp; label: string }> = [\n { regex: /\\brequire\\s*\\(/, label: \"require(...)\" },\n { regex: /\\bnode:/, label: \"node:* imports\" },\n { regex: /\\bprocess\\./, label: \"process.*\" },\n { regex: /\\bBuffer\\b/, label: \"Buffer\" },\n { regex: /\\bimport\\s*\\(/, label: \"dynamic import(...)\" },\n ];\n\n const hit = blockedPatterns.find((item) => item.regex.test(mapIdentitySource));\n if (!hit) return;\n\n throw new Error(\n `mapIdentity uses \"${hit.label}\", which is not supported in edge runtime.`,\n );\n}\n\nasync function writeDefaultIdentityMap(identityMapPath: string): Promise<void> {\n await writeFile(identityMapPath, DEFAULT_IDENTITY_MAP_SOURCE, \"utf-8\");\n}\n\nasync function bundleIdentityMap(params: {\n cwd: string;\n mapIdentitySource: string;\n identityMapPath: string;\n}): Promise<void> {\n const { cwd, mapIdentitySource, identityMapPath } = params;\n assertEdgeSafeSource(mapIdentitySource);\n\n const entrySource = `\nconst mapIdentity = (${mapIdentitySource});\nif (typeof mapIdentity !== \"function\") {\n throw new Error(\"identity.mapIdentity must be a function.\");\n}\nexport default mapIdentity;\n`;\n\n try {\n await build({\n absWorkingDir: cwd,\n bundle: true,\n format: \"esm\",\n platform: \"browser\",\n target: [\"es2022\"],\n write: true,\n outfile: identityMapPath,\n logLevel: \"silent\",\n stdin: {\n contents: entrySource,\n resolveDir: cwd,\n sourcefile: \"kalp-identity-map-entry.mjs\",\n loader: \"js\",\n },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n [\n \"Could not bundle identity.mapIdentity for runtime.\",\n \"Please verify:\",\n \" • kalp.config.ts exists and exports default defineConfig(...)\",\n \" • mapIdentity is declared inline and does not capture external variables\",\n \" • mapIdentity does not use Node-specific APIs\",\n \" • kalp.config.ts has no broken imports\",\n `Technical details: ${message}`,\n ].join(\"\\n\"),\n );\n }\n}\n\nexport async function materializeRuntimeIdentity(params: {\n cwd: string;\n runtimeDir: string;\n}): Promise<MaterializeRuntimeIdentityResult> {\n const { cwd, runtimeDir } = params;\n const identityConfigPath = join(runtimeDir, \"identity.config.json\");\n const identityMapPath = join(runtimeDir, \"identity.map.mjs\");\n\n let rawConfig: Record<string, unknown> = {};\n try {\n const loaded = await loadProjectConfig(cwd);\n rawConfig = loaded.raw;\n } catch {\n rawConfig = {};\n }\n\n const identityConfig = resolveRuntimeIdentityConfig(rawConfig);\n await writeFile(\n identityConfigPath,\n `${JSON.stringify(identityConfig, null, 2)}\\n`,\n \"utf-8\",\n );\n\n const mapIdentity = readIdentityMapCandidate(rawConfig);\n if (typeof mapIdentity === \"function\") {\n const mapIdentitySource = mapIdentity.toString();\n if (!mapIdentitySource || /\\[native code\\]/.test(mapIdentitySource)) {\n throw new Error(\n \"Could not serialize identity.mapIdentity. Define it inline in kalp.config.ts as a regular function.\",\n );\n }\n await bundleIdentityMap({\n cwd,\n mapIdentitySource,\n identityMapPath,\n });\n } else {\n await writeDefaultIdentityMap(identityMapPath);\n }\n\n return { identityConfig, identityConfigPath, identityMapPath };\n}\n"],"mappings":"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","names":["access","mkdir","readFile","writeFile","join","readFile","join","writeFile","join","writeFile","join","join","readFile","access","writeFile","mkdir"]}
@@ -5,6 +5,14 @@ import { readFile, writeFile } from "fs/promises";
5
5
  import { join } from "path";
6
6
  var SECRETS_ARRAY_REGEX = /secrets:\s*\[([\s\S]*?)\]/m;
7
7
  var SECRET_LITERAL_REGEX = /["'`]([^"'`]+)["'`]/g;
8
+ var INTERNAL_PREFIX = "KALP_";
9
+ function isInternalSecret(name) {
10
+ return name.trim().toUpperCase().startsWith(INTERNAL_PREFIX);
11
+ }
12
+ function filterInternalSecrets(secrets, includeInternal = false) {
13
+ if (includeInternal) return [...secrets];
14
+ return secrets.filter((name) => !isInternalSecret(name));
15
+ }
8
16
  async function readLocalSecretsFromConfig(cwd) {
9
17
  const configPath = join(cwd, "kalp.config.ts");
10
18
  const content = await readFile(configPath, "utf-8").catch(() => {
@@ -40,8 +48,9 @@ function mergeSecrets(base, incoming) {
40
48
  }
41
49
 
42
50
  export {
51
+ filterInternalSecrets,
43
52
  readLocalSecretsFromConfig,
44
53
  writeLocalSecretsToConfig,
45
54
  mergeSecrets
46
55
  };
47
- //# sourceMappingURL=chunk-EHNC6ITP.js.map
56
+ //# sourceMappingURL=chunk-YE2SFYAJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/secrets-config.ts"],"sourcesContent":["import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nconst SECRETS_ARRAY_REGEX = /secrets:\\s*\\[([\\s\\S]*?)\\]/m;\nconst SECRET_LITERAL_REGEX = /[\"'`]([^\"'`]+)[\"'`]/g;\nconst INTERNAL_PREFIX = \"KALP_\";\n\nexport function isInternalSecret(name: string): boolean {\n return name.trim().toUpperCase().startsWith(INTERNAL_PREFIX);\n}\n\nexport function filterInternalSecrets(\n secrets: string[],\n includeInternal = false,\n): string[] {\n if (includeInternal) return [...secrets];\n return secrets.filter((name) => !isInternalSecret(name));\n}\n\nexport async function readLocalSecretsFromConfig(cwd: string): Promise<string[]> {\n const configPath = join(cwd, \"kalp.config.ts\");\n const content = await readFile(configPath, \"utf-8\").catch(() => {\n throw new Error(\"kalp.config.ts not found. Run create-kalp first.\");\n });\n\n const match = content.match(SECRETS_ARRAY_REGEX);\n if (!match) return [];\n const body = match[1] ?? \"\";\n const values: string[] = [];\n let item: RegExpExecArray | null;\n while ((item = SECRET_LITERAL_REGEX.exec(body)) !== null) {\n if (item[1]) values.push(item[1]);\n }\n return [...new Set(values)].sort((a, b) => a.localeCompare(b));\n}\n\nexport async function writeLocalSecretsToConfig(\n cwd: string,\n secrets: string[],\n): Promise<void> {\n const configPath = join(cwd, \"kalp.config.ts\");\n const content = await readFile(configPath, \"utf-8\").catch(() => {\n throw new Error(\"kalp.config.ts not found. Run create-kalp first.\");\n });\n\n if (!SECRETS_ARRAY_REGEX.test(content)) {\n throw new Error(\n \"Could not find `secrets: []` in kalp.config.ts. Add a secrets array first.\",\n );\n }\n\n const sorted = [...new Set(secrets)]\n .map((value) => value.trim())\n .filter(Boolean)\n .sort((a, b) => a.localeCompare(b));\n\n const serialized =\n sorted.length > 0 ? sorted.map((secret) => `\"${secret}\"`).join(\", \") : \"\";\n const next = content.replace(SECRETS_ARRAY_REGEX, `secrets: [${serialized}]`);\n await writeFile(configPath, next, \"utf-8\");\n}\n\nexport function mergeSecrets(\n base: string[],\n incoming: string[],\n): string[] {\n return [...new Set([...base, ...incoming].map((value) => value.trim()).filter(Boolean))]\n .sort((a, b) => a.localeCompare(b));\n}\n"],"mappings":";;;AAAA,SAAS,UAAU,iBAAiB;AACpC,SAAS,YAAY;AAErB,IAAM,sBAAsB;AAC5B,IAAM,uBAAuB;AAC7B,IAAM,kBAAkB;AAEjB,SAAS,iBAAiB,MAAuB;AACtD,SAAO,KAAK,KAAK,EAAE,YAAY,EAAE,WAAW,eAAe;AAC7D;AAEO,SAAS,sBACd,SACA,kBAAkB,OACR;AACV,MAAI,gBAAiB,QAAO,CAAC,GAAG,OAAO;AACvC,SAAO,QAAQ,OAAO,CAAC,SAAS,CAAC,iBAAiB,IAAI,CAAC;AACzD;AAEA,eAAsB,2BAA2B,KAAgC;AAC/E,QAAM,aAAa,KAAK,KAAK,gBAAgB;AAC7C,QAAM,UAAU,MAAM,SAAS,YAAY,OAAO,EAAE,MAAM,MAAM;AAC9D,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE,CAAC;AAED,QAAM,QAAQ,QAAQ,MAAM,mBAAmB;AAC/C,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,QAAM,OAAO,MAAM,CAAC,KAAK;AACzB,QAAM,SAAmB,CAAC;AAC1B,MAAI;AACJ,UAAQ,OAAO,qBAAqB,KAAK,IAAI,OAAO,MAAM;AACxD,QAAI,KAAK,CAAC,EAAG,QAAO,KAAK,KAAK,CAAC,CAAC;AAAA,EAClC;AACA,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAC/D;AAEA,eAAsB,0BACpB,KACA,SACe;AACf,QAAM,aAAa,KAAK,KAAK,gBAAgB;AAC7C,QAAM,UAAU,MAAM,SAAS,YAAY,OAAO,EAAE,MAAM,MAAM;AAC9D,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE,CAAC;AAED,MAAI,CAAC,oBAAoB,KAAK,OAAO,GAAG;AACtC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,EAChC,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO,EACd,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAEpC,QAAM,aACJ,OAAO,SAAS,IAAI,OAAO,IAAI,CAAC,WAAW,IAAI,MAAM,GAAG,EAAE,KAAK,IAAI,IAAI;AACzE,QAAM,OAAO,QAAQ,QAAQ,qBAAqB,aAAa,UAAU,GAAG;AAC5E,QAAM,UAAU,YAAY,MAAM,OAAO;AAC3C;AAEO,SAAS,aACd,MACA,UACU;AACV,SAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,MAAM,GAAG,QAAQ,EAAE,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC,EACpF,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AACtC;","names":[]}
@@ -1,7 +1,11 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ generateTypes
4
+ } from "./chunk-LPEV4QH2.js";
2
5
  import {
3
6
  isProjectInitialized
4
7
  } from "./chunk-INB3LG6O.js";
8
+ import "./chunk-EXXTCGKR.js";
5
9
 
6
10
  // src/commands/create.ts
7
11
  import { defineCommand } from "citty";
@@ -121,6 +125,7 @@ var create_default = defineCommand({
121
125
  cwd,
122
126
  template: agentAnswers.template
123
127
  });
128
+ await generateTypes(cwd);
124
129
  s.stop(
125
130
  agentAnswers.template ? `Agent created (${agentAnswers.template} template)` : "Agent created"
126
131
  );
@@ -143,4 +148,4 @@ var create_default = defineCommand({
143
148
  export {
144
149
  create_default as default
145
150
  };
146
- //# sourceMappingURL=create-XC55BUCS.js.map
151
+ //# sourceMappingURL=create-UCJ77P62.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/create.ts","../src/utils/ui.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { scaffoldAgent } from \"@kalphq/project\";\nimport { isProjectInitialized } from \"@/utils/fs\";\nimport { generateTypes } from \"@/utils/codegen\";\nimport { promptAgentDetails } from \"@/utils/ui\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"create\", description: \"Add a new agent to the project\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp create\")}`);\n\n // ── Check if project is initialized ─────────────────────────────────\n const needsInit = !(await isProjectInitialized(cwd));\n\n if (needsInit) {\n p.log.error(\"This is not a Kalp project.\");\n console.log(\"\");\n console.log(\" Run:\");\n console.log(` ${pc.cyan(\"npx create-kalp@latest\")}`);\n console.log(\"\");\n process.exit(1);\n }\n\n // ── Agent prompts ────────────────────────────────────────────────────\n const agentAnswers = await promptAgentDetails({ includeTemplate: true });\n\n // ── Check if agent already exists ────────────────────────────────────\n const agentDir = join(cwd, \"agents\", agentAnswers.name);\n if (existsSync(agentDir)) {\n p.log.error(`Agent \"${agentAnswers.name}\" already exists.`);\n console.log(\"\");\n console.log(` ${pc.dim(\"Location:\")} ${pc.cyan(agentDir)}`);\n console.log(\"\");\n console.log(\n ` ${pc.dim(\"Choose a different name or remove the existing agent.\")}`,\n );\n process.exit(1);\n }\n\n const s = p.spinner();\n\n // ── Scaffold agent ───────────────────────────────────────────────────\n s.start(`Scaffolding agent ${pc.cyan(agentAnswers.name)}`);\n await scaffoldAgent({\n agentName: agentAnswers.name,\n label: agentAnswers.label,\n cwd,\n template: agentAnswers.template,\n });\n await generateTypes(cwd);\n s.stop(\n agentAnswers.template\n ? `Agent created (${agentAnswers.template} template)`\n : \"Agent created\",\n );\n\n p.note(\n [\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/index.ts`)} ${pc.dim(\"— Agent entrypoint with config\")}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/contract/`)} ${pc.dim(\"— RPC contract definition\")}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/hooks/`)} ${pc.dim(\"— Lifecycle hooks (onInit, onTick)\")}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/routes/`)} ${pc.dim(\"— HTTP endpoints\")}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/steps/`)} ${pc.dim(\"— Reusable workflow steps\")}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/tools/`)} ${pc.dim(\"— Callable agent tools\")}`,\n ].join(\"\\n\"),\n \"Created\",\n );\n\n p.outro(\n `${LOGO} ${pc.green(`Agent ${pc.bold(agentAnswers.name)} is ready.`)}`,\n );\n },\n});\n","import * as p from \"@clack/prompts\";\nimport { deriveLabelFromName, type TemplateId } from \"@kalphq/project\";\n\n/**\n * Prompt user to select an agent template.\n */\nexport async function promptTemplateSelection(): Promise<TemplateId> {\n const answer = await p.select({\n message: \"Choose an agent template:\",\n options: [\n {\n value: \"researcher\",\n label: \"🔬 Researcher\",\n hint: \"Deterministic scheduling - pause 24h and auto-resume\",\n },\n {\n value: \"support\",\n label: \"🎧 Support Agent\",\n hint: \"Human-in-the-Loop - pause for days until resolved\",\n },\n {\n value: \"blank\",\n label: \"⬜ Blank\",\n hint: \"Minimal structure with modern Kalp v1 syntax\",\n },\n {\n value: \"ops-revenue\",\n label: \"📈 Revenue Ops\",\n hint: \"Pipeline qualification + human handoff + event-driven orchestration\",\n },\n ],\n });\n\n if (p.isCancel(answer)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n return answer as TemplateId;\n}\n\nexport async function promptProjectName(opts?: {\n message?: string;\n placeholder?: string;\n allowCurrentDir?: boolean;\n}): Promise<string> {\n const message = opts?.message ?? \"Project name?\";\n const placeholder = opts?.placeholder ?? \"my-project\";\n const allowCurrentDir = opts?.allowCurrentDir ?? false;\n\n const answer = await p.text({\n message,\n placeholder,\n validate: (v) => {\n const value = v.trim();\n if (!value) return \"Project name is required.\";\n if (allowCurrentDir && value === \".\") return;\n if (!/^[a-z0-9-]+$/.test(value)) {\n return allowCurrentDir\n ? \"Use lowercase letters, numbers, and dashes only (or . for current directory).\"\n : \"Use lowercase letters, numbers, and dashes only.\";\n }\n },\n });\n\n if (p.isCancel(answer)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n return answer.trim();\n}\n\nexport async function promptAgentDetails(opts?: {\n includeTemplate?: boolean;\n}): Promise<{\n name: string;\n label: string;\n template?: TemplateId;\n}> {\n const answers = await p.group(\n {\n name: () =>\n p.text({\n message: \"Agent name?\",\n placeholder: \"my-agent\",\n validate: (v) => {\n if (!v.trim()) return \"Agent name is required.\";\n if (!/^[a-z0-9-]+$/.test(v)) {\n return \"Use lowercase letters, numbers, and dashes only.\";\n }\n },\n }),\n ...(opts?.includeTemplate && {\n template: () => promptTemplateSelection(),\n }),\n label: ({ results }) =>\n p.text({\n message: \"Agent label? (display name)\",\n placeholder: deriveLabelFromName(results.name as string),\n initialValue: deriveLabelFromName(results.name as string),\n validate: (v) => {\n if (!v.trim()) return \"Agent label is required.\";\n },\n }),\n },\n {\n onCancel: () => {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n },\n },\n );\n\n return {\n name: answers.name,\n label: String(answers.label),\n template: answers.template as TemplateId | undefined,\n };\n}\n"],"mappings":"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","names":["p"]}
@@ -1,21 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  generateTypes
4
- } from "./chunk-MMS3GWBG.js";
4
+ } from "./chunk-LPEV4QH2.js";
5
5
  import {
6
6
  readLocalSecretsFromConfig,
7
7
  writeLocalSecretsToConfig
8
- } from "./chunk-EHNC6ITP.js";
8
+ } from "./chunk-YE2SFYAJ.js";
9
9
  import {
10
10
  resolveSecretsRuntimeConfigPath
11
- } from "./chunk-FP3ZLBYT.js";
11
+ } from "./chunk-IZXCZ3IA.js";
12
12
  import "./chunk-INB3LG6O.js";
13
+ import "./chunk-XVD3FFOJ.js";
13
14
  import {
14
15
  requireAuth,
15
16
  resolveProvider
16
17
  } from "./chunk-S3KAVLVM.js";
17
18
  import "./chunk-FO24J6XL.js";
18
- import "./chunk-DHCCSWJN.js";
19
+ import "./chunk-EXXTCGKR.js";
19
20
 
20
21
  // src/commands/secrets/delete.ts
21
22
  import { defineCommand } from "citty";
@@ -126,4 +127,4 @@ var delete_default = defineCommand({
126
127
  export {
127
128
  delete_default as default
128
129
  };
129
- //# sourceMappingURL=delete-BQFFYYWZ.js.map
130
+ //# sourceMappingURL=delete-FIXMFFNZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/secrets/delete.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { generateTypes } from \"@/utils/codegen\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport { readLocalSecretsFromConfig, writeLocalSecretsToConfig } from \"@/utils/secrets-config\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete a secret from remote runtime and local config\",\n },\n args: {\n key: {\n type: \"string\",\n alias: \"k\",\n description: \"Secret key to delete\",\n },\n yes: {\n type: \"boolean\",\n alias: \"y\",\n description: \"Skip confirmation prompt\",\n default: false,\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp secrets delete -k <KEY>`);\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets delete\")}`);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n let configPath: string;\n try {\n configPath = await resolveSecretsRuntimeConfigPath(cwd);\n } catch (error) {\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n const provider = resolveProvider();\n let remoteSecrets;\n try {\n remoteSecrets = await provider.listSecrets({ cwd, configPath });\n } catch (error) {\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n if (!remoteSecrets || remoteSecrets.length === 0) {\n p.log.info(pc.dim(\"No remote secrets to delete.\"));\n p.outro(\"Done\");\n return;\n }\n\n let key = args.key?.trim();\n if (!key) {\n const selected = await p.select({\n message: \"Select a secret to delete\",\n options: remoteSecrets\n .map((secret) => secret.name)\n .sort((a, b) => a.localeCompare(b))\n .map((name) => ({ value: name, label: name })),\n });\n if (p.isCancel(selected)) {\n p.outro(\"Cancelled\");\n return;\n }\n key = String(selected);\n }\n\n const existsRemote = remoteSecrets.some((secret) => secret.name === key);\n if (!existsRemote) {\n p.log.error(`Secret ${pc.cyan(key)} not found in remote runtime.`);\n process.exit(1);\n }\n\n if (!args.yes) {\n const confirmed = await p.confirm({\n message: `Delete ${pc.cyan(key)} from remote runtime and local config?`,\n initialValue: false,\n });\n if (p.isCancel(confirmed) || !confirmed) {\n p.outro(\"Cancelled\");\n return;\n }\n }\n\n const spinner = p.spinner();\n spinner.start(`Deleting ${pc.cyan(key)}`);\n\n try {\n await provider.deleteSecret({ cwd, configPath, name: key });\n const localSecrets = await readLocalSecretsFromConfig(cwd);\n await writeLocalSecretsToConfig(\n cwd,\n localSecrets.filter((secret) => secret !== key),\n );\n await generateTypes(cwd);\n\n spinner.stop(`Secret ${pc.cyan(key)} deleted`);\n p.outro(\"Done\");\n } catch (error) {\n spinner.stop(\"Failed to delete secret\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["spinner"]}
1
+ {"version":3,"sources":["../src/commands/secrets/delete.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { generateTypes } from \"@/utils/codegen\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport { readLocalSecretsFromConfig, writeLocalSecretsToConfig } from \"@/utils/secrets-config\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete a secret from remote runtime and local config\",\n },\n args: {\n key: {\n type: \"string\",\n alias: \"k\",\n description: \"Secret key to delete\",\n },\n yes: {\n type: \"boolean\",\n alias: \"y\",\n description: \"Skip confirmation prompt\",\n default: false,\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp secrets delete -k <KEY>`);\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets delete\")}`);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n let configPath: string;\n try {\n configPath = await resolveSecretsRuntimeConfigPath(cwd);\n } catch (error) {\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n const provider = resolveProvider();\n let remoteSecrets;\n try {\n remoteSecrets = await provider.listSecrets({ cwd, configPath });\n } catch (error) {\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n if (!remoteSecrets || remoteSecrets.length === 0) {\n p.log.info(pc.dim(\"No remote secrets to delete.\"));\n p.outro(\"Done\");\n return;\n }\n\n let key = args.key?.trim();\n if (!key) {\n const selected = await p.select({\n message: \"Select a secret to delete\",\n options: remoteSecrets\n .map((secret) => secret.name)\n .sort((a, b) => a.localeCompare(b))\n .map((name) => ({ value: name, label: name })),\n });\n if (p.isCancel(selected)) {\n p.outro(\"Cancelled\");\n return;\n }\n key = String(selected);\n }\n\n const existsRemote = remoteSecrets.some((secret) => secret.name === key);\n if (!existsRemote) {\n p.log.error(`Secret ${pc.cyan(key)} not found in remote runtime.`);\n process.exit(1);\n }\n\n if (!args.yes) {\n const confirmed = await p.confirm({\n message: `Delete ${pc.cyan(key)} from remote runtime and local config?`,\n initialValue: false,\n });\n if (p.isCancel(confirmed) || !confirmed) {\n p.outro(\"Cancelled\");\n return;\n }\n }\n\n const spinner = p.spinner();\n spinner.start(`Deleting ${pc.cyan(key)}`);\n\n try {\n await provider.deleteSecret({ cwd, configPath, name: key });\n const localSecrets = await readLocalSecretsFromConfig(cwd);\n await writeLocalSecretsToConfig(\n cwd,\n localSecrets.filter((secret) => secret !== key),\n );\n await generateTypes(cwd);\n\n spinner.stop(`Secret ${pc.cyan(key)} deleted`);\n p.outro(\"Done\");\n } catch (error) {\n spinner.stop(\"Failed to delete secret\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["spinner"]}
@@ -6,17 +6,18 @@ import {
6
6
  } from "./chunk-5SZMD7E6.js";
7
7
  import {
8
8
  resolveSecretsRuntimeConfigPath
9
- } from "./chunk-FP3ZLBYT.js";
9
+ } from "./chunk-IZXCZ3IA.js";
10
10
  import "./chunk-INB3LG6O.js";
11
+ import {
12
+ readProjectState,
13
+ writeProjectState
14
+ } from "./chunk-XVD3FFOJ.js";
11
15
  import {
12
16
  requireAuth,
13
17
  resolveProvider
14
18
  } from "./chunk-S3KAVLVM.js";
15
19
  import "./chunk-FO24J6XL.js";
16
- import {
17
- readProjectState,
18
- writeProjectState
19
- } from "./chunk-DHCCSWJN.js";
20
+ import "./chunk-EXXTCGKR.js";
20
21
 
21
22
  // src/commands/agents/delete.ts
22
23
  import { defineCommand } from "citty";
@@ -141,4 +142,4 @@ var delete_default = defineCommand({
141
142
  export {
142
143
  delete_default as default
143
144
  };
144
- //# sourceMappingURL=delete-LW2G4GCN.js.map
145
+ //# sourceMappingURL=delete-QPYVL4OU.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/agents/delete.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport {\n readRemoteAgentPointers,\n readRemoteAgentsIndex,\n writeRemoteAgentsIndex,\n} from \"@/utils/agents-remote\";\nimport { readProjectState, writeProjectState } from \"@/utils/project-state\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete an agent from remote runtime\",\n },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name to delete from remote runtime\",\n required: true,\n },\n yes: {\n type: \"boolean\",\n alias: \"y\",\n description: \"Skip confirmation\",\n default: false,\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp agents delete -a <agent>`);\n return;\n }\n\n const cwd = process.cwd();\n p.intro(`${LOGO} ${pc.bold(\"kalp agents delete\")}`);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n const spinner = p.spinner();\n spinner.start(\"Loading remote agents\");\n\n try {\n const configPath = await resolveSecretsRuntimeConfigPath(cwd);\n const provider = resolveProvider();\n const [indexEntries, pointers] = await Promise.all([\n readRemoteAgentsIndex(cwd, configPath),\n readRemoteAgentPointers(cwd, configPath),\n ]);\n\n const indexByName = new Map(\n indexEntries.map((entry) => [entry.name, entry]),\n );\n const pointerByName = new Map(\n pointers.map((entry) => [entry.name, entry.hash]),\n );\n const remoteNames = [...new Set([...indexByName.keys(), ...pointerByName.keys()])].sort(\n (a, b) => a.localeCompare(b),\n );\n\n spinner.stop(`Found ${remoteNames.length} remote agents`);\n if (remoteNames.length === 0) {\n p.log.info(pc.dim(\"No remote agents available to delete.\"));\n p.outro(\"Done\");\n return;\n }\n\n const agentName = args.agent?.trim();\n if (!agentName) {\n p.log.error(\n `Agent name is required. Use ${pc.cyan(\"kalp agents delete -a <agent>\")}.`,\n );\n process.exit(1);\n }\n\n if (!remoteNames.includes(agentName)) {\n p.log.error(`Agent ${pc.cyan(agentName)} is not deployed remotely.`);\n process.exit(1);\n }\n\n if (!args.yes) {\n const confirm = await p.confirm({\n message: `Delete ${pc.cyan(agentName)} from remote runtime?`,\n initialValue: false,\n });\n if (p.isCancel(confirm) || !confirm) {\n p.log.info(\"Cancelled.\");\n return;\n }\n }\n\n const hashes = new Set<string>();\n const pointerHash = pointerByName.get(agentName);\n if (pointerHash) hashes.add(pointerHash);\n const indexedHash = indexByName.get(agentName)?.hash;\n if (indexedHash) hashes.add(indexedHash);\n\n spinner.start(`Deleting ${pc.cyan(agentName)} from remote runtime`);\n const latestKey = `${agentName}:latest`;\n await provider\n .deleteValue({ cwd, configPath, key: latestKey })\n .catch(() => null);\n for (const hash of hashes) {\n await provider\n .deleteValue({ cwd, configPath, key: `${agentName}:${hash}` })\n .catch(() => null);\n }\n\n const filteredIndex = indexEntries.filter(\n (entry) => entry.name !== agentName,\n );\n await writeRemoteAgentsIndex(cwd, configPath, filteredIndex);\n\n const state = await readProjectState(cwd);\n if (state?.agents?.[agentName]) {\n state.agents[agentName].lastRemoteHash = null;\n state.agents[agentName].workerUrl = null;\n await writeProjectState(cwd, state);\n }\n\n spinner.stop(`Deleted remote agent ${pc.cyan(agentName)}`);\n p.log.info(\n pc.dim(\n `Local files were not changed. Delete ./agents/${agentName} manually if you no longer need it.`,\n ),\n );\n } catch (error) {\n spinner.stop(\"Failed to delete remote agent\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["spinner","confirm"]}
1
+ {"version":3,"sources":["../src/commands/agents/delete.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport {\n readRemoteAgentPointers,\n readRemoteAgentsIndex,\n writeRemoteAgentsIndex,\n} from \"@/utils/agents-remote\";\nimport { readProjectState, writeProjectState } from \"@/utils/project-state\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete an agent from remote runtime\",\n },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name to delete from remote runtime\",\n required: true,\n },\n yes: {\n type: \"boolean\",\n alias: \"y\",\n description: \"Skip confirmation\",\n default: false,\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp agents delete -a <agent>`);\n return;\n }\n\n const cwd = process.cwd();\n p.intro(`${LOGO} ${pc.bold(\"kalp agents delete\")}`);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n const spinner = p.spinner();\n spinner.start(\"Loading remote agents\");\n\n try {\n const configPath = await resolveSecretsRuntimeConfigPath(cwd);\n const provider = resolveProvider();\n const [indexEntries, pointers] = await Promise.all([\n readRemoteAgentsIndex(cwd, configPath),\n readRemoteAgentPointers(cwd, configPath),\n ]);\n\n const indexByName = new Map(\n indexEntries.map((entry) => [entry.name, entry]),\n );\n const pointerByName = new Map(\n pointers.map((entry) => [entry.name, entry.hash]),\n );\n const remoteNames = [...new Set([...indexByName.keys(), ...pointerByName.keys()])].sort(\n (a, b) => a.localeCompare(b),\n );\n\n spinner.stop(`Found ${remoteNames.length} remote agents`);\n if (remoteNames.length === 0) {\n p.log.info(pc.dim(\"No remote agents available to delete.\"));\n p.outro(\"Done\");\n return;\n }\n\n const agentName = args.agent?.trim();\n if (!agentName) {\n p.log.error(\n `Agent name is required. Use ${pc.cyan(\"kalp agents delete -a <agent>\")}.`,\n );\n process.exit(1);\n }\n\n if (!remoteNames.includes(agentName)) {\n p.log.error(`Agent ${pc.cyan(agentName)} is not deployed remotely.`);\n process.exit(1);\n }\n\n if (!args.yes) {\n const confirm = await p.confirm({\n message: `Delete ${pc.cyan(agentName)} from remote runtime?`,\n initialValue: false,\n });\n if (p.isCancel(confirm) || !confirm) {\n p.log.info(\"Cancelled.\");\n return;\n }\n }\n\n const hashes = new Set<string>();\n const pointerHash = pointerByName.get(agentName);\n if (pointerHash) hashes.add(pointerHash);\n const indexedHash = indexByName.get(agentName)?.hash;\n if (indexedHash) hashes.add(indexedHash);\n\n spinner.start(`Deleting ${pc.cyan(agentName)} from remote runtime`);\n const latestKey = `${agentName}:latest`;\n await provider\n .deleteValue({ cwd, configPath, key: latestKey })\n .catch(() => null);\n for (const hash of hashes) {\n await provider\n .deleteValue({ cwd, configPath, key: `${agentName}:${hash}` })\n .catch(() => null);\n }\n\n const filteredIndex = indexEntries.filter(\n (entry) => entry.name !== agentName,\n );\n await writeRemoteAgentsIndex(cwd, configPath, filteredIndex);\n\n const state = await readProjectState(cwd);\n if (state?.agents?.[agentName]) {\n state.agents[agentName].lastRemoteHash = null;\n state.agents[agentName].workerUrl = null;\n await writeProjectState(cwd, state);\n }\n\n spinner.stop(`Deleted remote agent ${pc.cyan(agentName)}`);\n p.log.info(\n pc.dim(\n `Local files were not changed. Delete ./agents/${agentName} manually if you no longer need it.`,\n ),\n );\n } catch (error) {\n spinner.stop(\"Failed to delete remote agent\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["spinner","confirm"]}
@@ -3,13 +3,17 @@ import {
3
3
  promptDeployTarget,
4
4
  runInitialDeploy,
5
5
  showKalpCloudWaitlist
6
- } from "./chunk-TPG7QMXB.js";
6
+ } from "./chunk-4CEJYSJY.js";
7
7
  import "./chunk-NV2IZ4XM.js";
8
+ import {
9
+ generateTypes
10
+ } from "./chunk-LPEV4QH2.js";
11
+ import "./chunk-XVD3FFOJ.js";
8
12
  import {
9
13
  requireAuth
10
14
  } from "./chunk-S3KAVLVM.js";
11
15
  import "./chunk-FO24J6XL.js";
12
- import "./chunk-DHCCSWJN.js";
16
+ import "./chunk-EXXTCGKR.js";
13
17
 
14
18
  // src/commands/deploy.ts
15
19
  import { defineCommand } from "citty";
@@ -21,6 +25,7 @@ var deploy_default = defineCommand({
21
25
  async run() {
22
26
  const cwd = process.cwd();
23
27
  p.intro(`${LOGO} ${pc.bold("kalp deploy")}`);
28
+ await generateTypes(cwd);
24
29
  await requireAuth().catch(() => {
25
30
  p.log.error("Not authenticated. Run `kalp login` first.");
26
31
  process.exit(1);
@@ -82,4 +87,4 @@ var deploy_default = defineCommand({
82
87
  export {
83
88
  deploy_default as default
84
89
  };
85
- //# sourceMappingURL=deploy-2JMOUTWG.js.map
90
+ //# sourceMappingURL=deploy-DRZZ3YRB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/deploy.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { generateTypes } from \"@/utils/codegen\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { runInitialDeploy } from \"@/utils/deploy\";\nimport { promptDeployTarget, showKalpCloudWaitlist } from \"@/utils/deploy-target\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"deploy\", description: \"Deploy your agents runtime\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp deploy\")}`);\n await generateTypes(cwd);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n const target = await promptDeployTarget(\"Choose where to deploy your runtime\");\n if (!target) {\n p.outro(\"Cancelled\");\n return;\n }\n if (target === \"kalp-cloud\") {\n showKalpCloudWaitlist();\n p.outro(pc.green(\"Got it — you'll hear from us soon.\"));\n return;\n }\n\n const s = p.spinner();\n s.start(\"Deploying your agents runtime\");\n\n try {\n const result = await runInitialDeploy(cwd);\n s.stop(\"Deployment completed\");\n p.log.success(`Runtime URL: ${pc.cyan(result.workerUrl)}`);\n if (result.customDomains.length > 0) {\n p.note(\n result.customDomains.map((domain) => pc.cyan(`https://${domain}`)).join(\"\\n\"),\n \"Custom domains detected\",\n );\n }\n\n const preferredStudioBase =\n result.customDomains.length > 0\n ? `https://${result.customDomains[0]}`\n : result.workerUrl;\n\n if (result.credentialsChanged || result.serviceKeyChanged) {\n p.log.info(pc.bold(\"Admin access\"));\n console.log(\n ` ${pc.dim(\"Username:\")} ${pc.cyan(result.studioAdminUser)}`,\n );\n console.log(\n ` ${pc.dim(\"Password:\")} ${pc.cyan(result.studioPassword)}`,\n );\n console.log(\n ` ${pc.dim(\"Service key:\")} ${pc.cyan(`Bearer ${result.serviceKey}`)}`,\n );\n console.log(\n ` ${pc.dim(\"Studio URL:\")} ${pc.cyan(`${preferredStudioBase.replace(/\\/$/, \"\")}/studio/login`)}`,\n );\n } else {\n p.log.info(\n pc.dim(\n \"Credentials unchanged. Check your local .env if you need to recover them.\",\n ),\n );\n }\n p.outro(pc.green(\"Your runtime is ready\"));\n } catch (error) {\n s.stop(\"Deployment failed\");\n p.log.error(\n error instanceof Error ? error.message : \"Unknown deployment error\",\n );\n process.exit(1);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAMf,IAAM,OAAO;AAEb,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,6BAA6B;AAAA,EAClE,MAAM,MAAM;AACV,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,aAAa,CAAC,EAAE;AAC3C,UAAM,cAAc,GAAG;AAEvB,UAAM,YAAY,EAAE,MAAM,MAAM;AAC9B,MAAE,MAAI,MAAM,4CAA4C;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAED,UAAM,SAAS,MAAM,mBAAmB,qCAAqC;AAC7E,QAAI,CAAC,QAAQ;AACX,MAAE,QAAM,WAAW;AACnB;AAAA,IACF;AACA,QAAI,WAAW,cAAc;AAC3B,4BAAsB;AACtB,MAAE,QAAM,GAAG,MAAM,yCAAoC,CAAC;AACtD;AAAA,IACF;AAEA,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,+BAA+B;AAEvC,QAAI;AACF,YAAM,SAAS,MAAM,iBAAiB,GAAG;AACzC,QAAE,KAAK,sBAAsB;AAC7B,MAAE,MAAI,QAAQ,gBAAgB,GAAG,KAAK,OAAO,SAAS,CAAC,EAAE;AACzD,UAAI,OAAO,cAAc,SAAS,GAAG;AACnC,QAAE;AAAA,UACA,OAAO,cAAc,IAAI,CAAC,WAAW,GAAG,KAAK,WAAW,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI;AAAA,UAC5E;AAAA,QACF;AAAA,MACF;AAEA,YAAM,sBACJ,OAAO,cAAc,SAAS,IAC1B,WAAW,OAAO,cAAc,CAAC,CAAC,KAClC,OAAO;AAEb,UAAI,OAAO,sBAAsB,OAAO,mBAAmB;AACzD,QAAE,MAAI,KAAK,GAAG,KAAK,cAAc,CAAC;AAClC,gBAAQ;AAAA,UACN,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,GAAG,KAAK,OAAO,eAAe,CAAC;AAAA,QAC7D;AACA,gBAAQ;AAAA,UACN,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,GAAG,KAAK,OAAO,cAAc,CAAC;AAAA,QAC5D;AACA,gBAAQ;AAAA,UACN,KAAK,GAAG,IAAI,cAAc,CAAC,IAAI,GAAG,KAAK,UAAU,OAAO,UAAU,EAAE,CAAC;AAAA,QACvE;AACA,gBAAQ;AAAA,UACN,KAAK,GAAG,IAAI,aAAa,CAAC,IAAI,GAAG,KAAK,GAAG,oBAAoB,QAAQ,OAAO,EAAE,CAAC,eAAe,CAAC;AAAA,QACjG;AAAA,MACF,OAAO;AACL,QAAE,MAAI;AAAA,UACJ,GAAG;AAAA,YACD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,MAAE,QAAM,GAAG,MAAM,uBAAuB,CAAC;AAAA,IAC3C,SAAS,OAAO;AACd,QAAE,KAAK,mBAAmB;AAC1B,MAAE,MAAI;AAAA,QACJ,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC3C;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;","names":[]}