@kalphq/cli 0.0.0-dev-20260510030416 → 0.0.0-dev-20260510045606

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 (38) hide show
  1. package/dist/{chunk-NJ3OTDOX.js → chunk-MM6CND3O.js} +22 -31
  2. package/dist/chunk-MM6CND3O.js.map +1 -0
  3. package/dist/chunk-TTKFK7NJ.js +232 -0
  4. package/dist/chunk-TTKFK7NJ.js.map +1 -0
  5. package/dist/{deploy-HRUJDN2F.js → deploy-PKK545YR.js} +3 -3
  6. package/dist/{dev-ZKXOQ2GQ.js → dev-LE5FR6BF.js} +16 -13
  7. package/dist/dev-LE5FR6BF.js.map +1 -0
  8. package/dist/index.js +7 -5
  9. package/dist/index.js.map +1 -1
  10. package/dist/{push-P2NWWXGL.js → push-EI646ZVZ.js} +8 -6
  11. package/dist/push-EI646ZVZ.js.map +1 -0
  12. package/dist/runtime-template/studio/assets/QueryClientProvider-D-LxTiBd.js +1 -0
  13. package/dist/runtime-template/studio/assets/index-DpfZiZAs.js +75 -0
  14. package/dist/runtime-template/studio/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  15. package/dist/runtime-template/studio/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  16. package/dist/runtime-template/studio/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  17. package/dist/runtime-template/studio/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  18. package/dist/runtime-template/studio/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  19. package/dist/runtime-template/studio/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  20. package/dist/runtime-template/studio/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  21. package/dist/runtime-template/studio/assets/replay._executionId-Cs7M_t4A.js +41 -0
  22. package/dist/runtime-template/studio/assets/routes-DM2dr3uc.js +1 -0
  23. package/dist/runtime-template/studio/assets/styles-DnCmVxlg.css +2 -0
  24. package/dist/runtime-template/studio/assets/useAuth-CNMCKtPc.js +1 -0
  25. package/dist/runtime-template/studio/favicon.ico +0 -0
  26. package/dist/runtime-template/studio/index.html +13 -0
  27. package/dist/runtime-template/studio/logo192.png +0 -0
  28. package/dist/runtime-template/studio/logo512.png +0 -0
  29. package/dist/runtime-template/studio/manifest.json +25 -0
  30. package/dist/runtime-template/studio/robots.txt +3 -0
  31. package/dist/runtime-template/worker-entry.js +2 -0
  32. package/package.json +7 -5
  33. package/dist/chunk-E7V5UMX7.js +0 -28
  34. package/dist/chunk-E7V5UMX7.js.map +0 -1
  35. package/dist/chunk-NJ3OTDOX.js.map +0 -1
  36. package/dist/dev-ZKXOQ2GQ.js.map +0 -1
  37. package/dist/push-P2NWWXGL.js.map +0 -1
  38. /package/dist/{deploy-HRUJDN2F.js.map → deploy-PKK545YR.js.map} +0 -0
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- ensureSecretKey
4
- } from "./chunk-E7V5UMX7.js";
3
+ ensureSecretKey,
4
+ materializeRuntime
5
+ } from "./chunk-TTKFK7NJ.js";
5
6
  import {
6
7
  requireAuth
7
8
  } from "./chunk-5RODADXW.js";
@@ -27,18 +28,16 @@ async function writeProjectState(cwd, state) {
27
28
  }
28
29
 
29
30
  // src/utils/deploy.ts
30
- import { cp, mkdir as mkdir2, readFile as readFile2, rm } from "fs/promises";
31
- import { join as join2 } from "path";
31
+ import { readFile as readFile2 } from "fs/promises";
32
32
  import { execa } from "execa";
33
- var WRANGLER_CONFIG = "packages/cloudflare/wrangler.jsonc";
34
33
  function findWorkersUrl(output) {
35
34
  const match = output.match(/https:\/\/[^\s]+\.workers\.dev/);
36
35
  return match?.[0] ?? null;
37
36
  }
