@kodelyth/discord 2026.5.39 → 2026.5.42

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 (639) hide show
  1. package/account-inspect-api.ts +6 -0
  2. package/action-runtime-api.ts +1 -0
  3. package/api.ts +130 -0
  4. package/channel-config-api.ts +1 -0
  5. package/channel-plugin-api.ts +3 -0
  6. package/config-api.ts +4 -0
  7. package/configured-state.ts +6 -0
  8. package/contract-api.ts +21 -0
  9. package/directory-contract-api.ts +4 -0
  10. package/dist/account-inspect-Dqw-enky.js +81 -0
  11. package/dist/account-inspect-api.js +10 -0
  12. package/dist/accounts-B7OBFePq.js +224 -0
  13. package/dist/action-runtime-api.js +2 -0
  14. package/dist/agent-components.runtime-DVY_1VB4.js +4 -0
  15. package/dist/allow-list-B0s7evD7.js +354 -0
  16. package/dist/api-CXAcv9nZ.js +130 -0
  17. package/dist/api.js +23 -0
  18. package/dist/approval-handler.runtime-B9xUAF3n.js +426 -0
  19. package/dist/audit-DoiK49WO.js +24 -0
  20. package/dist/audit-core-BGrq3G7r.js +105 -0
  21. package/dist/channel-U_aeoFwW.js +795 -0
  22. package/dist/channel-actions-BxEBnEuv.js +173 -0
  23. package/dist/channel-actions.runtime-CPtpH-yl.js +263 -0
  24. package/dist/channel-api-BfjklLby.js +21 -0
  25. package/dist/channel-config-api.js +2 -0
  26. package/dist/channel-plugin-api.js +2 -0
  27. package/dist/channel.setup-BUSC0apv.js +337 -0
  28. package/dist/components-luonoe13.js +909 -0
  29. package/dist/config-api-DSYGqaLQ.js +2 -0
  30. package/dist/config-schema-DIqJBGwC.js +357 -0
  31. package/dist/configured-state.js +6 -0
  32. package/dist/contract-api.js +8 -0
  33. package/dist/conversation-identity-DXAm0_Mk.js +270 -0
  34. package/dist/directory-config-CYbuMmPS.js +49 -0
  35. package/dist/directory-contract-api.js +2 -0
  36. package/dist/directory-live-DX4dLRpJ.js +159 -0
  37. package/dist/doctor-bbKSvGVD.js +244 -0
  38. package/dist/doctor-contract-Btjt6NJD.js +383 -0
  39. package/dist/doctor-contract-api.js +2 -0
  40. package/dist/gateway-registry-BKSpa4GB.js +74 -0
  41. package/dist/handle-action.guild-admin-B5BArS2n.js +286 -0
  42. package/dist/inbound-context-WAOqhGlT.js +48 -0
  43. package/dist/inbound-event-delivery-C-1Ji3WP.js +65 -0
  44. package/dist/index.js +26 -0
  45. package/dist/manager.runtime-DXHynKE4.js +2356 -0
  46. package/dist/message-handler-mXzc3tA_.js +381 -0
  47. package/dist/message-handler.preflight-BPD1a347.js +1113 -0
  48. package/dist/message-handler.process-GUa3aV8z.js +1438 -0
  49. package/dist/message-utils-dUbem16p.js +549 -0
  50. package/dist/outbound-adapter-C18OAc1y.js +536 -0
  51. package/dist/pluralkit-D1Q2x0w5.js +22 -0
  52. package/dist/preflight-audio-CZtpWcIm.js +72 -0
  53. package/dist/preflight-audio.runtime-Brx_0_xW.js +7 -0
  54. package/dist/preview-streaming-D_slNIiO.js +8 -0
  55. package/dist/probe-D--Ca4JF.js +139 -0
  56. package/dist/probe.runtime-DQBchZzv.js +2 -0
  57. package/dist/provider-B2-31CIT.js +9565 -0
  58. package/dist/provider-session.runtime-BwzzSsrH.js +6 -0
  59. package/dist/provider.runtime-CP3oHLls.js +2 -0
  60. package/dist/resolve-allowlist-common-CqxPLcJO.js +34 -0
  61. package/dist/resolve-channels-0LX4pUbB.js +265 -0
  62. package/dist/resolve-users-CztOv0Qs.js +120 -0
  63. package/dist/runtime-DUaw66V_.js +1073 -0
  64. package/dist/runtime-api.actions.js +3 -0
  65. package/dist/runtime-api.js +30 -0
  66. package/dist/runtime-api.lookup.js +7 -0
  67. package/dist/runtime-api.monitor-CvVKvEXW.js +5 -0
  68. package/dist/runtime-api.monitor.js +8 -0
  69. package/dist/runtime-api.send.js +6 -0
  70. package/dist/runtime-api.threads.js +6 -0
  71. package/dist/runtime-fC6f4UF2.js +8 -0
  72. package/dist/runtime-setter-api.js +2 -0
  73. package/dist/secret-config-contract-B6WW5V88.js +115 -0
  74. package/dist/secret-contract-api.js +2 -0
  75. package/dist/security-audit-CnyIQKz6.js +120 -0
  76. package/dist/security-audit-contract-api.js +2 -0
  77. package/dist/security-audit.runtime-CQSkjNLu.js +2 -0
  78. package/dist/security-contract-DLvYOgLM.js +26 -0
  79. package/dist/security-contract-api.js +2 -0
  80. package/dist/security-doctor-DepqtNCI.js +18 -0
  81. package/dist/send-DCtPCHGk.js +881 -0
  82. package/dist/send.components-Bcgxvm52.js +474 -0
  83. package/dist/send.outbound-S9t0UuHc.js +330 -0
  84. package/dist/send.receipt-CDn3GBWC.js +3119 -0
  85. package/dist/send.shared-D4iBnAmn.js +669 -0
  86. package/dist/sender-identity-CxCe3_1a.js +43 -0
  87. package/dist/session-contract-Dwhw3RTY.js +6 -0
  88. package/dist/session-key-api.js +2 -0
  89. package/dist/session-key-normalization-CP8dPUid.js +23 -0
  90. package/dist/setup-entry.js +11 -0
  91. package/dist/setup-plugin-api.js +2 -0
  92. package/dist/shared-AIlvuZXt.js +171 -0
  93. package/dist/subagent-hooks-8bK-mgiU.js +120 -0
  94. package/dist/subagent-hooks-api.js +22 -0
  95. package/dist/system-events-Ba1TklaL.js +34 -0
  96. package/dist/target-resolver-BrtFQtoK.js +82 -0
  97. package/dist/targets-DWLLZE2l.js +3 -0
  98. package/dist/test-api.js +45 -0
  99. package/dist/thread-binding-api.js +4 -0
  100. package/dist/thread-bindings-9aKRmZv0.js +255 -0
  101. package/dist/thread-bindings.discord-api-ssGH5wc2.js +244 -0
  102. package/dist/thread-bindings.manager-0YBHGemk.js +534 -0
  103. package/dist/thread-bindings.session-updates-DJZGIwaU.js +54 -0
  104. package/dist/thread-bindings.state-eTFl-PqJ.js +318 -0
  105. package/dist/timeouts-CEwuGaWT.js +52 -0
  106. package/dist/timeouts.js +2 -0
  107. package/dist/typing-BmJKRpCS.js +14 -0
  108. package/doctor-contract-api.ts +1 -0
  109. package/index.test.ts +13 -0
  110. package/index.ts +24 -0
  111. package/klaw.plugin.json +2 -3822
  112. package/package.json +4 -4
  113. package/runtime-api.actions.ts +15 -0
  114. package/runtime-api.lookup.ts +22 -0
  115. package/runtime-api.monitor.ts +50 -0
  116. package/runtime-api.send.ts +79 -0
  117. package/runtime-api.threads.ts +31 -0
  118. package/runtime-api.ts +181 -0
  119. package/runtime-setter-api.ts +3 -0
  120. package/secret-contract-api.ts +4 -0
  121. package/security-audit-contract-api.ts +1 -0
  122. package/security-contract-api.ts +4 -0
  123. package/session-key-api.ts +1 -0
  124. package/setup-entry.ts +9 -0
  125. package/setup-plugin-api.ts +3 -0
  126. package/src/account-inspect.test.ts +126 -0
  127. package/src/account-inspect.ts +128 -0
  128. package/src/accounts.test.ts +381 -0
  129. package/src/accounts.ts +205 -0
  130. package/src/actions/handle-action.guild-admin.ts +421 -0
  131. package/src/actions/handle-action.test.ts +480 -0
  132. package/src/actions/handle-action.ts +402 -0
  133. package/src/actions/runtime.guild.ts +446 -0
  134. package/src/actions/runtime.messaging.messages.ts +226 -0
  135. package/src/actions/runtime.messaging.reactions.ts +67 -0
  136. package/src/actions/runtime.messaging.runtime.ts +73 -0
  137. package/src/actions/runtime.messaging.send.ts +336 -0
  138. package/src/actions/runtime.messaging.shared.ts +97 -0
  139. package/src/actions/runtime.messaging.ts +37 -0
  140. package/src/actions/runtime.moderation-shared.ts +48 -0
  141. package/src/actions/runtime.moderation.authz.test.ts +151 -0
  142. package/src/actions/runtime.moderation.ts +116 -0
  143. package/src/actions/runtime.presence.test.ts +165 -0
  144. package/src/actions/runtime.presence.ts +117 -0
  145. package/src/actions/runtime.shared.ts +86 -0
  146. package/src/actions/runtime.test.ts +1337 -0
  147. package/src/actions/runtime.ts +87 -0
  148. package/src/api-barrel.test.ts +78 -0
  149. package/src/api.test.ts +152 -0
  150. package/src/api.ts +215 -0
  151. package/src/approval-handler.runtime.test.ts +41 -0
  152. package/src/approval-handler.runtime.ts +633 -0
  153. package/src/approval-native.test.ts +330 -0
  154. package/src/approval-native.ts +219 -0
  155. package/src/approval-runtime.ts +14 -0
  156. package/src/approval-shared.ts +50 -0
  157. package/src/audit-core.ts +178 -0
  158. package/src/audit.test.ts +204 -0
  159. package/src/audit.ts +32 -0
  160. package/src/channel-actions.contract.test.ts +45 -0
  161. package/src/channel-actions.runtime.ts +1 -0
  162. package/src/channel-actions.test.ts +504 -0
  163. package/src/channel-actions.ts +254 -0
  164. package/src/channel-api.ts +29 -0
  165. package/src/channel.conversation.ts +159 -0
  166. package/src/channel.loaders.ts +50 -0
  167. package/src/channel.message-adapter.test.ts +230 -0
  168. package/src/channel.runtime.ts +1 -0
  169. package/src/channel.setup.ts +12 -0
  170. package/src/channel.test.ts +828 -0
  171. package/src/channel.ts +728 -0
  172. package/src/chunk.test.ts +170 -0
  173. package/src/chunk.ts +321 -0
  174. package/src/client.proxy.test.ts +177 -0
  175. package/src/client.test.ts +83 -0
  176. package/src/client.ts +143 -0
  177. package/src/component-custom-id.ts +72 -0
  178. package/src/components-registry.ts +356 -0
  179. package/src/components.builders.ts +409 -0
  180. package/src/components.modal.ts +124 -0
  181. package/src/components.parse.ts +407 -0
  182. package/src/components.test.ts +345 -0
  183. package/src/components.ts +54 -0
  184. package/src/components.types.ts +187 -0
  185. package/src/config-schema.test.ts +439 -0
  186. package/src/config-schema.ts +6 -0
  187. package/src/config-ui-hints.ts +354 -0
  188. package/src/conversation-identity.ts +58 -0
  189. package/src/delivery-retry.ts +52 -0
  190. package/src/directory-cache.ts +116 -0
  191. package/src/directory-config.ts +58 -0
  192. package/src/directory-contract.test.ts +129 -0
  193. package/src/directory-live.test.ts +141 -0
  194. package/src/directory-live.ts +135 -0
  195. package/src/doctor-contract.ts +477 -0
  196. package/src/doctor-shared.ts +5 -0
  197. package/src/doctor.test.ts +393 -0
  198. package/src/doctor.ts +340 -0
  199. package/src/draft-chunking.test.ts +64 -0
  200. package/src/draft-chunking.ts +43 -0
  201. package/src/draft-stream.test.ts +193 -0
  202. package/src/draft-stream.ts +162 -0
  203. package/src/durable-delivery.test.ts +103 -0
  204. package/src/error-body.ts +38 -0
  205. package/src/exec-approvals.test.ts +88 -0
  206. package/src/exec-approvals.ts +110 -0
  207. package/src/gateway-logging.test.ts +98 -0
  208. package/src/gateway-logging.ts +67 -0
  209. package/src/group-policy.ts +113 -0
  210. package/src/guilds.ts +29 -0
  211. package/src/inbound-context.contract.test.ts +11 -0
  212. package/src/inbound-event-delivery.ts +135 -0
  213. package/src/interactive-dispatch.ts +104 -0
  214. package/src/internal/api.commands.ts +51 -0
  215. package/src/internal/api.guild.ts +164 -0
  216. package/src/internal/api.interactions.ts +53 -0
  217. package/src/internal/api.messages.ts +113 -0
  218. package/src/internal/api.reactions.ts +38 -0
  219. package/src/internal/api.test.ts +260 -0
  220. package/src/internal/api.ts +61 -0
  221. package/src/internal/api.users.ts +19 -0
  222. package/src/internal/api.webhooks.ts +13 -0
  223. package/src/internal/client.test.ts +472 -0
  224. package/src/internal/client.ts +310 -0
  225. package/src/internal/command-deploy.test.ts +197 -0
  226. package/src/internal/command-deploy.ts +352 -0
  227. package/src/internal/commands.ts +188 -0
  228. package/src/internal/components.base.ts +65 -0
  229. package/src/internal/components.message.ts +279 -0
  230. package/src/internal/components.modal.ts +95 -0
  231. package/src/internal/components.ts +31 -0
  232. package/src/internal/discord.ts +11 -0
  233. package/src/internal/embeds.ts +35 -0
  234. package/src/internal/entity-cache.ts +98 -0
  235. package/src/internal/event-queue.ts +185 -0
  236. package/src/internal/gateway-close-codes.ts +25 -0
  237. package/src/internal/gateway-dispatch.ts +96 -0
  238. package/src/internal/gateway-identify-limiter.ts +26 -0
  239. package/src/internal/gateway-lifecycle.test.ts +114 -0
  240. package/src/internal/gateway-lifecycle.ts +75 -0
  241. package/src/internal/gateway-rate-limit.ts +104 -0
  242. package/src/internal/gateway.test.ts +676 -0
  243. package/src/internal/gateway.ts +479 -0
  244. package/src/internal/interaction-dispatch.test.ts +148 -0
  245. package/src/internal/interaction-dispatch.ts +162 -0
  246. package/src/internal/interaction-options.ts +98 -0
  247. package/src/internal/interaction-response.ts +53 -0
  248. package/src/internal/interactions.test.ts +329 -0
  249. package/src/internal/interactions.ts +378 -0
  250. package/src/internal/listeners.ts +91 -0
  251. package/src/internal/live-smoke.live.test.ts +26 -0
  252. package/src/internal/modal-fields.ts +95 -0
  253. package/src/internal/payload.ts +69 -0
  254. package/src/internal/rest-body.ts +115 -0
  255. package/src/internal/rest-errors.ts +88 -0
  256. package/src/internal/rest-routes.ts +50 -0
  257. package/src/internal/rest-scheduler.ts +557 -0
  258. package/src/internal/rest.test.ts +681 -0
  259. package/src/internal/rest.ts +322 -0
  260. package/src/internal/schemas.ts +36 -0
  261. package/src/internal/structures.test.ts +43 -0
  262. package/src/internal/structures.ts +280 -0
  263. package/src/internal/test-builders.test-support.ts +167 -0
  264. package/src/internal/voice.ts +49 -0
  265. package/src/media-detection.ts +28 -0
  266. package/src/mentions.test.ts +111 -0
  267. package/src/mentions.ts +147 -0
  268. package/src/monitor/ack-reactions.ts +70 -0
  269. package/src/monitor/acp-bind-here.integration.test.ts +219 -0
  270. package/src/monitor/agent-components-auth.ts +7 -0
  271. package/src/monitor/agent-components-context.ts +154 -0
  272. package/src/monitor/agent-components-data.ts +224 -0
  273. package/src/monitor/agent-components-dm-auth.ts +177 -0
  274. package/src/monitor/agent-components-guild-auth.ts +322 -0
  275. package/src/monitor/agent-components-helpers.runtime.ts +3 -0
  276. package/src/monitor/agent-components-helpers.ts +34 -0
  277. package/src/monitor/agent-components-reply.ts +10 -0
  278. package/src/monitor/agent-components.deps.runtime.ts +2 -0
  279. package/src/monitor/agent-components.dispatch.ts +359 -0
  280. package/src/monitor/agent-components.handlers.ts +303 -0
  281. package/src/monitor/agent-components.modal.ts +160 -0
  282. package/src/monitor/agent-components.plugin-interactive.ts +187 -0
  283. package/src/monitor/agent-components.runtime.ts +14 -0
  284. package/src/monitor/agent-components.system-controls.ts +215 -0
  285. package/src/monitor/agent-components.ts +70 -0
  286. package/src/monitor/agent-components.types.ts +58 -0
  287. package/src/monitor/agent-components.wildcard-controls.ts +171 -0
  288. package/src/monitor/agent-components.wildcard.test.ts +71 -0
  289. package/src/monitor/allow-list.test.ts +14 -0
  290. package/src/monitor/allow-list.ts +631 -0
  291. package/src/monitor/auto-presence.test.ts +184 -0
  292. package/src/monitor/auto-presence.ts +356 -0
  293. package/src/monitor/channel-access.test.ts +113 -0
  294. package/src/monitor/channel-access.ts +102 -0
  295. package/src/monitor/commands.test.ts +24 -0
  296. package/src/monitor/commands.ts +9 -0
  297. package/src/monitor/dm-command-auth.test.ts +274 -0
  298. package/src/monitor/dm-command-auth.ts +259 -0
  299. package/src/monitor/dm-command-decision.test.ts +108 -0
  300. package/src/monitor/dm-command-decision.ts +49 -0
  301. package/src/monitor/exec-approvals.test.ts +225 -0
  302. package/src/monitor/exec-approvals.ts +158 -0
  303. package/src/monitor/format.ts +45 -0
  304. package/src/monitor/gateway-handle.ts +33 -0
  305. package/src/monitor/gateway-metadata.test.ts +29 -0
  306. package/src/monitor/gateway-metadata.ts +298 -0
  307. package/src/monitor/gateway-plugin.test.ts +320 -0
  308. package/src/monitor/gateway-plugin.ts +302 -0
  309. package/src/monitor/gateway-registry.ts +37 -0
  310. package/src/monitor/gateway-supervisor.test.ts +157 -0
  311. package/src/monitor/gateway-supervisor.ts +206 -0
  312. package/src/monitor/inbound-context.test-helpers.ts +37 -0
  313. package/src/monitor/inbound-context.test.ts +112 -0
  314. package/src/monitor/inbound-context.ts +95 -0
  315. package/src/monitor/inbound-dedupe.ts +79 -0
  316. package/src/monitor/inbound-job.test.ts +216 -0
  317. package/src/monitor/inbound-job.ts +118 -0
  318. package/src/monitor/listeners.queue.ts +91 -0
  319. package/src/monitor/listeners.reactions.ts +594 -0
  320. package/src/monitor/listeners.test.ts +209 -0
  321. package/src/monitor/listeners.ts +150 -0
  322. package/src/monitor/message-channel-info.ts +96 -0
  323. package/src/monitor/message-forwarded.ts +114 -0
  324. package/src/monitor/message-handler.batch-gate.test.ts +22 -0
  325. package/src/monitor/message-handler.batch-gate.ts +19 -0
  326. package/src/monitor/message-handler.bot-self-filter.test.ts +68 -0
  327. package/src/monitor/message-handler.context.ts +492 -0
  328. package/src/monitor/message-handler.dm-preflight.ts +119 -0
  329. package/src/monitor/message-handler.draft-preview.ts +426 -0
  330. package/src/monitor/message-handler.hydration.test.ts +80 -0
  331. package/src/monitor/message-handler.hydration.ts +198 -0
  332. package/src/monitor/message-handler.inbound-context.test.ts +61 -0
  333. package/src/monitor/message-handler.module-test-helpers.ts +31 -0
  334. package/src/monitor/message-handler.preflight-channel-access.ts +86 -0
  335. package/src/monitor/message-handler.preflight-channel-context.test.ts +18 -0
  336. package/src/monitor/message-handler.preflight-channel-context.ts +58 -0
  337. package/src/monitor/message-handler.preflight-context.ts +54 -0
  338. package/src/monitor/message-handler.preflight-helpers.ts +164 -0
  339. package/src/monitor/message-handler.preflight-history.ts +23 -0
  340. package/src/monitor/message-handler.preflight-logging.ts +36 -0
  341. package/src/monitor/message-handler.preflight-pluralkit.ts +26 -0
  342. package/src/monitor/message-handler.preflight-runtime.ts +28 -0
  343. package/src/monitor/message-handler.preflight-thread.ts +49 -0
  344. package/src/monitor/message-handler.preflight.acp-bindings.test.ts +371 -0
  345. package/src/monitor/message-handler.preflight.test-helpers.ts +114 -0
  346. package/src/monitor/message-handler.preflight.test.ts +2255 -0
  347. package/src/monitor/message-handler.preflight.ts +822 -0
  348. package/src/monitor/message-handler.preflight.types.ts +115 -0
  349. package/src/monitor/message-handler.process.test.ts +2520 -0
  350. package/src/monitor/message-handler.process.ts +1027 -0
  351. package/src/monitor/message-handler.queue.test.ts +680 -0
  352. package/src/monitor/message-handler.routing-preflight.ts +112 -0
  353. package/src/monitor/message-handler.test-harness.ts +99 -0
  354. package/src/monitor/message-handler.test-helpers.ts +75 -0
  355. package/src/monitor/message-handler.ts +309 -0
  356. package/src/monitor/message-media.ts +536 -0
  357. package/src/monitor/message-run-queue.ts +101 -0
  358. package/src/monitor/message-text.ts +171 -0
  359. package/src/monitor/message-utils.test.ts +1234 -0
  360. package/src/monitor/message-utils.ts +34 -0
  361. package/src/monitor/model-picker-preferences.test.ts +67 -0
  362. package/src/monitor/model-picker-preferences.ts +184 -0
  363. package/src/monitor/model-picker.state.ts +364 -0
  364. package/src/monitor/model-picker.test-utils.ts +26 -0
  365. package/src/monitor/model-picker.test.ts +869 -0
  366. package/src/monitor/model-picker.ts +38 -0
  367. package/src/monitor/model-picker.view.ts +722 -0
  368. package/src/monitor/monitor.agent-components.test.ts +410 -0
  369. package/src/monitor/monitor.test.ts +919 -0
  370. package/src/monitor/monitor.threading-utils.test.ts +614 -0
  371. package/src/monitor/native-command-agent-reply.ts +125 -0
  372. package/src/monitor/native-command-arg-ui.ts +233 -0
  373. package/src/monitor/native-command-auth.ts +309 -0
  374. package/src/monitor/native-command-bypass.ts +13 -0
  375. package/src/monitor/native-command-context.test.ts +105 -0
  376. package/src/monitor/native-command-context.ts +109 -0
  377. package/src/monitor/native-command-dispatch.ts +35 -0
  378. package/src/monitor/native-command-model-picker-apply.ts +209 -0
  379. package/src/monitor/native-command-model-picker-interaction.ts +516 -0
  380. package/src/monitor/native-command-model-picker-ui.ts +357 -0
  381. package/src/monitor/native-command-reply.test.ts +68 -0
  382. package/src/monitor/native-command-reply.ts +185 -0
  383. package/src/monitor/native-command-route.ts +91 -0
  384. package/src/monitor/native-command-status.ts +76 -0
  385. package/src/monitor/native-command-ui.ts +26 -0
  386. package/src/monitor/native-command-ui.types.ts +20 -0
  387. package/src/monitor/native-command.args.ts +45 -0
  388. package/src/monitor/native-command.command-arg.test.ts +108 -0
  389. package/src/monitor/native-command.commands-allowfrom.test.ts +504 -0
  390. package/src/monitor/native-command.model-picker.test.ts +930 -0
  391. package/src/monitor/native-command.options.test.ts +379 -0
  392. package/src/monitor/native-command.options.ts +153 -0
  393. package/src/monitor/native-command.plugin-dispatch.test.ts +1212 -0
  394. package/src/monitor/native-command.runtime.ts +51 -0
  395. package/src/monitor/native-command.status-direct.test.ts +278 -0
  396. package/src/monitor/native-command.test-helpers.ts +64 -0
  397. package/src/monitor/native-command.think-autocomplete.test.ts +411 -0
  398. package/src/monitor/native-command.ts +747 -0
  399. package/src/monitor/native-command.types.ts +9 -0
  400. package/src/monitor/native-interaction-channel-context.ts +50 -0
  401. package/src/monitor/preflight-audio.runtime.ts +9 -0
  402. package/src/monitor/preflight-audio.test.ts +157 -0
  403. package/src/monitor/preflight-audio.ts +130 -0
  404. package/src/monitor/presence-cache.ts +61 -0
  405. package/src/monitor/presence.test.ts +61 -0
  406. package/src/monitor/presence.ts +50 -0
  407. package/src/monitor/provider-session.runtime.ts +12 -0
  408. package/src/monitor/provider.acp.ts +89 -0
  409. package/src/monitor/provider.allowlist.test.ts +217 -0
  410. package/src/monitor/provider.allowlist.ts +398 -0
  411. package/src/monitor/provider.cleanup.ts +41 -0
  412. package/src/monitor/provider.commands.ts +129 -0
  413. package/src/monitor/provider.config-log.ts +45 -0
  414. package/src/monitor/provider.deploy-errors.ts +362 -0
  415. package/src/monitor/provider.deploy.ts +221 -0
  416. package/src/monitor/provider.interactions.ts +160 -0
  417. package/src/monitor/provider.lifecycle.test.ts +734 -0
  418. package/src/monitor/provider.lifecycle.ts +562 -0
  419. package/src/monitor/provider.proxy.test.ts +804 -0
  420. package/src/monitor/provider.rest-proxy.test.ts +389 -0
  421. package/src/monitor/provider.runtime.ts +1 -0
  422. package/src/monitor/provider.skill-dedupe.test.ts +42 -0
  423. package/src/monitor/provider.startup-log.ts +32 -0
  424. package/src/monitor/provider.startup.test.ts +440 -0
  425. package/src/monitor/provider.startup.ts +323 -0
  426. package/src/monitor/provider.test.ts +1173 -0
  427. package/src/monitor/provider.ts +688 -0
  428. package/src/monitor/reply-context.ts +64 -0
  429. package/src/monitor/reply-delivery.test.ts +474 -0
  430. package/src/monitor/reply-delivery.ts +212 -0
  431. package/src/monitor/reply-safety.ts +96 -0
  432. package/src/monitor/rest-fetch.ts +94 -0
  433. package/src/monitor/route-resolution.test.ts +209 -0
  434. package/src/monitor/route-resolution.ts +140 -0
  435. package/src/monitor/sender-identity.ts +81 -0
  436. package/src/monitor/startup-status.test.ts +30 -0
  437. package/src/monitor/startup-status.ts +10 -0
  438. package/src/monitor/status.ts +22 -0
  439. package/src/monitor/system-events.ts +55 -0
  440. package/src/monitor/thread-bindings.config.ts +35 -0
  441. package/src/monitor/thread-bindings.discord-api.test.ts +250 -0
  442. package/src/monitor/thread-bindings.discord-api.ts +310 -0
  443. package/src/monitor/thread-bindings.lifecycle.test.ts +1994 -0
  444. package/src/monitor/thread-bindings.lifecycle.ts +354 -0
  445. package/src/monitor/thread-bindings.manager.ts +551 -0
  446. package/src/monitor/thread-bindings.messages.ts +6 -0
  447. package/src/monitor/thread-bindings.persona.test.ts +34 -0
  448. package/src/monitor/thread-bindings.persona.ts +25 -0
  449. package/src/monitor/thread-bindings.session-adapter.ts +229 -0
  450. package/src/monitor/thread-bindings.session-shared.ts +59 -0
  451. package/src/monitor/thread-bindings.session-updates.ts +35 -0
  452. package/src/monitor/thread-bindings.shared-state.test.ts +39 -0
  453. package/src/monitor/thread-bindings.state.ts +540 -0
  454. package/src/monitor/thread-bindings.ts +48 -0
  455. package/src/monitor/thread-bindings.types.ts +83 -0
  456. package/src/monitor/thread-channel-context.ts +112 -0
  457. package/src/monitor/thread-session-close.test.ts +180 -0
  458. package/src/monitor/thread-session-close.ts +63 -0
  459. package/src/monitor/thread-title.generate.test.ts +209 -0
  460. package/src/monitor/thread-title.test.ts +31 -0
  461. package/src/monitor/thread-title.ts +181 -0
  462. package/src/monitor/threading.auto-thread.test.ts +330 -0
  463. package/src/monitor/threading.auto-thread.ts +287 -0
  464. package/src/monitor/threading.cache.ts +45 -0
  465. package/src/monitor/threading.parent-info.test.ts +156 -0
  466. package/src/monitor/threading.starter.test.ts +279 -0
  467. package/src/monitor/threading.starter.ts +288 -0
  468. package/src/monitor/threading.ts +20 -0
  469. package/src/monitor/threading.types.ts +102 -0
  470. package/src/monitor/timeouts.ts +84 -0
  471. package/src/monitor/typing.test.ts +42 -0
  472. package/src/monitor/typing.ts +17 -0
  473. package/src/monitor.gateway.test.ts +187 -0
  474. package/src/monitor.gateway.ts +75 -0
  475. package/src/monitor.test.ts +1416 -0
  476. package/src/monitor.ts +28 -0
  477. package/src/network-config.test.ts +92 -0
  478. package/src/network-config.ts +79 -0
  479. package/src/normalize.test.ts +56 -0
  480. package/src/normalize.ts +86 -0
  481. package/src/outbound-adapter.interactive-order.test.ts +82 -0
  482. package/src/outbound-adapter.test-harness.ts +207 -0
  483. package/src/outbound-adapter.test.ts +804 -0
  484. package/src/outbound-adapter.ts +326 -0
  485. package/src/outbound-approval.ts +29 -0
  486. package/src/outbound-components.ts +86 -0
  487. package/src/outbound-payload.contract.test.ts +49 -0
  488. package/src/outbound-payload.ts +208 -0
  489. package/src/outbound-send-context.ts +89 -0
  490. package/src/outbound-session-route.test.ts +42 -0
  491. package/src/outbound-session-route.ts +72 -0
  492. package/src/pluralkit.test.ts +67 -0
  493. package/src/pluralkit.ts +58 -0
  494. package/src/preview-streaming.ts +18 -0
  495. package/src/probe.intents.test.ts +94 -0
  496. package/src/probe.parse-token.test.ts +43 -0
  497. package/src/probe.runtime.ts +1 -0
  498. package/src/probe.ts +237 -0
  499. package/src/proxy-fetch.ts +92 -0
  500. package/src/proxy-request-client.test.ts +100 -0
  501. package/src/proxy-request-client.ts +21 -0
  502. package/src/recipient-resolution.ts +39 -0
  503. package/src/resolve-allowlist-common.test.ts +40 -0
  504. package/src/resolve-allowlist-common.ts +39 -0
  505. package/src/resolve-channels.test.ts +341 -0
  506. package/src/resolve-channels.ts +369 -0
  507. package/src/resolve-users.test.ts +243 -0
  508. package/src/resolve-users.ts +184 -0
  509. package/src/retry.test.ts +83 -0
  510. package/src/retry.ts +98 -0
  511. package/src/runtime-api.ts +61 -0
  512. package/src/runtime-config.ts +16 -0
  513. package/src/runtime.ts +23 -0
  514. package/src/secret-config-contract.ts +140 -0
  515. package/src/security-audit.runtime.ts +1 -0
  516. package/src/security-audit.test.ts +245 -0
  517. package/src/security-audit.ts +208 -0
  518. package/src/security-contract.ts +47 -0
  519. package/src/security-doctor.test.ts +25 -0
  520. package/src/security-doctor.ts +20 -0
  521. package/src/security.ts +60 -0
  522. package/src/send-target-parsing.ts +14 -0
  523. package/src/send.channels.ts +139 -0
  524. package/src/send.components.test.ts +330 -0
  525. package/src/send.components.ts +391 -0
  526. package/src/send.creates-thread.test.ts +681 -0
  527. package/src/send.emojis-stickers.ts +57 -0
  528. package/src/send.guild.ts +170 -0
  529. package/src/send.message-request.ts +112 -0
  530. package/src/send.messages.test.ts +59 -0
  531. package/src/send.messages.ts +229 -0
  532. package/src/send.outbound.ts +459 -0
  533. package/src/send.permissions.authz.test.ts +190 -0
  534. package/src/send.permissions.ts +283 -0
  535. package/src/send.reactions.ts +155 -0
  536. package/src/send.receipt.ts +69 -0
  537. package/src/send.sends-basic-channel-messages.test.ts +1068 -0
  538. package/src/send.shared.ts +469 -0
  539. package/src/send.test-harness.ts +56 -0
  540. package/src/send.ts +82 -0
  541. package/src/send.types.ts +191 -0
  542. package/src/send.typing.test.ts +41 -0
  543. package/src/send.typing.ts +9 -0
  544. package/src/send.voice.ts +136 -0
  545. package/src/send.webhook-activity.test.ts +152 -0
  546. package/src/send.webhook.proxy.test.ts +210 -0
  547. package/src/send.webhook.ts +137 -0
  548. package/src/session-contract.ts +3 -0
  549. package/src/session-key-normalization.test.ts +44 -0
  550. package/src/session-key-normalization.ts +47 -0
  551. package/src/setup-account-state.test.ts +113 -0
  552. package/src/setup-account-state.ts +141 -0
  553. package/src/setup-adapter.ts +14 -0
  554. package/src/setup-core.ts +215 -0
  555. package/src/setup-runtime-helpers.ts +10 -0
  556. package/src/setup-surface.test.ts +137 -0
  557. package/src/setup-surface.ts +132 -0
  558. package/src/shared-interactive.test.ts +153 -0
  559. package/src/shared-interactive.ts +161 -0
  560. package/src/shared.test.ts +186 -0
  561. package/src/shared.ts +197 -0
  562. package/src/status-issues.test.ts +97 -0
  563. package/src/status-issues.ts +198 -0
  564. package/src/subagent-hooks.test.ts +465 -0
  565. package/src/subagent-hooks.ts +232 -0
  566. package/src/target-parsing.ts +70 -0
  567. package/src/target-resolver.ts +129 -0
  568. package/src/targets.test.ts +393 -0
  569. package/src/targets.ts +12 -0
  570. package/src/test-http-helpers.ts +10 -0
  571. package/src/test-support/component-runtime.ts +194 -0
  572. package/src/test-support/config.ts +7 -0
  573. package/src/test-support/configured-binding-runtime.ts +29 -0
  574. package/src/test-support/partial-channel.ts +26 -0
  575. package/src/test-support/provider.test-support.ts +547 -0
  576. package/src/token.test.ts +174 -0
  577. package/src/token.ts +107 -0
  578. package/src/ui-colors.ts +27 -0
  579. package/src/ui.ts +20 -0
  580. package/src/voice/access.test.ts +288 -0
  581. package/src/voice/access.ts +126 -0
  582. package/src/voice/audio.test.ts +47 -0
  583. package/src/voice/audio.ts +249 -0
  584. package/src/voice/capture-state.test.ts +48 -0
  585. package/src/voice/capture-state.ts +120 -0
  586. package/src/voice/command.test.ts +170 -0
  587. package/src/voice/command.ts +284 -0
  588. package/src/voice/config.ts +8 -0
  589. package/src/voice/ingress.ts +164 -0
  590. package/src/voice/manager.e2e.test.ts +3286 -0
  591. package/src/voice/manager.ready-listener.test.ts +54 -0
  592. package/src/voice/manager.runtime.ts +14 -0
  593. package/src/voice/manager.ts +1155 -0
  594. package/src/voice/prompt.test.ts +30 -0
  595. package/src/voice/prompt.ts +22 -0
  596. package/src/voice/realtime.ts +1370 -0
  597. package/src/voice/receive-recovery.test.ts +81 -0
  598. package/src/voice/receive-recovery.ts +159 -0
  599. package/src/voice/sanitize.test.ts +34 -0
  600. package/src/voice/sanitize.ts +29 -0
  601. package/src/voice/sdk-runtime.ts +14 -0
  602. package/src/voice/segment.ts +160 -0
  603. package/src/voice/session.ts +81 -0
  604. package/src/voice/speaker-context.ts +127 -0
  605. package/src/voice/tts.ts +151 -0
  606. package/src/voice-message.test.ts +376 -0
  607. package/src/voice-message.ts +474 -0
  608. package/subagent-hooks-api.ts +27 -0
  609. package/test-api.ts +4 -0
  610. package/thread-binding-api.ts +1 -0
  611. package/timeouts.ts +6 -0
  612. package/tsconfig.json +16 -0
  613. package/account-inspect-api.js +0 -7
  614. package/action-runtime-api.js +0 -7
  615. package/api.js +0 -7
  616. package/channel-config-api.js +0 -7
  617. package/channel-plugin-api.js +0 -7
  618. package/configured-state.js +0 -7
  619. package/contract-api.js +0 -7
  620. package/directory-contract-api.js +0 -7
  621. package/doctor-contract-api.js +0 -7
  622. package/index.js +0 -7
  623. package/runtime-api.actions.js +0 -7
  624. package/runtime-api.js +0 -7
  625. package/runtime-api.lookup.js +0 -7
  626. package/runtime-api.monitor.js +0 -7
  627. package/runtime-api.send.js +0 -7
  628. package/runtime-api.threads.js +0 -7
  629. package/runtime-setter-api.js +0 -7
  630. package/secret-contract-api.js +0 -7
  631. package/security-audit-contract-api.js +0 -7
  632. package/security-contract-api.js +0 -7
  633. package/session-key-api.js +0 -7
  634. package/setup-entry.js +0 -7
  635. package/setup-plugin-api.js +0 -7
  636. package/subagent-hooks-api.js +0 -7
  637. package/test-api.js +0 -7
  638. package/thread-binding-api.js +0 -7
  639. package/timeouts.js +0 -7
