@kalphq/cli 0.0.0-dev-20260510053622 → 0.0.0-dev-20260510062740

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 (42) hide show
  1. package/dist/{chunk-OE6N3E5B.js → chunk-NIPAXEFM.js} +29 -30
  2. package/dist/chunk-NIPAXEFM.js.map +1 -0
  3. package/dist/chunk-RT2DIIQ5.js +407 -0
  4. package/dist/chunk-RT2DIIQ5.js.map +1 -0
  5. package/dist/{deploy-6UTG5A76.js → deploy-3EVKLTWF.js} +3 -3
  6. package/dist/{dev-MBANBST4.js → dev-UC2WFSOE.js} +5 -19
  7. package/dist/dev-UC2WFSOE.js.map +1 -0
  8. package/dist/index.js +4 -4
  9. package/dist/index.js.map +1 -1
  10. package/dist/{push-B4UM7AVH.js → push-4WZVTK2Z.js} +14 -40
  11. package/dist/push-4WZVTK2Z.js.map +1 -0
  12. package/dist/runtime-template/studio/assets/QueryClientProvider-DAZmVr20.js +1 -0
  13. package/dist/runtime-template/studio/assets/agent._agentName-D0WHDceC.js +1 -0
  14. package/dist/runtime-template/studio/assets/button-D0LvXgpN.js +1 -0
  15. package/dist/runtime-template/studio/assets/card-B2bzwIGM.js +1 -0
  16. package/dist/runtime-template/studio/assets/globe-qCpO1Z-s.js +1 -0
  17. package/dist/runtime-template/studio/assets/index-DcJItVMf.js +75 -0
  18. package/dist/runtime-template/studio/assets/link-D3Ad09qM.js +1 -0
  19. package/dist/runtime-template/studio/assets/login-Cqmvx0NQ.js +1 -0
  20. package/dist/runtime-template/studio/assets/preload-helper-DHF8Plid.js +1 -0
  21. package/dist/runtime-template/studio/assets/replay._executionId-8boDJLx9.js +41 -0
  22. package/dist/runtime-template/studio/assets/routes-CaRwwZyr.js +1 -0
  23. package/dist/runtime-template/studio/assets/skeleton-CJLC4mqH.js +1 -0
  24. package/dist/runtime-template/studio/assets/styles-GI30ROBZ.css +2 -0
  25. package/dist/runtime-template/studio/assets/useNavigate-F1VFNun_.js +1 -0
  26. package/dist/runtime-template/studio/favicon.ico +0 -0
  27. package/dist/runtime-template/studio/index.html +2 -2
  28. package/dist/runtime-template/studio/kalp-logo.png +0 -0
  29. package/dist/runtime-template/worker-entry.js +185 -102
  30. package/package.json +4 -4
  31. package/dist/chunk-OE6N3E5B.js.map +0 -1
  32. package/dist/chunk-TUF2J67G.js +0 -225
  33. package/dist/chunk-TUF2J67G.js.map +0 -1
  34. package/dist/dev-MBANBST4.js.map +0 -1
  35. package/dist/push-B4UM7AVH.js.map +0 -1
  36. package/dist/runtime-template/studio/assets/QueryClientProvider-D-LxTiBd.js +0 -1
  37. package/dist/runtime-template/studio/assets/index-DpfZiZAs.js +0 -75
  38. package/dist/runtime-template/studio/assets/replay._executionId-Cs7M_t4A.js +0 -41
  39. package/dist/runtime-template/studio/assets/routes-DM2dr3uc.js +0 -1
  40. package/dist/runtime-template/studio/assets/styles-DnCmVxlg.css +0 -2
  41. package/dist/runtime-template/studio/assets/useAuth-CNMCKtPc.js +0 -1
  42. /package/dist/{deploy-6UTG5A76.js.map → deploy-3EVKLTWF.js.map} +0 -0
@@ -4,10 +4,10 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>Kalp Studio</title>
7
- <link rel="stylesheet" href="/studio/assets/styles-DnCmVxlg.css" />
7
+ <link rel="stylesheet" href="/studio/assets/styles-GI30ROBZ.css" />
8
8
  </head>
9
9
  <body>
10
10
  <div id="root"></div>
11
- <script type="module" src="/studio/assets/index-DpfZiZAs.js"></script>
11
+ <script type="module" src="/studio/assets/index-DcJItVMf.js"></script>
12
12
  </body>
13
13
  </html>
@@ -1,4 +1,68 @@
1
1
  import { DurableObject } from "cloudflare:workers";
2
+ import { Hono } from "hono";
3
+ import { deleteCookie, getSignedCookie, setSignedCookie } from "hono/cookie";
4
+ import { serveStatic } from "hono/cloudflare-workers";
5
+ import manifest from "__STATIC_CONTENT_MANIFEST";
6
+ import agentsSnapshot from "./agents.snapshot.json";
7
+
8
+ const SESSION_COOKIE_NAME = "kalp_studio_session";
9
+ const SESSION_MAX_AGE_SECONDS = 60 * 60 * 8;
10
+ const CORS_HEADERS = {
11
+ "Access-Control-Allow-Origin": "*",
12
+ "Access-Control-Allow-Methods": "GET, POST, PUT, PATCH, DELETE, OPTIONS",
13
+ "Access-Control-Allow-Headers": "Content-Type, Authorization",
14
+ };
15
+
16
+ const staticManifest =
17
+ typeof manifest === "string" ? JSON.parse(manifest) : manifest;
18
+
19
+ function withCors(response) {
20
+ if (response.status === 101) return response;
21
+ const headers = new Headers(response.headers);
22
+ for (const [key, value] of Object.entries(CORS_HEADERS)) {
23
+ headers.set(key, value);
24
+ }
25
+ return new Response(response.body, {
26
+ status: response.status,
27
+ statusText: response.statusText,
28
+ headers,
29
+ });
30
+ }
31
+
32
+ function resolveStudioAssetPath(pathname) {
33
+ if (pathname === "/studio" || pathname === "/studio/") return "index.html";
34
+ const stripped = pathname.replace(/^\/studio\//, "");
35
+ return stripped || "index.html";
36
+ }
37
+
38
+ function hasManifestPath(assetPath) {
39
+ return Object.prototype.hasOwnProperty.call(staticManifest, assetPath);
40
+ }
41
+
42
+ function serveManifestAsset(assetPath) {
43
+ return serveStatic({
44
+ path: `./${assetPath}`,
45
+ manifest: staticManifest,
46
+ });
47
+ }
48
+
49
+ async function readSession(c) {
50
+ const secret = c.env.KALP_SECRET_KEY;
51
+ if (!secret) return null;
52
+
53
+ const username = await getSignedCookie(c, secret, SESSION_COOKIE_NAME);
54
+ if (!username || typeof username !== "string") return null;
55
+ return { username };
56
+ }
57
+
58
+ async function requireSession(c, next) {
59
+ const session = await readSession(c);
60
+ if (!session) {
61
+ return c.json({ error: "Unauthorized" }, 401);
62
+ }
63
+ c.set("session", session);
64
+ return next();
65
+ }
2
66
 
3
67
  export class AgentDurableObject extends DurableObject {
4
68
  constructor(ctx, env) {
@@ -74,81 +138,6 @@ export class AgentDurableObject extends DurableObject {
74
138
  },
75
139
  });
76
140
  }
