@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,354 @@
1
+ import { normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "klaw/plugin-sdk/string-coerce-runtime";
2
+ import { buildChannelKeyCandidates, resolveChannelEntryMatchWithFallback, resolveChannelMatchConfig } from "klaw/plugin-sdk/channel-targets";
3
+ //#region extensions/discord/src/monitor/format.ts
4
+ function resolveDiscordSystemLocation(params) {
5
+ const { isDirectMessage, isGroupDm, guild, channelName } = params;
6
+ if (isDirectMessage) return "DM";
7
+ if (isGroupDm) return `Group DM #${channelName}`;
8
+ return guild?.name ? `${guild.name} #${channelName}` : `#${channelName}`;
9
+ }
10
+ function formatDiscordReactionEmoji(emoji) {
11
+ if (emoji.id && emoji.name) return `<:${emoji.name}:${emoji.id}>`;
12
+ if (emoji.id) return `emoji:${emoji.id}`;
13
+ return emoji.name ?? "emoji";
14
+ }
15
+ function formatDiscordUserTag(user) {
16
+ const discriminator = (user.discriminator ?? "").trim();
17
+ if (discriminator && discriminator !== "0") return `${user.username}#${discriminator}`;
18
+ return user.username ?? user.id;
19
+ }
20
+ function resolveTimestampMs(timestamp) {
21
+ if (!timestamp) return;
22
+ const parsed = Date.parse(timestamp);
23
+ return Number.isNaN(parsed) ? void 0 : parsed;
24
+ }
25
+ //#endregion
26
+ //#region extensions/discord/src/monitor/allow-list.ts
27
+ const DISCORD_OWNER_ALLOWLIST_PREFIXES = [
28
+ "discord:",
29
+ "user:",
30
+ "pk:"
31
+ ];
32
+ function normalizeDiscordAllowList(raw, prefixes) {
33
+ if (!raw || raw.length === 0) return null;
34
+ const ids = /* @__PURE__ */ new Set();
35
+ const names = /* @__PURE__ */ new Set();
36
+ const allowAll = raw.some((entry) => (normalizeOptionalString(entry) ?? "") === "*");
37
+ for (const entry of raw) {
38
+ const text = normalizeOptionalString(entry) ?? "";
39
+ if (!text || text === "*") continue;
40
+ const normalized = normalizeDiscordSlug(text);
41
+ const maybeId = text.replace(/^<@!?/, "").replace(/>$/, "");
42
+ if (/^\d+$/.test(maybeId)) {
43
+ ids.add(maybeId);
44
+ continue;
45
+ }
46
+ const prefix = prefixes.find((entry) => text.startsWith(entry));
47
+ if (prefix) {
48
+ const candidate = text.slice(prefix.length);
49
+ if (candidate) ids.add(candidate);
50
+ continue;
51
+ }
52
+ if (normalized) names.add(normalized);
53
+ }
54
+ return {
55
+ allowAll,
56
+ ids,
57
+ names
58
+ };
59
+ }
60
+ function normalizeDiscordSlug(value) {
61
+ return normalizeLowercaseStringOrEmpty(value).replace(/^#/, "").replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
62
+ }
63
+ function normalizeDiscordDisplaySlug(value) {
64
+ return normalizeLowercaseStringOrEmpty(value).normalize("NFC").replace(/^#/, "").replace(/[\s_]+/g, "-").replace(/[^\p{L}\p{M}\p{N}-]+/gu, "-").replace(/-{2,}/g, "-").replace(/^-+|-+$/g, "");
65
+ }
66
+ function resolveDiscordAllowListNameMatch(list, candidate) {
67
+ const nameSlug = candidate.name ? normalizeDiscordSlug(candidate.name) : "";
68
+ if (nameSlug && list.names.has(nameSlug)) return {
69
+ matchKey: nameSlug,
70
+ matchSource: "name"
71
+ };
72
+ const tagSlug = candidate.tag ? normalizeDiscordSlug(candidate.tag) : "";
73
+ if (tagSlug && list.names.has(tagSlug)) return {
74
+ matchKey: tagSlug,
75
+ matchSource: "tag"
76
+ };
77
+ return null;
78
+ }
79
+ function allowListMatches(list, candidate, params) {
80
+ if (list.allowAll) return true;
81
+ if (candidate.id && list.ids.has(candidate.id)) return true;
82
+ if (params?.allowNameMatching === true) {
83
+ if (resolveDiscordAllowListNameMatch(list, candidate)) return true;
84
+ }
85
+ return false;
86
+ }
87
+ function resolveDiscordAllowListMatch(params) {
88
+ const { allowList, candidate } = params;
89
+ if (allowList.allowAll) return {
90
+ allowed: true,
91
+ matchKey: "*",
92
+ matchSource: "wildcard"
93
+ };
94
+ if (candidate.id && allowList.ids.has(candidate.id)) return {
95
+ allowed: true,
96
+ matchKey: candidate.id,
97
+ matchSource: "id"
98
+ };
99
+ if (params.allowNameMatching === true) {
100
+ const namedMatch = resolveDiscordAllowListNameMatch(allowList, candidate);
101
+ if (namedMatch) return {
102
+ allowed: true,
103
+ ...namedMatch
104
+ };
105
+ }
106
+ return { allowed: false };
107
+ }
108
+ function resolveDiscordUserAllowed(params) {
109
+ const allowList = normalizeDiscordAllowList(params.allowList, [
110
+ "discord:",
111
+ "user:",
112
+ "pk:"
113
+ ]);
114
+ if (!allowList) return true;
115
+ return allowListMatches(allowList, {
116
+ id: params.userId,
117
+ name: params.userName,
118
+ tag: params.userTag
119
+ }, { allowNameMatching: params.allowNameMatching });
120
+ }
121
+ function resolveDiscordRoleAllowed(params) {
122
+ const allowList = normalizeDiscordAllowList(params.allowList, ["role:"]);
123
+ if (!allowList) return true;
124
+ if (allowList.allowAll) return true;
125
+ return params.memberRoleIds.some((roleId) => allowList.ids.has(roleId));
126
+ }
127
+ function resolveDiscordMemberAllowed(params) {
128
+ const hasUserRestriction = Array.isArray(params.userAllowList) && params.userAllowList.length > 0;
129
+ const hasRoleRestriction = Array.isArray(params.roleAllowList) && params.roleAllowList.length > 0;
130
+ if (!hasUserRestriction && !hasRoleRestriction) return true;
131
+ const userOk = hasUserRestriction ? resolveDiscordUserAllowed({
132
+ allowList: params.userAllowList,
133
+ userId: params.userId,
134
+ userName: params.userName,
135
+ userTag: params.userTag,
136
+ allowNameMatching: params.allowNameMatching
137
+ }) : false;
138
+ const roleOk = hasRoleRestriction ? resolveDiscordRoleAllowed({
139
+ allowList: params.roleAllowList,
140
+ memberRoleIds: params.memberRoleIds
141
+ }) : false;
142
+ return userOk || roleOk;
143
+ }
144
+ function resolveDiscordMemberAccessState(params) {
145
+ const channelUsers = params.channelConfig?.users ?? params.guildInfo?.users;
146
+ const channelRoles = params.channelConfig?.roles ?? params.guildInfo?.roles;
147
+ return {
148
+ channelUsers,
149
+ channelRoles,
150
+ hasAccessRestrictions: Array.isArray(channelUsers) && channelUsers.length > 0 || Array.isArray(channelRoles) && channelRoles.length > 0,
151
+ memberAllowed: resolveDiscordMemberAllowed({
152
+ userAllowList: channelUsers,
153
+ roleAllowList: channelRoles,
154
+ memberRoleIds: params.memberRoleIds,
155
+ userId: params.sender.id,
156
+ userName: params.sender.name,
157
+ userTag: params.sender.tag,
158
+ allowNameMatching: params.allowNameMatching
159
+ })
160
+ };
161
+ }
162
+ function resolveDiscordOwnerAllowFrom(params) {
163
+ const rawAllowList = params.channelConfig?.users ?? params.guildInfo?.users;
164
+ if (!Array.isArray(rawAllowList) || rawAllowList.length === 0) return;
165
+ const allowList = normalizeDiscordAllowList(rawAllowList, [
166
+ "discord:",
167
+ "user:",
168
+ "pk:"
169
+ ]);
170
+ if (!allowList) return;
171
+ const match = resolveDiscordAllowListMatch({
172
+ allowList,
173
+ candidate: {
174
+ id: params.sender.id,
175
+ name: params.sender.name,
176
+ tag: params.sender.tag
177
+ },
178
+ allowNameMatching: params.allowNameMatching
179
+ });
180
+ if (!match.allowed || !match.matchKey || match.matchKey === "*") return;
181
+ return [match.matchKey];
182
+ }
183
+ function resolveDiscordOwnerAccess(params) {
184
+ const ownerAllowFrom = params.allowFrom?.filter((entry) => (normalizeOptionalString(entry) ?? "") !== "*");
185
+ const ownerAllowList = normalizeDiscordAllowList(ownerAllowFrom && ownerAllowFrom.length > 0 ? ownerAllowFrom : void 0, DISCORD_OWNER_ALLOWLIST_PREFIXES);
186
+ return {
187
+ ownerAllowList,
188
+ ownerAllowed: ownerAllowList ? allowListMatches(ownerAllowList, {
189
+ id: params.sender.id,
190
+ name: params.sender.name,
191
+ tag: params.sender.tag
192
+ }, { allowNameMatching: params.allowNameMatching }) : false
193
+ };
194
+ }
195
+ function resolveDiscordCommandAuthorized(params) {
196
+ if (!params.isDirectMessage) return true;
197
+ const allowList = normalizeDiscordAllowList(params.allowFrom, [
198
+ "discord:",
199
+ "user:",
200
+ "pk:"
201
+ ]);
202
+ if (!allowList) return true;
203
+ return allowListMatches(allowList, {
204
+ id: params.author.id,
205
+ name: params.author.username,
206
+ tag: formatDiscordUserTag(params.author)
207
+ }, { allowNameMatching: params.allowNameMatching });
208
+ }
209
+ function resolveDiscordGuildEntry(params) {
210
+ const guild = params.guild;
211
+ const entries = params.guildEntries;
212
+ const guildId = params.guildId?.trim() || guild?.id;
213
+ if (!entries) return null;
214
+ const byId = guildId ? entries[guildId] : void 0;
215
+ if (byId) return {
216
+ ...byId,
217
+ id: guildId
218
+ };
219
+ if (!guild) return null;
220
+ const slug = normalizeDiscordSlug(guild.name ?? "");
221
+ const bySlug = entries[slug];
222
+ if (bySlug) return {
223
+ ...bySlug,
224
+ id: guildId ?? guild.id,
225
+ slug: slug || bySlug.slug
226
+ };
227
+ const wildcard = entries["*"];
228
+ if (wildcard) return {
229
+ ...wildcard,
230
+ id: guildId ?? guild.id,
231
+ slug: slug || wildcard.slug
232
+ };
233
+ return null;
234
+ }
235
+ function buildDiscordChannelKeys(params) {
236
+ const allowNameMatch = params.allowNameMatch !== false;
237
+ return buildChannelKeyCandidates(params.id, allowNameMatch ? params.slug : void 0, allowNameMatch ? params.name : void 0);
238
+ }
239
+ function resolveDiscordChannelEntryMatch(channels, params, parentParams) {
240
+ return resolveChannelEntryMatchWithFallback({
241
+ entries: channels,
242
+ keys: buildDiscordChannelKeys(params),
243
+ parentKeys: parentParams ? buildDiscordChannelKeys(parentParams) : void 0,
244
+ wildcardKey: "*"
245
+ });
246
+ }
247
+ function hasConfiguredDiscordChannels(channels) {
248
+ return Boolean(channels && Object.keys(channels).length > 0);
249
+ }
250
+ function resolveDiscordChannelConfigEntry(entry) {
251
+ return {
252
+ allowed: entry.enabled !== false,
253
+ requireMention: entry.requireMention,
254
+ ignoreOtherMentions: entry.ignoreOtherMentions,
255
+ skills: entry.skills,
256
+ enabled: entry.enabled,
257
+ users: entry.users,
258
+ roles: entry.roles,
259
+ systemPrompt: entry.systemPrompt,
260
+ includeThreadStarter: entry.includeThreadStarter,
261
+ autoThread: entry.autoThread,
262
+ autoThreadName: entry.autoThreadName,
263
+ autoArchiveDuration: entry.autoArchiveDuration
264
+ };
265
+ }
266
+ function resolveDiscordChannelConfig(params) {
267
+ const { guildInfo, channelId, channelName, channelSlug } = params;
268
+ const channels = guildInfo?.channels;
269
+ if (!hasConfiguredDiscordChannels(channels)) return null;
270
+ return resolveChannelMatchConfig(resolveDiscordChannelEntryMatch(channels, {
271
+ id: channelId,
272
+ name: channelName,
273
+ slug: channelSlug
274
+ }), resolveDiscordChannelConfigEntry) ?? { allowed: false };
275
+ }
276
+ function resolveDiscordChannelConfigWithFallback(params) {
277
+ const { guildInfo, channelId, channelName, channelSlug, parentId, parentName, parentSlug, scope } = params;
278
+ const channels = guildInfo?.channels;
279
+ if (!hasConfiguredDiscordChannels(channels)) return null;
280
+ const resolvedParentSlug = parentSlug ?? (parentName ? normalizeDiscordSlug(parentName) : "");
281
+ return resolveChannelMatchConfig(resolveDiscordChannelEntryMatch(channels, {
282
+ id: channelId,
283
+ name: channelName,
284
+ slug: channelSlug,
285
+ allowNameMatch: scope !== "thread"
286
+ }, parentId || parentName || parentSlug ? {
287
+ id: parentId ?? "",
288
+ name: parentName,
289
+ slug: resolvedParentSlug
290
+ } : void 0), resolveDiscordChannelConfigEntry) ?? { allowed: false };
291
+ }
292
+ function resolveDiscordShouldRequireMention(params) {
293
+ if (!params.isGuildMessage) return false;
294
+ if (params.isAutoThreadOwnedByBot ?? isDiscordAutoThreadOwnedByBot(params)) return false;
295
+ return params.channelConfig?.requireMention ?? params.guildInfo?.requireMention ?? true;
296
+ }
297
+ function isDiscordAutoThreadOwnedByBot(params) {
298
+ if (!params.isThread) return false;
299
+ if (!params.channelConfig?.autoThread) return false;
300
+ const botId = params.botId?.trim();
301
+ const threadOwnerId = params.threadOwnerId?.trim();
302
+ return Boolean(botId && threadOwnerId && botId === threadOwnerId);
303
+ }
304
+ function isDiscordGroupAllowedByPolicy(params) {
305
+ if (params.groupPolicy === "allowlist" && !params.guildAllowlisted) return false;
306
+ if (params.groupPolicy === "disabled") return false;
307
+ return params.groupPolicy !== "allowlist" || !params.channelAllowlistConfigured || params.channelAllowed;
308
+ }
309
+ function resolveDiscordChannelPolicyCommandAuthorizer(params) {
310
+ const channelAllowlistConfigured = Boolean(params.guildInfo?.channels) && Object.keys(params.guildInfo?.channels ?? {}).length > 0;
311
+ return {
312
+ configured: params.groupPolicy === "allowlist" && (Boolean(params.guildInfo) || channelAllowlistConfigured),
313
+ allowed: isDiscordGroupAllowedByPolicy({
314
+ groupPolicy: params.groupPolicy,
315
+ guildAllowlisted: Boolean(params.guildInfo),
316
+ channelAllowlistConfigured,
317
+ channelAllowed: params.channelConfig?.allowed !== false
318
+ })
319
+ };
320
+ }
321
+ function resolveGroupDmAllow(params) {
322
+ const { channels, channelId, channelName, channelSlug } = params;
323
+ if (!channels || channels.length === 0) return true;
324
+ const allowList = new Set(channels.map((entry) => normalizeDiscordSlug(entry)));
325
+ const candidates = [
326
+ normalizeDiscordSlug(channelId),
327
+ channelSlug,
328
+ channelName ? normalizeDiscordSlug(channelName) : ""
329
+ ].filter(Boolean);
330
+ return allowList.has("*") || candidates.some((candidate) => allowList.has(candidate));
331
+ }
332
+ function shouldEmitDiscordReactionNotification(params) {
333
+ const mode = params.mode ?? "own";
334
+ if (mode === "off") return false;
335
+ const accessGuildInfo = params.guildInfo ?? (params.allowlist ? { users: params.allowlist } : null);
336
+ const { hasAccessRestrictions, memberAllowed } = resolveDiscordMemberAccessState({
337
+ channelConfig: params.channelConfig,
338
+ guildInfo: accessGuildInfo,
339
+ memberRoleIds: params.memberRoleIds ?? [],
340
+ sender: {
341
+ id: params.userId,
342
+ name: params.userName,
343
+ tag: params.userTag
344
+ },
345
+ allowNameMatching: params.allowNameMatching
346
+ });
347
+ if (mode === "allowlist") return hasAccessRestrictions && memberAllowed;
348
+ if (hasAccessRestrictions && !memberAllowed) return false;
349
+ if (mode === "all") return true;
350
+ if (mode === "own") return Boolean(params.botId && params.messageAuthorId === params.botId);
351
+ return false;
352
+ }
353
+ //#endregion
354
+ export { resolveTimestampMs as S, resolveGroupDmAllow as _, normalizeDiscordSlug as a, formatDiscordUserTag as b, resolveDiscordChannelConfigWithFallback as c, resolveDiscordGuildEntry as d, resolveDiscordMemberAccessState as f, resolveDiscordShouldRequireMention as g, resolveDiscordOwnerAllowFrom as h, normalizeDiscordDisplaySlug as i, resolveDiscordChannelPolicyCommandAuthorizer as l, resolveDiscordOwnerAccess as m, isDiscordGroupAllowedByPolicy as n, resolveDiscordAllowListMatch as o, resolveDiscordMemberAllowed as p, normalizeDiscordAllowList as r, resolveDiscordChannelConfig as s, allowListMatches as t, resolveDiscordCommandAuthorized as u, shouldEmitDiscordReactionNotification as v, resolveDiscordSystemLocation as x, formatDiscordReactionEmoji as y };
@@ -0,0 +1,130 @@
1
+ import { resolveFetch } from "klaw/plugin-sdk/fetch-runtime";
2
+ import { resolveRetryConfig, retryAsync } from "klaw/plugin-sdk/retry-runtime";
3
+ //#region extensions/discord/src/error-body.ts
4
+ const DISCORD_RESPONSE_BODY_SUMMARY_MAX_CHARS = 240;
5
+ function summarizeDiscordResponseBody(body, opts = {}) {
6
+ const summary = body.replace(/<script\b[^>]*>[\s\S]*?<\/script>/gi, " ").replace(/<style\b[^>]*>[\s\S]*?<\/style>/gi, " ").replace(/<[^>]+>/g, " ").replace(/&nbsp;/gi, " ").replace(/&amp;/gi, "&").replace(/&lt;/gi, "<").replace(/&gt;/gi, ">").replace(/\s+/g, " ").trim();
7
+ if (!summary) return opts.emptyText;
8
+ return summary.slice(0, DISCORD_RESPONSE_BODY_SUMMARY_MAX_CHARS);
9
+ }
10
+ function isDiscordHtmlResponseBody(body, contentType) {
11
+ return /\bhtml\b/i.test(contentType ?? "") || /^\s*<!doctype\s+html\b/i.test(body) || /^\s*<html\b/i.test(body);
12
+ }
13
+ function isDiscordRateLimitResponseBody(body) {
14
+ const normalized = body.toLowerCase();
15
+ return normalized.includes("error 1015") || normalized.includes("cloudflare") || normalized.includes("rate limit");
16
+ }
17
+ //#endregion
18
+ //#region extensions/discord/src/api.ts
19
+ const DISCORD_API_BASE = "https://discord.com/api/v10";
20
+ const DISCORD_API_RETRY_DEFAULTS = {
21
+ attempts: 3,
22
+ minDelayMs: 500,
23
+ maxDelayMs: 5 * 6e4,
24
+ jitter: .1
25
+ };
26
+ const DISCORD_API_429_FALLBACK_RETRY_AFTER_SECONDS = 60;
27
+ function parseDiscordApiErrorPayload(text) {
28
+ const trimmed = text.trim();
29
+ if (!trimmed.startsWith("{") || !trimmed.endsWith("}")) return null;
30
+ try {
31
+ const payload = JSON.parse(trimmed);
32
+ if (payload && typeof payload === "object") return payload;
33
+ } catch {
34
+ return null;
35
+ }
36
+ return null;
37
+ }
38
+ function parseRetryAfterSeconds(text, response) {
39
+ const payload = parseDiscordApiErrorPayload(text);
40
+ const retryAfter = payload && typeof payload.retry_after === "number" && Number.isFinite(payload.retry_after) ? payload.retry_after : void 0;
41
+ if (retryAfter !== void 0) return retryAfter;
42
+ const header = response.headers.get("Retry-After");
43
+ if (!header) return;
44
+ const parsed = Number(header);
45
+ if (Number.isFinite(parsed) && parsed >= 0) return parsed;
46
+ const retryAt = Date.parse(header);
47
+ if (!Number.isFinite(retryAt)) return;
48
+ return Math.max(0, (retryAt - Date.now()) / 1e3);
49
+ }
50
+ function formatRetryAfterSeconds(value) {
51
+ if (value === void 0 || !Number.isFinite(value) || value < 0) return;
52
+ return `${value < 10 ? value.toFixed(1) : Math.round(value).toString()}s`;
53
+ }
54
+ function formatDiscordApiErrorText(text, response) {
55
+ const trimmed = text.trim();
56
+ if (!trimmed) return;
57
+ const payload = parseDiscordApiErrorPayload(trimmed);
58
+ if (!payload) {
59
+ if (trimmed.startsWith("{") && trimmed.endsWith("}")) return "unknown error";
60
+ const summary = summarizeDiscordResponseBody(trimmed);
61
+ if (isDiscordHtmlResponseBody(trimmed, response.headers.get("content-type"))) {
62
+ if (!summary) return response.status === 429 ? "rate limited by Discord upstream" : void 0;
63
+ return response.status === 429 ? `rate limited by Discord upstream: ${summary}` : summary;
64
+ }
65
+ return summary;
66
+ }
67
+ const message = typeof payload.message === "string" && payload.message.trim() ? payload.message.trim() : "unknown error";
68
+ const retryAfter = formatRetryAfterSeconds(typeof payload.retry_after === "number" ? payload.retry_after : void 0);
69
+ return retryAfter ? `${message} (retry after ${retryAfter})` : message;
70
+ }
71
+ var DiscordApiError = class extends Error {
72
+ constructor(message, status, retryAfter) {
73
+ super(message);
74
+ this.status = status;
75
+ this.retryAfter = retryAfter;
76
+ }
77
+ };
78
+ function getDiscordApiRetryAfterMs(err, retryConfig) {
79
+ if (!(err instanceof DiscordApiError) || typeof err.retryAfter !== "number") return;
80
+ return Math.min(Math.max(0, err.retryAfter * 1e3), retryConfig.maxDelayMs);
81
+ }
82
+ function normalizeDiscordRequestBody(body, headers) {
83
+ if (body === void 0) return;
84
+ if (typeof body === "string" || body instanceof Blob || body instanceof FormData || body instanceof URLSearchParams || body instanceof ArrayBuffer) return body;
85
+ headers.set("Content-Type", headers.get("Content-Type") ?? "application/json");
86
+ return JSON.stringify(body);
87
+ }
88
+ function resolveDiscordRequestSignal(options) {
89
+ if (options.signal || typeof options.timeoutMs !== "number") return options.signal;
90
+ return AbortSignal.timeout(options.timeoutMs);
91
+ }
92
+ async function requestDiscord(path, token, options) {
93
+ const fetchImpl = resolveFetch(options?.fetcher ?? fetch);
94
+ if (!fetchImpl) throw new Error("fetch is not available");
95
+ const retryConfig = resolveRetryConfig(DISCORD_API_RETRY_DEFAULTS, options?.retry);
96
+ return retryAsync(async () => {
97
+ const headers = new Headers(options?.headers);
98
+ headers.set("Authorization", `Bot ${token}`);
99
+ const body = normalizeDiscordRequestBody(options?.body, headers);
100
+ const res = await fetchImpl(`${DISCORD_API_BASE}${path}`, {
101
+ method: options?.method ?? (body === void 0 ? "GET" : "POST"),
102
+ headers,
103
+ body,
104
+ signal: resolveDiscordRequestSignal(options ?? {})
105
+ });
106
+ const text = await res.text().catch(() => "");
107
+ if (!res.ok) {
108
+ const detail = formatDiscordApiErrorText(text, res);
109
+ const suffix = detail ? `: ${detail}` : "";
110
+ const retryAfter = res.status === 429 ? parseRetryAfterSeconds(text, res) ?? DISCORD_API_429_FALLBACK_RETRY_AFTER_SECONDS : void 0;
111
+ throw new DiscordApiError(`Discord API ${path} failed (${res.status})${suffix}`, res.status, retryAfter);
112
+ }
113
+ if (!text.trim()) return;
114
+ return JSON.parse(text);
115
+ }, {
116
+ ...retryConfig,
117
+ label: options?.label ?? path,
118
+ shouldRetry: (err) => err instanceof DiscordApiError && err.status === 429,
119
+ retryAfterMs: (err) => getDiscordApiRetryAfterMs(err, retryConfig)
120
+ });
121
+ }
122
+ async function fetchDiscord(path, token, fetcher = fetch, options) {
123
+ return await requestDiscord(path, token, {
124
+ ...options,
125
+ fetcher,
126
+ method: "GET"
127
+ });
128
+ }
129
+ //#endregion
130
+ export { summarizeDiscordResponseBody as a, isDiscordRateLimitResponseBody as i, fetchDiscord as n, requestDiscord as r, DiscordApiError as t };
package/dist/api.js ADDED
@@ -0,0 +1,23 @@
1
+ import { Ht as parseDiscordTarget, Ut as resolveDiscordChannelId, a as normalizeDiscordMessagingTarget, i as looksLikeDiscordTargetId, o as normalizeDiscordOutboundTarget } from "./send.receipt-CDn3GBWC.js";
2
+ import { a as mergeDiscordAccountConfig, f as resolveDiscordMaxLinesPerMessage, i as listEnabledDiscordAccounts, l as resolveDiscordAccountConfig, o as resolveDefaultDiscordAccountId, r as listDiscordAccountIds, s as resolveDiscordAccount, t as createDiscordActionGate } from "./accounts-B7OBFePq.js";
3
+ import { t as inspectDiscordAccount } from "./account-inspect-Dqw-enky.js";
4
+ import { _ as parseDiscordComponentCustomId, b as parseDiscordModalCustomIdForInteraction, c as buildDiscordComponentMessage, d as readDiscordComponentSpec, f as resolveDiscordComponentAttachmentName, g as buildDiscordModalCustomId, h as buildDiscordComponentCustomId, l as buildDiscordComponentMessageFlags, m as DISCORD_MODAL_CUSTOM_ID_KEY, n as formatDiscordComponentEventText, o as DiscordFormModal, p as DISCORD_COMPONENT_CUSTOM_ID_KEY, r as buildDiscordInteractiveComponents, s as createDiscordFormModal, u as DISCORD_COMPONENT_ATTACHMENT_PREFIX, v as parseDiscordComponentCustomIdForInteraction, y as parseDiscordModalCustomId } from "./components-luonoe13.js";
5
+ import { n as fetchDiscord, r as requestDiscord, t as DiscordApiError } from "./api-CXAcv9nZ.js";
6
+ import { i as parseDiscordSendTarget, n as resolveDiscordTarget } from "./target-resolver-BrtFQtoK.js";
7
+ import "./targets-DWLLZE2l.js";
8
+ import { a as getDiscordExecApprovalApprovers, c as shouldSuppressLocalDiscordExecApprovalPrompt, o as isDiscordExecApprovalApprover, s as isDiscordExecApprovalClientEnabled } from "./conversation-identity-DXAm0_Mk.js";
9
+ import { i as resolveDiscordGroupToolPolicy, n as collectDiscordStatusIssues, r as resolveDiscordGroupRequireMention, t as discordPlugin } from "./channel-U_aeoFwW.js";
10
+ import { t as normalizeExplicitDiscordSessionKey } from "./session-key-normalization-CP8dPUid.js";
11
+ import { t as discordSetupPlugin } from "./channel.setup-BUSC0apv.js";
12
+ import { n as handleDiscordSubagentEnded, r as handleDiscordSubagentSpawning, t as handleDiscordSubagentDeliveryTarget } from "./subagent-hooks-8bK-mgiU.js";
13
+ import { t as tryHandleDiscordMessageActionGuildAdmin } from "./handle-action.guild-admin-B5BArS2n.js";
14
+ import { n as listDiscordDirectoryGroupsFromConfig, r as listDiscordDirectoryPeersFromConfig } from "./directory-config-CYbuMmPS.js";
15
+ import { t as fetchPluralKitMessageInfo } from "./pluralkit-D1Q2x0w5.js";
16
+ import { a as resolveDiscordPrivilegedIntentsFromFlags, i as probeDiscord, n as fetchDiscordApplicationSummary, r as parseApplicationIdFromToken, t as fetchDiscordApplicationId } from "./probe-D--Ca4JF.js";
17
+ import { t as collectDiscordSecurityAuditFindings } from "./security-audit-CnyIQKz6.js";
18
+ import { a as mergeAbortSignals, i as DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, n as DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS, r as DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, t as DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS } from "./timeouts-CEwuGaWT.js";
19
+ import { resolveOpenProviderRuntimeGroupPolicy as resolveDiscordRuntimeGroupPolicy } from "klaw/plugin-sdk/runtime-group-policy";
20
+ //#region extensions/discord/api.ts
21
+ const handleDiscordMessageAction = async (...args) => (await import("./channel-actions.runtime-CPtpH-yl.js")).handleDiscordMessageAction(...args);
22
+ //#endregion
23
+ export { DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS, DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS, DISCORD_COMPONENT_ATTACHMENT_PREFIX, DISCORD_COMPONENT_CUSTOM_ID_KEY, DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, DISCORD_MODAL_CUSTOM_ID_KEY, DiscordApiError, DiscordFormModal, buildDiscordComponentCustomId, buildDiscordComponentMessage, buildDiscordComponentMessageFlags, buildDiscordInteractiveComponents, buildDiscordModalCustomId, collectDiscordSecurityAuditFindings, collectDiscordStatusIssues, createDiscordActionGate, createDiscordFormModal, discordPlugin, discordSetupPlugin, fetchDiscord, fetchDiscordApplicationId, fetchDiscordApplicationSummary, fetchPluralKitMessageInfo, formatDiscordComponentEventText, getDiscordExecApprovalApprovers, handleDiscordMessageAction, handleDiscordSubagentDeliveryTarget, handleDiscordSubagentEnded, handleDiscordSubagentSpawning, inspectDiscordAccount, isDiscordExecApprovalApprover, isDiscordExecApprovalClientEnabled, listDiscordAccountIds, listDiscordDirectoryGroupsFromConfig, listDiscordDirectoryPeersFromConfig, listEnabledDiscordAccounts, looksLikeDiscordTargetId, mergeAbortSignals, mergeDiscordAccountConfig, normalizeDiscordMessagingTarget, normalizeDiscordOutboundTarget, normalizeExplicitDiscordSessionKey, parseApplicationIdFromToken, parseDiscordComponentCustomId, parseDiscordComponentCustomIdForInteraction as parseDiscordComponentCustomIdForCarbon, parseDiscordComponentCustomIdForInteraction, parseDiscordModalCustomId, parseDiscordModalCustomIdForInteraction as parseDiscordModalCustomIdForCarbon, parseDiscordModalCustomIdForInteraction, parseDiscordSendTarget, parseDiscordTarget, probeDiscord, readDiscordComponentSpec, requestDiscord, resolveDefaultDiscordAccountId, resolveDiscordAccount, resolveDiscordAccountConfig, resolveDiscordChannelId, resolveDiscordComponentAttachmentName, resolveDiscordGroupRequireMention, resolveDiscordGroupToolPolicy, resolveDiscordMaxLinesPerMessage, resolveDiscordPrivilegedIntentsFromFlags, resolveDiscordRuntimeGroupPolicy, resolveDiscordTarget, shouldSuppressLocalDiscordExecApprovalPrompt, tryHandleDiscordMessageActionGuildAdmin };