@openacp/cli 0.3.1 → 0.4.1

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 (48) hide show
  1. package/dist/{autostart-N4HIL6C3.js → autostart-DZ3MHHMM.js} +3 -3
  2. package/dist/{chunk-LVSQQRCF.js → chunk-2SY7Y2VB.js} +3 -3
  3. package/dist/{chunk-7W5SOJPD.js → chunk-3QACY5E3.js} +2 -2
  4. package/dist/{chunk-CA6FXPLH.js → chunk-BLVZFCKN.js} +4 -4
  5. package/dist/chunk-KSIQZC3J.js +98 -0
  6. package/dist/chunk-KSIQZC3J.js.map +1 -0
  7. package/dist/{chunk-JOSJGZGF.js → chunk-LYKCQTH5.js} +1 -9
  8. package/dist/{chunk-JOSJGZGF.js.map → chunk-LYKCQTH5.js.map} +1 -1
  9. package/dist/{chunk-5E6ZXCNN.js → chunk-MRKYJ422.js} +2 -2
  10. package/dist/{chunk-RBDPCHGD.js → chunk-V3BA2MJ6.js} +2 -2
  11. package/dist/{chunk-YXMRR2E3.js → chunk-WF5XDN4D.js} +65 -40
  12. package/dist/chunk-WF5XDN4D.js.map +1 -0
  13. package/dist/{chunk-NS2L445T.js → chunk-WHKLPZGK.js} +4 -4
  14. package/dist/{chunk-SWQRUVBW.js → chunk-YD7ILGA6.js} +624 -322
  15. package/dist/chunk-YD7ILGA6.js.map +1 -0
  16. package/dist/cli.js +258 -316
  17. package/dist/cli.js.map +1 -1
  18. package/dist/{config-2CBRLF3R.js → config-J5YQOMDU.js} +3 -3
  19. package/dist/config-editor-IXL4BFG3.js +11 -0
  20. package/dist/{daemon-UXC7PB4P.js → daemon-SLGQGRKO.js} +4 -4
  21. package/dist/index.d.ts +184 -71
  22. package/dist/index.js +18 -10
  23. package/dist/install-cloudflared-ILUXKLAC.js +8 -0
  24. package/dist/{main-PLTMIVYL.js → main-OUVYNLZN.js} +53 -17
  25. package/dist/main-OUVYNLZN.js.map +1 -0
  26. package/dist/{setup-UKWBLJIT.js → setup-JQZBPXWS.js} +4 -4
  27. package/dist/{tunnel-service-4GISQZNP.js → tunnel-service-DASSH7OA.js} +3 -3
  28. package/dist/version-VC5CPXBX.js +15 -0
  29. package/dist/version-VC5CPXBX.js.map +1 -0
  30. package/package.json +1 -1
  31. package/dist/chunk-SWQRUVBW.js.map +0 -1
  32. package/dist/chunk-YXMRR2E3.js.map +0 -1
  33. package/dist/config-editor-UN56HQCW.js +0 -11
  34. package/dist/install-cloudflared-LMM7MFQX.js +0 -8
  35. package/dist/main-PLTMIVYL.js.map +0 -1
  36. /package/dist/{autostart-N4HIL6C3.js.map → autostart-DZ3MHHMM.js.map} +0 -0
  37. /package/dist/{chunk-LVSQQRCF.js.map → chunk-2SY7Y2VB.js.map} +0 -0
  38. /package/dist/{chunk-7W5SOJPD.js.map → chunk-3QACY5E3.js.map} +0 -0
  39. /package/dist/{chunk-CA6FXPLH.js.map → chunk-BLVZFCKN.js.map} +0 -0
  40. /package/dist/{chunk-5E6ZXCNN.js.map → chunk-MRKYJ422.js.map} +0 -0
  41. /package/dist/{chunk-RBDPCHGD.js.map → chunk-V3BA2MJ6.js.map} +0 -0
  42. /package/dist/{chunk-NS2L445T.js.map → chunk-WHKLPZGK.js.map} +0 -0
  43. /package/dist/{config-2CBRLF3R.js.map → config-J5YQOMDU.js.map} +0 -0
  44. /package/dist/{config-editor-UN56HQCW.js.map → config-editor-IXL4BFG3.js.map} +0 -0
  45. /package/dist/{daemon-UXC7PB4P.js.map → daemon-SLGQGRKO.js.map} +0 -0
  46. /package/dist/{install-cloudflared-LMM7MFQX.js.map → install-cloudflared-ILUXKLAC.js.map} +0 -0
  47. /package/dist/{setup-UKWBLJIT.js.map → setup-JQZBPXWS.js.map} +0 -0
  48. /package/dist/{tunnel-service-4GISQZNP.js.map → tunnel-service-DASSH7OA.js.map} +0 -0
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
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":";;;;;;;;;;;;AAEA,SAAS,kCAAkC;;;ACF3C,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ;AAEpB,IAAM,oBAAyB,UAAQ,WAAQ,GAAG,YAAY,UAAU;AAEjE,SAAS,YAAY,eAAuB,mBAAkC;AACnF,MAAI;AACF,UAAM,UAAa,gBAAa,cAAc,OAAO,EAAE,KAAK;AAC5D,UAAM,OAAO,SAAS,SAAS,EAAE;AACjC,WAAO,MAAM,IAAI,IAAI,OAAO;AAAA,EAC9B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,eAAuB,mBAAyB;AAClF,MAAI;AACF,IAAG,cAAW,YAAY;AAAA,EAC5B,QAAQ;AAAA,EAER;AACF;AAEA,eAAsB,QACpB,MACA,SACA,SACmB;AACnB,SAAO,MAAM,oBAAoB,IAAI,GAAG,OAAO,IAAI,OAAO;AAC5D;;;AD3BA,2BAA2B,KAAK;AAKhC,IAAM,cAAc;AAEpB,IAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,IAAM,UAAU,KAAK,CAAC;AAEtB,SAAS,oBAA4B;AACnC,MAAI;AACF,UAAM,EAAE,cAAc,IAAI,UAAQ,QAAa;AAC/C,UAAM,MAAM,cAAc,YAAY,GAAG;AACzC,UAAM,MAAM,IAAI,iBAAiB;AACjC,WAAO,IAAI;AAAA,EACb,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,mBAA2C;AACxD,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,8BAA8B,WAAW,WAAW;AAAA,MAC1E,QAAQ,YAAY,QAAQ,GAAI;AAAA,IAClC,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,WAAO,KAAK,WAAW;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,SAAiB,QAA4B;AACpE,QAAM,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI,MAAM;AACvC,QAAM,IAAI,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AACtC,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,SAAK,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC,KAAK,GAAI,QAAO;AACtC,SAAK,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC,KAAK,GAAI,QAAO;AAAA,EACxC;AACA,SAAO;AACT;AAEA,eAAe,YAA8B;AAC3C,QAAM,EAAE,MAAM,IAAI,MAAM,OAAO,eAAoB;AACnD,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,QAAQ,MAAM,OAAO,CAAC,WAAW,MAAM,GAAG,WAAW,SAAS,GAAG;AAAA,MACrE,OAAO;AAAA,MACP,OAAO;AAAA,IACT,CAAC;AACD,UAAM,WAAW,MAAM;AACrB,YAAM,KAAK,SAAS;AACpB,cAAQ,KAAK;AAAA,IACf;AACA,YAAQ,GAAG,UAAU,QAAQ;AAC7B,YAAQ,GAAG,WAAW,QAAQ;AAC9B,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,cAAQ,IAAI,UAAU,QAAQ;AAC9B,cAAQ,IAAI,WAAW,QAAQ;AAC/B,cAAQ,SAAS,CAAC;AAAA,IACpB,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,uBAAsC;AACnD,QAAM,UAAU,kBAAkB;AAClC,MAAI,YAAY,YAAa;AAE7B,QAAM,SAAS,MAAM,iBAAiB;AACtC,MAAI,CAAC,UAAU,gBAAgB,SAAS,MAAM,KAAK,EAAG;AAEtD,UAAQ,IAAI,8BAA8B,OAAO,YAAO,MAAM,SAAS;AACvE,QAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,mBAAmB;AACpD,QAAM,MAAM,MAAM,QAAQ;AAAA,IACxB,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AACD,MAAI,KAAK;AACP,UAAM,KAAK,MAAM,UAAU;AAC3B,QAAI,IAAI;AACN,cAAQ,IAAI,8BAAyB,MAAM,sCAAsC;AACjF,cAAQ,KAAK,CAAC;AAAA,IAChB,OAAO;AACL,cAAQ,MAAM,gEAAgE;AAAA,IAChF;AAAA,EACF;AACF;AAEA,SAAS,YAAkB;AACzB,UAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAmCb;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;AAEA,MAAI,YAAY,WAAW;AACzB,UAAM,SAAS,KAAK,CAAC;AAErB,UAAM,OAAO,YAAY;AACzB,QAAI,SAAS,MAAM;AACjB,cAAQ,MAAM,oDAAoD;AAClE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI;AACF,UAAI,WAAW,OAAO;AACpB,cAAM,QAAQ,KAAK,CAAC;AACpB,cAAM,eAAe,KAAK,QAAQ,aAAa;AAC/C,cAAM,YAAY,iBAAiB,KAAK,KAAK,eAAe,CAAC,IAAI,KAAK,CAAC;AACvE,cAAM,OAA+B,CAAC;AACtC,YAAI,MAAO,MAAK,QAAQ;AACxB,YAAI,UAAW,MAAK,YAAY;AAEhC,cAAM,MAAM,MAAM,QAAQ,MAAM,iBAAiB;AAAA,UAC/C,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,IAAI;AAAA,QAC3B,CAAC;AACD,cAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAI,CAAC,IAAI,IAAI;AACX,kBAAQ,MAAM,UAAU,KAAK,KAAK,EAAE;AACpC,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,gBAAQ,IAAI,iBAAiB;AAC7B,gBAAQ,IAAI,iBAAiB,KAAK,SAAS,EAAE;AAC7C,gBAAQ,IAAI,iBAAiB,KAAK,KAAK,EAAE;AACzC,gBAAQ,IAAI,iBAAiB,KAAK,SAAS,EAAE;AAC7C,gBAAQ,IAAI,iBAAiB,KAAK,MAAM,EAAE;AAAA,MAE5C,WAAW,WAAW,UAAU;AAC9B,cAAM,YAAY,KAAK,CAAC;AACxB,YAAI,CAAC,WAAW;AACd,kBAAQ,MAAM,4CAA4C;AAC1D,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,cAAM,MAAM,MAAM,QAAQ,MAAM,iBAAiB,mBAAmB,SAAS,CAAC,IAAI;AAAA,UAChF,QAAQ;AAAA,QACV,CAAC;AACD,cAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAI,CAAC,IAAI,IAAI;AACX,kBAAQ,MAAM,UAAU,KAAK,KAAK,EAAE;AACpC,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,gBAAQ,IAAI,WAAW,SAAS,YAAY;AAAA,MAE9C,WAAW,WAAW,UAAU;AAC9B,cAAM,MAAM,MAAM,QAAQ,MAAM,eAAe;AAC/C,cAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,kBAAQ,IAAI,qBAAqB;AAAA,QACnC,OAAO;AACL,kBAAQ,IAAI,oBAAoB,KAAK,SAAS,MAAM;AAAA,CAAI;AACxD,qBAAW,KAAK,KAAK,UAAU;AAC7B,kBAAM,OAAO,EAAE,OAAO,MAAM,EAAE,IAAI,MAAM;AACxC,oBAAQ,IAAI,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE;AAAA,UACzD;AAAA,QACF;AAAA,MAEF,WAAW,WAAW,UAAU;AAC9B,cAAM,MAAM,MAAM,QAAQ,MAAM,aAAa;AAC7C,cAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,gBAAQ,IAAI,mBAAmB;AAC/B,mBAAW,KAAK,KAAK,QAAQ;AAC3B,gBAAM,YAAY,EAAE,SAAS,KAAK,UAAU,eAAe;AAC3D,kBAAQ,IAAI,KAAK,EAAE,IAAI,GAAG,SAAS,EAAE;AAAA,QACvC;AAAA,MAEF,OAAO;AACL,gBAAQ,MAAM,4BAA4B,UAAU,QAAQ;AAAA,CAAI;AAChE,gBAAQ,IAAI,QAAQ;AACpB,gBAAQ,IAAI,iEAAiE;AAC7E,gBAAQ,IAAI,wDAAwD;AACpE,gBAAQ,IAAI,4DAA4D;AACxE,gBAAQ,IAAI,6DAA6D;AACzE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,eAAe,aAAc,IAAY,OAAO,SAAS,gBAAgB;AAC3E,gBAAQ,MAAM,0CAA0C;AACxD,4BAAoB;AACpB,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM;AAAA,IACR;AACA;AAAA,EACF;AAEA,MAAI,YAAY,SAAS;AACvB,UAAM,qBAAqB;AAC3B,UAAM,EAAE,aAAa,WAAW,IAAI,MAAM,OAAO,sBAAkB;AACnE,UAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,sBAAkB;AACzD,UAAMC,MAAK,IAAID,eAAc;AAC7B,QAAI,MAAMC,IAAG,OAAO,GAAG;AACrB,YAAMA,IAAG,KAAK;AACd,YAAMC,UAASD,IAAG,IAAI;AACtB,YAAM,SAAS,YAAY,WAAW,GAAGC,QAAO,QAAQ,MAAM;AAC9D,UAAI,WAAW,QAAQ;AACrB,gBAAQ,MAAM,OAAO,KAAK;AAC1B,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,cAAQ,IAAI,+BAA+B,OAAO,GAAG,GAAG;AAAA,IAC1D,OAAO;AACL,cAAQ,MAAM,iDAAiD;AAC/D,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA;AAAA,EACF;AAEA,MAAI,YAAY,QAAQ;AACtB,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,sBAAkB;AACtD,UAAM,SAAS,WAAW;AAC1B,QAAI,OAAO,SAAS;AAClB,cAAQ,IAAI,mCAAmC,OAAO,GAAG,GAAG;AAAA,IAC9D,OAAO;AACL,cAAQ,MAAM,OAAO,KAAK;AAC1B,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA;AAAA,EACF;AAEA,MAAI,YAAY,UAAU;AACxB,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,sBAAkB;AACrD,UAAM,SAAS,UAAU;AACzB,QAAI,OAAO,SAAS;AAClB,cAAQ,IAAI,2BAA2B,OAAO,GAAG,GAAG;AAAA,IACtD,OAAO;AACL,cAAQ,IAAI,wBAAwB;AAAA,IACtC;AACA;AAAA,EACF;AAEA,MAAI,YAAY,QAAQ;AACtB,UAAM,EAAE,MAAM,IAAI,MAAM,OAAO,eAAoB;AACnD,UAAM,EAAE,eAAAF,gBAAe,WAAW,IAAI,MAAM,OAAO,sBAAkB;AACrE,UAAM,UAAU,MAAM,OAAO,MAAW;AACxC,UAAMC,MAAK,IAAID,eAAc;AAC7B,QAAI,SAAS;AACb,QAAI,MAAMC,IAAG,OAAO,GAAG;AACrB,YAAMA,IAAG,KAAK;AACd,eAASA,IAAG,IAAI,EAAE,QAAQ;AAAA,IAC5B;AACA,UAAM,UAAU,QAAQ,KAAK,WAAW,MAAM,GAAG,aAAa;AAC9D,UAAM,OAAO,MAAM,QAAQ,CAAC,MAAM,MAAM,MAAM,OAAO,GAAG,EAAE,OAAO,UAAU,CAAC;AAC5E,SAAK,GAAG,SAAS,CAAC,QAAe;AAC/B,cAAQ,MAAM,yBAAyB,IAAI,OAAO,EAAE;AACpD,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AACD;AAAA,EACF;AAEA,MAAI,YAAY,UAAU;AACxB,UAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,6BAAyB;AAClE,UAAM,EAAE,eAAAD,eAAc,IAAI,MAAM,OAAO,sBAAkB;AACzD,UAAMC,MAAK,IAAID,eAAc;AAC7B,QAAI,CAAE,MAAMC,IAAG,OAAO,GAAI;AACxB,cAAQ,MAAM,iDAAiD;AAC/D,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,gBAAgBA,GAAE;AACxB;AAAA,EACF;AAEA,MAAI,YAAY,SAAS;AACvB,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,sBAAkB;AACrD,UAAM,SAAS,UAAU;AACzB,QAAI,OAAO,SAAS;AAClB,cAAQ,MAAM,iDAAiD;AAC/D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,mBAAmB;AACpD,UAAM,MAAM,MAAM,QAAQ;AAAA,MACxB,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AACD,QAAI,CAAC,KAAK;AACR,cAAQ,IAAI,UAAU;AACtB;AAAA,IACF;AAEA,UAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,yBAAqB;AACjE,uBAAmB;AAEnB,UAAME,MAAK,MAAM,OAAO,IAAS;AACjC,UAAMC,MAAK,MAAM,OAAO,IAAS;AACjC,UAAMC,QAAO,MAAM,OAAO,MAAW;AACrC,UAAM,aAAaA,MAAK,KAAKD,IAAG,QAAQ,GAAG,UAAU;AACrD,IAAAD,IAAG,OAAO,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAEtD,YAAQ,IAAI,gDAAgD;AAC5D;AAAA,EACF;AAEA,MAAI,YAAY,UAAU;AACxB,UAAM,UAAU,kBAAkB;AAClC,UAAM,SAAS,MAAM,iBAAiB;AACtC,QAAI,CAAC,QAAQ;AACX,cAAQ,MAAM,8DAA8D;AAC5E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI,gBAAgB,SAAS,MAAM,KAAK,GAAG;AACzC,cAAQ,IAAI,wBAAwB,OAAO,GAAG;AAC9C;AAAA,IACF;AACA,YAAQ,IAAI,sBAAsB,OAAO,YAAO,MAAM,EAAE;AACxD,UAAM,KAAK,MAAM,UAAU;AAC3B,QAAI,IAAI;AACN,cAAQ,IAAI,8BAAyB,MAAM,SAAS;AAAA,IACtD,OAAO;AACL,cAAQ,MAAM,iEAAiE;AAC/E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA;AAAA,EACF;AAGA,MAAI,YAAY,kBAAkB;AAChC,UAAM,EAAE,aAAAG,aAAY,IAAI,MAAM,OAAO,oBAAW;AAChD,UAAMA,aAAY;AAClB;AAAA,EACF;AAGA,QAAM,kBAAkB,YAAY;AAGpC,MAAI,WAAW,CAAC,QAAQ,WAAW,GAAG,GAAG;AACvC,YAAQ,MAAM,oBAAoB,OAAO,EAAE;AAC3C,cAAU;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,qBAAqB;AAG3B,QAAM,EAAE,cAAc,IAAI,MAAM,OAAO,sBAAkB;AACzD,QAAM,KAAK,IAAI,cAAc;AAG7B,MAAI,CAAE,MAAM,GAAG,OAAO,GAAI;AACxB,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,qBAAiB;AACnD,UAAM,cAAc,MAAM,SAAS,EAAE;AACrC,QAAI,CAAC,YAAa,SAAQ,KAAK,CAAC;AAAA,EAElC;AAEA,QAAM,GAAG,KAAK;AACd,QAAM,SAAS,GAAG,IAAI;AAEtB,MAAI,CAAC,mBAAmB,OAAO,YAAY,UAAU;AAEnD,UAAM,EAAE,aAAa,WAAW,IAAI,MAAM,OAAO,sBAAkB;AACnE,UAAM,SAAS,YAAY,WAAW,GAAG,OAAO,QAAQ,MAAM;AAC9D,QAAI,WAAW,QAAQ;AACrB,cAAQ,MAAM,OAAO,KAAK;AAC1B,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,IAAI,+BAA+B,OAAO,GAAG,GAAG;AACxD;AAAA,EACF;AAGA,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,sBAAkB;AACvD,cAAY;AACZ,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","ConfigManager","cm","config","fs","os","path","startServer"]}
1
+ {"version":3,"sources":["../../src/cli.ts","../../src/core/api-client.ts","../../src/cli/commands.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { setDefaultAutoSelectFamily } from \"node:net\";\nsetDefaultAutoSelectFamily(false);\n\nimport {\n printHelp,\n cmdVersion,\n cmdInstall,\n cmdUninstall,\n cmdPlugins,\n cmdRuntime,\n cmdStart,\n cmdStop,\n cmdStatus,\n cmdLogs,\n cmdConfig,\n cmdReset,\n cmdUpdate,\n cmdDefault,\n} from './cli/commands.js'\n\nconst args = process.argv.slice(2);\nconst command = args[0];\n\nconst commands: Record<string, () => Promise<void>> = {\n '--help': async () => printHelp(),\n '-h': async () => printHelp(),\n '--version': () => cmdVersion(),\n '-v': () => cmdVersion(),\n 'install': () => cmdInstall(args),\n 'uninstall': () => cmdUninstall(args),\n 'plugins': () => cmdPlugins(),\n 'runtime': () => cmdRuntime(args),\n 'start': () => cmdStart(),\n 'stop': () => cmdStop(),\n 'status': () => cmdStatus(),\n 'logs': () => cmdLogs(),\n 'config': () => cmdConfig(),\n 'reset': () => cmdReset(),\n 'update': () => cmdUpdate(),\n '--daemon-child': async () => {\n const { startServer } = await import('./main.js')\n await startServer()\n },\n}\n\nasync function main() {\n const handler = command ? commands[command] : undefined\n if (handler) {\n await handler()\n } else {\n await cmdDefault(command)\n }\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","import { installPlugin, uninstallPlugin, listPlugins } from '../core/plugin-manager.js'\nimport { readApiPort, removeStalePortFile, apiCall } from '../core/api-client.js'\nimport { getCurrentVersion, getLatestVersion, compareVersions, runUpdate, checkAndPromptUpdate } from './version.js'\n\nexport function 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\nexport async function cmdVersion(): Promise<void> {\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}\n\nexport async function cmdInstall(args: string[]): Promise<void> {\n const pkg = args[1]\n if (!pkg) {\n console.error(\"Usage: openacp install <package>\")\n process.exit(1)\n }\n installPlugin(pkg)\n}\n\nexport async function cmdUninstall(args: string[]): Promise<void> {\n const pkg = args[1]\n if (!pkg) {\n console.error(\"Usage: openacp uninstall <package>\")\n process.exit(1)\n }\n uninstallPlugin(pkg)\n}\n\nexport async function cmdPlugins(): Promise<void> {\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}\n\nexport async function cmdRuntime(args: string[]): Promise<void> {\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}\n\nexport async function cmdStart(): Promise<void> {\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}\n\nexport async function cmdStop(): Promise<void> {\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}\n\nexport async function cmdStatus(): Promise<void> {\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}\n\nexport async function cmdLogs(): Promise<void> {\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}\n\nexport async function cmdConfig(): Promise<void> {\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}\n\nexport async function cmdReset(): Promise<void> {\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}\n\nexport async function cmdUpdate(): Promise<void> {\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}\n\nexport async function cmdDefault(command: string | undefined): Promise<void> {\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 await checkAndPromptUpdate()\n\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 }\n\n await cm.load()\n const config = cm.get()\n\n if (!forceForeground && config.runMode === 'daemon') {\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 const { markRunning } = await import('../core/daemon.js')\n markRunning()\n const { startServer } = await import('../main.js')\n await startServer()\n}\n"],"mappings":"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","names":["require","args","fs","os","path","command"]}
@@ -3,12 +3,12 @@ import {
3
3
  ConfigSchema,
4
4
  PLUGINS_DIR,
5
5
  expandHome
6
- } from "./chunk-YXMRR2E3.js";
7
- import "./chunk-JOSJGZGF.js";
6
+ } from "./chunk-WF5XDN4D.js";
7
+ import "./chunk-LYKCQTH5.js";
8
8
  export {
9
9
  ConfigManager,
10
10
  ConfigSchema,
11
11
  PLUGINS_DIR,
12
12
  expandHome
13
13
  };
