@kalphq/cli 0.0.0-dev-20260509012111 → 0.0.0-dev-20260510044447
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-KRHLYYTO.js → add-XTXSSGC5.js} +3 -2
- package/dist/{add-KRHLYYTO.js.map → add-XTXSSGC5.js.map} +1 -1
- package/dist/chunk-5RODADXW.js +65 -0
- package/dist/chunk-5RODADXW.js.map +1 -0
- package/dist/chunk-FO24J6XL.js +23 -0
- package/dist/chunk-FO24J6XL.js.map +1 -0
- package/dist/chunk-MM6CND3O.js +84 -0
- package/dist/chunk-MM6CND3O.js.map +1 -0
- package/dist/chunk-TTKFK7NJ.js +232 -0
- package/dist/chunk-TTKFK7NJ.js.map +1 -0
- package/dist/{delete-47ZP6XRB.js → delete-N4OSUK3X.js} +3 -2
- package/dist/{delete-47ZP6XRB.js.map → delete-N4OSUK3X.js.map} +1 -1
- package/dist/deploy-PKK545YR.js +63 -0
- package/dist/deploy-PKK545YR.js.map +1 -0
- package/dist/dev-LE5FR6BF.js +74 -0
- package/dist/dev-LE5FR6BF.js.map +1 -0
- package/dist/index.js +15 -10
- package/dist/index.js.map +1 -1
- package/dist/{list-3ZQIFUOT.js → list-VMJPWHIH.js} +3 -2
- package/dist/{list-3ZQIFUOT.js.map → list-VMJPWHIH.js.map} +1 -1
- package/dist/login-M5Y57ZZU.js +73 -0
- package/dist/login-M5Y57ZZU.js.map +1 -0
- package/dist/{logout-V67DZZXO.js → logout-U5V5K775.js} +5 -4
- package/dist/logout-U5V5K775.js.map +1 -0
- package/dist/push-EI646ZVZ.js +289 -0
- package/dist/push-EI646ZVZ.js.map +1 -0
- package/dist/runtime-template/studio/assets/QueryClientProvider-D-LxTiBd.js +1 -0
- package/dist/runtime-template/studio/assets/index-DpfZiZAs.js +75 -0
- package/dist/runtime-template/studio/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/dist/runtime-template/studio/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/dist/runtime-template/studio/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/dist/runtime-template/studio/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/dist/runtime-template/studio/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/dist/runtime-template/studio/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/dist/runtime-template/studio/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/dist/runtime-template/studio/assets/replay._executionId-Cs7M_t4A.js +41 -0
- package/dist/runtime-template/studio/assets/routes-DM2dr3uc.js +1 -0
- package/dist/runtime-template/studio/assets/styles-DnCmVxlg.css +2 -0
- package/dist/runtime-template/studio/assets/useAuth-CNMCKtPc.js +1 -0
- package/dist/runtime-template/studio/favicon.ico +0 -0
- package/dist/runtime-template/studio/index.html +13 -0
- package/dist/runtime-template/studio/logo192.png +0 -0
- package/dist/runtime-template/studio/logo512.png +0 -0
- package/dist/runtime-template/studio/manifest.json +25 -0
- package/dist/runtime-template/studio/robots.txt +3 -0
- package/dist/runtime-template/worker-entry.js +2 -0
- package/dist/{secrets-KFMVBKJQ.js → secrets-P7ADVLOS.js} +5 -5
- package/dist/{sync-YFM5P3IS.js → sync-OTO44GQS.js} +3 -2
- package/dist/{sync-YFM5P3IS.js.map → sync-OTO44GQS.js.map} +1 -1
- package/package.json +8 -5
- package/dist/chunk-6LLXGS2P.js +0 -25
- package/dist/chunk-6LLXGS2P.js.map +0 -1
- package/dist/login-JYPWGL6P.js +0 -38
- package/dist/login-JYPWGL6P.js.map +0 -1
- package/dist/logout-V67DZZXO.js.map +0 -1
- package/dist/push-UZADV7TZ.js +0 -255
- package/dist/push-UZADV7TZ.js.map +0 -1
- package/dist/studio-SSJ27ZHR.js +0 -103
- package/dist/studio-SSJ27ZHR.js.map +0 -1
- /package/dist/{secrets-KFMVBKJQ.js.map → secrets-P7ADVLOS.js.map} +0 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
ensureSecretKey,
|
|
4
|
+
materializeRuntime
|
|
5
|
+
} from "./chunk-TTKFK7NJ.js";
|
|
6
|
+
|
|
7
|
+
// src/commands/dev.ts
|
|
8
|
+
import { copyFile } from "fs/promises";
|
|
9
|
+
import { join } from "path";
|
|
10
|
+
import { setTimeout as delay } from "timers/promises";
|
|
11
|
+
import { defineCommand } from "citty";
|
|
12
|
+
import * as p from "@clack/prompts";
|
|
13
|
+
import pc from "picocolors";
|
|
14
|
+
import { execa } from "execa";
|
|
15
|
+
import open from "open";
|
|
16
|
+
|
|
17
|
+
// src/utils/studio-token.ts
|
|
18
|
+
import { SignJWT } from "jose";
|
|
19
|
+
async function createStudioToken(secretKey) {
|
|
20
|
+
const secret = new TextEncoder().encode(secretKey);
|
|
21
|
+
return new SignJWT({
|
|
22
|
+
sub: "cli-user",
|
|
23
|
+
aud: "kalp-studio",
|
|
24
|
+
iat: Math.floor(Date.now() / 1e3),
|
|
25
|
+
exp: Math.floor(Date.now() / 1e3) + 3600
|
|
26
|
+
}).setProtectedHeader({ alg: "HS256" }).sign(secret);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// src/commands/dev.ts
|
|
30
|
+
var LOGO = "\u{1F98B}";
|
|
31
|
+
var dev_default = defineCommand({
|
|
32
|
+
meta: { name: "dev", description: "Run Worker + Studio local environment" },
|
|
33
|
+
async run() {
|
|
34
|
+
const cwd = process.cwd();
|
|
35
|
+
p.intro(`${LOGO} ${pc.bold("kalp dev")}`);
|
|
36
|
+
const { key } = await ensureSecretKey(cwd);
|
|
37
|
+
await copyFile(join(cwd, ".env"), join(cwd, ".dev.vars"));
|
|
38
|
+
const token = await createStudioToken(key);
|
|
39
|
+
const runtime = await materializeRuntime(cwd);
|
|
40
|
+
p.note("Starting local runtime (wrangler dev :8787)");
|
|
41
|
+
const backend = execa(
|
|
42
|
+
"npx",
|
|
43
|
+
[
|
|
44
|
+
"wrangler",
|
|
45
|
+
"dev",
|
|
46
|
+
"--port",
|
|
47
|
+
"8787",
|
|
48
|
+
"--config",
|
|
49
|
+
runtime.wranglerConfigPath
|
|
50
|
+
],
|
|
51
|
+
{ cwd, stdio: "inherit" }
|
|
52
|
+
);
|
|
53
|
+
const shutdown = () => {
|
|
54
|
+
backend.kill("SIGINT");
|
|
55
|
+
};
|
|
56
|
+
process.on("SIGINT", shutdown);
|
|
57
|
+
process.on("SIGTERM", shutdown);
|
|
58
|
+
await delay(2500);
|
|
59
|
+
const studioUrl = `http://localhost:8787/studio/?token=${token}`;
|
|
60
|
+
await open(studioUrl);
|
|
61
|
+
p.log.success(`Studio opened at ${pc.cyan(studioUrl)}`);
|
|
62
|
+
try {
|
|
63
|
+
await backend;
|
|
64
|
+
} finally {
|
|
65
|
+
shutdown();
|
|
66
|
+
process.off("SIGINT", shutdown);
|
|
67
|
+
process.off("SIGTERM", shutdown);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
export {
|
|
72
|
+
dev_default as default
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=dev-LE5FR6BF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/dev.ts","../src/utils/studio-token.ts"],"sourcesContent":["import { copyFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { execa } from \"execa\";\nimport open from \"open\";\nimport { ensureSecretKey } from \"@/utils/secret\";\nimport { createStudioToken } from \"@/utils/studio-token\";\nimport { materializeRuntime } from \"@/utils/runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"dev\", description: \"Run Worker + Studio local environment\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp dev\")}`);\n\n const { key } = await ensureSecretKey(cwd);\n await copyFile(join(cwd, \".env\"), join(cwd, \".dev.vars\"));\n const token = await createStudioToken(key);\n const runtime = await materializeRuntime(cwd);\n\n p.note(\"Starting local runtime (wrangler dev :8787)\");\n\n const backend = execa(\n \"npx\",\n [\n \"wrangler\",\n \"dev\",\n \"--port\",\n \"8787\",\n \"--config\",\n runtime.wranglerConfigPath,\n ],\n { cwd, stdio: \"inherit\" },\n );\n\n const shutdown = () => {\n backend.kill(\"SIGINT\");\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n await delay(2500);\n const studioUrl = `http://localhost:8787/studio/?token=${token}`;\n await open(studioUrl);\n p.log.success(`Studio opened at ${pc.cyan(studioUrl)}`);\n\n try {\n await backend;\n } finally {\n shutdown();\n process.off(\"SIGINT\", shutdown);\n process.off(\"SIGTERM\", shutdown);\n }\n },\n});\n","import { SignJWT } from \"jose\";\n\nexport async function createStudioToken(secretKey: string): Promise<string> {\n const secret = new TextEncoder().encode(secretKey);\n\n return new SignJWT({\n sub: \"cli-user\",\n aud: \"kalp-studio\",\n iat: Math.floor(Date.now() / 1000),\n exp: Math.floor(Date.now() / 1000) + 3600,\n })\n .setProtectedHeader({ alg: \"HS256\" })\n .sign(secret);\n}\n"],"mappings":";;;;;;;AAAA,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,cAAc,aAAa;AACpC,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,aAAa;AACtB,OAAO,UAAU;;;ACPjB,SAAS,eAAe;AAExB,eAAsB,kBAAkB,WAAoC;AAC1E,QAAM,SAAS,IAAI,YAAY,EAAE,OAAO,SAAS;AAEjD,SAAO,IAAI,QAAQ;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,IACjC,KAAK,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,IAAI;AAAA,EACvC,CAAC,EACE,mBAAmB,EAAE,KAAK,QAAQ,CAAC,EACnC,KAAK,MAAM;AAChB;;;ADDA,IAAM,OAAO;AAEb,IAAO,cAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,OAAO,aAAa,wCAAwC;AAAA,EAC1E,MAAM,MAAM;AACV,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,UAAU,CAAC,EAAE;AAExC,UAAM,EAAE,IAAI,IAAI,MAAM,gBAAgB,GAAG;AACzC,UAAM,SAAS,KAAK,KAAK,MAAM,GAAG,KAAK,KAAK,WAAW,CAAC;AACxD,UAAM,QAAQ,MAAM,kBAAkB,GAAG;AACzC,UAAM,UAAU,MAAM,mBAAmB,GAAG;AAE5C,IAAE,OAAK,6CAA6C;AAEpD,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,MACA,EAAE,KAAK,OAAO,UAAU;AAAA,IAC1B;AAEA,UAAM,WAAW,MAAM;AACrB,cAAQ,KAAK,QAAQ;AAAA,IACvB;AAEA,YAAQ,GAAG,UAAU,QAAQ;AAC7B,YAAQ,GAAG,WAAW,QAAQ;AAE9B,UAAM,MAAM,IAAI;AAChB,UAAM,YAAY,uCAAuC,KAAK;AAC9D,UAAM,KAAK,SAAS;AACpB,IAAE,MAAI,QAAQ,oBAAoB,GAAG,KAAK,SAAS,CAAC,EAAE;AAEtD,QAAI;AACF,YAAM;AAAA,IACR,UAAE;AACA,eAAS;AACT,cAAQ,IAAI,UAAU,QAAQ;AAC9B,cAAQ,IAAI,WAAW,QAAQ;AAAA,IACjC;AAAA,EACF;AACF,CAAC;","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@ import pc from "picocolors";
|
|
|
8
8
|
// package.json
|
|
9
9
|
var package_default = {
|
|
10
10
|
name: "@kalphq/cli",
|
|
11
|
-
version: "0.0.0-dev-
|
|
11
|
+
version: "0.0.0-dev-20260510044447",
|
|
12
12
|
description: "Zero-config CLI for deploying Kalp agents",
|
|
13
13
|
type: "module",
|
|
14
14
|
license: "MIT",
|
|
@@ -24,7 +24,9 @@ var package_default = {
|
|
|
24
24
|
access: "public"
|
|
25
25
|
},
|
|
26
26
|
scripts: {
|
|
27
|
-
build: "tsup",
|
|
27
|
+
build: "tsup && pnpm run build:studio && pnpm run build:runtime-template",
|
|
28
|
+
"build:studio": "pnpm --filter=@kalphq/studio build",
|
|
29
|
+
"build:runtime-template": "node ./scripts/prepare-runtime-template.mjs",
|
|
28
30
|
dev: "tsup --watch",
|
|
29
31
|
lint: "tsc --noEmit",
|
|
30
32
|
prepublishOnly: "pnpm build"
|
|
@@ -37,6 +39,7 @@ var package_default = {
|
|
|
37
39
|
"@kalphq/sdk": "workspace:*",
|
|
38
40
|
citty: "0.1.6",
|
|
39
41
|
esbuild: "0.25.0",
|
|
42
|
+
execa: "^9.6.1",
|
|
40
43
|
jose: "^5.10.0",
|
|
41
44
|
"json-stable-stringify": "1.3.0",
|
|
42
45
|
open: "^11.0.0",
|
|
@@ -55,12 +58,13 @@ var package_default = {
|
|
|
55
58
|
var LOGO = "\u{1F98B}";
|
|
56
59
|
var COMMANDS = [
|
|
57
60
|
["create", "Add a new agent"],
|
|
58
|
-
["
|
|
61
|
+
["deploy", "Deploy runtime to Cloudflare"],
|
|
62
|
+
["push", "Push agent manifest to Cloudflare"],
|
|
59
63
|
["link", "Link project to Kalp cloud"],
|
|
60
64
|
["secrets", "Manage secrets"],
|
|
61
|
-
["login", "Authenticate with
|
|
65
|
+
["login", "Authenticate with Cloudflare"],
|
|
62
66
|
["logout", "Sign out from Kalp"],
|
|
63
|
-
["
|
|
67
|
+
["dev", "Run Worker + Studio locally"]
|
|
64
68
|
];
|
|
65
69
|
function printHelp() {
|
|
66
70
|
p.log.info(`${pc.bold("Usage")}: kalp <command> [options]`);
|
|
@@ -88,12 +92,13 @@ var main = defineCommand({
|
|
|
88
92
|
},
|
|
89
93
|
subCommands: {
|
|
90
94
|
create: () => import("./create-QTVTQ6QL.js").then((r) => r.default),
|
|
91
|
-
|
|
95
|
+
deploy: () => import("./deploy-PKK545YR.js").then((r) => r.default),
|
|
96
|
+
push: () => import("./push-EI646ZVZ.js").then((r) => r.default),
|
|
92
97
|
link: () => import("./link-WZQSR2TM.js").then((r) => r.default),
|
|
93
|
-
secrets: () => import("./secrets-
|
|
94
|
-
login: () => import("./login-
|
|
95
|
-
logout: () => import("./logout-
|
|
96
|
-
|
|
98
|
+
secrets: () => import("./secrets-P7ADVLOS.js").then((r) => r.default),
|
|
99
|
+
login: () => import("./login-M5Y57ZZU.js").then((r) => r.default),
|
|
100
|
+
logout: () => import("./logout-U5V5K775.js").then((r) => r.default),
|
|
101
|
+
dev: () => import("./dev-LE5FR6BF.js").then((r) => r.default)
|
|
97
102
|
},
|
|
98
103
|
run({ args }) {
|
|
99
104
|
const firstArg = process.argv[2];
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport pkg from \"../package.json\";\n\nconst LOGO = \"🦋\";\n\nconst COMMANDS = [\n [\"create\", \"Add a new agent\"],\n [\"push\", \"Push agent to
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport pkg from \"../package.json\";\n\nconst LOGO = \"🦋\";\n\nconst COMMANDS = [\n [\"create\", \"Add a new agent\"],\n [\"deploy\", \"Deploy runtime to Cloudflare\"],\n [\"push\", \"Push agent manifest to Cloudflare\"],\n [\"link\", \"Link project to Kalp cloud\"],\n [\"secrets\", \"Manage secrets\"],\n [\"login\", \"Authenticate with Cloudflare\"],\n [\"logout\", \"Sign out from Kalp\"],\n [\"dev\", \"Run Worker + Studio locally\"],\n] as const;\n\nfunction printHelp(): void {\n p.log.info(`${pc.bold(\"Usage\")}: kalp <command> [options]`);\n console.log(\"\");\n p.log.info(pc.bold(\"Commands\"));\n\n for (const [name, desc] of COMMANDS) {\n console.log(` ${pc.cyan(name.padEnd(10))}${desc}`);\n }\n\n console.log(\"\");\n p.log.info(`Run ${pc.cyan(\"kalp <command> --help\")} for more info.`);\n}\n\nconst main = defineCommand({\n meta: {\n name: \"kalp\",\n version: pkg.version,\n description: \"🦋 Zero-config agent infrastructure\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n create: () => import(\"./commands/create\").then((r) => r.default),\n deploy: () => import(\"./commands/deploy\").then((r) => r.default),\n push: () => import(\"./commands/push\").then((r) => r.default),\n link: () => import(\"./commands/link\").then((r) => r.default),\n secrets: () => import(\"./commands/secrets\").then((r) => r.default),\n login: () => import(\"./commands/login\").then((r) => r.default),\n logout: () => import(\"./commands/logout\").then((r) => r.default),\n dev: () => import(\"./commands/dev\").then((r) => r.default),\n },\n run({ args }) {\n const firstArg = process.argv[2];\n\n if (args.help) {\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n return;\n }\n\n if (firstArg) {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n },\n});\n\nrunMain(main);\n","{\n \"name\": \"@kalphq/cli\",\n \"version\": \"0.0.0-dev-20260510044447\",\n \"description\": \"Zero-config CLI for deploying Kalp agents\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"author\": \"Kalp HQ\",\n \"bin\": {\n \"kalp\": \"./dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup && pnpm run build:studio && pnpm run build:runtime-template\",\n \"build:studio\": \"pnpm --filter=@kalphq/studio build\",\n \"build:runtime-template\": \"node ./scripts/prepare-runtime-template.mjs\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"tsc --noEmit\",\n \"prepublishOnly\": \"pnpm build\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"24.4.0\",\n \"@clack/prompts\": \"0.9.1\",\n \"@kalphq/compiler\": \"workspace:*\",\n \"@kalphq/project\": \"workspace:*\",\n \"@kalphq/sdk\": \"workspace:*\",\n \"citty\": \"0.1.6\",\n \"esbuild\": \"0.25.0\",\n \"execa\": \"^9.6.1\",\n \"jose\": \"^5.10.0\",\n \"json-stable-stringify\": \"1.3.0\",\n \"open\": \"^11.0.0\",\n \"picocolors\": \"1.1.1\",\n \"zod\": \"3.25.76\"\n },\n \"devDependencies\": {\n \"@types/json-stable-stringify\": \"1.2.0\",\n \"@types/node\": \"^22.15.3\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.0.0\"\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
getAuthToken
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-5RODADXW.js";
|
|
5
|
+
import "./chunk-FO24J6XL.js";
|
|
5
6
|
|
|
6
7
|
// src/commands/secrets/list.ts
|
|
7
8
|
import { defineCommand } from "citty";
|
|
@@ -116,4 +117,4 @@ var list_default = defineCommand({
|
|
|
116
117
|
export {
|
|
117
118
|
list_default as default
|
|
118
119
|
};
|
|
119
|
-
//# sourceMappingURL=list-
|
|
120
|
+
//# sourceMappingURL=list-VMJPWHIH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/secrets/list.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAuthToken } from \"@/utils/auth\";\n\nconst LOGO = \"🦋\";\n\ninterface CloudSecret {\n key: string;\n createdAt: string;\n}\n\nasync function fetchSecretsFromCloud(): Promise<CloudSecret[]> {\n return [\n { key: \"STRIPE_SECRET_KEY\", createdAt: \"2024-01-15T10:30:00Z\" },\n { key: \"OPENAI_API_KEY\", createdAt: \"2024-01-16T14:22:00Z\" },\n ];\n}\n\nasync function readLocalSecrets(cwd: string): Promise<string[]> {\n try {\n const configPath = join(cwd, \"kalp.config.ts\");\n const content = await readFile(configPath, \"utf-8\");\n // Extract secrets array from config\n const match = content.match(/secrets:\\s*\\[([^\\]]*)\\]/);\n if (!match) return [];\n const secretsStr = match[1];\n // Extract quoted strings\n const secrets: string[] = [];\n const regex = /[\"']([^\"']+)[\"']/g;\n\n if (!secretsStr) {\n return [];\n }\n\n let m: RegExpExecArray | null;\n while ((m = regex.exec(secretsStr)) !== null) {\n if (m[1]) {\n secrets.push(m[1]);\n }\n }\n return secrets;\n } catch {\n return [];\n }\n}\n\nexport default defineCommand({\n meta: {\n name: \"list\",\n description: \"List all secrets from Kalp Cloud\",\n },\n args: {\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 list`);\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets list\")}`);\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 const s = p.spinner();\n s.start(\"Fetching secrets from Kalp Cloud...\");\n\n try {\n const [cloudSecrets, localSecrets] = await Promise.all([\n fetchSecretsFromCloud(),\n readLocalSecrets(cwd),\n ]);\n\n s.stop(`Found ${cloudSecrets.length} secrets`);\n\n if (cloudSecrets.length === 0) {\n p.log.info(pc.dim(\"No secrets found in Kalp Cloud.\"));\n p.log.info(pc.dim(`Add secrets with: ${pc.cyan(\"kalp secrets add\")}`));\n } else {\n console.log(\"\");\n p.log.info(pc.bold(\"Cloud Secrets:\"));\n for (const secret of cloudSecrets) {\n const isSynced = localSecrets.includes(secret.key);\n const syncIcon = isSynced ? pc.green(\"✓\") : pc.yellow(\"○\");\n console.log(\n ` ${syncIcon} ${pc.cyan(secret.key)} ${pc.dim(`(${secret.createdAt})`)}`,\n );\n }\n\n if (localSecrets.length > 0) {\n const unsynced = localSecrets.filter(\n (k) => !cloudSecrets.some((s) => s.key === k),\n );\n if (unsynced.length > 0) {\n console.log(\"\");\n p.log.warn(\n pc.yellow(\n `Local-only secrets (not synced): ${unsynced.join(\", \")}`,\n ),\n );\n }\n }\n }\n\n p.outro(\"Done\");\n } catch (error) {\n s.stop(\"Failed to fetch secrets\");\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":"
|
|
1
|
+
{"version":3,"sources":["../src/commands/secrets/list.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAuthToken } from \"@/utils/auth\";\n\nconst LOGO = \"🦋\";\n\ninterface CloudSecret {\n key: string;\n createdAt: string;\n}\n\nasync function fetchSecretsFromCloud(): Promise<CloudSecret[]> {\n return [\n { key: \"STRIPE_SECRET_KEY\", createdAt: \"2024-01-15T10:30:00Z\" },\n { key: \"OPENAI_API_KEY\", createdAt: \"2024-01-16T14:22:00Z\" },\n ];\n}\n\nasync function readLocalSecrets(cwd: string): Promise<string[]> {\n try {\n const configPath = join(cwd, \"kalp.config.ts\");\n const content = await readFile(configPath, \"utf-8\");\n // Extract secrets array from config\n const match = content.match(/secrets:\\s*\\[([^\\]]*)\\]/);\n if (!match) return [];\n const secretsStr = match[1];\n // Extract quoted strings\n const secrets: string[] = [];\n const regex = /[\"']([^\"']+)[\"']/g;\n\n if (!secretsStr) {\n return [];\n }\n\n let m: RegExpExecArray | null;\n while ((m = regex.exec(secretsStr)) !== null) {\n if (m[1]) {\n secrets.push(m[1]);\n }\n }\n return secrets;\n } catch {\n return [];\n }\n}\n\nexport default defineCommand({\n meta: {\n name: \"list\",\n description: \"List all secrets from Kalp Cloud\",\n },\n args: {\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 list`);\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets list\")}`);\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 const s = p.spinner();\n s.start(\"Fetching secrets from Kalp Cloud...\");\n\n try {\n const [cloudSecrets, localSecrets] = await Promise.all([\n fetchSecretsFromCloud(),\n readLocalSecrets(cwd),\n ]);\n\n s.stop(`Found ${cloudSecrets.length} secrets`);\n\n if (cloudSecrets.length === 0) {\n p.log.info(pc.dim(\"No secrets found in Kalp Cloud.\"));\n p.log.info(pc.dim(`Add secrets with: ${pc.cyan(\"kalp secrets add\")}`));\n } else {\n console.log(\"\");\n p.log.info(pc.bold(\"Cloud Secrets:\"));\n for (const secret of cloudSecrets) {\n const isSynced = localSecrets.includes(secret.key);\n const syncIcon = isSynced ? pc.green(\"✓\") : pc.yellow(\"○\");\n console.log(\n ` ${syncIcon} ${pc.cyan(secret.key)} ${pc.dim(`(${secret.createdAt})`)}`,\n );\n }\n\n if (localSecrets.length > 0) {\n const unsynced = localSecrets.filter(\n (k) => !cloudSecrets.some((s) => s.key === k),\n );\n if (unsynced.length > 0) {\n console.log(\"\");\n p.log.warn(\n pc.yellow(\n `Local-only secrets (not synced): ${unsynced.join(\", \")}`,\n ),\n );\n }\n }\n }\n\n p.outro(\"Done\");\n } catch (error) {\n s.stop(\"Failed to fetch secrets\");\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":["s"]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
getCloudflareIdentity,
|
|
4
|
+
saveAuthConfig
|
|
5
|
+
} from "./chunk-5RODADXW.js";
|
|
6
|
+
import "./chunk-FO24J6XL.js";
|
|
7
|
+
|
|
8
|
+
// src/commands/login.ts
|
|
9
|
+
import { defineCommand } from "citty";
|
|
10
|
+
import * as p from "@clack/prompts";
|
|
11
|
+
import pc from "picocolors";
|
|
12
|
+
import { execa } from "execa";
|
|
13
|
+
var LOGO = "\u{1F98B}";
|
|
14
|
+
var login_default = defineCommand({
|
|
15
|
+
meta: { name: "login", description: "Authenticate with Cloudflare" },
|
|
16
|
+
async run() {
|
|
17
|
+
p.intro(`${LOGO} ${pc.bold("kalp login")}`);
|
|
18
|
+
const provider = await p.select({
|
|
19
|
+
message: "Choose login provider",
|
|
20
|
+
options: [
|
|
21
|
+
{ label: "Cloudflare (Recommended)", value: "cloudflare" },
|
|
22
|
+
{ label: "Kalp Cloud", value: "kalp-cloud" }
|
|
23
|
+
]
|
|
24
|
+
});
|
|
25
|
+
if (p.isCancel(provider)) {
|
|
26
|
+
p.outro("Cancelled");
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (provider === "kalp-cloud") {
|
|
30
|
+
p.note(
|
|
31
|
+
"Coming soon. Enterprise cloud execution is currently waitlisted.",
|
|
32
|
+
"Kalp Cloud"
|
|
33
|
+
);
|
|
34
|
+
p.outro(pc.dim("No login executed."));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const s = p.spinner();
|
|
38
|
+
s.start("Opening Cloudflare OAuth login");
|
|
39
|
+
try {
|
|
40
|
+
await execa("npx", ["wrangler", "login"], {
|
|
41
|
+
stdio: "inherit"
|
|
42
|
+
});
|
|
43
|
+
} catch {
|
|
44
|
+
s.stop(pc.red("Cloudflare login failed"));
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
s.stop("Cloudflare login complete");
|
|
48
|
+
s.start("Reading Cloudflare identity");
|
|
49
|
+
const identity = await getCloudflareIdentity();
|
|
50
|
+
const account = identity?.accounts?.[0];
|
|
51
|
+
const accountId = account?.id ?? account?.account_tag;
|
|
52
|
+
const email = identity?.email;
|
|
53
|
+
if (!accountId || !email) {
|
|
54
|
+
s.stop(pc.red("Could not resolve account identity from wrangler whoami"));
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
const authConfig = {
|
|
58
|
+
provider: "cloudflare",
|
|
59
|
+
accountId,
|
|
60
|
+
email,
|
|
61
|
+
expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1e3).toISOString()
|
|
62
|
+
};
|
|
63
|
+
await saveAuthConfig(authConfig);
|
|
64
|
+
s.stop("Cloudflare authentication saved");
|
|
65
|
+
p.log.success(`Logged in as ${pc.cyan(authConfig.email)}`);
|
|
66
|
+
p.note(`Account ID: ${pc.cyan(authConfig.accountId)}`, "Cloudflare");
|
|
67
|
+
p.outro(pc.green("Ready to deploy with Cloudflare Workers"));
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
export {
|
|
71
|
+
login_default as default
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=login-M5Y57ZZU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/login.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { execa } from \"execa\";\nimport {\n getCloudflareIdentity,\n saveAuthConfig,\n type AuthConfig,\n} from \"@/utils/auth\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"login\", description: \"Authenticate with Cloudflare\" },\n async run() {\n p.intro(`${LOGO} ${pc.bold(\"kalp login\")}`);\n\n const provider = await p.select({\n message: \"Choose login provider\",\n options: [\n { label: \"Cloudflare (Recommended)\", value: \"cloudflare\" },\n { label: \"Kalp Cloud\", value: \"kalp-cloud\" },\n ],\n });\n\n if (p.isCancel(provider)) {\n p.outro(\"Cancelled\");\n return;\n }\n\n if (provider === \"kalp-cloud\") {\n p.note(\n \"Coming soon. Enterprise cloud execution is currently waitlisted.\",\n \"Kalp Cloud\",\n );\n p.outro(pc.dim(\"No login executed.\"));\n return;\n }\n\n const s = p.spinner();\n s.start(\"Opening Cloudflare OAuth login\");\n\n try {\n await execa(\"npx\", [\"wrangler\", \"login\"], {\n stdio: \"inherit\",\n });\n } catch {\n s.stop(pc.red(\"Cloudflare login failed\"));\n process.exit(1);\n }\n\n s.stop(\"Cloudflare login complete\");\n s.start(\"Reading Cloudflare identity\");\n const identity = await getCloudflareIdentity();\n const account = identity?.accounts?.[0];\n const accountId = account?.id ?? account?.account_tag;\n const email = identity?.email;\n\n if (!accountId || !email) {\n s.stop(pc.red(\"Could not resolve account identity from wrangler whoami\"));\n process.exit(1);\n }\n\n const authConfig: AuthConfig = {\n provider: \"cloudflare\",\n accountId,\n email,\n expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),\n };\n\n await saveAuthConfig(authConfig);\n\n s.stop(\"Cloudflare authentication saved\");\n p.log.success(`Logged in as ${pc.cyan(authConfig.email)}`);\n p.note(`Account ID: ${pc.cyan(authConfig.accountId)}`, \"Cloudflare\");\n p.outro(pc.green(\"Ready to deploy with Cloudflare Workers\"));\n },\n});\n"],"mappings":";;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,aAAa;AAOtB,IAAM,OAAO;AAEb,IAAO,gBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,SAAS,aAAa,+BAA+B;AAAA,EACnE,MAAM,MAAM;AACV,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,YAAY,CAAC,EAAE;AAE1C,UAAM,WAAW,MAAQ,SAAO;AAAA,MAC9B,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,OAAO,4BAA4B,OAAO,aAAa;AAAA,QACzD,EAAE,OAAO,cAAc,OAAO,aAAa;AAAA,MAC7C;AAAA,IACF,CAAC;AAED,QAAM,WAAS,QAAQ,GAAG;AACxB,MAAE,QAAM,WAAW;AACnB;AAAA,IACF;AAEA,QAAI,aAAa,cAAc;AAC7B,MAAE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,MAAE,QAAM,GAAG,IAAI,oBAAoB,CAAC;AACpC;AAAA,IACF;AAEA,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,gCAAgC;AAExC,QAAI;AACF,YAAM,MAAM,OAAO,CAAC,YAAY,OAAO,GAAG;AAAA,QACxC,OAAO;AAAA,MACT,CAAC;AAAA,IACH,QAAQ;AACN,QAAE,KAAK,GAAG,IAAI,yBAAyB,CAAC;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,MAAE,KAAK,2BAA2B;AAClC,MAAE,MAAM,6BAA6B;AACrC,UAAM,WAAW,MAAM,sBAAsB;AAC7C,UAAM,UAAU,UAAU,WAAW,CAAC;AACtC,UAAM,YAAY,SAAS,MAAM,SAAS;AAC1C,UAAM,QAAQ,UAAU;AAExB,QAAI,CAAC,aAAa,CAAC,OAAO;AACxB,QAAE,KAAK,GAAG,IAAI,yDAAyD,CAAC;AACxE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,aAAyB;AAAA,MAC7B,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,WAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,GAAI,EAAE,YAAY;AAAA,IACzE;AAEA,UAAM,eAAe,UAAU;AAE/B,MAAE,KAAK,iCAAiC;AACxC,IAAE,MAAI,QAAQ,gBAAgB,GAAG,KAAK,WAAW,KAAK,CAAC,EAAE;AACzD,IAAE,OAAK,eAAe,GAAG,KAAK,WAAW,SAAS,CAAC,IAAI,YAAY;AACnE,IAAE,QAAM,GAAG,MAAM,yCAAyC,CAAC;AAAA,EAC7D;AACF,CAAC;","names":[]}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
getGlobalConfigDir
|
|
4
|
+
} from "./chunk-FO24J6XL.js";
|
|
2
5
|
|
|
3
6
|
// src/commands/logout.ts
|
|
4
7
|
import { defineCommand } from "citty";
|
|
@@ -6,17 +9,15 @@ import * as p from "@clack/prompts";
|
|
|
6
9
|
import pc from "picocolors";
|
|
7
10
|
import { rm } from "fs/promises";
|
|
8
11
|
import { join } from "path";
|
|
9
|
-
import { homedir } from "os";
|
|
10
12
|
var LOGO = "\u{1F98B}";
|
|
11
13
|
var logout_default = defineCommand({
|
|
12
14
|
meta: { name: "logout", description: "Sign out from Kalp" },
|
|
13
15
|
async run() {
|
|
14
|
-
const home = homedir();
|
|
15
16
|
p.intro(`${LOGO} ${pc.bold("kalp logout")}`);
|
|
16
17
|
const s = p.spinner();
|
|
17
18
|
s.start("Signing out...");
|
|
18
19
|
try {
|
|
19
|
-
await rm(join(
|
|
20
|
+
await rm(join(getGlobalConfigDir(), "auth.json"), { force: true });
|
|
20
21
|
s.stop("Signed out successfully");
|
|
21
22
|
p.outro(pc.green("Logged out from Kalp"));
|
|
22
23
|
} catch {
|
|
@@ -28,4 +29,4 @@ var logout_default = defineCommand({
|
|
|
28
29
|
export {
|
|
29
30
|
logout_default as default
|
|
30
31
|
};
|
|
31
|
-
//# sourceMappingURL=logout-
|
|
32
|
+
//# sourceMappingURL=logout-U5V5K775.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/logout.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getGlobalConfigDir } from \"@/utils/config\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"logout\", description: \"Sign out from Kalp\" },\n async run() {\n p.intro(`${LOGO} ${pc.bold(\"kalp logout\")}`);\n\n const s = p.spinner();\n s.start(\"Signing out...\");\n\n try {\n await rm(join(getGlobalConfigDir(), \"auth.json\"), { force: true });\n s.stop(\"Signed out successfully\");\n p.outro(pc.green(\"Logged out from Kalp\"));\n } catch {\n s.stop(\"Nothing to do\");\n p.outro(pc.dim(\"No active session found\"));\n }\n },\n});\n"],"mappings":";;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,UAAU;AACnB,SAAS,YAAY;AAGrB,IAAM,OAAO;AAEb,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,EAC1D,MAAM,MAAM;AACV,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,aAAa,CAAC,EAAE;AAE3C,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,gBAAgB;AAExB,QAAI;AACF,YAAM,GAAG,KAAK,mBAAmB,GAAG,WAAW,GAAG,EAAE,OAAO,KAAK,CAAC;AACjE,QAAE,KAAK,yBAAyB;AAChC,MAAE,QAAM,GAAG,MAAM,sBAAsB,CAAC;AAAA,IAC1C,QAAQ;AACN,QAAE,KAAK,eAAe;AACtB,MAAE,QAAM,GAAG,IAAI,yBAAyB,CAAC;AAAA,IAC3C;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
ensureConfig
|
|
4
|
+
} from "./chunk-INB3LG6O.js";
|
|
5
|
+
import {
|
|
6
|
+
readProjectState,
|
|
7
|
+
runInitialDeploy
|
|
8
|
+
} from "./chunk-MM6CND3O.js";
|
|
9
|
+
import {
|
|
10
|
+
materializeRuntime
|
|
11
|
+
} from "./chunk-TTKFK7NJ.js";
|
|
12
|
+
import {
|
|
13
|
+
requireAuth
|
|
14
|
+
} from "./chunk-5RODADXW.js";
|
|
15
|
+
import {
|
|
16
|
+
ensureGlobalConfigDir
|
|
17
|
+
} from "./chunk-FO24J6XL.js";
|
|
18
|
+
|
|
19
|
+
// src/commands/push.ts
|
|
20
|
+
import { access as access2, mkdir, rm as rm2, writeFile as writeFile2 } from "fs/promises";
|
|
21
|
+
import { join as join3 } from "path";
|
|
22
|
+
import { defineCommand } from "citty";
|
|
23
|
+
import * as p from "@clack/prompts";
|
|
24
|
+
import pc from "picocolors";
|
|
25
|
+
import { execa } from "execa";
|
|
26
|
+
|
|
27
|
+
// src/utils/manifest/index.ts
|
|
28
|
+
import { access, readFile, rm, mkdtemp } from "fs/promises";
|
|
29
|
+
import { join } from "path";
|
|
30
|
+
import { tmpdir } from "os";
|
|
31
|
+
import { buildAgent } from "@kalphq/compiler";
|
|
32
|
+
|
|
33
|
+
// src/utils/ir/hashIR.ts
|
|
34
|
+
import { calculateAgentHash } from "@kalphq/compiler";
|
|
35
|
+
function computePushHash(ir) {
|
|
36
|
+
const bundles = ir.bundles || {};
|
|
37
|
+
const handlers = Object.keys(bundles).reduce(
|
|
38
|
+
(acc, hash) => ({
|
|
39
|
+
...acc,
|
|
40
|
+
[hash]: { hash }
|
|
41
|
+
}),
|
|
42
|
+
{}
|
|
43
|
+
);
|
|
44
|
+
return calculateAgentHash(ir, handlers);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// src/utils/manifest/index.ts
|
|
48
|
+
async function readAgentManifest(params) {
|
|
49
|
+
const { cwd, agentName } = params;
|
|
50
|
+
const agentPath = join(cwd, "agents", agentName, "index.ts");
|
|
51
|
+
await access(agentPath);
|
|
52
|
+
const tempOutDir = await mkdtemp(join(tmpdir(), "kalp-build-"));
|
|
53
|
+
try {
|
|
54
|
+
await buildAgent(agentPath, tempOutDir, cwd);
|
|
55
|
+
const irContent = await readFile(join(tempOutDir, "ir.json"), "utf-8");
|
|
56
|
+
const ir = JSON.parse(irContent);
|
|
57
|
+
return {
|
|
58
|
+
format: "kalp-agent-manifest",
|
|
59
|
+
schemaVersion: 3,
|
|
60
|
+
ir,
|
|
61
|
+
metadata: {
|
|
62
|
+
generatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
} finally {
|
|
66
|
+
await rm(tempOutDir, { recursive: true, force: true });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// src/utils/validate.ts
|
|
71
|
+
import {
|
|
72
|
+
analyzeHandler,
|
|
73
|
+
calculateAgentHash as calculateAgentHash2,
|
|
74
|
+
validateIR,
|
|
75
|
+
validateIRBindings
|
|
76
|
+
} from "@kalphq/compiler";
|
|
77
|
+
function validateCompiledIR(input) {
|
|
78
|
+
const { ir, hash } = input;
|
|
79
|
+
const bundles = ir.bundles || {};
|
|
80
|
+
const bundleHashes = Object.keys(bundles);
|
|
81
|
+
const irValidation = validateIR(ir);
|
|
82
|
+
if (!irValidation.valid) {
|
|
83
|
+
return { ok: false, phase: "ir", errors: irValidation.errors };
|
|
84
|
+
}
|
|
85
|
+
const bindingsValidation = validateIRBindings(ir, bundleHashes);
|
|
86
|
+
if (!bindingsValidation.valid) {
|
|
87
|
+
return { ok: false, phase: "bindings", errors: bindingsValidation.errors };
|
|
88
|
+
}
|
|
89
|
+
const handlers = bundleHashes.reduce(
|
|
90
|
+
(acc, key) => ({ ...acc, [key]: { hash: key } }),
|
|
91
|
+
{}
|
|
92
|
+
);
|
|
93
|
+
const expectedHash = calculateAgentHash2(ir, handlers);
|
|
94
|
+
if (expectedHash !== hash) {
|
|
95
|
+
return {
|
|
96
|
+
ok: false,
|
|
97
|
+
phase: "hash",
|
|
98
|
+
errors: [
|
|
99
|
+
`Hash mismatch: client provided ${hash}, calculated ${expectedHash}`
|
|
100
|
+
]
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const analysis = Object.entries(bundles).map(
|
|
104
|
+
([name, bundle]) => ({
|
|
105
|
+
name,
|
|
106
|
+
...analyzeHandler(bundle.code)
|
|
107
|
+
})
|
|
108
|
+
);
|
|
109
|
+
const blockers = analysis.flatMap(
|
|
110
|
+
(entry) => entry.blockers.map((blocker) => `${blocker} in ${entry.name}`)
|
|
111
|
+
);
|
|
112
|
+
if (blockers.length > 0) {
|
|
113
|
+
return {
|
|
114
|
+
ok: false,
|
|
115
|
+
phase: "analysis",
|
|
116
|
+
blockers,
|
|
117
|
+
errors: blockers.map((b) => `[Analysis Blocker] ${b}`),
|
|
118
|
+
analysis
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
return { ok: true, analysis };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// src/utils/agent-store.ts
|
|
125
|
+
import { readFile as readFile2, writeFile } from "fs/promises";
|
|
126
|
+
import { join as join2 } from "path";
|
|
127
|
+
async function getStorePath() {
|
|
128
|
+
return join2(await ensureGlobalConfigDir(), "agents.json");
|
|
129
|
+
}
|
|
130
|
+
async function readAgentStore() {
|
|
131
|
+
try {
|
|
132
|
+
const storePath = await getStorePath();
|
|
133
|
+
const content = await readFile2(storePath, "utf-8");
|
|
134
|
+
return JSON.parse(content);
|
|
135
|
+
} catch {
|
|
136
|
+
return {};
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async function getAgentStoreEntry(agentName) {
|
|
140
|
+
const store = await readAgentStore();
|
|
141
|
+
return store[agentName] ?? null;
|
|
142
|
+
}
|
|
143
|
+
async function writeAgentStoreEntry(agentName, entry) {
|
|
144
|
+
const storePath = await getStorePath();
|
|
145
|
+
const store = await readAgentStore();
|
|
146
|
+
store[agentName] = entry;
|
|
147
|
+
await writeFile(storePath, JSON.stringify(store, null, 2), "utf-8");
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// src/commands/push.ts
|
|
151
|
+
var LOGO = "\u{1F98B}";
|
|
152
|
+
function formatBytes(bytes) {
|
|
153
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
154
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
155
|
+
}
|
|
156
|
+
var push_default = defineCommand({
|
|
157
|
+
meta: { name: "push", description: "Push agent manifest to Cloudflare KV" },
|
|
158
|
+
args: {
|
|
159
|
+
agent: {
|
|
160
|
+
type: "string",
|
|
161
|
+
alias: "a",
|
|
162
|
+
description: "Agent name to push",
|
|
163
|
+
required: false
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
async run({ args }) {
|
|
167
|
+
const cwd = process.cwd();
|
|
168
|
+
const agentName = args.agent;
|
|
169
|
+
p.intro(`${LOGO} ${pc.bold("kalp push")}`);
|
|
170
|
+
if (!agentName) {
|
|
171
|
+
p.log.error(`Missing required flag ${pc.cyan("-a <agent-name>")}`);
|
|
172
|
+
process.exit(1);
|
|
173
|
+
}
|
|
174
|
+
await requireAuth().catch(() => {
|
|
175
|
+
p.log.error("Not authenticated. Run `kalp login` first.");
|
|
176
|
+
process.exit(1);
|
|
177
|
+
});
|
|
178
|
+
await ensureConfig(cwd).catch(() => {
|
|
179
|
+
p.log.error(`${pc.cyan("kalp.config.ts")} not found`);
|
|
180
|
+
process.exit(1);
|
|
181
|
+
});
|
|
182
|
+
const agentPath = join3(cwd, "agents", agentName, "index.ts");
|
|
183
|
+
await access2(agentPath).catch(() => {
|
|
184
|
+
p.log.error(`Agent ${pc.cyan(agentName)} not found`);
|
|
185
|
+
process.exit(1);
|
|
186
|
+
});
|
|
187
|
+
let state = await readProjectState(cwd);
|
|
188
|
+
if (!state) {
|
|
189
|
+
p.log.warn("No .kalp/state.json found. Running initial deploy first...");
|
|
190
|
+
const deploy = await runInitialDeploy(cwd);
|
|
191
|
+
state = {
|
|
192
|
+
workerUrl: deploy.workerUrl,
|
|
193
|
+
deployedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
194
|
+
accountId: deploy.accountId
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
const runtime = await materializeRuntime(cwd);
|
|
198
|
+
const s = p.spinner();
|
|
199
|
+
s.start(`Compiling ${pc.cyan(agentName)}`);
|
|
200
|
+
const manifest = await readAgentManifest({ cwd, agentName });
|
|
201
|
+
const hash = computePushHash(manifest.ir);
|
|
202
|
+
s.stop(`Compiled ${pc.cyan(agentName)} (${hash.slice(0, 8)})`);
|
|
203
|
+
const validation = validateCompiledIR({ agentName, ir: manifest.ir, hash });
|
|
204
|
+
if (!validation.ok) {
|
|
205
|
+
p.log.error(`Validation failed at phase: ${validation.phase}`);
|
|
206
|
+
for (const err of validation.errors ?? []) {
|
|
207
|
+
p.log.error(err);
|
|
208
|
+
}
|
|
209
|
+
process.exit(1);
|
|
210
|
+
}
|
|
211
|
+
const previous = await getAgentStoreEntry(agentName);
|
|
212
|
+
const agentWorkerUrl = `${state.workerUrl.replace(/\/$/, "")}/a/${agentName}`;
|
|
213
|
+
if (previous?.hash === hash && previous.workerUrl === agentWorkerUrl) {
|
|
214
|
+
p.note(
|
|
215
|
+
`No changes detected for ${pc.cyan(agentName)} (${hash.slice(0, 8)}).`,
|
|
216
|
+
"Skipped"
|
|
217
|
+
);
|
|
218
|
+
p.outro(`${LOGO} ${pc.green("Nothing to push")}`);
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
const manifestKey = `${agentName}:${hash}`;
|
|
222
|
+
const latestKey = `${agentName}:latest`;
|
|
223
|
+
const manifestPath = join3(cwd, ".kalp", `${agentName}-${hash}.json`);
|
|
224
|
+
await mkdir(join3(cwd, ".kalp"), { recursive: true });
|
|
225
|
+
await writeFile2(manifestPath, JSON.stringify(manifest.ir), "utf-8");
|
|
226
|
+
try {
|
|
227
|
+
s.start("Uploading manifest to Cloudflare KV");
|
|
228
|
+
await execa(
|
|
229
|
+
"npx",
|
|
230
|
+
[
|
|
231
|
+
"wrangler",
|
|
232
|
+
"kv",
|
|
233
|
+
"key",
|
|
234
|
+
"put",
|
|
235
|
+
"--binding",
|
|
236
|
+
"KALP_MANIFESTS",
|
|
237
|
+
manifestKey,
|
|
238
|
+
"--path",
|
|
239
|
+
manifestPath,
|
|
240
|
+
"--remote",
|
|
241
|
+
"--config",
|
|
242
|
+
runtime.wranglerConfigPath
|
|
243
|
+
],
|
|
244
|
+
{ cwd }
|
|
245
|
+
);
|
|
246
|
+
await execa(
|
|
247
|
+
"npx",
|
|
248
|
+
[
|
|
249
|
+
"wrangler",
|
|
250
|
+
"kv",
|
|
251
|
+
"key",
|
|
252
|
+
"put",
|
|
253
|
+
"--binding",
|
|
254
|
+
"KALP_MANIFESTS",
|
|
255
|
+
latestKey,
|
|
256
|
+
hash,
|
|
257
|
+
"--remote",
|
|
258
|
+
"--config",
|
|
259
|
+
runtime.wranglerConfigPath
|
|
260
|
+
],
|
|
261
|
+
{ cwd }
|
|
262
|
+
);
|
|
263
|
+
s.stop("Manifest uploaded");
|
|
264
|
+
} finally {
|
|
265
|
+
await rm2(manifestPath, { force: true });
|
|
266
|
+
}
|
|
267
|
+
const bundles = manifest.ir.bundles || {};
|
|
268
|
+
const totalSize = Object.values(bundles).reduce(
|
|
269
|
+
(sum, bundle) => sum + Buffer.byteLength(bundle.code),
|
|
270
|
+
0
|
|
271
|
+
);
|
|
272
|
+
const handlerCount = Object.keys(bundles).length;
|
|
273
|
+
await writeAgentStoreEntry(agentName, {
|
|
274
|
+
hash,
|
|
275
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
276
|
+
workerUrl: agentWorkerUrl,
|
|
277
|
+
localPath: agentPath
|
|
278
|
+
});
|
|
279
|
+
p.log.success(
|
|
280
|
+
`${pc.bold(agentName)} pushed \xB7 ${handlerCount} handlers \xB7 ${formatBytes(totalSize)}`
|
|
281
|
+
);
|
|
282
|
+
p.note(`KV keys updated: ${manifestKey}, ${latestKey}`, "Cloudflare KV");
|
|
283
|
+
p.outro(`${LOGO} ${pc.green("Live at")} ${pc.cyan(agentWorkerUrl)}`);
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
export {
|
|
287
|
+
push_default as default
|
|
288
|
+
};
|
|
289
|
+
//# sourceMappingURL=push-EI646ZVZ.js.map
|