@openacp/cli 0.2.23 → 0.2.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/autostart-YBYXQA77.js +18 -0
- package/dist/autostart-YBYXQA77.js.map +1 -0
- package/dist/{setup-XQBEZZQB.js → chunk-4BN7NSKB.js} +140 -9
- package/dist/chunk-4BN7NSKB.js.map +1 -0
- package/dist/chunk-CQMS5U7Z.js +63 -0
- package/dist/chunk-CQMS5U7Z.js.map +1 -0
- package/dist/{chunk-XOVJLTEC.js → chunk-FGXG3H3F.js} +14 -58
- package/dist/chunk-FGXG3H3F.js.map +1 -0
- package/dist/{chunk-ZATQZUJT.js → chunk-MNJDYDGH.js} +9 -1
- package/dist/{chunk-ZATQZUJT.js.map → chunk-MNJDYDGH.js.map} +1 -1
- package/dist/chunk-PQRVTUNH.js +145 -0
- package/dist/chunk-PQRVTUNH.js.map +1 -0
- package/dist/chunk-QWUJIKTX.js +527 -0
- package/dist/chunk-QWUJIKTX.js.map +1 -0
- package/dist/{chunk-EIBLQU3H.js → chunk-S5MPFOR3.js} +632 -136
- package/dist/chunk-S5MPFOR3.js.map +1 -0
- package/dist/chunk-S6O7SM6A.js +129 -0
- package/dist/chunk-S6O7SM6A.js.map +1 -0
- package/dist/chunk-WXS6ONOD.js +103 -0
- package/dist/chunk-WXS6ONOD.js.map +1 -0
- package/dist/cli.js +354 -4
- package/dist/cli.js.map +1 -1
- package/dist/config-2XALNLAA.js +14 -0
- package/dist/config-2XALNLAA.js.map +1 -0
- package/dist/config-editor-56B6YU7B.js +11 -0
- package/dist/config-editor-56B6YU7B.js.map +1 -0
- package/dist/daemon-3E5OMLT3.js +29 -0
- package/dist/daemon-3E5OMLT3.js.map +1 -0
- package/dist/index.d.ts +99 -18
- package/dist/index.js +35 -6
- package/dist/install-cloudflared-57NRTI4E.js +8 -0
- package/dist/install-cloudflared-57NRTI4E.js.map +1 -0
- package/dist/{main-VJUX7RUY.js → main-TGYT34IJ.js} +43 -11
- package/dist/main-TGYT34IJ.js.map +1 -0
- package/dist/setup-FTNJACSC.js +27 -0
- package/dist/setup-FTNJACSC.js.map +1 -0
- package/dist/{tunnel-service-I6NUMBT4.js → tunnel-service-I6WM6USB.js} +10 -10
- package/dist/tunnel-service-I6WM6USB.js.map +1 -0
- package/package.json +2 -2
- package/dist/chunk-EIBLQU3H.js.map +0 -1
- package/dist/chunk-XOVJLTEC.js.map +0 -1
- package/dist/main-VJUX7RUY.js.map +0 -1
- package/dist/setup-XQBEZZQB.js.map +0 -1
- package/dist/tunnel-service-I6NUMBT4.js.map +0 -1
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createChildLogger
|
|
3
|
+
} from "./chunk-MNJDYDGH.js";
|
|
4
|
+
|
|
5
|
+
// src/tunnel/providers/install-cloudflared.ts
|
|
6
|
+
import fs from "fs";
|
|
7
|
+
import path from "path";
|
|
8
|
+
import https from "https";
|
|
9
|
+
import os from "os";
|
|
10
|
+
import { execSync } from "child_process";
|
|
11
|
+
var log = createChildLogger({ module: "cloudflared-install" });
|
|
12
|
+
var BIN_DIR = path.join(os.homedir(), ".openacp", "bin");
|
|
13
|
+
var IS_WINDOWS = os.platform() === "win32";
|
|
14
|
+
var BIN_NAME = IS_WINDOWS ? "cloudflared.exe" : "cloudflared";
|
|
15
|
+
var BIN_PATH = path.join(BIN_DIR, BIN_NAME);
|
|
16
|
+
var GITHUB_BASE_URL = "https://github.com/cloudflare/cloudflared/releases/latest/download";
|
|
17
|
+
var PLATFORM_MAPPINGS = {
|
|
18
|
+
darwin: {
|
|
19
|
+
x64: "cloudflared-darwin-amd64.tgz",
|
|
20
|
+
arm64: "cloudflared-darwin-amd64.tgz"
|
|
21
|
+
},
|
|
22
|
+
win32: {
|
|
23
|
+
x64: "cloudflared-windows-amd64.exe"
|
|
24
|
+
},
|
|
25
|
+
linux: {
|
|
26
|
+
x64: "cloudflared-linux-amd64",
|
|
27
|
+
arm64: "cloudflared-linux-arm64"
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
function getDownloadUrl() {
|
|
31
|
+
const platform = os.platform();
|
|
32
|
+
const arch = os.arch();
|
|
33
|
+
const mapping = PLATFORM_MAPPINGS[platform];
|
|
34
|
+
if (!mapping) throw new Error(`Unsupported platform: ${platform}`);
|
|
35
|
+
const binary = mapping[arch];
|
|
36
|
+
if (!binary) throw new Error(`Unsupported architecture: ${arch} for ${platform}`);
|
|
37
|
+
return `${GITHUB_BASE_URL}/${binary}`;
|
|
38
|
+
}
|
|
39
|
+
function downloadFile(url, dest) {
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
const file = fs.createWriteStream(dest);
|
|
42
|
+
https.get(url, (response) => {
|
|
43
|
+
if (response.statusCode === 301 || response.statusCode === 302) {
|
|
44
|
+
file.close();
|
|
45
|
+
fs.unlinkSync(dest);
|
|
46
|
+
downloadFile(response.headers.location, dest).then(resolve).catch(reject);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (response.statusCode !== 200) {
|
|
50
|
+
file.close();
|
|
51
|
+
fs.unlinkSync(dest);
|
|
52
|
+
reject(new Error(`Download failed with status ${response.statusCode}`));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
response.pipe(file);
|
|
56
|
+
file.on("finish", () => file.close(() => resolve(dest)));
|
|
57
|
+
file.on("error", (err) => {
|
|
58
|
+
file.close();
|
|
59
|
+
if (fs.existsSync(dest)) fs.unlinkSync(dest);
|
|
60
|
+
reject(err);
|
|
61
|
+
});
|
|
62
|
+
}).on("error", (err) => {
|
|
63
|
+
file.close();
|
|
64
|
+
if (fs.existsSync(dest)) fs.unlinkSync(dest);
|
|
65
|
+
reject(err);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
async function ensureCloudflared() {
|
|
70
|
+
try {
|
|
71
|
+
const systemPath = execSync("which cloudflared", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
|
|
72
|
+
if (systemPath) {
|
|
73
|
+
log.debug({ path: systemPath }, "cloudflared found in PATH");
|
|
74
|
+
return systemPath;
|
|
75
|
+
}
|
|
76
|
+
} catch {
|
|
77
|
+
}
|
|
78
|
+
if (fs.existsSync(BIN_PATH)) {
|
|
79
|
+
if (!IS_WINDOWS) fs.chmodSync(BIN_PATH, "755");
|
|
80
|
+
log.debug({ path: BIN_PATH }, "cloudflared found in ~/.openacp/bin");
|
|
81
|
+
return BIN_PATH;
|
|
82
|
+
}
|
|
83
|
+
log.info("cloudflared not found, downloading from GitHub...");
|
|
84
|
+
fs.mkdirSync(BIN_DIR, { recursive: true });
|
|
85
|
+
const url = getDownloadUrl();
|
|
86
|
+
const isArchive = url.endsWith(".tgz");
|
|
87
|
+
const downloadDest = isArchive ? path.join(BIN_DIR, "cloudflared.tgz") : BIN_PATH;
|
|
88
|
+
await downloadFile(url, downloadDest);
|
|
89
|
+
if (isArchive) {
|
|
90
|
+
execSync(`tar -xzf "${downloadDest}" -C "${BIN_DIR}"`, { stdio: "pipe" });
|
|
91
|
+
fs.unlinkSync(downloadDest);
|
|
92
|
+
}
|
|
93
|
+
if (!IS_WINDOWS) {
|
|
94
|
+
fs.chmodSync(BIN_PATH, "755");
|
|
95
|
+
}
|
|
96
|
+
log.info({ path: BIN_PATH }, "cloudflared installed successfully");
|
|
97
|
+
return BIN_PATH;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export {
|
|
101
|
+
ensureCloudflared
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=chunk-WXS6ONOD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/tunnel/providers/install-cloudflared.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport https from 'node:https'\nimport os from 'node:os'\nimport { execSync } from 'node:child_process'\nimport { createChildLogger } from '../../core/log.js'\n\nconst log = createChildLogger({ module: 'cloudflared-install' })\n\nconst BIN_DIR = path.join(os.homedir(), '.openacp', 'bin')\nconst IS_WINDOWS = os.platform() === 'win32'\nconst BIN_NAME = IS_WINDOWS ? 'cloudflared.exe' : 'cloudflared'\nconst BIN_PATH = path.join(BIN_DIR, BIN_NAME)\n\nconst GITHUB_BASE_URL = 'https://github.com/cloudflare/cloudflared/releases/latest/download'\n\nconst PLATFORM_MAPPINGS: Record<string, Record<string, string>> = {\n darwin: {\n x64: 'cloudflared-darwin-amd64.tgz',\n arm64: 'cloudflared-darwin-amd64.tgz',\n },\n win32: {\n x64: 'cloudflared-windows-amd64.exe',\n },\n linux: {\n x64: 'cloudflared-linux-amd64',\n arm64: 'cloudflared-linux-arm64',\n },\n}\n\nfunction getDownloadUrl(): string {\n const platform = os.platform()\n const arch = os.arch()\n const mapping = PLATFORM_MAPPINGS[platform]\n if (!mapping) throw new Error(`Unsupported platform: ${platform}`)\n const binary = mapping[arch]\n if (!binary) throw new Error(`Unsupported architecture: ${arch} for ${platform}`)\n return `${GITHUB_BASE_URL}/${binary}`\n}\n\nfunction downloadFile(url: string, dest: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const file = fs.createWriteStream(dest)\n\n https.get(url, (response) => {\n // Follow redirects\n if (response.statusCode === 301 || response.statusCode === 302) {\n file.close()\n fs.unlinkSync(dest)\n downloadFile(response.headers.location!, dest).then(resolve).catch(reject)\n return\n }\n\n if (response.statusCode !== 200) {\n file.close()\n fs.unlinkSync(dest)\n reject(new Error(`Download failed with status ${response.statusCode}`))\n return\n }\n\n response.pipe(file)\n file.on('finish', () => file.close(() => resolve(dest)))\n file.on('error', (err) => {\n file.close()\n if (fs.existsSync(dest)) fs.unlinkSync(dest)\n reject(err)\n })\n }).on('error', (err) => {\n file.close()\n if (fs.existsSync(dest)) fs.unlinkSync(dest)\n reject(err)\n })\n })\n}\n\n/**\n * Ensure cloudflared binary is available.\n * 1. Check if already installed in PATH\n * 2. Check if downloaded to ~/.openacp/bin/\n * 3. If not, download from GitHub releases\n * Returns the path to the cloudflared binary.\n */\nexport async function ensureCloudflared(): Promise<string> {\n // 1. Check PATH first\n try {\n const systemPath = execSync('which cloudflared', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim()\n if (systemPath) {\n log.debug({ path: systemPath }, 'cloudflared found in PATH')\n return systemPath\n }\n } catch {\n // Not in PATH\n }\n\n // 2. Check our bin directory\n if (fs.existsSync(BIN_PATH)) {\n if (!IS_WINDOWS) fs.chmodSync(BIN_PATH, '755')\n log.debug({ path: BIN_PATH }, 'cloudflared found in ~/.openacp/bin')\n return BIN_PATH\n }\n\n // 3. Download\n log.info('cloudflared not found, downloading from GitHub...')\n fs.mkdirSync(BIN_DIR, { recursive: true })\n\n const url = getDownloadUrl()\n const isArchive = url.endsWith('.tgz')\n const downloadDest = isArchive ? path.join(BIN_DIR, 'cloudflared.tgz') : BIN_PATH\n\n await downloadFile(url, downloadDest)\n\n if (isArchive) {\n execSync(`tar -xzf \"${downloadDest}\" -C \"${BIN_DIR}\"`, { stdio: 'pipe' })\n fs.unlinkSync(downloadDest)\n }\n\n if (!IS_WINDOWS) {\n fs.chmodSync(BIN_PATH, '755')\n }\n\n log.info({ path: BIN_PATH }, 'cloudflared installed successfully')\n return BIN_PATH\n}\n"],"mappings":"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","names":[]}
|
package/dist/cli.js
CHANGED
|
@@ -3,26 +3,145 @@ import {
|
|
|
3
3
|
installPlugin,
|
|
4
4
|
listPlugins,
|
|
5
5
|
uninstallPlugin
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-CQMS5U7Z.js";
|
|
7
|
+
import "./chunk-FGXG3H3F.js";
|
|
8
|
+
import {
|
|
9
|
+
__require
|
|
10
|
+
} from "./chunk-MNJDYDGH.js";
|
|
8
11
|
|
|
9
12
|
// src/cli.ts
|
|
10
13
|
import { setDefaultAutoSelectFamily } from "net";
|
|
14
|
+
|
|
15
|
+
// src/core/api-client.ts
|
|
16
|
+
import * as fs from "fs";
|
|
17
|
+
import * as path from "path";
|
|
18
|
+
import * as os from "os";
|
|
19
|
+
var DEFAULT_PORT_FILE = path.join(os.homedir(), ".openacp", "api.port");
|
|
20
|
+
function readApiPort(portFilePath = DEFAULT_PORT_FILE) {
|
|
21
|
+
try {
|
|
22
|
+
const content = fs.readFileSync(portFilePath, "utf-8").trim();
|
|
23
|
+
const port = parseInt(content, 10);
|
|
24
|
+
return isNaN(port) ? null : port;
|
|
25
|
+
} catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function removeStalePortFile(portFilePath = DEFAULT_PORT_FILE) {
|
|
30
|
+
try {
|
|
31
|
+
fs.unlinkSync(portFilePath);
|
|
32
|
+
} catch {
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function apiCall(port, urlPath, options) {
|
|
36
|
+
return fetch(`http://127.0.0.1:${port}${urlPath}`, options);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// src/cli.ts
|
|
11
40
|
setDefaultAutoSelectFamily(false);
|
|
41
|
+
var NPM_PACKAGE = "@openacp/cli";
|
|
12
42
|
var args = process.argv.slice(2);
|
|
13
43
|
var command = args[0];
|
|
44
|
+
function getCurrentVersion() {
|
|
45
|
+
try {
|
|
46
|
+
const { createRequire } = __require("module");
|
|
47
|
+
const req = createRequire(import.meta.url);
|
|
48
|
+
const pkg = req("../package.json");
|
|
49
|
+
return pkg.version;
|
|
50
|
+
} catch {
|
|
51
|
+
return "0.0.0-dev";
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async function getLatestVersion() {
|
|
55
|
+
try {
|
|
56
|
+
const res = await fetch(`https://registry.npmjs.org/${NPM_PACKAGE}/latest`, {
|
|
57
|
+
signal: AbortSignal.timeout(5e3)
|
|
58
|
+
});
|
|
59
|
+
if (!res.ok) return null;
|
|
60
|
+
const data = await res.json();
|
|
61
|
+
return data.version ?? null;
|
|
62
|
+
} catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function compareVersions(current, latest) {
|
|
67
|
+
const a = current.split(".").map(Number);
|
|
68
|
+
const b = latest.split(".").map(Number);
|
|
69
|
+
for (let i = 0; i < 3; i++) {
|
|
70
|
+
if ((a[i] ?? 0) < (b[i] ?? 0)) return -1;
|
|
71
|
+
if ((a[i] ?? 0) > (b[i] ?? 0)) return 1;
|
|
72
|
+
}
|
|
73
|
+
return 0;
|
|
74
|
+
}
|
|
75
|
+
async function runUpdate() {
|
|
76
|
+
const { spawn } = await import("child_process");
|
|
77
|
+
return new Promise((resolve) => {
|
|
78
|
+
const child = spawn("npm", ["install", "-g", `${NPM_PACKAGE}@latest`], {
|
|
79
|
+
stdio: "inherit",
|
|
80
|
+
shell: true
|
|
81
|
+
});
|
|
82
|
+
const onSignal = () => {
|
|
83
|
+
child.kill("SIGTERM");
|
|
84
|
+
resolve(false);
|
|
85
|
+
};
|
|
86
|
+
process.on("SIGINT", onSignal);
|
|
87
|
+
process.on("SIGTERM", onSignal);
|
|
88
|
+
child.on("close", (code) => {
|
|
89
|
+
process.off("SIGINT", onSignal);
|
|
90
|
+
process.off("SIGTERM", onSignal);
|
|
91
|
+
resolve(code === 0);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
async function checkAndPromptUpdate() {
|
|
96
|
+
const current = getCurrentVersion();
|
|
97
|
+
if (current === "0.0.0-dev") return;
|
|
98
|
+
const latest = await getLatestVersion();
|
|
99
|
+
if (!latest || compareVersions(current, latest) >= 0) return;
|
|
100
|
+
console.log(`\x1B[33mUpdate available: v${current} \u2192 v${latest}\x1B[0m`);
|
|
101
|
+
const { confirm } = await import("@inquirer/prompts");
|
|
102
|
+
const yes = await confirm({
|
|
103
|
+
message: "Update now before starting?",
|
|
104
|
+
default: true
|
|
105
|
+
});
|
|
106
|
+
if (yes) {
|
|
107
|
+
const ok = await runUpdate();
|
|
108
|
+
if (ok) {
|
|
109
|
+
console.log(`\x1B[32m\u2713 Updated to v${latest}. Please re-run your command.\x1B[0m`);
|
|
110
|
+
process.exit(0);
|
|
111
|
+
} else {
|
|
112
|
+
console.error("\x1B[31mUpdate failed. Continuing with current version.\x1B[0m");
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
14
116
|
function printHelp() {
|
|
15
117
|
console.log(`
|
|
16
118
|
OpenACP - Self-hosted bridge for AI coding agents
|
|
17
119
|
|
|
18
120
|
Usage:
|
|
19
|
-
openacp Start
|
|
121
|
+
openacp Start (mode from config)
|
|
122
|
+
openacp start Start as background daemon
|
|
123
|
+
openacp stop Stop background daemon
|
|
124
|
+
openacp status Show daemon status
|
|
125
|
+
openacp logs Tail daemon log file
|
|
126
|
+
openacp config Edit configuration
|
|
127
|
+
openacp reset Delete all data and start fresh
|
|
128
|
+
openacp update Update to latest version
|
|
20
129
|
openacp install <package> Install a plugin adapter
|
|
21
130
|
openacp uninstall <package> Uninstall a plugin adapter
|
|
22
131
|
openacp plugins List installed plugins
|
|
132
|
+
openacp --foreground Force foreground mode
|
|
23
133
|
openacp --version Show version
|
|
24
134
|
openacp --help Show this help
|
|
25
135
|
|
|
136
|
+
Runtime (requires running daemon):
|
|
137
|
+
openacp runtime new [agent] [workspace] Create a new session
|
|
138
|
+
openacp runtime cancel <id> Cancel a session
|
|
139
|
+
openacp runtime status Show active sessions
|
|
140
|
+
openacp runtime agents List available agents
|
|
141
|
+
|
|
142
|
+
Note: "openacp status" shows daemon process health.
|
|
143
|
+
"openacp runtime status" shows active agent sessions.
|
|
144
|
+
|
|
26
145
|
Install:
|
|
27
146
|
npm install -g @openacp/cli
|
|
28
147
|
|
|
@@ -79,12 +198,243 @@ async function main() {
|
|
|
79
198
|
}
|
|
80
199
|
return;
|
|
81
200
|
}
|
|
201
|
+
if (command === "runtime") {
|
|
202
|
+
const subCmd = args[1];
|
|
203
|
+
const port = readApiPort();
|
|
204
|
+
if (port === null) {
|
|
205
|
+
console.error("OpenACP is not running. Start with `openacp start`");
|
|
206
|
+
process.exit(1);
|
|
207
|
+
}
|
|
208
|
+
try {
|
|
209
|
+
if (subCmd === "new") {
|
|
210
|
+
const agent = args[2];
|
|
211
|
+
const workspaceIdx = args.indexOf("--workspace");
|
|
212
|
+
const workspace = workspaceIdx !== -1 ? args[workspaceIdx + 1] : args[3];
|
|
213
|
+
const body = {};
|
|
214
|
+
if (agent) body.agent = agent;
|
|
215
|
+
if (workspace) body.workspace = workspace;
|
|
216
|
+
const res = await apiCall(port, "/api/sessions", {
|
|
217
|
+
method: "POST",
|
|
218
|
+
headers: { "Content-Type": "application/json" },
|
|
219
|
+
body: JSON.stringify(body)
|
|
220
|
+
});
|
|
221
|
+
const data = await res.json();
|
|
222
|
+
if (!res.ok) {
|
|
223
|
+
console.error(`Error: ${data.error}`);
|
|
224
|
+
process.exit(1);
|
|
225
|
+
}
|
|
226
|
+
console.log("Session created");
|
|
227
|
+
console.log(` ID : ${data.sessionId}`);
|
|
228
|
+
console.log(` Agent : ${data.agent}`);
|
|
229
|
+
console.log(` Workspace : ${data.workspace}`);
|
|
230
|
+
console.log(` Status : ${data.status}`);
|
|
231
|
+
} else if (subCmd === "cancel") {
|
|
232
|
+
const sessionId = args[2];
|
|
233
|
+
if (!sessionId) {
|
|
234
|
+
console.error("Usage: openacp runtime cancel <session-id>");
|
|
235
|
+
process.exit(1);
|
|
236
|
+
}
|
|
237
|
+
const res = await apiCall(port, `/api/sessions/${encodeURIComponent(sessionId)}`, {
|
|
238
|
+
method: "DELETE"
|
|
239
|
+
});
|
|
240
|
+
const data = await res.json();
|
|
241
|
+
if (!res.ok) {
|
|
242
|
+
console.error(`Error: ${data.error}`);
|
|
243
|
+
process.exit(1);
|
|
244
|
+
}
|
|
245
|
+
console.log(`Session ${sessionId} cancelled`);
|
|
246
|
+
} else if (subCmd === "status") {
|
|
247
|
+
const res = await apiCall(port, "/api/sessions");
|
|
248
|
+
const data = await res.json();
|
|
249
|
+
if (data.sessions.length === 0) {
|
|
250
|
+
console.log("No active sessions.");
|
|
251
|
+
} else {
|
|
252
|
+
console.log(`Active sessions: ${data.sessions.length}
|
|
253
|
+
`);
|
|
254
|
+
for (const s of data.sessions) {
|
|
255
|
+
const name = s.name ? ` "${s.name}"` : "";
|
|
256
|
+
console.log(` ${s.id} ${s.agent} ${s.status}${name}`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
} else if (subCmd === "agents") {
|
|
260
|
+
const res = await apiCall(port, "/api/agents");
|
|
261
|
+
const data = await res.json();
|
|
262
|
+
console.log("Available agents:");
|
|
263
|
+
for (const a of data.agents) {
|
|
264
|
+
const isDefault = a.name === data.default ? " (default)" : "";
|
|
265
|
+
console.log(` ${a.name}${isDefault}`);
|
|
266
|
+
}
|
|
267
|
+
} else {
|
|
268
|
+
console.error(`Unknown runtime command: ${subCmd || "(none)"}
|
|
269
|
+
`);
|
|
270
|
+
console.log("Usage:");
|
|
271
|
+
console.log(" openacp runtime new [agent] [workspace] Create a new session");
|
|
272
|
+
console.log(" openacp runtime cancel <id> Cancel a session");
|
|
273
|
+
console.log(" openacp runtime status Show active sessions");
|
|
274
|
+
console.log(" openacp runtime agents List available agents");
|
|
275
|
+
process.exit(1);
|
|
276
|
+
}
|
|
277
|
+
} catch (err) {
|
|
278
|
+
if (err instanceof TypeError && err.cause?.code === "ECONNREFUSED") {
|
|
279
|
+
console.error("OpenACP is not running (stale port file)");
|
|
280
|
+
removeStalePortFile();
|
|
281
|
+
process.exit(1);
|
|
282
|
+
}
|
|
283
|
+
throw err;
|
|
284
|
+
}
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
if (command === "start") {
|
|
288
|
+
await checkAndPromptUpdate();
|
|
289
|
+
const { startDaemon, getPidPath } = await import("./daemon-3E5OMLT3.js");
|
|
290
|
+
const { ConfigManager: ConfigManager2 } = await import("./config-2XALNLAA.js");
|
|
291
|
+
const cm2 = new ConfigManager2();
|
|
292
|
+
if (await cm2.exists()) {
|
|
293
|
+
await cm2.load();
|
|
294
|
+
const config2 = cm2.get();
|
|
295
|
+
const result = startDaemon(getPidPath(), config2.logging.logDir);
|
|
296
|
+
if ("error" in result) {
|
|
297
|
+
console.error(result.error);
|
|
298
|
+
process.exit(1);
|
|
299
|
+
}
|
|
300
|
+
console.log(`OpenACP daemon started (PID ${result.pid})`);
|
|
301
|
+
} else {
|
|
302
|
+
console.error('No config found. Run "openacp" first to set up.');
|
|
303
|
+
process.exit(1);
|
|
304
|
+
}
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
if (command === "stop") {
|
|
308
|
+
const { stopDaemon } = await import("./daemon-3E5OMLT3.js");
|
|
309
|
+
const result = stopDaemon();
|
|
310
|
+
if (result.stopped) {
|
|
311
|
+
console.log(`OpenACP daemon stopped (was PID ${result.pid})`);
|
|
312
|
+
} else {
|
|
313
|
+
console.error(result.error);
|
|
314
|
+
process.exit(1);
|
|
315
|
+
}
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
if (command === "status") {
|
|
319
|
+
const { getStatus } = await import("./daemon-3E5OMLT3.js");
|
|
320
|
+
const status = getStatus();
|
|
321
|
+
if (status.running) {
|
|
322
|
+
console.log(`OpenACP is running (PID ${status.pid})`);
|
|
323
|
+
} else {
|
|
324
|
+
console.log("OpenACP is not running");
|
|
325
|
+
}
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
if (command === "logs") {
|
|
329
|
+
const { spawn } = await import("child_process");
|
|
330
|
+
const { ConfigManager: ConfigManager2, expandHome } = await import("./config-2XALNLAA.js");
|
|
331
|
+
const pathMod = await import("path");
|
|
332
|
+
const cm2 = new ConfigManager2();
|
|
333
|
+
let logDir = "~/.openacp/logs";
|
|
334
|
+
if (await cm2.exists()) {
|
|
335
|
+
await cm2.load();
|
|
336
|
+
logDir = cm2.get().logging.logDir;
|
|
337
|
+
}
|
|
338
|
+
const logFile = pathMod.join(expandHome(logDir), "openacp.log");
|
|
339
|
+
const tail = spawn("tail", ["-f", "-n", "50", logFile], { stdio: "inherit" });
|
|
340
|
+
tail.on("error", (err) => {
|
|
341
|
+
console.error(`Cannot tail log file: ${err.message}`);
|
|
342
|
+
process.exit(1);
|
|
343
|
+
});
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
if (command === "config") {
|
|
347
|
+
const { runConfigEditor } = await import("./config-editor-56B6YU7B.js");
|
|
348
|
+
const { ConfigManager: ConfigManager2 } = await import("./config-2XALNLAA.js");
|
|
349
|
+
const cm2 = new ConfigManager2();
|
|
350
|
+
if (!await cm2.exists()) {
|
|
351
|
+
console.error('No config found. Run "openacp" first to set up.');
|
|
352
|
+
process.exit(1);
|
|
353
|
+
}
|
|
354
|
+
await runConfigEditor(cm2);
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
if (command === "reset") {
|
|
358
|
+
const { getStatus } = await import("./daemon-3E5OMLT3.js");
|
|
359
|
+
const status = getStatus();
|
|
360
|
+
if (status.running) {
|
|
361
|
+
console.error("OpenACP is running. Stop it first: openacp stop");
|
|
362
|
+
process.exit(1);
|
|
363
|
+
}
|
|
364
|
+
const { confirm } = await import("@inquirer/prompts");
|
|
365
|
+
const yes = await confirm({
|
|
366
|
+
message: "This will delete all OpenACP data (~/.openacp). You will need to set up again. Continue?",
|
|
367
|
+
default: false
|
|
368
|
+
});
|
|
369
|
+
if (!yes) {
|
|
370
|
+
console.log("Aborted.");
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
const { uninstallAutoStart } = await import("./autostart-YBYXQA77.js");
|
|
374
|
+
uninstallAutoStart();
|
|
375
|
+
const fs2 = await import("fs");
|
|
376
|
+
const os2 = await import("os");
|
|
377
|
+
const path2 = await import("path");
|
|
378
|
+
const openacpDir = path2.join(os2.homedir(), ".openacp");
|
|
379
|
+
fs2.rmSync(openacpDir, { recursive: true, force: true });
|
|
380
|
+
console.log("Reset complete. Run `openacp` to set up again.");
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
if (command === "update") {
|
|
384
|
+
const current = getCurrentVersion();
|
|
385
|
+
const latest = await getLatestVersion();
|
|
386
|
+
if (!latest) {
|
|
387
|
+
console.error("Could not check for updates. Check your internet connection.");
|
|
388
|
+
process.exit(1);
|
|
389
|
+
}
|
|
390
|
+
if (compareVersions(current, latest) >= 0) {
|
|
391
|
+
console.log(`Already up to date (v${current})`);
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
console.log(`Update available: v${current} \u2192 v${latest}`);
|
|
395
|
+
const ok = await runUpdate();
|
|
396
|
+
if (ok) {
|
|
397
|
+
console.log(`\x1B[32m\u2713 Updated to v${latest}\x1B[0m`);
|
|
398
|
+
} else {
|
|
399
|
+
console.error("Update failed. Try manually: npm install -g @openacp/cli@latest");
|
|
400
|
+
process.exit(1);
|
|
401
|
+
}
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
if (command === "--daemon-child") {
|
|
405
|
+
const { startServer: startServer2 } = await import("./main-TGYT34IJ.js");
|
|
406
|
+
await startServer2();
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
const forceForeground = command === "--foreground";
|
|
82
410
|
if (command && !command.startsWith("-")) {
|
|
83
411
|
console.error(`Unknown command: ${command}`);
|
|
84
412
|
printHelp();
|
|
85
413
|
process.exit(1);
|
|
86
414
|
}
|
|
87
|
-
|
|
415
|
+
await checkAndPromptUpdate();
|
|
416
|
+
const { ConfigManager } = await import("./config-2XALNLAA.js");
|
|
417
|
+
const cm = new ConfigManager();
|
|
418
|
+
if (!await cm.exists()) {
|
|
419
|
+
const { runSetup } = await import("./setup-FTNJACSC.js");
|
|
420
|
+
const shouldStart = await runSetup(cm);
|
|
421
|
+
if (!shouldStart) process.exit(0);
|
|
422
|
+
}
|
|
423
|
+
await cm.load();
|
|
424
|
+
const config = cm.get();
|
|
425
|
+
if (!forceForeground && config.runMode === "daemon") {
|
|
426
|
+
const { startDaemon, getPidPath } = await import("./daemon-3E5OMLT3.js");
|
|
427
|
+
const result = startDaemon(getPidPath(), config.logging.logDir);
|
|
428
|
+
if ("error" in result) {
|
|
429
|
+
console.error(result.error);
|
|
430
|
+
process.exit(1);
|
|
431
|
+
}
|
|
432
|
+
console.log(`OpenACP daemon started (PID ${result.pid})`);
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
const { markRunning } = await import("./daemon-3E5OMLT3.js");
|
|
436
|
+
markRunning();
|
|
437
|
+
const { startServer } = await import("./main-TGYT34IJ.js");
|
|
88
438
|
await startServer();
|
|
89
439
|
}
|
|
90
440
|
main().catch((err) => {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { setDefaultAutoSelectFamily } from \"node:net\";\nsetDefaultAutoSelectFamily(false);\n\nimport {\n installPlugin,\n uninstallPlugin,\n listPlugins,\n} from \"./core/plugin-manager.js\";\n\nconst args = process.argv.slice(2);\nconst command = args[0];\n\nfunction printHelp(): void {\n console.log(`\nOpenACP - Self-hosted bridge for AI coding agents\n\nUsage:\n openacp Start the server\n openacp install <package> Install a plugin adapter\n openacp uninstall <package> Uninstall a plugin adapter\n openacp plugins List installed plugins\n openacp --version Show version\n openacp --help Show this help\n\nInstall:\n npm install -g @openacp/cli\n\nExamples:\n openacp\n openacp install @openacp/adapter-discord\n openacp uninstall @openacp/adapter-discord\n`);\n}\n\nasync function main() {\n if (command === \"--help\" || command === \"-h\") {\n printHelp();\n return;\n }\n\n if (command === \"--version\" || command === \"-v\") {\n // In published build: read version from own package.json via createRequire\n // In dev: fallback to 'dev'\n try {\n const { createRequire } = await import(\"node:module\");\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\");\n console.log(`openacp v${pkg.version}`);\n } catch {\n console.log(\"openacp v0.0.0-dev\");\n }\n return;\n }\n\n if (command === \"install\") {\n const pkg = args[1];\n if (!pkg) {\n console.error(\"Usage: openacp install <package>\");\n process.exit(1);\n }\n installPlugin(pkg);\n return;\n }\n\n if (command === \"uninstall\") {\n const pkg = args[1];\n if (!pkg) {\n console.error(\"Usage: openacp uninstall <package>\");\n process.exit(1);\n }\n uninstallPlugin(pkg);\n return;\n }\n\n if (command === \"plugins\") {\n const plugins = listPlugins();\n const entries = Object.entries(plugins);\n if (entries.length === 0) {\n console.log(\"No plugins installed.\");\n } else {\n console.log(\"Installed plugins:\");\n for (const [name, version] of entries) {\n console.log(` ${name}@${version}`);\n }\n }\n return;\n }\n\n // Default: start server\n if (command && !command.startsWith(\"-\")) {\n console.error(`Unknown command: ${command}`);\n printHelp();\n process.exit(1);\n }\n\n // Import and run server start\n const { startServer } = await import(\"./main.js\");\n await startServer();\n}\n\nmain().catch((err) => {\n console.error(\"Fatal:\", err);\n process.exit(1);\n});\n"],"mappings":";;;;;;;;;AAEA,SAAS,kCAAkC;AAC3C,2BAA2B,KAAK;AAQhC,IAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,IAAM,UAAU,KAAK,CAAC;AAEtB,SAAS,YAAkB;AACzB,UAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAkBb;AACD;AAEA,eAAe,OAAO;AACpB,MAAI,YAAY,YAAY,YAAY,MAAM;AAC5C,cAAU;AACV;AAAA,EACF;AAEA,MAAI,YAAY,eAAe,YAAY,MAAM;AAG/C,QAAI;AACF,YAAM,EAAE,cAAc,IAAI,MAAM,OAAO,QAAa;AACpD,YAAMA,WAAU,cAAc,YAAY,GAAG;AAC7C,YAAM,MAAMA,SAAQ,iBAAiB;AACrC,cAAQ,IAAI,YAAY,IAAI,OAAO,EAAE;AAAA,IACvC,QAAQ;AACN,cAAQ,IAAI,oBAAoB;AAAA,IAClC;AACA;AAAA,EACF;AAEA,MAAI,YAAY,WAAW;AACzB,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,CAAC,KAAK;AACR,cAAQ,MAAM,kCAAkC;AAChD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,kBAAc,GAAG;AACjB;AAAA,EACF;AAEA,MAAI,YAAY,aAAa;AAC3B,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,CAAC,KAAK;AACR,cAAQ,MAAM,oCAAoC;AAClD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,oBAAgB,GAAG;AACnB;AAAA,EACF;AAEA,MAAI,YAAY,WAAW;AACzB,UAAM,UAAU,YAAY;AAC5B,UAAM,UAAU,OAAO,QAAQ,OAAO;AACtC,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,IAAI,uBAAuB;AAAA,IACrC,OAAO;AACL,cAAQ,IAAI,oBAAoB;AAChC,iBAAW,CAAC,MAAM,OAAO,KAAK,SAAS;AACrC,gBAAQ,IAAI,KAAK,IAAI,IAAI,OAAO,EAAE;AAAA,MACpC;AAAA,IACF;AACA;AAAA,EACF;AAGA,MAAI,WAAW,CAAC,QAAQ,WAAW,GAAG,GAAG;AACvC,YAAQ,MAAM,oBAAoB,OAAO,EAAE;AAC3C,cAAU;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,oBAAW;AAChD,QAAM,YAAY;AACpB;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,UAAQ,MAAM,UAAU,GAAG;AAC3B,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["require"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli.ts","../../src/core/api-client.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { setDefaultAutoSelectFamily } from \"node:net\";\nsetDefaultAutoSelectFamily(false);\n\nimport { installPlugin, uninstallPlugin, listPlugins } from './core/plugin-manager.js'\nimport { readApiPort, removeStalePortFile, apiCall } from './core/api-client.js'\n\nconst NPM_PACKAGE = '@openacp/cli'\n\nconst args = process.argv.slice(2);\nconst command = args[0];\n\nfunction getCurrentVersion(): string {\n try {\n const { createRequire } = require('node:module') as typeof import('node:module')\n const req = createRequire(import.meta.url)\n const pkg = req('../package.json')\n return pkg.version as string\n } catch {\n return '0.0.0-dev'\n }\n}\n\nasync function getLatestVersion(): Promise<string | null> {\n try {\n const res = await fetch(`https://registry.npmjs.org/${NPM_PACKAGE}/latest`, {\n signal: AbortSignal.timeout(5000),\n })\n if (!res.ok) return null\n const data = (await res.json()) as { version?: string }\n return data.version ?? null\n } catch {\n return null\n }\n}\n\nfunction compareVersions(current: string, latest: string): -1 | 0 | 1 {\n const a = current.split('.').map(Number)\n const b = latest.split('.').map(Number)\n for (let i = 0; i < 3; i++) {\n if ((a[i] ?? 0) < (b[i] ?? 0)) return -1\n if ((a[i] ?? 0) > (b[i] ?? 0)) return 1\n }\n return 0\n}\n\nasync function runUpdate(): Promise<boolean> {\n const { spawn } = await import('node:child_process')\n return new Promise((resolve) => {\n const child = spawn('npm', ['install', '-g', `${NPM_PACKAGE}@latest`], {\n stdio: 'inherit',\n shell: true,\n })\n const onSignal = () => {\n child.kill('SIGTERM')\n resolve(false)\n }\n process.on('SIGINT', onSignal)\n process.on('SIGTERM', onSignal)\n child.on('close', (code) => {\n process.off('SIGINT', onSignal)\n process.off('SIGTERM', onSignal)\n resolve(code === 0)\n })\n })\n}\n\nasync function checkAndPromptUpdate(): Promise<void> {\n const current = getCurrentVersion()\n if (current === '0.0.0-dev') return\n\n const latest = await getLatestVersion()\n if (!latest || compareVersions(current, latest) >= 0) return\n\n console.log(`\\x1b[33mUpdate available: v${current} → v${latest}\\x1b[0m`)\n const { confirm } = await import('@inquirer/prompts')\n const yes = await confirm({\n message: 'Update now before starting?',\n default: true,\n })\n if (yes) {\n const ok = await runUpdate()\n if (ok) {\n console.log(`\\x1b[32m✓ Updated to v${latest}. Please re-run your command.\\x1b[0m`)\n process.exit(0)\n } else {\n console.error('\\x1b[31mUpdate failed. Continuing with current version.\\x1b[0m')\n }\n }\n}\n\nfunction printHelp(): void {\n console.log(`\nOpenACP - Self-hosted bridge for AI coding agents\n\nUsage:\n openacp Start (mode from config)\n openacp start Start as background daemon\n openacp stop Stop background daemon\n openacp status Show daemon status\n openacp logs Tail daemon log file\n openacp config Edit configuration\n openacp reset Delete all data and start fresh\n openacp update Update to latest version\n openacp install <package> Install a plugin adapter\n openacp uninstall <package> Uninstall a plugin adapter\n openacp plugins List installed plugins\n openacp --foreground Force foreground mode\n openacp --version Show version\n openacp --help Show this help\n\nRuntime (requires running daemon):\n openacp runtime new [agent] [workspace] Create a new session\n openacp runtime cancel <id> Cancel a session\n openacp runtime status Show active sessions\n openacp runtime agents List available agents\n\nNote: \"openacp status\" shows daemon process health.\n \"openacp runtime status\" shows active agent sessions.\n\nInstall:\n npm install -g @openacp/cli\n\nExamples:\n openacp\n openacp install @openacp/adapter-discord\n openacp uninstall @openacp/adapter-discord\n`)\n}\n\nasync function main() {\n if (command === \"--help\" || command === \"-h\") {\n printHelp();\n return;\n }\n\n if (command === \"--version\" || command === \"-v\") {\n // In published build: read version from own package.json via createRequire\n // In dev: fallback to 'dev'\n try {\n const { createRequire } = await import(\"node:module\");\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\");\n console.log(`openacp v${pkg.version}`);\n } catch {\n console.log(\"openacp v0.0.0-dev\");\n }\n return;\n }\n\n if (command === \"install\") {\n const pkg = args[1];\n if (!pkg) {\n console.error(\"Usage: openacp install <package>\");\n process.exit(1);\n }\n installPlugin(pkg);\n return;\n }\n\n if (command === \"uninstall\") {\n const pkg = args[1];\n if (!pkg) {\n console.error(\"Usage: openacp uninstall <package>\");\n process.exit(1);\n }\n uninstallPlugin(pkg);\n return;\n }\n\n if (command === \"plugins\") {\n const plugins = listPlugins();\n const entries = Object.entries(plugins);\n if (entries.length === 0) {\n console.log(\"No plugins installed.\");\n } else {\n console.log(\"Installed plugins:\");\n for (const [name, version] of entries) {\n console.log(` ${name}@${version}`);\n }\n }\n return;\n }\n\n if (command === 'runtime') {\n const subCmd = args[1]\n\n const port = readApiPort()\n if (port === null) {\n console.error('OpenACP is not running. Start with `openacp start`')\n process.exit(1)\n }\n\n try {\n if (subCmd === 'new') {\n const agent = args[2]\n const workspaceIdx = args.indexOf('--workspace')\n const workspace = workspaceIdx !== -1 ? args[workspaceIdx + 1] : args[3]\n const body: Record<string, string> = {}\n if (agent) body.agent = agent\n if (workspace) body.workspace = workspace\n\n const res = await apiCall(port, '/api/sessions', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n })\n const data = await res.json() as Record<string, unknown>\n if (!res.ok) {\n console.error(`Error: ${data.error}`)\n process.exit(1)\n }\n console.log('Session created')\n console.log(` ID : ${data.sessionId}`)\n console.log(` Agent : ${data.agent}`)\n console.log(` Workspace : ${data.workspace}`)\n console.log(` Status : ${data.status}`)\n\n } else if (subCmd === 'cancel') {\n const sessionId = args[2]\n if (!sessionId) {\n console.error('Usage: openacp runtime cancel <session-id>')\n process.exit(1)\n }\n const res = await apiCall(port, `/api/sessions/${encodeURIComponent(sessionId)}`, {\n method: 'DELETE',\n })\n const data = await res.json() as Record<string, unknown>\n if (!res.ok) {\n console.error(`Error: ${data.error}`)\n process.exit(1)\n }\n console.log(`Session ${sessionId} cancelled`)\n\n } else if (subCmd === 'status') {\n const res = await apiCall(port, '/api/sessions')\n const data = await res.json() as { sessions: Array<{ id: string; agent: string; status: string; name: string | null }> }\n if (data.sessions.length === 0) {\n console.log('No active sessions.')\n } else {\n console.log(`Active sessions: ${data.sessions.length}\\n`)\n for (const s of data.sessions) {\n const name = s.name ? ` \"${s.name}\"` : ''\n console.log(` ${s.id} ${s.agent} ${s.status}${name}`)\n }\n }\n\n } else if (subCmd === 'agents') {\n const res = await apiCall(port, '/api/agents')\n const data = await res.json() as { agents: Array<{ name: string; command: string; args: string[] }>; default: string }\n console.log('Available agents:')\n for (const a of data.agents) {\n const isDefault = a.name === data.default ? ' (default)' : ''\n console.log(` ${a.name}${isDefault}`)\n }\n\n } else {\n console.error(`Unknown runtime command: ${subCmd || '(none)'}\\n`)\n console.log('Usage:')\n console.log(' openacp runtime new [agent] [workspace] Create a new session')\n console.log(' openacp runtime cancel <id> Cancel a session')\n console.log(' openacp runtime status Show active sessions')\n console.log(' openacp runtime agents List available agents')\n process.exit(1)\n }\n } catch (err) {\n if (err instanceof TypeError && (err as any).cause?.code === 'ECONNREFUSED') {\n console.error('OpenACP is not running (stale port file)')\n removeStalePortFile()\n process.exit(1)\n }\n throw err\n }\n return\n }\n\n if (command === 'start') {\n await checkAndPromptUpdate()\n const { startDaemon, getPidPath } = await import('./core/daemon.js')\n const { ConfigManager } = await import('./core/config.js')\n const cm = new ConfigManager()\n if (await cm.exists()) {\n await cm.load()\n const config = cm.get()\n const result = startDaemon(getPidPath(), config.logging.logDir)\n if ('error' in result) {\n console.error(result.error)\n process.exit(1)\n }\n console.log(`OpenACP daemon started (PID ${result.pid})`)\n } else {\n console.error('No config found. Run \"openacp\" first to set up.')\n process.exit(1)\n }\n return\n }\n\n if (command === 'stop') {\n const { stopDaemon } = await import('./core/daemon.js')\n const result = stopDaemon()\n if (result.stopped) {\n console.log(`OpenACP daemon stopped (was PID ${result.pid})`)\n } else {\n console.error(result.error)\n process.exit(1)\n }\n return\n }\n\n if (command === 'status') {\n const { getStatus } = await import('./core/daemon.js')\n const status = getStatus()\n if (status.running) {\n console.log(`OpenACP is running (PID ${status.pid})`)\n } else {\n console.log('OpenACP is not running')\n }\n return\n }\n\n if (command === 'logs') {\n const { spawn } = await import('node:child_process')\n const { ConfigManager, expandHome } = await import('./core/config.js')\n const pathMod = await import('node:path')\n const cm = new ConfigManager()\n let logDir = '~/.openacp/logs'\n if (await cm.exists()) {\n await cm.load()\n logDir = cm.get().logging.logDir\n }\n const logFile = pathMod.join(expandHome(logDir), 'openacp.log')\n const tail = spawn('tail', ['-f', '-n', '50', logFile], { stdio: 'inherit' })\n tail.on('error', (err: Error) => {\n console.error(`Cannot tail log file: ${err.message}`)\n process.exit(1)\n })\n return\n }\n\n if (command === 'config') {\n const { runConfigEditor } = await import('./core/config-editor.js')\n const { ConfigManager } = await import('./core/config.js')\n const cm = new ConfigManager()\n if (!(await cm.exists())) {\n console.error('No config found. Run \"openacp\" first to set up.')\n process.exit(1)\n }\n await runConfigEditor(cm)\n return\n }\n\n if (command === 'reset') {\n const { getStatus } = await import('./core/daemon.js')\n const status = getStatus()\n if (status.running) {\n console.error('OpenACP is running. Stop it first: openacp stop')\n process.exit(1)\n }\n\n const { confirm } = await import('@inquirer/prompts')\n const yes = await confirm({\n message: 'This will delete all OpenACP data (~/.openacp). You will need to set up again. Continue?',\n default: false,\n })\n if (!yes) {\n console.log('Aborted.')\n return\n }\n\n const { uninstallAutoStart } = await import('./core/autostart.js')\n uninstallAutoStart()\n\n const fs = await import('node:fs')\n const os = await import('node:os')\n const path = await import('node:path')\n const openacpDir = path.join(os.homedir(), '.openacp')\n fs.rmSync(openacpDir, { recursive: true, force: true })\n\n console.log('Reset complete. Run `openacp` to set up again.')\n return\n }\n\n if (command === 'update') {\n const current = getCurrentVersion()\n const latest = await getLatestVersion()\n if (!latest) {\n console.error('Could not check for updates. Check your internet connection.')\n process.exit(1)\n }\n if (compareVersions(current, latest) >= 0) {\n console.log(`Already up to date (v${current})`)\n return\n }\n console.log(`Update available: v${current} → v${latest}`)\n const ok = await runUpdate()\n if (ok) {\n console.log(`\\x1b[32m✓ Updated to v${latest}\\x1b[0m`)\n } else {\n console.error('Update failed. Try manually: npm install -g @openacp/cli@latest')\n process.exit(1)\n }\n return\n }\n\n // Handle --daemon-child (internal flag for background server)\n if (command === '--daemon-child') {\n const { startServer } = await import('./main.js')\n await startServer()\n return\n }\n\n // Handle --foreground flag\n const forceForeground = command === '--foreground'\n\n // Reject unknown commands\n if (command && !command.startsWith('-')) {\n console.error(`Unknown command: ${command}`)\n printHelp()\n process.exit(1)\n }\n\n // Check for updates before starting\n await checkAndPromptUpdate()\n\n // Default: start server based on config runMode\n const { ConfigManager } = await import('./core/config.js')\n const cm = new ConfigManager()\n\n // If no config, run setup first\n if (!(await cm.exists())) {\n const { runSetup } = await import('./core/setup.js')\n const shouldStart = await runSetup(cm)\n if (!shouldStart) process.exit(0)\n // Config now exists — fall through to read runMode and start accordingly\n }\n\n await cm.load()\n const config = cm.get()\n\n if (!forceForeground && config.runMode === 'daemon') {\n // Daemon mode: spawn background process\n const { startDaemon, getPidPath } = await import('./core/daemon.js')\n const result = startDaemon(getPidPath(), config.logging.logDir)\n if ('error' in result) {\n console.error(result.error)\n process.exit(1)\n }\n console.log(`OpenACP daemon started (PID ${result.pid})`)\n return\n }\n\n // Foreground mode — mark as running so auto-start works on next boot\n const { markRunning } = await import('./core/daemon.js')\n markRunning()\n const { startServer } = await import('./main.js')\n await startServer()\n}\n\nmain().catch((err) => {\n console.error(\"Fatal:\", err);\n process.exit(1);\n});\n","import * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport * as os from 'node:os'\n\nconst DEFAULT_PORT_FILE = path.join(os.homedir(), '.openacp', 'api.port')\n\nexport function readApiPort(portFilePath: string = DEFAULT_PORT_FILE): number | null {\n try {\n const content = fs.readFileSync(portFilePath, 'utf-8').trim()\n const port = parseInt(content, 10)\n return isNaN(port) ? null : port\n } catch {\n return null\n }\n}\n\nexport function removeStalePortFile(portFilePath: string = DEFAULT_PORT_FILE): void {\n try {\n fs.unlinkSync(portFilePath)\n } catch {\n // ignore\n }\n}\n\nexport async function apiCall(\n port: number,\n urlPath: string,\n options?: RequestInit,\n): Promise<Response> {\n return fetch(`http://127.0.0.1:${port}${urlPath}`, options)\n}\n"],"mappings":"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","names":["require","ConfigManager","cm","config","fs","os","path","startServer"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ConfigManager,
|
|
3
|
+
ConfigSchema,
|
|
4
|
+
PLUGINS_DIR,
|
|
5
|
+
expandHome
|
|
6
|
+
} from "./chunk-FGXG3H3F.js";
|
|
7
|
+
import "./chunk-MNJDYDGH.js";
|
|
8
|
+
export {
|
|
9
|
+
ConfigManager,
|
|
10
|
+
ConfigSchema,
|
|
11
|
+
PLUGINS_DIR,
|
|
12
|
+
expandHome
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=config-2XALNLAA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import {
|
|
2
|
+
runConfigEditor
|
|
3
|
+
} from "./chunk-QWUJIKTX.js";
|
|
4
|
+
import "./chunk-PQRVTUNH.js";
|
|
5
|
+
import "./chunk-4BN7NSKB.js";
|
|
6
|
+
import "./chunk-FGXG3H3F.js";
|
|
7
|
+
import "./chunk-MNJDYDGH.js";
|
|
8
|
+
export {
|
|
9
|
+
runConfigEditor
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=config-editor-56B6YU7B.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import {
|
|
2
|
+
clearRunning,
|
|
3
|
+
getPidPath,
|
|
4
|
+
getStatus,
|
|
5
|
+
isProcessRunning,
|
|
6
|
+
markRunning,
|
|
7
|
+
readPidFile,
|
|
8
|
+
removePidFile,
|
|
9
|
+
shouldAutoStart,
|
|
10
|
+
startDaemon,
|
|
11
|
+
stopDaemon,
|
|
12
|
+
writePidFile
|
|
13
|
+
} from "./chunk-S6O7SM6A.js";
|
|
14
|
+
import "./chunk-FGXG3H3F.js";
|
|
15
|
+
import "./chunk-MNJDYDGH.js";
|
|
16
|
+
export {
|
|
17
|
+
clearRunning,
|
|
18
|
+
getPidPath,
|
|
19
|
+
getStatus,
|
|
20
|
+
isProcessRunning,
|
|
21
|
+
markRunning,
|
|
22
|
+
readPidFile,
|
|
23
|
+
removePidFile,
|
|
24
|
+
shouldAutoStart,
|
|
25
|
+
startDaemon,
|
|
26
|
+
stopDaemon,
|
|
27
|
+
writePidFile
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=daemon-3E5OMLT3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|