@openacp/cli 0.6.3 → 0.6.4

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 (98) hide show
  1. package/dist/{admin-3ZHEO5VP.js → admin-SCP25TN2.js} +3 -3
  2. package/dist/agent-catalog-SBZQRYOD.js +10 -0
  3. package/dist/agent-store-CGE4G6PA.js +8 -0
  4. package/dist/{agents-SXIY4IEF.js → agents-QJPHNWK2.js} +3 -3
  5. package/dist/{autostart-A7JRU4WJ.js → autostart-6M3FZAKW.js} +3 -3
  6. package/dist/{chunk-PMGNLNSH.js → chunk-2CJ46J3C.js} +2 -2
  7. package/dist/{chunk-5HGXUCMX.js → chunk-34M4OS5P.js} +2 -2
  8. package/dist/{chunk-TMCQZAXN.js → chunk-3CHBVO4T.js} +3 -3
  9. package/dist/{chunk-TTDSLV35.js → chunk-4CTX774K.js} +3 -3
  10. package/dist/{chunk-NXEQXRQR.js → chunk-774Y4RAK.js} +2 -2
  11. package/dist/{chunk-SM3G6UAX.js → chunk-BNLGTZ34.js} +2 -2
  12. package/dist/{chunk-AVCHZESZ.js → chunk-DJIXG62C.js} +49 -20
  13. package/dist/chunk-DJIXG62C.js.map +1 -0
  14. package/dist/{chunk-KO5RL7MZ.js → chunk-DOCFD5JR.js} +2 -2
  15. package/dist/{chunk-HP2IJYCA.js → chunk-E56PPPAE.js} +9 -9
  16. package/dist/chunk-E56PPPAE.js.map +1 -0
  17. package/dist/{chunk-ESOPMQAY.js → chunk-GAK6PIBW.js} +25 -2
  18. package/dist/chunk-GAK6PIBW.js.map +1 -0
  19. package/dist/{chunk-3KGRVAEV.js → chunk-J4SJTKIK.js} +2 -2
  20. package/dist/{chunk-FZ5BIWG5.js → chunk-JV6XQRAE.js} +4 -4
  21. package/dist/{chunk-EWYNCHUH.js → chunk-L5KZXYJD.js} +2 -2
  22. package/dist/{chunk-G3OHCXZG.js → chunk-N6E3HE42.js} +194 -133
  23. package/dist/chunk-N6E3HE42.js.map +1 -0
  24. package/dist/{chunk-EVFJW45N.js → chunk-S64CB6J3.js} +13 -13
  25. package/dist/{chunk-EVFJW45N.js.map → chunk-S64CB6J3.js.map} +1 -1
  26. package/dist/{chunk-6LSFRNHE.js → chunk-TNFXJQZP.js} +3 -3
  27. package/dist/{chunk-OHR6SBMC.js → chunk-TOQPQB5Q.js} +3 -3
  28. package/dist/{chunk-CKOK7JW6.js → chunk-UKT3G5IA.js} +3 -3
  29. package/dist/{chunk-PWFPTG5X.js → chunk-V5GZQEIY.js} +2 -2
  30. package/dist/{chunk-IER5UCY7.js → chunk-YQRF3IOR.js} +2 -2
  31. package/dist/cli.js +54 -44
  32. package/dist/cli.js.map +1 -1
  33. package/dist/{config-4YSJ4NCI.js → config-XDUOULXX.js} +3 -3
  34. package/dist/config-editor-3GGBY7NL.js +12 -0
  35. package/dist/{daemon-I6XMRQ6P.js → daemon-QY7WXHQ3.js} +4 -4
  36. package/dist/{discord-VHCBN3JJ.js → discord-4DE22BQC.js} +19 -19
  37. package/dist/doctor-D3YZ6VHJ.js +14 -0
  38. package/dist/doctor-SNSQ5SS2.js +9 -0
  39. package/dist/index.js +11 -11
  40. package/dist/{install-cloudflared-G2GUKCHA.js → install-cloudflared-FSILDS5J.js} +3 -3
  41. package/dist/{install-jq-7QTU7XYY.js → install-jq-P6RUBKPV.js} +3 -3
  42. package/dist/{log-SPS2S6FO.js → log-RCVBXLTN.js} +8 -4
  43. package/dist/{main-P4X6SAPZ.js → main-GVTLD7VI.js} +46 -26
  44. package/dist/main-GVTLD7VI.js.map +1 -0
  45. package/dist/{new-session-PUNUHGYP.js → new-session-K6UCWYOP.js} +5 -5
  46. package/dist/{post-upgrade-6N4JCV5S.js → post-upgrade-62LUHDJO.js} +5 -5
  47. package/dist/{session-ZMAM67AA.js → session-O6ZPLJIZ.js} +4 -4
  48. package/dist/{settings-OEQEZS5Y.js → settings-RRF77IC4.js} +3 -3
  49. package/dist/{setup-7YBFKRG7.js → setup-D6BU36ZL.js} +4 -4
  50. package/dist/{tunnel-service-BMIBHUBK.js → tunnel-service-NJJH4I26.js} +3 -3
  51. package/dist/{version-ALWGGVKM.js → version-AXXV6IV2.js} +2 -2
  52. package/package.json +3 -2
  53. package/dist/agent-catalog-IVU2KANH.js +0 -10
  54. package/dist/agent-store-ZBXGOFPH.js +0 -8
  55. package/dist/chunk-AVCHZESZ.js.map +0 -1
  56. package/dist/chunk-ESOPMQAY.js.map +0 -1
  57. package/dist/chunk-G3OHCXZG.js.map +0 -1
  58. package/dist/chunk-HP2IJYCA.js.map +0 -1
  59. package/dist/config-editor-F25HEMGL.js +0 -12
  60. package/dist/doctor-GPW5ECK6.js +0 -14
  61. package/dist/doctor-Y3SCSVPI.js +0 -9
  62. package/dist/main-P4X6SAPZ.js.map +0 -1
  63. /package/dist/{admin-3ZHEO5VP.js.map → admin-SCP25TN2.js.map} +0 -0
  64. /package/dist/{agent-catalog-IVU2KANH.js.map → agent-catalog-SBZQRYOD.js.map} +0 -0
  65. /package/dist/{agent-store-ZBXGOFPH.js.map → agent-store-CGE4G6PA.js.map} +0 -0
  66. /package/dist/{agents-SXIY4IEF.js.map → agents-QJPHNWK2.js.map} +0 -0
  67. /package/dist/{autostart-A7JRU4WJ.js.map → autostart-6M3FZAKW.js.map} +0 -0
  68. /package/dist/{chunk-PMGNLNSH.js.map → chunk-2CJ46J3C.js.map} +0 -0
  69. /package/dist/{chunk-5HGXUCMX.js.map → chunk-34M4OS5P.js.map} +0 -0
  70. /package/dist/{chunk-TMCQZAXN.js.map → chunk-3CHBVO4T.js.map} +0 -0
  71. /package/dist/{chunk-TTDSLV35.js.map → chunk-4CTX774K.js.map} +0 -0
  72. /package/dist/{chunk-NXEQXRQR.js.map → chunk-774Y4RAK.js.map} +0 -0
  73. /package/dist/{chunk-SM3G6UAX.js.map → chunk-BNLGTZ34.js.map} +0 -0
  74. /package/dist/{chunk-KO5RL7MZ.js.map → chunk-DOCFD5JR.js.map} +0 -0
  75. /package/dist/{chunk-3KGRVAEV.js.map → chunk-J4SJTKIK.js.map} +0 -0
  76. /package/dist/{chunk-FZ5BIWG5.js.map → chunk-JV6XQRAE.js.map} +0 -0
  77. /package/dist/{chunk-EWYNCHUH.js.map → chunk-L5KZXYJD.js.map} +0 -0
  78. /package/dist/{chunk-6LSFRNHE.js.map → chunk-TNFXJQZP.js.map} +0 -0
  79. /package/dist/{chunk-OHR6SBMC.js.map → chunk-TOQPQB5Q.js.map} +0 -0
  80. /package/dist/{chunk-CKOK7JW6.js.map → chunk-UKT3G5IA.js.map} +0 -0
  81. /package/dist/{chunk-PWFPTG5X.js.map → chunk-V5GZQEIY.js.map} +0 -0
  82. /package/dist/{chunk-IER5UCY7.js.map → chunk-YQRF3IOR.js.map} +0 -0
  83. /package/dist/{config-4YSJ4NCI.js.map → config-XDUOULXX.js.map} +0 -0
  84. /package/dist/{config-editor-F25HEMGL.js.map → config-editor-3GGBY7NL.js.map} +0 -0
  85. /package/dist/{daemon-I6XMRQ6P.js.map → daemon-QY7WXHQ3.js.map} +0 -0
  86. /package/dist/{discord-VHCBN3JJ.js.map → discord-4DE22BQC.js.map} +0 -0
  87. /package/dist/{doctor-GPW5ECK6.js.map → doctor-D3YZ6VHJ.js.map} +0 -0
  88. /package/dist/{doctor-Y3SCSVPI.js.map → doctor-SNSQ5SS2.js.map} +0 -0
  89. /package/dist/{install-cloudflared-G2GUKCHA.js.map → install-cloudflared-FSILDS5J.js.map} +0 -0
  90. /package/dist/{install-jq-7QTU7XYY.js.map → install-jq-P6RUBKPV.js.map} +0 -0
  91. /package/dist/{log-SPS2S6FO.js.map → log-RCVBXLTN.js.map} +0 -0
  92. /package/dist/{new-session-PUNUHGYP.js.map → new-session-K6UCWYOP.js.map} +0 -0
  93. /package/dist/{post-upgrade-6N4JCV5S.js.map → post-upgrade-62LUHDJO.js.map} +0 -0
  94. /package/dist/{session-ZMAM67AA.js.map → session-O6ZPLJIZ.js.map} +0 -0
  95. /package/dist/{settings-OEQEZS5Y.js.map → settings-RRF77IC4.js.map} +0 -0
  96. /package/dist/{setup-7YBFKRG7.js.map → setup-D6BU36ZL.js.map} +0 -0
  97. /package/dist/{tunnel-service-BMIBHUBK.js.map → tunnel-service-NJJH4I26.js.map} +0 -0
  98. /package/dist/{version-ALWGGVKM.js.map → version-AXXV6IV2.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/setup.ts"],"sourcesContent":["import { execFileSync } from \"node:child_process\";\nimport * as clack from \"@clack/prompts\";\nimport type { Config, ConfigManager } from \"./config.js\";\nimport { expandHome } from \"./config.js\";\nimport { commandExists } from \"./agent-dependencies.js\";\nimport type { DiscordChannelConfig } from \"../adapters/discord/types.js\";\n\nfunction guardCancel<T>(value: T | symbol): T {\n if (clack.isCancel(value)) {\n clack.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n return value as T;\n}\n\n// --- ANSI colors ---\n\nconst c = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n red: \"\\x1b[31m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\",\n};\n\nconst ok = (msg: string) =>\n `${c.green}${c.bold}✓${c.reset} ${c.green}${msg}${c.reset}`;\nconst warn = (msg: string) => `${c.yellow}⚠ ${msg}${c.reset}`;\nconst fail = (msg: string) => `${c.red}✗ ${msg}${c.reset}`;\nconst step = (n: number, total: number, title: string) =>\n `\\n${c.cyan}${c.bold}[${n}/${total}]${c.reset} ${c.bold}${title}${c.reset}\\n`;\nconst dim = (msg: string) => `${c.dim}${msg}${c.reset}`;\n\n// --- Telegram validation ---\n\nexport async function validateBotToken(\n token: string,\n): Promise<\n | { ok: true; botName: string; botUsername: string }\n | { ok: false; error: string }\n> {\n try {\n const res = await fetch(`https://api.telegram.org/bot${token}/getMe`);\n const data = (await res.json()) as {\n ok: boolean;\n result?: { first_name: string; username: string };\n description?: string;\n };\n if (data.ok && data.result) {\n return {\n ok: true,\n botName: data.result.first_name,\n botUsername: data.result.username,\n };\n }\n return { ok: false, error: data.description || \"Invalid token\" };\n } catch (err) {\n return { ok: false, error: (err as Error).message };\n }\n}\n\nexport async function validateChatId(\n token: string,\n chatId: number,\n): Promise<\n { ok: true; title: string; isForum: boolean } | { ok: false; error: string }\n> {\n try {\n const res = await fetch(`https://api.telegram.org/bot${token}/getChat`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ chat_id: chatId }),\n });\n const data = (await res.json()) as {\n ok: boolean;\n result?: { title: string; type: string; is_forum?: boolean };\n description?: string;\n };\n if (!data.ok || !data.result) {\n return { ok: false, error: data.description || \"Invalid chat ID\" };\n }\n if (data.result.type !== \"supergroup\") {\n return {\n ok: false,\n error: `Chat is \"${data.result.type}\", must be a supergroup`,\n };\n }\n return {\n ok: true,\n title: data.result.title,\n isForum: data.result.is_forum === true,\n };\n } catch (err) {\n return { ok: false, error: (err as Error).message };\n }\n}\n\nexport async function validateBotAdmin(\n token: string,\n chatId: number,\n): Promise<{ ok: true } | { ok: false; error: string }> {\n try {\n // Get bot's own user ID\n const meRes = await fetch(`https://api.telegram.org/bot${token}/getMe`);\n const meData = (await meRes.json()) as {\n ok: boolean;\n result?: { id: number };\n };\n if (!meData.ok || !meData.result) {\n return { ok: false, error: \"Could not retrieve bot info\" };\n }\n\n const res = await fetch(\n `https://api.telegram.org/bot${token}/getChatMember`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ chat_id: chatId, user_id: meData.result.id }),\n },\n );\n const data = (await res.json()) as {\n ok: boolean;\n result?: { status: string };\n description?: string;\n };\n if (!data.ok || !data.result) {\n return {\n ok: false,\n error: data.description || \"Could not check bot membership\",\n };\n }\n\n const { status } = data.result;\n if (status === \"administrator\" || status === \"creator\") {\n return { ok: true };\n }\n return {\n ok: false,\n error: `Bot is \"${status}\" in this group. It must be an admin. Please promote the bot to admin in group settings.`,\n };\n } catch (err) {\n return { ok: false, error: (err as Error).message };\n }\n}\n\n// --- Chat ID auto-detection ---\n\nasync function promptManualChatId(): Promise<number> {\n const val = guardCancel(\n await clack.text({\n message: \"Supergroup chat ID (e.g. -1001234567890):\",\n validate: (val) => {\n const n = Number((val ?? \"\").toString().trim());\n if (isNaN(n) || !Number.isInteger(n)) return \"Chat ID must be an integer\";\n return undefined;\n },\n }),\n ) as string;\n return Number(val.trim());\n}\n\nasync function detectChatId(token: string): Promise<number> {\n // Clear old updates\n let lastUpdateId = 0;\n try {\n const clearRes = await fetch(\n `https://api.telegram.org/bot${token}/getUpdates?offset=-1`,\n );\n const clearData = (await clearRes.json()) as {\n ok: boolean;\n result?: Array<{ update_id: number }>;\n };\n if (clearData.ok && clearData.result?.length) {\n lastUpdateId = clearData.result[clearData.result.length - 1].update_id;\n }\n } catch {\n // ignore\n }\n\n console.log(\"\");\n console.log(` ${c.bold}If you don't have a supergroup yet:${c.reset}`);\n console.log(dim(\" 1. Open Telegram → New Group → add your bot\"));\n console.log(dim(\" 2. Group Settings → convert to Supergroup\"));\n console.log(dim(\" 3. Enable Topics in group settings\"));\n console.log(\"\");\n console.log(` ${c.bold}Then send \"hi\" in the group.${c.reset}`);\n console.log(\n dim(\n ` Listening... press ${c.reset}${c.yellow}m${c.reset}${c.dim} to enter ID manually`,\n ),\n );\n console.log(\"\");\n\n const MAX_ATTEMPTS = 120;\n const POLL_INTERVAL = 1000;\n\n // Listen for 'm' keypress to switch to manual\n let cancelled = false;\n const onKeypress = (data: Buffer) => {\n const key = data.toString();\n if (key === \"m\" || key === \"M\") {\n cancelled = true;\n }\n };\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.on(\"data\", onKeypress);\n }\n\n const cleanup = () => {\n if (process.stdin.isTTY) {\n process.stdin.removeListener(\"data\", onKeypress);\n process.stdin.setRawMode(false);\n process.stdin.pause();\n }\n };\n\n try {\n for (let i = 0; i < MAX_ATTEMPTS; i++) {\n if (cancelled) {\n cleanup();\n return promptManualChatId();\n }\n\n try {\n const offset = lastUpdateId ? lastUpdateId + 1 : 0;\n const res = await fetch(\n `https://api.telegram.org/bot${token}/getUpdates?offset=${offset}&timeout=1`,\n );\n const data = (await res.json()) as {\n ok: boolean;\n result?: Array<{\n update_id: number;\n message?: {\n chat: { id: number; title?: string; type: string };\n };\n my_chat_member?: {\n chat: { id: number; title?: string; type: string };\n };\n }>;\n };\n\n if (!data.ok || !data.result?.length) {\n await new Promise((r) => setTimeout(r, POLL_INTERVAL));\n continue;\n }\n\n const groups = new Map<number, string>();\n for (const update of data.result) {\n lastUpdateId = update.update_id;\n const chat = update.message?.chat ?? update.my_chat_member?.chat;\n if (chat && (chat.type === \"supergroup\" || chat.type === \"group\")) {\n groups.set(chat.id, chat.title ?? String(chat.id));\n }\n }\n\n if (groups.size === 1) {\n const [id, title] = [...groups.entries()][0];\n console.log(\n ok(`Group detected: ${c.bold}${title}${c.reset}${c.green} (${id})`),\n );\n cleanup();\n return id;\n }\n\n if (groups.size > 1) {\n cleanup();\n const options = [...groups.entries()].map(([id, title]) => ({\n label: `${title} (${id})`,\n value: id,\n }));\n return guardCancel(\n await clack.select({\n message: \"Multiple groups found. Pick one:\",\n options,\n }),\n );\n }\n } catch {\n // Network error, retry\n }\n await new Promise((r) => setTimeout(r, POLL_INTERVAL));\n }\n\n console.log(warn(\"Timed out waiting for messages.\"));\n cleanup();\n return promptManualChatId();\n } catch (err) {\n cleanup();\n throw err;\n }\n}\n\n// --- Agent detection ---\n\nconst KNOWN_AGENTS: Array<{ name: string; commands: string[] }> = [\n // claude-agent-acp is bundled as a dependency — no detection needed, but\n // kept here so detectAgents() still returns it for display purposes.\n { name: \"claude\", commands: [\"claude-agent-acp\"] },\n { name: \"codex\", commands: [\"codex\"] },\n];\n\nexport async function detectAgents(): Promise<\n Array<{ name: string; command: string }>\n> {\n const found: Array<{ name: string; command: string }> = [];\n for (const agent of KNOWN_AGENTS) {\n // Find all available commands for this agent (PATH + node_modules/.bin)\n const available: string[] = [];\n for (const cmd of agent.commands) {\n if (commandExists(cmd)) {\n available.push(cmd);\n }\n }\n if (available.length > 0) {\n // Prefer claude-agent-acp over claude/claude-code (priority order)\n found.push({ name: agent.name, command: available[0] });\n }\n }\n return found;\n}\n\nexport async function validateAgentCommand(command: string): Promise<boolean> {\n try {\n execFileSync(\"which\", [command], { stdio: \"pipe\" });\n return true;\n } catch {\n return false;\n }\n}\n\n// --- Setup steps ---\n\nexport async function setupTelegram(stepNum = 1, totalSteps = 3): Promise<Config[\"channels\"][string]> {\n console.log(step(stepNum, totalSteps, \"Telegram Bot\"));\n\n let botToken = \"\";\n\n while (true) {\n botToken = guardCancel(\n await clack.text({\n message: \"Bot token (from @BotFather):\",\n validate: (val) => (val ?? \"\").toString().trim().length > 0 ? undefined : \"Token cannot be empty\",\n }),\n ) as string;\n botToken = botToken.trim();\n\n const s = clack.spinner();\n s.start(\"Validating token...\");\n const result = await validateBotToken(botToken);\n s.stop(\"Token validated\");\n\n if (result.ok) {\n console.log(ok(`Connected to @${result.botUsername}`));\n break;\n }\n console.log(fail(result.error));\n const action = guardCancel(\n await clack.select({\n message: \"What to do?\",\n options: [\n { label: \"Re-enter token\", value: \"retry\" },\n { label: \"Use as-is (skip validation)\", value: \"skip\" },\n ],\n }),\n );\n if (action === \"skip\") break;\n }\n\n let chatId: number;\n\n while (true) {\n chatId = await detectChatId(botToken);\n\n // Validate bot can access this chat and it's a supergroup\n const chatResult = await validateChatId(botToken, chatId);\n if (!chatResult.ok) {\n console.log(fail(chatResult.error));\n console.log(\"\");\n console.log(` ${c.bold}How to fix:${c.reset}`);\n console.log(dim(\" 1. Make sure the bot is added to the group\"));\n console.log(dim(\" 2. The group must be a Supergroup (Group Settings → convert)\"));\n console.log(dim(\" 3. Send a message in the group after adding the bot\"));\n console.log(\"\");\n guardCancel(await clack.text({ message: \"Press Enter to try again...\" }));\n continue;\n }\n console.log(\n ok(\n `Group: ${c.bold}${chatResult.title}${c.reset}${c.green}${chatResult.isForum ? \" (Topics enabled)\" : \"\"}`,\n ),\n );\n\n // Check bot has admin privileges\n const adminResult = await validateBotAdmin(botToken, chatId);\n if (!adminResult.ok) {\n console.log(fail(adminResult.error));\n console.log(\"\");\n console.log(` ${c.bold}How to fix:${c.reset}`);\n console.log(dim(\" 1. Open the group in Telegram\"));\n console.log(dim(\" 2. Go to Group Settings → Administrators\"));\n console.log(dim(\" 3. Add the bot as an administrator\"));\n console.log(\"\");\n guardCancel(await clack.text({ message: \"Press Enter to check again...\" }));\n continue;\n }\n console.log(ok(\"Bot has admin privileges\"));\n break;\n }\n\n return {\n enabled: true,\n botToken,\n chatId,\n notificationTopicId: null,\n assistantTopicId: null,\n };\n}\n\n// --- Discord validation ---\n\nexport async function validateDiscordToken(token: string): Promise<\n | { ok: true; username: string; id: string }\n | { ok: false; error: string }\n> {\n try {\n const res = await fetch(\"https://discord.com/api/v10/users/@me\", {\n headers: { Authorization: `Bot ${token}` },\n });\n if (res.status === 200) {\n const data = (await res.json()) as { username: string; id: string };\n return { ok: true, username: data.username, id: data.id };\n }\n if (res.status === 401) {\n return { ok: false, error: \"Token rejected by Discord (401 Unauthorized)\" };\n }\n return { ok: false, error: `Discord API returned ${res.status}` };\n } catch (err) {\n return { ok: false, error: (err as Error).message };\n }\n}\n\nexport async function setupDiscord(): Promise<DiscordChannelConfig> {\n console.log('\\n📱 Discord Setup\\n');\n\n console.log(` ${c.bold}Quick setup:${c.reset}`);\n console.log(dim(' 1. Create app at https://discord.com/developers/applications'));\n console.log(dim(' 2. Go to Bot → Reset Token → copy it'));\n console.log(dim(' 3. Enable Message Content Intent (Bot → Privileged Intents)'));\n console.log(dim(' 4. OAuth2 → URL Generator → scopes: bot + applications.commands'));\n console.log(dim(' 5. Bot Permissions: Manage Channels, Send Messages, Manage Threads, Attach Files'));\n console.log(dim(' 6. Open generated URL → invite bot to your server'));\n console.log('');\n console.log(dim(` 📖 Detailed guide: https://github.com/Open-ACP/OpenACP/blob/main/docs/guide/discord-setup.md`));\n console.log('');\n\n let botToken = '';\n\n while (true) {\n botToken = guardCancel(\n await clack.text({\n message: 'Bot token (from Discord Developer Portal):',\n validate: (val) => (val ?? \"\").toString().trim().length > 0 ? undefined : 'Token cannot be empty',\n }),\n ) as string;\n botToken = botToken.trim();\n\n const s = clack.spinner();\n s.start(\"Validating token...\");\n const result = await validateDiscordToken(botToken);\n s.stop(\"Token validated\");\n\n if (result.ok) {\n console.log(ok(`Connected as @${result.username} (id: ${result.id})`));\n break;\n }\n console.log(fail(result.error));\n const action = guardCancel(\n await clack.select({\n message: 'What to do?',\n options: [\n { label: 'Re-enter token', value: 'retry' },\n { label: 'Use as-is (skip validation)', value: 'skip' },\n ],\n }),\n );\n if (action === 'skip') break;\n }\n\n const guildId = guardCancel(\n await clack.text({\n message: 'Guild (server) ID:',\n validate: (val) => {\n const trimmed = (val ?? \"\").toString().trim();\n if (!trimmed) return 'Guild ID cannot be empty';\n if (!/^\\d{17,20}$/.test(trimmed)) return 'Guild ID must be a numeric Discord snowflake (17-20 digits)';\n return undefined;\n },\n }),\n ) as string;\n\n return {\n enabled: true,\n botToken,\n guildId: guildId.trim(),\n forumChannelId: null,\n notificationChannelId: null,\n assistantThreadId: null,\n };\n}\n\nexport async function setupAgents(): Promise<{\n defaultAgent: string;\n}> {\n const { AgentCatalog } = await import(\"./agent-catalog.js\");\n const { muteLogger, unmuteLogger } = await import(\"./log.js\");\n\n muteLogger();\n const catalog = new AgentCatalog();\n catalog.load();\n\n const s = clack.spinner();\n s.start(\"Checking available agents...\");\n await catalog.refreshRegistryIfStale();\n\n // Claude is always pre-installed (bundled dependency)\n if (!catalog.getInstalledAgent(\"claude\")) {\n const claudeRegistry = catalog.findRegistryAgent(\"claude-acp\");\n if (claudeRegistry) {\n await catalog.install(\"claude-acp\");\n } else {\n // Fallback: register bundled claude-agent-acp directly\n const { AgentStore } = await import(\"./agent-store.js\");\n const store = new AgentStore();\n store.load();\n store.addAgent(\"claude\", {\n registryId: \"claude-acp\",\n name: \"Claude Agent\",\n version: \"bundled\",\n distribution: \"npx\",\n command: \"npx\",\n args: [\"@zed-industries/claude-agent-acp\"],\n env: {},\n installedAt: new Date().toISOString(),\n binaryPath: null,\n });\n }\n }\n s.stop(ok(\"Claude Agent ready\"));\n unmuteLogger();\n\n const available = catalog.getAvailable();\n const installed = available.filter((a) => a.installed);\n const installable = available.filter((a) => !a.installed && a.available);\n\n // Offer agent selection — show installed agents as pre-checked + installable agents\n if (installed.length > 0 || installable.length > 0) {\n // Deduplicate by key AND name\n const seen = new Set<string>();\n const options: Array<{ label: string; value: string }> = [];\n\n for (const a of installed) {\n const dedupeKey = `${a.key}::${a.name}`;\n if (seen.has(dedupeKey)) continue;\n seen.add(dedupeKey);\n options.push({\n label: `${a.name} (installed)`,\n value: a.key,\n });\n }\n for (const a of installable) {\n const dedupeKey = `${a.key}::${a.name}`;\n if (seen.has(dedupeKey)) continue;\n seen.add(dedupeKey);\n options.push({\n label: `${a.name} (${a.distribution})`,\n value: a.key,\n });\n }\n\n const installedKeys = installed.map(a => a.key);\n const selected = guardCancel(\n await clack.autocompleteMultiselect({\n message: \"Install additional agents? (type to search, Space to select)\",\n options,\n initialValues: installedKeys,\n required: false,\n }),\n ) as string[];\n\n for (const key of selected) {\n const regAgent = catalog.findRegistryAgent(key);\n if (regAgent) {\n const installSpinner = clack.spinner();\n installSpinner.start(`Installing ${regAgent.name}...`);\n muteLogger();\n const result = await catalog.install(key);\n unmuteLogger();\n if (result.ok) {\n installSpinner.stop(ok(\"done\"));\n } else {\n installSpinner.stop(warn(`skipped: ${result.error}`));\n }\n }\n }\n }\n\n // Choose default agent\n const installedAgents = Object.keys(catalog.getInstalledEntries());\n let defaultAgent = \"claude\";\n\n if (installedAgents.length > 1) {\n defaultAgent = guardCancel(\n await clack.select({\n message: \"Which agent should be the default?\",\n options: installedAgents.map((key) => {\n const agent = catalog.getInstalledAgent(key)!;\n return { label: `${agent.name} (${key})`, value: key };\n }),\n initialValue: \"claude\",\n }),\n ) as string;\n }\n\n console.log(ok(`Default agent: ${c.bold}${defaultAgent}${c.reset}`));\n return { defaultAgent };\n}\n\nexport async function setupWorkspace(stepNum = 2, totalSteps = 3): Promise<{ baseDir: string }> {\n console.log(step(stepNum, totalSteps, \"Workspace\"));\n\n const baseDir = guardCancel(\n await clack.text({\n message: \"Base directory for workspaces:\",\n initialValue: \"~/openacp-workspace\",\n validate: (val) => (val ?? \"\").toString().trim().length > 0 ? undefined : \"Path cannot be empty\",\n }),\n ) as string;\n\n return { baseDir: baseDir.trim().replace(/^['\"]|['\"]$/g, \"\") };\n}\n\nexport async function setupRunMode(stepNum = 3, totalSteps = 3): Promise<{ runMode: 'foreground' | 'daemon'; autoStart: boolean }> {\n console.log(step(stepNum, totalSteps, 'Run Mode'))\n\n // Don't show daemon option on Windows\n if (process.platform === 'win32') {\n console.log(dim(' (Daemon mode not available on Windows)'))\n return { runMode: 'foreground', autoStart: false }\n }\n\n const mode = guardCancel(\n await clack.select({\n message: 'How would you like to run OpenACP?',\n options: [\n {\n label: 'Background (daemon)',\n value: 'daemon' as const,\n hint: 'Runs silently, auto-starts on boot. Manage with: openacp status | stop | logs',\n },\n {\n label: 'Foreground (terminal)',\n value: 'foreground' as const,\n hint: 'Runs in current terminal session. Start with: openacp',\n },\n ],\n }),\n );\n\n if (mode === 'daemon') {\n const { installAutoStart, isAutoStartSupported } = await import('./autostart.js')\n const autoStart = isAutoStartSupported()\n if (autoStart) {\n const result = installAutoStart(expandHome('~/.openacp/logs'))\n if (result.success) {\n console.log(ok('Auto-start on boot enabled'))\n } else {\n console.log(warn(`Auto-start failed: ${result.error}`))\n }\n }\n return { runMode: 'daemon', autoStart }\n }\n\n return { runMode: 'foreground', autoStart: false }\n}\n\n// --- Orchestrator ---\n\nfunction applyGradient(text: string): string {\n const colors = [135, 99, 63, 33, 39, 44, 44];\n const lines = text.split(\"\\n\");\n return lines\n .map((line, i) => {\n const colorIdx = Math.min(i, colors.length - 1);\n return `\\x1b[38;5;${colors[colorIdx]}m${line}\\x1b[0m`;\n })\n .join(\"\\n\");\n}\n\nconst BANNER = `\n ██████╗ ██████╗ ███████╗███╗ ██╗ █████╗ ██████╗██████╗\n ██╔═══██╗██╔══██╗██╔════╝████╗ ██║██╔══██╗██╔════╝██╔══██╗\n ██║ ██║██████╔╝█████╗ ██╔██╗ ██║███████║██║ ██████╔╝\n ██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║██╔══██║██║ ██╔═══╝\n ╚██████╔╝██║ ███████╗██║ ╚████║██║ ██║╚██████╗██║\n ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝╚═╝ ╚═╝ ╚═════╝╚═╝\n`;\n\n/** Compact banner for normal startup (foreground mode) */\nexport async function printStartBanner(): Promise<void> {\n let version = \"0.0.0\";\n try {\n const { getCurrentVersion } = await import(\"../cli/version.js\");\n version = getCurrentVersion();\n } catch {\n // ignore\n }\n console.log(applyGradient(BANNER));\n console.log(`${c.dim} AI coding agents, anywhere. v${version}${c.reset}\\n`);\n}\n\nasync function printWelcomeBanner(): Promise<void> {\n await printStartBanner();\n}\n\nexport async function runSetup(configManager: ConfigManager, opts?: { skipRunMode?: boolean }): Promise<boolean> {\n await printWelcomeBanner();\n clack.intro(\"Let's set up OpenACP\");\n\n try {\n const channelChoice = guardCancel(\n await clack.select({\n message: 'Which messaging platform do you want to use?',\n options: [\n { label: 'Telegram', value: 'telegram' },\n { label: 'Discord', value: 'discord' },\n { label: 'Both', value: 'both' },\n ],\n }),\n );\n\n let telegram: Config[\"channels\"][string] | undefined;\n let discord: DiscordChannelConfig | undefined;\n\n // Calculate total steps dynamically: channel(s) + workspace + run mode\n const channelSteps = channelChoice === 'both' ? 2 : 1;\n const runModeSteps = opts?.skipRunMode ? 0 : 1;\n const totalSteps = channelSteps + 1 + runModeSteps; // + workspace + optional run mode\n\n let currentStep = 0;\n\n if (channelChoice === 'telegram' || channelChoice === 'both') {\n currentStep++;\n telegram = await setupTelegram(currentStep, totalSteps);\n }\n if (channelChoice === 'discord' || channelChoice === 'both') {\n currentStep++;\n discord = await setupDiscord();\n }\n\n const { defaultAgent } = await setupAgents();\n\n // Offer Claude CLI integration\n {\n const installClaude = guardCancel(\n await clack.confirm({\n message: \"Install session transfer for Claude? (enables /openacp:handoff in your terminal)\",\n initialValue: true,\n }),\n );\n\n if (installClaude) {\n try {\n const { getIntegration } = await import(\"../cli/integrate.js\");\n const integration = getIntegration(\"claude\");\n if (integration) {\n for (const item of integration.items) {\n const result = await item.install();\n for (const log of result.logs) console.log(` ${log}`);\n }\n }\n console.log(\"Claude CLI integration installed.\\n\");\n } catch (err) {\n console.log(`Could not install Claude CLI integration: ${err instanceof Error ? err.message : err}`);\n console.log(\" You can install it later with: openacp integrate claude\\n\");\n }\n }\n }\n\n currentStep++;\n const workspace = await setupWorkspace(currentStep, totalSteps);\n\n let runMode: 'foreground' | 'daemon' = 'foreground';\n let autoStart = false;\n if (!opts?.skipRunMode) {\n currentStep++;\n const result = await setupRunMode(currentStep, totalSteps);\n runMode = result.runMode;\n autoStart = result.autoStart;\n }\n\n const security = {\n allowedUserIds: [] as string[],\n maxConcurrentSessions: 20,\n sessionTimeoutMinutes: 60,\n };\n\n const channels: Config[\"channels\"] = {};\n if (telegram) channels.telegram = telegram;\n // DiscordChannelConfig is structurally compatible with the base channel schema\n if (discord) channels.discord = discord as Config[\"channels\"][string];\n\n const config: Config = {\n channels,\n agents: {},\n defaultAgent,\n workspace,\n security,\n logging: {\n level: \"info\",\n logDir: \"~/.openacp/logs\",\n maxFileSize: \"10m\",\n maxFiles: 7,\n sessionLogRetentionDays: 30,\n },\n runMode,\n autoStart,\n api: {\n port: 21420,\n host: '127.0.0.1',\n },\n sessionStore: { ttlDays: 30 },\n tunnel: {\n enabled: true,\n port: 3100,\n provider: \"cloudflare\",\n options: {},\n maxUserTunnels: 5,\n storeTtlMinutes: 60,\n auth: { enabled: false },\n },\n usage: {\n enabled: true,\n warningThreshold: 0.8,\n currency: \"USD\",\n retentionDays: 90,\n },\n integrations: {},\n speech: {\n stt: { provider: null, providers: {} },\n tts: { provider: null, providers: {} },\n },\n };\n\n try {\n await configManager.writeNew(config);\n } catch (writeErr) {\n console.log(\n fail(`Could not save config: ${(writeErr as Error).message}`),\n );\n return false;\n }\n\n clack.outro(`Config saved to ${configManager.getConfigPath()}`);\n\n if (!opts?.skipRunMode) {\n console.log(ok(\"Starting OpenACP...\"));\n console.log(\"\");\n }\n\n return true;\n } catch (err) {\n if ((err as Error).name === \"ExitPromptError\") {\n clack.cancel(\"Setup cancelled.\");\n return false;\n }\n throw err;\n }\n}\n"],"mappings":"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","names":["val","text"]}
