@openacp/cli 0.4.11 → 0.5.0

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.
Files changed (66) hide show
  1. package/README.md +40 -2
  2. package/dist/agent-catalog-4IAJ7HEG.js +10 -0
  3. package/dist/agent-registry-B5YAMA4T.js +8 -0
  4. package/dist/agent-store-ZBXGOFPH.js +8 -0
  5. package/dist/chunk-5HGXUCMX.js +83 -0
  6. package/dist/chunk-5HGXUCMX.js.map +1 -0
  7. package/dist/{chunk-W7QQA6CW.js → chunk-D73LCTPF.js} +73 -35
  8. package/dist/chunk-D73LCTPF.js.map +1 -0
  9. package/dist/{chunk-66RVSUAR.js → chunk-FWN3UIRT.js} +465 -86
  10. package/dist/chunk-FWN3UIRT.js.map +1 -0
  11. package/dist/{chunk-3DIPXFZJ.js → chunk-IRGYTNLP.js} +2 -2
  12. package/dist/{chunk-WYZFGHHI.js → chunk-JRF4G4X7.js} +60 -24
  13. package/dist/chunk-JRF4G4X7.js.map +1 -0
  14. package/dist/{chunk-FKOARMAE.js → chunk-LAFKARV3.js} +3 -3
  15. package/dist/chunk-NAMYZIS5.js +1 -0
  16. package/dist/{chunk-ZW444AQY.js → chunk-NDR5JCS7.js} +2 -2
  17. package/dist/chunk-S3DRLJPM.js +422 -0
  18. package/dist/chunk-S3DRLJPM.js.map +1 -0
  19. package/dist/chunk-UG6X672R.js +90 -0
  20. package/dist/chunk-UG6X672R.js.map +1 -0
  21. package/dist/{chunk-YRJEZD7R.js → chunk-VBEWSWVL.js} +2 -2
  22. package/dist/chunk-XJJ7LPXP.js +85 -0
  23. package/dist/chunk-XJJ7LPXP.js.map +1 -0
  24. package/dist/{chunk-C33LTDZV.js → chunk-Z46LGZ7R.js} +21 -8
  25. package/dist/chunk-Z46LGZ7R.js.map +1 -0
  26. package/dist/cli.js +190 -18
  27. package/dist/cli.js.map +1 -1
  28. package/dist/{config-XURP6B3S.js → config-PCPIBPUA.js} +2 -2
  29. package/dist/config-editor-5L7AJ5AF.js +12 -0
  30. package/dist/{config-registry-OGX4YM2U.js → config-registry-SNKA2EH2.js} +2 -2
  31. package/dist/{daemon-GWJM2S4A.js → daemon-JZLFRUW6.js} +3 -3
  32. package/dist/data/registry-snapshot.json +876 -0
  33. package/dist/doctor-N2HKKUUQ.js +9 -0
  34. package/dist/doctor-N2HKKUUQ.js.map +1 -0
  35. package/dist/index.d.ts +137 -17
  36. package/dist/index.js +19 -10
  37. package/dist/{main-2QKD2EI2.js → main-37GLOJ7G.js} +18 -15
  38. package/dist/{main-2QKD2EI2.js.map → main-37GLOJ7G.js.map} +1 -1
  39. package/dist/{menu-CARRTW2F.js → menu-6RCPBVGQ.js} +2 -4
  40. package/dist/menu-6RCPBVGQ.js.map +1 -0
  41. package/dist/{setup-TTOL7XAN.js → setup-QAS3QW3M.js} +4 -3
  42. package/dist/setup-QAS3QW3M.js.map +1 -0
  43. package/package.json +10 -2
  44. package/dist/agent-registry-7HC6D4CH.js +0 -7
  45. package/dist/chunk-66RVSUAR.js.map +0 -1
  46. package/dist/chunk-BGKQHQB4.js +0 -276
  47. package/dist/chunk-BGKQHQB4.js.map +0 -1
  48. package/dist/chunk-C33LTDZV.js.map +0 -1
  49. package/dist/chunk-VA2M52CM.js +0 -15
  50. package/dist/chunk-VA2M52CM.js.map +0 -1
  51. package/dist/chunk-W7QQA6CW.js.map +0 -1
  52. package/dist/chunk-WYZFGHHI.js.map +0 -1
  53. package/dist/config-editor-AALY3URF.js +0 -11
  54. package/dist/doctor-X477CVZN.js +0 -9
  55. /package/dist/{agent-registry-7HC6D4CH.js.map → agent-catalog-4IAJ7HEG.js.map} +0 -0
  56. /package/dist/{config-XURP6B3S.js.map → agent-registry-B5YAMA4T.js.map} +0 -0
  57. /package/dist/{config-editor-AALY3URF.js.map → agent-store-ZBXGOFPH.js.map} +0 -0
  58. /package/dist/{chunk-3DIPXFZJ.js.map → chunk-IRGYTNLP.js.map} +0 -0
  59. /package/dist/{chunk-FKOARMAE.js.map → chunk-LAFKARV3.js.map} +0 -0
  60. /package/dist/{config-registry-OGX4YM2U.js.map → chunk-NAMYZIS5.js.map} +0 -0
  61. /package/dist/{chunk-ZW444AQY.js.map → chunk-NDR5JCS7.js.map} +0 -0
  62. /package/dist/{chunk-YRJEZD7R.js.map → chunk-VBEWSWVL.js.map} +0 -0
  63. /package/dist/{daemon-GWJM2S4A.js.map → config-PCPIBPUA.js.map} +0 -0
  64. /package/dist/{doctor-X477CVZN.js.map → config-editor-5L7AJ5AF.js.map} +0 -0
  65. /package/dist/{menu-CARRTW2F.js.map → config-registry-SNKA2EH2.js.map} +0 -0
  66. /package/dist/{setup-TTOL7XAN.js.map → daemon-JZLFRUW6.js.map} +0 -0
