@kalphq/cli 0.0.0-dev-20260510070528 → 0.0.0-dev-20260512045454
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-RT2DIIQ5.js → chunk-5AEWO2OC.js} +104 -96
- package/dist/chunk-5AEWO2OC.js.map +1 -0
- package/dist/{chunk-WRCC37FP.js → chunk-MKVNPOVJ.js} +61 -7
- package/dist/chunk-MKVNPOVJ.js.map +1 -0
- package/dist/{create-QTVTQ6QL.js → create-WU5JH6FP.js} +13 -2
- package/dist/create-WU5JH6FP.js.map +1 -0
- package/dist/{deploy-YZ3OP2MN.js → deploy-FVOKQP6K.js} +3 -3
- package/dist/{dev-UC2WFSOE.js → dev-AHTXYEF2.js} +3 -4
- package/dist/dev-AHTXYEF2.js.map +1 -0
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/dist/push-FIZZS6HQ.js +341 -0
- package/dist/push-FIZZS6HQ.js.map +1 -0
- package/dist/runtime-template/studio/assets/geist-cyrillic-wght-normal-CHSlOQsW.woff2 +0 -0
- package/dist/runtime-template/studio/assets/geist-latin-ext-wght-normal-DMtmJ5ZE.woff2 +0 -0
- package/dist/runtime-template/studio/assets/geist-latin-wght-normal-Dm3htQBi.woff2 +0 -0
- package/dist/runtime-template/studio/assets/geist-mono-cyrillic-wght-normal-BZdD_g9V.woff2 +0 -0
- package/dist/runtime-template/studio/assets/geist-mono-latin-ext-wght-normal-b6lpi8_2.woff2 +0 -0
- package/dist/runtime-template/studio/assets/geist-mono-latin-wght-normal-Cjtb1TV-.woff2 +0 -0
- package/dist/runtime-template/studio/assets/index-BHzMtWls.css +2 -0
- package/dist/runtime-template/studio/assets/index-rgoZQzco.js +112 -0
- package/dist/runtime-template/studio/index.html +2 -2
- package/dist/runtime-template/studio/mockServiceWorker.js +349 -0
- package/package.json +5 -4
- package/dist/chunk-RT2DIIQ5.js.map +0 -1
- package/dist/chunk-WRCC37FP.js.map +0 -1
- package/dist/create-QTVTQ6QL.js.map +0 -1
- package/dist/dev-UC2WFSOE.js.map +0 -1
- package/dist/push-XGNM2IEY.js +0 -263
- package/dist/push-XGNM2IEY.js.map +0 -1
- package/dist/runtime-template/studio/assets/index-D8vnrQHk.js +0 -112
- package/dist/runtime-template/studio/assets/index-GI30ROBZ.css +0 -2
- 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/{deploy-YZ3OP2MN.js.map → deploy-FVOKQP6K.js.map} +0 -0
package/dist/push-XGNM2IEY.js
DELETED
|
@@ -1,263 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
ensureConfig
|
|
4
|
-
} from "./chunk-INB3LG6O.js";
|
|
5
|
-
import {
|
|
6
|
-
runInitialDeploy
|
|
7
|
-
} from "./chunk-WRCC37FP.js";
|
|
8
|
-
import {
|
|
9
|
-
getAgentStoreEntry,
|
|
10
|
-
materializeRuntime,
|
|
11
|
-
readProjectState,
|
|
12
|
-
writeAgentStoreEntry
|
|
13
|
-
} from "./chunk-RT2DIIQ5.js";
|
|
14
|
-
import {
|
|
15
|
-
requireAuth
|
|
16
|
-
} from "./chunk-5RODADXW.js";
|
|
17
|
-
import "./chunk-FO24J6XL.js";
|
|
18
|
-
|
|
19
|
-
// src/commands/push.ts
|
|
20
|
-
import { access as access2, mkdir, rm as rm2, writeFile } from "fs/promises";
|
|
21
|
-
import { join as join2 } from "path";
|
|
22
|
-
import { defineCommand } from "citty";
|
|
23
|
-
import * as p from "@clack/prompts";
|
|
24
|
-
import pc from "picocolors";
|
|
25
|
-
import { execa } from "execa";
|
|
26
|
-
|
|
27
|
-
// src/utils/manifest/index.ts
|
|
28
|
-
import { access, readFile, rm, mkdtemp } from "fs/promises";
|
|
29
|
-
import { join } from "path";
|
|
30
|
-
import { tmpdir } from "os";
|
|
31
|
-
import { buildAgent } from "@kalphq/compiler";
|
|
32
|
-
|
|
33
|
-
// src/utils/ir/hashIR.ts
|
|
34
|
-
import { calculateAgentHash } from "@kalphq/compiler";
|
|
35
|
-
function computePushHash(ir) {
|
|
36
|
-
const bundles = ir.bundles || {};
|
|
37
|
-
const handlers = Object.keys(bundles).reduce(
|
|
38
|
-
(acc, hash) => ({
|
|
39
|
-
...acc,
|
|
40
|
-
[hash]: { hash }
|
|
41
|
-
}),
|
|
42
|
-
{}
|
|
43
|
-
);
|
|
44
|
-
return calculateAgentHash(ir, handlers);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// src/utils/manifest/index.ts
|
|
48
|
-
async function readAgentManifest(params) {
|
|
49
|
-
const { cwd, agentName } = params;
|
|
50
|
-
const agentPath = join(cwd, "agents", agentName, "index.ts");
|
|
51
|
-
await access(agentPath);
|
|
52
|
-
const tempOutDir = await mkdtemp(join(tmpdir(), "kalp-build-"));
|
|
53
|
-
try {
|
|
54
|
-
await buildAgent(agentPath, tempOutDir, cwd);
|
|
55
|
-
const irContent = await readFile(join(tempOutDir, "ir.json"), "utf-8");
|
|
56
|
-
const ir = JSON.parse(irContent);
|
|
57
|
-
return {
|
|
58
|
-
format: "kalp-agent-manifest",
|
|
59
|
-
schemaVersion: 3,
|
|
60
|
-
ir,
|
|
61
|
-
metadata: {
|
|
62
|
-
generatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
} finally {
|
|
66
|
-
await rm(tempOutDir, { recursive: true, force: true });
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// src/utils/validate.ts
|
|
71
|
-
import {
|
|
72
|
-
analyzeHandler,
|
|
73
|
-
calculateAgentHash as calculateAgentHash2,
|
|
74
|
-
validateIR,
|
|
75
|
-
validateIRBindings
|
|
76
|
-
} from "@kalphq/compiler";
|
|
77
|
-
function validateCompiledIR(input) {
|
|
78
|
-
const { ir, hash } = input;
|
|
79
|
-
const bundles = ir.bundles || {};
|
|
80
|
-
const bundleHashes = Object.keys(bundles);
|
|
81
|
-
const irValidation = validateIR(ir);
|
|
82
|
-
if (!irValidation.valid) {
|
|
83
|
-
return { ok: false, phase: "ir", errors: irValidation.errors };
|
|
84
|
-
}
|
|
85
|
-
const bindingsValidation = validateIRBindings(ir, bundleHashes);
|
|
86
|
-
if (!bindingsValidation.valid) {
|
|
87
|
-
return { ok: false, phase: "bindings", errors: bindingsValidation.errors };
|
|
88
|
-
}
|
|
89
|
-
const handlers = bundleHashes.reduce(
|
|
90
|
-
(acc, key) => ({ ...acc, [key]: { hash: key } }),
|
|
91
|
-
{}
|
|
92
|
-
);
|
|
93
|
-
const expectedHash = calculateAgentHash2(ir, handlers);
|
|
94
|
-
if (expectedHash !== hash) {
|
|
95
|
-
return {
|
|
96
|
-
ok: false,
|
|
97
|
-
phase: "hash",
|
|
98
|
-
errors: [
|
|
99
|
-
`Hash mismatch: client provided ${hash}, calculated ${expectedHash}`
|
|
100
|
-
]
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
const analysis = Object.entries(bundles).map(
|
|
104
|
-
([name, bundle]) => ({
|
|
105
|
-
name,
|
|
106
|
-
...analyzeHandler(bundle.code)
|
|
107
|
-
})
|
|
108
|
-
);
|
|
109
|
-
const blockers = analysis.flatMap(
|
|
110
|
-
(entry) => entry.blockers.map((blocker) => `${blocker} in ${entry.name}`)
|
|
111
|
-
);
|
|
112
|
-
if (blockers.length > 0) {
|
|
113
|
-
return {
|
|
114
|
-
ok: false,
|
|
115
|
-
phase: "analysis",
|
|
116
|
-
blockers,
|
|
117
|
-
errors: blockers.map((b) => `[Analysis Blocker] ${b}`),
|
|
118
|
-
analysis
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
return { ok: true, analysis };
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// src/commands/push.ts
|
|
125
|
-
var LOGO = "\u{1F98B}";
|
|
126
|
-
function formatBytes(bytes) {
|
|
127
|
-
if (bytes < 1024) return `${bytes} B`;
|
|
128
|
-
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
129
|
-
}
|
|
130
|
-
var push_default = defineCommand({
|
|
131
|
-
meta: { name: "push", description: "Push agent manifest to Cloudflare KV" },
|
|
132
|
-
args: {
|
|
133
|
-
agent: {
|
|
134
|
-
type: "string",
|
|
135
|
-
alias: "a",
|
|
136
|
-
description: "Agent name to push",
|
|
137
|
-
required: false
|
|
138
|
-
}
|
|
139
|
-
},
|
|
140
|
-
async run({ args }) {
|
|
141
|
-
const cwd = process.cwd();
|
|
142
|
-
const agentName = args.agent;
|
|
143
|
-
p.intro(`${LOGO} ${pc.bold("kalp push")}`);
|
|
144
|
-
if (!agentName) {
|
|
145
|
-
p.log.error(`Missing required flag ${pc.cyan("-a <agent-name>")}`);
|
|
146
|
-
process.exit(1);
|
|
147
|
-
}
|
|
148
|
-
await requireAuth().catch(() => {
|
|
149
|
-
p.log.error("Not authenticated. Run `kalp login` first.");
|
|
150
|
-
process.exit(1);
|
|
151
|
-
});
|
|
152
|
-
await ensureConfig(cwd).catch(() => {
|
|
153
|
-
p.log.error(`${pc.cyan("kalp.config.ts")} not found`);
|
|
154
|
-
process.exit(1);
|
|
155
|
-
});
|
|
156
|
-
const agentPath = join2(cwd, "agents", agentName, "index.ts");
|
|
157
|
-
await access2(agentPath).catch(() => {
|
|
158
|
-
p.log.error(`Agent ${pc.cyan(agentName)} not found`);
|
|
159
|
-
process.exit(1);
|
|
160
|
-
});
|
|
161
|
-
let state = await readProjectState(cwd);
|
|
162
|
-
if (!state) {
|
|
163
|
-
p.log.warn("No .kalp/state.json found. Running initial deploy first...");
|
|
164
|
-
const deploy = await runInitialDeploy(cwd);
|
|
165
|
-
state = {
|
|
166
|
-
workerUrl: deploy.workerUrl,
|
|
167
|
-
deployedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
168
|
-
accountId: deploy.accountId
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
const runtime = await materializeRuntime(cwd);
|
|
172
|
-
const s = p.spinner();
|
|
173
|
-
s.start(`Compiling ${pc.cyan(agentName)}`);
|
|
174
|
-
const manifest = await readAgentManifest({ cwd, agentName });
|
|
175
|
-
const hash = computePushHash(manifest.ir);
|
|
176
|
-
s.stop(`Compiled ${pc.cyan(agentName)} (${hash.slice(0, 8)})`);
|
|
177
|
-
const validation = validateCompiledIR({ agentName, ir: manifest.ir, hash });
|
|
178
|
-
if (!validation.ok) {
|
|
179
|
-
p.log.error(`Validation failed at phase: ${validation.phase}`);
|
|
180
|
-
for (const err of validation.errors ?? []) {
|
|
181
|
-
p.log.error(err);
|
|
182
|
-
}
|
|
183
|
-
process.exit(1);
|
|
184
|
-
}
|
|
185
|
-
const previous = await getAgentStoreEntry(agentName);
|
|
186
|
-
const agentWorkerUrl = `${state.workerUrl.replace(/\/$/, "")}/a/${agentName}`;
|
|
187
|
-
if (previous?.hash === hash && previous.workerUrl === agentWorkerUrl) {
|
|
188
|
-
p.note(
|
|
189
|
-
`No changes detected for ${pc.cyan(agentName)} (${hash.slice(0, 8)}).`,
|
|
190
|
-
"Skipped"
|
|
191
|
-
);
|
|
192
|
-
p.outro(`${LOGO} ${pc.green("Nothing to push")}`);
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
const manifestKey = `${agentName}:${hash}`;
|
|
196
|
-
const latestKey = `${agentName}:latest`;
|
|
197
|
-
const manifestPath = join2(cwd, ".kalp", `${agentName}-${hash}.json`);
|
|
198
|
-
await mkdir(join2(cwd, ".kalp"), { recursive: true });
|
|
199
|
-
await writeFile(manifestPath, JSON.stringify(manifest.ir), "utf-8");
|
|
200
|
-
try {
|
|
201
|
-
s.start("Uploading manifest to Cloudflare KV");
|
|
202
|
-
await execa(
|
|
203
|
-
"npx",
|
|
204
|
-
[
|
|
205
|
-
"wrangler",
|
|
206
|
-
"kv",
|
|
207
|
-
"key",
|
|
208
|
-
"put",
|
|
209
|
-
"--binding",
|
|
210
|
-
"KALP_MANIFESTS",
|
|
211
|
-
manifestKey,
|
|
212
|
-
"--path",
|
|
213
|
-
manifestPath,
|
|
214
|
-
"--remote",
|
|
215
|
-
"--config",
|
|
216
|
-
runtime.wranglerConfigPath
|
|
217
|
-
],
|
|
218
|
-
{ cwd }
|
|
219
|
-
);
|
|
220
|
-
await execa(
|
|
221
|
-
"npx",
|
|
222
|
-
[
|
|
223
|
-
"wrangler",
|
|
224
|
-
"kv",
|
|
225
|
-
"key",
|
|
226
|
-
"put",
|
|
227
|
-
"--binding",
|
|
228
|
-
"KALP_MANIFESTS",
|
|
229
|
-
latestKey,
|
|
230
|
-
hash,
|
|
231
|
-
"--remote",
|
|
232
|
-
"--config",
|
|
233
|
-
runtime.wranglerConfigPath
|
|
234
|
-
],
|
|
235
|
-
{ cwd }
|
|
236
|
-
);
|
|
237
|
-
s.stop("Manifest uploaded");
|
|
238
|
-
} finally {
|
|
239
|
-
await rm2(manifestPath, { force: true });
|
|
240
|
-
}
|
|
241
|
-
const bundles = manifest.ir.bundles || {};
|
|
242
|
-
const totalSize = Object.values(bundles).reduce(
|
|
243
|
-
(sum, bundle) => sum + Buffer.byteLength(bundle.code),
|
|
244
|
-
0
|
|
245
|
-
);
|
|
246
|
-
const handlerCount = Object.keys(bundles).length;
|
|
247
|
-
await writeAgentStoreEntry(agentName, {
|
|
248
|
-
hash,
|
|
249
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
250
|
-
workerUrl: agentWorkerUrl,
|
|
251
|
-
localPath: agentPath
|
|
252
|
-
});
|
|
253
|
-
p.log.success(
|
|
254
|
-
`${pc.bold(agentName)} pushed \xB7 ${handlerCount} handlers \xB7 ${formatBytes(totalSize)}`
|
|
255
|
-
);
|
|
256
|
-
p.note(`KV keys updated: ${manifestKey}, ${latestKey}`, "Cloudflare KV");
|
|
257
|
-
p.outro(`${LOGO} ${pc.green("Live at")} ${pc.cyan(agentWorkerUrl)}`);
|
|
258
|
-
}
|
|
259
|
-
});
|
|
260
|
-
export {
|
|
261
|
-
push_default as default
|
|
262
|
-
};
|
|
263
|
-
//# sourceMappingURL=push-XGNM2IEY.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/push.ts","../src/utils/manifest/index.ts","../src/utils/ir/hashIR.ts","../src/utils/validate.ts"],"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"],"mappings":"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","names":["access","rm","join","calculateAgentHash","join","access","rm"]}
|