@kalphq/cli 0.0.0-dev-20260416091527 → 0.0.0-dev-20260420023057

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/add-5NOYFTJV.js +133 -0
  2. package/dist/add-5NOYFTJV.js.map +1 -0
  3. package/dist/build-SUIPVJO6.js +80 -0
  4. package/dist/build-SUIPVJO6.js.map +1 -0
  5. package/dist/chunk-6LLXGS2P.js +25 -0
  6. package/dist/chunk-6LLXGS2P.js.map +1 -0
  7. package/dist/chunk-CJCIZDCF.js +298 -0
  8. package/dist/chunk-CJCIZDCF.js.map +1 -0
  9. package/dist/{chunk-GFEVTHUW.js → chunk-HD5FT7T6.js} +98 -65
  10. package/dist/chunk-HD5FT7T6.js.map +1 -0
  11. package/dist/{create-XJURMQC4.js → create-RSQEKCI6.js} +6 -5
  12. package/dist/{create-XJURMQC4.js.map → create-RSQEKCI6.js.map} +1 -1
  13. package/dist/delete-ZJB2JGAL.js +136 -0
  14. package/dist/delete-ZJB2JGAL.js.map +1 -0
  15. package/dist/index.js +7 -3
  16. package/dist/index.js.map +1 -1
  17. package/dist/{init-K7EASUMM.js → init-CUBJEWPE.js} +3 -5
  18. package/dist/init-CUBJEWPE.js.map +1 -0
  19. package/dist/list-BOE33VSI.js +120 -0
  20. package/dist/list-BOE33VSI.js.map +1 -0
  21. package/dist/push-L3BXB6OC.js +79 -0
  22. package/dist/push-L3BXB6OC.js.map +1 -0
  23. package/dist/secrets-3SKCSAGD.js +33 -0
  24. package/dist/secrets-3SKCSAGD.js.map +1 -0
  25. package/package.json +2 -2
  26. package/templates/project/meta/manifest-registry.json +1 -0
  27. package/dist/chunk-GFEVTHUW.js.map +0 -1
  28. package/dist/init-K7EASUMM.js.map +0 -1
  29. package/dist/push-YFHHNITO.js +0 -174
  30. package/dist/push-YFHHNITO.js.map +0 -1
  31. package/templates/agents/b2b-sales/index.ts +0 -57
  32. package/templates/agents/b2b-sales/signals/deal-won.ts +0 -31
  33. package/templates/agents/b2b-sales/signals/hot-lead-alert.ts +0 -29
  34. package/templates/agents/b2b-sales/steps/qualify-prospect.ts +0 -50
  35. package/templates/agents/b2b-sales/steps/score-lead.ts +0 -24
  36. package/templates/agents/b2b-sales/tools/enrich-company.ts +0 -17
  37. package/templates/agents/b2b-sales/tools/send-slack-notification.ts +0 -26
  38. package/templates/agents/b2b-sales/webhooks/crm-inbound.ts +0 -27
  39. package/templates/agents/b2b-sales/webhooks/stripe-payment.ts +0 -27
  40. package/templates/agents/customer-support/index.ts +0 -60
  41. package/templates/agents/customer-support/signals/escalation-needed.ts +0 -28
  42. package/templates/agents/customer-support/signals/ticket-resolved.ts +0 -29
  43. package/templates/agents/customer-support/steps/classify-ticket.ts +0 -22
  44. package/templates/agents/customer-support/steps/escalate-ticket.ts +0 -53
  45. package/templates/agents/customer-support/tools/create-jira-issue.ts +0 -30
  46. package/templates/agents/customer-support/tools/search-kb.ts +0 -13
  47. package/templates/agents/customer-support/webhooks/slack-escalation.ts +0 -27
  48. package/templates/agents/customer-support/webhooks/zendesk-ticket.ts +0 -29
  49. package/templates/agents/financial-agent/index.ts +0 -50
  50. package/templates/agents/financial-agent/signals/market-alert.ts +0 -31
  51. package/templates/agents/financial-agent/signals/portfolio-rebalance.ts +0 -27
  52. package/templates/agents/financial-agent/steps/analyze-signal.ts +0 -26
  53. package/templates/agents/financial-agent/steps/rebalance-check.ts +0 -55
  54. package/templates/agents/financial-agent/tools/fetch-market-data.ts +0 -13
  55. package/templates/agents/financial-agent/tools/send-email-alert.ts +0 -31
  56. package/templates/agents/financial-agent/webhooks/exchange-webhook.ts +0 -33
  57. package/templates/agents/financial-agent/webhooks/tradingview-alert.ts +0 -30
  58. package/templates/agents/minimal/index.ts +0 -24
  59. package/templates/agents/minimal/signals/error-alert.ts +0 -26
  60. package/templates/agents/minimal/signals/task-complete.ts +0 -25
  61. package/templates/agents/minimal/steps/example-step.ts +0 -13
  62. package/templates/agents/minimal/steps/transform-data.ts +0 -32
  63. package/templates/agents/minimal/tools/example-tool.ts +0 -13
  64. package/templates/agents/minimal/tools/http-request.ts +0 -26
  65. package/templates/agents/minimal/webhooks/generic-inbound.ts +0 -25
  66. package/templates/agents/minimal/webhooks/health-check.ts +0 -23
  67. package/templates/project/agents/.gitkeep +0 -0
