@kalphq/cli 0.0.0-dev-20260420003114 → 0.0.0-dev-20260420023403

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 (36) hide show
  1. package/dist/add-5NOYFTJV.js +133 -0
  2. package/dist/add-5NOYFTJV.js.map +1 -0
  3. package/dist/{manifest-LKYALPCB.js → build-SUIPVJO6.js} +18 -20
  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-INMLAVHJ.js → chunk-CJCIZDCF.js} +105 -24
  8. package/dist/chunk-CJCIZDCF.js.map +1 -0
  9. package/dist/{chunk-DOHVZBJO.js → chunk-HD5FT7T6.js} +43 -5
  10. package/dist/chunk-HD5FT7T6.js.map +1 -0
  11. package/dist/{create-LCVZRFEF.js → create-RSQEKCI6.js} +5 -8
  12. package/dist/{create-LCVZRFEF.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 -7
  16. package/dist/index.js.map +1 -1
  17. package/dist/{init-VMOFA2AV.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-RUUHE6RW.js → push-L3BXB6OC.js} +13 -15
  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/dist/chunk-DOHVZBJO.js.map +0 -1
  27. package/dist/chunk-INMLAVHJ.js.map +0 -1
  28. package/dist/init-VMOFA2AV.js.map +0 -1
  29. package/dist/manifest-LKYALPCB.js.map +0 -1
  30. package/dist/push-RUUHE6RW.js.map +0 -1
  31. package/dist/skill-IGGMF5GR.js +0 -346
  32. package/dist/skill-IGGMF5GR.js.map +0 -1
  33. package/templates/project/agents/.gitkeep +0 -0
  34. package/templates/project/meta/manifests/.gitkeep +0 -1
  35. package/templates/project/meta/skills/.gitkeep +0 -1
  36. package/templates/project/meta/skills/applied.json +0 -4
@@ -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":[]}
@@ -2,23 +2,23 @@
2
2
  import {
3
3
  readAgentManifest,
4
4
  writeVersionedManifest
5
- } from "./chunk-INMLAVHJ.js";
5
+ } from "./chunk-CJCIZDCF.js";
6
6
  import {
7
7
  ensureConfig
8
8
  } from "./chunk-Q455HC3P.js";
9
9
  import "./chunk-2H7UOFLK.js";
10
10
 
11
- // src/commands/manifest.ts
11
+ // src/commands/build.ts
12
12
  import { access } from "fs/promises";
13
13
  import { join } from "path";
14
14
  import { defineCommand } from "citty";
15
15
  import * as p from "@clack/prompts";
16
16
  import pc from "picocolors";
17
17
  var LOGO = "\u{1F98B}";
