@kalphq/cli 0.0.0-dev-20260513012830 → 0.0.0-dev-20260513014949

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.
@@ -19,22 +19,25 @@ var agents_default = defineCommand({
19
19
  }
20
20
  },
21
21
  subCommands: {
22
- list: () => import("./list-4HHUQLZ2.js").then((r) => r.default),
23
- delete: () => import("./delete-K5Z552BS.js").then((r) => r.default)
22
+ list: () => import("./list-5RQZ3JVG.js").then((r) => r.default),
23
+ delete: () => import("./delete-LW2G4GCN.js").then((r) => r.default)
24
24
  },
25
25
  run({ args }) {
26
+ const subcommand = process.argv[3];
27
+ if (subcommand && subcommand !== "--help" && subcommand !== "-h") {
28
+ return;
29
+ }
26
30
  p.intro(`${LOGO} ${pc.bold("kalp agents")}`);
27
31
  p.log.message(pc.bold("Available subcommands:"));
28
- p.log.message(` ${pc.cyan("list")} Compare local and remote agent status`);
32
+ p.log.message(` ${pc.cyan("list")} List remote agents`);
29
33
  p.log.message(` ${pc.cyan("delete")} Delete an agent from remote runtime`);
30
34
  p.log.message("");
31
35
  p.log.message(
32
36
  `Run ${pc.cyan("kalp agents <subcommand> --help")} for more info.`
33
37
  );
34
- p.outro(args.help ? pc.dim("Done") : pc.dim("Select a subcommand above."));
35
38
  }
36
39
  });
37
40
  export {
38
41
  agents_default as default
39
42
  };
40
- //# sourceMappingURL=agents-RICTNA5H.js.map
43
+ //# sourceMappingURL=agents-NN2FLBZM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/agents/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: \"agents\",\n description: \"Inspect and manage project agents\",\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 delete: () => import(\"./delete\").then((r) => r.default),\n },\n run({ args }) {\n const subcommand = process.argv[3];\n if (subcommand && subcommand !== \"--help\" && subcommand !== \"-h\") {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp agents\")}`);\n p.log.message(pc.bold(\"Available subcommands:\"));\n p.log.message(` ${pc.cyan(\"list\")} List remote agents`);\n p.log.message(` ${pc.cyan(\"delete\")} Delete an agent from remote runtime`);\n p.log.message(\"\");\n p.log.message(\n `Run ${pc.cyan(\"kalp agents <subcommand> --help\")} for more info.`,\n );\n },\n});\n"],"mappings":";;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAEf,IAAM,OAAO;AAEb,IAAO,iBAAQ,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,QAAQ,MAAM,OAAO,sBAAU,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,EACxD;AAAA,EACA,IAAI,EAAE,KAAK,GAAG;AACZ,UAAM,aAAa,QAAQ,KAAK,CAAC;AACjC,QAAI,cAAc,eAAe,YAAY,eAAe,MAAM;AAChE;AAAA,IACF;AAEA,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,aAAa,CAAC,EAAE;AAC3C,IAAE,MAAI,QAAQ,GAAG,KAAK,wBAAwB,CAAC;AAC/C,IAAE,MAAI,QAAQ,KAAK,GAAG,KAAK,MAAM,CAAC,wBAAwB;AAC1D,IAAE,MAAI,QAAQ,KAAK,GAAG,KAAK,QAAQ,CAAC,uCAAuC;AAC3E,IAAE,MAAI,QAAQ,EAAE;AAChB,IAAE,MAAI;AAAA,MACJ,OAAO,GAAG,KAAK,iCAAiC,CAAC;AAAA,IACnD;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -33,7 +33,7 @@ var delete_default = defineCommand({
33
33
  type: "string",
34
34
  alias: "a",
35
35
  description: "Agent name to delete from remote runtime",
36
- required: false
36
+ required: true
37
37
  },