@@ -72,19 +72,19 @@ async function checkAndPromptUpdate() {
72
72
  const latest = await getLatestVersion();
73
73
  if (!latest || compareVersions(current, latest) >= 0) return;
74
74
  console.log(`\x1B[33mUpdate available: v${current} \u2192 v${latest}\x1B[0m`);
75
- const { confirm } = await import("@inquirer/prompts");
76
- const yes = await confirm({
77
- message: "Update now before starting?",
78
- default: true
75
+ const clack = await import("@clack/prompts");
76
+ const yes = await clack.confirm({
77
+ message: "Update now before starting?"
79
78
  });
80
- if (yes) {
81
- const ok = await runUpdate();
82
- if (ok) {
83
- console.log(`\x1B[32m\u2713 Updated to v${latest}. Please re-run your command.\x1B[0m`);
84
- process.exit(0);
85
- } else {
86
- console.error("\x1B[31mUpdate failed. Continuing with current version.\x1B[0m");
87
- }
79
+ if (clack.isCancel(yes) || !yes) {
80
+ return;
81
+ }
82
+ const ok = await runUpdate();
83
+ if (ok) {
84
+ console.log(`\x1B[32m\u2713 Updated to v${latest}. Please re-run your command.\x1B[0m`);
85
+ process.exit(0);
86
+ } else {
87
+ console.error("\x1B[31mUpdate failed. Continuing with current version.\x1B[0m");
88
88
  }
89
89
  }
90
90
 
@@ -95,4 +95,4 @@ export {
95
95
  runUpdate,
96
96
  checkAndPromptUpdate
97
97
  };
98
- //# sourceMappingURL=chunk-EVFJW45N.js.map
98
+ //# sourceMappingURL=chunk-S64CB6J3.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/version.ts"],"sourcesContent":["import { fileURLToPath } from 'node:url'\nimport { dirname, join, resolve } from 'node:path'\nimport { existsSync, readFileSync } from 'node:fs'\n\nconst NPM_PACKAGE = '@openacp/cli'\n\nfunction findPackageJson(): string | null {\n let dir = dirname(fileURLToPath(import.meta.url))\n for (let i = 0; i < 5; i++) {\n const candidate = join(dir, 'package.json')\n if (existsSync(candidate)) return candidate\n const parent = resolve(dir, '..')\n if (parent === dir) break\n dir = parent\n }\n return null\n}\n\nexport function getCurrentVersion(): string {\n try {\n const pkgPath = findPackageJson()\n if (!pkgPath) return '0.0.0-dev'\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'))\n return pkg.version as string\n } catch {\n return '0.0.0-dev'\n }\n}\n\nexport async 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\nexport function 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\nexport async 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\nexport async function checkAndPromptUpdate(): Promise<void> {\n if (process.env.OPENACP_DEV_LOOP || process.env.OPENACP_SKIP_UPDATE_CHECK) return\n\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"],"mappings":"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","names":["resolve"]}
1
+ {"version":3,"sources":["../../src/cli/version.ts"],"sourcesContent":["import { fileURLToPath } from 'node:url'\nimport { dirname, join, resolve } from 'node:path'\nimport { existsSync, readFileSync } from 'node:fs'\n\nconst NPM_PACKAGE = '@openacp/cli'\n\nfunction findPackageJson(): string | null {\n let dir = dirname(fileURLToPath(import.meta.url))\n for (let i = 0; i < 5; i++) {\n const candidate = join(dir, 'package.json')\n if (existsSync(candidate)) return candidate\n const parent = resolve(dir, '..')\n if (parent === dir) break\n dir = parent\n }\n return null\n}\n\nexport function getCurrentVersion(): string {\n try {\n const pkgPath = findPackageJson()\n if (!pkgPath) return '0.0.0-dev'\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'))\n return pkg.version as string\n } catch {\n return '0.0.0-dev'\n }\n}\n\nexport async 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\nexport function 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\nexport async 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\nexport async function checkAndPromptUpdate(): Promise<void> {\n if (process.env.OPENACP_DEV_LOOP || process.env.OPENACP_SKIP_UPDATE_CHECK) return\n\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 clack = await import('@clack/prompts')\n const yes = await clack.confirm({\n message: 'Update now before starting?',\n })\n if (clack.isCancel(yes) || !yes) {\n return\n }\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"],"mappings":"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","names":["resolve"]}
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  DoctorEngine
3
- } from "./chunk-OHR6SBMC.js";
3
+ } from "./chunk-TOQPQB5Q.js";
4
4
  import {
5
5
  log
6
- } from "./chunk-ESOPMQAY.js";
6
+ } from "./chunk-GAK6PIBW.js";
7
7
 
