@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.
- package/dist/add-NDU352FV.js +124 -0
- package/dist/add-NDU352FV.js.map +1 -0
- package/dist/chunk-5ZRVO3TQ.js +70 -0
- package/dist/chunk-5ZRVO3TQ.js.map +1 -0
- package/dist/{chunk-63JREECU.js → chunk-DHCCSWJN.js} +83 -220
- package/dist/chunk-DHCCSWJN.js.map +1 -0
- package/dist/{chunk-TNKYKA7N.js → chunk-GNQI376N.js} +118 -18
- package/dist/chunk-GNQI376N.js.map +1 -0
- package/dist/chunk-NV2IZ4XM.js +102 -0
- package/dist/chunk-NV2IZ4XM.js.map +1 -0
- package/dist/{chunk-PY6VAS54.js → chunk-X56YSZGT.js} +43 -8
- package/dist/chunk-X56YSZGT.js.map +1 -0
- package/dist/delete-DY5FQAHW.js +127 -0
- package/dist/delete-DY5FQAHW.js.map +1 -0
- package/dist/{deploy-Z2R7ER7U.js → deploy-AD3F3BN7.js} +27 -22
- package/dist/deploy-AD3F3BN7.js.map +1 -0
- package/dist/{dev-PNRWXULV.js → dev-X43HHIYV.js} +5 -3
- package/dist/{dev-PNRWXULV.js.map → dev-X43HHIYV.js.map} +1 -1
- package/dist/index.js +6 -8
- package/dist/index.js.map +1 -1
- package/dist/list-4X735L5X.js +90 -0
- package/dist/list-4X735L5X.js.map +1 -0
- package/dist/{login-DGX55YZ6.js → login-RAN2I7YT.js} +3 -5
- package/dist/{login-DGX55YZ6.js.map → login-RAN2I7YT.js.map} +1 -1
- package/dist/{push-SVABM7WN.js → push-RA6GEUV4.js} +21 -10
- package/dist/push-RA6GEUV4.js.map +1 -0
- package/dist/{secrets-P7ADVLOS.js → secrets-5ZPPASCH.js} +10 -10
- package/dist/secrets-5ZPPASCH.js.map +1 -0
- package/dist/sync-2NLWWGI2.js +69 -0
- package/dist/sync-2NLWWGI2.js.map +1 -0
- package/package.json +4 -4
- package/dist/add-XTXSSGC5.js +0 -139
- package/dist/add-XTXSSGC5.js.map +0 -1
- package/dist/chunk-5RODADXW.js +0 -65
- package/dist/chunk-5RODADXW.js.map +0 -1
- package/dist/chunk-63JREECU.js.map +0 -1
- package/dist/chunk-PY6VAS54.js.map +0 -1
- package/dist/chunk-TNKYKA7N.js.map +0 -1
- package/dist/delete-N4OSUK3X.js +0 -145
- package/dist/delete-N4OSUK3X.js.map +0 -1
- package/dist/deploy-Z2R7ER7U.js.map +0 -1
- package/dist/link-WZQSR2TM.js +0 -36
- package/dist/link-WZQSR2TM.js.map +0 -1
- package/dist/list-VMJPWHIH.js +0 -120
- package/dist/list-VMJPWHIH.js.map +0 -1
- package/dist/push-SVABM7WN.js.map +0 -1
- package/dist/secrets-P7ADVLOS.js.map +0 -1
- package/dist/sync-OTO44GQS.js +0 -121
- 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
|
|
100
|
-
import { join
|
|
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 =
|
|
142
|
-
const content = await
|
|
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 =
|
|
54
|
+
const dir = join(cwd, KALP_DIR);
|
|
150
55
|
await mkdir(dir, { recursive: true });
|
|
151
|
-
await
|
|
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
|
|
67
|
+
readFile as readFile3,
|
|
163
68
|
rm,
|
|
164
69
|
stat,
|
|
165
|
-
writeFile as
|
|
70
|
+
writeFile as writeFile3
|
|
166
71
|
} from "fs/promises";
|
|
167
|
-
import { basename, dirname
|
|
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
|
|
77
|
+
import { access, readFile as readFile2 } from "fs/promises";
|
|
173
78
|
import { constants } from "fs";
|
|
174
|
-
import { join as
|
|
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
|
|
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 =
|
|
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 =
|
|
203
|
-
const content = await
|
|
204
|
-
return
|
|
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
|
|
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(
|
|
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 {
|
|
282
|
-
import {
|
|
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
|
|
215
|
+
await writeFile2(identityMapPath, DEFAULT_IDENTITY_MAP_SOURCE, "utf-8");
|
|
314
216
|
}
|
|
315
217
|
async function bundleIdentityMap(params) {
|
|
316
|
-
const { cwd,
|
|
317
|
-
|
|
318
|
-
const VIRTUAL_CONFIG_NAMESPACE = "kalp-project-config";
|
|
218
|
+
const { cwd, mapIdentitySource, identityMapPath } = params;
|
|
219
|
+
assertEdgeSafeSource(mapIdentitySource);
|
|
319
220
|
const entrySource = `
|
|
320
|
-
|
|
321
|
-
|
|
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
|
|
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 =
|
|
404
|
-
const identityMapPath =
|
|
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
|
|
417
|
-
|
|
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"
|
|
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
|
-
|
|
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 =
|
|
308
|
+
const packageJsonPath = join5(cwd, "package.json");
|
|
444
309
|
try {
|
|
445
|
-
const content = await
|
|
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 =
|
|
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:
|
|
524
|
-
workerEntryPath:
|
|
388
|
+
studioTemplateDir: join5(distTemplateRoot, STUDIO_DIR),
|
|
389
|
+
workerEntryPath: join5(distTemplateRoot, WORKER_ENTRY_FILE)
|
|
525
390
|
},
|
|
526
391
|
{
|
|
527
|
-
studioTemplateDir:
|
|
528
|
-
workerEntryPath:
|
|
392
|
+
studioTemplateDir: join5(packageRootTemplate, STUDIO_DIR),
|
|
393
|
+
workerEntryPath: join5(packageRootTemplate, WORKER_ENTRY_FILE)
|
|
529
394
|
},
|
|
530
395
|
{
|
|
531
|
-
studioTemplateDir:
|
|
532
|
-
workerEntryPath:
|
|
396
|
+
studioTemplateDir: join5(sourceTemplateRoot, STUDIO_DIR),
|
|
397
|
+
workerEntryPath: join5(sourceTemplateRoot, WORKER_ENTRY_FILE)
|
|
533
398
|
},
|
|
534
399
|
{
|
|
535
400
|
studioTemplateDir: monorepoStudioDist,
|
|
536
|
-
workerEntryPath:
|
|
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 =
|
|
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 =
|
|
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
|
|
452
|
+
await writeFile3(indexPath, html, "utf-8");
|
|
588
453
|
}
|
|
589
454
|
async function readLocalAgentNames(cwd) {
|
|
590
|
-
const agentsDir =
|
|
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 =
|
|
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 =
|
|
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 ??
|
|
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
|
|
670
|
-
|
|
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 =
|
|
679
|
-
const studioDir =
|
|
680
|
-
const workerEntrypointPath =
|
|
681
|
-
const wranglerConfigPath =
|
|
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
|
|
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-
|
|
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"]}
|