acp-discord 0.6.0 → 0.6.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.
package/dist/index.js CHANGED
@@ -215,9 +215,9 @@ function makeDaemonCommand() {
215
215
 
216
216
  // src/cli/init.ts
217
217
  import { Command as Command2 } from "commander";
218
- import { join as join3, resolve } from "path";
218
+ import { join as join4, resolve } from "path";
219
219
  import { homedir as homedir3 } from "os";
220
- import { existsSync as existsSync2, mkdirSync as mkdirSync2, readFileSync } from "fs";
220
+ import { existsSync as existsSync2, mkdirSync as mkdirSync2, readFileSync as readFileSync2 } from "fs";
221
221
  import { spawn as spawn2 } from "child_process";
222
222
  import { Readable, Writable } from "stream";
223
223
  import { ClientSideConnection, ndJsonStream, PROTOCOL_VERSION } from "@agentclientprotocol/sdk";
@@ -269,9 +269,22 @@ function detectInstalledAgents() {
269
269
  return found;
270
270
  }
271
271
 
272
+ // src/shared/version.ts
273
+ import { readFileSync } from "fs";
274
+ import { fileURLToPath as fileURLToPath2 } from "url";
275
+ import { join as join3, dirname } from "path";
276
+ var cached;
277
+ function getVersion() {
278
+ if (cached) return cached;
279
+ const dir = dirname(fileURLToPath2(import.meta.url));
280
+ const pkg = JSON.parse(readFileSync(join3(dir, "../../package.json"), "utf-8"));
281
+ cached = pkg.version;
282
+ return cached;
283
+ }
284
+
272
285
  // src/cli/init.ts
273
- var CONFIG_DIR2 = join3(homedir3(), ".acp-discord");
274
- var CONFIG_PATH = join3(CONFIG_DIR2, "config.toml");
286
+ var CONFIG_DIR2 = join4(homedir3(), ".acp-discord");
287
+ var CONFIG_PATH = join4(CONFIG_DIR2, "config.toml");
275
288
  var SAFE_WRITE_PREFIX = CONFIG_DIR2;
276
289
  var INIT_SYSTEM_PROMPT = `You are a setup assistant for acp-discord, a Discord bot that connects Discord channels to ACP coding agents.
277
290
 
@@ -393,7 +406,7 @@ Using: ${selected.name}
393
406
  fs: { readTextFile: true, writeTextFile: true },
394
407
  terminal: false
395
408
  },
396
- clientInfo: { name: "acp-discord-init", title: "ACP Discord Init", version: "0.1.0" }
409
+ clientInfo: { name: "acp-discord-init", title: "ACP Discord Init", version: getVersion() }
397
410
  });
398
411
  mkdirSync2(CONFIG_DIR2, { recursive: true });
399
412
  const { sessionId } = await connection.newSession({
@@ -410,7 +423,7 @@ Please start the setup.` }
410
423
  });
