@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,255 @@
1
+ import { Ht as parseDiscordTarget, Wt as __exportAll } from "./send.receipt-CDn3GBWC.js";
2
+ import "./targets-DWLLZE2l.js";
3
+ import { C as resolveThreadBindingMaxAgeMs$1, O as shouldPersistBindingMutations, S as resolveThreadBindingMaxAgeExpiresAt, T as saveBindingsToDisk, b as resolveThreadBindingIdleTimeoutMs$1, c as getThreadBindingToken, f as normalizeThreadId, g as removeBindingRecord, l as isRecentlyUnboundThreadWebhookMessage, n as MANAGERS_BY_ACCOUNT_ID, p as rememberRecentUnboundWebhookEcho, t as BINDINGS_BY_THREAD_ID, x as resolveThreadBindingInactivityExpiresAt } from "./thread-bindings.state-eTFl-PqJ.js";
4
+ import { n as setThreadBindingMaxAgeBySessionKey, r as resolveBindingIdsForTargetSession, t as setThreadBindingIdleTimeoutBySessionKey } from "./thread-bindings.session-updates-DJZGIwaU.js";
5
+ import { _ as formatThreadBindingDurationLabel, b as resolveThreadBindingThreadName, g as resolveThreadBindingPersonaFromRecord, h as resolveThreadBindingPersona, s as resolveChannelIdForBinding, y as resolveThreadBindingIntroText } from "./thread-bindings.discord-api-ssGH5wc2.js";
6
+ import { i as testing, n as createThreadBindingManager, r as getThreadBindingManager, t as createNoopThreadBindingManager } from "./thread-bindings.manager-0YBHGemk.js";
7
+ import { normalizeOptionalLowercaseString, normalizeOptionalString } from "klaw/plugin-sdk/string-coerce-runtime";
8
+ import { normalizeAccountId } from "klaw/plugin-sdk/routing";
9
+ import { resolveThreadBindingIdleTimeoutMs, resolveThreadBindingMaxAgeMs, resolveThreadBindingsEnabled } from "klaw/plugin-sdk/conversation-runtime";
10
+ import { readAcpSessionEntry } from "klaw/plugin-sdk/acp-runtime";
11
+ //#region extensions/discord/src/monitor/thread-bindings.config.ts
12
+ function resolveDiscordThreadBindingIdleTimeoutMs(params) {
13
+ const accountId = normalizeAccountId(params.accountId);
14
+ const root = params.cfg.channels?.discord?.threadBindings;
15
+ const account = params.cfg.channels?.discord?.accounts?.[accountId]?.threadBindings;
16
+ return resolveThreadBindingIdleTimeoutMs({
17
+ channelIdleHoursRaw: account?.idleHours ?? root?.idleHours,
18
+ sessionIdleHoursRaw: params.cfg.session?.threadBindings?.idleHours
19
+ });
20
+ }
21
+ function resolveDiscordThreadBindingMaxAgeMs(params) {
22
+ const accountId = normalizeAccountId(params.accountId);
23
+ const root = params.cfg.channels?.discord?.threadBindings;
24
+ const account = params.cfg.channels?.discord?.accounts?.[accountId]?.threadBindings;
25
+ return resolveThreadBindingMaxAgeMs({
26
+ channelMaxAgeHoursRaw: account?.maxAgeHours ?? root?.maxAgeHours,
27
+ sessionMaxAgeHoursRaw: params.cfg.session?.threadBindings?.maxAgeHours
28
+ });
29
+ }
30
+ //#endregion
31
+ //#region extensions/discord/src/monitor/thread-bindings.lifecycle.ts
32
+ const ACP_STARTUP_HEALTH_PROBE_CONCURRENCY_LIMIT = 8;
33
+ async function mapWithConcurrency(params) {
34
+ if (params.items.length === 0) return [];
35
+ const limit = Math.max(1, Math.floor(params.limit));
36
+ const resultsByIndex = /* @__PURE__ */ new Map();
37
+ let nextIndex = 0;
38
+ const runWorker = async () => {
39
+ for (;;) {
40
+ const index = nextIndex;
41
+ nextIndex += 1;
42
+ if (index >= params.items.length) return;
43
+ resultsByIndex.set(index, await params.worker(params.items[index], index));
44
+ }
45
+ };
46
+ const workers = Array.from({ length: Math.min(limit, params.items.length) }, () => runWorker());
47
+ await Promise.all(workers);
48
+ return params.items.map((_item, index) => resultsByIndex.get(index));
49
+ }
50
+ function listThreadBindingsForAccount(accountId) {
51
+ const manager = getThreadBindingManager(accountId);
52
+ if (!manager) return [];
53
+ return manager.listBindings();
54
+ }
55
+ function listThreadBindingsBySessionKey(params) {
56
+ return resolveBindingIdsForTargetSession(params).map((bindingKey) => BINDINGS_BY_THREAD_ID.get(bindingKey)).filter((entry) => Boolean(entry));
57
+ }
58
+ async function autoBindSpawnedDiscordSubagent(params) {
59
+ if (normalizeOptionalLowercaseString(params.channel) !== "discord") return null;
60
+ const manager = getThreadBindingManager(params.accountId);
61
+ if (!manager) return null;
62
+ const managerToken = getThreadBindingToken(manager.accountId);
63
+ const requesterThreadId = normalizeThreadId(params.threadId);
64
+ let channelId = "";
65
+ if (requesterThreadId) {
66
+ const existing = manager.getByThreadId(requesterThreadId);
67
+ if (existing?.channelId?.trim()) channelId = existing.channelId.trim();
68
+ else channelId = await resolveChannelIdForBinding({
69
+ cfg: params.cfg,
70
+ accountId: manager.accountId,
71
+ token: managerToken,
72
+ threadId: requesterThreadId
73
+ }) ?? "";
74
+ }
75
+ if (!channelId) {
76
+ const to = normalizeOptionalString(params.to) ?? "";
77
+ if (!to) return null;
78
+ try {
79
+ const target = parseDiscordTarget(to, { defaultKind: "channel" });
80
+ if (!target || target.kind !== "channel") return null;
81
+ channelId = await resolveChannelIdForBinding({
82
+ cfg: params.cfg,
83
+ accountId: manager.accountId,
84
+ token: managerToken,
85
+ threadId: target.id
86
+ }) ?? "";
87
+ } catch {
88
+ return null;
89
+ }
90
+ }
91
+ return await manager.bindTarget({
92
+ threadId: void 0,
93
+ channelId,
94
+ createThread: true,
95
+ threadName: resolveThreadBindingThreadName({
96
+ agentId: params.agentId,
97
+ label: params.label
98
+ }),
99
+ targetKind: "subagent",
100
+ targetSessionKey: params.childSessionKey,
101
+ agentId: params.agentId,
102
+ label: params.label,
103
+ boundBy: params.boundBy ?? "system",
104
+ introText: resolveThreadBindingIntroText({
105
+ agentId: params.agentId,
106
+ label: params.label,
107
+ idleTimeoutMs: manager.getIdleTimeoutMs(),
108
+ maxAgeMs: manager.getMaxAgeMs()
109
+ })
110
+ });
111
+ }
112
+ function unbindThreadBindingsBySessionKey(params) {
113
+ const ids = resolveBindingIdsForTargetSession(params);
114
+ if (ids.length === 0) return [];
115
+ const removed = [];
116
+ for (const bindingKey of ids) {
117
+ const record = BINDINGS_BY_THREAD_ID.get(bindingKey);
118
+ if (!record) continue;
119
+ const manager = MANAGERS_BY_ACCOUNT_ID.get(record.accountId);
120
+ if (manager) {
121
+ const unbound = manager.unbindThread({
122
+ threadId: record.threadId,
123
+ reason: params.reason,
124
+ sendFarewell: params.sendFarewell,
125
+ farewellText: params.farewellText
126
+ });
127
+ if (unbound) removed.push(unbound);
128
+ continue;
129
+ }
130
+ const unbound = removeBindingRecord(bindingKey);
131
+ if (unbound) {
132
+ rememberRecentUnboundWebhookEcho(unbound);
133
+ removed.push(unbound);
134
+ }
135
+ }
136
+ if (removed.length > 0 && shouldPersistBindingMutations()) saveBindingsToDisk({ force: true });
137
+ return removed;
138
+ }
139
+ function resolveStoredAcpBindingHealth(params) {
140
+ if (!params.session.acp) return "stale";
141
+ return "healthy";
142
+ }
143
+ async function reconcileAcpThreadBindingsOnStartup(params) {
144
+ const manager = getThreadBindingManager(params.accountId);
145
+ if (!manager) return {
146
+ checked: 0,
147
+ removed: 0,
148
+ staleSessionKeys: []
149
+ };
150
+ const acpBindings = manager.listBindings().filter((binding) => binding.targetKind === "acp" && binding.metadata?.pluginBindingOwner !== "plugin");
151
+ const staleBindings = [];
152
+ const probeTargets = [];
153
+ for (const binding of acpBindings) {
154
+ const sessionKey = binding.targetSessionKey.trim();
155
+ if (!sessionKey) {
156
+ staleBindings.push(binding);
157
+ continue;
158
+ }
159
+ const session = readAcpSessionEntry({
160
+ cfg: params.cfg,
161
+ sessionKey
162
+ });
163
+ if (!session) {
164
+ staleBindings.push(binding);
165
+ continue;
166
+ }
167
+ if (session.storeReadFailed) continue;
168
+ if (resolveStoredAcpBindingHealth({ session }) === "stale") {
169
+ staleBindings.push(binding);
170
+ continue;
171
+ }
172
+ if (!params.healthProbe) continue;
173
+ probeTargets.push({
174
+ binding,
175
+ sessionKey,
176
+ session
177
+ });
178
+ }
179
+ if (params.healthProbe && probeTargets.length > 0) {
180
+ const probeResults = await mapWithConcurrency({
181
+ items: probeTargets,
182
+ limit: ACP_STARTUP_HEALTH_PROBE_CONCURRENCY_LIMIT,
183
+ worker: async ({ binding, sessionKey, session }) => {
184
+ try {
185
+ return {
186
+ binding,
187
+ status: (await params.healthProbe?.({
188
+ cfg: params.cfg,
189
+ accountId: manager.accountId,
190
+ sessionKey,
191
+ binding,
192
+ session
193
+ }))?.status ?? "uncertain"
194
+ };
195
+ } catch {
196
+ return {
197
+ binding,
198
+ status: "uncertain"
199
+ };
200
+ }
201
+ }
202
+ });
203
+ for (const probeResult of probeResults) if (probeResult.status === "stale") staleBindings.push(probeResult.binding);
204
+ }
205
+ if (staleBindings.length === 0) return {
206
+ checked: acpBindings.length,
207
+ removed: 0,
208
+ staleSessionKeys: []
209
+ };
210
+ const staleSessionKeys = [];
211
+ let removed = 0;
212
+ for (const binding of staleBindings) {
213
+ staleSessionKeys.push(binding.targetSessionKey);
214
+ if (manager.unbindThread({
215
+ threadId: binding.threadId,
216
+ reason: "stale-session",
217
+ sendFarewell: params.sendFarewell ?? false
218
+ })) removed += 1;
219
+ }
220
+ return {
221
+ checked: acpBindings.length,
222
+ removed,
223
+ staleSessionKeys: [...new Set(staleSessionKeys)]
224
+ };
225
+ }
226
+ //#endregion
227
+ //#region extensions/discord/src/monitor/thread-bindings.ts
228
+ var thread_bindings_exports = /* @__PURE__ */ __exportAll({
229
+ autoBindSpawnedDiscordSubagent: () => autoBindSpawnedDiscordSubagent,
230
+ createNoopThreadBindingManager: () => createNoopThreadBindingManager,
231
+ createThreadBindingManager: () => createThreadBindingManager,
232
+ formatThreadBindingDurationLabel: () => formatThreadBindingDurationLabel,
233
+ getThreadBindingManager: () => getThreadBindingManager,
234
+ isRecentlyUnboundThreadWebhookMessage: () => isRecentlyUnboundThreadWebhookMessage,
235
+ listThreadBindingsBySessionKey: () => listThreadBindingsBySessionKey,
236
+ listThreadBindingsForAccount: () => listThreadBindingsForAccount,
237
+ reconcileAcpThreadBindingsOnStartup: () => reconcileAcpThreadBindingsOnStartup,
238
+ resolveDiscordThreadBindingIdleTimeoutMs: () => resolveDiscordThreadBindingIdleTimeoutMs,
239
+ resolveDiscordThreadBindingMaxAgeMs: () => resolveDiscordThreadBindingMaxAgeMs,
240
+ resolveThreadBindingIdleTimeoutMs: () => resolveThreadBindingIdleTimeoutMs$1,
241
+ resolveThreadBindingInactivityExpiresAt: () => resolveThreadBindingInactivityExpiresAt,
242
+ resolveThreadBindingIntroText: () => resolveThreadBindingIntroText,
243
+ resolveThreadBindingMaxAgeExpiresAt: () => resolveThreadBindingMaxAgeExpiresAt,
244
+ resolveThreadBindingMaxAgeMs: () => resolveThreadBindingMaxAgeMs$1,
245
+ resolveThreadBindingPersona: () => resolveThreadBindingPersona,
246
+ resolveThreadBindingPersonaFromRecord: () => resolveThreadBindingPersonaFromRecord,
247
+ resolveThreadBindingThreadName: () => resolveThreadBindingThreadName,
248
+ resolveThreadBindingsEnabled: () => resolveThreadBindingsEnabled,
249
+ setThreadBindingIdleTimeoutBySessionKey: () => setThreadBindingIdleTimeoutBySessionKey,
250
+ setThreadBindingMaxAgeBySessionKey: () => setThreadBindingMaxAgeBySessionKey,
251
+ testing: () => testing,
252
+ unbindThreadBindingsBySessionKey: () => unbindThreadBindingsBySessionKey
253
+ });
254
+ //#endregion
255
+ export { reconcileAcpThreadBindingsOnStartup as a, resolveDiscordThreadBindingMaxAgeMs as c, listThreadBindingsForAccount as i, resolveThreadBindingsEnabled as l, autoBindSpawnedDiscordSubagent as n, unbindThreadBindingsBySessionKey as o, listThreadBindingsBySessionKey as r, resolveDiscordThreadBindingIdleTimeoutMs as s, thread_bindings_exports as t };
@@ -0,0 +1,244 @@
1
+ import { Ut as resolveDiscordChannelId, pt as getChannel, tt as createChannelWebhook } from "./send.receipt-CDn3GBWC.js";
2
+ import { N as createDiscordRestClient } from "./send.shared-D4iBnAmn.js";
3
+ import { c as sendWebhookMessageDiscord, u as createThreadDiscord } from "./send-DCtPCHGk.js";
4
+ import { t as sendMessageDiscord } from "./send.outbound-S9t0UuHc.js";
5
+ import { i as REUSABLE_WEBHOOKS_BY_ACCOUNT_CHANNEL, k as toReusableWebhookKey, m as rememberReusableWebhook, t as BINDINGS_BY_THREAD_ID } from "./thread-bindings.state-eTFl-PqJ.js";
6
+ import { normalizeOptionalString } from "klaw/plugin-sdk/string-coerce-runtime";
7
+ import { ChannelType } from "discord-api-types/v10";
8
+ import { logVerbose } from "klaw/plugin-sdk/runtime-env";
9
+ import { SYSTEM_MARK } from "klaw/plugin-sdk/text-chunking";
10
+ import { formatThreadBindingDurationLabel, resolveThreadBindingFarewellText, resolveThreadBindingIntroText, resolveThreadBindingThreadName } from "klaw/plugin-sdk/conversation-runtime";
11
+ //#region extensions/discord/src/monitor/thread-bindings.persona.ts
12
+ const THREAD_BINDING_PERSONA_MAX_CHARS = 80;
13
+ function normalizePersonaLabel(value) {
14
+ if (!value) return;
15
+ return value.replace(/\s+/g, " ").trim() || void 0;
16
+ }
17
+ function resolveThreadBindingPersona(params) {
18
+ return `${SYSTEM_MARK} ${normalizePersonaLabel(params.label) || normalizePersonaLabel(params.agentId) || "agent"}`.slice(0, THREAD_BINDING_PERSONA_MAX_CHARS);
19
+ }
20
+ function resolveThreadBindingPersonaFromRecord(record) {
21
+ return resolveThreadBindingPersona({
22
+ label: record.label,
23
+ agentId: record.agentId
24
+ });
25
+ }
26
+ //#endregion
27
+ //#region extensions/discord/src/monitor/channel-access.ts
28
+ function readDiscordChannelPropertySafe(channel, key) {
29
+ if (!channel || typeof channel !== "object") return;
30
+ try {
31
+ if (!(key in channel)) return;
32
+ return channel[key];
33
+ } catch {
34
+ return;
35
+ }
36
+ }
37
+ function resolveDiscordChannelStringPropertySafe(channel, key) {
38
+ const value = readDiscordChannelPropertySafe(channel, key);
39
+ return typeof value === "string" ? value : void 0;
40
+ }
41
+ function resolveDiscordChannelNumberPropertySafe(channel, key) {
42
+ const value = readDiscordChannelPropertySafe(channel, key);
43
+ return typeof value === "number" ? value : void 0;
44
+ }
45
+ const DISCORD_CHANNEL_SNAKE_CASE_ALIASES = {
46
+ ownerId: "owner_id",
47
+ parentId: "parent_id"
48
+ };
49
+ function resolveDiscordChannelStringWithAliasSafe(channel, camelKey) {
50
+ const camelValue = resolveDiscordChannelStringPropertySafe(channel, camelKey);
51
+ if (camelValue !== void 0) return camelValue;
52
+ const snakeKey = DISCORD_CHANNEL_SNAKE_CASE_ALIASES[camelKey];
53
+ if (!snakeKey) return;
54
+ const directSnakeValue = resolveDiscordChannelStringPropertySafe(channel, snakeKey);
55
+ if (directSnakeValue !== void 0) return directSnakeValue;
56
+ return resolveDiscordChannelStringPropertySafe(readDiscordChannelPropertySafe(channel, "rawData"), snakeKey);
57
+ }
58
+ function resolveDiscordChannelNameSafe(channel) {
59
+ return resolveDiscordChannelStringPropertySafe(channel, "name");
60
+ }
61
+ function resolveDiscordChannelIdSafe(channel) {
62
+ return resolveDiscordChannelStringPropertySafe(channel, "id");
63
+ }
64
+ function resolveDiscordChannelTopicSafe(channel) {
65
+ return resolveDiscordChannelStringPropertySafe(channel, "topic");
66
+ }
67
+ function resolveDiscordChannelParentIdSafe(channel) {
68
+ return resolveDiscordChannelStringWithAliasSafe(channel, "parentId");
69
+ }
70
+ function resolveDiscordChannelOwnerIdSafe(channel) {
71
+ return resolveDiscordChannelStringWithAliasSafe(channel, "ownerId");
72
+ }
73
+ function resolveDiscordChannelParentSafe(channel) {
74
+ return readDiscordChannelPropertySafe(channel, "parent");
75
+ }
76
+ function resolveDiscordChannelInfoSafe(channel) {
77
+ const parent = resolveDiscordChannelParentSafe(channel);
78
+ return {
79
+ name: resolveDiscordChannelNameSafe(channel),
80
+ topic: resolveDiscordChannelTopicSafe(channel),
81
+ type: resolveDiscordChannelNumberPropertySafe(channel, "type"),
82
+ parentId: resolveDiscordChannelParentIdSafe(channel),
83
+ ownerId: resolveDiscordChannelOwnerIdSafe(channel),
84
+ parentName: resolveDiscordChannelNameSafe(parent)
85
+ };
86
+ }
87
+ //#endregion
88
+ //#region extensions/discord/src/monitor/thread-bindings.discord-api.ts
89
+ function buildThreadTarget(threadId) {
90
+ return /^(channel:|user:)/i.test(threadId) ? threadId : `channel:${threadId}`;
91
+ }
92
+ function isThreadArchived(raw) {
93
+ if (!raw || typeof raw !== "object") return false;
94
+ const asRecord = raw;
95
+ if (asRecord.archived === true) return true;
96
+ if (asRecord.thread_metadata?.archived === true) return true;
97
+ if (asRecord.threadMetadata?.archived === true) return true;
98
+ return false;
99
+ }
100
+ function isThreadChannelType(type) {
101
+ return type === ChannelType.PublicThread || type === ChannelType.PrivateThread || type === ChannelType.AnnouncementThread;
102
+ }
103
+ function normalizeDiscordBindingChannelId(raw) {
104
+ const trimmed = normalizeOptionalString(raw) ?? "";
105
+ if (!trimmed) return null;
106
+ try {
107
+ return resolveDiscordChannelId(trimmed);
108
+ } catch {
109
+ return null;
110
+ }
111
+ }
112
+ function summarizeDiscordError(err) {
113
+ if (err instanceof Error) return err.message;
114
+ if (typeof err === "string") return err;
115
+ if (typeof err === "number" || typeof err === "boolean" || typeof err === "bigint" || typeof err === "symbol") return String(err);
116
+ return "error";
117
+ }
118
+ function extractNumericDiscordErrorValue(value) {
119
+ if (typeof value === "number" && Number.isFinite(value)) return Math.trunc(value);
120
+ if (typeof value === "string" && /^\d+$/.test(value.trim())) return Number(value);
121
+ }
122
+ function extractDiscordErrorStatus(err) {
123
+ if (!err || typeof err !== "object") return;
124
+ const candidate = err;
125
+ return extractNumericDiscordErrorValue(candidate.status) ?? extractNumericDiscordErrorValue(candidate.statusCode) ?? extractNumericDiscordErrorValue(candidate.response?.status);
126
+ }
127
+ function extractDiscordErrorCode(err) {
128
+ if (!err || typeof err !== "object") return;
129
+ const candidate = err;
130
+ return extractNumericDiscordErrorValue(candidate.code) ?? extractNumericDiscordErrorValue(candidate.rawError?.code) ?? extractNumericDiscordErrorValue(candidate.body?.code) ?? extractNumericDiscordErrorValue(candidate.response?.body?.code) ?? extractNumericDiscordErrorValue(candidate.response?.data?.code);
131
+ }
132
+ function isDiscordThreadGoneError(err) {
133
+ if (extractDiscordErrorCode(err) === 10003) return true;
134
+ const status = extractDiscordErrorStatus(err);
135
+ return status === 404 || status === 403;
136
+ }
137
+ async function maybeSendBindingMessage(params) {
138
+ const text = params.text.trim();
139
+ if (!text) return;
140
+ const record = params.record;
141
+ if (params.preferWebhook !== false && record.webhookId && record.webhookToken) try {
142
+ await sendWebhookMessageDiscord(text, {
143
+ cfg: params.cfg,
144
+ webhookId: record.webhookId,
145
+ webhookToken: record.webhookToken,
146
+ accountId: record.accountId,
147
+ threadId: record.threadId,
148
+ username: resolveThreadBindingPersonaFromRecord(record)
149
+ });
150
+ return;
151
+ } catch (err) {
152
+ logVerbose(`discord thread binding webhook send failed: ${summarizeDiscordError(err)}`);
153
+ }
154
+ try {
155
+ await sendMessageDiscord(buildThreadTarget(record.threadId), text, {
156
+ cfg: params.cfg,
157
+ accountId: record.accountId
158
+ });
159
+ } catch (err) {
160
+ logVerbose(`discord thread binding fallback send failed: ${summarizeDiscordError(err)}`);
161
+ }
162
+ }
163
+ async function createWebhookForChannel(params) {
164
+ try {
165
+ const rest = createDiscordRestClient({
166
+ cfg: params.cfg,
167
+ accountId: params.accountId,
168
+ token: params.token
169
+ }).rest;
170
+ const created = await createChannelWebhook(rest, params.channelId, { body: { name: "Klaw Agents" } });
171
+ const webhookId = normalizeOptionalString(created?.id) ?? "";
172
+ const webhookToken = normalizeOptionalString(created?.token) ?? "";
173
+ if (!webhookId || !webhookToken) return {};
174
+ return {
175
+ webhookId,
176
+ webhookToken
177
+ };
178
+ } catch (err) {
179
+ logVerbose(`discord thread binding webhook create failed for ${params.channelId}: ${summarizeDiscordError(err)}`);
180
+ return {};
181
+ }
182
+ }
183
+ function findReusableWebhook(params) {
184
+ const reusableKey = toReusableWebhookKey({
185
+ accountId: params.accountId,
186
+ channelId: params.channelId
187
+ });
188
+ const cached = REUSABLE_WEBHOOKS_BY_ACCOUNT_CHANNEL.get(reusableKey);
189
+ if (cached) return {
190
+ webhookId: cached.webhookId,
191
+ webhookToken: cached.webhookToken
192
+ };
193
+ for (const record of BINDINGS_BY_THREAD_ID.values()) {
194
+ if (record.accountId !== params.accountId) continue;
195
+ if (record.channelId !== params.channelId) continue;
196
+ if (!record.webhookId || !record.webhookToken) continue;
197
+ rememberReusableWebhook(record);
198
+ return {
199
+ webhookId: record.webhookId,
200
+ webhookToken: record.webhookToken
201
+ };
202
+ }
203
+ return {};
204
+ }
205
+ async function resolveChannelIdForBinding(params) {
206
+ const explicit = normalizeDiscordBindingChannelId(params.channelId);
207
+ if (explicit) return explicit;
208
+ const lookupThreadId = normalizeDiscordBindingChannelId(params.threadId);
209
+ if (!lookupThreadId) return null;
210
+ try {
211
+ const rest = createDiscordRestClient({
212
+ cfg: params.cfg,
213
+ accountId: params.accountId,
214
+ token: params.token
215
+ }).rest;
216
+ const channel = await getChannel(rest, lookupThreadId);
217
+ const channelInfo = resolveDiscordChannelInfoSafe(channel);
218
+ const channelId = normalizeOptionalString(resolveDiscordChannelIdSafe(channel)) ?? "";
219
+ const type = channelInfo.type;
220
+ const parentId = normalizeOptionalString(channelInfo.parentId) ?? "";
221
+ if (parentId && isThreadChannelType(type)) return parentId;
222
+ return channelId || null;
223
+ } catch (err) {
224
+ logVerbose(`discord thread binding channel resolve failed for ${lookupThreadId}: ${summarizeDiscordError(err)}`);
225
+ return null;
226
+ }
227
+ }
228
+ async function createThreadForBinding(params) {
229
+ try {
230
+ return (normalizeOptionalString((await createThreadDiscord(params.channelId, {
231
+ name: params.threadName,
232
+ autoArchiveMinutes: 60
233
+ }, {
234
+ cfg: params.cfg,
235
+ accountId: params.accountId,
236
+ token: params.token
237
+ }))?.id) ?? "") || null;
238
+ } catch (err) {
239
+ logVerbose(`discord thread binding auto-thread create failed for ${params.channelId}: ${summarizeDiscordError(err)}`);
240
+ return null;
241
+ }
242
+ }
243
+ //#endregion
244
+ export { formatThreadBindingDurationLabel as _, isThreadArchived as a, resolveThreadBindingThreadName as b, summarizeDiscordError as c, resolveDiscordChannelNameSafe as d, resolveDiscordChannelParentIdSafe as f, resolveThreadBindingPersonaFromRecord as g, resolveThreadBindingPersona as h, isDiscordThreadGoneError as i, resolveDiscordChannelIdSafe as l, resolveDiscordChannelTopicSafe as m, createWebhookForChannel as n, maybeSendBindingMessage as o, resolveDiscordChannelParentSafe as p, findReusableWebhook as r, resolveChannelIdForBinding as s, createThreadForBinding as t, resolveDiscordChannelInfoSafe as u, resolveThreadBindingFarewellText as v, resolveThreadBindingIntroText as y };