@openacp/cli 0.6.9 → 2026.326.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +100 -154
- package/dist/{action-detect-P7ZE4NEM.js → action-detect-QPA775HB.js} +2 -2
- package/dist/adapter-6ANPBSVU.js +16 -0
- package/dist/{discord-7IVQKB2H.js → adapter-77ZCVABT.js} +659 -348
- package/dist/adapter-77ZCVABT.js.map +1 -0
- package/dist/{adapter-LNEGLMOE.js → adapter-PQGHVG4K.js} +300 -93
- package/dist/adapter-PQGHVG4K.js.map +1 -0
- package/dist/{admin-6SYB6XCZ.js → admin-GBPZFFAU.js} +3 -3
- package/dist/agent-catalog-YHBFERYO.js +11 -0
- package/dist/{agent-dependencies-4OWBMZWZ.js → agent-dependencies-WS7Z2DFW.js} +2 -2
- package/dist/agent-registry-5LZT7CUB.js +9 -0
- package/dist/agent-store-VSHNY5GT.js +9 -0
- package/dist/{agents-QO7DKARJ.js → agents-BWU4MRRD.js} +3 -3
- package/dist/{api-client-CFQT5U7D.js → api-client-AQPNKXI2.js} +2 -2
- package/dist/api-server-3PYLRBCN.js +8 -0
- package/dist/api-server-CHVSUDBX.js +11 -0
- package/dist/{autostart-X33OGMX6.js → autostart-6JS565RY.js} +3 -3
- package/dist/chunk-2CX4IEEC.js +124 -0
- package/dist/chunk-2CX4IEEC.js.map +1 -0
- package/dist/{chunk-O7CPGUAI.js → chunk-4KGLKKQK.js} +4 -4
- package/dist/chunk-4KGLKKQK.js.map +1 -0
- package/dist/{chunk-W3EYKZNQ.js → chunk-4WXALZA3.js} +2 -2
- package/dist/chunk-4WXALZA3.js.map +1 -0
- package/dist/chunk-5OCGO27U.js +125 -0
- package/dist/chunk-5OCGO27U.js.map +1 -0
- package/dist/{chunk-JUYDFUSN.js → chunk-5ZOFBTOR.js} +117 -237
- package/dist/chunk-5ZOFBTOR.js.map +1 -0
- package/dist/chunk-6RXVEXF3.js +23 -0
- package/dist/chunk-6RXVEXF3.js.map +1 -0
- package/dist/{chunk-34M4OS5P.js → chunk-A6Y4GZM3.js} +3 -3
- package/dist/chunk-A6Y4GZM3.js.map +1 -0
- package/dist/chunk-AD3X6DGK.js +166 -0
- package/dist/chunk-AD3X6DGK.js.map +1 -0
- package/dist/{chunk-7QJS2XBD.js → chunk-AFKX424Q.js} +2 -2
- package/dist/chunk-AFKX424Q.js.map +1 -0
- package/dist/chunk-APS6UEFU.js +259 -0
- package/dist/chunk-APS6UEFU.js.map +1 -0
- package/dist/chunk-BLQUXO7S.js +113 -0
- package/dist/chunk-BLQUXO7S.js.map +1 -0
- package/dist/{chunk-WTZDAYZX.js → chunk-BQ6FR32N.js} +3 -3
- package/dist/chunk-BQ6FR32N.js.map +1 -0
- package/dist/chunk-FNRSWA2K.js +1 -0
- package/dist/chunk-FQEBWOZR.js +3557 -0
- package/dist/chunk-FQEBWOZR.js.map +1 -0
- package/dist/{chunk-4CTX774K.js → chunk-GJOY37U7.js} +4 -4
- package/dist/chunk-GJOY37U7.js.map +1 -0
- package/dist/{chunk-I7WC6E5S.js → chunk-HVBNCPAY.js} +2 -2
- package/dist/chunk-HVBNCPAY.js.map +1 -0
- package/dist/{chunk-2HMQOC7N.js → chunk-I3CGU5W7.js} +4 -4
- package/dist/chunk-I3CGU5W7.js.map +1 -0
- package/dist/{chunk-NVPG6JCL.js → chunk-L7YNNBI5.js} +3 -3
- package/dist/chunk-L7YNNBI5.js.map +1 -0
- package/dist/chunk-LGFWH3AE.js +26 -0
- package/dist/chunk-LGFWH3AE.js.map +1 -0
- package/dist/chunk-MLF4W5R6.js +101 -0
- package/dist/chunk-MLF4W5R6.js.map +1 -0
- package/dist/{chunk-KIRH7TUJ.js → chunk-MTSDOSXS.js} +3 -3
- package/dist/chunk-MTSDOSXS.js.map +1 -0
- package/dist/{chunk-J4SJTKIK.js → chunk-NAM4ERUW.js} +3 -3
- package/dist/chunk-NAM4ERUW.js.map +1 -0
- package/dist/{chunk-BN3X7UXB.js → chunk-NBFIBGAT.js} +39 -25
- package/dist/chunk-NBFIBGAT.js.map +1 -0
- package/dist/{chunk-BNLGTZ34.js → chunk-O5RG4YZY.js} +3 -3
- package/dist/chunk-O5RG4YZY.js.map +1 -0
- package/dist/{chunk-JHYXKVV2.js → chunk-ODUM3D6X.js} +2 -2
- package/dist/chunk-ODUM3D6X.js.map +1 -0
- package/dist/chunk-OYSAN7UX.js +15 -0
- package/dist/chunk-OYSAN7UX.js.map +1 -0
- package/dist/chunk-P4SNGQNI.js +158 -0
- package/dist/chunk-P4SNGQNI.js.map +1 -0
- package/dist/{chunk-2CJ46J3C.js → chunk-PPSMUECX.js} +3 -3
- package/dist/chunk-PPSMUECX.js.map +1 -0
- package/dist/chunk-Q6ZXJTZB.js +56 -0
- package/dist/chunk-Q6ZXJTZB.js.map +1 -0
- package/dist/{chunk-XANPHG7W.js → chunk-QSDZDHNS.js} +7 -7
- package/dist/chunk-QSDZDHNS.js.map +1 -0
- package/dist/{chunk-33RP6K2O.js → chunk-QVMEF6FB.js} +6 -6
- package/dist/chunk-QVMEF6FB.js.map +1 -0
- package/dist/chunk-QWP76EBW.js +536 -0
- package/dist/chunk-QWP76EBW.js.map +1 -0
- package/dist/{chunk-V5GZQEIY.js → chunk-RBYBSSGO.js} +4 -4
- package/dist/chunk-RBYBSSGO.js.map +1 -0
- package/dist/{chunk-H5P2C6H4.js → chunk-RKB2ZK6S.js} +628 -408
- package/dist/chunk-RKB2ZK6S.js.map +1 -0
- package/dist/{chunk-UKT3G5IA.js → chunk-SHTGQGAU.js} +7 -7
- package/dist/chunk-SHTGQGAU.js.map +1 -0
- package/dist/chunk-SNPYTMPR.js +51 -0
- package/dist/chunk-SNPYTMPR.js.map +1 -0
- package/dist/chunk-UB2QB6DE.js +124 -0
- package/dist/chunk-UB2QB6DE.js.map +1 -0
- package/dist/chunk-UNJUWWQO.js +1108 -0
- package/dist/chunk-UNJUWWQO.js.map +1 -0
- package/dist/chunk-V2M243KZ.js +445 -0
- package/dist/chunk-V2M243KZ.js.map +1 -0
- package/dist/chunk-V5JT5TPD.js +97 -0
- package/dist/chunk-V5JT5TPD.js.map +1 -0
- package/dist/chunk-W26AUH5B.js +61 -0
- package/dist/chunk-W26AUH5B.js.map +1 -0
- package/dist/chunk-WAAD23KY.js +222 -0
- package/dist/chunk-WAAD23KY.js.map +1 -0
- package/dist/chunk-WIIZNPCR.js +150 -0
- package/dist/chunk-WIIZNPCR.js.map +1 -0
- package/dist/chunk-WQCJTU2C.js +84 -0
- package/dist/chunk-WQCJTU2C.js.map +1 -0
- package/dist/chunk-WVLDNYOJ.js +150 -0
- package/dist/chunk-WVLDNYOJ.js.map +1 -0
- package/dist/chunk-WXVT3AOY.js +22 -0
- package/dist/chunk-WXVT3AOY.js.map +1 -0
- package/dist/{chunk-GAK6PIBW.js → chunk-XMMAGAT4.js} +2 -2
- package/dist/chunk-XMMAGAT4.js.map +1 -0
- package/dist/chunk-Y64XWMJ4.js +212 -0
- package/dist/chunk-Y64XWMJ4.js.map +1 -0
- package/dist/chunk-YEULD3SG.js +62 -0
- package/dist/chunk-YEULD3SG.js.map +1 -0
- package/dist/chunk-ZHGPZBS4.js +49 -0
- package/dist/chunk-ZHGPZBS4.js.map +1 -0
- package/dist/{chunk-JKBFUAJK.js → chunk-ZSLHHQPQ.js} +2 -2
- package/dist/chunk-ZSLHHQPQ.js.map +1 -0
- package/dist/cli.js +501 -150
- package/dist/cli.js.map +1 -1
- package/dist/{config-6S355X75.js → config-I4FMCJGZ.js} +3 -3
- package/dist/config-editor-HNEKXRLQ.js +11 -0
- package/dist/{config-registry-AHYI4MYL.js → config-registry-CUMNXFGK.js} +2 -2
- package/dist/context-XM6E22LM.js +10 -0
- package/dist/core-plugins-VEUNFTMB.js +27 -0
- package/dist/{daemon-4CS6HMB5.js → daemon-PXO5QPCR.js} +4 -4
- package/dist/dev-loader-RDC5E2CW.js +50 -0
- package/dist/dev-loader-RDC5E2CW.js.map +1 -0
- package/dist/discord-NOJQ5PZO.js +8 -0
- package/dist/doctor-H72BZOPA.js +10 -0
- package/dist/{doctor-OLYBO3V3.js → doctor-RF6BHMCC.js} +5 -5
- package/dist/file-service-EUODJAIT.js +9 -0
- package/dist/file-service-EUODJAIT.js.map +1 -0
- package/dist/index.d.ts +1293 -188
- package/dist/index.js +387 -48
- package/dist/index.js.map +1 -1
- package/dist/{install-cloudflared-Z7VCGOVG.js → install-cloudflared-AN24L4DP.js} +5 -5
- package/dist/install-cloudflared-AN24L4DP.js.map +1 -0
- package/dist/install-context-XPWTFT3J.js +78 -0
- package/dist/install-context-XPWTFT3J.js.map +1 -0
- package/dist/{install-jq-HUYSQWKR.js → install-jq-CRVDJGF3.js} +5 -5
- package/dist/install-jq-CRVDJGF3.js.map +1 -0
- package/dist/{integrate-PNEHRY2I.js → integrate-5C6KSU6D.js} +2 -2
- package/dist/integrate-5C6KSU6D.js.map +1 -0
- package/dist/{log-NXABYJTT.js → log-LZ7FTRKG.js} +2 -2
- package/dist/log-LZ7FTRKG.js.map +1 -0
- package/dist/main-T5WVCCFN.js +715 -0
- package/dist/main-T5WVCCFN.js.map +1 -0
- package/dist/{menu-YY5MKHEK.js → menu-YDQ2LWAR.js} +2 -2
- package/dist/menu-YDQ2LWAR.js.map +1 -0
- package/dist/{new-session-FEO4J4VU.js → new-session-AVQCNXRG.js} +5 -5
- package/dist/new-session-AVQCNXRG.js.map +1 -0
- package/dist/notifications-D5BRDNSU.js +9 -0
- package/dist/notifications-D5BRDNSU.js.map +1 -0
- package/dist/plugin-create-JVCVUG6V.js +331 -0
- package/dist/plugin-create-JVCVUG6V.js.map +1 -0
- package/dist/plugin-registry-WB3DR67H.js +8 -0
- package/dist/plugin-registry-WB3DR67H.js.map +1 -0
- package/dist/{post-upgrade-CJG5I7M2.js → post-upgrade-XLHZ6ZB7.js} +8 -8
- package/dist/post-upgrade-XLHZ6ZB7.js.map +1 -0
- package/dist/read-text-file-IRZM3QLM.js +8 -0
- package/dist/read-text-file-IRZM3QLM.js.map +1 -0
- package/dist/security-YNRBW6S7.js +9 -0
- package/dist/security-YNRBW6S7.js.map +1 -0
- package/dist/{session-IUSI7P5S.js → session-KZFA6Z26.js} +4 -4
- package/dist/session-KZFA6Z26.js.map +1 -0
- package/dist/{settings-RQPAM4KC.js → settings-MFYM7CZO.js} +4 -4
- package/dist/settings-MFYM7CZO.js.map +1 -0
- package/dist/settings-manager-MD2U4ZV2.js +8 -0
- package/dist/settings-manager-MD2U4ZV2.js.map +1 -0
- package/dist/setup-BAI2F24H.js +747 -0
- package/dist/setup-BAI2F24H.js.map +1 -0
- package/dist/slack-KH7E3VBS.js +8 -0
- package/dist/slack-KH7E3VBS.js.map +1 -0
- package/dist/speech-2GHQNRIO.js +9 -0
- package/dist/speech-2GHQNRIO.js.map +1 -0
- package/dist/telegram-ZDC3JQF2.js +8 -0
- package/dist/telegram-ZDC3JQF2.js.map +1 -0
- package/dist/tunnel-M47I7H4B.js +8 -0
- package/dist/tunnel-M47I7H4B.js.map +1 -0
- package/dist/{tunnel-service-CJLUH6SZ.js → tunnel-service-WADYHREX.js} +17 -17
- package/dist/tunnel-service-WADYHREX.js.map +1 -0
- package/dist/usage-WYNK6ZC5.js +10 -0
- package/dist/usage-WYNK6ZC5.js.map +1 -0
- package/dist/validators-6CLEZUBD.js +8 -0
- package/dist/validators-6CLEZUBD.js.map +1 -0
- package/dist/validators-WSTBNKRW.js +12 -0
- package/dist/validators-WSTBNKRW.js.map +1 -0
- package/package.json +1 -1
- package/dist/adapter-LNEGLMOE.js.map +0 -1
- package/dist/agent-catalog-FC3HGDEQ.js +0 -11
- package/dist/agent-registry-WT4NXPYG.js +0 -9
- package/dist/agent-store-VZLFPTZU.js +0 -9
- package/dist/chunk-2CJ46J3C.js.map +0 -1
- package/dist/chunk-2HMQOC7N.js.map +0 -1
- package/dist/chunk-33RP6K2O.js.map +0 -1
- package/dist/chunk-34M4OS5P.js.map +0 -1
- package/dist/chunk-4CTX774K.js.map +0 -1
- package/dist/chunk-7QJS2XBD.js.map +0 -1
- package/dist/chunk-BDYVCIBH.js +0 -735
- package/dist/chunk-BDYVCIBH.js.map +0 -1
- package/dist/chunk-BN3X7UXB.js.map +0 -1
- package/dist/chunk-BNLGTZ34.js.map +0 -1
- package/dist/chunk-GAK6PIBW.js.map +0 -1
- package/dist/chunk-H5P2C6H4.js.map +0 -1
- package/dist/chunk-I7WC6E5S.js.map +0 -1
- package/dist/chunk-J4SJTKIK.js.map +0 -1
- package/dist/chunk-JHYXKVV2.js.map +0 -1
- package/dist/chunk-JKBFUAJK.js.map +0 -1
- package/dist/chunk-JUYDFUSN.js.map +0 -1
- package/dist/chunk-KIRH7TUJ.js.map +0 -1
- package/dist/chunk-LBIKITQT.js +0 -22
- package/dist/chunk-LBIKITQT.js.map +0 -1
- package/dist/chunk-LGP2YGRL.js +0 -4880
- package/dist/chunk-LGP2YGRL.js.map +0 -1
- package/dist/chunk-NAMYZIS5.js +0 -1
- package/dist/chunk-NVPG6JCL.js.map +0 -1
- package/dist/chunk-O7CPGUAI.js.map +0 -1
- package/dist/chunk-UKT3G5IA.js.map +0 -1
- package/dist/chunk-V5GZQEIY.js.map +0 -1
- package/dist/chunk-VOIJ6OY4.js +0 -63
- package/dist/chunk-VOIJ6OY4.js.map +0 -1
- package/dist/chunk-W3EYKZNQ.js.map +0 -1
- package/dist/chunk-WTZDAYZX.js.map +0 -1
- package/dist/chunk-XANPHG7W.js.map +0 -1
- package/dist/config-editor-RVLWZLVB.js +0 -13
- package/dist/discord-7IVQKB2H.js.map +0 -1
- package/dist/doctor-HZZ5BSHB.js +0 -10
- package/dist/install-cloudflared-Z7VCGOVG.js.map +0 -1
- package/dist/install-jq-HUYSQWKR.js.map +0 -1
- package/dist/integrate-PNEHRY2I.js.map +0 -1
- package/dist/main-ZK4MPMBG.js +0 -238
- package/dist/main-ZK4MPMBG.js.map +0 -1
- package/dist/post-upgrade-CJG5I7M2.js.map +0 -1
- package/dist/setup-3GQSYBE4.js +0 -35
- package/dist/tunnel-service-CJLUH6SZ.js.map +0 -1
- /package/dist/{action-detect-P7ZE4NEM.js.map → action-detect-QPA775HB.js.map} +0 -0
- /package/dist/{admin-6SYB6XCZ.js.map → adapter-6ANPBSVU.js.map} +0 -0
- /package/dist/{agent-catalog-FC3HGDEQ.js.map → admin-GBPZFFAU.js.map} +0 -0
- /package/dist/{agent-dependencies-4OWBMZWZ.js.map → agent-catalog-YHBFERYO.js.map} +0 -0
- /package/dist/{agent-registry-WT4NXPYG.js.map → agent-dependencies-WS7Z2DFW.js.map} +0 -0
- /package/dist/{agent-store-VZLFPTZU.js.map → agent-registry-5LZT7CUB.js.map} +0 -0
- /package/dist/{agents-QO7DKARJ.js.map → agent-store-VSHNY5GT.js.map} +0 -0
- /package/dist/{api-client-CFQT5U7D.js.map → agents-BWU4MRRD.js.map} +0 -0
- /package/dist/{autostart-X33OGMX6.js.map → api-client-AQPNKXI2.js.map} +0 -0
- /package/dist/{chunk-NAMYZIS5.js.map → api-server-3PYLRBCN.js.map} +0 -0
- /package/dist/{config-6S355X75.js.map → api-server-CHVSUDBX.js.map} +0 -0
- /package/dist/{config-editor-RVLWZLVB.js.map → autostart-6JS565RY.js.map} +0 -0
- /package/dist/{config-registry-AHYI4MYL.js.map → chunk-FNRSWA2K.js.map} +0 -0
- /package/dist/{daemon-4CS6HMB5.js.map → config-I4FMCJGZ.js.map} +0 -0
- /package/dist/{doctor-HZZ5BSHB.js.map → config-editor-HNEKXRLQ.js.map} +0 -0
- /package/dist/{doctor-OLYBO3V3.js.map → config-registry-CUMNXFGK.js.map} +0 -0
- /package/dist/{log-NXABYJTT.js.map → context-XM6E22LM.js.map} +0 -0
- /package/dist/{menu-YY5MKHEK.js.map → core-plugins-VEUNFTMB.js.map} +0 -0
- /package/dist/{new-session-FEO4J4VU.js.map → daemon-PXO5QPCR.js.map} +0 -0
- /package/dist/{session-IUSI7P5S.js.map → discord-NOJQ5PZO.js.map} +0 -0
- /package/dist/{settings-RQPAM4KC.js.map → doctor-H72BZOPA.js.map} +0 -0
- /package/dist/{setup-3GQSYBE4.js.map → doctor-RF6BHMCC.js.map} +0 -0
|
@@ -0,0 +1,747 @@
|
|
|
1
|
+
import {
|
|
2
|
+
validateDiscordToken
|
|
3
|
+
} from "./chunk-6RXVEXF3.js";
|
|
4
|
+
import {
|
|
5
|
+
validateBotAdmin,
|
|
6
|
+
validateBotToken,
|
|
7
|
+
validateChatId
|
|
8
|
+
} from "./chunk-WQCJTU2C.js";
|
|
9
|
+
import {
|
|
10
|
+
commandExists
|
|
11
|
+
} from "./chunk-ZSLHHQPQ.js";
|
|
12
|
+
import {
|
|
13
|
+
expandHome
|
|
14
|
+
} from "./chunk-QVMEF6FB.js";
|
|
15
|
+
import "./chunk-XMMAGAT4.js";
|
|
16
|
+
import "./chunk-VUNV25KB.js";
|
|
17
|
+
|
|
18
|
+
// src/core/setup/wizard.ts
|
|
19
|
+
import * as clack7 from "@clack/prompts";
|
|
20
|
+
|
|
21
|
+
// src/core/setup/types.ts
|
|
22
|
+
var ONBOARD_SECTION_OPTIONS = [
|
|
23
|
+
{ value: "channels", label: "Channels", hint: "Link/update messaging platforms" },
|
|
24
|
+
{ value: "agents", label: "Agents", hint: "Install agents, change default" },
|
|
25
|
+
{ value: "workspace", label: "Workspace", hint: "Set workspace directory" },
|
|
26
|
+
{ value: "runMode", label: "Run mode", hint: "Foreground/daemon, auto-start" },
|
|
27
|
+
{ value: "integrations", label: "Integrations", hint: "Claude CLI session transfer" }
|
|
28
|
+
];
|
|
29
|
+
var CHANNEL_META = {
|
|
30
|
+
telegram: { label: "Telegram", method: "Bot API" },
|
|
31
|
+
discord: { label: "Discord", method: "Bot API" }
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// src/core/setup/helpers.ts
|
|
35
|
+
import * as clack from "@clack/prompts";
|
|
36
|
+
var c = {
|
|
37
|
+
reset: "\x1B[0m",
|
|
38
|
+
bold: "\x1B[1m",
|
|
39
|
+
dim: "\x1B[2m",
|
|
40
|
+
green: "\x1B[32m",
|
|
41
|
+
yellow: "\x1B[33m",
|
|
42
|
+
red: "\x1B[31m",
|
|
43
|
+
cyan: "\x1B[36m",
|
|
44
|
+
white: "\x1B[37m"
|
|
45
|
+
};
|
|
46
|
+
var ok = (msg) => `${c.green}${c.bold}\u2713${c.reset} ${c.green}${msg}${c.reset}`;
|
|
47
|
+
var warn = (msg) => `${c.yellow}\u26A0 ${msg}${c.reset}`;
|
|
48
|
+
var fail = (msg) => `${c.red}\u2717 ${msg}${c.reset}`;
|
|
49
|
+
var step = (n, total, title) => `
|
|
50
|
+
${c.cyan}${c.bold}[${n}/${total}]${c.reset} ${c.bold}${title}${c.reset}
|
|
51
|
+
`;
|
|
52
|
+
var dim = (msg) => `${c.dim}${msg}${c.reset}`;
|
|
53
|
+
function guardCancel(value) {
|
|
54
|
+
if (clack.isCancel(value)) {
|
|
55
|
+
clack.cancel("Setup cancelled.");
|
|
56
|
+
process.exit(0);
|
|
57
|
+
}
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
function applyGradient(text2) {
|
|
61
|
+
const colors = [135, 99, 63, 33, 39, 44, 44];
|
|
62
|
+
const lines = text2.split("\n");
|
|
63
|
+
return lines.map((line, i) => {
|
|
64
|
+
const colorIdx = Math.min(i, colors.length - 1);
|
|
65
|
+
return `\x1B[38;5;${colors[colorIdx]}m${line}\x1B[0m`;
|
|
66
|
+
}).join("\n");
|
|
67
|
+
}
|
|
68
|
+
var BANNER = `
|
|
69
|
+
\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557
|
|
70
|
+
\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557
|
|
71
|
+
\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D
|
|
72
|
+
\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u255D
|
|
73
|
+
\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551
|
|
74
|
+
\u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D
|
|
75
|
+
`;
|
|
76
|
+
async function printStartBanner() {
|
|
77
|
+
let version = "0.0.0";
|
|
78
|
+
try {
|
|
79
|
+
const { getCurrentVersion } = await import("./version-NQZBM5M7.js");
|
|
80
|
+
version = getCurrentVersion();
|
|
81
|
+
} catch {
|
|
82
|
+
}
|
|
83
|
+
console.log(applyGradient(BANNER));
|
|
84
|
+
console.log(`${c.dim} AI coding agents, anywhere. v${version}${c.reset}
|
|
85
|
+
`);
|
|
86
|
+
}
|
|
87
|
+
function summarizeConfig(config) {
|
|
88
|
+
const lines = [];
|
|
89
|
+
const channelStatuses = [];
|
|
90
|
+
for (const [id, meta] of Object.entries({
|
|
91
|
+
telegram: "Telegram",
|
|
92
|
+
discord: "Discord"
|
|
93
|
+
})) {
|
|
94
|
+
const ch = config.channels[id];
|
|
95
|
+
if (ch?.enabled) {
|
|
96
|
+
channelStatuses.push(`${meta} (enabled)`);
|
|
97
|
+
} else if (ch && Object.keys(ch).length > 1) {
|
|
98
|
+
channelStatuses.push(`${meta} (disabled)`);
|
|
99
|
+
} else {
|
|
100
|
+
channelStatuses.push(`${meta} (not configured)`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
lines.push(`Channels: ${channelStatuses.join(", ")}`);
|
|
104
|
+
lines.push(`Default agent: ${config.defaultAgent}`);
|
|
105
|
+
lines.push(`Workspace: ${config.workspace.baseDir}`);
|
|
106
|
+
lines.push(`Run mode: ${config.runMode}${config.autoStart ? " (auto-start)" : ""}`);
|
|
107
|
+
return lines.join("\n");
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// src/core/setup/setup-agents.ts
|
|
111
|
+
import { execFileSync } from "child_process";
|
|
112
|
+
import * as clack2 from "@clack/prompts";
|
|
113
|
+
var KNOWN_AGENTS = [
|
|
114
|
+
// claude-agent-acp is bundled as a dependency — no detection needed, but
|
|
115
|
+
// kept here so detectAgents() still returns it for display purposes.
|
|
116
|
+
{ name: "claude", commands: ["claude-agent-acp"] },
|
|
117
|
+
{ name: "codex", commands: ["codex"] }
|
|
118
|
+
];
|
|
119
|
+
async function detectAgents() {
|
|
120
|
+
const found = [];
|
|
121
|
+
for (const agent of KNOWN_AGENTS) {
|
|
122
|
+
const available = [];
|
|
123
|
+
for (const cmd of agent.commands) {
|
|
124
|
+
if (commandExists(cmd)) {
|
|
125
|
+
available.push(cmd);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (available.length > 0) {
|
|
129
|
+
found.push({ name: agent.name, command: available[0] });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return found;
|
|
133
|
+
}
|
|
134
|
+
async function validateAgentCommand(command) {
|
|
135
|
+
try {
|
|
136
|
+
execFileSync("which", [command], { stdio: "pipe" });
|
|
137
|
+
return true;
|
|
138
|
+
} catch {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async function setupAgents() {
|
|
143
|
+
const { AgentCatalog } = await import("./agent-catalog-YHBFERYO.js");
|
|
144
|
+
const { muteLogger, unmuteLogger } = await import("./log-LZ7FTRKG.js");
|
|
145
|
+
muteLogger();
|
|
146
|
+
const catalog = new AgentCatalog();
|
|
147
|
+
catalog.load();
|
|
148
|
+
const s = clack2.spinner();
|
|
149
|
+
s.start("Checking available agents...");
|
|
150
|
+
await catalog.refreshRegistryIfStale();
|
|
151
|
+
if (!catalog.getInstalledAgent("claude")) {
|
|
152
|
+
const claudeRegistry = catalog.findRegistryAgent("claude-acp");
|
|
153
|
+
if (claudeRegistry) {
|
|
154
|
+
await catalog.install("claude-acp");
|
|
155
|
+
} else {
|
|
156
|
+
const { AgentStore } = await import("./agent-store-VSHNY5GT.js");
|
|
157
|
+
const store = new AgentStore();
|
|
158
|
+
store.load();
|
|
159
|
+
store.addAgent("claude", {
|
|
160
|
+
registryId: "claude-acp",
|
|
161
|
+
name: "Claude Agent",
|
|
162
|
+
version: "bundled",
|
|
163
|
+
distribution: "npx",
|
|
164
|
+
command: "npx",
|
|
165
|
+
args: ["@zed-industries/claude-agent-acp"],
|
|
166
|
+
env: {},
|
|
167
|
+
installedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
168
|
+
binaryPath: null
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
s.stop(ok("Claude Agent ready"));
|
|
173
|
+
unmuteLogger();
|
|
174
|
+
const available = catalog.getAvailable();
|
|
175
|
+
const installed = available.filter((a) => a.installed);
|
|
176
|
+
const installable = available.filter((a) => !a.installed && a.available);
|
|
177
|
+
if (installed.length > 0 || installable.length > 0) {
|
|
178
|
+
const seen = /* @__PURE__ */ new Set();
|
|
179
|
+
const options = [];
|
|
180
|
+
for (const a of installed) {
|
|
181
|
+
const dedupeKey = `${a.key}::${a.name}`;
|
|
182
|
+
if (seen.has(dedupeKey)) continue;
|
|
183
|
+
seen.add(dedupeKey);
|
|
184
|
+
options.push({
|
|
185
|
+
label: `${a.name} (installed)`,
|
|
186
|
+
value: a.key
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
for (const a of installable) {
|
|
190
|
+
const dedupeKey = `${a.key}::${a.name}`;
|
|
191
|
+
if (seen.has(dedupeKey)) continue;
|
|
192
|
+
seen.add(dedupeKey);
|
|
193
|
+
options.push({
|
|
194
|
+
label: `${a.name} (${a.distribution})`,
|
|
195
|
+
value: a.key
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
const installedKeys = installed.map((a) => a.key);
|
|
199
|
+
const selected = guardCancel(
|
|
200
|
+
await clack2.autocompleteMultiselect({
|
|
201
|
+
message: "Install additional agents? (type to search, Space to select)",
|
|
202
|
+
options,
|
|
203
|
+
initialValues: installedKeys,
|
|
204
|
+
required: false
|
|
205
|
+
})
|
|
206
|
+
);
|
|
207
|
+
for (const key of selected) {
|
|
208
|
+
const regAgent = catalog.findRegistryAgent(key);
|
|
209
|
+
if (regAgent) {
|
|
210
|
+
const installSpinner = clack2.spinner();
|
|
211
|
+
installSpinner.start(`Installing ${regAgent.name}...`);
|
|
212
|
+
muteLogger();
|
|
213
|
+
const result = await catalog.install(key);
|
|
214
|
+
unmuteLogger();
|
|
215
|
+
if (result.ok) {
|
|
216
|
+
installSpinner.stop(ok("done"));
|
|
217
|
+
} else {
|
|
218
|
+
installSpinner.stop(warn(`skipped: ${result.error}`));
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const installedAgents = Object.keys(catalog.getInstalledEntries());
|
|
224
|
+
let defaultAgent = "claude";
|
|
225
|
+
if (installedAgents.length > 1) {
|
|
226
|
+
defaultAgent = guardCancel(
|
|
227
|
+
await clack2.select({
|
|
228
|
+
message: "Which agent should be the default?",
|
|
229
|
+
options: installedAgents.map((key) => {
|
|
230
|
+
const agent = catalog.getInstalledAgent(key);
|
|
231
|
+
return { label: `${agent.name} (${key})`, value: key };
|
|
232
|
+
}),
|
|
233
|
+
initialValue: "claude"
|
|
234
|
+
})
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
console.log(ok(`Default agent: ${c.bold}${defaultAgent}${c.reset}`));
|
|
238
|
+
return { defaultAgent };
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// src/core/setup/setup-workspace.ts
|
|
242
|
+
import * as clack3 from "@clack/prompts";
|
|
243
|
+
async function setupWorkspace(opts) {
|
|
244
|
+
const { existing, stepNum, totalSteps } = opts ?? {};
|
|
245
|
+
if (stepNum != null && totalSteps != null) {
|
|
246
|
+
console.log(step(stepNum, totalSteps, "Workspace"));
|
|
247
|
+
}
|
|
248
|
+
const baseDir = guardCancel(
|
|
249
|
+
await clack3.text({
|
|
250
|
+
message: "Base directory for workspaces:",
|
|
251
|
+
initialValue: existing ?? "~/openacp-workspace",
|
|
252
|
+
validate: (val) => (val ?? "").toString().trim().length > 0 ? void 0 : "Path cannot be empty"
|
|
253
|
+
})
|
|
254
|
+
);
|
|
255
|
+
return { baseDir: baseDir.trim().replace(/^['"]|['"]$/g, "") };
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// src/core/setup/setup-run-mode.ts
|
|
259
|
+
import * as clack4 from "@clack/prompts";
|
|
260
|
+
async function setupRunMode(opts) {
|
|
261
|
+
const { existing, stepNum, totalSteps } = opts ?? {};
|
|
262
|
+
if (stepNum != null && totalSteps != null) {
|
|
263
|
+
console.log(step(stepNum, totalSteps, "Run Mode"));
|
|
264
|
+
}
|
|
265
|
+
if (process.platform === "win32") {
|
|
266
|
+
console.log(dim(" (Daemon mode not available on Windows)"));
|
|
267
|
+
return { runMode: "foreground", autoStart: false };
|
|
268
|
+
}
|
|
269
|
+
const initialValue = existing?.runMode === "daemon" ? "daemon" : "foreground";
|
|
270
|
+
const mode = guardCancel(
|
|
271
|
+
await clack4.select({
|
|
272
|
+
message: "How would you like to run OpenACP?",
|
|
273
|
+
options: [
|
|
274
|
+
{
|
|
275
|
+
label: "Background (daemon)",
|
|
276
|
+
value: "daemon",
|
|
277
|
+
hint: "Runs silently, auto-starts on boot. Manage with: openacp status | stop | logs"
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
label: "Foreground (terminal)",
|
|
281
|
+
value: "foreground",
|
|
282
|
+
hint: "Runs in current terminal session. Start with: openacp"
|
|
283
|
+
}
|
|
284
|
+
],
|
|
285
|
+
initialValue
|
|
286
|
+
})
|
|
287
|
+
);
|
|
288
|
+
const wasDaemon = existing?.runMode === "daemon";
|
|
289
|
+
if (mode === "daemon") {
|
|
290
|
+
const { installAutoStart, isAutoStartSupported } = await import("./autostart-6JS565RY.js");
|
|
291
|
+
const { muteLogger, unmuteLogger } = await import("./log-LZ7FTRKG.js");
|
|
292
|
+
const autoStart = isAutoStartSupported();
|
|
293
|
+
if (autoStart) {
|
|
294
|
+
muteLogger();
|
|
295
|
+
const result = installAutoStart(expandHome("~/.openacp/logs"));
|
|
296
|
+
unmuteLogger();
|
|
297
|
+
if (result.success) {
|
|
298
|
+
console.log(ok("Auto-start on boot enabled"));
|
|
299
|
+
} else {
|
|
300
|
+
console.log(warn(`Auto-start failed: ${result.error}`));
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return { runMode: "daemon", autoStart };
|
|
304
|
+
}
|
|
305
|
+
if (wasDaemon) {
|
|
306
|
+
const { muteLogger, unmuteLogger } = await import("./log-LZ7FTRKG.js");
|
|
307
|
+
muteLogger();
|
|
308
|
+
try {
|
|
309
|
+
const { stopDaemon } = await import("./daemon-PXO5QPCR.js");
|
|
310
|
+
const result = await stopDaemon();
|
|
311
|
+
unmuteLogger();
|
|
312
|
+
if (result.stopped) {
|
|
313
|
+
console.log(ok(`Daemon stopped (was PID ${result.pid})`));
|
|
314
|
+
}
|
|
315
|
+
} catch {
|
|
316
|
+
unmuteLogger();
|
|
317
|
+
}
|
|
318
|
+
muteLogger();
|
|
319
|
+
try {
|
|
320
|
+
const { uninstallAutoStart } = await import("./autostart-6JS565RY.js");
|
|
321
|
+
uninstallAutoStart();
|
|
322
|
+
unmuteLogger();
|
|
323
|
+
} catch {
|
|
324
|
+
unmuteLogger();
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return { runMode: "foreground", autoStart: false };
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// src/core/setup/setup-integrations.ts
|
|
331
|
+
import * as clack5 from "@clack/prompts";
|
|
332
|
+
async function setupIntegrations(config) {
|
|
333
|
+
const claudeIntegration = config?.integrations?.claude;
|
|
334
|
+
const isInstalled = claudeIntegration?.installed === true;
|
|
335
|
+
const installClaude = guardCancel(
|
|
336
|
+
await clack5.confirm({
|
|
337
|
+
message: isInstalled ? "Claude CLI integration is installed. Reinstall?" : "Install session transfer for Claude? (enables /openacp:handoff in your terminal)",
|
|
338
|
+
initialValue: !isInstalled
|
|
339
|
+
})
|
|
340
|
+
);
|
|
341
|
+
if (installClaude) {
|
|
342
|
+
try {
|
|
343
|
+
const { getIntegration } = await import("./integrate-5C6KSU6D.js");
|
|
344
|
+
const integration = getIntegration("claude");
|
|
345
|
+
if (integration) {
|
|
346
|
+
for (const item of integration.items) {
|
|
347
|
+
const result = await item.install();
|
|
348
|
+
for (const log of result.logs) console.log(` ${log}`);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
console.log("Claude CLI integration installed.\n");
|
|
352
|
+
} catch (err) {
|
|
353
|
+
console.log(`Could not install Claude CLI integration: ${err instanceof Error ? err.message : err}`);
|
|
354
|
+
console.log(" You can install it later with: openacp integrate claude\n");
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// src/core/setup/setup-channels.ts
|
|
360
|
+
import * as os from "os";
|
|
361
|
+
import * as path from "path";
|
|
362
|
+
import * as clack6 from "@clack/prompts";
|
|
363
|
+
function getChannelStatuses(config) {
|
|
364
|
+
const statuses = [];
|
|
365
|
+
for (const [id, meta] of Object.entries(CHANNEL_META)) {
|
|
366
|
+
const ch = config.channels[id];
|
|
367
|
+
const enabled = ch?.enabled === true;
|
|
368
|
+
const configured = !!ch && Object.keys(ch).length > 1;
|
|
369
|
+
let hint;
|
|
370
|
+
if (id === "telegram" && ch?.botToken && typeof ch.botToken === "string" && ch.botToken !== "YOUR_BOT_TOKEN_HERE") {
|
|
371
|
+
hint = `Chat ID: ${ch.chatId}`;
|
|
372
|
+
}
|
|
373
|
+
if (id === "discord" && ch?.guildId) {
|
|
374
|
+
hint = `Guild: ${ch.guildId}`;
|
|
375
|
+
}
|
|
376
|
+
statuses.push({ id, label: meta.label, configured, enabled, hint });
|
|
377
|
+
}
|
|
378
|
+
return statuses;
|
|
379
|
+
}
|
|
380
|
+
function noteChannelStatus(config) {
|
|
381
|
+
const statuses = getChannelStatuses(config);
|
|
382
|
+
const lines = statuses.map((s) => {
|
|
383
|
+
const status = s.enabled ? "enabled" : s.configured ? "disabled" : "not configured";
|
|
384
|
+
const hintStr = s.hint ? ` \u2014 ${s.hint}` : "";
|
|
385
|
+
return ` ${s.label}: ${status}${hintStr}`;
|
|
386
|
+
});
|
|
387
|
+
console.log("");
|
|
388
|
+
console.log(`${c.bold} Channel status${c.reset}`);
|
|
389
|
+
for (const line of lines) console.log(line);
|
|
390
|
+
console.log("");
|
|
391
|
+
}
|
|
392
|
+
async function promptConfiguredAction(label) {
|
|
393
|
+
return guardCancel(
|
|
394
|
+
await clack6.select({
|
|
395
|
+
message: `${label} already configured. What do you want to do?`,
|
|
396
|
+
options: [
|
|
397
|
+
{ value: "modify", label: "Modify settings" },
|
|
398
|
+
{ value: "disable", label: "Disable bot" },
|
|
399
|
+
{ value: "delete", label: "Delete config" },
|
|
400
|
+
{ value: "skip", label: "Skip (leave as-is)" }
|
|
401
|
+
],
|
|
402
|
+
initialValue: "modify"
|
|
403
|
+
})
|
|
404
|
+
);
|
|
405
|
+
}
|
|
406
|
+
async function configureViaPlugin(channelId) {
|
|
407
|
+
const pluginMap = {
|
|
408
|
+
telegram: { importPath: "../../plugins/telegram/index.js", name: "@openacp/telegram" },
|
|
409
|
+
discord: { importPath: "../../plugins/discord/index.js", name: "@openacp/discord" }
|
|
410
|
+
};
|
|
411
|
+
const pluginInfo = pluginMap[channelId];
|
|
412
|
+
if (!pluginInfo) return;
|
|
413
|
+
const { SettingsManager } = await import("./settings-manager-MD2U4ZV2.js");
|
|
414
|
+
const { createInstallContext } = await import("./install-context-XPWTFT3J.js");
|
|
415
|
+
const basePath = path.join(os.homedir(), ".openacp", "plugins");
|
|
416
|
+
const settingsManager = new SettingsManager(basePath);
|
|
417
|
+
const pluginModule = await import(pluginInfo.importPath);
|
|
418
|
+
const plugin = pluginModule.default;
|
|
419
|
+
if (plugin?.configure) {
|
|
420
|
+
const ctx = createInstallContext({
|
|
421
|
+
pluginName: plugin.name,
|
|
422
|
+
settingsManager,
|
|
423
|
+
basePath
|
|
424
|
+
});
|
|
425
|
+
await plugin.configure(ctx);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
async function configureChannels(config) {
|
|
429
|
+
const next = structuredClone(config);
|
|
430
|
+
let changed = false;
|
|
431
|
+
noteChannelStatus(next);
|
|
432
|
+
while (true) {
|
|
433
|
+
const statuses = getChannelStatuses(next);
|
|
434
|
+
const options = statuses.map((s) => {
|
|
435
|
+
const status = s.enabled ? "enabled" : s.configured ? "disabled" : "not configured";
|
|
436
|
+
return {
|
|
437
|
+
value: s.id,
|
|
438
|
+
label: `${s.label} (${CHANNEL_META[s.id].method})`,
|
|
439
|
+
hint: status + (s.hint ? ` \xB7 ${s.hint}` : "")
|
|
440
|
+
};
|
|
441
|
+
});
|
|
442
|
+
const choice = guardCancel(
|
|
443
|
+
await clack6.select({
|
|
444
|
+
message: "Select a channel",
|
|
445
|
+
options: [
|
|
446
|
+
...options,
|
|
447
|
+
{ value: "__done__", label: "Finished" }
|
|
448
|
+
]
|
|
449
|
+
})
|
|
450
|
+
);
|
|
451
|
+
if (choice === "__done__") break;
|
|
452
|
+
const channelId = choice;
|
|
453
|
+
const meta = CHANNEL_META[channelId];
|
|
454
|
+
const existing = next.channels[channelId];
|
|
455
|
+
const isConfigured = !!existing && Object.keys(existing).length > 1;
|
|
456
|
+
if (isConfigured) {
|
|
457
|
+
const action = await promptConfiguredAction(meta.label);
|
|
458
|
+
if (action === "skip") continue;
|
|
459
|
+
if (action === "disable") {
|
|
460
|
+
next.channels[channelId].enabled = false;
|
|
461
|
+
changed = true;
|
|
462
|
+
console.log(ok(`${meta.label} disabled`));
|
|
463
|
+
continue;
|
|
464
|
+
}
|
|
465
|
+
if (action === "delete") {
|
|
466
|
+
const confirmed = guardCancel(
|
|
467
|
+
await clack6.confirm({
|
|
468
|
+
message: `Delete ${meta.label} config? This cannot be undone.`,
|
|
469
|
+
initialValue: false
|
|
470
|
+
})
|
|
471
|
+
);
|
|
472
|
+
if (confirmed) {
|
|
473
|
+
delete next.channels[channelId];
|
|
474
|
+
changed = true;
|
|
475
|
+
console.log(ok(`${meta.label} config deleted`));
|
|
476
|
+
}
|
|
477
|
+
continue;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
await configureViaPlugin(channelId);
|
|
481
|
+
changed = true;
|
|
482
|
+
}
|
|
483
|
+
return { config: next, changed };
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
// src/core/setup/wizard.ts
|
|
487
|
+
async function runSetup(configManager, opts) {
|
|
488
|
+
await printStartBanner();
|
|
489
|
+
clack7.intro("Let's set up OpenACP");
|
|
490
|
+
const { settingsManager, pluginRegistry } = opts ?? {};
|
|
491
|
+
try {
|
|
492
|
+
const channelChoice = guardCancel(
|
|
493
|
+
await clack7.select({
|
|
494
|
+
message: "Which messaging platform do you want to use?",
|
|
495
|
+
options: [
|
|
496
|
+
{ label: "Telegram", value: "telegram" },
|
|
497
|
+
{ label: "Discord", value: "discord" },
|
|
498
|
+
{ label: "Both", value: "both" }
|
|
499
|
+
]
|
|
500
|
+
})
|
|
501
|
+
);
|
|
502
|
+
const channelSteps = channelChoice === "both" ? 2 : 1;
|
|
503
|
+
const runModeSteps = opts?.skipRunMode ? 0 : 1;
|
|
504
|
+
const totalSteps = channelSteps + 1 + runModeSteps;
|
|
505
|
+
let currentStep = 0;
|
|
506
|
+
if (channelChoice === "telegram" || channelChoice === "both") {
|
|
507
|
+
currentStep++;
|
|
508
|
+
if (settingsManager && pluginRegistry) {
|
|
509
|
+
const { createInstallContext } = await import("./install-context-XPWTFT3J.js");
|
|
510
|
+
const telegramPlugin = (await import("./telegram-ZDC3JQF2.js")).default;
|
|
511
|
+
const ctx = createInstallContext({
|
|
512
|
+
pluginName: telegramPlugin.name,
|
|
513
|
+
settingsManager,
|
|
514
|
+
basePath: settingsManager.getBasePath()
|
|
515
|
+
});
|
|
516
|
+
await telegramPlugin.install(ctx);
|
|
517
|
+
pluginRegistry.register(telegramPlugin.name, {
|
|
518
|
+
version: telegramPlugin.version,
|
|
519
|
+
source: "builtin",
|
|
520
|
+
enabled: true,
|
|
521
|
+
settingsPath: settingsManager.getSettingsPath(telegramPlugin.name),
|
|
522
|
+
description: telegramPlugin.description
|
|
523
|
+
});
|
|
524
|
+
} else {
|
|
525
|
+
console.log(fail("Plugin system not initialized. Cannot set up Telegram."));
|
|
526
|
+
return false;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
if (channelChoice === "discord" || channelChoice === "both") {
|
|
530
|
+
currentStep++;
|
|
531
|
+
if (settingsManager && pluginRegistry) {
|
|
532
|
+
const { createInstallContext } = await import("./install-context-XPWTFT3J.js");
|
|
533
|
+
const discordPlugin = (await import("./discord-NOJQ5PZO.js")).default;
|
|
534
|
+
const ctx = createInstallContext({
|
|
535
|
+
pluginName: discordPlugin.name,
|
|
536
|
+
settingsManager,
|
|
537
|
+
basePath: settingsManager.getBasePath()
|
|
538
|
+
});
|
|
539
|
+
await discordPlugin.install(ctx);
|
|
540
|
+
pluginRegistry.register(discordPlugin.name, {
|
|
541
|
+
version: discordPlugin.version,
|
|
542
|
+
source: "builtin",
|
|
543
|
+
enabled: true,
|
|
544
|
+
settingsPath: settingsManager.getSettingsPath(discordPlugin.name),
|
|
545
|
+
description: discordPlugin.description
|
|
546
|
+
});
|
|
547
|
+
} else {
|
|
548
|
+
console.log(fail("Plugin system not initialized. Cannot set up Discord."));
|
|
549
|
+
return false;
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
const { defaultAgent } = await setupAgents();
|
|
553
|
+
await setupIntegrations();
|
|
554
|
+
currentStep++;
|
|
555
|
+
const workspace = await setupWorkspace({ stepNum: currentStep, totalSteps });
|
|
556
|
+
let runMode = "foreground";
|
|
557
|
+
let autoStart = false;
|
|
558
|
+
if (!opts?.skipRunMode) {
|
|
559
|
+
currentStep++;
|
|
560
|
+
const result = await setupRunMode({ stepNum: currentStep, totalSteps });
|
|
561
|
+
runMode = result.runMode;
|
|
562
|
+
autoStart = result.autoStart;
|
|
563
|
+
}
|
|
564
|
+
const security = {
|
|
565
|
+
allowedUserIds: [],
|
|
566
|
+
maxConcurrentSessions: 20,
|
|
567
|
+
sessionTimeoutMinutes: 60
|
|
568
|
+
};
|
|
569
|
+
const config = {
|
|
570
|
+
channels: {},
|
|
571
|
+
agents: {},
|
|
572
|
+
defaultAgent,
|
|
573
|
+
workspace,
|
|
574
|
+
security,
|
|
575
|
+
logging: {
|
|
576
|
+
level: "info",
|
|
577
|
+
logDir: "~/.openacp/logs",
|
|
578
|
+
maxFileSize: "10m",
|
|
579
|
+
maxFiles: 7,
|
|
580
|
+
sessionLogRetentionDays: 30
|
|
581
|
+
},
|
|
582
|
+
runMode,
|
|
583
|
+
autoStart,
|
|
584
|
+
api: {
|
|
585
|
+
port: 21420,
|
|
586
|
+
host: "127.0.0.1"
|
|
587
|
+
},
|
|
588
|
+
sessionStore: { ttlDays: 30 },
|
|
589
|
+
tunnel: {
|
|
590
|
+
enabled: true,
|
|
591
|
+
port: 3100,
|
|
592
|
+
provider: "cloudflare",
|
|
593
|
+
options: {},
|
|
594
|
+
maxUserTunnels: 5,
|
|
595
|
+
storeTtlMinutes: 60,
|
|
596
|
+
auth: { enabled: false }
|
|
597
|
+
},
|
|
598
|
+
usage: {
|
|
599
|
+
enabled: true,
|
|
600
|
+
warningThreshold: 0.8,
|
|
601
|
+
currency: "USD",
|
|
602
|
+
retentionDays: 90
|
|
603
|
+
},
|
|
604
|
+
integrations: {},
|
|
605
|
+
speech: {
|
|
606
|
+
stt: { provider: null, providers: {} },
|
|
607
|
+
tts: { provider: null, providers: {} }
|
|
608
|
+
}
|
|
609
|
+
};
|
|
610
|
+
try {
|
|
611
|
+
await configManager.writeNew(config);
|
|
612
|
+
} catch (writeErr) {
|
|
613
|
+
console.log(
|
|
614
|
+
fail(`Could not save config: ${writeErr.message}`)
|
|
615
|
+
);
|
|
616
|
+
return false;
|
|
617
|
+
}
|
|
618
|
+
if (settingsManager && pluginRegistry) {
|
|
619
|
+
await registerBuiltinPlugins(settingsManager, pluginRegistry);
|
|
620
|
+
await pluginRegistry.save();
|
|
621
|
+
}
|
|
622
|
+
clack7.outro(`Config saved to ${configManager.getConfigPath()}`);
|
|
623
|
+
if (!opts?.skipRunMode) {
|
|
624
|
+
console.log(ok("Starting OpenACP..."));
|
|
625
|
+
console.log("");
|
|
626
|
+
}
|
|
627
|
+
return true;
|
|
628
|
+
} catch (err) {
|
|
629
|
+
if (err.name === "ExitPromptError") {
|
|
630
|
+
clack7.cancel("Setup cancelled.");
|
|
631
|
+
return false;
|
|
632
|
+
}
|
|
633
|
+
throw err;
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
async function registerBuiltinPlugins(settingsManager, pluginRegistry) {
|
|
637
|
+
const builtinPlugins = [
|
|
638
|
+
{ name: "@openacp/security", version: "1.0.0", description: "User access control and session limits" },
|
|
639
|
+
{ name: "@openacp/file-service", version: "1.0.0", description: "File storage and management" },
|
|
640
|
+
{ name: "@openacp/context", version: "1.0.0", description: "Conversation context management" },
|
|
641
|
+
{ name: "@openacp/usage", version: "1.0.0", description: "Token usage tracking and budget enforcement" },
|
|
642
|
+
{ name: "@openacp/speech", version: "1.0.0", description: "Text-to-speech and speech-to-text" },
|
|
643
|
+
{ name: "@openacp/notifications", version: "1.0.0", description: "Cross-session notification routing" },
|
|
644
|
+
{ name: "@openacp/tunnel", version: "1.0.0", description: "Expose local services via tunnel" },
|
|
645
|
+
{ name: "@openacp/api-server", version: "1.0.0", description: "REST API + SSE streaming server" }
|
|
646
|
+
];
|
|
647
|
+
for (const p of builtinPlugins) {
|
|
648
|
+
if (!pluginRegistry.get(p.name)) {
|
|
649
|
+
pluginRegistry.register(p.name, {
|
|
650
|
+
version: p.version,
|
|
651
|
+
source: "builtin",
|
|
652
|
+
enabled: true,
|
|
653
|
+
settingsPath: settingsManager.getSettingsPath(p.name),
|
|
654
|
+
description: p.description
|
|
655
|
+
});
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
async function selectSection(hasSelection) {
|
|
660
|
+
return guardCancel(
|
|
661
|
+
await clack7.select({
|
|
662
|
+
message: "Select sections to configure",
|
|
663
|
+
options: [
|
|
664
|
+
...ONBOARD_SECTION_OPTIONS,
|
|
665
|
+
{
|
|
666
|
+
value: "__continue",
|
|
667
|
+
label: "Continue",
|
|
668
|
+
hint: hasSelection ? "Done" : "Skip for now"
|
|
669
|
+
}
|
|
670
|
+
],
|
|
671
|
+
initialValue: ONBOARD_SECTION_OPTIONS[0].value
|
|
672
|
+
})
|
|
673
|
+
);
|
|
674
|
+
}
|
|
675
|
+
async function runReconfigure(configManager) {
|
|
676
|
+
await printStartBanner();
|
|
677
|
+
clack7.intro("OpenACP \u2014 Reconfigure");
|
|
678
|
+
try {
|
|
679
|
+
await configManager.load();
|
|
680
|
+
let config = configManager.get();
|
|
681
|
+
clack7.note(summarizeConfig(config), "Current configuration");
|
|
682
|
+
let ranSection = false;
|
|
683
|
+
while (true) {
|
|
684
|
+
const choice = await selectSection(ranSection);
|
|
685
|
+
if (choice === "__continue") break;
|
|
686
|
+
ranSection = true;
|
|
687
|
+
if (choice === "channels") {
|
|
688
|
+
const result = await configureChannels(config);
|
|
689
|
+
if (result.changed) {
|
|
690
|
+
config = { ...config, channels: result.config.channels };
|
|
691
|
+
await configManager.writeNew(config);
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
if (choice === "agents") {
|
|
695
|
+
const { defaultAgent } = await setupAgents();
|
|
696
|
+
await configManager.save({ defaultAgent });
|
|
697
|
+
config = configManager.get();
|
|
698
|
+
}
|
|
699
|
+
if (choice === "workspace") {
|
|
700
|
+
const { baseDir } = await setupWorkspace({
|
|
701
|
+
existing: config.workspace.baseDir
|
|
702
|
+
});
|
|
703
|
+
await configManager.save({ workspace: { baseDir } });
|
|
704
|
+
config = configManager.get();
|
|
705
|
+
}
|
|
706
|
+
if (choice === "runMode") {
|
|
707
|
+
const result = await setupRunMode({
|
|
708
|
+
existing: { runMode: config.runMode, autoStart: config.autoStart }
|
|
709
|
+
});
|
|
710
|
+
await configManager.save({
|
|
711
|
+
runMode: result.runMode,
|
|
712
|
+
autoStart: result.autoStart
|
|
713
|
+
});
|
|
714
|
+
config = configManager.get();
|
|
715
|
+
}
|
|
716
|
+
if (choice === "integrations") {
|
|
717
|
+
await setupIntegrations(config);
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
if (!ranSection) {
|
|
721
|
+
clack7.outro("No changes made.");
|
|
722
|
+
return;
|
|
723
|
+
}
|
|
724
|
+
clack7.outro(`Config saved to ${configManager.getConfigPath()}`);
|
|
725
|
+
} catch (err) {
|
|
726
|
+
if (err.name === "ExitPromptError") {
|
|
727
|
+
clack7.cancel("Setup cancelled.");
|
|
728
|
+
return;
|
|
729
|
+
}
|
|
730
|
+
throw err;
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
export {
|
|
734
|
+
detectAgents,
|
|
735
|
+
printStartBanner,
|
|
736
|
+
runReconfigure,
|
|
737
|
+
runSetup,
|
|
738
|
+
setupAgents,
|
|
739
|
+
setupRunMode,
|
|
740
|
+
setupWorkspace,
|
|
741
|
+
validateAgentCommand,
|
|
742
|
+
validateBotAdmin,
|
|
743
|
+
validateBotToken,
|
|
744
|
+
validateChatId,
|
|
745
|
+
validateDiscordToken
|
|
746
|
+
};
|
|
747
|
+
//# sourceMappingURL=setup-BAI2F24H.js.map
|