@@ -0,0 +1,85 @@
1
+ // src/core/agent-dependencies.ts
2
+ import { execFileSync } from "child_process";
3
+ import * as fs from "fs";
4
+ import * as path from "path";
5
+ var AGENT_DEPENDENCIES = {
6
+ "claude-acp": [
7
+ {
8
+ command: "claude",
9
+ label: "Claude CLI",
10
+ installHint: "npm install -g @anthropic-ai/claude-code"
11
+ }
12
+ ],
13
+ "codex-acp": [
14
+ {
15
+ command: "codex",
16
+ label: "Codex CLI",
17
+ installHint: "npm install -g @openai/codex"
18
+ }
19
+ ]
20
+ };
21
+ var AGENT_CAPABILITIES = {
22
+ claude: {
23
+ supportsResume: true,
24
+ resumeCommand: (sid) => `claude --resume ${sid}`
25
+ }
26
+ };
27
+ var REGISTRY_AGENT_ALIASES = {
28
+ "claude-acp": "claude",
29
+ "codex-acp": "codex",
30
+ "gemini": "gemini",
31
+ "cursor": "cursor",
32
+ "github-copilot-cli": "copilot",
33
+ "cline": "cline",
34
+ "goose": "goose",
35
+ "kilo": "kilo",
36
+ "qwen-code": "qwen"
37
+ };
38
+ function getAgentAlias(registryId) {
39
+ return REGISTRY_AGENT_ALIASES[registryId] ?? registryId;
40
+ }
41
+ function getAgentDependencies(registryId) {
42
+ return AGENT_DEPENDENCIES[registryId] ?? [];
43
+ }
44
+ function getAgentCapabilities(agentName) {
45
+ return AGENT_CAPABILITIES[agentName] ?? { supportsResume: false };
46
+ }
47
+ function commandExists(cmd) {
48
+ try {
49
+ execFileSync("which", [cmd], { stdio: "pipe" });
50
+ return true;
51
+ } catch {
52
+ }
53
+ let dir = process.cwd();
54
+ while (true) {
55
+ const binPath = path.join(dir, "node_modules", ".bin", cmd);
56
+ if (fs.existsSync(binPath)) return true;
57
+ const parent = path.dirname(dir);
58
+ if (parent === dir) break;
59
+ dir = parent;
60
+ }
61
+ return false;
62
+ }
63
+ function checkDependencies(registryId) {
64
+ const deps = getAgentDependencies(registryId);
65
+ if (deps.length === 0) return { available: true };
66
+ const missing = deps.filter((d) => !commandExists(d.command));
67
+ if (missing.length === 0) return { available: true };
68
+ return {
69
+ available: false,
70
+ reason: `Requires: ${missing.map((m) => m.label).join(", ")}`,
71
+ missing: missing.map((m) => ({ label: m.label, installHint: m.installHint }))
72
+ };
73
+ }
74
+ function checkRuntimeAvailable(runtime) {
75
+ return commandExists(runtime);
76
+ }
77
+
78
+ export {
79
+ getAgentAlias,
80
+ getAgentCapabilities,
81
+ commandExists,
82
+ checkDependencies,
83
+ checkRuntimeAvailable
84
+ };
85
+ //# sourceMappingURL=chunk-XJJ7LPXP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/agent-dependencies.ts"],"sourcesContent":["import { execFileSync } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { AvailabilityResult } from \"./types.js\";\n\nexport interface AgentDependency {\n command: string;\n label: string;\n installHint: string;\n}\n\nexport interface AgentCapability {\n supportsResume: boolean;\n resumeCommand?: (sessionId: string) => string;\n}\n\nconst AGENT_DEPENDENCIES: Record<string, AgentDependency[]> = {\n \"claude-acp\": [\n {\n command: \"claude\",\n label: \"Claude CLI\",\n installHint: \"npm install -g @anthropic-ai/claude-code\",\n },\n ],\n \"codex-acp\": [\n {\n command: \"codex\",\n label: \"Codex CLI\",\n installHint: \"npm install -g @openai/codex\",\n },\n ],\n};\n\nconst AGENT_CAPABILITIES: Record<string, AgentCapability> = {\n claude: {\n supportsResume: true,\n resumeCommand: (sid) => `claude --resume ${sid}`,\n },\n};\n\nexport const REGISTRY_AGENT_ALIASES: Record<string, string> = {\n \"claude-acp\": \"claude\",\n \"codex-acp\": \"codex\",\n \"gemini\": \"gemini\",\n \"cursor\": \"cursor\",\n \"github-copilot-cli\": \"copilot\",\n \"cline\": \"cline\",\n \"goose\": \"goose\",\n \"kilo\": \"kilo\",\n \"qwen-code\": \"qwen\",\n};\n\nexport function getAgentAlias(registryId: string): string {\n return REGISTRY_AGENT_ALIASES[registryId] ?? registryId;\n}\n\nexport function getAgentDependencies(registryId: string): AgentDependency[] {\n return AGENT_DEPENDENCIES[registryId] ?? [];\n}\n\nexport function getAgentCapabilities(agentName: string): AgentCapability {\n return AGENT_CAPABILITIES[agentName] ?? { supportsResume: false };\n}\n\nexport function commandExists(cmd: string): boolean {\n try {\n execFileSync(\"which\", [cmd], { stdio: \"pipe\" });\n return true;\n } catch {\n // not in PATH\n }\n // Check node_modules/.bin (walks up from cwd)\n let dir = process.cwd();\n while (true) {\n const binPath = path.join(dir, \"node_modules\", \".bin\", cmd);\n if (fs.existsSync(binPath)) return true;\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return false;\n}\n\nexport function checkDependencies(registryId: string): AvailabilityResult {\n const deps = getAgentDependencies(registryId);\n if (deps.length === 0) return { available: true };\n\n const missing = deps.filter((d) => !commandExists(d.command));\n if (missing.length === 0) return { available: true };\n\n return {\n available: false,\n reason: `Requires: ${missing.map((m) => m.label).join(\", \")}`,\n missing: missing.map((m) => ({ label: m.label, installHint: m.installHint })),\n };\n}\n\nexport function checkRuntimeAvailable(runtime: \"npx\" | \"uvx\"): boolean {\n return commandExists(runtime);\n}\n"],"mappings":";AAAA,SAAS,oBAAoB;AAC7B,YAAY,QAAQ;AACpB,YAAY,UAAU;AActB,IAAM,qBAAwD;AAAA,EAC5D,cAAc;AAAA,IACZ;AAAA,MACE,SAAS;AAAA,MACT,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX;AAAA,MACE,SAAS;AAAA,MACT,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,EACF;AACF;AAEA,IAAM,qBAAsD;AAAA,EAC1D,QAAQ;AAAA,IACN,gBAAgB;AAAA,IAChB,eAAe,CAAC,QAAQ,mBAAmB,GAAG;AAAA,EAChD;AACF;AAEO,IAAM,yBAAiD;AAAA,EAC5D,cAAc;AAAA,EACd,aAAa;AAAA,EACb,UAAU;AAAA,EACV,UAAU;AAAA,EACV,sBAAsB;AAAA,EACtB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,aAAa;AACf;AAEO,SAAS,cAAc,YAA4B;AACxD,SAAO,uBAAuB,UAAU,KAAK;AAC/C;AAEO,SAAS,qBAAqB,YAAuC;AAC1E,SAAO,mBAAmB,UAAU,KAAK,CAAC;AAC5C;AAEO,SAAS,qBAAqB,WAAoC;AACvE,SAAO,mBAAmB,SAAS,KAAK,EAAE,gBAAgB,MAAM;AAClE;AAEO,SAAS,cAAc,KAAsB;AAClD,MAAI;AACF,iBAAa,SAAS,CAAC,GAAG,GAAG,EAAE,OAAO,OAAO,CAAC;AAC9C,WAAO;AAAA,EACT,QAAQ;AAAA,EAER;AAEA,MAAI,MAAM,QAAQ,IAAI;AACtB,SAAO,MAAM;AACX,UAAM,UAAe,UAAK,KAAK,gBAAgB,QAAQ,GAAG;AAC1D,QAAO,cAAW,OAAO,EAAG,QAAO;AACnC,UAAM,SAAc,aAAQ,GAAG;AAC/B,QAAI,WAAW,IAAK;AACpB,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,YAAwC;AACxE,QAAM,OAAO,qBAAqB,UAAU;AAC5C,MAAI,KAAK,WAAW,EAAG,QAAO,EAAE,WAAW,KAAK;AAEhD,QAAM,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC;AAC5D,MAAI,QAAQ,WAAW,EAAG,QAAO,EAAE,WAAW,KAAK;AAEnD,SAAO;AAAA,IACL,WAAW;AAAA,IACX,QAAQ,aAAa,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;AAAA,IAC3D,SAAS,QAAQ,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,aAAa,EAAE,YAAY,EAAE;AAAA,EAC9E;AACF;AAEO,SAAS,sBAAsB,SAAiC;AACrE,SAAO,cAAc,OAAO;AAC9B;","names":[]}
@@ -1,11 +1,24 @@
1
1
  // src/core/config-registry.ts
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ import * as os from "os";
2
5
  var CONFIG_REGISTRY = [
3
6
  {
4
7
  path: "defaultAgent",
5
8
  displayName: "Default Agent",
6
9
  group: "agent",
7
10
  type: "select",
8
- options: (config) => Object.keys(config.agents),
11
+ options: (config) => {
12
+ try {
13
+ const agentsPath = path.join(os.homedir(), ".openacp", "agents.json");
14
+ if (fs.existsSync(agentsPath)) {
15
+ const data = JSON.parse(fs.readFileSync(agentsPath, "utf-8"));
16
+ return Object.keys(data.installed ?? {});
17
+ }
18
+ } catch {
19
+ }
20
+ return Object.keys(config.agents ?? {});
21
+ },
9
22
  scope: "safe",
10
23
  hotReload: true
11
24
  },
@@ -59,22 +72,22 @@ var CONFIG_REGISTRY = [
59
72
  hotReload: true
60
73
  }
61
74
  ];
