@openacp/cli 0.6.10 → 2026.326.3
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/{action-detect-P7ZE4NEM.js → action-detect-QPA775HB.js} +2 -2
- package/dist/adapter-6ANPBSVU.js +16 -0
- package/dist/{discord-OMC52Y54.js → adapter-77ZCVABT.js} +520 -365
- package/dist/adapter-77ZCVABT.js.map +1 -0
- package/dist/{adapter-ZOANORGM.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-OWP7RZ62.js → chunk-5ZOFBTOR.js} +118 -262
- 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-MKHUZLII.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-CS3KCJ5D.js → chunk-RKB2ZK6S.js} +555 -383
- 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 +496 -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-LYF5PP5W.js +327 -0
- package/dist/plugin-create-LYF5PP5W.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/{chunk-LCRLAV4G.js → setup-BAI2F24H.js} +154 -492
- 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-ZOANORGM.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-BNLGTZ34.js.map +0 -1
- package/dist/chunk-CS3KCJ5D.js.map +0 -1
- package/dist/chunk-GAK6PIBW.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-KIRH7TUJ.js.map +0 -1
- package/dist/chunk-LBIKITQT.js +0 -22
- package/dist/chunk-LBIKITQT.js.map +0 -1
- package/dist/chunk-LCRLAV4G.js.map +0 -1
- package/dist/chunk-LGP2YGRL.js +0 -4880
- package/dist/chunk-LGP2YGRL.js.map +0 -1
- package/dist/chunk-MKHUZLII.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-OWP7RZ62.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-QQTZMWGD.js +0 -13
- package/dist/discord-OMC52Y54.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-XOZCLFUK.js +0 -238
- package/dist/main-XOZCLFUK.js.map +0 -1
- package/dist/post-upgrade-CJG5I7M2.js.map +0 -1
- package/dist/setup-XHS4OMPM.js +0 -37
- 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-QQTZMWGD.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-XHS4OMPM.js.map → doctor-RF6BHMCC.js.map} +0 -0
|
@@ -0,0 +1,715 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
corePlugins
|
|
4
|
+
} from "./chunk-Q6ZXJTZB.js";
|
|
5
|
+
import "./chunk-UB2QB6DE.js";
|
|
6
|
+
import {
|
|
7
|
+
SettingsManager
|
|
8
|
+
} from "./chunk-MLF4W5R6.js";
|
|
9
|
+
import "./chunk-WVLDNYOJ.js";
|
|
10
|
+
import "./chunk-Y64XWMJ4.js";
|
|
11
|
+
import "./chunk-P4SNGQNI.js";
|
|
12
|
+
import "./chunk-V5JT5TPD.js";
|
|
13
|
+
import "./chunk-5OCGO27U.js";
|
|
14
|
+
import "./chunk-YEULD3SG.js";
|
|
15
|
+
import "./chunk-ZHGPZBS4.js";
|
|
16
|
+
import "./chunk-2CX4IEEC.js";
|
|
17
|
+
import "./chunk-AD3X6DGK.js";
|
|
18
|
+
import "./chunk-SNPYTMPR.js";
|
|
19
|
+
import {
|
|
20
|
+
OpenACPCore
|
|
21
|
+
} from "./chunk-FQEBWOZR.js";
|
|
22
|
+
import "./chunk-SHTGQGAU.js";
|
|
23
|
+
import "./chunk-A6Y4GZM3.js";
|
|
24
|
+
import "./chunk-FNRSWA2K.js";
|
|
25
|
+
import "./chunk-ZSLHHQPQ.js";
|
|
26
|
+
import "./chunk-LGFWH3AE.js";
|
|
27
|
+
import "./chunk-OYSAN7UX.js";
|
|
28
|
+
import "./chunk-BLQUXO7S.js";
|
|
29
|
+
import "./chunk-QWP76EBW.js";
|
|
30
|
+
import "./chunk-APS6UEFU.js";
|
|
31
|
+
import "./chunk-WAAD23KY.js";
|
|
32
|
+
import "./chunk-WIIZNPCR.js";
|
|
33
|
+
import "./chunk-WXVT3AOY.js";
|
|
34
|
+
import {
|
|
35
|
+
ConfigManager
|
|
36
|
+
} from "./chunk-QVMEF6FB.js";
|
|
37
|
+
import {
|
|
38
|
+
cleanupOldSessionLogs,
|
|
39
|
+
initLogger,
|
|
40
|
+
log,
|
|
41
|
+
muteLogger,
|
|
42
|
+
shutdownLogger,
|
|
43
|
+
unmuteLogger
|
|
44
|
+
} from "./chunk-XMMAGAT4.js";
|
|
45
|
+
import {
|
|
46
|
+
PluginRegistry
|
|
47
|
+
} from "./chunk-W26AUH5B.js";
|
|
48
|
+
import "./chunk-VUNV25KB.js";
|
|
49
|
+
|
|
50
|
+
// src/core/command-registry.ts
|
|
51
|
+
var CommandRegistry = class _CommandRegistry {
|
|
52
|
+
/** Main registry: short names + qualified names → RegisteredCommand */
|
|
53
|
+
commands = /* @__PURE__ */ new Map();
|
|
54
|
+
/** Adapter-specific overrides: `channelId:commandName` → RegisteredCommand */
|
|
55
|
+
overrides = /* @__PURE__ */ new Map();
|
|
56
|
+
static ADAPTER_SCOPES = /* @__PURE__ */ new Set(["telegram", "discord", "slack"]);
|
|
57
|
+
/**
|
|
58
|
+
* Register a command definition.
|
|
59
|
+
* @param def - Command definition
|
|
60
|
+
* @param pluginName - Plugin that owns the command (set automatically by PluginContext)
|
|
61
|
+
*/
|
|
62
|
+
register(def, pluginName) {
|
|
63
|
+
const cmd = {
|
|
64
|
+
...def,
|
|
65
|
+
pluginName: pluginName ?? def.pluginName
|
|
66
|
+
};
|
|
67
|
+
if (pluginName) {
|
|
68
|
+
cmd.scope = _CommandRegistry.extractScope(pluginName);
|
|
69
|
+
}
|
|
70
|
+
const qualifiedName = cmd.scope ? `${cmd.scope}:${cmd.name}` : void 0;
|
|
71
|
+
if (cmd.scope && _CommandRegistry.ADAPTER_SCOPES.has(cmd.scope) && this.commands.has(cmd.name)) {
|
|
72
|
+
this.overrides.set(`${cmd.scope}:${cmd.name}`, cmd);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (qualifiedName) {
|
|
76
|
+
this.commands.set(qualifiedName, cmd);
|
|
77
|
+
}
|
|
78
|
+
if (this.commands.has(cmd.name)) {
|
|
79
|
+
const existing = this.commands.get(cmd.name);
|
|
80
|
+
if (existing.category === "system") {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.commands.set(cmd.name, cmd);
|
|
86
|
+
}
|
|
87
|
+
/** Retrieve a command by name (short or qualified). */
|
|
88
|
+
get(name) {
|
|
89
|
+
return this.commands.get(name);
|
|
90
|
+
}
|
|
91
|
+
/** Remove a command by short name. Also removes its qualified name entry. */
|
|
92
|
+
unregister(name) {
|
|
93
|
+
const cmd = this.commands.get(name);
|
|
94
|
+
if (cmd) {
|
|
95
|
+
this.commands.delete(name);
|
|
96
|
+
if (cmd.scope) {
|
|
97
|
+
this.commands.delete(`${cmd.scope}:${name}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (!cmd) {
|
|
101
|
+
this.commands.delete(name);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** Remove all commands registered by a given plugin. */
|
|
105
|
+
unregisterByPlugin(pluginName) {
|
|
106
|
+
const scope = _CommandRegistry.extractScope(pluginName);
|
|
107
|
+
const toDelete = [];
|
|
108
|
+
for (const [key, cmd] of this.commands) {
|
|
109
|
+
if (cmd.pluginName === pluginName) {
|
|
110
|
+
toDelete.push(key);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
for (const key of toDelete) {
|
|
114
|
+
this.commands.delete(key);
|
|
115
|
+
}
|
|
116
|
+
for (const [key, cmd] of this.overrides) {
|
|
117
|
+
if (cmd.pluginName === pluginName) {
|
|
118
|
+
this.overrides.delete(key);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Return all unique commands (deduplicated — each command appears once). */
|
|
123
|
+
getAll() {
|
|
124
|
+
const seen = /* @__PURE__ */ new Set();
|
|
125
|
+
for (const cmd of this.commands.values()) {
|
|
126
|
+
seen.add(cmd);
|
|
127
|
+
}
|
|
128
|
+
return [...seen];
|
|
129
|
+
}
|
|
130
|
+
/** Filter commands by category. */
|
|
131
|
+
getByCategory(category) {
|
|
132
|
+
return this.getAll().filter((cmd) => cmd.category === category);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Parse and execute a command string.
|
|
136
|
+
* @param commandString - Full command string, e.g. "/greet hello world"
|
|
137
|
+
* @param baseArgs - Base arguments (channelId, userId, etc.)
|
|
138
|
+
* @returns CommandResponse
|
|
139
|
+
*/
|
|
140
|
+
async execute(commandString, baseArgs) {
|
|
141
|
+
const trimmed = commandString.trim();
|
|
142
|
+
const spaceIdx = trimmed.indexOf(" ");
|
|
143
|
+
const cmdName = spaceIdx === -1 ? trimmed.slice(1) : trimmed.slice(1, spaceIdx);
|
|
144
|
+
const rawArgs = spaceIdx === -1 ? "" : trimmed.slice(spaceIdx + 1);
|
|
145
|
+
const overrideKey = `${baseArgs.channelId}:${cmdName}`;
|
|
146
|
+
const override = this.overrides.get(overrideKey);
|
|
147
|
+
const cmd = override ?? this.commands.get(cmdName);
|
|
148
|
+
if (!cmd) {
|
|
149
|
+
return { type: "error", message: `Unknown command: /${cmdName}` };
|
|
150
|
+
}
|
|
151
|
+
const args = {
|
|
152
|
+
...baseArgs,
|
|
153
|
+
raw: rawArgs
|
|
154
|
+
};
|
|
155
|
+
try {
|
|
156
|
+
const result = await cmd.handler(args);
|
|
157
|
+
if (result === void 0 || result === null) {
|
|
158
|
+
return { type: "silent" };
|
|
159
|
+
}
|
|
160
|
+
return result;
|
|
161
|
+
} catch (err) {
|
|
162
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
163
|
+
return { type: "error", message: `Command /${cmdName} failed: ${message}` };
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/** Extract scope from plugin name: '@openacp/speech' → 'speech', 'my-plugin' → 'my-plugin' */
|
|
167
|
+
static extractScope(pluginName) {
|
|
168
|
+
const slashIdx = pluginName.lastIndexOf("/");
|
|
169
|
+
if (slashIdx !== -1) {
|
|
170
|
+
return pluginName.slice(slashIdx + 1);
|
|
171
|
+
}
|
|
172
|
+
return pluginName;
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
// src/core/commands/session.ts
|
|
177
|
+
function registerSessionCommands(registry, _core) {
|
|
178
|
+
registry.register({
|
|
179
|
+
name: "new",
|
|
180
|
+
description: "Start a new session",
|
|
181
|
+
usage: "[agent-name]",
|
|
182
|
+
category: "system",
|
|
183
|
+
handler: async (args) => {
|
|
184
|
+
const agent = args.raw.trim();
|
|
185
|
+
if (agent) {
|
|
186
|
+
return { type: "text", text: `Starting new session with agent: ${agent}` };
|
|
187
|
+
}
|
|
188
|
+
return { type: "text", text: "Starting new session..." };
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
registry.register({
|
|
192
|
+
name: "cancel",
|
|
193
|
+
description: "Cancel the current agent turn",
|
|
194
|
+
category: "system",
|
|
195
|
+
handler: async () => {
|
|
196
|
+
return { type: "silent" };
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
registry.register({
|
|
200
|
+
name: "status",
|
|
201
|
+
description: "Show current session status",
|
|
202
|
+
category: "system",
|
|
203
|
+
handler: async () => {
|
|
204
|
+
return { type: "text", text: "No active session." };
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
registry.register({
|
|
208
|
+
name: "sessions",
|
|
209
|
+
description: "List all active sessions",
|
|
210
|
+
category: "system",
|
|
211
|
+
handler: async () => {
|
|
212
|
+
return { type: "text", text: "No active sessions." };
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
registry.register({
|
|
216
|
+
name: "clear",
|
|
217
|
+
description: "Clear session history",
|
|
218
|
+
category: "system",
|
|
219
|
+
handler: async () => {
|
|
220
|
+
return { type: "silent" };
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
registry.register({
|
|
224
|
+
name: "newchat",
|
|
225
|
+
description: "End current session and start a new one",
|
|
226
|
+
category: "system",
|
|
227
|
+
handler: async () => {
|
|
228
|
+
return { type: "text", text: "Ending session and starting a new one..." };
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
registry.register({
|
|
232
|
+
name: "resume",
|
|
233
|
+
description: "Resume a previous session",
|
|
234
|
+
usage: "<session-number>",
|
|
235
|
+
category: "system",
|
|
236
|
+
handler: async (args) => {
|
|
237
|
+
const id = args.raw.trim();
|
|
238
|
+
if (!id) {
|
|
239
|
+
return { type: "error", message: "Usage: /resume <session-number>" };
|
|
240
|
+
}
|
|
241
|
+
return { type: "text", text: `Resuming session ${id}...` };
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
registry.register({
|
|
245
|
+
name: "summary",
|
|
246
|
+
description: "Show session summary",
|
|
247
|
+
category: "system",
|
|
248
|
+
handler: async () => {
|
|
249
|
+
return { type: "text", text: "No session summary available." };
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
registry.register({
|
|
253
|
+
name: "handoff",
|
|
254
|
+
description: "Hand off session to another agent",
|
|
255
|
+
usage: "<agent-name>",
|
|
256
|
+
category: "system",
|
|
257
|
+
handler: async (args) => {
|
|
258
|
+
const agent = args.raw.trim();
|
|
259
|
+
if (!agent) {
|
|
260
|
+
return { type: "error", message: "Usage: /handoff <agent-name>" };
|
|
261
|
+
}
|
|
262
|
+
return { type: "text", text: `Handing off to ${agent}...` };
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// src/core/commands/agents.ts
|
|
268
|
+
function registerAgentCommands(registry, _core) {
|
|
269
|
+
registry.register({
|
|
270
|
+
name: "agents",
|
|
271
|
+
description: "List available agents",
|
|
272
|
+
category: "system",
|
|
273
|
+
handler: async () => {
|
|
274
|
+
return { type: "text", text: "No agents configured." };
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
registry.register({
|
|
278
|
+
name: "install",
|
|
279
|
+
description: "Install a plugin",
|
|
280
|
+
usage: "<plugin-name>",
|
|
281
|
+
category: "system",
|
|
282
|
+
handler: async (args) => {
|
|
283
|
+
const plugin = args.raw.trim();
|
|
284
|
+
if (!plugin) {
|
|
285
|
+
return { type: "error", message: "Usage: /install <plugin-name>" };
|
|
286
|
+
}
|
|
287
|
+
return { type: "text", text: `Installing plugin: ${plugin}...` };
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// src/core/commands/admin.ts
|
|
293
|
+
function registerAdminCommands(registry, _core) {
|
|
294
|
+
registry.register({
|
|
295
|
+
name: "restart",
|
|
296
|
+
description: "Restart the server",
|
|
297
|
+
category: "system",
|
|
298
|
+
handler: async () => {
|
|
299
|
+
return { type: "silent" };
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
registry.register({
|
|
303
|
+
name: "update",
|
|
304
|
+
description: "Check for and apply updates",
|
|
305
|
+
category: "system",
|
|
306
|
+
handler: async () => {
|
|
307
|
+
return { type: "text", text: "Checking for updates..." };
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
registry.register({
|
|
311
|
+
name: "doctor",
|
|
312
|
+
description: "Run system diagnostics",
|
|
313
|
+
category: "system",
|
|
314
|
+
handler: async () => {
|
|
315
|
+
return { type: "text", text: "Running diagnostics..." };
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
registry.register({
|
|
319
|
+
name: "integrate",
|
|
320
|
+
description: "Set up a new channel integration",
|
|
321
|
+
usage: "<channel>",
|
|
322
|
+
category: "system",
|
|
323
|
+
handler: async (args) => {
|
|
324
|
+
const channel = args.raw.trim();
|
|
325
|
+
if (!channel) {
|
|
326
|
+
return {
|
|
327
|
+
type: "menu",
|
|
328
|
+
title: "Available Integrations",
|
|
329
|
+
options: [
|
|
330
|
+
{ label: "Telegram", command: "/integrate telegram" },
|
|
331
|
+
{ label: "Discord", command: "/integrate discord" },
|
|
332
|
+
{ label: "Slack", command: "/integrate slack" }
|
|
333
|
+
]
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
return { type: "text", text: `Setting up ${channel} integration...` };
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// src/core/commands/help.ts
|
|
342
|
+
function registerHelpCommand(registry, _core) {
|
|
343
|
+
registry.register({
|
|
344
|
+
name: "help",
|
|
345
|
+
description: "Show available commands",
|
|
346
|
+
usage: "[command]",
|
|
347
|
+
category: "system",
|
|
348
|
+
handler: async (args) => {
|
|
349
|
+
const query = args.raw.trim();
|
|
350
|
+
if (query) {
|
|
351
|
+
const cmd = registry.get(query);
|
|
352
|
+
if (!cmd) {
|
|
353
|
+
return { type: "error", message: `Unknown command: /${query}` };
|
|
354
|
+
}
|
|
355
|
+
let text = `/${cmd.name}`;
|
|
356
|
+
if (cmd.usage) text += ` ${cmd.usage}`;
|
|
357
|
+
text += `
|
|
358
|
+
${cmd.description}`;
|
|
359
|
+
return { type: "text", text };
|
|
360
|
+
}
|
|
361
|
+
const systemCmds = registry.getByCategory("system");
|
|
362
|
+
const pluginCmds = registry.getByCategory("plugin");
|
|
363
|
+
const lines = [];
|
|
364
|
+
if (systemCmds.length > 0) {
|
|
365
|
+
lines.push("System Commands:");
|
|
366
|
+
for (const cmd of systemCmds) {
|
|
367
|
+
const usage = cmd.usage ? ` ${cmd.usage}` : "";
|
|
368
|
+
lines.push(` /${cmd.name}${usage} \u2014 ${cmd.description}`);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
if (pluginCmds.length > 0) {
|
|
372
|
+
if (lines.length > 0) lines.push("");
|
|
373
|
+
lines.push("Plugin Commands:");
|
|
374
|
+
for (const cmd of pluginCmds) {
|
|
375
|
+
const usage = cmd.usage ? ` ${cmd.usage}` : "";
|
|
376
|
+
lines.push(` /${cmd.name}${usage} \u2014 ${cmd.description}`);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
if (lines.length === 0) {
|
|
380
|
+
return { type: "text", text: "No commands registered." };
|
|
381
|
+
}
|
|
382
|
+
return { type: "text", text: lines.join("\n") };
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// src/core/commands/menu.ts
|
|
388
|
+
function registerMenuCommand(registry, _core) {
|
|
389
|
+
registry.register({
|
|
390
|
+
name: "menu",
|
|
391
|
+
description: "Show the main menu",
|
|
392
|
+
category: "system",
|
|
393
|
+
handler: async () => {
|
|
394
|
+
return {
|
|
395
|
+
type: "menu",
|
|
396
|
+
title: "Main Menu",
|
|
397
|
+
options: [
|
|
398
|
+
{ label: "New Session", command: "/new" },
|
|
399
|
+
{ label: "Active Sessions", command: "/sessions" },
|
|
400
|
+
{ label: "Available Agents", command: "/agents" },
|
|
401
|
+
{ label: "Usage", command: "/usage" },
|
|
402
|
+
{ label: "Help", command: "/help" }
|
|
403
|
+
]
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// src/core/commands/index.ts
|
|
410
|
+
function registerSystemCommands(registry, core) {
|
|
411
|
+
registerSessionCommands(registry, core);
|
|
412
|
+
registerAgentCommands(registry, core);
|
|
413
|
+
registerAdminCommands(registry, core);
|
|
414
|
+
registerHelpCommand(registry, core);
|
|
415
|
+
registerMenuCommand(registry, core);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// src/main.ts
|
|
419
|
+
import fs from "fs";
|
|
420
|
+
import path from "path";
|
|
421
|
+
import os from "os";
|
|
422
|
+
var RESTART_EXIT_CODE = 75;
|
|
423
|
+
var shuttingDown = false;
|
|
424
|
+
var OPENACP_DIR = path.join(os.homedir(), ".openacp");
|
|
425
|
+
var PLUGINS_DATA_DIR = path.join(OPENACP_DIR, "plugins", "data");
|
|
426
|
+
var REGISTRY_PATH = path.join(OPENACP_DIR, "plugins.json");
|
|
427
|
+
async function startServer(opts) {
|
|
428
|
+
if (process.argv.includes("--daemon-child")) {
|
|
429
|
+
const { writePidFile, readPidFile, getPidPath, shouldAutoStart } = await import("./daemon-PXO5QPCR.js");
|
|
430
|
+
if (!shouldAutoStart()) {
|
|
431
|
+
process.exit(0);
|
|
432
|
+
}
|
|
433
|
+
const pidPath = getPidPath();
|
|
434
|
+
const existingPid = readPidFile(pidPath);
|
|
435
|
+
if (existingPid !== null && existingPid !== process.pid) {
|
|
436
|
+
try {
|
|
437
|
+
process.kill(existingPid, 0);
|
|
438
|
+
console.error(`Another OpenACP instance is already running (PID ${existingPid}). Exiting.`);
|
|
439
|
+
process.exit(1);
|
|
440
|
+
} catch {
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
writePidFile(pidPath, process.pid);
|
|
444
|
+
}
|
|
445
|
+
const settingsManager = new SettingsManager(PLUGINS_DATA_DIR);
|
|
446
|
+
const pluginRegistry = new PluginRegistry(REGISTRY_PATH);
|
|
447
|
+
await pluginRegistry.load();
|
|
448
|
+
const configManager = new ConfigManager();
|
|
449
|
+
const configExists = await configManager.exists();
|
|
450
|
+
if (!configExists) {
|
|
451
|
+
const { runSetup } = await import("./setup-BAI2F24H.js");
|
|
452
|
+
const shouldStart = await runSetup(configManager, { settingsManager, pluginRegistry });
|
|
453
|
+
if (!shouldStart) process.exit(0);
|
|
454
|
+
}
|
|
455
|
+
await configManager.load();
|
|
456
|
+
const config = configManager.get();
|
|
457
|
+
initLogger(config.logging);
|
|
458
|
+
log.debug({ configPath: configManager.getConfigPath() }, "Config loaded");
|
|
459
|
+
if (pluginRegistry.list().size === 0) {
|
|
460
|
+
await autoRegisterBuiltinPlugins(settingsManager, pluginRegistry, configManager);
|
|
461
|
+
}
|
|
462
|
+
const isForegroundTTY = !!(process.stdout.isTTY && !process.env.NO_COLOR && config.runMode !== "daemon");
|
|
463
|
+
if (isForegroundTTY) {
|
|
464
|
+
const { printStartBanner } = await import("./setup-BAI2F24H.js");
|
|
465
|
+
await printStartBanner();
|
|
466
|
+
}
|
|
467
|
+
let spinner;
|
|
468
|
+
if (isForegroundTTY) {
|
|
469
|
+
muteLogger();
|
|
470
|
+
const ora = (await import("ora")).default;
|
|
471
|
+
spinner = ora({ text: "Starting OpenACP...", spinner: "dots" }).start();
|
|
472
|
+
}
|
|
473
|
+
try {
|
|
474
|
+
const { runPostUpgradeChecks } = await import("./post-upgrade-XLHZ6ZB7.js");
|
|
475
|
+
await runPostUpgradeChecks(config);
|
|
476
|
+
} catch (err) {
|
|
477
|
+
log.warn({ err }, "Post-upgrade check failed");
|
|
478
|
+
}
|
|
479
|
+
cleanupOldSessionLogs(config.logging.sessionLogRetentionDays).catch(
|
|
480
|
+
(err) => log.warn({ err }, "Session log cleanup failed")
|
|
481
|
+
);
|
|
482
|
+
const core = new OpenACPCore(configManager);
|
|
483
|
+
const commandRegistry = new CommandRegistry();
|
|
484
|
+
const serviceRegistry = core.lifecycleManager.serviceRegistry;
|
|
485
|
+
serviceRegistry.register("command-registry", commandRegistry, "core");
|
|
486
|
+
registerSystemCommands(commandRegistry, core);
|
|
487
|
+
try {
|
|
488
|
+
core.eventBus.emit("kernel:booted");
|
|
489
|
+
core.lifecycleManager.settingsManager = settingsManager;
|
|
490
|
+
core.lifecycleManager.pluginRegistry = pluginRegistry;
|
|
491
|
+
await core.lifecycleManager.boot(corePlugins);
|
|
492
|
+
if (opts?.devPluginPath) {
|
|
493
|
+
const { DevPluginLoader } = await import("./dev-loader-RDC5E2CW.js");
|
|
494
|
+
const devLoader = new DevPluginLoader(opts.devPluginPath);
|
|
495
|
+
try {
|
|
496
|
+
const devPlugin = await devLoader.load();
|
|
497
|
+
await core.lifecycleManager.boot([devPlugin]);
|
|
498
|
+
log.info({ plugin: devPlugin.name, version: devPlugin.version }, "Dev plugin loaded");
|
|
499
|
+
if (!opts.noWatch) {
|
|
500
|
+
const distPath = devLoader.getDistPath();
|
|
501
|
+
let reloadTimer = null;
|
|
502
|
+
fs.watch(distPath, { recursive: true }, (_eventType, filename) => {
|
|
503
|
+
if (!filename?.endsWith(".js")) return;
|
|
504
|
+
if (reloadTimer) clearTimeout(reloadTimer);
|
|
505
|
+
reloadTimer = setTimeout(async () => {
|
|
506
|
+
try {
|
|
507
|
+
log.info({ filename }, "Dev plugin changed, reloading...");
|
|
508
|
+
await core.lifecycleManager.unloadPlugin(devPlugin.name);
|
|
509
|
+
const reloaded = await devLoader.load();
|
|
510
|
+
await core.lifecycleManager.boot([reloaded]);
|
|
511
|
+
log.info({ plugin: reloaded.name, version: reloaded.version }, "Dev plugin reloaded");
|
|
512
|
+
} catch (err) {
|
|
513
|
+
log.error({ err }, "Dev plugin reload failed");
|
|
514
|
+
}
|
|
515
|
+
}, 500);
|
|
516
|
+
});
|
|
517
|
+
log.info({ distPath }, "Watching dev plugin for changes");
|
|
518
|
+
}
|
|
519
|
+
} catch (err) {
|
|
520
|
+
log.error({ err, pluginPath: opts.devPluginPath }, "Failed to load dev plugin");
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
for (const adapterName of ["telegram", "discord", "slack"]) {
|
|
524
|
+
const adapter = serviceRegistry.get(`adapter:${adapterName}`);
|
|
525
|
+
if (adapter) {
|
|
526
|
+
core.registerAdapter(adapterName, adapter);
|
|
527
|
+
log.info({ adapter: adapterName }, "Adapter registered");
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
const tunnelSvc = serviceRegistry.get("tunnel");
|
|
531
|
+
if (tunnelSvc) {
|
|
532
|
+
core.tunnelService = tunnelSvc;
|
|
533
|
+
}
|
|
534
|
+
core.eventBus.emit("system:commands-ready", { commands: commandRegistry.getAll() });
|
|
535
|
+
core.eventBus.emit("system:ready");
|
|
536
|
+
} catch (err) {
|
|
537
|
+
log.error({ err }, "Plugin boot failed");
|
|
538
|
+
}
|
|
539
|
+
if (core.adapters.size === 0) {
|
|
540
|
+
log.error("No channels enabled. Enable at least one channel in config.");
|
|
541
|
+
process.exit(1);
|
|
542
|
+
}
|
|
543
|
+
const shutdown = async (signal, exitCode = 0) => {
|
|
544
|
+
if (shuttingDown) return;
|
|
545
|
+
shuttingDown = true;
|
|
546
|
+
log.info({ signal, exitCode }, "Signal received, shutting down");
|
|
547
|
+
try {
|
|
548
|
+
await core.lifecycleManager.shutdown();
|
|
549
|
+
await core.stop();
|
|
550
|
+
} catch (err) {
|
|
551
|
+
log.error({ err }, "Error during shutdown");
|
|
552
|
+
}
|
|
553
|
+
const isDaemon = process.argv.includes("--daemon-child");
|
|
554
|
+
if (isDaemon) {
|
|
555
|
+
const { removePidFile, getPidPath } = await import("./daemon-PXO5QPCR.js");
|
|
556
|
+
removePidFile(getPidPath());
|
|
557
|
+
}
|
|
558
|
+
if (exitCode === RESTART_EXIT_CODE) {
|
|
559
|
+
if (isDaemon) {
|
|
560
|
+
const { spawn: spawnChild } = await import("child_process");
|
|
561
|
+
const { expandHome } = await import("./config-I4FMCJGZ.js");
|
|
562
|
+
const fs2 = await import("fs");
|
|
563
|
+
const pathMod = await import("path");
|
|
564
|
+
const cliPath = pathMod.resolve(process.argv[1]);
|
|
565
|
+
const resolvedLogDir = expandHome(config.logging.logDir);
|
|
566
|
+
fs2.mkdirSync(resolvedLogDir, { recursive: true });
|
|
567
|
+
const logFile = pathMod.join(resolvedLogDir, "openacp.log");
|
|
568
|
+
const out = fs2.openSync(logFile, "a");
|
|
569
|
+
const err = fs2.openSync(logFile, "a");
|
|
570
|
+
const child = spawnChild(process.execPath, [cliPath, "--daemon-child"], {
|
|
571
|
+
detached: true,
|
|
572
|
+
stdio: ["ignore", out, err],
|
|
573
|
+
env: { ...process.env, OPENACP_SKIP_UPDATE_CHECK: "1" }
|
|
574
|
+
});
|
|
575
|
+
fs2.closeSync(out);
|
|
576
|
+
fs2.closeSync(err);
|
|
577
|
+
child.unref();
|
|
578
|
+
log.info({ newPid: child.pid }, "Respawned daemon for restart");
|
|
579
|
+
} else if (!process.env.OPENACP_DEV_LOOP) {
|
|
580
|
+
const { spawn: spawnChild } = await import("child_process");
|
|
581
|
+
const child = spawnChild(process.execPath, process.argv.slice(1), {
|
|
582
|
+
stdio: "inherit",
|
|
583
|
+
env: { ...process.env, OPENACP_SKIP_UPDATE_CHECK: "1" }
|
|
584
|
+
});
|
|
585
|
+
await shutdownLogger();
|
|
586
|
+
child.on("exit", (code) => process.exit(code ?? 0));
|
|
587
|
+
return;
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
await shutdownLogger();
|
|
591
|
+
process.exit(exitCode);
|
|
592
|
+
};
|
|
593
|
+
core.requestRestart = () => shutdown("restart", RESTART_EXIT_CODE);
|
|
594
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
595
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
596
|
+
process.on("uncaughtException", (err) => {
|
|
597
|
+
log.error({ err }, "Uncaught exception");
|
|
598
|
+
});
|
|
599
|
+
process.on("unhandledRejection", (err) => {
|
|
600
|
+
log.error({ err }, "Unhandled rejection");
|
|
601
|
+
});
|
|
602
|
+
await core.start();
|
|
603
|
+
if (isForegroundTTY) {
|
|
604
|
+
if (spinner) spinner.stop();
|
|
605
|
+
const ok = (msg) => console.log(`\x1B[32m\u2713\x1B[0m ${msg}`);
|
|
606
|
+
ok("Config loaded");
|
|
607
|
+
ok("Dependencies checked");
|
|
608
|
+
const tunnelSvc = core.lifecycleManager.serviceRegistry.get("tunnel");
|
|
609
|
+
if (tunnelSvc) ok(`Tunnel ready \u2192 ${tunnelSvc.getPublicUrl()}`);
|
|
610
|
+
for (const [name] of core.adapters) ok(`${name.charAt(0).toUpperCase() + name.slice(1)} connected`);
|
|
611
|
+
const apiPort = config.api?.port ?? 21420;
|
|
612
|
+
if (core.lifecycleManager.serviceRegistry.get("api-server")) ok(`API server on port ${apiPort}`);
|
|
613
|
+
console.log(`
|
|
614
|
+
OpenACP is running. Press Ctrl+C to stop.
|
|
615
|
+
`);
|
|
616
|
+
unmuteLogger();
|
|
617
|
+
}
|
|
618
|
+
log.debug({ agents: Object.keys(config.agents) }, "OpenACP started");
|
|
619
|
+
}
|
|
620
|
+
async function autoRegisterBuiltinPlugins(settingsManager, pluginRegistry, configManager) {
|
|
621
|
+
const allPlugins = [
|
|
622
|
+
{ name: "@openacp/security", version: "1.0.0", description: "User access control and session limits" },
|
|
623
|
+
{ name: "@openacp/file-service", version: "1.0.0", description: "File storage and management" },
|
|
624
|
+
{ name: "@openacp/context", version: "1.0.0", description: "Conversation context management" },
|
|
625
|
+
{ name: "@openacp/usage", version: "1.0.0", description: "Token usage tracking and budget enforcement" },
|
|
626
|
+
{ name: "@openacp/speech", version: "1.0.0", description: "Text-to-speech and speech-to-text" },
|
|
627
|
+
{ name: "@openacp/notifications", version: "1.0.0", description: "Cross-session notification routing" },
|
|
628
|
+
{ name: "@openacp/tunnel", version: "1.0.0", description: "Expose local services via tunnel" },
|
|
629
|
+
{ name: "@openacp/api-server", version: "1.0.0", description: "REST API + SSE streaming server" },
|
|
630
|
+
{ name: "@openacp/telegram", version: "1.0.0", description: "Telegram adapter with forum topics" },
|
|
631
|
+
{ name: "@openacp/discord", version: "1.0.0", description: "Discord adapter with forum threads" },
|
|
632
|
+
{ name: "@openacp/slack", version: "1.0.0", description: "Slack adapter with channels and threads" }
|
|
633
|
+
];
|
|
634
|
+
let legacyConfig;
|
|
635
|
+
try {
|
|
636
|
+
const cfg = configManager.get();
|
|
637
|
+
if (cfg && typeof cfg === "object") {
|
|
638
|
+
legacyConfig = cfg;
|
|
639
|
+
}
|
|
640
|
+
} catch {
|
|
641
|
+
}
|
|
642
|
+
if (legacyConfig) {
|
|
643
|
+
const pluginModules = await Promise.allSettled([
|
|
644
|
+
import("./security-YNRBW6S7.js"),
|
|
645
|
+
import("./file-service-EUODJAIT.js"),
|
|
646
|
+
import("./context-XM6E22LM.js"),
|
|
647
|
+
import("./usage-WYNK6ZC5.js"),
|
|
648
|
+
import("./speech-2GHQNRIO.js"),
|
|
649
|
+
import("./notifications-D5BRDNSU.js"),
|
|
650
|
+
import("./tunnel-M47I7H4B.js"),
|
|
651
|
+
import("./api-server-3PYLRBCN.js"),
|
|
652
|
+
import("./telegram-ZDC3JQF2.js"),
|
|
653
|
+
import("./discord-NOJQ5PZO.js"),
|
|
654
|
+
import("./slack-KH7E3VBS.js")
|
|
655
|
+
]);
|
|
656
|
+
for (const result of pluginModules) {
|
|
657
|
+
if (result.status !== "fulfilled") continue;
|
|
658
|
+
const plugin = result.value.default;
|
|
659
|
+
if (plugin?.install) {
|
|
660
|
+
try {
|
|
661
|
+
const existing = await settingsManager.loadSettings(plugin.name);
|
|
662
|
+
if (Object.keys(existing).length > 0) continue;
|
|
663
|
+
const { createInstallContext } = await import("./install-context-XPWTFT3J.js");
|
|
664
|
+
const ctx = createInstallContext({
|
|
665
|
+
pluginName: plugin.name,
|
|
666
|
+
settingsManager,
|
|
667
|
+
basePath: PLUGINS_DATA_DIR,
|
|
668
|
+
legacyConfig
|
|
669
|
+
});
|
|
670
|
+
ctx.terminal = createSilentTerminal();
|
|
671
|
+
await plugin.install(ctx);
|
|
672
|
+
} catch {
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
for (const p of allPlugins) {
|
|
678
|
+
pluginRegistry.register(p.name, {
|
|
679
|
+
version: p.version,
|
|
680
|
+
source: "builtin",
|
|
681
|
+
enabled: true,
|
|
682
|
+
settingsPath: settingsManager.getSettingsPath(p.name),
|
|
683
|
+
description: p.description
|
|
684
|
+
});
|
|
685
|
+
}
|
|
686
|
+
await pluginRegistry.save();
|
|
687
|
+
log.info("Built-in plugins registered in plugin registry");
|
|
688
|
+
}
|
|
689
|
+
function createSilentTerminal() {
|
|
690
|
+
const noop = () => {
|
|
691
|
+
};
|
|
692
|
+
return {
|
|
693
|
+
text: async () => "",
|
|
694
|
+
select: async () => "",
|
|
695
|
+
confirm: async () => false,
|
|
696
|
+
password: async () => "",
|
|
697
|
+
multiselect: async () => [],
|
|
698
|
+
log: { info: noop, success: noop, warning: noop, error: noop, step: noop },
|
|
699
|
+
spinner: () => ({ start: noop, stop: noop, fail: noop }),
|
|
700
|
+
note: noop,
|
|
701
|
+
cancel: noop
|
|
702
|
+
};
|
|
703
|
+
}
|
|
704
|
+
var isDirectExecution = process.argv[1]?.endsWith("main.js");
|
|
705
|
+
if (isDirectExecution) {
|
|
706
|
+
startServer().catch((err) => {
|
|
707
|
+
log.error({ err }, "Fatal error");
|
|
708
|
+
process.exit(1);
|
|
709
|
+
});
|
|
710
|
+
}
|
|
711
|
+
export {
|
|
712
|
+
RESTART_EXIT_CODE,
|
|
713
|
+
startServer
|
|
714
|
+
};
|
|
715
|
+
//# sourceMappingURL=main-T5WVCCFN.js.map
|