abtars 0.1.0-alpha.1

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.
Files changed (312) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +84 -0
  3. package/bundle/_registry.generated-M4WY2MMI.js +35 -0
  4. package/bundle/_registry.generated-M4WY2MMI.js.map +7 -0
  5. package/bundle/abtars-browser.js +162 -0
  6. package/bundle/abtars-browser.js.map +7 -0
  7. package/bundle/abtars-cli.js +1438 -0
  8. package/bundle/abtars-cli.js.map +7 -0
  9. package/bundle/abtars-restart.js +12 -0
  10. package/bundle/abtars-restart.js.map +7 -0
  11. package/bundle/abtars-rss.js +165 -0
  12. package/bundle/abtars-rss.js.map +7 -0
  13. package/bundle/abtars-task.js +258 -0
  14. package/bundle/abtars-task.js.map +7 -0
  15. package/bundle/abtars.js +4072 -0
  16. package/bundle/abtars.js.map +7 -0
  17. package/bundle/agent-api-rate-limit-OQNFMXTZ.js +38 -0
  18. package/bundle/agent-api-rate-limit-OQNFMXTZ.js.map +7 -0
  19. package/bundle/agent-registry-LT4JNQH6.js +18 -0
  20. package/bundle/agent-registry-LT4JNQH6.js.map +7 -0
  21. package/bundle/agents/default.md +29 -0
  22. package/bundle/anthropic-adapter-2APTH3LA.js +40 -0
  23. package/bundle/anthropic-adapter-2APTH3LA.js.map +7 -0
  24. package/bundle/bridge-lock-transport-4AC2G5G6.js +39 -0
  25. package/bundle/bridge-lock-transport-4AC2G5G6.js.map +7 -0
  26. package/bundle/browse-delivery-JXBY36GK.js +17 -0
  27. package/bundle/browse-delivery-JXBY36GK.js.map +7 -0
  28. package/bundle/browser-ELNDVPLC.js +18 -0
  29. package/bundle/browser-ELNDVPLC.js.map +7 -0
  30. package/bundle/capability-CIL3G4FI.js +17 -0
  31. package/bundle/capability-CIL3G4FI.js.map +7 -0
  32. package/bundle/chunk-265TPOPC.js +289 -0
  33. package/bundle/chunk-265TPOPC.js.map +7 -0
  34. package/bundle/chunk-2UENBO6M.js +223 -0
  35. package/bundle/chunk-2UENBO6M.js.map +7 -0
  36. package/bundle/chunk-2UPU3OW6.js +67 -0
  37. package/bundle/chunk-2UPU3OW6.js.map +7 -0
  38. package/bundle/chunk-2XU2X4OI.js +125 -0
  39. package/bundle/chunk-2XU2X4OI.js.map +7 -0
  40. package/bundle/chunk-3B7BBE4F.js +758 -0
  41. package/bundle/chunk-3B7BBE4F.js.map +7 -0
  42. package/bundle/chunk-3E545J66.js +69 -0
  43. package/bundle/chunk-3E545J66.js.map +7 -0
  44. package/bundle/chunk-5R2ANXQ7.js +510 -0
  45. package/bundle/chunk-5R2ANXQ7.js.map +7 -0
  46. package/bundle/chunk-6CPN4IGS.js +507 -0
  47. package/bundle/chunk-6CPN4IGS.js.map +7 -0
  48. package/bundle/chunk-6NR3OHEW.js +88 -0
  49. package/bundle/chunk-6NR3OHEW.js.map +7 -0
  50. package/bundle/chunk-6SETMHNN.js +206 -0
  51. package/bundle/chunk-6SETMHNN.js.map +7 -0
  52. package/bundle/chunk-6UCRKRWR.js +644 -0
  53. package/bundle/chunk-6UCRKRWR.js.map +7 -0
  54. package/bundle/chunk-AR6GO6YC.js +83 -0
  55. package/bundle/chunk-AR6GO6YC.js.map +7 -0
  56. package/bundle/chunk-AZJIODTQ.js +54 -0
  57. package/bundle/chunk-AZJIODTQ.js.map +7 -0
  58. package/bundle/chunk-BHMZ4RCC.js +3706 -0
  59. package/bundle/chunk-BHMZ4RCC.js.map +7 -0
  60. package/bundle/chunk-BQ2L4GMG.js +9175 -0
  61. package/bundle/chunk-BQ2L4GMG.js.map +7 -0
  62. package/bundle/chunk-BSSBCSCL.js +159 -0
  63. package/bundle/chunk-BSSBCSCL.js.map +7 -0
  64. package/bundle/chunk-BUUVFUPO.js +157 -0
  65. package/bundle/chunk-BUUVFUPO.js.map +7 -0
  66. package/bundle/chunk-CEVRHKJY.js +131 -0
  67. package/bundle/chunk-CEVRHKJY.js.map +7 -0
  68. package/bundle/chunk-CWOHNFUV.js +39 -0
  69. package/bundle/chunk-CWOHNFUV.js.map +7 -0
  70. package/bundle/chunk-D2DCBO6M.js +228 -0
  71. package/bundle/chunk-D2DCBO6M.js.map +7 -0
  72. package/bundle/chunk-FMWKEPM7.js +31 -0
  73. package/bundle/chunk-FMWKEPM7.js.map +7 -0
  74. package/bundle/chunk-GRNENTPA.js +145 -0
  75. package/bundle/chunk-GRNENTPA.js.map +7 -0
  76. package/bundle/chunk-GST5T3WZ.js +93 -0
  77. package/bundle/chunk-GST5T3WZ.js.map +7 -0
  78. package/bundle/chunk-GUQVJC3U.js +299 -0
  79. package/bundle/chunk-GUQVJC3U.js.map +7 -0
  80. package/bundle/chunk-HX7Y7EYP.js +3659 -0
  81. package/bundle/chunk-HX7Y7EYP.js.map +7 -0
  82. package/bundle/chunk-JCJS4ZIB.js +296 -0
  83. package/bundle/chunk-JCJS4ZIB.js.map +7 -0
  84. package/bundle/chunk-JW6RU47G.js +184 -0
  85. package/bundle/chunk-JW6RU47G.js.map +7 -0
  86. package/bundle/chunk-LSPKJQCI.js +24 -0
  87. package/bundle/chunk-LSPKJQCI.js.map +7 -0
  88. package/bundle/chunk-M6VBAPNT.js +16 -0
  89. package/bundle/chunk-M6VBAPNT.js.map +7 -0
  90. package/bundle/chunk-MPX525QO.js +129 -0
  91. package/bundle/chunk-MPX525QO.js.map +7 -0
  92. package/bundle/chunk-MW6WDLU7.js +130 -0
  93. package/bundle/chunk-MW6WDLU7.js.map +7 -0
  94. package/bundle/chunk-NT3OBORC.js +215 -0
  95. package/bundle/chunk-NT3OBORC.js.map +7 -0
  96. package/bundle/chunk-NWDBD4PA.js +50 -0
  97. package/bundle/chunk-NWDBD4PA.js.map +7 -0
  98. package/bundle/chunk-OP7BTAWY.js +29 -0
  99. package/bundle/chunk-OP7BTAWY.js.map +7 -0
  100. package/bundle/chunk-PLCY3GFH.js +77 -0
  101. package/bundle/chunk-PLCY3GFH.js.map +7 -0
  102. package/bundle/chunk-PNEDC45Y.js +97 -0
  103. package/bundle/chunk-PNEDC45Y.js.map +7 -0
  104. package/bundle/chunk-QBGBT5QS.js +81 -0
  105. package/bundle/chunk-QBGBT5QS.js.map +7 -0
  106. package/bundle/chunk-RVE2N7FA.js +70 -0
  107. package/bundle/chunk-RVE2N7FA.js.map +7 -0
  108. package/bundle/chunk-TZHIDLDS.js +71910 -0
  109. package/bundle/chunk-TZHIDLDS.js.map +7 -0
  110. package/bundle/chunk-UCQ2WC3B.js +126 -0
  111. package/bundle/chunk-UCQ2WC3B.js.map +7 -0
  112. package/bundle/chunk-UHRP745J.js +214 -0
  113. package/bundle/chunk-UHRP745J.js.map +7 -0
  114. package/bundle/chunk-V76TVMCM.js +58 -0
  115. package/bundle/chunk-V76TVMCM.js.map +7 -0
  116. package/bundle/chunk-VVEDVGCR.js +981 -0
  117. package/bundle/chunk-VVEDVGCR.js.map +7 -0
  118. package/bundle/chunk-W6FAL35D.js +102 -0
  119. package/bundle/chunk-W6FAL35D.js.map +7 -0
  120. package/bundle/chunk-X6TERNVJ.js +15902 -0
  121. package/bundle/chunk-X6TERNVJ.js.map +7 -0
  122. package/bundle/chunk-X76UX47U.js +47 -0
  123. package/bundle/chunk-X76UX47U.js.map +7 -0
  124. package/bundle/chunk-XREWVCUO.js +518 -0
  125. package/bundle/chunk-XREWVCUO.js.map +7 -0
  126. package/bundle/chunk-Y6XAEX2Q.js +408 -0
  127. package/bundle/chunk-Y6XAEX2Q.js.map +7 -0
  128. package/bundle/chunk-YOCTDKKL.js +28 -0
  129. package/bundle/chunk-YOCTDKKL.js.map +7 -0
  130. package/bundle/chunk-ZXPXCDA6.js +160 -0
  131. package/bundle/chunk-ZXPXCDA6.js.map +7 -0
  132. package/bundle/commands-BHVUOU3V.js +31 -0
  133. package/bundle/commands-BHVUOU3V.js.map +7 -0
  134. package/bundle/completion-buffer-P253ONKF.js +13 -0
  135. package/bundle/completion-buffer-P253ONKF.js.map +7 -0
  136. package/bundle/config-RGSDAPZN.js +19 -0
  137. package/bundle/config-RGSDAPZN.js.map +7 -0
  138. package/bundle/config-show-ERTATR6E.js +40 -0
  139. package/bundle/config-show-ERTATR6E.js.map +7 -0
  140. package/bundle/context-HCEGZNDC.js +72 -0
  141. package/bundle/context-HCEGZNDC.js.map +7 -0
  142. package/bundle/delegation-tools-GYTS2D6A.js +27 -0
  143. package/bundle/delegation-tools-GYTS2D6A.js.map +7 -0
  144. package/bundle/deploy-lib-import-32ZFKHWP.js +49 -0
  145. package/bundle/deploy-lib-import-32ZFKHWP.js.map +7 -0
  146. package/bundle/digital-signature-OFCGSHWO.js +13 -0
  147. package/bundle/digital-signature-OFCGSHWO.js.map +7 -0
  148. package/bundle/direct-api-transport-YR7SXXNN.js +860 -0
  149. package/bundle/direct-api-transport-YR7SXXNN.js.map +7 -0
  150. package/bundle/discord-adapter-YYWVMPPU.js +584 -0
  151. package/bundle/discord-adapter-YYWVMPPU.js.map +7 -0
  152. package/bundle/dist-MTMKARCP.js +1969 -0
  153. package/bundle/dist-MTMKARCP.js.map +7 -0
  154. package/bundle/dns-wakeup-27M7D2MR.js +107 -0
  155. package/bundle/dns-wakeup-27M7D2MR.js.map +7 -0
  156. package/bundle/doctor-QNUSDY73.js +248 -0
  157. package/bundle/doctor-QNUSDY73.js.map +7 -0
  158. package/bundle/ensure-invariants-NMXNS476.js +49 -0
  159. package/bundle/ensure-invariants-NMXNS476.js.map +7 -0
  160. package/bundle/env-schema-2KBHBDGN.js +19 -0
  161. package/bundle/env-schema-2KBHBDGN.js.map +7 -0
  162. package/bundle/esm-DDP6NCZG.js +100663 -0
  163. package/bundle/esm-DDP6NCZG.js.map +7 -0
  164. package/bundle/fallback-policy-L4QV2PEJ.js +46 -0
  165. package/bundle/fallback-policy-L4QV2PEJ.js.map +7 -0
  166. package/bundle/health-check-SPA7NT6N.js +56 -0
  167. package/bundle/health-check-SPA7NT6N.js.map +7 -0
  168. package/bundle/hook-system-6Q5YTR53.js +17 -0
  169. package/bundle/hook-system-6Q5YTR53.js.map +7 -0
  170. package/bundle/hotskills-K7BM4YLB.js +12 -0
  171. package/bundle/hotskills-K7BM4YLB.js.map +7 -0
  172. package/bundle/install-6HRZVKUM.js +15 -0
  173. package/bundle/install-6HRZVKUM.js.map +7 -0
  174. package/bundle/install-log-IAPHYKD4.js +28 -0
  175. package/bundle/install-log-IAPHYKD4.js.map +7 -0
  176. package/bundle/install-manifest-SPQRUNXL.js +102 -0
  177. package/bundle/install-manifest-SPQRUNXL.js.map +7 -0
  178. package/bundle/install-validate-PVLZXYLQ.js +53 -0
  179. package/bundle/install-validate-PVLZXYLQ.js.map +7 -0
  180. package/bundle/irc-adapter-OI5UZSQF.js +293 -0
  181. package/bundle/irc-adapter-OI5UZSQF.js.map +7 -0
  182. package/bundle/irc-config-55YO6EGB.js +88 -0
  183. package/bundle/irc-config-55YO6EGB.js.map +7 -0
  184. package/bundle/logs-ZNYXX5PA.js +19 -0
  185. package/bundle/logs-ZNYXX5PA.js.map +7 -0
  186. package/bundle/media-utils-XNNDTYFI.js +4662 -0
  187. package/bundle/media-utils-XNNDTYFI.js.map +7 -0
  188. package/bundle/message-pipeline-LLH5SYMO.js +33 -0
  189. package/bundle/message-pipeline-LLH5SYMO.js.map +7 -0
  190. package/bundle/meta.json +41304 -0
  191. package/bundle/model-health-registry-35LQNVQR.js +11 -0
  192. package/bundle/model-health-registry-35LQNVQR.js.map +7 -0
  193. package/bundle/notification-Y5S5MMLV.js +13 -0
  194. package/bundle/notification-Y5S5MMLV.js.map +7 -0
  195. package/bundle/openrouter-credits-EDY7ETAU.js +32 -0
  196. package/bundle/openrouter-credits-EDY7ETAU.js.map +7 -0
  197. package/bundle/passwd-RRFV4CC5.js +133 -0
  198. package/bundle/passwd-RRFV4CC5.js.map +7 -0
  199. package/bundle/paths-G33RZWZ7.js +17 -0
  200. package/bundle/paths-G33RZWZ7.js.map +7 -0
  201. package/bundle/peer-client-52XYMNI7.js +156 -0
  202. package/bundle/peer-client-52XYMNI7.js.map +7 -0
  203. package/bundle/peer-config-VK6EDLN5.js +16 -0
  204. package/bundle/peer-config-VK6EDLN5.js.map +7 -0
  205. package/bundle/peer-sessions-EAXTNQ36.js +49 -0
  206. package/bundle/peer-sessions-EAXTNQ36.js.map +7 -0
  207. package/bundle/pending-callback-RIMQZ7FJ.js +40 -0
  208. package/bundle/pending-callback-RIMQZ7FJ.js.map +7 -0
  209. package/bundle/phase-transport-KYERDL2O.js +22 -0
  210. package/bundle/phase-transport-KYERDL2O.js.map +7 -0
  211. package/bundle/public/css/dashboard.css +542 -0
  212. package/bundle/public/index.html +180 -0
  213. package/bundle/public/js/app.js +437 -0
  214. package/bundle/public/memory-universe.js +384 -0
  215. package/bundle/responses-adapter-AAQTY3K4.js +30 -0
  216. package/bundle/responses-adapter-AAQTY3K4.js.map +7 -0
  217. package/bundle/restore-ZE3SEPSS.js +46 -0
  218. package/bundle/restore-ZE3SEPSS.js.map +7 -0
  219. package/bundle/self-healer-utils-DMUUXC47.js +43 -0
  220. package/bundle/self-healer-utils-DMUUXC47.js.map +7 -0
  221. package/bundle/skill-stats-LLEXEXLR.js +22 -0
  222. package/bundle/skill-stats-LLEXEXLR.js.map +7 -0
  223. package/bundle/sleep-OYIUOVQD.js +19 -0
  224. package/bundle/sleep-OYIUOVQD.js.map +7 -0
  225. package/bundle/soul-loader-54WCVNLJ.js +16 -0
  226. package/bundle/soul-loader-54WCVNLJ.js.map +7 -0
  227. package/bundle/src-JL4PVO23.js +8 -0
  228. package/bundle/src-JL4PVO23.js.map +7 -0
  229. package/bundle/sse-parser-anthropic-P7CE2MH2.js +72 -0
  230. package/bundle/sse-parser-anthropic-P7CE2MH2.js.map +7 -0
  231. package/bundle/sse-parser-responses-EQQA5FWN.js +63 -0
  232. package/bundle/sse-parser-responses-EQQA5FWN.js.map +7 -0
  233. package/bundle/ssrf-guard-FZCBYIVW.js +64 -0
  234. package/bundle/ssrf-guard-FZCBYIVW.js.map +7 -0
  235. package/bundle/start-FH3GRMJ4.js +35 -0
  236. package/bundle/start-FH3GRMJ4.js.map +7 -0
  237. package/bundle/stream-single-WSG4D53C.js +33 -0
  238. package/bundle/stream-single-WSG4D53C.js.map +7 -0
  239. package/bundle/stt-2UH3RITX.js +14 -0
  240. package/bundle/stt-2UH3RITX.js.map +7 -0
  241. package/bundle/subagent-runtime-LE2ZXH3G.js +12 -0
  242. package/bundle/subagent-runtime-LE2ZXH3G.js.map +7 -0
  243. package/bundle/system-message-T5R3EYYN.js +30 -0
  244. package/bundle/system-message-T5R3EYYN.js.map +7 -0
  245. package/bundle/system-status-KQ6KHFJ6.js +189 -0
  246. package/bundle/system-status-KQ6KHFJ6.js.map +7 -0
  247. package/bundle/task-store-K7CQDEPI.js +22 -0
  248. package/bundle/task-store-K7CQDEPI.js.map +7 -0
  249. package/bundle/telegram-adapter-2V3XUMT5.js +1060 -0
  250. package/bundle/telegram-adapter-2V3XUMT5.js.map +7 -0
  251. package/bundle/tool-registry-MU3OX4UI.js +38 -0
  252. package/bundle/tool-registry-MU3OX4UI.js.map +7 -0
  253. package/bundle/tool-sandbox-VYOK4ZOA.js +20 -0
  254. package/bundle/tool-sandbox-VYOK4ZOA.js.map +7 -0
  255. package/bundle/transport-config-YLXU33RO.js +57 -0
  256. package/bundle/transport-config-YLXU33RO.js.map +7 -0
  257. package/bundle/update-QCW5LXRN.js +13 -0
  258. package/bundle/update-QCW5LXRN.js.map +7 -0
  259. package/bundle/update-check-27KZSAP6.js +12 -0
  260. package/bundle/update-check-27KZSAP6.js.map +7 -0
  261. package/bundle/usage-tracker-OVVEVMOY.js +17 -0
  262. package/bundle/usage-tracker-OVVEVMOY.js.map +7 -0
  263. package/bundle/user-registry-D4SD73UV.js +16 -0
  264. package/bundle/user-registry-D4SD73UV.js.map +7 -0
  265. package/core/professor.json +14 -0
  266. package/core/prompts/browsing_prompt.md +39 -0
  267. package/core/prompts/compaction.md +32 -0
  268. package/core/skills/memory/classification/SKILL.md +37 -0
  269. package/core/skills/memory/memory-anomalies/SKILL.md +39 -0
  270. package/core/skills/memory/memory-search/SKILL.md +48 -0
  271. package/core/skills/memory/topic-save/SKILL.md +44 -0
  272. package/core/skills/ops/cron/SKILL.md +51 -0
  273. package/core/skills/ops/gdrive-backup/SKILL.md +15 -0
  274. package/core/skills/ops/session-start/SKILL.md +11 -0
  275. package/core/skills/ops/skill-authoring/SKILL.md +54 -0
  276. package/core/skills/ops/system-health/SKILL.md +104 -0
  277. package/core/skills/ops/troubleshooting/SKILL.md +48 -0
  278. package/core/skills/ops/trust-gating/SKILL.md +30 -0
  279. package/core/skills/tools/a2a-communication/SKILL.md +68 -0
  280. package/core/skills/tools/browse-delegate/SKILL.md +27 -0
  281. package/core/skills/tools/browser/SKILL.md +36 -0
  282. package/core/skills/tools/clawhub/SKILL.md +44 -0
  283. package/core/skills/tools/delegation/SKILL.md +48 -0
  284. package/core/skills/tools/fxtwitter/SKILL.md +52 -0
  285. package/core/skills/tools/gmail/SKILL.md +44 -0
  286. package/core/skills/tools/irc-chat/SKILL.md +84 -0
  287. package/core/skills/tools/linear/SKILL.md +90 -0
  288. package/core/skills/tools/mcporter/SKILL.md +46 -0
  289. package/core/skills/tools/model-scout/SKILL.md +132 -0
  290. package/core/skills/tools/model-scout/scout-add-model.py +67 -0
  291. package/core/skills/tools/model-scout/scout-ollama.py +116 -0
  292. package/core/skills/tools/model-scout/scout-openrouter.py +85 -0
  293. package/core/skills/tools/nlm/SKILL.md +40 -0
  294. package/core/skills/tools/todo/SKILL.md +30 -0
  295. package/core/skills/tools/twitterX/SKILL.md +52 -0
  296. package/core/skills/tools/twitterX/scripts/abtars-tweet.js +532 -0
  297. package/core/skills/tools/twitterX/scripts/package.json +1 -0
  298. package/core/skills/tools/web-fetch/SKILL.md +29 -0
  299. package/package.json +59 -0
  300. package/scripts/abtars-daemon.service +23 -0
  301. package/scripts/abtars-fetch.sh +42 -0
  302. package/scripts/abtars-watchdog.service +13 -0
  303. package/scripts/abtars.sh +14 -0
  304. package/scripts/abtars@.service +21 -0
  305. package/scripts/browser-patchright.sh +79 -0
  306. package/scripts/com.abtars.daemon.plist +24 -0
  307. package/scripts/com.abtars.watchdog.plist +27 -0
  308. package/scripts/daily-backup.sh +62 -0
  309. package/scripts/doctor.sh +553 -0
  310. package/scripts/hooks/audit-logger.sh +22 -0
  311. package/scripts/upgrade-deps.sh +64 -0
  312. package/scripts/watchdog.sh +309 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/platforms/discord/discord-api.ts", "../src/platforms/discord/discord-poller.ts", "../src/platforms/discord/discord-adapter.ts"],
