@kalphq/cli 0.0.0-dev-20260513002146 → 0.0.0-dev-20260513005156
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-NDU352FV.js +124 -0
- package/dist/add-NDU352FV.js.map +1 -0
- package/dist/chunk-5ZRVO3TQ.js +70 -0
- package/dist/chunk-5ZRVO3TQ.js.map +1 -0
- package/dist/{chunk-63JREECU.js → chunk-DHCCSWJN.js} +83 -220
- package/dist/chunk-DHCCSWJN.js.map +1 -0
- package/dist/{chunk-TNKYKA7N.js → chunk-GNQI376N.js} +118 -18
- package/dist/chunk-GNQI376N.js.map +1 -0
- package/dist/chunk-NV2IZ4XM.js +102 -0
- package/dist/chunk-NV2IZ4XM.js.map +1 -0
- package/dist/{chunk-PY6VAS54.js → chunk-X56YSZGT.js} +43 -8
- package/dist/chunk-X56YSZGT.js.map +1 -0
- package/dist/delete-DY5FQAHW.js +127 -0
- package/dist/delete-DY5FQAHW.js.map +1 -0
- package/dist/{deploy-Z2R7ER7U.js → deploy-AD3F3BN7.js} +27 -22
- package/dist/deploy-AD3F3BN7.js.map +1 -0
- package/dist/{dev-PNRWXULV.js → dev-X43HHIYV.js} +5 -3
- package/dist/{dev-PNRWXULV.js.map → dev-X43HHIYV.js.map} +1 -1
- package/dist/index.js +6 -8
- package/dist/index.js.map +1 -1
- package/dist/list-4X735L5X.js +90 -0
- package/dist/list-4X735L5X.js.map +1 -0
- package/dist/{login-DGX55YZ6.js → login-RAN2I7YT.js} +3 -5
- package/dist/{login-DGX55YZ6.js.map → login-RAN2I7YT.js.map} +1 -1
- package/dist/{push-SVABM7WN.js → push-RA6GEUV4.js} +21 -10
- package/dist/push-RA6GEUV4.js.map +1 -0
- package/dist/{secrets-P7ADVLOS.js → secrets-5ZPPASCH.js} +10 -10
- package/dist/secrets-5ZPPASCH.js.map +1 -0
- package/dist/sync-2NLWWGI2.js +69 -0
- package/dist/sync-2NLWWGI2.js.map +1 -0
- package/package.json +4 -4
- package/dist/add-XTXSSGC5.js +0 -139
- package/dist/add-XTXSSGC5.js.map +0 -1
- package/dist/chunk-5RODADXW.js +0 -65
- package/dist/chunk-5RODADXW.js.map +0 -1
- package/dist/chunk-63JREECU.js.map +0 -1
- package/dist/chunk-PY6VAS54.js.map +0 -1
- package/dist/chunk-TNKYKA7N.js.map +0 -1
- package/dist/delete-N4OSUK3X.js +0 -145
- package/dist/delete-N4OSUK3X.js.map +0 -1
- package/dist/deploy-Z2R7ER7U.js.map +0 -1
- package/dist/link-WZQSR2TM.js +0 -36
- package/dist/link-WZQSR2TM.js.map +0 -1
- package/dist/list-VMJPWHIH.js +0 -120
- package/dist/list-VMJPWHIH.js.map +0 -1
- package/dist/push-SVABM7WN.js.map +0 -1
- package/dist/secrets-P7ADVLOS.js.map +0 -1
- package/dist/sync-OTO44GQS.js +0 -121
- package/dist/sync-OTO44GQS.js.map +0 -1
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
promptDeployTarget,
|
|
4
|
+
runInitialDeploy,
|
|
5
|
+
showKalpCloudWaitlist
|
|
6
|
+
} from "./chunk-X56YSZGT.js";
|
|
7
|
+
import "./chunk-NV2IZ4XM.js";
|
|
7
8
|
import {
|
|
8
9
|
requireAuth
|
|
9
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-GNQI376N.js";
|
|
10
11
|
import "./chunk-FO24J6XL.js";
|
|
12
|
+
import "./chunk-DHCCSWJN.js";
|
|
11
13
|
|
|
12
14
|
// src/commands/deploy.ts
|
|
13
15
|
import { defineCommand } from "citty";
|
|
@@ -23,14 +25,16 @@ var deploy_default = defineCommand({
|
|
|
23
25
|
p.log.error("Not authenticated. Run `kalp login` first.");
|
|
24
26
|
process.exit(1);
|
|
25
27
|
});
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
initialValue: true
|
|
29
|
-
});
|
|
30
|
-
if (p.isCancel(proceed) || !proceed) {
|
|
28
|
+
const target = await promptDeployTarget("Choose where to deploy your runtime");
|
|
29
|
+
if (!target) {
|
|
31
30
|
p.outro("Cancelled");
|
|
32
31
|
return;
|
|
33
32
|
}
|
|
33
|
+
if (target === "kalp-cloud") {
|
|
34
|
+
showKalpCloudWaitlist();
|
|
35
|
+
p.outro(pc.green("Got it \u2014 you'll hear from us soon."));
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
34
38
|
const s = p.spinner();
|
|
35
39
|
s.start("Deploying your agents runtime");
|
|
36
40
|
try {
|
|
@@ -45,17 +49,18 @@ var deploy_default = defineCommand({
|
|
|
45
49
|
}
|
|
46
50
|
const preferredStudioBase = result.customDomains.length > 0 ? `https://${result.customDomains[0]}` : result.workerUrl;
|
|
47
51
|
if (result.credentialsChanged || result.serviceKeyChanged) {
|
|
48
|
-
p.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
52
|
+
p.log.info(pc.bold("Admin access"));
|
|
53
|
+
console.log(
|
|
54
|
+
` ${pc.dim("Username:")} ${pc.cyan(result.studioAdminUser)}`
|
|
55
|
+
);
|
|
56
|
+
console.log(
|
|
57
|
+
` ${pc.dim("Password:")} ${pc.cyan(result.studioPassword)}`
|
|
58
|
+
);
|
|
59
|
+
console.log(
|
|
60
|
+
` ${pc.dim("Service key:")} ${pc.cyan(`Bearer ${result.serviceKey}`)}`
|
|
61
|
+
);
|
|
62
|
+
console.log(
|
|
63
|
+
` ${pc.dim("Studio URL:")} ${pc.cyan(`${preferredStudioBase.replace(/\/$/, "")}/studio/login`)}`
|
|
59
64
|
);
|
|
60
65
|
} else {
|
|
61
66
|
p.log.info(
|
|
@@ -77,4 +82,4 @@ var deploy_default = defineCommand({
|
|
|
77
82
|
export {
|
|
78
83
|
deploy_default as default
|
|
79
84
|
};
|
|
80
|
-
//# sourceMappingURL=deploy-
|
|
85
|
+
//# sourceMappingURL=deploy-AD3F3BN7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/deploy.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { runInitialDeploy } from \"@/utils/deploy\";\nimport { promptDeployTarget, showKalpCloudWaitlist } from \"@/utils/deploy-target\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"deploy\", description: \"Deploy your agents runtime\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp deploy\")}`);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n const target = await promptDeployTarget(\"Choose where to deploy your runtime\");\n if (!target) {\n p.outro(\"Cancelled\");\n return;\n }\n if (target === \"kalp-cloud\") {\n showKalpCloudWaitlist();\n p.outro(pc.green(\"Got it — you'll hear from us soon.\"));\n return;\n }\n\n const s = p.spinner();\n s.start(\"Deploying your agents runtime\");\n\n try {\n const result = await runInitialDeploy(cwd);\n s.stop(\"Deployment completed\");\n p.log.success(`Runtime URL: ${pc.cyan(result.workerUrl)}`);\n if (result.customDomains.length > 0) {\n p.note(\n result.customDomains.map((domain) => pc.cyan(`https://${domain}`)).join(\"\\n\"),\n \"Custom domains detected\",\n );\n }\n\n const preferredStudioBase =\n result.customDomains.length > 0\n ? `https://${result.customDomains[0]}`\n : result.workerUrl;\n\n if (result.credentialsChanged || result.serviceKeyChanged) {\n p.log.info(pc.bold(\"Admin access\"));\n console.log(\n ` ${pc.dim(\"Username:\")} ${pc.cyan(result.studioAdminUser)}`,\n );\n console.log(\n ` ${pc.dim(\"Password:\")} ${pc.cyan(result.studioPassword)}`,\n );\n console.log(\n ` ${pc.dim(\"Service key:\")} ${pc.cyan(`Bearer ${result.serviceKey}`)}`,\n );\n console.log(\n ` ${pc.dim(\"Studio URL:\")} ${pc.cyan(`${preferredStudioBase.replace(/\\/$/, \"\")}/studio/login`)}`,\n );\n } else {\n p.log.info(\n pc.dim(\n \"Credentials unchanged. Check your local .env if you need to recover them.\",\n ),\n );\n }\n p.outro(pc.green(\"Your runtime is ready\"));\n } catch (error) {\n s.stop(\"Deployment failed\");\n p.log.error(\n error instanceof Error ? error.message : \"Unknown deployment error\",\n );\n process.exit(1);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAKf,IAAM,OAAO;AAEb,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,6BAA6B;AAAA,EAClE,MAAM,MAAM;AACV,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,aAAa,CAAC,EAAE;AAE3C,UAAM,YAAY,EAAE,MAAM,MAAM;AAC9B,MAAE,MAAI,MAAM,4CAA4C;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAED,UAAM,SAAS,MAAM,mBAAmB,qCAAqC;AAC7E,QAAI,CAAC,QAAQ;AACX,MAAE,QAAM,WAAW;AACnB;AAAA,IACF;AACA,QAAI,WAAW,cAAc;AAC3B,4BAAsB;AACtB,MAAE,QAAM,GAAG,MAAM,yCAAoC,CAAC;AACtD;AAAA,IACF;AAEA,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,+BAA+B;AAEvC,QAAI;AACF,YAAM,SAAS,MAAM,iBAAiB,GAAG;AACzC,QAAE,KAAK,sBAAsB;AAC7B,MAAE,MAAI,QAAQ,gBAAgB,GAAG,KAAK,OAAO,SAAS,CAAC,EAAE;AACzD,UAAI,OAAO,cAAc,SAAS,GAAG;AACnC,QAAE;AAAA,UACA,OAAO,cAAc,IAAI,CAAC,WAAW,GAAG,KAAK,WAAW,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI;AAAA,UAC5E;AAAA,QACF;AAAA,MACF;AAEA,YAAM,sBACJ,OAAO,cAAc,SAAS,IAC1B,WAAW,OAAO,cAAc,CAAC,CAAC,KAClC,OAAO;AAEb,UAAI,OAAO,sBAAsB,OAAO,mBAAmB;AACzD,QAAE,MAAI,KAAK,GAAG,KAAK,cAAc,CAAC;AAClC,gBAAQ;AAAA,UACN,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,GAAG,KAAK,OAAO,eAAe,CAAC;AAAA,QAC7D;AACA,gBAAQ;AAAA,UACN,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,GAAG,KAAK,OAAO,cAAc,CAAC;AAAA,QAC5D;AACA,gBAAQ;AAAA,UACN,KAAK,GAAG,IAAI,cAAc,CAAC,IAAI,GAAG,KAAK,UAAU,OAAO,UAAU,EAAE,CAAC;AAAA,QACvE;AACA,gBAAQ;AAAA,UACN,KAAK,GAAG,IAAI,aAAa,CAAC,IAAI,GAAG,KAAK,GAAG,oBAAoB,QAAQ,OAAO,EAAE,CAAC,eAAe,CAAC;AAAA,QACjG;AAAA,MACF,OAAO;AACL,QAAE,MAAI;AAAA,UACJ,GAAG;AAAA,YACD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,MAAE,QAAM,GAAG,MAAM,uBAAuB,CAAC;AAAA,IAC3C,SAAS,OAAO;AACd,QAAE,KAAK,mBAAmB;AAC1B,MAAE,MAAI;AAAA,QACJ,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC3C;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -5,11 +5,13 @@ import {
|
|
|
5
5
|
validateCompiledIR
|
|
6
6
|
} from "./chunk-VCFH3R34.js";
|
|
7
7
|
import {
|
|
8
|
-
ensureSecretKey
|
|
8
|
+
ensureSecretKey
|
|
9
|
+
} from "./chunk-NV2IZ4XM.js";
|
|
10
|
+
import {
|
|
9
11
|
materializeRuntime,
|
|
10
12
|
readLocalAgentNames,
|
|
11
13
|
writeRuntimeAgentsSnapshot
|
|
12
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-DHCCSWJN.js";
|
|
13
15
|
|
|
14
16
|
// src/commands/dev.ts
|
|
15
17
|
import { watch } from "fs";
|
|
@@ -233,4 +235,4 @@ KALP_RUNTIME_MODE=local
|
|
|
233
235
|
export {
|
|
234
236
|
dev_default as default
|
|
235
237
|
};
|
|
236
|
-
//# sourceMappingURL=dev-
|
|
238
|
+
//# sourceMappingURL=dev-X43HHIYV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/dev.ts"],"sourcesContent":["import { watch, type FSWatcher } from \"node:fs\";\nimport { copyFile, mkdir, readFile, rm, writeFile } 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 { readAgentManifest, computePushHash } from \"@/utils/manifest\";\nimport { validateCompiledIR } from \"@/utils/validate\";\nimport {\n materializeRuntime,\n readLocalAgentNames,\n writeRuntimeAgentsSnapshot,\n} from \"@/utils/runtime\";\n\nconst LOGO = \"🦋\";\nconst LOCAL_MANIFESTS_DIR = \".kalp/runtime/local-manifests\";\nconst HOT_RELOAD_DEBOUNCE_MS = 450;\n\nasync function putLocalManifest(params: {\n cwd: string;\n configPath: string;\n key: string;\n manifestPath: string;\n}): Promise<void> {\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n params.key,\n \"--path\",\n params.manifestPath,\n \"--binding\",\n \"KALP_MANIFESTS\",\n \"--local\",\n \"--config\",\n params.configPath,\n ],\n { cwd: params.cwd },\n );\n}\n\nasync function putLocalValue(params: {\n cwd: string;\n configPath: string;\n key: string;\n value: string;\n}): Promise<void> {\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n params.key,\n params.value,\n \"--binding\",\n \"KALP_MANIFESTS\",\n \"--local\",\n \"--config\",\n params.configPath,\n ],\n { cwd: params.cwd },\n );\n}\n\nasync function syncLocalRuntimeState(params: {\n cwd: string;\n runtimeDir: string;\n configPath: string;\n}): Promise<{ synced: number; failed: string[] }> {\n const { cwd, runtimeDir, configPath } = params;\n await writeRuntimeAgentsSnapshot({ cwd, runtimeDir, mode: \"local\" });\n\n const manifestDir = join(cwd, LOCAL_MANIFESTS_DIR);\n await rm(manifestDir, { recursive: true, force: true });\n await mkdir(manifestDir, { recursive: true });\n\n const agentNames = await readLocalAgentNames(cwd);\n const failed: string[] = [];\n let synced = 0;\n\n for (const agentName of agentNames) {\n try {\n const manifest = await readAgentManifest({ cwd, agentName });\n const hash = computePushHash(manifest.ir);\n const validation = validateCompiledIR({ agentName, ir: manifest.ir, hash });\n if (!validation.ok) {\n const details = (validation.errors ?? []).join(\" | \");\n throw new Error(\n `validation failed (${validation.phase})${details ? `: ${details}` : \"\"}`,\n );\n }\n\n const manifestKey = `${agentName}:${hash}`;\n const latestKey = `${agentName}:latest`;\n const manifestPath = join(manifestDir, `${agentName}-${hash}.json`);\n await writeFile(manifestPath, JSON.stringify(manifest.ir), \"utf-8\");\n\n await putLocalManifest({\n cwd,\n configPath,\n key: manifestKey,\n manifestPath,\n });\n await putLocalValue({\n cwd,\n configPath,\n key: latestKey,\n value: hash,\n });\n synced += 1;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n failed.push(`${agentName}: ${reason}`);\n }\n }\n\n return { synced, failed };\n}\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 await ensureSecretKey(cwd);\n await copyFile(join(cwd, \".env\"), join(cwd, \".dev.vars\"));\n const devVarsPath = join(cwd, \".dev.vars\");\n const devVarsContent = await readFile(devVarsPath, \"utf-8\");\n const nextDevVars = devVarsContent\n .replace(/^KALP_ENV=.*$/m, \"\")\n .replace(/^KALP_RUNTIME_MODE=.*$/m, \"\")\n .trimEnd();\n await writeFile(\n devVarsPath,\n `${nextDevVars}\\nKALP_ENV=local\\nKALP_RUNTIME_MODE=local\\n`,\n \"utf-8\",\n );\n const runtime = await materializeRuntime(cwd, { mode: \"local\" });\n const initialSync = await syncLocalRuntimeState({\n cwd,\n runtimeDir: runtime.runtimeDir,\n configPath: runtime.wranglerConfigPath,\n });\n if (initialSync.failed.length > 0) {\n for (const failure of initialSync.failed) {\n p.log.warn(`Local sync skipped ${failure}`);\n }\n }\n p.log.info(\n `${pc.dim(\"Local agent runtime synced:\")} ${pc.cyan(String(initialSync.synced))}`,\n );\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 \"--local\",\n \"--config\",\n runtime.wranglerConfigPath,\n ],\n { cwd, stdio: \"inherit\" },\n );\n\n let hotReloadTimer: NodeJS.Timeout | null = null;\n let hotReloadRunning = false;\n let hotReloadPending = false;\n\n const runHotReloadSync = async () => {\n if (hotReloadRunning) {\n hotReloadPending = true;\n return;\n }\n\n hotReloadRunning = true;\n try {\n const sync = await syncLocalRuntimeState({\n cwd,\n runtimeDir: runtime.runtimeDir,\n configPath: runtime.wranglerConfigPath,\n });\n if (sync.failed.length > 0) {\n p.log.warn(\n `Local hot reload synced ${sync.synced} agents with ${sync.failed.length} warnings.`,\n );\n for (const failure of sync.failed) {\n p.log.warn(`Hot reload skipped ${failure}`);\n }\n } else {\n p.log.info(pc.dim(`Local hot reload synced ${sync.synced} agents.`));\n }\n } finally {\n hotReloadRunning = false;\n if (hotReloadPending) {\n hotReloadPending = false;\n void runHotReloadSync();\n }\n }\n };\n\n const scheduleHotReloadSync = () => {\n if (hotReloadTimer) clearTimeout(hotReloadTimer);\n hotReloadTimer = setTimeout(() => {\n void runHotReloadSync();\n }, HOT_RELOAD_DEBOUNCE_MS);\n };\n\n const watchers: FSWatcher[] = [];\n const watchTargets = [join(cwd, \"agents\"), join(cwd, \".kalp\", \"state.json\")];\n for (const target of watchTargets) {\n try {\n const watcher = watch(\n target,\n target.endsWith(\".json\") ? undefined : { recursive: true },\n () => scheduleHotReloadSync(),\n );\n watchers.push(watcher);\n } catch {\n // Ignore missing targets (e.g. no agents yet)\n }\n }\n\n const shutdown = () => {\n if (hotReloadTimer) {\n clearTimeout(hotReloadTimer);\n hotReloadTimer = null;\n }\n for (const watcher of watchers) {\n watcher.close();\n }\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/login\";\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"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/dev.ts"],"sourcesContent":["import { watch, type FSWatcher } from \"node:fs\";\nimport { copyFile, mkdir, readFile, rm, writeFile } 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 { readAgentManifest, computePushHash } from \"@/utils/manifest\";\nimport { validateCompiledIR } from \"@/utils/validate\";\nimport {\n materializeRuntime,\n readLocalAgentNames,\n writeRuntimeAgentsSnapshot,\n} from \"@/utils/runtime\";\n\nconst LOGO = \"🦋\";\nconst LOCAL_MANIFESTS_DIR = \".kalp/runtime/local-manifests\";\nconst HOT_RELOAD_DEBOUNCE_MS = 450;\n\nasync function putLocalManifest(params: {\n cwd: string;\n configPath: string;\n key: string;\n manifestPath: string;\n}): Promise<void> {\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n params.key,\n \"--path\",\n params.manifestPath,\n \"--binding\",\n \"KALP_MANIFESTS\",\n \"--local\",\n \"--config\",\n params.configPath,\n ],\n { cwd: params.cwd },\n );\n}\n\nasync function putLocalValue(params: {\n cwd: string;\n configPath: string;\n key: string;\n value: string;\n}): Promise<void> {\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n params.key,\n params.value,\n \"--binding\",\n \"KALP_MANIFESTS\",\n \"--local\",\n \"--config\",\n params.configPath,\n ],\n { cwd: params.cwd },\n );\n}\n\nasync function syncLocalRuntimeState(params: {\n cwd: string;\n runtimeDir: string;\n configPath: string;\n}): Promise<{ synced: number; failed: string[] }> {\n const { cwd, runtimeDir, configPath } = params;\n await writeRuntimeAgentsSnapshot({ cwd, runtimeDir, mode: \"local\" });\n\n const manifestDir = join(cwd, LOCAL_MANIFESTS_DIR);\n await rm(manifestDir, { recursive: true, force: true });\n await mkdir(manifestDir, { recursive: true });\n\n const agentNames = await readLocalAgentNames(cwd);\n const failed: string[] = [];\n let synced = 0;\n\n for (const agentName of agentNames) {\n try {\n const manifest = await readAgentManifest({ cwd, agentName });\n const hash = computePushHash(manifest.ir);\n const validation = validateCompiledIR({ agentName, ir: manifest.ir, hash });\n if (!validation.ok) {\n const details = (validation.errors ?? []).join(\" | \");\n throw new Error(\n `validation failed (${validation.phase})${details ? `: ${details}` : \"\"}`,\n );\n }\n\n const manifestKey = `${agentName}:${hash}`;\n const latestKey = `${agentName}:latest`;\n const manifestPath = join(manifestDir, `${agentName}-${hash}.json`);\n await writeFile(manifestPath, JSON.stringify(manifest.ir), \"utf-8\");\n\n await putLocalManifest({\n cwd,\n configPath,\n key: manifestKey,\n manifestPath,\n });\n await putLocalValue({\n cwd,\n configPath,\n key: latestKey,\n value: hash,\n });\n synced += 1;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n failed.push(`${agentName}: ${reason}`);\n }\n }\n\n return { synced, failed };\n}\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 await ensureSecretKey(cwd);\n await copyFile(join(cwd, \".env\"), join(cwd, \".dev.vars\"));\n const devVarsPath = join(cwd, \".dev.vars\");\n const devVarsContent = await readFile(devVarsPath, \"utf-8\");\n const nextDevVars = devVarsContent\n .replace(/^KALP_ENV=.*$/m, \"\")\n .replace(/^KALP_RUNTIME_MODE=.*$/m, \"\")\n .trimEnd();\n await writeFile(\n devVarsPath,\n `${nextDevVars}\\nKALP_ENV=local\\nKALP_RUNTIME_MODE=local\\n`,\n \"utf-8\",\n );\n const runtime = await materializeRuntime(cwd, { mode: \"local\" });\n const initialSync = await syncLocalRuntimeState({\n cwd,\n runtimeDir: runtime.runtimeDir,\n configPath: runtime.wranglerConfigPath,\n });\n if (initialSync.failed.length > 0) {\n for (const failure of initialSync.failed) {\n p.log.warn(`Local sync skipped ${failure}`);\n }\n }\n p.log.info(\n `${pc.dim(\"Local agent runtime synced:\")} ${pc.cyan(String(initialSync.synced))}`,\n );\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 \"--local\",\n \"--config\",\n runtime.wranglerConfigPath,\n ],\n { cwd, stdio: \"inherit\" },\n );\n\n let hotReloadTimer: NodeJS.Timeout | null = null;\n let hotReloadRunning = false;\n let hotReloadPending = false;\n\n const runHotReloadSync = async () => {\n if (hotReloadRunning) {\n hotReloadPending = true;\n return;\n }\n\n hotReloadRunning = true;\n try {\n const sync = await syncLocalRuntimeState({\n cwd,\n runtimeDir: runtime.runtimeDir,\n configPath: runtime.wranglerConfigPath,\n });\n if (sync.failed.length > 0) {\n p.log.warn(\n `Local hot reload synced ${sync.synced} agents with ${sync.failed.length} warnings.`,\n );\n for (const failure of sync.failed) {\n p.log.warn(`Hot reload skipped ${failure}`);\n }\n } else {\n p.log.info(pc.dim(`Local hot reload synced ${sync.synced} agents.`));\n }\n } finally {\n hotReloadRunning = false;\n if (hotReloadPending) {\n hotReloadPending = false;\n void runHotReloadSync();\n }\n }\n };\n\n const scheduleHotReloadSync = () => {\n if (hotReloadTimer) clearTimeout(hotReloadTimer);\n hotReloadTimer = setTimeout(() => {\n void runHotReloadSync();\n }, HOT_RELOAD_DEBOUNCE_MS);\n };\n\n const watchers: FSWatcher[] = [];\n const watchTargets = [join(cwd, \"agents\"), join(cwd, \".kalp\", \"state.json\")];\n for (const target of watchTargets) {\n try {\n const watcher = watch(\n target,\n target.endsWith(\".json\") ? undefined : { recursive: true },\n () => scheduleHotReloadSync(),\n );\n watchers.push(watcher);\n } catch {\n // Ignore missing targets (e.g. no agents yet)\n }\n }\n\n const shutdown = () => {\n if (hotReloadTimer) {\n clearTimeout(hotReloadTimer);\n hotReloadTimer = null;\n }\n for (const watcher of watchers) {\n watcher.close();\n }\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/login\";\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"],"mappings":"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","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-20260513005156",
|
|
12
12
|
description: "Zero-config CLI for deploying Kalp agents",
|
|
13
13
|
type: "module",
|
|
14
14
|
license: "MIT",
|
|
@@ -61,7 +61,6 @@ var COMMANDS = [
|
|
|
61
61
|
["create", "Add a new agent"],
|
|
62
62
|
["deploy", "Deploy your agents runtime"],
|
|
63
63
|
["push", "Publish agent runtime version"],
|
|
64
|
-
["link", "Link project to Kalp cloud"],
|
|
65
64
|
["secrets", "Manage secrets"],
|
|
66
65
|
["login", "Sign in to remote runtime"],
|
|
67
66
|
["logout", "Sign out from Kalp"],
|
|
@@ -93,13 +92,12 @@ var main = defineCommand({
|
|
|
93
92
|
},
|
|
94
93
|
subCommands: {
|
|
95
94
|
create: () => import("./create-XC55BUCS.js").then((r) => r.default),
|
|
96
|
-
deploy: () => import("./deploy-
|
|
97
|
-
push: () => import("./push-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
login: () => import("./login-DGX55YZ6.js").then((r) => r.default),
|
|
95
|
+
deploy: () => import("./deploy-AD3F3BN7.js").then((r) => r.default),
|
|
96
|
+
push: () => import("./push-RA6GEUV4.js").then((r) => r.default),
|
|
97
|
+
secrets: () => import("./secrets-5ZPPASCH.js").then((r) => r.default),
|
|
98
|
+
login: () => import("./login-RAN2I7YT.js").then((r) => r.default),
|
|
101
99
|
logout: () => import("./logout-U5V5K775.js").then((r) => r.default),
|
|
102
|
-
dev: () => import("./dev-
|
|
100
|
+
dev: () => import("./dev-X43HHIYV.js").then((r) => r.default)
|
|
103
101
|
},
|
|
104
102
|
run({ args }) {
|
|
105
103
|
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 [\"deploy\", \"Deploy your agents runtime\"],\n [\"push\", \"Publish agent runtime version\"],\n [\"
|
|
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 your agents runtime\"],\n [\"push\", \"Publish agent runtime version\"],\n [\"secrets\", \"Manage secrets\"],\n [\"login\", \"Sign in to remote runtime\"],\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 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-20260513005156\",\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 \"jiti\": \"^2.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":[]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
readLocalSecretsFromConfig,
|
|
4
|
+
resolveSecretsRuntimeConfigPath
|
|
5
|
+
} from "./chunk-5ZRVO3TQ.js";
|
|
6
|
+
import "./chunk-INB3LG6O.js";
|
|
7
|
+
import {
|
|
8
|
+
requireAuth,
|
|
9
|
+
resolveProvider
|
|
10
|
+
} from "./chunk-GNQI376N.js";
|
|
11
|
+
import "./chunk-FO24J6XL.js";
|
|
12
|
+
import "./chunk-DHCCSWJN.js";
|
|
13
|
+
|
|
14
|
+
// src/commands/secrets/list.ts
|
|
15
|
+
import { defineCommand } from "citty";
|
|
16
|
+
import * as p from "@clack/prompts";
|
|
17
|
+
import pc from "picocolors";
|
|
18
|
+
var LOGO = "\u{1F98B}";
|
|
19
|
+
var list_default = defineCommand({
|
|
20
|
+
meta: {
|
|
21
|
+
name: "list",
|
|
22
|
+
description: "List remote runtime secrets"
|
|
23
|
+
},
|
|
24
|
+
args: {
|
|
25
|
+
help: {
|
|
26
|
+
type: "boolean",
|
|
27
|
+
alias: "h",
|
|
28
|
+
description: "Show help",
|
|
29
|
+
default: false
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
async run({ args }) {
|
|
33
|
+
const cwd = process.cwd();
|
|
34
|
+
if (args.help) {
|
|
35
|
+
p.log.info(`${pc.bold("Usage")}: kalp secrets list`);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
p.intro(`${LOGO} ${pc.bold("kalp secrets list")}`);
|
|
39
|
+
await requireAuth().catch(() => {
|
|
40
|
+
p.log.error("Not authenticated. Run `kalp login` first.");
|
|
41
|
+
process.exit(1);
|
|
42
|
+
});
|
|
43
|
+
const spinner2 = p.spinner();
|
|
44
|
+
spinner2.start("Loading remote secrets");
|
|
45
|
+
try {
|
|
46
|
+
const configPath = await resolveSecretsRuntimeConfigPath(cwd);
|
|
47
|
+
const provider = resolveProvider();
|
|
48
|
+
const [remoteSecrets, localSecrets] = await Promise.all([
|
|
49
|
+
provider.listSecrets({ cwd, configPath }),
|
|
50
|
+
readLocalSecretsFromConfig(cwd)
|
|
51
|
+
]);
|
|
52
|
+
const remoteNames = remoteSecrets.map((item) => item.name).sort((a, b) => a.localeCompare(b));
|
|
53
|
+
const syncedCount = remoteNames.filter((name) => localSecrets.includes(name)).length;
|
|
54
|
+
spinner2.stop(`Found ${remoteNames.length} remote secrets`);
|
|
55
|
+
if (remoteNames.length === 0) {
|
|
56
|
+
p.log.info(pc.dim("No remote secrets found."));
|
|
57
|
+
p.log.info(pc.dim(`Add one with ${pc.cyan("kalp secrets add -k KEY -v VALUE")}`));
|
|
58
|
+
p.outro("Done");
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
p.log.info(pc.bold("Remote runtime secrets"));
|
|
62
|
+
for (const name of remoteNames) {
|
|
63
|
+
const synced = localSecrets.includes(name);
|
|
64
|
+
const icon = synced ? pc.green("\u2713") : pc.yellow("\u25CB");
|
|
65
|
+
console.log(` ${icon} ${pc.cyan(name)}`);
|
|
66
|
+
}
|
|
67
|
+
if (syncedCount !== remoteNames.length) {
|
|
68
|
+
const missingLocal = remoteNames.filter((name) => !localSecrets.includes(name));
|
|
69
|
+
p.log.warn(
|
|
70
|
+
`Missing in kalp.config.ts: ${missingLocal.map((name) => pc.cyan(name)).join(", ")}`
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
const localOnly = localSecrets.filter((name) => !remoteNames.includes(name));
|
|
74
|
+
if (localOnly.length > 0) {
|
|
75
|
+
p.log.warn(
|
|
76
|
+
`Local-only secrets (not remote): ${localOnly.map((name) => pc.cyan(name)).join(", ")}`
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
p.outro("Done");
|
|
80
|
+
} catch (error) {
|
|
81
|
+
spinner2.stop("Failed to load secrets");
|
|
82
|
+
p.log.error(error instanceof Error ? error.message : String(error));
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
export {
|
|
88
|
+
list_default as default
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=list-4X735L5X.js.map
|
|
@@ -0,0 +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 { requireAuth } from \"@/utils/auth\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport { readLocalSecretsFromConfig } from \"@/utils/secrets-config\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"list\",\n description: \"List remote runtime secrets\",\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 await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n const spinner = p.spinner();\n spinner.start(\"Loading remote secrets\");\n\n try {\n const configPath = await resolveSecretsRuntimeConfigPath(cwd);\n const provider = resolveProvider();\n const [remoteSecrets, localSecrets] = await Promise.all([\n provider.listSecrets({ cwd, configPath }),\n readLocalSecretsFromConfig(cwd),\n ]);\n\n const remoteNames = remoteSecrets.map((item) => item.name).sort((a, b) => a.localeCompare(b));\n const syncedCount = remoteNames.filter((name) => localSecrets.includes(name)).length;\n spinner.stop(`Found ${remoteNames.length} remote secrets`);\n\n if (remoteNames.length === 0) {\n p.log.info(pc.dim(\"No remote secrets found.\"));\n p.log.info(pc.dim(`Add one with ${pc.cyan(\"kalp secrets add -k KEY -v VALUE\")}`));\n p.outro(\"Done\");\n return;\n }\n\n p.log.info(pc.bold(\"Remote runtime secrets\"));\n for (const name of remoteNames) {\n const synced = localSecrets.includes(name);\n const icon = synced ? pc.green(\"✓\") : pc.yellow(\"○\");\n console.log(` ${icon} ${pc.cyan(name)}`);\n }\n\n if (syncedCount !== remoteNames.length) {\n const missingLocal = remoteNames.filter((name) => !localSecrets.includes(name));\n p.log.warn(\n `Missing in kalp.config.ts: ${missingLocal.map((name) => pc.cyan(name)).join(\", \")}`,\n );\n }\n\n const localOnly = localSecrets.filter((name) => !remoteNames.includes(name));\n if (localOnly.length > 0) {\n p.log.warn(\n `Local-only secrets (not remote): ${localOnly.map((name) => pc.cyan(name)).join(\", \")}`,\n );\n }\n\n p.outro(\"Done\");\n } catch (error) {\n spinner.stop(\"Failed to load secrets\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAMf,IAAM,OAAO;AAEb,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,MAAM,QAAQ,IAAI;AAExB,QAAI,KAAK,MAAM;AACb,MAAE,MAAI,KAAK,GAAG,GAAG,KAAK,OAAO,CAAC,qBAAqB;AACnD;AAAA,IACF;AAEA,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,mBAAmB,CAAC,EAAE;AAEjD,UAAM,YAAY,EAAE,MAAM,MAAM;AAC9B,MAAE,MAAI,MAAM,4CAA4C;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAED,UAAMA,WAAY,UAAQ;AAC1B,IAAAA,SAAQ,MAAM,wBAAwB;AAEtC,QAAI;AACF,YAAM,aAAa,MAAM,gCAAgC,GAAG;AAC5D,YAAM,WAAW,gBAAgB;AACjC,YAAM,CAAC,eAAe,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,QACtD,SAAS,YAAY,EAAE,KAAK,WAAW,CAAC;AAAA,QACxC,2BAA2B,GAAG;AAAA,MAChC,CAAC;AAED,YAAM,cAAc,cAAc,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAC5F,YAAM,cAAc,YAAY,OAAO,CAAC,SAAS,aAAa,SAAS,IAAI,CAAC,EAAE;AAC9E,MAAAA,SAAQ,KAAK,SAAS,YAAY,MAAM,iBAAiB;AAEzD,UAAI,YAAY,WAAW,GAAG;AAC5B,QAAE,MAAI,KAAK,GAAG,IAAI,0BAA0B,CAAC;AAC7C,QAAE,MAAI,KAAK,GAAG,IAAI,gBAAgB,GAAG,KAAK,kCAAkC,CAAC,EAAE,CAAC;AAChF,QAAE,QAAM,MAAM;AACd;AAAA,MACF;AAEA,MAAE,MAAI,KAAK,GAAG,KAAK,wBAAwB,CAAC;AAC5C,iBAAW,QAAQ,aAAa;AAC9B,cAAM,SAAS,aAAa,SAAS,IAAI;AACzC,cAAM,OAAO,SAAS,GAAG,MAAM,QAAG,IAAI,GAAG,OAAO,QAAG;AACnD,gBAAQ,IAAI,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,CAAC,EAAE;AAAA,MAC1C;AAEA,UAAI,gBAAgB,YAAY,QAAQ;AACtC,cAAM,eAAe,YAAY,OAAO,CAAC,SAAS,CAAC,aAAa,SAAS,IAAI,CAAC;AAC9E,QAAE,MAAI;AAAA,UACJ,8BAA8B,aAAa,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,QACpF;AAAA,MACF;AAEA,YAAM,YAAY,aAAa,OAAO,CAAC,SAAS,CAAC,YAAY,SAAS,IAAI,CAAC;AAC3E,UAAI,UAAU,SAAS,GAAG;AACxB,QAAE,MAAI;AAAA,UACJ,oCAAoC,UAAU,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,QACvF;AAAA,MACF;AAEA,MAAE,QAAM,MAAM;AAAA,IAChB,SAAS,OAAO;AACd,MAAAA,SAAQ,KAAK,wBAAwB;AACrC,MAAE,MAAI,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;","names":["spinner"]}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
resolveProvider
|
|
4
|
-
} from "./chunk-TNKYKA7N.js";
|
|
5
|
-
import {
|
|
3
|
+
resolveProvider,
|
|
6
4
|
saveAuthConfig
|
|
7
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-GNQI376N.js";
|
|
8
6
|
import "./chunk-FO24J6XL.js";
|
|
9
7
|
|
|
10
8
|
// src/commands/login.ts
|
|
@@ -58,4 +56,4 @@ var login_default = defineCommand({
|
|
|
58
56
|
export {
|
|
59
57
|
login_default as default
|
|
60
58
|
};
|
|
61
|
-
//# sourceMappingURL=login-
|
|
59
|
+
//# sourceMappingURL=login-RAN2I7YT.js.map
|
|
@@ -1 +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 {\n saveAuthConfig,\n type AuthConfig,\n} from \"@/utils/auth\";\nimport { resolveProvider } from \"@/utils/providers\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"login\", description: \"Sign in to remote runtime\" },\n async run() {\n p.intro(`${LOGO} ${pc.bold(\"kalp login\")}`);\n\n const provider = resolveProvider();\n const proceed = await p.confirm({\n message: \"Sign in to remote runtime now?\",\n initialValue: true,\n });\n if (p.isCancel(proceed) || !proceed) {\n p.outro(\"Cancelled\");\n return;\n }\n\n const s = p.spinner();\n s.start(\"Opening sign-in flow\");\n\n try {\n await provider.login();\n } catch {\n s.stop(pc.red(\"Sign-in failed\"));\n process.exit(1);\n }\n\n s.stop(\"Sign-in complete\");\n s.start(\"Reading runtime identity\");\n const identity = await provider.whoami();\n const accountId = identity?.accountId;\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(\"Authentication saved\");\n p.log.success(`Logged in as ${pc.cyan(authConfig.email)}`);\n p.note(`Workspace ID: ${pc.cyan(authConfig.accountId)}`, \"Runtime\");\n p.outro(pc.green(\"Ready to deploy your agents\"));\n },\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/commands/login.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport {\n saveAuthConfig,\n type AuthConfig,\n} from \"@/utils/auth\";\nimport { resolveProvider } from \"@/utils/providers\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"login\", description: \"Sign in to remote runtime\" },\n async run() {\n p.intro(`${LOGO} ${pc.bold(\"kalp login\")}`);\n\n const provider = resolveProvider();\n const proceed = await p.confirm({\n message: \"Sign in to remote runtime now?\",\n initialValue: true,\n });\n if (p.isCancel(proceed) || !proceed) {\n p.outro(\"Cancelled\");\n return;\n }\n\n const s = p.spinner();\n s.start(\"Opening sign-in flow\");\n\n try {\n await provider.login();\n } catch {\n s.stop(pc.red(\"Sign-in failed\"));\n process.exit(1);\n }\n\n s.stop(\"Sign-in complete\");\n s.start(\"Reading runtime identity\");\n const identity = await provider.whoami();\n const accountId = identity?.accountId;\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(\"Authentication saved\");\n p.log.success(`Logged in as ${pc.cyan(authConfig.email)}`);\n p.note(`Workspace ID: ${pc.cyan(authConfig.accountId)}`, \"Runtime\");\n p.outro(pc.green(\"Ready to deploy your agents\"));\n },\n});\n"],"mappings":";;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAOf,IAAM,OAAO;AAEb,IAAO,gBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,SAAS,aAAa,4BAA4B;AAAA,EAChE,MAAM,MAAM;AACV,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,YAAY,CAAC,EAAE;AAE1C,UAAM,WAAW,gBAAgB;AACjC,UAAM,UAAU,MAAQ,UAAQ;AAAA,MAC9B,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AACD,QAAM,WAAS,OAAO,KAAK,CAAC,SAAS;AACnC,MAAE,QAAM,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,sBAAsB;AAE9B,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,IACvB,QAAQ;AACN,QAAE,KAAK,GAAG,IAAI,gBAAgB,CAAC;AAC/B,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,MAAE,KAAK,kBAAkB;AACzB,MAAE,MAAM,0BAA0B;AAClC,UAAM,WAAW,MAAM,SAAS,OAAO;AACvC,UAAM,YAAY,UAAU;AAC5B,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,sBAAsB;AAC7B,IAAE,MAAI,QAAQ,gBAAgB,GAAG,KAAK,WAAW,KAAK,CAAC,EAAE;AACzD,IAAE,OAAK,iBAAiB,GAAG,KAAK,WAAW,SAAS,CAAC,IAAI,SAAS;AAClE,IAAE,QAAM,GAAG,MAAM,6BAA6B,CAAC;AAAA,EACjD;AACF,CAAC;","names":[]}
|
|
@@ -4,25 +4,26 @@ import {
|
|
|
4
4
|
readAgentManifest,
|
|
5
5
|
validateCompiledIR
|
|
6
6
|
} from "./chunk-VCFH3R34.js";
|
|
7
|
+
import {
|
|
8
|
+
promptDeployTarget,
|
|
9
|
+
runInitialDeploy,
|
|
10
|
+
showKalpCloudWaitlist
|
|
11
|
+
} from "./chunk-X56YSZGT.js";
|
|
12
|
+
import "./chunk-NV2IZ4XM.js";
|
|
7
13
|
import {
|
|
8
14
|
ensureConfig
|
|
9
15
|
} from "./chunk-INB3LG6O.js";
|
|
10
16
|
import {
|
|
11
|
-
|
|
12
|
-
} from "./chunk-PY6VAS54.js";
|
|
13
|
-
import {
|
|
17
|
+
requireAuth,
|
|
14
18
|
resolveProvider
|
|
15
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-GNQI376N.js";
|
|
20
|
+
import "./chunk-FO24J6XL.js";
|
|
16
21
|
import {
|
|
17
22
|
materializeRuntime,
|
|
18
23
|
readLocalAgentNames,
|
|
19
24
|
readProjectState,
|
|
20
25
|
writeProjectState
|
|
21
|
-
} from "./chunk-
|
|
22
|
-
import {
|
|
23
|
-
requireAuth
|
|
24
|
-
} from "./chunk-5RODADXW.js";
|
|
25
|
-
import "./chunk-FO24J6XL.js";
|
|
26
|
+
} from "./chunk-DHCCSWJN.js";
|
|
26
27
|
|
|
27
28
|
// src/commands/push.ts
|
|
28
29
|
import { access, mkdir as mkdir2, rm, writeFile as writeFile2 } from "fs/promises";
|
|
@@ -241,6 +242,16 @@ var push_default = defineCommand({
|
|
|
241
242
|
process.exit(1);
|
|
242
243
|
});
|
|
243
244
|
if (!state.workerUrl) {
|
|
245
|
+
const target2 = await promptDeployTarget("No remote runtime detected yet. Where do you want to deploy?");
|
|
246
|
+
if (!target2) {
|
|
247
|
+
p.outro("Cancelled");
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
if (target2 === "kalp-cloud") {
|
|
251
|
+
showKalpCloudWaitlist();
|
|
252
|
+
p.outro(pc.green("Got it \u2014 you'll hear from us soon."));
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
244
255
|
p.log.warn("No .kalp/state.json found. Running initial deploy first...");
|
|
245
256
|
const deploy = await runInitialDeploy(cwd);
|
|
246
257
|
state = await readProjectState(cwd) ?? createInitialState();
|
|
@@ -373,4 +384,4 @@ var push_default = defineCommand({
|
|
|
373
384
|
export {
|
|
374
385
|
push_default as default
|
|
375
386
|
};
|
|
376
|
-
//# sourceMappingURL=push-
|
|
387
|
+
//# sourceMappingURL=push-RA6GEUV4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/push.ts","../src/utils/ir/export.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 { ensureConfig } from \"@/utils/fs\";\nimport { readAgentManifest, computePushHash } from \"@/utils/manifest\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { runInitialDeploy } from \"@/utils/deploy\";\nimport {\n type ProjectAgentState,\n type ProjectState,\n readProjectState,\n writeProjectState,\n} from \"@/utils/project-state\";\nimport { validateCompiledIR } from \"@/utils/validate\";\nimport { materializeRuntime, readLocalAgentNames } from \"@/utils/runtime\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport { exportCompiledIrForDebug } from \"@/utils/ir/export\";\nimport { promptDeployTarget, showKalpCloudWaitlist } from \"@/utils/deploy-target\";\n\nconst LOGO = \"🦋\";\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n return `${(bytes / 1024).toFixed(1)} KB`;\n}\n\nfunction createInitialState(): ProjectState {\n return {\n workerUrl: null,\n deployedAt: null,\n accountId: null,\n studioCredentialsFingerprint: null,\n serviceKeyFingerprint: null,\n agents: {},\n };\n}\n\nfunction ensureAgentState(\n state: ProjectState,\n agentName: string,\n localPath: string,\n): ProjectAgentState {\n const existing = state.agents[agentName];\n if (existing) {\n existing.localPath = localPath;\n return existing;\n }\n\n const created: ProjectAgentState = {\n currentHash: null,\n currentVersion: 0,\n lastLocalHash: null,\n lastRemoteHash: null,\n lastPushedAt: null,\n localPath,\n workerUrl:\n state.workerUrl ? `${state.workerUrl.replace(/\\/$/, \"\")}/a/${agentName}` : null,\n };\n state.agents[agentName] = created;\n return created;\n}\n\ntype PushTarget = \"local\" | \"remote\";\n\ninterface PushResult {\n pushed: number;\n skipped: number;\n failed: number;\n}\n\ninterface RemoteAgentIndexEntry {\n name: string;\n hash: string;\n version: string | null;\n versionNumber: number | null;\n updatedAt: string;\n workerUrl: string | null;\n label?: string;\n tags?: string[];\n}\n\ninterface PruneResult {\n removedAgents: string[];\n deletedKeys: number;\n}\n\nasync function readRemoteAgentsIndex(\n cwd: string,\n wranglerConfigPath: string,\n): Promise<RemoteAgentIndexEntry[]> {\n const provider = resolveProvider();\n const output = await provider\n .getValue({\n cwd,\n configPath: wranglerConfigPath,\n key: \"agents:index\",\n })\n .catch(() => null);\n if (!output) return [];\n try {\n const parsed = JSON.parse(output) as unknown;\n if (!Array.isArray(parsed)) return [];\n return parsed as RemoteAgentIndexEntry[];\n } catch {\n return [];\n }\n}\n\nasync function writeRemoteAgentsIndex(\n cwd: string,\n wranglerConfigPath: string,\n entries: RemoteAgentIndexEntry[],\n): Promise<void> {\n const path = join(cwd, \".kalp\", \"agents-index.json\");\n await writeFile(path, JSON.stringify(entries, null, 2), \"utf-8\");\n const provider = resolveProvider();\n try {\n await provider.putManifest({\n cwd,\n configPath: wranglerConfigPath,\n key: \"agents:index\",\n jsonPath: path,\n });\n } finally {\n await rm(path, { force: true });\n }\n}\n\nasync function pruneStaleRemoteAgents(params: {\n cwd: string;\n wranglerConfigPath: string;\n remoteEntries: RemoteAgentIndexEntry[];\n localAgentNames: string[];\n}): Promise<PruneResult> {\n const { cwd, wranglerConfigPath, remoteEntries, localAgentNames } = params;\n const localSet = new Set(localAgentNames);\n const staleEntries = remoteEntries.filter((entry) => !localSet.has(entry.name));\n\n if (staleEntries.length === 0) {\n return { removedAgents: [], deletedKeys: 0 };\n }\n\n const preview = staleEntries.slice(0, 3).map((entry) => entry.name).join(\", \");\n const suffix =\n staleEntries.length > 3 ? ` and ${staleEntries.length - 3} more` : \"\";\n const confirmation = await p.confirm({\n message: `Found ${staleEntries.length} stale remote agents that no longer exist locally (e.g., ${pc.cyan(preview)}${suffix}). Do you want to prune them from the remote runtime?`,\n initialValue: true,\n });\n\n if (p.isCancel(confirmation)) {\n p.outro(\"Cancelled\");\n process.exit(0);\n }\n\n if (!confirmation) {\n return { removedAgents: [], deletedKeys: 0 };\n }\n\n const provider = resolveProvider();\n let deletedKeys = 0;\n\n for (const entry of staleEntries) {\n const latestKey = `${entry.name}:latest`;\n const latestHash = await provider\n .getValue({ cwd, configPath: wranglerConfigPath, key: latestKey })\n .catch(() => null);\n\n const hashes = new Set<string>();\n if (entry.hash) hashes.add(entry.hash);\n if (latestHash) hashes.add(latestHash);\n\n const latestDeleted = await provider\n .deleteValue({\n cwd,\n configPath: wranglerConfigPath,\n key: latestKey,\n })\n .then(() => true)\n .catch(() => false);\n if (latestDeleted) deletedKeys += 1;\n\n for (const hash of hashes) {\n const deleted = await provider\n .deleteValue({\n cwd,\n configPath: wranglerConfigPath,\n key: `${entry.name}:${hash}`,\n })\n .then(() => true)\n .catch(() => false);\n if (deleted) deletedKeys += 1;\n }\n }\n\n const filtered = remoteEntries.filter((entry) => localSet.has(entry.name));\n await writeRemoteAgentsIndex(cwd, wranglerConfigPath, filtered);\n\n return {\n removedAgents: staleEntries.map((entry) => entry.name).sort((a, b) => a.localeCompare(b)),\n deletedKeys,\n };\n}\n\nasync function mergeRemoteAgentIndexEntry(params: {\n cwd: string;\n wranglerConfigPath: string;\n entry: RemoteAgentIndexEntry;\n}): Promise<void> {\n const { cwd, wranglerConfigPath, entry } = params;\n const currentIndex = await readRemoteAgentsIndex(cwd, wranglerConfigPath);\n const merged = [\n ...currentIndex.filter((existing) => existing.name !== entry.name),\n entry,\n ].sort((a, b) => a.name.localeCompare(b.name));\n\n await writeRemoteAgentsIndex(cwd, wranglerConfigPath, merged);\n}\n\nasync function pushRemoteManifest(params: {\n cwd: string;\n wranglerConfigPath: string;\n agentName: string;\n hash: string;\n ir: unknown;\n}): Promise<void> {\n const { cwd, wranglerConfigPath, agentName, hash, ir } = params;\n const manifestKey = `${agentName}:${hash}`;\n const latestKey = `${agentName}:latest`;\n const manifestPath = join(cwd, \".kalp\", `${agentName}-${hash}.json`);\n await mkdir(join(cwd, \".kalp\"), { recursive: true });\n await writeFile(manifestPath, JSON.stringify(ir), \"utf-8\");\n\n const provider = resolveProvider();\n try {\n await provider.putManifest({\n cwd,\n configPath: wranglerConfigPath,\n key: manifestKey,\n jsonPath: manifestPath,\n });\n await provider.putValue({\n cwd,\n configPath: wranglerConfigPath,\n key: latestKey,\n value: hash,\n });\n } finally {\n await rm(manifestPath, { force: true });\n }\n}\n\nexport default defineCommand({\n meta: { name: \"push\", description: \"Publish agent runtime version\" },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name to push\",\n required: false,\n },\n local: {\n type: \"boolean\",\n description: \"Update only local runtime snapshot and state\",\n required: false,\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n const target: PushTarget = args.local ? \"local\" : \"remote\";\n const isBulkPush = !args.agent;\n\n p.intro(`${LOGO} ${pc.bold(\"kalp push\")}`);\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 availableAgents = await readLocalAgentNames(cwd);\n if (availableAgents.length === 0) {\n p.log.error(\"No local agents found in ./agents\");\n process.exit(1);\n }\n\n let selectedAgents: string[] = [];\n if (args.agent) {\n if (!availableAgents.includes(args.agent)) {\n p.log.error(`Agent ${pc.cyan(args.agent)} not found`);\n process.exit(1);\n }\n selectedAgents = [args.agent];\n } else {\n selectedAgents = availableAgents;\n }\n\n let state = (await readProjectState(cwd)) ?? createInitialState();\n let runtime = await materializeRuntime(cwd, { mode: target });\n\n if (target === \"remote\") {\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n if (!state.workerUrl) {\n const target = await promptDeployTarget(\"No remote runtime detected yet. Where do you want to deploy?\");\n if (!target) {\n p.outro(\"Cancelled\");\n return;\n }\n if (target === \"kalp-cloud\") {\n showKalpCloudWaitlist();\n p.outro(pc.green(\"Got it — you'll hear from us soon.\"));\n return;\n }\n p.log.warn(\"No .kalp/state.json found. Running initial deploy first...\");\n const deploy = await runInitialDeploy(cwd);\n state = (await readProjectState(cwd)) ?? createInitialState();\n state.workerUrl = deploy.workerUrl;\n state.accountId = deploy.accountId;\n state.deployedAt = new Date().toISOString();\n }\n\n runtime = await materializeRuntime(cwd, { mode: \"remote\" });\n\n if (isBulkPush) {\n const currentIndex = await readRemoteAgentsIndex(cwd, runtime.wranglerConfigPath);\n const prune = await pruneStaleRemoteAgents({\n cwd,\n wranglerConfigPath: runtime.wranglerConfigPath,\n remoteEntries: currentIndex,\n localAgentNames: availableAgents,\n });\n\n if (prune.removedAgents.length > 0) {\n p.log.info(\n `Pruned stale remote agents: ${pc.cyan(prune.removedAgents.join(\", \"))} ${pc.dim(`(${prune.deletedKeys} keys cleaned)`)}`,\n );\n }\n }\n }\n\n const spinner = p.spinner();\n const result: PushResult = { pushed: 0, skipped: 0, failed: 0 };\n const failures: string[] = [];\n\n for (const agentName of selectedAgents) {\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n await access(agentPath).catch(() => {\n failures.push(`${agentName}: missing ${agentPath}`);\n });\n\n try {\n spinner.start(`Compiling ${pc.cyan(agentName)}`);\n const manifest = await readAgentManifest({ cwd, agentName });\n const hash = computePushHash(manifest.ir);\n const validation = validateCompiledIR({ agentName, ir: manifest.ir, hash });\n if (!validation.ok) {\n const details = (validation.errors ?? []).join(\" | \");\n throw new Error(\n `validation failed (${validation.phase})${details ? `: ${details}` : \"\"}`,\n );\n }\n\n const agentState = ensureAgentState(state, agentName, agentPath);\n const previousHash =\n target === \"local\" ? agentState.lastLocalHash : agentState.lastRemoteHash;\n\n if (previousHash === hash) {\n result.skipped += 1;\n spinner.stop(`Skipped ${pc.cyan(agentName)} (no changes)`);\n continue;\n }\n\n if (target === \"remote\") {\n spinner.message(\"Publishing runtime version\");\n await pushRemoteManifest({\n cwd,\n wranglerConfigPath: runtime.wranglerConfigPath,\n agentName,\n hash,\n ir: manifest.ir,\n });\n }\n\n agentState.currentVersion = Math.max(0, agentState.currentVersion) + 1;\n agentState.currentHash = hash;\n agentState.lastPushedAt = new Date().toISOString();\n agentState.workerUrl =\n state.workerUrl && target === \"remote\"\n ? `${state.workerUrl.replace(/\\/$/, \"\")}/a/${agentName}`\n : agentState.workerUrl;\n\n if (target === \"local\") {\n agentState.lastLocalHash = hash;\n } else {\n agentState.lastRemoteHash = hash;\n agentState.lastLocalHash = hash;\n\n const nextEntry: RemoteAgentIndexEntry = {\n name: agentName,\n hash,\n version: `v${agentState.currentVersion}`,\n versionNumber: agentState.currentVersion,\n updatedAt: agentState.lastPushedAt,\n workerUrl: agentState.workerUrl,\n label: manifest.ir.metadata?.label,\n tags: manifest.ir.metadata?.tags,\n };\n await mergeRemoteAgentIndexEntry({\n cwd,\n wranglerConfigPath: runtime.wranglerConfigPath,\n entry: nextEntry,\n });\n }\n\n const bundles = manifest.ir.bundles || {};\n await exportCompiledIrForDebug({\n cwd,\n agentName,\n ir: manifest.ir,\n });\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 spinner.stop(\n `${pc.bold(agentName)} pushed ${pc.dim(`(v${agentState.currentVersion})`)} · ${handlerCount} handlers · ${formatBytes(totalSize)}`,\n );\n result.pushed += 1;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n failures.push(`${agentName}: ${message}`);\n spinner.stop(`Failed ${pc.cyan(agentName)}`);\n result.failed += 1;\n }\n }\n\n await writeProjectState(cwd, state);\n await materializeRuntime(cwd, { mode: target });\n\n p.note(\n `Successfully pushed ${result.pushed} agents. ${result.skipped} omitted (no changes). ${result.failed} failed.`,\n target === \"local\" ? \"Local push\" : \"Remote push\",\n );\n if (target === \"remote\" && result.pushed > 0) {\n p.log.info(\n pc.dim(\n \"Changes propagating to remote Studio (eventual consistency, up to ~60s).\",\n ),\n );\n }\n\n if (failures.length > 0) {\n for (const failure of failures) {\n p.log.error(failure);\n }\n p.outro(`${LOGO} ${pc.red(\"Push completed with failures\")}`);\n process.exit(1);\n }\n\n p.outro(`${LOGO} ${pc.green(\"Push complete\")}`);\n },\n});\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\n/**\n * TODO remove after SaaS observability: debug IR export for local inspection.\n */\nexport async function exportCompiledIrForDebug(params: {\n cwd: string;\n agentName: string;\n ir: unknown;\n}): Promise<string> {\n const { cwd, agentName, ir } = params;\n const outDir = join(cwd, \".kalp\", \"exports\", agentName);\n await mkdir(outDir, { recursive: true });\n const outputPath = join(outDir, \"ir.json\");\n await writeFile(outputPath, `${JSON.stringify(ir, null, 2)}\\n`, \"utf-8\");\n return outputPath;\n}\n"],"mappings":"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","names":["mkdir","writeFile","join","join","writeFile","mkdir","target","spinner"]}
|
|
@@ -8,7 +8,7 @@ var LOGO = "\u{1F98B}";
|
|
|
8
8
|
var secrets_default = defineCommand({
|
|
9
9
|
meta: {
|
|
10
10
|
name: "secrets",
|
|
11
|
-
description: "Manage
|
|
11
|
+
description: "Manage remote runtime secrets"
|
|
12
12
|
},
|
|
13
13
|
args: {
|
|
14
14
|
help: {
|
|
@@ -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-4X735L5X.js").then((r) => r.default),
|
|
23
|
+
add: () => import("./add-NDU352FV.js").then((r) => r.default),
|
|
24
|
+
delete: () => import("./delete-DY5FQAHW.js").then((r) => r.default),
|
|
25
|
+
sync: () => import("./sync-2NLWWGI2.js").then((r) => r.default)
|
|
26
26
|
},
|
|
27
27
|
run({ args }) {
|
|
28
28
|
if (!args.help) {
|
|
@@ -30,11 +30,11 @@ var secrets_default = defineCommand({
|
|
|
30
30
|
}
|
|
31
31
|
p.intro(`${LOGO} ${pc.bold("kalp secrets")}`);
|
|
32
32
|
p.log.message(pc.bold("Available subcommands:"));
|
|
33
|
-
p.log.message(` ${pc.cyan("list")} List secrets from
|
|
34
|
-
p.log.message(` ${pc.cyan("add")} Add a secret to
|
|
35
|
-
p.log.message(` ${pc.cyan("delete")} Delete a secret from
|
|
33
|
+
p.log.message(` ${pc.cyan("list")} List secrets from remote runtime`);
|
|
34
|
+
p.log.message(` ${pc.cyan("add")} Add a secret to remote runtime`);
|
|
35
|
+
p.log.message(` ${pc.cyan("delete")} Delete a secret from remote runtime`);
|
|
36
36
|
p.log.message(
|
|
37
|
-
` ${pc.cyan("sync")}
|
|
37
|
+
` ${pc.cyan("sync")} Merge remote secrets into local config`
|
|
38
38
|
);
|
|
39
39
|
p.log.message("");
|
|
40
40
|
p.log.message(
|
|
@@ -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-5ZPPASCH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/secrets/index.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"secrets\",\n description: \"Manage remote runtime secrets\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n list: () => import(\"./list\").then((r) => r.default),\n add: () => import(\"./add\").then((r) => r.default),\n delete: () => import(\"./delete\").then((r) => r.default),\n sync: () => import(\"./sync\").then((r) => r.default),\n },\n run({ args }) {\n if (!args.help) {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets\")}`);\n p.log.message(pc.bold(\"Available subcommands:\"));\n p.log.message(` ${pc.cyan(\"list\")} List secrets from remote runtime`);\n p.log.message(` ${pc.cyan(\"add\")} Add a secret to remote runtime`);\n p.log.message(` ${pc.cyan(\"delete\")} Delete a secret from remote runtime`);\n p.log.message(\n ` ${pc.cyan(\"sync\")} Merge remote secrets into local config`,\n );\n p.log.message(\"\");\n p.log.message(\n `Run ${pc.cyan(\"kalp secrets <subcommand> --help\")} for more info.`,\n );\n p.outro(pc.dim(\"Done\"));\n },\n});\n"],"mappings":";;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAEf,IAAM,OAAO;AAEb,IAAO,kBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,MAAM,MAAM,OAAO,oBAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAClD,KAAK,MAAM,OAAO,mBAAO,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAChD,QAAQ,MAAM,OAAO,sBAAU,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IACtD,MAAM,MAAM,OAAO,oBAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,EACpD;AAAA,EACA,IAAI,EAAE,KAAK,GAAG;AACZ,QAAI,CAAC,KAAK,MAAM;AACd;AAAA,IACF;AAEA,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,cAAc,CAAC,EAAE;AAC5C,IAAE,MAAI,QAAQ,GAAG,KAAK,wBAAwB,CAAC;AAC/C,IAAE,MAAI,QAAQ,KAAK,GAAG,KAAK,MAAM,CAAC,qCAAqC;AACvE,IAAE,MAAI,QAAQ,KAAK,GAAG,KAAK,KAAK,CAAC,oCAAoC;AACrE,IAAE,MAAI,QAAQ,KAAK,GAAG,KAAK,QAAQ,CAAC,sCAAsC;AAC1E,IAAE,MAAI;AAAA,MACJ,KAAK,GAAG,KAAK,MAAM,CAAC;AAAA,IACtB;AACA,IAAE,MAAI,QAAQ,EAAE;AAChB,IAAE,MAAI;AAAA,MACJ,OAAO,GAAG,KAAK,kCAAkC,CAAC;AAAA,IACpD;AACA,IAAE,QAAM,GAAG,IAAI,MAAM,CAAC;AAAA,EACxB;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
generateTypes
|
|
4
|
+
} from "./chunk-MMS3GWBG.js";
|
|
5
|
+
import {
|
|
6
|
+
mergeSecrets,
|
|
7
|
+
readLocalSecretsFromConfig,
|
|
8
|
+
resolveSecretsRuntimeConfigPath,
|
|
9
|
+
writeLocalSecretsToConfig
|
|
10
|
+
} from "./chunk-5ZRVO3TQ.js";
|
|
11
|
+
import "./chunk-INB3LG6O.js";
|
|
12
|
+
import {
|
|
13
|
+
requireAuth,
|
|
14
|
+
resolveProvider
|
|
15
|
+
} from "./chunk-GNQI376N.js";
|
|
16
|
+
import "./chunk-FO24J6XL.js";
|
|
17
|
+
import "./chunk-DHCCSWJN.js";
|
|
18
|
+
|
|
19
|
+
// src/commands/secrets/sync.ts
|
|
20
|
+
import { defineCommand } from "citty";
|
|
21
|
+
import * as p from "@clack/prompts";
|
|
22
|
+
import pc from "picocolors";
|
|
23
|
+
var LOGO = "\u{1F98B}";
|
|
24
|
+
var sync_default = defineCommand({
|
|
25
|
+
meta: {
|
|
26
|
+
name: "sync",
|
|
27
|
+
description: "Merge remote secrets into local kalp.config.ts"
|
|
28
|
+
},
|
|
29
|
+
async run() {
|
|
30
|
+
const cwd = process.cwd();
|
|
31
|
+
p.intro(`${LOGO} ${pc.bold("kalp secrets sync")}`);
|
|
32
|
+
await requireAuth().catch(() => {
|
|
33
|
+
p.log.error("Not authenticated. Run `kalp login` first.");
|
|
34
|
+
process.exit(1);
|
|
35
|
+
});
|
|
36
|
+
const spinner2 = p.spinner();
|
|
37
|
+
spinner2.start("Reading remote secrets");
|
|
38
|
+
try {
|
|
39
|
+
const configPath = await resolveSecretsRuntimeConfigPath(cwd);
|
|
40
|
+
const provider = resolveProvider();
|
|
41
|
+
const [remoteSecrets, localSecrets] = await Promise.all([
|
|
42
|
+
provider.listSecrets({ cwd, configPath }),
|
|
43
|
+
readLocalSecretsFromConfig(cwd)
|
|
44
|
+
]);
|
|
45
|
+
const remoteNames = remoteSecrets.map((secret) => secret.name);
|
|
46
|
+
const merged = mergeSecrets(localSecrets, remoteNames);
|
|
47
|
+
const added = merged.filter((name) => !localSecrets.includes(name));
|
|
48
|
+
await writeLocalSecretsToConfig(cwd, merged);
|
|
49
|
+
await generateTypes(cwd);
|
|
50
|
+
spinner2.stop(`Synced ${remoteNames.length} remote secrets`);
|
|
51
|
+
if (added.length > 0) {
|
|
52
|
+
p.log.success(
|
|
53
|
+
`Added to local config: ${added.map((name) => pc.cyan(name)).join(", ")}`
|
|
54
|
+
);
|
|
55
|
+
} else {
|
|
56
|
+
p.log.info(pc.dim("Local config already up to date."));
|
|
57
|
+
}
|
|
58
|
+
p.outro("Done");
|
|
59
|
+
} catch (error) {
|
|
60
|
+
spinner2.stop("Sync failed");
|
|
61
|
+
p.log.error(error instanceof Error ? error.message : String(error));
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
export {
|
|
67
|
+
sync_default as default
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=sync-2NLWWGI2.js.map
|