@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
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
PRODUCT_GUIDE,
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
SendQueue,
|
|
4
|
+
ToolCallTracker
|
|
5
|
+
} from "./chunk-5ZOFBTOR.js";
|
|
6
|
+
import {
|
|
7
|
+
BaseRenderer,
|
|
8
|
+
MessagingAdapter,
|
|
5
9
|
extractContentText,
|
|
6
10
|
formatTokens,
|
|
7
11
|
formatToolSummary,
|
|
@@ -11,38 +15,35 @@ import {
|
|
|
11
15
|
splitMessage,
|
|
12
16
|
stripCodeFences,
|
|
13
17
|
truncateContent
|
|
14
|
-
} from "./chunk-
|
|
15
|
-
import {
|
|
16
|
-
CheckpointReader,
|
|
17
|
-
DEFAULT_MAX_TOKENS
|
|
18
|
-
} from "./chunk-LGP2YGRL.js";
|
|
19
|
-
import {
|
|
20
|
-
ChannelAdapter
|
|
21
|
-
} from "./chunk-LBIKITQT.js";
|
|
22
|
-
import {
|
|
23
|
-
DoctorEngine
|
|
24
|
-
} from "./chunk-NVPG6JCL.js";
|
|
18
|
+
} from "./chunk-V2M243KZ.js";
|
|
25
19
|
import {
|
|
26
20
|
buildMenuKeyboard,
|
|
27
21
|
buildSkillMessages,
|
|
28
22
|
handleClear,
|
|
29
23
|
handleHelp,
|
|
30
24
|
handleMenu
|
|
31
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-AFKX424Q.js";
|
|
26
|
+
import {
|
|
27
|
+
DoctorEngine
|
|
28
|
+
} from "./chunk-L7YNNBI5.js";
|
|
29
|
+
import {
|
|
30
|
+
CheckpointReader,
|
|
31
|
+
DEFAULT_MAX_TOKENS
|
|
32
|
+
} from "./chunk-APS6UEFU.js";
|
|
32
33
|
import {
|
|
33
34
|
getConfigValue,
|
|
34
35
|
getSafeFields,
|
|
35
36
|
isHotReloadable,
|
|
36
37
|
resolveOptions
|
|
37
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-ODUM3D6X.js";
|
|
38
39
|
import {
|
|
39
40
|
createChildLogger
|
|
40
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-XMMAGAT4.js";
|
|
41
42
|
|
|
42
|
-
// src/
|
|
43
|
+
// src/plugins/telegram/adapter.ts
|
|
43
44
|
import { Bot, InputFile } from "grammy";
|
|
44
45
|
|
|
45
|
-
// src/
|
|
46
|
+
// src/plugins/telegram/topics.ts
|
|
46
47
|
async function ensureTopics(bot, chatId, config, saveConfig) {
|
|
47
48
|
let notificationTopicId = config.notificationTopicId;
|
|
48
49
|
let assistantTopicId = config.assistantTopicId;
|
|
@@ -79,10 +80,10 @@ function buildDeepLink(chatId, threadId, messageId) {
|
|
|
79
80
|
return `https://t.me/c/${cleanId}/${threadId}`;
|
|
80
81
|
}
|
|
81
82
|
|
|
82
|
-
// src/
|
|
83
|
+
// src/plugins/telegram/commands/new-session.ts
|
|
83
84
|
import { InlineKeyboard as InlineKeyboard2 } from "grammy";
|
|
84
85
|
|
|
85
|
-
// src/
|
|
86
|
+
// src/plugins/telegram/formatting.ts
|
|
86
87
|
function escapeHtml(text) {
|
|
87
88
|
if (!text) return "";
|
|
88
89
|
return text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
@@ -169,6 +170,23 @@ function formatViewerLinks(links, filePath) {
|
|
|
169
170
|
\u{1F4DD} <a href="${escapeHtml(links.diff)}">View diff${fileName ? ` \u2014 ${escapeHtml(fileName)}` : ""}</a>`;
|
|
170
171
|
return text;
|
|
171
172
|
}
|
|
173
|
+
function formatPlan(plan, verbosity = "medium") {
|
|
174
|
+
const { entries } = plan;
|
|
175
|
+
if (verbosity === "medium") {
|
|
176
|
+
const done = entries.filter((e) => e.status === "completed").length;
|
|
177
|
+
return `\u{1F4CB} <b>Plan:</b> ${done}/${entries.length} steps completed`;
|
|
178
|
+
}
|
|
179
|
+
const statusIcon = {
|
|
180
|
+
pending: "\u2B1C",
|
|
181
|
+
in_progress: "\u{1F504}",
|
|
182
|
+
completed: "\u2705"
|
|
183
|
+
};
|
|
184
|
+
const lines = entries.map(
|
|
185
|
+
(e, i) => `${statusIcon[e.status] || "\u2B1C"} ${i + 1}. ${escapeHtml(e.content)}`
|
|
186
|
+
);
|
|
187
|
+
return `<b>Plan:</b>
|
|
188
|
+
${lines.join("\n")}`;
|
|
189
|
+
}
|
|
172
190
|
function formatUsage(usage, verbosity = "medium") {
|
|
173
191
|
const { tokensUsed, contextSize, cost } = usage;
|
|
174
192
|
if (tokensUsed == null) return "\u{1F4CA} Usage data unavailable";
|
|
@@ -228,7 +246,7 @@ function splitMessage2(text, maxLength = 3800) {
|
|
|
228
246
|
return splitMessage(text, maxLength);
|
|
229
247
|
}
|
|
230
248
|
|
|
231
|
-
// src/
|
|
249
|
+
// src/plugins/telegram/commands/admin.ts
|
|
232
250
|
import { InlineKeyboard } from "grammy";
|
|
233
251
|
var log = createChildLogger({ module: "telegram-cmd-admin" });
|
|
234
252
|
function setupDangerousModeCallbacks(bot, core) {
|
|
@@ -586,7 +604,7 @@ async function handleRestart(ctx, core) {
|
|
|
586
604
|
await core.requestRestart();
|
|
587
605
|
}
|
|
588
606
|
|
|
589
|
-
// src/
|
|
607
|
+
// src/plugins/telegram/commands/new-session.ts
|
|
590
608
|
var log2 = createChildLogger({ module: "telegram-cmd-new-session" });
|
|
591
609
|
var pendingNewSessions = /* @__PURE__ */ new Map();
|
|
592
610
|
var PENDING_TIMEOUT_MS = 5 * 60 * 1e3;
|
|
@@ -974,7 +992,7 @@ Or just the folder name like <code>my-project</code> (will use ${core.configMana
|
|
|
974
992
|
});
|
|
975
993
|
}
|
|
976
994
|
|
|
977
|
-
// src/
|
|
995
|
+
// src/plugins/telegram/commands/session.ts
|
|
978
996
|
import { InlineKeyboard as InlineKeyboard3 } from "grammy";
|
|
979
997
|
var log3 = createChildLogger({ module: "telegram-cmd-session" });
|
|
980
998
|
async function handleCancel(ctx, core, assistant) {
|
|
@@ -1399,7 +1417,7 @@ async function handleSummaryCallback(ctx, core, chatId) {
|
|
|
1399
1417
|
}
|
|
1400
1418
|
}
|
|
1401
1419
|
|
|
1402
|
-
// src/
|
|
1420
|
+
// src/plugins/telegram/commands/agents.ts
|
|
1403
1421
|
import { InlineKeyboard as InlineKeyboard4 } from "grammy";
|
|
1404
1422
|
var AGENTS_PER_PAGE = 6;
|
|
1405
1423
|
async function handleAgents(ctx, core, page = 0) {
|
|
@@ -1598,10 +1616,10 @@ Downloading... ${bar} ${percent}%`, { parse_mode: "HTML" });
|
|
|
1598
1616
|
};
|
|
1599
1617
|
const result = await catalog.install(nameOrId, progress);
|
|
1600
1618
|
if (result.ok) {
|
|
1601
|
-
const { getAgentCapabilities } = await import("./agent-dependencies-
|
|
1619
|
+
const { getAgentCapabilities } = await import("./agent-dependencies-WS7Z2DFW.js");
|
|
1602
1620
|
const caps = getAgentCapabilities(result.agentKey);
|
|
1603
1621
|
if (caps.integration) {
|
|
1604
|
-
const { installIntegration } = await import("./integrate-
|
|
1622
|
+
const { installIntegration } = await import("./integrate-5C6KSU6D.js");
|
|
1605
1623
|
const intResult = await installIntegration(result.agentKey, caps.integration);
|
|
1606
1624
|
if (intResult.success) {
|
|
1607
1625
|
try {
|
|
@@ -1668,10 +1686,10 @@ function buildProgressBar(percent) {
|
|
|
1668
1686
|
return "\u2588".repeat(filled) + "\u2591".repeat(empty);
|
|
1669
1687
|
}
|
|
1670
1688
|
|
|
1671
|
-
// src/
|
|
1689
|
+
// src/plugins/telegram/commands/integrate.ts
|
|
1672
1690
|
import { InlineKeyboard as InlineKeyboard5 } from "grammy";
|
|
1673
1691
|
async function handleIntegrate(ctx, _core) {
|
|
1674
|
-
const { listIntegrations } = await import("./integrate-
|
|
1692
|
+
const { listIntegrations } = await import("./integrate-5C6KSU6D.js");
|
|
1675
1693
|
const agents = listIntegrations();
|
|
1676
1694
|
const keyboard = new InlineKeyboard5();
|
|
1677
1695
|
for (const agent of agents) {
|
|
@@ -1704,7 +1722,7 @@ function setupIntegrateCallbacks(bot, core) {
|
|
|
1704
1722
|
} catch {
|
|
1705
1723
|
}
|
|
1706
1724
|
if (data === "i:back") {
|
|
1707
|
-
const { listIntegrations } = await import("./integrate-
|
|
1725
|
+
const { listIntegrations } = await import("./integrate-5C6KSU6D.js");
|
|
1708
1726
|
const agents = listIntegrations();
|
|
1709
1727
|
const keyboard2 = new InlineKeyboard5();
|
|
1710
1728
|
for (const agent of agents) {
|
|
@@ -1724,7 +1742,7 @@ Select an agent to manage its integrations.`,
|
|
|
1724
1742
|
const agentMatch = data.match(/^i:agent:(.+)$/);
|
|
1725
1743
|
if (agentMatch) {
|
|
1726
1744
|
const agentName2 = agentMatch[1];
|
|
1727
|
-
const { getIntegration: getIntegration2 } = await import("./integrate-
|
|
1745
|
+
const { getIntegration: getIntegration2 } = await import("./integrate-5C6KSU6D.js");
|
|
1728
1746
|
const integration2 = getIntegration2(agentName2);
|
|
1729
1747
|
if (!integration2) {
|
|
1730
1748
|
await ctx.reply(`\u274C No integration available for '${escapeHtml(agentName2)}'.`, { parse_mode: "HTML" });
|
|
@@ -1751,7 +1769,7 @@ ${integration2.items.map((i) => `\u2022 <b>${escapeHtml(i.name)}</b> \u2014 ${es
|
|
|
1751
1769
|
const action = actionMatch[1];
|
|
1752
1770
|
const agentName = actionMatch[2];
|
|
1753
1771
|
const itemId = actionMatch[3];
|
|
1754
|
-
const { getIntegration } = await import("./integrate-
|
|
1772
|
+
const { getIntegration } = await import("./integrate-5C6KSU6D.js");
|
|
1755
1773
|
const integration = getIntegration(agentName);
|
|
1756
1774
|
if (!integration) return;
|
|
1757
1775
|
const item = integration.items.find((i) => i.id === itemId);
|
|
@@ -1786,7 +1804,7 @@ ${resultText}`,
|
|
|
1786
1804
|
});
|
|
1787
1805
|
}
|
|
1788
1806
|
|
|
1789
|
-
// src/
|
|
1807
|
+
// src/plugins/telegram/commands/resume.ts
|
|
1790
1808
|
import * as fs from "fs";
|
|
1791
1809
|
import * as path from "path";
|
|
1792
1810
|
import * as os from "os";
|
|
@@ -2063,7 +2081,7 @@ Or just the folder name (will use workspace baseDir)`,
|
|
|
2063
2081
|
});
|
|
2064
2082
|
}
|
|
2065
2083
|
|
|
2066
|
-
// src/
|
|
2084
|
+
// src/plugins/telegram/commands/settings.ts
|
|
2067
2085
|
import { InlineKeyboard as InlineKeyboard7 } from "grammy";
|
|
2068
2086
|
var log5 = createChildLogger({ module: "telegram-settings" });
|
|
2069
2087
|
function buildSettingsKeyboard(core) {
|
|
@@ -2235,7 +2253,7 @@ Tap to change:`, {
|
|
|
2235
2253
|
await ctx.answerCallbackQuery();
|
|
2236
2254
|
} catch {
|
|
2237
2255
|
}
|
|
2238
|
-
const { buildMenuKeyboard: buildMenuKeyboard3 } = await import("./menu-
|
|
2256
|
+
const { buildMenuKeyboard: buildMenuKeyboard3 } = await import("./menu-YDQ2LWAR.js");
|
|
2239
2257
|
try {
|
|
2240
2258
|
await ctx.editMessageText(`<b>OpenACP Menu</b>
|
|
2241
2259
|
Choose an action:`, {
|
|
@@ -2272,7 +2290,7 @@ function buildNestedUpdate(dotPath, value) {
|
|
|
2272
2290
|
return result;
|
|
2273
2291
|
}
|
|
2274
2292
|
|
|
2275
|
-
// src/
|
|
2293
|
+
// src/plugins/telegram/commands/doctor.ts
|
|
2276
2294
|
import { InlineKeyboard as InlineKeyboard8 } from "grammy";
|
|
2277
2295
|
var log6 = createChildLogger({ module: "telegram-cmd-doctor" });
|
|
2278
2296
|
var pendingFixesStore = /* @__PURE__ */ new Map();
|
|
@@ -2378,7 +2396,7 @@ function setupDoctorCallbacks(bot) {
|
|
|
2378
2396
|
});
|
|
2379
2397
|
}
|
|
2380
2398
|
|
|
2381
|
-
// src/
|
|
2399
|
+
// src/plugins/telegram/commands/tunnel.ts
|
|
2382
2400
|
import { InlineKeyboard as InlineKeyboard9 } from "grammy";
|
|
2383
2401
|
var log7 = createChildLogger({ module: "telegram-cmd-tunnel" });
|
|
2384
2402
|
async function handleTunnel(ctx, core) {
|
|
@@ -2534,7 +2552,7 @@ function setupTunnelCallbacks(bot, core) {
|
|
|
2534
2552
|
});
|
|
2535
2553
|
}
|
|
2536
2554
|
|
|
2537
|
-
// src/
|
|
2555
|
+
// src/plugins/telegram/commands/index.ts
|
|
2538
2556
|
function setupCommands(bot, core, chatId, assistant) {
|
|
2539
2557
|
bot.command("new", (ctx) => handleNew(ctx, core, chatId, assistant));
|
|
2540
2558
|
bot.command("newchat", (ctx) => handleNewChat(ctx, core, chatId));
|
|
@@ -2653,7 +2671,7 @@ var STATIC_COMMANDS = [
|
|
|
2653
2671
|
{ command: "resume", description: "Resume with conversation history from Entire checkpoints" }
|
|
2654
2672
|
];
|
|
2655
2673
|
|
|
2656
|
-
// src/
|
|
2674
|
+
// src/plugins/telegram/permissions.ts
|
|
2657
2675
|
import { InlineKeyboard as InlineKeyboard10 } from "grammy";
|
|
2658
2676
|
import { nanoid } from "nanoid";
|
|
2659
2677
|
var log8 = createChildLogger({ module: "telegram-permissions" });
|
|
@@ -2733,7 +2751,7 @@ ${escapeHtml(request.description)}`,
|
|
|
2733
2751
|
}
|
|
2734
2752
|
};
|
|
2735
2753
|
|
|
2736
|
-
// src/
|
|
2754
|
+
// src/plugins/telegram/assistant.ts
|
|
2737
2755
|
var log9 = createChildLogger({ module: "telegram-assistant" });
|
|
2738
2756
|
async function spawnAssistant(core, adapter, assistantTopicId) {
|
|
2739
2757
|
const config = core.configManager.get();
|
|
@@ -2934,7 +2952,7 @@ function redirectToAssistant(chatId, assistantTopicId) {
|
|
|
2934
2952
|
return `\u{1F4AC} Please use the <a href="${link}">\u{1F916} Assistant</a> topic to chat with OpenACP.`;
|
|
2935
2953
|
}
|
|
2936
2954
|
|
|
2937
|
-
// src/
|
|
2955
|
+
// src/plugins/telegram/activity.ts
|
|
2938
2956
|
var log10 = createChildLogger({ module: "telegram:activity" });
|
|
2939
2957
|
var THINKING_REFRESH_MS = 15e3;
|
|
2940
2958
|
var THINKING_MAX_MS = 3 * 60 * 1e3;
|
|
@@ -3232,73 +3250,7 @@ var ActivityTracker = class {
|
|
|
3232
3250
|
}
|
|
3233
3251
|
};
|
|
3234
3252
|
|
|
3235
|
-
// src/
|
|
3236
|
-
var TelegramSendQueue = class {
|
|
3237
|
-
items = [];
|
|
3238
|
-
processing = false;
|
|
3239
|
-
lastExec = 0;
|
|
3240
|
-
minInterval;
|
|
3241
|
-
constructor(minInterval = 3e3) {
|
|
3242
|
-
this.minInterval = minInterval;
|
|
3243
|
-
}
|
|
3244
|
-
enqueue(fn, opts) {
|
|
3245
|
-
const type = opts?.type ?? "other";
|
|
3246
|
-
const key = opts?.key;
|
|
3247
|
-
return new Promise((resolve, reject) => {
|
|
3248
|
-
if (type === "text" && key) {
|
|
3249
|
-
const idx = this.items.findIndex(
|
|
3250
|
-
(item) => item.type === "text" && item.key === key
|
|
3251
|
-
);
|
|
3252
|
-
if (idx !== -1) {
|
|
3253
|
-
this.items[idx].resolve(void 0);
|
|
3254
|
-
this.items[idx] = { fn, type, key, resolve, reject };
|
|
3255
|
-
this.scheduleProcess();
|
|
3256
|
-
return;
|
|
3257
|
-
}
|
|
3258
|
-
}
|
|
3259
|
-
this.items.push({ fn, type, key, resolve, reject });
|
|
3260
|
-
this.scheduleProcess();
|
|
3261
|
-
});
|
|
3262
|
-
}
|
|
3263
|
-
onRateLimited() {
|
|
3264
|
-
const remaining = [];
|
|
3265
|
-
for (const item of this.items) {
|
|
3266
|
-
if (item.type === "text") {
|
|
3267
|
-
item.resolve(void 0);
|
|
3268
|
-
} else {
|
|
3269
|
-
remaining.push(item);
|
|
3270
|
-
}
|
|
3271
|
-
}
|
|
3272
|
-
this.items = remaining;
|
|
3273
|
-
}
|
|
3274
|
-
scheduleProcess() {
|
|
3275
|
-
if (this.processing) return;
|
|
3276
|
-
if (this.items.length === 0) return;
|
|
3277
|
-
const elapsed = Date.now() - this.lastExec;
|
|
3278
|
-
const delay = Math.max(0, this.minInterval - elapsed);
|
|
3279
|
-
this.processing = true;
|
|
3280
|
-
setTimeout(() => void this.processNext(), delay);
|
|
3281
|
-
}
|
|
3282
|
-
async processNext() {
|
|
3283
|
-
const item = this.items.shift();
|
|
3284
|
-
if (!item) {
|
|
3285
|
-
this.processing = false;
|
|
3286
|
-
return;
|
|
3287
|
-
}
|
|
3288
|
-
try {
|
|
3289
|
-
const result = await item.fn();
|
|
3290
|
-
item.resolve(result);
|
|
3291
|
-
} catch (err) {
|
|
3292
|
-
item.reject(err);
|
|
3293
|
-
} finally {
|
|
3294
|
-
this.lastExec = Date.now();
|
|
3295
|
-
this.processing = false;
|
|
3296
|
-
this.scheduleProcess();
|
|
3297
|
-
}
|
|
3298
|
-
}
|
|
3299
|
-
};
|
|
3300
|
-
|
|
3301
|
-
// src/adapters/telegram/action-detect.ts
|
|
3253
|
+
// src/plugins/telegram/action-detect.ts
|
|
3302
3254
|
import { nanoid as nanoid2 } from "nanoid";
|
|
3303
3255
|
import { InlineKeyboard as InlineKeyboard11 } from "grammy";
|
|
3304
3256
|
var CMD_NEW_RE = /\/new(?:\s+([^\s\u0080-\uFFFF]+)(?:\s+([^\s\u0080-\uFFFF]+))?)?/;
|
|
@@ -3455,32 +3407,25 @@ function setupActionCallbacks(bot, core, chatId, getAssistantSessionId) {
|
|
|
3455
3407
|
});
|
|
3456
3408
|
}
|
|
3457
3409
|
|
|
3458
|
-
// src/
|
|
3410
|
+
// src/plugins/telegram/tool-call-tracker.ts
|
|
3459
3411
|
var log11 = createChildLogger({ module: "tool-call-tracker" });
|
|
3460
|
-
var
|
|
3412
|
+
var TelegramToolCallTracker = class {
|
|
3461
3413
|
constructor(bot, chatId, sendQueue) {
|
|
3462
3414
|
this.bot = bot;
|
|
3463
3415
|
this.chatId = chatId;
|
|
3464
3416
|
this.sendQueue = sendQueue;
|
|
3465
3417
|
}
|
|
3466
|
-
|
|
3418
|
+
tracker = new ToolCallTracker();
|
|
3419
|
+
/** Platform-specific ready-promise per tool call, keyed by `${sessionId}:${toolId}`. */
|
|
3420
|
+
readyMap = /* @__PURE__ */ new Map();
|
|
3467
3421
|
async trackNewCall(sessionId, threadId, meta, verbosity = "medium") {
|
|
3468
|
-
if (!this.sessions.has(sessionId)) {
|
|
3469
|
-
this.sessions.set(sessionId, /* @__PURE__ */ new Map());
|
|
3470
|
-
}
|
|
3471
3422
|
let resolveReady;
|
|
3472
3423
|
const ready = new Promise((r) => {
|
|
3473
3424
|
resolveReady = r;
|
|
3474
3425
|
});
|
|
3475
|
-
|
|
3476
|
-
|
|
3477
|
-
|
|
3478
|
-
kind: meta.kind,
|
|
3479
|
-
rawInput: meta.rawInput,
|
|
3480
|
-
viewerLinks: meta.viewerLinks,
|
|
3481
|
-
viewerFilePath: meta.viewerFilePath,
|
|
3482
|
-
ready
|
|
3483
|
-
});
|
|
3426
|
+
const key = `${sessionId}:${meta.id}`;
|
|
3427
|
+
this.readyMap.set(key, { ready });
|
|
3428
|
+
this.tracker.track(sessionId, meta, "0");
|
|
3484
3429
|
try {
|
|
3485
3430
|
const msg = await this.sendQueue.enqueue(
|
|
3486
3431
|
() => this.bot.api.sendMessage(this.chatId, formatToolCall(meta, verbosity), {
|
|
@@ -3489,53 +3434,60 @@ var ToolCallTracker = class {
|
|
|
3489
3434
|
disable_notification: true
|
|
3490
3435
|
})
|
|
3491
3436
|
);
|
|
3492
|
-
const
|
|
3493
|
-
|
|
3437
|
+
const tracked = this.tracker.update(sessionId, meta.id, meta.status ?? "running");
|
|
3438
|
+
if (tracked) {
|
|
3439
|
+
tracked.messageId = String(msg.message_id);
|
|
3440
|
+
}
|
|
3494
3441
|
} finally {
|
|
3495
3442
|
resolveReady();
|
|
3496
3443
|
}
|
|
3497
3444
|
}
|
|
3498
3445
|
async updateCall(sessionId, meta, verbosity = "medium") {
|
|
3499
|
-
const
|
|
3500
|
-
|
|
3501
|
-
|
|
3502
|
-
|
|
3503
|
-
|
|
3504
|
-
|
|
3505
|
-
|
|
3506
|
-
|
|
3507
|
-
|
|
3508
|
-
if (meta.viewerFilePath) toolState.viewerFilePath = meta.viewerFilePath;
|
|
3509
|
-
if (meta.name) toolState.name = meta.name;
|
|
3510
|
-
if (meta.kind) toolState.kind = meta.kind;
|
|
3446
|
+
const key = `${sessionId}:${meta.id}`;
|
|
3447
|
+
const readyState = this.readyMap.get(key);
|
|
3448
|
+
const tracked = this.tracker.update(sessionId, meta.id, meta.status, {
|
|
3449
|
+
viewerLinks: meta.viewerLinks,
|
|
3450
|
+
viewerFilePath: meta.viewerFilePath,
|
|
3451
|
+
name: meta.name,
|
|
3452
|
+
kind: meta.kind
|
|
3453
|
+
});
|
|
3454
|
+
if (!tracked) return;
|
|
3511
3455
|
const isTerminal = meta.status === "completed" || meta.status === "failed";
|
|
3512
3456
|
if (!isTerminal) return;
|
|
3513
|
-
|
|
3457
|
+
if (readyState) {
|
|
3458
|
+
await readyState.ready;
|
|
3459
|
+
}
|
|
3460
|
+
const msgId = Number(tracked.messageId);
|
|
3514
3461
|
log11.debug(
|
|
3515
3462
|
{
|
|
3516
3463
|
toolId: meta.id,
|
|
3517
3464
|
status: meta.status,
|
|
3518
|
-
hasViewerLinks: !!
|
|
3519
|
-
viewerLinks:
|
|
3520
|
-
name:
|
|
3521
|
-
msgId
|
|
3465
|
+
hasViewerLinks: !!tracked.viewerLinks,
|
|
3466
|
+
viewerLinks: tracked.viewerLinks,
|
|
3467
|
+
name: tracked.name,
|
|
3468
|
+
msgId
|
|
3522
3469
|
},
|
|
3523
3470
|
"Tool completed, preparing edit"
|
|
3524
3471
|
);
|
|
3525
3472
|
const merged = {
|
|
3526
|
-
|
|
3527
|
-
name:
|
|
3528
|
-
kind:
|
|
3529
|
-
rawInput:
|
|
3530
|
-
viewerLinks:
|
|
3531
|
-
viewerFilePath:
|
|
3473
|
+
id: meta.id,
|
|
3474
|
+
name: tracked.name,
|
|
3475
|
+
kind: tracked.kind,
|
|
3476
|
+
rawInput: tracked.rawInput,
|
|
3477
|
+
viewerLinks: tracked.viewerLinks,
|
|
3478
|
+
viewerFilePath: tracked.viewerFilePath,
|
|
3479
|
+
displaySummary: tracked.displaySummary,
|
|
3480
|
+
displayTitle: tracked.displayTitle,
|
|
3481
|
+
displayKind: tracked.displayKind,
|
|
3482
|
+
status: meta.status,
|
|
3483
|
+
content: meta.content
|
|
3532
3484
|
};
|
|
3533
3485
|
const formattedText = formatToolUpdate(merged, verbosity);
|
|
3534
3486
|
try {
|
|
3535
3487
|
await this.sendQueue.enqueue(
|
|
3536
3488
|
() => this.bot.api.editMessageText(
|
|
3537
3489
|
this.chatId,
|
|
3538
|
-
|
|
3490
|
+
msgId,
|
|
3539
3491
|
formattedText,
|
|
3540
3492
|
{ parse_mode: "HTML" }
|
|
3541
3493
|
)
|
|
@@ -3544,7 +3496,7 @@ var ToolCallTracker = class {
|
|
|
3544
3496
|
log11.warn(
|
|
3545
3497
|
{
|
|
3546
3498
|
err,
|
|
3547
|
-
msgId
|
|
3499
|
+
msgId,
|
|
3548
3500
|
textLen: formattedText.length,
|
|
3549
3501
|
hasViewerLinks: !!merged.viewerLinks
|
|
3550
3502
|
},
|
|
@@ -3553,11 +3505,15 @@ var ToolCallTracker = class {
|
|
|
3553
3505
|
}
|
|
3554
3506
|
}
|
|
3555
3507
|
cleanup(sessionId) {
|
|
3556
|
-
this.
|
|
3508
|
+
const active = this.tracker.getActive(sessionId);
|
|
3509
|
+
for (const tool of active) {
|
|
3510
|
+
this.readyMap.delete(`${sessionId}:${tool.id}`);
|
|
3511
|
+
}
|
|
3512
|
+
this.tracker.clear(sessionId);
|
|
3557
3513
|
}
|
|
3558
3514
|
};
|
|
3559
3515
|
|
|
3560
|
-
// src/
|
|
3516
|
+
// src/plugins/telegram/streaming.ts
|
|
3561
3517
|
var FLUSH_INTERVAL = 5e3;
|
|
3562
3518
|
var MessageDraft = class {
|
|
3563
3519
|
constructor(bot, chatId, threadId, sendQueue, sessionId) {
|
|
@@ -3739,7 +3695,7 @@ var MessageDraft = class {
|
|
|
3739
3695
|
}
|
|
3740
3696
|
};
|
|
3741
3697
|
|
|
3742
|
-
// src/
|
|
3698
|
+
// src/plugins/telegram/draft-manager.ts
|
|
3743
3699
|
var DraftManager = class {
|
|
3744
3700
|
constructor(bot, chatId, sendQueue) {
|
|
3745
3701
|
this.bot = bot;
|
|
@@ -3811,7 +3767,7 @@ var DraftManager = class {
|
|
|
3811
3767
|
}
|
|
3812
3768
|
};
|
|
3813
3769
|
|
|
3814
|
-
// src/
|
|
3770
|
+
// src/plugins/telegram/skill-command-manager.ts
|
|
3815
3771
|
var log12 = createChildLogger({ module: "skill-commands" });
|
|
3816
3772
|
var SkillCommandManager = class {
|
|
3817
3773
|
// sessionId → pinned msgId
|
|
@@ -3906,7 +3862,57 @@ var SkillCommandManager = class {
|
|
|
3906
3862
|
}
|
|
3907
3863
|
};
|
|
3908
3864
|
|
|
3909
|
-
// src/
|
|
3865
|
+
// src/plugins/telegram/renderer.ts
|
|
3866
|
+
var TelegramRenderer = class extends BaseRenderer {
|
|
3867
|
+
renderToolCall(content, verbosity) {
|
|
3868
|
+
const meta = content.metadata ?? {};
|
|
3869
|
+
return { body: formatToolCall(meta, verbosity), format: "html" };
|
|
3870
|
+
}
|
|
3871
|
+
renderToolUpdate(content, verbosity) {
|
|
3872
|
+
const meta = content.metadata ?? {};
|
|
3873
|
+
return { body: formatToolUpdate(meta, verbosity), format: "html" };
|
|
3874
|
+
}
|
|
3875
|
+
renderPlan(content, verbosity) {
|
|
3876
|
+
const meta = content.metadata;
|
|
3877
|
+
return { body: formatPlan({ entries: meta?.entries ?? [] }, verbosity), format: "html" };
|
|
3878
|
+
}
|
|
3879
|
+
renderUsage(content, verbosity) {
|
|
3880
|
+
const meta = content.metadata;
|
|
3881
|
+
return { body: formatUsage(meta ?? {}, verbosity), format: "html" };
|
|
3882
|
+
}
|
|
3883
|
+
renderError(content) {
|
|
3884
|
+
return { body: `\u274C <b>Error:</b> ${escapeHtml(content.text)}`, format: "html" };
|
|
3885
|
+
}
|
|
3886
|
+
renderNotification(notification) {
|
|
3887
|
+
const emoji = {
|
|
3888
|
+
completed: "\u2705",
|
|
3889
|
+
error: "\u274C",
|
|
3890
|
+
permission: "\u{1F510}",
|
|
3891
|
+
input_required: "\u{1F4AC}",
|
|
3892
|
+
budget_warning: "\u26A0\uFE0F"
|
|
3893
|
+
};
|
|
3894
|
+
let text = `${emoji[notification.type] || "\u2139\uFE0F"} <b>${escapeHtml(notification.sessionName || "Session")}</b>
|
|
3895
|
+
`;
|
|
3896
|
+
text += escapeHtml(notification.summary);
|
|
3897
|
+
return { body: text, format: "html" };
|
|
3898
|
+
}
|
|
3899
|
+
renderSystemMessage(content) {
|
|
3900
|
+
return { body: escapeHtml(content.text), format: "html" };
|
|
3901
|
+
}
|
|
3902
|
+
renderModeChange(content) {
|
|
3903
|
+
const modeId = content.metadata?.modeId ?? "";
|
|
3904
|
+
return { body: `\u{1F504} <b>Mode:</b> ${escapeHtml(String(modeId))}`, format: "html" };
|
|
3905
|
+
}
|
|
3906
|
+
renderConfigUpdate() {
|
|
3907
|
+
return { body: "\u2699\uFE0F <b>Config updated</b>", format: "html" };
|
|
3908
|
+
}
|
|
3909
|
+
renderModelUpdate(content) {
|
|
3910
|
+
const modelId = content.metadata?.modelId ?? "";
|
|
3911
|
+
return { body: `\u{1F916} <b>Model:</b> ${escapeHtml(String(modelId))}`, format: "html" };
|
|
3912
|
+
}
|
|
3913
|
+
};
|
|
3914
|
+
|
|
3915
|
+
// src/plugins/telegram/adapter.ts
|
|
3910
3916
|
var log13 = createChildLogger({ module: "telegram" });
|
|
3911
3917
|
function patchedFetch(input, init) {
|
|
3912
3918
|
if (init?.signal && !(init.signal instanceof AbortSignal)) {
|
|
@@ -3921,7 +3927,18 @@ function patchedFetch(input, init) {
|
|
|
3921
3927
|
}
|
|
3922
3928
|
return fetch(input, init);
|
|
3923
3929
|
}
|
|
3924
|
-
var TelegramAdapter = class extends
|
|
3930
|
+
var TelegramAdapter = class extends MessagingAdapter {
|
|
3931
|
+
name = "telegram";
|
|
3932
|
+
renderer = new TelegramRenderer();
|
|
3933
|
+
capabilities = {
|
|
3934
|
+
streaming: true,
|
|
3935
|
+
richFormatting: true,
|
|
3936
|
+
threads: true,
|
|
3937
|
+
reactions: true,
|
|
3938
|
+
fileUpload: true,
|
|
3939
|
+
voice: true
|
|
3940
|
+
};
|
|
3941
|
+
core;
|
|
3925
3942
|
bot;
|
|
3926
3943
|
telegramConfig;
|
|
3927
3944
|
permissionHandler;
|
|
@@ -3929,18 +3946,22 @@ var TelegramAdapter = class extends ChannelAdapter {
|
|
|
3929
3946
|
assistantInitializing = false;
|
|
3930
3947
|
notificationTopicId;
|
|
3931
3948
|
assistantTopicId;
|
|
3932
|
-
sendQueue = new
|
|
3949
|
+
sendQueue = new SendQueue({ minInterval: 3e3 });
|
|
3950
|
+
_sessionThreadIds = /* @__PURE__ */ new Map();
|
|
3933
3951
|
// Extracted managers
|
|
3934
3952
|
toolTracker;
|
|
3935
3953
|
draftManager;
|
|
3936
3954
|
skillManager;
|
|
3937
3955
|
fileService;
|
|
3938
3956
|
sessionTrackers = /* @__PURE__ */ new Map();
|
|
3939
|
-
|
|
3940
|
-
|
|
3941
|
-
|
|
3942
|
-
|
|
3943
|
-
|
|
3957
|
+
callbackCache = /* @__PURE__ */ new Map();
|
|
3958
|
+
callbackCounter = 0;
|
|
3959
|
+
getThreadId(sessionId) {
|
|
3960
|
+
const threadId = this._sessionThreadIds.get(sessionId);
|
|
3961
|
+
if (threadId === void 0) {
|
|
3962
|
+
throw new Error(`No threadId stored for session ${sessionId}`);
|
|
3963
|
+
}
|
|
3964
|
+
return threadId;
|
|
3944
3965
|
}
|
|
3945
3966
|
getOrCreateTracker(sessionId, threadId) {
|
|
3946
3967
|
let tracker = this.sessionTrackers.get(sessionId);
|
|
@@ -3956,7 +3977,11 @@ var TelegramAdapter = class extends ChannelAdapter {
|
|
|
3956
3977
|
return tracker;
|
|
3957
3978
|
}
|
|
3958
3979
|
constructor(core, config) {
|
|
3959
|
-
super(
|
|
3980
|
+
super(
|
|
3981
|
+
{ configManager: core.configManager },
|
|
3982
|
+
{ ...config, maxMessageLength: 4096, enabled: config.enabled ?? true }
|
|
3983
|
+
);
|
|
3984
|
+
this.core = core;
|
|
3960
3985
|
this.telegramConfig = config;
|
|
3961
3986
|
}
|
|
3962
3987
|
async start() {
|
|
@@ -3967,7 +3992,7 @@ var TelegramAdapter = class extends ChannelAdapter {
|
|
|
3967
3992
|
}
|
|
3968
3993
|
});
|
|
3969
3994
|
this.fileService = this.core.fileService;
|
|
3970
|
-
this.toolTracker = new
|
|
3995
|
+
this.toolTracker = new TelegramToolCallTracker(
|
|
3971
3996
|
this.bot,
|
|
3972
3997
|
this.telegramConfig.chatId,
|
|
3973
3998
|
this.sendQueue
|
|
@@ -4047,6 +4072,67 @@ var TelegramAdapter = class extends ChannelAdapter {
|
|
|
4047
4072
|
(sessionId) => this.core.sessionManager.getSession(sessionId),
|
|
4048
4073
|
(notification) => this.sendNotification(notification)
|
|
4049
4074
|
);
|
|
4075
|
+
this.bot.on("message:text", async (ctx, next) => {
|
|
4076
|
+
const text = ctx.message?.text;
|
|
4077
|
+
if (!text?.startsWith("/")) return next();
|
|
4078
|
+
const registry = this.core.lifecycleManager?.serviceRegistry?.get("command-registry");
|
|
4079
|
+
if (!registry) return next();
|
|
4080
|
+
const commandName = text.split(" ")[0].slice(1).split("@")[0];
|
|
4081
|
+
const def = registry.get(commandName);
|
|
4082
|
+
if (!def) return next();
|
|
4083
|
+
const chatId = ctx.chat.id;
|
|
4084
|
+
const topicId = ctx.message.message_thread_id;
|
|
4085
|
+
try {
|
|
4086
|
+
const sessionId = topicId != null ? this.core.sessionManager.getSessionByThread("telegram", String(topicId))?.id ?? null : null;
|
|
4087
|
+
const response = await registry.execute(text, {
|
|
4088
|
+
raw: "",
|
|
4089
|
+
sessionId,
|
|
4090
|
+
channelId: "telegram",
|
|
4091
|
+
userId: String(ctx.from?.id),
|
|
4092
|
+
reply: async (content) => {
|
|
4093
|
+
if (typeof content === "string") {
|
|
4094
|
+
await ctx.reply(content);
|
|
4095
|
+
} else if (typeof content === "object" && content !== null && "type" in content) {
|
|
4096
|
+
await this.renderCommandResponse(content, chatId, topicId);
|
|
4097
|
+
}
|
|
4098
|
+
}
|
|
4099
|
+
});
|
|
4100
|
+
if (response.type !== "silent") {
|
|
4101
|
+
await this.renderCommandResponse(response, chatId, topicId);
|
|
4102
|
+
}
|
|
4103
|
+
} catch (err) {
|
|
4104
|
+
await ctx.reply(`\u26A0\uFE0F Command failed: ${String(err)}`);
|
|
4105
|
+
}
|
|
4106
|
+
});
|
|
4107
|
+
this.bot.callbackQuery(/^c\//, async (ctx) => {
|
|
4108
|
+
const data = ctx.callbackQuery.data;
|
|
4109
|
+
const command = this.fromCallbackData(data);
|
|
4110
|
+
const registry = this.core.lifecycleManager?.serviceRegistry?.get("command-registry");
|
|
4111
|
+
if (!registry) return;
|
|
4112
|
+
const chatId = ctx.chat.id;
|
|
4113
|
+
const topicId = ctx.callbackQuery.message?.message_thread_id;
|
|
4114
|
+
try {
|
|
4115
|
+
const sessionId = topicId != null ? this.core.sessionManager.getSessionByThread("telegram", String(topicId))?.id ?? null : null;
|
|
4116
|
+
const response = await registry.execute(command, {
|
|
4117
|
+
raw: "",
|
|
4118
|
+
sessionId,
|
|
4119
|
+
channelId: "telegram",
|
|
4120
|
+
userId: String(ctx.from?.id),
|
|
4121
|
+
reply: async (content) => {
|
|
4122
|
+
if (typeof content === "string") {
|
|
4123
|
+
await ctx.editMessageText(content).catch(() => {
|
|
4124
|
+
});
|
|
4125
|
+
}
|
|
4126
|
+
}
|
|
4127
|
+
});
|
|
4128
|
+
await ctx.answerCallbackQuery();
|
|
4129
|
+
if (response.type !== "silent") {
|
|
4130
|
+
await this.renderCommandResponse(response, chatId, topicId);
|
|
4131
|
+
}
|
|
4132
|
+
} catch {
|
|
4133
|
+
await ctx.answerCallbackQuery({ text: "Command failed" });
|
|
4134
|
+
}
|
|
4135
|
+
});
|
|
4050
4136
|
setupDangerousModeCallbacks(this.bot, this.core);
|
|
4051
4137
|
setupTTSCallbacks(this.bot, this.core);
|
|
4052
4138
|
setupVerbosityCallbacks(this.bot, this.core);
|
|
@@ -4124,7 +4210,7 @@ var TelegramAdapter = class extends ChannelAdapter {
|
|
|
4124
4210
|
});
|
|
4125
4211
|
return;
|
|
4126
4212
|
}
|
|
4127
|
-
const { getAgentCapabilities } = await import("./agent-registry-
|
|
4213
|
+
const { getAgentCapabilities } = await import("./agent-registry-5LZT7CUB.js");
|
|
4128
4214
|
const caps = getAgentCapabilities(agentName);
|
|
4129
4215
|
if (!caps.supportsResume || !caps.resumeCommand) {
|
|
4130
4216
|
await ctx.reply("This agent does not support session transfer.", {
|
|
@@ -4211,6 +4297,87 @@ var TelegramAdapter = class extends ChannelAdapter {
|
|
|
4211
4297
|
await this.bot.stop();
|
|
4212
4298
|
log13.info("Telegram bot stopped");
|
|
4213
4299
|
}
|
|
4300
|
+
// --- CommandRegistry response rendering ---
|
|
4301
|
+
async renderCommandResponse(response, chatId, topicId) {
|
|
4302
|
+
switch (response.type) {
|
|
4303
|
+
case "text":
|
|
4304
|
+
await this.bot.api.sendMessage(chatId, response.text, {
|
|
4305
|
+
message_thread_id: topicId
|
|
4306
|
+
});
|
|
4307
|
+
break;
|
|
4308
|
+
case "error":
|
|
4309
|
+
await this.bot.api.sendMessage(
|
|
4310
|
+
chatId,
|
|
4311
|
+
`\u26A0\uFE0F ${response.message}`,
|
|
4312
|
+
{ message_thread_id: topicId }
|
|
4313
|
+
);
|
|
4314
|
+
break;
|
|
4315
|
+
case "menu": {
|
|
4316
|
+
const keyboard = response.options.map((opt) => [
|
|
4317
|
+
{
|
|
4318
|
+
text: `${opt.label}${opt.hint ? ` \u2014 ${opt.hint}` : ""}`,
|
|
4319
|
+
callback_data: this.toCallbackData(opt.command)
|
|
4320
|
+
}
|
|
4321
|
+
]);
|
|
4322
|
+
await this.bot.api.sendMessage(chatId, response.title, {
|
|
4323
|
+
message_thread_id: topicId,
|
|
4324
|
+
reply_markup: { inline_keyboard: keyboard }
|
|
4325
|
+
});
|
|
4326
|
+
break;
|
|
4327
|
+
}
|
|
4328
|
+
case "list": {
|
|
4329
|
+
const lines = response.items.map(
|
|
4330
|
+
(i) => `\u2022 ${i.label}${i.detail ? ` \u2014 ${i.detail}` : ""}`
|
|
4331
|
+
);
|
|
4332
|
+
const text = `${response.title}
|
|
4333
|
+
${lines.join("\n")}`;
|
|
4334
|
+
await this.bot.api.sendMessage(chatId, text, {
|
|
4335
|
+
message_thread_id: topicId
|
|
4336
|
+
});
|
|
4337
|
+
break;
|
|
4338
|
+
}
|
|
4339
|
+
case "confirm": {
|
|
4340
|
+
const buttons = [
|
|
4341
|
+
[
|
|
4342
|
+
{
|
|
4343
|
+
text: "\u2705 Yes",
|
|
4344
|
+
callback_data: this.toCallbackData(response.onYes)
|
|
4345
|
+
}
|
|
4346
|
+
]
|
|
4347
|
+
];
|
|
4348
|
+
if (response.onNo) {
|
|
4349
|
+
buttons[0].push({
|
|
4350
|
+
text: "\u274C No",
|
|
4351
|
+
callback_data: this.toCallbackData(response.onNo)
|
|
4352
|
+
});
|
|
4353
|
+
}
|
|
4354
|
+
await this.bot.api.sendMessage(chatId, response.question, {
|
|
4355
|
+
message_thread_id: topicId,
|
|
4356
|
+
reply_markup: { inline_keyboard: buttons }
|
|
4357
|
+
});
|
|
4358
|
+
break;
|
|
4359
|
+
}
|
|
4360
|
+
case "silent":
|
|
4361
|
+
break;
|
|
4362
|
+
}
|
|
4363
|
+
}
|
|
4364
|
+
toCallbackData(command) {
|
|
4365
|
+
const data = `c/${command}`;
|
|
4366
|
+
if (data.length <= 64) return data;
|
|
4367
|
+
const id = String(++this.callbackCounter);
|
|
4368
|
+
this.callbackCache.set(id, command);
|
|
4369
|
+
if (this.callbackCache.size > 1e3) {
|
|
4370
|
+
const first = this.callbackCache.keys().next().value;
|
|
4371
|
+
if (first) this.callbackCache.delete(first);
|
|
4372
|
+
}
|
|
4373
|
+
return `c/#${id}`;
|
|
4374
|
+
}
|
|
4375
|
+
fromCallbackData(data) {
|
|
4376
|
+
if (data.startsWith("c/#")) {
|
|
4377
|
+
return this.callbackCache.get(data.slice(3)) ?? data.slice(2);
|
|
4378
|
+
}
|
|
4379
|
+
return data.slice(2);
|
|
4380
|
+
}
|
|
4214
4381
|
setupRoutes() {
|
|
4215
4382
|
this.bot.on("message:text", async (ctx) => {
|
|
4216
4383
|
const threadId = ctx.message.message_thread_id;
|
|
@@ -4347,250 +4514,255 @@ var TelegramAdapter = class extends ChannelAdapter {
|
|
|
4347
4514
|
);
|
|
4348
4515
|
});
|
|
4349
4516
|
}
|
|
4350
|
-
// ---
|
|
4351
|
-
|
|
4352
|
-
|
|
4353
|
-
|
|
4354
|
-
|
|
4355
|
-
|
|
4356
|
-
|
|
4357
|
-
|
|
4358
|
-
|
|
4359
|
-
|
|
4360
|
-
}
|
|
4361
|
-
|
|
4362
|
-
const draft = this.draftManager.getOrCreate(ctx.sessionId, ctx.threadId);
|
|
4363
|
-
draft.append(content.text);
|
|
4364
|
-
this.draftManager.appendText(ctx.sessionId, content.text);
|
|
4365
|
-
},
|
|
4366
|
-
onToolCall: async (ctx, content) => {
|
|
4367
|
-
const meta = content.metadata ?? {};
|
|
4368
|
-
const toolName = meta.name ?? content.text ?? "Tool";
|
|
4369
|
-
const toolKind = String(meta.kind ?? "other");
|
|
4370
|
-
const noiseAction = evaluateNoise(toolName, toolKind, meta.rawInput);
|
|
4371
|
-
if (noiseAction === "hide" && this.verbosity !== "high") return;
|
|
4372
|
-
if (noiseAction === "collapse" && this.verbosity === "low") return;
|
|
4373
|
-
const tracker = this.getOrCreateTracker(ctx.sessionId, ctx.threadId);
|
|
4374
|
-
await tracker.onToolCall();
|
|
4375
|
-
await this.draftManager.finalize(
|
|
4376
|
-
ctx.sessionId,
|
|
4377
|
-
this.assistantSession?.id
|
|
4378
|
-
);
|
|
4379
|
-
await this.toolTracker.trackNewCall(
|
|
4380
|
-
ctx.sessionId,
|
|
4381
|
-
ctx.threadId,
|
|
4382
|
-
{
|
|
4383
|
-
id: meta.id ?? "",
|
|
4384
|
-
name: meta.name ?? content.text ?? "Tool",
|
|
4385
|
-
kind: meta.kind,
|
|
4386
|
-
status: meta.status,
|
|
4387
|
-
content: meta.content,
|
|
4388
|
-
rawInput: meta.rawInput,
|
|
4389
|
-
viewerLinks: meta.viewerLinks,
|
|
4390
|
-
viewerFilePath: meta.viewerFilePath,
|
|
4391
|
-
displaySummary: meta.displaySummary,
|
|
4392
|
-
displayTitle: meta.displayTitle,
|
|
4393
|
-
displayKind: meta.displayKind
|
|
4394
|
-
},
|
|
4395
|
-
this.verbosity
|
|
4517
|
+
// --- MessagingAdapter overrides ---
|
|
4518
|
+
async sendMessage(sessionId, content) {
|
|
4519
|
+
if (this.assistantInitializing && sessionId === this.assistantSession?.id)
|
|
4520
|
+
return;
|
|
4521
|
+
const session = this.core.sessionManager.getSession(sessionId);
|
|
4522
|
+
if (!session) return;
|
|
4523
|
+
if (session.archiving) return;
|
|
4524
|
+
const threadId = Number(session.threadId);
|
|
4525
|
+
if (!threadId || isNaN(threadId)) {
|
|
4526
|
+
log13.warn(
|
|
4527
|
+
{ sessionId, threadId: session.threadId },
|
|
4528
|
+
"Session has no valid threadId, skipping message"
|
|
4396
4529
|
);
|
|
4397
|
-
|
|
4398
|
-
|
|
4399
|
-
|
|
4400
|
-
|
|
4401
|
-
|
|
4530
|
+
return;
|
|
4531
|
+
}
|
|
4532
|
+
this._sessionThreadIds.set(sessionId, threadId);
|
|
4533
|
+
try {
|
|
4534
|
+
await super.sendMessage(sessionId, content);
|
|
4535
|
+
} finally {
|
|
4536
|
+
this._sessionThreadIds.delete(sessionId);
|
|
4537
|
+
}
|
|
4538
|
+
}
|
|
4539
|
+
async handleThought(sessionId, _content, _verbosity) {
|
|
4540
|
+
const threadId = this.getThreadId(sessionId);
|
|
4541
|
+
const tracker = this.getOrCreateTracker(sessionId, threadId);
|
|
4542
|
+
await tracker.onThought();
|
|
4543
|
+
}
|
|
4544
|
+
async handleText(sessionId, content) {
|
|
4545
|
+
const threadId = this.getThreadId(sessionId);
|
|
4546
|
+
if (!this.draftManager.hasDraft(sessionId)) {
|
|
4547
|
+
const tracker = this.getOrCreateTracker(sessionId, threadId);
|
|
4548
|
+
tracker.onTextStart().catch(() => {
|
|
4549
|
+
});
|
|
4550
|
+
}
|
|
4551
|
+
const draft = this.draftManager.getOrCreate(sessionId, threadId);
|
|
4552
|
+
draft.append(content.text);
|
|
4553
|
+
this.draftManager.appendText(sessionId, content.text);
|
|
4554
|
+
}
|
|
4555
|
+
async handleToolCall(sessionId, content, verbosity) {
|
|
4556
|
+
const threadId = this.getThreadId(sessionId);
|
|
4557
|
+
const meta = content.metadata ?? {};
|
|
4558
|
+
const tracker = this.getOrCreateTracker(sessionId, threadId);
|
|
4559
|
+
await tracker.onToolCall();
|
|
4560
|
+
await this.draftManager.finalize(
|
|
4561
|
+
sessionId,
|
|
4562
|
+
this.assistantSession?.id
|
|
4563
|
+
);
|
|
4564
|
+
await this.toolTracker.trackNewCall(
|
|
4565
|
+
sessionId,
|
|
4566
|
+
threadId,
|
|
4567
|
+
{
|
|
4568
|
+
id: meta.id ?? "",
|
|
4569
|
+
name: meta.name ?? content.text ?? "Tool",
|
|
4570
|
+
kind: meta.kind,
|
|
4571
|
+
status: meta.status,
|
|
4572
|
+
content: meta.content,
|
|
4573
|
+
rawInput: meta.rawInput,
|
|
4574
|
+
viewerLinks: meta.viewerLinks,
|
|
4575
|
+
viewerFilePath: meta.viewerFilePath,
|
|
4576
|
+
displaySummary: meta.displaySummary,
|
|
4577
|
+
displayTitle: meta.displayTitle,
|
|
4578
|
+
displayKind: meta.displayKind
|
|
4579
|
+
},
|
|
4580
|
+
verbosity
|
|
4581
|
+
);
|
|
4582
|
+
}
|
|
4583
|
+
async handleToolUpdate(sessionId, content, verbosity) {
|
|
4584
|
+
const meta = content.metadata ?? {};
|
|
4585
|
+
await this.toolTracker.updateCall(
|
|
4586
|
+
sessionId,
|
|
4587
|
+
{
|
|
4588
|
+
id: meta.id ?? "",
|
|
4589
|
+
name: meta.name ?? content.text ?? "",
|
|
4590
|
+
kind: meta.kind,
|
|
4591
|
+
status: meta.status ?? "completed",
|
|
4592
|
+
content: meta.content,
|
|
4593
|
+
rawInput: meta.rawInput,
|
|
4594
|
+
viewerLinks: meta.viewerLinks,
|
|
4595
|
+
viewerFilePath: meta.viewerFilePath,
|
|
4596
|
+
displaySummary: meta.displaySummary,
|
|
4597
|
+
displayTitle: meta.displayTitle,
|
|
4598
|
+
displayKind: meta.displayKind
|
|
4599
|
+
},
|
|
4600
|
+
verbosity
|
|
4601
|
+
);
|
|
4602
|
+
}
|
|
4603
|
+
async handlePlan(sessionId, content, verbosity) {
|
|
4604
|
+
const threadId = this.getThreadId(sessionId);
|
|
4605
|
+
const meta = content.metadata ?? {};
|
|
4606
|
+
const entries = meta.entries ?? [];
|
|
4607
|
+
const tracker = this.getOrCreateTracker(sessionId, threadId);
|
|
4608
|
+
await tracker.onPlan(
|
|
4609
|
+
entries.map((e) => ({
|
|
4610
|
+
content: e.content,
|
|
4611
|
+
status: e.status,
|
|
4612
|
+
priority: e.priority ?? "medium"
|
|
4613
|
+
})),
|
|
4614
|
+
verbosity
|
|
4615
|
+
);
|
|
4616
|
+
}
|
|
4617
|
+
async handleUsage(sessionId, content, verbosity) {
|
|
4618
|
+
const threadId = this.getThreadId(sessionId);
|
|
4619
|
+
const meta = content.metadata;
|
|
4620
|
+
await this.draftManager.finalize(
|
|
4621
|
+
sessionId,
|
|
4622
|
+
this.assistantSession?.id
|
|
4623
|
+
);
|
|
4624
|
+
const tracker = this.getOrCreateTracker(sessionId, threadId);
|
|
4625
|
+
await tracker.sendUsage(meta ?? {}, verbosity);
|
|
4626
|
+
if (this.notificationTopicId && sessionId !== this.assistantSession?.id) {
|
|
4627
|
+
const sess = this.core.sessionManager.getSession(sessionId);
|
|
4628
|
+
const sessionName = sess?.name || "Session";
|
|
4629
|
+
const chatIdStr = String(this.telegramConfig.chatId);
|
|
4630
|
+
const numericId = chatIdStr.startsWith("-100") ? chatIdStr.slice(4) : chatIdStr.replace("-", "");
|
|
4631
|
+
const usageMsgId = tracker.getUsageMsgId();
|
|
4632
|
+
const deepLink = usageMsgId ? `https://t.me/c/${numericId}/${threadId}/${usageMsgId}` : `https://t.me/c/${numericId}/${threadId}`;
|
|
4633
|
+
const text = `\u2705 <b>${escapeHtml(sessionName)}</b>
|
|
4634
|
+
Task completed.
|
|
4635
|
+
|
|
4636
|
+
<a href="${deepLink}">\u2192 Go to topic</a>`;
|
|
4637
|
+
this.sendQueue.enqueue(
|
|
4638
|
+
() => this.bot.api.sendMessage(this.telegramConfig.chatId, text, {
|
|
4639
|
+
message_thread_id: this.notificationTopicId,
|
|
4640
|
+
parse_mode: "HTML",
|
|
4641
|
+
disable_notification: false
|
|
4642
|
+
})
|
|
4643
|
+
).catch(() => {
|
|
4644
|
+
});
|
|
4645
|
+
}
|
|
4646
|
+
}
|
|
4647
|
+
async handleAttachment(sessionId, content) {
|
|
4648
|
+
const threadId = this.getThreadId(sessionId);
|
|
4649
|
+
if (!content.attachment) return;
|
|
4650
|
+
const { attachment } = content;
|
|
4651
|
+
if (attachment.size > 50 * 1024 * 1024) {
|
|
4652
|
+
log13.warn(
|
|
4402
4653
|
{
|
|
4403
|
-
|
|
4404
|
-
|
|
4405
|
-
|
|
4406
|
-
status: meta.status ?? "completed",
|
|
4407
|
-
content: meta.content,
|
|
4408
|
-
rawInput: meta.rawInput,
|
|
4409
|
-
viewerLinks: meta.viewerLinks,
|
|
4410
|
-
viewerFilePath: meta.viewerFilePath,
|
|
4411
|
-
displaySummary: meta.displaySummary,
|
|
4412
|
-
displayTitle: meta.displayTitle,
|
|
4413
|
-
displayKind: meta.displayKind
|
|
4654
|
+
sessionId,
|
|
4655
|
+
fileName: attachment.fileName,
|
|
4656
|
+
size: attachment.size
|
|
4414
4657
|
},
|
|
4415
|
-
|
|
4658
|
+
"File too large for Telegram (>50MB)"
|
|
4416
4659
|
);
|
|
4417
|
-
|
|
4418
|
-
|
|
4419
|
-
|
|
4420
|
-
|
|
4421
|
-
|
|
4422
|
-
|
|
4423
|
-
entries.map((e) => ({
|
|
4424
|
-
content: e.content,
|
|
4425
|
-
status: e.status,
|
|
4426
|
-
priority: e.priority ?? "medium"
|
|
4427
|
-
})),
|
|
4428
|
-
this.verbosity
|
|
4429
|
-
);
|
|
4430
|
-
},
|
|
4431
|
-
onUsage: async (ctx, content) => {
|
|
4432
|
-
const meta = content.metadata;
|
|
4433
|
-
await this.draftManager.finalize(
|
|
4434
|
-
ctx.sessionId,
|
|
4435
|
-
this.assistantSession?.id
|
|
4660
|
+
await this.sendQueue.enqueue(
|
|
4661
|
+
() => this.bot.api.sendMessage(
|
|
4662
|
+
this.telegramConfig.chatId,
|
|
4663
|
+
`\u26A0\uFE0F File too large to send (${Math.round(attachment.size / 1024 / 1024)}MB): ${escapeHtml(attachment.fileName)}`,
|
|
4664
|
+
{ message_thread_id: threadId, parse_mode: "HTML" }
|
|
4665
|
+
)
|
|
4436
4666
|
);
|
|
4437
|
-
|
|
4438
|
-
|
|
4439
|
-
|
|
4440
|
-
|
|
4441
|
-
|
|
4442
|
-
|
|
4443
|
-
|
|
4444
|
-
|
|
4445
|
-
const deepLink = usageMsgId ? `https://t.me/c/${numericId}/${ctx.threadId}/${usageMsgId}` : `https://t.me/c/${numericId}/${ctx.threadId}`;
|
|
4446
|
-
const text = `\u2705 <b>${escapeHtml(sessionName)}</b>
|
|
4447
|
-
Task completed.
|
|
4448
|
-
|
|
4449
|
-
<a href="${deepLink}">\u2192 Go to topic</a>`;
|
|
4450
|
-
this.sendQueue.enqueue(
|
|
4451
|
-
() => this.bot.api.sendMessage(this.telegramConfig.chatId, text, {
|
|
4452
|
-
message_thread_id: this.notificationTopicId,
|
|
4453
|
-
parse_mode: "HTML",
|
|
4454
|
-
disable_notification: false
|
|
4667
|
+
return;
|
|
4668
|
+
}
|
|
4669
|
+
try {
|
|
4670
|
+
const inputFile = new InputFile(attachment.filePath);
|
|
4671
|
+
if (attachment.type === "image") {
|
|
4672
|
+
await this.sendQueue.enqueue(
|
|
4673
|
+
() => this.bot.api.sendPhoto(this.telegramConfig.chatId, inputFile, {
|
|
4674
|
+
message_thread_id: threadId
|
|
4455
4675
|
})
|
|
4456
|
-
).catch(() => {
|
|
4457
|
-
});
|
|
4458
|
-
}
|
|
4459
|
-
},
|
|
4460
|
-
onAttachment: async (ctx, content) => {
|
|
4461
|
-
if (!content.attachment) return;
|
|
4462
|
-
const { attachment } = content;
|
|
4463
|
-
if (attachment.size > 50 * 1024 * 1024) {
|
|
4464
|
-
log13.warn(
|
|
4465
|
-
{
|
|
4466
|
-
sessionId: ctx.sessionId,
|
|
4467
|
-
fileName: attachment.fileName,
|
|
4468
|
-
size: attachment.size
|
|
4469
|
-
},
|
|
4470
|
-
"File too large for Telegram (>50MB)"
|
|
4471
4676
|
);
|
|
4677
|
+
} else if (attachment.type === "audio") {
|
|
4472
4678
|
await this.sendQueue.enqueue(
|
|
4473
|
-
() => this.bot.api.
|
|
4474
|
-
|
|
4475
|
-
|
|
4476
|
-
{ message_thread_id: ctx.threadId, parse_mode: "HTML" }
|
|
4477
|
-
)
|
|
4679
|
+
() => this.bot.api.sendVoice(this.telegramConfig.chatId, inputFile, {
|
|
4680
|
+
message_thread_id: threadId
|
|
4681
|
+
})
|
|
4478
4682
|
);
|
|
4479
|
-
|
|
4480
|
-
|
|
4481
|
-
|
|
4482
|
-
|
|
4483
|
-
if (attachment.type === "image") {
|
|
4484
|
-
await this.sendQueue.enqueue(
|
|
4485
|
-
() => this.bot.api.sendPhoto(this.telegramConfig.chatId, inputFile, {
|
|
4486
|
-
message_thread_id: ctx.threadId
|
|
4487
|
-
})
|
|
4488
|
-
);
|
|
4489
|
-
} else if (attachment.type === "audio") {
|
|
4490
|
-
await this.sendQueue.enqueue(
|
|
4491
|
-
() => this.bot.api.sendVoice(this.telegramConfig.chatId, inputFile, {
|
|
4492
|
-
message_thread_id: ctx.threadId
|
|
4493
|
-
})
|
|
4494
|
-
);
|
|
4495
|
-
const draft = this.draftManager.getDraft(ctx.sessionId);
|
|
4496
|
-
if (draft) {
|
|
4497
|
-
draft.stripPattern(/\[TTS\][\s\S]*?\[\/TTS\]/g).catch(() => {
|
|
4498
|
-
});
|
|
4499
|
-
}
|
|
4500
|
-
} else {
|
|
4501
|
-
await this.sendQueue.enqueue(
|
|
4502
|
-
() => this.bot.api.sendDocument(this.telegramConfig.chatId, inputFile, {
|
|
4503
|
-
message_thread_id: ctx.threadId
|
|
4504
|
-
})
|
|
4505
|
-
);
|
|
4683
|
+
const draft = this.draftManager.getDraft(sessionId);
|
|
4684
|
+
if (draft) {
|
|
4685
|
+
draft.stripPattern(/\[TTS\][\s\S]*?\[\/TTS\]/g).catch(() => {
|
|
4686
|
+
});
|
|
4506
4687
|
}
|
|
4507
|
-
} catch (err) {
|
|
4508
|
-
log13.error(
|
|
4509
|
-
{ err, sessionId: ctx.sessionId, fileName: attachment.fileName },
|
|
4510
|
-
"Failed to send attachment"
|
|
4511
|
-
);
|
|
4512
|
-
}
|
|
4513
|
-
},
|
|
4514
|
-
onSessionEnd: async (ctx, _content) => {
|
|
4515
|
-
await this.draftManager.finalize(
|
|
4516
|
-
ctx.sessionId,
|
|
4517
|
-
this.assistantSession?.id
|
|
4518
|
-
);
|
|
4519
|
-
this.draftManager.cleanup(ctx.sessionId);
|
|
4520
|
-
this.toolTracker.cleanup(ctx.sessionId);
|
|
4521
|
-
await this.skillManager.cleanup(ctx.sessionId);
|
|
4522
|
-
const tracker = this.sessionTrackers.get(ctx.sessionId);
|
|
4523
|
-
if (tracker) {
|
|
4524
|
-
await tracker.onComplete();
|
|
4525
|
-
tracker.destroy();
|
|
4526
|
-
this.sessionTrackers.delete(ctx.sessionId);
|
|
4527
4688
|
} else {
|
|
4528
4689
|
await this.sendQueue.enqueue(
|
|
4529
|
-
() => this.bot.api.
|
|
4530
|
-
|
|
4531
|
-
|
|
4532
|
-
{
|
|
4533
|
-
message_thread_id: ctx.threadId,
|
|
4534
|
-
parse_mode: "HTML",
|
|
4535
|
-
disable_notification: true
|
|
4536
|
-
}
|
|
4537
|
-
)
|
|
4690
|
+
() => this.bot.api.sendDocument(this.telegramConfig.chatId, inputFile, {
|
|
4691
|
+
message_thread_id: threadId
|
|
4692
|
+
})
|
|
4538
4693
|
);
|
|
4539
4694
|
}
|
|
4540
|
-
}
|
|
4541
|
-
|
|
4542
|
-
|
|
4543
|
-
|
|
4544
|
-
this.assistantSession?.id
|
|
4545
|
-
);
|
|
4546
|
-
const tracker = this.sessionTrackers.get(ctx.sessionId);
|
|
4547
|
-
if (tracker) {
|
|
4548
|
-
tracker.destroy();
|
|
4549
|
-
this.sessionTrackers.delete(ctx.sessionId);
|
|
4550
|
-
}
|
|
4551
|
-
await this.sendQueue.enqueue(
|
|
4552
|
-
() => this.bot.api.sendMessage(
|
|
4553
|
-
this.telegramConfig.chatId,
|
|
4554
|
-
`\u274C <b>Error:</b> ${escapeHtml(content.text)}`,
|
|
4555
|
-
{
|
|
4556
|
-
message_thread_id: ctx.threadId,
|
|
4557
|
-
parse_mode: "HTML",
|
|
4558
|
-
disable_notification: true
|
|
4559
|
-
}
|
|
4560
|
-
)
|
|
4695
|
+
} catch (err) {
|
|
4696
|
+
log13.error(
|
|
4697
|
+
{ err, sessionId, fileName: attachment.fileName },
|
|
4698
|
+
"Failed to send attachment"
|
|
4561
4699
|
);
|
|
4562
|
-
}
|
|
4563
|
-
|
|
4700
|
+
}
|
|
4701
|
+
}
|
|
4702
|
+
async handleSessionEnd(sessionId, _content) {
|
|
4703
|
+
const threadId = this.getThreadId(sessionId);
|
|
4704
|
+
await this.draftManager.finalize(
|
|
4705
|
+
sessionId,
|
|
4706
|
+
this.assistantSession?.id
|
|
4707
|
+
);
|
|
4708
|
+
this.draftManager.cleanup(sessionId);
|
|
4709
|
+
this.toolTracker.cleanup(sessionId);
|
|
4710
|
+
await this.skillManager.cleanup(sessionId);
|
|
4711
|
+
const tracker = this.sessionTrackers.get(sessionId);
|
|
4712
|
+
if (tracker) {
|
|
4713
|
+
await tracker.onComplete();
|
|
4714
|
+
tracker.destroy();
|
|
4715
|
+
this.sessionTrackers.delete(sessionId);
|
|
4716
|
+
} else {
|
|
4564
4717
|
await this.sendQueue.enqueue(
|
|
4565
4718
|
() => this.bot.api.sendMessage(
|
|
4566
4719
|
this.telegramConfig.chatId,
|
|
4567
|
-
|
|
4720
|
+
`\u2705 <b>Done</b>`,
|
|
4568
4721
|
{
|
|
4569
|
-
message_thread_id:
|
|
4722
|
+
message_thread_id: threadId,
|
|
4570
4723
|
parse_mode: "HTML",
|
|
4571
4724
|
disable_notification: true
|
|
4572
4725
|
}
|
|
4573
4726
|
)
|
|
4574
4727
|
);
|
|
4575
4728
|
}
|
|
4576
|
-
}
|
|
4577
|
-
|
|
4578
|
-
|
|
4579
|
-
|
|
4580
|
-
|
|
4581
|
-
|
|
4582
|
-
|
|
4583
|
-
|
|
4584
|
-
|
|
4585
|
-
|
|
4586
|
-
|
|
4587
|
-
{ sessionId, threadId: session.threadId },
|
|
4588
|
-
"Session has no valid threadId, skipping message"
|
|
4589
|
-
);
|
|
4590
|
-
return;
|
|
4729
|
+
}
|
|
4730
|
+
async handleError(sessionId, content) {
|
|
4731
|
+
const threadId = this.getThreadId(sessionId);
|
|
4732
|
+
await this.draftManager.finalize(
|
|
4733
|
+
sessionId,
|
|
4734
|
+
this.assistantSession?.id
|
|
4735
|
+
);
|
|
4736
|
+
const tracker = this.sessionTrackers.get(sessionId);
|
|
4737
|
+
if (tracker) {
|
|
4738
|
+
tracker.destroy();
|
|
4739
|
+
this.sessionTrackers.delete(sessionId);
|
|
4591
4740
|
}
|
|
4592
|
-
|
|
4593
|
-
|
|
4741
|
+
await this.sendQueue.enqueue(
|
|
4742
|
+
() => this.bot.api.sendMessage(
|
|
4743
|
+
this.telegramConfig.chatId,
|
|
4744
|
+
`\u274C <b>Error:</b> ${escapeHtml(content.text)}`,
|
|
4745
|
+
{
|
|
4746
|
+
message_thread_id: threadId,
|
|
4747
|
+
parse_mode: "HTML",
|
|
4748
|
+
disable_notification: true
|
|
4749
|
+
}
|
|
4750
|
+
)
|
|
4751
|
+
);
|
|
4752
|
+
}
|
|
4753
|
+
async handleSystem(sessionId, content) {
|
|
4754
|
+
const threadId = this.getThreadId(sessionId);
|
|
4755
|
+
await this.sendQueue.enqueue(
|
|
4756
|
+
() => this.bot.api.sendMessage(
|
|
4757
|
+
this.telegramConfig.chatId,
|
|
4758
|
+
escapeHtml(content.text),
|
|
4759
|
+
{
|
|
4760
|
+
message_thread_id: threadId,
|
|
4761
|
+
parse_mode: "HTML",
|
|
4762
|
+
disable_notification: true
|
|
4763
|
+
}
|
|
4764
|
+
)
|
|
4765
|
+
);
|
|
4594
4766
|
}
|
|
4595
4767
|
async sendPermissionRequest(sessionId, request) {
|
|
4596
4768
|
log13.info({ sessionId, requestId: request.id }, "Permission request sent");
|
|
@@ -4785,4 +4957,4 @@ Task completed.
|
|
|
4785
4957
|
export {
|
|
4786
4958
|
TelegramAdapter
|
|
4787
4959
|
};
|
|
4788
|
-
//# sourceMappingURL=chunk-
|
|
4960
|
+
//# sourceMappingURL=chunk-RKB2ZK6S.js.map
|