@kalphq/cli 0.0.0-dev-20260509010940 → 0.0.0-dev-20260510030416
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-E7V5UMX7.js +28 -0
- package/dist/chunk-E7V5UMX7.js.map +1 -0
- package/dist/chunk-FO24J6XL.js +23 -0
- package/dist/chunk-FO24J6XL.js.map +1 -0
- package/dist/chunk-NJ3OTDOX.js +93 -0
- package/dist/chunk-NJ3OTDOX.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-HRUJDN2F.js +63 -0
- package/dist/deploy-HRUJDN2F.js.map +1 -0
- package/dist/dev-ZKXOQ2GQ.js +71 -0
- package/dist/dev-ZKXOQ2GQ.js.map +1 -0
- package/dist/index.js +12 -9
- 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-P2NWWXGL.js +287 -0
- package/dist/push-P2NWWXGL.js.map +1 -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 +5 -4
- 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-7LGUD42G.js +0 -92
- package/dist/studio-7LGUD42G.js.map +0 -1
- /package/dist/{secrets-KFMVBKJQ.js.map → secrets-P7ADVLOS.js.map} +0 -0
|
@@ -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,287 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
ensureConfig
|
|
4
|
+
} from "./chunk-INB3LG6O.js";
|
|
5
|
+
import {
|
|
6
|
+
readProjectState,
|
|
7
|
+
runInitialDeploy
|
|
8
|
+
} from "./chunk-NJ3OTDOX.js";
|
|
9
|
+
import "./chunk-E7V5UMX7.js";
|
|
10
|
+
import {
|
|
11
|
+
requireAuth
|
|
12
|
+
} from "./chunk-5RODADXW.js";
|
|
13
|
+
import {
|
|
14
|
+
ensureGlobalConfigDir
|
|
15
|
+
} from "./chunk-FO24J6XL.js";
|
|
16
|
+
|
|
17
|
+
// src/commands/push.ts
|
|
18
|
+
import { access as access2, mkdir, rm as rm2, writeFile as writeFile2 } from "fs/promises";
|
|
19
|
+
import { join as join3 } from "path";
|
|
20
|
+
import { defineCommand } from "citty";
|
|
21
|
+
import * as p from "@clack/prompts";
|
|
22
|
+
import pc from "picocolors";
|
|
23
|
+
import { execa } from "execa";
|
|
24
|
+
|
|
25
|
+
// src/utils/manifest/index.ts
|
|
26
|
+
import { access, readFile, rm, mkdtemp } from "fs/promises";
|
|
27
|
+
import { join } from "path";
|
|
28
|
+
import { tmpdir } from "os";
|
|
29
|
+
import { buildAgent } from "@kalphq/compiler";
|
|
30
|
+
|
|
31
|
+
// src/utils/ir/hashIR.ts
|
|
32
|
+
import { calculateAgentHash } from "@kalphq/compiler";
|
|
33
|
+
function computePushHash(ir) {
|
|
34
|
+
const bundles = ir.bundles || {};
|
|
35
|
+
const handlers = Object.keys(bundles).reduce(
|
|
36
|
+
(acc, hash) => ({
|
|
37
|
+
...acc,
|
|
38
|
+
[hash]: { hash }
|
|
39
|
+
}),
|
|
40
|
+
{}
|
|
41
|
+
);
|
|
42
|
+
return calculateAgentHash(ir, handlers);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// src/utils/manifest/index.ts
|
|
46
|
+
async function readAgentManifest(params) {
|
|
47
|
+
const { cwd, agentName } = params;
|
|
48
|
+
const agentPath = join(cwd, "agents", agentName, "index.ts");
|
|
49
|
+
await access(agentPath);
|
|
50
|
+
const tempOutDir = await mkdtemp(join(tmpdir(), "kalp-build-"));
|
|
51
|
+
try {
|
|
52
|
+
await buildAgent(agentPath, tempOutDir, cwd);
|
|
53
|
+
const irContent = await readFile(join(tempOutDir, "ir.json"), "utf-8");
|
|
54
|
+
const ir = JSON.parse(irContent);
|
|
55
|
+
return {
|
|
56
|
+
format: "kalp-agent-manifest",
|
|
57
|
+
schemaVersion: 3,
|
|
58
|
+
ir,
|
|
59
|
+
metadata: {
|
|
60
|
+
generatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
} finally {
|
|
64
|
+
await rm(tempOutDir, { recursive: true, force: true });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// src/utils/validate.ts
|
|
69
|
+
import {
|
|
70
|
+
analyzeHandler,
|
|
71
|
+
calculateAgentHash as calculateAgentHash2,
|
|
72
|
+
validateIR,
|
|
73
|
+
validateIRBindings
|
|
74
|
+
} from "@kalphq/compiler";
|
|
75
|
+
function validateCompiledIR(input) {
|
|
76
|
+
const { ir, hash } = input;
|
|
77
|
+
const bundles = ir.bundles || {};
|
|
78
|
+
const bundleHashes = Object.keys(bundles);
|
|
79
|
+
const irValidation = validateIR(ir);
|
|
80
|
+
if (!irValidation.valid) {
|
|
81
|
+
return { ok: false, phase: "ir", errors: irValidation.errors };
|
|
82
|
+
}
|
|
83
|
+
const bindingsValidation = validateIRBindings(ir, bundleHashes);
|
|
84
|
+
if (!bindingsValidation.valid) {
|
|
85
|
+
return { ok: false, phase: "bindings", errors: bindingsValidation.errors };
|
|
86
|
+
}
|
|
87
|
+
const handlers = bundleHashes.reduce(
|
|
88
|
+
(acc, key) => ({ ...acc, [key]: { hash: key } }),
|
|
89
|
+
{}
|
|
90
|
+
);
|
|
91
|
+
const expectedHash = calculateAgentHash2(ir, handlers);
|
|
92
|
+
if (expectedHash !== hash) {
|
|
93
|
+
return {
|
|
94
|
+
ok: false,
|
|
95
|
+
phase: "hash",
|
|
96
|
+
errors: [
|
|
97
|
+
`Hash mismatch: client provided ${hash}, calculated ${expectedHash}`
|
|
98
|
+
]
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
const analysis = Object.entries(bundles).map(
|
|
102
|
+
([name, bundle]) => ({
|
|
103
|
+
name,
|
|
104
|
+
...analyzeHandler(bundle.code)
|
|
105
|
+
})
|
|
106
|
+
);
|
|
107
|
+
const blockers = analysis.flatMap(
|
|
108
|
+
(entry) => entry.blockers.map((blocker) => `${blocker} in ${entry.name}`)
|
|
109
|
+
);
|
|
110
|
+
if (blockers.length > 0) {
|
|
111
|
+
return {
|
|
112
|
+
ok: false,
|
|
113
|
+
phase: "analysis",
|
|
114
|
+
blockers,
|
|
115
|
+
errors: blockers.map((b) => `[Analysis Blocker] ${b}`),
|
|
116
|
+
analysis
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
return { ok: true, analysis };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// src/utils/agent-store.ts
|
|
123
|
+
import { readFile as readFile2, writeFile } from "fs/promises";
|
|
124
|
+
import { join as join2 } from "path";
|
|
125
|
+
async function getStorePath() {
|
|
126
|
+
return join2(await ensureGlobalConfigDir(), "agents.json");
|
|
127
|
+
}
|
|
128
|
+
async function readAgentStore() {
|
|
129
|
+
try {
|
|
130
|
+
const storePath = await getStorePath();
|
|
131
|
+
const content = await readFile2(storePath, "utf-8");
|
|
132
|
+
return JSON.parse(content);
|
|
133
|
+
} catch {
|
|
134
|
+
return {};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async function getAgentStoreEntry(agentName) {
|
|
138
|
+
const store = await readAgentStore();
|
|
139
|
+
return store[agentName] ?? null;
|
|
140
|
+
}
|
|
141
|
+
async function writeAgentStoreEntry(agentName, entry) {
|
|
142
|
+
const storePath = await getStorePath();
|
|
143
|
+
const store = await readAgentStore();
|
|
144
|
+
store[agentName] = entry;
|
|
145
|
+
await writeFile(storePath, JSON.stringify(store, null, 2), "utf-8");
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// src/commands/push.ts
|
|
149
|
+
var LOGO = "\u{1F98B}";
|
|
150
|
+
var WRANGLER_CONFIG = "packages/cloudflare/wrangler.jsonc";
|
|
151
|
+
function formatBytes(bytes) {
|
|
152
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
153
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
154
|
+
}
|
|
155
|
+
var push_default = defineCommand({
|
|
156
|
+
meta: { name: "push", description: "Push agent manifest to Cloudflare KV" },
|
|
157
|
+
args: {
|
|
158
|
+
agent: {
|
|
159
|
+
type: "string",
|
|
160
|
+
alias: "a",
|
|
161
|
+
description: "Agent name to push",
|
|
162
|
+
required: false
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
async run({ args }) {
|
|
166
|
+
const cwd = process.cwd();
|
|
167
|
+
const agentName = args.agent;
|
|
168
|
+
p.intro(`${LOGO} ${pc.bold("kalp push")}`);
|
|
169
|
+
if (!agentName) {
|
|
170
|
+
p.log.error(`Missing required flag ${pc.cyan("-a <agent-name>")}`);
|
|
171
|
+
process.exit(1);
|
|
172
|
+
}
|
|
173
|
+
await requireAuth().catch(() => {
|
|
174
|
+
p.log.error("Not authenticated. Run `kalp login` first.");
|
|
175
|
+
process.exit(1);
|
|
176
|
+
});
|
|
177
|
+
await ensureConfig(cwd).catch(() => {
|
|
178
|
+
p.log.error(`${pc.cyan("kalp.config.ts")} not found`);
|
|
179
|
+
process.exit(1);
|
|
180
|
+
});
|
|
181
|
+
const agentPath = join3(cwd, "agents", agentName, "index.ts");
|
|
182
|
+
await access2(agentPath).catch(() => {
|
|
183
|
+
p.log.error(`Agent ${pc.cyan(agentName)} not found`);
|
|
184
|
+
process.exit(1);
|
|
185
|
+
});
|
|
186
|
+
let state = await readProjectState(cwd);
|
|
187
|
+
if (!state) {
|
|
188
|
+
p.log.warn("No .kalp/state.json found. Running initial deploy first...");
|
|
189
|
+
const deploy = await runInitialDeploy(cwd);
|
|
190
|
+
state = {
|
|
191
|
+
workerUrl: deploy.workerUrl,
|
|
192
|
+
deployedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
193
|
+
accountId: deploy.accountId
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
const s = p.spinner();
|
|
197
|
+
s.start(`Compiling ${pc.cyan(agentName)}`);
|
|
198
|
+
const manifest = await readAgentManifest({ cwd, agentName });
|
|
199
|
+
const hash = computePushHash(manifest.ir);
|
|
200
|
+
s.stop(`Compiled ${pc.cyan(agentName)} (${hash.slice(0, 8)})`);
|
|
201
|
+
const validation = validateCompiledIR({ agentName, ir: manifest.ir, hash });
|
|
202
|
+
if (!validation.ok) {
|
|
203
|
+
p.log.error(`Validation failed at phase: ${validation.phase}`);
|
|
204
|
+
for (const err of validation.errors ?? []) {
|
|
205
|
+
p.log.error(err);
|
|
206
|
+
}
|
|
207
|
+
process.exit(1);
|
|
208
|
+
}
|
|
209
|
+
const previous = await getAgentStoreEntry(agentName);
|
|
210
|
+
const agentWorkerUrl = `${state.workerUrl.replace(/\/$/, "")}/a/${agentName}`;
|
|
211
|
+
if (previous?.hash === hash && previous.workerUrl === agentWorkerUrl) {
|
|
212
|
+
p.note(
|
|
213
|
+
`No changes detected for ${pc.cyan(agentName)} (${hash.slice(0, 8)}).`,
|
|
214
|
+
"Skipped"
|
|
215
|
+
);
|
|
216
|
+
p.outro(`${LOGO} ${pc.green("Nothing to push")}`);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
const manifestKey = `${agentName}:${hash}`;
|
|
220
|
+
const latestKey = `${agentName}:latest`;
|
|
221
|
+
const manifestPath = join3(cwd, ".kalp", `${agentName}-${hash}.json`);
|
|
222
|
+
await mkdir(join3(cwd, ".kalp"), { recursive: true });
|
|
223
|
+
await writeFile2(manifestPath, JSON.stringify(manifest.ir), "utf-8");
|
|
224
|
+
try {
|
|
225
|
+
s.start("Uploading manifest to Cloudflare KV");
|
|
226
|
+
await execa(
|
|
227
|
+
"npx",
|
|
228
|
+
[
|
|
229
|
+
"wrangler",
|
|
230
|
+
"kv",
|
|
231
|
+
"key",
|
|
232
|
+
"put",
|
|
233
|
+
"--binding",
|
|
234
|
+
"KALP_MANIFESTS",
|
|
235
|
+
manifestKey,
|
|
236
|
+
"--path",
|
|
237
|
+
manifestPath,
|
|
238
|
+
"--remote",
|
|
239
|
+
"--config",
|
|
240
|
+
WRANGLER_CONFIG
|
|
241
|
+
],
|
|
242
|
+
{ cwd }
|
|
243
|
+
);
|
|
244
|
+
await execa(
|
|
245
|
+
"npx",
|
|
246
|
+
[
|
|
247
|
+
"wrangler",
|
|
248
|
+
"kv",
|
|
249
|
+
"key",
|
|
250
|
+
"put",
|
|
251
|
+
"--binding",
|
|
252
|
+
"KALP_MANIFESTS",
|
|
253
|
+
latestKey,
|
|
254
|
+
hash,
|
|
255
|
+
"--remote",
|
|
256
|
+
"--config",
|
|
257
|
+
WRANGLER_CONFIG
|
|
258
|
+
],
|
|
259
|
+
{ cwd }
|
|
260
|
+
);
|
|
261
|
+
s.stop("Manifest uploaded");
|
|
262
|
+
} finally {
|
|
263
|
+
await rm2(manifestPath, { force: true });
|
|
264
|
+
}
|
|
265
|
+
const bundles = manifest.ir.bundles || {};
|
|
266
|
+
const totalSize = Object.values(bundles).reduce(
|
|
267
|
+
(sum, bundle) => sum + Buffer.byteLength(bundle.code),
|
|
268
|
+
0
|
|
269
|
+
);
|
|
270
|
+
const handlerCount = Object.keys(bundles).length;
|
|
271
|
+
await writeAgentStoreEntry(agentName, {
|
|
272
|
+
hash,
|
|
273
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
274
|
+
workerUrl: agentWorkerUrl,
|
|
275
|
+
localPath: agentPath
|
|
276
|
+
});
|
|
277
|
+
p.log.success(
|
|
278
|
+
`${pc.bold(agentName)} pushed \xB7 ${handlerCount} handlers \xB7 ${formatBytes(totalSize)}`
|
|
279
|
+
);
|
|
280
|
+
p.note(`KV keys updated: ${manifestKey}, ${latestKey}`, "Cloudflare KV");
|
|
281
|
+
p.outro(`${LOGO} ${pc.green("Live at")} ${pc.cyan(agentWorkerUrl)}`);
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
export {
|
|
285
|
+
push_default as default
|
|
286
|
+
};
|
|
287
|
+
//# sourceMappingURL=push-P2NWWXGL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/push.ts","../src/utils/manifest/index.ts","../src/utils/ir/hashIR.ts","../src/utils/validate.ts","../src/utils/agent-store.ts"],"sourcesContent":["import { access, mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { execa } from \"execa\";\nimport { ensureConfig } from \"@/utils/fs\";\nimport { readAgentManifest, computePushHash } from \"@/utils/manifest\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { runInitialDeploy } from \"@/utils/deploy\";\nimport { readProjectState } from \"@/utils/project-state\";\nimport { validateCompiledIR } from \"@/utils/validate\";\nimport { getAgentStoreEntry, writeAgentStoreEntry } from \"@/utils/agent-store\";\n\nconst LOGO = \"🦋\";\nconst WRANGLER_CONFIG = \"packages/cloudflare/wrangler.jsonc\";\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n return `${(bytes / 1024).toFixed(1)} KB`;\n}\n\nexport default defineCommand({\n meta: { name: \"push\", description: \"Push agent manifest to Cloudflare KV\" },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name to push\",\n required: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n const agentName = args.agent;\n\n p.intro(`${LOGO} ${pc.bold(\"kalp push\")}`);\n\n if (!agentName) {\n p.log.error(`Missing required flag ${pc.cyan(\"-a <agent-name>\")}`);\n process.exit(1);\n }\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n await ensureConfig(cwd).catch(() => {\n p.log.error(`${pc.cyan(\"kalp.config.ts\")} not found`);\n process.exit(1);\n });\n\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n await access(agentPath).catch(() => {\n p.log.error(`Agent ${pc.cyan(agentName)} not found`);\n process.exit(1);\n });\n\n let state = await readProjectState(cwd);\n if (!state) {\n p.log.warn(\"No .kalp/state.json found. Running initial deploy first...\");\n const deploy = await runInitialDeploy(cwd);\n state = {\n workerUrl: deploy.workerUrl,\n deployedAt: new Date().toISOString(),\n accountId: deploy.accountId,\n };\n }\n\n const s = p.spinner();\n s.start(`Compiling ${pc.cyan(agentName)}`);\n const manifest = await readAgentManifest({ cwd, agentName });\n const hash = computePushHash(manifest.ir);\n s.stop(`Compiled ${pc.cyan(agentName)} (${hash.slice(0, 8)})`);\n\n const validation = validateCompiledIR({ agentName, ir: manifest.ir, hash });\n if (!validation.ok) {\n p.log.error(`Validation failed at phase: ${validation.phase}`);\n for (const err of validation.errors ?? []) {\n p.log.error(err);\n }\n process.exit(1);\n }\n\n const previous = await getAgentStoreEntry(agentName);\n const agentWorkerUrl = `${state.workerUrl.replace(/\\/$/, \"\")}/a/${agentName}`;\n if (previous?.hash === hash && previous.workerUrl === agentWorkerUrl) {\n p.note(\n `No changes detected for ${pc.cyan(agentName)} (${hash.slice(0, 8)}).`,\n \"Skipped\",\n );\n p.outro(`${LOGO} ${pc.green(\"Nothing to push\")}`);\n return;\n }\n\n const manifestKey = `${agentName}:${hash}`;\n const latestKey = `${agentName}:latest`;\n const manifestPath = join(cwd, \".kalp\", `${agentName}-${hash}.json`);\n\n await mkdir(join(cwd, \".kalp\"), { recursive: true });\n await writeFile(manifestPath, JSON.stringify(manifest.ir), \"utf-8\");\n\n try {\n s.start(\"Uploading manifest to Cloudflare KV\");\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n \"--binding\",\n \"KALP_MANIFESTS\",\n manifestKey,\n \"--path\",\n manifestPath,\n \"--remote\",\n \"--config\",\n WRANGLER_CONFIG,\n ],\n { cwd },\n );\n\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n \"--binding\",\n \"KALP_MANIFESTS\",\n latestKey,\n hash,\n \"--remote\",\n \"--config\",\n WRANGLER_CONFIG,\n ],\n { cwd },\n );\n s.stop(\"Manifest uploaded\");\n } finally {\n await rm(manifestPath, { force: true });\n }\n\n const bundles = manifest.ir.bundles || {};\n const totalSize = Object.values(bundles).reduce(\n (sum, bundle) => sum + Buffer.byteLength(bundle.code),\n 0,\n );\n const handlerCount = Object.keys(bundles).length;\n\n await writeAgentStoreEntry(agentName, {\n hash,\n timestamp: new Date().toISOString(),\n workerUrl: agentWorkerUrl,\n localPath: agentPath,\n });\n\n p.log.success(\n `${pc.bold(agentName)} pushed · ${handlerCount} handlers · ${formatBytes(totalSize)}`,\n );\n p.note(`KV keys updated: ${manifestKey}, ${latestKey}`, \"Cloudflare KV\");\n p.outro(`${LOGO} ${pc.green(\"Live at\")} ${pc.cyan(agentWorkerUrl)}`);\n },\n});\n","import { access, readFile, rm, mkdtemp } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport { buildAgent } from \"@kalphq/compiler\";\n\nimport type { AgentManifestV3 } from \"@/utils/manifest/types\";\nexport type { AgentManifestV3 } from \"@/utils/manifest/types\";\nexport { computePushHash } from \"@/utils/ir/hashIR\";\n\n/**\n * Reads and compiles an agent into a pushable manifest.\n */\nexport async function readAgentManifest(params: {\n cwd: string;\n agentName: string;\n}): Promise<AgentManifestV3> {\n const { cwd, agentName } = params;\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n await access(agentPath);\n\n // Use a temporary directory for the compiler output\n const tempOutDir = await mkdtemp(join(tmpdir(), \"kalp-build-\"));\n\n try {\n // Build the agent - compiler produces ir.bundles with all handler code\n await buildAgent(agentPath, tempOutDir, cwd);\n\n // Load the IR generated by the compiler (includes bundles with code)\n const irContent = await readFile(join(tempOutDir, \"ir.json\"), \"utf-8\");\n const ir = JSON.parse(irContent);\n\n return {\n format: \"kalp-agent-manifest\",\n schemaVersion: 3,\n ir,\n metadata: {\n generatedAt: new Date().toISOString(),\n },\n };\n } finally {\n // Cleanup temp build directory\n await rm(tempOutDir, { recursive: true, force: true });\n }\n}\n","import type { IRGraph } from \"@kalphq/sdk\";\nimport { calculateAgentHash } from \"@kalphq/compiler\";\n\nexport function getIRHash(ir: IRGraph): string {\n const { calculateIRHash } = require(\"@kalphq/compiler\");\n return calculateIRHash(ir);\n}\n\nexport function computePushHash(\n ir: IRGraph & { bundles?: Record<string, { code: string }> },\n): string {\n const bundles = ir.bundles || {};\n const handlers = Object.keys(bundles).reduce(\n (acc, hash) => ({\n ...acc,\n [hash]: { hash },\n }),\n {} as Record<string, { hash: string }>,\n );\n\n return calculateAgentHash(ir, handlers);\n}\n","import {\n analyzeHandler,\n calculateAgentHash,\n validateIR,\n validateIRBindings,\n} from \"@kalphq/compiler\";\nimport type { IRGraph } from \"@kalphq/sdk\";\n\nexport interface NamedAnalysis {\n name: string;\n capabilities: string[];\n imports: { external: string[]; internal: string[] };\n blockers: string[];\n warnings: string[];\n}\n\ntype IRWithBundles = IRGraph & {\n bundles?: Record<string, { code: string }>;\n};\n\nexport function validateCompiledIR(input: {\n agentName: string;\n ir: IRWithBundles;\n hash: string;\n}): {\n ok: boolean;\n phase?: \"ir\" | \"bindings\" | \"hash\" | \"analysis\";\n errors?: string[];\n blockers?: string[];\n analysis?: NamedAnalysis[];\n} {\n const { ir, hash } = input;\n const bundles = ir.bundles || {};\n const bundleHashes = Object.keys(bundles);\n\n const irValidation = validateIR(ir);\n if (!irValidation.valid) {\n return { ok: false, phase: \"ir\", errors: irValidation.errors };\n }\n\n const bindingsValidation = validateIRBindings(ir, bundleHashes);\n if (!bindingsValidation.valid) {\n return { ok: false, phase: \"bindings\", errors: bindingsValidation.errors };\n }\n\n const handlers = bundleHashes.reduce(\n (acc, key) => ({ ...acc, [key]: { hash: key } }),\n {} as Record<string, { hash: string }>,\n );\n const expectedHash = calculateAgentHash(ir, handlers);\n\n if (expectedHash !== hash) {\n return {\n ok: false,\n phase: \"hash\",\n errors: [\n `Hash mismatch: client provided ${hash}, calculated ${expectedHash}`,\n ],\n };\n }\n\n const analysis: NamedAnalysis[] = Object.entries(bundles).map(\n ([name, bundle]) => ({\n name,\n ...analyzeHandler(bundle.code),\n }),\n );\n\n const blockers = analysis.flatMap((entry) =>\n entry.blockers.map((blocker) => `${blocker} in ${entry.name}`),\n );\n\n if (blockers.length > 0) {\n return {\n ok: false,\n phase: \"analysis\",\n blockers,\n errors: blockers.map((b) => `[Analysis Blocker] ${b}`),\n analysis,\n };\n }\n\n return { ok: true, analysis };\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { ensureGlobalConfigDir } from \"@/utils/config\";\n\nexport interface AgentStoreEntry {\n hash: string;\n timestamp: string;\n workerUrl: string;\n localPath: string;\n}\n\nexport type AgentStore = Record<string, AgentStoreEntry>;\n\nasync function getStorePath(): Promise<string> {\n return join(await ensureGlobalConfigDir(), \"agents.json\");\n}\n\nexport async function readAgentStore(): Promise<AgentStore> {\n try {\n const storePath = await getStorePath();\n const content = await readFile(storePath, \"utf-8\");\n return JSON.parse(content) as AgentStore;\n } catch {\n return {};\n }\n}\n\nexport async function getAgentStoreEntry(\n agentName: string,\n): Promise<AgentStoreEntry | null> {\n const store = await readAgentStore();\n return store[agentName] ?? null;\n}\n\nexport async function writeAgentStoreEntry(\n agentName: string,\n entry: AgentStoreEntry,\n): Promise<void> {\n const storePath = await getStorePath();\n const store = await readAgentStore();\n store[agentName] = entry;\n await writeFile(storePath, JSON.stringify(store, null, 2), \"utf-8\");\n}\n"],"mappings":"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","names":["access","rm","writeFile","join","calculateAgentHash","readFile","join","join","readFile","join","access","writeFile","rm"]}
|
|
@@ -19,10 +19,10 @@ var secrets_default = defineCommand({
|
|
|
19
19
|
}
|
|
20
20
|
},
|
|
21
21
|
subCommands: {
|
|
22
|
-
list: () => import("./list-
|
|
23
|
-
add: () => import("./add-
|
|
24
|
-
delete: () => import("./delete-
|
|
25
|
-
sync: () => import("./sync-
|
|
22
|
+
list: () => import("./list-VMJPWHIH.js").then((r) => r.default),
|
|
23
|
+
add: () => import("./add-XTXSSGC5.js").then((r) => r.default),
|
|
24
|
+
delete: () => import("./delete-N4OSUK3X.js").then((r) => r.default),
|
|
25
|
+
sync: () => import("./sync-OTO44GQS.js").then((r) => r.default)
|
|
26
26
|
},
|
|
27
27
|
run({ args }) {
|
|
28
28
|
if (!args.help) {
|
|
@@ -46,4 +46,4 @@ var secrets_default = defineCommand({
|
|
|
46
46
|
export {
|
|
47
47
|
secrets_default as default
|
|
48
48
|
};
|
|
49
|
-
//# sourceMappingURL=secrets-
|
|
49
|
+
//# sourceMappingURL=secrets-P7ADVLOS.js.map
|
|
@@ -4,7 +4,8 @@ import {
|
|
|
4
4
|
} from "./chunk-MMS3GWBG.js";
|
|
5
5
|
import {
|
|
6
6
|
getAuthToken
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-5RODADXW.js";
|
|
8
|
+
import "./chunk-FO24J6XL.js";
|
|
8
9
|
|
|
9
10
|
// src/commands/secrets/sync.ts
|
|
10
11
|
import { defineCommand } from "citty";
|
|
@@ -117,4 +118,4 @@ var sync_default = defineCommand({
|
|
|
117
118
|
export {
|
|
118
119
|
sync_default as default
|
|
119
120
|
};
|
|
120
|
-
//# sourceMappingURL=sync-
|
|
121
|
+
//# sourceMappingURL=sync-OTO44GQS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/secrets/sync.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\";\nimport { generateTypes } from \"@/utils/codegen\";\n\nconst LOGO = \"🦋\";\n\ninterface SecretFromCloud {\n key: string;\n createdAt: string;\n}\n\nasync function fetchSecretsFromCloud(): Promise<SecretFromCloud[]> {\n // TODO: Implement real API call to Kalp Cloud\n console.log(pc.dim(\"[Simulated] Fetching secrets from Kalp Cloud...\"));\n // Simulated response - in real implementation, this would call the API\n return [\n { key: \"STRIPE_SECRET_KEY\", createdAt: \"2024-01-15T10:30:00Z\" },\n { key: \"OPENAI_API_KEY\", createdAt: \"2024-01-16T14:20:00Z\" },\n ];\n}\n\nasync function replaceSecretsInConfig(\n cwd: string,\n secrets: string[],\n): 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 // Create new config if doesn't exist\n content = `import { defineConfig } from \"@kalphq/sdk\";\n\nexport default defineConfig({\n secrets: [],\n});\n`;\n }\n\n // Replace secrets array with new ones\n const secretsArray =\n secrets.length > 0 ? secrets.map((s) => `\"${s}\"`).join(\", \") : \"\";\n\n const newArray = `secrets: [${secretsArray}]`;\n\n // Check if config has secrets array\n if (content.match(/secrets:\\s*\\[([^\\]]*)\\]/)) {\n content = content.replace(/secrets:\\s*\\[([^\\]]*)\\]/, newArray);\n } else {\n // Add secrets array if not present\n content = content.replace(\n /defineConfig\\({/,\n `defineConfig({\\n secrets: [${secretsArray}],`,\n );\n }\n\n await writeFile(configPath, content, \"utf-8\");\n}\n\nexport default defineCommand({\n meta: {\n name: \"sync\",\n description: \"Sync secrets from Kalp Cloud to local config\",\n },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets sync\")}`);\n\n // Check authentication\n const token = await getAuthToken();\n if (!token) {\n p.log.error(\"Not authenticated. Run 'kalp login' first.\");\n process.exit(1);\n }\n\n const s = p.spinner();\n\n try {\n s.start(\"Fetching secrets from Kalp Cloud\");\n const cloudSecrets = await fetchSecretsFromCloud();\n s.stop(`Found ${pc.cyan(String(cloudSecrets.length))} secrets in cloud`);\n\n if (cloudSecrets.length === 0) {\n p.log.warn(\"No secrets found in Kalp Cloud\");\n\n const shouldClear = await p.confirm({\n message: \"Clear local secrets config?\",\n initialValue: false,\n });\n\n if (p.isCancel(shouldClear) || !shouldClear) {\n p.outro(\"Cancelled\");\n return;\n }\n\n s.start(\"Clearing local secrets\");\n await replaceSecretsInConfig(cwd, []);\n await generateTypes(cwd);\n s.stop(\"Local secrets cleared\");\n p.outro(\"Done\");\n return;\n }\n\n // Show secrets that will be synced\n p.log.info(pc.bold(\"Secrets to sync:\"));\n for (const secret of cloudSecrets) {\n console.log(` ${pc.dim(\"•\")} ${pc.cyan(secret.key)}`);\n }\n\n const confirm = await p.confirm({\n message: `Replace local secrets with ${cloudSecrets.length} secrets from cloud?`,\n initialValue: true,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n p.outro(\"Cancelled\");\n return;\n }\n\n s.start(\"Updating local config\");\n const secretKeys = cloudSecrets.map((s) => s.key);\n await replaceSecretsInConfig(cwd, secretKeys);\n s.stop(\"Config updated\");\n\n s.start(\"Regenerating types\");\n await generateTypes(cwd);\n s.stop(\"Types regenerated\");\n\n p.log.success(pc.green(`Synced ${cloudSecrets.length} secrets`));\n p.outro(\"Done\");\n } catch (error) {\n s.stop(\"Sync failed\");\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/sync.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\";\nimport { generateTypes } from \"@/utils/codegen\";\n\nconst LOGO = \"🦋\";\n\ninterface SecretFromCloud {\n key: string;\n createdAt: string;\n}\n\nasync function fetchSecretsFromCloud(): Promise<SecretFromCloud[]> {\n // TODO: Implement real API call to Kalp Cloud\n console.log(pc.dim(\"[Simulated] Fetching secrets from Kalp Cloud...\"));\n // Simulated response - in real implementation, this would call the API\n return [\n { key: \"STRIPE_SECRET_KEY\", createdAt: \"2024-01-15T10:30:00Z\" },\n { key: \"OPENAI_API_KEY\", createdAt: \"2024-01-16T14:20:00Z\" },\n ];\n}\n\nasync function replaceSecretsInConfig(\n cwd: string,\n secrets: string[],\n): 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 // Create new config if doesn't exist\n content = `import { defineConfig } from \"@kalphq/sdk\";\n\nexport default defineConfig({\n secrets: [],\n});\n`;\n }\n\n // Replace secrets array with new ones\n const secretsArray =\n secrets.length > 0 ? secrets.map((s) => `\"${s}\"`).join(\", \") : \"\";\n\n const newArray = `secrets: [${secretsArray}]`;\n\n // Check if config has secrets array\n if (content.match(/secrets:\\s*\\[([^\\]]*)\\]/)) {\n content = content.replace(/secrets:\\s*\\[([^\\]]*)\\]/, newArray);\n } else {\n // Add secrets array if not present\n content = content.replace(\n /defineConfig\\({/,\n `defineConfig({\\n secrets: [${secretsArray}],`,\n );\n }\n\n await writeFile(configPath, content, \"utf-8\");\n}\n\nexport default defineCommand({\n meta: {\n name: \"sync\",\n description: \"Sync secrets from Kalp Cloud to local config\",\n },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets sync\")}`);\n\n // Check authentication\n const token = await getAuthToken();\n if (!token) {\n p.log.error(\"Not authenticated. Run 'kalp login' first.\");\n process.exit(1);\n }\n\n const s = p.spinner();\n\n try {\n s.start(\"Fetching secrets from Kalp Cloud\");\n const cloudSecrets = await fetchSecretsFromCloud();\n s.stop(`Found ${pc.cyan(String(cloudSecrets.length))} secrets in cloud`);\n\n if (cloudSecrets.length === 0) {\n p.log.warn(\"No secrets found in Kalp Cloud\");\n\n const shouldClear = await p.confirm({\n message: \"Clear local secrets config?\",\n initialValue: false,\n });\n\n if (p.isCancel(shouldClear) || !shouldClear) {\n p.outro(\"Cancelled\");\n return;\n }\n\n s.start(\"Clearing local secrets\");\n await replaceSecretsInConfig(cwd, []);\n await generateTypes(cwd);\n s.stop(\"Local secrets cleared\");\n p.outro(\"Done\");\n return;\n }\n\n // Show secrets that will be synced\n p.log.info(pc.bold(\"Secrets to sync:\"));\n for (const secret of cloudSecrets) {\n console.log(` ${pc.dim(\"•\")} ${pc.cyan(secret.key)}`);\n }\n\n const confirm = await p.confirm({\n message: `Replace local secrets with ${cloudSecrets.length} secrets from cloud?`,\n initialValue: true,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n p.outro(\"Cancelled\");\n return;\n }\n\n s.start(\"Updating local config\");\n const secretKeys = cloudSecrets.map((s) => s.key);\n await replaceSecretsInConfig(cwd, secretKeys);\n s.stop(\"Config updated\");\n\n s.start(\"Regenerating types\");\n await generateTypes(cwd);\n s.stop(\"Types regenerated\");\n\n p.log.success(pc.green(`Synced ${cloudSecrets.length} secrets`));\n p.outro(\"Done\");\n } catch (error) {\n s.stop(\"Sync failed\");\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":["confirm","s"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kalphq/cli",
|
|
3
|
-
"version": "0.0.0-dev-
|
|
3
|
+
"version": "0.0.0-dev-20260510030416",
|
|
4
4
|
"description": "Zero-config CLI for deploying Kalp agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -20,14 +20,15 @@
|
|
|
20
20
|
"@clack/prompts": "0.9.1",
|
|
21
21
|
"citty": "0.1.6",
|
|
22
22
|
"esbuild": "0.25.0",
|
|
23
|
+
"execa": "^9.6.1",
|
|
23
24
|
"jose": "^5.10.0",
|
|
24
25
|
"json-stable-stringify": "1.3.0",
|
|
25
26
|
"open": "^11.0.0",
|
|
26
27
|
"picocolors": "1.1.1",
|
|
27
28
|
"zod": "3.25.76",
|
|
28
|
-
"@kalphq/compiler": "0.0.0-dev-
|
|
29
|
-
"@kalphq/project": "0.0.0-dev-
|
|
30
|
-
"@kalphq/sdk": "0.0.0-dev-
|
|
29
|
+
"@kalphq/compiler": "0.0.0-dev-20260510030416",
|
|
30
|
+
"@kalphq/project": "0.0.0-dev-20260510030416",
|
|
31
|
+
"@kalphq/sdk": "0.0.0-dev-20260510030416"
|
|
31
32
|
},
|
|
32
33
|
"devDependencies": {
|
|
33
34
|
"@types/json-stable-stringify": "1.2.0",
|
package/dist/chunk-6LLXGS2P.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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":[]}
|
package/dist/login-JYPWGL6P.js
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// src/commands/login.ts
|
|
4
|
-
import { defineCommand } from "citty";
|
|
5
|
-
import * as p from "@clack/prompts";
|
|
6
|
-
import pc from "picocolors";
|
|
7
|
-
import { mkdir, writeFile } from "fs/promises";
|
|
8
|
-
import { join } from "path";
|
|
9
|
-
import { homedir } from "os";
|
|
10
|
-
var LOGO = "\u{1F98B}";
|
|
11
|
-
var login_default = defineCommand({
|
|
12
|
-
meta: { name: "login", description: "Authenticate with Kalp" },
|
|
13
|
-
async run() {
|
|
14
|
-
const home = homedir();
|
|
15
|
-
p.intro(`${LOGO} ${pc.bold("kalp login")}`);
|
|
16
|
-
const s = p.spinner();
|
|
17
|
-
s.start("Authenticating...");
|
|
18
|
-
const kalpDir = join(home, ".kalp");
|
|
19
|
-
await mkdir(kalpDir, { recursive: true });
|
|
20
|
-
const authData = {
|
|
21
|
-
token: "mock-token-" + Date.now(),
|
|
22
|
-
email: "user@example.com",
|
|
23
|
-
expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1e3).toISOString()
|
|
24
|
-
};
|
|
25
|
-
await writeFile(
|
|
26
|
-
join(kalpDir, "auth.json"),
|
|
27
|
-
JSON.stringify(authData, null, 2),
|
|
28
|
-
"utf-8"
|
|
29
|
-
);
|
|
30
|
-
s.stop("Authenticated successfully");
|
|
31
|
-
p.log.success(`Logged in as ${pc.cyan(authData.email)}`);
|
|
32
|
-
p.outro(pc.green("Ready to use Kalp Cloud"));
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
export {
|
|
36
|
-
login_default as default
|
|
37
|
-
};
|
|
38
|
-
//# sourceMappingURL=login-JYPWGL6P.js.map
|