@kalphq/cli 0.0.0-dev-20260510064855 → 0.0.0-dev-20260512005910

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 (36) hide show
  1. package/dist/{chunk-WRCC37FP.js → chunk-LFL3BBIL.js} +6 -3
  2. package/dist/chunk-LFL3BBIL.js.map +1 -0
  3. package/dist/{chunk-RT2DIIQ5.js → chunk-WZD7AIIQ.js} +99 -96
  4. package/dist/chunk-WZD7AIIQ.js.map +1 -0
  5. package/dist/{deploy-YZ3OP2MN.js → deploy-WU7OIHO5.js} +3 -3
  6. package/dist/{dev-UC2WFSOE.js → dev-VP2BIPPG.js} +3 -4
  7. package/dist/dev-VP2BIPPG.js.map +1 -0
  8. package/dist/index.js +4 -4
  9. package/dist/index.js.map +1 -1
  10. package/dist/push-SS2VMHZ7.js +341 -0
  11. package/dist/push-SS2VMHZ7.js.map +1 -0
  12. package/dist/runtime-template/studio/assets/index-C_ym_ZCF.css +2 -0
  13. package/dist/runtime-template/studio/assets/index-o8IEAA6N.js +112 -0
  14. package/dist/runtime-template/studio/index.html +5 -5
  15. package/dist/runtime-template/studio/mockServiceWorker.js +349 -0
  16. package/package.json +4 -4
  17. package/dist/chunk-RT2DIIQ5.js.map +0 -1
  18. package/dist/chunk-WRCC37FP.js.map +0 -1
  19. package/dist/dev-UC2WFSOE.js.map +0 -1
  20. package/dist/push-XGNM2IEY.js +0 -263
  21. package/dist/push-XGNM2IEY.js.map +0 -1
  22. package/dist/runtime-template/studio/assets/QueryClientProvider-DAZmVr20.js +0 -1
  23. package/dist/runtime-template/studio/assets/agent._agentName-D0WHDceC.js +0 -1
  24. package/dist/runtime-template/studio/assets/button-D0LvXgpN.js +0 -1
  25. package/dist/runtime-template/studio/assets/card-B2bzwIGM.js +0 -1
  26. package/dist/runtime-template/studio/assets/globe-qCpO1Z-s.js +0 -1
  27. package/dist/runtime-template/studio/assets/index-DcJItVMf.js +0 -75
  28. package/dist/runtime-template/studio/assets/link-D3Ad09qM.js +0 -1
  29. package/dist/runtime-template/studio/assets/login-Cqmvx0NQ.js +0 -1
  30. package/dist/runtime-template/studio/assets/preload-helper-DHF8Plid.js +0 -1
  31. package/dist/runtime-template/studio/assets/replay._executionId-8boDJLx9.js +0 -41
  32. package/dist/runtime-template/studio/assets/routes-CaRwwZyr.js +0 -1
  33. package/dist/runtime-template/studio/assets/skeleton-CJLC4mqH.js +0 -1
  34. package/dist/runtime-template/studio/assets/styles-GI30ROBZ.css +0 -2
  35. package/dist/runtime-template/studio/assets/useNavigate-F1VFNun_.js +0 -1
  36. /package/dist/{deploy-YZ3OP2MN.js.map → deploy-WU7OIHO5.js.map} +0 -0
@@ -2,8 +2,9 @@
2
2
  import {
3
3
  ensureStudioSecrets,
4
4
  materializeRuntime,
5
+ readProjectState,
5
6
  writeProjectState
6
- } from "./chunk-RT2DIIQ5.js";
7
+ } from "./chunk-WZD7AIIQ.js";
7
8
  import {
8
9
  requireAuth
9
10
  } from "./chunk-5RODADXW.js";
@@ -140,10 +141,12 @@ async function runInitialDeploy(cwd) {
140
141
  runtime.wranglerConfigPath,
141
142
  deployStdout
142
143
  );
144
+ const existingState = await readProjectState(cwd);
143
145
  await writeProjectState(cwd, {
144
146
  workerUrl,
145
147
  deployedAt: (/* @__PURE__ */ new Date()).toISOString(),
146
- accountId: auth.accountId
148
+ accountId: auth.accountId,
149
+ agents: existingState?.agents ?? {}
147
150
  });
148
151
  return { workerUrl, accountId: auth.accountId };
149
152
  }
