@openclaw/discord 2026.9.5 → 2026.9.7

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 (517) hide show
  1. package/assets/icon.png +0 -0
  2. package/dist/.setup/{account-inspect-BwQj24ht.mjs → account-inspect-De8hOUxG.mjs} +1 -1
  3. package/dist/.setup/{accounts-CwJQoLjM.mjs → accounts-ChaMcixG.mjs} +1 -4
  4. package/dist/.setup/{activities-api-DBwRt5ES.mjs → activities-api-tvbsU2e3.mjs} +38 -66
  5. package/dist/.setup/{api-CBK9zcq5.mjs → api-DVbJwZVt.mjs} +10 -2
  6. package/dist/.setup/{approval-handler.runtime-Du3n5ypX.mjs → approval-handler.runtime-DxCK2Rux.mjs} +49 -125
  7. package/dist/.setup/{approval-message-updates-BN7JtScm.mjs → approval-message-updates-BKFqavHZ.mjs} +2 -2
  8. package/dist/.setup/{audit-C8uaKoa9.mjs → audit-CLg9I71N.mjs} +5 -5
  9. package/dist/.setup/{channel-ChKdlBgH.mjs → channel-DxlUVU9t.mjs} +125 -228
  10. package/dist/.setup/{channel-type-DKnjV1XW.mjs → channel-type-DRCrEMss.mjs} +22 -22
  11. package/dist/.setup/{channel.setup-BlC3-Kzz.mjs → channel.setup-CRo1GjV7.mjs} +6 -9
  12. package/dist/.setup/{components-MqMWUWnE.mjs → components-Cq1PvIpN.mjs} +42 -71
  13. package/dist/.setup/{config-schema-CiZz-mtA.mjs → config-schema-oxELUSDx.mjs} +19 -44
  14. package/dist/.setup/{conversation-binding-route-_rz33QHO.mjs → conversation-binding-route-Caz_XuFH.mjs} +14 -6
  15. package/dist/.setup/{directory-config-BytTftz-.mjs → directory-config-esqNn0Eo.mjs} +6 -9
  16. package/dist/.setup/{directory-live--EGTH0DC.mjs → directory-live-DtKRHuGV.mjs} +6 -12
  17. package/dist/.setup/{discord-BXpHW-cu.mjs → discord-0xJYfdDD.mjs} +82 -386
  18. package/dist/.setup/{doctor-DxcdkXzz.mjs → doctor-BCl1H5tl.mjs} +21 -36
  19. package/dist/.setup/{doctor-contract-Co5vRCZ6.mjs → doctor-contract-CvvgwrrG.mjs} +41 -50
  20. package/dist/.setup/{channel-actions.runtime-CJmiFfps.mjs → handle-action-CUvQWnE7.mjs} +74 -105
  21. package/dist/.setup/{handle-action.guild-admin-DAFyh_yV.mjs → handle-action.guild-admin-Df-8gVle.mjs} +63 -121
  22. package/dist/.setup/{live-policy-config-eKQ-PLdy.mjs → live-policy-config-8Pv20CHc.mjs} +2 -3
  23. package/dist/.setup/{message-handler-DnUrDpaU.mjs → message-handler-B-Jk4oDk.mjs} +18 -93
  24. package/dist/.setup/message-handler.preflight-pluralkit-CWLUBVcx.mjs +141 -0
  25. package/dist/.setup/{message-handler.preflight-CtqaF_fb.mjs → message-handler.preflight-v-__NSDq.mjs} +73 -287
  26. package/dist/.setup/{message-handler.process-Dz1xvuQU.mjs → message-handler.process-BNFFuChn.mjs} +423 -374
  27. package/dist/.setup/{outbound-adapter-C8v79z9Z.mjs → outbound-adapter-BobT-kse.mjs} +105 -19
  28. package/dist/.setup/{outbound-session-route-CqWbuMOm.mjs → outbound-session-route-zVGxxceg.mjs} +142 -109
  29. package/dist/.setup/{pluralkit-CdAt1G0P.mjs → pluralkit-a6_NLfH9.mjs} +1 -1
  30. package/dist/.setup/{preflight-audio-DrnqFA8U.mjs → preflight-audio-DHGIHEpv.mjs} +2 -1
  31. package/dist/.setup/{presence-cache-dYSHPWMx.mjs → presence-cache-Di3H3DIU.mjs} +0 -4
  32. package/dist/.setup/{probe-CupW4we4.mjs → probe-LYrIHlBF.mjs} +13 -4
  33. package/dist/.setup/{provider-72zIvN-i.mjs → provider-B_G5hASF.mjs} +1112 -1668
  34. package/dist/.setup/provider-session.runtime-BYlTBFD2.mjs +6 -0
  35. package/dist/.setup/provider.runtime-CUE3UxER.mjs +2 -0
  36. package/dist/.setup/{realtime-session.runtime-DTccTgTM.mjs → realtime-session.runtime-oUd9DOcz.mjs} +372 -345
  37. package/dist/.setup/receive-recovery-CHPOsnLc.mjs +514 -0
  38. package/dist/.setup/{resolve-allowlist-common-CwMBzbx9.mjs → resolve-allowlist-common-DPdRggu5.mjs} +4 -7
  39. package/dist/.setup/{resolve-channels-BbvsLQOZ.mjs → resolve-channels-BFPNRmVv.mjs} +21 -40
  40. package/dist/.setup/{resolve-users-ByFlR7LQ.mjs → resolve-users-0-aBuCy3.mjs} +4 -4
  41. package/dist/.setup/{retry-DBfcEgmO.mjs → retry-pz_cSha2.mjs} +81 -16
  42. package/dist/.setup/rolldown-runtime-B4FMCO8f.mjs +28 -0
  43. package/dist/.setup/{runtime-SchNfUsQ.mjs → runtime-FN000lxA.mjs} +83 -166
  44. package/dist/.setup/runtime-doctor-migrations-CshUGl36.mjs +159 -0
  45. package/dist/.setup/{runtime-BVoa7hhx.mjs → runtime-sUksZ--Q.mjs} +2 -5
  46. package/dist/.setup/{secret-config-contract-DFu9hfU8.mjs → secret-config-contract-uOE2J7yM.mjs} +15 -85
  47. package/dist/.setup/{security-audit-s5w50-Ly.mjs → security-audit-Cdaegq7C.mjs} +3 -1
  48. package/dist/.setup/{send-CKDczUNL.mjs → send-CrfEI6Bs.mjs} +73 -114
  49. package/dist/.setup/{send.components-DWQjXhPV.mjs → send.components-DxQAMfES.mjs} +62 -107
  50. package/dist/.setup/{send.outbound-D0hQ7s50.mjs → send.outbound-BISKnb-a.mjs} +79 -154
  51. package/dist/.setup/{send.shared-Zwx6BxQ5.mjs → send.shared-DGFkbkQR.mjs} +10 -25
  52. package/dist/.setup/{sender-identity-0Ymgvmaj.mjs → sender-identity-B9X5Vb9R.mjs} +2 -3
  53. package/dist/.setup/setup-plugin-api-BQUBxbhe.mjs +3 -0
  54. package/dist/.setup/{shared-CaA3Vv4n.mjs → shared-B3wZ4hN-.mjs} +25 -32
  55. package/dist/.setup/{subagent-hooks-Bired9q6.mjs → subagent-hooks-nlUE9ow7.mjs} +5 -6
  56. package/dist/.setup/system-events-CdeZnvPV.mjs +33 -0
  57. package/dist/.setup/{target-resolver-B6MrxbYv.mjs → target-resolver-BuLapkhy.mjs} +9 -12
  58. package/dist/.setup/targets-0KUcEIYx.mjs +3 -0
  59. package/dist/.setup/{thread-bindings-CK5272V3.mjs → thread-bindings-D7TfgjR_.mjs} +33 -35
  60. package/dist/.setup/thread-bindings.manager-DN-NissX.mjs +819 -0
  61. package/dist/.setup/thread-bindings.session-updates-CshfKghV.mjs +359 -0
  62. package/dist/.setup/{thread-bindings.state-BThFQEga.mjs → thread-bindings.state-g6v9zAym.mjs} +21 -62
  63. package/dist/.setup/{transcripts-source-CuWYgayu.mjs → transcripts-source-p8EV179h.mjs} +133 -238
  64. package/dist/.setup/{typing-BKZL5fGj.mjs → typing-BiHCzBRu.mjs} +2 -1
  65. package/dist/.setup/{voice-runtime-DHVQ2mFz.mjs → voice-runtime-B46rcwrG.mjs} +633 -1085
  66. package/dist/account-inspect-api.js +1 -1
  67. package/dist/action-runtime-api.js +1 -1
  68. package/dist/activities-api.js +1 -1
  69. package/dist/api.js +18 -18
  70. package/dist/channel-config-api.js +1 -1
  71. package/dist/channel-plugin-api.js +1 -1
  72. package/dist/directory-contract-api.js +1 -1
  73. package/dist/doctor-contract-api.js +4 -4
  74. package/dist/index.js +1 -1
  75. package/dist/runtime-api.js +20 -20
  76. package/dist/secret-contract-api.js +1 -1
  77. package/dist/security-audit-contract-api.js +1 -1
  78. package/dist/setup-entry.js +1 -1
  79. package/dist/setup-plugin-api.js +1 -1
  80. package/dist/src/voice/audio-worker.runtime.js +1056 -0
  81. package/dist/subagent-hooks-api.js +3 -4
  82. package/dist/transcripts-source-api.js +1 -1
  83. package/node_modules/@napi-rs/wasm-runtime/dist/emnapi-plugins.cjs +8 -4
  84. package/node_modules/@napi-rs/wasm-runtime/dist/emnapi-plugins.js +8 -4
  85. package/node_modules/@napi-rs/wasm-runtime/dist/fs-proxy.cjs +1 -1
  86. package/node_modules/@napi-rs/wasm-runtime/dist/fs.js +770 -695
  87. package/node_modules/@napi-rs/wasm-runtime/fs-proxy.js +3 -2
  88. package/node_modules/@napi-rs/wasm-runtime/package.json +1 -1
  89. package/node_modules/@tybys/wasm-util/LICENSE +21 -0
  90. package/node_modules/@tybys/wasm-util/package.json +1 -1
  91. package/node_modules/@types/node/README.md +2 -2
  92. package/node_modules/@types/node/child_process.d.ts +1 -1
  93. package/node_modules/@types/node/crypto.d.ts +20 -8
  94. package/node_modules/@types/node/ffi.d.ts +14 -0
  95. package/node_modules/@types/node/http2.d.ts +3 -2
  96. package/node_modules/@types/node/net.d.ts +16 -4
  97. package/node_modules/@types/node/package.json +2 -17
  98. package/node_modules/@types/node/process.d.ts +1 -0
  99. package/node_modules/@types/node/quic.d.ts +39 -1
  100. package/node_modules/@types/node/stream/iter.d.ts +9 -12
  101. package/node_modules/@types/node/test/reporters.d.ts +1 -0
  102. package/node_modules/@types/node/test.d.ts +72 -0
  103. package/node_modules/@types/node/tls.d.ts +14 -10
  104. package/node_modules/@types/node/vm.d.ts +2 -1
  105. package/node_modules/@types/node/web-globals/streams.d.ts +4 -0
  106. package/node_modules/@types/node/worker_threads.d.ts +4 -1
  107. package/node_modules/typebox/build/compile/code.mjs +1 -2
  108. package/node_modules/typebox/build/compile/validator.mjs +5 -1
  109. package/node_modules/typebox/build/format/iri.mjs +16 -9
  110. package/node_modules/typebox/build/guard/emit.mjs +2 -2
  111. package/node_modules/typebox/build/guard/guard.d.mts +7 -5
  112. package/node_modules/typebox/build/guard/guard.mjs +14 -9
  113. package/node_modules/typebox/build/guard/index.mjs +6 -0
  114. package/node_modules/typebox/build/guard/unicode/unicode.d.mts +6 -0
  115. package/node_modules/typebox/build/guard/unicode/unicode.mjs +35 -0
  116. package/node_modules/typebox/build/guard/{string.mjs → unicode/unicode_segment.mjs} +16 -19
  117. package/node_modules/typebox/build/schema/build.mjs +2 -3
  118. package/node_modules/typebox/build/schema/engine/_pathing.d.mts +1 -0
  119. package/node_modules/typebox/build/schema/engine/_pathing.mjs +11 -0
  120. package/node_modules/typebox/build/schema/engine/_refine.mjs +13 -5
  121. package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +2 -1
  122. package/node_modules/typebox/build/schema/engine/dependencies.mjs +2 -1
  123. package/node_modules/typebox/build/schema/engine/dependentSchemas.mjs +2 -1
  124. package/node_modules/typebox/build/schema/engine/dynamicRef.d.mts +1 -1
  125. package/node_modules/typebox/build/schema/engine/dynamicRef.mjs +2 -2
  126. package/node_modules/typebox/build/schema/engine/format.mjs +9 -2
  127. package/node_modules/typebox/build/schema/engine/patternProperties.mjs +3 -2
  128. package/node_modules/typebox/build/schema/engine/properties.mjs +3 -2
  129. package/node_modules/typebox/build/schema/engine/propertyNames.mjs +2 -1
  130. package/node_modules/typebox/build/schema/engine/recursiveRef.d.mts +1 -1
  131. package/node_modules/typebox/build/schema/engine/recursiveRef.mjs +2 -2
  132. package/node_modules/typebox/build/schema/engine/ref.d.mts +1 -1
  133. package/node_modules/typebox/build/schema/engine/ref.mjs +2 -2
  134. package/node_modules/typebox/build/schema/engine/schema.mjs +24 -24
  135. package/node_modules/typebox/build/schema/parse.mjs +3 -0
  136. package/node_modules/typebox/build/schema/pointer/pointer.d.mts +1 -6
  137. package/node_modules/typebox/build/schema/pointer/pointer.mjs +47 -64
  138. package/node_modules/typebox/build/system/settings/internal.d.mts +2 -0
  139. package/node_modules/typebox/build/system/settings/internal.mjs +20 -0
  140. package/node_modules/typebox/build/system/settings/settings.d.mts +11 -0
  141. package/node_modules/typebox/build/system/settings/settings.mjs +14 -0
  142. package/node_modules/typebox/build/type/extends/inference.d.mts +1 -1
  143. package/node_modules/typebox/build/type/extends/inference.mjs +15 -2
  144. package/node_modules/typebox/build/type/extends/tuple.d.mts +2 -1
  145. package/node_modules/typebox/build/type/extends/tuple.mjs +21 -1
  146. package/node_modules/typebox/build/value/parse/parse.mjs +10 -4
  147. package/node_modules/typebox/package.json +1 -1
  148. package/node_modules/typebox/readme.md +3 -1
  149. package/node_modules/zod/README.md +2 -2
  150. package/node_modules/zod/compile.cjs +19 -0
  151. package/node_modules/zod/index.cjs +19 -0
  152. package/node_modules/zod/locales/index.cjs +19 -0
  153. package/node_modules/zod/mini/index.cjs +19 -0
  154. package/node_modules/zod/package.json +8 -7
  155. package/node_modules/zod/src/v3/helpers/errorUtil.ts +1 -1
  156. package/node_modules/zod/src/v4/classic/external.ts +2 -0
  157. package/node_modules/zod/src/v4/classic/from-json-schema.ts +248 -25
  158. package/node_modules/zod/src/v4/classic/schemas.ts +243 -168
  159. package/node_modules/zod/src/v4/classic/tests/assignability.test.ts +60 -9
  160. package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +6 -0
  161. package/node_modules/zod/src/v4/classic/tests/continuability.test.ts +2 -2
  162. package/node_modules/zod/src/v4/classic/tests/cyclic-data.test.ts +265 -0
  163. package/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +112 -6
  164. package/node_modules/zod/src/v4/classic/tests/enum.test.ts +9 -0
  165. package/node_modules/zod/src/v4/classic/tests/error.test.ts +130 -1
  166. package/node_modules/zod/src/v4/classic/tests/from-json-schema.test.ts +157 -0
  167. package/node_modules/zod/src/v4/classic/tests/iban.test.ts +81 -0
  168. package/node_modules/zod/src/v4/classic/tests/instance-footprint.test.ts +40 -2
  169. package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +27 -7
  170. package/node_modules/zod/src/v4/classic/tests/issue-schema.test.ts +88 -56
  171. package/node_modules/zod/src/v4/classic/tests/number.test.ts +39 -0
  172. package/node_modules/zod/src/v4/classic/tests/object.test.ts +56 -0
  173. package/node_modules/zod/src/v4/classic/tests/optin-ladder.test.ts +3 -2
  174. package/node_modules/zod/src/v4/classic/tests/prefault.test.ts +70 -0
  175. package/node_modules/zod/src/v4/classic/tests/properties.test.ts +141 -0
  176. package/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +46 -1
  177. package/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +19 -0
  178. package/node_modules/zod/src/v4/classic/tests/string.test.ts +95 -1
  179. package/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +33 -1
  180. package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +234 -38
  181. package/node_modules/zod/src/v4/classic/tests/validate.test.ts +569 -0
  182. package/node_modules/zod/src/v4/core/api.ts +44 -28
  183. package/node_modules/zod/src/v4/core/checks.ts +62 -102
  184. package/node_modules/zod/src/v4/core/compile.ts +218 -93
  185. package/node_modules/zod/src/v4/core/core.ts +1 -3
  186. package/node_modules/zod/src/v4/core/doc.ts +6 -2
  187. package/node_modules/zod/src/v4/core/errors.ts +3 -6
  188. package/node_modules/zod/src/v4/core/json-schema-generator.ts +2 -2
  189. package/node_modules/zod/src/v4/core/json-schema-processors.ts +185 -81
  190. package/node_modules/zod/src/v4/core/memoizer.ts +75 -28
  191. package/node_modules/zod/src/v4/core/parse.ts +37 -16
  192. package/node_modules/zod/src/v4/core/regexes.ts +14 -4
  193. package/node_modules/zod/src/v4/core/schemas.ts +296 -132
  194. package/node_modules/zod/src/v4/core/tests/cached.test.ts +54 -0
  195. package/node_modules/zod/src/v4/core/tests/compile-differential.test.ts +35 -0
  196. package/node_modules/zod/src/v4/core/tests/compile-generative.test.ts +445 -0
  197. package/node_modules/zod/src/v4/core/tests/compile.test.ts +399 -2
  198. package/node_modules/zod/src/v4/core/tests/email-regex.test.ts +140 -0
  199. package/node_modules/zod/src/v4/core/tests/locales/tg.test.ts +85 -0
  200. package/node_modules/zod/src/v4/core/tests/polyfill-collision.test.ts +46 -0
  201. package/node_modules/zod/src/v4/core/tests/url-no-canparse.test.ts +118 -16
  202. package/node_modules/zod/src/v4/core/to-json-schema.ts +9 -7
  203. package/node_modules/zod/src/v4/core/util.ts +218 -147
  204. package/node_modules/zod/src/v4/core/versions.ts +2 -2
  205. package/node_modules/zod/src/v4/locales/ar.ts +2 -0
  206. package/node_modules/zod/src/v4/locales/az.ts +2 -0
  207. package/node_modules/zod/src/v4/locales/be.ts +2 -0
  208. package/node_modules/zod/src/v4/locales/bg.ts +2 -0
  209. package/node_modules/zod/src/v4/locales/bn.ts +2 -0
  210. package/node_modules/zod/src/v4/locales/ca.ts +2 -0
  211. package/node_modules/zod/src/v4/locales/ckb.ts +2 -0
  212. package/node_modules/zod/src/v4/locales/cs.ts +2 -0
  213. package/node_modules/zod/src/v4/locales/da.ts +2 -0
  214. package/node_modules/zod/src/v4/locales/de.ts +2 -0
  215. package/node_modules/zod/src/v4/locales/el.ts +2 -0
  216. package/node_modules/zod/src/v4/locales/en.ts +2 -0
  217. package/node_modules/zod/src/v4/locales/eo.ts +2 -0
  218. package/node_modules/zod/src/v4/locales/es.ts +2 -0
  219. package/node_modules/zod/src/v4/locales/fa.ts +2 -0
  220. package/node_modules/zod/src/v4/locales/fi.ts +2 -0
  221. package/node_modules/zod/src/v4/locales/fr-CA.ts +2 -0
  222. package/node_modules/zod/src/v4/locales/fr.ts +2 -0
  223. package/node_modules/zod/src/v4/locales/gu.ts +2 -0
  224. package/node_modules/zod/src/v4/locales/he.ts +2 -0
  225. package/node_modules/zod/src/v4/locales/hi.ts +2 -0
  226. package/node_modules/zod/src/v4/locales/hr.ts +2 -0
  227. package/node_modules/zod/src/v4/locales/hu.ts +2 -0
  228. package/node_modules/zod/src/v4/locales/hy.ts +2 -0
  229. package/node_modules/zod/src/v4/locales/id.ts +2 -0
  230. package/node_modules/zod/src/v4/locales/index.ts +1 -0
  231. package/node_modules/zod/src/v4/locales/is.ts +2 -0
  232. package/node_modules/zod/src/v4/locales/it.ts +2 -0
  233. package/node_modules/zod/src/v4/locales/ja.ts +2 -0
  234. package/node_modules/zod/src/v4/locales/ka.ts +2 -0
  235. package/node_modules/zod/src/v4/locales/km.ts +2 -0
  236. package/node_modules/zod/src/v4/locales/kn.ts +2 -0
  237. package/node_modules/zod/src/v4/locales/ko.ts +2 -0
  238. package/node_modules/zod/src/v4/locales/lt.ts +2 -0
  239. package/node_modules/zod/src/v4/locales/mk.ts +2 -0
  240. package/node_modules/zod/src/v4/locales/ms.ts +2 -0
  241. package/node_modules/zod/src/v4/locales/ne.ts +2 -0
  242. package/node_modules/zod/src/v4/locales/nl.ts +2 -0
  243. package/node_modules/zod/src/v4/locales/nn.ts +2 -0
  244. package/node_modules/zod/src/v4/locales/no.ts +2 -0
  245. package/node_modules/zod/src/v4/locales/ota.ts +2 -0
  246. package/node_modules/zod/src/v4/locales/pl.ts +2 -0
  247. package/node_modules/zod/src/v4/locales/ps.ts +2 -0
  248. package/node_modules/zod/src/v4/locales/pt-BR.ts +2 -0
  249. package/node_modules/zod/src/v4/locales/pt.ts +2 -0
  250. package/node_modules/zod/src/v4/locales/ro.ts +2 -0
  251. package/node_modules/zod/src/v4/locales/ru.ts +2 -0
  252. package/node_modules/zod/src/v4/locales/sk.ts +2 -0
  253. package/node_modules/zod/src/v4/locales/sl.ts +2 -0
  254. package/node_modules/zod/src/v4/locales/sv.ts +2 -0
  255. package/node_modules/zod/src/v4/locales/ta.ts +2 -0
  256. package/node_modules/zod/src/v4/locales/tg.ts +135 -0
  257. package/node_modules/zod/src/v4/locales/th.ts +2 -0
  258. package/node_modules/zod/src/v4/locales/tk.ts +2 -0
  259. package/node_modules/zod/src/v4/locales/tr.ts +2 -0
  260. package/node_modules/zod/src/v4/locales/uk.ts +2 -0
  261. package/node_modules/zod/src/v4/locales/ur.ts +2 -0
  262. package/node_modules/zod/src/v4/locales/uz.ts +2 -0
  263. package/node_modules/zod/src/v4/locales/vi.ts +2 -0
  264. package/node_modules/zod/src/v4/locales/yo.ts +2 -0
  265. package/node_modules/zod/src/v4/locales/zh-CN.ts +2 -0
  266. package/node_modules/zod/src/v4/locales/zh-TW.ts +2 -0
  267. package/node_modules/zod/src/v4/mini/external.ts +2 -0
  268. package/node_modules/zod/src/v4/mini/schemas.ts +32 -7
  269. package/node_modules/zod/src/v4/mini/tests/checks.test.ts +1 -1
  270. package/node_modules/zod/src/v4/mini/tests/computed.test.ts +11 -17
  271. package/node_modules/zod/src/v4/mini/tests/index.test.ts +86 -0
  272. package/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +16 -0
  273. package/node_modules/zod/src/v4/mini/tests/string.test.ts +23 -0
  274. package/node_modules/zod/v3/ZodError.cjs +19 -0
  275. package/node_modules/zod/v3/errors.cjs +19 -0
  276. package/node_modules/zod/v3/external.cjs +19 -0
  277. package/node_modules/zod/v3/helpers/enumUtil.cjs +19 -0
  278. package/node_modules/zod/v3/helpers/errorUtil.cjs +20 -1
  279. package/node_modules/zod/v3/helpers/errorUtil.js +1 -1
  280. package/node_modules/zod/v3/helpers/parseUtil.cjs +19 -0
  281. package/node_modules/zod/v3/helpers/partialUtil.cjs +19 -0
  282. package/node_modules/zod/v3/helpers/typeAliases.cjs +19 -0
  283. package/node_modules/zod/v3/helpers/util.cjs +19 -0
  284. package/node_modules/zod/v3/index.cjs +19 -0
  285. package/node_modules/zod/v3/standard-schema.cjs +19 -0
  286. package/node_modules/zod/v3/types.cjs +19 -0
  287. package/node_modules/zod/v4/classic/checks.cjs +19 -0
  288. package/node_modules/zod/v4/classic/coerce.cjs +19 -0
  289. package/node_modules/zod/v4/classic/compat.cjs +19 -0
  290. package/node_modules/zod/v4/classic/deep-partial.cjs +19 -0
  291. package/node_modules/zod/v4/classic/errors.cjs +19 -0
  292. package/node_modules/zod/v4/classic/external.cjs +22 -1
  293. package/node_modules/zod/v4/classic/external.d.cts +1 -1
  294. package/node_modules/zod/v4/classic/external.d.ts +1 -1
  295. package/node_modules/zod/v4/classic/external.js +1 -1
  296. package/node_modules/zod/v4/classic/from-json-schema.cjs +264 -24
  297. package/node_modules/zod/v4/classic/from-json-schema.js +245 -24
  298. package/node_modules/zod/v4/classic/in-out.cjs +19 -0
  299. package/node_modules/zod/v4/classic/index.cjs +19 -0
  300. package/node_modules/zod/v4/classic/iso.cjs +19 -0
  301. package/node_modules/zod/v4/classic/parse.cjs +19 -0
  302. package/node_modules/zod/v4/classic/schemas.cjs +100 -35
  303. package/node_modules/zod/v4/classic/schemas.d.cts +15 -1
  304. package/node_modules/zod/v4/classic/schemas.d.ts +15 -1
  305. package/node_modules/zod/v4/classic/schemas.js +77 -33
  306. package/node_modules/zod/v4/core/api.cjs +45 -22
  307. package/node_modules/zod/v4/core/api.d.cts +12 -6
  308. package/node_modules/zod/v4/core/api.d.ts +12 -6
  309. package/node_modules/zod/v4/core/api.js +25 -22
  310. package/node_modules/zod/v4/core/checks.cjs +51 -97
  311. package/node_modules/zod/v4/core/checks.d.cts +17 -1
  312. package/node_modules/zod/v4/core/checks.d.ts +17 -1
  313. package/node_modules/zod/v4/core/checks.js +31 -96
  314. package/node_modules/zod/v4/core/compile.cjs +173 -78
  315. package/node_modules/zod/v4/core/compile.d.cts +18 -4
  316. package/node_modules/zod/v4/core/compile.d.ts +18 -4
  317. package/node_modules/zod/v4/core/compile.js +154 -79
  318. package/node_modules/zod/v4/core/core.cjs +20 -1
  319. package/node_modules/zod/v4/core/core.js +1 -1
  320. package/node_modules/zod/v4/core/doc.cjs +26 -2
  321. package/node_modules/zod/v4/core/doc.js +7 -2
  322. package/node_modules/zod/v4/core/errors.cjs +21 -5
  323. package/node_modules/zod/v4/core/errors.js +2 -5
  324. package/node_modules/zod/v4/core/index.cjs +19 -0
  325. package/node_modules/zod/v4/core/json-schema-generator.cjs +20 -1
  326. package/node_modules/zod/v4/core/json-schema-generator.js +2 -2
  327. package/node_modules/zod/v4/core/json-schema-processors.cjs +188 -72
  328. package/node_modules/zod/v4/core/json-schema-processors.d.cts +16 -0
  329. package/node_modules/zod/v4/core/json-schema-processors.d.ts +16 -0
  330. package/node_modules/zod/v4/core/json-schema-processors.js +170 -74
  331. package/node_modules/zod/v4/core/json-schema.cjs +19 -0
  332. package/node_modules/zod/v4/core/memoizer.cjs +111 -23
  333. package/node_modules/zod/v4/core/memoizer.js +69 -23
  334. package/node_modules/zod/v4/core/parse.cjs +56 -16
  335. package/node_modules/zod/v4/core/parse.js +37 -16
  336. package/node_modules/zod/v4/core/regexes.cjs +31 -6
  337. package/node_modules/zod/v4/core/regexes.d.cts +3 -0
  338. package/node_modules/zod/v4/core/regexes.d.ts +3 -0
  339. package/node_modules/zod/v4/core/regexes.js +10 -4
  340. package/node_modules/zod/v4/core/registries.cjs +19 -0
  341. package/node_modules/zod/v4/core/schemas.cjs +302 -114
  342. package/node_modules/zod/v4/core/schemas.d.cts +28 -8
  343. package/node_modules/zod/v4/core/schemas.d.ts +28 -8
  344. package/node_modules/zod/v4/core/schemas.js +279 -113
  345. package/node_modules/zod/v4/core/standard-schema.cjs +19 -0
  346. package/node_modules/zod/v4/core/to-json-schema.cjs +28 -7
  347. package/node_modules/zod/v4/core/to-json-schema.d.cts +4 -3
  348. package/node_modules/zod/v4/core/to-json-schema.d.ts +4 -3
  349. package/node_modules/zod/v4/core/to-json-schema.js +7 -6
  350. package/node_modules/zod/v4/core/util.cjs +177 -143
  351. package/node_modules/zod/v4/core/util.d.cts +25 -4
  352. package/node_modules/zod/v4/core/util.d.ts +25 -4
  353. package/node_modules/zod/v4/core/util.js +156 -143
  354. package/node_modules/zod/v4/core/versions.cjs +21 -2
  355. package/node_modules/zod/v4/core/versions.d.cts +1 -1
  356. package/node_modules/zod/v4/core/versions.d.ts +1 -1
  357. package/node_modules/zod/v4/core/versions.js +2 -2
  358. package/node_modules/zod/v4/core/visit.cjs +19 -0
  359. package/node_modules/zod/v4/index.cjs +19 -0
  360. package/node_modules/zod/v4/locales/ar.cjs +2 -0
  361. package/node_modules/zod/v4/locales/ar.js +2 -0
  362. package/node_modules/zod/v4/locales/az.cjs +2 -0
  363. package/node_modules/zod/v4/locales/az.js +2 -0
  364. package/node_modules/zod/v4/locales/be.cjs +2 -0
  365. package/node_modules/zod/v4/locales/be.js +2 -0
  366. package/node_modules/zod/v4/locales/bg.cjs +2 -0
  367. package/node_modules/zod/v4/locales/bg.js +2 -0
  368. package/node_modules/zod/v4/locales/bn.cjs +2 -0
  369. package/node_modules/zod/v4/locales/bn.js +2 -0
  370. package/node_modules/zod/v4/locales/ca.cjs +2 -0
  371. package/node_modules/zod/v4/locales/ca.js +2 -0
  372. package/node_modules/zod/v4/locales/ckb.cjs +2 -0
  373. package/node_modules/zod/v4/locales/ckb.js +2 -0
  374. package/node_modules/zod/v4/locales/cs.cjs +2 -0
  375. package/node_modules/zod/v4/locales/cs.js +2 -0
  376. package/node_modules/zod/v4/locales/da.cjs +2 -0
  377. package/node_modules/zod/v4/locales/da.js +2 -0
  378. package/node_modules/zod/v4/locales/de.cjs +2 -0
  379. package/node_modules/zod/v4/locales/de.js +2 -0
  380. package/node_modules/zod/v4/locales/el.cjs +2 -0
  381. package/node_modules/zod/v4/locales/el.js +2 -0
  382. package/node_modules/zod/v4/locales/en.cjs +2 -0
  383. package/node_modules/zod/v4/locales/en.js +2 -0
  384. package/node_modules/zod/v4/locales/eo.cjs +2 -0
  385. package/node_modules/zod/v4/locales/eo.js +2 -0
  386. package/node_modules/zod/v4/locales/es.cjs +2 -0
  387. package/node_modules/zod/v4/locales/es.js +2 -0
  388. package/node_modules/zod/v4/locales/fa.cjs +2 -0
  389. package/node_modules/zod/v4/locales/fa.js +2 -0
  390. package/node_modules/zod/v4/locales/fi.cjs +2 -0
  391. package/node_modules/zod/v4/locales/fi.js +2 -0
  392. package/node_modules/zod/v4/locales/fr-CA.cjs +2 -0
  393. package/node_modules/zod/v4/locales/fr-CA.js +2 -0
  394. package/node_modules/zod/v4/locales/fr.cjs +2 -0
  395. package/node_modules/zod/v4/locales/fr.js +2 -0
  396. package/node_modules/zod/v4/locales/gu.cjs +2 -0
  397. package/node_modules/zod/v4/locales/gu.js +2 -0
  398. package/node_modules/zod/v4/locales/he.cjs +2 -0
  399. package/node_modules/zod/v4/locales/he.js +2 -0
  400. package/node_modules/zod/v4/locales/hi.cjs +2 -0
  401. package/node_modules/zod/v4/locales/hi.js +2 -0
  402. package/node_modules/zod/v4/locales/hr.cjs +2 -0
  403. package/node_modules/zod/v4/locales/hr.js +2 -0
  404. package/node_modules/zod/v4/locales/hu.cjs +2 -0
  405. package/node_modules/zod/v4/locales/hu.js +2 -0
  406. package/node_modules/zod/v4/locales/hy.cjs +2 -0
  407. package/node_modules/zod/v4/locales/hy.js +2 -0
  408. package/node_modules/zod/v4/locales/id.cjs +2 -0
  409. package/node_modules/zod/v4/locales/id.js +2 -0
  410. package/node_modules/zod/v4/locales/index.cjs +22 -1
  411. package/node_modules/zod/v4/locales/index.d.cts +1 -0
  412. package/node_modules/zod/v4/locales/index.d.ts +1 -0
  413. package/node_modules/zod/v4/locales/index.js +1 -0
  414. package/node_modules/zod/v4/locales/is.cjs +2 -0
  415. package/node_modules/zod/v4/locales/is.js +2 -0
  416. package/node_modules/zod/v4/locales/it.cjs +2 -0
  417. package/node_modules/zod/v4/locales/it.js +2 -0
  418. package/node_modules/zod/v4/locales/ja.cjs +2 -0
  419. package/node_modules/zod/v4/locales/ja.js +2 -0
  420. package/node_modules/zod/v4/locales/ka.cjs +2 -0
  421. package/node_modules/zod/v4/locales/ka.js +2 -0
  422. package/node_modules/zod/v4/locales/km.cjs +2 -0
  423. package/node_modules/zod/v4/locales/km.js +2 -0
  424. package/node_modules/zod/v4/locales/kn.cjs +2 -0
  425. package/node_modules/zod/v4/locales/kn.js +2 -0
  426. package/node_modules/zod/v4/locales/ko.cjs +2 -0
  427. package/node_modules/zod/v4/locales/ko.js +2 -0
  428. package/node_modules/zod/v4/locales/lt.cjs +2 -0
  429. package/node_modules/zod/v4/locales/lt.js +2 -0
  430. package/node_modules/zod/v4/locales/mk.cjs +2 -0
  431. package/node_modules/zod/v4/locales/mk.js +2 -0
  432. package/node_modules/zod/v4/locales/ms.cjs +2 -0
  433. package/node_modules/zod/v4/locales/ms.js +2 -0
  434. package/node_modules/zod/v4/locales/ne.cjs +2 -0
  435. package/node_modules/zod/v4/locales/ne.js +2 -0
  436. package/node_modules/zod/v4/locales/nl.cjs +2 -0
  437. package/node_modules/zod/v4/locales/nl.js +2 -0
  438. package/node_modules/zod/v4/locales/nn.cjs +2 -0
  439. package/node_modules/zod/v4/locales/nn.js +2 -0
  440. package/node_modules/zod/v4/locales/no.cjs +2 -0
  441. package/node_modules/zod/v4/locales/no.js +2 -0
  442. package/node_modules/zod/v4/locales/ota.cjs +2 -0
  443. package/node_modules/zod/v4/locales/ota.js +2 -0
  444. package/node_modules/zod/v4/locales/pl.cjs +2 -0
  445. package/node_modules/zod/v4/locales/pl.js +2 -0
  446. package/node_modules/zod/v4/locales/ps.cjs +2 -0
  447. package/node_modules/zod/v4/locales/ps.js +2 -0
  448. package/node_modules/zod/v4/locales/pt-BR.cjs +2 -0
  449. package/node_modules/zod/v4/locales/pt-BR.js +2 -0
  450. package/node_modules/zod/v4/locales/pt.cjs +2 -0
  451. package/node_modules/zod/v4/locales/pt.js +2 -0
  452. package/node_modules/zod/v4/locales/ro.cjs +2 -0
  453. package/node_modules/zod/v4/locales/ro.js +2 -0
  454. package/node_modules/zod/v4/locales/ru.cjs +2 -0
  455. package/node_modules/zod/v4/locales/ru.js +2 -0
  456. package/node_modules/zod/v4/locales/sk.cjs +2 -0
  457. package/node_modules/zod/v4/locales/sk.js +2 -0
  458. package/node_modules/zod/v4/locales/sl.cjs +2 -0
  459. package/node_modules/zod/v4/locales/sl.js +2 -0
  460. package/node_modules/zod/v4/locales/sv.cjs +2 -0
  461. package/node_modules/zod/v4/locales/sv.js +2 -0
  462. package/node_modules/zod/v4/locales/ta.cjs +2 -0
  463. package/node_modules/zod/v4/locales/ta.js +2 -0
  464. package/node_modules/zod/v4/locales/tg.cjs +144 -0
  465. package/node_modules/zod/v4/locales/tg.d.cts +5 -0
  466. package/node_modules/zod/v4/locales/tg.d.ts +4 -0
  467. package/node_modules/zod/v4/locales/tg.js +117 -0
  468. package/node_modules/zod/v4/locales/th.cjs +2 -0
  469. package/node_modules/zod/v4/locales/th.js +2 -0
  470. package/node_modules/zod/v4/locales/tk.cjs +2 -0
  471. package/node_modules/zod/v4/locales/tk.js +2 -0
  472. package/node_modules/zod/v4/locales/tr.cjs +2 -0
  473. package/node_modules/zod/v4/locales/tr.js +2 -0
  474. package/node_modules/zod/v4/locales/uk.cjs +2 -0
  475. package/node_modules/zod/v4/locales/uk.js +2 -0
  476. package/node_modules/zod/v4/locales/ur.cjs +2 -0
  477. package/node_modules/zod/v4/locales/ur.js +2 -0
  478. package/node_modules/zod/v4/locales/uz.cjs +2 -0
  479. package/node_modules/zod/v4/locales/uz.js +2 -0
  480. package/node_modules/zod/v4/locales/vi.cjs +2 -0
  481. package/node_modules/zod/v4/locales/vi.js +2 -0
  482. package/node_modules/zod/v4/locales/yo.cjs +2 -0
  483. package/node_modules/zod/v4/locales/yo.js +2 -0
  484. package/node_modules/zod/v4/locales/zh-CN.cjs +2 -0
  485. package/node_modules/zod/v4/locales/zh-CN.js +2 -0
  486. package/node_modules/zod/v4/locales/zh-TW.cjs +2 -0
  487. package/node_modules/zod/v4/locales/zh-TW.js +2 -0
  488. package/node_modules/zod/v4/mini/checks.cjs +19 -0
  489. package/node_modules/zod/v4/mini/coerce.cjs +19 -0
  490. package/node_modules/zod/v4/mini/deep-partial.cjs +19 -0
  491. package/node_modules/zod/v4/mini/external.cjs +22 -1
  492. package/node_modules/zod/v4/mini/external.d.cts +1 -1
  493. package/node_modules/zod/v4/mini/external.d.ts +1 -1
  494. package/node_modules/zod/v4/mini/external.js +1 -1
  495. package/node_modules/zod/v4/mini/in-out.cjs +19 -0
  496. package/node_modules/zod/v4/mini/index.cjs +19 -0
  497. package/node_modules/zod/v4/mini/iso.cjs +19 -0
  498. package/node_modules/zod/v4/mini/parse.cjs +19 -0
  499. package/node_modules/zod/v4/mini/schemas.cjs +44 -8
  500. package/node_modules/zod/v4/mini/schemas.d.cts +6 -1
  501. package/node_modules/zod/v4/mini/schemas.d.ts +6 -1
  502. package/node_modules/zod/v4/mini/schemas.js +21 -6
  503. package/node_modules/zod/v4-mini/index.cjs +19 -0
  504. package/openclaw.plugin.json +21 -1
  505. package/package.json +9 -6
  506. package/dist/.setup/agent-components.runtime-CEPrf2SY.mjs +0 -4
  507. package/dist/.setup/message-handler.history-CJOsN9w5.mjs +0 -28
  508. package/dist/.setup/probe.runtime-DBQ_AGPe.mjs +0 -2
  509. package/dist/.setup/provider-session.runtime-BW7QrF5C.mjs +0 -6
  510. package/dist/.setup/provider.runtime-DuhmKdDU.mjs +0 -2
  511. package/dist/.setup/security-audit.runtime-DHtYenx9.mjs +0 -2
  512. package/dist/.setup/setup-plugin-api-CINIEBLa.mjs +0 -3
  513. package/dist/.setup/system-events-B2YEEMbS.mjs +0 -34
  514. package/dist/.setup/targets-D1mAB5yO.mjs +0 -3
  515. package/dist/.setup/thread-bindings.manager-eexkKyrG.mjs +0 -678
  516. package/dist/.setup/thread-bindings.session-updates-DCQq1WZ5.mjs +0 -55
  517. /package/node_modules/typebox/build/guard/{string.d.mts → unicode/unicode_segment.d.mts} +0 -0