411
424
  if (existsSync2(CONFIG_PATH)) {
412
425
  try {
413
- const content = readFileSync(CONFIG_PATH, "utf-8");
426
+ const content = readFileSync2(CONFIG_PATH, "utf-8");
414
427
  parseConfig(content);
415
428
  console.log("\n\nSetup complete! Config written to", CONFIG_PATH);
416
429
  console.log("Run `npx acp-discord daemon start` to begin.");
@@ -429,7 +442,7 @@ Please start the setup.` }
429
442
  });
430
443
  if (result.stopReason === "end_turn" && existsSync2(CONFIG_PATH)) {
431
444
  try {
432
- const content = readFileSync(CONFIG_PATH, "utf-8");
445
+ const content = readFileSync2(CONFIG_PATH, "utf-8");
433
446
  parseConfig(content);
434
447
  console.log("\n\nSetup complete! Config written to", CONFIG_PATH);
435
448
  console.log("Run `npx acp-discord daemon start` to begin.");
@@ -446,11 +459,11 @@ Please start the setup.` }
446
459
 
447
460
  // src/cli/update.ts
448
461
  import { Command as Command3 } from "commander";
449
- import { join as join4 } from "path";
462
+ import { join as join5 } from "path";
450
463
  import { homedir as homedir4, platform as platform2 } from "os";
451
464
  import { execFileSync as execFileSync2, execSync as execSync2 } from "child_process";
452
- var CONFIG_DIR3 = join4(homedir4(), ".acp-discord");
453
- var PID_PATH2 = join4(CONFIG_DIR3, "daemon.pid");
465
+ var CONFIG_DIR3 = join5(homedir4(), ".acp-discord");
466
+ var PID_PATH2 = join5(CONFIG_DIR3, "daemon.pid");
454
467
  async function fetchLatestVersion() {
455
468
  const res = await fetch("https://registry.npmjs.org/acp-discord/latest");
456
469
  if (!res.ok) throw new Error(`npm registry returned ${res.status}`);
@@ -470,7 +483,7 @@ function stopDaemon() {
470
483
  }
471
484
  function makeUpdateCommand() {
472
485
  return new Command3("update").description("Update acp-discord to the latest version").action(async () => {
473
- const current = "0.1.0";
486
+ const current = getVersion();
474
487
  console.log(`Current version: v${current}`);
475
488
  console.log("Checking for updates...");
476
489
  let latest;
@@ -511,7 +524,7 @@ function makeUpdateCommand() {
511
524
  }
512
525
  } else if (os === "darwin") {
513
526
  console.log("Restarting via launchd...");
514
- const plistPath = join4(homedir4(), "Library", "LaunchAgents", "com.acp-discord.plist");
527
+ const plistPath = join5(homedir4(), "Library", "LaunchAgents", "com.acp-discord.plist");
515
528
  try {
516
529
  execSync2(`launchctl unload "${plistPath}"`, { stdio: "inherit" });
517
530
  } catch {
@@ -547,7 +560,7 @@ function makeUpdateCommand() {
547
560
  // src/cli/index.ts
548
561
  function createCli() {
549
562
  const program = new Command4();
550
- program.name("acp-discord").description("Discord bot for ACP coding agents").version("0.1.0");
563
+ program.name("acp-discord").description("Discord bot for ACP coding agents").version(getVersion());
551
564
  program.addCommand(makeInitCommand());
552
565
  program.addCommand(makeDaemonCommand());
553
566
  program.addCommand(makeUpdateCommand());
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/index.ts","../src/cli/daemon.ts","../src/cli/autostart.ts","../src/cli/init.ts","../src/shared/detect-agents.ts","../src/cli/update.ts","../src/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { makeDaemonCommand } from \"./daemon.js\";\nimport { makeInitCommand } from \"./init.js\";\nimport { makeUpdateCommand } from \"./update.js\";\n\ndeclare const __VERSION__: string;\n\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name(\"acp-discord\")\n .description(\"Discord bot for ACP coding agents\")\n .version(__VERSION__);\n\n program.addCommand(makeInitCommand());\n program.addCommand(makeDaemonCommand());\n program.addCommand(makeUpdateCommand());\n\n return program;\n}\n","import { Command } from \"commander\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { spawn } from \"node:child_process\";\nimport { openSync, closeSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { isDaemonRunning, readPid, removePid } from \"./pid.js\";\nimport { enableAutostart, disableAutostart } from \"./autostart.js\";\n\nconst CONFIG_DIR = join(homedir(), \".acp-discord\");\nconst PID_PATH = join(CONFIG_DIR, \"daemon.pid\");\nconst LOG_PATH = join(CONFIG_DIR, \"daemon.log\");\nconst ERR_LOG_PATH = join(CONFIG_DIR, \"daemon.error.log\");\n\nexport function makeDaemonCommand(): Command {\n const daemon = new Command(\"daemon\").description(\"Manage the acp-discord daemon\");\n\n daemon\n .command(\"start\")\n .description(\"Start the daemon (background)\")\n .action(async () => {\n if (isDaemonRunning(PID_PATH)) {\n const pid = readPid(PID_PATH);\n console.log(`Daemon already running (PID: ${pid})`);\n process.exit(1);\n }\n removePid(PID_PATH); // clean stale\n\n // In the bundled output, both index.js and daemon.js are in dist/\n const thisDir = fileURLToPath(new URL(\".\", import.meta.url));\n const daemonEntry = join(thisDir, \"daemon.js\");\n const outFd = openSync(LOG_PATH, \"a\");\n const errFd = openSync(ERR_LOG_PATH, \"a\");\n const child = spawn(process.execPath, [daemonEntry], {\n detached: true,\n stdio: [\"ignore\", outFd, errFd],\n env: { ...process.env, ACP_DISCORD_DAEMON: \"1\" },\n });\n\n child.unref();\n closeSync(outFd);\n closeSync(errFd);\n\n // Wait briefly and verify the daemon wrote its PID file (#11)\n await new Promise((resolve) => setTimeout(resolve, 1500));\n if (isDaemonRunning(PID_PATH)) {\n const pid = readPid(PID_PATH);\n console.log(`Daemon started (PID: ${pid})`);\n process.exit(0);\n } else {\n console.error(`Daemon failed to start (forked PID: ${child.pid}).`);\n console.error(`Check logs: ${ERR_LOG_PATH}`);\n process.exit(1);\n }\n });\n\n daemon\n .command(\"run\")\n .description(\"Run the daemon in foreground (for service managers)\")\n .action(async () => {\n if (isDaemonRunning(PID_PATH)) {\n const pid = readPid(PID_PATH);\n console.log(`Daemon already running (PID: ${pid})`);\n process.exit(1);\n }\n // Import and run directly in this process\n const { runDaemon } = await import(\"../daemon/index.js\");\n await runDaemon();\n });\n\n daemon\n .command(\"stop\")\n .description(\"Stop the daemon\")\n .action(async () => {\n const pid = readPid(PID_PATH);\n if (pid === null) {\n console.log(\"Daemon is not running\");\n return;\n }\n try {\n process.kill(pid, \"SIGTERM\");\n removePid(PID_PATH);\n console.log(`Daemon stopped (PID: ${pid})`);\n } catch {\n removePid(PID_PATH);\n console.log(\"Daemon was not running (stale PID removed)\");\n }\n });\n\n daemon\n .command(\"status\")\n .description(\"Show daemon status\")\n .action(async () => {\n if (isDaemonRunning(PID_PATH)) {\n const pid = readPid(PID_PATH);\n console.log(`Daemon is running (PID: ${pid})`);\n } else {\n removePid(PID_PATH);\n console.log(\"Daemon is not running\");\n }\n });\n\n daemon\n .command(\"enable\")\n .description(\"Enable auto-start on boot\")\n .action(async () => {\n enableAutostart();\n });\n\n daemon\n .command(\"disable\")\n .description(\"Disable auto-start on boot\")\n .action(async () => {\n disableAutostart();\n });\n\n return daemon;\n}\n","import { writeFileSync, unlinkSync, existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir, platform } from \"node:os\";\nimport { execSync } from \"node:child_process\";\n\nconst SYSTEMD_DIR = join(homedir(), \".config\", \"systemd\", \"user\");\nconst SYSTEMD_SERVICE = \"acp-discord.service\";\nconst LAUNCHD_DIR = join(homedir(), \"Library\", \"LaunchAgents\");\nconst LAUNCHD_PLIST = \"com.acp-discord.plist\";\n\nfunction getNpxPath(): string {\n try {\n return execSync(\"which npx\", { encoding: \"utf-8\" }).trim();\n } catch {\n throw new Error(\"npx not found in PATH. Ensure Node.js is installed.\");\n }\n}\n\nexport function enableAutostart(): void {\n const os = platform();\n\n if (os === \"linux\") {\n mkdirSync(SYSTEMD_DIR, { recursive: true });\n const npx = getNpxPath();\n // Use \"daemon run\" for foreground mode — correct for systemd lifecycle (#10)\n const service = `[Unit]\nDescription=acp-discord daemon\nAfter=network.target\nStartLimitIntervalSec=300\nStartLimitBurst=5\n\n[Service]\nExecStart=${npx} acp-discord daemon run\nRestart=always\nRestartSec=10\n\n[Install]\nWantedBy=default.target\n`;\n const servicePath = join(SYSTEMD_DIR, SYSTEMD_SERVICE);\n writeFileSync(servicePath, service);\n try {\n execSync(\"systemctl --user daemon-reload\");\n execSync(`systemctl --user enable ${SYSTEMD_SERVICE}`);\n } catch (err) {\n console.error(\"Failed to enable systemd service:\", err instanceof Error ? err.message : err);\n return;\n }\n console.log(`Enabled systemd service: ${servicePath}`);\n console.log(\"Run: systemctl --user start acp-discord\");\n } else if (os === \"darwin\") {\n mkdirSync(LAUNCHD_DIR, { recursive: true });\n const npx = getNpxPath();\n // Use \"daemon run\" for foreground mode — correct for launchd lifecycle (#10)\n const plist = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>com.acp-discord</string>\n <key>ProgramArguments</key>\n <array>\n <string>${npx}</string>\n <string>acp-discord</string>\n <string>daemon</string>\n <string>run</string>\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>StandardOutPath</key>\n <string>${join(homedir(), \".acp-discord\", \"daemon.log\")}</string>\n <key>StandardErrorPath</key>\n <string>${join(homedir(), \".acp-discord\", \"daemon.error.log\")}</string>\n</dict>\n</plist>`;\n const plistPath = join(LAUNCHD_DIR, LAUNCHD_PLIST);\n writeFileSync(plistPath, plist);\n console.log(`Enabled launchd service: ${plistPath}`);\n console.log(\"Run: launchctl load \" + plistPath);\n } else {\n console.error(`Auto-start not supported on ${os}. Use your OS service manager manually.`);\n }\n}\n\nexport function isAutostartEnabled(): boolean {\n const os = platform();\n if (os === \"linux\") {\n return existsSync(join(SYSTEMD_DIR, SYSTEMD_SERVICE));\n } else if (os === \"darwin\") {\n return existsSync(join(LAUNCHD_DIR, LAUNCHD_PLIST));\n }\n return false;\n}\n\nexport function disableAutostart(): void {\n const os = platform();\n\n if (os === \"linux\") {\n const servicePath = join(SYSTEMD_DIR, SYSTEMD_SERVICE);\n try {\n execSync(`systemctl --user disable ${SYSTEMD_SERVICE}`);\n } catch {\n // may not be enabled\n }\n if (existsSync(servicePath)) unlinkSync(servicePath);\n try {\n execSync(\"systemctl --user daemon-reload\");\n } catch (err) {\n console.error(\"Failed to reload systemd:\", err instanceof Error ? err.message : err);\n }\n console.log(\"Disabled systemd auto-start\");\n } else if (os === \"darwin\") {\n const plistPath = join(LAUNCHD_DIR, LAUNCHD_PLIST);\n try {\n execSync(`launchctl unload ${plistPath}`);\n } catch {\n // may not be loaded\n }\n if (existsSync(plistPath)) unlinkSync(plistPath);\n console.log(\"Disabled launchd auto-start\");\n } else {\n console.error(`Auto-start not supported on ${os}.`);\n }\n}\n","import { Command } from \"commander\";\nimport { join, resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { existsSync, mkdirSync, readFileSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { Readable, Writable } from \"node:stream\";\nimport { ClientSideConnection, ndJsonStream, PROTOCOL_VERSION } from \"@agentclientprotocol/sdk\";\nimport type { Client } from \"@agentclientprotocol/sdk\";\nimport { detectInstalledAgents } from \"../shared/detect-agents.js\";\nimport { parseConfig } from \"../shared/config.js\";\n\ndeclare const __VERSION__: string;\n\nconst CONFIG_DIR = join(homedir(), \".acp-discord\");\nconst CONFIG_PATH = join(CONFIG_DIR, \"config.toml\");\n\n// Only auto-allow writes to the config directory during setup\nconst SAFE_WRITE_PREFIX = CONFIG_DIR;\n\nconst INIT_SYSTEM_PROMPT = `You are a setup assistant for acp-discord, a Discord bot that connects Discord channels to ACP coding agents.\n\nYour job is to help the user configure ~/.acp-discord/config.toml interactively.\n\nYou need to collect:\n1. Discord Bot Token (guide them to https://discord.com/developers/applications if needed)\n2. Default working directory (the project path the agent will work on)\n3. Channel IDs to bind (explain how to get channel IDs: right-click channel → Copy Channel ID)\n4. Reply mode per channel: ask whether the bot should respond to ALL messages in the channel (auto_reply = true) or only when @mentioned (auto_reply = false, the default)\n\nOnce you have all info, write the config file using the write_text_file tool to ${CONFIG_PATH}.\n\nConfig format (TOML):\n\\`\\`\\`toml\n[discord]\ntoken = \"<token>\"\n\n[agents.default]\ncommand = \"npx\"\nargs = [\"<acp-package>\"]\ncwd = \"<working-directory>\"\nidle_timeout = 600\n\n[channels.<channel-id>]\nagent = \"default\"\nauto_reply = false # true = respond to all messages; false = only @mentions\n\\`\\`\\`\n\nBe friendly and concise. Ask one question at a time.`;\n\nexport function makeInitCommand(): Command {\n return new Command(\"init\")\n .description(\"Interactive setup wizard\")\n .action(async () => {\n console.log(\"Welcome to acp-discord setup!\\n\");\n\n // Detect agents\n console.log(\"Detecting ACP-compatible agents...\");\n const agents = detectInstalledAgents();\n\n if (agents.length === 0) {\n console.error(\"No ACP-compatible agents found.\");\n console.error(\"Install one of: claude-code, codex, opencode, pi\");\n process.exit(1);\n }\n\n for (const agent of agents) {\n console.log(` \\u2713 ${agent.name} (found)`);\n }\n\n const selected = agents[0];\n console.log(`\\nUsing: ${selected.name}\\n`);\n console.log(\"Starting setup agent...\\n\");\n\n // Spawn ACP agent for interactive setup\n const proc = spawn(selected.command, [selected.acpPackage], {\n stdio: [\"pipe\", \"pipe\", \"inherit\"],\n });\n\n const stream = ndJsonStream(\n Writable.toWeb(proc.stdin!) as WritableStream<Uint8Array>,\n Readable.toWeb(proc.stdout!) as ReadableStream<Uint8Array>,\n );\n\n // Simple readline for user input\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const askUser = (prompt: string): Promise<string> =>\n new Promise((resolve) => rl.question(prompt, resolve));\n\n const client: Client = {\n async requestPermission(params) {\n const title = params.toolCall.title ?? \"Unknown\";\n const kind = params.toolCall.kind ?? \"other\";\n\n // Auto-allow only safe file writes within the config directory,\n // validated against actual tool locations (not spoofable title) (#2)\n const isSafeWrite = kind === \"write_text_file\" || kind === \"fs\" || kind === \"edit\";\n if (isSafeWrite && params.toolCall.locations?.length) {\n const allPathsSafe = params.toolCall.locations.every(\n (loc: { path: string }) => {\n const resolved = resolve(loc.path);\n return resolved.startsWith(SAFE_WRITE_PREFIX + \"/\") || resolved === SAFE_WRITE_PREFIX;\n },\n );\n if (allPathsSafe) {\n const allowOption = params.options.find((o: { kind: string }) => o.kind === \"allow_once\");\n if (allowOption) {\n return { outcome: { outcome: \"selected\" as const, optionId: allowOption.optionId } };\n }\n }\n }\n\n // For all other operations, ask the user\n console.log(`\\n--- Permission Request ---`);\n console.log(`Tool: ${title}`);\n console.log(`Type: ${kind}`);\n console.log(`Options:`);\n for (let i = 0; i < params.options.length; i++) {\n const opt = params.options[i];\n console.log(` ${i + 1}. ${opt.name} (${opt.kind})`);\n }\n\n const answer = await askUser(`Choose option (1-${params.options.length}, or 'c' to cancel): `);\n if (answer.toLowerCase() === \"c\") {\n const rejectOption = params.options.find((o: { kind: string }) => o.kind === \"reject_once\");\n if (rejectOption) {\n return { outcome: { outcome: \"selected\" as const, optionId: rejectOption.optionId } };\n }\n return { outcome: { outcome: \"cancelled\" as const } };\n }\n\n const idx = parseInt(answer, 10) - 1;\n if (idx >= 0 && idx < params.options.length) {\n return { outcome: { outcome: \"selected\" as const, optionId: params.options[idx].optionId } };\n }\n\n // Invalid input — default to reject\n const rejectOption = params.options.find((o: { kind: string }) => o.kind === \"reject_once\");\n if (rejectOption) {\n return { outcome: { outcome: \"selected\" as const, optionId: rejectOption.optionId } };\n }\n return { outcome: { outcome: \"cancelled\" as const } };\n },\n async sessionUpdate(params) {\n const update = params.update;\n if (update.sessionUpdate === \"agent_message_chunk\" && update.content.type === \"text\") {\n process.stdout.write(update.content.text);\n }\n },\n };\n\n const connection = new ClientSideConnection((_agent) => client, stream);\n\n await connection.initialize({\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: {\n fs: { readTextFile: true, writeTextFile: true },\n terminal: false,\n },\n clientInfo: { name: \"acp-discord-init\", title: \"ACP Discord Init\", version: __VERSION__ },\n });\n\n mkdirSync(CONFIG_DIR, { recursive: true });\n\n const { sessionId } = await connection.newSession({\n cwd: CONFIG_DIR,\n mcpServers: [],\n });\n\n // Initial prompt\n await connection.prompt({\n sessionId,\n prompt: [\n { type: \"text\", text: INIT_SYSTEM_PROMPT },\n { type: \"text\", text: `The ACP agent package is: ${selected.acpPackage}\\nPlease start the setup.` },\n ],\n });\n\n // Check if config was already written during the initial prompt\n if (existsSync(CONFIG_PATH)) {\n try {\n const content = readFileSync(CONFIG_PATH, \"utf-8\");\n parseConfig(content);\n console.log(\"\\n\\nSetup complete! Config written to\", CONFIG_PATH);\n console.log(\"Run `npx acp-discord daemon start` to begin.\");\n rl.close();\n proc.kill();\n process.exit(0);\n } catch {\n // config not valid yet, continue to interactive loop\n }\n }\n\n // Interactive loop\n while (true) {\n const input = await askUser(\"\\n> \");\n if (input.toLowerCase() === \"exit\" || input.toLowerCase() === \"quit\") break;\n\n const result = await connection.prompt({\n sessionId,\n prompt: [{ type: \"text\", text: input }],\n });\n\n if (result.stopReason === \"end_turn\" && existsSync(CONFIG_PATH)) {\n // Validate the written config is structurally valid (#9)\n try {\n const content = readFileSync(CONFIG_PATH, \"utf-8\");\n parseConfig(content); // throws if invalid\n console.log(\"\\n\\nSetup complete! Config written to\", CONFIG_PATH);\n console.log(\"Run `npx acp-discord daemon start` to begin.\");\n break;\n } catch {\n // config not valid yet, continue\n }\n }\n }\n\n rl.close();\n proc.kill();\n process.exit(0);\n });\n}\n","import { execFileSync } from \"node:child_process\";\n\nexport interface AgentInfo {\n name: string;\n command: string;\n acpPackage: string;\n detectCommand: string;\n detectArgs: string[];\n}\n\nexport const KNOWN_AGENTS: AgentInfo[] = [\n {\n name: \"claude-code\",\n command: \"npx\",\n acpPackage: \"@zed-industries/claude-agent-acp\",\n detectCommand: \"claude\",\n detectArgs: [\"--version\"],\n },\n {\n name: \"codex\",\n command: \"npx\",\n acpPackage: \"@openai/codex-acp\",\n detectCommand: \"codex\",\n detectArgs: [\"--version\"],\n },\n {\n name: \"opencode\",\n command: \"npx\",\n acpPackage: \"@opencode/acp\",\n detectCommand: \"opencode\",\n detectArgs: [\"--version\"],\n },\n {\n name: \"pi\",\n command: \"npx\",\n acpPackage: \"@anthropic-ai/pi-acp\",\n detectCommand: \"pi\",\n detectArgs: [\"--version\"],\n },\n];\n\nexport function detectInstalledAgents(): AgentInfo[] {\n const found: AgentInfo[] = [];\n for (const agent of KNOWN_AGENTS) {\n try {\n execFileSync(agent.detectCommand, agent.detectArgs, {\n stdio: \"ignore\",\n timeout: 5000,\n });\n found.push(agent);\n } catch {\n // not installed\n }\n }\n return found;\n}\n","import { Command } from \"commander\";\nimport { join } from \"node:path\";\nimport { homedir, platform } from \"node:os\";\nimport { execFileSync, execSync } from \"node:child_process\";\nimport { isDaemonRunning, readPid, removePid } from \"./pid.js\";\nimport { isAutostartEnabled, enableAutostart } from \"./autostart.js\";\n\ndeclare const __VERSION__: string;\n\nconst CONFIG_DIR = join(homedir(), \".acp-discord\");\nconst PID_PATH = join(CONFIG_DIR, \"daemon.pid\");\n\nasync function fetchLatestVersion(): Promise<string> {\n const res = await fetch(\"https://registry.npmjs.org/acp-discord/latest\");\n if (!res.ok) throw new Error(`npm registry returned ${res.status}`);\n const data = (await res.json()) as { version: string };\n return data.version;\n}\n\nfunction stopDaemon(): void {\n const pid = readPid(PID_PATH);\n if (pid === null) return;\n try {\n process.kill(pid, \"SIGTERM\");\n removePid(PID_PATH);\n console.log(`Stopped daemon (PID: ${pid})`);\n } catch {\n removePid(PID_PATH);\n }\n}\n\nexport function makeUpdateCommand(): Command {\n return new Command(\"update\")\n .description(\"Update acp-discord to the latest version\")\n .action(async () => {\n const current = __VERSION__;\n\n console.log(`Current version: v${current}`);\n console.log(\"Checking for updates...\");\n\n let latest: string;\n try {\n latest = await fetchLatestVersion();\n } catch (err) {\n console.error(\"Failed to check for updates:\", (err as Error).message);\n process.exit(1);\n }\n\n if (current === latest) {\n console.log(`Already up to date (v${current})`);\n return;\n }\n\n console.log(`Update available: v${current} → v${latest}`);\n\n // Pre-fetch the latest version into npx cache so subsequent runs use it\n console.log(\"Downloading latest version...\");\n try {\n execFileSync(\"npx\", [\"--yes\", \"acp-discord@latest\", \"--version\"], {\n stdio: \"inherit\",\n });\n } catch {\n console.error(\"Failed to download latest version.\");\n console.error(\"You can try manually: npx acp-discord@latest daemon start\");\n process.exit(1);\n }\n\n const autostart = isAutostartEnabled();\n\n if (autostart) {\n // When managed by systemd/launchd, regenerate config and use the\n // service manager to restart — avoids conflicts with Restart=always.\n console.log(\"Updating autostart configuration...\");\n enableAutostart();\n\n const os = platform();\n if (os === \"linux\") {\n console.log(\"Restarting via systemd...\");\n try {\n execSync(\"systemctl --user restart acp-discord\", { stdio: \"inherit\" });\n } catch {\n console.error(\"Failed to restart systemd service.\");\n console.error(\"You can try manually: systemctl --user restart acp-discord\");\n process.exit(1);\n }\n } else if (os === \"darwin\") {\n console.log(\"Restarting via launchd...\");\n const plistPath = join(homedir(), \"Library\", \"LaunchAgents\", \"com.acp-discord.plist\");\n // Unload may fail if not currently loaded — that's fine\n try { execSync(`launchctl unload \"${plistPath}\"`, { stdio: \"inherit\" }); } catch { /* not loaded */ }\n try {\n execSync(`launchctl load \"${plistPath}\"`, { stdio: \"inherit\" });\n } catch {\n console.error(\"Failed to restart launchd service.\");\n process.exit(1);\n }\n }\n } else {\n // Manual daemon management — stop and restart directly\n const wasRunning = isDaemonRunning(PID_PATH);\n if (wasRunning) {\n console.log(\"Stopping daemon...\");\n stopDaemon();\n }\n\n console.log(\"Restarting daemon...\");\n try {\n execFileSync(\"npx\", [\"--yes\", \"acp-discord@latest\", \"daemon\", \"start\"], {\n stdio: \"inherit\",\n });\n } catch {\n console.error(\"Failed to start daemon with new version.\");\n console.error(\"You can try manually: npx acp-discord@latest daemon start\");\n process.exit(1);\n }\n }\n\n console.log(`Updated to v${latest}`);\n });\n}\n","import { createCli } from \"./cli/index.js\";\n\ncreateCli().parse();\n"],"mappings":";;;;;;;;;AAAA,SAAS,WAAAA,gBAAe;;;ACAxB,SAAS,eAAe;AACxB,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AACxB,SAAS,aAAa;AACtB,SAAS,UAAU,iBAAiB;AACpC,SAAS,qBAAqB;;;ACL9B,SAAS,eAAe,YAAY,YAAY,iBAAiB;AACjE,SAAS,YAAY;AACrB,SAAS,SAAS,gBAAgB;AAClC,SAAS,gBAAgB;AAEzB,IAAM,cAAc,KAAK,QAAQ,GAAG,WAAW,WAAW,MAAM;AAChE,IAAM,kBAAkB;AACxB,IAAM,cAAc,KAAK,QAAQ,GAAG,WAAW,cAAc;AAC7D,IAAM,gBAAgB;AAEtB,SAAS,aAAqB;AAC5B,MAAI;AACF,WAAO,SAAS,aAAa,EAAE,UAAU,QAAQ,CAAC,EAAE,KAAK;AAAA,EAC3D,QAAQ;AACN,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACF;AAEO,SAAS,kBAAwB;AACtC,QAAM,KAAK,SAAS;AAEpB,MAAI,OAAO,SAAS;AAClB,cAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAC1C,UAAM,MAAM,WAAW;AAEvB,UAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAOR,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOX,UAAM,cAAc,KAAK,aAAa,eAAe;AACrD,kBAAc,aAAa,OAAO;AAClC,QAAI;AACF,eAAS,gCAAgC;AACzC,eAAS,2BAA2B,eAAe,EAAE;AAAA,IACvD,SAAS,KAAK;AACZ,cAAQ,MAAM,qCAAqC,eAAe,QAAQ,IAAI,UAAU,GAAG;AAC3F;AAAA,IACF;AACA,YAAQ,IAAI,4BAA4B,WAAW,EAAE;AACrD,YAAQ,IAAI,yCAAyC;AAAA,EACvD,WAAW,OAAO,UAAU;AAC1B,cAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAC1C,UAAM,MAAM,WAAW;AAEvB,UAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAQJ,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAUL,KAAK,QAAQ,GAAG,gBAAgB,YAAY,CAAC;AAAA;AAAA,YAE7C,KAAK,QAAQ,GAAG,gBAAgB,kBAAkB,CAAC;AAAA;AAAA;AAG3D,UAAM,YAAY,KAAK,aAAa,aAAa;AACjD,kBAAc,WAAW,KAAK;AAC9B,YAAQ,IAAI,4BAA4B,SAAS,EAAE;AACnD,YAAQ,IAAI,yBAAyB,SAAS;AAAA,EAChD,OAAO;AACL,YAAQ,MAAM,+BAA+B,EAAE,yCAAyC;AAAA,EAC1F;AACF;AAEO,SAAS,qBAA8B;AAC5C,QAAM,KAAK,SAAS;AACpB,MAAI,OAAO,SAAS;AAClB,WAAO,WAAW,KAAK,aAAa,eAAe,CAAC;AAAA,EACtD,WAAW,OAAO,UAAU;AAC1B,WAAO,WAAW,KAAK,aAAa,aAAa,CAAC;AAAA,EACpD;AACA,SAAO;AACT;AAEO,SAAS,mBAAyB;AACvC,QAAM,KAAK,SAAS;AAEpB,MAAI,OAAO,SAAS;AAClB,UAAM,cAAc,KAAK,aAAa,eAAe;AACrD,QAAI;AACF,eAAS,4BAA4B,eAAe,EAAE;AAAA,IACxD,QAAQ;AAAA,IAER;AACA,QAAI,WAAW,WAAW,EAAG,YAAW,WAAW;AACnD,QAAI;AACF,eAAS,gCAAgC;AAAA,IAC3C,SAAS,KAAK;AACZ,cAAQ,MAAM,6BAA6B,eAAe,QAAQ,IAAI,UAAU,GAAG;AAAA,IACrF;AACA,YAAQ,IAAI,6BAA6B;AAAA,EAC3C,WAAW,OAAO,UAAU;AAC1B,UAAM,YAAY,KAAK,aAAa,aAAa;AACjD,QAAI;AACF,eAAS,oBAAoB,SAAS,EAAE;AAAA,IAC1C,QAAQ;AAAA,IAER;AACA,QAAI,WAAW,SAAS,EAAG,YAAW,SAAS;AAC/C,YAAQ,IAAI,6BAA6B;AAAA,EAC3C,OAAO;AACL,YAAQ,MAAM,+BAA+B,EAAE,GAAG;AAAA,EACpD;AACF;;;ADpHA,IAAM,aAAaC,MAAKC,SAAQ,GAAG,cAAc;AACjD,IAAM,WAAWD,MAAK,YAAY,YAAY;AAC9C,IAAM,WAAWA,MAAK,YAAY,YAAY;AAC9C,IAAM,eAAeA,MAAK,YAAY,kBAAkB;AAEjD,SAAS,oBAA6B;AAC3C,QAAM,SAAS,IAAI,QAAQ,QAAQ,EAAE,YAAY,+BAA+B;AAEhF,SACG,QAAQ,OAAO,EACf,YAAY,+BAA+B,EAC3C,OAAO,YAAY;AAClB,QAAI,gBAAgB,QAAQ,GAAG;AAC7B,YAAM,MAAM,QAAQ,QAAQ;AAC5B,cAAQ,IAAI,gCAAgC,GAAG,GAAG;AAClD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,cAAU,QAAQ;AAGlB,UAAM,UAAU,cAAc,IAAI,IAAI,KAAK,YAAY,GAAG,CAAC;AAC3D,UAAM,cAAcA,MAAK,SAAS,WAAW;AAC7C,UAAM,QAAQ,SAAS,UAAU,GAAG;AACpC,UAAM,QAAQ,SAAS,cAAc,GAAG;AACxC,UAAM,QAAQ,MAAM,QAAQ,UAAU,CAAC,WAAW,GAAG;AAAA,MACnD,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,OAAO,KAAK;AAAA,MAC9B,KAAK,EAAE,GAAG,QAAQ,KAAK,oBAAoB,IAAI;AAAA,IACjD,CAAC;AAED,UAAM,MAAM;AACZ,cAAU,KAAK;AACf,cAAU,KAAK;AAGf,UAAM,IAAI,QAAQ,CAACE,aAAY,WAAWA,UAAS,IAAI,CAAC;AACxD,QAAI,gBAAgB,QAAQ,GAAG;AAC7B,YAAM,MAAM,QAAQ,QAAQ;AAC5B,cAAQ,IAAI,wBAAwB,GAAG,GAAG;AAC1C,cAAQ,KAAK,CAAC;AAAA,IAChB,OAAO;AACL,cAAQ,MAAM,uCAAuC,MAAM,GAAG,IAAI;AAClE,cAAQ,MAAM,eAAe,YAAY,EAAE;AAC3C,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,KAAK,EACb,YAAY,qDAAqD,EACjE,OAAO,YAAY;AAClB,QAAI,gBAAgB,QAAQ,GAAG;AAC7B,YAAM,MAAM,QAAQ,QAAQ;AAC5B,cAAQ,IAAI,gCAAgC,GAAG,GAAG;AAClD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,aAAoB;AACvD,UAAM,UAAU;AAAA,EAClB,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,YAAY,iBAAiB,EAC7B,OAAO,YAAY;AAClB,UAAM,MAAM,QAAQ,QAAQ;AAC5B,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,uBAAuB;AACnC;AAAA,IACF;AACA,QAAI;AACF,cAAQ,KAAK,KAAK,SAAS;AAC3B,gBAAU,QAAQ;AAClB,cAAQ,IAAI,wBAAwB,GAAG,GAAG;AAAA,IAC5C,QAAQ;AACN,gBAAU,QAAQ;AAClB,cAAQ,IAAI,4CAA4C;AAAA,IAC1D;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,QAAQ,EAChB,YAAY,oBAAoB,EAChC,OAAO,YAAY;AAClB,QAAI,gBAAgB,QAAQ,GAAG;AAC7B,YAAM,MAAM,QAAQ,QAAQ;AAC5B,cAAQ,IAAI,2BAA2B,GAAG,GAAG;AAAA,IAC/C,OAAO;AACL,gBAAU,QAAQ;AAClB,cAAQ,IAAI,uBAAuB;AAAA,IACrC;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,QAAQ,EAChB,YAAY,2BAA2B,EACvC,OAAO,YAAY;AAClB,oBAAgB;AAAA,EAClB,CAAC;AAEH,SACG,QAAQ,SAAS,EACjB,YAAY,4BAA4B,EACxC,OAAO,YAAY;AAClB,qBAAiB;AAAA,EACnB,CAAC;AAEH,SAAO;AACT;;;AErHA,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,OAAM,eAAe;AAC9B,SAAS,WAAAC,gBAAe;AACxB,SAAS,cAAAC,aAAY,aAAAC,YAAW,oBAAoB;AACpD,SAAS,SAAAC,cAAa;AACtB,SAAS,UAAU,gBAAgB;AACnC,SAAS,sBAAsB,cAAc,wBAAwB;;;ACNrE,SAAS,oBAAoB;AAUtB,IAAM,eAA4B;AAAA,EACvC;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,YAAY,CAAC,WAAW;AAAA,EAC1B;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,YAAY,CAAC,WAAW;AAAA,EAC1B;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,YAAY,CAAC,WAAW;AAAA,EAC1B;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,YAAY,CAAC,WAAW;AAAA,EAC1B;AACF;AAEO,SAAS,wBAAqC;AACnD,QAAM,QAAqB,CAAC;AAC5B,aAAW,SAAS,cAAc;AAChC,QAAI;AACF,mBAAa,MAAM,eAAe,MAAM,YAAY;AAAA,QAClD,OAAO;AAAA,QACP,SAAS;AAAA,MACX,CAAC;AACD,YAAM,KAAK,KAAK;AAAA,IAClB,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;;;AD1CA,IAAMC,cAAaC,MAAKC,SAAQ,GAAG,cAAc;AACjD,IAAM,cAAcD,MAAKD,aAAY,aAAa;AAGlD,IAAM,oBAAoBA;AAE1B,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kFAUuD,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBtF,SAAS,kBAA2B;AACzC,SAAO,IAAIG,SAAQ,MAAM,EACtB,YAAY,0BAA0B,EACtC,OAAO,YAAY;AAClB,YAAQ,IAAI,iCAAiC;AAG7C,YAAQ,IAAI,oCAAoC;AAChD,UAAM,SAAS,sBAAsB;AAErC,QAAI,OAAO,WAAW,GAAG;AACvB,cAAQ,MAAM,iCAAiC;AAC/C,cAAQ,MAAM,kDAAkD;AAChE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,eAAW,SAAS,QAAQ;AAC1B,cAAQ,IAAI,YAAY,MAAM,IAAI,UAAU;AAAA,IAC9C;AAEA,UAAM,WAAW,OAAO,CAAC;AACzB,YAAQ,IAAI;AAAA,SAAY,SAAS,IAAI;AAAA,CAAI;AACzC,YAAQ,IAAI,2BAA2B;AAGvC,UAAM,OAAOC,OAAM,SAAS,SAAS,CAAC,SAAS,UAAU,GAAG;AAAA,MAC1D,OAAO,CAAC,QAAQ,QAAQ,SAAS;AAAA,IACnC,CAAC;AAED,UAAM,SAAS;AAAA,MACb,SAAS,MAAM,KAAK,KAAM;AAAA,MAC1B,SAAS,MAAM,KAAK,MAAO;AAAA,IAC7B;AAGA,UAAM,WAAW,MAAM,OAAO,UAAe;AAC7C,UAAM,KAAK,SAAS,gBAAgB;AAAA,MAClC,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,UAAM,UAAU,CAAC,WACf,IAAI,QAAQ,CAACC,aAAY,GAAG,SAAS,QAAQA,QAAO,CAAC;AAEvD,UAAM,SAAiB;AAAA,MACrB,MAAM,kBAAkB,QAAQ;AAC9B,cAAM,QAAQ,OAAO,SAAS,SAAS;AACvC,cAAM,OAAO,OAAO,SAAS,QAAQ;AAIrC,cAAM,cAAc,SAAS,qBAAqB,SAAS,QAAQ,SAAS;AAC5E,YAAI,eAAe,OAAO,SAAS,WAAW,QAAQ;AACpD,gBAAM,eAAe,OAAO,SAAS,UAAU;AAAA,YAC7C,CAAC,QAA0B;AACzB,oBAAM,WAAW,QAAQ,IAAI,IAAI;AACjC,qBAAO,SAAS,WAAW,oBAAoB,GAAG,KAAK,aAAa;AAAA,YACtE;AAAA,UACF;AACA,cAAI,cAAc;AAChB,kBAAM,cAAc,OAAO,QAAQ,KAAK,CAAC,MAAwB,EAAE,SAAS,YAAY;AACxF,gBAAI,aAAa;AACf,qBAAO,EAAE,SAAS,EAAE,SAAS,YAAqB,UAAU,YAAY,SAAS,EAAE;AAAA,YACrF;AAAA,UACF;AAAA,QACF;AAGA,gBAAQ,IAAI;AAAA,2BAA8B;AAC1C,gBAAQ,IAAI,SAAS,KAAK,EAAE;AAC5B,gBAAQ,IAAI,SAAS,IAAI,EAAE;AAC3B,gBAAQ,IAAI,UAAU;AACtB,iBAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,QAAQ,KAAK;AAC9C,gBAAM,MAAM,OAAO,QAAQ,CAAC;AAC5B,kBAAQ,IAAI,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG;AAAA,QACrD;AAEA,cAAM,SAAS,MAAM,QAAQ,oBAAoB,OAAO,QAAQ,MAAM,uBAAuB;AAC7F,YAAI,OAAO,YAAY,MAAM,KAAK;AAChC,gBAAMC,gBAAe,OAAO,QAAQ,KAAK,CAAC,MAAwB,EAAE,SAAS,aAAa;AAC1F,cAAIA,eAAc;AAChB,mBAAO,EAAE,SAAS,EAAE,SAAS,YAAqB,UAAUA,cAAa,SAAS,EAAE;AAAA,UACtF;AACA,iBAAO,EAAE,SAAS,EAAE,SAAS,YAAqB,EAAE;AAAA,QACtD;AAEA,cAAM,MAAM,SAAS,QAAQ,EAAE,IAAI;AACnC,YAAI,OAAO,KAAK,MAAM,OAAO,QAAQ,QAAQ;AAC3C,iBAAO,EAAE,SAAS,EAAE,SAAS,YAAqB,UAAU,OAAO,QAAQ,GAAG,EAAE,SAAS,EAAE;AAAA,QAC7F;AAGA,cAAM,eAAe,OAAO,QAAQ,KAAK,CAAC,MAAwB,EAAE,SAAS,aAAa;AAC1F,YAAI,cAAc;AAChB,iBAAO,EAAE,SAAS,EAAE,SAAS,YAAqB,UAAU,aAAa,SAAS,EAAE;AAAA,QACtF;AACA,eAAO,EAAE,SAAS,EAAE,SAAS,YAAqB,EAAE;AAAA,MACtD;AAAA,MACA,MAAM,cAAc,QAAQ;AAC1B,cAAM,SAAS,OAAO;AACtB,YAAI,OAAO,kBAAkB,yBAAyB,OAAO,QAAQ,SAAS,QAAQ;AACpF,kBAAQ,OAAO,MAAM,OAAO,QAAQ,IAAI;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAAa,IAAI,qBAAqB,CAAC,WAAW,QAAQ,MAAM;AAEtE,UAAM,WAAW,WAAW;AAAA,MAC1B,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,QAClB,IAAI,EAAE,cAAc,MAAM,eAAe,KAAK;AAAA,QAC9C,UAAU;AAAA,MACZ;AAAA,MACA,YAAY,EAAE,MAAM,oBAAoB,OAAO,oBAAoB,SAAS,QAAY;AAAA,IAC1F,CAAC;AAED,IAAAC,WAAUP,aAAY,EAAE,WAAW,KAAK,CAAC;AAEzC,UAAM,EAAE,UAAU,IAAI,MAAM,WAAW,WAAW;AAAA,MAChD,KAAKA;AAAA,MACL,YAAY,CAAC;AAAA,IACf,CAAC;AAGD,UAAM,WAAW,OAAO;AAAA,MACtB;AAAA,MACA,QAAQ;AAAA,QACN,EAAE,MAAM,QAAQ,MAAM,mBAAmB;AAAA,QACzC,EAAE,MAAM,QAAQ,MAAM,6BAA6B,SAAS,UAAU;AAAA,yBAA4B;AAAA,MACpG;AAAA,IACF,CAAC;AAGD,QAAIQ,YAAW,WAAW,GAAG;AAC3B,UAAI;AACF,cAAM,UAAU,aAAa,aAAa,OAAO;AACjD,oBAAY,OAAO;AACnB,gBAAQ,IAAI,yCAAyC,WAAW;AAChE,gBAAQ,IAAI,8CAA8C;AAC1D,WAAG,MAAM;AACT,aAAK,KAAK;AACV,gBAAQ,KAAK,CAAC;AAAA,MAChB,QAAQ;AAAA,MAER;AAAA,IACF;AAGA,WAAO,MAAM;AACX,YAAM,QAAQ,MAAM,QAAQ,MAAM;AAClC,UAAI,MAAM,YAAY,MAAM,UAAU,MAAM,YAAY,MAAM,OAAQ;AAEtE,YAAM,SAAS,MAAM,WAAW,OAAO;AAAA,QACrC;AAAA,QACA,QAAQ,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,MACxC,CAAC;AAED,UAAI,OAAO,eAAe,cAAcA,YAAW,WAAW,GAAG;AAE/D,YAAI;AACF,gBAAM,UAAU,aAAa,aAAa,OAAO;AACjD,sBAAY,OAAO;AACnB,kBAAQ,IAAI,yCAAyC,WAAW;AAChE,kBAAQ,IAAI,8CAA8C;AAC1D;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,OAAG,MAAM;AACT,SAAK,KAAK;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACL;;;AEjOA,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,UAAS,YAAAC,iBAAgB;AAClC,SAAS,gBAAAC,eAAc,YAAAC,iBAAgB;AAMvC,IAAMC,cAAaC,MAAKC,SAAQ,GAAG,cAAc;AACjD,IAAMC,YAAWF,MAAKD,aAAY,YAAY;AAE9C,eAAe,qBAAsC;AACnD,QAAM,MAAM,MAAM,MAAM,+CAA+C;AACvE,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,yBAAyB,IAAI,MAAM,EAAE;AAClE,QAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,SAAO,KAAK;AACd;AAEA,SAAS,aAAmB;AAC1B,QAAM,MAAM,QAAQG,SAAQ;AAC5B,MAAI,QAAQ,KAAM;AAClB,MAAI;AACF,YAAQ,KAAK,KAAK,SAAS;AAC3B,cAAUA,SAAQ;AAClB,YAAQ,IAAI,wBAAwB,GAAG,GAAG;AAAA,EAC5C,QAAQ;AACN,cAAUA,SAAQ;AAAA,EACpB;AACF;AAEO,SAAS,oBAA6B;AAC3C,SAAO,IAAIC,SAAQ,QAAQ,EACxB,YAAY,0CAA0C,EACtD,OAAO,YAAY;AAClB,UAAM,UAAU;AAEhB,YAAQ,IAAI,qBAAqB,OAAO,EAAE;AAC1C,YAAQ,IAAI,yBAAyB;AAErC,QAAI;AACJ,QAAI;AACF,eAAS,MAAM,mBAAmB;AAAA,IACpC,SAAS,KAAK;AACZ,cAAQ,MAAM,gCAAiC,IAAc,OAAO;AACpE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,YAAY,QAAQ;AACtB,cAAQ,IAAI,wBAAwB,OAAO,GAAG;AAC9C;AAAA,IACF;AAEA,YAAQ,IAAI,sBAAsB,OAAO,YAAO,MAAM,EAAE;AAGxD,YAAQ,IAAI,+BAA+B;AAC3C,QAAI;AACF,MAAAC,cAAa,OAAO,CAAC,SAAS,sBAAsB,WAAW,GAAG;AAAA,QAChE,OAAO;AAAA,MACT,CAAC;AAAA,IACH,QAAQ;AACN,cAAQ,MAAM,oCAAoC;AAClD,cAAQ,MAAM,2DAA2D;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,YAAY,mBAAmB;AAErC,QAAI,WAAW;AAGb,cAAQ,IAAI,qCAAqC;AACjD,sBAAgB;AAEhB,YAAM,KAAKC,UAAS;AACpB,UAAI,OAAO,SAAS;AAClB,gBAAQ,IAAI,2BAA2B;AACvC,YAAI;AACF,UAAAC,UAAS,wCAAwC,EAAE,OAAO,UAAU,CAAC;AAAA,QACvE,QAAQ;AACN,kBAAQ,MAAM,oCAAoC;AAClD,kBAAQ,MAAM,4DAA4D;AAC1E,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,WAAW,OAAO,UAAU;AAC1B,gBAAQ,IAAI,2BAA2B;AACvC,cAAM,YAAYN,MAAKC,SAAQ,GAAG,WAAW,gBAAgB,uBAAuB;AAEpF,YAAI;AAAE,UAAAK,UAAS,qBAAqB,SAAS,KAAK,EAAE,OAAO,UAAU,CAAC;AAAA,QAAG,QAAQ;AAAA,QAAmB;AACpG,YAAI;AACF,UAAAA,UAAS,mBAAmB,SAAS,KAAK,EAAE,OAAO,UAAU,CAAC;AAAA,QAChE,QAAQ;AACN,kBAAQ,MAAM,oCAAoC;AAClD,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAAA,IACF,OAAO;AAEL,YAAM,aAAa,gBAAgBJ,SAAQ;AAC3C,UAAI,YAAY;AACd,gBAAQ,IAAI,oBAAoB;AAChC,mBAAW;AAAA,MACb;AAEA,cAAQ,IAAI,sBAAsB;AAClC,UAAI;AACF,QAAAE,cAAa,OAAO,CAAC,SAAS,sBAAsB,UAAU,OAAO,GAAG;AAAA,UACtE,OAAO;AAAA,QACT,CAAC;AAAA,MACH,QAAQ;AACN,gBAAQ,MAAM,0CAA0C;AACxD,gBAAQ,MAAM,2DAA2D;AACzE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAEA,YAAQ,IAAI,eAAe,MAAM,EAAE;AAAA,EACrC,CAAC;AACL;;;ALhHO,SAAS,YAAqB;AACnC,QAAM,UAAU,IAAIG,SAAQ;AAE5B,UACG,KAAK,aAAa,EAClB,YAAY,mCAAmC,EAC/C,QAAQ,OAAW;AAEtB,UAAQ,WAAW,gBAAgB,CAAC;AACpC,UAAQ,WAAW,kBAAkB,CAAC;AACtC,UAAQ,WAAW,kBAAkB,CAAC;AAEtC,SAAO;AACT;;;AMlBA,UAAU,EAAE,MAAM;","names":["Command","join","homedir","join","homedir","resolve","Command","join","homedir","existsSync","mkdirSync","spawn","CONFIG_DIR","join","homedir","Command","spawn","resolve","rejectOption","mkdirSync","existsSync","Command","join","homedir","platform","execFileSync","execSync","CONFIG_DIR","join","homedir","PID_PATH","Command","execFileSync","platform","execSync","Command"]}
1
+ {"version":3,"sources":["../src/cli/index.ts","../src/cli/daemon.ts","../src/cli/autostart.ts","../src/cli/init.ts","../src/shared/detect-agents.ts","../src/shared/version.ts","../src/cli/update.ts","../src/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { makeDaemonCommand } from \"./daemon.js\";\nimport { makeInitCommand } from \"./init.js\";\nimport { makeUpdateCommand } from \"./update.js\";\nimport { getVersion } from \"../shared/version.js\";\n\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name(\"acp-discord\")\n .description(\"Discord bot for ACP coding agents\")\n .version(getVersion());\n\n program.addCommand(makeInitCommand());\n program.addCommand(makeDaemonCommand());\n program.addCommand(makeUpdateCommand());\n\n return program;\n}\n","import { Command } from \"commander\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { spawn } from \"node:child_process\";\nimport { openSync, closeSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { isDaemonRunning, readPid, removePid } from \"./pid.js\";\nimport { enableAutostart, disableAutostart } from \"./autostart.js\";\n\nconst CONFIG_DIR = join(homedir(), \".acp-discord\");\nconst PID_PATH = join(CONFIG_DIR, \"daemon.pid\");\nconst LOG_PATH = join(CONFIG_DIR, \"daemon.log\");\nconst ERR_LOG_PATH = join(CONFIG_DIR, \"daemon.error.log\");\n\nexport function makeDaemonCommand(): Command {\n const daemon = new Command(\"daemon\").description(\"Manage the acp-discord daemon\");\n\n daemon\n .command(\"start\")\n .description(\"Start the daemon (background)\")\n .action(async () => {\n if (isDaemonRunning(PID_PATH)) {\n const pid = readPid(PID_PATH);\n console.log(`Daemon already running (PID: ${pid})`);\n process.exit(1);\n }\n removePid(PID_PATH); // clean stale\n\n // In the bundled output, both index.js and daemon.js are in dist/\n const thisDir = fileURLToPath(new URL(\".\", import.meta.url));\n const daemonEntry = join(thisDir, \"daemon.js\");\n const outFd = openSync(LOG_PATH, \"a\");\n const errFd = openSync(ERR_LOG_PATH, \"a\");\n const child = spawn(process.execPath, [daemonEntry], {\n detached: true,\n stdio: [\"ignore\", outFd, errFd],\n env: { ...process.env, ACP_DISCORD_DAEMON: \"1\" },\n });\n\n child.unref();\n closeSync(outFd);\n closeSync(errFd);\n\n // Wait briefly and verify the daemon wrote its PID file (#11)\n await new Promise((resolve) => setTimeout(resolve, 1500));\n if (isDaemonRunning(PID_PATH)) {\n const pid = readPid(PID_PATH);\n console.log(`Daemon started (PID: ${pid})`);\n process.exit(0);\n } else {\n console.error(`Daemon failed to start (forked PID: ${child.pid}).`);\n console.error(`Check logs: ${ERR_LOG_PATH}`);\n process.exit(1);\n }\n });\n\n daemon\n .command(\"run\")\n .description(\"Run the daemon in foreground (for service managers)\")\n .action(async () => {\n if (isDaemonRunning(PID_PATH)) {\n const pid = readPid(PID_PATH);\n console.log(`Daemon already running (PID: ${pid})`);\n process.exit(1);\n }\n // Import and run directly in this process\n const { runDaemon } = await import(\"../daemon/index.js\");\n await runDaemon();\n });\n\n daemon\n .command(\"stop\")\n .description(\"Stop the daemon\")\n .action(async () => {\n const pid = readPid(PID_PATH);\n if (pid === null) {\n console.log(\"Daemon is not running\");\n return;\n }\n try {\n process.kill(pid, \"SIGTERM\");\n removePid(PID_PATH);\n console.log(`Daemon stopped (PID: ${pid})`);\n } catch {\n removePid(PID_PATH);\n console.log(\"Daemon was not running (stale PID removed)\");\n }\n });\n\n daemon\n .command(\"status\")\n .description(\"Show daemon status\")\n .action(async () => {\n if (isDaemonRunning(PID_PATH)) {\n const pid = readPid(PID_PATH);\n console.log(`Daemon is running (PID: ${pid})`);\n } else {\n removePid(PID_PATH);\n console.log(\"Daemon is not running\");\n }\n });\n\n daemon\n .command(\"enable\")\n .description(\"Enable auto-start on boot\")\n .action(async () => {\n enableAutostart();\n });\n\n daemon\n .command(\"disable\")\n .description(\"Disable auto-start on boot\")\n .action(async () => {\n disableAutostart();\n });\n\n return daemon;\n}\n","import { writeFileSync, unlinkSync, existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir, platform } from \"node:os\";\nimport { execSync } from \"node:child_process\";\n\nconst SYSTEMD_DIR = join(homedir(), \".config\", \"systemd\", \"user\");\nconst SYSTEMD_SERVICE = \"acp-discord.service\";\nconst LAUNCHD_DIR = join(homedir(), \"Library\", \"LaunchAgents\");\nconst LAUNCHD_PLIST = \"com.acp-discord.plist\";\n\nfunction getNpxPath(): string {\n try {\n return execSync(\"which npx\", { encoding: \"utf-8\" }).trim();\n } catch {\n throw new Error(\"npx not found in PATH. Ensure Node.js is installed.\");\n }\n}\n\nexport function enableAutostart(): void {\n const os = platform();\n\n if (os === \"linux\") {\n mkdirSync(SYSTEMD_DIR, { recursive: true });\n const npx = getNpxPath();\n // Use \"daemon run\" for foreground mode — correct for systemd lifecycle (#10)\n const service = `[Unit]\nDescription=acp-discord daemon\nAfter=network.target\nStartLimitIntervalSec=300\nStartLimitBurst=5\n\n[Service]\nExecStart=${npx} acp-discord daemon run\nRestart=always\nRestartSec=10\n\n[Install]\nWantedBy=default.target\n`;\n const servicePath = join(SYSTEMD_DIR, SYSTEMD_SERVICE);\n writeFileSync(servicePath, service);\n try {\n execSync(\"systemctl --user daemon-reload\");\n execSync(`systemctl --user enable ${SYSTEMD_SERVICE}`);\n } catch (err) {\n console.error(\"Failed to enable systemd service:\", err instanceof Error ? err.message : err);\n return;\n }\n console.log(`Enabled systemd service: ${servicePath}`);\n console.log(\"Run: systemctl --user start acp-discord\");\n } else if (os === \"darwin\") {\n mkdirSync(LAUNCHD_DIR, { recursive: true });\n const npx = getNpxPath();\n // Use \"daemon run\" for foreground mode — correct for launchd lifecycle (#10)\n const plist = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>com.acp-discord</string>\n <key>ProgramArguments</key>\n <array>\n <string>${npx}</string>\n <string>acp-discord</string>\n <string>daemon</string>\n <string>run</string>\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>StandardOutPath</key>\n <string>${join(homedir(), \".acp-discord\", \"daemon.log\")}</string>\n <key>StandardErrorPath</key>\n <string>${join(homedir(), \".acp-discord\", \"daemon.error.log\")}</string>\n</dict>\n</plist>`;\n const plistPath = join(LAUNCHD_DIR, LAUNCHD_PLIST);\n writeFileSync(plistPath, plist);\n console.log(`Enabled launchd service: ${plistPath}`);\n console.log(\"Run: launchctl load \" + plistPath);\n } else {\n console.error(`Auto-start not supported on ${os}. Use your OS service manager manually.`);\n }\n}\n\nexport function isAutostartEnabled(): boolean {\n const os = platform();\n if (os === \"linux\") {\n return existsSync(join(SYSTEMD_DIR, SYSTEMD_SERVICE));\n } else if (os === \"darwin\") {\n return existsSync(join(LAUNCHD_DIR, LAUNCHD_PLIST));\n }\n return false;\n}\n\nexport function disableAutostart(): void {\n const os = platform();\n\n if (os === \"linux\") {\n const servicePath = join(SYSTEMD_DIR, SYSTEMD_SERVICE);\n try {\n execSync(`systemctl --user disable ${SYSTEMD_SERVICE}`);\n } catch {\n // may not be enabled\n }\n if (existsSync(servicePath)) unlinkSync(servicePath);\n try {\n execSync(\"systemctl --user daemon-reload\");\n } catch (err) {\n console.error(\"Failed to reload systemd:\", err instanceof Error ? err.message : err);\n }\n console.log(\"Disabled systemd auto-start\");\n } else if (os === \"darwin\") {\n const plistPath = join(LAUNCHD_DIR, LAUNCHD_PLIST);\n try {\n execSync(`launchctl unload ${plistPath}`);\n } catch {\n // may not be loaded\n }\n if (existsSync(plistPath)) unlinkSync(plistPath);\n console.log(\"Disabled launchd auto-start\");\n } else {\n console.error(`Auto-start not supported on ${os}.`);\n }\n}\n","import { Command } from \"commander\";\nimport { join, resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { existsSync, mkdirSync, readFileSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { Readable, Writable } from \"node:stream\";\nimport { ClientSideConnection, ndJsonStream, PROTOCOL_VERSION } from \"@agentclientprotocol/sdk\";\nimport type { Client } from \"@agentclientprotocol/sdk\";\nimport { detectInstalledAgents } from \"../shared/detect-agents.js\";\nimport { parseConfig } from \"../shared/config.js\";\nimport { getVersion } from \"../shared/version.js\";\n\nconst CONFIG_DIR = join(homedir(), \".acp-discord\");\nconst CONFIG_PATH = join(CONFIG_DIR, \"config.toml\");\n\n// Only auto-allow writes to the config directory during setup\nconst SAFE_WRITE_PREFIX = CONFIG_DIR;\n\nconst INIT_SYSTEM_PROMPT = `You are a setup assistant for acp-discord, a Discord bot that connects Discord channels to ACP coding agents.\n\nYour job is to help the user configure ~/.acp-discord/config.toml interactively.\n\nYou need to collect:\n1. Discord Bot Token (guide them to https://discord.com/developers/applications if needed)\n2. Default working directory (the project path the agent will work on)\n3. Channel IDs to bind (explain how to get channel IDs: right-click channel → Copy Channel ID)\n4. Reply mode per channel: ask whether the bot should respond to ALL messages in the channel (auto_reply = true) or only when @mentioned (auto_reply = false, the default)\n\nOnce you have all info, write the config file using the write_text_file tool to ${CONFIG_PATH}.\n\nConfig format (TOML):\n\\`\\`\\`toml\n[discord]\ntoken = \"<token>\"\n\n[agents.default]\ncommand = \"npx\"\nargs = [\"<acp-package>\"]\ncwd = \"<working-directory>\"\nidle_timeout = 600\n\n[channels.<channel-id>]\nagent = \"default\"\nauto_reply = false # true = respond to all messages; false = only @mentions\n\\`\\`\\`\n\nBe friendly and concise. Ask one question at a time.`;\n\nexport function makeInitCommand(): Command {\n return new Command(\"init\")\n .description(\"Interactive setup wizard\")\n .action(async () => {\n console.log(\"Welcome to acp-discord setup!\\n\");\n\n // Detect agents\n console.log(\"Detecting ACP-compatible agents...\");\n const agents = detectInstalledAgents();\n\n if (agents.length === 0) {\n console.error(\"No ACP-compatible agents found.\");\n console.error(\"Install one of: claude-code, codex, opencode, pi\");\n process.exit(1);\n }\n\n for (const agent of agents) {\n console.log(` \\u2713 ${agent.name} (found)`);\n }\n\n const selected = agents[0];\n console.log(`\\nUsing: ${selected.name}\\n`);\n console.log(\"Starting setup agent...\\n\");\n\n // Spawn ACP agent for interactive setup\n const proc = spawn(selected.command, [selected.acpPackage], {\n stdio: [\"pipe\", \"pipe\", \"inherit\"],\n });\n\n const stream = ndJsonStream(\n Writable.toWeb(proc.stdin!) as WritableStream<Uint8Array>,\n Readable.toWeb(proc.stdout!) as ReadableStream<Uint8Array>,\n );\n\n // Simple readline for user input\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const askUser = (prompt: string): Promise<string> =>\n new Promise((resolve) => rl.question(prompt, resolve));\n\n const client: Client = {\n async requestPermission(params) {\n const title = params.toolCall.title ?? \"Unknown\";\n const kind = params.toolCall.kind ?? \"other\";\n\n // Auto-allow only safe file writes within the config directory,\n // validated against actual tool locations (not spoofable title) (#2)\n const isSafeWrite = kind === \"write_text_file\" || kind === \"fs\" || kind === \"edit\";\n if (isSafeWrite && params.toolCall.locations?.length) {\n const allPathsSafe = params.toolCall.locations.every(\n (loc: { path: string }) => {\n const resolved = resolve(loc.path);\n return resolved.startsWith(SAFE_WRITE_PREFIX + \"/\") || resolved === SAFE_WRITE_PREFIX;\n },\n );\n if (allPathsSafe) {\n const allowOption = params.options.find((o: { kind: string }) => o.kind === \"allow_once\");\n if (allowOption) {\n return { outcome: { outcome: \"selected\" as const, optionId: allowOption.optionId } };\n }\n }\n }\n\n // For all other operations, ask the user\n console.log(`\\n--- Permission Request ---`);\n console.log(`Tool: ${title}`);\n console.log(`Type: ${kind}`);\n console.log(`Options:`);\n for (let i = 0; i < params.options.length; i++) {\n const opt = params.options[i];\n console.log(` ${i + 1}. ${opt.name} (${opt.kind})`);\n }\n\n const answer = await askUser(`Choose option (1-${params.options.length}, or 'c' to cancel): `);\n if (answer.toLowerCase() === \"c\") {\n const rejectOption = params.options.find((o: { kind: string }) => o.kind === \"reject_once\");\n if (rejectOption) {\n return { outcome: { outcome: \"selected\" as const, optionId: rejectOption.optionId } };\n }\n return { outcome: { outcome: \"cancelled\" as const } };\n }\n\n const idx = parseInt(answer, 10) - 1;\n if (idx >= 0 && idx < params.options.length) {\n return { outcome: { outcome: \"selected\" as const, optionId: params.options[idx].optionId } };\n }\n\n // Invalid input — default to reject\n const rejectOption = params.options.find((o: { kind: string }) => o.kind === \"reject_once\");\n if (rejectOption) {\n return { outcome: { outcome: \"selected\" as const, optionId: rejectOption.optionId } };\n }\n return { outcome: { outcome: \"cancelled\" as const } };\n },\n async sessionUpdate(params) {\n const update = params.update;\n if (update.sessionUpdate === \"agent_message_chunk\" && update.content.type === \"text\") {\n process.stdout.write(update.content.text);\n }\n },\n };\n\n const connection = new ClientSideConnection((_agent) => client, stream);\n\n await connection.initialize({\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: {\n fs: { readTextFile: true, writeTextFile: true },\n terminal: false,\n },\n clientInfo: { name: \"acp-discord-init\", title: \"ACP Discord Init\", version: getVersion() },\n });\n\n mkdirSync(CONFIG_DIR, { recursive: true });\n\n const { sessionId } = await connection.newSession({\n cwd: CONFIG_DIR,\n mcpServers: [],\n });\n\n // Initial prompt\n await connection.prompt({\n sessionId,\n prompt: [\n { type: \"text\", text: INIT_SYSTEM_PROMPT },\n { type: \"text\", text: `The ACP agent package is: ${selected.acpPackage}\\nPlease start the setup.` },\n ],\n });\n\n // Check if config was already written during the initial prompt\n if (existsSync(CONFIG_PATH)) {\n try {\n const content = readFileSync(CONFIG_PATH, \"utf-8\");\n parseConfig(content);\n console.log(\"\\n\\nSetup complete! Config written to\", CONFIG_PATH);\n console.log(\"Run `npx acp-discord daemon start` to begin.\");\n rl.close();\n proc.kill();\n process.exit(0);\n } catch {\n // config not valid yet, continue to interactive loop\n }\n }\n\n // Interactive loop\n while (true) {\n const input = await askUser(\"\\n> \");\n if (input.toLowerCase() === \"exit\" || input.toLowerCase() === \"quit\") break;\n\n const result = await connection.prompt({\n sessionId,\n prompt: [{ type: \"text\", text: input }],\n });\n\n if (result.stopReason === \"end_turn\" && existsSync(CONFIG_PATH)) {\n // Validate the written config is structurally valid (#9)\n try {\n const content = readFileSync(CONFIG_PATH, \"utf-8\");\n parseConfig(content); // throws if invalid\n console.log(\"\\n\\nSetup complete! Config written to\", CONFIG_PATH);\n console.log(\"Run `npx acp-discord daemon start` to begin.\");\n break;\n } catch {\n // config not valid yet, continue\n }\n }\n }\n\n rl.close();\n proc.kill();\n process.exit(0);\n });\n}\n","import { execFileSync } from \"node:child_process\";\n\nexport interface AgentInfo {\n name: string;\n command: string;\n acpPackage: string;\n detectCommand: string;\n detectArgs: string[];\n}\n\nexport const KNOWN_AGENTS: AgentInfo[] = [\n {\n name: \"claude-code\",\n command: \"npx\",\n acpPackage: \"@zed-industries/claude-agent-acp\",\n detectCommand: \"claude\",\n detectArgs: [\"--version\"],\n },\n {\n name: \"codex\",\n command: \"npx\",\n acpPackage: \"@openai/codex-acp\",\n detectCommand: \"codex\",\n detectArgs: [\"--version\"],\n },\n {\n name: \"opencode\",\n command: \"npx\",\n acpPackage: \"@opencode/acp\",\n detectCommand: \"opencode\",\n detectArgs: [\"--version\"],\n },\n {\n name: \"pi\",\n command: \"npx\",\n acpPackage: \"@anthropic-ai/pi-acp\",\n detectCommand: \"pi\",\n detectArgs: [\"--version\"],\n },\n];\n\nexport function detectInstalledAgents(): AgentInfo[] {\n const found: AgentInfo[] = [];\n for (const agent of KNOWN_AGENTS) {\n try {\n execFileSync(agent.detectCommand, agent.detectArgs, {\n stdio: \"ignore\",\n timeout: 5000,\n });\n found.push(agent);\n } catch {\n // not installed\n }\n }\n return found;\n}\n","import { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { join, dirname } from \"node:path\";\n\nlet cached: string | undefined;\n\nexport function getVersion(): string {\n if (cached) return cached;\n const dir = dirname(fileURLToPath(import.meta.url));\n // Works from both src/ (dev) and dist/ (published)\n const pkg = JSON.parse(readFileSync(join(dir, \"../../package.json\"), \"utf-8\"));\n cached = pkg.version;\n return cached!;\n}\n","import { Command } from \"commander\";\nimport { join } from \"node:path\";\nimport { homedir, platform } from \"node:os\";\nimport { execFileSync, execSync } from \"node:child_process\";\nimport { isDaemonRunning, readPid, removePid } from \"./pid.js\";\nimport { isAutostartEnabled, enableAutostart } from \"./autostart.js\";\nimport { getVersion } from \"../shared/version.js\";\n\nconst CONFIG_DIR = join(homedir(), \".acp-discord\");\nconst PID_PATH = join(CONFIG_DIR, \"daemon.pid\");\n\nasync function fetchLatestVersion(): Promise<string> {\n const res = await fetch(\"https://registry.npmjs.org/acp-discord/latest\");\n if (!res.ok) throw new Error(`npm registry returned ${res.status}`);\n const data = (await res.json()) as { version: string };\n return data.version;\n}\n\nfunction stopDaemon(): void {\n const pid = readPid(PID_PATH);\n if (pid === null) return;\n try {\n process.kill(pid, \"SIGTERM\");\n removePid(PID_PATH);\n console.log(`Stopped daemon (PID: ${pid})`);\n } catch {\n removePid(PID_PATH);\n }\n}\n\nexport function makeUpdateCommand(): Command {\n return new Command(\"update\")\n .description(\"Update acp-discord to the latest version\")\n .action(async () => {\n const current = getVersion();\n\n console.log(`Current version: v${current}`);\n console.log(\"Checking for updates...\");\n\n let latest: string;\n try {\n latest = await fetchLatestVersion();\n } catch (err) {\n console.error(\"Failed to check for updates:\", (err as Error).message);\n process.exit(1);\n }\n\n if (current === latest) {\n console.log(`Already up to date (v${current})`);\n return;\n }\n\n console.log(`Update available: v${current} → v${latest}`);\n\n // Pre-fetch the latest version into npx cache so subsequent runs use it\n console.log(\"Downloading latest version...\");\n try {\n execFileSync(\"npx\", [\"--yes\", \"acp-discord@latest\", \"--version\"], {\n stdio: \"inherit\",\n });\n } catch {\n console.error(\"Failed to download latest version.\");\n console.error(\"You can try manually: npx acp-discord@latest daemon start\");\n process.exit(1);\n }\n\n const autostart = isAutostartEnabled();\n\n if (autostart) {\n // When managed by systemd/launchd, regenerate config and use the\n // service manager to restart — avoids conflicts with Restart=always.\n console.log(\"Updating autostart configuration...\");\n enableAutostart();\n\n const os = platform();\n if (os === \"linux\") {\n console.log(\"Restarting via systemd...\");\n try {\n execSync(\"systemctl --user restart acp-discord\", { stdio: \"inherit\" });\n } catch {\n console.error(\"Failed to restart systemd service.\");\n console.error(\"You can try manually: systemctl --user restart acp-discord\");\n process.exit(1);\n }\n } else if (os === \"darwin\") {\n console.log(\"Restarting via launchd...\");\n const plistPath = join(homedir(), \"Library\", \"LaunchAgents\", \"com.acp-discord.plist\");\n // Unload may fail if not currently loaded — that's fine\n try { execSync(`launchctl unload \"${plistPath}\"`, { stdio: \"inherit\" }); } catch { /* not loaded */ }\n try {\n execSync(`launchctl load \"${plistPath}\"`, { stdio: \"inherit\" });\n } catch {\n console.error(\"Failed to restart launchd service.\");\n process.exit(1);\n }\n }\n } else {\n // Manual daemon management — stop and restart directly\n const wasRunning = isDaemonRunning(PID_PATH);\n if (wasRunning) {\n console.log(\"Stopping daemon...\");\n stopDaemon();\n }\n\n console.log(\"Restarting daemon...\");\n try {\n execFileSync(\"npx\", [\"--yes\", \"acp-discord@latest\", \"daemon\", \"start\"], {\n stdio: \"inherit\",\n });\n } catch {\n console.error(\"Failed to start daemon with new version.\");\n console.error(\"You can try manually: npx acp-discord@latest daemon start\");\n process.exit(1);\n }\n }\n\n console.log(`Updated to v${latest}`);\n });\n}\n","import { createCli } from \"./cli/index.js\";\n\ncreateCli().parse();\n"],"mappings":"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","names":["Command","join","homedir","join","homedir","resolve","Command","join","homedir","existsSync","mkdirSync","readFileSync","spawn","fileURLToPath","join","CONFIG_DIR","join","homedir","Command","spawn","resolve","rejectOption","mkdirSync","existsSync","readFileSync","Command","join","homedir","platform","execFileSync","execSync","CONFIG_DIR","join","homedir","PID_PATH","Command","execFileSync","platform","execSync","Command"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "acp-discord",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "Discord bot that wraps ACP protocol for coding agents",
5
5
  "type": "module",
6
6
  "bin": {