@openacp/cli 0.3.2 → 0.4.2

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 (49) hide show
  1. package/README.md +1 -1
  2. package/dist/{autostart-N4HIL6C3.js → autostart-DZ3MHHMM.js} +3 -3
  3. package/dist/{chunk-LVSQQRCF.js → chunk-2SY7Y2VB.js} +3 -3
  4. package/dist/{chunk-7W5SOJPD.js → chunk-3QACY5E3.js} +2 -2
  5. package/dist/{chunk-CA6FXPLH.js → chunk-BLVZFCKN.js} +4 -4
  6. package/dist/chunk-KSIQZC3J.js +98 -0
  7. package/dist/chunk-KSIQZC3J.js.map +1 -0
  8. package/dist/{chunk-JOSJGZGF.js → chunk-LYKCQTH5.js} +1 -9
  9. package/dist/{chunk-JOSJGZGF.js.map → chunk-LYKCQTH5.js.map} +1 -1
  10. package/dist/{chunk-5E6ZXCNN.js → chunk-MRKYJ422.js} +2 -2
  11. package/dist/{chunk-RBDPCHGD.js → chunk-V3BA2MJ6.js} +2 -2
  12. package/dist/{chunk-YXMRR2E3.js → chunk-WF5XDN4D.js} +65 -40
  13. package/dist/chunk-WF5XDN4D.js.map +1 -0
  14. package/dist/{chunk-NS2L445T.js → chunk-WHKLPZGK.js} +4 -4
  15. package/dist/{chunk-66PHSLNS.js → chunk-WXPN5UOT.js} +599 -323
  16. package/dist/chunk-WXPN5UOT.js.map +1 -0
  17. package/dist/cli.js +258 -316
  18. package/dist/cli.js.map +1 -1
  19. package/dist/{config-2CBRLF3R.js → config-J5YQOMDU.js} +3 -3
  20. package/dist/config-editor-IXL4BFG3.js +11 -0
  21. package/dist/{daemon-UXC7PB4P.js → daemon-SLGQGRKO.js} +4 -4
  22. package/dist/index.d.ts +184 -71
  23. package/dist/index.js +18 -10
  24. package/dist/install-cloudflared-ILUXKLAC.js +8 -0
  25. package/dist/{main-P3OUOY7X.js → main-5QGMP7VG.js} +53 -17
  26. package/dist/main-5QGMP7VG.js.map +1 -0
  27. package/dist/{setup-UKWBLJIT.js → setup-JQZBPXWS.js} +4 -4
  28. package/dist/{tunnel-service-4GISQZNP.js → tunnel-service-DASSH7OA.js} +3 -3
  29. package/dist/version-VC5CPXBX.js +15 -0
  30. package/dist/version-VC5CPXBX.js.map +1 -0
  31. package/package.json +1 -1
  32. package/dist/chunk-66PHSLNS.js.map +0 -1
  33. package/dist/chunk-YXMRR2E3.js.map +0 -1
  34. package/dist/config-editor-UN56HQCW.js +0 -11
  35. package/dist/install-cloudflared-LMM7MFQX.js +0 -8
  36. package/dist/main-P3OUOY7X.js.map +0 -1
  37. /package/dist/{autostart-N4HIL6C3.js.map → autostart-DZ3MHHMM.js.map} +0 -0
  38. /package/dist/{chunk-LVSQQRCF.js.map → chunk-2SY7Y2VB.js.map} +0 -0
  39. /package/dist/{chunk-7W5SOJPD.js.map → chunk-3QACY5E3.js.map} +0 -0
  40. /package/dist/{chunk-CA6FXPLH.js.map → chunk-BLVZFCKN.js.map} +0 -0
  41. /package/dist/{chunk-5E6ZXCNN.js.map → chunk-MRKYJ422.js.map} +0 -0
  42. /package/dist/{chunk-RBDPCHGD.js.map → chunk-V3BA2MJ6.js.map} +0 -0
  43. /package/dist/{chunk-NS2L445T.js.map → chunk-WHKLPZGK.js.map} +0 -0
  44. /package/dist/{config-2CBRLF3R.js.map → config-J5YQOMDU.js.map} +0 -0
  45. /package/dist/{config-editor-UN56HQCW.js.map → config-editor-IXL4BFG3.js.map} +0 -0
  46. /package/dist/{daemon-UXC7PB4P.js.map → daemon-SLGQGRKO.js.map} +0 -0
  47. /package/dist/{install-cloudflared-LMM7MFQX.js.map → install-cloudflared-ILUXKLAC.js.map} +0 -0
  48. /package/dist/{setup-UKWBLJIT.js.map → setup-JQZBPXWS.js.map} +0 -0
  49. /package/dist/{tunnel-service-4GISQZNP.js.map → tunnel-service-DASSH7OA.js.map} +0 -0
