@kalphq/cli 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{add-UCN5EAL3.js → add-KRHLYYTO.js} +10 -37
- package/dist/add-KRHLYYTO.js.map +1 -0
- package/dist/chunk-INB3LG6O.js +25 -0
- package/dist/chunk-INB3LG6O.js.map +1 -0
- package/dist/chunk-MMS3GWBG.js +50 -0
- package/dist/chunk-MMS3GWBG.js.map +1 -0
- package/dist/{create-PENWHZ26.js → create-7J5R6OVF.js} +44 -35
- package/dist/create-7J5R6OVF.js.map +1 -0
- package/dist/{delete-6MKUQ3XK.js → delete-47ZP6XRB.js} +10 -27
- package/dist/delete-47ZP6XRB.js.map +1 -0
- package/dist/index.js +10 -11
- package/dist/index.js.map +1 -1
- package/dist/{link-YCIA4JJ3.js → link-WZQSR2TM.js} +1 -2
- package/dist/{link-YCIA4JJ3.js.map → link-WZQSR2TM.js.map} +1 -1
- package/dist/{list-BOE33VSI.js → list-3ZQIFUOT.js} +1 -2
- package/dist/list-3ZQIFUOT.js.map +1 -0
- package/dist/{login-22HHVS52.js → login-JYPWGL6P.js} +1 -2
- package/dist/login-JYPWGL6P.js.map +1 -0
- package/dist/{logout-OJM3VAOF.js → logout-V67DZZXO.js} +1 -2
- package/dist/{logout-OJM3VAOF.js.map → logout-V67DZZXO.js.map} +1 -1
- package/dist/push-RBTBXCP7.js +205 -0
- package/dist/push-RBTBXCP7.js.map +1 -0
- package/dist/{secrets-SIK6J5AF.js → secrets-KFMVBKJQ.js} +8 -5
- package/dist/secrets-KFMVBKJQ.js.map +1 -0
- package/dist/sync-YFM5P3IS.js +120 -0
- package/dist/sync-YFM5P3IS.js.map +1 -0
- package/package.json +5 -5
- package/dist/acorn-I3UGQPDC.js +0 -3132
- package/dist/acorn-I3UGQPDC.js.map +0 -1
- package/dist/add-UCN5EAL3.js.map +0 -1
- package/dist/agents/b2b-sales/signals/.gitkeep +0 -0
- package/dist/agents/b2b-sales/webhooks/.gitkeep +0 -0
- package/dist/agents/customer-support/signals/.gitkeep +0 -0
- package/dist/agents/customer-support/webhooks/.gitkeep +0 -0
- package/dist/agents/financial-agent/signals/.gitkeep +0 -0
- package/dist/agents/financial-agent/webhooks/.gitkeep +0 -0
- package/dist/agents/minimal/signals/.gitkeep +0 -0
- package/dist/agents/minimal/webhooks/.gitkeep +0 -0
- package/dist/angular-5QCYWYQS.js +0 -3032
- package/dist/angular-5QCYWYQS.js.map +0 -1
- package/dist/babel-VVMWCS4G.js +0 -7298
- package/dist/babel-VVMWCS4G.js.map +0 -1
- package/dist/chunk-2H7UOFLK.js +0 -11
- package/dist/chunk-2H7UOFLK.js.map +0 -1
- package/dist/chunk-EAMMDUE3.js +0 -298
- package/dist/chunk-EAMMDUE3.js.map +0 -1
- package/dist/chunk-MECZEYSU.js +0 -19963
- package/dist/chunk-MECZEYSU.js.map +0 -1
- package/dist/chunk-TPTPZH2W.js +0 -40
- package/dist/chunk-TPTPZH2W.js.map +0 -1
- package/dist/create-PENWHZ26.js.map +0 -1
- package/dist/delete-6MKUQ3XK.js.map +0 -1
- package/dist/estree-3QNQSWX3.js +0 -4614
- package/dist/estree-3QNQSWX3.js.map +0 -1
- package/dist/flow-CCY52CGJ.js +0 -27548
- package/dist/flow-CCY52CGJ.js.map +0 -1
- package/dist/glimmer-WEH5BTZ2.js +0 -2896
- package/dist/glimmer-WEH5BTZ2.js.map +0 -1
- package/dist/graphql-UERTLN2S.js +0 -1268
- package/dist/graphql-UERTLN2S.js.map +0 -1
- package/dist/html-2G7A573F.js +0 -2928
- package/dist/html-2G7A573F.js.map +0 -1
- package/dist/init-WOEW2QED.js +0 -73
- package/dist/init-WOEW2QED.js.map +0 -1
- package/dist/list-BOE33VSI.js.map +0 -1
- package/dist/login-22HHVS52.js.map +0 -1
- package/dist/markdown-XILCBMG4.js +0 -3553
- package/dist/markdown-XILCBMG4.js.map +0 -1
- package/dist/meriyah-THC5AUEQ.js +0 -2686
- package/dist/meriyah-THC5AUEQ.js.map +0 -1
- package/dist/migrate-GA7EHSDG.js +0 -80
- package/dist/migrate-GA7EHSDG.js.map +0 -1
- package/dist/postcss-WBGWHY5F.js +0 -5082
- package/dist/postcss-WBGWHY5F.js.map +0 -1
- package/dist/push-2B4NWFGC.js +0 -81
- package/dist/push-2B4NWFGC.js.map +0 -1
- package/dist/secrets-SIK6J5AF.js.map +0 -1
- package/dist/templates/agents/b2b-sales/signals/.gitkeep +0 -0
- package/dist/templates/agents/b2b-sales/webhooks/.gitkeep +0 -0
- package/dist/templates/agents/customer-support/signals/.gitkeep +0 -0
- package/dist/templates/agents/customer-support/webhooks/.gitkeep +0 -0
- package/dist/templates/agents/financial-agent/signals/.gitkeep +0 -0
- package/dist/templates/agents/financial-agent/webhooks/.gitkeep +0 -0
- package/dist/templates/agents/minimal/signals/.gitkeep +0 -0
- package/dist/templates/agents/minimal/webhooks/.gitkeep +0 -0
- package/dist/typescript-NS3CY6IL.js +0 -13205
- package/dist/typescript-NS3CY6IL.js.map +0 -1
- package/dist/yaml-2RE4A77K.js +0 -4226
- package/dist/yaml-2RE4A77K.js.map +0 -1
- package/templates/project/meta/snapshot.json +0 -1
- package/templates/project/package.json +0 -16
- package/templates/project/tsconfig.json +0 -14
package/dist/chunk-2H7UOFLK.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __export = (target, all) => {
|
|
4
|
-
for (var name in all)
|
|
5
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
export {
|
|
9
|
-
__export
|
|
10
|
-
};
|
|
11
|
-
//# sourceMappingURL=chunk-2H7UOFLK.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/chunk-EAMMDUE3.js
DELETED
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// src/utils/manifest.ts
|
|
4
|
-
import { createHash } from "crypto";
|
|
5
|
-
import { existsSync } from "fs";
|
|
6
|
-
import {
|
|
7
|
-
access,
|
|
8
|
-
mkdtemp,
|
|
9
|
-
mkdir,
|
|
10
|
-
readFile,
|
|
11
|
-
readdir,
|
|
12
|
-
rm,
|
|
13
|
-
writeFile
|
|
14
|
-
} from "fs/promises";
|
|
15
|
-
import { join, resolve } from "path";
|
|
16
|
-
import { pathToFileURL } from "url";
|
|
17
|
-
import { build } from "esbuild";
|
|
18
|
-
import { zodToJsonSchema } from "zod-to-json-schema";
|
|
19
|
-
function asRecord(value) {
|
|
20
|
-
return typeof value === "object" && value !== null ? value : {};
|
|
21
|
-
}
|
|
22
|
-
function asString(value) {
|
|
23
|
-
return typeof value === "string" ? value : void 0;
|
|
24
|
-
}
|
|
25
|
-
function asArray(value) {
|
|
26
|
-
return Array.isArray(value) ? value : [];
|
|
27
|
-
}
|
|
28
|
-
function toJsonSchema(schema, name) {
|
|
29
|
-
try {
|
|
30
|
-
return zodToJsonSchema(schema, name);
|
|
31
|
-
} catch {
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
function serializeSystemPrompt(systemPrompt) {
|
|
36
|
-
if (typeof systemPrompt === "string") {
|
|
37
|
-
return { type: "static", value: systemPrompt };
|
|
38
|
-
}
|
|
39
|
-
if (typeof systemPrompt === "function") {
|
|
40
|
-
return { type: "dynamic" };
|
|
41
|
-
}
|
|
42
|
-
return { type: "none" };
|
|
43
|
-
}
|
|
44
|
-
function serializeSteps(steps) {
|
|
45
|
-
return steps.map((step, index) => {
|
|
46
|
-
const item = asRecord(step);
|
|
47
|
-
return {
|
|
48
|
-
id: asString(item.id) ?? `step_${index + 1}`,
|
|
49
|
-
order: index + 1,
|
|
50
|
-
description: asString(item.description) ?? "",
|
|
51
|
-
inputSchema: toJsonSchema(item.input, `step_${index + 1}_input`),
|
|
52
|
-
outputSchema: toJsonSchema(item.output, `step_${index + 1}_output`)
|
|
53
|
-
};
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
function serializeTools(tools) {
|
|
57
|
-
return tools.map((tool, index) => {
|
|
58
|
-
const item = asRecord(tool);
|
|
59
|
-
return {
|
|
60
|
-
id: asString(item.id) ?? `tool_${index + 1}`,
|
|
61
|
-
order: index + 1,
|
|
62
|
-
description: asString(item.description) ?? "",
|
|
63
|
-
inputSchema: toJsonSchema(item.input, `tool_${index + 1}_input`)
|
|
64
|
-
};
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
function serializeRoutes(routes) {
|
|
68
|
-
return routes.map((route, index) => {
|
|
69
|
-
const item = asRecord(route);
|
|
70
|
-
return {
|
|
71
|
-
id: asString(item.id) ?? `route_${index + 1}`,
|
|
72
|
-
order: index + 1,
|
|
73
|
-
method: asString(item.method) ?? "GET",
|
|
74
|
-
path: asString(item.path) ?? "/",
|
|
75
|
-
inputSchema: toJsonSchema(item.input, `route_${index + 1}_input`)
|
|
76
|
-
};
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
function serializeFlows(flows, stepIds) {
|
|
80
|
-
return flows.map((flow, index) => {
|
|
81
|
-
const item = asRecord(flow);
|
|
82
|
-
const steps = asArray(item.steps).map((s, stepIndex) => {
|
|
83
|
-
const step = asRecord(s);
|
|
84
|
-
const stepId = asString(step.id) ?? `step_${stepIndex + 1}`;
|
|
85
|
-
return {
|
|
86
|
-
order: stepIndex + 1,
|
|
87
|
-
stepId,
|
|
88
|
-
existsInAgentSteps: stepIds.has(stepId)
|
|
89
|
-
};
|
|
90
|
-
});
|
|
91
|
-
return {
|
|
92
|
-
id: asString(item.id) ?? `flow_${index + 1}`,
|
|
93
|
-
order: index + 1,
|
|
94
|
-
description: asString(item.description) ?? "",
|
|
95
|
-
steps
|
|
96
|
-
};
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
async function loadAgentModule(agentPath, cwd) {
|
|
100
|
-
const tempDir = await mkdtemp(join(cwd, ".kalp-manifest-"));
|
|
101
|
-
const outFile = join(tempDir, "agent.manifest.mjs");
|
|
102
|
-
await build({
|
|
103
|
-
entryPoints: [agentPath],
|
|
104
|
-
outfile: outFile,
|
|
105
|
-
bundle: true,
|
|
106
|
-
format: "esm",
|
|
107
|
-
platform: "node",
|
|
108
|
-
target: "node18",
|
|
109
|
-
logLevel: "silent",
|
|
110
|
-
packages: "external",
|
|
111
|
-
plugins: [
|
|
112
|
-
{
|
|
113
|
-
name: "relative-js-to-ts",
|
|
114
|
-
setup(buildCtx) {
|
|
115
|
-
buildCtx.onResolve({ filter: /^\.+\/.*\.js$/ }, (args) => {
|
|
116
|
-
const resolved = resolve(args.resolveDir, args.path);
|
|
117
|
-
if (existsSync(resolved)) {
|
|
118
|
-
return { path: resolved };
|
|
119
|
-
}
|
|
120
|
-
const tsPath = resolved.replace(/\.js$/, ".ts");
|
|
121
|
-
if (existsSync(tsPath)) {
|
|
122
|
-
return { path: tsPath };
|
|
123
|
-
}
|
|
124
|
-
const tsxPath = resolved.replace(/\.js$/, ".tsx");
|
|
125
|
-
if (existsSync(tsxPath)) {
|
|
126
|
-
return { path: tsxPath };
|
|
127
|
-
}
|
|
128
|
-
return null;
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
]
|
|
133
|
-
});
|
|
134
|
-
const loaded = await import(`${pathToFileURL(outFile).href}?t=${Date.now()}`);
|
|
135
|
-
return {
|
|
136
|
-
agent: loaded.default,
|
|
137
|
-
tempDir
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
async function readAgentManifest(params) {
|
|
141
|
-
const { cwd, agentName } = params;
|
|
142
|
-
const agentPath = join(cwd, "agents", agentName, "index.ts");
|
|
143
|
-
await access(agentPath);
|
|
144
|
-
let tempDir;
|
|
145
|
-
try {
|
|
146
|
-
const loaded = await loadAgentModule(agentPath, cwd);
|
|
147
|
-
tempDir = loaded.tempDir;
|
|
148
|
-
const agent = asRecord(loaded.agent);
|
|
149
|
-
const steps = serializeSteps(asArray(agent.steps));
|
|
150
|
-
const tools = serializeTools(asArray(agent.tools));
|
|
151
|
-
const routes = serializeRoutes(asArray(agent.routes));
|
|
152
|
-
const stepIds = new Set(steps.map((step) => step.id));
|
|
153
|
-
const flows = serializeFlows(asArray(agent.flows), stepIds);
|
|
154
|
-
return {
|
|
155
|
-
format: "kalp-agent-manifest",
|
|
156
|
-
schemaVersion: 1,
|
|
157
|
-
generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
158
|
-
agent: {
|
|
159
|
-
id: asString(agent.id),
|
|
160
|
-
name: asString(agent.name) ?? agentName,
|
|
161
|
-
description: asString(agent.description) ?? "",
|
|
162
|
-
systemPrompt: serializeSystemPrompt(agent.systemPrompt),
|
|
163
|
-
lifecycle: {
|
|
164
|
-
onInit: typeof agent.onInit === "function",
|
|
165
|
-
onMessage: typeof agent.onMessage === "function",
|
|
166
|
-
onTick: typeof agent.onTick === "function"
|
|
167
|
-
},
|
|
168
|
-
actions: {
|
|
169
|
-
ai: true,
|
|
170
|
-
wait: true,
|
|
171
|
-
fetch: true,
|
|
172
|
-
runStep: true,
|
|
173
|
-
callTool: true,
|
|
174
|
-
runFlow: true
|
|
175
|
-
},
|
|
176
|
-
steps,
|
|
177
|
-
tools,
|
|
178
|
-
routes,
|
|
179
|
-
flows,
|
|
180
|
-
execution: {
|
|
181
|
-
stepOrder: steps.map((step) => step.id),
|
|
182
|
-
toolOrder: tools.map((tool) => tool.id),
|
|
183
|
-
routeOrder: routes.map((route) => route.id),
|
|
184
|
-
flowOrder: flows.map((flow) => flow.id)
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
};
|
|
188
|
-
} finally {
|
|
189
|
-
if (tempDir) {
|
|
190
|
-
await rm(tempDir, { recursive: true, force: true });
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
function getHash(payload) {
|
|
195
|
-
return createHash("sha256").update(payload).digest("hex");
|
|
196
|
-
}
|
|
197
|
-
function isManifestVersionFile(fileName) {
|
|
198
|
-
return fileName.endsWith(".json");
|
|
199
|
-
}
|
|
200
|
-
function createVersionId(payload, generatedAt) {
|
|
201
|
-
return createHash("sha256").update(payload).update(generatedAt).digest("hex").slice(0, 8);
|
|
202
|
-
}
|
|
203
|
-
async function readManifestVersionFile(filePath) {
|
|
204
|
-
try {
|
|
205
|
-
const src = await readFile(filePath, "utf-8");
|
|
206
|
-
return JSON.parse(src);
|
|
207
|
-
} catch {
|
|
208
|
-
return null;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
async function writeVersionedManifest(params) {
|
|
212
|
-
const { cwd, agentName, manifest } = params;
|
|
213
|
-
const agentMetaDir = join(cwd, "meta", "migrations", agentName);
|
|
214
|
-
await mkdir(agentMetaDir, { recursive: true });
|
|
215
|
-
const files = await readdir(agentMetaDir);
|
|
216
|
-
const versionFiles = files.filter(isManifestVersionFile);
|
|
217
|
-
const existingRecords = (await Promise.all(
|
|
218
|
-
versionFiles.map(
|
|
219
|
-
(file) => readManifestVersionFile(join(agentMetaDir, file))
|
|
220
|
-
)
|
|
221
|
-
)).filter((record2) => record2 !== null);
|
|
222
|
-
const latestVersion = existingRecords.map((record2) => record2.version).sort((a, b) => a - b).at(-1) ?? 0;
|
|
223
|
-
const nextVersion = latestVersion + 1;
|
|
224
|
-
const payload = JSON.stringify(manifest);
|
|
225
|
-
const generatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
226
|
-
const versionId = createVersionId(payload, generatedAt);
|
|
227
|
-
const record = {
|
|
228
|
-
version: nextVersion,
|
|
229
|
-
versionId,
|
|
230
|
-
hash: getHash(payload),
|
|
231
|
-
generatedAt,
|
|
232
|
-
immutable: true,
|
|
233
|
-
manifest
|
|
234
|
-
};
|
|
235
|
-
const versionFile = join(agentMetaDir, `${versionId}.json`);
|
|
236
|
-
await writeFile(versionFile, JSON.stringify(record, null, 2) + "\n", "utf-8");
|
|
237
|
-
const snapshotPath = join(cwd, "meta", "snapshot.json");
|
|
238
|
-
const snapshot = await readSnapshot(snapshotPath);
|
|
239
|
-
const prev = snapshot[agentName] ?? { latest: "", versions: [] };
|
|
240
|
-
const versions = prev.versions.includes(versionId) ? prev.versions : [...prev.versions, versionId];
|
|
241
|
-
snapshot[agentName] = { latest: versionId, versions };
|
|
242
|
-
await writeFile(
|
|
243
|
-
snapshotPath,
|
|
244
|
-
JSON.stringify(snapshot, null, 2) + "\n",
|
|
245
|
-
"utf-8"
|
|
246
|
-
);
|
|
247
|
-
return {
|
|
248
|
-
...record,
|
|
249
|
-
outputPath: versionFile
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
async function readLatestVersionedManifest(params) {
|
|
253
|
-
const { cwd, agentName } = params;
|
|
254
|
-
const agentMetaDir = join(cwd, "meta", "migrations", agentName);
|
|
255
|
-
const snapshotPath = join(cwd, "meta", "snapshot.json");
|
|
256
|
-
const snapshot = await readSnapshot(snapshotPath);
|
|
257
|
-
const agentEntry = snapshot[agentName];
|
|
258
|
-
if (agentEntry?.latest) {
|
|
259
|
-
const latestFile = join(agentMetaDir, `${agentEntry.latest}.json`);
|
|
260
|
-
const latest = await readManifestVersionFile(latestFile);
|
|
261
|
-
if (latest) {
|
|
262
|
-
return {
|
|
263
|
-
...latest,
|
|
264
|
-
outputPath: latestFile
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
const files = await readdir(agentMetaDir).catch(() => []);
|
|
269
|
-
const records = (await Promise.all(
|
|
270
|
-
files.filter(isManifestVersionFile).map((file) => readManifestVersionFile(join(agentMetaDir, file)))
|
|
271
|
-
)).filter((record) => record !== null);
|
|
272
|
-
if (records.length === 0) {
|
|
273
|
-
return null;
|
|
274
|
-
}
|
|
275
|
-
const newest = records.sort((a, b) => b.version - a.version)[0] ?? null;
|
|
276
|
-
if (!newest) {
|
|
277
|
-
return null;
|
|
278
|
-
}
|
|
279
|
-
return {
|
|
280
|
-
...newest,
|
|
281
|
-
outputPath: join(agentMetaDir, `${newest.versionId}.json`)
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
async function readSnapshot(snapshotPath) {
|
|
285
|
-
try {
|
|
286
|
-
const src = await readFile(snapshotPath, "utf-8");
|
|
287
|
-
return JSON.parse(src);
|
|
288
|
-
} catch {
|
|
289
|
-
return {};
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
export {
|
|
294
|
-
readAgentManifest,
|
|
295
|
-
writeVersionedManifest,
|
|
296
|
-
readLatestVersionedManifest
|
|
297
|
-
};
|
|
298
|
-
//# sourceMappingURL=chunk-EAMMDUE3.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/manifest.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport {\n access,\n mkdtemp,\n mkdir,\n readFile,\n readdir,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { build } from \"esbuild\";\nimport type { ZodTypeAny } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\n\nexport interface AgentManifestV1 {\n format: \"kalp-agent-manifest\";\n schemaVersion: 1;\n generatedAt: string;\n agent: {\n id?: string;\n name: string;\n description: string;\n systemPrompt:\n | { type: \"static\"; value: string }\n | { type: \"dynamic\" }\n | { type: \"none\" };\n lifecycle: {\n onInit: boolean;\n onMessage: boolean;\n onTick: boolean;\n };\n actions: {\n ai: boolean;\n wait: boolean;\n fetch: boolean;\n runStep: boolean;\n callTool: boolean;\n runFlow: boolean;\n };\n steps: Array<{\n id: string;\n order: number;\n description: string;\n inputSchema: Record<string, unknown> | null;\n outputSchema: Record<string, unknown> | null;\n }>;\n tools: Array<{\n id: string;\n order: number;\n description: string;\n inputSchema: Record<string, unknown> | null;\n }>;\n routes: Array<{\n id: string;\n order: number;\n method: string;\n path: string;\n inputSchema: Record<string, unknown> | null;\n }>;\n flows: Array<{\n id: string;\n order: number;\n description: string;\n steps: Array<{\n order: number;\n stepId: string;\n existsInAgentSteps: boolean;\n }>;\n }>;\n execution: {\n stepOrder: string[];\n toolOrder: string[];\n routeOrder: string[];\n flowOrder: string[];\n };\n };\n}\n\nexport interface ManifestVersionRecord {\n version: number;\n versionId: string;\n hash: string;\n generatedAt: string;\n immutable: true;\n manifest: AgentManifestV1;\n}\n\ninterface ManifestRegistryEntry {\n latest: string;\n versions: string[];\n}\n\ninterface LoadedAgentModule {\n agent: unknown;\n tempDir: string;\n}\n\ninterface AgentItemWithInput {\n id?: unknown;\n description?: unknown;\n input?: unknown;\n}\n\ninterface AgentStepItem extends AgentItemWithInput {\n output?: unknown;\n}\n\ninterface AgentRouteItem extends AgentItemWithInput {\n method?: unknown;\n path?: unknown;\n}\n\ninterface AgentFlowItem {\n id?: unknown;\n description?: unknown;\n steps?: unknown;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction asArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction toJsonSchema(\n schema: unknown,\n name: string,\n): Record<string, unknown> | null {\n try {\n return zodToJsonSchema(schema as ZodTypeAny, name) as Record<\n string,\n unknown\n >;\n } catch {\n return null;\n }\n}\n\nfunction serializeSystemPrompt(\n systemPrompt: unknown,\n): AgentManifestV1[\"agent\"][\"systemPrompt\"] {\n if (typeof systemPrompt === \"string\") {\n return { type: \"static\", value: systemPrompt };\n }\n\n if (typeof systemPrompt === \"function\") {\n return { type: \"dynamic\" };\n }\n\n return { type: \"none\" };\n}\n\nfunction serializeSteps(steps: unknown[]): AgentManifestV1[\"agent\"][\"steps\"] {\n return steps.map((step, index) => {\n const item = asRecord(step) as AgentStepItem;\n return {\n id: asString(item.id) ?? `step_${index + 1}`,\n order: index + 1,\n description: asString(item.description) ?? \"\",\n inputSchema: toJsonSchema(item.input, `step_${index + 1}_input`),\n outputSchema: toJsonSchema(item.output, `step_${index + 1}_output`),\n };\n });\n}\n\nfunction serializeTools(tools: unknown[]): AgentManifestV1[\"agent\"][\"tools\"] {\n return tools.map((tool, index) => {\n const item = asRecord(tool) as AgentItemWithInput;\n return {\n id: asString(item.id) ?? `tool_${index + 1}`,\n order: index + 1,\n description: asString(item.description) ?? \"\",\n inputSchema: toJsonSchema(item.input, `tool_${index + 1}_input`),\n };\n });\n}\n\nfunction serializeRoutes(\n routes: unknown[],\n): AgentManifestV1[\"agent\"][\"routes\"] {\n return routes.map((route, index) => {\n const item = asRecord(route) as AgentRouteItem;\n return {\n id: asString(item.id) ?? `route_${index + 1}`,\n order: index + 1,\n method: asString(item.method) ?? \"GET\",\n path: asString(item.path) ?? \"/\",\n inputSchema: toJsonSchema(item.input, `route_${index + 1}_input`),\n };\n });\n}\n\nfunction serializeFlows(\n flows: unknown[],\n stepIds: Set<string>,\n): AgentManifestV1[\"agent\"][\"flows\"] {\n return flows.map((flow, index) => {\n const item = asRecord(flow) as AgentFlowItem;\n const steps = asArray(item.steps).map((s, stepIndex) => {\n const step = asRecord(s);\n const stepId = asString(step.id) ?? `step_${stepIndex + 1}`;\n return {\n order: stepIndex + 1,\n stepId,\n existsInAgentSteps: stepIds.has(stepId),\n };\n });\n\n return {\n id: asString(item.id) ?? `flow_${index + 1}`,\n order: index + 1,\n description: asString(item.description) ?? \"\",\n steps,\n };\n });\n}\n\nasync function loadAgentModule(\n agentPath: string,\n cwd: string,\n): Promise<LoadedAgentModule> {\n const tempDir = await mkdtemp(join(cwd, \".kalp-manifest-\"));\n const outFile = join(tempDir, \"agent.manifest.mjs\");\n\n await build({\n entryPoints: [agentPath],\n outfile: outFile,\n bundle: true,\n format: \"esm\",\n platform: \"node\",\n target: \"node18\",\n logLevel: \"silent\",\n packages: \"external\",\n plugins: [\n {\n name: \"relative-js-to-ts\",\n setup(buildCtx) {\n buildCtx.onResolve({ filter: /^\\.+\\/.*\\.js$/ }, (args) => {\n const resolved = resolve(args.resolveDir, args.path);\n if (existsSync(resolved)) {\n return { path: resolved };\n }\n\n const tsPath = resolved.replace(/\\.js$/, \".ts\");\n if (existsSync(tsPath)) {\n return { path: tsPath };\n }\n\n const tsxPath = resolved.replace(/\\.js$/, \".tsx\");\n if (existsSync(tsxPath)) {\n return { path: tsxPath };\n }\n\n return null;\n });\n },\n },\n ],\n });\n\n const loaded = (await import(\n `${pathToFileURL(outFile).href}?t=${Date.now()}`\n )) as { default?: unknown };\n\n return {\n agent: loaded.default,\n tempDir,\n };\n}\n\nexport async function readAgentManifest(params: {\n cwd: string;\n agentName: string;\n}): Promise<AgentManifestV1> {\n const { cwd, agentName } = params;\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n await access(agentPath);\n\n let tempDir: string | undefined;\n\n try {\n const loaded = await loadAgentModule(agentPath, cwd);\n tempDir = loaded.tempDir;\n const agent = asRecord(loaded.agent);\n const steps = serializeSteps(asArray(agent.steps));\n const tools = serializeTools(asArray(agent.tools));\n const routes = serializeRoutes(asArray(agent.routes));\n const stepIds = new Set(steps.map((step) => step.id));\n const flows = serializeFlows(asArray(agent.flows), stepIds);\n\n return {\n format: \"kalp-agent-manifest\",\n schemaVersion: 1,\n generatedAt: new Date().toISOString(),\n agent: {\n id: asString(agent.id),\n name: asString(agent.name) ?? agentName,\n description: asString(agent.description) ?? \"\",\n systemPrompt: serializeSystemPrompt(agent.systemPrompt),\n lifecycle: {\n onInit: typeof agent.onInit === \"function\",\n onMessage: typeof agent.onMessage === \"function\",\n onTick: typeof agent.onTick === \"function\",\n },\n actions: {\n ai: true,\n wait: true,\n fetch: true,\n runStep: true,\n callTool: true,\n runFlow: true,\n },\n steps,\n tools,\n routes,\n flows,\n execution: {\n stepOrder: steps.map((step) => step.id),\n toolOrder: tools.map((tool) => tool.id),\n routeOrder: routes.map((route) => route.id),\n flowOrder: flows.map((flow) => flow.id),\n },\n },\n };\n } finally {\n if (tempDir) {\n await rm(tempDir, { recursive: true, force: true });\n }\n }\n}\n\nfunction getHash(payload: string): string {\n return createHash(\"sha256\").update(payload).digest(\"hex\");\n}\n\nfunction isManifestVersionFile(fileName: string): boolean {\n return fileName.endsWith(\".json\");\n}\n\nfunction createVersionId(payload: string, generatedAt: string): string {\n return createHash(\"sha256\")\n .update(payload)\n .update(generatedAt)\n .digest(\"hex\")\n .slice(0, 8);\n}\n\nasync function readManifestVersionFile(\n filePath: string,\n): Promise<ManifestVersionRecord | null> {\n try {\n const src = await readFile(filePath, \"utf-8\");\n return JSON.parse(src) as ManifestVersionRecord;\n } catch {\n return null;\n }\n}\n\nexport async function writeVersionedManifest(params: {\n cwd: string;\n agentName: string;\n manifest: AgentManifestV1;\n}): Promise<ManifestVersionRecord & { outputPath: string }> {\n const { cwd, agentName, manifest } = params;\n const agentMetaDir = join(cwd, \"meta\", \"migrations\", agentName);\n await mkdir(agentMetaDir, { recursive: true });\n\n const files = await readdir(agentMetaDir);\n const versionFiles = files.filter(isManifestVersionFile);\n const existingRecords = (\n await Promise.all(\n versionFiles.map((file) =>\n readManifestVersionFile(join(agentMetaDir, file)),\n ),\n )\n ).filter((record): record is ManifestVersionRecord => record !== null);\n\n const latestVersion =\n existingRecords\n .map((record) => record.version)\n .sort((a, b) => a - b)\n .at(-1) ?? 0;\n const nextVersion = latestVersion + 1;\n\n const payload = JSON.stringify(manifest);\n const generatedAt = new Date().toISOString();\n const versionId = createVersionId(payload, generatedAt);\n const record: ManifestVersionRecord = {\n version: nextVersion,\n versionId,\n hash: getHash(payload),\n generatedAt,\n immutable: true,\n manifest,\n };\n\n const versionFile = join(agentMetaDir, `${versionId}.json`);\n await writeFile(versionFile, JSON.stringify(record, null, 2) + \"\\n\", \"utf-8\");\n\n const snapshotPath = join(cwd, \"meta\", \"snapshot.json\");\n const snapshot = await readSnapshot(snapshotPath);\n const prev = snapshot[agentName] ?? { latest: \"\", versions: [] };\n const versions = prev.versions.includes(versionId)\n ? prev.versions\n : [...prev.versions, versionId];\n snapshot[agentName] = { latest: versionId, versions };\n await writeFile(\n snapshotPath,\n JSON.stringify(snapshot, null, 2) + \"\\n\",\n \"utf-8\",\n );\n\n return {\n ...record,\n outputPath: versionFile,\n };\n}\n\nexport async function readLatestVersionedManifest(params: {\n cwd: string;\n agentName: string;\n}): Promise<(ManifestVersionRecord & { outputPath: string }) | null> {\n const { cwd, agentName } = params;\n const agentMetaDir = join(cwd, \"meta\", \"migrations\", agentName);\n const snapshotPath = join(cwd, \"meta\", \"snapshot.json\");\n\n // Try to read from snapshot first\n const snapshot = await readSnapshot(snapshotPath);\n const agentEntry = snapshot[agentName];\n\n if (agentEntry?.latest) {\n const latestFile = join(agentMetaDir, `${agentEntry.latest}.json`);\n const latest = await readManifestVersionFile(latestFile);\n if (latest) {\n return {\n ...latest,\n outputPath: latestFile,\n };\n }\n }\n\n // Fallback: scan directory and find latest by version number\n const files = await readdir(agentMetaDir).catch(() => [] as string[]);\n const records = (\n await Promise.all(\n files\n .filter(isManifestVersionFile)\n .map((file) => readManifestVersionFile(join(agentMetaDir, file))),\n )\n ).filter((record): record is ManifestVersionRecord => record !== null);\n\n if (records.length === 0) {\n return null;\n }\n\n const newest = records.sort((a, b) => b.version - a.version)[0] ?? null;\n if (!newest) {\n return null;\n }\n\n return {\n ...newest,\n outputPath: join(agentMetaDir, `${newest.versionId}.json`),\n };\n}\n\nasync function readSnapshot(\n snapshotPath: string,\n): Promise<Record<string, ManifestRegistryEntry>> {\n try {\n const src = await readFile(snapshotPath, \"utf-8\");\n return JSON.parse(src) as Record<string, ManifestRegistryEntry>;\n } catch {\n return {};\n }\n}\n"],"mappings":";;;AAAA,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,MAAM,eAAe;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,aAAa;AAEtB,SAAS,uBAAuB;AA0GhC,SAAS,SAAS,OAAyC;AACzD,SAAO,OAAO,UAAU,YAAY,UAAU,OACzC,QACD,CAAC;AACP;AAEA,SAAS,SAAS,OAAoC;AACpD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,QAAQ,OAA2B;AAC1C,SAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AACzC;AAEA,SAAS,aACP,QACA,MACgC;AAChC,MAAI;AACF,WAAO,gBAAgB,QAAsB,IAAI;AAAA,EAInD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,sBACP,cAC0C;AAC1C,MAAI,OAAO,iBAAiB,UAAU;AACpC,WAAO,EAAE,MAAM,UAAU,OAAO,aAAa;AAAA,EAC/C;AAEA,MAAI,OAAO,iBAAiB,YAAY;AACtC,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AAEA,SAAO,EAAE,MAAM,OAAO;AACxB;AAEA,SAAS,eAAe,OAAqD;AAC3E,SAAO,MAAM,IAAI,CAAC,MAAM,UAAU;AAChC,UAAM,OAAO,SAAS,IAAI;AAC1B,WAAO;AAAA,MACL,IAAI,SAAS,KAAK,EAAE,KAAK,QAAQ,QAAQ,CAAC;AAAA,MAC1C,OAAO,QAAQ;AAAA,MACf,aAAa,SAAS,KAAK,WAAW,KAAK;AAAA,MAC3C,aAAa,aAAa,KAAK,OAAO,QAAQ,QAAQ,CAAC,QAAQ;AAAA,MAC/D,cAAc,aAAa,KAAK,QAAQ,QAAQ,QAAQ,CAAC,SAAS;AAAA,IACpE;AAAA,EACF,CAAC;AACH;AAEA,SAAS,eAAe,OAAqD;AAC3E,SAAO,MAAM,IAAI,CAAC,MAAM,UAAU;AAChC,UAAM,OAAO,SAAS,IAAI;AAC1B,WAAO;AAAA,MACL,IAAI,SAAS,KAAK,EAAE,KAAK,QAAQ,QAAQ,CAAC;AAAA,MAC1C,OAAO,QAAQ;AAAA,MACf,aAAa,SAAS,KAAK,WAAW,KAAK;AAAA,MAC3C,aAAa,aAAa,KAAK,OAAO,QAAQ,QAAQ,CAAC,QAAQ;AAAA,IACjE;AAAA,EACF,CAAC;AACH;AAEA,SAAS,gBACP,QACoC;AACpC,SAAO,OAAO,IAAI,CAAC,OAAO,UAAU;AAClC,UAAM,OAAO,SAAS,KAAK;AAC3B,WAAO;AAAA,MACL,IAAI,SAAS,KAAK,EAAE,KAAK,SAAS,QAAQ,CAAC;AAAA,MAC3C,OAAO,QAAQ;AAAA,MACf,QAAQ,SAAS,KAAK,MAAM,KAAK;AAAA,MACjC,MAAM,SAAS,KAAK,IAAI,KAAK;AAAA,MAC7B,aAAa,aAAa,KAAK,OAAO,SAAS,QAAQ,CAAC,QAAQ;AAAA,IAClE;AAAA,EACF,CAAC;AACH;AAEA,SAAS,eACP,OACA,SACmC;AACnC,SAAO,MAAM,IAAI,CAAC,MAAM,UAAU;AAChC,UAAM,OAAO,SAAS,IAAI;AAC1B,UAAM,QAAQ,QAAQ,KAAK,KAAK,EAAE,IAAI,CAAC,GAAG,cAAc;AACtD,YAAM,OAAO,SAAS,CAAC;AACvB,YAAM,SAAS,SAAS,KAAK,EAAE,KAAK,QAAQ,YAAY,CAAC;AACzD,aAAO;AAAA,QACL,OAAO,YAAY;AAAA,QACnB;AAAA,QACA,oBAAoB,QAAQ,IAAI,MAAM;AAAA,MACxC;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,IAAI,SAAS,KAAK,EAAE,KAAK,QAAQ,QAAQ,CAAC;AAAA,MAC1C,OAAO,QAAQ;AAAA,MACf,aAAa,SAAS,KAAK,WAAW,KAAK;AAAA,MAC3C;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,eAAe,gBACb,WACA,KAC4B;AAC5B,QAAM,UAAU,MAAM,QAAQ,KAAK,KAAK,iBAAiB,CAAC;AAC1D,QAAM,UAAU,KAAK,SAAS,oBAAoB;AAElD,QAAM,MAAM;AAAA,IACV,aAAa,CAAC,SAAS;AAAA,IACvB,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM,UAAU;AACd,mBAAS,UAAU,EAAE,QAAQ,gBAAgB,GAAG,CAAC,SAAS;AACxD,kBAAM,WAAW,QAAQ,KAAK,YAAY,KAAK,IAAI;AACnD,gBAAI,WAAW,QAAQ,GAAG;AACxB,qBAAO,EAAE,MAAM,SAAS;AAAA,YAC1B;AAEA,kBAAM,SAAS,SAAS,QAAQ,SAAS,KAAK;AAC9C,gBAAI,WAAW,MAAM,GAAG;AACtB,qBAAO,EAAE,MAAM,OAAO;AAAA,YACxB;AAEA,kBAAM,UAAU,SAAS,QAAQ,SAAS,MAAM;AAChD,gBAAI,WAAW,OAAO,GAAG;AACvB,qBAAO,EAAE,MAAM,QAAQ;AAAA,YACzB;AAEA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,SAAU,MAAM,OACpB,GAAG,cAAc,OAAO,EAAE,IAAI,MAAM,KAAK,IAAI,CAAC;AAGhD,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd;AAAA,EACF;AACF;AAEA,eAAsB,kBAAkB,QAGX;AAC3B,QAAM,EAAE,KAAK,UAAU,IAAI;AAC3B,QAAM,YAAY,KAAK,KAAK,UAAU,WAAW,UAAU;AAC3D,QAAM,OAAO,SAAS;AAEtB,MAAI;AAEJ,MAAI;AACF,UAAM,SAAS,MAAM,gBAAgB,WAAW,GAAG;AACnD,cAAU,OAAO;AACjB,UAAM,QAAQ,SAAS,OAAO,KAAK;AACnC,UAAM,QAAQ,eAAe,QAAQ,MAAM,KAAK,CAAC;AACjD,UAAM,QAAQ,eAAe,QAAQ,MAAM,KAAK,CAAC;AACjD,UAAM,SAAS,gBAAgB,QAAQ,MAAM,MAAM,CAAC;AACpD,UAAM,UAAU,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AACpD,UAAM,QAAQ,eAAe,QAAQ,MAAM,KAAK,GAAG,OAAO;AAE1D,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,OAAO;AAAA,QACL,IAAI,SAAS,MAAM,EAAE;AAAA,QACrB,MAAM,SAAS,MAAM,IAAI,KAAK;AAAA,QAC9B,aAAa,SAAS,MAAM,WAAW,KAAK;AAAA,QAC5C,cAAc,sBAAsB,MAAM,YAAY;AAAA,QACtD,WAAW;AAAA,UACT,QAAQ,OAAO,MAAM,WAAW;AAAA,UAChC,WAAW,OAAO,MAAM,cAAc;AAAA,UACtC,QAAQ,OAAO,MAAM,WAAW;AAAA,QAClC;AAAA,QACA,SAAS;AAAA,UACP,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAU;AAAA,UACV,SAAS;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW;AAAA,UACT,WAAW,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,UACtC,WAAW,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,UACtC,YAAY,OAAO,IAAI,CAAC,UAAU,MAAM,EAAE;AAAA,UAC1C,WAAW,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAE;AACA,QAAI,SAAS;AACX,YAAM,GAAG,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACpD;AAAA,EACF;AACF;AAEA,SAAS,QAAQ,SAAyB;AACxC,SAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAC1D;AAEA,SAAS,sBAAsB,UAA2B;AACxD,SAAO,SAAS,SAAS,OAAO;AAClC;AAEA,SAAS,gBAAgB,SAAiB,aAA6B;AACrE,SAAO,WAAW,QAAQ,EACvB,OAAO,OAAO,EACd,OAAO,WAAW,EAClB,OAAO,KAAK,EACZ,MAAM,GAAG,CAAC;AACf;AAEA,eAAe,wBACb,UACuC;AACvC,MAAI;AACF,UAAM,MAAM,MAAM,SAAS,UAAU,OAAO;AAC5C,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,uBAAuB,QAIe;AAC1D,QAAM,EAAE,KAAK,WAAW,SAAS,IAAI;AACrC,QAAM,eAAe,KAAK,KAAK,QAAQ,cAAc,SAAS;AAC9D,QAAM,MAAM,cAAc,EAAE,WAAW,KAAK,CAAC;AAE7C,QAAM,QAAQ,MAAM,QAAQ,YAAY;AACxC,QAAM,eAAe,MAAM,OAAO,qBAAqB;AACvD,QAAM,mBACJ,MAAM,QAAQ;AAAA,IACZ,aAAa;AAAA,MAAI,CAAC,SAChB,wBAAwB,KAAK,cAAc,IAAI,CAAC;AAAA,IAClD;AAAA,EACF,GACA,OAAO,CAACA,YAA4CA,YAAW,IAAI;AAErE,QAAM,gBACJ,gBACG,IAAI,CAACA,YAAWA,QAAO,OAAO,EAC9B,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,EACpB,GAAG,EAAE,KAAK;AACf,QAAM,cAAc,gBAAgB;AAEpC,QAAM,UAAU,KAAK,UAAU,QAAQ;AACvC,QAAM,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC3C,QAAM,YAAY,gBAAgB,SAAS,WAAW;AACtD,QAAM,SAAgC;AAAA,IACpC,SAAS;AAAA,IACT;AAAA,IACA,MAAM,QAAQ,OAAO;AAAA,IACrB;AAAA,IACA,WAAW;AAAA,IACX;AAAA,EACF;AAEA,QAAM,cAAc,KAAK,cAAc,GAAG,SAAS,OAAO;AAC1D,QAAM,UAAU,aAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,MAAM,OAAO;AAE5E,QAAM,eAAe,KAAK,KAAK,QAAQ,eAAe;AACtD,QAAM,WAAW,MAAM,aAAa,YAAY;AAChD,QAAM,OAAO,SAAS,SAAS,KAAK,EAAE,QAAQ,IAAI,UAAU,CAAC,EAAE;AAC/D,QAAM,WAAW,KAAK,SAAS,SAAS,SAAS,IAC7C,KAAK,WACL,CAAC,GAAG,KAAK,UAAU,SAAS;AAChC,WAAS,SAAS,IAAI,EAAE,QAAQ,WAAW,SAAS;AACpD,QAAM;AAAA,IACJ;AAAA,IACA,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI;AAAA,IACpC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY;AAAA,EACd;AACF;AAEA,eAAsB,4BAA4B,QAGmB;AACnE,QAAM,EAAE,KAAK,UAAU,IAAI;AAC3B,QAAM,eAAe,KAAK,KAAK,QAAQ,cAAc,SAAS;AAC9D,QAAM,eAAe,KAAK,KAAK,QAAQ,eAAe;AAGtD,QAAM,WAAW,MAAM,aAAa,YAAY;AAChD,QAAM,aAAa,SAAS,SAAS;AAErC,MAAI,YAAY,QAAQ;AACtB,UAAM,aAAa,KAAK,cAAc,GAAG,WAAW,MAAM,OAAO;AACjE,UAAM,SAAS,MAAM,wBAAwB,UAAU;AACvD,QAAI,QAAQ;AACV,aAAO;AAAA,QACL,GAAG;AAAA,QACH,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAGA,QAAM,QAAQ,MAAM,QAAQ,YAAY,EAAE,MAAM,MAAM,CAAC,CAAa;AACpE,QAAM,WACJ,MAAM,QAAQ;AAAA,IACZ,MACG,OAAO,qBAAqB,EAC5B,IAAI,CAAC,SAAS,wBAAwB,KAAK,cAAc,IAAI,CAAC,CAAC;AAAA,EACpE,GACA,OAAO,CAAC,WAA4C,WAAW,IAAI;AAErE,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,KAAK;AACnE,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY,KAAK,cAAc,GAAG,OAAO,SAAS,OAAO;AAAA,EAC3D;AACF;AAEA,eAAe,aACb,cACgD;AAChD,MAAI;AACF,UAAM,MAAM,MAAM,SAAS,cAAc,OAAO;AAChD,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;","names":["record"]}
|