@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,909 @@
1
+ import { B as Container, F as Modal, G as RoleSelectMenu, H as LinkButton, Ht as parseDiscordTarget, I as RadioGroup, J as Separator, K as Row, L as TextInput, N as CheckboxGroup, P as Label, Q as UserSelectMenu, R as Button, U as MediaGallery, V as File, W as MentionableSelectMenu, Wt as __exportAll, X as TextDisplay, Y as StringSelectMenu, Z as Thumbnail, et as parseCustomId, q as Section, z as ChannelSelectMenu } from "./send.receipt-CDn3GBWC.js";
2
+ import { normalizeLowercaseStringOrEmpty } from "klaw/plugin-sdk/string-coerce-runtime";
3
+ import { buildOutboundBaseSessionKey } from "klaw/plugin-sdk/routing";
4
+ import { buildThreadAwareOutboundSessionRoute } from "klaw/plugin-sdk/channel-core";
5
+ import { ButtonStyle, MessageFlags, TextInputStyle } from "discord-api-types/v10";
6
+ import crypto from "node:crypto";
7
+ import { reduceInteractiveReply } from "klaw/plugin-sdk/interactive-runtime";
8
+ //#region extensions/discord/src/outbound-session-route.ts
9
+ function resolveDiscordOutboundSessionRoute(params) {
10
+ const parsed = parseDiscordTarget(params.target, { defaultKind: resolveDiscordOutboundTargetKindHint(params) });
11
+ if (!parsed) return null;
12
+ const isDm = parsed.kind === "user";
13
+ const peer = {
14
+ kind: isDm ? "direct" : "channel",
15
+ id: parsed.id
16
+ };
17
+ const baseSessionKey = buildOutboundBaseSessionKey({
18
+ cfg: params.cfg,
19
+ agentId: params.agentId,
20
+ channel: "discord",
21
+ accountId: params.accountId,
22
+ peer
23
+ });
24
+ return buildThreadAwareOutboundSessionRoute({
25
+ route: {
26
+ sessionKey: baseSessionKey,
27
+ baseSessionKey,
28
+ peer,
29
+ chatType: isDm ? "direct" : "channel",
30
+ from: isDm ? `discord:${parsed.id}` : `discord:channel:${parsed.id}`,
31
+ to: isDm ? `user:${parsed.id}` : `channel:${parsed.id}`
32
+ },
33
+ threadId: params.threadId,
34
+ precedence: ["threadId"],
35
+ useSuffix: false
36
+ });
37
+ }
38
+ function resolveDiscordOutboundTargetKindHint(params) {
39
+ const resolvedKind = params.resolvedTarget?.kind;
40
+ if (resolvedKind === "user") return "user";
41
+ if (resolvedKind === "group" || resolvedKind === "channel") return "channel";
42
+ const target = params.target.trim();
43
+ if (/^channel:/i.test(target)) return "channel";
44
+ if (/^(user:|discord:|@|<@!?)/i.test(target)) return "user";
45
+ }
46
+ //#endregion
47
+ //#region extensions/discord/src/component-custom-id.ts
48
+ const DISCORD_COMPONENT_CUSTOM_ID_KEY = "occomp";
49
+ const DISCORD_MODAL_CUSTOM_ID_KEY = "ocmodal";
50
+ function buildDiscordComponentCustomId(params) {
51
+ const base = `${DISCORD_COMPONENT_CUSTOM_ID_KEY}:cid=${params.componentId}`;
52
+ return params.modalId ? `${base};mid=${params.modalId}` : base;
53
+ }
54
+ function buildDiscordModalCustomId(modalId) {
55
+ return `${DISCORD_MODAL_CUSTOM_ID_KEY}:mid=${modalId}`;
56
+ }
57
+ function parseDiscordComponentCustomId(id) {
58
+ const parsed = parseCustomId(id);
59
+ if (parsed.key !== "occomp") return null;
60
+ const componentId = parsed.data.cid;
61
+ if (typeof componentId !== "string" || !componentId.trim()) return null;
62
+ const modalId = parsed.data.mid;
63
+ return {
64
+ componentId,
65
+ modalId: typeof modalId === "string" && modalId.trim() ? modalId : void 0
66
+ };
67
+ }
68
+ function parseDiscordModalCustomId(id) {
69
+ const parsed = parseCustomId(id);
70
+ if (parsed.key !== "ocmodal") return null;
71
+ const modalId = parsed.data.mid;
72
+ if (typeof modalId !== "string" || !modalId.trim()) return null;
73
+ return modalId;
74
+ }
75
+ function isDiscordComponentWildcardRegistrationId(id) {
76
+ return /^__klaw_discord_component_[a-z_]+_wildcard__$/.test(id);
77
+ }
78
+ function parseDiscordComponentCustomIdForInteraction(id) {
79
+ if (id === "*" || isDiscordComponentWildcardRegistrationId(id)) return {
80
+ key: "*",
81
+ data: {}
82
+ };
83
+ const parsed = parseCustomId(id);
84
+ if (parsed.key !== "occomp") return parsed;
85
+ return {
86
+ key: "*",
87
+ data: parsed.data
88
+ };
89
+ }
90
+ function parseDiscordModalCustomIdForInteraction(id) {
91
+ if (id === "*" || isDiscordComponentWildcardRegistrationId(id)) return {
92
+ key: "*",
93
+ data: {}
94
+ };
95
+ const parsed = parseCustomId(id);
96
+ if (parsed.key !== "ocmodal") return parsed;
97
+ return {
98
+ key: "*",
99
+ data: parsed.data
100
+ };
101
+ }
102
+ //#endregion
103
+ //#region extensions/discord/src/components.parse.ts
104
+ const DISCORD_COMPONENT_ATTACHMENT_PREFIX = "attachment://";
105
+ const BLOCK_ALIASES = new Map([["row", "actions"], ["action-row", "actions"]]);
106
+ function requireObject(value, label) {
107
+ if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`${label} must be an object`);
108
+ return value;
109
+ }
110
+ function readString(value, label, opts) {
111
+ if (typeof value !== "string") throw new Error(`${label} must be a string`);
112
+ const trimmed = value.trim();
113
+ if (!opts?.allowEmpty && !trimmed) throw new Error(`${label} cannot be empty`);
114
+ return opts?.allowEmpty ? value : trimmed;
115
+ }
116
+ function readOptionalString(value) {
117
+ if (typeof value !== "string") return;
118
+ const trimmed = value.trim();
119
+ return trimmed ? trimmed : void 0;
120
+ }
121
+ function readOptionalStringArray(value, label) {
122
+ if (value === void 0) return;
123
+ if (!Array.isArray(value)) throw new Error(`${label} must be an array`);
124
+ if (value.length === 0) return;
125
+ return value.map((entry, index) => readString(entry, `${label}[${index}]`));
126
+ }
127
+ function readOptionalNumber(value) {
128
+ if (typeof value !== "number" || !Number.isFinite(value)) return;
129
+ return value;
130
+ }
131
+ function readOptionalEmoji(value, label) {
132
+ if (!value || typeof value !== "object" || Array.isArray(value)) return;
133
+ const obj = value;
134
+ return {
135
+ name: readString(obj.name, `${label}.name`),
136
+ id: readOptionalString(obj.id),
137
+ animated: typeof obj.animated === "boolean" ? obj.animated : void 0
138
+ };
139
+ }
140
+ function normalizeModalFieldName(value, index) {
141
+ const trimmed = value?.trim();
142
+ if (trimmed) return trimmed;
143
+ return `field_${index + 1}`;
144
+ }
145
+ function normalizeAttachmentRef(value, label) {
146
+ const trimmed = value.trim();
147
+ if (!trimmed.startsWith("attachment://")) throw new Error(`${label} must start with "${DISCORD_COMPONENT_ATTACHMENT_PREFIX}"`);
148
+ const attachmentName = trimmed.slice(13).trim();
149
+ if (!attachmentName) throw new Error(`${label} must include an attachment filename`);
150
+ return `${DISCORD_COMPONENT_ATTACHMENT_PREFIX}${attachmentName}`;
151
+ }
152
+ function resolveDiscordComponentAttachmentName(value) {
153
+ const trimmed = value.trim();
154
+ if (!trimmed.startsWith("attachment://")) throw new Error(`Attachment reference must start with "${DISCORD_COMPONENT_ATTACHMENT_PREFIX}"`);
155
+ const attachmentName = trimmed.slice(13).trim();
156
+ if (!attachmentName) throw new Error("Attachment reference must include a filename");
157
+ return attachmentName;
158
+ }
159
+ function mapButtonStyle(style) {
160
+ switch (normalizeLowercaseStringOrEmpty(style ?? "primary")) {
161
+ case "secondary": return ButtonStyle.Secondary;
162
+ case "success": return ButtonStyle.Success;
163
+ case "danger": return ButtonStyle.Danger;
164
+ case "link": return ButtonStyle.Link;
165
+ default: return ButtonStyle.Primary;
166
+ }
167
+ }
168
+ function mapTextInputStyle(style) {
169
+ return style === "paragraph" ? TextInputStyle.Paragraph : TextInputStyle.Short;
170
+ }
171
+ function normalizeBlockType(raw) {
172
+ const lowered = normalizeLowercaseStringOrEmpty(raw);
173
+ return BLOCK_ALIASES.get(lowered) ?? lowered;
174
+ }
175
+ function parseSelectOptions(raw, label) {
176
+ if (raw === void 0) return;
177
+ if (!Array.isArray(raw)) throw new Error(`${label} must be an array`);
178
+ return raw.map((entry, index) => {
179
+ const obj = requireObject(entry, `${label}[${index}]`);
180
+ return {
181
+ label: readString(obj.label, `${label}[${index}].label`),
182
+ value: readString(obj.value, `${label}[${index}].value`),
183
+ description: readOptionalString(obj.description),
184
+ emoji: readOptionalEmoji(obj.emoji, `${label}[${index}].emoji`),
185
+ default: typeof obj.default === "boolean" ? obj.default : void 0
186
+ };
187
+ });
188
+ }
189
+ function parseButtonSpec(raw, label) {
190
+ const obj = requireObject(raw, label);
191
+ const style = readOptionalString(obj.style);
192
+ const url = readOptionalString(obj.url);
193
+ if ((style === "link" || url) && !url) throw new Error(`${label}.url is required for link buttons`);
194
+ return {
195
+ label: readString(obj.label, `${label}.label`),
196
+ style,
197
+ url,
198
+ callbackData: readOptionalString(obj.callbackData),
199
+ emoji: readOptionalEmoji(obj.emoji, `${label}.emoji`),
200
+ disabled: typeof obj.disabled === "boolean" ? obj.disabled : void 0,
201
+ allowedUsers: readOptionalStringArray(obj.allowedUsers, `${label}.allowedUsers`)
202
+ };
203
+ }
204
+ function parseSelectSpec(raw, label) {
205
+ const obj = requireObject(raw, label);
206
+ const type = readOptionalString(obj.type);
207
+ const allowedTypes = [
208
+ "string",
209
+ "user",
210
+ "role",
211
+ "mentionable",
212
+ "channel"
213
+ ];
214
+ if (type && !allowedTypes.includes(type)) throw new Error(`${label}.type must be one of ${allowedTypes.join(", ")}`);
215
+ return {
216
+ type,
217
+ callbackData: readOptionalString(obj.callbackData),
218
+ placeholder: readOptionalString(obj.placeholder),
219
+ minValues: readOptionalNumber(obj.minValues),
220
+ maxValues: readOptionalNumber(obj.maxValues),
221
+ options: parseSelectOptions(obj.options, `${label}.options`),
222
+ allowedUsers: readOptionalStringArray(obj.allowedUsers, `${label}.allowedUsers`)
223
+ };
224
+ }
225
+ function parseModalField(raw, label, index) {
226
+ const obj = requireObject(raw, label);
227
+ const type = normalizeLowercaseStringOrEmpty(readString(obj.type, `${label}.type`));
228
+ const supported = [
229
+ "text",
230
+ "checkbox",
231
+ "radio",
232
+ "select",
233
+ "role-select",
234
+ "user-select"
235
+ ];
236
+ if (!supported.includes(type)) throw new Error(`${label}.type must be one of ${supported.join(", ")}`);
237
+ const options = parseSelectOptions(obj.options, `${label}.options`);
238
+ if ([
239
+ "checkbox",
240
+ "radio",
241
+ "select"
242
+ ].includes(type) && (!options || options.length === 0)) throw new Error(`${label}.options is required for ${type} fields`);
243
+ return {
244
+ type,
245
+ name: normalizeModalFieldName(readOptionalString(obj.name), index),
246
+ label: readString(obj.label, `${label}.label`),
247
+ description: readOptionalString(obj.description),
248
+ placeholder: readOptionalString(obj.placeholder),
249
+ required: typeof obj.required === "boolean" ? obj.required : void 0,
250
+ options,
251
+ minValues: readOptionalNumber(obj.minValues),
252
+ maxValues: readOptionalNumber(obj.maxValues),
253
+ minLength: readOptionalNumber(obj.minLength),
254
+ maxLength: readOptionalNumber(obj.maxLength),
255
+ style: readOptionalString(obj.style)
256
+ };
257
+ }
258
+ function parseComponentBlock(raw, label) {
259
+ const obj = requireObject(raw, label);
260
+ switch (normalizeBlockType(normalizeLowercaseStringOrEmpty(readString(obj.type, `${label}.type`)))) {
261
+ case "text": return {
262
+ type: "text",
263
+ text: readString(obj.text, `${label}.text`)
264
+ };
265
+ case "section": {
266
+ const text = readOptionalString(obj.text);
267
+ const textsRaw = obj.texts;
268
+ const texts = Array.isArray(textsRaw) ? textsRaw.map((entry, idx) => readString(entry, `${label}.texts[${idx}]`)) : void 0;
269
+ if (!text && (!texts || texts.length === 0)) throw new Error(`${label}.text or ${label}.texts is required for section blocks`);
270
+ let accessory;
271
+ if (obj.accessory !== void 0) {
272
+ const accessoryObj = requireObject(obj.accessory, `${label}.accessory`);
273
+ const accessoryType = normalizeLowercaseStringOrEmpty(readString(accessoryObj.type, `${label}.accessory.type`));
274
+ if (accessoryType === "thumbnail") accessory = {
275
+ type: "thumbnail",
276
+ url: readString(accessoryObj.url, `${label}.accessory.url`)
277
+ };
278
+ else if (accessoryType === "button") accessory = {
279
+ type: "button",
280
+ button: parseButtonSpec(accessoryObj.button, `${label}.accessory.button`)
281
+ };
282
+ else throw new Error(`${label}.accessory.type must be "thumbnail" or "button"`);
283
+ }
284
+ return {
285
+ type: "section",
286
+ text,
287
+ texts,
288
+ accessory
289
+ };
290
+ }
291
+ case "separator": {
292
+ const spacingRaw = obj.spacing;
293
+ let spacing;
294
+ if (spacingRaw === "small" || spacingRaw === "large") spacing = spacingRaw;
295
+ else if (spacingRaw === 1 || spacingRaw === 2) spacing = spacingRaw;
296
+ else if (spacingRaw !== void 0) throw new Error(`${label}.spacing must be "small", "large", 1, or 2`);
297
+ const divider = typeof obj.divider === "boolean" ? obj.divider : void 0;
298
+ return {
299
+ type: "separator",
300
+ spacing,
301
+ divider
302
+ };
303
+ }
304
+ case "actions": {
305
+ const buttonsRaw = obj.buttons;
306
+ const buttons = Array.isArray(buttonsRaw) ? buttonsRaw.map((entry, idx) => parseButtonSpec(entry, `${label}.buttons[${idx}]`)) : void 0;
307
+ const select = obj.select ? parseSelectSpec(obj.select, `${label}.select`) : void 0;
308
+ if ((!buttons || buttons.length === 0) && !select) throw new Error(`${label} requires buttons or select`);
309
+ if (buttons && select) throw new Error(`${label} cannot include both buttons and select`);
310
+ return {
311
+ type: "actions",
312
+ buttons,
313
+ select
314
+ };
315
+ }
316
+ case "media-gallery": {
317
+ const itemsRaw = obj.items;
318
+ if (!Array.isArray(itemsRaw) || itemsRaw.length === 0) throw new Error(`${label}.items must be a non-empty array`);
319
+ return {
320
+ type: "media-gallery",
321
+ items: itemsRaw.map((entry, idx) => {
322
+ const itemObj = requireObject(entry, `${label}.items[${idx}]`);
323
+ return {
324
+ url: readString(itemObj.url, `${label}.items[${idx}].url`),
325
+ description: readOptionalString(itemObj.description),
326
+ spoiler: typeof itemObj.spoiler === "boolean" ? itemObj.spoiler : void 0
327
+ };
328
+ })
329
+ };
330
+ }
331
+ case "file": return {
332
+ type: "file",
333
+ file: normalizeAttachmentRef(readString(obj.file, `${label}.file`), `${label}.file`),
334
+ spoiler: typeof obj.spoiler === "boolean" ? obj.spoiler : void 0
335
+ };
336
+ default: throw new Error(`${label}.type must be a supported component block`);
337
+ }
338
+ }
339
+ function readDiscordComponentSpec(raw) {
340
+ if (raw === void 0 || raw === null) return null;
341
+ const obj = requireObject(raw, "components");
342
+ const blocksRaw = obj.blocks;
343
+ const blocks = Array.isArray(blocksRaw) ? blocksRaw.map((entry, idx) => parseComponentBlock(entry, `components.blocks[${idx}]`)) : void 0;
344
+ const modalRaw = obj.modal;
345
+ const reusable = typeof obj.reusable === "boolean" ? obj.reusable : void 0;
346
+ let modal;
347
+ if (modalRaw !== void 0) {
348
+ const modalObj = requireObject(modalRaw, "components.modal");
349
+ const fieldsRaw = modalObj.fields;
350
+ if (!Array.isArray(fieldsRaw) || fieldsRaw.length === 0) throw new Error("components.modal.fields must be a non-empty array");
351
+ if (fieldsRaw.length > 5) throw new Error("components.modal.fields supports up to 5 inputs");
352
+ const fields = fieldsRaw.map((entry, idx) => parseModalField(entry, `components.modal.fields[${idx}]`, idx));
353
+ modal = {
354
+ title: readString(modalObj.title, "components.modal.title"),
355
+ callbackData: readOptionalString(modalObj.callbackData),
356
+ triggerLabel: readOptionalString(modalObj.triggerLabel),
357
+ triggerStyle: readOptionalString(modalObj.triggerStyle),
358
+ allowedUsers: readOptionalStringArray(modalObj.allowedUsers, "components.modal.allowedUsers"),
359
+ fields
360
+ };
361
+ }
362
+ return {
363
+ text: readOptionalString(obj.text),
364
+ reusable,
365
+ container: typeof obj.container === "object" && obj.container && !Array.isArray(obj.container) ? {
366
+ accentColor: obj.container.accentColor,
367
+ spoiler: typeof obj.container.spoiler === "boolean" ? obj.container.spoiler : void 0
368
+ } : void 0,
369
+ blocks,
370
+ modal
371
+ };
372
+ }
373
+ //#endregion
374
+ //#region extensions/discord/src/components.builders.ts
375
+ function createShortId(prefix) {
376
+ return `${prefix}${crypto.randomBytes(6).toString("base64url")}`;
377
+ }
378
+ function buildTextDisplays(text, texts) {
379
+ if (texts && texts.length > 0) return texts.map((entry) => new TextDisplay(entry));
380
+ if (text) return [new TextDisplay(text)];
381
+ return [];
382
+ }
383
+ function createButtonComponent(params) {
384
+ const style = mapButtonStyle(params.spec.style);
385
+ if (style === ButtonStyle.Link || Boolean(params.spec.url)) {
386
+ if (!params.spec.url) throw new Error("Link buttons require a url");
387
+ const linkUrl = params.spec.url;
388
+ class DynamicLinkButton extends LinkButton {
389
+ constructor(..._args) {
390
+ super(..._args);
391
+ this.label = params.spec.label;
392
+ this.url = linkUrl;
393
+ }
394
+ }
395
+ return { component: new DynamicLinkButton() };
396
+ }
397
+ const componentId = params.componentId ?? createShortId("btn_");
398
+ const internalCustomId = typeof params.spec.internalCustomId === "string" && params.spec.internalCustomId.trim() ? params.spec.internalCustomId.trim() : void 0;
399
+ const customId = internalCustomId ?? buildDiscordComponentCustomId({
400
+ componentId,
401
+ modalId: params.modalId
402
+ });
403
+ class DynamicButton extends Button {
404
+ constructor(..._args2) {
405
+ super(..._args2);
406
+ this.label = params.spec.label;
407
+ this.customId = customId;
408
+ this.style = style;
409
+ this.emoji = params.spec.emoji;
410
+ this.disabled = params.spec.disabled ?? false;
411
+ }
412
+ }
413
+ if (internalCustomId) return { component: new DynamicButton() };
414
+ return {
415
+ component: new DynamicButton(),
416
+ entry: {
417
+ id: componentId,
418
+ kind: params.modalId ? "modal-trigger" : "button",
419
+ label: params.spec.label,
420
+ callbackData: params.spec.callbackData,
421
+ modalId: params.modalId,
422
+ allowedUsers: params.spec.allowedUsers
423
+ }
424
+ };
425
+ }
426
+ function createSelectComponent(params) {
427
+ const type = normalizeLowercaseStringOrEmpty(params.spec.type ?? "string");
428
+ const componentId = params.componentId ?? createShortId("sel_");
429
+ const customId = buildDiscordComponentCustomId({ componentId });
430
+ const createEntry = (selectType, label, options) => ({
431
+ id: componentId,
432
+ kind: "select",
433
+ label,
434
+ callbackData: params.spec.callbackData,
435
+ selectType,
436
+ ...options ? { options } : {},
437
+ allowedUsers: params.spec.allowedUsers
438
+ });
439
+ if (type === "string") {
440
+ const options = params.spec.options ?? [];
441
+ if (options.length === 0) throw new Error("String select menus require options");
442
+ class DynamicStringSelect extends StringSelectMenu {
443
+ constructor(..._args3) {
444
+ super(..._args3);
445
+ this.customId = customId;
446
+ this.options = options;
447
+ this.minValues = params.spec.minValues;
448
+ this.maxValues = params.spec.maxValues;
449
+ this.placeholder = params.spec.placeholder;
450
+ this.disabled = false;
451
+ }
452
+ }
453
+ return {
454
+ component: new DynamicStringSelect(),
455
+ entry: createEntry("string", params.spec.placeholder ?? "select", options.map((option) => ({
456
+ value: option.value,
457
+ label: option.label
458
+ })))
459
+ };
460
+ }
461
+ if (type === "user") {
462
+ class DynamicUserSelect extends UserSelectMenu {
463
+ constructor(..._args4) {
464
+ super(..._args4);
465
+ this.customId = customId;
466
+ this.minValues = params.spec.minValues;
467
+ this.maxValues = params.spec.maxValues;
468
+ this.placeholder = params.spec.placeholder;
469
+ this.disabled = false;
470
+ }
471
+ }
472
+ return {
473
+ component: new DynamicUserSelect(),
474
+ entry: createEntry("user", params.spec.placeholder ?? "user select")
475
+ };
476
+ }
477
+ if (type === "role") {
478
+ class DynamicRoleSelect extends RoleSelectMenu {
479
+ constructor(..._args5) {
480
+ super(..._args5);
481
+ this.customId = customId;
482
+ this.minValues = params.spec.minValues;
483
+ this.maxValues = params.spec.maxValues;
484
+ this.placeholder = params.spec.placeholder;
485
+ this.disabled = false;
486
+ }
487
+ }
488
+ return {
489
+ component: new DynamicRoleSelect(),
490
+ entry: createEntry("role", params.spec.placeholder ?? "role select")
491
+ };
492
+ }
493
+ if (type === "mentionable") {
494
+ class DynamicMentionableSelect extends MentionableSelectMenu {
495
+ constructor(..._args6) {
496
+ super(..._args6);
497
+ this.customId = customId;
498
+ this.minValues = params.spec.minValues;
499
+ this.maxValues = params.spec.maxValues;
500
+ this.placeholder = params.spec.placeholder;
501
+ this.disabled = false;
502
+ }
503
+ }
504
+ return {
505
+ component: new DynamicMentionableSelect(),
506
+ entry: createEntry("mentionable", params.spec.placeholder ?? "mentionable select")
507
+ };
508
+ }
509
+ class DynamicChannelSelect extends ChannelSelectMenu {
510
+ constructor(..._args7) {
511
+ super(..._args7);
512
+ this.customId = customId;
513
+ this.minValues = params.spec.minValues;
514
+ this.maxValues = params.spec.maxValues;
515
+ this.placeholder = params.spec.placeholder;
516
+ this.disabled = false;
517
+ }
518
+ }
519
+ return {
520
+ component: new DynamicChannelSelect(),
521
+ entry: createEntry("channel", params.spec.placeholder ?? "channel select")
522
+ };
523
+ }
524
+ function isSelectComponent(component) {
525
+ return component instanceof StringSelectMenu || component instanceof UserSelectMenu || component instanceof RoleSelectMenu || component instanceof MentionableSelectMenu || component instanceof ChannelSelectMenu;
526
+ }
527
+ function buildDiscordComponentMessage(params) {
528
+ const entries = [];
529
+ const consumptionGroupId = createShortId("grp_");
530
+ const modals = [];
531
+ const components = [];
532
+ const containerChildren = [];
533
+ const addEntry = (entry) => {
534
+ entries.push({
535
+ ...entry,
536
+ sessionKey: params.sessionKey,
537
+ agentId: params.agentId,
538
+ accountId: params.accountId,
539
+ reusable: entry.reusable ?? params.spec.reusable,
540
+ consumptionGroupId
541
+ });
542
+ };
543
+ const text = params.spec.text ?? params.fallbackText;
544
+ if (text) containerChildren.push(new TextDisplay(text));
545
+ for (const block of params.spec.blocks ?? []) {
546
+ if (block.type === "text") {
547
+ containerChildren.push(new TextDisplay(block.text));
548
+ continue;
549
+ }
550
+ if (block.type === "section") {
551
+ const displays = buildTextDisplays(block.text, block.texts);
552
+ if (displays.length > 3) throw new Error("Section blocks support up to 3 text displays");
553
+ let accessory;
554
+ if (block.accessory?.type === "thumbnail") accessory = new Thumbnail(block.accessory.url);
555
+ else if (block.accessory?.type === "button") {
556
+ const { component, entry } = createButtonComponent({ spec: block.accessory.button });
557
+ accessory = component;
558
+ if (entry) addEntry(entry);
559
+ }
560
+ containerChildren.push(new Section(displays, accessory));
561
+ continue;
562
+ }
563
+ if (block.type === "separator") {
564
+ containerChildren.push(new Separator({
565
+ spacing: block.spacing,
566
+ divider: block.divider
567
+ }));
568
+ continue;
569
+ }
570
+ if (block.type === "media-gallery") {
571
+ containerChildren.push(new MediaGallery(block.items));
572
+ continue;
573
+ }
574
+ if (block.type === "file") {
575
+ containerChildren.push(new File(block.file, block.spoiler));
576
+ continue;
577
+ }
578
+ if (block.type === "actions") {
579
+ const rowComponents = [];
580
+ if (block.buttons) {
581
+ if (block.buttons.length > 5) throw new Error("Action rows support up to 5 buttons");
582
+ for (const button of block.buttons) {
583
+ const { component, entry } = createButtonComponent({ spec: button });
584
+ rowComponents.push(component);
585
+ if (entry) addEntry(entry);
586
+ }
587
+ } else if (block.select) {
588
+ const { component, entry } = createSelectComponent({ spec: block.select });
589
+ rowComponents.push(component);
590
+ addEntry(entry);
591
+ }
592
+ containerChildren.push(new Row(rowComponents));
593
+ }
594
+ }
595
+ if (params.spec.modal) {
596
+ const modalId = createShortId("mdl_");
597
+ const fields = params.spec.modal.fields.map((field, index) => ({
598
+ id: createShortId("fld_"),
599
+ name: normalizeModalFieldName(field.name, index),
600
+ label: field.label,
601
+ type: field.type,
602
+ description: field.description,
603
+ placeholder: field.placeholder,
604
+ required: field.required,
605
+ options: field.options,
606
+ minValues: field.minValues,
607
+ maxValues: field.maxValues,
608
+ minLength: field.minLength,
609
+ maxLength: field.maxLength,
610
+ style: field.style
611
+ }));
612
+ modals.push({
613
+ id: modalId,
614
+ title: params.spec.modal.title,
615
+ callbackData: params.spec.modal.callbackData,
616
+ fields,
617
+ sessionKey: params.sessionKey,
618
+ agentId: params.agentId,
619
+ accountId: params.accountId,
620
+ reusable: params.spec.reusable,
621
+ allowedUsers: params.spec.modal.allowedUsers
622
+ });
623
+ const { component, entry } = createButtonComponent({
624
+ spec: {
625
+ label: params.spec.modal.triggerLabel ?? "Open form",
626
+ style: params.spec.modal.triggerStyle ?? "primary",
627
+ allowedUsers: params.spec.modal.allowedUsers
628
+ },
629
+ modalId
630
+ });
631
+ if (entry) addEntry(entry);
632
+ const lastChild = containerChildren.at(-1);
633
+ if (lastChild instanceof Row) {
634
+ const row = lastChild;
635
+ const hasSelect = row.components.some((entry) => isSelectComponent(entry));
636
+ if (row.components.length < 5 && !hasSelect) row.addComponent(component);
637
+ else containerChildren.push(new Row([component]));
638
+ } else containerChildren.push(new Row([component]));
639
+ }
640
+ if (containerChildren.length === 0) throw new Error("components must include at least one block, text, or modal trigger");
641
+ const container = new Container(containerChildren, params.spec.container);
642
+ components.push(container);
643
+ const consumptionGroupEntryIds = entries.map((entry) => entry.id);
644
+ for (const entry of entries) entry.consumptionGroupEntryIds = consumptionGroupEntryIds;
645
+ return {
646
+ components,
647
+ entries,
648
+ modals
649
+ };
650
+ }
651
+ function buildDiscordComponentMessageFlags(components) {
652
+ return components.some((component) => component.isV2) ? MessageFlags.IsComponentsV2 : void 0;
653
+ }
654
+ //#endregion
655
+ //#region extensions/discord/src/components.modal.ts
656
+ const ModalBase = Modal ?? function ModalFallback() {};
657
+ function createModalFieldComponent(field) {
658
+ if (field.type === "text") {
659
+ class DynamicTextInput extends TextInput {
660
+ constructor(..._args) {
661
+ super(..._args);
662
+ this.customId = field.id;
663
+ this.style = mapTextInputStyle(field.style);
664
+ this.placeholder = field.placeholder;
665
+ this.required = field.required;
666
+ this.minLength = field.minLength;
667
+ this.maxLength = field.maxLength;
668
+ }
669
+ }
670
+ return new DynamicTextInput();
671
+ }
672
+ if (field.type === "select") {
673
+ const options = field.options ?? [];
674
+ class DynamicModalSelect extends StringSelectMenu {
675
+ constructor(..._args2) {
676
+ super(..._args2);
677
+ this.customId = field.id;
678
+ this.options = options;
679
+ this.required = field.required;
680
+ this.minValues = field.minValues;
681
+ this.maxValues = field.maxValues;
682
+ this.placeholder = field.placeholder;
683
+ }
684
+ }
685
+ return new DynamicModalSelect();
686
+ }
687
+ if (field.type === "role-select") {
688
+ class DynamicModalRoleSelect extends RoleSelectMenu {
689
+ constructor(..._args3) {
690
+ super(..._args3);
691
+ this.customId = field.id;
692
+ this.required = field.required;
693
+ this.minValues = field.minValues;
694
+ this.maxValues = field.maxValues;
695
+ this.placeholder = field.placeholder;
696
+ }
697
+ }
698
+ return new DynamicModalRoleSelect();
699
+ }
700
+ if (field.type === "user-select") {
701
+ class DynamicModalUserSelect extends UserSelectMenu {
702
+ constructor(..._args4) {
703
+ super(..._args4);
704
+ this.customId = field.id;
705
+ this.required = field.required;
706
+ this.minValues = field.minValues;
707
+ this.maxValues = field.maxValues;
708
+ this.placeholder = field.placeholder;
709
+ }
710
+ }
711
+ return new DynamicModalUserSelect();
712
+ }
713
+ if (field.type === "checkbox") {
714
+ const options = field.options ?? [];
715
+ class DynamicCheckboxGroup extends CheckboxGroup {
716
+ constructor(..._args5) {
717
+ super(..._args5);
718
+ this.customId = field.id;
719
+ this.options = options;
720
+ this.required = field.required;
721
+ this.minValues = field.minValues;
722
+ this.maxValues = field.maxValues;
723
+ }
724
+ }
725
+ return new DynamicCheckboxGroup();
726
+ }
727
+ const options = field.options ?? [];
728
+ class DynamicRadioGroup extends RadioGroup {
729
+ constructor(..._args6) {
730
+ super(..._args6);
731
+ this.customId = field.id;
732
+ this.options = options;
733
+ this.required = field.required;
734
+ this.minValues = field.minValues;
735
+ this.maxValues = field.maxValues;
736
+ }
737
+ }
738
+ return new DynamicRadioGroup();
739
+ }
740
+ var DiscordFormModal = class extends ModalBase {
741
+ constructor(params) {
742
+ super();
743
+ this.customIdParser = parseDiscordModalCustomIdForInteraction;
744
+ this.title = params.title;
745
+ this.customId = buildDiscordModalCustomId(params.modalId);
746
+ this.components = params.fields.map((field) => {
747
+ const component = createModalFieldComponent(field);
748
+ class DynamicLabel extends Label {
749
+ constructor(..._args7) {
750
+ super(..._args7);
751
+ this.label = field.label;
752
+ this.description = field.description;
753
+ this.component = component;
754
+ this.customId = field.id;
755
+ }
756
+ }
757
+ return new DynamicLabel(component);
758
+ });
759
+ }
760
+ async run() {
761
+ throw new Error("Modal handler is not registered for dynamic forms");
762
+ }
763
+ };
764
+ function createDiscordFormModal(entry) {
765
+ return new DiscordFormModal({
766
+ modalId: entry.id,
767
+ title: entry.title,
768
+ fields: entry.fields
769
+ });
770
+ }
771
+ //#endregion
772
+ //#region extensions/discord/src/shared-interactive.ts
773
+ var shared_interactive_exports = /* @__PURE__ */ __exportAll({
774
+ buildDiscordInteractiveComponents: () => buildDiscordInteractiveComponents,
775
+ buildDiscordPresentationComponents: () => buildDiscordPresentationComponents
776
+ });
777
+ function resolveDiscordInteractiveButtonStyle(style) {
778
+ return style ?? "secondary";
779
+ }
780
+ const DISCORD_INTERACTIVE_BUTTON_ROW_SIZE = 5;
781
+ /**
782
+ * @deprecated Use buildDiscordPresentationComponents with MessagePresentation.
783
+ */
784
+ function buildDiscordInteractiveComponents(interactive) {
785
+ const blocks = reduceInteractiveReply(interactive, [], (state, block) => {
786
+ if (block.type === "text") {
787
+ const text = block.text.trim();
788
+ if (text) state.push({
789
+ type: "text",
790
+ text
791
+ });
792
+ return state;
793
+ }
794
+ if (block.type === "buttons") {
795
+ if (block.buttons.length === 0) return state;
796
+ for (let index = 0; index < block.buttons.length; index += DISCORD_INTERACTIVE_BUTTON_ROW_SIZE) state.push({
797
+ type: "actions",
798
+ buttons: block.buttons.slice(index, index + DISCORD_INTERACTIVE_BUTTON_ROW_SIZE).map((button) => {
799
+ const spec = {
800
+ label: button.label,
801
+ style: button.url ? "link" : resolveDiscordInteractiveButtonStyle(button.style)
802
+ };
803
+ if (button.value) spec.callbackData = button.value;
804
+ if (button.url) spec.url = button.url;
805
+ return spec;
806
+ })
807
+ });
808
+ return state;
809
+ }
810
+ if (block.type === "select" && block.options.length > 0) state.push({
811
+ type: "actions",
812
+ select: {
813
+ type: "string",
814
+ placeholder: block.placeholder,
815
+ options: block.options.map((option) => ({
816
+ label: option.label,
817
+ value: option.value
818
+ }))
819
+ }
820
+ });
821
+ return state;
822
+ });
823
+ return blocks.length > 0 ? { blocks } : void 0;
824
+ }
825
+ function buildDiscordPresentationComponents(presentation) {
826
+ if (!presentation) return;
827
+ const spec = { blocks: [] };
828
+ if (presentation.title) spec.blocks?.push({
829
+ type: "text",
830
+ text: presentation.title
831
+ });
832
+ for (const block of presentation.blocks) {
833
+ if (block.type === "text" || block.type === "context") {
834
+ const text = block.text.trim();
835
+ if (text) spec.blocks?.push({
836
+ type: "text",
837
+ text: block.type === "context" ? `-# ${text}` : text
838
+ });
839
+ continue;
840
+ }
841
+ if (block.type === "divider") {
842
+ spec.blocks?.push({ type: "separator" });
843
+ continue;
844
+ }
845
+ }
846
+ for (const block of presentation.blocks) {
847
+ if (block.type === "buttons") {
848
+ appendDiscordPresentationButtonBlocks(spec, block.buttons);
849
+ continue;
850
+ }
851
+ if (block.type === "select" && block.options.length > 0) spec.blocks?.push({
852
+ type: "actions",
853
+ select: {
854
+ type: "string",
855
+ placeholder: block.placeholder,
856
+ options: block.options.map((option) => ({
857
+ label: option.label,
858
+ value: option.value
859
+ }))
860
+ }
861
+ });
862
+ }
863
+ return spec.blocks?.length ? spec : void 0;
864
+ }
865
+ function appendDiscordPresentationButtonBlocks(spec, buttons) {
866
+ if (buttons.length === 0) return;
867
+ for (let index = 0; index < buttons.length; index += DISCORD_INTERACTIVE_BUTTON_ROW_SIZE) spec.blocks?.push({
868
+ type: "actions",
869
+ buttons: buttons.slice(index, index + DISCORD_INTERACTIVE_BUTTON_ROW_SIZE).map((button) => {
870
+ const component = {
871
+ label: button.label,
872
+ style: button.url ? "link" : resolveDiscordInteractiveButtonStyle(button.style)
873
+ };
874
+ if (button.value) component.callbackData = button.value;
875
+ if (button.url) component.url = button.url;
876
+ return component;
877
+ })
878
+ });
879
+ }
880
+ //#endregion
881
+ //#region extensions/discord/src/components.ts
882
+ var components_exports = /* @__PURE__ */ __exportAll({
883
+ DISCORD_COMPONENT_ATTACHMENT_PREFIX: () => DISCORD_COMPONENT_ATTACHMENT_PREFIX,
884
+ DISCORD_COMPONENT_CUSTOM_ID_KEY: () => DISCORD_COMPONENT_CUSTOM_ID_KEY,
885
+ DISCORD_MODAL_CUSTOM_ID_KEY: () => DISCORD_MODAL_CUSTOM_ID_KEY,
886
+ DiscordFormModal: () => DiscordFormModal,
887
+ Modal: () => Modal,
888
+ buildDiscordComponentCustomId: () => buildDiscordComponentCustomId,
889
+ buildDiscordComponentMessage: () => buildDiscordComponentMessage,
890
+ buildDiscordComponentMessageFlags: () => buildDiscordComponentMessageFlags,
891
+ buildDiscordInteractiveComponents: () => buildDiscordInteractiveComponents,
892
+ buildDiscordModalCustomId: () => buildDiscordModalCustomId,
893
+ createDiscordFormModal: () => createDiscordFormModal,
894
+ formatDiscordComponentEventText: () => formatDiscordComponentEventText,
895
+ parseDiscordComponentCustomId: () => parseDiscordComponentCustomId,
896
+ parseDiscordComponentCustomIdForInteraction: () => parseDiscordComponentCustomIdForInteraction,
897
+ parseDiscordModalCustomId: () => parseDiscordModalCustomId,
898
+ parseDiscordModalCustomIdForInteraction: () => parseDiscordModalCustomIdForInteraction,
899
+ readDiscordComponentSpec: () => readDiscordComponentSpec,
900
+ resolveDiscordComponentAttachmentName: () => resolveDiscordComponentAttachmentName
901
+ });
902
+ function formatDiscordComponentEventText(params) {
903
+ if (params.kind === "button") return `Clicked "${params.label}".`;
904
+ const values = params.values ?? [];
905
+ if (values.length === 0) return `Updated "${params.label}".`;
906
+ return `Selected ${values.join(", ")} from "${params.label}".`;
907
+ }
908
+ //#endregion
909
+ export { parseDiscordComponentCustomId as _, shared_interactive_exports as a, parseDiscordModalCustomIdForInteraction as b, buildDiscordComponentMessage as c, readDiscordComponentSpec as d, resolveDiscordComponentAttachmentName as f, buildDiscordModalCustomId as g, buildDiscordComponentCustomId as h, buildDiscordPresentationComponents as i, buildDiscordComponentMessageFlags as l, DISCORD_MODAL_CUSTOM_ID_KEY as m, formatDiscordComponentEventText as n, DiscordFormModal as o, DISCORD_COMPONENT_CUSTOM_ID_KEY as p, buildDiscordInteractiveComponents as r, createDiscordFormModal as s, components_exports as t, DISCORD_COMPONENT_ATTACHMENT_PREFIX as u, parseDiscordComponentCustomIdForInteraction as v, resolveDiscordOutboundSessionRoute as x, parseDiscordModalCustomId as y };