@@ -0,0 +1,819 @@
1
+ import { t as __exportAll } from "./rolldown-runtime-B4FMCO8f.mjs";
2
+ import { C as withDiscordRequestAuthority, mt as getChannel, nt as createChannelWebhook } from "./discord-0xJYfdDD.mjs";
3
+ import { t as isDiscordThreadChannelType } from "./channel-type-DRCrEMss.mjs";
4
+ import { t as canFallbackDiscordWebhookSend, x as resolveDiscordChannelId } from "./retry-pz_cSha2.mjs";
5
+ import { N as createDiscordRestClient } from "./send.shared-DGFkbkQR.mjs";
6
+ import { t as sendMessageDiscord } from "./send.outbound-BISKnb-a.mjs";
7
+ import { n as resolveDiscordChannelInfoSafe, t as resolveDiscordChannelIdSafe } from "./channel-access-C12aDZ0p.mjs";
8
+ import { c as sendWebhookMessageDiscord, u as createThreadDiscord } from "./send-CrfEI6Bs.mjs";
9
+ import { C as resolvePreparedThreadBindingLifecycle, D as resolveThreadBindingMaxAgeMs$1, M as toReusableWebhookKey, S as resolveBindingRecordKey, _ as refreshUnboundThreadWebhookIdentity, c as THREAD_BINDING_TOUCH_PERSIST_MIN_INTERVAL_MS, d as forgetThreadBindingToken, f as getThreadBindingToken, h as normalizeThreadBindingDurationMs, i as REUSABLE_WEBHOOKS_BY_ACCOUNT_CHANNEL, j as toBindingRecordKey, k as shouldDefaultPersist, m as normalizeTargetKind, n as MANAGERS_BY_ACCOUNT_ID, r as PERSIST_BY_ACCOUNT_ID, t as BINDINGS_BY_THREAD_ID, u as ensureBindingsLoadedAsync, v as rememberReusableWebhook, w as resolveThreadBindingIdleTimeoutMs$1, x as resolveBindingIdsForSession, y as rememberThreadBindingToken } from "./thread-bindings.state-g6v9zAym.mjs";
10
+ import { c as drainThreadBindingAccountOperations, d as runThreadBindingAccountOperation, f as runThreadBindingMutation, h as updateBindingRecordSync, l as drainThreadBindingMutations, m as snapshotThreadBindingJson, p as shouldPersistAnyBindingState, s as commitBindingRecord } from "./thread-bindings.session-updates-CshfKghV.mjs";
11
+ import { parseStrictNonNegativeInteger } from "openclaw/plugin-sdk/number-runtime";
12
+ import { normalizeAccountId } from "openclaw/plugin-sdk/routing";
13
+ import { asOptionalObjectRecord, normalizeOptionalString, normalizeOptionalStringifiedId } from "openclaw/plugin-sdk/string-coerce-runtime";
14
+ import { getRuntimeConfigSnapshot } from "openclaw/plugin-sdk/runtime-config-snapshot";
15
+ import { createSubsystemLogger, logVerbose } from "openclaw/plugin-sdk/runtime-env";
16
+ import { truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
17
+ import { SYSTEM_MARK } from "openclaw/plugin-sdk/text-chunking";
18
+ import { registerSessionBindingAdapter, resolveThreadBindingConversationIdFromBindingId, resolveThreadBindingFarewellText, resolveThreadBindingThreadName, unregisterSessionBindingAdapter } from "openclaw/plugin-sdk/conversation-runtime";
19
+ import { resolveSessionAgentIdStrict } from "openclaw/plugin-sdk/agent-scope-runtime";
20
+ //#region extensions/discord/src/monitor/thread-bindings.persona.ts
21
+ const THREAD_BINDING_PERSONA_MAX_CHARS = 80;
22
+ function normalizePersonaLabel(value) {
23
+ if (!value) return;
24
+ return value.replace(/\s+/g, " ").trim() || void 0;
25
+ }
26
+ function resolveThreadBindingPersona(params) {
27
+ const base = normalizePersonaLabel(params.label) || normalizePersonaLabel(params.agentId) || "agent";
28
+ return truncateUtf16Safe(`${SYSTEM_MARK} ${base}`, THREAD_BINDING_PERSONA_MAX_CHARS);
29
+ }
30
+ function resolveThreadBindingPersonaFromRecord(record) {
31
+ return resolveThreadBindingPersona(record);
32
+ }
33
+ //#endregion
34
+ //#region extensions/discord/src/monitor/thread-bindings.types.ts
35
+ const THREAD_BINDINGS_SWEEP_INTERVAL_MS = 12e4;
36
+ const DEFAULT_THREAD_BINDING_IDLE_TIMEOUT_MS = 864e5;
37
+ //#endregion
38
+ //#region extensions/discord/src/monitor/thread-bindings.discord-api.ts
39
+ const log = createSubsystemLogger("discord/thread-bindings");
40
+ function buildThreadTarget(threadId) {
41
+ return /^(channel:|user:)/i.test(threadId) ? threadId : `channel:${threadId}`;
42
+ }
43
+ function isThreadArchived(raw) {
44
+ if (!raw || typeof raw !== "object") return false;
45
+ const asRecord = raw;
46
+ return asRecord.archived === true || asRecord.thread_metadata?.archived === true || asRecord.threadMetadata?.archived === true;
47
+ }
48
+ function normalizeDiscordBindingChannelId(raw) {
49
+ const trimmed = normalizeOptionalString(raw) ?? "";
50
+ if (!trimmed) return null;
51
+ try {
52
+ return resolveDiscordChannelId(trimmed);
53
+ } catch {
54
+ return null;
55
+ }
56
+ }
57
+ function summarizeDiscordError(err) {
58
+ if (err instanceof Error) return err.message;
59
+ if (typeof err === "string") return err;
60
+ if (typeof err === "number" || typeof err === "boolean" || typeof err === "bigint" || typeof err === "symbol") return String(err);
61
+ return "error";
62
+ }
63
+ function extractDiscordErrorStatus(err) {
64
+ if (!err || typeof err !== "object") return;
65
+ const candidate = err;
66
+ return parseStrictNonNegativeInteger(candidate.status) ?? parseStrictNonNegativeInteger(candidate.statusCode) ?? parseStrictNonNegativeInteger(candidate.response?.status);
67
+ }
68
+ function extractDiscordErrorCode(err) {
69
+ if (!err || typeof err !== "object") return;
70
+ const candidate = err;
71
+ return parseStrictNonNegativeInteger(candidate.code) ?? parseStrictNonNegativeInteger(candidate.rawError?.code) ?? parseStrictNonNegativeInteger(candidate.body?.code) ?? parseStrictNonNegativeInteger(candidate.response?.body?.code) ?? parseStrictNonNegativeInteger(candidate.response?.data?.code);
72
+ }
73
+ function isDiscordThreadGoneError(err) {
74
+ if (extractDiscordErrorCode(err) === 10003) return true;
75
+ const status = extractDiscordErrorStatus(err);
76
+ return status === 404 || status === 403;
77
+ }
78
+ async function maybeSendBindingMessage(params) {
79
+ const assertCurrent = params.assertCurrent;
80
+ const text = params.text.trim();
81
+ if (!text) return;
82
+ const record = params.record;
83
+ const { webhookId, webhookToken } = record;
84
+ if (params.preferWebhook !== false && webhookId && webhookToken) try {
85
+ await withDiscordRequestAuthority(assertCurrent, () => {
86
+ assertCurrent?.();
87
+ return sendWebhookMessageDiscord(text, {
88
+ cfg: params.cfg,
89
+ webhookId,
90
+ webhookToken,
91
+ accountId: record.accountId,
92
+ threadId: record.threadId,
93
+ username: resolveThreadBindingPersonaFromRecord(record)
94
+ });
95
+ });
96
+ return;
97
+ } catch (err) {
98
+ const fallbackToBot = canFallbackDiscordWebhookSend(err);
99
+ log.warn("discord thread binding webhook send failed", {
100
+ error: summarizeDiscordError(err),
101
+ fallbackToBot
102
+ });
103
+ if (!fallbackToBot) return;
104
+ }
105
+ try {
106
+ await withDiscordRequestAuthority(assertCurrent, () => {
107
+ assertCurrent?.();
108
+ return sendMessageDiscord(buildThreadTarget(record.threadId), text, {
109
+ cfg: params.cfg,
110
+ accountId: record.accountId
111
+ });
112
+ });
113
+ } catch (err) {
114
+ logVerbose(`discord thread binding fallback send failed: ${summarizeDiscordError(err)}`);
115
+ }
116
+ }
117
+ async function createWebhookForChannel(params) {
118
+ const assertCreateAllowed = params.assertCreateAllowed;
119
+ try {
120
+ const rest = createDiscordRestClient({
121
+ cfg: params.cfg,
122
+ accountId: params.accountId,
123
+ token: params.token
124
+ }).rest;
125
+ const created = await withDiscordRequestAuthority(assertCreateAllowed, () => {
126
+ assertCreateAllowed?.();
127
+ return createChannelWebhook(rest, params.channelId, { body: { name: "OpenClaw Agents" } });
128
+ });
129
+ const webhookId = normalizeOptionalString(created?.id) ?? "";
130
+ const webhookToken = normalizeOptionalString(created?.token) ?? "";
131
+ if (!webhookId || !webhookToken) return {};
132
+ return {
133
+ webhookId,
134
+ webhookToken
135
+ };
136
+ } catch (err) {
137
+ logVerbose(`discord thread binding webhook create failed for ${params.channelId}: ${summarizeDiscordError(err)}`);
138
+ return {};
139
+ }
140
+ }
141
+ function findReusableWebhook(params) {
142
+ const reusableKey = toReusableWebhookKey({
143
+ accountId: params.accountId,
144
+ channelId: params.channelId
145
+ });
146
+ const cached = REUSABLE_WEBHOOKS_BY_ACCOUNT_CHANNEL.get(reusableKey);
147
+ if (cached) return {
148
+ webhookId: cached.webhookId,
149
+ webhookToken: cached.webhookToken
150
+ };
151
+ for (const record of BINDINGS_BY_THREAD_ID.values()) {
152
+ if (record.accountId !== params.accountId) continue;
153
+ if (record.channelId !== params.channelId) continue;
154
+ if (!record.webhookId || !record.webhookToken) continue;
155
+ rememberReusableWebhook(record);
156
+ return {
157
+ webhookId: record.webhookId,
158
+ webhookToken: record.webhookToken
159
+ };
160
+ }
161
+ return {};
162
+ }
163
+ async function resolveChannelIdForBinding(params) {
164
+ const explicit = normalizeDiscordBindingChannelId(params.channelId);
165
+ if (explicit) return explicit;
166
+ const lookupThreadId = normalizeDiscordBindingChannelId(params.threadId);
167
+ if (!lookupThreadId) return null;
168
+ try {
169
+ const rest = createDiscordRestClient({
170
+ cfg: params.cfg,
171
+ accountId: params.accountId,
172
+ token: params.token
173
+ }).rest;
174
+ const channel = await getChannel(rest, lookupThreadId);
175
+ const channelInfo = resolveDiscordChannelInfoSafe(channel);
176
+ const channelId = normalizeOptionalString(resolveDiscordChannelIdSafe(channel)) ?? "";
177
+ const type = channelInfo.type;
178
+ const parentId = normalizeOptionalString(channelInfo.parentId) ?? "";
179
+ if (parentId && isDiscordThreadChannelType(type)) return parentId;
180
+ return channelId || null;
181
+ } catch (err) {
182
+ logVerbose(`discord thread binding channel resolve failed for ${lookupThreadId}: ${summarizeDiscordError(err)}`);
183
+ return null;
184
+ }
185
+ }
186
+ async function createThreadForBinding(params) {
187
+ const assertCreateAllowed = params.assertCreateAllowed;
188
+ try {
189
+ const created = await createThreadDiscord(params.channelId, { name: params.threadName }, {
190
+ cfg: params.cfg,
191
+ accountId: params.accountId,
192
+ token: params.token,
193
+ ...assertCreateAllowed ? { assertCreateAllowed } : {}
194
+ });
195
+ return (normalizeOptionalString(created?.id) ?? "") || null;
196
+ } catch (err) {
197
+ logVerbose(`discord thread binding auto-thread create failed for ${params.channelId}: ${summarizeDiscordError(err)}`);
198
+ return null;
199
+ }
200
+ }
201
+ //#endregion
202
+ //#region extensions/discord/src/monitor/thread-bindings.session-adapter.ts
203
+ function toSessionBindingRecord(record, defaults) {
204
+ const bindingId = resolveBindingRecordKey({
205
+ accountId: record.accountId,
206
+ threadId: record.threadId
207
+ }) ?? `${record.accountId}:${record.threadId}`;
208
+ const lifecycle = resolvePreparedThreadBindingLifecycle({
209
+ record,
210
+ ...defaults
211
+ });
212
+ return {
213
+ bindingId,
214
+ targetSessionKey: record.targetSessionKey,
215
+ targetKind: record.targetKind === "subagent" ? "subagent" : "session",
216
+ conversation: {
217
+ channel: "discord",
218
+ accountId: record.accountId,
219
+ conversationId: record.threadId,
220
+ parentConversationId: record.channelId
221
+ },
222
+ status: "active",
223
+ boundAt: record.boundAt,
224
+ expiresAt: lifecycle.expiresAt,
225
+ metadata: {
226
+ agentId: record.agentId,
227
+ label: record.label,
228
+ webhookId: record.webhookId,
229
+ webhookToken: record.webhookToken,
230
+ boundBy: record.boundBy,
231
+ lastActivityAt: record.lastActivityAt,
232
+ idleTimeoutMs: lifecycle.idleTimeoutMs,
233
+ maxAgeMs: lifecycle.maxAgeMs,
234
+ ...record.metadata
235
+ }
236
+ };
237
+ }
238
+ function createThreadBindingSessionAdapter(params) {
239
+ const serializeBinding = (entry) => toSessionBindingRecord(entry, params.defaults);
240
+ return {
241
+ channel: "discord",
242
+ accountId: params.accountId,
243
+ capabilities: { placements: ["current", "child"] },
244
+ bind: async (input) => {
245
+ const assertCurrent = input.assertCurrent;
246
+ if (input.conversation.channel !== "discord") return null;
247
+ const targetSessionKey = input.targetSessionKey.trim();
248
+ if (!targetSessionKey) return null;
249
+ const conversationId = normalizeOptionalString(input.conversation.conversationId) ?? "";
250
+ const placement = input.placement === "child" ? "child" : "current";
251
+ const metadata = asOptionalObjectRecord(snapshotThreadBindingJson(input.metadata ? { ...input.metadata } : void 0)) ?? {};
252
+ const targetKind = input.targetKind === "subagent" ? "subagent" : "acp";
253
+ const label = normalizeOptionalString(metadata.label);
254
+ const threadName = normalizeOptionalString(metadata.threadName);
255
+ const introText = normalizeOptionalString(metadata.introText);
256
+ const boundBy = normalizeOptionalString(metadata.boundBy);
257
+ const agentId = normalizeOptionalString(metadata.agentId);
258
+ let threadId;
259
+ let channelId;
260
+ let createThread = false;
261
+ if (placement === "child") {
262
+ createThread = true;
263
+ channelId = normalizeDiscordBindingChannelId(input.conversation.parentConversationId) ?? void 0;
264
+ if (!channelId && conversationId) channelId = await resolveChannelIdForBinding({
265
+ cfg: params.resolveCurrentCfg(),
266
+ accountId: params.accountId,
267
+ token: params.resolveCurrentToken(),
268
+ threadId: conversationId
269
+ }) ?? void 0;
270
+ } else threadId = conversationId || void 0;
271
+ const bound = await params.manager.bindTarget({
272
+ threadId,
273
+ channelId,
274
+ createThread,
275
+ threadName,
276
+ targetKind,
277
+ targetSessionKey,
278
+ agentId,
279
+ label,
280
+ boundBy,
281
+ introText,
282
+ metadata,
283
+ ...assertCurrent ? { assertCurrent } : {}
284
+ });
285
+ return bound ? serializeBinding(bound) : null;
286
+ },
287
+ listBySession: (targetSessionKey) => params.manager.listBySessionKey(targetSessionKey).map(serializeBinding),
288
+ resolveByConversation: (ref) => {
289
+ if (ref.channel !== "discord") return null;
290
+ const binding = params.manager.getByThreadId(ref.conversationId);
291
+ return binding ? serializeBinding(binding) : null;
292
+ },
293
+ touch: (bindingId, at) => {
294
+ const threadId = resolveThreadBindingConversationIdFromBindingId({
295
+ accountId: params.accountId,
296
+ bindingId
297
+ });
298
+ if (threadId) params.manager.touchThreadSync({
299
+ threadId,
300
+ at,
301
+ persist: true
302
+ });
303
+ },
304
+ touchAsync: async (bindingId, at) => {
305
+ const threadId = resolveThreadBindingConversationIdFromBindingId({
306
+ accountId: params.accountId,
307
+ bindingId
308
+ });
309
+ if (!threadId) return;
310
+ await params.manager.touchThread({
311
+ threadId,
312
+ at,
313
+ persist: true
314
+ });
315
+ },
316
+ unbind: async (input) => {
317
+ if (input.targetSessionKey?.trim()) return (await params.manager.unbindBySessionKey({
318
+ targetSessionKey: input.targetSessionKey,
319
+ reason: input.reason
320
+ })).map(serializeBinding);
321
+ const threadId = resolveThreadBindingConversationIdFromBindingId({
322
+ accountId: params.accountId,
323
+ bindingId: input.bindingId
324
+ });
325
+ if (!threadId) return [];
326
+ const removed = await params.manager.unbindThread({
327
+ threadId,
328
+ reason: input.reason
329
+ });
330
+ return removed ? [serializeBinding(removed)] : [];
331
+ }
332
+ };
333
+ }
334
+ /** Disabled bindings have a live empty owner; retirement still makes that owner unavailable. */
335
+ function createNoopThreadBindingManager(accountIdRaw) {
336
+ const accountId = normalizeAccountId(accountIdRaw);
337
+ const adapter = {
338
+ channel: "discord",
339
+ accountId,
340
+ capabilities: {
341
+ bindSupported: false,
342
+ unbindSupported: false,
343
+ placements: []
344
+ },
345
+ listBySession: () => [],
346
+ resolveByConversation: () => null
347
+ };
348
+ registerSessionBindingAdapter(adapter);
349
+ return {
350
+ accountId,
351
+ isStopping: () => false,
352
+ getIdleTimeoutMs: () => DEFAULT_THREAD_BINDING_IDLE_TIMEOUT_MS,
353
+ getMaxAgeMs: () => 0,
354
+ getByThreadId: () => void 0,
355
+ getBySessionKey: () => void 0,
356
+ listBySessionKey: () => [],
357
+ listBindings: () => [],
358
+ touchThread: async () => null,
359
+ touchThreadSync: () => null,
360
+ bindTarget: async () => null,
361
+ unbindThread: async () => null,
362
+ unbindBySessionKey: async () => [],
363
+ notifyUnbound: () => {},
364
+ stop: async () => unregisterSessionBindingAdapter({
365
+ channel: "discord",
366
+ accountId,
367
+ adapter
368
+ })
369
+ };
370
+ }
371
+ //#endregion
372
+ //#region extensions/discord/src/monitor/thread-bindings.manager.ts
373
+ var thread_bindings_manager_exports = /* @__PURE__ */ __exportAll({
374
+ createThreadBindingManager: () => createThreadBindingManager,
375
+ getThreadBindingManager: () => getThreadBindingManager
376
+ });
377
+ function isDirectConversationBindingId(value) {
378
+ const trimmed = normalizeOptionalString(value);
379
+ return Boolean(trimmed && /^(user:|channel:)/i.test(trimmed));
380
+ }
381
+ async function createThreadBindingManager(input) {
382
+ const params = { ...input };
383
+ await ensureBindingsLoadedAsync();
384
+ const manager = await runThreadBindingMutation(async () => createLoadedThreadBindingManager(params));
385
+ if (manager.isStopping()) {
386
+ await manager.stop();
387
+ return await createThreadBindingManager(params);
388
+ }
389
+ return manager;
390
+ }
391
+ function createLoadedThreadBindingManager(params) {
392
+ const accountId = normalizeAccountId(params.accountId);
393
+ const existing = MANAGERS_BY_ACCOUNT_ID.get(accountId);
394
+ if (existing) {
395
+ rememberThreadBindingToken({
396
+ accountId,
397
+ token: params.token
398
+ });
399
+ return existing;
400
+ }
401
+ rememberThreadBindingToken({
402
+ accountId,
403
+ token: params.token
404
+ });
405
+ const persist = params.persist ?? shouldDefaultPersist();
406
+ PERSIST_BY_ACCOUNT_ID.set(accountId, persist);
407
+ const idleTimeoutMs = normalizeThreadBindingDurationMs(params.idleTimeoutMs, DEFAULT_THREAD_BINDING_IDLE_TIMEOUT_MS);
408
+ const maxAgeMs = normalizeThreadBindingDurationMs(params.maxAgeMs, 0);
409
+ const resolveCurrentCfg = () => getRuntimeConfigSnapshot() ?? params.cfg;
410
+ const resolveCurrentToken = () => getThreadBindingToken(accountId) ?? params.token;
411
+ const getCurrentBinding = (threadId) => MANAGERS_BY_ACCOUNT_ID.get(accountId) === manager ? manager.getByThreadId(threadId) : void 0;
412
+ let stopping = false;
413
+ let stopPromise;
414
+ let sweepPromise;
415
+ const assertManagerCurrent = () => {
416
+ if (MANAGERS_BY_ACCOUNT_ID.get(accountId) !== manager) throw new Error("Discord thread binding manager was retired");
417
+ };
418
+ const runOwnedMutation = (operation) => {
419
+ if (stopping) return Promise.reject(/* @__PURE__ */ new Error("Discord thread binding manager is stopping"));
420
+ return runThreadBindingAccountOperation([manager], async () => {
421
+ assertManagerCurrent();
422
+ return await operation();
423
+ });
424
+ };
425
+ const mutate = (operation) => runOwnedMutation(() => runThreadBindingMutation(async () => {
426
+ assertManagerCurrent();
427
+ return await operation();
428
+ }));
429
+ let sweepTimer = null;
430
+ const runSweepOnce = async () => {
431
+ const bindings = manager.listBindings();
432
+ if (bindings.length === 0) return;
433
+ let rest = null;
434
+ for (const snapshotBinding of bindings) {
435
+ const binding = getCurrentBinding(snapshotBinding.threadId);
436
+ if (!binding || stopping) continue;
437
+ const now = Date.now();
438
+ const lifecycle = resolvePreparedThreadBindingLifecycle({
439
+ record: binding,
440
+ idleTimeoutMs,
441
+ maxAgeMs
442
+ });
443
+ const { expiresAt, reason } = lifecycle;
444
+ if (expiresAt != null && reason && now >= expiresAt) {
445
+ await manager.unbindThread({
446
+ threadId: binding.threadId,
447
+ expected: binding,
448
+ reason,
449
+ sendFarewell: true,
450
+ farewellText: resolveThreadBindingFarewellText({
451
+ reason,
452
+ idleTimeoutMs: lifecycle.idleTimeoutMs,
453
+ maxAgeMs: lifecycle.maxAgeMs
454
+ })
455
+ });
456
+ continue;
457
+ }
458
+ if (isDirectConversationBindingId(binding.threadId)) continue;
459
+ if (!rest) try {
460
+ const cfg = resolveCurrentCfg();
461
+ rest = createDiscordRestClient({
462
+ cfg,
463
+ accountId,
464
+ token: resolveCurrentToken()
465
+ }).rest;
466
+ } catch {
467
+ return;
468
+ }
469
+ try {
470
+ const channel = await getChannel(rest, binding.threadId);
471
+ if (getCurrentBinding(binding.threadId) !== binding) continue;
472
+ if (!channel || typeof channel !== "object") {
473
+ logVerbose(`discord thread binding sweep probe returned invalid payload for ${binding.threadId}`);
474
+ continue;
475
+ }
476
+ if (isThreadArchived(channel)) await manager.unbindThread({
477
+ threadId: binding.threadId,
478
+ expected: binding,
479
+ reason: "thread-archived",
480
+ sendFarewell: true
481
+ });
482
+ } catch (err) {
483
+ if (getCurrentBinding(binding.threadId) !== binding) continue;
484
+ if (isDiscordThreadGoneError(err)) {
485
+ logVerbose(`discord thread binding sweep removing stale binding ${binding.threadId}: ${summarizeDiscordError(err)}`);
486
+ await manager.unbindThread({
487
+ threadId: binding.threadId,
488
+ expected: binding,
489
+ reason: "thread-delete",
490
+ sendFarewell: false
491
+ });
492
+ continue;
493
+ }
494
+ logVerbose(`discord thread binding sweep probe failed for ${binding.threadId}: ${summarizeDiscordError(err)}`);
495
+ }
496
+ }
497
+ };
498
+ const unbindThread = async (unbindParams) => {
499
+ const bindingKey = resolveBindingRecordKey({
500
+ accountId,
501
+ threadId: unbindParams.threadId
502
+ });
503
+ if (!bindingKey) return null;
504
+ const existingLocal = BINDINGS_BY_THREAD_ID.get(bindingKey);
505
+ if (!existingLocal || existingLocal.accountId !== accountId || unbindParams.expected && existingLocal !== unbindParams.expected) return null;
506
+ await commitBindingRecord({
507
+ bindingKey,
508
+ previous: existingLocal,
509
+ next: null,
510
+ persist: unbindParams.persist ?? persist,
511
+ assertCurrent: assertManagerCurrent
512
+ });
513
+ const removed = existingLocal;
514
+ manager.notifyUnbound(removed, unbindParams);
515
+ return removed;
516
+ };
517
+ const manager = {
518
+ accountId,
519
+ isStopping: () => stopping,
520
+ notifyUnbound: (removed, notification) => {
521
+ refreshUnboundThreadWebhookIdentity(removed);
522
+ if (notification.sendFarewell !== false) {
523
+ const cfg = resolveCurrentCfg();
524
+ const farewell = resolveThreadBindingFarewellText({
525
+ reason: notification.reason,
526
+ farewellText: notification.farewellText,
527
+ idleTimeoutMs: resolveThreadBindingIdleTimeoutMs$1({
528
+ record: removed,
529
+ defaultIdleTimeoutMs: idleTimeoutMs
530
+ }),
531
+ maxAgeMs: resolveThreadBindingMaxAgeMs$1({
532
+ record: removed,
533
+ defaultMaxAgeMs: maxAgeMs
534
+ })
535
+ });
536
+ if (cfg) maybeSendBindingMessage({
537
+ cfg,
538
+ record: removed,
539
+ text: farewell,
540
+ preferWebhook: false
541
+ });
542
+ }
543
+ },
544
+ getIdleTimeoutMs: () => idleTimeoutMs,
545
+ getMaxAgeMs: () => maxAgeMs,
546
+ getByThreadId: (threadId) => {
547
+ const key = resolveBindingRecordKey({
548
+ accountId,
549
+ threadId
550
+ });
551
+ if (!key) return;
552
+ const entry = BINDINGS_BY_THREAD_ID.get(key);
553
+ if (!entry || entry.accountId !== accountId) return;
554
+ return entry;
555
+ },
556
+ getBySessionKey: (targetSessionKey) => {
557
+ return manager.listBySessionKey(targetSessionKey)[0];
558
+ },
559
+ listBySessionKey: (targetSessionKey) => {
560
+ return resolveBindingIdsForSession({
561
+ targetSessionKey,
562
+ accountId
563
+ }).map((bindingKey) => BINDINGS_BY_THREAD_ID.get(bindingKey)).filter((entry) => Boolean(entry));
564
+ },
565
+ listBindings: () => [...BINDINGS_BY_THREAD_ID.values()].filter((entry) => entry.accountId === accountId),
566
+ touchThreadSync: (input) => {
567
+ assertManagerCurrent();
568
+ if (stopping) throw new Error("Discord thread binding manager is stopping");
569
+ const key = resolveBindingRecordKey({
570
+ accountId,
571
+ threadId: input.threadId
572
+ });
573
+ if (!key) return null;
574
+ const at = typeof input.at === "number" && Number.isFinite(input.at) ? Math.max(0, Math.floor(input.at)) : Date.now();
575
+ return updateBindingRecordSync({
576
+ bindingKey: key,
577
+ transform: (record) => ({
578
+ ...record,
579
+ lastActivityAt: Math.max(record.lastActivityAt || 0, at)
580
+ }),
581
+ persist: (input.persist ?? persist) && shouldPersistAnyBindingState(),
582
+ minIntervalMs: THREAD_BINDING_TOUCH_PERSIST_MIN_INTERVAL_MS
583
+ });
584
+ },
585
+ touchThread: (input) => {
586
+ const touchParams = {
587
+ ...input,
588
+ at: typeof input.at === "number" && Number.isFinite(input.at) ? Math.max(0, Math.floor(input.at)) : Date.now()
589
+ };
590
+ return mutate(async () => {
591
+ const key = resolveBindingRecordKey({
592
+ accountId,
593
+ threadId: touchParams.threadId
594
+ });
595
+ if (!key) return null;
596
+ const existingResult = BINDINGS_BY_THREAD_ID.get(key);
597
+ if (!existingResult || existingResult.accountId !== accountId) return null;
598
+ const nextRecord = {
599
+ ...existingResult,
600
+ lastActivityAt: Math.max(existingResult.lastActivityAt || 0, touchParams.at)
601
+ };
602
+ await commitBindingRecord({
603
+ bindingKey: key,
604
+ previous: existingResult,
605
+ next: nextRecord,
606
+ persist: (touchParams.persist ?? persist) && shouldPersistAnyBindingState(),
607
+ minIntervalMs: THREAD_BINDING_TOUCH_PERSIST_MIN_INTERVAL_MS,
608
+ assertCurrent: assertManagerCurrent
609
+ });
610
+ return nextRecord;
611
+ });
612
+ },
613
+ bindTarget: async (input) => {
614
+ const bindParams = {
615
+ ...input,
616
+ metadata: asOptionalObjectRecord(snapshotThreadBindingJson(input.metadata ? { ...input.metadata } : void 0))
617
+ };
618
+ return runOwnedMutation(async () => {
619
+ const assertCurrent = bindParams.assertCurrent;
620
+ assertCurrent?.();
621
+ const cfg = resolveCurrentCfg();
622
+ let threadId = normalizeOptionalStringifiedId(bindParams.threadId);
623
+ let channelId = normalizeOptionalString(bindParams.channelId) ?? "";
624
+ const directConversationBinding = isDirectConversationBindingId(threadId) || isDirectConversationBindingId(channelId);
625
+ let nativeBindingCreated = false;
626
+ const targetSessionKey = normalizeOptionalString(bindParams.targetSessionKey) ?? "";
627
+ if (!targetSessionKey) return null;
628
+ const targetKind = normalizeTargetKind(bindParams.targetKind, targetSessionKey);
629
+ let agentId = normalizeOptionalString(bindParams.agentId);
630
+ if (!threadId && bindParams.createThread) {
631
+ if (!channelId) return null;
632
+ agentId ??= resolveSessionAgentIdStrict({
633
+ config: cfg,
634
+ sessionKey: targetSessionKey
635
+ });
636
+ const threadName = resolveThreadBindingThreadName({
637
+ agentId: bindParams.agentId,
638
+ label: bindParams.label
639
+ });
640
+ threadId = await createThreadForBinding({
641
+ cfg,
642
+ accountId,
643
+ token: resolveCurrentToken(),
644
+ channelId,
645
+ threadName: normalizeOptionalString(bindParams.threadName) ?? threadName,
646
+ ...assertCurrent ? { assertCreateAllowed: assertCurrent } : {}
647
+ }) ?? void 0;
648
+ nativeBindingCreated = Boolean(threadId);
649
+ }
650
+ if (!threadId) return null;
651
+ if (!channelId && directConversationBinding) channelId = threadId;
652
+ if (!channelId) channelId = await resolveChannelIdForBinding({
653
+ cfg,
654
+ accountId,
655
+ token: resolveCurrentToken(),
656
+ threadId,
657
+ channelId: bindParams.channelId
658
+ }) ?? "";
659
+ if (!channelId) return null;
660
+ const existingValue = manager.getByThreadId(threadId);
661
+ const previous = existingValue?.targetSessionKey === targetSessionKey && existingValue.targetKind === targetKind ? existingValue : void 0;
662
+ agentId ??= normalizeOptionalString(previous?.agentId) ?? resolveSessionAgentIdStrict({
663
+ config: cfg,
664
+ sessionKey: targetSessionKey
665
+ });
666
+ let webhookId = normalizeOptionalString(bindParams.webhookId) ?? normalizeOptionalString(existingValue?.webhookId) ?? "";
667
+ let webhookToken = normalizeOptionalString(bindParams.webhookToken) ?? normalizeOptionalString(existingValue?.webhookToken) ?? "";
668
+ if (!directConversationBinding && (!webhookId || !webhookToken)) {
669
+ const cachedWebhook = findReusableWebhook({
670
+ accountId,
671
+ channelId
672
+ });
673
+ webhookId = cachedWebhook.webhookId ?? "";
674
+ webhookToken = cachedWebhook.webhookToken ?? "";
675
+ }
676
+ if (!directConversationBinding && (!webhookId || !webhookToken)) {
677
+ const createdWebhook = await createWebhookForChannel({
678
+ cfg,
679
+ accountId,
680
+ token: resolveCurrentToken(),
681
+ channelId,
682
+ ...assertCurrent ? { assertCreateAllowed: assertCurrent } : {}
683
+ });
684
+ webhookId = createdWebhook.webhookId ?? "";
685
+ webhookToken = createdWebhook.webhookToken ?? "";
686
+ nativeBindingCreated ||= Boolean(webhookId && webhookToken);
687
+ }
688
+ const now = Date.now();
689
+ const record = {
690
+ accountId,
691
+ channelId,
692
+ threadId,
693
+ targetKind,
694
+ targetSessionKey,
695
+ agentId,
696
+ label: normalizeOptionalString(bindParams.label) ?? normalizeOptionalString(previous?.label),
697
+ webhookId: webhookId || void 0,
698
+ webhookToken: webhookToken || void 0,
699
+ boundBy: normalizeOptionalString(bindParams.boundBy) ?? normalizeOptionalString(previous?.boundBy) ?? "system",
700
+ boundAt: now,
701
+ lastActivityAt: now,
702
+ idleTimeoutMs: typeof existingValue?.idleTimeoutMs === "number" ? existingValue.idleTimeoutMs : idleTimeoutMs,
703
+ maxAgeMs: typeof existingValue?.maxAgeMs === "number" ? existingValue.maxAgeMs : maxAgeMs,
704
+ metadata: {
705
+ ...previous?.metadata,
706
+ ...bindParams.metadata
707
+ }
708
+ };
709
+ if (!nativeBindingCreated) assertCurrent?.();
710
+ await runThreadBindingMutation(() => commitBindingRecord({
711
+ bindingKey: toBindingRecordKey({
712
+ accountId,
713
+ threadId
714
+ }),
715
+ previous: existingValue,
716
+ next: record,
717
+ persist,
718
+ assertCurrent: () => {
719
+ assertManagerCurrent();
720
+ if (!nativeBindingCreated) assertCurrent?.();
721
+ }
722
+ }));
723
+ const introText = bindParams.introText?.trim();
724
+ if (introText && cfg) maybeSendBindingMessage({
725
+ cfg,
726
+ record,
727
+ text: introText,
728
+ assertCurrent: () => {
729
+ assertCurrent?.();
730
+ const current = getCurrentBinding(record.threadId);
731
+ if (!current || current.targetSessionKey !== record.targetSessionKey || current.targetKind !== record.targetKind) throw new Error("Discord thread binding changed before its intro");
732
+ }
733
+ });
734
+ return record;
735
+ });
736
+ },
737
+ unbindThread: (input) => {
738
+ const unbindParams = { ...input };
739
+ return mutate(() => unbindThread(unbindParams));
740
+ },
741
+ unbindBySessionKey: (input) => {
742
+ const unbindParams = { ...input };
743
+ return mutate(async () => {
744
+ const ids = resolveBindingIdsForSession({
745
+ targetSessionKey: unbindParams.targetSessionKey,
746
+ accountId,
747
+ targetKind: unbindParams.targetKind
748
+ });
749
+ if (ids.length === 0) return [];
750
+ const removed = [];
751
+ for (const bindingKey of ids) {
752
+ const binding = BINDINGS_BY_THREAD_ID.get(bindingKey);
753
+ if (!binding) continue;
754
+ const entry = await unbindThread({
755
+ threadId: binding.threadId,
756
+ reason: unbindParams.reason,
757
+ sendFarewell: unbindParams.sendFarewell,
758
+ farewellText: unbindParams.farewellText
759
+ });
760
+ if (entry) removed.push(entry);
761
+ }
762
+ return removed;
763
+ });
764
+ },
765
+ stop: () => {
766
+ if (stopPromise) return stopPromise;
767
+ stopping = true;
768
+ if (sweepTimer) {
769
+ clearInterval(sweepTimer);
770
+ sweepTimer = null;
771
+ }
772
+ stopPromise = (async () => {
773
+ await sweepPromise;
774
+ await drainThreadBindingAccountOperations(manager);
775
+ await drainThreadBindingMutations();
776
+ if (MANAGERS_BY_ACCOUNT_ID.get(accountId) === manager) {
777
+ MANAGERS_BY_ACCOUNT_ID.delete(accountId);
778
+ forgetThreadBindingToken(accountId);
779
+ }
780
+ unregisterSessionBindingAdapter({
781
+ channel: "discord",
782
+ accountId,
783
+ adapter: sessionBindingAdapter
784
+ });
785
+ })();
786
+ return stopPromise;
787
+ }
788
+ };
789
+ if (params.enableSweeper !== false) {
790
+ sweepTimer = setInterval(() => {
791
+ if (stopping || sweepPromise) return;
792
+ sweepPromise = runSweepOnce().catch((error) => {
793
+ logVerbose(`discord thread binding sweep failed: ${String(error)}`);
794
+ }).finally(() => {
795
+ sweepPromise = void 0;
796
+ });
797
+ }, THREAD_BINDINGS_SWEEP_INTERVAL_MS);
798
+ if (!(process.env.VITEST || false)) sweepTimer.unref?.();
799
+ }
800
+ const sessionBindingAdapter = createThreadBindingSessionAdapter({
801
+ accountId,
802
+ manager,
803
+ defaults: {
804
+ idleTimeoutMs,
805
+ maxAgeMs
806
+ },
807
+ resolveCurrentCfg,
808
+ resolveCurrentToken
809
+ });
810
+ registerSessionBindingAdapter(sessionBindingAdapter);
811
+ MANAGERS_BY_ACCOUNT_ID.set(accountId, manager);
812
+ return manager;
813
+ }
814
+ function getThreadBindingManager(accountId) {
815
+ const normalized = normalizeAccountId(accountId);
816
+ return MANAGERS_BY_ACCOUNT_ID.get(normalized) ?? null;
817
+ }
818
+ //#endregion
819
+ export { isThreadArchived as a, resolveThreadBindingPersonaFromRecord as c, createNoopThreadBindingManager as i, getThreadBindingManager as n, resolveChannelIdForBinding as o, thread_bindings_manager_exports as r, resolveThreadBindingPersona as s, createThreadBindingManager as t };