@kalphq/cli 0.0.0-dev-20260513002146 → 0.0.0-dev-20260513005156

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 (49) hide show
  1. package/dist/add-NDU352FV.js +124 -0
  2. package/dist/add-NDU352FV.js.map +1 -0
  3. package/dist/chunk-5ZRVO3TQ.js +70 -0
  4. package/dist/chunk-5ZRVO3TQ.js.map +1 -0
  5. package/dist/{chunk-63JREECU.js → chunk-DHCCSWJN.js} +83 -220
  6. package/dist/chunk-DHCCSWJN.js.map +1 -0
  7. package/dist/{chunk-TNKYKA7N.js → chunk-GNQI376N.js} +118 -18
  8. package/dist/chunk-GNQI376N.js.map +1 -0
  9. package/dist/chunk-NV2IZ4XM.js +102 -0
  10. package/dist/chunk-NV2IZ4XM.js.map +1 -0
  11. package/dist/{chunk-PY6VAS54.js → chunk-X56YSZGT.js} +43 -8
  12. package/dist/chunk-X56YSZGT.js.map +1 -0
  13. package/dist/delete-DY5FQAHW.js +127 -0
  14. package/dist/delete-DY5FQAHW.js.map +1 -0
  15. package/dist/{deploy-Z2R7ER7U.js → deploy-AD3F3BN7.js} +27 -22
  16. package/dist/deploy-AD3F3BN7.js.map +1 -0
  17. package/dist/{dev-PNRWXULV.js → dev-X43HHIYV.js} +5 -3
  18. package/dist/{dev-PNRWXULV.js.map → dev-X43HHIYV.js.map} +1 -1
  19. package/dist/index.js +6 -8
  20. package/dist/index.js.map +1 -1
  21. package/dist/list-4X735L5X.js +90 -0
  22. package/dist/list-4X735L5X.js.map +1 -0
  23. package/dist/{login-DGX55YZ6.js → login-RAN2I7YT.js} +3 -5
  24. package/dist/{login-DGX55YZ6.js.map → login-RAN2I7YT.js.map} +1 -1
  25. package/dist/{push-SVABM7WN.js → push-RA6GEUV4.js} +21 -10
  26. package/dist/push-RA6GEUV4.js.map +1 -0
  27. package/dist/{secrets-P7ADVLOS.js → secrets-5ZPPASCH.js} +10 -10
  28. package/dist/secrets-5ZPPASCH.js.map +1 -0
  29. package/dist/sync-2NLWWGI2.js +69 -0
  30. package/dist/sync-2NLWWGI2.js.map +1 -0
  31. package/package.json +4 -4
  32. package/dist/add-XTXSSGC5.js +0 -139
  33. package/dist/add-XTXSSGC5.js.map +0 -1
  34. package/dist/chunk-5RODADXW.js +0 -65
  35. package/dist/chunk-5RODADXW.js.map +0 -1
  36. package/dist/chunk-63JREECU.js.map +0 -1
  37. package/dist/chunk-PY6VAS54.js.map +0 -1
  38. package/dist/chunk-TNKYKA7N.js.map +0 -1
  39. package/dist/delete-N4OSUK3X.js +0 -145
  40. package/dist/delete-N4OSUK3X.js.map +0 -1
  41. package/dist/deploy-Z2R7ER7U.js.map +0 -1
  42. package/dist/link-WZQSR2TM.js +0 -36
  43. package/dist/link-WZQSR2TM.js.map +0 -1
  44. package/dist/list-VMJPWHIH.js +0 -120
  45. package/dist/list-VMJPWHIH.js.map +0 -1
  46. package/dist/push-SVABM7WN.js.map +0 -1
  47. package/dist/secrets-P7ADVLOS.js.map +0 -1
  48. package/dist/sync-OTO44GQS.js +0 -121
  49. package/dist/sync-OTO44GQS.js.map +0 -1