77
-
78
- async webSocketMessage(ws, message) {
79
- try {
80
- const payload = JSON.parse(message);
81
- ws.send(JSON.stringify({ ok: true, payload }));
82
- } catch (err) {
83
- ws.send(
84
- JSON.stringify({
85
- ok: false,
86
- error: err instanceof Error ? err.message : String(err),
87
- }),
88
- );
89
- }
90
- }
91
- }
92
-
93
- const corsHeaders = {
94
- "Access-Control-Allow-Origin": "*",
95
- "Access-Control-Allow-Methods": "GET, POST, PUT, PATCH, DELETE, OPTIONS",
96
- "Access-Control-Allow-Headers": "Content-Type, Authorization",
97
- };
98
-
99
- function withCors(response) {
100
- if (response.status === 101) return response;
101
- const headers = new Headers(response.headers);
102
- for (const [key, value] of Object.entries(corsHeaders)) {
103
- headers.set(key, value);
104
- }
105
- return new Response(response.body, {
106
- status: response.status,
107
- statusText: response.statusText,
108
- headers,
109
- });
110
- }
111
-
112
- async function serveStudio(request, env) {
113
- const url = new URL(request.url);
114
- if (url.pathname === "/studio") {
115
- return Response.redirect(`${url.origin}/studio/`, 308);
116
- }
117
-
118
- const studioAssetUrl = new URL(request.url);
119
- const strippedPath = studioAssetUrl.pathname.replace(/^\/studio/, "") || "/";
120
- studioAssetUrl.pathname = strippedPath === "/" ? "/" : strippedPath;
121
- const studioAssetRequest = new Request(studioAssetUrl.toString(), request);
122
-
123
- const assetResponse = await env.ASSETS.fetch(studioAssetRequest);
124
- if (assetResponse.status !== 404) {
125
- return assetResponse;
126
- }
127
-
128
- const indexRequest = new Request(`${url.origin}/index.html`, request);
129
- return env.ASSETS.fetch(indexRequest);
130
- }
131
-
132
- function isLikelyStaticAsset(pathname) {
133
- if (pathname.startsWith("/assets/")) return true;
134
- if (pathname === "/favicon.ico") return true;
135
- if (pathname === "/robots.txt") return true;
136
- if (pathname === "/manifest.json") return true;
137
- return /\.[a-zA-Z0-9]+$/.test(pathname);
138
- }
139
-
140
- async function handleInternalApi(request) {
141
- const url = new URL(request.url);
142
-
143
- if (url.pathname === "/api/internal/executions") {
144
- return Response.json([]);
145
- }
146
-
147
- if (/^\/api\/internal\/events\/[^/]+$/.test(url.pathname)) {
148
- return Response.json([]);
149
- }
150
-
151
- return Response.json({ error: "Not found" }, { status: 404 });
152
141
  }
153
142
 
154
143
  function getAgentRouting(url) {
@@ -185,38 +174,132 @@ async function forwardToAgentDO(request, env) {
185
174
  redirect: request.redirect,
186
175
  });
187
176
 
188
- try {
189
- return await stub.fetch(proxyRequest);
190
- } catch (err) {
191
- const message = err instanceof Error ? err.message : String(err);
192
- return Response.json({ ok: false, error: message }, { status: 500 });
193
- }
177
+ return stub.fetch(proxyRequest);
194
178
  }
195
179
 
196
- export default {
197
- async fetch(request, env) {
198
- if (request.method === "OPTIONS") {
199
- return new Response(null, { headers: corsHeaders });
200
- }
180
+ const app = new Hono();
201
181
 
202
- const url = new URL(request.url);
182
+ app.use("*", async (c, next) => {
183
+ if (c.req.method === "OPTIONS") {
184
+ return new Response(null, { headers: CORS_HEADERS });
185
+ }
186
+ await next();
187
+ c.res = withCors(c.res);
188
+ });
203
189
 
204
- if (url.pathname.startsWith("/studio")) {
205
- return withCors(await serveStudio(request, env));
206
- }
190
+ app.post("/api/internal/auth", async (c) => {
191
+ const secret = c.env.KALP_SECRET_KEY;
192
+ const password = c.env.KALP_STUDIO_PASSWORD;
193
+ const adminUser = c.env.KALP_STUDIO_ADMIN_USER || "admin";
207
194
 
208
- if (url.pathname.startsWith("/api/internal")) {
209
- return withCors(await handleInternalApi(request));
210
- }
195
+ if (!secret || !password) {
196
+ return c.json({ error: "Studio auth is not configured." }, 500);
197
+ }
211
198
 
212
- if (url.pathname === "/") {
213
- return Response.redirect(`${url.origin}/studio/`, 308);
214
- }
199
+ const body = await c.req
200
+ .json()
201
+ .catch(() => ({ username: undefined, password: undefined }));
202
+ const username = body.username || adminUser;
215
203
 
216
- if (isLikelyStaticAsset(url.pathname)) {
217
- return withCors(await env.ASSETS.fetch(request));
218
- }
204
+ if (username !== adminUser || body.password !== password) {
205
+ return c.json({ error: "Invalid credentials." }, 401);
206
+ }
219
207
 
220
- return withCors(await forwardToAgentDO(request, env));
221
- },
222
- };
208
+ const isSecure = new URL(c.req.url).protocol === "https:";
209
+ await setSignedCookie(c, SESSION_COOKIE_NAME, username, secret, {
210
+ path: "/",
211
+ httpOnly: true,
212
+ sameSite: "Lax",
213
+ secure: isSecure,
214
+ maxAge: SESSION_MAX_AGE_SECONDS,
215
+ });
216
+
217
+ return c.json({ ok: true, user: { username } });
218
+ });
219
+
220
+ app.get("/api/internal/session", async (c) => {
221
+ const session = await readSession(c);
222
+ if (!session) return c.json({ authenticated: false }, 401);
223
+ return c.json({ authenticated: true, user: session });
224
+ });
225
+
226
+ app.post("/api/internal/logout", async (c) => {
227
+ deleteCookie(c, SESSION_COOKIE_NAME, { path: "/" });
228
+ return c.json({ ok: true });
229
+ });
230
+
231
+ app.use("/api/internal/agents*", requireSession);
232
+ app.use("/api/internal/executions*", requireSession);
233
+ app.use("/api/internal/events*", requireSession);
234
+
235
+ app.get("/api/internal/agents", (c) => {
236
+ return c.json({
237
+ generatedAt: agentsSnapshot.generatedAt,
238
+ projectPath: agentsSnapshot.projectPath,
239
+ workerUrl: agentsSnapshot.workerUrl,
240
+ agents: agentsSnapshot.agents,
241
+ });
242
+ });
243
+
244
+ app.get("/api/internal/agents/:agentName", (c) => {
245
+ const agentName = c.req.param("agentName");
246
+ const agent = agentsSnapshot.agents.find((item) => item.name === agentName);
247
+ if (!agent) {
248
+ return c.json({ error: `Agent "${agentName}" not found.` }, 404);
249
+ }
250
+ return c.json(agent);
251
+ });
252
+
253
+ app.get("/api/internal/executions", (c) => {
254
+ return c.json([]);
255
+ });
256
+
257
+ app.get("/api/internal/events/:executionId", (c) => {
258
+ return c.json([]);
259
+ });
260
+
261
+ app.all("/a/:agentName/*", async (c) => {
262
+ return forwardToAgentDO(c.req.raw, c.env);
263
+ });
264
+
265
+ app.all("/a/:agentName", async (c) => {
266
+ return forwardToAgentDO(c.req.raw, c.env);
267
+ });
268
+
269
+ app.get("/studio", (c) => c.redirect("/studio/", 308));
270
+
271
+ app.get("/studio/*", async (c) => {
272
+ const pathname = new URL(c.req.url).pathname;
273
+ const assetPath = resolveStudioAssetPath(pathname);
274
+
275
+ if (hasManifestPath(assetPath)) {
276
+ await serveManifestAsset(assetPath)(c, async () => {});
277
+ return c.res;
278
+ }
279
+
280
+ await serveManifestAsset("index.html")(c, async () => {});
281
+ return c.res;
282
+ });
283
+
284
+ app.get("/", (c) => c.redirect("/studio/", 308));
285
+
286
+ app.notFound(async (c) => {
287
+ if (c.req.path.startsWith("/api/internal")) {
288
+ return c.json({ error: "Not found" }, 404);
289
+ }
290
+
291
+ await serveManifestAsset("index.html")(c, async () => {});
292
+ return c.res;
293
+ });
294
+
295
+ app.onError((error, c) => {
296
+ return c.json(
297
+ {
298
+ ok: false,
299
+ error: error instanceof Error ? error.message : String(error),
300
+ },
301
+ 500,
302
+ );
303
+ });
304
+
305
+ export default app;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kalphq/cli",
3
- "version": "0.0.0-dev-20260510053622",
3
+ "version": "0.0.0-dev-20260510062740",
4
4
  "description": "Zero-config CLI for deploying Kalp agents",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -26,9 +26,9 @@