@@ -3,29 +3,30 @@ import {
3
3
  ApiServer,
4
4
  OpenACPCore,
5
5
  TelegramAdapter
6
- } from "./chunk-66PHSLNS.js";
6
+ } from "./chunk-WXPN5UOT.js";
7
+ import "./chunk-WHKLPZGK.js";
7
8
  import {
8
9
  loadAdapterFactory
9
- } from "./chunk-LVSQQRCF.js";
10
- import "./chunk-7W5SOJPD.js";
11
- import "./chunk-NS2L445T.js";
12
- import "./chunk-5E6ZXCNN.js";
13
- import "./chunk-CA6FXPLH.js";
10
+ } from "./chunk-2SY7Y2VB.js";
11
+ import "./chunk-3QACY5E3.js";
12
+ import "./chunk-MRKYJ422.js";
13
+ import "./chunk-BLVZFCKN.js";
14
14
  import {
15
15
  ConfigManager
16
- } from "./chunk-YXMRR2E3.js";
16
+ } from "./chunk-WF5XDN4D.js";
17
17
  import {
18
18
  cleanupOldSessionLogs,
19
19
  initLogger,
20
20
  log,
21
21
  shutdownLogger
22
- } from "./chunk-JOSJGZGF.js";
22
+ } from "./chunk-LYKCQTH5.js";
23
23
 
24
24
  // src/main.ts
25
+ var RESTART_EXIT_CODE = 75;
25
26
  var shuttingDown = false;