38
- async function resolveWorkerUrl(cwd, deployOutput) {
37
+ async function resolveWorkerUrl(configPath, deployOutput) {
39
38
  const fromOutput = findWorkersUrl(deployOutput);
40
39
  if (fromOutput) return fromOutput;
41
- const configText = await readFile2(join2(cwd, WRANGLER_CONFIG), "utf-8").catch(
40
+ const configText = await readFile2(configPath, "utf-8").catch(
42
41
  () => null
43
42
  );
44
43
  const workerName = configText?.match(/"name"\s*:\s*"([^"]+)"/)?.[1];
@@ -49,35 +48,27 @@ async function resolveWorkerUrl(cwd, deployOutput) {
49
48
  }
50
49
  async function runInitialDeploy(cwd) {
51
50
  const auth = await requireAuth();
52
- const { key: secretKey } = await ensureSecretKey(cwd);
53
- await execa("pnpm", ["--filter=@kalphq/studio", "build"], {
54
- cwd,
55
- stdio: "inherit"
56
- });
57
- const studioDist = join2(cwd, "apps/studio/dist");
58
- const workerStudioDist = join2(cwd, "packages/cloudflare/dist/studio");
59
- await rm(workerStudioDist, { recursive: true, force: true });
60
- await mkdir2(workerStudioDist, { recursive: true });
61
- await cp(studioDist, workerStudioDist, { recursive: true });
62
- let deployStdout = "";
63
- const secretResult = await execa(
64
- "npx",
65
- ["wrangler", "secret", "put", "KALP_SECRET_KEY", "--config", WRANGLER_CONFIG],
66
- {
67
- cwd,
68
- input: `${secretKey}
69
- `
70
- }
71
- );
51
+ await ensureSecretKey(cwd);
52
+ const runtime = await materializeRuntime(cwd);
72
53
  const deploy = await execa(
73
54
  "npx",
74
- ["wrangler", "deploy", "--config", WRANGLER_CONFIG],
55
+ [
56
+ "wrangler",
57
+ "deploy",
58
+ "--config",
59
+ runtime.wranglerConfigPath,
60
+ "--secrets-file",
61
+ ".env"
62
+ ],
75
63
  {
76
64
  cwd
77
65
  }
78
66
  );
79
- deployStdout = [secretResult.stdout, deploy.stdout, deploy.stderr].filter(Boolean).join("\n");
80
- const workerUrl = await resolveWorkerUrl(cwd, deployStdout);
67
+ const deployStdout = [deploy.stdout, deploy.stderr].filter(Boolean).join("\n");
68
+ const workerUrl = await resolveWorkerUrl(
69
+ runtime.wranglerConfigPath,
70
+ deployStdout
71
+ );
81
72
  await writeProjectState(cwd, {
82
73
  workerUrl,
83
74
  deployedAt: (/* @__PURE__ */ new Date()).toISOString(),
@@ -90,4 +81,4 @@ export {
90
81
  readProjectState,
91
82
  runInitialDeploy
92
83
  };
93
- //# sourceMappingURL=chunk-NJ3OTDOX.js.map
84
+ //# sourceMappingURL=chunk-MM6CND3O.js.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,232 @@
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 { createRequire } from "module";
37
+ import { basename, dirname, join as join2, resolve } from "path";
38
+ import { fileURLToPath } from "url";
39
+ var RUNTIME_ROOT = ".kalp";
40
+ var RUNTIME_DIR = "runtime";
41
+ var STUDIO_DIR = "studio";
42
+ var WRANGLER_CONFIG_FILE = "wrangler.jsonc";
43
+ var WORKER_ENTRY_FILE = "worker-entry.js";
44
+ var COMPATIBILITY_DATE = "2026-05-10";
45
+ function sanitizeSegment(input) {
46
+ return input.toLowerCase().replace(/^@/, "").replace(/\//g, "-").replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-+|-+$/g, "");
47
+ }
48
+ async function resolveProjectSlug(cwd) {
49
+ const fallback = sanitizeSegment(basename(cwd)) || "agent";
50
+ const packageJsonPath = join2(cwd, "package.json");
51
+ try {
52
+ const content = await readFile2(packageJsonPath, "utf-8");
53
+ const pkg = JSON.parse(content);
54
+ const name = typeof pkg.name === "string" ? pkg.name : "";
55
+ const sanitized = sanitizeSegment(name);
56
+ return sanitized || fallback;
57
+ } catch {
58
+ return fallback;
59
+ }
60
+ }
61
+ function buildWorkerName(slug, cwd) {
62
+ const cwdHash = createHash("sha1").update(cwd).digest("hex").slice(0, 8);
63
+ const withPrefix = `kalp-${slug}-${cwdHash}`;
64
+ const maxLen = 63;
65
+ if (withPrefix.length <= maxLen) {
66
+ return withPrefix;
67
+ }
68
+ const clipped = withPrefix.slice(0, maxLen).replace(/-+$/g, "");
69
+ return clipped || `kalp-${cwdHash}`;
70
+ }
71
+ function createRuntimeConfig(workerName) {
72
+ return {
73
+ $schema: "node_modules/wrangler/config-schema.json",
74
+ name: workerName,
75
+ main: `./${WORKER_ENTRY_FILE}`,
76
+ compatibility_date: COMPATIBILITY_DATE,
77
+ compatibility_flags: ["nodejs_compat"],
78
+ migrations: [
79
+ {
80
+ tag: "v1",
81
+ new_sqlite_classes: ["AgentDurableObject"]
82
+ }
83
+ ],
84
+ durable_objects: {
85
+ bindings: [
86
+ {
87
+ name: "KALP_RUNTIME_CLOUDFLARE",
88
+ class_name: "AgentDurableObject"
89
+ }
90
+ ]
91
+ },
92
+ kv_namespaces: [
93
+ {
94
+ binding: "KALP_MANIFESTS"
95
+ }
96
+ ],
97
+ assets: {
98
+ directory: `./${STUDIO_DIR}`,
99
+ binding: "ASSETS",
100
+ run_worker_first: true
101
+ },
102
+ observability: { enabled: true },
103
+ upload_source_maps: true,
104
+ secrets: {
105
+ required: ["KALP_SECRET_KEY"]
106
+ }
107
+ };
108
+ }
109
+ function assertCloudflareRuntimeDependency(cwd) {
110
+ try {
111
+ const requireFromProject = createRequire(join2(cwd, "package.json"));
112
+ requireFromProject.resolve("@kalphq/cloudflare");
113
+ } catch {
114
+ throw new Error(
115
+ "Missing dependency @kalphq/cloudflare in this project. Install it and retry `kalp dev`/`kalp deploy`."
116
+ );
117
+ }
118
+ }
119
+ function runtimeTemplateCandidates() {
120
+ const here = dirname(fileURLToPath(import.meta.url));
121
+ const distTemplateRoot = resolve(here, "..", "runtime-template");
122
+ const sourceTemplateRoot = resolve(here, "..", "..", "runtime-template");
123
+ const monorepoStudioDist = resolve(
124
+ here,
125
+ "..",
126
+ "..",
127
+ "..",
128
+ "..",
129
+ "apps",
130
+ "studio",
131
+ "dist",
132
+ "client"
133
+ );
134
+ return [
135
+ {
136
+ studioTemplateDir: join2(distTemplateRoot, STUDIO_DIR),
137
+ workerEntryPath: join2(distTemplateRoot, WORKER_ENTRY_FILE)
138
+ },
139
+ {
140
+ studioTemplateDir: join2(sourceTemplateRoot, STUDIO_DIR),
141
+ workerEntryPath: join2(sourceTemplateRoot, WORKER_ENTRY_FILE)
142
+ },
143
+ {
144
+ studioTemplateDir: monorepoStudioDist,
145
+ workerEntryPath: join2(sourceTemplateRoot, WORKER_ENTRY_FILE)
146
+ }
147
+ ];
148
+ }
149
+ async function resolveRuntimeTemplate() {
150
+ for (const candidate of runtimeTemplateCandidates()) {
151
+ try {
152
+ await access(candidate.studioTemplateDir);
153
+ await access(candidate.workerEntryPath);
154
+ return candidate;
155
+ } catch {
156
+ }
157
+ }
158
+ throw new Error(
159
+ "Kalp runtime template not found in CLI package. Reinstall @kalphq/cli."
160
+ );
161
+ }
162
+ function createStudioShell(entryScript, cssFiles) {
163
+ const cssLinks = cssFiles.map((file) => ` <link rel="stylesheet" href="/studio/assets/${file}" />`).join("\n");
164
+ return `<!doctype html>
165
+ <html lang="en">
166
+ <head>
167
+ <meta charset="UTF-8" />
168
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
169
+ <title>Kalp Studio</title>
170
+ ${cssLinks}
171
+ </head>
172
+ <body>
173
+ <div id="root"></div>
174
+ <script type="module" src="/studio/assets/${entryScript}"></script>
175
+ </body>
176
+ </html>
177
+ `;
178
+ }
179
+ async function ensureStudioIndex(studioDir) {
180
+ const indexPath = join2(studioDir, "index.html");
181
+ try {
182
+ await access(indexPath);
183
+ return;
184
+ } catch {
185
+ }
186
+ const assetsDir = join2(studioDir, "assets");
187
+ const assetFiles = await readdir(assetsDir);
188
+ const entryScript = assetFiles.find((file) => /^index-.*\.js$/i.test(file)) ?? assetFiles.find((file) => file.endsWith(".js"));
189
+ if (!entryScript) {
190
+ throw new Error(
191
+ "Studio runtime template is missing an entry JS bundle in studio/assets."
192
+ );
193
+ }
194
+ const cssFiles = assetFiles.filter((file) => file.endsWith(".css")).sort();
195
+ const html = createStudioShell(entryScript, cssFiles);
196
+ await writeFile2(indexPath, html, "utf-8");
197
+ }
198
+ async function materializeRuntime(cwd) {
199
+ assertCloudflareRuntimeDependency(cwd);
200
+ const runtimeDir = join2(cwd, RUNTIME_ROOT, RUNTIME_DIR);
201
+ const studioDir = join2(runtimeDir, STUDIO_DIR);
202
+ const workerEntrypointPath = join2(runtimeDir, WORKER_ENTRY_FILE);
203
+ const wranglerConfigPath = join2(runtimeDir, WRANGLER_CONFIG_FILE);
204
+ const template = await resolveRuntimeTemplate();
205
+ await rm(runtimeDir, { recursive: true, force: true });
206
+ await mkdir(runtimeDir, { recursive: true });
207
+ await cp(template.studioTemplateDir, studioDir, { recursive: true });
208
+ await cp(template.workerEntryPath, workerEntrypointPath);
209
+ await ensureStudioIndex(studioDir);
210
+ const projectSlug = await resolveProjectSlug(cwd);
211
+ const workerName = buildWorkerName(projectSlug, cwd);
212
+ const wranglerConfig = createRuntimeConfig(workerName);
213
+ await writeFile2(
214
+ wranglerConfigPath,
215
+ `${JSON.stringify(wranglerConfig, null, 2)}
216
+ `,
217
+ "utf-8"
218
+ );
219
+ return {
220
+ runtimeDir,
221
+ studioDir,
222
+ workerEntrypointPath,
223
+ wranglerConfigPath,
224
+ workerName
225
+ };
226
+ }
227
+
228
+ export {
229
+ ensureSecretKey,
230
+ materializeRuntime
231
+ };
232
+ //# sourceMappingURL=chunk-TTKFK7NJ.js.map
@@ -0,0 +1 @@
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 { createRequire } from \"node:module\";\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 assertCloudflareRuntimeDependency(cwd: string): void {\n try {\n const requireFromProject = createRequire(join(cwd, \"package.json\"));\n requireFromProject.resolve(\"@kalphq/cloudflare\");\n } catch {\n throw new Error(\n \"Missing dependency @kalphq/cloudflare in this project. Install it and retry `kalp dev`/`kalp deploy`.\",\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 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(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 assertCloudflareRuntimeDependency(cwd);\n\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":"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","names":["readFile","writeFile","join"]}
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runInitialDeploy
4
- } from "./chunk-NJ3OTDOX.js";
5
- import "./chunk-E7V5UMX7.js";
4
+ } from "./chunk-MM6CND3O.js";
5
+ import "./chunk-TTKFK7NJ.js";
6
6
  import {
7
7
  requireAuth
8
8
  } from "./chunk-5RODADXW.js";
@@ -60,4 +60,4 @@ var deploy_default = defineCommand({
60
60
  export {
61
61
  deploy_default as default
62
62
  };
63
- //# sourceMappingURL=deploy-HRUJDN2F.js.map
63
+ //# sourceMappingURL=deploy-PKK545YR.js.map
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- ensureSecretKey
4
- } from "./chunk-E7V5UMX7.js";
3
+ ensureSecretKey,
4
+ materializeRuntime
5
+ } from "./chunk-TTKFK7NJ.js";
5
6
 
6
7
  // src/commands/dev.ts
7
8
  import { copyFile } from "fs/promises";
@@ -27,7 +28,6 @@ async function createStudioToken(secretKey) {
27
28
 
28
29
  // src/commands/dev.ts
29
30
  var LOGO = "\u{1F98B}";
30
- var WRANGLER_CONFIG = "packages/cloudflare/wrangler.jsonc";
31
31
  var dev_default = defineCommand({
32
32
  meta: { name: "dev", description: "Run Worker + Studio local environment" },
33
33
  async run() {
@@ -36,28 +36,31 @@ var dev_default = defineCommand({
36
36
  const { key } = await ensureSecretKey(cwd);
37
37
  await copyFile(join(cwd, ".env"), join(cwd, ".dev.vars"));
38
38
  const token = await createStudioToken(key);
39
- p.note("Starting backend (wrangler dev :8787) and frontend (Vite :5173)");
39
+ const runtime = await materializeRuntime(cwd);
40
+ p.note("Starting local runtime (wrangler dev :8787)");
40
41
  const backend = execa(
41
42
  "npx",
42
- ["wrangler", "dev", "--port", "8787", "--config", WRANGLER_CONFIG],
43
+ [
44
+ "wrangler",
45
+ "dev",
46
+ "--port",
47
+ "8787",
48
+ "--config",
49
+ runtime.wranglerConfigPath
50
+ ],
43
51
  { cwd, stdio: "inherit" }
44
52
  );
45
- const frontend = execa("pnpm", ["--filter=@kalphq/studio", "dev"], {
46
- cwd,
47
- stdio: "inherit"
48
- });
49
53
  const shutdown = () => {
50
54
  backend.kill("SIGINT");
51
- frontend.kill("SIGINT");
52
55
  };
53
56
  process.on("SIGINT", shutdown);
54
57
  process.on("SIGTERM", shutdown);
55
58
  await delay(2500);
56
- const studioUrl = `http://localhost:5173/studio/?token=${token}`;
59
+ const studioUrl = `http://localhost:8787/studio/?token=${token}`;
57
60
  await open(studioUrl);
58
61
  p.log.success(`Studio opened at ${pc.cyan(studioUrl)}`);
59
62
  try {
60
- await Promise.race([backend, frontend]);
63
+ await backend;
61
64
  } finally {
62
65
  shutdown();
63
66
  process.off("SIGINT", shutdown);
@@ -68,4 +71,4 @@ var dev_default = defineCommand({
68
71
  export {
69
72
  dev_default as default
70
73
  };
71
- //# sourceMappingURL=dev-ZKXOQ2GQ.js.map
74
+ //# sourceMappingURL=dev-LE5FR6BF.js.map
@@ -0,0 +1 @@
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":[]}
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@ import pc from "picocolors";
8
8
  // package.json
9
9
  var package_default = {
10
10
  name: "@kalphq/cli",
11
- version: "0.0.0-dev-20260510030416",
11
+ version: "0.0.0-dev-20260510045606",
12
12
  description: "Zero-config CLI for deploying Kalp agents",
13
13
  type: "module",
14
14
  license: "MIT",
@@ -24,7 +24,9 @@ var package_default = {
24
24
  access: "public"
25
25
  },
26
26
  scripts: {
27
- build: "tsup",
27
+ build: "tsup && pnpm run build:studio && pnpm run build:runtime-template",
28
+ "build:studio": "pnpm --filter=@kalphq/studio build",
29
+ "build:runtime-template": "node ./scripts/prepare-runtime-template.mjs",
28
30
  dev: "tsup --watch",
29
31
  lint: "tsc --noEmit",
30
32
  prepublishOnly: "pnpm build"
@@ -90,13 +92,13 @@ var main = defineCommand({
90
92
  },
91
93
  subCommands: {
92
94
  create: () => import("./create-QTVTQ6QL.js").then((r) => r.default),
93
- deploy: () => import("./deploy-HRUJDN2F.js").then((r) => r.default),
94
- push: () => import("./push-P2NWWXGL.js").then((r) => r.default),
95
+ deploy: () => import("./deploy-PKK545YR.js").then((r) => r.default),
96
+ push: () => import("./push-EI646ZVZ.js").then((r) => r.default),
95
97
  link: () => import("./link-WZQSR2TM.js").then((r) => r.default),
96
98
  secrets: () => import("./secrets-P7ADVLOS.js").then((r) => r.default),
97
99
  login: () => import("./login-M5Y57ZZU.js").then((r) => r.default),
98
100
  logout: () => import("./logout-U5V5K775.js").then((r) => r.default),
99
- dev: () => import("./dev-ZKXOQ2GQ.js").then((r) => r.default)
101
+ dev: () => import("./dev-LE5FR6BF.js").then((r) => r.default)
100
102
  },
101
103
  run({ args }) {
102
104
  const firstArg = process.argv[2];
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport pkg from \"../package.json\";\n\nconst LOGO = \"🦋\";\n\nconst COMMANDS = [\n [\"create\", \"Add a new agent\"],\n [\"deploy\", \"Deploy runtime to Cloudflare\"],\n [\"push\", \"Push agent manifest to Cloudflare\"],\n [\"link\", \"Link project to Kalp cloud\"],\n [\"secrets\", \"Manage secrets\"],\n [\"login\", \"Authenticate with Cloudflare\"],\n [\"logout\", \"Sign out from Kalp\"],\n [\"dev\", \"Run Worker + Studio locally\"],\n] as const;\n\nfunction printHelp(): void {\n p.log.info(`${pc.bold(\"Usage\")}: kalp <command> [options]`);\n console.log(\"\");\n p.log.info(pc.bold(\"Commands\"));\n\n for (const [name, desc] of COMMANDS) {\n console.log(` ${pc.cyan(name.padEnd(10))}${desc}`);\n }\n\n console.log(\"\");\n p.log.info(`Run ${pc.cyan(\"kalp <command> --help\")} for more info.`);\n}\n\nconst main = defineCommand({\n meta: {\n name: \"kalp\",\n version: pkg.version,\n description: \"🦋 Zero-config agent infrastructure\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n create: () => import(\"./commands/create\").then((r) => r.default),\n deploy: () => import(\"./commands/deploy\").then((r) => r.default),\n push: () => import(\"./commands/push\").then((r) => r.default),\n link: () => import(\"./commands/link\").then((r) => r.default),\n secrets: () => import(\"./commands/secrets\").then((r) => r.default),\n login: () => import(\"./commands/login\").then((r) => r.default),\n logout: () => import(\"./commands/logout\").then((r) => r.default),\n dev: () => import(\"./commands/dev\").then((r) => r.default),\n },\n run({ args }) {\n const firstArg = process.argv[2];\n\n if (args.help) {\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n return;\n }\n\n if (firstArg) {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n },\n});\n\nrunMain(main);\n","{\n \"name\": \"@kalphq/cli\",\n \"version\": \"0.0.0-dev-20260510030416\",\n \"description\": \"Zero-config CLI for deploying Kalp agents\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"author\": \"Kalp HQ\",\n \"bin\": {\n \"kalp\": \"./dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"tsc --noEmit\",\n \"prepublishOnly\": \"pnpm build\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"24.4.0\",\n \"@clack/prompts\": \"0.9.1\",\n \"@kalphq/compiler\": \"workspace:*\",\n \"@kalphq/project\": \"workspace:*\",\n \"@kalphq/sdk\": \"workspace:*\",\n \"citty\": \"0.1.6\",\n \"esbuild\": \"0.25.0\",\n \"execa\": \"^9.6.1\",\n \"jose\": \"^5.10.0\",\n \"json-stable-stringify\": \"1.3.0\",\n \"open\": \"^11.0.0\",\n \"picocolors\": \"1.1.1\",\n \"zod\": \"3.25.76\"\n },\n \"devDependencies\": {\n \"@types/json-stable-stringify\": \"1.2.0\",\n \"@types/node\": \"^22.15.3\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.0.0\"\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport pkg from \"../package.json\";\n\nconst LOGO = \"🦋\";\n\nconst COMMANDS = [\n [\"create\", \"Add a new agent\"],\n [\"deploy\", \"Deploy runtime to Cloudflare\"],\n [\"push\", \"Push agent manifest to Cloudflare\"],\n [\"link\", \"Link project to Kalp cloud\"],\n [\"secrets\", \"Manage secrets\"],\n [\"login\", \"Authenticate with Cloudflare\"],\n [\"logout\", \"Sign out from Kalp\"],\n [\"dev\", \"Run Worker + Studio locally\"],\n] as const;\n\nfunction printHelp(): void {\n p.log.info(`${pc.bold(\"Usage\")}: kalp <command> [options]`);\n console.log(\"\");\n p.log.info(pc.bold(\"Commands\"));\n\n for (const [name, desc] of COMMANDS) {\n console.log(` ${pc.cyan(name.padEnd(10))}${desc}`);\n }\n\n console.log(\"\");\n p.log.info(`Run ${pc.cyan(\"kalp <command> --help\")} for more info.`);\n}\n\nconst main = defineCommand({\n meta: {\n name: \"kalp\",\n version: pkg.version,\n description: \"🦋 Zero-config agent infrastructure\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n create: () => import(\"./commands/create\").then((r) => r.default),\n deploy: () => import(\"./commands/deploy\").then((r) => r.default),\n push: () => import(\"./commands/push\").then((r) => r.default),\n link: () => import(\"./commands/link\").then((r) => r.default),\n secrets: () => import(\"./commands/secrets\").then((r) => r.default),\n login: () => import(\"./commands/login\").then((r) => r.default),\n logout: () => import(\"./commands/logout\").then((r) => r.default),\n dev: () => import(\"./commands/dev\").then((r) => r.default),\n },\n run({ args }) {\n const firstArg = process.argv[2];\n\n if (args.help) {\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n return;\n }\n\n if (firstArg) {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n },\n});\n\nrunMain(main);\n","{\n \"name\": \"@kalphq/cli\",\n \"version\": \"0.0.0-dev-20260510045606\",\n \"description\": \"Zero-config CLI for deploying Kalp agents\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"author\": \"Kalp HQ\",\n \"bin\": {\n \"kalp\": \"./dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup && pnpm run build:studio && pnpm run build:runtime-template\",\n \"build:studio\": \"pnpm --filter=@kalphq/studio build\",\n \"build:runtime-template\": \"node ./scripts/prepare-runtime-template.mjs\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"tsc --noEmit\",\n \"prepublishOnly\": \"pnpm build\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"24.4.0\",\n \"@clack/prompts\": \"0.9.1\",\n \"@kalphq/compiler\": \"workspace:*\",\n \"@kalphq/project\": \"workspace:*\",\n \"@kalphq/sdk\": \"workspace:*\",\n \"citty\": \"0.1.6\",\n \"esbuild\": \"0.25.0\",\n \"execa\": \"^9.6.1\",\n \"jose\": \"^5.10.0\",\n \"json-stable-stringify\": \"1.3.0\",\n \"open\": \"^11.0.0\",\n \"picocolors\": \"1.1.1\",\n \"zod\": \"3.25.76\"\n },\n \"devDependencies\": {\n \"@types/json-stable-stringify\": \"1.2.0\",\n \"@types/node\": \"^22.15.3\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.0.0\"\n }\n}\n"],"mappings":";;;AAAA,SAAS,eAAe,eAAe;AACvC,YAAY,OAAO;AACnB,OAAO,QAAQ;;;ACFf;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,QAAU;AAAA,EACV,KAAO;AAAA,IACL,MAAQ;AAAA,EACV;AAAA,EACA,MAAQ;AAAA,EACR,OAAS;AAAA,IACP;AAAA,EACF;AAAA,EACA,eAAiB;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,0BAA0B;AAAA,IAC1B,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,gBAAkB;AAAA,EACpB;AAAA,EACA,cAAgB;AAAA,IACd,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,OAAS;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,yBAAyB;AAAA,IACzB,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,KAAO;AAAA,EACT;AAAA,EACA,iBAAmB;AAAA,IACjB,gCAAgC;AAAA,IAChC,eAAe;AAAA,IACf,MAAQ;AAAA,IACR,YAAc;AAAA,EAChB;AACF;;;ADzCA,IAAM,OAAO;AAEb,IAAM,WAAW;AAAA,EACf,CAAC,UAAU,iBAAiB;AAAA,EAC5B,CAAC,UAAU,8BAA8B;AAAA,EACzC,CAAC,QAAQ,mCAAmC;AAAA,EAC5C,CAAC,QAAQ,4BAA4B;AAAA,EACrC,CAAC,WAAW,gBAAgB;AAAA,EAC5B,CAAC,SAAS,8BAA8B;AAAA,EACxC,CAAC,UAAU,oBAAoB;AAAA,EAC/B,CAAC,OAAO,6BAA6B;AACvC;AAEA,SAAS,YAAkB;AACzB,EAAE,MAAI,KAAK,GAAG,GAAG,KAAK,OAAO,CAAC,4BAA4B;AAC1D,UAAQ,IAAI,EAAE;AACd,EAAE,MAAI,KAAK,GAAG,KAAK,UAAU,CAAC;AAE9B,aAAW,CAAC,MAAM,IAAI,KAAK,UAAU;AACnC,YAAQ,IAAI,KAAK,GAAG,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;AAAA,EACpD;AAEA,UAAQ,IAAI,EAAE;AACd,EAAE,MAAI,KAAK,OAAO,GAAG,KAAK,uBAAuB,CAAC,iBAAiB;AACrE;AAEA,IAAM,OAAO,cAAc;AAAA,EACzB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS,gBAAI;AAAA,IACb,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,QAAQ,MAAM,OAAO,sBAAmB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC/D,QAAQ,MAAM,OAAO,sBAAmB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC/D,MAAM,MAAM,OAAO,oBAAiB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC3D,MAAM,MAAM,OAAO,oBAAiB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC3D,SAAS,MAAM,OAAO,uBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IACjE,OAAO,MAAM,OAAO,qBAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC7D,QAAQ,MAAM,OAAO,sBAAmB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC/D,KAAK,MAAM,OAAO,mBAAgB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,EAC3D;AAAA,EACA,IAAI,EAAE,KAAK,GAAG;AACZ,UAAM,WAAW,QAAQ,KAAK,CAAC;AAE/B,QAAI,KAAK,MAAM;AACb,MAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,MAAM,CAAC,EAAE;AACpC,gBAAU;AACV,MAAE,QAAM,wBAAiB;AACzB;AAAA,IACF;AAEA,QAAI,UAAU;AACZ;AAAA,IACF;AAEA,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,MAAM,CAAC,EAAE;AACpC,cAAU;AACV,IAAE,QAAM,wBAAiB;AAAA,EAC3B;AACF,CAAC;AAED,QAAQ,IAAI;","names":[]}
@@ -5,8 +5,10 @@ import {
5
5
  import {
6
6
  readProjectState,
7
7
  runInitialDeploy
8
- } from "./chunk-NJ3OTDOX.js";
9
- import "./chunk-E7V5UMX7.js";
8
+ } from "./chunk-MM6CND3O.js";
9
+ import {
10
+ materializeRuntime
11
+ } from "./chunk-TTKFK7NJ.js";
10
12
  import {
11
13
  requireAuth
12
14
  } from "./chunk-5RODADXW.js";
@@ -147,7 +149,6 @@ async function writeAgentStoreEntry(agentName, entry) {
147
149
 
148
150
  // src/commands/push.ts
149
151
  var LOGO = "\u{1F98B}";
150
- var WRANGLER_CONFIG = "packages/cloudflare/wrangler.jsonc";
151
152
  function formatBytes(bytes) {
152
153
  if (bytes < 1024) return `${bytes} B`;
153
154
  return `${(bytes / 1024).toFixed(1)} KB`;
@@ -193,6 +194,7 @@ var push_default = defineCommand({
193
194
  accountId: deploy.accountId
194
195
  };
195
196
  }
197
+ const runtime = await materializeRuntime(cwd);
196
198
  const s = p.spinner();
197
199
  s.start(`Compiling ${pc.cyan(agentName)}`);
198
200
  const manifest = await readAgentManifest({ cwd, agentName });
@@ -237,7 +239,7 @@ var push_default = defineCommand({
237
239
  manifestPath,
238
240
  "--remote",
239
241
  "--config",
240
- WRANGLER_CONFIG
242
+ runtime.wranglerConfigPath
241
243
  ],
242
244
  { cwd }
243
245
  );
@@ -254,7 +256,7 @@ var push_default = defineCommand({
254
256
  hash,
255
257
  "--remote",
256
258
  "--config",
257
- WRANGLER_CONFIG
259
+ runtime.wranglerConfigPath
258
260
  ],
259
261
  { cwd }
260
262
  );
@@ -284,4 +286,4 @@ var push_default = defineCommand({
284
286
  export {
285
287
  push_default as default
286
288
  };
287
- //# sourceMappingURL=push-P2NWWXGL.js.map
289
+ //# sourceMappingURL=push-EI646ZVZ.js.map
@@ -0,0 +1 @@
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"]}