@@ -1,103 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // src/utils/secret.ts
4
- import { randomBytes } from "crypto";
5
- import { readFile, writeFile } from "fs/promises";
6
- import { join } from "path";
7
- var SECRET_KEY = "KALP_SECRET_KEY";
8
- var STUDIO_PASSWORD = "KALP_STUDIO_PASSWORD";
9
- var STUDIO_ADMIN_USER = "KALP_STUDIO_ADMIN_USER";
10
- var SERVICE_KEY = "KALP_SERVICE_KEY";
11
- function escapeRegExp(value) {
12
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
13
- }
14
- function parseEnv(content) {
15
- const result = {};
16
- for (const line of content.split(/\r?\n/g)) {
17
- const trimmed = line.trim();
18
- if (!trimmed || trimmed.startsWith("#")) continue;
19
- const eqIndex = trimmed.indexOf("=");
20
- if (eqIndex <= 0) continue;
21
- const key = trimmed.slice(0, eqIndex).trim();
22
- const value = trimmed.slice(eqIndex + 1).trim();
23
- result[key] = value;
24
- }
25
- return result;
26
- }
27
- function applyEnvUpdates(content, updates) {
28
- let next = content;
29
- for (const [key, value] of Object.entries(updates)) {
30
- const line = `${key}=${value}`;
31
- const pattern = new RegExp(`^${escapeRegExp(key)}=.*$`, "m");
32
- if (pattern.test(next)) {
33
- next = next.replace(pattern, line);
34
- continue;
35
- }
36
- const trimmed = next.trimEnd();
37
- next = trimmed.length > 0 ? `${trimmed}
38
- ${line}
39
- ` : `${line}
40
- `;
41
- }
42
- return next.trimEnd() + "\n";
43
- }
44
- async function readEnvFile(cwd) {
45
- const envPath = join(cwd, ".env");
46
- try {
47
- return await readFile(envPath, "utf-8");
48
- } catch {
49
- return "";
50
- }
51
- }
52
- async function readDevVarsFile(cwd) {
53
- const devVarsPath = join(cwd, ".dev.vars");
54
- try {
55
- return await readFile(devVarsPath, "utf-8");
56
- } catch {
57
- return "";
58
- }
59
- }
60
- function generateStudioPassword() {
61
- return randomBytes(24).toString("base64url");
62
- }
63
- function generateServiceKey() {
64
- return `kalp_sk_live_${randomBytes(32).toString("base64url")}`;
65
- }
66
- async function ensureStudioSecrets(cwd) {
67
- const envPath = join(cwd, ".env");
68
- const devVarsPath = join(cwd, ".dev.vars");
69
- const content = await readEnvFile(cwd);
70
- const parsed = parseEnv(content);
71
- const key = parsed[SECRET_KEY]?.trim() || randomBytes(32).toString("hex");
72
- const studioPassword = parsed[STUDIO_PASSWORD]?.trim() || generateStudioPassword();
73
- const studioAdminUser = parsed[STUDIO_ADMIN_USER]?.trim() || "admin";
74
- const serviceKey = parsed[SERVICE_KEY]?.trim() || generateServiceKey();
75
- const isNew = !parsed[SECRET_KEY]?.trim() || !parsed[STUDIO_PASSWORD]?.trim() || !parsed[STUDIO_ADMIN_USER]?.trim() || !parsed[SERVICE_KEY]?.trim();
76
- const next = applyEnvUpdates(content, {
77
- [SECRET_KEY]: key,
78
- [STUDIO_PASSWORD]: studioPassword,
79
- [STUDIO_ADMIN_USER]: studioAdminUser,
80
- [SERVICE_KEY]: serviceKey
81
- });
82
- await writeFile(envPath, next, "utf-8");
83
- const devVarsContent = await readDevVarsFile(cwd);
84
- const nextDevVars = applyEnvUpdates(devVarsContent, {
85
- [SECRET_KEY]: key,
86
- [STUDIO_PASSWORD]: studioPassword,
87
- [STUDIO_ADMIN_USER]: studioAdminUser,
88
- [SERVICE_KEY]: serviceKey
89
- });
90
- await writeFile(devVarsPath, nextDevVars, "utf-8");
91
- return { key, studioPassword, studioAdminUser, serviceKey, isNew };
92
- }
93
- async function ensureSecretKey(cwd) {
94
- const secrets = await ensureStudioSecrets(cwd);
95
- return { key: secrets.key, isNew: secrets.isNew };
96
- }
97
-
98
3
  // src/utils/project-state.ts
99
- import { mkdir, readFile as readFile2, writeFile as writeFile2 } from "fs/promises";
100
- import { join as join2 } from "path";
4
+ import { mkdir, readFile, writeFile } from "fs/promises";
5
+ import { join } from "path";
101
6
  var KALP_DIR = ".kalp";