26
27
  async function startServer() {
27
28
  if (process.argv.includes("--daemon-child")) {
28
- const { writePidFile, readPidFile, getPidPath, shouldAutoStart } = await import("./daemon-UXC7PB4P.js");
29
+ const { writePidFile, readPidFile, getPidPath, shouldAutoStart } = await import("./daemon-SLGQGRKO.js");
29
30
  if (!shouldAutoStart()) {
30
31
  process.exit(0);
31
32
  }
@@ -44,7 +45,7 @@ async function startServer() {
44
45
  const configManager = new ConfigManager();
45
46
  const configExists = await configManager.exists();
46
47
  if (!configExists) {
47
- const { runSetup } = await import("./setup-UKWBLJIT.js");
48
+ const { runSetup } = await import("./setup-JQZBPXWS.js");
48
49
  const shouldStart = await runSetup(configManager);
49
50
  if (!shouldStart) process.exit(0);
50
51
  }
@@ -58,7 +59,7 @@ async function startServer() {
58
59
  const core = new OpenACPCore(configManager);
59
60
  let tunnelService;
60
61
  if (config.tunnel.enabled) {
61
- const { TunnelService } = await import("./tunnel-service-4GISQZNP.js");
62
+ const { TunnelService } = await import("./tunnel-service-DASSH7OA.js");
62
63
  tunnelService = new TunnelService(config.tunnel);
63
64
  const publicUrl = await tunnelService.start();
64
65
  core.tunnelService = tunnelService;
@@ -89,10 +90,10 @@ async function startServer() {
89
90
  process.exit(1);
90
91
  }
91
92
  let apiServer;
92
- const shutdown = async (signal) => {
93
+ const shutdown = async (signal, exitCode = 0) => {
93
94
  if (shuttingDown) return;
94
95
  shuttingDown = true;
95
- log.info({ signal }, "Signal received, shutting down");
96
+ log.info({ signal, exitCode }, "Signal received, shutting down");
96
97
  try {
97
98
  if (apiServer) await apiServer.stop();
98
99
  await core.stop();
@@ -100,13 +101,47 @@ async function startServer() {
100
101
  } catch (err) {
101
102
  log.error({ err }, "Error during shutdown");
102
103
  }
103
- if (process.argv.includes("--daemon-child")) {
104
- const { removePidFile, getPidPath } = await import("./daemon-UXC7PB4P.js");
104
+ const isDaemon = process.argv.includes("--daemon-child");
105
+ if (isDaemon) {
106
+ const { removePidFile, getPidPath } = await import("./daemon-SLGQGRKO.js");
105
107
  removePidFile(getPidPath());
106
108
  }
109
+ if (exitCode === RESTART_EXIT_CODE) {
110
+ if (isDaemon) {
111
+ const { spawn: spawnChild } = await import("child_process");
112
+ const { expandHome } = await import("./config-J5YQOMDU.js");
113
+ const fs = await import("fs");
114
+ const pathMod = await import("path");
115
+ const cliPath = pathMod.resolve(process.argv[1]);
116
+ const resolvedLogDir = expandHome(config.logging.logDir);
117
+ fs.mkdirSync(resolvedLogDir, { recursive: true });
118
+ const logFile = pathMod.join(resolvedLogDir, "openacp.log");
119
+ const out = fs.openSync(logFile, "a");
120
+ const err = fs.openSync(logFile, "a");
121
+ const child = spawnChild(process.execPath, [cliPath, "--daemon-child"], {
122
+ detached: true,
123
+ stdio: ["ignore", out, err],
124
+ env: { ...process.env, OPENACP_SKIP_UPDATE_CHECK: "1" }
125
+ });
126
+ fs.closeSync(out);
127
+ fs.closeSync(err);
128
+ child.unref();
129
+ log.info({ newPid: child.pid }, "Respawned daemon for restart");
130
+ } else if (!process.env.OPENACP_DEV_LOOP) {
131
+ const { spawn: spawnChild } = await import("child_process");
132
+ const child = spawnChild(process.execPath, process.argv.slice(1), {
133
+ stdio: "inherit",
134
+ env: { ...process.env, OPENACP_SKIP_UPDATE_CHECK: "1" }
135
+ });
136
+ await shutdownLogger();
137
+ child.on("exit", (code) => process.exit(code ?? 0));
138
+ return;
139
+ }
140
+ }
107
141
  await shutdownLogger();
108
- process.exit(0);
142
+ process.exit(exitCode);
109
143
  };
144
+ core.requestRestart = () => shutdown("restart", RESTART_EXIT_CODE);
110
145
  process.on("SIGINT", () => shutdown("SIGINT"));
111
146
  process.on("SIGTERM", () => shutdown("SIGTERM"));
112
147
  process.on("uncaughtException", (err) => {
@@ -130,6 +165,7 @@ if (isDirectExecution) {
130
165
  });
131
166
  }
132
167
  export {
168
+ RESTART_EXIT_CODE,
133
169
  startServer
134
170
  };
135
- //# sourceMappingURL=main-P3OUOY7X.js.map
171
+ //# sourceMappingURL=main-5QGMP7VG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/main.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { ConfigManager } from './core/config.js'\nimport { OpenACPCore } from './core/core.js'\nimport { loadAdapterFactory } from './core/plugin-manager.js'\nimport { initLogger, shutdownLogger, cleanupOldSessionLogs, log } from './core/log.js'\nimport { TelegramAdapter } from './adapters/telegram/index.js'\nimport { ApiServer } from './core/api-server.js'\n\nexport const RESTART_EXIT_CODE = 75\nlet shuttingDown = false\n\nexport async function startServer() {\n // 0. If running as daemon child, check state and write PID file\n if (process.argv.includes('--daemon-child')) {\n const { writePidFile, readPidFile, getPidPath, shouldAutoStart } = await import('./core/daemon.js')\n\n // Only auto-start if the daemon was previously running (user started it)\n if (!shouldAutoStart()) {\n process.exit(0)\n }\n\n const pidPath = getPidPath()\n const existingPid = readPidFile(pidPath)\n if (existingPid !== null && existingPid !== process.pid) {\n try {\n process.kill(existingPid, 0)\n console.error(`Another OpenACP instance is already running (PID ${existingPid}). Exiting.`)\n process.exit(1)\n } catch {\n // Stale PID file — safe to overwrite\n }\n }\n writePidFile(pidPath, process.pid)\n }\n\n // 1. Check config exists, run setup if not\n const configManager = new ConfigManager()\n const configExists = await configManager.exists()\n\n if (!configExists) {\n const { runSetup } = await import('./core/setup.js')\n const shouldStart = await runSetup(configManager)\n if (!shouldStart) process.exit(0)\n }\n\n // 2. Load config (validates with Zod)\n await configManager.load()\n const config = configManager.get()\n initLogger(config.logging)\n log.info({ configPath: configManager.getConfigPath() }, 'Config loaded')\n\n // Async cleanup of old session logs (non-blocking)\n cleanupOldSessionLogs(config.logging.sessionLogRetentionDays).catch(err =>\n log.warn({ err }, 'Session log cleanup failed')\n )\n\n // 3. Create core\n const core = new OpenACPCore(configManager)\n\n // 3.5 Start tunnel if configured\n let tunnelService: import('./tunnel/tunnel-service.js').TunnelService | undefined\n if (config.tunnel.enabled) {\n const { TunnelService } = await import('./tunnel/tunnel-service.js')\n tunnelService = new TunnelService(config.tunnel)\n const publicUrl = await tunnelService.start()\n core.tunnelService = tunnelService\n log.info({ publicUrl }, 'Tunnel started')\n }\n\n // 4. Register adapters from config\n for (const [channelName, channelConfig] of Object.entries(config.channels)) {\n if (!channelConfig.enabled) continue\n\n if (channelName === 'telegram') {\n core.registerAdapter('telegram', new TelegramAdapter(core, channelConfig as any))\n log.info({ adapter: 'telegram' }, 'Adapter registered')\n } else if (channelConfig.adapter) {\n // Plugin adapter\n const factory = await loadAdapterFactory(channelConfig.adapter)\n if (factory) {\n const adapter = factory.createAdapter(core, channelConfig)\n core.registerAdapter(channelName, adapter)\n log.info({ adapter: channelName, plugin: channelConfig.adapter }, 'Adapter registered')\n } else {\n const name = channelName\n const err = channelConfig.adapter\n log.error({ adapter: name, err }, 'Failed to load adapter')\n }\n } else {\n log.error({ adapter: channelName }, 'Channel has no built-in adapter; set \"adapter\" field to a plugin package')\n }\n }\n\n if (core.adapters.size === 0) {\n log.error('No channels enabled. Enable at least one channel in config.')\n process.exit(1)\n }\n\n // 5. Start\n let apiServer: ApiServer | undefined\n\n const shutdown = async (signal: string, exitCode = 0) => {\n if (shuttingDown) return\n shuttingDown = true\n log.info({ signal, exitCode }, 'Signal received, shutting down')\n\n try {\n if (apiServer) await apiServer.stop()\n await core.stop()\n if (tunnelService) await tunnelService.stop()\n } catch (err) {\n log.error({ err }, 'Error during shutdown')\n }\n\n const isDaemon = process.argv.includes('--daemon-child')\n\n // Clean up PID file if running as daemon\n if (isDaemon) {\n const { removePidFile, getPidPath } = await import('./core/daemon.js')\n removePidFile(getPidPath())\n }\n\n // Self-respawn on restart\n if (exitCode === RESTART_EXIT_CODE) {\n if (isDaemon) {\n // Daemon mode: spawn detached child writing to log file\n const { spawn: spawnChild } = await import('node:child_process')\n const { expandHome } = await import('./core/config.js')\n const fs = await import('node:fs')\n const pathMod = await import('node:path')\n\n const cliPath = pathMod.resolve(process.argv[1])\n const resolvedLogDir = expandHome(config.logging.logDir)\n fs.mkdirSync(resolvedLogDir, { recursive: true })\n const logFile = pathMod.join(resolvedLogDir, 'openacp.log')\n const out = fs.openSync(logFile, 'a')\n const err = fs.openSync(logFile, 'a')\n\n const child = spawnChild(process.execPath, [cliPath, '--daemon-child'], {\n detached: true,\n stdio: ['ignore', out, err],\n env: { ...process.env, OPENACP_SKIP_UPDATE_CHECK: '1' },\n })\n fs.closeSync(out)\n fs.closeSync(err)\n child.unref()\n log.info({ newPid: child.pid }, 'Respawned daemon for restart')\n } else if (!process.env.OPENACP_DEV_LOOP) {\n // Foreground production mode: spawn replacement process with inherited stdio\n const { spawn: spawnChild } = await import('node:child_process')\n const child = spawnChild(process.execPath, process.argv.slice(1), {\n stdio: 'inherit',\n env: { ...process.env, OPENACP_SKIP_UPDATE_CHECK: '1' },\n })\n await shutdownLogger()\n child.on('exit', (code) => process.exit(code ?? 0))\n return\n }\n }\n\n await shutdownLogger()\n process.exit(exitCode)\n }\n\n // Expose restart trigger for adapters (e.g. /restart command)\n core.requestRestart = () => shutdown('restart', RESTART_EXIT_CODE)\n\n process.on('SIGINT', () => shutdown('SIGINT'))\n process.on('SIGTERM', () => shutdown('SIGTERM'))\n\n process.on('uncaughtException', (err) => {\n log.error({ err }, 'Uncaught exception')\n })\n\n process.on('unhandledRejection', (err) => {\n log.error({ err }, 'Unhandled rejection')\n })\n\n await core.start()\n\n apiServer = new ApiServer(core, config.api)\n await apiServer.start()\n\n // 6. Log ready\n const agents = Object.keys(config.agents)\n log.info({ agents }, 'OpenACP started')\n log.info('Press Ctrl+C to stop')\n}\n\n// Direct execution for dev (node dist/main.js)\nconst isDirectExecution = process.argv[1]?.endsWith('main.js')\nif (isDirectExecution) {\n startServer().catch((err) => {\n log.error({ err }, 'Fatal error')\n process.exit(1)\n })\n}\n"],"mappings":"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","names":[]}
@@ -9,9 +9,9 @@ import {
9
9
  validateBotAdmin,
10
10
  validateBotToken,
11
11
  validateChatId
12
- } from "./chunk-CA6FXPLH.js";
13
- import "./chunk-YXMRR2E3.js";
14
- import "./chunk-JOSJGZGF.js";
12
+ } from "./chunk-BLVZFCKN.js";
13
+ import "./chunk-WF5XDN4D.js";
14
+ import "./chunk-LYKCQTH5.js";
15
15
  export {
16
16
  detectAgents,
17
17
  runSetup,
@@ -24,4 +24,4 @@ export {
24
24
  validateBotToken,
25
25
  validateChatId
26
26
  };
27
- //# sourceMappingURL=setup-UKWBLJIT.js.map
27
+ //# sourceMappingURL=setup-JQZBPXWS.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  ensureCloudflared
3
- } from "./chunk-RBDPCHGD.js";
3
+ } from "./chunk-V3BA2MJ6.js";
4
4
  import {
5
5
  createChildLogger
6
- } from "./chunk-JOSJGZGF.js";
6
+ } from "./chunk-LYKCQTH5.js";
7
7
 
8
8
  // src/tunnel/tunnel-service.ts
9
9
  import { serve } from "@hono/node-server";
@@ -936,4 +936,4 @@ var TunnelService = class {
936
936
  export {
937
937
  TunnelService
938
938
  };
939
- //# sourceMappingURL=tunnel-service-4GISQZNP.js.map
939
+ //# sourceMappingURL=tunnel-service-DASSH7OA.js.map
@@ -0,0 +1,15 @@
1
+ import {
2
+ checkAndPromptUpdate,
3
+ compareVersions,
4
+ getCurrentVersion,
5
+ getLatestVersion,
6
+ runUpdate
7
+ } from "./chunk-KSIQZC3J.js";
8
+ export {
9
+ checkAndPromptUpdate,
10
+ compareVersions,
11
+ getCurrentVersion,
12
+ getLatestVersion,
13
+ runUpdate
14
+ };
15
+ //# sourceMappingURL=version-VC5CPXBX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openacp/cli",
3
- "version": "0.3.2",
3
+ "version": "0.4.2",
4
4
  "description": "Self-hosted bridge for AI coding agents via ACP protocol",
5
5
  "type": "module",
6
6
  "bin": {