@@ -151,4 +154,4 @@ async function runInitialDeploy(cwd) {
151
154
  export {
152
155
  runInitialDeploy
153
156
  };
154
- //# sourceMappingURL=chunk-WRCC37FP.js.map
157
+ //# sourceMappingURL=chunk-LFL3BBIL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/deploy.ts"],"sourcesContent":["import { readFile, writeFile } from \"node:fs/promises\";\nimport { execa } from \"execa\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { ensureStudioSecrets } from \"@/utils/secret\";\nimport { readProjectState, writeProjectState } from \"@/utils/project-state\";\nimport { materializeRuntime } from \"@/utils/runtime\";\n\nfunction findWorkersUrl(output: string): string | null {\n const match = output.match(/https:\\/\\/[^\\s]+\\.workers\\.dev/);\n return match?.[0] ?? null;\n}\n\ninterface RuntimeWranglerConfig {\n name?: string;\n kv_namespaces?: Array<{ binding: string; id?: string }>;\n}\n\ninterface KvNamespaceInfo {\n id: string;\n title: string;\n}\n\nasync function readWranglerConfig(\n configPath: string,\n): Promise<RuntimeWranglerConfig> {\n const text = await readFile(configPath, \"utf-8\");\n return JSON.parse(text) as RuntimeWranglerConfig;\n}\n\nasync function writeWranglerConfig(\n configPath: string,\n config: RuntimeWranglerConfig,\n): Promise<void> {\n await writeFile(configPath, `${JSON.stringify(config, null, 2)}\\n`, \"utf-8\");\n}\n\nfunction deriveKvNamespaceTitle(workerName: string, binding: string): string {\n return `${workerName}-${binding.toLowerCase().replace(/_/g, \"-\")}`;\n}\n\nfunction parseKvListOutput(stdout: string): KvNamespaceInfo[] {\n const trimmed = stdout.trim();\n if (!trimmed) return [];\n\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) {\n return parsed\n .map((item) => ({\n id: String((item as { id?: string }).id ?? \"\"),\n title: String((item as { title?: string }).title ?? \"\"),\n }))\n .filter((item) => !!item.id && !!item.title);\n }\n } catch {\n // fallback to text parsing below\n }\n\n const matches = trimmed.match(/[a-f0-9]{32}\\s+[^\\r\\n]+/gi) ?? [];\n return matches\n .map((line) => {\n const [id, ...rest] = line.trim().split(/\\s+/g);\n return { id: id ?? \"\", title: rest.join(\" \") };\n })\n .filter((item) => !!item.id && !!item.title);\n}\n\nasync function listKvNamespaces(\n cwd: string,\n configPath: string,\n): Promise<KvNamespaceInfo[]> {\n const tryJson = await execa(\n \"npx\",\n [\"wrangler\", \"kv\", \"namespace\", \"list\", \"--config\", configPath, \"--json\"],\n { cwd },\n ).catch(() => null);\n\n if (tryJson) {\n return parseKvListOutput(tryJson.stdout);\n }\n\n const plain = await execa(\n \"npx\",\n [\"wrangler\", \"kv\", \"namespace\", \"list\", \"--config\", configPath],\n { cwd },\n );\n return parseKvListOutput(plain.stdout);\n}\n\nasync function ensureKvNamespaceBindingId(\n cwd: string,\n configPath: string,\n): Promise<string | null> {\n const config = await readWranglerConfig(configPath);\n const binding = config.kv_namespaces?.find(\n (item) => item.binding === \"KALP_MANIFESTS\",\n );\n\n if (!binding || !config.name) return null;\n if (binding.id) return binding.id;\n\n const expectedTitle = deriveKvNamespaceTitle(config.name, binding.binding);\n const namespaces = await listKvNamespaces(cwd, configPath);\n const existing = namespaces.find((item) => item.title === expectedTitle);\n if (!existing) return null;\n\n binding.id = existing.id;\n await writeWranglerConfig(configPath, config);\n return existing.id;\n}\n\nfunction isNamespaceAlreadyExistsError(output: string): boolean {\n return output.includes(\"[code: 10014]\") && output.includes(\"already exists\");\n}\n\nasync function resolveWorkerUrl(\n configPath: string,\n deployOutput: string,\n): Promise<string> {\n const fromOutput = findWorkersUrl(deployOutput);\n if (fromOutput) return fromOutput;\n\n const configText = await readFile(configPath, \"utf-8\").catch(\n () => null as string | null,\n );\n const workerName = configText?.match(/\"name\"\\s*:\\s*\"([^\"]+)\"/)?.[1];\n\n if (workerName) {\n return `https://${workerName}.workers.dev`;\n }\n\n throw new Error(\"Could not resolve worker URL from wrangler deploy output.\");\n}\n\nexport async function runInitialDeploy(cwd: string): Promise<{\n workerUrl: string;\n accountId: string;\n}> {\n const auth = await requireAuth();\n const secrets = await ensureStudioSecrets(cwd);\n const runtime = await materializeRuntime(cwd);\n let secretSyncFailed = false;\n const secretEntries = [\n [\"KALP_SECRET_KEY\", secrets.key],\n [\"KALP_STUDIO_PASSWORD\", secrets.studioPassword],\n [\"KALP_STUDIO_ADMIN_USER\", secrets.studioAdminUser],\n ] as const;\n\n for (const [name, value] of secretEntries) {\n try {\n await execa(\n \"npx\",\n [\"wrangler\", \"secret\", \"put\", name, \"--config\", runtime.wranglerConfigPath],\n { cwd, input: `${value}\\n` },\n );\n } catch {\n secretSyncFailed = true;\n break;\n }\n }\n\n await ensureKvNamespaceBindingId(cwd, runtime.wranglerConfigPath).catch(\n () => null,\n );\n\n const deployArgs = secretSyncFailed\n ? [\n \"wrangler\",\n \"deploy\",\n \"--config\",\n runtime.wranglerConfigPath,\n \"--secrets-file\",\n \".env\",\n ]\n : [\"wrangler\", \"deploy\", \"--config\", runtime.wranglerConfigPath];\n\n let deploy = await execa(\"npx\", deployArgs, { cwd }).catch((error) => error);\n if (deploy instanceof Error) {\n const combined = [String((deploy as { stdout?: string }).stdout ?? \"\"), String((deploy as { stderr?: string }).stderr ?? \"\"), deploy.message]\n .join(\"\\n\")\n .trim();\n if (isNamespaceAlreadyExistsError(combined)) {\n await ensureKvNamespaceBindingId(cwd, runtime.wranglerConfigPath);\n deploy = await execa(\"npx\", deployArgs, { cwd });\n } else {\n throw deploy;\n }\n }\n\n const deployStdout = [deploy.stdout, deploy.stderr]\n .filter(Boolean)\n .join(\"\\n\");\n\n const workerUrl = await resolveWorkerUrl(\n runtime.wranglerConfigPath,\n deployStdout,\n );\n\n const existingState = await readProjectState(cwd);\n\n await writeProjectState(cwd, {\n workerUrl,\n deployedAt: new Date().toISOString(),\n accountId: auth.accountId,\n agents: existingState?.agents ?? {},\n });\n\n return { workerUrl, accountId: auth.accountId };\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- ensureGlobalConfigDir
4
- } from "./chunk-FO24J6XL.js";
5
2
 
