@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.
- package/dist/{admin-3ZHEO5VP.js → admin-SCP25TN2.js} +3 -3
- package/dist/agent-catalog-SBZQRYOD.js +10 -0
- package/dist/agent-store-CGE4G6PA.js +8 -0
- package/dist/{agents-SXIY4IEF.js → agents-QJPHNWK2.js} +3 -3
- package/dist/{autostart-A7JRU4WJ.js → autostart-6M3FZAKW.js} +3 -3
- package/dist/{chunk-PMGNLNSH.js → chunk-2CJ46J3C.js} +2 -2
- package/dist/{chunk-5HGXUCMX.js → chunk-34M4OS5P.js} +2 -2
- package/dist/{chunk-TMCQZAXN.js → chunk-3CHBVO4T.js} +3 -3
- package/dist/{chunk-TTDSLV35.js → chunk-4CTX774K.js} +3 -3
- package/dist/{chunk-NXEQXRQR.js → chunk-774Y4RAK.js} +2 -2
- package/dist/{chunk-SM3G6UAX.js → chunk-BNLGTZ34.js} +2 -2
- package/dist/{chunk-AVCHZESZ.js → chunk-DJIXG62C.js} +49 -20
- package/dist/chunk-DJIXG62C.js.map +1 -0
- package/dist/{chunk-KO5RL7MZ.js → chunk-DOCFD5JR.js} +2 -2
- package/dist/{chunk-HP2IJYCA.js → chunk-E56PPPAE.js} +9 -9
- package/dist/chunk-E56PPPAE.js.map +1 -0
- package/dist/{chunk-ESOPMQAY.js → chunk-GAK6PIBW.js} +25 -2
- package/dist/chunk-GAK6PIBW.js.map +1 -0
- package/dist/{chunk-3KGRVAEV.js → chunk-J4SJTKIK.js} +2 -2
- package/dist/{chunk-FZ5BIWG5.js → chunk-JV6XQRAE.js} +4 -4
- package/dist/{chunk-EWYNCHUH.js → chunk-L5KZXYJD.js} +2 -2
- package/dist/{chunk-G3OHCXZG.js → chunk-N6E3HE42.js} +194 -133
- package/dist/chunk-N6E3HE42.js.map +1 -0
- package/dist/{chunk-EVFJW45N.js → chunk-S64CB6J3.js} +13 -13
- package/dist/{chunk-EVFJW45N.js.map → chunk-S64CB6J3.js.map} +1 -1
- package/dist/{chunk-6LSFRNHE.js → chunk-TNFXJQZP.js} +3 -3
- package/dist/{chunk-OHR6SBMC.js → chunk-TOQPQB5Q.js} +3 -3
- package/dist/{chunk-CKOK7JW6.js → chunk-UKT3G5IA.js} +3 -3
- package/dist/{chunk-PWFPTG5X.js → chunk-V5GZQEIY.js} +2 -2
- package/dist/{chunk-IER5UCY7.js → chunk-YQRF3IOR.js} +2 -2
- package/dist/cli.js +54 -44
- package/dist/cli.js.map +1 -1
- package/dist/{config-4YSJ4NCI.js → config-XDUOULXX.js} +3 -3
- package/dist/config-editor-3GGBY7NL.js +12 -0
- package/dist/{daemon-I6XMRQ6P.js → daemon-QY7WXHQ3.js} +4 -4
- package/dist/{discord-VHCBN3JJ.js → discord-4DE22BQC.js} +19 -19
- package/dist/doctor-D3YZ6VHJ.js +14 -0
- package/dist/doctor-SNSQ5SS2.js +9 -0
- package/dist/index.js +11 -11
- package/dist/{install-cloudflared-G2GUKCHA.js → install-cloudflared-FSILDS5J.js} +3 -3
- package/dist/{install-jq-7QTU7XYY.js → install-jq-P6RUBKPV.js} +3 -3
- package/dist/{log-SPS2S6FO.js → log-RCVBXLTN.js} +8 -4
- package/dist/{main-P4X6SAPZ.js → main-GVTLD7VI.js} +46 -26
- package/dist/main-GVTLD7VI.js.map +1 -0
- package/dist/{new-session-PUNUHGYP.js → new-session-K6UCWYOP.js} +5 -5
- package/dist/{post-upgrade-6N4JCV5S.js → post-upgrade-62LUHDJO.js} +5 -5
- package/dist/{session-ZMAM67AA.js → session-O6ZPLJIZ.js} +4 -4
- package/dist/{settings-OEQEZS5Y.js → settings-RRF77IC4.js} +3 -3
- package/dist/{setup-7YBFKRG7.js → setup-D6BU36ZL.js} +4 -4
- package/dist/{tunnel-service-BMIBHUBK.js → tunnel-service-NJJH4I26.js} +3 -3
- package/dist/{version-ALWGGVKM.js → version-AXXV6IV2.js} +2 -2
- package/package.json +3 -2
- package/dist/agent-catalog-IVU2KANH.js +0 -10
- package/dist/agent-store-ZBXGOFPH.js +0 -8
- package/dist/chunk-AVCHZESZ.js.map +0 -1
- package/dist/chunk-ESOPMQAY.js.map +0 -1
- package/dist/chunk-G3OHCXZG.js.map +0 -1
- package/dist/chunk-HP2IJYCA.js.map +0 -1
- package/dist/config-editor-F25HEMGL.js +0 -12
- package/dist/doctor-GPW5ECK6.js +0 -14
- package/dist/doctor-Y3SCSVPI.js +0 -9
- package/dist/main-P4X6SAPZ.js.map +0 -1
- /package/dist/{admin-3ZHEO5VP.js.map → admin-SCP25TN2.js.map} +0 -0
- /package/dist/{agent-catalog-IVU2KANH.js.map → agent-catalog-SBZQRYOD.js.map} +0 -0
- /package/dist/{agent-store-ZBXGOFPH.js.map → agent-store-CGE4G6PA.js.map} +0 -0
- /package/dist/{agents-SXIY4IEF.js.map → agents-QJPHNWK2.js.map} +0 -0
- /package/dist/{autostart-A7JRU4WJ.js.map → autostart-6M3FZAKW.js.map} +0 -0
- /package/dist/{chunk-PMGNLNSH.js.map → chunk-2CJ46J3C.js.map} +0 -0
- /package/dist/{chunk-5HGXUCMX.js.map → chunk-34M4OS5P.js.map} +0 -0
- /package/dist/{chunk-TMCQZAXN.js.map → chunk-3CHBVO4T.js.map} +0 -0
- /package/dist/{chunk-TTDSLV35.js.map → chunk-4CTX774K.js.map} +0 -0
- /package/dist/{chunk-NXEQXRQR.js.map → chunk-774Y4RAK.js.map} +0 -0
- /package/dist/{chunk-SM3G6UAX.js.map → chunk-BNLGTZ34.js.map} +0 -0
- /package/dist/{chunk-KO5RL7MZ.js.map → chunk-DOCFD5JR.js.map} +0 -0
- /package/dist/{chunk-3KGRVAEV.js.map → chunk-J4SJTKIK.js.map} +0 -0
- /package/dist/{chunk-FZ5BIWG5.js.map → chunk-JV6XQRAE.js.map} +0 -0
- /package/dist/{chunk-EWYNCHUH.js.map → chunk-L5KZXYJD.js.map} +0 -0
- /package/dist/{chunk-6LSFRNHE.js.map → chunk-TNFXJQZP.js.map} +0 -0
- /package/dist/{chunk-OHR6SBMC.js.map → chunk-TOQPQB5Q.js.map} +0 -0
- /package/dist/{chunk-CKOK7JW6.js.map → chunk-UKT3G5IA.js.map} +0 -0
- /package/dist/{chunk-PWFPTG5X.js.map → chunk-V5GZQEIY.js.map} +0 -0
- /package/dist/{chunk-IER5UCY7.js.map → chunk-YQRF3IOR.js.map} +0 -0
- /package/dist/{config-4YSJ4NCI.js.map → config-XDUOULXX.js.map} +0 -0
- /package/dist/{config-editor-F25HEMGL.js.map → config-editor-3GGBY7NL.js.map} +0 -0
- /package/dist/{daemon-I6XMRQ6P.js.map → daemon-QY7WXHQ3.js.map} +0 -0
- /package/dist/{discord-VHCBN3JJ.js.map → discord-4DE22BQC.js.map} +0 -0
- /package/dist/{doctor-GPW5ECK6.js.map → doctor-D3YZ6VHJ.js.map} +0 -0
- /package/dist/{doctor-Y3SCSVPI.js.map → doctor-SNSQ5SS2.js.map} +0 -0
- /package/dist/{install-cloudflared-G2GUKCHA.js.map → install-cloudflared-FSILDS5J.js.map} +0 -0
- /package/dist/{install-jq-7QTU7XYY.js.map → install-jq-P6RUBKPV.js.map} +0 -0
- /package/dist/{log-SPS2S6FO.js.map → log-RCVBXLTN.js.map} +0 -0
- /package/dist/{new-session-PUNUHGYP.js.map → new-session-K6UCWYOP.js.map} +0 -0
- /package/dist/{post-upgrade-6N4JCV5S.js.map → post-upgrade-62LUHDJO.js.map} +0 -0
- /package/dist/{session-ZMAM67AA.js.map → session-O6ZPLJIZ.js.map} +0 -0
- /package/dist/{settings-OEQEZS5Y.js.map → settings-RRF77IC4.js.map} +0 -0
- /package/dist/{setup-7YBFKRG7.js.map → setup-D6BU36ZL.js.map} +0 -0
- /package/dist/{tunnel-service-BMIBHUBK.js.map → tunnel-service-NJJH4I26.js.map} +0 -0
- /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
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
}
|
|
86
|
-
|
|
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-
|
|
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
|
|
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-
|
|
3
|
+
} from "./chunk-TOQPQB5Q.js";
|
|
4
4
|
import {
|
|
5
5
|
log
|
|
6
|
-
} from "./chunk-
|
|
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-
|
|
134
|
+
//# sourceMappingURL=chunk-TNFXJQZP.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
ConfigSchema,
|
|
4
4
|
applyMigrations,
|
|
5
5
|
expandHome
|
|
6
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
724
|
+
//# sourceMappingURL=chunk-TOQPQB5Q.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AgentStore
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
776
|
-
const { ConfigManager } = await import("./config-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
965
|
-
const { ConfigManager } = await import("./config-
|
|
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-
|
|
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
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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
|
|
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
|
-
|
|
1250
|
+
initialValue: false
|
|
1250
1251
|
});
|
|
1251
|
-
if (shouldFix) {
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
1798
|
+
const { markRunning } = await import("./daemon-QY7WXHQ3.js");
|
|
1790
1799
|
markRunning();
|
|
1791
|
-
const { startServer } = await import("./main-
|
|
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-
|
|
1831
|
+
const { startServer } = await import("./main-GVTLD7VI.js");
|
|
1822
1832
|
await startServer();
|
|
1823
1833
|
}
|
|
1824
1834
|
};
|