@@ -0,0 +1,133 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ getAuthToken
4
+ } from "./chunk-6LLXGS2P.js";
5
+ import "./chunk-2H7UOFLK.js";
6
+
7
+ // src/commands/secrets/add.ts
8
+ import { defineCommand } from "citty";
9
+ import * as p from "@clack/prompts";
10
+ import pc from "picocolors";
11
+ import { readFile, writeFile } from "fs/promises";
12
+ import { join } from "path";
13
+ var LOGO = "\u{1F98B}";
14
+ async function addSecretToCloud(key, value) {
15
+ console.log(pc.dim(`[Simulated] Adding secret ${key} to Kalp Cloud...`));
16
+ }
17
+ async function addSecretToLocalConfig(cwd, key) {
18
+ const configPath = join(cwd, "kalp.config.ts");
19
+ let content;
20
+ try {
21
+ content = await readFile(configPath, "utf-8");
22
+ } catch {
23
+ throw new Error("kalp.config.ts not found. Run `kalp init` first.");
24
+ }
25
+ const regex = new RegExp(`["']${key}["']`);
26
+ if (regex.test(content)) {
27
+ throw new Error(`Secret ${key} already exists in kalp.config.ts`);
28
+ }
29
+ const match = content.match(/secrets:\s*\[([^\]]*)\]/);
30
+ if (!match) {
31
+ throw new Error("Could not find secrets array in kalp.config.ts");
32
+ }
33
+ const currentArray = match[1]?.trim();
34
+ if (!currentArray) {
35
+ throw new Error("Secrets array is empty in kalp.config.ts");
36
+ }
37
+ const newSecret = currentArray.length > 0 ? `, "${key}"` : `"${key}"`;
38
+ const newArray = `secrets: [${currentArray}${newSecret}]`;
39
+ content = content.replace(/secrets:\s*\[([^\]]*)\]/, newArray);
40
+ await writeFile(configPath, content, "utf-8");
41
+ }
42
+ var add_default = defineCommand({
43
+ meta: {
44
+ name: "add",
45
+ description: "Add a secret to Kalp Cloud and local config"
46
+ },
47
+ args: {
48
+ key: {
49
+ type: "string",
50
+ alias: "k",
51
+ description: "Secret key name (e.g., STRIPE_SECRET_KEY)"
52
+ },
53
+ value: {
54
+ type: "string",
55
+ alias: "v",
56
+ description: "Secret value"
57
+ },
58
+ help: {
59
+ type: "boolean",
60
+ alias: "h",
61
+ description: "Show help",
62
+ default: false
63
+ }
64
+ },
65
+ async run({ args }) {
66
+ const cwd = process.cwd();
67
+ if (args.help) {
68
+ p.log.info(`${pc.bold("Usage")}: kalp secrets add -k <key> -v <value>`);
69
+ p.log.info(
70
+ pc.dim("Example: kalp secrets add -k STRIPE_SECRET_KEY -v sk_test_...")
71
+ );
72
+ return;
73
+ }
74
+ p.intro(`${LOGO} ${pc.bold("kalp secrets add")}`);
75
+ const token = await getAuthToken();
76
+ if (!token) {
77
+ p.log.warn(pc.yellow("Not logged in. Run `kalp login` first."));
78
+ p.outro("Authentication required");
79
+ return;
80
+ }
81
+ let key = args.key;
82
+ let value = args.value;
83
+ if (!key) {
84
+ const input = await p.text({
85
+ message: "Secret key name",
86
+ placeholder: "STRIPE_SECRET_KEY",
87
+ validate: (v) => {
88
+ if (!v) return "Key is required";
89
+ if (!/^[A-Z_][A-Z0-9_]*$/.test(v)) {
90
+ return "Key must be UPPER_SNAKE_CASE";
91
+ }
92
+ }
93
+ });
94
+ if (p.isCancel(input)) {
95
+ p.outro("Cancelled");
96
+ return;
97
+ }
98
+ key = input;
99
+ }
100
+ if (!value) {
101
+ const input = await p.password({
102
+ message: `Enter value for ${key}`,
103
+ mask: "*"
104
+ });
105
+ if (p.isCancel(input)) {
106
+ p.outro("Cancelled");
107
+ return;
108
+ }
109
+ value = input;
110
+ }
111
+ const s = p.spinner();
112
+ s.start(`Adding ${pc.cyan(key)}...`);
113
+ try {
114
+ await addSecretToCloud(key, value);
115
+ await addSecretToLocalConfig(cwd, key);
116
+ s.stop(`Secret ${pc.cyan(key)} added successfully`);
117
+ p.outro("Done");
118
+ } catch (error) {
119
+ s.stop("Failed to add secret");
120
+ p.log.error(
121
+ pc.red(
122
+ `Error: ${error instanceof Error ? error.message : String(error)}`
123
+ )
124
+ );
125
+ p.outro("Failed");
126
+ process.exit(1);
127
+ }
128
+ }
129
+ });
130
+ export {
131
+ add_default as default
132
+ };
133
+ //# sourceMappingURL=add-5NOYFTJV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/secrets/add.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAuthToken } from \"../../utils/auth.js\";\n\nconst LOGO = \"🦋\";\n\nasync function addSecretToCloud(key: string, value: string): Promise<void> {\n // TODO: Implement real API call to Kalp Cloud\n console.log(pc.dim(`[Simulated] Adding secret ${key} to Kalp Cloud...`));\n}\n\nasync function addSecretToLocalConfig(cwd: string, key: string): Promise<void> {\n const configPath = join(cwd, \"kalp.config.ts\");\n let content: string;\n\n try {\n content = await readFile(configPath, \"utf-8\");\n } catch {\n throw new Error(\"kalp.config.ts not found. Run `kalp init` first.\");\n }\n\n // Check if key already exists\n const regex = new RegExp(`[\"']${key}[\"']`);\n if (regex.test(content)) {\n throw new Error(`Secret ${key} already exists in kalp.config.ts`);\n }\n\n // Add secret to array\n const match = content.match(/secrets:\\s*\\[([^\\]]*)\\]/);\n if (!match) {\n throw new Error(\"Could not find secrets array in kalp.config.ts\");\n }\n\n const currentArray = match[1]?.trim();\n\n if (!currentArray) {\n throw new Error(\"Secrets array is empty in kalp.config.ts\");\n }\n\n const newSecret = currentArray.length > 0 ? `, \"${key}\"` : `\"${key}\"`;\n const newArray = `secrets: [${currentArray}${newSecret}]`;\n\n content = content.replace(/secrets:\\s*\\[([^\\]]*)\\]/, newArray);\n\n await writeFile(configPath, content, \"utf-8\");\n}\n\nexport default defineCommand({\n meta: {\n name: \"add\",\n description: \"Add a secret to Kalp Cloud and local config\",\n },\n args: {\n key: {\n type: \"string\",\n alias: \"k\",\n description: \"Secret key name (e.g., STRIPE_SECRET_KEY)\",\n },\n value: {\n type: \"string\",\n alias: \"v\",\n description: \"Secret value\",\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp secrets add -k <key> -v <value>`);\n p.log.info(\n pc.dim(\"Example: kalp secrets add -k STRIPE_SECRET_KEY -v sk_test_...\"),\n );\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets add\")}`);\n\n const token = await getAuthToken();\n if (!token) {\n p.log.warn(pc.yellow(\"Not logged in. Run `kalp login` first.\"));\n p.outro(\"Authentication required\");\n return;\n }\n\n let key = args.key;\n let value = args.value;\n\n // Interactive prompts if not provided\n if (!key) {\n const input = await p.text({\n message: \"Secret key name\",\n placeholder: \"STRIPE_SECRET_KEY\",\n validate: (v) => {\n if (!v) return \"Key is required\";\n if (!/^[A-Z_][A-Z0-9_]*$/.test(v)) {\n return \"Key must be UPPER_SNAKE_CASE\";\n }\n },\n });\n if (p.isCancel(input)) {\n p.outro(\"Cancelled\");\n return;\n }\n key = input;\n }\n\n if (!value) {\n const input = await p.password({\n message: `Enter value for ${key}`,\n mask: \"*\",\n });\n if (p.isCancel(input)) {\n p.outro(\"Cancelled\");\n return;\n }\n value = input;\n }\n\n const s = p.spinner();\n s.start(`Adding ${pc.cyan(key)}...`);\n\n try {\n // Add to cloud (simulated)\n await addSecretToCloud(key, value);\n\n // Add to local config\n await addSecretToLocalConfig(cwd, key);\n\n s.stop(`Secret ${pc.cyan(key)} added successfully`);\n p.outro(\"Done\");\n } catch (error) {\n s.stop(\"Failed to add secret\");\n p.log.error(\n pc.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n p.outro(\"Failed\");\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ readAgentManifest,
4
+ writeVersionedManifest
5
+ } from "./chunk-CJCIZDCF.js";
6
+ import {
7
+ ensureConfig
8
+ } from "./chunk-Q455HC3P.js";
9
+ import "./chunk-2H7UOFLK.js";
10
+
11
+ // src/commands/build.ts
12
+ import { access } from "fs/promises";
13
+ import { join } from "path";
14
+ import { defineCommand } from "citty";
15
+ import * as p from "@clack/prompts";
16
+ import pc from "picocolors";
17
+ var LOGO = "\u{1F98B}";
18
+ var build_default = defineCommand({
19
+ meta: {
20
+ name: "build",
21
+ description: "Build Agent"
22
+ },
23
+ args: {
24
+ agent: {
25
+ type: "string",
26
+ alias: "a",
27
+ description: "Agent name",
28
+ required: false
29
+ }
30
+ },
31
+ async run({ args }) {
32
+ const cwd = process.cwd();
33
+ p.intro(`${LOGO} ${pc.bold("kalp build")}`);
34
+ const agentName = args.agent;
35
+ if (!agentName) {
36
+ p.log.error(`Missing required flag ${pc.cyan("-a <agent-name>")}`);
37
+ p.outro(pc.dim(`Example: ${pc.cyan("kalp build -a my-agent")}`));
38
+ process.exit(1);
39
+ }
40
+ try {
41
+ await ensureConfig(cwd);
42
+ } catch {
43
+ p.log.error(`${pc.cyan("kalp.config.ts")} not found`);
44
+ p.outro(pc.dim(`Run ${pc.cyan("kalp init")} first.`));
45
+ process.exit(1);
46
+ }
47
+ const agentPath = join(cwd, "agents", agentName, "index.ts");
48
+ try {
49
+ await access(agentPath);
50
+ } catch {
51
+ p.log.error(
52
+ `Agent ${pc.cyan(agentName)} not found at ${pc.cyan(`agents/${agentName}/index.ts`)}`
53
+ );
54
+ process.exit(1);
55
+ }
56
+ const s = p.spinner();
57
+ s.start(`Compiling ${pc.cyan(agentName)}`);
58
+ try {
59
+ const manifest = await readAgentManifest({ cwd, agentName });
60
+ const version = await writeVersionedManifest({
61
+ cwd,
62
+ agentName,
63
+ manifest
64
+ });
65
+ s.stop(`Build ${pc.cyan(version.versionId)} generated`);
66
+ p.outro(
67
+ `${LOGO} ${pc.green("Build ready")} ${pc.dim("\u2014 run kalp push -a <agent>")}`
68
+ );
69
+ } catch (err) {
70
+ const msg = err instanceof Error ? err.message : String(err);
71
+ s.stop(pc.red("Build failed"));
72
+ p.log.info(pc.dim(msg.split("\n")[0] ?? "Unknown error"));
73
+ process.exit(1);
74
+ }
75
+ }
76
+ });
77
+ export {
78
+ build_default as default
79
+ };
80
+ //# sourceMappingURL=build-SUIPVJO6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/build.ts"],"sourcesContent":["import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { ensureConfig } from \"../utils/fs.js\";\nimport {\n readAgentManifest,\n writeVersionedManifest,\n} from \"../utils/manifest.js\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"build\",\n description: \"Build Agent\",\n },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name\",\n required: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp build\")}`);\n\n const agentName = args.agent;\n if (!agentName) {\n p.log.error(`Missing required flag ${pc.cyan(\"-a <agent-name>\")}`);\n p.outro(pc.dim(`Example: ${pc.cyan(\"kalp build -a my-agent\")}`));\n process.exit(1);\n }\n\n try {\n await ensureConfig(cwd);\n } catch {\n p.log.error(`${pc.cyan(\"kalp.config.ts\")} not found`);\n p.outro(pc.dim(`Run ${pc.cyan(\"kalp init\")} first.`));\n process.exit(1);\n }\n\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n try {\n await access(agentPath);\n } catch {\n p.log.error(\n `Agent ${pc.cyan(agentName)} not found at ${pc.cyan(`agents/${agentName}/index.ts`)}`,\n );\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(`Compiling ${pc.cyan(agentName)}`);\n\n try {\n const manifest = await readAgentManifest({ cwd, agentName });\n const version = await writeVersionedManifest({\n cwd,\n agentName,\n manifest,\n });\n\n s.stop(`Build ${pc.cyan(version.versionId)} generated`);\n p.outro(\n `${LOGO} ${pc.green(\"Build ready\")} ${pc.dim(\"— run kalp push -a <agent>\")}`,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n s.stop(pc.red(\"Build failed\"));\n p.log.info(pc.dim(msg.split(\"\\n\")[0] ?? \"Unknown error\"));\n process.exit(1);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,cAAc;AACvB,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAOf,IAAM,OAAO;AAEb,IAAO,gBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,YAAY,CAAC,EAAE;AAE1C,UAAM,YAAY,KAAK;AACvB,QAAI,CAAC,WAAW;AACd,MAAE,MAAI,MAAM,yBAAyB,GAAG,KAAK,iBAAiB,CAAC,EAAE;AACjE,MAAE,QAAM,GAAG,IAAI,YAAY,GAAG,KAAK,wBAAwB,CAAC,EAAE,CAAC;AAC/D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI;AACF,YAAM,aAAa,GAAG;AAAA,IACxB,QAAQ;AACN,MAAE,MAAI,MAAM,GAAG,GAAG,KAAK,gBAAgB,CAAC,YAAY;AACpD,MAAE,QAAM,GAAG,IAAI,OAAO,GAAG,KAAK,WAAW,CAAC,SAAS,CAAC;AACpD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,YAAY,KAAK,KAAK,UAAU,WAAW,UAAU;AAC3D,QAAI;AACF,YAAM,OAAO,SAAS;AAAA,IACxB,QAAQ;AACN,MAAE,MAAI;AAAA,QACJ,SAAS,GAAG,KAAK,SAAS,CAAC,iBAAiB,GAAG,KAAK,UAAU,SAAS,WAAW,CAAC;AAAA,MACrF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,aAAa,GAAG,KAAK,SAAS,CAAC,EAAE;AAEzC,QAAI;AACF,YAAM,WAAW,MAAM,kBAAkB,EAAE,KAAK,UAAU,CAAC;AAC3D,YAAM,UAAU,MAAM,uBAAuB;AAAA,QAC3C;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,QAAE,KAAK,SAAS,GAAG,KAAK,QAAQ,SAAS,CAAC,YAAY;AACtD,MAAE;AAAA,QACA,GAAG,IAAI,IAAI,GAAG,MAAM,aAAa,CAAC,IAAI,GAAG,IAAI,iCAA4B,CAAC;AAAA,MAC5E;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,QAAE,KAAK,GAAG,IAAI,cAAc,CAAC;AAC7B,MAAE,MAAI,KAAK,GAAG,IAAI,IAAI,MAAM,IAAI,EAAE,CAAC,KAAK,eAAe,CAAC;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/utils/auth.ts
4
+ import { readFile } from "fs/promises";
5
+ import { homedir } from "os";
6
+ import { join } from "path";
7
+ var KALP_DIR = join(homedir(), ".kalp");
8
+ var AUTH_FILE = join(KALP_DIR, "auth.json");
9
+ async function getAuthToken() {
10
+ try {
11
+ const content = await readFile(AUTH_FILE, "utf-8");
12
+ const auth = JSON.parse(content);
13
+ if (new Date(auth.expiresAt) < /* @__PURE__ */ new Date()) {
14
+ return null;
15
+ }
16
+ return auth.token;
17
+ } catch {
18
+ return null;
19
+ }
20
+ }
21
+
22
+ export {
23
+ getAuthToken
24
+ };
25
+ //# sourceMappingURL=chunk-6LLXGS2P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/auth.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst KALP_DIR = join(homedir(), \".kalp\");\nconst AUTH_FILE = join(KALP_DIR, \"auth.json\");\n\ninterface AuthData {\n token: string;\n email: string;\n expiresAt: string;\n}\n\nexport async function getAuthToken(): Promise<string | null> {\n try {\n const content = await readFile(AUTH_FILE, \"utf-8\");\n const auth = JSON.parse(content) as AuthData;\n\n // Check if token is expired\n if (new Date(auth.expiresAt) < new Date()) {\n return null;\n }\n\n return auth.token;\n } catch {\n return null;\n }\n}\n\nexport async function isAuthenticated(): Promise<boolean> {\n const token = await getAuthToken();\n return token !== null;\n}\n"],"mappings":";;;AAAA,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,YAAY;AAErB,IAAM,WAAW,KAAK,QAAQ,GAAG,OAAO;AACxC,IAAM,YAAY,KAAK,UAAU,WAAW;AAQ5C,eAAsB,eAAuC;AAC3D,MAAI;AACF,UAAM,UAAU,MAAM,SAAS,WAAW,OAAO;AACjD,UAAM,OAAO,KAAK,MAAM,OAAO;AAG/B,QAAI,IAAI,KAAK,KAAK,SAAS,IAAI,oBAAI,KAAK,GAAG;AACzC,aAAO;AAAA,IACT;AAEA,WAAO,KAAK;AAAA,EACd,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -0,0 +1,298 @@
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") && fileName !== "latest.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", "manifests", 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
+ await writeFile(
238
+ join(agentMetaDir, "latest.json"),
239
+ JSON.stringify(record, null, 2) + "\n",
240
+ "utf-8"
241
+ );
242
+ const registryPath = join(cwd, "meta", "manifest-registry.json");
243
+ const registry = await readManifestRegistry(registryPath);
244
+ const prev = registry[agentName] ?? { latest: "", versions: [] };
245
+ const versions = prev.versions.includes(versionId) ? prev.versions : [...prev.versions, versionId];
246
+ registry[agentName] = { latest: versionId, versions };
247
+ await writeFile(
248
+ registryPath,
249
+ JSON.stringify(registry, null, 2) + "\n",
250
+ "utf-8"
251
+ );
252
+ return {
253
+ ...record,
254
+ outputPath: versionFile
255
+ };
256
+ }
257
+ async function readLatestVersionedManifest(params) {
258
+ const { cwd, agentName } = params;
259
+ const agentMetaDir = join(cwd, "meta", "manifests", agentName);
260
+ const latestPath = join(agentMetaDir, "latest.json");
261
+ const latest = await readManifestVersionFile(latestPath);
262
+ if (latest) {
263
+ return {
264
+ ...latest,
265
+ outputPath: latestPath
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 readManifestRegistry(registryPath) {
285
+ try {
286
+ const src = await readFile(registryPath, "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-CJCIZDCF.js.map
@@ -0,0 +1 @@
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\") && fileName !== \"latest.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\", \"manifests\", 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 await writeFile(\n join(agentMetaDir, \"latest.json\"),\n JSON.stringify(record, null, 2) + \"\\n\",\n \"utf-8\",\n );\n\n const registryPath = join(cwd, \"meta\", \"manifest-registry.json\");\n const registry = await readManifestRegistry(registryPath);\n const prev = registry[agentName] ?? { latest: \"\", versions: [] };\n const versions = prev.versions.includes(versionId)\n ? prev.versions\n : [...prev.versions, versionId];\n registry[agentName] = { latest: versionId, versions };\n await writeFile(\n registryPath,\n JSON.stringify(registry, 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\", \"manifests\", agentName);\n const latestPath = join(agentMetaDir, \"latest.json\");\n\n const latest = await readManifestVersionFile(latestPath);\n if (latest) {\n return {\n ...latest,\n outputPath: latestPath,\n };\n }\n\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 readManifestRegistry(\n registryPath: string,\n): Promise<Record<string, ManifestRegistryEntry>> {\n try {\n const src = await readFile(registryPath, \"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,KAAK,aAAa;AACpD;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,aAAa,SAAS;AAC7D,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;AAC5E,QAAM;AAAA,IACJ,KAAK,cAAc,aAAa;AAAA,IAChC,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI;AAAA,IAClC;AAAA,EACF;AAEA,QAAM,eAAe,KAAK,KAAK,QAAQ,wBAAwB;AAC/D,QAAM,WAAW,MAAM,qBAAqB,YAAY;AACxD,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,aAAa,SAAS;AAC7D,QAAM,aAAa,KAAK,cAAc,aAAa;AAEnD,QAAM,SAAS,MAAM,wBAAwB,UAAU;AACvD,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,GAAG;AAAA,MACH,YAAY;AAAA,IACd;AAAA,EACF;AAEA,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,qBACb,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"]}