14
- //# sourceMappingURL=config-2CBRLF3R.js.map
14
+ //# sourceMappingURL=config-J5YQOMDU.js.map
@@ -0,0 +1,11 @@
1
+ import {
2
+ runConfigEditor
3
+ } from "./chunk-WHKLPZGK.js";
4
+ import "./chunk-MRKYJ422.js";
5
+ import "./chunk-BLVZFCKN.js";
6
+ import "./chunk-WF5XDN4D.js";
7
+ import "./chunk-LYKCQTH5.js";
8
+ export {
9
+ runConfigEditor
10
+ };
11
+ //# sourceMappingURL=config-editor-IXL4BFG3.js.map
@@ -10,9 +10,9 @@ import {
10
10
  startDaemon,
11
11
  stopDaemon,
12
12
  writePidFile
13
- } from "./chunk-7W5SOJPD.js";
14
- import "./chunk-YXMRR2E3.js";
15
- import "./chunk-JOSJGZGF.js";
13
+ } from "./chunk-3QACY5E3.js";
14
+ import "./chunk-WF5XDN4D.js";
15
+ import "./chunk-LYKCQTH5.js";
16
16
  export {
17
17
  clearRunning,
18
18
  getPidPath,
@@ -26,4 +26,4 @@ export {
26
26
  stopDaemon,
27
27
  writePidFile
28
28
  };
29
- //# sourceMappingURL=daemon-UXC7PB4P.js.map
29
+ //# sourceMappingURL=daemon-SLGQGRKO.js.map
package/dist/index.d.ts CHANGED
@@ -121,13 +121,13 @@ declare const LoggingSchema: z.ZodDefault<z.ZodObject<{
121
121
  maxFiles: z.ZodDefault<z.ZodNumber>;
122
122
  sessionLogRetentionDays: z.ZodDefault<z.ZodNumber>;
123
123
  }, "strip", z.ZodTypeAny, {
124
- level: "error" | "silent" | "debug" | "info" | "warn" | "fatal";
124
+ level: "fatal" | "error" | "warn" | "info" | "debug" | "silent";
125
125
  logDir: string;
126
126
  maxFileSize: string | number;
127
127
  maxFiles: number;
128
128
  sessionLogRetentionDays: number;
129
129
  }, {
130
- level?: "error" | "silent" | "debug" | "info" | "warn" | "fatal" | undefined;
130
+ level?: "fatal" | "error" | "warn" | "info" | "debug" | "silent" | undefined;
131
131
  logDir?: string | undefined;
132
132
  maxFileSize?: string | number | undefined;
133
133
  maxFiles?: number | undefined;
@@ -227,13 +227,13 @@ declare const ConfigSchema: z.ZodObject<{
227
227
  maxFiles: z.ZodDefault<z.ZodNumber>;
228
228
  sessionLogRetentionDays: z.ZodDefault<z.ZodNumber>;
229
229
  }, "strip", z.ZodTypeAny, {
230
- level: "error" | "silent" | "debug" | "info" | "warn" | "fatal";
230
+ level: "fatal" | "error" | "warn" | "info" | "debug" | "silent";
231
231
  logDir: string;
232
232
  maxFileSize: string | number;
233
233
  maxFiles: number;
234
234
  sessionLogRetentionDays: number;
235
235
  }, {
236
- level?: "error" | "silent" | "debug" | "info" | "warn" | "fatal" | undefined;
236
+ level?: "fatal" | "error" | "warn" | "info" | "debug" | "silent" | undefined;
237
237
  logDir?: string | undefined;
238
238
  maxFileSize?: string | number | undefined;
239
239
  maxFiles?: number | undefined;
@@ -296,8 +296,16 @@ declare const ConfigSchema: z.ZodObject<{
296
296
  } | undefined;
297
297
  }>>;
298
298
  }, "strip", z.ZodTypeAny, {
299
- workspace: {
300
- baseDir: string;
299
+ tunnel: {
300
+ options: Record<string, unknown>;
301
+ enabled: boolean;
302
+ port: number;
303
+ provider: "cloudflare" | "ngrok" | "bore" | "tailscale";
304
+ storeTtlMinutes: number;
305
+ auth: {
306
+ enabled: boolean;
307
+ token?: string | undefined;
308
+ };
301
309
  };
302
310
  agents: Record<string, {
303
311
  command: string;
@@ -310,13 +318,16 @@ declare const ConfigSchema: z.ZodObject<{
310
318
  adapter: z.ZodOptional<z.ZodString>;
311
319
  }, z.ZodTypeAny, "passthrough">>;
312
320
  defaultAgent: string;
321
+ workspace: {
322
+ baseDir: string;
323
+ };
313
324
  security: {
314
325
  allowedUserIds: string[];
315
326
  maxConcurrentSessions: number;
316
327
  sessionTimeoutMinutes: number;
317
328
  };
318
329
  logging: {
319
- level: "error" | "silent" | "debug" | "info" | "warn" | "fatal";
330
+ level: "fatal" | "error" | "warn" | "info" | "debug" | "silent";
320
331
  logDir: string;
321
332
  maxFileSize: string | number;
322
333
  maxFiles: number;
@@ -331,17 +342,6 @@ declare const ConfigSchema: z.ZodObject<{
331
342
  sessionStore: {
332
343
  ttlDays: number;
333
344
  };
334
- tunnel: {
335
- options: Record<string, unknown>;
336
- enabled: boolean;
337
- port: number;
338
- provider: "cloudflare" | "ngrok" | "bore" | "tailscale";
339
- storeTtlMinutes: number;
340
- auth: {
341
- enabled: boolean;
342
- token?: string | undefined;
343
- };
344
- };
345
345
  }, {
346
346
  agents: Record<string, {
347
347
  command: string;
@@ -354,6 +354,17 @@ declare const ConfigSchema: z.ZodObject<{
354
354
  adapter: z.ZodOptional<z.ZodString>;
355
355
  }, z.ZodTypeAny, "passthrough">>;
356
356
  defaultAgent: string;
357
+ tunnel?: {
358
+ options?: Record<string, unknown> | undefined;
359
+ enabled?: boolean | undefined;
360
+ port?: number | undefined;
361
+ provider?: "cloudflare" | "ngrok" | "bore" | "tailscale" | undefined;
362
+ storeTtlMinutes?: number | undefined;
363
+ auth?: {
364
+ enabled?: boolean | undefined;
365
+ token?: string | undefined;
366
+ } | undefined;
367
+ } | undefined;
357
368
  workspace?: {
358
369
  baseDir?: string | undefined;
359
370
  } | undefined;
@@ -363,7 +374,7 @@ declare const ConfigSchema: z.ZodObject<{
363
374
  sessionTimeoutMinutes?: number | undefined;
364
375
  } | undefined;
365
376
  logging?: {
366
- level?: "error" | "silent" | "debug" | "info" | "warn" | "fatal" | undefined;
377
+ level?: "fatal" | "error" | "warn" | "info" | "debug" | "silent" | undefined;
367
378
  logDir?: string | undefined;
368
379
  maxFileSize?: string | number | undefined;
369
380
  maxFiles?: number | undefined;
@@ -378,17 +389,6 @@ declare const ConfigSchema: z.ZodObject<{
378
389
  sessionStore?: {
379
390
  ttlDays?: number | undefined;
380
391
  } | undefined;
381
- tunnel?: {
382
- options?: Record<string, unknown> | undefined;
383
- enabled?: boolean | undefined;
384
- port?: number | undefined;
385
- provider?: "cloudflare" | "ngrok" | "bore" | "tailscale" | undefined;
386
- storeTtlMinutes?: number | undefined;
387
- auth?: {
388
- enabled?: boolean | undefined;
389
- token?: string | undefined;
390
- } | undefined;
391
- } | undefined;
392
392
  }>;
393
393
  type Config = z.infer<typeof ConfigSchema>;
394
394
  declare function expandHome(p: string): string;
@@ -429,10 +429,25 @@ interface ChannelConfig {
429
429
  enabled: boolean;
430
430
  [key: string]: unknown;
431
431
  }
432
- declare abstract class ChannelAdapter {
433
- protected core: any;
432
+ interface IChannelAdapter {
433
+ start(): Promise<void>;
434
+ stop(): Promise<void>;
435
+ sendMessage(sessionId: string, content: OutgoingMessage): Promise<void>;
436
+ sendPermissionRequest(sessionId: string, request: PermissionRequest): Promise<void>;
437
+ sendNotification(notification: NotificationMessage): Promise<void>;
438
+ createSessionThread(sessionId: string, name: string): Promise<string>;
439
+ renameSessionThread(sessionId: string, newName: string): Promise<void>;
440
+ sendSkillCommands(sessionId: string, commands: AgentCommand[]): Promise<void>;
441
+ cleanupSkillCommands(sessionId: string): Promise<void>;
442
+ }
443
+ /**
444
+ * Base class providing default no-op implementations for optional methods.
445
+ * Adapters can extend this or implement IChannelAdapter directly.
446
+ */
447
+ declare abstract class ChannelAdapter<TCore = unknown> implements IChannelAdapter {
448
+ protected core: TCore;
434
449
  protected config: ChannelConfig;
435
- constructor(core: any, config: ChannelConfig);
450
+ constructor(core: TCore, config: ChannelConfig);
436
451
  abstract start(): Promise<void>;
437
452
  abstract stop(): Promise<void>;
438
453
  abstract sendMessage(sessionId: string, content: OutgoingMessage): Promise<void>;
@@ -491,7 +506,66 @@ declare class AgentManager {
491
506
  resume(agentName: string, workingDirectory: string, agentSessionId: string): Promise<AgentInstance>;
492
507
  }
493
508
 
494
- declare class Session {
509
+ /**
510
+ * A minimal, generic typed event emitter.
511
+ *
512
+ * Usage:
513
+ * interface MyEvents {
514
+ * data: (payload: string) => void
515
+ * error: (err: Error) => void
516
+ * }
517
+ * const emitter = new TypedEmitter<MyEvents>()
518
+ * emitter.on('data', (payload) => { ... })
519
+ * emitter.emit('data', 'hello')
520
+ */
521
+ declare class TypedEmitter<T extends Record<string & keyof T, (...args: any[]) => void>> {
522
+ private listeners;
523
+ private paused;
524
+ private buffer;
525
+ on<K extends keyof T>(event: K, listener: T[K]): this;
526
+ off<K extends keyof T>(event: K, listener: T[K]): this;
527
+ emit<K extends keyof T>(event: K, ...args: Parameters<T[K]>): void;
528
+ /**
529
+ * Pause event delivery. Events emitted while paused are buffered.
530
+ * Optionally pass a filter to allow specific events through even while paused.
531
+ */
532
+ pause(passthrough?: (event: keyof T, args: unknown[]) => boolean): void;
533
+ private passthroughFn?;
534
+ /** Resume event delivery and replay buffered events in order. */
535
+ resume(): void;
536
+ /** Discard all buffered events without delivering them. */
537
+ clearBuffer(): void;
538
+ get isPaused(): boolean;
539
+ get bufferSize(): number;
540
+ removeAllListeners(event?: keyof T): void;
541
+ private deliver;
542
+ }
543
+
544
+ /**
545
+ * Encapsulates pending permission state with a typed Promise API.
546
+ */
547
+ declare class PermissionGate {
548
+ private request?;
549
+ private resolveFn?;
550
+ private rejectFn?;
551
+ private settled;
552
+ setPending(request: PermissionRequest): Promise<string>;
553
+ resolve(optionId: string): void;
554
+ reject(reason?: string): void;
555
+ get isPending(): boolean;
556
+ get currentRequest(): PermissionRequest | undefined;
557
+ /** The request ID of the current pending request, undefined after settlement */
558
+ get requestId(): string | undefined;
559
+ private cleanup;
560
+ }
561
+
562
+ interface SessionEvents {
563
+ agent_event: (event: AgentEvent) => void;
564
+ permission_request: (request: PermissionRequest) => void;
565
+ session_end: (reason: string) => void;
566
+ error: (error: Error) => void;
567
+ }
568
+ declare class Session extends TypedEmitter<SessionEvents> {
495
569
  id: string;
496
570
  channelId: string;
497
571
  threadId: string;
@@ -501,16 +575,12 @@ declare class Session {
501
575
  agentSessionId: string;
502
576
  status: SessionStatus;
503
577
  name?: string;
504
- promptQueue: string[];
505
- promptRunning: boolean;
506
578
  createdAt: Date;
507
579
  adapter?: ChannelAdapter;
508
- pendingPermission?: {
509
- requestId: string;
510
- resolve: (optionId: string) => void;
511
- };
512
580
  dangerousMode: boolean;
513
581
  log: Logger;
582
+ readonly permissionGate: PermissionGate;
583
+ private readonly queue;
514
584
  constructor(opts: {
515
585
  id?: string;
516
586
  channelId: string;
@@ -518,40 +588,43 @@ declare class Session {
518
588
  workingDirectory: string;
519
589
  agentInstance: AgentInstance;
520
590
  });
591
+ /** @deprecated Use permissionGate directly */
592
+ get pendingPermission(): {
593
+ requestId: string;
594
+ resolve: (optionId: string) => void;
595
+ } | undefined;
596
+ set pendingPermission(val: {
597
+ requestId: string;
598
+ resolve: (optionId: string) => void;
599
+ } | undefined);
600
+ /** Number of prompts waiting in queue */
601
+ get queueDepth(): number;
602
+ get promptRunning(): boolean;
521
603
  enqueuePrompt(text: string): Promise<void>;
522
- private runPrompt;
604
+ private processPrompt;
523
605
  private autoName;
524
606
  /** Fire-and-forget warm-up: primes model cache while user types their first message */
525
607
  warmup(): Promise<void>;
608
+ private runWarmup;
526
609
  cancel(): Promise<void>;
527
610
  destroy(): Promise<void>;
528
611
  }
529
612
 
530
- interface SessionStore {
531
- save(record: SessionRecord): Promise<void>;
532
- get(sessionId: string): SessionRecord | undefined;
533
- findByPlatform(channelId: string, predicate: (platform: Record<string, unknown>) => boolean): SessionRecord | undefined;
534
- list(channelId?: string): SessionRecord[];
535
- remove(sessionId: string): Promise<void>;
536
- }
537
-
538
- declare class SessionManager {
539
- private sessions;
540
- private store;
541
- constructor(store?: SessionStore | null);
542
- createSession(channelId: string, agentName: string, workingDirectory: string, agentManager: AgentManager): Promise<Session>;
543
- getSession(sessionId: string): Session | undefined;
544
- getSessionByThread(channelId: string, threadId: string): Session | undefined;
545
- getRecordByThread(channelId: string, threadId: string): SessionRecord | undefined;
546
- registerSession(session: Session): void;
547
- updateSessionPlatform(sessionId: string, platform: Record<string, unknown>): Promise<void>;
548
- updateSessionActivity(sessionId: string): Promise<void>;
549
- updateSessionStatus(sessionId: string, status: SessionStatus): Promise<void>;
550
- updateSessionName(sessionId: string, name: string): Promise<void>;
551
- getSessionRecord(sessionId: string): SessionRecord | undefined;
552
- cancelSession(sessionId: string): Promise<void>;
553
- listSessions(channelId?: string): Session[];
554
- destroyAll(): Promise<void>;
613
+ /**
614
+ * Serial prompt queue — ensures prompts are processed one at a time.
615
+ */
616
+ declare class PromptQueue {
617
+ private processor;
618
+ private onError?;
619
+ private queue;
620
+ private processing;
621
+ constructor(processor: (text: string) => Promise<void>, onError?: ((err: unknown) => void) | undefined);
622
+ enqueue(text: string): Promise<void>;
623
+ private process;
624
+ private drainNext;
625
+ clear(): void;
626
+ get pending(): number;
627
+ get isProcessing(): boolean;
555
628
  }
556
629
 
557
630
  interface ViewerEntry {
@@ -596,16 +669,58 @@ declare class TunnelService {
596
669
  private createProvider;
597
670
  }
598
671
 
672
+ declare class MessageTransformer {
673
+ private tunnelService?;
674
+ constructor(tunnelService?: TunnelService | undefined);
675
+ transform(event: AgentEvent, sessionContext?: {
676
+ id: string;
677
+ workingDirectory: string;
678
+ }): OutgoingMessage;
679
+ private enrichWithViewerLinks;
680
+ }
681
+
682
+ interface SessionStore {
683
+ save(record: SessionRecord): Promise<void>;
684
+ get(sessionId: string): SessionRecord | undefined;
685
+ findByPlatform(channelId: string, predicate: (platform: Record<string, unknown>) => boolean): SessionRecord | undefined;
686
+ list(channelId?: string): SessionRecord[];
687
+ remove(sessionId: string): Promise<void>;
688
+ }
689
+
690
+ declare class SessionManager {
691
+ private sessions;
692
+ private store;
693
+ constructor(store?: SessionStore | null);
694
+ createSession(channelId: string, agentName: string, workingDirectory: string, agentManager: AgentManager): Promise<Session>;
695
+ getSession(sessionId: string): Session | undefined;
696
+ getSessionByThread(channelId: string, threadId: string): Session | undefined;
697
+ getRecordByThread(channelId: string, threadId: string): SessionRecord | undefined;
698
+ registerSession(session: Session): void;
699
+ updateSessionPlatform(sessionId: string, platform: Record<string, unknown>): Promise<void>;
700
+ updateSessionActivity(sessionId: string): Promise<void>;
701
+ updateSessionStatus(sessionId: string, status: SessionStatus): Promise<void>;
702
+ updateSessionName(sessionId: string, name: string): Promise<void>;
703
+ getSessionRecord(sessionId: string): SessionRecord | undefined;
704
+ cancelSession(sessionId: string): Promise<void>;
705
+ listSessions(channelId?: string): Session[];
706
+ destroyAll(): Promise<void>;
707
+ }
708
+
599
709
  declare class OpenACPCore {
600
710
  configManager: ConfigManager;
601
711
  agentManager: AgentManager;
602
712
  sessionManager: SessionManager;
603
713
  notificationManager: NotificationManager;
714
+ messageTransformer: MessageTransformer;
604
715
  adapters: Map<string, ChannelAdapter>;
605
- tunnelService?: TunnelService;
716
+ /** Set by main.ts — triggers graceful shutdown with restart exit code */
717
+ requestRestart: (() => Promise<void>) | null;
718
+ private _tunnelService?;
606
719
  private sessionStore;
607
720
  private resumeLocks;
608
721
  constructor(configManager: ConfigManager);
722
+ get tunnelService(): TunnelService | undefined;
723
+ set tunnelService(service: TunnelService | undefined);
609
724
  registerAdapter(name: string, adapter: ChannelAdapter): void;
610
725
  start(): Promise<void>;
611
726
  stop(): Promise<void>;
@@ -613,8 +728,6 @@ declare class OpenACPCore {
613
728
  handleNewSession(channelId: string, agentName?: string, workspacePath?: string): Promise<Session>;
614
729
  handleNewChat(channelId: string, currentThreadId: string): Promise<Session | null>;
615
730
  private lazyResume;
616
- private toOutgoingMessage;
617
- private enrichWithViewerLinks;
618
731
  wireSessionEvents(session: Session, adapter: ChannelAdapter): void;
619
732
  }
620
733
 
@@ -689,7 +802,7 @@ interface TelegramChannelConfig {
689
802
  assistantTopicId: number | null;
690
803
  }
691
804
 
692
- declare class TelegramAdapter extends ChannelAdapter {
805
+ declare class TelegramAdapter extends ChannelAdapter<OpenACPCore> {
693
806
  private bot;
694
807
  private telegramConfig;
695
808
  private sessionDrafts;
@@ -719,4 +832,4 @@ declare class TelegramAdapter extends ChannelAdapter {
719
832
  private finalizeDraft;
720
833
  }
721
834
 
722
- export { type AdapterFactory, type AgentCommand, type AgentDefinition, type AgentEvent, AgentInstance, AgentManager, type ApiConfig, ApiServer, ChannelAdapter, type ChannelConfig, type Config, ConfigManager, type IncomingMessage, type Logger, type LoggingConfig, NotificationManager, type NotificationMessage, OpenACPCore, type OutgoingMessage, PLUGINS_DIR, type PermissionOption, type PermissionRequest, type PlanEntry, Session, SessionManager, type SessionRecord, type SessionStatus, StderrCapture, TelegramAdapter, type TelegramPlatformData, cleanupOldSessionLogs, createChildLogger, createSessionLogger, expandHome, getPidPath, getStatus, initLogger, installAutoStart, installPlugin, isAutoStartInstalled, isAutoStartSupported, listPlugins, loadAdapterFactory, log, nodeToWebReadable, nodeToWebWritable, runConfigEditor, shutdownLogger, startDaemon, stopDaemon, uninstallAutoStart, uninstallPlugin };
835
+ export { type AdapterFactory, type AgentCommand, type AgentDefinition, type AgentEvent, AgentInstance, AgentManager, type ApiConfig, ApiServer, ChannelAdapter, type ChannelConfig, type Config, ConfigManager, type IChannelAdapter, type IncomingMessage, type Logger, type LoggingConfig, MessageTransformer, NotificationManager, type NotificationMessage, OpenACPCore, type OutgoingMessage, PLUGINS_DIR, PermissionGate, type PermissionOption, type PermissionRequest, type PlanEntry, PromptQueue, Session, type SessionEvents, SessionManager, type SessionRecord, type SessionStatus, StderrCapture, TelegramAdapter, type TelegramPlatformData, TypedEmitter, cleanupOldSessionLogs, createChildLogger, createSessionLogger, expandHome, getPidPath, getStatus, initLogger, installAutoStart, installPlugin, isAutoStartInstalled, isAutoStartSupported, listPlugins, loadAdapterFactory, log, nodeToWebReadable, nodeToWebWritable, runConfigEditor, shutdownLogger, startDaemon, stopDaemon, uninstallAutoStart, uninstallPlugin };
package/dist/index.js CHANGED
@@ -3,42 +3,46 @@ import {
3
3
  AgentManager,
4
4
  ApiServer,
5
5
  ChannelAdapter,
6
+ MessageTransformer,
6
7
  NotificationManager,
7
8
  OpenACPCore,
9
+ PermissionGate,
10
+ PromptQueue,
8
11
  Session,
9
12
  SessionManager,
10
13
  StderrCapture,
11
14
  TelegramAdapter,
15
+ TypedEmitter,
12
16
  nodeToWebReadable,
13
17
  nodeToWebWritable
14
- } from "./chunk-SWQRUVBW.js";
18
+ } from "./chunk-YD7ILGA6.js";
19
+ import {
20
+ runConfigEditor
21
+ } from "./chunk-WHKLPZGK.js";
15
22
  import {
16
23
  installPlugin,
17
24
  listPlugins,
18
25
  loadAdapterFactory,
19
26
  uninstallPlugin
20
- } from "./chunk-LVSQQRCF.js";
27
+ } from "./chunk-2SY7Y2VB.js";
21
28
  import {
22
29
  getPidPath,
23
30
  getStatus,
24
31
  startDaemon,
25
32
  stopDaemon
26
- } from "./chunk-7W5SOJPD.js";
27
- import {
28
- runConfigEditor
29
- } from "./chunk-NS2L445T.js";
33
+ } from "./chunk-3QACY5E3.js";
30
34
  import {
31
35
  installAutoStart,
32
36
  isAutoStartInstalled,
33
37
  isAutoStartSupported,
34
38
  uninstallAutoStart
35
- } from "./chunk-5E6ZXCNN.js";
36
- import "./chunk-CA6FXPLH.js";
39
+ } from "./chunk-MRKYJ422.js";
40
+ import "./chunk-BLVZFCKN.js";
37
41
  import {
38
42
  ConfigManager,
39
43
  PLUGINS_DIR,
40
44
  expandHome
41
- } from "./chunk-YXMRR2E3.js";
45
+ } from "./chunk-WF5XDN4D.js";
42
46
  import {
43
47
  cleanupOldSessionLogs,
44
48
  createChildLogger,
@@ -46,20 +50,24 @@ import {
46
50
  initLogger,
47
51
  log,
48
52
  shutdownLogger
49
- } from "./chunk-JOSJGZGF.js";
53
+ } from "./chunk-LYKCQTH5.js";
50
54
  export {
51
55
  AgentInstance,
52
56
  AgentManager,
53
57
  ApiServer,
54
58
  ChannelAdapter,
55
59
  ConfigManager,
60
+ MessageTransformer,
56
61
  NotificationManager,
57
62
  OpenACPCore,
58
63
  PLUGINS_DIR,
64
+ PermissionGate,
65
+ PromptQueue,
59
66
  Session,
60
67
  SessionManager,
61
68
  StderrCapture,
62
69
  TelegramAdapter,
70
+ TypedEmitter,
63
71
  cleanupOldSessionLogs,
64
72
  createChildLogger,
65
73
  createSessionLogger,
@@ -0,0 +1,8 @@
1
+ import {
2
+ ensureCloudflared
3
+ } from "./chunk-V3BA2MJ6.js";
4
+ import "./chunk-LYKCQTH5.js";
5
+ export {
6
+ ensureCloudflared
7
+ };
8
+ //# sourceMappingURL=install-cloudflared-ILUXKLAC.js.map