26
26
  "open": "^11.0.0",
27
27
  "picocolors": "1.1.1",
28
28
  "zod": "3.25.76",
29
- "@kalphq/sdk": "0.0.0-dev-20260510053622",
30
- "@kalphq/project": "0.0.0-dev-20260510053622",
31
- "@kalphq/compiler": "0.0.0-dev-20260510053622"
29
+ "@kalphq/compiler": "0.0.0-dev-20260510062740",
30
+ "@kalphq/project": "0.0.0-dev-20260510062740",
31
+ "@kalphq/sdk": "0.0.0-dev-20260510062740"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@types/json-stable-stringify": "1.2.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/project-state.ts","../src/utils/deploy.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface ProjectState {\n workerUrl: string;\n deployedAt: string;\n accountId: string;\n}\n\nconst KALP_DIR = \".kalp\";\nconst STATE_FILE = \"state.json\";\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 JSON.parse(content) as ProjectState;\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), \"utf-8\");\n}\n","import { readFile } from \"node:fs/promises\";\nimport { execa } from \"execa\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { ensureSecretKey } from \"@/utils/secret\";\nimport { writeProjectState } from \"@/utils/project-state\";\nimport { materializeRuntime } from \"@/utils/runtime\";\n\nfunction findWorkersUrl(output: string): string | null {\n const match = output.match(/https:\\/\\/[^\\s]+\\.workers\\.dev/);\n return match?.[0] ?? null;\n}\n\nasync function resolveWorkerUrl(\n configPath: string,\n deployOutput: string,\n): Promise<string> {\n const fromOutput = findWorkersUrl(deployOutput);\n if (fromOutput) return fromOutput;\n\n const configText = await readFile(configPath, \"utf-8\").catch(\n () => null as string | null,\n );\n const workerName = configText?.match(/\"name\"\\s*:\\s*\"([^\"]+)\"/)?.[1];\n\n if (workerName) {\n return `https://${workerName}.workers.dev`;\n }\n\n throw new Error(\"Could not resolve worker URL from wrangler deploy output.\");\n}\n\nexport async function runInitialDeploy(cwd: string): Promise<{\n workerUrl: string;\n accountId: string;\n}> {\n const auth = await requireAuth();\n await ensureSecretKey(cwd);\n const runtime = await materializeRuntime(cwd);\n\n const deploy = await execa(\n \"npx\",\n [\n \"wrangler\",\n \"deploy\",\n \"--config\",\n runtime.wranglerConfigPath,\n \"--secrets-file\",\n \".env\",\n ],\n {\n cwd,\n },\n );\n\n const deployStdout = [deploy.stdout, deploy.stderr]\n .filter(Boolean)\n .join(\"\\n\");\n\n const workerUrl = await resolveWorkerUrl(\n runtime.wranglerConfigPath,\n deployStdout,\n );\n\n await writeProjectState(cwd, {\n workerUrl,\n deployedAt: new Date().toISOString(),\n accountId: auth.accountId,\n });\n\n return { workerUrl, accountId: auth.accountId };\n}\n"],"mappings":";;;;;;;;;;AAAA,SAAS,OAAO,UAAU,iBAAiB;AAC3C,SAAS,YAAY;AAQrB,IAAM,WAAW;AACjB,IAAM,aAAa;AAEnB,eAAsB,iBAAiB,KAA2C;AAChF,MAAI;AACF,UAAM,YAAY,KAAK,KAAK,UAAU,UAAU;AAChD,UAAM,UAAU,MAAM,SAAS,WAAW,OAAO;AACjD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,kBACpB,KACA,OACe;AACf,QAAM,MAAM,KAAK,KAAK,QAAQ;AAC9B,QAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,QAAM,UAAU,KAAK,KAAK,UAAU,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,OAAO;AAChF;;;AC7BA,SAAS,YAAAA,iBAAgB;AACzB,SAAS,aAAa;AAMtB,SAAS,eAAe,QAA+B;AACrD,QAAM,QAAQ,OAAO,MAAM,gCAAgC;AAC3D,SAAO,QAAQ,CAAC,KAAK;AACvB;AAEA,eAAe,iBACb,YACA,cACiB;AACjB,QAAM,aAAa,eAAe,YAAY;AAC9C,MAAI,WAAY,QAAO;AAEvB,QAAM,aAAa,MAAMC,UAAS,YAAY,OAAO,EAAE;AAAA,IACrD,MAAM;AAAA,EACR;AACA,QAAM,aAAa,YAAY,MAAM,wBAAwB,IAAI,CAAC;AAElE,MAAI,YAAY;AACd,WAAO,WAAW,UAAU;AAAA,EAC9B;AAEA,QAAM,IAAI,MAAM,2DAA2D;AAC7E;AAEA,eAAsB,iBAAiB,KAGpC;AACD,QAAM,OAAO,MAAM,YAAY;AAC/B,QAAM,gBAAgB,GAAG;AACzB,QAAM,UAAU,MAAM,mBAAmB,GAAG;AAE5C,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,OAAO,QAAQ,OAAO,MAAM,EAC/C,OAAO,OAAO,EACd,KAAK,IAAI;AAEZ,QAAM,YAAY,MAAM;AAAA,IACtB,QAAQ;AAAA,IACR;AAAA,EACF;AAEA,QAAM,kBAAkB,KAAK;AAAA,IAC3B;AAAA,IACA,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IACnC,WAAW,KAAK;AAAA,EAClB,CAAC;AAED,SAAO,EAAE,WAAW,WAAW,KAAK,UAAU;AAChD;","names":["readFile","readFile"]}
@@ -1,225 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // src/utils/secret.ts
4
- import { randomBytes } from "crypto";
5
- import { readFile, writeFile } from "fs/promises";
6
- import { join } from "path";
7
- async function ensureSecretKey(cwd) {
8
- const envPath = join(cwd, ".env");
9
- try {
10
- const envContent = await readFile(envPath, "utf-8");
11
- const match = envContent.match(/^KALP_SECRET_KEY=(.+)$/m);
12
- if (match?.[1]) {
13
- return { key: match[1].trim(), isNew: false };
14
- }
15
- } catch {
16
- }
17
- const secretKey = randomBytes(32).toString("hex");
18
- const content = `# Kalp Studio Authentication Secret
19
- KALP_SECRET_KEY=${secretKey}
20
- `;
21
- await writeFile(envPath, content, "utf-8");
22
- return { key: secretKey, isNew: true };
23
- }
24
-
25
- // src/utils/runtime.ts
26
- import { createHash } from "crypto";
27
- import {
28
- access,
29
- cp,
30
- mkdir,
31
- readFile as readFile2,
32
- readdir,
33
- rm,
34
- writeFile as writeFile2
35
- } from "fs/promises";
36
- import { basename, dirname, join as join2, resolve } from "path";
37
- import { fileURLToPath } from "url";
38
- var RUNTIME_ROOT = ".kalp";
39
- var RUNTIME_DIR = "runtime";
40
- var STUDIO_DIR = "studio";
41
- var WRANGLER_CONFIG_FILE = "wrangler.jsonc";
42
- var WORKER_ENTRY_FILE = "worker-entry.js";
43
- var COMPATIBILITY_DATE = "2026-05-10";
44
- function sanitizeSegment(input) {
45
- return input.toLowerCase().replace(/^@/, "").replace(/\//g, "-").replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-+|-+$/g, "");
46
- }
47
- async function resolveProjectSlug(cwd) {
48
- const fallback = sanitizeSegment(basename(cwd)) || "agent";
49
- const packageJsonPath = join2(cwd, "package.json");
50
- try {
51
- const content = await readFile2(packageJsonPath, "utf-8");
52
- const pkg = JSON.parse(content);
53
- const name = typeof pkg.name === "string" ? pkg.name : "";
54
- const sanitized = sanitizeSegment(name);
55
- return sanitized || fallback;
56
- } catch {
57
- return fallback;
58
- }
59
- }
60
- function buildWorkerName(slug, cwd) {
61
- const cwdHash = createHash("sha1").update(cwd).digest("hex").slice(0, 8);
62
- const withPrefix = `kalp-${slug}-${cwdHash}`;
63
- const maxLen = 63;
64
- if (withPrefix.length <= maxLen) {
65
- return withPrefix;
66
- }
67
- const clipped = withPrefix.slice(0, maxLen).replace(/-+$/g, "");
68
- return clipped || `kalp-${cwdHash}`;
69
- }
70
- function createRuntimeConfig(workerName) {
71
- return {
72
- $schema: "node_modules/wrangler/config-schema.json",
73
- name: workerName,
74
- main: `./${WORKER_ENTRY_FILE}`,
75
- compatibility_date: COMPATIBILITY_DATE,
76
- compatibility_flags: ["nodejs_compat"],
77
- migrations: [
78
- {
79
- tag: "v1",
80
- new_sqlite_classes: ["AgentDurableObject"]
81
- }
82
- ],
83
- durable_objects: {
84
- bindings: [
85
- {
86
- name: "KALP_RUNTIME_CLOUDFLARE",
87
- class_name: "AgentDurableObject"
88
- }
89
- ]
90
- },
91
- kv_namespaces: [
92
- {
93
- binding: "KALP_MANIFESTS"
94
- }
95
- ],
96
- assets: {
97
- directory: `./${STUDIO_DIR}`,
98
- binding: "ASSETS",
99
- run_worker_first: true
100
- },
101
- observability: { enabled: true },
102
- upload_source_maps: true,
103
- secrets: {
104
- required: ["KALP_SECRET_KEY"]
105
- }
106
- };
107
- }
108
- function runtimeTemplateCandidates() {
109
- const here = dirname(fileURLToPath(import.meta.url));
110
- const distTemplateRoot = resolve(here, "runtime-template");
111
- const packageRootTemplate = resolve(here, "..", "runtime-template");
112
- const sourceTemplateRoot = resolve(here, "..", "..", "runtime-template");
113
- const monorepoStudioDist = resolve(
114
- here,
115
- "..",
116
- "..",
117
- "..",
118
- "..",
119
- "apps",
120
- "studio",
121
- "dist",
122
- "client"
123
- );
124
- return [
125
- {
126
- studioTemplateDir: join2(distTemplateRoot, STUDIO_DIR),
127
- workerEntryPath: join2(distTemplateRoot, WORKER_ENTRY_FILE)
128
- },
129
- {
130
- studioTemplateDir: join2(packageRootTemplate, STUDIO_DIR),
131
- workerEntryPath: join2(packageRootTemplate, WORKER_ENTRY_FILE)
132
- },
133
- {
134
- studioTemplateDir: join2(sourceTemplateRoot, STUDIO_DIR),
135
- workerEntryPath: join2(sourceTemplateRoot, WORKER_ENTRY_FILE)
136
- },
137
- {
138
- studioTemplateDir: monorepoStudioDist,
139
- workerEntryPath: join2(sourceTemplateRoot, WORKER_ENTRY_FILE)
140
- }
141
- ];
142
- }
143
- async function resolveRuntimeTemplate() {
144
- for (const candidate of runtimeTemplateCandidates()) {
145
- try {
146
- await access(candidate.studioTemplateDir);
147
- await access(candidate.workerEntryPath);
148
- return candidate;
149
- } catch {
150
- }
151
- }
152
- throw new Error(
153
- "Kalp runtime template not found in CLI package. Reinstall @kalphq/cli."
154
- );
155
- }
156
- function createStudioShell(entryScript, cssFiles) {
157
- const cssLinks = cssFiles.map((file) => ` <link rel="stylesheet" href="/studio/assets/${file}" />`).join("\n");
158
- return `<!doctype html>
159
- <html lang="en">
160
- <head>
161
- <meta charset="UTF-8" />
162
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
163
- <title>Kalp Studio</title>
164
- ${cssLinks}
165
- </head>
166
- <body>
167
- <div id="root"></div>
168
- <script type="module" src="/studio/assets/${entryScript}"></script>
169
- </body>
170
- </html>
171
- `;
172
- }
173
- async function ensureStudioIndex(studioDir) {
174
- const indexPath = join2(studioDir, "index.html");
175
- try {
176
- await access(indexPath);
177
- return;
178
- } catch {
179
- }
180
- const assetsDir = join2(studioDir, "assets");
181
- const assetFiles = await readdir(assetsDir);
182
- const entryScript = assetFiles.find((file) => /^index-.*\.js$/i.test(file)) ?? assetFiles.find((file) => file.endsWith(".js"));
183
- if (!entryScript) {
184
- throw new Error(
185
- "Studio runtime template is missing an entry JS bundle in studio/assets."
186
- );
187
- }
188
- const cssFiles = assetFiles.filter((file) => file.endsWith(".css")).sort();
189
- const html = createStudioShell(entryScript, cssFiles);
190
- await writeFile2(indexPath, html, "utf-8");
191
- }
192
- async function materializeRuntime(cwd) {
193
- const runtimeDir = join2(cwd, RUNTIME_ROOT, RUNTIME_DIR);
194
- const studioDir = join2(runtimeDir, STUDIO_DIR);
195
- const workerEntrypointPath = join2(runtimeDir, WORKER_ENTRY_FILE);
196
- const wranglerConfigPath = join2(runtimeDir, WRANGLER_CONFIG_FILE);
197
- const template = await resolveRuntimeTemplate();
198
- await rm(runtimeDir, { recursive: true, force: true });
199
- await mkdir(runtimeDir, { recursive: true });
200
- await cp(template.studioTemplateDir, studioDir, { recursive: true });
201
- await cp(template.workerEntryPath, workerEntrypointPath);
202
- await ensureStudioIndex(studioDir);
203
- const projectSlug = await resolveProjectSlug(cwd);
204
- const workerName = buildWorkerName(projectSlug, cwd);
205
- const wranglerConfig = createRuntimeConfig(workerName);
206
- await writeFile2(
207
- wranglerConfigPath,
208
- `${JSON.stringify(wranglerConfig, null, 2)}
209
- `,
210
- "utf-8"
211
- );
212
- return {
213
- runtimeDir,
214
- studioDir,
215
- workerEntrypointPath,
216
- wranglerConfigPath,
217
- workerName
218
- };
219
- }
220
-
221
- export {
222
- ensureSecretKey,
223
- materializeRuntime
224
- };
225
- //# sourceMappingURL=chunk-TUF2J67G.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/secret.ts","../src/utils/runtime.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport async function ensureSecretKey(\n cwd: string,\n): Promise<{ key: string; isNew: boolean }> {\n const envPath = join(cwd, \".env\");\n\n try {\n const envContent = await readFile(envPath, \"utf-8\");\n const match = envContent.match(/^KALP_SECRET_KEY=(.+)$/m);\n if (match?.[1]) {\n return { key: match[1].trim(), isNew: false };\n }\n } catch {\n // continue\n }\n\n const secretKey = randomBytes(32).toString(\"hex\");\n const content = `# Kalp Studio Authentication Secret\nKALP_SECRET_KEY=${secretKey}\n`;\n await writeFile(envPath, content, \"utf-8\");\n return { key: secretKey, isNew: true };\n}\n\nexport async function readSecretKey(cwd: string): Promise<string | null> {\n try {\n const envPath = join(cwd, \".env\");\n const envContent = await readFile(envPath, \"utf-8\");\n const match = envContent.match(/^KALP_SECRET_KEY=(.+)$/m);\n return match?.[1]?.trim() ?? null;\n } catch {\n return null;\n }\n}\n","import { createHash } from \"node:crypto\";\nimport {\n access,\n cp,\n mkdir,\n readFile,\n readdir,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\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 WranglerConfig {\n $schema: string;\n name: string;\n main: string;\n compatibility_date: string;\n compatibility_flags: string[];\n migrations: Array<{ tag: string; new_sqlite_classes: string[] }>;\n durable_objects: {\n bindings: Array<{ name: string; class_name: string }>;\n };\n kv_namespaces: Array<{ binding: string }>;\n assets: {\n directory: string;\n binding: string;\n run_worker_first: boolean;\n };\n observability: { enabled: boolean };\n upload_source_maps: boolean;\n secrets: { required: string[] };\n}\n\ninterface RuntimeTemplatePaths {\n studioTemplateDir: string;\n workerEntryPath: string;\n}\n\nfunction sanitizeSegment(input: string): string {\n return input\n .toLowerCase()\n .replace(/^@/, \"\")\n .replace(/\\//g, \"-\")\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nasync function resolveProjectSlug(cwd: string): Promise<string> {\n const fallback = sanitizeSegment(basename(cwd)) || \"agent\";\n const packageJsonPath = join(cwd, \"package.json\");\n\n try {\n const content = await readFile(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content) as { name?: string };\n const name = typeof pkg.name === \"string\" ? pkg.name : \"\";\n const sanitized = sanitizeSegment(name);\n return sanitized || fallback;\n } catch {\n return fallback;\n }\n}\n\nfunction buildWorkerName(slug: string, cwd: string): string {\n const cwdHash = createHash(\"sha1\").update(cwd).digest(\"hex\").slice(0, 8);\n const withPrefix = `kalp-${slug}-${cwdHash}`;\n const maxLen = 63;\n if (withPrefix.length <= maxLen) {\n return withPrefix;\n }\n\n const clipped = withPrefix.slice(0, maxLen).replace(/-+$/g, \"\");\n return clipped || `kalp-${cwdHash}`;\n}\n\nfunction createRuntimeConfig(workerName: string): WranglerConfig {\n return {\n $schema: \"node_modules/wrangler/config-schema.json\",\n name: workerName,\n main: `./${WORKER_ENTRY_FILE}`,\n compatibility_date: COMPATIBILITY_DATE,\n compatibility_flags: [\"nodejs_compat\"],\n migrations: [\n {\n tag: \"v1\",\n new_sqlite_classes: [\"AgentDurableObject\"],\n },\n ],\n durable_objects: {\n bindings: [\n {\n name: \"KALP_RUNTIME_CLOUDFLARE\",\n class_name: \"AgentDurableObject\",\n },\n ],\n },\n kv_namespaces: [\n {\n binding: \"KALP_MANIFESTS\",\n },\n ],\n assets: {\n directory: `./${STUDIO_DIR}`,\n binding: \"ASSETS\",\n run_worker_first: true,\n },\n observability: { enabled: true },\n upload_source_maps: true,\n secrets: {\n required: [\"KALP_SECRET_KEY\"],\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 materializeRuntime(cwd: string): Promise<RuntimePaths> {\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\n const projectSlug = await resolveProjectSlug(cwd);\n const workerName = buildWorkerName(projectSlug, cwd);\n const wranglerConfig = createRuntimeConfig(workerName);\n await writeFile(\n wranglerConfigPath,\n `${JSON.stringify(wranglerConfig, null, 2)}\\n`,\n \"utf-8\",\n );\n\n return {\n runtimeDir,\n studioDir,\n workerEntrypointPath,\n wranglerConfigPath,\n workerName,\n };\n}\n"],"mappings":";;;AAAA,SAAS,mBAAmB;AAC5B,SAAS,UAAU,iBAAiB;AACpC,SAAS,YAAY;AAErB,eAAsB,gBACpB,KAC0C;AAC1C,QAAM,UAAU,KAAK,KAAK,MAAM;AAEhC,MAAI;AACF,UAAM,aAAa,MAAM,SAAS,SAAS,OAAO;AAClD,UAAM,QAAQ,WAAW,MAAM,yBAAyB;AACxD,QAAI,QAAQ,CAAC,GAAG;AACd,aAAO,EAAE,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,OAAO,MAAM;AAAA,IAC9C;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,QAAM,YAAY,YAAY,EAAE,EAAE,SAAS,KAAK;AAChD,QAAM,UAAU;AAAA,kBACA,SAAS;AAAA;AAEzB,QAAM,UAAU,SAAS,SAAS,OAAO;AACzC,SAAO,EAAE,KAAK,WAAW,OAAO,KAAK;AACvC;;;ACzBA,SAAS,kBAAkB;AAC3B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAAC;AAAA,OACK;AACP,SAAS,UAAU,SAAS,QAAAC,OAAM,eAAe;AACjD,SAAS,qBAAqB;AAE9B,IAAM,eAAe;AACrB,IAAM,cAAc;AACpB,IAAM,aAAa;AACnB,IAAM,uBAAuB;AAC7B,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB;AAoC3B,SAAS,gBAAgB,OAAuB;AAC9C,SAAO,MACJ,YAAY,EACZ,QAAQ,MAAM,EAAE,EAChB,QAAQ,OAAO,GAAG,EAClB,QAAQ,eAAe,GAAG,EAC1B,QAAQ,OAAO,GAAG,EAClB,QAAQ,YAAY,EAAE;AAC3B;AAEA,eAAe,mBAAmB,KAA8B;AAC9D,QAAM,WAAW,gBAAgB,SAAS,GAAG,CAAC,KAAK;AACnD,QAAM,kBAAkBA,MAAK,KAAK,cAAc;AAEhD,MAAI;AACF,UAAM,UAAU,MAAMF,UAAS,iBAAiB,OAAO;AACvD,UAAM,MAAM,KAAK,MAAM,OAAO;AAC9B,UAAM,OAAO,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AACvD,UAAM,YAAY,gBAAgB,IAAI;AACtC,WAAO,aAAa;AAAA,EACtB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,MAAc,KAAqB;AAC1D,QAAM,UAAU,WAAW,MAAM,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,CAAC;AACvE,QAAM,aAAa,QAAQ,IAAI,IAAI,OAAO;AAC1C,QAAM,SAAS;AACf,MAAI,WAAW,UAAU,QAAQ;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,WAAW,MAAM,GAAG,MAAM,EAAE,QAAQ,QAAQ,EAAE;AAC9D,SAAO,WAAW,QAAQ,OAAO;AACnC;AAEA,SAAS,oBAAoB,YAAoC;AAC/D,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM,KAAK,iBAAiB;AAAA,IAC5B,oBAAoB;AAAA,IACpB,qBAAqB,CAAC,eAAe;AAAA,IACrC,YAAY;AAAA,MACV;AAAA,QACE,KAAK;AAAA,QACL,oBAAoB,CAAC,oBAAoB;AAAA,MAC3C;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,YAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,QACE,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,WAAW,KAAK,UAAU;AAAA,MAC1B,SAAS;AAAA,MACT,kBAAkB;AAAA,IACpB;AAAA,IACA,eAAe,EAAE,SAAS,KAAK;AAAA,IAC/B,oBAAoB;AAAA,IACpB,SAAS;AAAA,MACP,UAAU,CAAC,iBAAiB;AAAA,IAC9B;AAAA,EACF;AACF;AAEA,SAAS,4BAGN;AACD,QAAM,OAAO,QAAQ,cAAc,YAAY,GAAG,CAAC;AACnD,QAAM,mBAAmB,QAAQ,MAAM,kBAAkB;AACzD,QAAM,sBAAsB,QAAQ,MAAM,MAAM,kBAAkB;AAClE,QAAM,qBAAqB,QAAQ,MAAM,MAAM,MAAM,kBAAkB;AACvE,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,MACE,mBAAmBE,MAAK,kBAAkB,UAAU;AAAA,MACpD,iBAAiBA,MAAK,kBAAkB,iBAAiB;AAAA,IAC3D;AAAA,IACA;AAAA,MACE,mBAAmBA,MAAK,qBAAqB,UAAU;AAAA,MACvD,iBAAiBA,MAAK,qBAAqB,iBAAiB;AAAA,IAC9D;AAAA,IACA;AAAA,MACE,mBAAmBA,MAAK,oBAAoB,UAAU;AAAA,MACtD,iBAAiBA,MAAK,oBAAoB,iBAAiB;AAAA,IAC7D;AAAA,IACA;AAAA,MACE,mBAAmB;AAAA,MACnB,iBAAiBA,MAAK,oBAAoB,iBAAiB;AAAA,IAC7D;AAAA,EACF;AACF;AAEA,eAAe,yBAAwD;AACrE,aAAW,aAAa,0BAA0B,GAAG;AACnD,QAAI;AACF,YAAM,OAAO,UAAU,iBAAiB;AACxC,YAAM,OAAO,UAAU,eAAe;AACtC,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,aAAqB,UAA4B;AAC1E,QAAM,WAAW,SACd,IAAI,CAAC,SAAS,mDAAmD,IAAI,MAAM,EAC3E,KAAK,IAAI;AAEZ,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMP,QAAQ;AAAA;AAAA;AAAA;AAAA,gDAIsC,WAAW;AAAA;AAAA;AAAA;AAI3D;AAEA,eAAe,kBAAkB,WAAkC;AACjE,QAAM,YAAYA,MAAK,WAAW,YAAY;AAC9C,MAAI;AACF,UAAM,OAAO,SAAS;AACtB;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,QAAM,YAAYA,MAAK,WAAW,QAAQ;AAC1C,QAAM,aAAa,MAAM,QAAQ,SAAS;AAC1C,QAAM,cACJ,WAAW,KAAK,CAAC,SAAS,kBAAkB,KAAK,IAAI,CAAC,KACtD,WAAW,KAAK,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC;AAEhD,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,WAAW,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,CAAC,EAAE,KAAK;AACzE,QAAM,OAAO,kBAAkB,aAAa,QAAQ;AACpD,QAAMD,WAAU,WAAW,MAAM,OAAO;AAC1C;AAEA,eAAsB,mBAAmB,KAAoC;AAC3E,QAAM,aAAaC,MAAK,KAAK,cAAc,WAAW;AACtD,QAAM,YAAYA,MAAK,YAAY,UAAU;AAC7C,QAAM,uBAAuBA,MAAK,YAAY,iBAAiB;AAC/D,QAAM,qBAAqBA,MAAK,YAAY,oBAAoB;AAEhE,QAAM,WAAW,MAAM,uBAAuB;AAC9C,QAAM,GAAG,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACrD,QAAM,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAE3C,QAAM,GAAG,SAAS,mBAAmB,WAAW,EAAE,WAAW,KAAK,CAAC;AACnE,QAAM,GAAG,SAAS,iBAAiB,oBAAoB;AACvD,QAAM,kBAAkB,SAAS;AAEjC,QAAM,cAAc,MAAM,mBAAmB,GAAG;AAChD,QAAM,aAAa,gBAAgB,aAAa,GAAG;AACnD,QAAM,iBAAiB,oBAAoB,UAAU;AACrD,QAAMD;AAAA,IACJ;AAAA,IACA,GAAG,KAAK,UAAU,gBAAgB,MAAM,CAAC,CAAC;AAAA;AAAA,IAC1C;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":["readFile","writeFile","join"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/dev.ts","../src/utils/studio-token.ts"],"sourcesContent":["import { copyFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { execa } from \"execa\";\nimport open from \"open\";\nimport { ensureSecretKey } from \"@/utils/secret\";\nimport { createStudioToken } from \"@/utils/studio-token\";\nimport { materializeRuntime } from \"@/utils/runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"dev\", description: \"Run Worker + Studio local environment\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp dev\")}`);\n\n const { key } = await ensureSecretKey(cwd);\n await copyFile(join(cwd, \".env\"), join(cwd, \".dev.vars\"));\n const token = await createStudioToken(key);\n const runtime = await materializeRuntime(cwd);\n\n p.note(\"Starting local runtime (wrangler dev :8787)\");\n\n const backend = execa(\n \"npx\",\n [\n \"wrangler\",\n \"dev\",\n \"--port\",\n \"8787\",\n \"--config\",\n runtime.wranglerConfigPath,\n ],\n { cwd, stdio: \"inherit\" },\n );\n\n const shutdown = () => {\n backend.kill(\"SIGINT\");\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n await delay(2500);\n const studioUrl = `http://localhost:8787/studio/?token=${token}`;\n await open(studioUrl);\n p.log.success(`Studio opened at ${pc.cyan(studioUrl)}`);\n\n try {\n await backend;\n } finally {\n shutdown();\n process.off(\"SIGINT\", shutdown);\n process.off(\"SIGTERM\", shutdown);\n }\n },\n});\n","import { SignJWT } from \"jose\";\n\nexport async function createStudioToken(secretKey: string): Promise<string> {\n const secret = new TextEncoder().encode(secretKey);\n\n return new SignJWT({\n sub: \"cli-user\",\n aud: \"kalp-studio\",\n iat: Math.floor(Date.now() / 1000),\n exp: Math.floor(Date.now() / 1000) + 3600,\n })\n .setProtectedHeader({ alg: \"HS256\" })\n .sign(secret);\n}\n"],"mappings":";;;;;;;AAAA,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,cAAc,aAAa;AACpC,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,aAAa;AACtB,OAAO,UAAU;;;ACPjB,SAAS,eAAe;AAExB,eAAsB,kBAAkB,WAAoC;AAC1E,QAAM,SAAS,IAAI,YAAY,EAAE,OAAO,SAAS;AAEjD,SAAO,IAAI,QAAQ;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,IACjC,KAAK,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,IAAI;AAAA,EACvC,CAAC,EACE,mBAAmB,EAAE,KAAK,QAAQ,CAAC,EACnC,KAAK,MAAM;AAChB;;;ADDA,IAAM,OAAO;AAEb,IAAO,cAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,OAAO,aAAa,wCAAwC;AAAA,EAC1E,MAAM,MAAM;AACV,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,UAAU,CAAC,EAAE;AAExC,UAAM,EAAE,IAAI,IAAI,MAAM,gBAAgB,GAAG;AACzC,UAAM,SAAS,KAAK,KAAK,MAAM,GAAG,KAAK,KAAK,WAAW,CAAC;AACxD,UAAM,QAAQ,MAAM,kBAAkB,GAAG;AACzC,UAAM,UAAU,MAAM,mBAAmB,GAAG;AAE5C,IAAE,OAAK,6CAA6C;AAEpD,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,MACA,EAAE,KAAK,OAAO,UAAU;AAAA,IAC1B;AAEA,UAAM,WAAW,MAAM;AACrB,cAAQ,KAAK,QAAQ;AAAA,IACvB;AAEA,YAAQ,GAAG,UAAU,QAAQ;AAC7B,YAAQ,GAAG,WAAW,QAAQ;AAE9B,UAAM,MAAM,IAAI;AAChB,UAAM,YAAY,uCAAuC,KAAK;AAC9D,UAAM,KAAK,SAAS;AACpB,IAAE,MAAI,QAAQ,oBAAoB,GAAG,KAAK,SAAS,CAAC,EAAE;AAEtD,QAAI;AACF,YAAM;AAAA,IACR,UAAE;AACA,eAAS;AACT,cAAQ,IAAI,UAAU,QAAQ;AAC9B,cAAQ,IAAI,WAAW,QAAQ;AAAA,IACjC;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/push.ts","../src/utils/manifest/index.ts","../src/utils/ir/hashIR.ts","../src/utils/validate.ts","../src/utils/agent-store.ts"],"sourcesContent":["import { access, mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { execa } from \"execa\";\nimport { ensureConfig } from \"@/utils/fs\";\nimport { readAgentManifest, computePushHash } from \"@/utils/manifest\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { runInitialDeploy } from \"@/utils/deploy\";\nimport { readProjectState } from \"@/utils/project-state\";\nimport { validateCompiledIR } from \"@/utils/validate\";\nimport { getAgentStoreEntry, writeAgentStoreEntry } from \"@/utils/agent-store\";\nimport { materializeRuntime } from \"@/utils/runtime\";\n\nconst LOGO = \"🦋\";\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n return `${(bytes / 1024).toFixed(1)} KB`;\n}\n\nexport default defineCommand({\n meta: { name: \"push\", description: \"Push agent manifest to Cloudflare KV\" },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name to push\",\n required: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n const agentName = args.agent;\n\n p.intro(`${LOGO} ${pc.bold(\"kalp push\")}`);\n\n if (!agentName) {\n p.log.error(`Missing required flag ${pc.cyan(\"-a <agent-name>\")}`);\n process.exit(1);\n }\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n await ensureConfig(cwd).catch(() => {\n p.log.error(`${pc.cyan(\"kalp.config.ts\")} not found`);\n process.exit(1);\n });\n\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n await access(agentPath).catch(() => {\n p.log.error(`Agent ${pc.cyan(agentName)} not found`);\n process.exit(1);\n });\n\n let state = await readProjectState(cwd);\n if (!state) {\n p.log.warn(\"No .kalp/state.json found. Running initial deploy first...\");\n const deploy = await runInitialDeploy(cwd);\n state = {\n workerUrl: deploy.workerUrl,\n deployedAt: new Date().toISOString(),\n accountId: deploy.accountId,\n };\n }\n const runtime = await materializeRuntime(cwd);\n\n const s = p.spinner();\n s.start(`Compiling ${pc.cyan(agentName)}`);\n const manifest = await readAgentManifest({ cwd, agentName });\n const hash = computePushHash(manifest.ir);\n s.stop(`Compiled ${pc.cyan(agentName)} (${hash.slice(0, 8)})`);\n\n const validation = validateCompiledIR({ agentName, ir: manifest.ir, hash });\n if (!validation.ok) {\n p.log.error(`Validation failed at phase: ${validation.phase}`);\n for (const err of validation.errors ?? []) {\n p.log.error(err);\n }\n process.exit(1);\n }\n\n const previous = await getAgentStoreEntry(agentName);\n const agentWorkerUrl = `${state.workerUrl.replace(/\\/$/, \"\")}/a/${agentName}`;\n if (previous?.hash === hash && previous.workerUrl === agentWorkerUrl) {\n p.note(\n `No changes detected for ${pc.cyan(agentName)} (${hash.slice(0, 8)}).`,\n \"Skipped\",\n );\n p.outro(`${LOGO} ${pc.green(\"Nothing to push\")}`);\n return;\n }\n\n const manifestKey = `${agentName}:${hash}`;\n const latestKey = `${agentName}:latest`;\n const manifestPath = join(cwd, \".kalp\", `${agentName}-${hash}.json`);\n\n await mkdir(join(cwd, \".kalp\"), { recursive: true });\n await writeFile(manifestPath, JSON.stringify(manifest.ir), \"utf-8\");\n\n try {\n s.start(\"Uploading manifest to Cloudflare KV\");\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n \"--binding\",\n \"KALP_MANIFESTS\",\n manifestKey,\n \"--path\",\n manifestPath,\n \"--remote\",\n \"--config\",\n runtime.wranglerConfigPath,\n ],\n { cwd },\n );\n\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n \"--binding\",\n \"KALP_MANIFESTS\",\n latestKey,\n hash,\n \"--remote\",\n \"--config\",\n runtime.wranglerConfigPath,\n ],\n { cwd },\n );\n s.stop(\"Manifest uploaded\");\n } finally {\n await rm(manifestPath, { force: true });\n }\n\n const bundles = manifest.ir.bundles || {};\n const totalSize = Object.values(bundles).reduce(\n (sum, bundle) => sum + Buffer.byteLength(bundle.code),\n 0,\n );\n const handlerCount = Object.keys(bundles).length;\n\n await writeAgentStoreEntry(agentName, {\n hash,\n timestamp: new Date().toISOString(),\n workerUrl: agentWorkerUrl,\n localPath: agentPath,\n });\n\n p.log.success(\n `${pc.bold(agentName)} pushed · ${handlerCount} handlers · ${formatBytes(totalSize)}`,\n );\n p.note(`KV keys updated: ${manifestKey}, ${latestKey}`, \"Cloudflare KV\");\n p.outro(`${LOGO} ${pc.green(\"Live at\")} ${pc.cyan(agentWorkerUrl)}`);\n },\n});\n","import { access, readFile, rm, mkdtemp } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport { buildAgent } from \"@kalphq/compiler\";\n\nimport type { AgentManifestV3 } from \"@/utils/manifest/types\";\nexport type { AgentManifestV3 } from \"@/utils/manifest/types\";\nexport { computePushHash } from \"@/utils/ir/hashIR\";\n\n/**\n * Reads and compiles an agent into a pushable manifest.\n */\nexport async function readAgentManifest(params: {\n cwd: string;\n agentName: string;\n}): Promise<AgentManifestV3> {\n const { cwd, agentName } = params;\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n await access(agentPath);\n\n // Use a temporary directory for the compiler output\n const tempOutDir = await mkdtemp(join(tmpdir(), \"kalp-build-\"));\n\n try {\n // Build the agent - compiler produces ir.bundles with all handler code\n await buildAgent(agentPath, tempOutDir, cwd);\n\n // Load the IR generated by the compiler (includes bundles with code)\n const irContent = await readFile(join(tempOutDir, \"ir.json\"), \"utf-8\");\n const ir = JSON.parse(irContent);\n\n return {\n format: \"kalp-agent-manifest\",\n schemaVersion: 3,\n ir,\n metadata: {\n generatedAt: new Date().toISOString(),\n },\n };\n } finally {\n // Cleanup temp build directory\n await rm(tempOutDir, { recursive: true, force: true });\n }\n}\n","import type { IRGraph } from \"@kalphq/sdk\";\nimport { calculateAgentHash } from \"@kalphq/compiler\";\n\nexport function getIRHash(ir: IRGraph): string {\n const { calculateIRHash } = require(\"@kalphq/compiler\");\n return calculateIRHash(ir);\n}\n\nexport function computePushHash(\n ir: IRGraph & { bundles?: Record<string, { code: string }> },\n): string {\n const bundles = ir.bundles || {};\n const handlers = Object.keys(bundles).reduce(\n (acc, hash) => ({\n ...acc,\n [hash]: { hash },\n }),\n {} as Record<string, { hash: string }>,\n );\n\n return calculateAgentHash(ir, handlers);\n}\n","import {\n analyzeHandler,\n calculateAgentHash,\n validateIR,\n validateIRBindings,\n} from \"@kalphq/compiler\";\nimport type { IRGraph } from \"@kalphq/sdk\";\n\nexport interface NamedAnalysis {\n name: string;\n capabilities: string[];\n imports: { external: string[]; internal: string[] };\n blockers: string[];\n warnings: string[];\n}\n\ntype IRWithBundles = IRGraph & {\n bundles?: Record<string, { code: string }>;\n};\n\nexport function validateCompiledIR(input: {\n agentName: string;\n ir: IRWithBundles;\n hash: string;\n}): {\n ok: boolean;\n phase?: \"ir\" | \"bindings\" | \"hash\" | \"analysis\";\n errors?: string[];\n blockers?: string[];\n analysis?: NamedAnalysis[];\n} {\n const { ir, hash } = input;\n const bundles = ir.bundles || {};\n const bundleHashes = Object.keys(bundles);\n\n const irValidation = validateIR(ir);\n if (!irValidation.valid) {\n return { ok: false, phase: \"ir\", errors: irValidation.errors };\n }\n\n const bindingsValidation = validateIRBindings(ir, bundleHashes);\n if (!bindingsValidation.valid) {\n return { ok: false, phase: \"bindings\", errors: bindingsValidation.errors };\n }\n\n const handlers = bundleHashes.reduce(\n (acc, key) => ({ ...acc, [key]: { hash: key } }),\n {} as Record<string, { hash: string }>,\n );\n const expectedHash = calculateAgentHash(ir, handlers);\n\n if (expectedHash !== hash) {\n return {\n ok: false,\n phase: \"hash\",\n errors: [\n `Hash mismatch: client provided ${hash}, calculated ${expectedHash}`,\n ],\n };\n }\n\n const analysis: NamedAnalysis[] = Object.entries(bundles).map(\n ([name, bundle]) => ({\n name,\n ...analyzeHandler(bundle.code),\n }),\n );\n\n const blockers = analysis.flatMap((entry) =>\n entry.blockers.map((blocker) => `${blocker} in ${entry.name}`),\n );\n\n if (blockers.length > 0) {\n return {\n ok: false,\n phase: \"analysis\",\n blockers,\n errors: blockers.map((b) => `[Analysis Blocker] ${b}`),\n analysis,\n };\n }\n\n return { ok: true, analysis };\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { ensureGlobalConfigDir } from \"@/utils/config\";\n\nexport interface AgentStoreEntry {\n hash: string;\n timestamp: string;\n workerUrl: string;\n localPath: string;\n}\n\nexport type AgentStore = Record<string, AgentStoreEntry>;\n\nasync function getStorePath(): Promise<string> {\n return join(await ensureGlobalConfigDir(), \"agents.json\");\n}\n\nexport async function readAgentStore(): Promise<AgentStore> {\n try {\n const storePath = await getStorePath();\n const content = await readFile(storePath, \"utf-8\");\n return JSON.parse(content) as AgentStore;\n } catch {\n return {};\n }\n}\n\nexport async function getAgentStoreEntry(\n agentName: string,\n): Promise<AgentStoreEntry | null> {\n const store = await readAgentStore();\n return store[agentName] ?? null;\n}\n\nexport async function writeAgentStoreEntry(\n agentName: string,\n entry: AgentStoreEntry,\n): Promise<void> {\n const storePath = await getStorePath();\n const store = await readAgentStore();\n store[agentName] = entry;\n await writeFile(storePath, JSON.stringify(store, null, 2), \"utf-8\");\n}\n"],"mappings":"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","names":["access","rm","writeFile","join","calculateAgentHash","readFile","join","join","readFile","join","access","writeFile","rm"]}