18
- var manifest_default = defineCommand({
18
+ var build_default = defineCommand({
19
19
  meta: {
20
- name: "manifest",
21
- description: "Generate a versioned JSON manifest for an agent"
20
+ name: "build",
21
+ description: "Build Agent"
22
22
  },
23
23
  args: {
24
24
  agent: {
@@ -30,11 +30,11 @@ var manifest_default = defineCommand({
30
30
  },
31
31
  async run({ args }) {
32
32
  const cwd = process.cwd();
33
- p.intro(`${LOGO} ${pc.bold("kalp manifest")}`);
33
+ p.intro(`${LOGO} ${pc.bold("kalp build")}`);
34
34
  const agentName = args.agent;
35
35
  if (!agentName) {
36
36
  p.log.error(`Missing required flag ${pc.cyan("-a <agent-name>")}`);
37
- p.outro(pc.dim(`Example: ${pc.cyan("kalp manifest -a my-agent")}`));
37
+ p.outro(pc.dim(`Example: ${pc.cyan("kalp build -a my-agent")}`));
38
38
  process.exit(1);
39
39
  }
40
40
  try {
@@ -54,29 +54,27 @@ var manifest_default = defineCommand({
54
54
  process.exit(1);
55
55
  }
56
56
  const s = p.spinner();
57
- s.start(`Generating manifest for ${pc.cyan(agentName)}`);
57
+ s.start(`Compiling ${pc.cyan(agentName)}`);
58
58
  try {
59
59
  const manifest = await readAgentManifest({ cwd, agentName });
60
- const version = await writeVersionedManifest({ cwd, agentName, manifest });
61
- s.stop(`Manifest ${pc.cyan(version.versionId)} generated`);
62
- console.log("\n" + pc.dim("\u2500".repeat(50)));
63
- console.log(pc.cyan("Agent Manifest (JSON):"));
64
- console.log(pc.dim("\u2500".repeat(50)));
65
- console.log(JSON.stringify(version, null, 2));
66
- console.log(pc.dim("\u2500".repeat(50)) + "\n");
67
- p.log.info(`${pc.cyan("Saved")}: ${version.outputPath}`);
60
+ const version = await writeVersionedManifest({
61
+ cwd,
62
+ agentName,
63
+ manifest
64
+ });
65
+ s.stop(`Build ${pc.cyan(version.versionId)} generated`);
68
66
  p.outro(
69
- `${LOGO} ${pc.green("Manifest ready")} ${pc.dim("\u2014 versioned in meta/manifests")}`
67
+ `${LOGO} ${pc.green("Build ready")} ${pc.dim("\u2014 run kalp push -a <agent>")}`
70
68
  );
71
69
  } catch (err) {
72
70
  const msg = err instanceof Error ? err.message : String(err);
73
- s.stop(pc.red("Could not generate agent manifest"));
71
+ s.stop(pc.red("Build failed"));
74
72
  p.log.info(pc.dim(msg.split("\n")[0] ?? "Unknown error"));
75
73
  process.exit(1);
76
74
  }
77
75
  }
78
76
  });
79
77
  export {
80
- manifest_default as default
78
+ build_default as default
81
79
  };
82
- //# sourceMappingURL=manifest-LKYALPCB.js.map
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":[]}
@@ -3,7 +3,15 @@
3
3
  // src/utils/manifest.ts
4
4
  import { createHash } from "crypto";
5
5
  import { existsSync } from "fs";
6
- import { access, mkdtemp, mkdir, readFile, readdir, rm, writeFile } from "fs/promises";
6
+ import {
7
+ access,
8
+ mkdtemp,
9
+ mkdir,
10
+ readFile,
11
+ readdir,
12
+ rm,
13
+ writeFile
14
+ } from "fs/promises";
7
15
  import { join, resolve } from "path";
8
16
  import { pathToFileURL } from "url";
9
17
  import { build } from "esbuild";
@@ -38,6 +46,7 @@ function serializeSteps(steps) {
38
46
  const item = asRecord(step);
39
47
  return {
40
48
  id: asString(item.id) ?? `step_${index + 1}`,
49
+ order: index + 1,
41
50
  description: asString(item.description) ?? "",
42
51
  inputSchema: toJsonSchema(item.input, `step_${index + 1}_input`),
43
52
  outputSchema: toJsonSchema(item.output, `step_${index + 1}_output`)
@@ -49,6 +58,7 @@ function serializeTools(tools) {
49
58
  const item = asRecord(tool);
50
59
  return {
51
60
  id: asString(item.id) ?? `tool_${index + 1}`,
61
+ order: index + 1,
52
62
  description: asString(item.description) ?? "",
53
63
  inputSchema: toJsonSchema(item.input, `tool_${index + 1}_input`)
54
64
  };
@@ -59,21 +69,28 @@ function serializeRoutes(routes) {
59
69
  const item = asRecord(route);
60
70
  return {
61
71
  id: asString(item.id) ?? `route_${index + 1}`,
72
+ order: index + 1,
62
73
  method: asString(item.method) ?? "GET",
63
74
  path: asString(item.path) ?? "/",
64
75
  inputSchema: toJsonSchema(item.input, `route_${index + 1}_input`)
65
76
  };
66
77
  });
67
78
  }
68
- function serializeFlows(flows) {
79
+ function serializeFlows(flows, stepIds) {
69
80
  return flows.map((flow, index) => {
70
81
  const item = asRecord(flow);
71
82
  const steps = asArray(item.steps).map((s, stepIndex) => {
72
83
  const step = asRecord(s);
73
- return asString(step.id) ?? `step_${stepIndex + 1}`;
84
+ const stepId = asString(step.id) ?? `step_${stepIndex + 1}`;
85
+ return {
86
+ order: stepIndex + 1,
87
+ stepId,
88
+ existsInAgentSteps: stepIds.has(stepId)
89
+ };
74
90
  });
75
91
  return {
76
92
  id: asString(item.id) ?? `flow_${index + 1}`,
93
+ order: index + 1,
77
94
  description: asString(item.description) ?? "",
78
95
  steps
79
96
  };
@@ -129,6 +146,11 @@ async function readAgentManifest(params) {
129
146
  const loaded = await loadAgentModule(agentPath, cwd);
130
147
  tempDir = loaded.tempDir;
131
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);
132
154
  return {
133
155
  format: "kalp-agent-manifest",
134
156
  schemaVersion: 1,
@@ -143,10 +165,24 @@ async function readAgentManifest(params) {
143
165
  onMessage: typeof agent.onMessage === "function",
144
166
  onTick: typeof agent.onTick === "function"
145
167
  },
146
- steps: serializeSteps(asArray(agent.steps)),
147
- tools: serializeTools(asArray(agent.tools)),
148
- routes: serializeRoutes(asArray(agent.routes)),
149
- flows: serializeFlows(asArray(agent.flows))
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
+ }
150
186
  }
151
187
  };
152
188
  } finally {
@@ -158,27 +194,42 @@ async function readAgentManifest(params) {
158
194
  function getHash(payload) {
159
195
  return createHash("sha256").update(payload).digest("hex");
160
196
  }
161
- function parseVersionFromFileName(fileName) {
162
- const match = /^v(\d{4})\.json$/.exec(fileName);
163
- return match ? Number(match[1]) : null;
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
+ }
164
210
  }
165
211
  async function writeVersionedManifest(params) {
166
212
  const { cwd, agentName, manifest } = params;
167
213
  const agentMetaDir = join(cwd, "meta", "manifests", agentName);
168
214
  await mkdir(agentMetaDir, { recursive: true });
169
215
  const files = await readdir(agentMetaDir);
170
- const versions = files.map(parseVersionFromFileName).filter((v) => v !== null).sort((a, b) => a - b);
171
- const latestVersion = versions.at(-1) ?? 0;
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;
172
223
  const nextVersion = latestVersion + 1;
173
- const versionId = `v${String(nextVersion).padStart(4, "0")}`;
174
- const previousVersionId = latestVersion > 0 ? `v${String(latestVersion).padStart(4, "0")}` : null;
175
224
  const payload = JSON.stringify(manifest);
225
+ const generatedAt = (/* @__PURE__ */ new Date()).toISOString();
226
+ const versionId = createVersionId(payload, generatedAt);
176
227
  const record = {
177
228
  version: nextVersion,
178
229
  versionId,
179
- previousVersionId,
180
230
  hash: getHash(payload),
181
- generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
231
+ generatedAt,
232
+ immutable: true,
182
233
  manifest
183
234
  };
184
235
  const versionFile = join(agentMetaDir, `${versionId}.json`);
@@ -190,17 +241,46 @@ async function writeVersionedManifest(params) {
190
241
  );
191
242
  const registryPath = join(cwd, "meta", "manifest-registry.json");
192
243
  const registry = await readManifestRegistry(registryPath);
193
- registry[agentName] = {
194
- latestVersion: record.version,
195
- latestVersionId: record.versionId,
196
- updatedAt: record.generatedAt
197
- };
198
- await writeFile(registryPath, JSON.stringify(registry, null, 2) + "\n", "utf-8");
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
+ );
199
252
  return {
200
253
  ...record,
201
254
  outputPath: versionFile
202
255
  };
203
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
+ }
204
284
  async function readManifestRegistry(registryPath) {
205
285
  try {
206
286
  const src = await readFile(registryPath, "utf-8");
@@ -212,6 +292,7 @@ async function readManifestRegistry(registryPath) {
212
292
 
213
293
  export {
214
294
  readAgentManifest,
215
- writeVersionedManifest
295
+ writeVersionedManifest,
296
+ readLatestVersionedManifest
216
297
  };
217
- //# sourceMappingURL=chunk-INMLAVHJ.js.map
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":"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","names":["record"]}
@@ -19712,7 +19712,6 @@ async function scaffoldProject(opts) {
19712
19712
  const kalpConfig = `import { defineConfig } from "@kalphq/sdk";
19713
19713
 
19714
19714
  export default defineConfig({
19715
- projectId: "${projectName}",
19716
19715
  secrets: [],
19717
19716
  });
19718
19717
  `;
@@ -19724,19 +19723,29 @@ async function scaffoldAgent(opts) {
19724
19723
  const agentDir = join4(cwd, "agents", agentName);
19725
19724
  await mkdir(join4(agentDir, "steps"), { recursive: true });
19726
19725
  await mkdir(join4(agentDir, "tools"), { recursive: true });
19726
+ await mkdir(join4(agentDir, "routes"), { recursive: true });
19727
+ await mkdir(join4(agentDir, "flows"), { recursive: true });
19727
19728
  const agentIndex = `import { asAgentId, defineAgent } from "@kalphq/sdk";
19728
19729
  import { exampleStep } from "./steps/example-step.js";
19729
19730
  import { exampleTool } from "./tools/example-tool.js";
19731
+ import { exampleRoute } from "./routes/example-route.js";
19732
+ import { exampleFlow } from "./flows/example-flow.js";
19730
19733
 
19731
19734
  export default defineAgent({
19732
19735
  id: asAgentId("${agentName}"),
19733
19736
  name: "${agentName}",
19734
19737
  steps: [exampleStep],
19735
19738
  tools: [exampleTool],
19739
+ routes: [exampleRoute],
19740
+ flows: [exampleFlow],
19736
19741
 
19737
- async onMessage(message, ctx) {
19738
- const stepped = await ctx.runStep(exampleStep, { message: message.text });
19739
- const tooled = await ctx.callTool(exampleTool, { query: message.text });
19742
+ async onMessage(message, context) {
19743
+ const stepped = await context.actions.runStep(exampleStep, {
19744
+ message: message.text,
19745
+ });
19746
+ const tooled = await context.actions.callTool(exampleTool, {
19747
+ query: message.text,
19748
+ });
19740
19749
  return { text: stepped.result + " | " + tooled.output };
19741
19750
  },
19742
19751
  });
@@ -19765,6 +19774,25 @@ export const exampleTool = createTool({
19765
19774
  return { output: "Tool result for: " + query };
19766
19775
  },
19767
19776
  });
19777
+ `;
19778
+ const routeFile = `import { defineRoute } from "@kalphq/sdk";
19779
+
19780
+ export const exampleRoute = defineRoute({
19781
+ id: "example_route",
19782
+ method: "GET",
19783
+ path: "/example",
19784
+ handler: async () => {
19785
+ return { message: "Hello from Kalp" };
19786
+ },
19787
+ });
19788
+ `;
19789
+ const flowFile = `import { defineFlow } from "@kalphq/sdk";
19790
+
19791
+ export const exampleFlow = defineFlow({
19792
+ id: "example_flow",
19793
+ description: "A starter flow for your agent.",
19794
+ steps: [],
19795
+ });
19768
19796
  `;
19769
19797
  await writeFile(join4(agentDir, "index.ts"), agentIndex, "utf-8");
19770
19798
  await writeFile(
@@ -19777,6 +19805,16 @@ export const exampleTool = createTool({
19777
19805
  toolFile,
19778
19806
  "utf-8"
19779
19807
  );
19808
+ await writeFile(
19809
+ join4(agentDir, "routes", "example-route.ts"),
19810
+ routeFile,
19811
+ "utf-8"
19812
+ );
19813
+ await writeFile(
19814
+ join4(agentDir, "flows", "example-flow.ts"),
19815
+ flowFile,
19816
+ "utf-8"
19817
+ );
19780
19818
  }
19781
19819
 
19782
19820
  // src/utils/ui.ts
@@ -19835,4 +19873,4 @@ export {
19835
19873
  promptProjectName,
19836
19874
  promptAgentDetails
19837
19875
  };
19838
- //# sourceMappingURL=chunk-DOHVZBJO.js.map
19876
+ //# sourceMappingURL=chunk-HD5FT7T6.js.map