@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,549 @@
1
+ import { u as resolveDiscordChannelInfoSafe } from "./thread-bindings.discord-api-ssGH5wc2.js";
2
+ import { a as mergeAbortSignals } from "./timeouts-CEwuGaWT.js";
3
+ import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, normalizeOptionalStringifiedId } from "klaw/plugin-sdk/string-coerce-runtime";
4
+ import { ComponentType, StickerFormatType } from "discord-api-types/v10";
5
+ import { saveRemoteMedia } from "klaw/plugin-sdk/media-runtime";
6
+ import { buildMediaPayload } from "klaw/plugin-sdk/reply-payload";
7
+ import { logVerbose } from "klaw/plugin-sdk/runtime-env";
8
+ import { getFileExtension } from "klaw/plugin-sdk/media-mime";
9
+ //#region extensions/discord/src/monitor/message-channel-info.ts
10
+ const DISCORD_CHANNEL_INFO_CACHE_TTL_MS = 300 * 1e3;
11
+ const DISCORD_CHANNEL_INFO_NEGATIVE_CACHE_TTL_MS = 30 * 1e3;
12
+ const DISCORD_CHANNEL_INFO_CACHE = /* @__PURE__ */ new Map();
13
+ function normalizeDiscordChannelId(value) {
14
+ return normalizeOptionalStringifiedId(value) ?? "";
15
+ }
16
+ function resolveDiscordMessageChannelId(params) {
17
+ const message = params.message;
18
+ return normalizeDiscordChannelId(message.channelId) || normalizeDiscordChannelId(message.channel_id) || normalizeDiscordChannelId(message.rawData?.channel_id) || normalizeDiscordChannelId(params.eventChannelId);
19
+ }
20
+ async function resolveDiscordChannelInfo(client, channelId) {
21
+ const cached = DISCORD_CHANNEL_INFO_CACHE.get(channelId);
22
+ if (cached) {
23
+ if (cached.expiresAt > Date.now()) return cached.value;
24
+ DISCORD_CHANNEL_INFO_CACHE.delete(channelId);
25
+ }
26
+ try {
27
+ const channel = await client.fetchChannel(channelId);
28
+ if (!channel) {
29
+ DISCORD_CHANNEL_INFO_CACHE.set(channelId, {
30
+ value: null,
31
+ expiresAt: Date.now() + DISCORD_CHANNEL_INFO_NEGATIVE_CACHE_TTL_MS
32
+ });
33
+ return null;
34
+ }
35
+ const channelInfo = resolveDiscordChannelInfoSafe(channel);
36
+ const rawChannel = channel;
37
+ const type = channelInfo.type ?? rawChannel.type;
38
+ if (type === void 0) return null;
39
+ const payload = {
40
+ type,
41
+ name: channelInfo.name,
42
+ topic: channelInfo.topic,
43
+ parentId: channelInfo.parentId,
44
+ ownerId: channelInfo.ownerId
45
+ };
46
+ DISCORD_CHANNEL_INFO_CACHE.set(channelId, {
47
+ value: payload,
48
+ expiresAt: Date.now() + DISCORD_CHANNEL_INFO_CACHE_TTL_MS
49
+ });
50
+ return payload;
51
+ } catch (err) {
52
+ logVerbose(`discord: failed to fetch channel ${channelId}: ${String(err)}`);
53
+ DISCORD_CHANNEL_INFO_CACHE.set(channelId, {
54
+ value: null,
55
+ expiresAt: Date.now() + DISCORD_CHANNEL_INFO_NEGATIVE_CACHE_TTL_MS
56
+ });
57
+ return null;
58
+ }
59
+ }
60
+ //#endregion
61
+ //#region extensions/discord/src/monitor/message-forwarded.ts
62
+ const FORWARD_MESSAGE_REFERENCE_TYPE = 1;
63
+ function normalizeDiscordStickerItems(value) {
64
+ if (!Array.isArray(value)) return [];
65
+ return value.filter((entry) => Boolean(entry) && typeof entry === "object" && typeof entry.id === "string" && typeof entry.name === "string");
66
+ }
67
+ function resolveDiscordMessageStickers(message) {
68
+ const stickers = message.stickers;
69
+ const normalized = normalizeDiscordStickerItems(stickers);
70
+ if (normalized.length > 0) return normalized;
71
+ const rawData = message.rawData;
72
+ return normalizeDiscordStickerItems(rawData?.sticker_items ?? rawData?.stickers);
73
+ }
74
+ function resolveDiscordSnapshotStickers(snapshot) {
75
+ return normalizeDiscordStickerItems(snapshot.stickers ?? snapshot.sticker_items);
76
+ }
77
+ function hasDiscordMessageStickers(message) {
78
+ return resolveDiscordMessageStickers(message).length > 0;
79
+ }
80
+ function resolveDiscordMessageSnapshots(message) {
81
+ const rawData = message.rawData;
82
+ return normalizeDiscordMessageSnapshots(rawData?.message_snapshots ?? message.message_snapshots ?? message.messageSnapshots);
83
+ }
84
+ function normalizeDiscordMessageSnapshots(snapshots) {
85
+ if (!Array.isArray(snapshots)) return [];
86
+ return snapshots.filter((entry) => Boolean(entry) && typeof entry === "object");
87
+ }
88
+ function resolveDiscordReferencedForwardMessage(message) {
89
+ const referenceType = message.messageReference?.type;
90
+ return Number(referenceType) === FORWARD_MESSAGE_REFERENCE_TYPE ? message.referencedMessage : null;
91
+ }
92
+ function resolveDiscordReferencedReplyMessage(message) {
93
+ const referenceType = message.messageReference?.type;
94
+ return Number(referenceType) === FORWARD_MESSAGE_REFERENCE_TYPE ? null : message.referencedMessage ?? null;
95
+ }
96
+ function formatDiscordSnapshotAuthor(author) {
97
+ if (!author) return;
98
+ const globalName = normalizeOptionalString(author.global_name) ?? void 0;
99
+ const username = normalizeOptionalString(author.username) ?? void 0;
100
+ const name = normalizeOptionalString(author.name) ?? void 0;
101
+ const discriminator = normalizeOptionalString(author.discriminator) ?? void 0;
102
+ const base = globalName || username || name;
103
+ if (username && discriminator && discriminator !== "0") return `@${username}#${discriminator}`;
104
+ if (base) return `@${base}`;
105
+ if (author.id) return `@${author.id}`;
106
+ }
107
+ //#endregion
108
+ //#region extensions/discord/src/monitor/message-media.ts
109
+ const DISCORD_MEDIA_SSRF_POLICY = {
110
+ hostnameAllowlist: [
111
+ "cdn.discordapp.com",
112
+ "media.discordapp.net",
113
+ "*.discordapp.com",
114
+ "*.discordapp.net"
115
+ ],
116
+ allowRfc2544BenchmarkRange: true
117
+ };
118
+ const AUDIO_ATTACHMENT_EXTENSIONS = new Set([
119
+ ".aac",
120
+ ".caf",
121
+ ".flac",
122
+ ".m4a",
123
+ ".mp3",
124
+ ".oga",
125
+ ".ogg",
126
+ ".opus",
127
+ ".wav"
128
+ ]);
129
+ const DISCORD_STICKER_ASSET_BASE_URL = "https://media.discordapp.net/stickers";
130
+ function isDiscordAudioAttachmentFileName(fileName) {
131
+ const ext = getFileExtension(fileName);
132
+ return Boolean(ext && AUDIO_ATTACHMENT_EXTENSIONS.has(ext));
133
+ }
134
+ function hasDiscordVoiceAttachmentFields(attachment) {
135
+ return typeof attachment.duration_secs === "number" || typeof attachment.waveform === "string";
136
+ }
137
+ function mergeHostnameList(...lists) {
138
+ const merged = lists.flatMap((list) => list ?? []).map((value) => value.trim()).filter((value) => value.length > 0);
139
+ if (merged.length === 0) return;
140
+ return Array.from(new Set(merged));
141
+ }
142
+ function resolveDiscordMediaSsrFPolicy(policy) {
143
+ if (!policy) return DISCORD_MEDIA_SSRF_POLICY;
144
+ const hostnameAllowlist = mergeHostnameList(DISCORD_MEDIA_SSRF_POLICY.hostnameAllowlist, policy.hostnameAllowlist);
145
+ const allowedHostnames = mergeHostnameList(DISCORD_MEDIA_SSRF_POLICY.allowedHostnames, policy.allowedHostnames);
146
+ return {
147
+ ...DISCORD_MEDIA_SSRF_POLICY,
148
+ ...policy,
149
+ ...allowedHostnames ? { allowedHostnames } : {},
150
+ ...hostnameAllowlist ? { hostnameAllowlist } : {},
151
+ allowRfc2544BenchmarkRange: Boolean(DISCORD_MEDIA_SSRF_POLICY.allowRfc2544BenchmarkRange) || Boolean(policy.allowRfc2544BenchmarkRange)
152
+ };
153
+ }
154
+ async function resolveMediaList(message, maxBytes, options) {
155
+ const out = [];
156
+ const resolvedSsrFPolicy = resolveDiscordMediaSsrFPolicy(options?.ssrfPolicy);
157
+ await appendResolvedMediaFromAttachments({
158
+ attachments: message.attachments ?? [],
159
+ maxBytes,
160
+ out,
161
+ errorPrefix: "discord: failed to download attachment",
162
+ fetchImpl: options?.fetchImpl,
163
+ ssrfPolicy: resolvedSsrFPolicy,
164
+ readIdleTimeoutMs: options?.readIdleTimeoutMs,
165
+ totalTimeoutMs: options?.totalTimeoutMs,
166
+ abortSignal: options?.abortSignal
167
+ });
168
+ await appendResolvedMediaFromStickers({
169
+ stickers: resolveDiscordMessageStickers(message),
170
+ maxBytes,
171
+ out,
172
+ errorPrefix: "discord: failed to download sticker",
173
+ fetchImpl: options?.fetchImpl,
174
+ ssrfPolicy: resolvedSsrFPolicy,
175
+ readIdleTimeoutMs: options?.readIdleTimeoutMs,
176
+ totalTimeoutMs: options?.totalTimeoutMs,
177
+ abortSignal: options?.abortSignal
178
+ });
179
+ return out;
180
+ }
181
+ async function resolveForwardedMediaList(message, maxBytes, options) {
182
+ const snapshots = resolveDiscordMessageSnapshots(message);
183
+ const out = [];
184
+ const resolvedSsrFPolicy = resolveDiscordMediaSsrFPolicy(options?.ssrfPolicy);
185
+ if (snapshots.length > 0) {
186
+ for (const snapshot of snapshots) {
187
+ await appendResolvedMediaFromAttachments({
188
+ attachments: snapshot.message?.attachments,
189
+ maxBytes,
190
+ out,
191
+ errorPrefix: "discord: failed to download forwarded attachment",
192
+ fetchImpl: options?.fetchImpl,
193
+ ssrfPolicy: resolvedSsrFPolicy,
194
+ readIdleTimeoutMs: options?.readIdleTimeoutMs,
195
+ totalTimeoutMs: options?.totalTimeoutMs,
196
+ abortSignal: options?.abortSignal
197
+ });
198
+ await appendResolvedMediaFromStickers({
199
+ stickers: snapshot.message ? resolveDiscordSnapshotStickers(snapshot.message) : [],
200
+ maxBytes,
201
+ out,
202
+ errorPrefix: "discord: failed to download forwarded sticker",
203
+ fetchImpl: options?.fetchImpl,
204
+ ssrfPolicy: resolvedSsrFPolicy,
205
+ readIdleTimeoutMs: options?.readIdleTimeoutMs,
206
+ totalTimeoutMs: options?.totalTimeoutMs,
207
+ abortSignal: options?.abortSignal
208
+ });
209
+ }
210
+ return out;
211
+ }
212
+ const referencedForward = resolveDiscordReferencedForwardMessage(message);
213
+ if (!referencedForward) return out;
214
+ await appendResolvedMediaFromAttachments({
215
+ attachments: referencedForward.attachments,
216
+ maxBytes,
217
+ out,
218
+ errorPrefix: "discord: failed to download forwarded attachment",
219
+ fetchImpl: options?.fetchImpl,
220
+ ssrfPolicy: resolvedSsrFPolicy,
221
+ readIdleTimeoutMs: options?.readIdleTimeoutMs,
222
+ totalTimeoutMs: options?.totalTimeoutMs,
223
+ abortSignal: options?.abortSignal
224
+ });
225
+ await appendResolvedMediaFromStickers({
226
+ stickers: resolveDiscordMessageStickers(referencedForward),
227
+ maxBytes,
228
+ out,
229
+ errorPrefix: "discord: failed to download forwarded sticker",
230
+ fetchImpl: options?.fetchImpl,
231
+ ssrfPolicy: resolvedSsrFPolicy,
232
+ readIdleTimeoutMs: options?.readIdleTimeoutMs,
233
+ totalTimeoutMs: options?.totalTimeoutMs,
234
+ abortSignal: options?.abortSignal
235
+ });
236
+ return out;
237
+ }
238
+ async function resolveReferencedReplyMediaList(message, maxBytes, options) {
239
+ const referencedReply = resolveDiscordReferencedReplyMessage(message);
240
+ const out = [];
241
+ if (!referencedReply) return out;
242
+ const resolvedSsrFPolicy = resolveDiscordMediaSsrFPolicy(options?.ssrfPolicy);
243
+ await appendResolvedMediaFromAttachments({
244
+ attachments: referencedReply.attachments,
245
+ maxBytes,
246
+ out,
247
+ errorPrefix: "discord: failed to download referenced reply attachment",
248
+ fetchImpl: options?.fetchImpl,
249
+ ssrfPolicy: resolvedSsrFPolicy,
250
+ readIdleTimeoutMs: options?.readIdleTimeoutMs,
251
+ totalTimeoutMs: options?.totalTimeoutMs,
252
+ abortSignal: options?.abortSignal
253
+ });
254
+ await appendResolvedMediaFromStickers({
255
+ stickers: resolveDiscordMessageStickers(referencedReply),
256
+ maxBytes,
257
+ out,
258
+ errorPrefix: "discord: failed to download referenced reply sticker",
259
+ fetchImpl: options?.fetchImpl,
260
+ ssrfPolicy: resolvedSsrFPolicy,
261
+ readIdleTimeoutMs: options?.readIdleTimeoutMs,
262
+ totalTimeoutMs: options?.totalTimeoutMs,
263
+ abortSignal: options?.abortSignal
264
+ });
265
+ return out;
266
+ }
267
+ async function fetchDiscordMedia(params) {
268
+ const timeoutAbortController = params.totalTimeoutMs ? new AbortController() : void 0;
269
+ const signal = mergeAbortSignals([params.abortSignal, timeoutAbortController?.signal]);
270
+ let timedOut = false;
271
+ let timeoutHandle = null;
272
+ const savePromise = saveRemoteMedia({
273
+ url: params.url,
274
+ filePathHint: params.filePathHint,
275
+ maxBytes: params.maxBytes,
276
+ fetchImpl: params.fetchImpl,
277
+ ssrfPolicy: params.ssrfPolicy,
278
+ readIdleTimeoutMs: params.readIdleTimeoutMs,
279
+ fallbackContentType: params.fallbackContentType,
280
+ originalFilename: params.originalFilename,
281
+ ...signal ? { requestInit: { signal } } : {}
282
+ }).catch((error) => {
283
+ if (timedOut) return new Promise(() => {});
284
+ throw error;
285
+ });
286
+ try {
287
+ if (!params.totalTimeoutMs) return await savePromise;
288
+ const timeoutPromise = new Promise((_, reject) => {
289
+ timeoutHandle = setTimeout(() => {
290
+ timedOut = true;
291
+ timeoutAbortController?.abort();
292
+ reject(/* @__PURE__ */ new Error(`discord media download timed out after ${params.totalTimeoutMs}ms`));
293
+ }, params.totalTimeoutMs);
294
+ timeoutHandle.unref?.();
295
+ });
296
+ return await Promise.race([savePromise, timeoutPromise]);
297
+ } finally {
298
+ if (timeoutHandle) clearTimeout(timeoutHandle);
299
+ }
300
+ }
301
+ async function appendResolvedMediaFromAttachments(params) {
302
+ const attachments = params.attachments;
303
+ if (!attachments || attachments.length === 0) return;
304
+ for (const attachment of attachments) {
305
+ const attachmentUrl = normalizeOptionalString(attachment.url);
306
+ if (!attachmentUrl) {
307
+ logVerbose(`${params.errorPrefix} ${attachment.id ?? attachment.filename ?? "attachment"}: missing url`);
308
+ continue;
309
+ }
310
+ try {
311
+ const saved = await fetchDiscordMedia({
312
+ url: attachmentUrl,
313
+ filePathHint: attachment.filename ?? attachmentUrl,
314
+ maxBytes: params.maxBytes,
315
+ fetchImpl: params.fetchImpl,
316
+ ssrfPolicy: params.ssrfPolicy,
317
+ readIdleTimeoutMs: params.readIdleTimeoutMs,
318
+ totalTimeoutMs: params.totalTimeoutMs,
319
+ abortSignal: params.abortSignal,
320
+ fallbackContentType: attachment.content_type,
321
+ originalFilename: attachment.filename
322
+ });
323
+ params.out.push({
324
+ path: saved.path,
325
+ contentType: saved.contentType,
326
+ placeholder: inferPlaceholder(attachment)
327
+ });
328
+ } catch (err) {
329
+ const id = attachment.id ?? attachmentUrl;
330
+ logVerbose(`${params.errorPrefix} ${id}: ${String(err)}`);
331
+ params.out.push({
332
+ path: attachmentUrl,
333
+ contentType: attachment.content_type,
334
+ placeholder: inferPlaceholder(attachment)
335
+ });
336
+ }
337
+ }
338
+ }
339
+ function resolveStickerAssetCandidates(sticker) {
340
+ const baseName = sticker.name?.trim() || `sticker-${sticker.id}`;
341
+ switch (sticker.format_type) {
342
+ case StickerFormatType.GIF: return [{
343
+ url: `${DISCORD_STICKER_ASSET_BASE_URL}/${sticker.id}.gif`,
344
+ fileName: `${baseName}.gif`
345
+ }];
346
+ case StickerFormatType.Lottie: return [{
347
+ url: `${DISCORD_STICKER_ASSET_BASE_URL}/${sticker.id}.png?size=160`,
348
+ fileName: `${baseName}.png`
349
+ }, {
350
+ url: `${DISCORD_STICKER_ASSET_BASE_URL}/${sticker.id}.json`,
351
+ fileName: `${baseName}.json`
352
+ }];
353
+ case StickerFormatType.APNG:
354
+ case StickerFormatType.PNG:
355
+ default: return [{
356
+ url: `${DISCORD_STICKER_ASSET_BASE_URL}/${sticker.id}.png`,
357
+ fileName: `${baseName}.png`
358
+ }];
359
+ }
360
+ }
361
+ function formatStickerError(err) {
362
+ if (err instanceof Error) return err.message;
363
+ if (typeof err === "string") return err;
364
+ try {
365
+ return JSON.stringify(err) ?? "unknown error";
366
+ } catch {
367
+ return "unknown error";
368
+ }
369
+ }
370
+ function inferStickerContentType(sticker) {
371
+ switch (sticker.format_type) {
372
+ case StickerFormatType.GIF: return "image/gif";
373
+ case StickerFormatType.APNG:
374
+ case StickerFormatType.Lottie:
375
+ case StickerFormatType.PNG: return "image/png";
376
+ default: return;
377
+ }
378
+ }
379
+ async function appendResolvedMediaFromStickers(params) {
380
+ const stickers = params.stickers;
381
+ if (!stickers || stickers.length === 0) return;
382
+ for (const sticker of stickers) {
383
+ const candidates = resolveStickerAssetCandidates(sticker);
384
+ let lastError;
385
+ for (const candidate of candidates) try {
386
+ const saved = await fetchDiscordMedia({
387
+ url: candidate.url,
388
+ filePathHint: candidate.fileName,
389
+ maxBytes: params.maxBytes,
390
+ fetchImpl: params.fetchImpl,
391
+ ssrfPolicy: params.ssrfPolicy,
392
+ readIdleTimeoutMs: params.readIdleTimeoutMs,
393
+ totalTimeoutMs: params.totalTimeoutMs,
394
+ abortSignal: params.abortSignal,
395
+ fallbackContentType: inferStickerContentType(sticker),
396
+ originalFilename: candidate.fileName
397
+ });
398
+ params.out.push({
399
+ path: saved.path,
400
+ contentType: saved.contentType,
401
+ placeholder: "<media:sticker>"
402
+ });
403
+ lastError = null;
404
+ break;
405
+ } catch (err) {
406
+ lastError = err;
407
+ }
408
+ if (lastError) {
409
+ logVerbose(`${params.errorPrefix} ${sticker.id}: ${formatStickerError(lastError)}`);
410
+ const fallback = candidates[0];
411
+ if (fallback) params.out.push({
412
+ path: fallback.url,
413
+ contentType: inferStickerContentType(sticker),
414
+ placeholder: "<media:sticker>"
415
+ });
416
+ }
417
+ }
418
+ }
419
+ function inferPlaceholder(attachment) {
420
+ const mime = attachment.content_type ?? "";
421
+ if (mime.startsWith("image/")) return "<media:image>";
422
+ if (mime.startsWith("video/")) return "<media:video>";
423
+ if (mime.startsWith("audio/")) return "<media:audio>";
424
+ if (hasDiscordVoiceAttachmentFields(attachment)) return "<media:audio>";
425
+ if (isDiscordAudioAttachmentFileName(attachment.filename ?? attachment.url)) return "<media:audio>";
426
+ return "<media:document>";
427
+ }
428
+ function isImageAttachment(attachment) {
429
+ if ((attachment.content_type ?? "").startsWith("image/")) return true;
430
+ const name = normalizeLowercaseStringOrEmpty(attachment.filename);
431
+ if (!name) return false;
432
+ return /\.(avif|bmp|gif|heic|heif|jpe?g|png|tiff?|webp)$/.test(name);
433
+ }
434
+ function buildDiscordAttachmentPlaceholder(attachments) {
435
+ if (!attachments || attachments.length === 0) return "";
436
+ const count = attachments.length;
437
+ const allImages = attachments.every(isImageAttachment);
438
+ const label = allImages ? "image" : "file";
439
+ const suffix = count === 1 ? label : `${label}s`;
440
+ return `${allImages ? "<media:image>" : "<media:document>"} (${count} ${suffix})`;
441
+ }
442
+ function buildDiscordStickerPlaceholder(stickers) {
443
+ if (!stickers || stickers.length === 0) return "";
444
+ const count = stickers.length;
445
+ return `<media:sticker> (${count} ${count === 1 ? "sticker" : "stickers"})`;
446
+ }
447
+ function buildDiscordMediaPlaceholder(params) {
448
+ const attachmentText = buildDiscordAttachmentPlaceholder(params.attachments);
449
+ const stickerText = buildDiscordStickerPlaceholder(params.stickers);
450
+ if (attachmentText && stickerText) return `${attachmentText}\n${stickerText}`;
451
+ return attachmentText || stickerText || "";
452
+ }
453
+ function buildDiscordMediaPayload(mediaList) {
454
+ return buildMediaPayload(mediaList);
455
+ }
456
+ //#endregion
457
+ //#region extensions/discord/src/monitor/message-text.ts
458
+ function resolveDiscordEmbedText(embed) {
459
+ const title = normalizeOptionalString(embed?.title) ?? "";
460
+ const description = normalizeOptionalString(embed?.description) ?? "";
461
+ if (title && description) return `${title}\n${description}`;
462
+ return title || description || "";
463
+ }
464
+ function resolveDiscordMessageText(message, options) {
465
+ const embedText = resolveDiscordEmbedText(message.embeds?.[0] ?? null);
466
+ const componentText = extractDiscordComponentsV2Text(resolveDiscordMessageComponents(message));
467
+ const baseText = resolveDiscordMentions(normalizeOptionalString(message.content) || buildDiscordMediaPlaceholder({
468
+ attachments: message.attachments ?? void 0,
469
+ stickers: resolveDiscordMessageStickers(message)
470
+ }) || embedText || componentText || normalizeOptionalString(options?.fallbackText) || "", message);
471
+ if (!options?.includeForwarded) return baseText;
472
+ const forwardedText = resolveDiscordForwardedMessagesText(message);
473
+ if (!forwardedText) return baseText;
474
+ if (!baseText) return forwardedText;
475
+ return `${baseText}\n${forwardedText}`;
476
+ }
477
+ function resolveDiscordMentions(text, message) {
478
+ if (!text.includes("<")) return text;
479
+ const mentions = message.mentionedUsers ?? [];
480
+ if (!Array.isArray(mentions) || mentions.length === 0) return text;
481
+ let out = text;
482
+ for (const user of mentions) {
483
+ const label = user.globalName || user.username;
484
+ out = out.replace(new RegExp(`<@!?${user.id}>`, "g"), `@${label}`);
485
+ }
486
+ return out;
487
+ }
488
+ function resolveDiscordForwardedMessagesText(message) {
489
+ const snapshots = resolveDiscordMessageSnapshots(message);
490
+ if (snapshots.length > 0) return resolveDiscordForwardedMessagesTextFromSnapshots(snapshots);
491
+ const referencedForward = resolveDiscordReferencedForwardMessage(message);
492
+ if (!referencedForward) return "";
493
+ const referencedText = resolveDiscordMessageText(referencedForward);
494
+ if (!referencedText) return "";
495
+ const authorLabel = formatDiscordSnapshotAuthor(referencedForward.author);
496
+ return `${authorLabel ? `[Forwarded message from ${authorLabel}]` : "[Forwarded message]"}\n${referencedText}`;
497
+ }
498
+ function resolveDiscordMessageComponents(message) {
499
+ const components = message.components;
500
+ if (components !== void 0) return components;
501
+ try {
502
+ return message.rawData?.components;
503
+ } catch {
504
+ return;
505
+ }
506
+ }
507
+ function extractDiscordComponentsV2Text(components) {
508
+ const parts = [];
509
+ collectDiscordTextDisplayContent(components, parts);
510
+ return parts.join("\n");
511
+ }
512
+ function collectDiscordTextDisplayContent(value, parts) {
513
+ if (Array.isArray(value)) {
514
+ for (const entry of value) collectDiscordTextDisplayContent(entry, parts);
515
+ return;
516
+ }
517
+ if (!value || typeof value !== "object") return;
518
+ const component = value;
519
+ if (component.type === ComponentType.TextDisplay) {
520
+ const content = normalizeOptionalString(component.content);
521
+ if (content) parts.push(content);
522
+ }
523
+ collectDiscordTextDisplayContent(component.components, parts);
524
+ collectDiscordTextDisplayContent(component.component, parts);
525
+ }
526
+ function resolveDiscordForwardedMessagesTextFromSnapshots(snapshots) {
527
+ const forwardedBlocks = normalizeDiscordMessageSnapshots(snapshots).map((snapshot) => buildDiscordForwardedMessageBlock(snapshot.message)).filter((entry) => Boolean(entry));
528
+ if (forwardedBlocks.length === 0) return "";
529
+ return forwardedBlocks.join("\n\n");
530
+ }
531
+ function buildDiscordForwardedMessageBlock(snapshotMessage) {
532
+ if (!snapshotMessage) return null;
533
+ const text = resolveDiscordSnapshotMessageText(snapshotMessage);
534
+ if (!text) return null;
535
+ const authorLabel = formatDiscordSnapshotAuthor(snapshotMessage.author);
536
+ return `${authorLabel ? `[Forwarded message from ${authorLabel}]` : "[Forwarded message]"}\n${text}`;
537
+ }
538
+ function resolveDiscordSnapshotMessageText(snapshot) {
539
+ const content = normalizeOptionalString(snapshot.content) ?? "";
540
+ const attachmentText = buildDiscordMediaPlaceholder({
541
+ attachments: snapshot.attachments ?? void 0,
542
+ stickers: resolveDiscordSnapshotStickers(snapshot)
543
+ });
544
+ const embedText = resolveDiscordEmbedText(snapshot.embeds?.[0]);
545
+ const componentText = extractDiscordComponentsV2Text(snapshot.components);
546
+ return content || attachmentText || embedText || componentText || "";
547
+ }
548
+ //#endregion
549
+ export { resolveForwardedMediaList as a, hasDiscordMessageStickers as c, resolveDiscordMessageChannelId as d, buildDiscordMediaPayload as i, resolveDiscordMessageStickers as l, resolveDiscordForwardedMessagesTextFromSnapshots as n, resolveMediaList as o, resolveDiscordMessageText as r, resolveReferencedReplyMediaList as s, resolveDiscordEmbedText as t, resolveDiscordChannelInfo as u };