@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,212 @@
|
|
|
1
|
+
// src/plugins/telegram/index.ts
|
|
2
|
+
function createTelegramPlugin() {
|
|
3
|
+
let adapter = null;
|
|
4
|
+
return {
|
|
5
|
+
name: "@openacp/telegram",
|
|
6
|
+
version: "1.0.0",
|
|
7
|
+
description: "Telegram adapter with forum topics",
|
|
8
|
+
essential: true,
|
|
9
|
+
pluginDependencies: {
|
|
10
|
+
"@openacp/security": "^1.0.0",
|
|
11
|
+
"@openacp/notifications": "^1.0.0"
|
|
12
|
+
},
|
|
13
|
+
optionalPluginDependencies: {
|
|
14
|
+
"@openacp/speech": "^1.0.0"
|
|
15
|
+
},
|
|
16
|
+
permissions: ["services:register", "kernel:access", "events:read"],
|
|
17
|
+
async install(ctx) {
|
|
18
|
+
const { terminal, settings, legacyConfig } = ctx;
|
|
19
|
+
if (legacyConfig) {
|
|
20
|
+
const tg = legacyConfig.channels;
|
|
21
|
+
const telegramCfg = tg?.telegram;
|
|
22
|
+
if (telegramCfg?.botToken) {
|
|
23
|
+
await settings.setAll({
|
|
24
|
+
botToken: telegramCfg.botToken,
|
|
25
|
+
chatId: telegramCfg.chatId,
|
|
26
|
+
notificationTopicId: telegramCfg.notificationTopicId ?? null,
|
|
27
|
+
assistantTopicId: telegramCfg.assistantTopicId ?? null
|
|
28
|
+
});
|
|
29
|
+
terminal.log.success("Telegram settings migrated from legacy config");
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const { validateBotToken, validateChatId, validateBotAdmin } = await import("./validators-WSTBNKRW.js");
|
|
34
|
+
let botToken = "";
|
|
35
|
+
while (true) {
|
|
36
|
+
botToken = await terminal.text({
|
|
37
|
+
message: "Telegram bot token (from @BotFather):",
|
|
38
|
+
validate: (val) => {
|
|
39
|
+
if (!val.trim()) return "Token cannot be empty";
|
|
40
|
+
return void 0;
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
botToken = botToken.trim();
|
|
44
|
+
const spin = terminal.spinner();
|
|
45
|
+
spin.start("Validating token...");
|
|
46
|
+
const result = await validateBotToken(botToken);
|
|
47
|
+
if (result.ok) {
|
|
48
|
+
spin.stop(`Connected to @${result.botUsername}`);
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
spin.fail(result.error);
|
|
52
|
+
const action = await terminal.select({
|
|
53
|
+
message: "What to do?",
|
|
54
|
+
options: [
|
|
55
|
+
{ label: "Re-enter token", value: "retry" },
|
|
56
|
+
{ label: "Use as-is (skip validation)", value: "skip" }
|
|
57
|
+
]
|
|
58
|
+
});
|
|
59
|
+
if (action === "skip") break;
|
|
60
|
+
}
|
|
61
|
+
terminal.log.info("Send a message in your Telegram supergroup to detect the chat ID,");
|
|
62
|
+
terminal.log.info("or enter the chat ID manually.");
|
|
63
|
+
const chatIdMethod = await terminal.select({
|
|
64
|
+
message: "How to get the chat ID?",
|
|
65
|
+
options: [
|
|
66
|
+
{ value: "manual", label: "Enter chat ID manually" },
|
|
67
|
+
{ value: "detect", label: "Auto-detect from group message" }
|
|
68
|
+
]
|
|
69
|
+
});
|
|
70
|
+
let chatId;
|
|
71
|
+
if (chatIdMethod === "manual") {
|
|
72
|
+
const val = await terminal.text({
|
|
73
|
+
message: "Supergroup chat ID (e.g. -1001234567890):",
|
|
74
|
+
validate: (v) => {
|
|
75
|
+
const n = Number(v.trim());
|
|
76
|
+
if (isNaN(n) || !Number.isInteger(n)) return "Chat ID must be an integer";
|
|
77
|
+
return void 0;
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
chatId = Number(val.trim());
|
|
81
|
+
} else {
|
|
82
|
+
terminal.log.step('Listening for messages... Send "hi" in the group.');
|
|
83
|
+
chatId = await detectChatIdViaPolling(botToken, terminal);
|
|
84
|
+
}
|
|
85
|
+
const chatResult = await validateChatId(botToken, chatId);
|
|
86
|
+
if (chatResult.ok) {
|
|
87
|
+
terminal.log.success(`Group: ${chatResult.title}${chatResult.isForum ? " (Topics enabled)" : ""}`);
|
|
88
|
+
} else {
|
|
89
|
+
terminal.log.warning(chatResult.error);
|
|
90
|
+
}
|
|
91
|
+
const adminResult = await validateBotAdmin(botToken, chatId);
|
|
92
|
+
if (adminResult.ok) {
|
|
93
|
+
terminal.log.success("Bot has admin privileges");
|
|
94
|
+
} else {
|
|
95
|
+
terminal.log.warning(adminResult.error);
|
|
96
|
+
}
|
|
97
|
+
await settings.setAll({
|
|
98
|
+
botToken,
|
|
99
|
+
chatId,
|
|
100
|
+
notificationTopicId: null,
|
|
101
|
+
assistantTopicId: null
|
|
102
|
+
});
|
|
103
|
+
terminal.log.success("Telegram settings saved");
|
|
104
|
+
},
|
|
105
|
+
async configure(ctx) {
|
|
106
|
+
const { terminal, settings } = ctx;
|
|
107
|
+
const current = await settings.getAll();
|
|
108
|
+
const choice = await terminal.select({
|
|
109
|
+
message: "What to configure?",
|
|
110
|
+
options: [
|
|
111
|
+
{ value: "token", label: "Change bot token" },
|
|
112
|
+
{ value: "chatId", label: "Change chat ID" },
|
|
113
|
+
{ value: "done", label: "Done" }
|
|
114
|
+
]
|
|
115
|
+
});
|
|
116
|
+
if (choice === "token") {
|
|
117
|
+
const token = await terminal.text({
|
|
118
|
+
message: "New bot token:",
|
|
119
|
+
validate: (v) => !v.trim() ? "Token cannot be empty" : void 0
|
|
120
|
+
});
|
|
121
|
+
await settings.set("botToken", token.trim());
|
|
122
|
+
terminal.log.success("Bot token updated");
|
|
123
|
+
} else if (choice === "chatId") {
|
|
124
|
+
const val = await terminal.text({
|
|
125
|
+
message: "New chat ID:",
|
|
126
|
+
defaultValue: String(current.chatId ?? ""),
|
|
127
|
+
validate: (v) => {
|
|
128
|
+
const n = Number(v.trim());
|
|
129
|
+
if (isNaN(n) || !Number.isInteger(n)) return "Chat ID must be an integer";
|
|
130
|
+
return void 0;
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
await settings.set("chatId", Number(val.trim()));
|
|
134
|
+
terminal.log.success("Chat ID updated");
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
async uninstall(ctx, opts) {
|
|
138
|
+
if (opts.purge) {
|
|
139
|
+
await ctx.settings.clear();
|
|
140
|
+
ctx.terminal.log.success("Telegram settings cleared");
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
async setup(ctx) {
|
|
144
|
+
const config = ctx.pluginConfig;
|
|
145
|
+
if (!config.botToken || !config.chatId) {
|
|
146
|
+
ctx.log.info("Telegram disabled (missing botToken or chatId)");
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const { TelegramAdapter } = await import("./adapter-6ANPBSVU.js");
|
|
150
|
+
adapter = new TelegramAdapter(ctx.core, {
|
|
151
|
+
...config,
|
|
152
|
+
enabled: true,
|
|
153
|
+
maxMessageLength: 4096
|
|
154
|
+
});
|
|
155
|
+
ctx.registerService("adapter:telegram", adapter);
|
|
156
|
+
ctx.log.info("Telegram adapter registered");
|
|
157
|
+
},
|
|
158
|
+
async teardown() {
|
|
159
|
+
if (adapter) {
|
|
160
|
+
await adapter.stop();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
async function detectChatIdViaPolling(token, terminal) {
|
|
166
|
+
let lastUpdateId = 0;
|
|
167
|
+
try {
|
|
168
|
+
const clearRes = await fetch(`https://api.telegram.org/bot${token}/getUpdates?offset=-1`);
|
|
169
|
+
const clearData = await clearRes.json();
|
|
170
|
+
if (clearData.ok && clearData.result?.length) {
|
|
171
|
+
lastUpdateId = clearData.result[clearData.result.length - 1].update_id;
|
|
172
|
+
}
|
|
173
|
+
} catch {
|
|
174
|
+
}
|
|
175
|
+
const MAX_ATTEMPTS = 120;
|
|
176
|
+
const POLL_INTERVAL = 2e3;
|
|
177
|
+
for (let i = 0; i < MAX_ATTEMPTS; i++) {
|
|
178
|
+
try {
|
|
179
|
+
const offset = lastUpdateId ? lastUpdateId + 1 : 0;
|
|
180
|
+
const res = await fetch(`https://api.telegram.org/bot${token}/getUpdates?offset=${offset}&timeout=2`);
|
|
181
|
+
const data = await res.json();
|
|
182
|
+
if (data.ok && data.result?.length) {
|
|
183
|
+
for (const update of data.result) {
|
|
184
|
+
lastUpdateId = update.update_id;
|
|
185
|
+
const chat = update.message?.chat ?? update.my_chat_member?.chat;
|
|
186
|
+
if (chat && (chat.type === "supergroup" || chat.type === "group")) {
|
|
187
|
+
terminal.log.success(`Group detected: ${chat.title ?? chat.id} (${chat.id})`);
|
|
188
|
+
return chat.id;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
} catch {
|
|
193
|
+
}
|
|
194
|
+
await new Promise((r) => setTimeout(r, POLL_INTERVAL));
|
|
195
|
+
}
|
|
196
|
+
terminal.log.warning("Timed out waiting for messages. Enter chat ID manually.");
|
|
197
|
+
const val = await terminal.text({
|
|
198
|
+
message: "Supergroup chat ID (e.g. -1001234567890):",
|
|
199
|
+
validate: (v) => {
|
|
200
|
+
const n = Number(v.trim());
|
|
201
|
+
if (isNaN(n) || !Number.isInteger(n)) return "Chat ID must be an integer";
|
|
202
|
+
return void 0;
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
return Number(val.trim());
|
|
206
|
+
}
|
|
207
|
+
var telegram_default = createTelegramPlugin();
|
|
208
|
+
|
|
209
|
+
export {
|
|
210
|
+
telegram_default
|
|
211
|
+
};
|
|
212
|
+
//# sourceMappingURL=chunk-Y64XWMJ4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/plugins/telegram/index.ts"],"sourcesContent":["import type { OpenACPPlugin, InstallContext } from '../../core/plugin/types.js'\nimport type { OpenACPCore } from '../../core/core.js'\nimport type { TelegramChannelConfig } from './types.js'\n\nfunction createTelegramPlugin(): OpenACPPlugin {\n let adapter: { stop(): Promise<void> } | null = null\n\n return {\n name: '@openacp/telegram',\n version: '1.0.0',\n description: 'Telegram adapter with forum topics',\n essential: true,\n pluginDependencies: {\n '@openacp/security': '^1.0.0',\n '@openacp/notifications': '^1.0.0',\n },\n optionalPluginDependencies: {\n '@openacp/speech': '^1.0.0',\n },\n permissions: ['services:register', 'kernel:access', 'events:read'],\n\n async install(ctx: InstallContext) {\n const { terminal, settings, legacyConfig } = ctx\n\n // Migrate from legacy config if present\n if (legacyConfig) {\n const tg = legacyConfig.channels as Record<string, unknown> | undefined\n const telegramCfg = tg?.telegram as Record<string, unknown> | undefined\n if (telegramCfg?.botToken) {\n await settings.setAll({\n botToken: telegramCfg.botToken,\n chatId: telegramCfg.chatId,\n notificationTopicId: telegramCfg.notificationTopicId ?? null,\n assistantTopicId: telegramCfg.assistantTopicId ?? null,\n })\n terminal.log.success('Telegram settings migrated from legacy config')\n return\n }\n }\n\n // Interactive setup via terminal\n const { validateBotToken, validateChatId, validateBotAdmin } = await import('./validators.js')\n\n let botToken = ''\n while (true) {\n botToken = await terminal.text({\n message: 'Telegram bot token (from @BotFather):',\n validate: (val) => {\n if (!val.trim()) return 'Token cannot be empty'\n return undefined\n },\n })\n botToken = botToken.trim()\n\n const spin = terminal.spinner()\n spin.start('Validating token...')\n const result = await validateBotToken(botToken)\n if (result.ok) {\n spin.stop(`Connected to @${result.botUsername}`)\n break\n }\n spin.fail(result.error)\n const action = await terminal.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 if (action === 'skip') break\n }\n\n // Chat ID detection\n terminal.log.info('Send a message in your Telegram supergroup to detect the chat ID,')\n terminal.log.info('or enter the chat ID manually.')\n\n const chatIdMethod = await terminal.select({\n message: 'How to get the chat ID?',\n options: [\n { value: 'manual', label: 'Enter chat ID manually' },\n { value: 'detect', label: 'Auto-detect from group message' },\n ],\n })\n\n let chatId: number\n if (chatIdMethod === 'manual') {\n const val = await terminal.text({\n message: 'Supergroup chat ID (e.g. -1001234567890):',\n validate: (v) => {\n const n = Number(v.trim())\n if (isNaN(n) || !Number.isInteger(n)) return 'Chat ID must be an integer'\n return undefined\n },\n })\n chatId = Number(val.trim())\n } else {\n // Simple polling-based detection\n terminal.log.step('Listening for messages... Send \"hi\" in the group.')\n chatId = await detectChatIdViaPolling(botToken, terminal)\n }\n\n // Validate chat ID\n const chatResult = await validateChatId(botToken, chatId)\n if (chatResult.ok) {\n terminal.log.success(`Group: ${chatResult.title}${chatResult.isForum ? ' (Topics enabled)' : ''}`)\n } else {\n terminal.log.warning(chatResult.error)\n }\n\n // Validate admin\n const adminResult = await validateBotAdmin(botToken, chatId)\n if (adminResult.ok) {\n terminal.log.success('Bot has admin privileges')\n } else {\n terminal.log.warning(adminResult.error)\n }\n\n await settings.setAll({\n botToken,\n chatId,\n notificationTopicId: null,\n assistantTopicId: null,\n })\n terminal.log.success('Telegram settings saved')\n },\n\n async configure(ctx: InstallContext) {\n const { terminal, settings } = ctx\n const current = await settings.getAll()\n\n const choice = await terminal.select({\n message: 'What to configure?',\n options: [\n { value: 'token', label: 'Change bot token' },\n { value: 'chatId', label: 'Change chat ID' },\n { value: 'done', label: 'Done' },\n ],\n })\n\n if (choice === 'token') {\n const token = await terminal.text({\n message: 'New bot token:',\n validate: (v) => (!v.trim() ? 'Token cannot be empty' : undefined),\n })\n await settings.set('botToken', token.trim())\n terminal.log.success('Bot token updated')\n } else if (choice === 'chatId') {\n const val = await terminal.text({\n message: 'New chat ID:',\n defaultValue: String(current.chatId ?? ''),\n validate: (v) => {\n const n = Number(v.trim())\n if (isNaN(n) || !Number.isInteger(n)) return 'Chat ID must be an integer'\n return undefined\n },\n })\n await settings.set('chatId', Number(val.trim()))\n terminal.log.success('Chat ID updated')\n }\n },\n\n async uninstall(ctx: InstallContext, opts: { purge: boolean }) {\n if (opts.purge) {\n await ctx.settings.clear()\n ctx.terminal.log.success('Telegram settings cleared')\n }\n },\n\n async setup(ctx) {\n const config = ctx.pluginConfig as Record<string, unknown>\n if (!config.botToken || !config.chatId) {\n ctx.log.info('Telegram disabled (missing botToken or chatId)')\n return\n }\n\n const { TelegramAdapter } = await import('./adapter.js')\n // config is a Record<string, unknown> from pluginConfig; at runtime it\n // contains all TelegramChannelConfig fields populated from the migrated config.\n adapter = new TelegramAdapter(ctx.core as OpenACPCore, {\n ...config,\n enabled: true,\n maxMessageLength: 4096,\n } as unknown as TelegramChannelConfig)\n\n ctx.registerService('adapter:telegram', adapter)\n ctx.log.info('Telegram adapter registered')\n },\n\n async teardown() {\n if (adapter) {\n await adapter.stop()\n }\n },\n }\n}\n\nasync function detectChatIdViaPolling(\n token: string,\n terminal: InstallContext['terminal'],\n): Promise<number> {\n let lastUpdateId = 0\n try {\n const clearRes = await fetch(`https://api.telegram.org/bot${token}/getUpdates?offset=-1`)\n const clearData = (await clearRes.json()) as { ok: boolean; result?: Array<{ update_id: number }> }\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 const MAX_ATTEMPTS = 120\n const POLL_INTERVAL = 2000\n\n for (let i = 0; i < MAX_ATTEMPTS; i++) {\n try {\n const offset = lastUpdateId ? lastUpdateId + 1 : 0\n const res = await fetch(`https://api.telegram.org/bot${token}/getUpdates?offset=${offset}&timeout=2`)\n const data = (await res.json()) as {\n ok: boolean\n result?: Array<{\n update_id: number\n message?: { chat: { id: number; title?: string; type: string } }\n my_chat_member?: { chat: { id: number; title?: string; type: string } }\n }>\n }\n\n if (data.ok && data.result?.length) {\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 terminal.log.success(`Group detected: ${chat.title ?? chat.id} (${chat.id})`)\n return chat.id\n }\n }\n }\n } catch {\n // Network error, retry\n }\n await new Promise((r) => setTimeout(r, POLL_INTERVAL))\n }\n\n // Fallback to manual\n terminal.log.warning('Timed out waiting for messages. Enter chat ID manually.')\n const val = await terminal.text({\n message: 'Supergroup chat ID (e.g. -1001234567890):',\n validate: (v) => {\n const n = Number(v.trim())\n if (isNaN(n) || !Number.isInteger(n)) return 'Chat ID must be an integer'\n return undefined\n },\n })\n return Number(val.trim())\n}\n\nexport default createTelegramPlugin()\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FileService
|
|
3
|
+
} from "./chunk-BLQUXO7S.js";
|
|
4
|
+
|
|
5
|
+
// src/plugins/file-service/index.ts
|
|
6
|
+
import path from "path";
|
|
7
|
+
import os from "os";
|
|
8
|
+
function createFileServicePlugin() {
|
|
9
|
+
return {
|
|
10
|
+
name: "@openacp/file-service",
|
|
11
|
+
version: "1.0.0",
|
|
12
|
+
description: "File storage and management for session attachments",
|
|
13
|
+
essential: false,
|
|
14
|
+
permissions: ["services:register"],
|
|
15
|
+
async install(ctx) {
|
|
16
|
+
const { settings, legacyConfig, terminal } = ctx;
|
|
17
|
+
if (legacyConfig) {
|
|
18
|
+
const filesCfg = legacyConfig.files;
|
|
19
|
+
if (filesCfg) {
|
|
20
|
+
await settings.setAll({
|
|
21
|
+
baseDir: filesCfg.baseDir ?? path.join(os.homedir(), ".openacp", "files")
|
|
22
|
+
});
|
|
23
|
+
terminal.log.success("File service settings migrated from legacy config");
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
await settings.setAll({
|
|
28
|
+
baseDir: path.join(os.homedir(), ".openacp", "files")
|
|
29
|
+
});
|
|
30
|
+
terminal.log.success("File service defaults saved");
|
|
31
|
+
},
|
|
32
|
+
async configure(ctx) {
|
|
33
|
+
const { terminal, settings } = ctx;
|
|
34
|
+
const current = await settings.getAll();
|
|
35
|
+
const val = await terminal.text({
|
|
36
|
+
message: "File storage directory:",
|
|
37
|
+
defaultValue: current.baseDir ?? path.join(os.homedir(), ".openacp", "files")
|
|
38
|
+
});
|
|
39
|
+
await settings.set("baseDir", val.trim());
|
|
40
|
+
terminal.log.success("File storage directory updated");
|
|
41
|
+
},
|
|
42
|
+
async uninstall(ctx, opts) {
|
|
43
|
+
if (opts.purge) {
|
|
44
|
+
await ctx.settings.clear();
|
|
45
|
+
ctx.terminal.log.success("File service settings cleared");
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
async setup(ctx) {
|
|
49
|
+
const config = ctx.pluginConfig;
|
|
50
|
+
const baseDir = config.baseDir ?? path.join(os.homedir(), ".openacp", "files");
|
|
51
|
+
const service = new FileService(baseDir);
|
|
52
|
+
ctx.registerService("file-service", service);
|
|
53
|
+
ctx.log.info("File service ready");
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
var file_service_default = createFileServicePlugin();
|
|
58
|
+
|
|
59
|
+
export {
|
|
60
|
+
file_service_default
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=chunk-YEULD3SG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/plugins/file-service/index.ts"],"sourcesContent":["import type { OpenACPPlugin, InstallContext } from '../../core/plugin/types.js'\nimport { FileService } from './file-service.js'\nimport path from 'node:path'\nimport os from 'node:os'\n\nfunction createFileServicePlugin(): OpenACPPlugin {\n return {\n name: '@openacp/file-service',\n version: '1.0.0',\n description: 'File storage and management for session attachments',\n essential: false,\n permissions: ['services:register'],\n\n async install(ctx: InstallContext) {\n const { settings, legacyConfig, terminal } = ctx\n\n // Migrate from legacy config if present\n if (legacyConfig) {\n const filesCfg = legacyConfig.files as Record<string, unknown> | undefined\n if (filesCfg) {\n await settings.setAll({\n baseDir: filesCfg.baseDir ?? path.join(os.homedir(), '.openacp', 'files'),\n })\n terminal.log.success('File service settings migrated from legacy config')\n return\n }\n }\n\n // Save defaults\n await settings.setAll({\n baseDir: path.join(os.homedir(), '.openacp', 'files'),\n })\n terminal.log.success('File service defaults saved')\n },\n\n async configure(ctx: InstallContext) {\n const { terminal, settings } = ctx\n const current = await settings.getAll()\n\n const val = await terminal.text({\n message: 'File storage directory:',\n defaultValue: (current.baseDir as string) ?? path.join(os.homedir(), '.openacp', 'files'),\n })\n await settings.set('baseDir', val.trim())\n terminal.log.success('File storage directory updated')\n },\n\n async uninstall(ctx: InstallContext, opts: { purge: boolean }) {\n if (opts.purge) {\n await ctx.settings.clear()\n ctx.terminal.log.success('File service settings cleared')\n }\n },\n\n async setup(ctx) {\n const config = ctx.pluginConfig as Record<string, unknown>\n const baseDir = (config.baseDir as string) ?? path.join(os.homedir(), '.openacp', 'files')\n const service = new FileService(baseDir)\n ctx.registerService('file-service', service)\n ctx.log.info('File service ready')\n },\n }\n}\n\nexport default createFileServicePlugin()\n"],"mappings":";;;;;AAEA,OAAO,UAAU;AACjB,OAAO,QAAQ;AAEf,SAAS,0BAAyC;AAChD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,WAAW;AAAA,IACX,aAAa,CAAC,mBAAmB;AAAA,IAEjC,MAAM,QAAQ,KAAqB;AACjC,YAAM,EAAE,UAAU,cAAc,SAAS,IAAI;AAG7C,UAAI,cAAc;AAChB,cAAM,WAAW,aAAa;AAC9B,YAAI,UAAU;AACZ,gBAAM,SAAS,OAAO;AAAA,YACpB,SAAS,SAAS,WAAW,KAAK,KAAK,GAAG,QAAQ,GAAG,YAAY,OAAO;AAAA,UAC1E,CAAC;AACD,mBAAS,IAAI,QAAQ,mDAAmD;AACxE;AAAA,QACF;AAAA,MACF;AAGA,YAAM,SAAS,OAAO;AAAA,QACpB,SAAS,KAAK,KAAK,GAAG,QAAQ,GAAG,YAAY,OAAO;AAAA,MACtD,CAAC;AACD,eAAS,IAAI,QAAQ,6BAA6B;AAAA,IACpD;AAAA,IAEA,MAAM,UAAU,KAAqB;AACnC,YAAM,EAAE,UAAU,SAAS,IAAI;AAC/B,YAAM,UAAU,MAAM,SAAS,OAAO;AAEtC,YAAM,MAAM,MAAM,SAAS,KAAK;AAAA,QAC9B,SAAS;AAAA,QACT,cAAe,QAAQ,WAAsB,KAAK,KAAK,GAAG,QAAQ,GAAG,YAAY,OAAO;AAAA,MAC1F,CAAC;AACD,YAAM,SAAS,IAAI,WAAW,IAAI,KAAK,CAAC;AACxC,eAAS,IAAI,QAAQ,gCAAgC;AAAA,IACvD;AAAA,IAEA,MAAM,UAAU,KAAqB,MAA0B;AAC7D,UAAI,KAAK,OAAO;AACd,cAAM,IAAI,SAAS,MAAM;AACzB,YAAI,SAAS,IAAI,QAAQ,+BAA+B;AAAA,MAC1D;AAAA,IACF;AAAA,IAEA,MAAM,MAAM,KAAK;AACf,YAAM,SAAS,IAAI;AACnB,YAAM,UAAW,OAAO,WAAsB,KAAK,KAAK,GAAG,QAAQ,GAAG,YAAY,OAAO;AACzF,YAAM,UAAU,IAAI,YAAY,OAAO;AACvC,UAAI,gBAAgB,gBAAgB,OAAO;AAC3C,UAAI,IAAI,KAAK,oBAAoB;AAAA,IACnC;AAAA,EACF;AACF;AAEA,IAAO,uBAAQ,wBAAwB;","names":[]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ContextManager,
|
|
3
|
+
EntireProvider
|
|
4
|
+
} from "./chunk-QWP76EBW.js";
|
|
5
|
+
|
|
6
|
+
// src/plugins/context/index.ts
|
|
7
|
+
var contextPlugin = {
|
|
8
|
+
name: "@openacp/context",
|
|
9
|
+
version: "1.0.0",
|
|
10
|
+
description: "Conversation context management with pluggable providers",
|
|
11
|
+
essential: false,
|
|
12
|
+
permissions: ["services:register"],
|
|
13
|
+
async install(ctx) {
|
|
14
|
+
const { settings, terminal } = ctx;
|
|
15
|
+
await settings.setAll({ enabled: true });
|
|
16
|
+
terminal.log.success("Context defaults saved");
|
|
17
|
+
},
|
|
18
|
+
async configure(ctx) {
|
|
19
|
+
const { terminal, settings } = ctx;
|
|
20
|
+
const current = await settings.getAll();
|
|
21
|
+
const toggle = await terminal.confirm({
|
|
22
|
+
message: `Context service is ${current.enabled !== false ? "enabled" : "disabled"}. Toggle?`,
|
|
23
|
+
initialValue: false
|
|
24
|
+
});
|
|
25
|
+
if (toggle) {
|
|
26
|
+
const newState = current.enabled === false;
|
|
27
|
+
await settings.set("enabled", newState);
|
|
28
|
+
terminal.log.success(`Context service ${newState ? "enabled" : "disabled"}`);
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
async uninstall(ctx, opts) {
|
|
32
|
+
if (opts.purge) {
|
|
33
|
+
await ctx.settings.clear();
|
|
34
|
+
ctx.terminal.log.success("Context settings cleared");
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
async setup(ctx) {
|
|
38
|
+
const manager = new ContextManager();
|
|
39
|
+
manager.register(new EntireProvider());
|
|
40
|
+
ctx.registerService("context", manager);
|
|
41
|
+
ctx.log.info("Context service ready");
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
var context_default = contextPlugin;
|
|
45
|
+
|
|
46
|
+
export {
|
|
47
|
+
context_default
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=chunk-ZHGPZBS4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/plugins/context/index.ts"],"sourcesContent":["import type { OpenACPPlugin, InstallContext } from '../../core/plugin/types.js'\nimport { ContextManager } from './context-manager.js'\nimport { EntireProvider } from './entire/entire-provider.js'\n\nconst contextPlugin: OpenACPPlugin = {\n name: '@openacp/context',\n version: '1.0.0',\n description: 'Conversation context management with pluggable providers',\n essential: false,\n permissions: ['services:register'],\n\n async install(ctx: InstallContext) {\n const { settings, terminal } = ctx\n\n // No interactive prompts needed — save defaults\n await settings.setAll({ enabled: true })\n terminal.log.success('Context defaults saved')\n },\n\n async configure(ctx: InstallContext) {\n const { terminal, settings } = ctx\n const current = await settings.getAll()\n\n const toggle = await terminal.confirm({\n message: `Context service is ${current.enabled !== false ? 'enabled' : 'disabled'}. Toggle?`,\n initialValue: false,\n })\n if (toggle) {\n const newState = current.enabled === false\n await settings.set('enabled', newState)\n terminal.log.success(`Context service ${newState ? 'enabled' : 'disabled'}`)\n }\n },\n\n async uninstall(ctx: InstallContext, opts: { purge: boolean }) {\n if (opts.purge) {\n await ctx.settings.clear()\n ctx.terminal.log.success('Context settings cleared')\n }\n },\n\n async setup(ctx) {\n const manager = new ContextManager()\n manager.register(new EntireProvider())\n ctx.registerService('context', manager)\n ctx.log.info('Context service ready')\n },\n}\n\nexport default contextPlugin\n"],"mappings":";;;;;;AAIA,IAAM,gBAA+B;AAAA,EACnC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa,CAAC,mBAAmB;AAAA,EAEjC,MAAM,QAAQ,KAAqB;AACjC,UAAM,EAAE,UAAU,SAAS,IAAI;AAG/B,UAAM,SAAS,OAAO,EAAE,SAAS,KAAK,CAAC;AACvC,aAAS,IAAI,QAAQ,wBAAwB;AAAA,EAC/C;AAAA,EAEA,MAAM,UAAU,KAAqB;AACnC,UAAM,EAAE,UAAU,SAAS,IAAI;AAC/B,UAAM,UAAU,MAAM,SAAS,OAAO;AAEtC,UAAM,SAAS,MAAM,SAAS,QAAQ;AAAA,MACpC,SAAS,sBAAsB,QAAQ,YAAY,QAAQ,YAAY,UAAU;AAAA,MACjF,cAAc;AAAA,IAChB,CAAC;AACD,QAAI,QAAQ;AACV,YAAM,WAAW,QAAQ,YAAY;AACrC,YAAM,SAAS,IAAI,WAAW,QAAQ;AACtC,eAAS,IAAI,QAAQ,mBAAmB,WAAW,YAAY,UAAU,EAAE;AAAA,IAC7E;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,KAAqB,MAA0B;AAC7D,QAAI,KAAK,OAAO;AACd,YAAM,IAAI,SAAS,MAAM;AACzB,UAAI,SAAS,IAAI,QAAQ,0BAA0B;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,KAAK;AACf,UAAM,UAAU,IAAI,eAAe;AACnC,YAAQ,SAAS,IAAI,eAAe,CAAC;AACrC,QAAI,gBAAgB,WAAW,OAAO;AACtC,QAAI,IAAI,KAAK,uBAAuB;AAAA,EACtC;AACF;AAEA,IAAO,kBAAQ;","names":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// src/core/agent-dependencies.ts
|
|
1
|
+
// src/core/agents/agent-dependencies.ts
|
|
2
2
|
import { execFileSync } from "child_process";
|
|
3
3
|
import * as fs from "fs";
|
|
4
4
|
import * as path from "path";
|
|
@@ -279,4 +279,4 @@ export {
|
|
|
279
279
|
checkDependencies,
|
|
280
280
|
checkRuntimeAvailable
|
|
281
281
|
};
|
|
282
|
-
//# sourceMappingURL=chunk-
|
|
282
|
+
//# sourceMappingURL=chunk-ZSLHHQPQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/agents/agent-dependencies.ts"],"sourcesContent":["import { execFileSync } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { AvailabilityResult } from \"../types.js\";\n\nexport interface AgentDependency {\n command: string;\n label: string;\n installHint: string;\n}\n\nexport interface AgentSetupInfo {\n setupSteps: string[];\n loginCommand?: string;\n}\n\nexport interface AgentIntegrationSpec {\n hookEvent: string;\n settingsPath: string;\n settingsFormat: \"settings_json\" | \"hooks_json\";\n hooksDirPath: string;\n outputFormat: \"plaintext\" | \"json\";\n sessionIdField: string;\n commandsPath?: string;\n handoffCommandName?: string;\n commandFormat?: \"markdown\" | \"skill\";\n sessionIdVar?: string;\n workingDirVar?: string;\n}\n\nexport interface AgentCapability {\n supportsResume: boolean;\n resumeCommand?: (sessionId: string) => string;\n integration?: AgentIntegrationSpec;\n}\n\nconst AGENT_DEPENDENCIES: Record<string, AgentDependency[]> = {\n \"claude-acp\": [\n {\n command: \"claude\",\n label: \"Claude CLI\",\n installHint: \"npm install -g @anthropic-ai/claude-code\",\n },\n ],\n \"codex-acp\": [\n {\n command: \"codex\",\n label: \"Codex CLI\",\n installHint: \"npm install -g @openai/codex\",\n },\n ],\n};\n\nconst AGENT_SETUP: Record<string, AgentSetupInfo> = {\n // --- Agents requiring their own CLI installed first ---\n \"claude-acp\": {\n setupSteps: [\n \"Install Claude CLI: npm install -g @anthropic-ai/claude-code\",\n \"Login: claude login (opens browser for Anthropic account)\",\n ],\n loginCommand: \"claude login\",\n },\n \"codex-acp\": {\n setupSteps: [\n \"Install Codex CLI: npm install -g @openai/codex\",\n \"Login: codex (select 'Sign in with ChatGPT')\",\n \"Or set API key: export OPENAI_API_KEY=<your-key>\",\n ],\n loginCommand: \"codex\",\n },\n\n // --- Agents with built-in auth (npx handles download) ---\n \"gemini\": {\n setupSteps: [\n \"Login with Google: openacp agents run gemini (select 'Sign in with Google')\",\n \"Or set API key: export GEMINI_API_KEY=<key> (get from aistudio.google.com/apikey)\",\n \"Free tier: 60 requests/min, 1000 requests/day\",\n ],\n loginCommand: \"openacp agents run gemini\",\n },\n \"github-copilot-cli\": {\n setupSteps: [\n \"Requires active GitHub Copilot subscription\",\n \"Login: openacp agents run copilot (use /login command inside CLI)\",\n \"Or set token: export GITHUB_TOKEN=<personal-access-token>\",\n ],\n loginCommand: \"openacp agents run copilot\",\n },\n \"cline\": {\n setupSteps: [\n \"Setup: openacp agents run cline (guided API key setup on first run)\",\n \"Supports: Anthropic, OpenAI, Gemini, AWS Bedrock, Azure, Ollama, and more\",\n \"Or set env: export ANTHROPIC_API_KEY=<key> (or OPENAI_API_KEY, etc.)\",\n ],\n loginCommand: \"openacp agents run cline\",\n },\n \"auggie\": {\n setupSteps: [\n \"Login: openacp agents run auggie (opens browser for Augment account on first run)\",\n ],\n loginCommand: \"openacp agents run auggie\",\n },\n \"qwen-code\": {\n setupSteps: [\n \"Login: openacp agents run qwen (use /auth command, select 'Qwen OAuth')\",\n \"Free: 1000 requests/day with Qwen OAuth\",\n \"Or set API key: export OPENAI_API_KEY=<key> in ~/.qwen/settings.json\",\n ],\n loginCommand: \"openacp agents run qwen\",\n },\n\n // --- Agents requiring API keys via env vars ---\n \"kimi\": {\n setupSteps: [\n \"Login: openacp agents run kimi (use /login command inside CLI)\",\n \"Recommended: select 'Kimi Code' for browser-based OAuth\",\n \"Or select another provider and enter API key manually\",\n ],\n loginCommand: \"openacp agents run kimi\",\n },\n \"cursor\": {\n setupSteps: [\n \"Requires active Cursor subscription\",\n \"Login: openacp agents run cursor (opens browser for Cursor account)\",\n ],\n loginCommand: \"openacp agents run cursor\",\n },\n\n // --- Agents with provider selection on first run ---\n \"goose\": {\n setupSteps: [\n \"First run auto-enters setup mode — choose your LLM provider\",\n \"Options: OpenAI, Anthropic, Google Gemini, OpenRouter, or local models\",\n \"Set provider API key: export OPENAI_API_KEY=<key> (or other provider)\",\n \"Reconfigure anytime: goose configure\",\n ],\n },\n \"junie\": {\n setupSteps: [\n \"Bring Your Own Key (BYOK) — provide API key from any supported provider\",\n \"Supports: OpenAI, Anthropic, Gemini, xAI, OpenRouter\",\n \"Free tier: up to $50 with Gemini 3 Flash included\",\n \"Set key via env or first-run setup prompt\",\n ],\n },\n \"kilo\": {\n setupSteps: [\n \"Options: bring your own API keys (Anthropic, OpenAI, Google) or use Kilo Gateway\",\n \"Kilo Gateway: pay-as-you-go, includes free models — no API key needed\",\n \"BYOK: set provider key, e.g. export ANTHROPIC_API_KEY=<key>\",\n ],\n },\n \"mistral-vibe\": {\n setupSteps: [\n \"Get API key from console.mistral.ai/codestral/cli\",\n \"Or sign up for Free/Pro/Team plan at mistral.ai\",\n \"Set key when prompted on first run\",\n ],\n },\n \"deepagents\": {\n setupSteps: [\n \"Powered by LangChain — set your LLM provider API key\",\n \"Example: export OPENAI_API_KEY=<key> or export ANTHROPIC_API_KEY=<key>\",\n ],\n },\n\n // --- Agents that work out of the box (no setup / minimal setup) ---\n \"crow-cli\": {\n setupSteps: [\n \"Requires uvx (Python package runner): pip install uv\",\n \"Bring your own API key for your chosen LLM provider\",\n ],\n },\n \"fast-agent\": {\n setupSteps: [\n \"Requires uvx (Python package runner): pip install uv\",\n \"Configure LLM provider in agent config file\",\n ],\n },\n};\n\nexport function getAgentSetup(registryId: string): AgentSetupInfo | undefined {\n return AGENT_SETUP[registryId];\n}\n\nconst AGENT_CAPABILITIES: Record<string, AgentCapability> = {\n claude: {\n supportsResume: true,\n resumeCommand: (sid) => `claude --resume ${sid}`,\n integration: {\n hookEvent: \"UserPromptSubmit\",\n settingsPath: \"~/.claude/settings.json\",\n settingsFormat: \"settings_json\",\n hooksDirPath: \"~/.claude/hooks/\",\n outputFormat: \"plaintext\",\n sessionIdField: \".session_id\",\n commandsPath: \"~/.claude/commands/\",\n handoffCommandName: \"openacp:handoff\",\n commandFormat: \"markdown\",\n sessionIdVar: \"CLAUDE_SESSION_ID\",\n workingDirVar: \"CLAUDE_WORKING_DIR\",\n },\n },\n cursor: {\n supportsResume: true,\n resumeCommand: (sid) => `cursor --resume ${sid}`,\n integration: {\n hookEvent: \"beforeSubmitPrompt\",\n settingsPath: \"~/.cursor/hooks.json\",\n settingsFormat: \"hooks_json\",\n hooksDirPath: \"~/.cursor/hooks/\",\n outputFormat: \"json\",\n sessionIdField: \".conversation_id\",\n commandsPath: \"~/.cursor/skills/\",\n handoffCommandName: \"openacp-handoff\",\n commandFormat: \"skill\",\n },\n },\n gemini: {\n supportsResume: true,\n resumeCommand: (sid) => `gemini --resume ${sid}`,\n integration: {\n hookEvent: \"BeforeAgent\",\n settingsPath: \"~/.gemini/settings.json\",\n settingsFormat: \"settings_json\",\n hooksDirPath: \"~/.gemini/hooks/\",\n outputFormat: \"json\",\n sessionIdField: \".session_id\",\n },\n },\n cline: {\n supportsResume: true,\n resumeCommand: () => `cline --continue`,\n integration: {\n hookEvent: \"TaskStart\",\n settingsPath: \"~/.cline/settings.json\",\n settingsFormat: \"settings_json\",\n hooksDirPath: \"~/.cline/hooks/\",\n outputFormat: \"json\",\n sessionIdField: \".session_id\",\n },\n },\n codex: {\n supportsResume: true,\n resumeCommand: (sid) => `codex resume ${sid}`,\n },\n kilo: {\n supportsResume: true,\n resumeCommand: () => `kilo --continue`,\n },\n amp: {\n supportsResume: true,\n resumeCommand: (sid) => `amp threads continue ${sid}`,\n },\n};\n\nexport const REGISTRY_AGENT_ALIASES: Record<string, string> = {\n \"claude-acp\": \"claude\",\n \"codex-acp\": \"codex\",\n \"gemini\": \"gemini\",\n \"cursor\": \"cursor\",\n \"github-copilot-cli\": \"copilot\",\n \"cline\": \"cline\",\n \"goose\": \"goose\",\n \"kilo\": \"kilo\",\n \"qwen-code\": \"qwen\",\n};\n\nexport function getAgentAlias(registryId: string): string {\n return REGISTRY_AGENT_ALIASES[registryId] ?? registryId;\n}\n\nexport function getAgentDependencies(registryId: string): AgentDependency[] {\n return AGENT_DEPENDENCIES[registryId] ?? [];\n}\n\nexport function getAgentCapabilities(agentName: string): AgentCapability {\n return AGENT_CAPABILITIES[agentName] ?? { supportsResume: false };\n}\n\nexport function listAgentsWithIntegration(): string[] {\n return Object.entries(AGENT_CAPABILITIES)\n .filter(([, cap]) => cap.integration != null)\n .map(([key]) => key);\n}\n\nexport function commandExists(cmd: string): boolean {\n try {\n execFileSync(\"which\", [cmd], { stdio: \"pipe\" });\n return true;\n } catch {\n // not in PATH\n }\n // Check node_modules/.bin (walks up from cwd)\n let dir = process.cwd();\n while (true) {\n const binPath = path.join(dir, \"node_modules\", \".bin\", cmd);\n if (fs.existsSync(binPath)) return true;\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return false;\n}\n\nexport function checkDependencies(registryId: string): AvailabilityResult {\n const deps = getAgentDependencies(registryId);\n if (deps.length === 0) return { available: true };\n\n const missing = deps.filter((d) => !commandExists(d.command));\n if (missing.length === 0) return { available: true };\n\n return {\n available: false,\n reason: `Requires: ${missing.map((m) => m.label).join(\", \")}`,\n missing: missing.map((m) => ({ label: m.label, installHint: m.installHint })),\n };\n}\n\nexport function checkRuntimeAvailable(runtime: \"npx\" | \"uvx\"): boolean {\n return commandExists(runtime);\n}\n"],"mappings":"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","names":[]}
|