@@ -0,0 +1,795 @@
1
+ import { Ht as parseDiscordTarget, a as normalizeDiscordMessagingTarget, i as looksLikeDiscordTargetId } from "./send.receipt-CDn3GBWC.js";
2
+ import { c as resolveDiscordAccountAllowFrom, r as listDiscordAccountIds, s as resolveDiscordAccount } from "./accounts-B7OBFePq.js";
3
+ import { a as projectCredentialSnapshotFields, n as PAIRING_APPROVED_MESSAGE, o as resolveConfiguredFromCredentialStatuses, r as buildTokenChannelStatusSummary, t as DEFAULT_ACCOUNT_ID } from "./channel-api-BfjklLby.js";
4
+ import { x as resolveDiscordOutboundSessionRoute } from "./components-luonoe13.js";
5
+ import { t as getDiscordRuntime } from "./runtime-fC6f4UF2.js";
6
+ import { c as shouldSuppressLocalDiscordExecApprovalPrompt, n as resolveDiscordCurrentConversationIdentity, r as getDiscordApprovalCapability } from "./conversation-identity-DXAm0_Mk.js";
7
+ import { r as resolveRequiredDiscordChannelPermissions } from "./audit-core-BGrq3G7r.js";
8
+ import { t as discordMessageActions$1 } from "./channel-actions-BxEBnEuv.js";
9
+ import { n as setThreadBindingMaxAgeBySessionKey, t as setThreadBindingIdleTimeoutBySessionKey } from "./thread-bindings.session-updates-DJZGIwaU.js";
10
+ import { n as discordOutbound } from "./outbound-adapter-C18OAc1y.js";
11
+ import { a as discordSecurityAdapter, i as discordSetupAdapter, n as discordConfigAdapter, t as createDiscordPluginBase } from "./shared-AIlvuZXt.js";
12
+ import { t as normalizeExplicitDiscordSessionKey } from "./session-key-normalization-CP8dPUid.js";
13
+ import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, normalizeOptionalStringifiedId } from "klaw/plugin-sdk/string-coerce-runtime";
14
+ import { createChatChannelPlugin } from "klaw/plugin-sdk/channel-core";
15
+ import { sleepWithAbort } from "klaw/plugin-sdk/runtime-env";
16
+ import { formatErrorMessage } from "klaw/plugin-sdk/error-runtime";
17
+ import { createChannelMessageAdapterFromOutbound } from "klaw/plugin-sdk/channel-message";
18
+ import { buildLegacyDmAccountAllowlistAdapter, createAccountScopedAllowlistNameResolver, createNestedAllowlistOverrideResolver } from "klaw/plugin-sdk/allowlist-config-edit";
19
+ import { createPairingPrefixStripper } from "klaw/plugin-sdk/channel-pairing";
20
+ import { createChannelDirectoryAdapter, createRuntimeDirectoryLiveAdapter } from "klaw/plugin-sdk/directory-runtime";
21
+ import { appendMatchMetadata, asString, createComputedAccountStatusAdapter, createDefaultChannelRuntimeState, isRecord as isRecord$1, resolveEnabledConfiguredAccountId } from "klaw/plugin-sdk/status-helpers";
22
+ import { resolveTargetsWithOptionalToken } from "klaw/plugin-sdk/target-resolver-runtime";
23
+ import { createLazyRuntimeModule } from "klaw/plugin-sdk/lazy-runtime";
24
+ import { resolveToolsBySender } from "klaw/plugin-sdk/channel-policy";
25
+ import { normalizeAtHashSlug } from "klaw/plugin-sdk/string-normalization-runtime";
26
+ //#region extensions/discord/src/channel.conversation.ts
27
+ function resolveDiscordAttachedOutboundTarget(params) {
28
+ if (params.threadId == null) return params.to;
29
+ const threadId = normalizeOptionalStringifiedId(params.threadId) ?? "";
30
+ return threadId ? `channel:${threadId}` : params.to;
31
+ }
32
+ function buildDiscordCrossContextPresentation(params) {
33
+ return {
34
+ tone: "neutral",
35
+ blocks: [...params.message.trim() ? [{
36
+ type: "text",
37
+ text: params.message
38
+ }, { type: "divider" }] : [], {
39
+ type: "context",
40
+ text: `From ${params.originLabel}`
41
+ }]
42
+ };
43
+ }
44
+ function normalizeDiscordAcpConversationId(conversationId) {
45
+ const normalized = conversationId.trim();
46
+ return normalized ? { conversationId: normalized } : null;
47
+ }
48
+ function matchDiscordAcpConversation(params) {
49
+ if (params.bindingConversationId === params.conversationId) return {
50
+ conversationId: params.conversationId,
51
+ matchPriority: 2
52
+ };
53
+ if (params.parentConversationId && params.parentConversationId !== params.conversationId && params.bindingConversationId === params.parentConversationId) return {
54
+ conversationId: params.parentConversationId,
55
+ matchPriority: 1
56
+ };
57
+ return null;
58
+ }
59
+ function resolveDiscordConversationIdFromTargets(targets) {
60
+ for (const raw of targets) {
61
+ const trimmed = raw?.trim();
62
+ if (!trimmed) continue;
63
+ try {
64
+ const target = parseDiscordTarget(trimmed, { defaultKind: "channel" });
65
+ if (target?.normalized) return target.normalized;
66
+ } catch {
67
+ const mentionMatch = trimmed.match(/^<#(\d+)>$/);
68
+ if (mentionMatch?.[1]) return `channel:${mentionMatch[1]}`;
69
+ if (/^\d{6,}$/.test(trimmed)) return normalizeDiscordMessagingTarget(trimmed);
70
+ }
71
+ }
72
+ }
73
+ function parseDiscordParentChannelFromSessionKey(raw) {
74
+ const sessionKey = normalizeLowercaseStringOrEmpty(raw);
75
+ if (!sessionKey) return;
76
+ const match = sessionKey.match(/(?:^|:)channel:([^:]+)$/);
77
+ return match?.[1] ? `channel:${match[1]}` : void 0;
78
+ }
79
+ function resolveDiscordCommandConversation(params) {
80
+ const targets = [
81
+ params.originatingTo,
82
+ params.commandTo,
83
+ params.fallbackTo
84
+ ];
85
+ if (params.threadId) {
86
+ const parentConversationId = normalizeDiscordMessagingTarget(normalizeOptionalString(params.threadParentId) ?? "") || parseDiscordParentChannelFromSessionKey(params.parentSessionKey) || resolveDiscordConversationIdFromTargets(targets);
87
+ return {
88
+ conversationId: params.threadId,
89
+ ...parentConversationId && parentConversationId !== params.threadId ? { parentConversationId } : {}
90
+ };
91
+ }
92
+ const conversationId = resolveDiscordCurrentConversationIdentity({
93
+ from: params.from,
94
+ chatType: params.chatType,
95
+ originatingTo: params.originatingTo,
96
+ commandTo: params.commandTo,
97
+ fallbackTo: params.fallbackTo
98
+ });
99
+ return conversationId ? { conversationId } : null;
100
+ }
101
+ function resolveDiscordInboundConversation(params) {
102
+ const conversationId = resolveDiscordCurrentConversationIdentity({
103
+ from: params.from,
104
+ chatType: params.isGroup ? "group" : "direct",
105
+ originatingTo: params.to,
106
+ fallbackTo: params.conversationId
107
+ });
108
+ return conversationId ? { conversationId } : null;
109
+ }
110
+ function parseDiscordExplicitTarget(raw) {
111
+ try {
112
+ const target = parseDiscordTarget(raw, { defaultKind: "channel" });
113
+ if (!target) return null;
114
+ return {
115
+ to: target.normalized,
116
+ chatType: target.kind === "user" ? "direct" : "channel"
117
+ };
118
+ } catch {
119
+ return null;
120
+ }
121
+ }
122
+ //#endregion
123
+ //#region extensions/discord/src/channel.loaders.ts
124
+ let discordProviderRuntimePromise;
125
+ let discordProbeRuntimePromise;
126
+ let discordAuditModulePromise;
127
+ let discordSendModulePromise;
128
+ let discordDirectoryLiveModulePromise;
129
+ const loadDiscordDirectoryConfigModule = createLazyRuntimeModule(() => import("./directory-config-CYbuMmPS.js").then((n) => n.t));
130
+ const loadDiscordResolveChannelsModule = createLazyRuntimeModule(() => import("./resolve-channels-0LX4pUbB.js").then((n) => n.n));
131
+ const loadDiscordResolveUsersModule = createLazyRuntimeModule(() => import("./resolve-users-CztOv0Qs.js").then((n) => n.n));
132
+ const loadDiscordThreadBindingsManagerModule = createLazyRuntimeModule(() => import("./thread-bindings.manager-0YBHGemk.js").then((n) => n.a));
133
+ const loadDiscordTargetResolverModule = createLazyRuntimeModule(() => import("./target-resolver-BrtFQtoK.js").then((n) => n.r));
134
+ async function loadDiscordProviderRuntime() {
135
+ discordProviderRuntimePromise ??= import("./provider.runtime-CP3oHLls.js");
136
+ return await discordProviderRuntimePromise;
137
+ }
138
+ async function loadDiscordProbeRuntime() {
139
+ discordProbeRuntimePromise ??= import("./probe.runtime-DQBchZzv.js");
140
+ return await discordProbeRuntimePromise;
141
+ }
142
+ async function loadDiscordAuditModule() {
143
+ discordAuditModulePromise ??= import("./audit-DoiK49WO.js").then((n) => n.n);
144
+ return await discordAuditModulePromise;
145
+ }
146
+ async function loadDiscordSendModule() {
147
+ discordSendModulePromise ??= import("./send-DCtPCHGk.js").then((n) => n.t);
148
+ return await discordSendModulePromise;
149
+ }
150
+ async function loadDiscordDirectoryLiveModule() {
151
+ discordDirectoryLiveModulePromise ??= import("./directory-live-DX4dLRpJ.js").then((n) => n.t);
152
+ return await discordDirectoryLiveModulePromise;
153
+ }
154
+ //#endregion
155
+ //#region extensions/discord/src/group-policy.ts
156
+ function normalizeDiscordSlug(value) {
157
+ return normalizeAtHashSlug(value);
158
+ }
159
+ function resolveDiscordGuildEntry(guilds, groupSpace) {
160
+ if (!guilds || Object.keys(guilds).length === 0) return null;
161
+ const space = normalizeOptionalString(groupSpace) ?? "";
162
+ if (space && guilds[space]) return guilds[space];
163
+ const normalized = normalizeDiscordSlug(space);
164
+ if (normalized && guilds[normalized]) return guilds[normalized];
165
+ if (normalized) {
166
+ const match = Object.values(guilds).find((entry) => normalizeDiscordSlug(entry?.slug ?? void 0) === normalized);
167
+ if (match) return match;
168
+ }
169
+ return guilds["*"] ?? null;
170
+ }
171
+ function resolveDiscordChannelEntry(channelEntries, params) {
172
+ if (!channelEntries || Object.keys(channelEntries).length === 0) return;
173
+ const groupChannel = params.groupChannel;
174
+ const channelSlug = normalizeDiscordSlug(groupChannel);
175
+ return (params.groupId ? channelEntries[params.groupId] : void 0) ?? (channelSlug ? channelEntries[channelSlug] ?? channelEntries[`#${channelSlug}`] : void 0) ?? (groupChannel ? channelEntries[normalizeDiscordSlug(groupChannel)] : void 0);
176
+ }
177
+ function resolveSenderToolsEntry(entry, params) {
178
+ if (!entry) return;
179
+ return resolveToolsBySender({
180
+ toolsBySender: entry.toolsBySender,
181
+ senderId: params.senderId,
182
+ senderName: params.senderName,
183
+ senderUsername: params.senderUsername,
184
+ senderE164: params.senderE164
185
+ }) ?? entry.tools;
186
+ }
187
+ function resolveDiscordPolicyContext(params) {
188
+ const guildEntry = resolveDiscordGuildEntry((params.accountId ? params.cfg.channels?.discord?.accounts?.[params.accountId]?.guilds : void 0) ?? params.cfg.channels?.discord?.guilds, params.groupSpace);
189
+ const channelEntries = guildEntry?.channels;
190
+ return {
191
+ guildEntry,
192
+ channelEntry: channelEntries && Object.keys(channelEntries).length > 0 ? resolveDiscordChannelEntry(channelEntries, params) : void 0
193
+ };
194
+ }
195
+ function resolveDiscordGroupRequireMention(params) {
196
+ const context = resolveDiscordPolicyContext(params);
197
+ if (typeof context.channelEntry?.requireMention === "boolean") return context.channelEntry.requireMention;
198
+ if (typeof context.guildEntry?.requireMention === "boolean") return context.guildEntry.requireMention;
199
+ return true;
200
+ }
201
+ function resolveDiscordGroupToolPolicy(params) {
202
+ const context = resolveDiscordPolicyContext(params);
203
+ const channelPolicy = resolveSenderToolsEntry(context.channelEntry, params);
204
+ if (channelPolicy) return channelPolicy;
205
+ return resolveSenderToolsEntry(context.guildEntry, params);
206
+ }
207
+ //#endregion
208
+ //#region extensions/discord/src/status-issues.ts
209
+ function readDiscordAccountStatus(value) {
210
+ if (!isRecord$1(value)) return null;
211
+ return {
212
+ accountId: value.accountId,
213
+ enabled: value.enabled,
214
+ configured: value.configured,
215
+ running: value.running,
216
+ connected: value.connected,
217
+ healthState: value.healthState,
218
+ application: value.application,
219
+ audit: value.audit
220
+ };
221
+ }
222
+ function readDiscordApplicationSummary(value) {
223
+ if (!isRecord$1(value)) return {};
224
+ const intentsRaw = value.intents;
225
+ if (!isRecord$1(intentsRaw)) return {};
226
+ return { intents: { messageContent: intentsRaw.messageContent === "enabled" || intentsRaw.messageContent === "limited" || intentsRaw.messageContent === "disabled" ? intentsRaw.messageContent : void 0 } };
227
+ }
228
+ function readDiscordPermissionsAuditSummary(value) {
229
+ if (!isRecord$1(value)) return {};
230
+ const unresolvedChannels = typeof value.unresolvedChannels === "number" && Number.isFinite(value.unresolvedChannels) ? value.unresolvedChannels : void 0;
231
+ const channelsRaw = value.channels;
232
+ return {
233
+ unresolvedChannels,
234
+ channels: Array.isArray(channelsRaw) ? channelsRaw.map((entry) => {
235
+ if (!isRecord$1(entry)) return null;
236
+ const channelId = asString(entry.channelId);
237
+ if (!channelId) return null;
238
+ const ok = typeof entry.ok === "boolean" ? entry.ok : void 0;
239
+ const missing = Array.isArray(entry.missing) ? entry.missing.map((v) => asString(v)).filter(Boolean) : void 0;
240
+ const error = asString(entry.error) ?? null;
241
+ const matchKey = asString(entry.matchKey) ?? void 0;
242
+ const matchSource = asString(entry.matchSource) ?? void 0;
243
+ return {
244
+ channelId,
245
+ ok,
246
+ missing: missing?.length ? missing : void 0,
247
+ error,
248
+ matchKey,
249
+ matchSource
250
+ };
251
+ }).filter(Boolean) : void 0
252
+ };
253
+ }
254
+ function collectDiscordStatusIssues(accounts) {
255
+ const issues = [];
256
+ for (const entry of accounts) {
257
+ const account = readDiscordAccountStatus(entry);
258
+ if (!account) continue;
259
+ const accountId = resolveEnabledConfiguredAccountId(account);
260
+ if (!accountId) continue;
261
+ const running = account.running === true;
262
+ const healthState = asString(account.healthState);
263
+ if (healthState === "stale-socket" || healthState === "stuck" || healthState === "disconnected" || healthState === "not-running") {
264
+ const runningLabel = running ? "running" : "not running";
265
+ issues.push({
266
+ channel: "discord",
267
+ accountId,
268
+ kind: "runtime",
269
+ message: `Discord gateway transport is degraded (${healthState}; account is ${runningLabel}).`,
270
+ fix: "Check gateway event-loop health and Discord connectivity, then restart the Discord channel or gateway if the transport does not recover."
271
+ });
272
+ } else if (running && account.connected === false) issues.push({
273
+ channel: "discord",
274
+ accountId,
275
+ kind: "runtime",
276
+ message: "Discord gateway transport is running but disconnected.",
277
+ fix: "Check gateway logs for Discord websocket errors and wait for reconnect; restart the Discord channel or gateway if it does not recover."
278
+ });
279
+ if (readDiscordApplicationSummary(account.application).intents?.messageContent === "disabled") issues.push({
280
+ channel: "discord",
281
+ accountId,
282
+ kind: "intent",
283
+ message: "Message Content Intent is disabled. Bot may not see normal channel messages.",
284
+ fix: "Enable Message Content Intent in Discord Dev Portal → Bot → Privileged Gateway Intents, or require mention-only operation."
285
+ });
286
+ const audit = readDiscordPermissionsAuditSummary(account.audit);
287
+ if (audit.unresolvedChannels && audit.unresolvedChannels > 0) issues.push({
288
+ channel: "discord",
289
+ accountId,
290
+ kind: "config",
291
+ message: `Some configured guild channels are not numeric IDs (unresolvedChannels=${audit.unresolvedChannels}). Permission audit can only check numeric channel IDs.`,
292
+ fix: "Use numeric channel IDs as keys in channels.discord.guilds.*.channels (then rerun channels status --probe)."
293
+ });
294
+ for (const channel of audit.channels ?? []) {
295
+ if (channel.ok === true) continue;
296
+ const missing = channel.missing?.length ? ` missing ${channel.missing.join(", ")}` : "";
297
+ const error = channel.error ? `: ${channel.error}` : "";
298
+ const baseMessage = `Channel ${channel.channelId} permission check failed.${missing}${error}`;
299
+ issues.push({
300
+ channel: "discord",
301
+ accountId,
302
+ kind: "permissions",
303
+ message: appendMatchMetadata(baseMessage, {
304
+ matchKey: channel.matchKey,
305
+ matchSource: channel.matchSource
306
+ }),
307
+ fix: "Ensure the bot role can view + send in this channel (and that channel overrides don't deny it)."
308
+ });
309
+ }
310
+ }
311
+ return issues;
312
+ }
313
+ //#endregion
314
+ //#region extensions/discord/src/channel.ts
315
+ const DISCORD_ACCOUNT_STARTUP_STAGGER_MS = 1e4;
316
+ const discordMessageAdapter = createChannelMessageAdapterFromOutbound({
317
+ id: "discord",
318
+ outbound: discordOutbound,
319
+ live: {
320
+ capabilities: {
321
+ draftPreview: true,
322
+ previewFinalization: true,
323
+ progressUpdates: true
324
+ },
325
+ finalizer: { capabilities: {
326
+ finalEdit: true,
327
+ normalFallback: true,
328
+ discardPending: true
329
+ } }
330
+ }
331
+ });
332
+ function startDiscordStartupProbe(params) {
333
+ (async () => {
334
+ try {
335
+ const probe = await (await loadDiscordProbeRuntime()).probeDiscord(params.token, 2500, { includeApplication: true });
336
+ if (params.abortSignal.aborted) return;
337
+ params.setStatus({
338
+ accountId: params.accountId,
339
+ bot: probe.bot,
340
+ application: probe.application
341
+ });
342
+ if (probe.ok) {
343
+ const username = probe.bot?.username?.trim();
344
+ if (username) params.log?.info?.(`[${params.accountId}] Discord bot probe resolved @${username}`);
345
+ } else if (getDiscordRuntime().logging.shouldLogVerbose()) params.log?.debug?.(`[${params.accountId}] bot probe degraded: ${probe.error ?? `status ${probe.status ?? "unknown"}`}`);
346
+ const messageContent = probe.application?.intents?.messageContent;
347
+ if (messageContent === "disabled") params.log?.warn?.(`[${params.accountId}] Discord Message Content Intent is disabled; bot may not respond to channel messages. Enable it in Discord Dev Portal (Bot → Privileged Gateway Intents) or require mentions.`);
348
+ else if (messageContent === "limited") params.log?.info?.(`[${params.accountId}] Discord Message Content Intent is limited; bots under 100 servers can use it without verification.`);
349
+ } catch (err) {
350
+ if (!params.abortSignal.aborted) params.setStatus({
351
+ accountId: params.accountId,
352
+ bot: void 0,
353
+ application: void 0
354
+ });
355
+ if (getDiscordRuntime().logging.shouldLogVerbose()) params.log?.debug?.(`[${params.accountId}] bot probe failed: ${String(err)}`);
356
+ }
357
+ })();
358
+ }
359
+ function shouldTreatDiscordDeliveredTextAsVisible(params) {
360
+ return params.kind === "block" && typeof params.text === "string" && params.text.trim().length > 0;
361
+ }
362
+ function resolveRuntimeDiscordMessageActions() {
363
+ try {
364
+ return getDiscordRuntime().channel?.discord?.messageActions ?? null;
365
+ } catch {
366
+ return null;
367
+ }
368
+ }
369
+ const discordMessageActions = {
370
+ resolveExecutionMode: (ctx) => resolveRuntimeDiscordMessageActions()?.resolveExecutionMode?.(ctx) ?? discordMessageActions$1.resolveExecutionMode?.(ctx) ?? "local",
371
+ describeMessageTool: (ctx) => resolveRuntimeDiscordMessageActions()?.describeMessageTool?.(ctx) ?? discordMessageActions$1.describeMessageTool?.(ctx) ?? null,
372
+ extractToolSend: (ctx) => resolveRuntimeDiscordMessageActions()?.extractToolSend?.(ctx) ?? discordMessageActions$1.extractToolSend?.(ctx) ?? null,
373
+ prepareSendPayload: (ctx) => resolveRuntimeDiscordMessageActions()?.prepareSendPayload?.(ctx) ?? discordMessageActions$1.prepareSendPayload?.(ctx) ?? null,
374
+ handleAction: async (ctx) => {
375
+ const runtimeHandleAction = resolveRuntimeDiscordMessageActions()?.handleAction;
376
+ if (runtimeHandleAction) return await runtimeHandleAction(ctx);
377
+ if (!discordMessageActions$1.handleAction) throw new Error("Discord message actions not available");
378
+ return await discordMessageActions$1.handleAction(ctx);
379
+ }
380
+ };
381
+ function resolveDiscordStartupDelayMs(cfg, accountId) {
382
+ const startupIndex = listDiscordAccountIds(cfg).filter((candidateId) => {
383
+ const candidate = resolveDiscordAccount({
384
+ cfg,
385
+ accountId: candidateId
386
+ });
387
+ return candidate.enabled && (resolveConfiguredFromCredentialStatuses(candidate) ?? Boolean(normalizeOptionalString(candidate.token)));
388
+ }).findIndex((candidateId) => candidateId === accountId);
389
+ return startupIndex <= 0 ? 0 : startupIndex * DISCORD_ACCOUNT_STARTUP_STAGGER_MS;
390
+ }
391
+ function formatDiscordIntents(intents) {
392
+ if (!intents) return "unknown";
393
+ return [
394
+ `messageContent=${intents.messageContent ?? "unknown"}`,
395
+ `guildMembers=${intents.guildMembers ?? "unknown"}`,
396
+ `presence=${intents.presence ?? "unknown"}`
397
+ ].join(" ");
398
+ }
399
+ const resolveDiscordAllowlistGroupOverrides = createNestedAllowlistOverrideResolver({
400
+ resolveRecord: (account) => account.config.guilds,
401
+ outerLabel: (guildKey) => `guild ${guildKey}`,
402
+ resolveOuterEntries: (guildCfg) => guildCfg?.users,
403
+ resolveChildren: (guildCfg) => guildCfg?.channels,
404
+ innerLabel: (guildKey, channelKey) => `guild ${guildKey} / channel ${channelKey}`,
405
+ resolveInnerEntries: (channelCfg) => channelCfg?.users
406
+ });
407
+ const resolveDiscordAllowlistNames = createAccountScopedAllowlistNameResolver({
408
+ resolveAccount: resolveDiscordAccount,
409
+ resolveToken: (account) => account.token,
410
+ resolveNames: async ({ token, entries }) => (await loadDiscordResolveUsersModule()).resolveDiscordUserAllowlist({
411
+ token,
412
+ entries
413
+ })
414
+ });
415
+ function toConversationLifecycleBinding(binding) {
416
+ return {
417
+ boundAt: binding.boundAt,
418
+ lastActivityAt: typeof binding.lastActivityAt === "number" ? binding.lastActivityAt : binding.boundAt,
419
+ idleTimeoutMs: typeof binding.idleTimeoutMs === "number" ? binding.idleTimeoutMs : void 0,
420
+ maxAgeMs: typeof binding.maxAgeMs === "number" ? binding.maxAgeMs : void 0
421
+ };
422
+ }
423
+ const discordPlugin = createChatChannelPlugin({
424
+ base: {
425
+ ...createDiscordPluginBase({ setup: discordSetupAdapter }),
426
+ allowlist: {
427
+ ...buildLegacyDmAccountAllowlistAdapter({
428
+ channelId: "discord",
429
+ resolveAccount: resolveDiscordAccount,
430
+ normalize: ({ cfg, accountId, values }) => discordConfigAdapter.formatAllowFrom({
431
+ cfg,
432
+ accountId,
433
+ allowFrom: values
434
+ }),
435
+ resolveDmAllowFrom: (account, { cfg }) => resolveDiscordAccountAllowFrom({
436
+ cfg,
437
+ accountId: account.accountId
438
+ }),
439
+ resolveGroupPolicy: (account) => account.config.groupPolicy,
440
+ resolveGroupOverrides: resolveDiscordAllowlistGroupOverrides
441
+ }),
442
+ resolveNames: resolveDiscordAllowlistNames
443
+ },
444
+ groups: {
445
+ resolveRequireMention: resolveDiscordGroupRequireMention,
446
+ resolveToolPolicy: resolveDiscordGroupToolPolicy
447
+ },
448
+ mentions: { stripPatterns: () => ["<@!?\\d+>"] },
449
+ agentPrompt: { messageToolHints: () => [
450
+ "- Discord mentions: use canonical outbound syntax: users `<@USER_ID>`, channels `<#CHANNEL_ID>`, and roles `<@&ROLE_ID>`. Plain `@name` text only pings when a configured `mentionAliases` entry rewrites it; do not use the legacy `<@!USER_ID>` nickname form.",
451
+ "- Discord components: set `components` when sending messages to include buttons, selects, or v2 containers.",
452
+ "- Forms: add `components.modal` (title, fields). Klaw adds a trigger button and routes submissions as new messages."
453
+ ] },
454
+ messaging: {
455
+ targetPrefixes: ["discord"],
456
+ normalizeTarget: normalizeDiscordMessagingTarget,
457
+ resolveInboundConversation: ({ from, to, conversationId, isGroup }) => resolveDiscordInboundConversation({
458
+ from,
459
+ to,
460
+ conversationId,
461
+ isGroup
462
+ }),
463
+ normalizeExplicitSessionKey: ({ sessionKey, ctx }) => normalizeExplicitDiscordSessionKey(sessionKey, ctx),
464
+ resolveSessionTarget: ({ id }) => normalizeDiscordMessagingTarget(`channel:${id}`),
465
+ parseExplicitTarget: ({ raw }) => parseDiscordExplicitTarget(raw),
466
+ inferTargetChatType: ({ to }) => parseDiscordExplicitTarget(to)?.chatType,
467
+ buildCrossContextPresentation: buildDiscordCrossContextPresentation,
468
+ resolveOutboundSessionRoute: (params) => resolveDiscordOutboundSessionRoute(params),
469
+ targetResolver: {
470
+ looksLikeId: looksLikeDiscordTargetId,
471
+ hint: "<channelId|user:ID|channel:ID>",
472
+ resolveTarget: async ({ cfg, accountId, input, normalized, preferredKind }) => {
473
+ const resolved = await (await loadDiscordTargetResolverModule()).resolveDiscordTarget(input, {
474
+ cfg,
475
+ accountId
476
+ }, preferredKind === "user" ? { defaultKind: "user" } : preferredKind === "channel" || preferredKind === "group" ? { defaultKind: "channel" } : {});
477
+ if (!resolved) return null;
478
+ return {
479
+ to: resolved.normalized,
480
+ kind: resolved.kind === "user" ? "user" : "channel",
481
+ display: resolved.raw,
482
+ source: resolved.normalized === normalized ? "normalized" : "directory"
483
+ };
484
+ }
485
+ }
486
+ },
487
+ approvalCapability: getDiscordApprovalCapability(),
488
+ directory: createChannelDirectoryAdapter({
489
+ listPeers: async (params) => (await loadDiscordDirectoryConfigModule()).listDiscordDirectoryPeersFromConfig(params),
490
+ listGroups: async (params) => (await loadDiscordDirectoryConfigModule()).listDiscordDirectoryGroupsFromConfig(params),
491
+ ...createRuntimeDirectoryLiveAdapter({
492
+ getRuntime: loadDiscordDirectoryLiveModule,
493
+ listPeersLive: (runtime) => runtime.listDiscordDirectoryPeersLive,
494
+ listGroupsLive: (runtime) => runtime.listDiscordDirectoryGroupsLive
495
+ })
496
+ }),
497
+ message: discordMessageAdapter,
498
+ resolver: { resolveTargets: async ({ cfg, accountId, inputs, kind }) => {
499
+ const account = resolveDiscordAccount({
500
+ cfg,
501
+ accountId
502
+ });
503
+ if (kind === "group") return resolveTargetsWithOptionalToken({
504
+ token: account.token,
505
+ inputs,
506
+ missingTokenNote: "missing Discord token",
507
+ resolveWithToken: async ({ token, inputs }) => (await loadDiscordResolveChannelsModule()).resolveDiscordChannelAllowlist({
508
+ token,
509
+ entries: inputs
510
+ }),
511
+ mapResolved: (entry) => ({
512
+ input: entry.input,
513
+ resolved: entry.resolved,
514
+ id: entry.channelId ?? entry.guildId,
515
+ name: entry.channelName ?? entry.guildName ?? (entry.guildId && !entry.channelId ? entry.guildId : void 0),
516
+ note: entry.note
517
+ })
518
+ });
519
+ return resolveTargetsWithOptionalToken({
520
+ token: account.token,
521
+ inputs,
522
+ missingTokenNote: "missing Discord token",
523
+ resolveWithToken: async ({ token, inputs }) => (await loadDiscordResolveUsersModule()).resolveDiscordUserAllowlist({
524
+ token,
525
+ entries: inputs
526
+ }),
527
+ mapResolved: (entry) => ({
528
+ input: entry.input,
529
+ resolved: entry.resolved,
530
+ id: entry.id,
531
+ name: entry.name,
532
+ note: entry.note
533
+ })
534
+ });
535
+ } },
536
+ actions: discordMessageActions,
537
+ bindings: {
538
+ compileConfiguredBinding: ({ conversationId }) => normalizeDiscordAcpConversationId(conversationId),
539
+ matchInboundConversation: ({ compiledBinding, conversationId, parentConversationId }) => matchDiscordAcpConversation({
540
+ bindingConversationId: compiledBinding.conversationId,
541
+ conversationId,
542
+ parentConversationId
543
+ }),
544
+ resolveCommandConversation: ({ threadId, threadParentId, parentSessionKey, from, chatType, originatingTo, commandTo, fallbackTo }) => resolveDiscordCommandConversation({
545
+ threadId,
546
+ threadParentId,
547
+ parentSessionKey,
548
+ from,
549
+ chatType,
550
+ originatingTo,
551
+ commandTo,
552
+ fallbackTo
553
+ })
554
+ },
555
+ conversationBindings: {
556
+ supportsCurrentConversationBinding: true,
557
+ defaultTopLevelPlacement: "child",
558
+ createManager: async ({ cfg, accountId }) => (await loadDiscordThreadBindingsManagerModule()).createThreadBindingManager({
559
+ cfg,
560
+ accountId: accountId ?? void 0,
561
+ persist: false,
562
+ enableSweeper: false
563
+ }),
564
+ setIdleTimeoutBySessionKey: ({ targetSessionKey, accountId, idleTimeoutMs }) => setThreadBindingIdleTimeoutBySessionKey({
565
+ targetSessionKey,
566
+ accountId: accountId ?? void 0,
567
+ idleTimeoutMs
568
+ }).map(toConversationLifecycleBinding),
569
+ setMaxAgeBySessionKey: ({ targetSessionKey, accountId, maxAgeMs }) => setThreadBindingMaxAgeBySessionKey({
570
+ targetSessionKey,
571
+ accountId: accountId ?? void 0,
572
+ maxAgeMs
573
+ }).map(toConversationLifecycleBinding)
574
+ },
575
+ heartbeat: { sendTyping: async ({ cfg, to, accountId, threadId }) => {
576
+ const target = parseDiscordTarget(resolveDiscordAttachedOutboundTarget({
577
+ to,
578
+ threadId
579
+ }), { defaultKind: "channel" });
580
+ if (!target || target.kind !== "channel") return;
581
+ await (await loadDiscordSendModule()).sendTypingDiscord(target.id, {
582
+ cfg,
583
+ accountId: accountId ?? void 0
584
+ });
585
+ } },
586
+ status: createComputedAccountStatusAdapter({
587
+ defaultRuntime: createDefaultChannelRuntimeState(DEFAULT_ACCOUNT_ID, {
588
+ connected: false,
589
+ reconnectAttempts: 0,
590
+ lastConnectedAt: null,
591
+ lastDisconnect: null,
592
+ lastEventAt: null
593
+ }),
594
+ collectStatusIssues: collectDiscordStatusIssues,
595
+ buildChannelSummary: ({ snapshot }) => buildTokenChannelStatusSummary(snapshot, { includeMode: false }),
596
+ probeAccount: async ({ account, timeoutMs }) => (await loadDiscordProbeRuntime()).probeDiscord(account.token, timeoutMs, { includeApplication: true }),
597
+ formatCapabilitiesProbe: ({ probe }) => {
598
+ const discordProbe = probe;
599
+ const lines = [];
600
+ if (discordProbe?.bot?.username) {
601
+ const botId = discordProbe.bot.id ? ` (${discordProbe.bot.id})` : "";
602
+ lines.push({ text: `Bot: @${discordProbe.bot.username}${botId}` });
603
+ }
604
+ if (discordProbe?.application?.intents) lines.push({ text: `Intents: ${formatDiscordIntents(discordProbe.application.intents)}` });
605
+ return lines;
606
+ },
607
+ buildCapabilitiesDiagnostics: async ({ account, target }) => {
608
+ if (!target?.trim()) return;
609
+ const parsedTarget = parseDiscordTarget(target.trim(), { defaultKind: "channel" });
610
+ const details = { target: {
611
+ raw: target,
612
+ normalized: parsedTarget?.normalized,
613
+ kind: parsedTarget?.kind,
614
+ channelId: parsedTarget?.kind === "channel" ? parsedTarget.id : void 0
615
+ } };
616
+ if (!parsedTarget || parsedTarget.kind !== "channel") return {
617
+ details,
618
+ lines: [{
619
+ text: "Permissions: Target looks like a DM user; pass channel:<id> to audit channel permissions.",
620
+ tone: "error"
621
+ }]
622
+ };
623
+ const token = account.token?.trim();
624
+ if (!token) return {
625
+ details,
626
+ lines: [{
627
+ text: "Permissions: Discord bot token missing for permission audit.",
628
+ tone: "error"
629
+ }]
630
+ };
631
+ const statusCfg = { channels: { discord: { accounts: { [account.accountId]: {
632
+ ...account.config,
633
+ token
634
+ } } } } };
635
+ try {
636
+ const perms = await (await loadDiscordSendModule()).fetchChannelPermissionsDiscord(parsedTarget.id, {
637
+ cfg: statusCfg,
638
+ token,
639
+ accountId: account.accountId ?? void 0
640
+ });
641
+ const missingRequired = resolveRequiredDiscordChannelPermissions(perms.channelType).filter((permission) => !perms.permissions.includes(permission));
642
+ details.permissions = {
643
+ channelId: perms.channelId,
644
+ guildId: perms.guildId,
645
+ isDm: perms.isDm,
646
+ channelType: perms.channelType,
647
+ permissions: perms.permissions,
648
+ missingRequired,
649
+ raw: perms.raw
650
+ };
651
+ return {
652
+ details,
653
+ lines: [{ text: `Permissions (${perms.channelId}): ${perms.permissions.length ? perms.permissions.join(", ") : "none"}` }, missingRequired.length > 0 ? {
654
+ text: `Missing required: ${missingRequired.join(", ")}`,
655
+ tone: "warn"
656
+ } : {
657
+ text: "Missing required: none",
658
+ tone: "success"
659
+ }]
660
+ };
661
+ } catch (err) {
662
+ const message = formatErrorMessage(err);
663
+ details.permissions = {
664
+ channelId: parsedTarget.id,
665
+ error: message
666
+ };
667
+ return {
668
+ details,
669
+ lines: [{
670
+ text: `Permissions: ${message}`,
671
+ tone: "error"
672
+ }]
673
+ };
674
+ }
675
+ },
676
+ auditAccount: async ({ account, timeoutMs, cfg }) => {
677
+ const { auditDiscordChannelPermissions, collectDiscordAuditChannelIds } = await loadDiscordAuditModule();
678
+ const { channelIds, unresolvedChannels } = collectDiscordAuditChannelIds({
679
+ cfg,
680
+ accountId: account.accountId
681
+ });
682
+ if (!channelIds.length && unresolvedChannels === 0) return;
683
+ const botToken = account.token?.trim();
684
+ if (!botToken) return {
685
+ ok: unresolvedChannels === 0,
686
+ checkedChannels: 0,
687
+ unresolvedChannels,
688
+ channels: [],
689
+ elapsedMs: 0
690
+ };
691
+ return {
692
+ ...await auditDiscordChannelPermissions({
693
+ cfg,
694
+ token: botToken,
695
+ accountId: account.accountId,
696
+ channelIds,
697
+ timeoutMs
698
+ }),
699
+ unresolvedChannels
700
+ };
701
+ },
702
+ resolveAccountSnapshot: ({ account, runtime, probe, audit }) => {
703
+ const configured = resolveConfiguredFromCredentialStatuses(account) ?? Boolean(account.token?.trim());
704
+ const app = runtime?.application ?? probe?.application;
705
+ const bot = runtime?.bot ?? probe?.bot;
706
+ return {
707
+ accountId: account.accountId,
708
+ name: account.name,
709
+ enabled: account.enabled,
710
+ configured,
711
+ extra: {
712
+ ...projectCredentialSnapshotFields(account),
713
+ connected: runtime?.connected ?? false,
714
+ reconnectAttempts: runtime?.reconnectAttempts,
715
+ lastConnectedAt: runtime?.lastConnectedAt ?? null,
716
+ lastDisconnect: runtime?.lastDisconnect ?? null,
717
+ lastEventAt: runtime?.lastEventAt ?? null,
718
+ application: app ?? void 0,
719
+ bot: bot ?? void 0,
720
+ audit
721
+ }
722
+ };
723
+ }
724
+ }),
725
+ gateway: { startAccount: async (ctx) => {
726
+ const account = ctx.account;
727
+ if (account.tokenStatus === "configured_unavailable") throw new Error(`Discord bot token configured for account "${account.accountId}" is unavailable; resolve SecretRefs against the active runtime snapshot before using this account.`);
728
+ const startupDelayMs = resolveDiscordStartupDelayMs(ctx.cfg, account.accountId);
729
+ if (startupDelayMs > 0) {
730
+ ctx.log?.info(`[${account.accountId}] delaying provider startup ${Math.round(startupDelayMs / 1e3)}s to reduce Discord startup rate limits`);
731
+ try {
732
+ await sleepWithAbort(startupDelayMs, ctx.abortSignal);
733
+ } catch {
734
+ return;
735
+ }
736
+ }
737
+ const token = account.token.trim();
738
+ startDiscordStartupProbe({
739
+ accountId: account.accountId,
740
+ token,
741
+ abortSignal: ctx.abortSignal,
742
+ setStatus: ctx.setStatus,
743
+ log: ctx.log
744
+ });
745
+ ctx.log?.info(`[${account.accountId}] starting provider`);
746
+ return (await loadDiscordProviderRuntime()).monitorDiscordProvider({
747
+ token,
748
+ accountId: account.accountId,
749
+ config: ctx.cfg,
750
+ runtime: ctx.runtime,
751
+ channelRuntime: ctx.channelRuntime,
752
+ abortSignal: ctx.abortSignal,
753
+ mediaMaxMb: account.config.mediaMaxMb,
754
+ historyLimit: account.config.historyLimit,
755
+ setStatus: (patch) => ctx.setStatus({
756
+ accountId: account.accountId,
757
+ ...patch
758
+ })
759
+ });
760
+ } }
761
+ },
762
+ pairing: { text: {
763
+ idLabel: "discordUserId",
764
+ message: PAIRING_APPROVED_MESSAGE,
765
+ normalizeAllowEntry: createPairingPrefixStripper(/^(discord|user):/i),
766
+ notify: async ({ cfg, id, message, accountId }) => {
767
+ await (await loadDiscordSendModule()).sendMessageDiscord(`user:${id}`, message, {
768
+ cfg,
769
+ ...accountId ? { accountId } : {}
770
+ });
771
+ }
772
+ } },
773
+ security: discordSecurityAdapter,
774
+ threading: { scopedAccountReplyToMode: {
775
+ resolveAccount: (cfg, accountId) => resolveDiscordAccount({
776
+ cfg,
777
+ accountId
778
+ }),
779
+ resolveReplyToMode: (account) => account.config.replyToMode,
780
+ fallback: "off"
781
+ } },
782
+ outbound: {
783
+ ...discordOutbound,
784
+ preferFinalAssistantVisibleText: true,
785
+ shouldTreatDeliveredTextAsVisible: shouldTreatDiscordDeliveredTextAsVisible,
786
+ shouldSuppressLocalPayloadPrompt: ({ cfg, accountId, payload, hint }) => shouldSuppressLocalDiscordExecApprovalPrompt({
787
+ cfg,
788
+ accountId,
789
+ payload,
790
+ hint
791
+ })
792
+ }
793
+ });
794
+ //#endregion
795
+ export { resolveDiscordGroupToolPolicy as i, collectDiscordStatusIssues as n, resolveDiscordGroupRequireMention as r, discordPlugin as t };