4
+ "sourcesContent": ["import { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport {\n Client,\n GatewayIntentBits,\n Partials,\n type Message,\n type MessageReaction,\n type User,\n type TextChannel,\n} from \"discord.js\";\nimport { logInfo, logError, logDebug, logWarn } from \"../../components/logger.js\";\n\nconst TAG = \"DiscordApi\";\n\n/**\n * Thin wrapper around discord.js Client.\n * Provides typed methods for Gateway connection, message listening, and sending.\n */\nexport class DiscordApi {\n private readonly client: Client;\n private readonly token: string;\n private ready = false;\n\n constructor(botToken: string) {\n this.token = botToken;\n this.client = new Client({\n intents: [\n GatewayIntentBits.Guilds,\n GatewayIntentBits.GuildMessages,\n GatewayIntentBits.GuildMessageReactions,\n GatewayIntentBits.DirectMessages,\n GatewayIntentBits.MessageContent,\n ],\n partials: [Partials.Channel, Partials.Message, Partials.Reaction],\n });\n\n this.client.on(\"clientReady\", () => {\n this.ready = true;\n logInfo(TAG, `Connected as ${this.client.user?.tag ?? \"unknown\"}`);\n });\n\n this.client.on(\"error\", (err) => {\n logError(TAG, \"Client error\", err);\n });\n }\n\n /** Connect to the Discord Gateway. Resolves when the client is ready. */\n async connect(): Promise<void> {\n logInfo(TAG, \"Connecting to Discord Gateway\u2026\");\n return new Promise<void>((resolve, reject) => {\n const onReady = () => {\n cleanup();\n resolve();\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n const cleanup = () => {\n this.client.removeListener(\"clientReady\", onReady);\n this.client.removeListener(\"error\", onError);\n };\n\n this.client.once(\"clientReady\", onReady);\n this.client.once(\"error\", onError);\n\n this.client.login(this.token).catch((err: unknown) => {\n cleanup();\n reject(err instanceof Error ? err : new Error(String(err)));\n });\n });\n }\n\n /** Register a handler for MESSAGE_CREATE events. */\n onMessage(handler: (message: Message) => void | Promise<void>): void {\n this.client.on(\"messageCreate\", (message) => {\n logDebug(TAG, `Message from ${message.author.tag} in #${message.channel.id}`);\n try {\n const result = handler(message);\n if (result instanceof Promise) {\n result.catch((err: unknown) => {\n logError(TAG, \"Message handler error\", err);\n });\n }\n } catch (err) {\n logError(TAG, \"Message handler error\", err);\n }\n });\n }\n\n /** Register a handler for MESSAGE_REACTION_ADD events. */\n onReaction(handler: (reaction: MessageReaction, user: User) => void | Promise<void>): void {\n this.client.on(\"messageReactionAdd\", async (reaction, user) => {\n if (user.bot) return;\n try {\n if (reaction.partial) await reaction.fetch();\n if (user.partial) await user.fetch();\n } catch (err) { logAndSwallow(TAG, \"fetch reaction/user partial\", err); return; }\n try {\n const result = handler(reaction as MessageReaction, user as User);\n if (result instanceof Promise) result.catch((err: unknown) => logError(TAG, \"Reaction handler error\", err));\n } catch (err) { logError(TAG, \"Reaction handler error\", err); }\n });\n }\n\n /** Register a handler for slash command interactions. */\n onInteraction(handler: (interaction: import(\"discord.js\").ChatInputCommandInteraction) => void | Promise<void>): void {\n this.client.on(\"interactionCreate\", async (interaction) => {\n if (interaction.isChatInputCommand()) {\n try {\n const result = handler(interaction);\n if (result instanceof Promise) result.catch((err: unknown) => logError(TAG, \"Interaction handler error\", err));\n } catch (err) { logError(TAG, \"Interaction handler error\", err); }\n }\n if (interaction.isStringSelectMenu()) {\n this.selectMenuHandlers.get(interaction.customId)?.(interaction);\n }\n });\n }\n\n private selectMenuHandlers = new Map<string, (i: import(\"discord.js\").StringSelectMenuInteraction) => void | Promise<void>>();\n\n onSelectMenu(customId: string, handler: (interaction: import(\"discord.js\").StringSelectMenuInteraction) => void | Promise<void>): void {\n this.selectMenuHandlers.set(customId, handler);\n }\n\n /** Register global application commands. Idempotent \u2014 Discord diffs and updates. */\n async registerCommands(commands: Array<{ name: string; description: string }>): Promise<void> {\n if (!this.client.application) {\n logWarn(TAG, \"Cannot register commands \u2014 application not available\");\n return;\n }\n await this.client.application.commands.set(commands.map(c => ({ name: c.name, description: c.description, type: 1 as const })));\n logInfo(TAG, `Registered ${commands.length} slash commands`);\n }\n\n /** Send a text message to a channel. Returns the sent message ID. */\n async sendMessage(channelId: string, text: string): Promise<string> {\n const channel = await this.client.channels.fetch(channelId);\n if (!channel?.isTextBased()) {\n throw new Error(`Channel ${channelId} is not a text channel`);\n }\n const sent = await (channel as TextChannel).send(text);\n logDebug(TAG, `Sent message ${sent.id} to channel ${channelId}`);\n return sent.id;\n }\n\n /** Send typing indicator to a channel. */\n async sendTyping(channelId: string): Promise<void> {\n try {\n const channel = await this.client.channels.fetch(channelId);\n if (channel?.isTextBased()) await (channel as TextChannel).sendTyping();\n } catch (err) { logAndSwallow(\"discord_api\", \"op\", err); }\n }\n\n /** Add or remove a reaction on a message. Empty emoji = remove bot's reactions. */\n async setReaction(channelId: string, messageId: string, emoji: string): Promise<void> {\n try {\n const channel = await this.client.channels.fetch(channelId);\n if (!channel?.isTextBased()) return;\n const message = await (channel as TextChannel).messages.fetch(messageId);\n if (!emoji) {\n // Remove bot's reactions\n const botId = this.client.user?.id;\n if (botId) {\n for (const reaction of message.reactions.cache.values()) {\n await reaction.users.remove(botId).catch(err => logAndSwallow(TAG, \"remove bot reaction\", err));\n }\n }\n } else {\n await message.react(emoji);\n }\n } catch (err) { logAndSwallow(\"discord_api\", \"op\", err); }\n }\n\n /** Edit a previously sent message. */\n async editMessage(channelId: string, messageId: string, text: string): Promise<void> {\n try {\n const channel = await this.client.channels.fetch(channelId);\n if (!channel?.isTextBased()) return;\n const message = await (channel as TextChannel).messages.fetch(messageId);\n await message.edit(text);\n } catch (err) { logAndSwallow(\"discord_api\", \"op\", err); }\n }\n\n /** Gracefully close the Gateway connection. */\n async disconnect(): Promise<void> {\n logInfo(TAG, \"Disconnecting from Discord Gateway\u2026\");\n this.ready = false;\n this.client.destroy();\n }\n\n /** Whether the client is connected and ready. */\n get isReady(): boolean {\n return this.ready;\n }\n\n /** Get the bot's own user ID (for filtering self-messages). */\n get botUserId(): string | null {\n return this.client.user?.id ?? null;\n }\n\n /** Fetch a specific message by channel + message ID. Returns null on failure. (#388) */\n async fetchMessage(channelId: string, messageId: string): Promise<{ authorId: string } | null> {\n try {\n const channel = await this.client.channels.fetch(channelId);\n if (!channel?.isTextBased()) return null;\n const msg = await (channel as TextChannel).messages.fetch(messageId);\n return msg ? { authorId: msg.author.id } : null;\n } catch (err) { logAndSwallow(TAG, \"fetchMessage\", err); return null; }\n }\n}\n", "import type { Message } from \"discord.js\";\nimport type { DiscordInboundMessage } from \"../../types/discord.js\";\nimport type { DiscordApi } from \"./discord-api.js\";\nimport { logInfo, logDebug, logWarn } from \"../../components/logger.js\";\n\nconst TAG = \"DiscordPoller\";\n\n/**\n * Event-driven listener for Discord messages via the Gateway WebSocket.\n * Mirrors TelegramPoller in lifecycle (start/stop) but uses discord.js\n * event handlers instead of long-polling. Reconnection and heartbeat\n * are handled by discord.js internally.\n */\nexport class DiscordPoller {\n private readonly api: DiscordApi;\n private readonly appId: string;\n private readonly onMessage: (message: DiscordInboundMessage) => void | Promise<void>;\n private started = false;\n\n constructor(\n api: DiscordApi,\n appId: string,\n onMessage: (message: DiscordInboundMessage) => void | Promise<void>,\n ) {\n this.api = api;\n this.appId = appId;\n this.onMessage = onMessage;\n }\n\n /** Connect to Gateway and start listening. */\n async start(): Promise<void> {\n if (this.started) return;\n this.started = true;\n\n await this.api.connect();\n\n this.api.onMessage((raw: Message) => {\n // Filter out self-messages (use appId from config, fallback to client user id)\n const selfId = this.api.botUserId ?? this.appId;\n if (raw.author.id === selfId) {\n logDebug(TAG, `Ignoring self-message ${raw.id}`);\n return;\n }\n\n const inbound = toDiscordInboundMessage(raw, this.appId);\n logDebug(TAG, `Dispatching message ${inbound.id} from ${inbound.authorUsername}`);\n\n try {\n const result = this.onMessage(inbound);\n if (result instanceof Promise) {\n result.catch((err: unknown) => {\n logWarn(TAG, `Error in message callback: ${err instanceof Error ? err.message : String(err)}`);\n });\n }\n } catch (err) {\n logWarn(TAG, `Error in message callback: ${err instanceof Error ? err.message : String(err)}`);\n }\n });\n\n logInfo(TAG, \"Started \u2014 listening for Discord messages\");\n }\n\n /** Disconnect from Gateway cleanly. */\n stop(): void {\n if (!this.started) return;\n this.started = false;\n this.api.disconnect();\n logInfo(TAG, \"Stopped\");\n }\n}\n\n/** Convert a raw discord.js Message to a DiscordInboundMessage. */\nfunction toDiscordInboundMessage(raw: Message, botId: string | null): DiscordInboundMessage {\n const parentId = \"parentId\" in raw.channel ? (raw.channel.parentId ?? null) : null;\n const channelName = \"name\" in raw.channel ? (raw.channel.name ?? null) : null;\n // Check both discord.js parsed mentions AND raw content for the bot's mention tag\n const mentionsBotId = botId\n ? (raw.mentions.users.has(botId) || new RegExp(`<@!?${botId}>`).test(raw.content))\n : false;\n\n // #388 \u2014 role-mention detection. Look up the bot's own guild member and check\n // if any of its role IDs appear in raw.mentions.roles. If the bot's member isn't\n // cached yet (cold start, first message in a guild), stay safe by returning false \u2014\n // a missed role-mention is better than an accidental always-respond.\n const botMember = raw.guild?.members.me ?? null;\n const botRoleIds = botMember ? new Set([...botMember.roles.cache.keys()]) : new Set<string>();\n const mentionsBotRole = botMember\n ? [...raw.mentions.roles.keys()].some(rid => botRoleIds.has(rid))\n : false;\n\n logDebug(TAG, `mentionsBotId=${mentionsBotId} mentionsBotRole=${mentionsBotRole} (appId=${botId}, mentions=${[...raw.mentions.users.keys()].join(\",\")}, content=${raw.content.slice(0, 60)})`);\n return {\n id: raw.id,\n channelId: raw.channelId,\n parentChannelId: parentId,\n channelName,\n isDM: !raw.guildId,\n authorId: raw.author.id,\n authorUsername: raw.author.username,\n authorIsBot: raw.author.bot ?? false,\n content: raw.content,\n timestamp: raw.createdTimestamp,\n mentionsBotId,\n mentionsBotRole,\n mentionsEveryone: raw.mentions.everyone,\n hasUserMentions: raw.mentions.users.size > 0,\n replyReferenceMessageId: raw.reference?.messageId ?? null,\n attachments: raw.attachments.size > 0\n ? [...raw.attachments.values()].map(a => ({ url: a.url, filename: a.name ?? \"file\", contentType: a.contentType ?? undefined, size: a.size }))\n : undefined,\n };\n}\n", "/**\n * Discord platform adapter \u2014 wraps DiscordApi, DiscordPoller, DiscordSecurityGate.\n * Handles Discord-specific pre-processing (mention stripping, A2A routing, sender prefix)\n * then delegates to the shared message pipeline.\n */\n\nimport { DiscordApi } from \"./discord-api.js\";\nimport { DiscordPoller } from \"./discord-poller.js\";\nimport { SecurityGate } from \"../../components/security-gate.js\";\nimport { loadUsers } from \"../../components/user-registry.js\";\nimport { BOT_COMMANDS } from \"../../components/command-registry.js\";\nimport { ResponseFormatter } from \"../../components/response-formatter.js\";\nimport { formatReactionSignal } from \"../../components/reactions.js\";\n\nexport const DISCORD_CAPABILITIES: PlatformCapabilities = { voice: false, reactions: true, typing: true, threads: true };\nimport { emojiToScore } from \"../../utils/emoji-score.js\";\nimport { logInfo, logWarn, logDebug } from \"../../components/logger.js\";\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport { getEnv } from \"../../components/env-schema.js\";\nimport { handleInboundMessage, type PipelineDeps } from \"../../components/message-pipeline.js\";\nimport type { PlatformAdapter, PlatformCapabilities, InboundMessage, SendOpts } from \"../../types/platform.js\";\nimport type { DiscordInboundMessage } from \"../../types/index.js\";\nimport type { IKiroTransport } from \"../../components/transport/kiro-transport.js\";\nimport type { IMemorySystem } from \"abmind\";\nimport type { ConversationBuffer } from \"../../components/conversation-buffer.js\";\n\nconst TAG = \"discord\";\n\nexport interface DiscordAdapterConfig {\n botToken: string;\n appId: string;\n allowedUserIds: Set<string>;\n}\n\nexport interface DiscordAdapterDeps {\n pipeline: PipelineDeps;\n transport: IKiroTransport;\n memory: IMemorySystem | null;\n conversationBuffer: ConversationBuffer;\n}\n\nexport class DiscordAdapter implements PlatformAdapter {\n readonly name = \"discord\" as const;\n readonly capabilities: PlatformCapabilities = DISCORD_CAPABILITIES;\n\n private readonly api: DiscordApi;\n private readonly securityGate: SecurityGate;\n private readonly formatter = new ResponseFormatter();\n private readonly config: DiscordAdapterConfig;\n private readonly deps: DiscordAdapterDeps;\n private poller: DiscordPoller | null = null;\n\n constructor(config: DiscordAdapterConfig, deps: DiscordAdapterDeps) {\n this.api = new DiscordApi(config.botToken);\n this.securityGate = new SecurityGate(loadUsers());\n this.config = config;\n this.deps = deps;\n }\n\n async start(): Promise<void> {\n this.poller = new DiscordPoller(this.api, this.config.appId, (m) => this.handleMessage(m));\n this.api.onReaction((reaction, user) => this.handleReaction(reaction, user));\n this.api.onInteraction((interaction) => this.handleInteraction(interaction));\n await this.poller.start();\n\n // Register slash commands (idempotent)\n await this.api.registerCommands([...BOT_COMMANDS]).catch(err =>\n logWarn(TAG, `Slash command registration failed: ${err instanceof Error ? err.message : String(err)}`),\n );\n }\n\n /** Handle Discord slash command interactions. */\n private async handleInteraction(interaction: import(\"discord.js\").ChatInputCommandInteraction): Promise<void> {\n // Interactive model picker for /model and /models\n if (interaction.commandName === \"model\" || interaction.commandName === \"models\") {\n await this.handleModelPicker(interaction);\n return;\n }\n\n await interaction.deferReply();\n\n const registry = loadUsers();\n const userEntry = registry.byPlatformId.get(`discord:${interaction.user.id}`);\n if (!this.securityGate.authorizeById(interaction.user.id, interaction.channelId)) {\n await interaction.editReply(\"\u26D4 Unauthorized.\");\n return;\n }\n\n const commandText = `/${interaction.commandName}`;\n const userId = userEntry?.userId ?? \"unknown\";\n const channelId = interaction.channelId;\n\n // Wrap adapter so pipeline responses route through the interaction reply\n let initialReplied = false;\n const interactionAdapter: PlatformAdapter = {\n ...this,\n sendMessage: async (_ch: string, text: string): Promise<string | undefined> => {\n if (!text?.trim()) return undefined;\n const chunks = text.length <= 2000 ? [text] : text.match(/.{1,2000}/gs) ?? [text];\n let lastId: string | undefined;\n for (const chunk of chunks) {\n if (!initialReplied) {\n initialReplied = true;\n const sent = await interaction.editReply(chunk);\n lastId = sent.id;\n } else {\n const sent = await interaction.followUp(chunk);\n lastId = sent.id;\n }\n }\n return lastId;\n },\n editMessage: async (_ch: string, _messageId: number | string, text: string): Promise<void> => {\n // For interaction replies, editReply edits the initial deferred response\n await interaction.editReply(text);\n },\n };\n\n const msg: InboundMessage = {\n text: commandText,\n channelId,\n userId,\n senderId: interaction.user.id,\n senderName: interaction.user.username ?? \"unknown\",\n platform: \"discord\",\n timestamp: Date.now(),\n isGroup: !!interaction.guildId,\n isVoice: false,\n };\n\n await handleInboundMessage(msg, interactionAdapter, this.deps.pipeline);\n }\n\n /** Interactive model picker \u2014 ephemeral select menus. */\n private async handleModelPicker(interaction: import(\"discord.js\").ChatInputCommandInteraction): Promise<void> {\n const { ActionRowBuilder, StringSelectMenuBuilder } = await import(\"discord.js\");\n const { loadTransport } = await import(\"../../components/transport-config.js\");\n const tc = loadTransport();\n if (!tc) { await interaction.reply({ content: \"No transport config.\", ephemeral: true }); return; }\n\n const providers = Object.entries(tc.providers).map(([id, p]) => ({ id, name: (p as any).name ?? id }));\n if (providers.length === 0) {\n await interaction.reply({ content: \"No providers configured.\", ephemeral: true });\n return;\n }\n\n const menu = new StringSelectMenuBuilder()\n .setCustomId(\"model_picker_provider\")\n .setPlaceholder(\"Select provider\")\n .addOptions(providers.slice(0, 25).map(p => ({ label: p.name, value: p.id })));\n\n const row = new ActionRowBuilder<import(\"discord.js\").StringSelectMenuBuilder>().addComponents(menu);\n await interaction.reply({ content: \"\uD83D\uDD27 Select provider:\", components: [row], ephemeral: true });\n\n // Handle provider selection \u2192 show models\n this.api.onSelectMenu(\"model_picker_provider\", async (selectInteraction) => {\n const providerId = selectInteraction.values[0]!;\n const provider = tc.providers[providerId];\n if (!provider) { await selectInteraction.update({ content: \"Provider not found.\", components: [] }); return; }\n\n const { getModelsForProvider } = await import(\"../../components/transport-config.js\");\n const models = getModelsForProvider(providerId).filter((m) => m.entry.status === \"alive\" || !m.entry.status).slice(0, 25);\n if (models.length === 0) { await selectInteraction.update({ content: `No models for ${providerId}.`, components: [] }); return; }\n\n const modelMenu = new StringSelectMenuBuilder()\n .setCustomId(\"model_picker_model\")\n .setPlaceholder(\"Select model\")\n .addOptions(models.map((m) => ({ label: m.id, value: m.id })));\n\n const modelRow = new ActionRowBuilder<import(\"discord.js\").StringSelectMenuBuilder>().addComponents(modelMenu);\n await selectInteraction.update({ content: `Provider: **${providerId}**\\nSelect model:`, components: [modelRow] });\n\n // Handle model selection \u2192 apply\n this.api.onSelectMenu(\"model_picker_model\", async (modelInteraction) => {\n const modelId = modelInteraction.values[0]!;\n // Route through command handler as /model <provider> <model>\n await modelInteraction.update({ content: `\u2705 Switching to **${providerId}/${modelId}**...`, components: [] });\n\n // Trigger the actual switch via the command pipeline\n const msg: InboundMessage = {\n text: `/model ${providerId} ${modelId}`,\n channelId: modelInteraction.channelId,\n userId: interaction.user.id,\n senderId: interaction.user.id,\n senderName: interaction.user.username ?? \"unknown\",\n platform: \"discord\",\n timestamp: Date.now(),\n isGroup: !!interaction.guildId,\n isVoice: false,\n };\n await handleInboundMessage(msg, this, this.deps.pipeline);\n });\n });\n }\n\n stop(): void {\n this.poller?.stop();\n this.poller = null;\n }\n\n authorize(msg: InboundMessage): boolean {\n // Discord security uses string IDs + channel check\n return this.securityGate.authorizeById(msg.senderId, msg.channelId);\n }\n\n async sendMessage(channelId: string, text: string, _opts?: SendOpts): Promise<string | undefined> {\n const id = await this.api.sendMessage(channelId, text);\n return id || undefined;\n }\n\n async sendTyping(channelId: string): Promise<void> {\n await this.api.sendTyping(channelId);\n }\n\n async setReaction(channelId: string, messageId: number | string, emoji: string): Promise<void> {\n await this.api.setReaction(channelId, String(messageId), emoji);\n }\n\n async editMessage(channelId: string, messageId: number | string, text: string): Promise<void> {\n await this.api.editMessage(channelId, String(messageId), text);\n }\n\n chunkResponse(text: string): string[] {\n return this.formatter.chunkForPlatform(text, \"discord\");\n }\n\n injectMessage(msg: InboundMessage): void {\n // Discord doesn't support synthetic injection the same way.\n // For sleep replay, we call handleInboundMessage directly.\n handleInboundMessage(msg, this, this.deps.pipeline).catch((err) => {\n logWarn(TAG, `Failed to replay queued message: ${err instanceof Error ? err.message : String(err)}`);\n });\n }\n\n // --- Internal: Discord message handler ---\n\n private async handleMessage(message: DiscordInboundMessage): Promise<void> {\n logDebug(TAG, `Message from ${message.authorUsername} in ${message.channelId}`);\n\n const effectiveChannelId = message.parentChannelId ?? message.channelId;\n\n if (!this.securityGate.authorizeById(message.authorId, effectiveChannelId)) {\n logDebug(TAG, `Unauthorized user=${message.authorId} channel=${effectiveChannelId}`);\n return;\n }\n\n const rawText = message.content.trim();\n if (!rawText && !message.attachments?.length) return;\n\n // Strip bot's own mention\n let text = rawText.replace(new RegExp(`<@!?${this.config.appId}>`, \"g\"), \"\").replace(/\\s{2,}/g, \" \").trim();\n\n // Download attachments\n let mediaPath: string | undefined;\n if (message.attachments?.length) {\n try {\n const { saveInboundMedia } = await import(\"../../components/media-utils.js\");\n const att = message.attachments[0]!; // handle first attachment\n const res = await fetch(att.url);\n if (res.ok) {\n const buf = Buffer.from(await res.arrayBuffer());\n const extHint = att.filename ? \".\" + (att.filename.split(\".\").pop() ?? \"\") : undefined;\n const saved = await saveInboundMedia(buf, message.channelId, { extHint, claimedMime: att.contentType });\n if (saved) {\n mediaPath = saved.path;\n if (!text) text = `User sent a ${saved.isImage ? \"photo\" : \"file\"}.`;\n }\n }\n } catch (err) {\n logWarn(TAG, `Attachment download failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n if (!text) return;\n\n // Mention filter: in non-DM channels, check DISCORD_GROUP_MENTIONS mode.\n const isDM = message.isDM;\n if (!isDM) {\n const mentionMode = getEnv().discordGroupMentions; // \"required\" | \"optional\"\n\n if (mentionMode === \"optional\") {\n // Skip messages that mention someone else (not us, not @everyone)\n if (message.hasUserMentions && !message.mentionsBotId && !message.mentionsBotRole && !message.mentionsEveryone) {\n logDebug(TAG, `Skipped \u2014 mentions another user (optional mode, channel=${effectiveChannelId})`);\n return;\n }\n } else {\n // Required mode: must be explicitly addressed\n let isReplyToBot = false;\n if (message.replyReferenceMessageId && this.config.appId) {\n try {\n const referenced = await this.api.fetchMessage(message.channelId, message.replyReferenceMessageId);\n isReplyToBot = referenced?.authorId === this.config.appId;\n } catch (err) { logAndSwallow(TAG, \"fetchMessage reply ref\", err); }\n }\n\n const addressed = message.mentionsBotId || message.mentionsBotRole || isReplyToBot;\n if (!addressed) {\n logDebug(TAG, `Skipped \u2014 not addressed (channel=${effectiveChannelId})`);\n return;\n }\n }\n }\n\n const channelLabel = message.parentChannelId ? message.channelName ?? \"thread\" : message.channelName ?? \"DM\";\n const senderPrefix = isDM ? \"\" : `[${message.authorUsername}${message.authorIsBot ? \" (bot)\" : \"\"}] in #${channelLabel}: `;\n\n const inbound: InboundMessage = {\n platform: \"discord\",\n channelId: message.channelId,\n userId: loadUsers().byPlatformId.get(\"discord:\" + message.authorId)?.userId ?? \"unknown\",\n senderId: message.authorId,\n senderName: message.authorUsername,\n text: senderPrefix + text,\n timestamp: message.timestamp,\n isGroup: !isDM,\n isVoice: false,\n mediaPath,\n rawPlatformData: message,\n };\n\n // #512: commands bypass sequential await\n if (text.startsWith(\"/\") && !text.startsWith(\"//\")) {\n handleInboundMessage(inbound, this, this.deps.pipeline).catch(err => logAndSwallow(TAG, \"handleInboundMessage command\", err));\n return;\n }\n\n await handleInboundMessage(inbound, this, this.deps.pipeline);\n }\n\n private async handleReaction(\n reaction: import(\"discord.js\").MessageReaction,\n user: import(\"discord.js\").User,\n ): Promise<void> {\n const channelId = reaction.message.channelId;\n const messageId = Number(reaction.message.id);\n const emoji = reaction.emoji.name ?? \"\";\n if (!emoji) return;\n\n const isAuthorized = this.securityGate.authorizeById(user.id, channelId);\n const senderName = user.username || `id:${user.id}`;\n logInfo(TAG, `Reaction ${emoji} from ${senderName} on msg ${reaction.message.id}`);\n\n // Emotion scoring on authorized reactions\n if (isAuthorized && this.deps.memory) {\n const score = emojiToScore(emoji);\n const resolvedUserId = loadUsers().byPlatformId.get(\"discord:\" + user.id)?.userId ?? \"unknown\";\n const updated = this.deps.memory.updateEmotionByPlatformId(resolvedUserId, messageId, score);\n if (updated) logDebug(TAG, `Emotion score ${score} set on msg ${reaction.message.id}`);\n }\n\n if (!isAuthorized) {\n logDebug(TAG, `Unauthorized reaction from ${user.id}, discarding`);\n return;\n }\n\n // Buffer reaction signal for next message context\n const signal = formatReactionSignal(senderName, [emoji]);\n const bufKey = `discord:${channelId}`;\n this.deps.conversationBuffer.push(bufKey, senderName, signal);\n logDebug(TAG, `Buffered reaction signal for channel ${channelId}`);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["TAG", "TAG"]
7
+ }