38
38
  yes: {
39
39
  type: "boolean",
@@ -83,17 +83,12 @@ var delete_default = defineCommand({
83
83
  p.outro("Done");
84
84
  return;
85
85
  }
86
- let agentName = args.agent?.trim();
86
+ const agentName = args.agent?.trim();
87
87
  if (!agentName) {
88
- const selected = await p.select({
89
- message: "Select remote agent to delete",
90
- options: remoteNames.map((name) => ({ value: name, label: name }))
91
- });
92
- if (p.isCancel(selected)) {
93
- p.outro("Cancelled");
94
- return;
95
- }
96
- agentName = String(selected);
88
+ p.log.error(
89
+ `Agent name is required. Use ${pc.cyan("kalp agents delete -a <agent>")}.`
90
+ );
91
+ process.exit(1);
97
92
  }
98
93
  if (!remoteNames.includes(agentName)) {
99
94
  p.log.error(`Agent ${pc.cyan(agentName)} is not deployed remotely.`);
@@ -105,7 +100,7 @@ var delete_default = defineCommand({
105
100
  initialValue: false
106
101
  });
107
102
  if (p.isCancel(confirm2) || !confirm2) {
108
- p.outro("Cancelled");
103
+ p.log.info("Cancelled.");
109
104
  return;
110
105
  }
111
106
  }
@@ -136,7 +131,6 @@ var delete_default = defineCommand({
136
131
  `Local files were not changed. Delete ./agents/${agentName} manually if you no longer need it.`
137
132
  )
138
133
  );
139
- p.outro("Done");
140
134
  } catch (error) {
141
135
  spinner2.stop("Failed to delete remote agent");
142
136
  p.log.error(error instanceof Error ? error.message : String(error));
@@ -147,4 +141,4 @@ var delete_default = defineCommand({
147
141
  export {
148
142
  delete_default as default
149
143
  };
150
- //# sourceMappingURL=delete-K5Z552BS.js.map
144
+ //# sourceMappingURL=delete-LW2G4GCN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/agents/delete.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport {\n readRemoteAgentPointers,\n readRemoteAgentsIndex,\n writeRemoteAgentsIndex,\n} from \"@/utils/agents-remote\";\nimport { readProjectState, writeProjectState } from \"@/utils/project-state\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete an agent from remote runtime\",\n },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name to delete from remote runtime\",\n required: true,\n },\n yes: {\n type: \"boolean\",\n alias: \"y\",\n description: \"Skip confirmation\",\n default: false,\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp agents delete -a <agent>`);\n return;\n }\n\n const cwd = process.cwd();\n p.intro(`${LOGO} ${pc.bold(\"kalp agents delete\")}`);\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 agents\");\n\n try {\n const configPath = await resolveSecretsRuntimeConfigPath(cwd);\n const provider = resolveProvider();\n const [indexEntries, pointers] = await Promise.all([\n readRemoteAgentsIndex(cwd, configPath),\n readRemoteAgentPointers(cwd, configPath),\n ]);\n\n const indexByName = new Map(\n indexEntries.map((entry) => [entry.name, entry]),\n );\n const pointerByName = new Map(\n pointers.map((entry) => [entry.name, entry.hash]),\n );\n const remoteNames = [...new Set([...indexByName.keys(), ...pointerByName.keys()])].sort(\n (a, b) => a.localeCompare(b),\n );\n\n spinner.stop(`Found ${remoteNames.length} remote agents`);\n if (remoteNames.length === 0) {\n p.log.info(pc.dim(\"No remote agents available to delete.\"));\n p.outro(\"Done\");\n return;\n }\n\n const agentName = args.agent?.trim();\n if (!agentName) {\n p.log.error(\n `Agent name is required. Use ${pc.cyan(\"kalp agents delete -a <agent>\")}.`,\n );\n process.exit(1);\n }\n\n if (!remoteNames.includes(agentName)) {\n p.log.error(`Agent ${pc.cyan(agentName)} is not deployed remotely.`);\n process.exit(1);\n }\n\n if (!args.yes) {\n const confirm = await p.confirm({\n message: `Delete ${pc.cyan(agentName)} from remote runtime?`,\n initialValue: false,\n });\n if (p.isCancel(confirm) || !confirm) {\n p.log.info(\"Cancelled.\");\n return;\n }\n }\n\n const hashes = new Set<string>();\n const pointerHash = pointerByName.get(agentName);\n if (pointerHash) hashes.add(pointerHash);\n const indexedHash = indexByName.get(agentName)?.hash;\n if (indexedHash) hashes.add(indexedHash);\n\n spinner.start(`Deleting ${pc.cyan(agentName)} from remote runtime`);\n const latestKey = `${agentName}:latest`;\n await provider\n .deleteValue({ cwd, configPath, key: latestKey })\n .catch(() => null);\n for (const hash of hashes) {\n await provider\n .deleteValue({ cwd, configPath, key: `${agentName}:${hash}` })\n .catch(() => null);\n }\n\n const filteredIndex = indexEntries.filter(\n (entry) => entry.name !== agentName,\n );\n await writeRemoteAgentsIndex(cwd, configPath, filteredIndex);\n\n const state = await readProjectState(cwd);\n if (state?.agents?.[agentName]) {\n state.agents[agentName].lastRemoteHash = null;\n state.agents[agentName].workerUrl = null;\n await writeProjectState(cwd, state);\n }\n\n spinner.stop(`Deleted remote agent ${pc.cyan(agentName)}`);\n p.log.info(\n pc.dim(\n `Local files were not changed. Delete ./agents/${agentName} manually if you no longer need it.`,\n ),\n );\n } catch (error) {\n spinner.stop(\"Failed to delete remote agent\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["spinner","confirm"]}
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-20260513012830",
11
+ version: "0.0.0-dev-20260513014949",
12
12
  description: "Zero-config CLI for deploying Kalp agents",
13
13
  type: "module",
14
14
  license: "MIT",
@@ -95,7 +95,7 @@ var main = defineCommand({
95
95
  create: () => import("./create-XC55BUCS.js").then((r) => r.default),
96
96
  deploy: () => import("./deploy-2JMOUTWG.js").then((r) => r.default),
97
97
  push: () => import("./push-WHPQXAY7.js").then((r) => r.default),
98
- agents: () => import("./agents-RICTNA5H.js").then((r) => r.default),
98
+ agents: () => import("./agents-NN2FLBZM.js").then((r) => r.default),
99
99
  secrets: () => import("./secrets-Z53FLH56.js").then((r) => r.default),
100
100
  login: () => import("./login-MGPA2VYV.js").then((r) => r.default),
101
101
  logout: () => import("./logout-U5V5K775.js").then((r) => r.default),
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\", \"Upload updated agents\"],\n [\"agents\", \"List and manage agents\"],\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 agents: () => import(\"./commands/agents\").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-20260513012830\",\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":[]}
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\", \"Upload updated agents\"],\n [\"agents\", \"List and manage agents\"],\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 agents: () => import(\"./commands/agents\").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-20260513014949\",\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,159 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ readRemoteAgentsIndex
4
+ } from "./chunk-5SZMD7E6.js";
5
+ import {
6
+ resolveSecretsRuntimeConfigPath
7
+ } from "./chunk-FP3ZLBYT.js";
8
+ import "./chunk-INB3LG6O.js";
9
+ import {
10
+ requireAuth
11
+ } from "./chunk-S3KAVLVM.js";
12
+ import "./chunk-FO24J6XL.js";
13
+ import "./chunk-DHCCSWJN.js";
14
+
15
+ // src/commands/agents/list.ts
16
+ import { access, mkdir, readFile, writeFile } from "fs/promises";
17
+ import { dirname, join } from "path";
18
+ import { defineCommand } from "citty";
19
+ import * as p from "@clack/prompts";
20
+ import pc from "picocolors";
21
+ var LOGO = "\u{1F98B}";
22
+ var CACHE_TTL_MS = 2e4;
23
+ function pad(value, width) {
24
+ return value.length >= width ? value : `${value}${" ".repeat(width - value.length)}`;
25
+ }
26
+ function renderTable(rows) {
27
+ const headers = {
28
+ name: "Agent",
29
+ version: "Version",
30
+ updated: "Updated",
31
+ status: "Status"
32
+ };
33
+ const widths = {
34
+ name: Math.max(headers.name.length, ...rows.map((r) => r.name.length), 5),
35
+ version: Math.max(
36
+ headers.version.length,
37
+ ...rows.map((r) => (r.version ?? "\u2014").length),
38
+ 7
39
+ ),
40
+ updated: Math.max(
41
+ headers.updated.length,
42
+ ...rows.map((r) => (r.updatedAt || "\u2014").length),
43
+ 7
44
+ ),
45
+ status: headers.status.length
46
+ };
47
+ const divider = ` ${"-".repeat(widths.name)} ${"-".repeat(widths.version)} ${"-".repeat(widths.updated)} ${"-".repeat(widths.status)}`;
48
+ console.log(
49
+ ` ${pc.bold(pad(headers.name, widths.name))} ${pc.bold(pad(headers.version, widths.version))} ${pc.bold(pad(headers.updated, widths.updated))} ${pc.bold(pad(headers.status, widths.status))}`
50
+ );
51
+ console.log(pc.dim(divider));
52
+ for (const row of rows) {
53
+ const version = row.version ?? "\u2014";
54
+ const updated = row.updatedAt || "\u2014";
55
+ const statusText = "online";
56
+ const status = `${pc.green(statusText)}${" ".repeat(Math.max(0, widths.status - statusText.length))}`;
57
+ console.log(
58
+ ` ${pad(row.name, widths.name)} ${pad(version, widths.version)} ${pad(updated, widths.updated)} ${status}`
59
+ );
60
+ }
61
+ }
62
+ function getCachePath(cwd) {
63
+ return join(cwd, ".kalp", "cache", "agents-list-remote.json");
64
+ }
65
+ async function readCache(cwd) {
66
+ const cachePath = getCachePath(cwd);
67
+ try {
68
+ await access(cachePath);
69
+ } catch {
70
+ return null;
71
+ }
72
+ const raw = await readFile(cachePath, "utf-8").catch(() => null);
73
+ if (!raw) return null;
74
+ try {
75
+ const parsed = JSON.parse(raw);
76
+ if (!parsed || !Array.isArray(parsed.entries) || !parsed.cachedAt) {
77
+ return null;
78
+ }
79
+ return parsed;
80
+ } catch {
81
+ return null;
82
+ }
83
+ }
84
+ async function writeCache(cwd, entries) {
85
+ const cachePath = getCachePath(cwd);
86
+ await mkdir(dirname(cachePath), { recursive: true });
87
+ const payload = {
88
+ cachedAt: (/* @__PURE__ */ new Date()).toISOString(),
89
+ entries
90
+ };
91
+ await writeFile(cachePath, JSON.stringify(payload, null, 2), "utf-8");
92
+ }
93
+ function isFresh(cache) {
94
+ const cachedAt = Date.parse(cache.cachedAt);
95
+ if (!Number.isFinite(cachedAt)) return false;
96
+ return Date.now() - cachedAt <= CACHE_TTL_MS;
97
+ }
98
+ var list_default = defineCommand({
99
+ meta: {
100
+ name: "list",
101
+ description: "List remote agents"
102
+ },
103
+ args: {
104
+ refresh: {
105
+ type: "boolean",
106
+ description: "Force refresh remote data (skip cache)",
107
+ default: false
108
+ },
109
+ help: {
110
+ type: "boolean",
111
+ alias: "h",
112
+ default: false,
113
+ description: "Show help"
114
+ }
115
+ },
116
+ async run({ args }) {
117
+ if (args.help) {
118
+ p.log.info(`${pc.bold("Usage")}: kalp agents list [--refresh]`);
119
+ return;
120
+ }
121
+ const cwd = process.cwd();
122
+ p.intro(`${LOGO} ${pc.bold("kalp agents list")}`);
123
+ await requireAuth().catch(() => {
124
+ p.log.error("Not authenticated. Run `kalp login` first.");
125
+ process.exit(1);
126
+ });
127
+ const spinner2 = p.spinner();
128
+ spinner2.start("Loading remote agents");
129
+ try {
130
+ const cache = args.refresh ? null : await readCache(cwd);
131
+ let entries;
132
+ if (cache && isFresh(cache)) {
133
+ entries = cache.entries;
134
+ spinner2.stop(
135
+ `Loaded ${entries.length} agents ${pc.dim("(cached, remote)")}`
136
+ );
137
+ } else {
138
+ const configPath = await resolveSecretsRuntimeConfigPath(cwd);
139
+ entries = await readRemoteAgentsIndex(cwd, configPath);
140
+ await writeCache(cwd, entries).catch(() => null);
141
+ spinner2.stop(`Loaded ${entries.length} agents from remote runtime`);
142
+ }
143
+ const rows = [...entries].sort((a, b) => a.name.localeCompare(b.name));
144
+ if (rows.length === 0) {
145
+ p.log.info(pc.dim("No remote agents found."));
146
+ return;
147
+ }
148
+ renderTable(rows);
149
+ } catch (error) {
150
+ spinner2.stop("Failed to load remote agents");
151
+ p.log.error(error instanceof Error ? error.message : String(error));
152
+ process.exit(1);
153
+ }
154
+ }
155
+ });
156
+ export {
157
+ list_default as default
158
+ };
159
+ //# sourceMappingURL=list-5RQZ3JVG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/agents/list.ts"],"sourcesContent":["import { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport {\n type RemoteAgentIndexEntry,\n readRemoteAgentsIndex,\n} from \"@/utils/agents-remote\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\nconst CACHE_TTL_MS = 20_000;\n\ninterface RemoteAgentListCache {\n cachedAt: string;\n entries: RemoteAgentIndexEntry[];\n}\n\nfunction pad(value: string, width: number): string {\n return value.length >= width\n ? value\n : `${value}${\" \".repeat(width - value.length)}`;\n}\n\nfunction renderTable(rows: RemoteAgentIndexEntry[]): void {\n const headers = {\n name: \"Agent\",\n version: \"Version\",\n updated: \"Updated\",\n status: \"Status\",\n };\n\n const widths = {\n name: Math.max(headers.name.length, ...rows.map((r) => r.name.length), 5),\n version: Math.max(\n headers.version.length,\n ...rows.map((r) => (r.version ?? \"—\").length),\n 7,\n ),\n updated: Math.max(\n headers.updated.length,\n ...rows.map((r) => (r.updatedAt || \"—\").length),\n 7,\n ),\n status: headers.status.length,\n };\n\n const divider = ` ${\"-\".repeat(widths.name)} ${\"-\".repeat(widths.version)} ${\"-\".repeat(widths.updated)} ${\"-\".repeat(widths.status)}`;\n console.log(\n ` ${pc.bold(pad(headers.name, widths.name))} ${pc.bold(pad(headers.version, widths.version))} ${pc.bold(pad(headers.updated, widths.updated))} ${pc.bold(pad(headers.status, widths.status))}`,\n );\n console.log(pc.dim(divider));\n\n for (const row of rows) {\n const version = row.version ?? \"—\";\n const updated = row.updatedAt || \"—\";\n const statusText = \"online\";\n const status = `${pc.green(statusText)}${\" \".repeat(Math.max(0, widths.status - statusText.length))}`;\n console.log(\n ` ${pad(row.name, widths.name)} ${pad(version, widths.version)} ${pad(updated, widths.updated)} ${status}`,\n );\n }\n}\n\nfunction getCachePath(cwd: string): string {\n return join(cwd, \".kalp\", \"cache\", \"agents-list-remote.json\");\n}\n\nasync function readCache(cwd: string): Promise<RemoteAgentListCache | null> {\n const cachePath = getCachePath(cwd);\n try {\n await access(cachePath);\n } catch {\n return null;\n }\n\n const raw = await readFile(cachePath, \"utf-8\").catch(() => null);\n if (!raw) return null;\n\n try {\n const parsed = JSON.parse(raw) as RemoteAgentListCache;\n if (!parsed || !Array.isArray(parsed.entries) || !parsed.cachedAt) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nasync function writeCache(\n cwd: string,\n entries: RemoteAgentIndexEntry[],\n): Promise<void> {\n const cachePath = getCachePath(cwd);\n await mkdir(dirname(cachePath), { recursive: true });\n const payload: RemoteAgentListCache = {\n cachedAt: new Date().toISOString(),\n entries,\n };\n await writeFile(cachePath, JSON.stringify(payload, null, 2), \"utf-8\");\n}\n\nfunction isFresh(cache: RemoteAgentListCache): boolean {\n const cachedAt = Date.parse(cache.cachedAt);\n if (!Number.isFinite(cachedAt)) return false;\n return Date.now() - cachedAt <= CACHE_TTL_MS;\n}\n\nexport default defineCommand({\n meta: {\n name: \"list\",\n description: \"List remote agents\",\n },\n args: {\n refresh: {\n type: \"boolean\",\n description: \"Force refresh remote data (skip cache)\",\n default: false,\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n default: false,\n description: \"Show help\",\n },\n },\n async run({ args }) {\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp agents list [--refresh]`);\n return;\n }\n\n const cwd = process.cwd();\n p.intro(`${LOGO} ${pc.bold(\"kalp agents 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 agents\");\n\n try {\n const cache = args.refresh ? null : await readCache(cwd);\n let entries: RemoteAgentIndexEntry[];\n\n if (cache && isFresh(cache)) {\n entries = cache.entries;\n spinner.stop(\n `Loaded ${entries.length} agents ${pc.dim(\"(cached, remote)\")}`,\n );\n } else {\n const configPath = await resolveSecretsRuntimeConfigPath(cwd);\n entries = await readRemoteAgentsIndex(cwd, configPath);\n await writeCache(cwd, entries).catch(() => null);\n spinner.stop(`Loaded ${entries.length} agents from remote runtime`);\n }\n\n const rows = [...entries].sort((a, b) => a.name.localeCompare(b.name));\n if (rows.length === 0) {\n p.log.info(pc.dim(\"No remote agents found.\"));\n return;\n }\n\n renderTable(rows);\n } catch (error) {\n spinner.stop(\"Failed to load remote agents\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["spinner"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kalphq/cli",
3
- "version": "0.0.0-dev-20260513012830",
3
+ "version": "0.0.0-dev-20260513014949",
4
4
  "description": "Zero-config CLI for deploying Kalp agents",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -27,9 +27,9 @@
27
27
  "open": "^11.0.0",
28
28
  "picocolors": "1.1.1",
29
29
  "zod": "3.25.76",
30
- "@kalphq/sdk": "0.0.0-dev-20260513012830",
31
- "@kalphq/project": "0.0.0-dev-20260513012830",
32
- "@kalphq/compiler": "0.0.0-dev-20260513012830"
30
+ "@kalphq/compiler": "0.0.0-dev-20260513014949",
31
+ "@kalphq/project": "0.0.0-dev-20260513014949",
32
+ "@kalphq/sdk": "0.0.0-dev-20260513014949"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/json-stable-stringify": "1.2.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/agents/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: \"agents\",\n description: \"Inspect and manage project agents\",\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 delete: () => import(\"./delete\").then((r) => r.default),\n },\n run({ args }) {\n p.intro(`${LOGO} ${pc.bold(\"kalp agents\")}`);\n p.log.message(pc.bold(\"Available subcommands:\"));\n p.log.message(` ${pc.cyan(\"list\")} Compare local and remote agent status`);\n p.log.message(` ${pc.cyan(\"delete\")} Delete an agent from remote runtime`);\n p.log.message(\"\");\n p.log.message(\n `Run ${pc.cyan(\"kalp agents <subcommand> --help\")} for more info.`,\n );\n p.outro(args.help ? pc.dim(\"Done\") : pc.dim(\"Select a subcommand above.\"));\n },\n});\n"],"mappings":";;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAEf,IAAM,OAAO;AAEb,IAAO,iBAAQ,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,QAAQ,MAAM,OAAO,sBAAU,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,EACxD;AAAA,EACA,IAAI,EAAE,KAAK,GAAG;AACZ,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,aAAa,CAAC,EAAE;AAC3C,IAAE,MAAI,QAAQ,GAAG,KAAK,wBAAwB,CAAC;AAC/C,IAAE,MAAI,QAAQ,KAAK,GAAG,KAAK,MAAM,CAAC,2CAA2C;AAC7E,IAAE,MAAI,QAAQ,KAAK,GAAG,KAAK,QAAQ,CAAC,uCAAuC;AAC3E,IAAE,MAAI,QAAQ,EAAE;AAChB,IAAE,MAAI;AAAA,MACJ,OAAO,GAAG,KAAK,iCAAiC,CAAC;AAAA,IACnD;AACA,IAAE,QAAM,KAAK,OAAO,GAAG,IAAI,MAAM,IAAI,GAAG,IAAI,4BAA4B,CAAC;AAAA,EAC3E;AACF,CAAC;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/agents/delete.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport {\n readRemoteAgentPointers,\n readRemoteAgentsIndex,\n writeRemoteAgentsIndex,\n} from \"@/utils/agents-remote\";\nimport { readProjectState, writeProjectState } from \"@/utils/project-state\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete an agent from remote runtime\",\n },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name to delete from remote runtime\",\n required: false,\n },\n yes: {\n type: \"boolean\",\n alias: \"y\",\n description: \"Skip confirmation\",\n default: false,\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp agents delete -a <agent>`);\n return;\n }\n\n const cwd = process.cwd();\n p.intro(`${LOGO} ${pc.bold(\"kalp agents delete\")}`);\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 agents\");\n\n try {\n const configPath = await resolveSecretsRuntimeConfigPath(cwd);\n const provider = resolveProvider();\n const [indexEntries, pointers] = await Promise.all([\n readRemoteAgentsIndex(cwd, configPath),\n readRemoteAgentPointers(cwd, configPath),\n ]);\n\n const indexByName = new Map(\n indexEntries.map((entry) => [entry.name, entry]),\n );\n const pointerByName = new Map(\n pointers.map((entry) => [entry.name, entry.hash]),\n );\n const remoteNames = [...new Set([...indexByName.keys(), ...pointerByName.keys()])].sort(\n (a, b) => a.localeCompare(b),\n );\n\n spinner.stop(`Found ${remoteNames.length} remote agents`);\n if (remoteNames.length === 0) {\n p.log.info(pc.dim(\"No remote agents available to delete.\"));\n p.outro(\"Done\");\n return;\n }\n\n let agentName = args.agent?.trim();\n if (!agentName) {\n const selected = await p.select({\n message: \"Select remote agent to delete\",\n options: remoteNames.map((name) => ({ value: name, label: name })),\n });\n if (p.isCancel(selected)) {\n p.outro(\"Cancelled\");\n return;\n }\n agentName = String(selected);\n }\n\n if (!remoteNames.includes(agentName)) {\n p.log.error(`Agent ${pc.cyan(agentName)} is not deployed remotely.`);\n process.exit(1);\n }\n\n if (!args.yes) {\n const confirm = await p.confirm({\n message: `Delete ${pc.cyan(agentName)} from remote runtime?`,\n initialValue: false,\n });\n if (p.isCancel(confirm) || !confirm) {\n p.outro(\"Cancelled\");\n return;\n }\n }\n\n const hashes = new Set<string>();\n const pointerHash = pointerByName.get(agentName);\n if (pointerHash) hashes.add(pointerHash);\n const indexedHash = indexByName.get(agentName)?.hash;\n if (indexedHash) hashes.add(indexedHash);\n\n spinner.start(`Deleting ${pc.cyan(agentName)} from remote runtime`);\n const latestKey = `${agentName}:latest`;\n await provider\n .deleteValue({ cwd, configPath, key: latestKey })\n .catch(() => null);\n for (const hash of hashes) {\n await provider\n .deleteValue({ cwd, configPath, key: `${agentName}:${hash}` })\n .catch(() => null);\n }\n\n const filteredIndex = indexEntries.filter(\n (entry) => entry.name !== agentName,\n );\n await writeRemoteAgentsIndex(cwd, configPath, filteredIndex);\n\n const state = await readProjectState(cwd);\n if (state?.agents?.[agentName]) {\n state.agents[agentName].lastRemoteHash = null;\n state.agents[agentName].workerUrl = null;\n await writeProjectState(cwd, state);\n }\n\n spinner.stop(`Deleted remote agent ${pc.cyan(agentName)}`);\n p.log.info(\n pc.dim(\n `Local files were not changed. Delete ./agents/${agentName} manually if you no longer need it.`,\n ),\n );\n p.outro(\"Done\");\n } catch (error) {\n spinner.stop(\"Failed to delete remote agent\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["spinner","confirm"]}
@@ -1,142 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- readRemoteAgentPointers,
4
- readRemoteAgentsIndex
5
- } from "./chunk-5SZMD7E6.js";
6
- import {
7
- resolveSecretsRuntimeConfigPath
8
- } from "./chunk-FP3ZLBYT.js";
9
- import "./chunk-INB3LG6O.js";
10
- import {
11
- requireAuth
12
- } from "./chunk-S3KAVLVM.js";
13
- import "./chunk-FO24J6XL.js";
14
- import {
15
- readLocalAgentNames,
16
- readProjectState
17
- } from "./chunk-DHCCSWJN.js";
18
-
19
- // src/commands/agents/list.ts
20
- import { defineCommand } from "citty";
21
- import * as p from "@clack/prompts";
22
- import pc from "picocolors";
23
- var LOGO = "\u{1F98B}";
24
- function pad(value, width) {
25
- return value.length >= width ? value : `${value}${" ".repeat(width - value.length)}`;
26
- }
27
- function renderTable(rows) {
28
- const headers = {
29
- name: "Agent",
30
- local: "Local",
31
- remote: "Remote",
32
- version: "Remote Version",
33
- updated: "Updated"
34
- };
35
- const widths = {
36
- name: Math.max(headers.name.length, ...rows.map((r) => r.name.length), 5),
37
- local: headers.local.length,
38
- remote: headers.remote.length,
39
- version: Math.max(
40
- headers.version.length,
41
- ...rows.map((r) => r.remoteVersion.length),
42
- 14
43
- ),
44
- updated: Math.max(headers.updated.length, ...rows.map((r) => r.updatedAt.length), 7)
45
- };
46
- const divider = ` ${"-".repeat(widths.name)} ${"-".repeat(widths.local)} ${"-".repeat(widths.remote)} ${"-".repeat(widths.version)} ${"-".repeat(widths.updated)}`;
47
- console.log(
48
- ` ${pc.bold(pad(headers.name, widths.name))} ${pc.bold(pad(headers.local, widths.local))} ${pc.bold(pad(headers.remote, widths.remote))} ${pc.bold(pad(headers.version, widths.version))} ${pc.bold(pad(headers.updated, widths.updated))}`
49
- );
50
- console.log(pc.dim(divider));
51
- for (const row of rows) {
52
- const localText = row.localStatus === "yes" ? "yes" : "no";
53
- const remoteText = row.remoteStatus === "online" ? "online" : "offline";
54
- const local = row.localStatus === "yes" ? pc.green(localText) : pc.dim(localText);
55
- const remote = row.remoteStatus === "online" ? pc.green(remoteText) : pc.dim(remoteText);
56
- const localCell = `${local}${" ".repeat(Math.max(0, widths.local - localText.length))}`;
57
- const remoteCell = `${remote}${" ".repeat(Math.max(0, widths.remote - remoteText.length))}`;
58
- console.log(
59
- ` ${pad(row.name, widths.name)} ${localCell} ${remoteCell} ${pad(row.remoteVersion, widths.version)} ${pad(row.updatedAt, widths.updated)}`
60
- );
61
- }
62
- }
63
- var list_default = defineCommand({
64
- meta: {
65
- name: "list",
66
- description: "List local agents and compare with remote runtime"
67
- },
68
- args: {
69
- help: {
70
- type: "boolean",
71
- alias: "h",
72
- default: false,
73
- description: "Show help"
74
- }
75
- },
76
- async run({ args }) {
77
- if (args.help) {
78
- p.log.info(`${pc.bold("Usage")}: kalp agents list`);
79
- return;
80
- }
81
- const cwd = process.cwd();
82
- p.intro(`${LOGO} ${pc.bold("kalp agents list")}`);
83
- await requireAuth().catch(() => {
84
- p.log.error("Not authenticated. Run `kalp login` first.");
85
- process.exit(1);
86
- });
87
- const spinner2 = p.spinner();
88
- spinner2.start("Loading local and remote agent status");
89
- try {
90
- const configPath = await resolveSecretsRuntimeConfigPath(cwd);
91
- const [localNames, state, indexEntries, remotePointers] = await Promise.all([
92
- readLocalAgentNames(cwd),
93
- readProjectState(cwd),
94
- readRemoteAgentsIndex(cwd, configPath),
95
- readRemoteAgentPointers(cwd, configPath)
96
- ]);
97
- const localSet = new Set(localNames);
98
- const remoteIndexByName = new Map(
99
- indexEntries.map((entry) => [entry.name, entry])
100
- );
101
- const remotePointerByName = new Map(
102
- remotePointers.map((entry) => [entry.name, entry.hash])
103
- );
104
- const names = [
105
- .../* @__PURE__ */ new Set([
106
- ...localNames,
107
- ...remotePointerByName.keys(),
108
- ...remoteIndexByName.keys()
109
- ])
110
- ].sort((a, b) => a.localeCompare(b));
111
- const rows = names.map((name) => {
112
- const index = remoteIndexByName.get(name);
113
- const remoteExists = remotePointerByName.has(name) || !!index;
114
- const stateAgent = state?.agents?.[name];
115
- const remoteVersion = index?.version ?? (typeof index?.versionNumber === "number" && index.versionNumber > 0 ? `v${index.versionNumber}` : stateAgent?.lastRemoteHash ? `v${stateAgent.currentVersion}` : "\u2014");
116
- return {
117
- name,
118
- localStatus: localSet.has(name) ? "yes" : "no",
119
- remoteStatus: remoteExists ? "online" : "offline",
120
- remoteVersion,
121
- updatedAt: index?.updatedAt ?? stateAgent?.lastPushedAt ?? "\u2014"
122
- };
123
- });
124
- spinner2.stop(`Found ${rows.length} agents`);
125
- if (rows.length === 0) {
126
- p.log.info(pc.dim("No agents found locally or remotely."));
127
- p.outro("Done");
128
- return;
129
- }
130
- renderTable(rows);
131
- p.outro("Done");
132
- } catch (error) {
133
- spinner2.stop("Failed to load agent status");
134
- p.log.error(error instanceof Error ? error.message : String(error));
135
- process.exit(1);
136
- }
137
- }
138
- });
139
- export {
140
- list_default as default
141
- };
142
- //# sourceMappingURL=list-4HHUQLZ2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/agents/list.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport {\n readRemoteAgentPointers,\n readRemoteAgentsIndex,\n} from \"@/utils/agents-remote\";\nimport { readProjectState } from \"@/utils/project-state\";\nimport { readLocalAgentNames } from \"@/utils/runtime\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\ninterface AgentViewRow {\n name: string;\n localStatus: \"yes\" | \"no\";\n remoteStatus: \"online\" | \"offline\";\n remoteVersion: string;\n updatedAt: string;\n}\n\nfunction pad(value: string, width: number): string {\n return value.length >= width\n ? value\n : `${value}${\" \".repeat(width - value.length)}`;\n}\n\nfunction renderTable(rows: AgentViewRow[]): void {\n const headers = {\n name: \"Agent\",\n local: \"Local\",\n remote: \"Remote\",\n version: \"Remote Version\",\n updated: \"Updated\",\n };\n\n const widths = {\n name: Math.max(headers.name.length, ...rows.map((r) => r.name.length), 5),\n local: headers.local.length,\n remote: headers.remote.length,\n version: Math.max(\n headers.version.length,\n ...rows.map((r) => r.remoteVersion.length),\n 14,\n ),\n updated: Math.max(headers.updated.length, ...rows.map((r) => r.updatedAt.length), 7),\n };\n\n const divider = ` ${\"-\".repeat(widths.name)} ${\"-\".repeat(widths.local)} ${\"-\".repeat(widths.remote)} ${\"-\".repeat(widths.version)} ${\"-\".repeat(widths.updated)}`;\n console.log(\n ` ${pc.bold(pad(headers.name, widths.name))} ${pc.bold(pad(headers.local, widths.local))} ${pc.bold(pad(headers.remote, widths.remote))} ${pc.bold(pad(headers.version, widths.version))} ${pc.bold(pad(headers.updated, widths.updated))}`,\n );\n console.log(pc.dim(divider));\n for (const row of rows) {\n const localText = row.localStatus === \"yes\" ? \"yes\" : \"no\";\n const remoteText = row.remoteStatus === \"online\" ? \"online\" : \"offline\";\n const local =\n row.localStatus === \"yes\" ? pc.green(localText) : pc.dim(localText);\n const remote =\n row.remoteStatus === \"online\" ? pc.green(remoteText) : pc.dim(remoteText);\n const localCell = `${local}${\" \".repeat(Math.max(0, widths.local - localText.length))}`;\n const remoteCell = `${remote}${\" \".repeat(Math.max(0, widths.remote - remoteText.length))}`;\n console.log(\n ` ${pad(row.name, widths.name)} ${localCell} ${remoteCell} ${pad(row.remoteVersion, widths.version)} ${pad(row.updatedAt, widths.updated)}`,\n );\n }\n}\n\nexport default defineCommand({\n meta: {\n name: \"list\",\n description: \"List local agents and compare with remote runtime\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n default: false,\n description: \"Show help\",\n },\n },\n async run({ args }) {\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp agents list`);\n return;\n }\n\n const cwd = process.cwd();\n p.intro(`${LOGO} ${pc.bold(\"kalp agents 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 local and remote agent status\");\n\n try {\n const configPath = await resolveSecretsRuntimeConfigPath(cwd);\n const [localNames, state, indexEntries, remotePointers] =\n await Promise.all([\n readLocalAgentNames(cwd),\n readProjectState(cwd),\n readRemoteAgentsIndex(cwd, configPath),\n readRemoteAgentPointers(cwd, configPath),\n ]);\n\n const localSet = new Set(localNames);\n const remoteIndexByName = new Map(\n indexEntries.map((entry) => [entry.name, entry]),\n );\n const remotePointerByName = new Map(\n remotePointers.map((entry) => [entry.name, entry.hash]),\n );\n const names = [\n ...new Set([\n ...localNames,\n ...remotePointerByName.keys(),\n ...remoteIndexByName.keys(),\n ]),\n ].sort((a, b) => a.localeCompare(b));\n\n const rows: AgentViewRow[] = names.map((name) => {\n const index = remoteIndexByName.get(name);\n const remoteExists = remotePointerByName.has(name) || !!index;\n const stateAgent = state?.agents?.[name];\n const remoteVersion =\n index?.version ??\n (typeof index?.versionNumber === \"number\" && index.versionNumber > 0\n ? `v${index.versionNumber}`\n : stateAgent?.lastRemoteHash\n ? `v${stateAgent.currentVersion}`\n : \"—\");\n return {\n name,\n localStatus: localSet.has(name) ? \"yes\" : \"no\",\n remoteStatus: remoteExists ? \"online\" : \"offline\",\n remoteVersion,\n updatedAt: index?.updatedAt ?? stateAgent?.lastPushedAt ?? \"—\",\n };\n });\n\n spinner.stop(`Found ${rows.length} agents`);\n if (rows.length === 0) {\n p.log.info(pc.dim(\"No agents found locally or remotely.\"));\n p.outro(\"Done\");\n return;\n }\n\n renderTable(rows);\n p.outro(\"Done\");\n } catch (error) {\n spinner.stop(\"Failed to load agent status\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["spinner"]}