62
- function getFieldDef(path) {
63
- return CONFIG_REGISTRY.find((f) => f.path === path);
75
+ function getFieldDef(path2) {
76
+ return CONFIG_REGISTRY.find((f) => f.path === path2);
64
77
  }
65
78
  function getSafeFields() {
66
79
  return CONFIG_REGISTRY.filter((f) => f.scope === "safe");
67
80
  }
68
- function isHotReloadable(path) {
69
- const def = getFieldDef(path);
81
+ function isHotReloadable(path2) {
82
+ const def = getFieldDef(path2);
70
83
  return def?.hotReload ?? false;
71
84
  }
72
85
  function resolveOptions(def, config) {
73
86
  if (!def.options) return void 0;
74
87
  return typeof def.options === "function" ? def.options(config) : def.options;
75
88
  }
76
- function getConfigValue(config, path) {
77
- const parts = path.split(".");
89
+ function getConfigValue(config, path2) {
90
+ const parts = path2.split(".");
78
91
  let current = config;
79
92
  for (const part of parts) {
80
93
  if (current && typeof current === "object" && part in current) {
@@ -94,4 +107,4 @@ export {
94
107
  resolveOptions,
95
108
  getConfigValue
96
109
  };
97
- //# sourceMappingURL=chunk-C33LTDZV.js.map
110
+ //# sourceMappingURL=chunk-Z46LGZ7R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/config-registry.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport type { Config } from './config.js'\n\nexport interface ConfigFieldDef {\n path: string\n displayName: string\n group: string\n type: 'toggle' | 'select' | 'number' | 'string'\n options?: string[] | ((config: Config) => string[])\n scope: 'safe' | 'sensitive'\n hotReload: boolean\n}\n\nexport const CONFIG_REGISTRY: ConfigFieldDef[] = [\n {\n path: 'defaultAgent',\n displayName: 'Default Agent',\n group: 'agent',\n type: 'select',\n options: (config) => {\n try {\n const agentsPath = path.join(os.homedir(), \".openacp\", \"agents.json\");\n if (fs.existsSync(agentsPath)) {\n const data = JSON.parse(fs.readFileSync(agentsPath, \"utf-8\"));\n return Object.keys(data.installed ?? {});\n }\n } catch { /* fallback */ }\n return Object.keys(config.agents ?? {});\n },\n scope: 'safe',\n hotReload: true,\n },\n {\n path: 'logging.level',\n displayName: 'Log Level',\n group: 'logging',\n type: 'select',\n options: ['silent', 'debug', 'info', 'warn', 'error', 'fatal'],\n scope: 'safe',\n hotReload: true,\n },\n {\n path: 'tunnel.enabled',\n displayName: 'Tunnel',\n group: 'tunnel',\n type: 'toggle',\n scope: 'safe',\n hotReload: false,\n },\n {\n path: 'security.maxConcurrentSessions',\n displayName: 'Max Concurrent Sessions',\n group: 'security',\n type: 'number',\n scope: 'safe',\n hotReload: true,\n },\n {\n path: 'security.sessionTimeoutMinutes',\n displayName: 'Session Timeout (min)',\n group: 'security',\n type: 'number',\n scope: 'safe',\n hotReload: true,\n },\n {\n path: 'workspace.baseDir',\n displayName: 'Workspace Directory',\n group: 'workspace',\n type: 'string',\n scope: 'safe',\n hotReload: true,\n },\n {\n path: 'sessionStore.ttlDays',\n displayName: 'Session Store TTL (days)',\n group: 'storage',\n type: 'number',\n scope: 'safe',\n hotReload: true,\n },\n]\n\nexport function getFieldDef(path: string): ConfigFieldDef | undefined {\n return CONFIG_REGISTRY.find((f) => f.path === path)\n}\n\nexport function getSafeFields(): ConfigFieldDef[] {\n return CONFIG_REGISTRY.filter((f) => f.scope === 'safe')\n}\n\nexport function isHotReloadable(path: string): boolean {\n const def = getFieldDef(path)\n return def?.hotReload ?? false\n}\n\nexport function resolveOptions(def: ConfigFieldDef, config: Config): string[] | undefined {\n if (!def.options) return undefined\n return typeof def.options === 'function' ? def.options(config) : def.options\n}\n\nexport function getConfigValue(config: Config, path: string): unknown {\n const parts = path.split('.')\n let current: unknown = config\n for (const part of parts) {\n if (current && typeof current === 'object' && part in current) {\n current = (current as Record<string, unknown>)[part]\n } else {\n return undefined\n }\n }\n return current\n}\n"],"mappings":";AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ;AAab,IAAM,kBAAoC;AAAA,EAC/C;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS,CAAC,WAAW;AACnB,UAAI;AACF,cAAM,aAAkB,UAAQ,WAAQ,GAAG,YAAY,aAAa;AACpE,YAAO,cAAW,UAAU,GAAG;AAC7B,gBAAM,OAAO,KAAK,MAAS,gBAAa,YAAY,OAAO,CAAC;AAC5D,iBAAO,OAAO,KAAK,KAAK,aAAa,CAAC,CAAC;AAAA,QACzC;AAAA,MACF,QAAQ;AAAA,MAAiB;AACzB,aAAO,OAAO,KAAK,OAAO,UAAU,CAAC,CAAC;AAAA,IACxC;AAAA,IACA,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS,CAAC,UAAU,SAAS,QAAQ,QAAQ,SAAS,OAAO;AAAA,IAC7D,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AACF;AAEO,SAAS,YAAYA,OAA0C;AACpE,SAAO,gBAAgB,KAAK,CAAC,MAAM,EAAE,SAASA,KAAI;AACpD;AAEO,SAAS,gBAAkC;AAChD,SAAO,gBAAgB,OAAO,CAAC,MAAM,EAAE,UAAU,MAAM;AACzD;AAEO,SAAS,gBAAgBA,OAAuB;AACrD,QAAM,MAAM,YAAYA,KAAI;AAC5B,SAAO,KAAK,aAAa;AAC3B;AAEO,SAAS,eAAe,KAAqB,QAAsC;AACxF,MAAI,CAAC,IAAI,QAAS,QAAO;AACzB,SAAO,OAAO,IAAI,YAAY,aAAa,IAAI,QAAQ,MAAM,IAAI,IAAI;AACvE;AAEO,SAAS,eAAe,QAAgBA,OAAuB;AACpE,QAAM,QAAQA,MAAK,MAAM,GAAG;AAC5B,MAAI,UAAmB;AACvB,aAAW,QAAQ,OAAO;AACxB,QAAI,WAAW,OAAO,YAAY,YAAY,QAAQ,SAAS;AAC7D,gBAAW,QAAoC,IAAI;AAAA,IACrD,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;","names":["path"]}
package/dist/cli.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  installPlugin,
4
4
  listPlugins,
5
5
  uninstallPlugin
6
- } from "./chunk-ZW444AQY.js";
6
+ } from "./chunk-NDR5JCS7.js";
7
7
  import {
8
8
  apiCall,
9
9
  readApiPort,
@@ -16,7 +16,7 @@ import {
16
16
  getLatestVersion,
17
17
  runUpdate
18
18
  } from "./chunk-KSIQZC3J.js";
19
- import "./chunk-WYZFGHHI.js";
19
+ import "./chunk-JRF4G4X7.js";
20
20
  import "./chunk-ESOPMQAY.js";
21
21
 
22
22
  // src/cli.ts
@@ -39,6 +39,11 @@ Usage:
39
39
  openacp update Update to latest version
40
40
  openacp doctor Run system diagnostics
41
41
  openacp doctor --dry-run Check only, don't fix
42
+ openacp agents List available agents
43
+ openacp agents install <name> Install an agent
44
+ openacp agents uninstall <name> Remove an agent
45
+ openacp agents refresh Update agent list
46
+ openacp agents info <name> Show agent details
42
47
  openacp install <package> Install a plugin adapter
43
48
  openacp uninstall <package> Uninstall a plugin adapter
44
49
  openacp plugins List installed plugins
@@ -460,8 +465,8 @@ async function cmdApi(args2) {
460
465
  }
461
466
  async function cmdStart() {
462
467
  await checkAndPromptUpdate();
463
- const { startDaemon, getPidPath } = await import("./daemon-GWJM2S4A.js");
464
- const { ConfigManager } = await import("./config-XURP6B3S.js");
468
+ const { startDaemon, getPidPath } = await import("./daemon-JZLFRUW6.js");
469
+ const { ConfigManager } = await import("./config-PCPIBPUA.js");
465
470
  const cm = new ConfigManager();
466
471
  if (await cm.exists()) {
467
472
  await cm.load();
@@ -478,7 +483,7 @@ async function cmdStart() {
478
483
  }
479
484
  }
480
485
  async function cmdStop() {
481
- const { stopDaemon } = await import("./daemon-GWJM2S4A.js");
486
+ const { stopDaemon } = await import("./daemon-JZLFRUW6.js");
482
487
  const result = stopDaemon();
483
488
  if (result.stopped) {
484
489
  console.log(`OpenACP daemon stopped (was PID ${result.pid})`);
@@ -488,7 +493,7 @@ async function cmdStop() {
488
493
  }
489
494
  }
490
495
  async function cmdStatus() {
491
- const { getStatus } = await import("./daemon-GWJM2S4A.js");
496
+ const { getStatus } = await import("./daemon-JZLFRUW6.js");
492
497
  const status = getStatus();
493
498
  if (status.running) {
494
499
  console.log(`OpenACP is running (PID ${status.pid})`);
@@ -498,7 +503,7 @@ async function cmdStatus() {
498
503
  }
499
504
  async function cmdLogs() {
500
505
  const { spawn } = await import("child_process");
501
- const { ConfigManager, expandHome } = await import("./config-XURP6B3S.js");
506
+ const { ConfigManager, expandHome } = await import("./config-PCPIBPUA.js");
502
507
  const pathMod = await import("path");
503
508
  const cm = new ConfigManager();
504
509
  let logDir = "~/.openacp/logs";
@@ -544,7 +549,7 @@ async function cmdConfig(args2 = []) {
544
549
  console.log("Note: restart required for this change to take effect.");
545
550
  }
546
551
  } else {
547
- const { ConfigManager: ConfigManager2 } = await import("./config-XURP6B3S.js");
552
+ const { ConfigManager: ConfigManager2 } = await import("./config-PCPIBPUA.js");
548
553
  const cm2 = new ConfigManager2();
549
554
  if (!await cm2.exists()) {
550
555
  console.error('No config found. Run "openacp" first to set up.');
@@ -557,8 +562,8 @@ async function cmdConfig(args2 = []) {
557
562
  }
558
563
  return;
559
564
  }
560
- const { runConfigEditor } = await import("./config-editor-AALY3URF.js");
561
- const { ConfigManager } = await import("./config-XURP6B3S.js");
565
+ const { runConfigEditor } = await import("./config-editor-5L7AJ5AF.js");
566
+ const { ConfigManager } = await import("./config-PCPIBPUA.js");
562
567
  const cm = new ConfigManager();
563
568
  if (!await cm.exists()) {
564
569
  console.error('No config found. Run "openacp" first to set up.');
@@ -583,7 +588,7 @@ function buildNestedUpdateFromPath(dotPath, value) {
583
588
  return result;
584
589
  }
585
590
  async function cmdReset() {
586
- const { getStatus } = await import("./daemon-GWJM2S4A.js");
591
+ const { getStatus } = await import("./daemon-JZLFRUW6.js");
587
592
  const status = getStatus();
588
593
  if (status.running) {
589
594
  console.error("OpenACP is running. Stop it first: openacp stop");
@@ -707,7 +712,7 @@ async function cmdIntegrate(args2) {
707
712
  }
708
713
  async function cmdDoctor(args2) {
709
714
  const dryRun = args2.includes("--dry-run");
710
- const { DoctorEngine } = await import("./doctor-X477CVZN.js");
715
+ const { DoctorEngine } = await import("./doctor-N2HKKUUQ.js");
711
716
  const engine = new DoctorEngine({ dryRun });
712
717
  console.log("\n\u{1FA7A} OpenACP Doctor\n");
713
718
  const report = await engine.runAll();
@@ -749,6 +754,172 @@ async function cmdDoctor(args2) {
749
754
  process.exit(1);
750
755
  }
751
756
  }
757
+ async function cmdAgents(args2) {
758
+ const subcommand = args2[1];
759
+ switch (subcommand) {
760
+ case "install":
761
+ return agentsInstall(args2[2], args2.includes("--force"));
762
+ case "uninstall":
763
+ return agentsUninstall(args2[2]);
764
+ case "refresh":
765
+ return agentsRefresh();
766
+ case "info":
767
+ return agentsInfo(args2[2]);
768
+ default:
769
+ return agentsList();
770
+ }
771
+ }
772
+ async function agentsList() {
773
+ const { AgentCatalog } = await import("./agent-catalog-4IAJ7HEG.js");
774
+ const catalog = new AgentCatalog();
775
+ catalog.load();
776
+ await catalog.refreshRegistryIfStale();
777
+ const items = catalog.getAvailable();
778
+ const installed = items.filter((i) => i.installed);
779
+ const available = items.filter((i) => !i.installed);
780
+ console.log("");
781
+ if (installed.length > 0) {
782
+ console.log(" \x1B[1mInstalled agents:\x1B[0m\n");
783
+ for (const item of installed) {
784
+ const deps = item.missingDeps?.length ? ` \x1B[33m(needs: ${item.missingDeps.join(", ")})\x1B[0m` : "";
785
+ console.log(
786
+ ` \x1B[32m\u2713\x1B[0m ${item.key.padEnd(18)} ${item.name.padEnd(22)} v${item.version.padEnd(10)} ${item.distribution}${deps}`
787
+ );
788
+ if (item.description) {
789
+ console.log(` \x1B[2m${item.description}\x1B[0m`);
790
+ }
791
+ }
792
+ console.log("");
793
+ }
794
+ if (available.length > 0) {
795
+ console.log(" \x1B[1mAvailable to install:\x1B[0m\n");
796
+ for (const item of available) {
797
+ const icon = item.available ? "\x1B[2m\u2B07\x1B[0m" : "\x1B[33m\u26A0\x1B[0m";
798
+ const deps = item.missingDeps?.length ? ` \x1B[33m(needs: ${item.missingDeps.join(", ")})\x1B[0m` : "";
799
+ console.log(
800
+ ` ${icon} ${item.key.padEnd(18)} ${item.name.padEnd(22)} v${item.version.padEnd(10)} ${item.distribution}${deps}`
801
+ );
802
+ if (item.description) {
803
+ console.log(` \x1B[2m${item.description}\x1B[0m`);
804
+ }
805
+ }
806
+ console.log("");
807
+ }
808
+ console.log(
809
+ ` \x1B[2mInstall an agent: openacp agents install <name>\x1B[0m`
810
+ );
811
+ console.log("");
812
+ }
813
+ async function agentsInstall(nameOrId, force) {
814
+ if (!nameOrId) {
815
+ console.log("\n Usage: openacp agents install <name>");
816
+ console.log(" Run 'openacp agents' to see available agents.\n");
817
+ return;
818
+ }
819
+ const { AgentCatalog } = await import("./agent-catalog-4IAJ7HEG.js");
820
+ const catalog = new AgentCatalog();
821
+ catalog.load();
822
+ await catalog.refreshRegistryIfStale();
823
+ const progress = {
824
+ onStart(_id, name) {
825
+ process.stdout.write(`
826
+ \u23F3 Installing ${name}...
827
+ `);
828
+ },
829
+ onStep(step) {
830
+ process.stdout.write(` \x1B[32m\u2713\x1B[0m ${step}
831
+ `);
832
+ },
833
+ onDownloadProgress(percent) {
834
+ const filled = Math.round(percent / 5);
835
+ const empty = 20 - filled;
836
+ const bar = "\u2588".repeat(filled) + "\u2591".repeat(empty);
837
+ process.stdout.write(`\r ${bar} ${String(percent).padStart(3)}%`);
838
+ if (percent >= 100) process.stdout.write("\n");
839
+ },
840
+ onSuccess(name) {
841
+ console.log(`
842
+ \x1B[32m\u2713 ${name} installed successfully!\x1B[0m
843
+ `);
844
+ },
845
+ onError(error) {
846
+ console.log(`
847
+ \x1B[31m\u2717 ${error}\x1B[0m
848
+ `);
849
+ }
850
+ };
851
+ const result = await catalog.install(nameOrId, progress, force);
852
+ if (!result.ok) {
853
+ process.exit(1);
854
+ }
855
+ }
856
+ async function agentsUninstall(name) {
857
+ if (!name) {
858
+ console.log("\n Usage: openacp agents uninstall <name>\n");
859
+ return;
860
+ }
861
+ const { AgentCatalog } = await import("./agent-catalog-4IAJ7HEG.js");
862
+ const catalog = new AgentCatalog();
863
+ catalog.load();
864
+ const result = await catalog.uninstall(name);
865
+ if (result.ok) {
866
+ console.log(`
867
+ \x1B[32m\u2713 ${name} removed.\x1B[0m
868
+ `);
869
+ } else {
870
+ console.log(`
871
+ \x1B[31m\u2717 ${result.error}\x1B[0m
872
+ `);
873
+ }
874
+ }
875
+ async function agentsRefresh() {
876
+ const { AgentCatalog } = await import("./agent-catalog-4IAJ7HEG.js");
877
+ const catalog = new AgentCatalog();
878
+ catalog.load();
879
+ console.log("\n Updating agent list...");
880
+ await catalog.fetchRegistry();
881
+ console.log(" \x1B[32m\u2713 Agent list updated.\x1B[0m\n");
882
+ }
883
+ async function agentsInfo(nameOrId) {
884
+ if (!nameOrId) {
885
+ console.log("\n Usage: openacp agents info <name>\n");
886
+ return;
887
+ }
888
+ const { AgentCatalog } = await import("./agent-catalog-4IAJ7HEG.js");
889
+ const catalog = new AgentCatalog();
890
+ catalog.load();
891
+ const installed = catalog.getInstalledAgent(nameOrId);
892
+ if (installed) {
893
+ console.log(`
894
+ \x1B[1m${installed.name}\x1B[0m`);
895
+ console.log(` Version: ${installed.version}`);
896
+ console.log(` Type: ${installed.distribution}`);
897
+ console.log(` Command: ${installed.command} ${installed.args.join(" ")}`);
898
+ console.log(` Installed: ${new Date(installed.installedAt).toLocaleDateString()}`);
899
+ if (installed.binaryPath) console.log(` Binary path: ${installed.binaryPath}`);
900
+ console.log("");
901
+ return;
902
+ }
903
+ const regAgent = catalog.findRegistryAgent(nameOrId);
904
+ if (regAgent) {
905
+ const availability = catalog.checkAvailability(nameOrId);
906
+ console.log(`
907
+ \x1B[1m${regAgent.name}\x1B[0m \x1B[2m(not installed)\x1B[0m`);
908
+ console.log(` ${regAgent.description}`);
909
+ console.log(` Version: ${regAgent.version}`);
910
+ console.log(` License: ${regAgent.license ?? "unknown"}`);
911
+ if (regAgent.website) console.log(` Website: ${regAgent.website}`);
912
+ if (regAgent.repository) console.log(` Source: ${regAgent.repository}`);
913
+ console.log(` Available: ${availability.available ? "\x1B[32mYes\x1B[0m" : `\x1B[33mNo\x1B[0m \u2014 ${availability.reason}`}`);
914
+ console.log(`
915
+ Install: openacp agents install ${nameOrId}
916
+ `);
917
+ return;
918
+ }
919
+ console.log(`
920
+ \x1B[31m"${nameOrId}" not found.\x1B[0m Run 'openacp agents' to see available agents.
921
+ `);
922
+ }
752
923
  async function cmdDefault(command2) {
753
924
  const forceForeground = command2 === "--foreground";
754
925
  if (command2 && !command2.startsWith("-")) {
@@ -757,17 +928,17 @@ async function cmdDefault(command2) {
757
928
  process.exit(1);
758
929
  }
759
930
  await checkAndPromptUpdate();
760
- const { ConfigManager } = await import("./config-XURP6B3S.js");
931
+ const { ConfigManager } = await import("./config-PCPIBPUA.js");
761
932
  const cm = new ConfigManager();
762
933
  if (!await cm.exists()) {
763
- const { runSetup } = await import("./setup-TTOL7XAN.js");
934
+ const { runSetup } = await import("./setup-QAS3QW3M.js");
764
935
  const shouldStart = await runSetup(cm);
765
936
  if (!shouldStart) process.exit(0);
766
937
  }
767
938
  await cm.load();
768
939
  const config = cm.get();
769
940
  if (!forceForeground && config.runMode === "daemon") {
770
- const { startDaemon, getPidPath } = await import("./daemon-GWJM2S4A.js");
941
+ const { startDaemon, getPidPath } = await import("./daemon-JZLFRUW6.js");
771
942
  const result = startDaemon(getPidPath(), config.logging.logDir);
772
943
  if ("error" in result) {
773
944
  console.error(result.error);
@@ -776,9 +947,9 @@ async function cmdDefault(command2) {
776
947
  console.log(`OpenACP daemon started (PID ${result.pid})`);
777
948
  return;
778
949
  }
779
- const { markRunning } = await import("./daemon-GWJM2S4A.js");
950
+ const { markRunning } = await import("./daemon-JZLFRUW6.js");
780
951
  markRunning();
781
- const { startServer } = await import("./main-2QKD2EI2.js");
952
+ const { startServer } = await import("./main-37GLOJ7G.js");
782
953
  await startServer();
783
954
  }
784
955
 
@@ -805,8 +976,9 @@ var commands = {
805
976
  "adopt": () => cmdAdopt(args),
806
977
  "integrate": () => cmdIntegrate(args),
807
978
  "doctor": () => cmdDoctor(args),
979
+ "agents": () => cmdAgents(args),
808
980
  "--daemon-child": async () => {
809
- const { startServer } = await import("./main-2QKD2EI2.js");
981
+ const { startServer } = await import("./main-37GLOJ7G.js");
810
982
  await startServer();
811
983
  }
812
984
  };