@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.
- package/dist/add-5NOYFTJV.js +133 -0
- package/dist/add-5NOYFTJV.js.map +1 -0
- package/dist/{manifest-LKYALPCB.js → build-SUIPVJO6.js} +18 -20
- package/dist/build-SUIPVJO6.js.map +1 -0
- package/dist/chunk-6LLXGS2P.js +25 -0
- package/dist/chunk-6LLXGS2P.js.map +1 -0
- package/dist/{chunk-INMLAVHJ.js → chunk-CJCIZDCF.js} +105 -24
- package/dist/chunk-CJCIZDCF.js.map +1 -0
- package/dist/{chunk-DOHVZBJO.js → chunk-HD5FT7T6.js} +43 -5
- package/dist/chunk-HD5FT7T6.js.map +1 -0
- package/dist/{create-LCVZRFEF.js → create-RSQEKCI6.js} +5 -8
- package/dist/{create-LCVZRFEF.js.map → create-RSQEKCI6.js.map} +1 -1
- package/dist/delete-ZJB2JGAL.js +136 -0
- package/dist/delete-ZJB2JGAL.js.map +1 -0
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/dist/{init-VMOFA2AV.js → init-CUBJEWPE.js} +3 -5
- package/dist/init-CUBJEWPE.js.map +1 -0
- package/dist/list-BOE33VSI.js +120 -0
- package/dist/list-BOE33VSI.js.map +1 -0
- package/dist/{push-RUUHE6RW.js → push-L3BXB6OC.js} +13 -15
- package/dist/push-L3BXB6OC.js.map +1 -0
- package/dist/secrets-3SKCSAGD.js +33 -0
- package/dist/secrets-3SKCSAGD.js.map +1 -0
- package/package.json +2 -2
- package/dist/chunk-DOHVZBJO.js.map +0 -1
- package/dist/chunk-INMLAVHJ.js.map +0 -1
- package/dist/init-VMOFA2AV.js.map +0 -1
- package/dist/manifest-LKYALPCB.js.map +0 -1
- package/dist/push-RUUHE6RW.js.map +0 -1
- package/dist/skill-IGGMF5GR.js +0 -346
- package/dist/skill-IGGMF5GR.js.map +0 -1
- package/templates/project/agents/.gitkeep +0 -0
- package/templates/project/meta/manifests/.gitkeep +0 -1
- package/templates/project/meta/skills/.gitkeep +0 -1
- 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-
|
|
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/
|
|
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
|
|
18
|
+
var build_default = defineCommand({
|
|
19
19
|
meta: {
|
|
20
|
-
name: "
|
|
21
|
-
description: "
|
|
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
|
|
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
|
|
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(`
|
|
57
|
+
s.start(`Compiling ${pc.cyan(agentName)}`);
|
|
58
58
|
try {
|
|
59
59
|
const manifest = await readAgentManifest({ cwd, agentName });
|
|
60
|
-
const version = await writeVersionedManifest({
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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("
|
|
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("
|
|
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
|
-
|
|
78
|
+
build_default as default
|
|
81
79
|
};
|
|
82
|
-
//# sourceMappingURL=
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
|
162
|
-
|
|
163
|
-
|
|
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
|
|
171
|
-
const
|
|
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
|
|
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
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
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-
|
|
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,
|
|
19738
|
-
const stepped = await
|
|
19739
|
-
|
|
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-
|
|
19876
|
+
//# sourceMappingURL=chunk-HD5FT7T6.js.map
|