102
7
  var STATE_FILE = "state.json";
103
8
  function normalizeProjectState(raw) {
@@ -138,17 +43,17 @@ function normalizeProjectState(raw) {
138
43
  }
139
44
  async function readProjectState(cwd) {
140
45
  try {
141
- const statePath = join2(cwd, KALP_DIR, STATE_FILE);
142
- const content = await readFile2(statePath, "utf-8");
46
+ const statePath = join(cwd, KALP_DIR, STATE_FILE);
47
+ const content = await readFile(statePath, "utf-8");
143
48
  return normalizeProjectState(JSON.parse(content));
144
49
  } catch {
145
50
  return null;
146
51
  }
147
52
  }
148
53
  async function writeProjectState(cwd, state) {
149
- const dir = join2(cwd, KALP_DIR);
54
+ const dir = join(cwd, KALP_DIR);
150
55
  await mkdir(dir, { recursive: true });
151
- await writeFile2(join2(dir, STATE_FILE), `${JSON.stringify(state, null, 2)}
56
+ await writeFile(join(dir, STATE_FILE), `${JSON.stringify(state, null, 2)}
152
57
  `, "utf-8");
153
58
  }
154
59
 
@@ -159,19 +64,19 @@ import {
159
64
  cp,
160
65
  mkdir as mkdir2,
161
66
  readdir,
162
- readFile as readFile5,
67
+ readFile as readFile3,
163
68
  rm,
164
69
  stat,
165
- writeFile as writeFile4
70
+ writeFile as writeFile3
166
71
  } from "fs/promises";
167
- import { basename, dirname as dirname2, join as join6, resolve as resolve2 } from "path";
72
+ import { basename, dirname, join as join5, resolve as resolve2 } from "path";
168
73
  import { fileURLToPath } from "url";
169
74
  import { deriveLabelFromName } from "@kalphq/project";
170
75
 
171
76
  // src/utils/ai.ts
172
- import { access, readFile as readFile3 } from "fs/promises";
77
+ import { access, readFile as readFile2 } from "fs/promises";
173
78
  import { constants } from "fs";
174
- import { join as join3 } from "path";
79
+ import { join as join2 } from "path";
175
80
  import { createJiti } from "jiti";
176
81
  var PROVIDER_SECRET_MAP = {
177
82
  openai: "OPENAI_API_KEY",
@@ -179,7 +84,7 @@ var PROVIDER_SECRET_MAP = {
179
84
  openrouter: "OPENROUTER_API_KEY",
180
85
  custom: "CUSTOM_AI_API_KEY"
181
86
  };
182
- function parseEnv2(content) {
87
+ function parseEnv(content) {
183
88
  const env = {};
184
89
  for (const raw of content.split(/\r?\n/g)) {
185
90
  const line = raw.trim();
@@ -191,7 +96,7 @@ function parseEnv2(content) {
191
96
  return env;
192
97
  }
193
98
  async function resolveProviderFromConfig(cwd) {
194
- const configPath = join3(cwd, "kalp.config.ts");
99
+ const configPath = join2(cwd, "kalp.config.ts");
195
100
  await access(configPath, constants.F_OK);
196
101
  const jiti = createJiti(cwd, { interopDefault: true });
197
102
  const config = await jiti.import(configPath);
@@ -199,9 +104,9 @@ async function resolveProviderFromConfig(cwd) {
199
104
  return provider;
200
105
  }
201
106
  async function readDotEnv(cwd) {
202
- const envPath = join3(cwd, ".env");
203
- const content = await readFile3(envPath, "utf-8").catch(() => "");
204
- return parseEnv2(content);
107
+ const envPath = join2(cwd, ".env");
108
+ const content = await readFile2(envPath, "utf-8").catch(() => "");
109
+ return parseEnv(content);
205
110
  }
206
111
  function getRequiredSecretForProvider(provider) {
207
112
  return PROVIDER_SECRET_MAP[provider];
@@ -211,7 +116,7 @@ function getRequiredSecretForProvider(provider) {
211
116
  import { createJiti as createJiti2 } from "jiti";
212
117
  import { access as access2 } from "fs/promises";
213
118
  import { constants as constants2 } from "fs";
214
- import { join as join4, resolve } from "path";
119
+ import { join as join3, resolve } from "path";
215
120
  function normalizeStrategy(strategy) {
216
121
  if (!strategy) return null;
217
122
  if (strategy.type === "jwks") {
@@ -235,7 +140,7 @@ function normalizeStrategy(strategy) {
235
140
  };
236
141
  }
237
142
  async function loadProjectConfig(cwd) {
238
- const configPath = resolve(join4(cwd, "kalp.config.ts"));
143
+ const configPath = resolve(join3(cwd, "kalp.config.ts"));
239
144
  await access2(configPath, constants2.F_OK);
240
145
  const jiti = createJiti2(cwd, { interopDefault: true });
241
146
  const moduleValue = await jiti.import(configPath);
@@ -278,25 +183,8 @@ function resolveIdentityAuthRequirements(identity) {
278
183
 
279
184
  // src/utils/runtime-identity.ts
280
185
  import { build } from "esbuild";
281
- import { readFile as readFile4, writeFile as writeFile3 } from "fs/promises";
282
- import { dirname, join as join5 } from "path";
283
- var NODE_BUILTIN_IMPORTS = /* @__PURE__ */ new Set([
284
- "fs",
285
- "path",
286
- "crypto",
287
- "os",
288
- "child_process",
289
- "worker_threads",
290
- "net",
291
- "tls",
292
- "http",
293
- "https",
294
- "zlib",
295
- "stream",
296
- "url",
297
- "process",
298
- "buffer"
299
- ]);
186
+ import { writeFile as writeFile2 } from "fs/promises";
187
+ import { join as join4 } from "path";
300
188
  var DEFAULT_IDENTITY_MAP_SOURCE = `export default function mapIdentity(payload) {
301
189
  const sub =
302
190
  payload && typeof payload === "object" && typeof payload.sub === "string"
@@ -309,25 +197,32 @@ function readIdentityMapCandidate(rawConfig) {
309
197
  if (!rawConfig.identity || typeof rawConfig.identity !== "object") return null;
310
198
  return rawConfig.identity.mapIdentity;
311
199
  }
200
+ function assertEdgeSafeSource(mapIdentitySource) {
201
+ const blockedPatterns = [
202
+ { regex: /\brequire\s*\(/, label: "require(...)" },
203
+ { regex: /\bnode:/, label: "node:* imports" },
204
+ { regex: /\bprocess\./, label: "process.*" },
205
+ { regex: /\bBuffer\b/, label: "Buffer" },
206
+ { regex: /\bimport\s*\(/, label: "dynamic import(...)" }
207
+ ];
208
+ const hit = blockedPatterns.find((item) => item.regex.test(mapIdentitySource));
209
+ if (!hit) return;
210
+ throw new Error(
211
+ `mapIdentity uses "${hit.label}", which is not supported in edge runtime.`
212
+ );
213
+ }
312
214
  async function writeDefaultIdentityMap(identityMapPath) {
313
- await writeFile3(identityMapPath, DEFAULT_IDENTITY_MAP_SOURCE, "utf-8");
215
+ await writeFile2(identityMapPath, DEFAULT_IDENTITY_MAP_SOURCE, "utf-8");
314
216
  }
315
217
  async function bundleIdentityMap(params) {
316
- const { cwd, configPath, identityMapPath } = params;
317
- const VIRTUAL_CONFIG_SPECIFIER = "kalp:project-config";
318
- const VIRTUAL_CONFIG_NAMESPACE = "kalp-project-config";
218
+ const { cwd, mapIdentitySource, identityMapPath } = params;
219
+ assertEdgeSafeSource(mapIdentitySource);
319
220
  const entrySource = `
320
- import configModule from ${JSON.stringify(VIRTUAL_CONFIG_SPECIFIER)};
321
- const config = (configModule && typeof configModule === "object" && "default" in configModule)
322
- ? (configModule.default ?? configModule)
323
- : configModule;
324
-
325
- const mapper = config?.identity?.mapIdentity;
326
- if (typeof mapper !== "function") {
221
+ const mapIdentity = (${mapIdentitySource});
222
+ if (typeof mapIdentity !== "function") {
327
223
  throw new Error("identity.mapIdentity must be a function.");
328
224
  }
329
-
330
- export default mapper;
225
+ export default mapIdentity;
331
226
  `;
332
227
  try {
333
228
  await build({
@@ -339,44 +234,6 @@ export default mapper;
339
234
  write: true,
340
235
  outfile: identityMapPath,
341
236
  logLevel: "silent",
342
- plugins: [
343
- {
344
- name: "kalp-edge-identity-guard",
345
- setup(buildContext) {
346
- buildContext.onResolve(
347
- { filter: /^kalp:project-config$/ },
348
- () => ({
349
- path: configPath,
350
- namespace: VIRTUAL_CONFIG_NAMESPACE
351
- })
352
- );
353
- buildContext.onLoad(
354
- { filter: /.*/, namespace: VIRTUAL_CONFIG_NAMESPACE },
355
- async () => {
356
- const contents = await readFile4(configPath, "utf-8");
357
- return {
358
- contents,
359
- loader: "ts",
360
- resolveDir: dirname(configPath)
361
- };
362
- }
363
- );
364
- buildContext.onResolve({ filter: /.*/ }, (args) => {
365
- const raw = args.path.startsWith("node:") ? args.path.slice(5) : args.path;
366
- if (NODE_BUILTIN_IMPORTS.has(raw)) {
367
- return {
368
- errors: [
369
- {
370
- text: `Node builtin "${args.path}" is not supported in identity.mapIdentity for edge runtime.`
371
- }
372
- ]
373
- };
374
- }
375
- return null;
376
- });
377
- }
378
- }
379
- ],
380
237
  stdin: {
381
238
  contents: entrySource,
382
239
  resolveDir: cwd,
@@ -391,7 +248,8 @@ export default mapper;
391
248
  "Could not bundle identity.mapIdentity for runtime.",
392
249
  "Please verify:",
393
250
  " \u2022 kalp.config.ts exists and exports default defineConfig(...)",
394
- " \u2022 mapIdentity does not use Node built-ins (fs, path, crypto, etc.)",
251
+ " \u2022 mapIdentity is declared inline and does not capture external variables",
252
+ " \u2022 mapIdentity does not use Node-specific APIs",
395
253
  " \u2022 kalp.config.ts has no broken imports",
396
254
  `Technical details: ${message}`
397
255
  ].join("\n")
@@ -400,26 +258,33 @@ export default mapper;
400
258
  }
401
259
  async function materializeRuntimeIdentity(params) {
402
260
  const { cwd, runtimeDir } = params;
403
- const identityConfigPath = join5(runtimeDir, "identity.config.json");
404
- const identityMapPath = join5(runtimeDir, "identity.map.mjs");
261
+ const identityConfigPath = join4(runtimeDir, "identity.config.json");
262
+ const identityMapPath = join4(runtimeDir, "identity.map.mjs");
405
263
  let rawConfig = {};
406
- let configPath = null;
407
264
  try {
408
265
  const loaded = await loadProjectConfig(cwd);
409
266
  rawConfig = loaded.raw;
410
- configPath = loaded.path;
411
267
  } catch {
412
268
  rawConfig = {};
413
- configPath = null;
414
269
  }
415
270
  const identityConfig = resolveRuntimeIdentityConfig(rawConfig);
416
- await writeFile3(identityConfigPath, `${JSON.stringify(identityConfig, null, 2)}
417
- `, "utf-8");
271
+ await writeFile2(
272
+ identityConfigPath,
273
+ `${JSON.stringify(identityConfig, null, 2)}
274
+ `,
275
+ "utf-8"
276
+ );
418
277
  const mapIdentity = readIdentityMapCandidate(rawConfig);
419
- if (typeof mapIdentity === "function" && configPath) {
278
+ if (typeof mapIdentity === "function") {
279
+ const mapIdentitySource = mapIdentity.toString();
280
+ if (!mapIdentitySource || /\[native code\]/.test(mapIdentitySource)) {
281
+ throw new Error(
282
+ "Could not serialize identity.mapIdentity. Define it inline in kalp.config.ts as a regular function."
283
+ );
284
+ }
420
285
  await bundleIdentityMap({
421
286
  cwd,
422
- configPath,
287
+ mapIdentitySource,
423
288
  identityMapPath
424
289
  });
425
290
  } else {
@@ -440,9 +305,9 @@ function sanitizeSegment(input) {
440
305
  }
441
306
  async function resolveProjectSlug(cwd) {
442
307
  const fallback = sanitizeSegment(basename(cwd)) || "agent";
443
- const packageJsonPath = join6(cwd, "package.json");
308
+ const packageJsonPath = join5(cwd, "package.json");
444
309
  try {
445
- const content = await readFile5(packageJsonPath, "utf-8");
310
+ const content = await readFile3(packageJsonPath, "utf-8");
446
311
  const pkg = JSON.parse(content);
447
312
  const name = typeof pkg.name === "string" ? pkg.name : "";
448
313
  const sanitized = sanitizeSegment(name);
@@ -503,7 +368,7 @@ function createRuntimeConfig(workerName, mode, requiredSecrets) {
503
368
  };
504
369
  }
505
370
  function runtimeTemplateCandidates() {
506
- const here = dirname2(fileURLToPath(import.meta.url));
371
+ const here = dirname(fileURLToPath(import.meta.url));
507
372
  const distTemplateRoot = resolve2(here, "runtime-template");
508
373
  const packageRootTemplate = resolve2(here, "..", "runtime-template");
509
374
  const sourceTemplateRoot = resolve2(here, "..", "..", "runtime-template");
@@ -520,20 +385,20 @@ function runtimeTemplateCandidates() {
520
385
  );
521
386
  return [
522
387
  {
523
- studioTemplateDir: join6(distTemplateRoot, STUDIO_DIR),
524
- workerEntryPath: join6(distTemplateRoot, WORKER_ENTRY_FILE)
388
+ studioTemplateDir: join5(distTemplateRoot, STUDIO_DIR),
389
+ workerEntryPath: join5(distTemplateRoot, WORKER_ENTRY_FILE)
525
390
  },
526
391
  {
527
- studioTemplateDir: join6(packageRootTemplate, STUDIO_DIR),
528
- workerEntryPath: join6(packageRootTemplate, WORKER_ENTRY_FILE)
392
+ studioTemplateDir: join5(packageRootTemplate, STUDIO_DIR),
393
+ workerEntryPath: join5(packageRootTemplate, WORKER_ENTRY_FILE)
529
394
  },
530
395
  {
531
- studioTemplateDir: join6(sourceTemplateRoot, STUDIO_DIR),
532
- workerEntryPath: join6(sourceTemplateRoot, WORKER_ENTRY_FILE)
396
+ studioTemplateDir: join5(sourceTemplateRoot, STUDIO_DIR),
397
+ workerEntryPath: join5(sourceTemplateRoot, WORKER_ENTRY_FILE)
533
398
  },
534
399
  {
535
400
  studioTemplateDir: monorepoStudioDist,
536
- workerEntryPath: join6(sourceTemplateRoot, WORKER_ENTRY_FILE)
401
+ workerEntryPath: join5(sourceTemplateRoot, WORKER_ENTRY_FILE)
537
402
  }
538
403
  ];
539
404
  }
@@ -568,13 +433,13 @@ ${cssLinks}
568
433
  `;
569
434
  }
570
435
  async function ensureStudioIndex(studioDir) {
571
- const indexPath = join6(studioDir, "index.html");
436
+ const indexPath = join5(studioDir, "index.html");
572
437
  try {
573
438
  await access3(indexPath);
574
439
  return;
575
440
  } catch {
576
441
  }
577
- const assetsDir = join6(studioDir, "assets");
442
+ const assetsDir = join5(studioDir, "assets");
578
443
  const assetFiles = await readdir(assetsDir);
579
444
  const entryScript = assetFiles.find((file) => /^index-.*\.js$/i.test(file)) ?? assetFiles.find((file) => file.endsWith(".js"));
580
445
  if (!entryScript) {
@@ -584,16 +449,16 @@ async function ensureStudioIndex(studioDir) {
584
449
  }
585
450
  const cssFiles = assetFiles.filter((file) => file.endsWith(".css")).sort();
586
451
  const html = createStudioShell(entryScript, cssFiles);
587
- await writeFile4(indexPath, html, "utf-8");
452
+ await writeFile3(indexPath, html, "utf-8");
588
453
  }
589
454
  async function readLocalAgentNames(cwd) {
590
- const agentsDir = join6(cwd, "agents");
455
+ const agentsDir = join5(cwd, "agents");
591
456
  try {
592
457
  const entries = await readdir(agentsDir, { withFileTypes: true });
593
458
  const names = [];
594
459
  for (const entry of entries) {
595
460
  if (!entry.isDirectory()) continue;
596
- const indexPath = join6(agentsDir, entry.name, "index.ts");
461
+ const indexPath = join5(agentsDir, entry.name, "index.ts");
597
462
  const exists = await stat(indexPath).then(() => true).catch(() => false);
598
463
  if (exists) names.push(entry.name);
599
464
  }
@@ -608,7 +473,7 @@ async function createAgentsSnapshot(cwd, mode) {
608
473
  const byName = /* @__PURE__ */ new Map();
609
474
  const stateAgents = state?.agents ?? {};
610
475
  for (const name of localAgentNames) {
611
- const localPath = join6(cwd, "agents", name, "index.ts");
476
+ const localPath = join5(cwd, "agents", name, "index.ts");
612
477
  const saved = stateAgents[name];
613
478
  const hasRemoteVersion = !!saved?.lastRemoteHash && (saved?.currentVersion ?? 0) > 0;
614
479
  if (mode === "remote" && !hasRemoteVersion) {
@@ -636,7 +501,7 @@ async function createAgentsSnapshot(cwd, mode) {
636
501
  for (const [name, saved] of Object.entries(stateAgents)) {
637
502
  const hasRemoteVersion = !!saved.lastRemoteHash && (saved.currentVersion ?? 0) > 0;
638
503
  if (!hasRemoteVersion || byName.has(name)) continue;
639
- const localPath = saved.localPath ?? join6(cwd, "agents", name, "index.ts");
504
+ const localPath = saved.localPath ?? join5(cwd, "agents", name, "index.ts");
640
505
  const workerUrl = saved.workerUrl ?? (state?.workerUrl ? `${state.workerUrl.replace(/\/$/, "")}/a/${name}` : null);
641
506
  const versionNumber = saved.currentVersion > 0 ? saved.currentVersion : null;
642
507
  byName.set(name, {
@@ -666,8 +531,8 @@ async function createAgentsSnapshot(cwd, mode) {
666
531
  }
667
532
  async function writeRuntimeAgentsSnapshot(params) {
668
533
  const snapshot = await createAgentsSnapshot(params.cwd, params.mode);
669
- await writeFile4(
670
- join6(params.runtimeDir, "agents.snapshot.json"),
534
+ await writeFile3(
535
+ join5(params.runtimeDir, "agents.snapshot.json"),
671
536
  `${JSON.stringify(snapshot, null, 2)}
672
537
  `,
673
538
  "utf-8"
@@ -675,10 +540,10 @@ async function writeRuntimeAgentsSnapshot(params) {
675
540
  }
676
541
  async function materializeRuntime(cwd, options = {}) {
677
542
  const mode = options.mode ?? "remote";
678
- const runtimeDir = join6(cwd, RUNTIME_ROOT, RUNTIME_DIR);
679
- const studioDir = join6(runtimeDir, STUDIO_DIR);
680
- const workerEntrypointPath = join6(runtimeDir, WORKER_ENTRY_FILE);
681
- const wranglerConfigPath = join6(runtimeDir, WRANGLER_CONFIG_FILE);
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);
682
547
  const template = await resolveRuntimeTemplate();
683
548
  await rm(runtimeDir, { recursive: true, force: true });
684
549
  await mkdir2(runtimeDir, { recursive: true });
@@ -709,7 +574,7 @@ async function materializeRuntime(cwd, options = {}) {
709
574
  mode,
710
575
  [...requiredSecrets].sort((a, b) => a.localeCompare(b))
711
576
  );
712
- await writeFile4(
577
+ await writeFile3(
713
578
  wranglerConfigPath,
714
579
  `${JSON.stringify(wranglerConfig, null, 2)}
715
580
  `,
@@ -725,8 +590,6 @@ async function materializeRuntime(cwd, options = {}) {
725
590
  }
726
591
 
727
592
  export {
728
- ensureStudioSecrets,
729
- ensureSecretKey,
730
593
  readProjectState,
731
594
  writeProjectState,
732
595
  resolveProviderFromConfig,
@@ -739,4 +602,4 @@ export {
739
602
  writeRuntimeAgentsSnapshot,
740
603
  materializeRuntime
741
604
  };
742
- //# sourceMappingURL=chunk-63JREECU.js.map
605
+ //# sourceMappingURL=chunk-DHCCSWJN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/project-state.ts","../src/utils/runtime.ts","../src/utils/ai.ts","../src/utils/project-config.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 { createJiti } from \"jiti\";\nimport { access } from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport type { AuthStrategy, IdentityConfig } from \"@kalphq/sdk\";\n\nexport interface LoadedProjectConfig {\n path: string;\n raw: Record<string, unknown>;\n}\n\nexport interface RuntimeIdentityStrategyConfig {\n type: \"jwks\" | \"symmetric\" | \"apiKey\";\n jwksUrl?: string;\n issuer?: string;\n audience?: string;\n secretEnvKey?: string;\n headerName?: string;\n envKey?: string;\n}\n\nexport interface RuntimeIdentityConfig {\n enforceGlobalAuth: boolean;\n identityId: string | null;\n strategy: RuntimeIdentityStrategyConfig | null;\n}\n\nexport interface ProjectConfigAuthRequirement {\n envKey: string;\n reason: string;\n}\n\nfunction normalizeStrategy(\n strategy: AuthStrategy | undefined,\n): RuntimeIdentityStrategyConfig | null {\n if (!strategy) return null;\n if (strategy.type === \"jwks\") {\n return {\n type: \"jwks\",\n jwksUrl: strategy.jwksUrl,\n issuer: strategy.issuer,\n audience: strategy.audience,\n };\n }\n if (strategy.type === \"symmetric\") {\n return {\n type: \"symmetric\",\n secretEnvKey: strategy.secretEnvKey,\n };\n }\n return {\n type: \"apiKey\",\n headerName: strategy.headerName,\n envKey: strategy.envKey,\n };\n}\n\nexport async function loadProjectConfig(cwd: string): Promise<LoadedProjectConfig> {\n const configPath = resolve(join(cwd, \"kalp.config.ts\"));\n await access(configPath, constants.F_OK);\n const jiti = createJiti(cwd, { interopDefault: true });\n const moduleValue = (await jiti.import(configPath)) as\n | { default?: Record<string, unknown> }\n | Record<string, unknown>;\n const raw =\n moduleValue && typeof moduleValue === \"object\" && \"default\" in moduleValue\n ? ((moduleValue.default ?? moduleValue) as Record<string, unknown>)\n : (moduleValue as Record<string, unknown>);\n return { path: configPath, raw };\n}\n\nexport function resolveRuntimeIdentityConfig(\n rawConfig: Record<string, unknown>,\n): RuntimeIdentityConfig {\n const identity =\n rawConfig.identity && typeof rawConfig.identity === \"object\"\n ? (rawConfig.identity as IdentityConfig)\n : undefined;\n const enforceGlobalAuth =\n typeof rawConfig.enforceGlobalAuth === \"boolean\"\n ? rawConfig.enforceGlobalAuth\n : true;\n\n return {\n enforceGlobalAuth,\n identityId:\n identity && typeof identity.id === \"string\" && identity.id.length > 0\n ? identity.id\n : null,\n strategy: normalizeStrategy(identity?.strategy),\n };\n}\n\nexport function resolveIdentityAuthRequirements(\n identity: RuntimeIdentityConfig,\n): ProjectConfigAuthRequirement[] {\n if (!identity.strategy) return [];\n\n if (identity.strategy.type === \"symmetric\") {\n return [\n {\n envKey: identity.strategy.secretEnvKey?.trim() || \"JWT_SIGNING_SECRET\",\n reason: \"symmetric JWT validation\",\n },\n ];\n }\n\n if (identity.strategy.type === \"apiKey\") {\n const envKey = identity.strategy.envKey?.trim();\n if (!envKey) {\n return [\n {\n envKey: \"KALP_API_KEY\",\n reason: \"apiKey strategy (default env key)\",\n },\n ];\n }\n return [{ envKey, reason: \"apiKey strategy\" }];\n }\n\n return [];\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","resolve","readFile","join","createJiti","access","constants","join","writeFile","join","writeFile","join","join","readFile","resolve","access","writeFile","mkdir"]}