@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.
- package/README.md +40 -2
- package/dist/agent-catalog-4IAJ7HEG.js +10 -0
- package/dist/agent-registry-B5YAMA4T.js +8 -0
- package/dist/agent-store-ZBXGOFPH.js +8 -0
- package/dist/chunk-5HGXUCMX.js +83 -0
- package/dist/chunk-5HGXUCMX.js.map +1 -0
- package/dist/{chunk-W7QQA6CW.js → chunk-D73LCTPF.js} +73 -35
- package/dist/chunk-D73LCTPF.js.map +1 -0
- package/dist/{chunk-66RVSUAR.js → chunk-FWN3UIRT.js} +465 -86
- package/dist/chunk-FWN3UIRT.js.map +1 -0
- package/dist/{chunk-3DIPXFZJ.js → chunk-IRGYTNLP.js} +2 -2
- package/dist/{chunk-WYZFGHHI.js → chunk-JRF4G4X7.js} +60 -24
- package/dist/chunk-JRF4G4X7.js.map +1 -0
- package/dist/{chunk-FKOARMAE.js → chunk-LAFKARV3.js} +3 -3
- package/dist/chunk-NAMYZIS5.js +1 -0
- package/dist/{chunk-ZW444AQY.js → chunk-NDR5JCS7.js} +2 -2
- package/dist/chunk-S3DRLJPM.js +422 -0
- package/dist/chunk-S3DRLJPM.js.map +1 -0
- package/dist/chunk-UG6X672R.js +90 -0
- package/dist/chunk-UG6X672R.js.map +1 -0
- package/dist/{chunk-YRJEZD7R.js → chunk-VBEWSWVL.js} +2 -2
- package/dist/chunk-XJJ7LPXP.js +85 -0
- package/dist/chunk-XJJ7LPXP.js.map +1 -0
- package/dist/{chunk-C33LTDZV.js → chunk-Z46LGZ7R.js} +21 -8
- package/dist/chunk-Z46LGZ7R.js.map +1 -0
- package/dist/cli.js +190 -18
- package/dist/cli.js.map +1 -1
- package/dist/{config-XURP6B3S.js → config-PCPIBPUA.js} +2 -2
- package/dist/config-editor-5L7AJ5AF.js +12 -0
- package/dist/{config-registry-OGX4YM2U.js → config-registry-SNKA2EH2.js} +2 -2
- package/dist/{daemon-GWJM2S4A.js → daemon-JZLFRUW6.js} +3 -3
- package/dist/data/registry-snapshot.json +876 -0
- package/dist/doctor-N2HKKUUQ.js +9 -0
- package/dist/doctor-N2HKKUUQ.js.map +1 -0
- package/dist/index.d.ts +137 -17
- package/dist/index.js +19 -10
- package/dist/{main-2QKD2EI2.js → main-37GLOJ7G.js} +18 -15
- package/dist/{main-2QKD2EI2.js.map → main-37GLOJ7G.js.map} +1 -1
- package/dist/{menu-CARRTW2F.js → menu-6RCPBVGQ.js} +2 -4
- package/dist/menu-6RCPBVGQ.js.map +1 -0
- package/dist/{setup-TTOL7XAN.js → setup-QAS3QW3M.js} +4 -3
- package/dist/setup-QAS3QW3M.js.map +1 -0
- package/package.json +10 -2
- package/dist/agent-registry-7HC6D4CH.js +0 -7
- package/dist/chunk-66RVSUAR.js.map +0 -1
- package/dist/chunk-BGKQHQB4.js +0 -276
- package/dist/chunk-BGKQHQB4.js.map +0 -1
- package/dist/chunk-C33LTDZV.js.map +0 -1
- package/dist/chunk-VA2M52CM.js +0 -15
- package/dist/chunk-VA2M52CM.js.map +0 -1
- package/dist/chunk-W7QQA6CW.js.map +0 -1
- package/dist/chunk-WYZFGHHI.js.map +0 -1
- package/dist/config-editor-AALY3URF.js +0 -11
- package/dist/doctor-X477CVZN.js +0 -9
- /package/dist/{agent-registry-7HC6D4CH.js.map → agent-catalog-4IAJ7HEG.js.map} +0 -0
- /package/dist/{config-XURP6B3S.js.map → agent-registry-B5YAMA4T.js.map} +0 -0
- /package/dist/{config-editor-AALY3URF.js.map → agent-store-ZBXGOFPH.js.map} +0 -0
- /package/dist/{chunk-3DIPXFZJ.js.map → chunk-IRGYTNLP.js.map} +0 -0
- /package/dist/{chunk-FKOARMAE.js.map → chunk-LAFKARV3.js.map} +0 -0
- /package/dist/{config-registry-OGX4YM2U.js.map → chunk-NAMYZIS5.js.map} +0 -0
- /package/dist/{chunk-ZW444AQY.js.map → chunk-NDR5JCS7.js.map} +0 -0
- /package/dist/{chunk-YRJEZD7R.js.map → chunk-VBEWSWVL.js.map} +0 -0
- /package/dist/{daemon-GWJM2S4A.js.map → config-PCPIBPUA.js.map} +0 -0
- /package/dist/{doctor-X477CVZN.js.map → config-editor-5L7AJ5AF.js.map} +0 -0
- /package/dist/{menu-CARRTW2F.js.map → config-registry-SNKA2EH2.js.map} +0 -0
- /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) =>
|
|
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(
|
|
63
|
-
return CONFIG_REGISTRY.find((f) => f.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(
|
|
69
|
-
const def = getFieldDef(
|
|
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,
|
|
77
|
-
const parts =
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
464
|
-
const { ConfigManager } = await import("./config-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
561
|
-
const { ConfigManager } = await import("./config-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
950
|
+
const { markRunning } = await import("./daemon-JZLFRUW6.js");
|
|
780
951
|
markRunning();
|
|
781
|
-
const { startServer } = await import("./main-
|
|
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-
|
|
981
|
+
const { startServer } = await import("./main-37GLOJ7G.js");
|
|
810
982
|
await startServer();
|
|
811
983
|
}
|
|
812
984
|
};
|