@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.
- package/dist/{chunk-NJ3OTDOX.js → chunk-MM6CND3O.js} +22 -31
- package/dist/chunk-MM6CND3O.js.map +1 -0
- package/dist/chunk-TTKFK7NJ.js +232 -0
- package/dist/chunk-TTKFK7NJ.js.map +1 -0
- package/dist/{deploy-HRUJDN2F.js → deploy-PKK545YR.js} +3 -3
- package/dist/{dev-ZKXOQ2GQ.js → dev-LE5FR6BF.js} +16 -13
- package/dist/dev-LE5FR6BF.js.map +1 -0
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/{push-P2NWWXGL.js → push-EI646ZVZ.js} +8 -6
- package/dist/push-EI646ZVZ.js.map +1 -0
- package/dist/runtime-template/studio/assets/QueryClientProvider-D-LxTiBd.js +1 -0
- package/dist/runtime-template/studio/assets/index-DpfZiZAs.js +75 -0
- package/dist/runtime-template/studio/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/dist/runtime-template/studio/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/dist/runtime-template/studio/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/dist/runtime-template/studio/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/dist/runtime-template/studio/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/dist/runtime-template/studio/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/dist/runtime-template/studio/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/dist/runtime-template/studio/assets/replay._executionId-Cs7M_t4A.js +41 -0
- package/dist/runtime-template/studio/assets/routes-DM2dr3uc.js +1 -0
- package/dist/runtime-template/studio/assets/styles-DnCmVxlg.css +2 -0
- package/dist/runtime-template/studio/assets/useAuth-CNMCKtPc.js +1 -0
- package/dist/runtime-template/studio/favicon.ico +0 -0
- package/dist/runtime-template/studio/index.html +13 -0
- package/dist/runtime-template/studio/logo192.png +0 -0
- package/dist/runtime-template/studio/logo512.png +0 -0
- package/dist/runtime-template/studio/manifest.json +25 -0
- package/dist/runtime-template/studio/robots.txt +3 -0
- package/dist/runtime-template/worker-entry.js +2 -0
- package/package.json +7 -5
- package/dist/chunk-E7V5UMX7.js +0 -28
- package/dist/chunk-E7V5UMX7.js.map +0 -1
- package/dist/chunk-NJ3OTDOX.js.map +0 -1
- package/dist/dev-ZKXOQ2GQ.js.map +0 -1
- package/dist/push-P2NWWXGL.js.map +0 -1
- /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
|
-
|
|
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 {
|
|
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(
|
|
37
|
+
async function resolveWorkerUrl(configPath, deployOutput) {
|
|
39
38
|
const fromOutput = findWorkersUrl(deployOutput);
|
|
40
39
|
if (fromOutput) return fromOutput;
|
|
41
|
-
const configText = await readFile2(
|
|
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
|
-
|
|
53
|
-
|
|
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
|
-
[
|
|
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 = [
|
|
80
|
-
const workerUrl = await resolveWorkerUrl(
|
|
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-
|
|
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-
|
|
5
|
-
import "./chunk-
|
|
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-
|
|
63
|
+
//# sourceMappingURL=deploy-PKK545YR.js.map
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
ensureSecretKey
|
|
4
|
-
|
|
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
|
-
|
|
39
|
+
const runtime = await materializeRuntime(cwd);
|
|
40
|
+
p.note("Starting local runtime (wrangler dev :8787)");
|
|
40
41
|
const backend = execa(
|
|
41
42
|
"npx",
|
|
42
|
-
[
|
|
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:
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
94
|
-
push: () => import("./push-
|
|
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-
|
|
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-
|
|
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-
|
|
9
|
-
import
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
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"]}
|