8
8
  // src/adapters/discord/commands/doctor.ts
9
9
  import {
@@ -131,4 +131,4 @@ export {
131
131
  runDoctorInline,
132
132
  handleDoctorButton
133
133
  };
134
- //# sourceMappingURL=chunk-6LSFRNHE.js.map
134
+ //# sourceMappingURL=chunk-TNFXJQZP.js.map
@@ -3,7 +3,7 @@ import {
3
3
  ConfigSchema,
4
4
  applyMigrations,
5
5
  expandHome
6
- } from "./chunk-EWYNCHUH.js";
6
+ } from "./chunk-L5KZXYJD.js";
7
7
 
8
8
  // src/core/doctor/index.ts
9
9
  import * as fs8 from "fs";
@@ -605,7 +605,7 @@ var tunnelCheck = {
605
605
  fixRisk: "safe",
606
606
  fix: async () => {
607
607
  try {
608
- const { ensureCloudflared } = await import("./install-cloudflared-G2GUKCHA.js");
608
+ const { ensureCloudflared } = await import("./install-cloudflared-FSILDS5J.js");
609
609
  await ensureCloudflared();
610
610
  return { success: true, message: "installed cloudflared" };
611
611
  } catch (err) {
@@ -721,4 +721,4 @@ var DoctorEngine = class {
721
721
  export {
722
722
  DoctorEngine
723
723
  };
724
- //# sourceMappingURL=chunk-OHR6SBMC.js.map
724
+ //# sourceMappingURL=chunk-TOQPQB5Q.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  AgentStore
3
- } from "./chunk-5HGXUCMX.js";
3
+ } from "./chunk-34M4OS5P.js";
4
4
  import {
5
5
  checkDependencies,
6
6
  checkRuntimeAvailable,
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-JKBFUAJK.js";
10
10
  import {
11
11
  createChildLogger
12
- } from "./chunk-ESOPMQAY.js";
12
+ } from "./chunk-GAK6PIBW.js";
13
13
 
14
14
  // src/core/agent-catalog.ts
15
15
  import * as fs2 from "fs";
@@ -481,4 +481,4 @@ var AgentCatalog = class {
481
481
  export {
482
482
  AgentCatalog
483
483
  };
484
- //# sourceMappingURL=chunk-CKOK7JW6.js.map
484
+ //# sourceMappingURL=chunk-UKT3G5IA.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-JKBFUAJK.js";
4
4
  import {
5
5
  createChildLogger
6
- } from "./chunk-ESOPMQAY.js";
6
+ } from "./chunk-GAK6PIBW.js";
7
7
 
8
8
  // src/core/install-binary.ts
9
9
  import fs from "fs";
@@ -98,4 +98,4 @@ async function ensureBinary(spec) {
98
98
  export {
99
99
  ensureBinary
100
100
  };
101
- //# sourceMappingURL=chunk-PWFPTG5X.js.map
101
+ //# sourceMappingURL=chunk-V5GZQEIY.js.map
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-F3AICYO4.js";
7
7
  import {
8
8
  log
9
- } from "./chunk-ESOPMQAY.js";
9
+ } from "./chunk-GAK6PIBW.js";
10
10
 
11
11
  // src/adapters/discord/commands/settings.ts
12
12
  import {
@@ -295,4 +295,4 @@ export {
295
295
  showSettingsInfo,
296
296
  handleSettingsButton
297
297
  };
298
- //# sourceMappingURL=chunk-IER5UCY7.js.map
298
+ //# sourceMappingURL=chunk-YQRF3IOR.js.map
package/dist/cli.js CHANGED
@@ -3,9 +3,9 @@ import {
3
3
  installPlugin,
4
4
  listPlugins,
5
5
  uninstallPlugin
6
- } from "./chunk-TMCQZAXN.js";
7
- import "./chunk-EWYNCHUH.js";
8
- import "./chunk-ESOPMQAY.js";
6
+ } from "./chunk-3CHBVO4T.js";
7
+ import "./chunk-L5KZXYJD.js";
8
+ import "./chunk-GAK6PIBW.js";
9
9
  import {
10
10
  apiCall,
11
11
  readApiPort,
@@ -17,7 +17,7 @@ import {
17
17
  getCurrentVersion,
18
18
  getLatestVersion,
19
19
  runUpdate
20
- } from "./chunk-EVFJW45N.js";
20
+ } from "./chunk-S64CB6J3.js";
21
21
 
22
22
  // src/cli.ts
23
23
  import { setDefaultAutoSelectFamily } from "net";
@@ -59,6 +59,7 @@ Connect messaging platforms (Telegram, Discord) to 28+ AI coding agents via ACP
59
59
  \x1B[1mConfiguration:\x1B[0m
60
60
  openacp config Interactive config editor
61
61
  openacp config set <key> <value> Set a config value
62
+ openacp onboard Re-run onboarding setup wizard
62
63
  openacp reset Re-run setup wizard
63
64
  openacp update Update to latest version
64
65
  openacp doctor Run system diagnostics
@@ -96,7 +97,7 @@ Connect messaging platforms (Telegram, Discord) to 28+ AI coding agents via ACP
96
97
  `);
97
98
  }
98
99
  async function cmdVersion() {
99
- const { getCurrentVersion: getCurrentVersion2 } = await import("./version-ALWGGVKM.js");
100
+ const { getCurrentVersion: getCurrentVersion2 } = await import("./version-AXXV6IV2.js");
100
101
  console.log(`openacp v${getCurrentVersion2()}`);
101
102
  }
102
103
  async function cmdInstall(args2) {
@@ -772,8 +773,8 @@ Requires an existing config \u2014 run 'openacp' first to set up.
772
773
  return;
773
774
  }
774
775
  await checkAndPromptUpdate();
775
- const { startDaemon, getPidPath } = await import("./daemon-I6XMRQ6P.js");
776
- const { ConfigManager } = await import("./config-4YSJ4NCI.js");
776
+ const { startDaemon, getPidPath } = await import("./daemon-QY7WXHQ3.js");
777
+ const { ConfigManager } = await import("./config-XDUOULXX.js");
777
778
  const cm = new ConfigManager();
778
779
  if (await cm.exists()) {
779
780
  await cm.load();
@@ -801,7 +802,7 @@ Sends a stop signal to the running OpenACP daemon process.
801
802
  `);
802
803
  return;
803
804
  }
804
- const { stopDaemon } = await import("./daemon-I6XMRQ6P.js");
805
+ const { stopDaemon } = await import("./daemon-QY7WXHQ3.js");
805
806
  const result = await stopDaemon();
806
807
  if (result.stopped) {
807
808
  console.log(`OpenACP daemon stopped (was PID ${result.pid})`);
@@ -822,7 +823,7 @@ Shows whether the OpenACP daemon is running and its PID.
822
823
  `);
823
824
  return;
824
825
  }
825
- const { getStatus } = await import("./daemon-I6XMRQ6P.js");
826
+ const { getStatus } = await import("./daemon-QY7WXHQ3.js");
826
827
  const status = getStatus();
827
828
  if (status.running) {
828
829
  console.log(`OpenACP is running (PID ${status.pid})`);
@@ -846,7 +847,7 @@ Log file location is configured in config (default: ~/.openacp/logs/).
846
847
  return;
847
848
  }
848
849
  const { spawn } = await import("child_process");
849
- const { ConfigManager, expandHome } = await import("./config-4YSJ4NCI.js");
850
+ const { ConfigManager, expandHome } = await import("./config-XDUOULXX.js");
850
851
  const pathMod = await import("path");
851
852
  const cm = new ConfigManager();
852
853
  let logDir = "~/.openacp/logs";
@@ -916,7 +917,7 @@ the API for live updates. When stopped, edits config file directly.
916
917
  console.error("Usage: openacp config set <path> <value>");
917
918
  process.exit(1);
918
919
  }
919
- const { ConfigSchema } = await import("./config-4YSJ4NCI.js");
920
+ const { ConfigSchema } = await import("./config-XDUOULXX.js");
920
921
  const topLevelKey = configPath.split(".")[0];
921
922
  const validConfigKeys = Object.keys(ConfigSchema.shape);
922
923
  if (!validConfigKeys.includes(topLevelKey)) {
@@ -948,7 +949,7 @@ the API for live updates. When stopped, edits config file directly.
948
949
  console.log("Note: restart required for this change to take effect.");
949
950
  }
950
951
  } else {
951
- const { ConfigManager: ConfigManager2 } = await import("./config-4YSJ4NCI.js");
952
+ const { ConfigManager: ConfigManager2 } = await import("./config-XDUOULXX.js");
952
953
  const cm2 = new ConfigManager2();
953
954
  if (!await cm2.exists()) {
954
955
  console.error('No config found. Run "openacp" first to set up.');
@@ -961,8 +962,8 @@ the API for live updates. When stopped, edits config file directly.
961
962
  }
962
963
  return;
963
964
  }
964
- const { runConfigEditor } = await import("./config-editor-F25HEMGL.js");
965
- const { ConfigManager } = await import("./config-4YSJ4NCI.js");
965
+ const { runConfigEditor } = await import("./config-editor-3GGBY7NL.js");
966
+ const { ConfigManager } = await import("./config-XDUOULXX.js");
966
967
  const cm = new ConfigManager();
967
968
  if (!await cm.exists()) {
968
969
  console.error('No config found. Run "openacp" first to set up.');
@@ -1001,22 +1002,22 @@ start fresh with the setup wizard. The daemon must be stopped first.
1001
1002
  `);
1002
1003
  return;
1003
1004
  }
1004
- const { getStatus } = await import("./daemon-I6XMRQ6P.js");
1005
+ const { getStatus } = await import("./daemon-QY7WXHQ3.js");
1005
1006
  const status = getStatus();
1006
1007
  if (status.running) {
1007
1008
  console.error("OpenACP is running. Stop it first: openacp stop");
1008
1009
  process.exit(1);
1009
1010
  }
1010
- const { confirm } = await import("@inquirer/prompts");
1011
- const yes = await confirm({
1011
+ const clack = await import("@clack/prompts");
1012
+ const yes = await clack.confirm({
1012
1013
  message: "This will delete all OpenACP data (~/.openacp). You will need to set up again. Continue?",
1013
- default: false
1014
+ initialValue: false
1014
1015
  });
1015
- if (!yes) {
1016
+ if (clack.isCancel(yes) || !yes) {
1016
1017
  console.log("Aborted.");
1017
1018
  return;
1018
1019
  }
1019
- const { uninstallAutoStart } = await import("./autostart-A7JRU4WJ.js");
1020
+ const { uninstallAutoStart } = await import("./autostart-6M3FZAKW.js");
1020
1021
  uninstallAutoStart();
1021
1022
  const fs = await import("fs");
1022
1023
  const os = await import("os");
@@ -1225,7 +1226,7 @@ Fixable issues can be auto-repaired when not using --dry-run.
1225
1226
  process.exit(1);
1226
1227
  }
1227
1228
  const dryRun = args2.includes("--dry-run");
1228
- const { DoctorEngine } = await import("./doctor-Y3SCSVPI.js");
1229
+ const { DoctorEngine } = await import("./doctor-SNSQ5SS2.js");
1229
1230
  const engine = new DoctorEngine({ dryRun });
1230
1231
  console.log("\n\u{1FA7A} OpenACP Doctor\n");
1231
1232
  const report = await engine.runAll();
@@ -1243,18 +1244,19 @@ Fixable issues can be auto-repaired when not using --dry-run.
1243
1244
  if (dryRun) {
1244
1245
  console.log(` \u{1F527} ${pending.message} (use without --dry-run to fix)`);
1245
1246
  } else {
1246
- const { confirm } = await import("@inquirer/prompts");
1247
- const shouldFix = await confirm({
1247
+ const clack = await import("@clack/prompts");
1248
+ const shouldFix = await clack.confirm({
1248
1249
  message: `Fix: ${pending.message}?`,
1249
- default: false
1250
+ initialValue: false
1250
1251
  });
1251
- if (shouldFix) {
1252
- const fixResult = await pending.fix();
1253
- if (fixResult.success) {
1254
- console.log(` \x1B[32m\u2713 ${fixResult.message}\x1B[0m`);
1255
- } else {
1256
- console.log(` \x1B[31m\u2717 Fix failed: ${fixResult.message}\x1B[0m`);
1257
- }
1252
+ if (clack.isCancel(shouldFix) || !shouldFix) {
1253
+ continue;
1254
+ }
1255
+ const fixResult = await pending.fix();
1256
+ if (fixResult.success) {
1257
+ console.log(` \x1B[32m\u2713 ${fixResult.message}\x1B[0m`);
1258
+ } else {
1259
+ console.log(` \x1B[31m\u2717 Fix failed: ${fixResult.message}\x1B[0m`);
1258
1260
  }
1259
1261
  }
1260
1262
  }
@@ -1413,7 +1415,7 @@ Run 'openacp agents' to see available agents.`);
1413
1415
  }
1414
1416
  }
1415
1417
  async function agentsList() {
1416
- const { AgentCatalog } = await import("./agent-catalog-IVU2KANH.js");
1418
+ const { AgentCatalog } = await import("./agent-catalog-SBZQRYOD.js");
1417
1419
  const catalog = new AgentCatalog();
1418
1420
  catalog.load();
1419
1421
  await catalog.refreshRegistryIfStale();
@@ -1476,7 +1478,7 @@ Run 'openacp agents' to see available agents.
1476
1478
  `);
1477
1479
  return;
1478
1480
  }
1479
- const { AgentCatalog } = await import("./agent-catalog-IVU2KANH.js");
1481
+ const { AgentCatalog } = await import("./agent-catalog-SBZQRYOD.js");
1480
1482
  const catalog = new AgentCatalog();
1481
1483
  catalog.load();
1482
1484
  await catalog.refreshRegistryIfStale();
@@ -1555,7 +1557,7 @@ async function agentsUninstall(name, help = false) {
1555
1557
  `);
1556
1558
  return;
1557
1559
  }
1558
- const { AgentCatalog } = await import("./agent-catalog-IVU2KANH.js");
1560
+ const { AgentCatalog } = await import("./agent-catalog-SBZQRYOD.js");
1559
1561
  const catalog = new AgentCatalog();
1560
1562
  catalog.load();
1561
1563
  const result = await catalog.uninstall(name);
@@ -1583,7 +1585,7 @@ async function agentsUninstall(name, help = false) {
1583
1585
  }
1584
1586
  }
1585
1587
  async function agentsRefresh() {
1586
- const { AgentCatalog } = await import("./agent-catalog-IVU2KANH.js");
1588
+ const { AgentCatalog } = await import("./agent-catalog-SBZQRYOD.js");
1587
1589
  const catalog = new AgentCatalog();
1588
1590
  catalog.load();
1589
1591
  console.log("\n Updating agent list...");
@@ -1610,7 +1612,7 @@ whether the agent is installed or available from the registry.
1610
1612
  `);
1611
1613
  return;
1612
1614
  }
1613
- const { AgentCatalog } = await import("./agent-catalog-IVU2KANH.js");
1615
+ const { AgentCatalog } = await import("./agent-catalog-SBZQRYOD.js");
1614
1616
  const catalog = new AgentCatalog();
1615
1617
  catalog.load();
1616
1618
  const { getAgentSetup } = await import("./agent-dependencies-QY5QSULV.js");
@@ -1691,7 +1693,7 @@ ACP-specific flags are automatically stripped.
1691
1693
  `);
1692
1694
  return;
1693
1695
  }
1694
- const { AgentCatalog } = await import("./agent-catalog-IVU2KANH.js");
1696
+ const { AgentCatalog } = await import("./agent-catalog-SBZQRYOD.js");
1695
1697
  const catalog = new AgentCatalog();
1696
1698
  catalog.load();
1697
1699
  const installed = catalog.getInstalledAgent(nameOrId);
@@ -1739,6 +1741,12 @@ ACP-specific flags are automatically stripped.
1739
1741
  process.exit(result.status);
1740
1742
  }
1741
1743
  }
1744
+ async function cmdOnboard() {
1745
+ const { ConfigManager } = await import("./config-XDUOULXX.js");
1746
+ const cm = new ConfigManager();
1747
+ const { runSetup } = await import("./setup-D6BU36ZL.js");
1748
+ await runSetup(cm, { skipRunMode: true });
1749
+ }
1742
1750
  async function cmdDefault(command2) {
1743
1751
  const forceForeground = command2 === "--foreground";
1744
1752
  if (command2 && !command2.startsWith("-")) {
@@ -1758,7 +1766,8 @@ async function cmdDefault(command2) {
1758
1766
  "adopt",
1759
1767
  "integrate",
1760
1768
  "doctor",
1761
- "agents"
1769
+ "agents",
1770
+ "onboard"
1762
1771
  ];
1763
1772
  const suggestion = suggestMatch(command2, topLevelCommands);
1764
1773
  console.error(`Unknown command: ${command2}`);
@@ -1767,17 +1776,17 @@ async function cmdDefault(command2) {
1767
1776
  process.exit(1);
1768
1777
  }
1769
1778
  await checkAndPromptUpdate();
1770
- const { ConfigManager } = await import("./config-4YSJ4NCI.js");
1779
+ const { ConfigManager } = await import("./config-XDUOULXX.js");
1771
1780
  const cm = new ConfigManager();
1772
1781
  if (!await cm.exists()) {
1773
- const { runSetup } = await import("./setup-7YBFKRG7.js");
1782
+ const { runSetup } = await import("./setup-D6BU36ZL.js");
1774
1783
  const shouldStart = await runSetup(cm);
1775
1784
  if (!shouldStart) process.exit(0);
1776
1785
  }
1777
1786
  await cm.load();
1778
1787
  const config = cm.get();
1779
1788
  if (!forceForeground && config.runMode === "daemon") {
1780
- const { startDaemon, getPidPath } = await import("./daemon-I6XMRQ6P.js");
1789
+ const { startDaemon, getPidPath } = await import("./daemon-QY7WXHQ3.js");
1781
1790
  const result = startDaemon(getPidPath(), config.logging.logDir);
1782
1791
  if ("error" in result) {
1783
1792
  console.error(result.error);
@@ -1786,9 +1795,9 @@ async function cmdDefault(command2) {
1786
1795
  console.log(`OpenACP daemon started (PID ${result.pid})`);
1787
1796
  return;
1788
1797
  }
1789
- const { markRunning } = await import("./daemon-I6XMRQ6P.js");
1798
+ const { markRunning } = await import("./daemon-QY7WXHQ3.js");
1790
1799
  markRunning();
1791
- const { startServer } = await import("./main-P4X6SAPZ.js");
1800
+ const { startServer } = await import("./main-GVTLD7VI.js");
1792
1801
  await startServer();
1793
1802
  }
1794
1803
 
@@ -1817,8 +1826,9 @@ var commands = {
1817
1826
  "doctor": () => cmdDoctor(args),
1818
1827
  "agents": () => cmdAgents(args),
1819
1828
  "tunnel": () => cmdTunnel(args),
1829
+ "onboard": () => cmdOnboard(),
1820
1830
  "--daemon-child": async () => {
1821
- const { startServer } = await import("./main-P4X6SAPZ.js");
1831
+ const { startServer } = await import("./main-GVTLD7VI.js");
1822
1832
  await startServer();
1823
1833
  }
1824
1834
  };