6
3
  // src/utils/secret.ts
7
4
  import { randomBytes } from "crypto";
@@ -76,11 +73,38 @@ import { mkdir, readFile as readFile2, writeFile as writeFile2 } from "fs/promis
76
73
  import { join as join2 } from "path";
77
74
  var KALP_DIR = ".kalp";
78
75
  var STATE_FILE = "state.json";
76
+ function normalizeProjectState(raw) {
77
+ if (!raw || typeof raw !== "object") return null;
78
+ const value = raw;
79
+ const workerUrl = typeof value.workerUrl === "string" && value.workerUrl.length > 0 ? value.workerUrl : null;
80
+ const deployedAt = typeof value.deployedAt === "string" && value.deployedAt.length > 0 ? value.deployedAt : null;
81
+ const accountId = typeof value.accountId === "string" && value.accountId.length > 0 ? value.accountId : null;
82
+ const agents = {};
83
+ const rawAgents = value.agents && typeof value.agents === "object" ? value.agents : {};
84
+ for (const [name, entry] of Object.entries(rawAgents)) {
85
+ if (!entry || typeof entry !== "object") continue;
86
+ const item = entry;
87
+ if (typeof item.localPath !== "string" || item.localPath.length === 0) {
88
+ continue;
89
+ }
90
+ const currentVersion = typeof item.currentVersion === "number" && Number.isFinite(item.currentVersion) ? Math.max(0, Math.floor(item.currentVersion)) : 0;
91
+ agents[name] = {
92
+ currentHash: typeof item.currentHash === "string" ? item.currentHash : null,
93
+ currentVersion,
94
+ lastLocalHash: typeof item.lastLocalHash === "string" ? item.lastLocalHash : null,
95
+ lastRemoteHash: typeof item.lastRemoteHash === "string" ? item.lastRemoteHash : null,
96
+ lastPushedAt: typeof item.lastPushedAt === "string" ? item.lastPushedAt : null,
97
+ localPath: item.localPath,
98
+ workerUrl: typeof item.workerUrl === "string" ? item.workerUrl : null
99
+ };
100
+ }
101
+ return { workerUrl, deployedAt, accountId, agents };
102
+ }
79
103
  async function readProjectState(cwd) {
80
104
  try {
81
105
  const statePath = join2(cwd, KALP_DIR, STATE_FILE);
82
106
  const content = await readFile2(statePath, "utf-8");
83
- return JSON.parse(content);
107
+ return normalizeProjectState(JSON.parse(content));
84
108
  } catch {
85
109
  return null;
86
110
  }
@@ -88,33 +112,8 @@ async function readProjectState(cwd) {
88
112
  async function writeProjectState(cwd, state) {
89
113
  const dir = join2(cwd, KALP_DIR);
90
114
  await mkdir(dir, { recursive: true });
91
- await writeFile2(join2(dir, STATE_FILE), JSON.stringify(state, null, 2), "utf-8");
92
- }
93
-
94
- // src/utils/agent-store.ts
95
- import { readFile as readFile3, writeFile as writeFile3 } from "fs/promises";
96
- import { join as join3 } from "path";
97
- async function getStorePath() {
98
- return join3(await ensureGlobalConfigDir(), "agents.json");
99
- }
100
- async function readAgentStore() {
101
- try {
102
- const storePath = await getStorePath();
103
- const content = await readFile3(storePath, "utf-8");
104
- return JSON.parse(content);
105
- } catch {
106
- return {};
107
- }
108
- }
109
- async function getAgentStoreEntry(agentName) {
110
- const store = await readAgentStore();
111
- return store[agentName] ?? null;
112
- }
113
- async function writeAgentStoreEntry(agentName, entry) {
114
- const storePath = await getStorePath();
115
- const store = await readAgentStore();
116
- store[agentName] = entry;
117
- await writeFile3(storePath, JSON.stringify(store, null, 2), "utf-8");
115
+ await writeFile2(join2(dir, STATE_FILE), `${JSON.stringify(state, null, 2)}
116
+ `, "utf-8");
118
117
  }
119
118
 
120
119
  // src/utils/runtime.ts
@@ -124,12 +123,12 @@ import {
124
123
  cp,
125
124
  mkdir as mkdir2,
126
125
  readdir,
127
- readFile as readFile4,
126
+ readFile as readFile3,
128
127
  rm,
129
128
  stat,
130
- writeFile as writeFile4
129
+ writeFile as writeFile3
131
130
  } from "fs/promises";
132
- import { basename, dirname, join as join4, normalize, resolve } from "path";
131
+ import { basename, dirname, join as join3, resolve } from "path";
133
132
  import { fileURLToPath } from "url";
134
133
  var RUNTIME_ROOT = ".kalp";
135
134
  var RUNTIME_DIR = "runtime";
@@ -142,9 +141,9 @@ function sanitizeSegment(input) {
142
141
  }
143
142
  async function resolveProjectSlug(cwd) {
144
143
  const fallback = sanitizeSegment(basename(cwd)) || "agent";
145
- const packageJsonPath = join4(cwd, "package.json");
144
+ const packageJsonPath = join3(cwd, "package.json");
146
145
  try {
147
- const content = await readFile4(packageJsonPath, "utf-8");
146
+ const content = await readFile3(packageJsonPath, "utf-8");
148
147
  const pkg = JSON.parse(content);
149
148
  const name = typeof pkg.name === "string" ? pkg.name : "";
150
149
  const sanitized = sanitizeSegment(name);
@@ -223,20 +222,20 @@ function runtimeTemplateCandidates() {
223
222
  );
224
223
  return [
225
224
  {
226
- studioTemplateDir: join4(distTemplateRoot, STUDIO_DIR),
227
- workerEntryPath: join4(distTemplateRoot, WORKER_ENTRY_FILE)
225
+ studioTemplateDir: join3(distTemplateRoot, STUDIO_DIR),
226
+ workerEntryPath: join3(distTemplateRoot, WORKER_ENTRY_FILE)
228
227
  },
229
228
  {
230
- studioTemplateDir: join4(packageRootTemplate, STUDIO_DIR),
231
- workerEntryPath: join4(packageRootTemplate, WORKER_ENTRY_FILE)
229
+ studioTemplateDir: join3(packageRootTemplate, STUDIO_DIR),
230
+ workerEntryPath: join3(packageRootTemplate, WORKER_ENTRY_FILE)
232
231
  },
233
232
  {
234
- studioTemplateDir: join4(sourceTemplateRoot, STUDIO_DIR),
235
- workerEntryPath: join4(sourceTemplateRoot, WORKER_ENTRY_FILE)
233
+ studioTemplateDir: join3(sourceTemplateRoot, STUDIO_DIR),
234
+ workerEntryPath: join3(sourceTemplateRoot, WORKER_ENTRY_FILE)
236
235
  },
237
236
  {
238
237
  studioTemplateDir: monorepoStudioDist,
239
- workerEntryPath: join4(sourceTemplateRoot, WORKER_ENTRY_FILE)
238
+ workerEntryPath: join3(sourceTemplateRoot, WORKER_ENTRY_FILE)
240
239
  }
241
240
  ];
242
241
  }
@@ -271,13 +270,13 @@ ${cssLinks}
271
270
  `;
272
271
  }
273
272
  async function ensureStudioIndex(studioDir) {
274
- const indexPath = join4(studioDir, "index.html");
273
+ const indexPath = join3(studioDir, "index.html");
275
274
  try {
276
275
  await access(indexPath);
277
276
  return;
278
277
  } catch {
279
278
  }
280
- const assetsDir = join4(studioDir, "assets");
279
+ const assetsDir = join3(studioDir, "assets");
281
280
  const assetFiles = await readdir(assetsDir);
282
281
  const entryScript = assetFiles.find((file) => /^index-.*\.js$/i.test(file)) ?? assetFiles.find((file) => file.endsWith(".js"));
283
282
  if (!entryScript) {
@@ -287,16 +286,16 @@ async function ensureStudioIndex(studioDir) {
287
286
  }
288
287
  const cssFiles = assetFiles.filter((file) => file.endsWith(".css")).sort();
289
288
  const html = createStudioShell(entryScript, cssFiles);
290
- await writeFile4(indexPath, html, "utf-8");
289
+ await writeFile3(indexPath, html, "utf-8");
291
290
  }
292
291
  async function readLocalAgentNames(cwd) {
293
- const agentsDir = join4(cwd, "agents");
292
+ const agentsDir = join3(cwd, "agents");
294
293
  try {
295
294
  const entries = await readdir(agentsDir, { withFileTypes: true });
296
295
  const names = [];
297
296
  for (const entry of entries) {
298
297
  if (!entry.isDirectory()) continue;
299
- const indexPath = join4(agentsDir, entry.name, "index.ts");
298
+ const indexPath = join3(agentsDir, entry.name, "index.ts");
300
299
  const exists = await stat(indexPath).then(() => true).catch(() => false);
301
300
  if (exists) names.push(entry.name);
302
301
  }
@@ -305,74 +304,79 @@ async function readLocalAgentNames(cwd) {
305
304
  return [];
306
305
  }
307
306
  }
308
- function isPathInsideProject(projectPath, candidatePath) {
309
- const project = normalize(projectPath).toLowerCase();
310
- const candidate = normalize(candidatePath).toLowerCase();
311
- return candidate.startsWith(project);
312
- }
313
- async function createAgentsSnapshot(cwd) {
307
+ async function createAgentsSnapshot(cwd, mode) {
314
308
  const localAgentNames = await readLocalAgentNames(cwd);
315
309
  const state = await readProjectState(cwd);
316
- const globalStore = await readAgentStore();
317
310
  const byName = /* @__PURE__ */ new Map();
311
+ const stateAgents = state?.agents ?? {};
318
312
  for (const name of localAgentNames) {
319
- const localPath = join4(cwd, "agents", name, "index.ts");
313
+ const localPath = join3(cwd, "agents", name, "index.ts");
314
+ const saved = stateAgents[name];
315
+ const hasRemoteVersion = !!saved?.lastRemoteHash && (saved?.currentVersion ?? 0) > 0;
316
+ if (mode === "remote" && !hasRemoteVersion) {
317
+ continue;
318
+ }
319
+ const resolvedWorkerUrl = saved?.workerUrl ?? (state?.workerUrl ? `${state.workerUrl.replace(/\/$/, "")}/a/${name}` : null);
320
+ const versionNumber = typeof saved?.currentVersion === "number" && saved.currentVersion > 0 ? saved.currentVersion : null;
320
321
  byName.set(name, {
321
322
  name,
322
- environment: "local",
323
- status: "offline",
324
- hash: null,
325
- workerUrl: null,
323
+ environment: mode === "remote" ? "remote" : hasRemoteVersion ? "both" : "local",
324
+ status: resolvedWorkerUrl ? "online" : "offline",
325
+ hash: saved?.currentHash ?? null,
326
+ version: versionNumber ? `v${versionNumber}` : null,
327
+ versionNumber,
328
+ lastRemoteHash: saved?.lastRemoteHash ?? null,
329
+ lastLocalHash: saved?.lastLocalHash ?? null,
330
+ workerUrl: resolvedWorkerUrl,
326
331
  localPath,
327
- updatedAt: null
332
+ updatedAt: saved?.lastPushedAt ?? state?.deployedAt ?? null
328
333
  });
329
334
  }
330
- for (const [name, entry] of Object.entries(globalStore)) {
331
- if (!entry.localPath || !isPathInsideProject(cwd, entry.localPath)) continue;
332
- const existing = byName.get(name);
333
- const workerUrl = state?.workerUrl && !entry.workerUrl ? `${state.workerUrl.replace(/\/$/, "")}/a/${name}` : entry.workerUrl ?? null;
334
- byName.set(name, {
335
- name,
336
- environment: existing ? "both" : "remote",
337
- status: workerUrl ? "online" : "offline",
338
- hash: entry.hash ?? null,
339
- workerUrl,
340
- localPath: existing?.localPath ?? entry.localPath,
341
- updatedAt: entry.timestamp ?? state?.deployedAt ?? null
342
- });
343
- }
344
- if (state?.workerUrl) {
345
- for (const [name, record] of byName.entries()) {
346
- if (!record.workerUrl) {
347
- record.workerUrl = `${state.workerUrl.replace(/\/$/, "")}/a/${name}`;
348
- record.environment = record.environment === "local" ? "both" : record.environment;
349
- record.status = "online";
350
- record.updatedAt = record.updatedAt ?? state.deployedAt;
351
- byName.set(name, record);
352
- }
335
+ if (mode === "remote") {
336
+ for (const [name, saved] of Object.entries(stateAgents)) {
337
+ const hasRemoteVersion = !!saved.lastRemoteHash && (saved.currentVersion ?? 0) > 0;
338
+ if (!hasRemoteVersion || byName.has(name)) continue;
339
+ const localPath = saved.localPath ?? join3(cwd, "agents", name, "index.ts");
340
+ const workerUrl = saved.workerUrl ?? (state?.workerUrl ? `${state.workerUrl.replace(/\/$/, "")}/a/${name}` : null);
341
+ const versionNumber = saved.currentVersion > 0 ? saved.currentVersion : null;
342
+ byName.set(name, {
343
+ name,
344
+ environment: "remote",
345
+ status: workerUrl ? "online" : "offline",
346
+ hash: saved.currentHash ?? null,
347
+ version: versionNumber ? `v${versionNumber}` : null,
348
+ versionNumber,
349
+ lastRemoteHash: saved.lastRemoteHash ?? null,
350
+ lastLocalHash: saved.lastLocalHash ?? null,
351
+ workerUrl,
352
+ localPath,
353
+ updatedAt: saved.lastPushedAt ?? state?.deployedAt ?? null
354
+ });
353
355
  }
354
356
  }
355
357
  return {
356
358
  generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
357
359
  projectPath: cwd,
358
360
  workerUrl: state?.workerUrl ?? null,
361
+ mode,
359
362
  agents: Array.from(byName.values()).sort((a, b) => a.name.localeCompare(b.name))
360
363
  };
361
364
  }
362
- async function materializeRuntime(cwd) {
363
- const runtimeDir = join4(cwd, RUNTIME_ROOT, RUNTIME_DIR);
364
- const studioDir = join4(runtimeDir, STUDIO_DIR);
365
- const workerEntrypointPath = join4(runtimeDir, WORKER_ENTRY_FILE);
366
- const wranglerConfigPath = join4(runtimeDir, WRANGLER_CONFIG_FILE);
365
+ async function materializeRuntime(cwd, options = {}) {
366
+ const mode = options.mode ?? "remote";
367
+ const runtimeDir = join3(cwd, RUNTIME_ROOT, RUNTIME_DIR);
368
+ const studioDir = join3(runtimeDir, STUDIO_DIR);
369
+ const workerEntrypointPath = join3(runtimeDir, WORKER_ENTRY_FILE);
370
+ const wranglerConfigPath = join3(runtimeDir, WRANGLER_CONFIG_FILE);
367
371
  const template = await resolveRuntimeTemplate();
368
372
  await rm(runtimeDir, { recursive: true, force: true });
369
373
  await mkdir2(runtimeDir, { recursive: true });
370
374
  await cp(template.studioTemplateDir, studioDir, { recursive: true });
371
375
  await cp(template.workerEntryPath, workerEntrypointPath);
372
376
  await ensureStudioIndex(studioDir);
373
- const agentsSnapshot = await createAgentsSnapshot(cwd);
374
- await writeFile4(
375
- join4(runtimeDir, "agents.snapshot.json"),
377
+ const agentsSnapshot = await createAgentsSnapshot(cwd, mode);
378
+ await writeFile3(
379
+ join3(runtimeDir, "agents.snapshot.json"),
376
380
  `${JSON.stringify(agentsSnapshot, null, 2)}
377
381
  `,
378
382
  "utf-8"
@@ -380,7 +384,7 @@ async function materializeRuntime(cwd) {
380
384
  const projectSlug = await resolveProjectSlug(cwd);
381
385
  const workerName = buildWorkerName(projectSlug, cwd);
382
386
  const wranglerConfig = createRuntimeConfig(workerName);
383
- await writeFile4(
387
+ await writeFile3(
384
388
  wranglerConfigPath,
385
389
  `${JSON.stringify(wranglerConfig, null, 2)}
386
390
  `,
@@ -400,8 +404,7 @@ export {
400
404
  ensureSecretKey,
401
405
  readProjectState,
402
406
  writeProjectState,
403
- getAgentStoreEntry,
404
- writeAgentStoreEntry,
407
+ readLocalAgentNames,
405
408
  materializeRuntime
406
409
  };
407
- //# sourceMappingURL=chunk-RT2DIIQ5.js.map
410
+ //# sourceMappingURL=chunk-WZD7AIIQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/secret.ts","../src/utils/project-state.ts","../src/utils/runtime.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nconst SECRET_KEY = \"KALP_SECRET_KEY\";\nconst STUDIO_PASSWORD = \"KALP_STUDIO_PASSWORD\";\nconst STUDIO_ADMIN_USER = \"KALP_STUDIO_ADMIN_USER\";\n\nfunction parseEnv(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const line of content.split(/\\r?\\n/g)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex <= 0) continue;\n const key = trimmed.slice(0, eqIndex).trim();\n const value = trimmed.slice(eqIndex + 1).trim();\n result[key] = value;\n }\n return result;\n}\n\nfunction toEnvContent(values: Record<string, string>): string {\n const lines = [\n \"# Kalp Studio Authentication Secrets\",\n `${SECRET_KEY}=${values[SECRET_KEY]}`,\n `${STUDIO_PASSWORD}=${values[STUDIO_PASSWORD]}`,\n `${STUDIO_ADMIN_USER}=${values[STUDIO_ADMIN_USER]}`,\n \"\",\n ];\n return lines.join(\"\\n\");\n}\n\nasync function readEnvFile(cwd: string): Promise<string> {\n const envPath = join(cwd, \".env\");\n try {\n return await readFile(envPath, \"utf-8\");\n } catch {\n return \"\";\n }\n}\n\nfunction generateStudioPassword(): string {\n return randomBytes(24).toString(\"base64url\");\n}\n\nexport interface StudioSecrets {\n key: string;\n studioPassword: string;\n studioAdminUser: string;\n isNew: boolean;\n}\n\nexport async function ensureStudioSecrets(cwd: string): Promise<StudioSecrets> {\n const envPath = join(cwd, \".env\");\n const content = await readEnvFile(cwd);\n const parsed = parseEnv(content);\n\n const key = parsed[SECRET_KEY] || randomBytes(32).toString(\"hex\");\n const studioPassword = parsed[STUDIO_PASSWORD] || generateStudioPassword();\n const studioAdminUser = parsed[STUDIO_ADMIN_USER] || \"admin\";\n\n const isNew =\n !parsed[SECRET_KEY] || !parsed[STUDIO_PASSWORD] || !parsed[STUDIO_ADMIN_USER];\n\n if (isNew || !content.trim()) {\n await writeFile(\n envPath,\n toEnvContent({\n ...parsed,\n [SECRET_KEY]: key,\n [STUDIO_PASSWORD]: studioPassword,\n [STUDIO_ADMIN_USER]: studioAdminUser,\n }),\n \"utf-8\",\n );\n }\n\n return { key, studioPassword, studioAdminUser, isNew };\n}\n\nexport async function ensureSecretKey(\n cwd: string,\n): Promise<{ key: string; isNew: boolean }> {\n const secrets = await ensureStudioSecrets(cwd);\n return { key: secrets.key, isNew: secrets.isNew };\n}\n\nexport async function readSecretKey(cwd: string): Promise<string | null> {\n try {\n const envContent = await readEnvFile(cwd);\n const parsed = parseEnv(envContent);\n return parsed[SECRET_KEY] ?? null;\n } catch {\n return null;\n }\n}\n\nexport async function readStudioSecrets(cwd: string): Promise<{\n key: string;\n studioPassword: string;\n studioAdminUser: string;\n} | null> {\n try {\n const envContent = await readEnvFile(cwd);\n const parsed = parseEnv(envContent);\n const key = parsed[SECRET_KEY];\n const studioPassword = parsed[STUDIO_PASSWORD];\n const studioAdminUser = parsed[STUDIO_ADMIN_USER] || \"admin\";\n if (!key || !studioPassword) return null;\n return { key, studioPassword, studioAdminUser };\n } catch {\n return null;\n }\n}\n","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 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\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 { workerUrl, deployedAt, accountId, agents };\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 { readProjectState } from \"@/utils/project-state\";\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 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 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(workerName: string): 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 secrets: {\n required: [\n \"KALP_SECRET_KEY\",\n \"KALP_STUDIO_PASSWORD\",\n \"KALP_STUDIO_ADMIN_USER\",\n ],\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 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 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 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 const agentsSnapshot = await createAgentsSnapshot(cwd, mode);\n await writeFile(\n join(runtimeDir, \"agents.snapshot.json\"),\n `${JSON.stringify(agentsSnapshot, null, 2)}\\n`,\n \"utf-8\",\n );\n\n const projectSlug = await resolveProjectSlug(cwd);\n const workerName = buildWorkerName(projectSlug, cwd);\n const wranglerConfig = createRuntimeConfig(workerName);\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"],"mappings":"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","names":["readFile","writeFile","join","mkdir","readFile","writeFile","join","join","readFile","writeFile","mkdir"]}
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runInitialDeploy
4
- } from "./chunk-WRCC37FP.js";
5
- import "./chunk-RT2DIIQ5.js";
4
+ } from "./chunk-LFL3BBIL.js";
5
+ import "./chunk-WZD7AIIQ.js";
6
6
  import {
7
7
  requireAuth
8
8
  } from "./chunk-5RODADXW.js";
@@ -60,4 +60,4 @@ var deploy_default = defineCommand({
60
60
  export {
61
61
  deploy_default as default
62
62
  };
63
- //# sourceMappingURL=deploy-YZ3OP2MN.js.map
63
+ //# sourceMappingURL=deploy-WU7OIHO5.js.map
@@ -2,8 +2,7 @@
2
2
  import {
3
3
  ensureSecretKey,
4
4
  materializeRuntime
5
- } from "./chunk-RT2DIIQ5.js";
6
- import "./chunk-FO24J6XL.js";
5
+ } from "./chunk-WZD7AIIQ.js";
7
6
 
8
7
  // src/commands/dev.ts
9
8
  import { copyFile } from "fs/promises";
@@ -22,7 +21,7 @@ var dev_default = defineCommand({
22
21
  p.intro(`${LOGO} ${pc.bold("kalp dev")}`);
23
22
  await ensureSecretKey(cwd);
24
23
  await copyFile(join(cwd, ".env"), join(cwd, ".dev.vars"));
25
- const runtime = await materializeRuntime(cwd);
24
+ const runtime = await materializeRuntime(cwd, { mode: "local" });
26
25
  p.note("Starting local runtime (wrangler dev :8787)");
27
26
  const backend = execa(
28
27
  "npx",
@@ -57,4 +56,4 @@ var dev_default = defineCommand({
57
56
  export {
58
57
  dev_default as default
59
58
  };
60
- //# sourceMappingURL=dev-UC2WFSOE.js.map
59
+ //# sourceMappingURL=dev-VP2BIPPG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/dev.ts"],"sourcesContent":["import { copyFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { execa } from \"execa\";\nimport open from \"open\";\nimport { ensureSecretKey } from \"@/utils/secret\";\nimport { materializeRuntime } from \"@/utils/runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"dev\", description: \"Run Worker + Studio local environment\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp dev\")}`);\n\n await ensureSecretKey(cwd);\n await copyFile(join(cwd, \".env\"), join(cwd, \".dev.vars\"));\n const runtime = await materializeRuntime(cwd, { mode: \"local\" });\n\n p.note(\"Starting local runtime (wrangler dev :8787)\");\n\n const backend = execa(\n \"npx\",\n [\n \"wrangler\",\n \"dev\",\n \"--port\",\n \"8787\",\n \"--config\",\n runtime.wranglerConfigPath,\n ],\n { cwd, stdio: \"inherit\" },\n );\n\n const shutdown = () => {\n backend.kill(\"SIGINT\");\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n await delay(2500);\n const studioUrl = \"http://localhost:8787/studio/login\";\n await open(studioUrl);\n p.log.success(`Studio opened at ${pc.cyan(studioUrl)}`);\n\n try {\n await backend;\n } finally {\n shutdown();\n process.off(\"SIGINT\", shutdown);\n process.off(\"SIGTERM\", shutdown);\n }\n },\n});\n"],"mappings":";;;;;;;AAAA,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,cAAc,aAAa;AACpC,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,aAAa;AACtB,OAAO,UAAU;AAIjB,IAAM,OAAO;AAEb,IAAO,cAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,OAAO,aAAa,wCAAwC;AAAA,EAC1E,MAAM,MAAM;AACV,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,UAAU,CAAC,EAAE;AAExC,UAAM,gBAAgB,GAAG;AACzB,UAAM,SAAS,KAAK,KAAK,MAAM,GAAG,KAAK,KAAK,WAAW,CAAC;AACxD,UAAM,UAAU,MAAM,mBAAmB,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/D,IAAE,OAAK,6CAA6C;AAEpD,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,MACA,EAAE,KAAK,OAAO,UAAU;AAAA,IAC1B;AAEA,UAAM,WAAW,MAAM;AACrB,cAAQ,KAAK,QAAQ;AAAA,IACvB;AAEA,YAAQ,GAAG,UAAU,QAAQ;AAC7B,YAAQ,GAAG,WAAW,QAAQ;AAE9B,UAAM,MAAM,IAAI;AAChB,UAAM,YAAY;AAClB,UAAM,KAAK,SAAS;AACpB,IAAE,MAAI,QAAQ,oBAAoB,GAAG,KAAK,SAAS,CAAC,EAAE;AAEtD,QAAI;AACF,YAAM;AAAA,IACR,UAAE;AACA,eAAS;AACT,cAAQ,IAAI,UAAU,QAAQ;AAC9B,cAAQ,IAAI,WAAW,QAAQ;AAAA,IACjC;AAAA,EACF;AACF,CAAC;","names":[]}
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@ import pc from "picocolors";
8
8
  // package.json
9
9
  var package_default = {
10
10
  name: "@kalphq/cli",
11
- version: "0.0.0-dev-20260510064855",
11
+ version: "0.0.0-dev-20260512005910",
12
12
  description: "Zero-config CLI for deploying Kalp agents",
13
13
  type: "module",
14
14
  license: "MIT",
@@ -92,13 +92,13 @@ var main = defineCommand({
92
92
  },
93
93
  subCommands: {
94
94
  create: () => import("./create-QTVTQ6QL.js").then((r) => r.default),
95
- deploy: () => import("./deploy-YZ3OP2MN.js").then((r) => r.default),
96
- push: () => import("./push-XGNM2IEY.js").then((r) => r.default),
95
+ deploy: () => import("./deploy-WU7OIHO5.js").then((r) => r.default),
96
+ push: () => import("./push-SS2VMHZ7.js").then((r) => r.default),
97
97
  link: () => import("./link-WZQSR2TM.js").then((r) => r.default),
98
98
  secrets: () => import("./secrets-P7ADVLOS.js").then((r) => r.default),
99
99
  login: () => import("./login-M5Y57ZZU.js").then((r) => r.default),
100
100
  logout: () => import("./logout-U5V5K775.js").then((r) => r.default),
101
- dev: () => import("./dev-UC2WFSOE.js").then((r) => r.default)
101
+ dev: () => import("./dev-VP2BIPPG.js").then((r) => r.default)
102
102
  },
103
103
  run({ args }) {
104
104
  const firstArg = process.argv[2];
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport pkg from \"../package.json\";\n\nconst LOGO = \"🦋\";\n\nconst COMMANDS = [\n [\"create\", \"Add a new agent\"],\n [\"deploy\", \"Deploy runtime to Cloudflare\"],\n [\"push\", \"Push agent manifest to Cloudflare\"],\n [\"link\", \"Link project to Kalp cloud\"],\n [\"secrets\", \"Manage secrets\"],\n [\"login\", \"Authenticate with Cloudflare\"],\n [\"logout\", \"Sign out from Kalp\"],\n [\"dev\", \"Run Worker + Studio locally\"],\n] as const;\n\nfunction printHelp(): void {\n p.log.info(`${pc.bold(\"Usage\")}: kalp <command> [options]`);\n console.log(\"\");\n p.log.info(pc.bold(\"Commands\"));\n\n for (const [name, desc] of COMMANDS) {\n console.log(` ${pc.cyan(name.padEnd(10))}${desc}`);\n }\n\n console.log(\"\");\n p.log.info(`Run ${pc.cyan(\"kalp <command> --help\")} for more info.`);\n}\n\nconst main = defineCommand({\n meta: {\n name: \"kalp\",\n version: pkg.version,\n description: \"🦋 Zero-config agent infrastructure\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n create: () => import(\"./commands/create\").then((r) => r.default),\n deploy: () => import(\"./commands/deploy\").then((r) => r.default),\n push: () => import(\"./commands/push\").then((r) => r.default),\n link: () => import(\"./commands/link\").then((r) => r.default),\n secrets: () => import(\"./commands/secrets\").then((r) => r.default),\n login: () => import(\"./commands/login\").then((r) => r.default),\n logout: () => import(\"./commands/logout\").then((r) => r.default),\n dev: () => import(\"./commands/dev\").then((r) => r.default),\n },\n run({ args }) {\n const firstArg = process.argv[2];\n\n if (args.help) {\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n return;\n }\n\n if (firstArg) {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n },\n});\n\nrunMain(main);\n","{\n \"name\": \"@kalphq/cli\",\n \"version\": \"0.0.0-dev-20260510064855\",\n \"description\": \"Zero-config CLI for deploying Kalp agents\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"author\": \"Kalp HQ\",\n \"bin\": {\n \"kalp\": \"./dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup && pnpm run build:studio && pnpm run build:runtime-template\",\n \"build:studio\": \"pnpm --filter=@kalphq/studio build\",\n \"build:runtime-template\": \"node ./scripts/prepare-runtime-template.mjs\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"tsc --noEmit\",\n \"prepublishOnly\": \"pnpm build\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"24.4.0\",\n \"@clack/prompts\": \"0.9.1\",\n \"@kalphq/compiler\": \"workspace:*\",\n \"@kalphq/project\": \"workspace:*\",\n \"@kalphq/sdk\": \"workspace:*\",\n \"citty\": \"0.1.6\",\n \"esbuild\": \"0.25.0\",\n \"execa\": \"^9.6.1\",\n \"jose\": \"^5.10.0\",\n \"json-stable-stringify\": \"1.3.0\",\n \"open\": \"^11.0.0\",\n \"picocolors\": \"1.1.1\",\n \"zod\": \"3.25.76\"\n },\n \"devDependencies\": {\n \"@types/json-stable-stringify\": \"1.2.0\",\n \"@types/node\": \"^22.15.3\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.0.0\"\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport pkg from \"../package.json\";\n\nconst LOGO = \"🦋\";\n\nconst COMMANDS = [\n [\"create\", \"Add a new agent\"],\n [\"deploy\", \"Deploy runtime to Cloudflare\"],\n [\"push\", \"Push agent manifest to Cloudflare\"],\n [\"link\", \"Link project to Kalp cloud\"],\n [\"secrets\", \"Manage secrets\"],\n [\"login\", \"Authenticate with Cloudflare\"],\n [\"logout\", \"Sign out from Kalp\"],\n [\"dev\", \"Run Worker + Studio locally\"],\n] as const;\n\nfunction printHelp(): void {\n p.log.info(`${pc.bold(\"Usage\")}: kalp <command> [options]`);\n console.log(\"\");\n p.log.info(pc.bold(\"Commands\"));\n\n for (const [name, desc] of COMMANDS) {\n console.log(` ${pc.cyan(name.padEnd(10))}${desc}`);\n }\n\n console.log(\"\");\n p.log.info(`Run ${pc.cyan(\"kalp <command> --help\")} for more info.`);\n}\n\nconst main = defineCommand({\n meta: {\n name: \"kalp\",\n version: pkg.version,\n description: \"🦋 Zero-config agent infrastructure\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n create: () => import(\"./commands/create\").then((r) => r.default),\n deploy: () => import(\"./commands/deploy\").then((r) => r.default),\n push: () => import(\"./commands/push\").then((r) => r.default),\n link: () => import(\"./commands/link\").then((r) => r.default),\n secrets: () => import(\"./commands/secrets\").then((r) => r.default),\n login: () => import(\"./commands/login\").then((r) => r.default),\n logout: () => import(\"./commands/logout\").then((r) => r.default),\n dev: () => import(\"./commands/dev\").then((r) => r.default),\n },\n run({ args }) {\n const firstArg = process.argv[2];\n\n if (args.help) {\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n return;\n }\n\n if (firstArg) {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n },\n});\n\nrunMain(main);\n","{\n \"name\": \"@kalphq/cli\",\n \"version\": \"0.0.0-dev-20260512005910\",\n \"description\": \"Zero-config CLI for deploying Kalp agents\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"author\": \"Kalp HQ\",\n \"bin\": {\n \"kalp\": \"./dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup && pnpm run build:studio && pnpm run build:runtime-template\",\n \"build:studio\": \"pnpm --filter=@kalphq/studio build\",\n \"build:runtime-template\": \"node ./scripts/prepare-runtime-template.mjs\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"tsc --noEmit\",\n \"prepublishOnly\": \"pnpm build\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"24.4.0\",\n \"@clack/prompts\": \"0.9.1\",\n \"@kalphq/compiler\": \"workspace:*\",\n \"@kalphq/project\": \"workspace:*\",\n \"@kalphq/sdk\": \"workspace:*\",\n \"citty\": \"0.1.6\",\n \"esbuild\": \"0.25.0\",\n \"execa\": \"^9.6.1\",\n \"jose\": \"^5.10.0\",\n \"json-stable-stringify\": \"1.3.0\",\n \"open\": \"^11.0.0\",\n \"picocolors\": \"1.1.1\",\n \"zod\": \"3.25.76\"\n },\n \"devDependencies\": {\n \"@types/json-stable-stringify\": \"1.2.0\",\n \"@types/node\": \"^22.15.3\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.0.0\"\n }\n}\n"],"mappings":"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","names":[]}