@gaodefa/daocore 2026.5.25 → 2026.5.26

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 (1740) hide show
  1. package/dist/abort-By0wxKlI.js +277 -0
  2. package/dist/abort.runtime-C7zfjxBp.js +2 -0
  3. package/dist/abort.runtime.js +1 -1
  4. package/dist/account-inspect-DTeLlJz-.js +173 -0
  5. package/dist/accounts-B776XBaL.js +119 -0
  6. package/dist/accounts-CLyZILFF.js +107 -0
  7. package/dist/accounts-DiXgq14W.js +107 -0
  8. package/dist/accounts-iTlRLYN8.js +2 -0
  9. package/dist/acp/control-plane/manager.d.ts +2 -1
  10. package/dist/acp-runtime-D9YQyGax.js +26 -0
  11. package/dist/acp-spawn-CWciV70C.js +1275 -0
  12. package/dist/acp-spawn-DjaS4O_V.js +2 -0
  13. package/dist/acp-stateful-target-driver-ByvGCj_i.js +89 -0
  14. package/dist/action-kill-DXeOA6YH.js +33 -0
  15. package/dist/action-runtime-BjQnG6qb.js +469 -0
  16. package/dist/action-runtime-api-a73ODsYk.js +2 -0
  17. package/dist/action-send-B_F3xwIu.js +39 -0
  18. package/dist/action-spawn-BFiW7gZJ.js +47 -0
  19. package/dist/actions-Bi7eE2I6.js +161 -0
  20. package/dist/actions.runtime-DmtbCLld.js +5 -0
  21. package/dist/agent-BOI4AdYK.js +3 -0
  22. package/dist/agent-DQPyDWP5.js +2 -0
  23. package/dist/agent-command-ClCxEw82.js +1367 -0
  24. package/dist/agent-command-DKqx29vm.d.ts +105 -0
  25. package/dist/agent-components.runtime-C5wxy4D_.js +10 -0
  26. package/dist/agent-components.runtime.js +1 -1
  27. package/dist/agent-harness-BsBVO7nU.d.ts +146 -0
  28. package/dist/agent-harness-runtime-CkdXIMHI.js +180 -0
  29. package/dist/agent-harness-runtime-KHFO733B.d.ts +691 -0
  30. package/dist/agent-harness-task-runtime-CDtn5RjX.js +140 -0
  31. package/dist/agent-runner-execution-lXW8y0i2.js +1713 -0
  32. package/dist/agent-runner-utils-OdM9hLGt.js +266 -0
  33. package/dist/agent-runner.runtime-fZnfhCJI.js +3455 -0
  34. package/dist/agent-runner.runtime.js +1 -1
  35. package/dist/agent-runtime-Dp0RDnX1.js +229 -0
  36. package/dist/agent-via-gateway-vsBf3nqZ.js +463 -0
  37. package/dist/agents/pi-embedded-runner/tool-split.d.ts +1 -1
  38. package/dist/agents.commands.add-C94vGOFH.js +304 -0
  39. package/dist/agents.commands.delete-D-p2NL4v.js +128 -0
  40. package/dist/api-BZ2QC7WM.js +2 -0
  41. package/dist/api-BmYK5Dge.js +6 -0
  42. package/dist/api-CGdlHCIH.js +3 -0
  43. package/dist/api-CGjlsXii.js +134 -0
  44. package/dist/api-DGqp6wZo.js +2 -0
  45. package/dist/api-DKpE-zdY.js +639 -0
  46. package/dist/api-DNyivJXK.d.ts +52 -0
  47. package/dist/apply-GK4z5lYw.js +54 -0
  48. package/dist/apply-_yxsBkiR.js +41 -0
  49. package/dist/approval-handler.runtime-C7d9p3DG.js +130 -0
  50. package/dist/assistant-B-h25aRy.js +291 -0
  51. package/dist/attachment-normalize-DWZ4Nrn-.js +225 -0
  52. package/dist/attempt-execution-BY9C1EOu.js +558 -0
  53. package/dist/attempt-execution.runtime-SR7eolDa.js +3 -0
  54. package/dist/attempt-execution.runtime.js +1 -1
  55. package/dist/attempt-execution.shared-h6uYmkJz.js +38 -0
  56. package/dist/attempt.prompt-helpers-COc5m_TZ.js +475 -0
  57. package/dist/attempt.tool-run-context-CAtfgOqC.js +2094 -0
  58. package/dist/auth-BdkNYTYU.js +541 -0
  59. package/dist/banner-0TOO6XHd.js +397 -0
  60. package/dist/banner-DTHug6Ey.js +2 -0
  61. package/dist/binding-routing-BJ_A83Nl.js +113 -0
  62. package/dist/binding-targets-D5dmPh4R.js +121 -0
  63. package/dist/bot-DX1uG3P-.js +7894 -0
  64. package/dist/bot-deps-BpaYejaN.js +2 -0
  65. package/dist/bot-deps-CKFDy5y3.js +747 -0
  66. package/dist/bot-message-context.runtime-BKOeRg34.js +7 -0
  67. package/dist/bot-message-context.runtime.js +1 -1
  68. package/dist/bot-message-context.session.runtime-xgZdFv6P.js +12 -0
  69. package/dist/bot-message-context.session.runtime.js +1 -1
  70. package/dist/bot-native-commands.delivery.runtime-DDMQrRfJ.js +4 -0
  71. package/dist/bot-native-commands.delivery.runtime.js +1 -1
  72. package/dist/bot-native-commands.runtime-CVVvUz0h.js +13 -0
  73. package/dist/bot-native-commands.runtime.js +1 -1
  74. package/dist/bridge-server-37OWsDZc.js +113 -0
  75. package/dist/browser-cli-BC_6aZJV.js +2 -0
  76. package/dist/browser-cli-Dg1ipmgf.js +230 -0
  77. package/dist/browser-cli-actions-input-B0QuzzSW.js +473 -0
  78. package/dist/browser-cli-actions-observe-C246bas5.js +81 -0
  79. package/dist/browser-cli-debug-F64e_v4B.js +137 -0
  80. package/dist/browser-cli-inspect-Srn6eWjO.js +104 -0
  81. package/dist/browser-cli-manage-CaZ97-Me.js +443 -0
  82. package/dist/browser-cli-resize-CUR20fvZ.js +26 -0
  83. package/dist/browser-cli-shared-BhphnFVo.js +50 -0
  84. package/dist/browser-cli-state-CzaNXNWF.js +337 -0
  85. package/dist/browser-control-auth-DTY0Wx2B.js +2 -0
  86. package/dist/browser-profiles-BDGPPDJ7.js +2 -0
  87. package/dist/browser-runtime-aqBKI8Oi.js +384 -0
  88. package/dist/build-CG7aTzO9.js +257 -0
  89. package/dist/build-info.json +3 -3
  90. package/dist/bundled/boot-md/handler.js +2 -2
  91. package/dist/bundled/session-memory/handler.js +1 -1
  92. package/dist/bundled-channel-config-schema-vrKpzJVf.d.ts +3163 -0
  93. package/dist/call-Za47o1YZ.d.ts +43 -0
  94. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  95. package/dist/capability-cli-BhF26gVm.js +1782 -0
  96. package/dist/channel-5RHqx1Ge.d.ts +26 -0
  97. package/dist/channel-5_XS0Mss.js +508 -0
  98. package/dist/channel-7L-vyWOO.js +362 -0
  99. package/dist/channel-B07xPK0L.d.ts +114 -0
  100. package/dist/channel-B9b-GX-e.d.ts +14 -0
  101. package/dist/channel-BBWX_bA0.d.ts +7 -0
  102. package/dist/channel-BVxTyJ0I.js +376 -0
  103. package/dist/channel-BWIsr1r-.js +808 -0
  104. package/dist/channel-Ba0p4xM-.js +1134 -0
  105. package/dist/channel-Bi2nTop1.js +481 -0
  106. package/dist/channel-Bj29iFgF.js +740 -0
  107. package/dist/channel-Bl8tKAuG.d.ts +427 -0
  108. package/dist/channel-Bqy7BYGm.d.ts +28 -0
  109. package/dist/channel-BvzHMdKo.d.ts +8 -0
  110. package/dist/channel-C6G6-tH6.js +562 -0
  111. package/dist/channel-CBhuuq-_.js +2126 -0
  112. package/dist/channel-CMmVpcnl.js +867 -0
  113. package/dist/channel-COc7idAe.js +653 -0
  114. package/dist/channel-CcsuLAYt.d.ts +49 -0
  115. package/dist/channel-CjfuHhSU.js +1556 -0
  116. package/dist/channel-Cquy73C-.js +1249 -0
  117. package/dist/channel-Cu7Jxm_X.d.ts +104 -0
  118. package/dist/channel-CzvuskEn.js +955 -0
  119. package/dist/channel-D6u-243v.js +1777 -0
  120. package/dist/channel-DId5JNlc.d.ts +47 -0
  121. package/dist/channel-DR8PbP31.js +238 -0
  122. package/dist/channel-DUYRu5km.d.ts +7 -0
  123. package/dist/channel-DUZ0s98I.js +1496 -0
  124. package/dist/channel-DXelghSl.d.ts +8 -0
  125. package/dist/channel-FhfE8D-t.d.ts +6 -0
  126. package/dist/channel-PEX_yYEO.d.ts +64 -0
  127. package/dist/channel-aWqPl-K4.d.ts +106 -0
  128. package/dist/channel-actions.runtime-BzEqt_Va.js +265 -0
  129. package/dist/channel-actions.runtime.js +1 -1
  130. package/dist/channel-cSdO0kAq.d.ts +8 -0
  131. package/dist/channel-core-ClgodQav.d.ts +6 -0
  132. package/dist/channel-core-DDZnTvT6.js +5 -0
  133. package/dist/channel-entry-contract-Bzkb_oJX.d.ts +112 -0
  134. package/dist/channel-inbound-C2wLEE7Q.js +80 -0
  135. package/dist/channel-lifecycle-DCTZ2J_8.d.ts +126 -0
  136. package/dist/channel-pairing-pKisqGWj.d.ts +58 -0
  137. package/dist/channel-plugin-runtime-B8AWkA0i.js +998 -0
  138. package/dist/channel-plugin-runtime-ntEeH9SC.d.ts +7 -0
  139. package/dist/channel-runtime-CciKN6E5.js +408 -0
  140. package/dist/channel-za2kUUnL.d.ts +12 -0
  141. package/dist/channel.runtime-BQN8Bkb0.js +254 -0
  142. package/dist/channel.runtime-BXeGEvv7.js +21009 -0
  143. package/dist/channel.runtime-C40ILulM.js +1008 -0
  144. package/dist/channel.runtime-CJ2DSojv.js +733 -0
  145. package/dist/channel.runtime-CUaygROD.js +652 -0
  146. package/dist/channel.runtime-CcCbJhDb.js +88 -0
  147. package/dist/channel.runtime-DJbKu9D3.js +4 -0
  148. package/dist/channel.runtime-DgRuSo5T.js +109 -0
  149. package/dist/channel.runtime-tRXUD2p2.js +2528 -0
  150. package/dist/channel.setup-3aVku-g-.js +1098 -0
  151. package/dist/channel.setup-Cau-V9UT.d.ts +7 -0
  152. package/dist/channel.setup-DT7Z9egu.js +343 -0
  153. package/dist/channel.setup-DhlkGTJV.js +10 -0
  154. package/dist/channel.setup-P5V7jWHY.d.ts +6 -0
  155. package/dist/channel.setup-x333W0eZ.d.ts +8 -0
  156. package/dist/chat-D3LWYymW.js +2666 -0
  157. package/dist/chrome--ATU1T0X.js +1503 -0
  158. package/dist/cli/run-main.js +9 -9
  159. package/dist/cli-D8hIXnS1.js +1341 -0
  160. package/dist/cli-backend-C1JA33SE.d.ts +5 -0
  161. package/dist/cli-backend-D8WmqNqJ.d.ts +5 -0
  162. package/dist/cli-compaction-jmi3u2HG.js +347 -0
  163. package/dist/cli-daS2Mzjd.d.ts +20 -0
  164. package/dist/cli-metadata-Cy9MEdPv.js +22 -0
  165. package/dist/cli-runner-DuT8oeZF.js +540 -0
  166. package/dist/cli-runner-DvKgnkCL.js +2 -0
  167. package/dist/cli-runner.runtime-B-aD16MD.js +4 -0
  168. package/dist/cli-runner.runtime-DofcKX1U.js +3 -0
  169. package/dist/cli-runner.runtime.js +1 -1
  170. package/dist/cli-shared-BFZytJBA.d.ts +20 -0
  171. package/dist/cli-startup-metadata.json +13 -13
  172. package/dist/client-B5IcAlfB.js +650 -0
  173. package/dist/client-adapter-CXA67h2E.js +897 -0
  174. package/dist/client-factory-aY6TuKfQ.js +9 -0
  175. package/dist/command-auth-DS9XgXEG.js +135 -0
  176. package/dist/command-execution-startup-DQOLt5Sz.js +87 -0
  177. package/dist/command-handlers-DqxF-IM9.js +1609 -0
  178. package/dist/command-registry-BSVx1oOc.js +4 -0
  179. package/dist/command-registry-CsPIOiQ3.js +9 -0
  180. package/dist/command-registry-core-Bzu5ff5F.js +110 -0
  181. package/dist/command-status.runtime-MKsizBC-.js +90 -0
  182. package/dist/command-status.runtime.js +1 -1
  183. package/dist/commands-B6Y6rqal.d.ts +113 -0
  184. package/dist/commands-acp-ClJofWty.js +74 -0
  185. package/dist/commands-compact.runtime-7VqYX4tS.js +10 -0
  186. package/dist/commands-compact.runtime.js +1 -1
  187. package/dist/commands-handlers.runtime-Dfqf_Oyp.js +6154 -0
  188. package/dist/commands-handlers.runtime.js +1 -1
  189. package/dist/commands-status-CRaEj9Vf.js +16 -0
  190. package/dist/commands-status-uDaqCP2F.js +3 -0
  191. package/dist/commands-status.runtime-uDaqCP2F.js +3 -0
  192. package/dist/commands-status.runtime.js +1 -1
  193. package/dist/commands-subagents-control.runtime-BaYcGLtc.js +2 -0
  194. package/dist/commands-subagents-control.runtime-C4xMpLed.js +3 -0
  195. package/dist/commands-subagents-control.runtime.js +1 -1
  196. package/dist/commands-system-prompt-C3lzz7wW.js +162 -0
  197. package/dist/commands-system-prompt-DpiW5FkQ.js +2 -0
  198. package/dist/commands.runtime-l4fGcB5c.js +176 -0
  199. package/dist/commands.runtime.js +1 -1
  200. package/dist/commitments/runtime.js +1 -1
  201. package/dist/compact-Dq0mi-y_.js +480 -0
  202. package/dist/compact-voJdoXm-.js +1141 -0
  203. package/dist/compact.runtime-BNLPSDQQ.js +12 -0
  204. package/dist/compact.runtime.js +1 -1
  205. package/dist/completion-cli-qHUelvvd.js +315 -0
  206. package/dist/computer-use-dP3FCUtq.js +367 -0
  207. package/dist/config-BDGPPDJ7.js +2 -0
  208. package/dist/config-Dg3sgjXu.js +373 -0
  209. package/dist/config-cli-INHPnZOG.js +1633 -0
  210. package/dist/config-mutations-CAgnXnDt.js +159 -0
  211. package/dist/config-schema-BkkovNaj.d.ts +20 -0
  212. package/dist/configure-M1VU0h9O.js +3 -0
  213. package/dist/configure.commands-CM8RXyn3.js +1251 -0
  214. package/dist/configure.commands-PvOJd4nu.js +2 -0
  215. package/dist/context-engine-host-compat-D7I7Q63Z.js +288 -0
  216. package/dist/context-engine-host-compat-DGHUiQUV.js +2 -0
  217. package/dist/context-engine-lifecycle-Zsi-S6qy.js +1274 -0
  218. package/dist/contracts-testkit-Ch7UfUw6.d.ts +145 -0
  219. package/dist/control-auth-BKUTwIvH.js +114 -0
  220. package/dist/control-service-CKUzEAa0.js +145 -0
  221. package/dist/control-ui/assets/agents-CUjpwxUf.js +1008 -0
  222. package/dist/control-ui/assets/channel-config-extras-Dd4z5RQ8.js +2 -0
  223. package/dist/control-ui/assets/channels-554ojNKp.js +367 -0
  224. package/dist/control-ui/assets/cron-BAd2PXq5.js +1013 -0
  225. package/dist/control-ui/assets/debug-BGCb3cT4.js +97 -0
  226. package/dist/control-ui/assets/index-BXico1DI.js +7370 -0
  227. package/dist/control-ui/assets/instances-EkBPy6m3.js +57 -0
  228. package/dist/control-ui/assets/logs-zcOeZekZ.js +74 -0
  229. package/dist/control-ui/assets/nodes-BymRwDa6.js +436 -0
  230. package/dist/control-ui/assets/sessions-C_oSuy7x.js +399 -0
  231. package/dist/control-ui/assets/skills-BVjEetcV.js +314 -0
  232. package/dist/control-ui/assets/skills-shared-weS2ZYM5.js +11 -0
  233. package/dist/control-ui/index.html +1 -1
  234. package/dist/control-ui/sw.js +1 -1
  235. package/dist/conversation-binding-runtime-rXAYUZyM.js +4 -0
  236. package/dist/conversation-runtime-CV0pSg81.js +31 -0
  237. package/dist/core-BV0irASW.js +282 -0
  238. package/dist/core-DIjsbXou.d.ts +224 -0
  239. package/dist/core-api-CyhjZVzn.js +5 -0
  240. package/dist/core-api-YdHGjff8.js +2 -0
  241. package/dist/crestodian/crestodian.js +1 -1
  242. package/dist/crestodian/rescue-message.js +1 -1
  243. package/dist/crestodian-n5FVHIW5.js +55 -0
  244. package/dist/daocore-runtime-DhfJoXrT.d.ts +151 -0
  245. package/dist/daocore-tools-CXDZ1Xhe.js +11727 -0
  246. package/dist/dashboard-CeQV6L1K.js +263 -0
  247. package/dist/delivery-D7LfafSk.js +1002 -0
  248. package/dist/dev-BSY4rs1s.js +97 -0
  249. package/dist/dialogue-DWFnjTiN.js +37 -0
  250. package/dist/dir-fetch-tool-BnlEyfZh.js +565 -0
  251. package/dist/dir-list-tool-Blhg_vTH.js +100 -0
  252. package/dist/direct-dm-DJPIaf5J.js +64 -0
  253. package/dist/directive-handling.fast-lane-DGV6PZYZ.js +68 -0
  254. package/dist/directive-handling.impl-CTDwclQa.js +818 -0
  255. package/dist/directive-handling.impl-_zI0_GsT.js +2 -0
  256. package/dist/directive-handling.model-selection-C8lG4FHQ.js +122 -0
  257. package/dist/directive-handling.persist.runtime-CmLb1evR.js +263 -0
  258. package/dist/directive-handling.persist.runtime.js +1 -1
  259. package/dist/dispatch-DvZRbIrc.js +1640 -0
  260. package/dist/dispatch-acp-transcript.runtime-PehNIsnR.js +40 -0
  261. package/dist/dispatch-acp-transcript.runtime.js +1 -1
  262. package/dist/dispatch-acp.runtime-Dg8ft-Ve.js +18 -0
  263. package/dist/dispatch-acp.runtime.js +1 -1
  264. package/dist/doctor-DJFM3lrT.js +6 -0
  265. package/dist/doctor-_ob4EiVf.js +2 -0
  266. package/dist/doctor-config-flow-D6iEk-en.js +1741 -0
  267. package/dist/doctor-core-checks-CCfWWL1-.js +573 -0
  268. package/dist/doctor-core-checks-CqkHUVcZ.js +2 -0
  269. package/dist/doctor-health-CrNPft4G.js +65 -0
  270. package/dist/doctor-health-contributions-Bwu5M_GQ.js +696 -0
  271. package/dist/doctor-lint-B2Wb_jEn.js +94 -0
  272. package/dist/doctor-prompter-cXq7RExi.js +58 -0
  273. package/dist/doctor-state-integrity-DfYyVFbQ.js +1231 -0
  274. package/dist/dynamic-tools-CbHsYkuk.js +486 -0
  275. package/dist/embedded-backend-IYuqoxzv.js +579 -0
  276. package/dist/embedded-gateway-stub.runtime-BjJ_93Pp.js +12 -0
  277. package/dist/embedded-gateway-stub.runtime.js +1 -1
  278. package/dist/embedding-provider-B50jxKn8.d.ts +65 -0
  279. package/dist/embedding-provider-DOktf4gm.d.ts +21 -0
  280. package/dist/embedding-provider-DZOjws8e.d.ts +16 -0
  281. package/dist/entry.d.ts +1 -1
  282. package/dist/entry.js +1 -1
  283. package/dist/exec-approvals-VjIKwFog.js +149 -0
  284. package/dist/extensionAPI.js +1 -1
  285. package/dist/extensions/active-memory/index.d.ts +1 -1
  286. package/dist/extensions/active-memory/index.js +1 -1
  287. package/dist/extensions/admin-http-rpc/index.d.ts +1 -1
  288. package/dist/extensions/admin-http-rpc/index.js +1 -1
  289. package/dist/extensions/alibaba/index.d.ts +1 -1
  290. package/dist/extensions/anthropic/api.d.ts +3 -3
  291. package/dist/extensions/anthropic/cli-backend-api.d.ts +2 -2
  292. package/dist/extensions/anthropic/cli-backend.d.ts +1 -1
  293. package/dist/extensions/anthropic/cli-migration.d.ts +1 -1
  294. package/dist/extensions/anthropic/cli-shared.d.ts +1 -1
  295. package/dist/extensions/anthropic/contract-api.d.ts +1 -1
  296. package/dist/extensions/anthropic/index.d.ts +1 -1
  297. package/dist/extensions/anthropic/provider-contract-api.d.ts +1 -1
  298. package/dist/extensions/anthropic/provider-discovery.d.ts +1 -1
  299. package/dist/extensions/anthropic/provider-policy-api.d.ts +1 -1
  300. package/dist/extensions/anthropic/register.runtime.d.ts +1 -1
  301. package/dist/extensions/anthropic/replay-policy.d.ts +1 -1
  302. package/dist/extensions/anthropic/setup-api.d.ts +1 -1
  303. package/dist/extensions/anthropic/stream-wrappers.d.ts +1 -1
  304. package/dist/extensions/anthropic/test-api.d.ts +2 -2
  305. package/dist/extensions/arcee/index.d.ts +1 -1
  306. package/dist/extensions/azure-speech/index.d.ts +1 -1
  307. package/dist/extensions/azure-speech/speech-provider.d.ts +1 -1
  308. package/dist/extensions/bonjour/index.d.ts +1 -1
  309. package/dist/extensions/browser/browser-bridge.js +1 -1
  310. package/dist/extensions/browser/browser-config.js +4 -4
  311. package/dist/extensions/browser/browser-control-auth.js +2 -2
  312. package/dist/extensions/browser/browser-doctor.js +2 -2
  313. package/dist/extensions/browser/browser-maintenance.js +1 -1
  314. package/dist/extensions/browser/browser-profiles.js +2 -2
  315. package/dist/extensions/browser/browser-runtime-api.js +11 -11
  316. package/dist/extensions/browser/cli-metadata.d.ts +1 -1
  317. package/dist/extensions/browser/cli-metadata.js +1 -1
  318. package/dist/extensions/browser/index.d.ts +1 -1
  319. package/dist/extensions/browser/index.js +1 -1
  320. package/dist/extensions/browser/plugin-registration.d.ts +1 -1
  321. package/dist/extensions/browser/plugin-registration.js +1 -1
  322. package/dist/extensions/browser/register.runtime.d.ts +2 -2
  323. package/dist/extensions/browser/register.runtime.js +4 -4
  324. package/dist/extensions/browser/runtime-api.d.ts +3 -3
  325. package/dist/extensions/browser/runtime-api.js +13 -13
  326. package/dist/extensions/browser/setup-api.d.ts +1 -1
  327. package/dist/extensions/byteplus/index.d.ts +1 -1
  328. package/dist/extensions/byteplus/provider-discovery.d.ts +1 -1
  329. package/dist/extensions/canvas/cli-metadata.d.ts +1 -1
  330. package/dist/extensions/canvas/index.d.ts +1 -1
  331. package/dist/extensions/canvas/index.js +1 -1
  332. package/dist/extensions/canvas/runtime-api.d.ts +2 -2
  333. package/dist/extensions/canvas/setup-api.d.ts +1 -1
  334. package/dist/extensions/cerebras/index.d.ts +1 -1
  335. package/dist/extensions/chutes/index.d.ts +1 -1
  336. package/dist/extensions/clickclack/api.d.ts +2 -2
  337. package/dist/extensions/clickclack/api.js +2 -2
  338. package/dist/extensions/clickclack/channel-plugin-api.d.ts +1 -1
  339. package/dist/extensions/clickclack/channel-plugin-api.js +1 -1
  340. package/dist/extensions/clickclack/index.d.ts +2 -2
  341. package/dist/extensions/clickclack/runtime-api.d.ts +2 -2
  342. package/dist/extensions/clickclack/runtime-api.js +2 -2
  343. package/dist/extensions/cloudflare-ai-gateway/index.d.ts +1 -1
  344. package/dist/extensions/cloudflare-ai-gateway/stream-wrappers.d.ts +1 -1
  345. package/dist/extensions/comfy/index.d.ts +1 -1
  346. package/dist/extensions/copilot-proxy/index.d.ts +1 -1
  347. package/dist/extensions/copilot-proxy/runtime-api.d.ts +2 -2
  348. package/dist/extensions/deepgram/index.d.ts +1 -1
  349. package/dist/extensions/deepgram/realtime-transcription-provider.d.ts +1 -1
  350. package/dist/extensions/deepgram/test-api.d.ts +1 -1
  351. package/dist/extensions/deepinfra/api.d.ts +2 -2
  352. package/dist/extensions/deepinfra/embedding-provider.d.ts +1 -1
  353. package/dist/extensions/deepinfra/index.d.ts +1 -1
  354. package/dist/extensions/deepinfra/memory-embedding-adapter.d.ts +1 -1
  355. package/dist/extensions/deepinfra/speech-provider.d.ts +1 -1
  356. package/dist/extensions/deepseek/api.d.ts +1 -1
  357. package/dist/extensions/deepseek/index.d.ts +1 -1
  358. package/dist/extensions/deepseek/provider-discovery.d.ts +1 -1
  359. package/dist/extensions/deepseek/provider-policy-api.d.ts +1 -1
  360. package/dist/extensions/deepseek/stream.d.ts +1 -1
  361. package/dist/extensions/deepseek/thinking.d.ts +1 -1
  362. package/dist/extensions/device-pair/api.d.ts +3 -3
  363. package/dist/extensions/device-pair/api.js +1 -1
  364. package/dist/extensions/device-pair/index.d.ts +1 -1
  365. package/dist/extensions/device-pair/notify.d.ts +1 -1
  366. package/dist/extensions/device-pair/pair-command-approve.js +1 -1
  367. package/dist/extensions/document-extract/index.d.ts +1 -1
  368. package/dist/extensions/duckduckgo/index.d.ts +1 -1
  369. package/dist/extensions/elevenlabs/index.d.ts +1 -1
  370. package/dist/extensions/elevenlabs/realtime-transcription-provider.d.ts +1 -1
  371. package/dist/extensions/elevenlabs/setup-api.d.ts +1 -1
  372. package/dist/extensions/elevenlabs/speech-provider.d.ts +1 -1
  373. package/dist/extensions/elevenlabs/test-api.d.ts +2 -2
  374. package/dist/extensions/exa/index.d.ts +1 -1
  375. package/dist/extensions/fal/index.d.ts +1 -1
  376. package/dist/extensions/fal/provider-contract-api.d.ts +1 -1
  377. package/dist/extensions/fal/provider-registration.d.ts +1 -1
  378. package/dist/extensions/file-transfer/index.d.ts +1 -1
  379. package/dist/extensions/file-transfer/index.js +4 -4
  380. package/dist/extensions/firecrawl/index.d.ts +1 -1
  381. package/dist/extensions/fireworks/index.d.ts +1 -1
  382. package/dist/extensions/fireworks/provider-policy-api.d.ts +1 -1
  383. package/dist/extensions/fireworks/stream.d.ts +1 -1
  384. package/dist/extensions/fireworks/thinking-policy.d.ts +1 -1
  385. package/dist/extensions/github-copilot/embeddings.d.ts +1 -1
  386. package/dist/extensions/github-copilot/index.d.ts +1 -1
  387. package/dist/extensions/github-copilot/models.d.ts +1 -1
  388. package/dist/extensions/github-copilot/register.runtime.d.ts +2 -2
  389. package/dist/extensions/github-copilot/stream.d.ts +1 -1
  390. package/dist/extensions/google/api.d.ts +5 -5
  391. package/dist/extensions/google/cli-backend.d.ts +1 -1
  392. package/dist/extensions/google/embedding-batch.d.ts +1 -1
  393. package/dist/extensions/google/embedding-provider.d.ts +1 -1
  394. package/dist/extensions/google/gemini-cli-provider.d.ts +1 -1
  395. package/dist/extensions/google/index.d.ts +1 -1
  396. package/dist/extensions/google/memory-embedding-adapter.d.ts +1 -1
  397. package/dist/extensions/google/provider-contract-api.d.ts +1 -1
  398. package/dist/extensions/google/provider-hooks.d.ts +2 -2
  399. package/dist/extensions/google/provider-models.d.ts +1 -1
  400. package/dist/extensions/google/provider-policy-api.d.ts +1 -1
  401. package/dist/extensions/google/provider-policy.d.ts +1 -1
  402. package/dist/extensions/google/provider-registration.d.ts +1 -1
  403. package/dist/extensions/google/realtime-voice-provider.d.ts +1 -1
  404. package/dist/extensions/google/runtime-api.d.ts +3 -3
  405. package/dist/extensions/google/setup-api.d.ts +1 -1
  406. package/dist/extensions/google/speech-provider.d.ts +1 -1
  407. package/dist/extensions/google/test-api.d.ts +2 -2
  408. package/dist/extensions/google/thinking-api.d.ts +1 -1
  409. package/dist/extensions/google/thinking.d.ts +1 -1
  410. package/dist/extensions/google/transport-stream.d.ts +1 -1
  411. package/dist/extensions/gradium/index.d.ts +1 -1
  412. package/dist/extensions/gradium/speech-provider.d.ts +1 -1
  413. package/dist/extensions/groq/index.d.ts +1 -1
  414. package/dist/extensions/huggingface/index.d.ts +1 -1
  415. package/dist/extensions/image-generation-core/api.d.ts +4 -4
  416. package/dist/extensions/image-generation-core/runtime-api.d.ts +1 -1
  417. package/dist/extensions/imessage/api.d.ts +2 -2
  418. package/dist/extensions/imessage/api.js +2 -2
  419. package/dist/extensions/imessage/channel-plugin-api.d.ts +1 -1
  420. package/dist/extensions/imessage/channel-plugin-api.js +1 -1
  421. package/dist/extensions/imessage/index.d.ts +2 -2
  422. package/dist/extensions/imessage/message-tool-api.d.ts +1 -1
  423. package/dist/extensions/imessage/runtime-api.d.ts +4 -4
  424. package/dist/extensions/imessage/runtime-api.js +3 -3
  425. package/dist/extensions/imessage/setup-entry.d.ts +2 -2
  426. package/dist/extensions/imessage/test-api.d.ts +1 -1
  427. package/dist/extensions/inworld/index.d.ts +1 -1
  428. package/dist/extensions/inworld/speech-provider.d.ts +1 -1
  429. package/dist/extensions/irc/api.d.ts +1 -1
  430. package/dist/extensions/irc/api.js +2 -2
  431. package/dist/extensions/irc/channel-plugin-api.d.ts +1 -1
  432. package/dist/extensions/irc/channel-plugin-api.js +1 -1
  433. package/dist/extensions/irc/index.d.ts +2 -2
  434. package/dist/extensions/irc/setup-entry.d.ts +2 -2
  435. package/dist/extensions/kilocode/index.d.ts +1 -1
  436. package/dist/extensions/kimi-coding/index.d.ts +1 -1
  437. package/dist/extensions/kimi-coding/stream.d.ts +1 -1
  438. package/dist/extensions/litellm/index.d.ts +1 -1
  439. package/dist/extensions/llm-task/api.d.ts +2 -2
  440. package/dist/extensions/llm-task/index.d.ts +1 -1
  441. package/dist/extensions/llm-task/index.js +1 -1
  442. package/dist/extensions/lmstudio/api.d.ts +1 -1
  443. package/dist/extensions/lmstudio/index.d.ts +1 -1
  444. package/dist/extensions/lmstudio/memory-embedding-adapter.d.ts +1 -1
  445. package/dist/extensions/mattermost/api.js +1 -1
  446. package/dist/extensions/mattermost/channel-plugin-api.d.ts +2 -2
  447. package/dist/extensions/mattermost/channel-plugin-api.js +1 -1
  448. package/dist/extensions/mattermost/channel-plugin-runtime.d.ts +1 -1
  449. package/dist/extensions/mattermost/channel-plugin-runtime.js +1 -1
  450. package/dist/extensions/mattermost/index.d.ts +2 -2
  451. package/dist/extensions/mattermost/policy-api.js +1 -1
  452. package/dist/extensions/mattermost/runtime-api.d.ts +9 -9
  453. package/dist/extensions/mattermost/runtime-api.js +2 -2
  454. package/dist/extensions/mattermost/setup-entry.d.ts +2 -2
  455. package/dist/extensions/mattermost/slash-route-api.d.ts +1 -1
  456. package/dist/extensions/mattermost/slash-route-api.js +1 -1
  457. package/dist/extensions/memory-core/api.d.ts +1 -1
  458. package/dist/extensions/memory-core/cli-metadata.d.ts +1 -1
  459. package/dist/extensions/memory-core/cli-metadata.js +1 -1
  460. package/dist/extensions/memory-core/index.d.ts +1 -1
  461. package/dist/extensions/memory-core/manager-runtime.d.ts +1 -1
  462. package/dist/extensions/memory-core/runtime-api.d.ts +2 -2
  463. package/dist/extensions/memory-wiki/api.d.ts +3 -3
  464. package/dist/extensions/memory-wiki/cli-metadata.d.ts +1 -1
  465. package/dist/extensions/memory-wiki/index.d.ts +1 -1
  466. package/dist/extensions/memory-wiki/setup-api.d.ts +1 -1
  467. package/dist/extensions/microsoft/index.d.ts +1 -1
  468. package/dist/extensions/microsoft/speech-provider.d.ts +1 -1
  469. package/dist/extensions/microsoft/test-api.d.ts +1 -1
  470. package/dist/extensions/microsoft-foundry/auth.d.ts +1 -1
  471. package/dist/extensions/microsoft-foundry/cli.d.ts +1 -1
  472. package/dist/extensions/microsoft-foundry/index.d.ts +1 -1
  473. package/dist/extensions/microsoft-foundry/onboard.d.ts +3 -3
  474. package/dist/extensions/microsoft-foundry/provider.d.ts +1 -1
  475. package/dist/extensions/microsoft-foundry/runtime.d.ts +1 -1
  476. package/dist/extensions/microsoft-foundry/shared-runtime.d.ts +1 -1
  477. package/dist/extensions/microsoft-foundry/shared.d.ts +1 -1
  478. package/dist/extensions/migrate-claude/apply.d.ts +1 -1
  479. package/dist/extensions/migrate-claude/apply.js +1 -1
  480. package/dist/extensions/migrate-claude/config.d.ts +1 -1
  481. package/dist/extensions/migrate-claude/helpers.d.ts +1 -1
  482. package/dist/extensions/migrate-claude/index.d.ts +1 -1
  483. package/dist/extensions/migrate-claude/index.js +1 -1
  484. package/dist/extensions/migrate-claude/memory.d.ts +2 -2
  485. package/dist/extensions/migrate-claude/plan.d.ts +1 -1
  486. package/dist/extensions/migrate-claude/plan.js +1 -1
  487. package/dist/extensions/migrate-claude/provider.d.ts +1 -1
  488. package/dist/extensions/migrate-claude/provider.js +1 -1
  489. package/dist/extensions/migrate-claude/skills.d.ts +2 -2
  490. package/dist/extensions/migrate-claude/targets.d.ts +1 -1
  491. package/dist/extensions/migrate-claude/targets.js +1 -1
  492. package/dist/extensions/migrate-hermes/apply.d.ts +1 -1
  493. package/dist/extensions/migrate-hermes/apply.js +1 -1
  494. package/dist/extensions/migrate-hermes/config.d.ts +1 -1
  495. package/dist/extensions/migrate-hermes/helpers.d.ts +1 -1
  496. package/dist/extensions/migrate-hermes/index.d.ts +1 -1
  497. package/dist/extensions/migrate-hermes/index.js +1 -1
  498. package/dist/extensions/migrate-hermes/items.d.ts +1 -1
  499. package/dist/extensions/migrate-hermes/model.d.ts +1 -1
  500. package/dist/extensions/migrate-hermes/model.js +1 -1
  501. package/dist/extensions/migrate-hermes/plan.d.ts +1 -1
  502. package/dist/extensions/migrate-hermes/plan.js +1 -1
  503. package/dist/extensions/migrate-hermes/provider.d.ts +1 -1
  504. package/dist/extensions/migrate-hermes/provider.js +1 -1
  505. package/dist/extensions/migrate-hermes/secrets.d.ts +2 -2
  506. package/dist/extensions/migrate-hermes/secrets.js +1 -1
  507. package/dist/extensions/migrate-hermes/skills.d.ts +2 -2
  508. package/dist/extensions/migrate-hermes/targets.d.ts +1 -1
  509. package/dist/extensions/migrate-hermes/targets.js +1 -1
  510. package/dist/extensions/minimax/index.d.ts +1 -1
  511. package/dist/extensions/minimax/provider-contract-api.d.ts +1 -1
  512. package/dist/extensions/minimax/provider-registration.d.ts +1 -1
  513. package/dist/extensions/minimax/speech-provider.d.ts +1 -1
  514. package/dist/extensions/mistral/embedding-provider.d.ts +1 -1
  515. package/dist/extensions/mistral/index.d.ts +1 -1
  516. package/dist/extensions/mistral/memory-embedding-adapter.d.ts +1 -1
  517. package/dist/extensions/mistral/realtime-transcription-provider.d.ts +1 -1
  518. package/dist/extensions/mistral/test-api.d.ts +1 -1
  519. package/dist/extensions/moonshot/index.d.ts +1 -1
  520. package/dist/extensions/moonshot/provider-contract-api.d.ts +1 -1
  521. package/dist/extensions/moonshot/provider-discovery.d.ts +1 -1
  522. package/dist/extensions/nvidia/index.d.ts +1 -1
  523. package/dist/extensions/oc-path/cli-metadata.d.ts +1 -1
  524. package/dist/extensions/oc-path/cli-registration.d.ts +1 -1
  525. package/dist/extensions/oc-path/index.d.ts +1 -1
  526. package/dist/extensions/ollama/api.d.ts +1 -1
  527. package/dist/extensions/ollama/index.d.ts +1 -1
  528. package/dist/extensions/ollama/provider-discovery.d.ts +1 -1
  529. package/dist/extensions/ollama/provider-policy-api.d.ts +1 -1
  530. package/dist/extensions/ollama/runtime-api.d.ts +1 -1
  531. package/dist/extensions/open-prose/index.d.ts +1 -1
  532. package/dist/extensions/open-prose/runtime-api.d.ts +2 -2
  533. package/dist/extensions/openai/api.d.ts +4 -4
  534. package/dist/extensions/openai/embedding-batch.d.ts +1 -1
  535. package/dist/extensions/openai/embedding-provider.d.ts +1 -1
  536. package/dist/extensions/openai/index.d.ts +1 -1
  537. package/dist/extensions/openai/memory-embedding-adapter.d.ts +1 -1
  538. package/dist/extensions/openai/openai-codex-oauth.runtime.d.ts +1 -1
  539. package/dist/extensions/openai/openai-codex-provider.d.ts +1 -1
  540. package/dist/extensions/openai/openai-provider.d.ts +1 -1
  541. package/dist/extensions/openai/prompt-overlay.d.ts +1 -1
  542. package/dist/extensions/openai/provider-contract-api.d.ts +1 -1
  543. package/dist/extensions/openai/provider-policy-api.d.ts +1 -1
  544. package/dist/extensions/openai/realtime-transcription-provider.d.ts +1 -1
  545. package/dist/extensions/openai/realtime-voice-provider.d.ts +1 -1
  546. package/dist/extensions/openai/register.runtime.d.ts +6 -6
  547. package/dist/extensions/openai/replay-policy.d.ts +1 -1
  548. package/dist/extensions/openai/setup-api.d.ts +1 -1
  549. package/dist/extensions/openai/shared.d.ts +3 -3
  550. package/dist/extensions/openai/speech-provider.d.ts +1 -1
  551. package/dist/extensions/openai/test-api.d.ts +3 -3
  552. package/dist/extensions/openai/thinking-policy.d.ts +1 -1
  553. package/dist/extensions/openai/transport-policy.d.ts +1 -1
  554. package/dist/extensions/opencode/index.d.ts +1 -1
  555. package/dist/extensions/opencode/provider-policy-api.d.ts +1 -1
  556. package/dist/extensions/opencode-go/index.d.ts +1 -1
  557. package/dist/extensions/opencode-go/provider-catalog.d.ts +1 -1
  558. package/dist/extensions/opencode-go/stream.d.ts +1 -1
  559. package/dist/extensions/openrouter/api.d.ts +1 -1
  560. package/dist/extensions/openrouter/index.d.ts +1 -1
  561. package/dist/extensions/openrouter/provider-contract-api.d.ts +1 -1
  562. package/dist/extensions/openrouter/provider-policy-api.d.ts +1 -1
  563. package/dist/extensions/openrouter/speech-provider.d.ts +1 -1
  564. package/dist/extensions/openrouter/stream.d.ts +1 -1
  565. package/dist/extensions/openrouter/test-api.d.ts +1 -1
  566. package/dist/extensions/openrouter/thinking-policy.d.ts +1 -1
  567. package/dist/extensions/openrouter/video-generation-provider.d.ts +1 -1
  568. package/dist/extensions/openrouter/video-model-catalog.d.ts +1 -1
  569. package/dist/extensions/perplexity/index.d.ts +1 -1
  570. package/dist/extensions/phone-control/index.d.ts +1 -1
  571. package/dist/extensions/phone-control/runtime-api.d.ts +2 -2
  572. package/dist/extensions/policy/api.js +1 -1
  573. package/dist/extensions/policy/index.d.ts +1 -1
  574. package/dist/extensions/policy/index.js +2 -2
  575. package/dist/extensions/qianfan/index.d.ts +1 -1
  576. package/dist/extensions/qwen/api.d.ts +1 -1
  577. package/dist/extensions/qwen/index.d.ts +1 -1
  578. package/dist/extensions/qwen/stream.d.ts +1 -1
  579. package/dist/extensions/runway/index.d.ts +1 -1
  580. package/dist/extensions/searxng/index.d.ts +1 -1
  581. package/dist/extensions/senseaudio/index.d.ts +1 -1
  582. package/dist/extensions/sglang/index.d.ts +1 -1
  583. package/dist/extensions/signal/api.d.ts +3 -3
  584. package/dist/extensions/signal/api.js +6 -6
  585. package/dist/extensions/signal/channel-entry.d.ts +2 -2
  586. package/dist/extensions/signal/channel-plugin-api.d.ts +1 -1
  587. package/dist/extensions/signal/channel-plugin-api.js +1 -1
  588. package/dist/extensions/signal/index.d.ts +2 -2
  589. package/dist/extensions/signal/reaction-runtime-api.js +1 -1
  590. package/dist/extensions/signal/runtime-api.d.ts +7 -7
  591. package/dist/extensions/signal/runtime-api.js +7 -7
  592. package/dist/extensions/signal/setup-entry.d.ts +2 -2
  593. package/dist/extensions/skill-workshop/api.d.ts +2 -2
  594. package/dist/extensions/skill-workshop/api.js +1 -1
  595. package/dist/extensions/skill-workshop/index.d.ts +1 -1
  596. package/dist/extensions/skill-workshop/index.js +2 -2
  597. package/dist/extensions/speech-core/api.d.ts +3 -3
  598. package/dist/extensions/speech-core/runtime-api.d.ts +2 -2
  599. package/dist/extensions/stepfun/index.d.ts +1 -1
  600. package/dist/extensions/synthetic/index.d.ts +1 -1
  601. package/dist/extensions/talk-voice/api.d.ts +2 -2
  602. package/dist/extensions/talk-voice/index.d.ts +1 -1
  603. package/dist/extensions/tavily/index.d.ts +1 -1
  604. package/dist/extensions/telegram/account-inspect-api.js +1 -1
  605. package/dist/extensions/telegram/api.d.ts +4 -4
  606. package/dist/extensions/telegram/api.js +11 -11
  607. package/dist/extensions/telegram/channel-plugin-api.d.ts +2 -2
  608. package/dist/extensions/telegram/channel-plugin-api.js +2 -2
  609. package/dist/extensions/telegram/contract-api.d.ts +1 -1
  610. package/dist/extensions/telegram/contract-api.js +3 -3
  611. package/dist/extensions/telegram/index.d.ts +2 -2
  612. package/dist/extensions/telegram/runtime-api.d.ts +4 -4
  613. package/dist/extensions/telegram/runtime-api.js +7 -7
  614. package/dist/extensions/telegram/security-audit-contract-api.js +1 -1
  615. package/dist/extensions/telegram/setup-entry.d.ts +2 -2
  616. package/dist/extensions/telegram/setup-plugin-api.d.ts +1 -1
  617. package/dist/extensions/telegram/setup-plugin-api.js +1 -1
  618. package/dist/extensions/telegram/test-api.js +2 -2
  619. package/dist/extensions/tencent/index.d.ts +1 -1
  620. package/dist/extensions/tencent/provider-discovery.d.ts +1 -1
  621. package/dist/extensions/thread-ownership/api.d.ts +2 -2
  622. package/dist/extensions/thread-ownership/index.d.ts +1 -1
  623. package/dist/extensions/together/index.d.ts +1 -1
  624. package/dist/extensions/tokenjuice/index.d.ts +1 -1
  625. package/dist/extensions/tokenjuice/tool-result-middleware.d.ts +1 -1
  626. package/dist/extensions/tts-local-cli/index.d.ts +1 -1
  627. package/dist/extensions/tts-local-cli/speech-provider.d.ts +1 -1
  628. package/dist/extensions/venice/index.d.ts +1 -1
  629. package/dist/extensions/venice/stream.d.ts +1 -1
  630. package/dist/extensions/vercel-ai-gateway/index.d.ts +1 -1
  631. package/dist/extensions/vercel-ai-gateway/thinking.d.ts +1 -1
  632. package/dist/extensions/video-generation-core/api.d.ts +3 -3
  633. package/dist/extensions/video-generation-core/runtime-api.d.ts +1 -1
  634. package/dist/extensions/vllm/api.d.ts +1 -1
  635. package/dist/extensions/vllm/index.d.ts +1 -1
  636. package/dist/extensions/vllm/stream.d.ts +1 -1
  637. package/dist/extensions/volcengine/index.d.ts +1 -1
  638. package/dist/extensions/volcengine/provider-discovery.d.ts +1 -1
  639. package/dist/extensions/volcengine/speech-provider.d.ts +1 -1
  640. package/dist/extensions/voyage/embedding-batch.d.ts +1 -1
  641. package/dist/extensions/voyage/embedding-provider.d.ts +1 -1
  642. package/dist/extensions/voyage/index.d.ts +1 -1
  643. package/dist/extensions/voyage/memory-embedding-adapter.d.ts +1 -1
  644. package/dist/extensions/vydra/index.d.ts +1 -1
  645. package/dist/extensions/vydra/speech-provider.d.ts +1 -1
  646. package/dist/extensions/web-readability/index.d.ts +1 -1
  647. package/dist/extensions/webhooks/api.d.ts +2 -2
  648. package/dist/extensions/webhooks/api.js +1 -1
  649. package/dist/extensions/webhooks/index.d.ts +1 -1
  650. package/dist/extensions/webhooks/index.js +1 -1
  651. package/dist/extensions/webhooks/runtime-api.d.ts +2 -2
  652. package/dist/extensions/xai/api.d.ts +1 -1
  653. package/dist/extensions/xai/index.d.ts +1 -1
  654. package/dist/extensions/xai/index.js +4 -4
  655. package/dist/extensions/xai/provider-contract-api.d.ts +1 -1
  656. package/dist/extensions/xai/provider-discovery.d.ts +1 -1
  657. package/dist/extensions/xai/provider-models.d.ts +1 -1
  658. package/dist/extensions/xai/provider-policy-api.d.ts +1 -1
  659. package/dist/extensions/xai/realtime-transcription-provider.d.ts +1 -1
  660. package/dist/extensions/xai/realtime-transcription-provider.js +1 -1
  661. package/dist/extensions/xai/setup-api.d.ts +1 -1
  662. package/dist/extensions/xai/speech-provider.d.ts +1 -1
  663. package/dist/extensions/xai/speech-provider.js +1 -1
  664. package/dist/extensions/xai/stream.d.ts +1 -1
  665. package/dist/extensions/xai/test-api.js +1 -1
  666. package/dist/extensions/xai/tts.js +1 -1
  667. package/dist/extensions/xai/web-search.js +1 -1
  668. package/dist/extensions/xai/xai-oauth.d.ts +1 -1
  669. package/dist/extensions/xai/xai-oauth.js +1 -1
  670. package/dist/extensions/xiaomi/index.d.ts +1 -1
  671. package/dist/extensions/xiaomi/speech-provider.d.ts +1 -1
  672. package/dist/extensions/xiaomi/stream.d.ts +1 -1
  673. package/dist/extensions/xiaomi/thinking.d.ts +1 -1
  674. package/dist/extensions/zai/index.d.ts +1 -1
  675. package/dist/file-fetch-tool-smMykVXl.js +124 -0
  676. package/dist/file-write-tool-yEYLZ2hU.js +127 -0
  677. package/dist/format-DyREJP5V.js +1145 -0
  678. package/dist/gateway/protocol/index.d.ts +1 -1
  679. package/dist/gateway-cli-D4yhwJa8.js +435 -0
  680. package/dist/gateway-method-runtime-B8AOnwqD.js +21 -0
  681. package/dist/gateway-runtime-BqKz92h9.d.ts +163 -0
  682. package/dist/gemini-cli-provider-wUxyeRzT.d.ts +6 -0
  683. package/dist/get-reply-Co-_Qlr-.js +4689 -0
  684. package/dist/get-reply-from-config.runtime-BcbRKxzJ.js +2 -0
  685. package/dist/get-reply-from-config.runtime.js +1 -1
  686. package/dist/graph-users-CF7Dlee2.js +1419 -0
  687. package/dist/group-access-BTU-w5S5.js +112 -0
  688. package/dist/group-keys-B_lbVBmI.d.ts +17 -0
  689. package/dist/handle-action.guild-admin-DS29y_6h.js +288 -0
  690. package/dist/harness-d9YmZWA3.js +61 -0
  691. package/dist/health-Cov1Kryj.js +4 -0
  692. package/dist/heartbeat-runner-B2wo_xDj.js +5 -0
  693. package/dist/heartbeat-runner.runtime-DrHZD-P2.js +4 -0
  694. package/dist/heartbeat-runner.runtime.js +1 -1
  695. package/dist/help-BgDd1atJ.js +136 -0
  696. package/dist/hook-runtime-UU80d5qW.d.ts +108 -0
  697. package/dist/hooks-CgXKCJSD.js +534 -0
  698. package/dist/http-registry-CBDAGRJy.d.ts +23 -0
  699. package/dist/image-generation-runtime-BFOnMPYD.d.ts +21 -0
  700. package/dist/inbound-direct-dm-runtime-DjOHl6c_.js +2 -0
  701. package/dist/inbound-reply-dispatch-BCTiM2jm.js +148 -0
  702. package/dist/index-D7Vsu6c4.d.ts +3971 -0
  703. package/dist/index.d.ts +1 -1
  704. package/dist/index.js +1 -1
  705. package/dist/init-CreYGHpp.js +59 -0
  706. package/dist/inline-buttons-C94TOhmL.js +40 -0
  707. package/dist/interactive-dispatch-AIMj_vt7.d.ts +143 -0
  708. package/dist/interactive-dispatch-Bh_T3uZG.d.ts +56 -0
  709. package/dist/internal-events-B6D5bqsn.js +90 -0
  710. package/dist/isolated-agent-9faqxl7c.js +1118 -0
  711. package/dist/isolated-agent-CaY4uTcE.js +2 -0
  712. package/dist/lifecycle-pTz4liUn.js +571 -0
  713. package/dist/list.probe-B8pt-DOd.js +449 -0
  714. package/dist/list.status-command-Wgmt361J.js +789 -0
  715. package/dist/llm-slug-generator-Do4oXnXl.js +78 -0
  716. package/dist/llm-slug-generator.js +1 -1
  717. package/dist/loader-BFBzvUK_.d.ts +142 -0
  718. package/dist/local-dispatch.runtime-7keeuHHm.js +9 -0
  719. package/dist/local-dispatch.runtime.js +1 -1
  720. package/dist/manager-D058VQAp.d.ts +10 -0
  721. package/dist/manager-DerRaxsV.d.ts +356 -0
  722. package/dist/manager.core-DKeUsAcV.d.ts +198 -0
  723. package/dist/manager.runtime-B3nVh8Nl.js +2714 -0
  724. package/dist/manager.runtime.js +1 -1
  725. package/dist/markdown-to-line-CZLeX0SL.js +811 -0
  726. package/dist/mcp-http-LaAmzBev.js +2 -0
  727. package/dist/mcp-http-M4GjuKFd.js +555 -0
  728. package/dist/media-understanding-provider-DLA6VsQZ.js +339 -0
  729. package/dist/memory-core-host-engine-storage-MF-67Z8w.d.ts +54 -0
  730. package/dist/memory-embedding-adapter-CEwgurWU.d.ts +5 -0
  731. package/dist/message-actions-Dlv-B5yk.js +145 -0
  732. package/dist/message-handler-2HSbEoAi.js +384 -0
  733. package/dist/message-handler-XiApv_iS.js +1715 -0
  734. package/dist/message-handler.preflight-CN-g4nxs.js +1125 -0
  735. package/dist/message-handler.process-BzVq3Lq_.js +1484 -0
  736. package/dist/migration-BXmTbRk9.d.ts +45 -0
  737. package/dist/model-Ci5kQ7PA.d.ts +33 -0
  738. package/dist/model-Sqz99RFi.js +74 -0
  739. package/dist/model-selection-Bh9QtqlJ.js +272 -0
  740. package/dist/models-C_dD1FNN.js +2 -0
  741. package/dist/models-CtpB-fi2.js +104 -0
  742. package/dist/models-Cxa7r3rl.d.ts +24 -0
  743. package/dist/models-cli-I2sJE5tg.js +256 -0
  744. package/dist/monitor-B4J6Kn4-.js +60 -0
  745. package/dist/monitor-BIFxJ3Ql.js +2788 -0
  746. package/dist/monitor-BTkcXHvw.js +834 -0
  747. package/dist/monitor-BX7Encm5.js +1657 -0
  748. package/dist/monitor-CZsJ4D3J.js +4377 -0
  749. package/dist/monitor-CvKt9k7P.js +2 -0
  750. package/dist/monitor-Dy9phiVJ.js +1370 -0
  751. package/dist/monitor-auth-CjtJPc9C.js +179 -0
  752. package/dist/monitor-jQpVHEky.js +715 -0
  753. package/dist/monitor-polling.runtime-Li4-3e2G.js +883 -0
  754. package/dist/monitor-polling.runtime.js +1 -1
  755. package/dist/monitor-webhook.runtime-CQ2kN5ya.js +387 -0
  756. package/dist/monitor-webhook.runtime.js +1 -1
  757. package/dist/monitor.account-CFdazLEm.js +5233 -0
  758. package/dist/monitor.runtime-B774iFU_.js +2 -0
  759. package/dist/monitor.runtime.js +1 -1
  760. package/dist/monitor.webhook-NNrWA5P9.js +180 -0
  761. package/dist/node-cli-sessions-Ct-6bGab.js +1228 -0
  762. package/dist/onboard-DEUA1HCQ.js +733 -0
  763. package/dist/onboard-helpers-Cupkjkec.js +251 -0
  764. package/dist/onboard-helpers-D1Pvowo1.js +6 -0
  765. package/dist/onboard-remote-BN_7wNqG.js +2 -0
  766. package/dist/onboard-remote-BqYAK5dF.js +212 -0
  767. package/dist/onboard-skills-BM40qOkc.js +160 -0
  768. package/dist/onboard-skills-rSLgDOzB.js +2 -0
  769. package/dist/openai-codex-provider-Fo-TKiyf.d.ts +5 -0
  770. package/dist/openai-http-BRnxRJ_y.js +824 -0
  771. package/dist/openai-provider-BqDrspuV.d.ts +5 -0
  772. package/dist/openresponses-http-Dg3OL0qA.js +1173 -0
  773. package/dist/operations-jvr0A8cu.js +805 -0
  774. package/dist/outbound-adapter-BJej9JpO.js +543 -0
  775. package/dist/outbound-session-route-D3QVwFKr.js +45 -0
  776. package/dist/outbound.runtime-gdOoPtOh.js +2 -0
  777. package/dist/outbound.runtime.js +1 -1
  778. package/dist/pairing-store-C-WQTUHq.d.ts +87 -0
  779. package/dist/pi-embedded-CwD_xrGP.js +3796 -0
  780. package/dist/pi-embedded-DL6l8KBl.js +4 -0
  781. package/dist/pi-embedded.runtime-DyGCj24d.js +4 -0
  782. package/dist/pi-embedded.runtime.js +1 -1
  783. package/dist/pi-tools-BzbgexEG.js +2413 -0
  784. package/dist/plan-HWBV2Rhq.js +112 -0
  785. package/dist/plan-iN77JYw-.js +81 -0
  786. package/dist/plugin-BbOOGgCS.d.ts +17 -0
  787. package/dist/plugin-CbNvjum_.js +12396 -0
  788. package/dist/plugin-app-cache-key-CHpwYM0e.js +46 -0
  789. package/dist/plugin-enabled-DjbDhNRG.js +233 -0
  790. package/dist/plugin-entry-B3_M6paP.d.ts +47 -0
  791. package/dist/plugin-registration-BM_Iko3e.js +88 -0
  792. package/dist/plugin-runtime-QzTPitsy.d.ts +117 -0
  793. package/dist/plugin-sdk/.boundary-entry-shims.stamp +1 -1
  794. package/dist/plugin-sdk/acp-runtime-backend.js +1 -1
  795. package/dist/plugin-sdk/acp-runtime.js +2 -2
  796. package/dist/plugin-sdk/agent-harness-runtime.js +6 -6
  797. package/dist/plugin-sdk/agent-harness-task-runtime.js +1 -1
  798. package/dist/plugin-sdk/agent-harness.js +7 -7
  799. package/dist/plugin-sdk/agent-runtime.js +2 -2
  800. package/dist/plugin-sdk/channel-core.js +2 -2
  801. package/dist/plugin-sdk/channel-inbound.js +2 -2
  802. package/dist/plugin-sdk/channel-test-helpers.js +1 -1
  803. package/dist/plugin-sdk/command-auth.js +1 -1
  804. package/dist/plugin-sdk/command-status-runtime.js +1 -1
  805. package/dist/plugin-sdk/compat.js +1 -1
  806. package/dist/plugin-sdk/conversation-binding-runtime.js +2 -2
  807. package/dist/plugin-sdk/conversation-runtime.js +3 -3
  808. package/dist/plugin-sdk/core.js +2 -2
  809. package/dist/plugin-sdk/direct-dm.js +1 -1
  810. package/dist/plugin-sdk/gateway-method-runtime.js +1 -1
  811. package/dist/plugin-sdk/health.js +2 -2
  812. package/dist/plugin-sdk/inbound-reply-dispatch.js +1 -1
  813. package/dist/plugin-sdk/index.js +1 -1
  814. package/dist/plugin-sdk/mattermost.js +1 -1
  815. package/dist/plugin-sdk/plugin-test-contracts.js +2 -2
  816. package/dist/plugin-sdk/provider-test-contracts.js +4 -4
  817. package/dist/plugin-sdk/reply-runtime.js +4 -4
  818. package/dist/plugin-sdk/testing.js +2 -2
  819. package/dist/plugin-sdk/zalouser.js +1 -1
  820. package/dist/plugin-service-CVyMm03C.js +1229 -0
  821. package/dist/plugin-service-bHD8oLfO.d.ts +24 -0
  822. package/dist/plugins/build-smoke-entry.d.ts +2 -2
  823. package/dist/plugins/loader.d.ts +1 -1
  824. package/dist/plugins/provider-discovery.runtime.d.ts +1 -1
  825. package/dist/plugins/provider-runtime.runtime.d.ts +1 -1
  826. package/dist/plugins/runtime/index.js +4 -4
  827. package/dist/policy-B2lTxn8H.js +680 -0
  828. package/dist/policy-Bp9GYcSZ.js +138 -0
  829. package/dist/prepare.runtime-CxhQeo9l.js +732 -0
  830. package/dist/prepare.runtime.js +1 -1
  831. package/dist/preview-warnings-FVRS7Mcs.js +392 -0
  832. package/dist/probe-BRLc43oX.js +47 -0
  833. package/dist/probe-C1eD9yG7.js +2204 -0
  834. package/dist/probe-C1giMJtz.js +682 -0
  835. package/dist/probe-rIUNPFef.js +2 -0
  836. package/dist/program-DfIqBXRH.js +131 -0
  837. package/dist/prompt-overlay-Bq3sUpDV.d.ts +23 -0
  838. package/dist/provider-BCxvG42s.js +152 -0
  839. package/dist/provider-BHPMcHk-.js +32 -0
  840. package/dist/provider-CIAQ8D7q.js +32 -0
  841. package/dist/provider-api-key-auth-BsEQw2pm.d.ts +27 -0
  842. package/dist/provider-auth-result-B204hPXB.d.ts +21 -0
  843. package/dist/provider-catalog-runtime-Dcyw8skT.d.ts +23 -0
  844. package/dist/provider-catalog-shared-qfgsIQS-.d.ts +62 -0
  845. package/dist/provider-dispatcher-DyJDef6y.js +22 -0
  846. package/dist/provider-dispatcher.runtime.js +1 -1
  847. package/dist/provider-hook-runtime-NiAPyKFa.d.ts +61 -0
  848. package/dist/provider-j7cYms68.js +8735 -0
  849. package/dist/provider-model-shared-BwE02tDa.d.ts +143 -0
  850. package/dist/provider-models-hfm5XTTN.d.ts +12 -0
  851. package/dist/provider-policy-BB7uTrIp.d.ts +30 -0
  852. package/dist/provider-registration-DEjYSu9M.d.ts +6 -0
  853. package/dist/provider-registry-D5hn-VAM.d.ts +8 -0
  854. package/dist/provider-registry-DHIsMEbc.d.ts +8 -0
  855. package/dist/provider-registry-VyHjmzoh.d.ts +30 -0
  856. package/dist/provider-runtime-CdtuIOgf.d.ts +359 -0
  857. package/dist/provider-self-hosted-setup-xR0Nsu7L.d.ts +74 -0
  858. package/dist/provider-session.runtime-CmNY15Mr.js +9 -0
  859. package/dist/provider-session.runtime.js +1 -1
  860. package/dist/provider-stream-CxVko1CO.d.ts +140 -0
  861. package/dist/provider-stream-shared-BxFPKFGe.d.ts +128 -0
  862. package/dist/provider.runtime-DJO3dwrX.js +2 -0
  863. package/dist/provider.runtime.js +1 -1
  864. package/dist/providers.runtime-CJOUbS2S.d.ts +25 -0
  865. package/dist/public-surface-loader-CgBnme5n.js +114 -0
  866. package/dist/pw-ai-UeRWGzcL.js +3029 -0
  867. package/dist/pw-role-snapshot-BtlutwlO.js +333 -0
  868. package/dist/reaction-level-DWOV-qJM.js +19 -0
  869. package/dist/reaction-runtime-api-5ZiPcbGJ.js +116 -0
  870. package/dist/realtime-transcription-CZadifvk.d.ts +43 -0
  871. package/dist/realtime-transcription-provider-BF9HxM3d.d.ts +5 -0
  872. package/dist/realtime-transcription-provider-Bcj92hEI.d.ts +32 -0
  873. package/dist/realtime-transcription-provider-DKZ9iHkc.d.ts +28 -0
  874. package/dist/realtime-transcription-provider-DcsAmQEp.js +205 -0
  875. package/dist/realtime-transcription-provider-DhjVTTqb.d.ts +37 -0
  876. package/dist/realtime-voice-B2W34yTP.d.ts +333 -0
  877. package/dist/realtime-voice-provider-CgNNrGwQ.d.ts +5 -0
  878. package/dist/register-Dga1nJRL.js +2178 -0
  879. package/dist/register.agent-VIgyZLKG.js +156 -0
  880. package/dist/register.configure-C21zJ4Qb.js +16 -0
  881. package/dist/register.crestodian-Bam6mUXr.js +24 -0
  882. package/dist/register.maintenance-D9E-Hh90.js +83 -0
  883. package/dist/register.onboard-BnUcaZsb.js +113 -0
  884. package/dist/register.runtime-BdRAp4xz.js +54 -0
  885. package/dist/register.runtime-D3abILg7.d.ts +6 -0
  886. package/dist/register.setup-Bq-9IQdV.js +40 -0
  887. package/dist/register.subclis-DubBtg8Z.js +31 -0
  888. package/dist/register.subclis-H_qmmDFx.js +3 -0
  889. package/dist/register.subclis-core-fg3DalSH.js +273 -0
  890. package/dist/registry-CPtiHUu_.d.ts +91 -0
  891. package/dist/registry-types-XtFJDNYl.d.ts +392 -0
  892. package/dist/repair-sequencing-Dn0sDvBE.js +640 -0
  893. package/dist/reply-delivery-DZGfRh-W.js +196 -0
  894. package/dist/reply-runtime-BdCPL-OF.js +11 -0
  895. package/dist/reply-runtime-DuaOZ9MH.d.ts +34 -0
  896. package/dist/reply.runtime-BcbRKxzJ.js +2 -0
  897. package/dist/reply.runtime.js +1 -1
  898. package/dist/request-Ca681Kt1.js +54 -0
  899. package/dist/resolve-allowlist-DWjCzDq1.js +220 -0
  900. package/dist/result-fallback-classifier-BWIh0wzc.js +79 -0
  901. package/dist/root-help-8a3TWleF.js +43 -0
  902. package/dist/route-BsWREv6-.js +469 -0
  903. package/dist/route-resolution-D8FyF30I.js +274 -0
  904. package/dist/routes-BxkaJuyM.js +3602 -0
  905. package/dist/routes-DdwFgSv9.js +2 -0
  906. package/dist/run-attempt-Ca7HP1Nd.js +7704 -0
  907. package/dist/run-command-JwrnqCIB.js +2 -0
  908. package/dist/run-command-wWvfXyIf.js +23 -0
  909. package/dist/run-embedded.runtime-0QIAc8PG.js +4 -0
  910. package/dist/run-embedded.runtime.js +1 -1
  911. package/dist/run-execution-cli.runtime-LhD-S0h_.js +4 -0
  912. package/dist/run-execution-cli.runtime.js +1 -1
  913. package/dist/run-executor.runtime.js +1 -1
  914. package/dist/run-prKMVvM2.js +1162 -0
  915. package/dist/run-subagent-registry.runtime-C07jSlV2.js +2 -0
  916. package/dist/run-subagent-registry.runtime.js +1 -1
  917. package/dist/runtime-3PDZU_1b.d.ts +17 -0
  918. package/dist/runtime-7Xhj2T8S.js +6179 -0
  919. package/dist/runtime-CXUwJU3q.js +438 -0
  920. package/dist/runtime-DeQypuDs.js +1287 -0
  921. package/dist/runtime-api-0djTIsuz.js +13 -0
  922. package/dist/runtime-api-9CEihqK3.d.ts +3151 -0
  923. package/dist/runtime-api-Bz1h0p3i.js +17 -0
  924. package/dist/runtime-api-CLcJZKu2.js +13 -0
  925. package/dist/runtime-api-Ce7axAAW.js +24 -0
  926. package/dist/runtime-api-CoAsju8a.js +4 -0
  927. package/dist/runtime-api-DEuynhDr.js +3 -0
  928. package/dist/runtime-api-oZFIOS9l.js +21 -0
  929. package/dist/runtime-api.actions-Blt2bAHw.d.ts +23 -0
  930. package/dist/runtime-api.actions-DWLRlSej.js +3 -0
  931. package/dist/runtime-api.monitor-DtXB3_sf.js +6 -0
  932. package/dist/runtime-api.send-BU586hbs.js +4 -0
  933. package/dist/runtime-api.send-BygcWA7R.d.ts +38 -0
  934. package/dist/runtime-api.threads-Djhr5AJy.js +2 -0
  935. package/dist/runtime-channel-BIgBTs_X.js +2 -0
  936. package/dist/runtime-channel-CsUTBjYU.js +150 -0
  937. package/dist/runtime-embedded-pi.runtime-Rszd_KCt.js +2 -0
  938. package/dist/runtime-embedded-pi.runtime.js +1 -1
  939. package/dist/runtime-taskflow-s80xQc2H.d.ts +435 -0
  940. package/dist/sanitize-outbound-2umQeW_U.js +127 -0
  941. package/dist/sdk-setup-tools-TiaNam05.js +8 -0
  942. package/dist/secrets-BmyFSkt-.js +113 -0
  943. package/dist/secrets-cli-DPAwFvtH.js +149 -0
  944. package/dist/security-audit-BR9FBcLD.js +122 -0
  945. package/dist/security-audit-RKut1lWG.js +118 -0
  946. package/dist/security-audit.runtime-Pe7YbS9P.js +2 -0
  947. package/dist/security-audit.runtime.js +1 -1
  948. package/dist/selection-Cqhmjpyl.js +16157 -0
  949. package/dist/selection-xFFMaq92.js +3 -0
  950. package/dist/send-BDHagrwl.js +1631 -0
  951. package/dist/send-BETlETJ5.d.ts +231 -0
  952. package/dist/send-BV_O_Ljd.js +192 -0
  953. package/dist/send-CpcmWYrM.d.ts +104 -0
  954. package/dist/send-W-DVyil6.js +2 -0
  955. package/dist/send-jUp2-szO.js +143 -0
  956. package/dist/send.components-BR_yPtKv.js +500 -0
  957. package/dist/send.components-CK7UbpRP.js +2 -0
  958. package/dist/send.runtime-DHLfdHbS.js +2 -0
  959. package/dist/send.runtime.js +1 -1
  960. package/dist/send.types-D_3tsfSL.d.ts +159 -0
  961. package/dist/server-DRcdRu6J.js +73 -0
  962. package/dist/server-Ddv-oAKv.js +24 -0
  963. package/dist/server-close.runtime.d.ts +1 -1
  964. package/dist/server-close.runtime.js +1 -1
  965. package/dist/server-context-9rW0Cvdw.js +2 -0
  966. package/dist/server-context-uRD5N8_D.js +955 -0
  967. package/dist/server-cron-BClEPtbv.js +2 -0
  968. package/dist/server-cron-CNGar45o.js +2989 -0
  969. package/dist/server-methods-CAMhJf7g.js +16494 -0
  970. package/dist/server-node-events-DW5DoAxk.js +596 -0
  971. package/dist/server-plugin-bootstrap-CqX4dDcN.js +70 -0
  972. package/dist/server-plugins-BIhs3eCz.js +432 -0
  973. package/dist/server-reload-handlers-54HSfSr7.js +714 -0
  974. package/dist/server-restart-sentinel-C47-O08k.js +747 -0
  975. package/dist/server-restart-sentinel-Cx-3Rzl0.js +2 -0
  976. package/dist/server-runtime-services-D-SWzUww.js +267 -0
  977. package/dist/server-runtime-services-D0GOFPFq.js +2 -0
  978. package/dist/server-startup-plugins-C8pzVvkb.js +113 -0
  979. package/dist/server-startup-post-attach-2xoGJJts.js +716 -0
  980. package/dist/server-ws-runtime-Dywo6GC-.js +349 -0
  981. package/dist/server.impl-xK22fZyJ.js +2586 -0
  982. package/dist/service-Ci8roOZn.js +1446 -0
  983. package/dist/session-binding-BsdbGBhb.js +219 -0
  984. package/dist/session-binding-D42jROcb.js +2 -0
  985. package/dist/session-kill-http-kU4rUj1_.js +121 -0
  986. package/dist/session-reset-service-DkCGElAA.js +625 -0
  987. package/dist/session-route-hmQSEijy.js +93 -0
  988. package/dist/session-status.runtime-Dsz-54he.js +2 -0
  989. package/dist/session-status.runtime.js +1 -1
  990. package/dist/session-subagent-reactivation.runtime-CYJIkiW8.js +2 -0
  991. package/dist/session-subagent-reactivation.runtime.js +1 -1
  992. package/dist/session-tab-registry-YfQve--K.js +521 -0
  993. package/dist/sessions-history-http-DeuZSSGj.js +430 -0
  994. package/dist/sessions.runtime-wAccC8Lk.js +2 -0
  995. package/dist/sessions.runtime.js +1 -1
  996. package/dist/setup-B8caUFIZ.js +586 -0
  997. package/dist/setup-CgHGdMpV.js +2 -0
  998. package/dist/setup-api-Uew7qBry.js +29 -0
  999. package/dist/setup-core-BP_fjsmA.js +174 -0
  1000. package/dist/setup-onboard-configure-help-fast-path-ykLp2JqU.js +64 -0
  1001. package/dist/setup-surface-BgEGrdZ3.js +320 -0
  1002. package/dist/setup-surface-BvSqsFEu.js +221 -0
  1003. package/dist/setup-surface-CHzMJ7_T.js +405 -0
  1004. package/dist/setup-surface-DYm3Xvgt.js +288 -0
  1005. package/dist/setup.finalize-BgLIjblM.js +582 -0
  1006. package/dist/setup.gateway-config-BBguRpIc.js +281 -0
  1007. package/dist/setup.migration-import-BY06brv-.js +200 -0
  1008. package/dist/setup.migration-import-Igj5NMey.js +2 -0
  1009. package/dist/shared-client-GL2KQ2Eu.js +2 -0
  1010. package/dist/shared-client-Mc7bTBoQ.js +629 -0
  1011. package/dist/shared-moi7PK0C.js +121 -0
  1012. package/dist/shared-rlOyTpAw.d.ts +115 -0
  1013. package/dist/side-question-BEHswpGw.js +683 -0
  1014. package/dist/simple-completion-runtime-CsXJkjY5.d.ts +73 -0
  1015. package/dist/skill-tool-dispatch.runtime-O5uXeees.js +143 -0
  1016. package/dist/skill-tool-dispatch.runtime.js +1 -1
  1017. package/dist/slash-state-BAYUTcHl.js +2166 -0
  1018. package/dist/speech-BAP4NgqI.d.ts +47 -0
  1019. package/dist/speech-core-DZmhKq_b.d.ts +36 -0
  1020. package/dist/speech-provider-22oDk8Tz.js +184 -0
  1021. package/dist/speech-provider-79S_bTlE.d.ts +8 -0
  1022. package/dist/speech-provider-BYJna1nq.d.ts +5 -0
  1023. package/dist/speech-provider-BvKhsuyg.d.ts +5 -0
  1024. package/dist/speech-provider-CdVIHtT6.d.ts +5 -0
  1025. package/dist/speech-provider-OiRKJFwo.d.ts +8 -0
  1026. package/dist/speech-provider-xUDd1kmD.d.ts +34 -0
  1027. package/dist/src-C8wkJgE6.js +4256 -0
  1028. package/dist/startup-context-BhLJufFU.js +313 -0
  1029. package/dist/status-C20LHDLA.js +73 -0
  1030. package/dist/status-message-CmzgS8zM.js +484 -0
  1031. package/dist/status-message.runtime-iG6qi7wn.js +6 -0
  1032. package/dist/status-message.runtime.js +1 -1
  1033. package/dist/status-subagents.runtime-D49P_RIr.js +18 -0
  1034. package/dist/status-subagents.runtime.js +1 -1
  1035. package/dist/status-text-BI7Q1z4U.js +296 -0
  1036. package/dist/status.runtime-RQes0TI5.js +2 -0
  1037. package/dist/sticker-cache-Dh4joqan.js +206 -0
  1038. package/dist/sticker-vision.runtime-5SRgpo_k.js +17 -0
  1039. package/dist/sticker-vision.runtime.js +1 -1
  1040. package/dist/stream-BrMwI7HV.d.ts +10 -0
  1041. package/dist/stream-Bx_akKgo.d.ts +16 -0
  1042. package/dist/stream-D094UIVI.d.ts +5 -0
  1043. package/dist/stream-D5DoOmTT.d.ts +19 -0
  1044. package/dist/stream-Tt9cSOCl.d.ts +120 -0
  1045. package/dist/stream-wrappers-CUkNtyZK.d.ts +21 -0
  1046. package/dist/subagent-announce-BEPlkjCS.js +354 -0
  1047. package/dist/subagent-announce-delivery-jcxPIfNG.js +958 -0
  1048. package/dist/subagent-control-DdMWVJXs.js +508 -0
  1049. package/dist/subagent-hooks-BsTVb6ur.js +2 -0
  1050. package/dist/subagent-hooks-CBlMBrss.js +2 -0
  1051. package/dist/subagent-hooks-Ch5oDUxb.js +116 -0
  1052. package/dist/subagent-hooks-DmUeAwY3.js +146 -0
  1053. package/dist/subagent-hooks-PNuPbYEl.js +2 -0
  1054. package/dist/subagent-hooks-api-BQ051dF0.js +23 -0
  1055. package/dist/subagent-hooks-api-DcVS0aJZ.js +22 -0
  1056. package/dist/subagent-hooks-api-Dlbc5Mtd.js +23 -0
  1057. package/dist/subagent-hooks-dwsegI07.js +230 -0
  1058. package/dist/subagent-orphan-recovery-Cl_y6Poi.js +352 -0
  1059. package/dist/subagent-registry-BVVgDSdq.d.ts +1 -0
  1060. package/dist/subagent-registry-BosUdBW6.js +2351 -0
  1061. package/dist/subagent-registry-Bxd6vaAO.js +3 -0
  1062. package/dist/subagent-registry-read-BVVgDSdq.d.ts +1 -0
  1063. package/dist/subagent-registry.runtime.js +1 -1
  1064. package/dist/subagent-session-cleanup-Bd6d93qi.js +525 -0
  1065. package/dist/subagent-spawn-ViO3XAR1.js +1164 -0
  1066. package/dist/target-id-Bje_v2Ax.js +107 -0
  1067. package/dist/targets-9q_q5M9n.d.ts +10 -0
  1068. package/dist/targets-C4byiOgQ.js +19 -0
  1069. package/dist/targets-J0MVE-dD.js +44 -0
  1070. package/dist/targets-ZMEvyNa8.js +19 -0
  1071. package/dist/targets-qBcfKetP.d.ts +10 -0
  1072. package/dist/task-registry-control.runtime.d.ts +1 -1
  1073. package/dist/task-registry-control.runtime.js +1 -1
  1074. package/dist/telegram/token.js +1 -1
  1075. package/dist/testing-Dk757Ggg.js +267 -0
  1076. package/dist/thinking-policy-DO6T8IfK.d.ts +5 -0
  1077. package/dist/thread-bindings-CYrmTzFY.js +232 -0
  1078. package/dist/thread-bindings-Cf7fkXxk.js +571 -0
  1079. package/dist/thread-bindings-DI6LNGbW.js +8 -0
  1080. package/dist/thread-bindings-DdmuKtVD.js +228 -0
  1081. package/dist/thread-bindings.discord-api-C01V3kFk.js +187 -0
  1082. package/dist/thread-bindings.manager--WOGVrL-.js +2 -0
  1083. package/dist/thread-bindings.manager-HzjqZNiL.js +536 -0
  1084. package/dist/thread-lifecycle-CJKTxWnQ.js +1614 -0
  1085. package/dist/token-D-FQ8AQz.js +134 -0
  1086. package/dist/tool-DTCfs0DU.js +139 -0
  1087. package/dist/tool-actions.runtime-Cb3iA3Os.js +534 -0
  1088. package/dist/tool-actions.runtime.js +1 -1
  1089. package/dist/tool-plugin-CbbLM31f.d.ts +77 -0
  1090. package/dist/tool-resolution-CbqzNutV.js +149 -0
  1091. package/dist/tool-split-bLqMPHTZ.d.ts +19 -0
  1092. package/dist/tools-effective-inventory-BsAax-ML.js +204 -0
  1093. package/dist/tools-invoke-http-DAqZxikd.js +67 -0
  1094. package/dist/tools-invoke-shared-CsVRemTL.js +200 -0
  1095. package/dist/transport-stream-DOXZsjVL.d.ts +42 -0
  1096. package/dist/tts-Ckj6MJNr.js +66 -0
  1097. package/dist/tui-CwwCXMCq.js +2 -0
  1098. package/dist/tui-DpJn3v2D.js +4709 -0
  1099. package/dist/tui-backend-DQ9wF5es.js +256 -0
  1100. package/dist/tui-cli-k3AYPBn3.js +37 -0
  1101. package/dist/types--0xYmMG9.d.ts +786 -0
  1102. package/dist/types-CMDl9l_P2.d.ts +3650 -0
  1103. package/dist/types.public-DvhPzYJi.d.ts +70 -0
  1104. package/dist/update-cli-DB5Doqld.js +3664 -0
  1105. package/dist/video-generation-runtime-CTQN-4SI.d.ts +21 -0
  1106. package/dist/video-model-catalog-CTyt4dXa.d.ts +16 -0
  1107. package/dist/vision-tools-Dp0JrLRi.js +1409 -0
  1108. package/dist/web-search-B0yvxuiq.js +62 -0
  1109. package/dist/web-search-provider.runtime-B-cNT-5J.js +2 -0
  1110. package/dist/web-search-provider.runtime-HhmIlk_Z.js +328 -0
  1111. package/dist/web-search-provider.runtime.js +1 -1
  1112. package/dist/webhook-targets-3u4hOqRl.d.ts +99 -0
  1113. package/dist/xai-oauth-cZGjnEjh.js +479 -0
  1114. package/dist/xai-user-agent-DA8le6vP.js +32 -0
  1115. package/dist/zod-schema.core-i5HaY1T4.d.ts +166 -0
  1116. package/package.json +1 -1
  1117. package/dist/abort-CvuLeqr1.js +0 -277
  1118. package/dist/abort.runtime-DNoavlKn.js +0 -2
  1119. package/dist/account-inspect-ByX21U_z.js +0 -173
  1120. package/dist/accounts-B0sjdn0w.js +0 -119
  1121. package/dist/accounts-BF_AfTED.js +0 -107
  1122. package/dist/accounts-DX1c8NKM.js +0 -107
  1123. package/dist/accounts-EA2GGTep.js +0 -2
  1124. package/dist/acp-runtime-BC8oA7xM.js +0 -26
  1125. package/dist/acp-spawn-CPYDCZ95.js +0 -2
  1126. package/dist/acp-spawn-Cqi47GCL.js +0 -1275
  1127. package/dist/acp-stateful-target-driver-CcWMRAQ2.js +0 -89
  1128. package/dist/action-kill-CZrPfOIS.js +0 -33
  1129. package/dist/action-runtime-DuhVKLRJ.js +0 -469
  1130. package/dist/action-runtime-api-BKaUWi7b.js +0 -2
  1131. package/dist/action-send-_NpIHMwj.js +0 -39
  1132. package/dist/action-spawn-Dymn4rUo.js +0 -47
  1133. package/dist/actions-Bk_WaEAa.js +0 -161
  1134. package/dist/actions.runtime-Hh7HYOlJ.js +0 -5
  1135. package/dist/agent-CQzGVmy1.js +0 -2
  1136. package/dist/agent-ClmYyW81.js +0 -3
  1137. package/dist/agent-command-D5KxwCVS.d.ts +0 -141
  1138. package/dist/agent-command-DbU2fo-p.js +0 -1367
  1139. package/dist/agent-components.runtime-BpXJmJXk.js +0 -10
  1140. package/dist/agent-harness-D8c6PLE_.d.ts +0 -146
  1141. package/dist/agent-harness-runtime-AHXS4Jj3.d.ts +0 -691
  1142. package/dist/agent-harness-runtime-TzbK9YTz.js +0 -180
  1143. package/dist/agent-harness-task-runtime-CZWJEsKk.js +0 -140
  1144. package/dist/agent-runner-execution-CmHT78Vr.js +0 -1713
  1145. package/dist/agent-runner-utils-B0i1PW18.js +0 -266
  1146. package/dist/agent-runner.runtime-B6Ah_MlB.js +0 -3455
  1147. package/dist/agent-runtime-BOMioAX6.js +0 -229
  1148. package/dist/agent-via-gateway-DfxQCPit.js +0 -463
  1149. package/dist/agents.commands.add-CszEBxoJ.js +0 -304
  1150. package/dist/agents.commands.delete-ulnJ7RH9.js +0 -128
  1151. package/dist/api-6SmEQDkK.js +0 -134
  1152. package/dist/api-B7QdoMF5.js +0 -2
  1153. package/dist/api-BBgby6ck.js +0 -639
  1154. package/dist/api-DwKV-xfM.d.ts +0 -52
  1155. package/dist/api-RfjCqA7Y.js +0 -6
  1156. package/dist/api-VDkFlOiv.js +0 -2
  1157. package/dist/api-We4xoZFr.js +0 -3
  1158. package/dist/apply-Cgtzilem.js +0 -41
  1159. package/dist/apply-Csp3U8cA.js +0 -54
  1160. package/dist/approval-handler.runtime-aQaSBbpF.js +0 -130
  1161. package/dist/assistant-UMyirSUH.js +0 -291
  1162. package/dist/attachment-normalize-BupK-_Ox.js +0 -225
  1163. package/dist/attempt-execution-oLlyFjHk.js +0 -558
  1164. package/dist/attempt-execution.runtime-Cq8RE0x_.js +0 -3
  1165. package/dist/attempt-execution.shared-DyBzUJGB.js +0 -38
  1166. package/dist/attempt.prompt-helpers-CVBP6t5J.js +0 -475
  1167. package/dist/attempt.tool-run-context-UU1BUUC9.js +0 -2094
  1168. package/dist/auth-BDaK_y-g.js +0 -541
  1169. package/dist/banner-VbID973v.js +0 -2
  1170. package/dist/banner-W77piyz6.js +0 -397
  1171. package/dist/binding-routing-DahKvjr3.js +0 -113
  1172. package/dist/binding-targets-C3mqUdUT.js +0 -121
  1173. package/dist/bot-DonUKEuy.js +0 -7894
  1174. package/dist/bot-deps-CroXwZeM.js +0 -747
  1175. package/dist/bot-deps-DKoy3x0l.js +0 -2
  1176. package/dist/bot-message-context.runtime-BI_zyqDu.js +0 -7
  1177. package/dist/bot-message-context.session.runtime-Cpy2H9Ez.js +0 -12
  1178. package/dist/bot-native-commands.delivery.runtime-CsHg3h1O.js +0 -4
  1179. package/dist/bot-native-commands.runtime-rmoBpwZY.js +0 -13
  1180. package/dist/bridge-server-BmDNWgHD.js +0 -113
  1181. package/dist/browser-cli-BQLwmLw3.js +0 -2
  1182. package/dist/browser-cli-CHHIN-of.js +0 -230
  1183. package/dist/browser-cli-actions-input-DBZ7uwag.js +0 -473
  1184. package/dist/browser-cli-actions-observe-BdH2-WTk.js +0 -81
  1185. package/dist/browser-cli-debug-C82Apbgb.js +0 -137
  1186. package/dist/browser-cli-inspect-CrO1qca7.js +0 -104
  1187. package/dist/browser-cli-manage-Dgm1IUZT.js +0 -443
  1188. package/dist/browser-cli-resize-DqgMr3DY.js +0 -26
  1189. package/dist/browser-cli-shared-BTnXMCKA.js +0 -50
  1190. package/dist/browser-cli-state-DT3bVOtg.js +0 -337
  1191. package/dist/browser-control-auth-BRwKCt45.js +0 -2
  1192. package/dist/browser-profiles-DhGtxK9v.js +0 -2
  1193. package/dist/browser-runtime-BL6b-qtr.js +0 -384
  1194. package/dist/build-33AnG55F.js +0 -257
  1195. package/dist/bundled-channel-config-schema-4eXcH-RE.d.ts +0 -3163
  1196. package/dist/call-dct8amtn.d.ts +0 -43
  1197. package/dist/capability-cli-D-KoVyyP.js +0 -1782
  1198. package/dist/channel-0tgrzPag.js +0 -867
  1199. package/dist/channel-4g20sJKJ.d.ts +0 -104
  1200. package/dist/channel-6tG8jWsw.d.ts +0 -8
  1201. package/dist/channel-7OEbQ8xS.d.ts +0 -6
  1202. package/dist/channel-7rVapSdN.d.ts +0 -8
  1203. package/dist/channel-B1fZN0iI.d.ts +0 -427
  1204. package/dist/channel-B5Q7fRiN.js +0 -1134
  1205. package/dist/channel-BEg_0h_C.d.ts +0 -12
  1206. package/dist/channel-BNp1J_eZ.js +0 -376
  1207. package/dist/channel-BP6RWm-M.d.ts +0 -47
  1208. package/dist/channel-BRjqrJfj.d.ts +0 -49
  1209. package/dist/channel-BUoyH_tP.d.ts +0 -114
  1210. package/dist/channel-BVBG4Tmn.d.ts +0 -28
  1211. package/dist/channel-Bap23sAx.js +0 -481
  1212. package/dist/channel-BhZ7x0SB.d.ts +0 -26
  1213. package/dist/channel-Bxod9CjX.js +0 -508
  1214. package/dist/channel-C6LASGjS.js +0 -808
  1215. package/dist/channel-COWZEKCw.js +0 -1249
  1216. package/dist/channel-CRAIreZ3.js +0 -238
  1217. package/dist/channel-CVY2hnJh.js +0 -1556
  1218. package/dist/channel-CgKdh_Jd.d.ts +0 -106
  1219. package/dist/channel-Cxo62btA.js +0 -1496
  1220. package/dist/channel-D5SzoyWI.js +0 -562
  1221. package/dist/channel-DE4vIsYF.d.ts +0 -64
  1222. package/dist/channel-DOdRHxJg.js +0 -1777
  1223. package/dist/channel-DZygtXdy.js +0 -362
  1224. package/dist/channel-DfhOnM71.d.ts +0 -7
  1225. package/dist/channel-DhZiptRe.d.ts +0 -8
  1226. package/dist/channel-DqPZviVV.js +0 -2126
  1227. package/dist/channel-Dssy3NQA.js +0 -740
  1228. package/dist/channel-actions.runtime-CDaMC9SV.js +0 -265
  1229. package/dist/channel-buMY8xZQ.d.ts +0 -7
  1230. package/dist/channel-core-CBhC_PNR.js +0 -5
  1231. package/dist/channel-core-x9b94azO.d.ts +0 -6
  1232. package/dist/channel-cvGHll3-.js +0 -955
  1233. package/dist/channel-entry-contract-BfZdcgTS.d.ts +0 -112
  1234. package/dist/channel-inbound-CNdyzYlz.js +0 -80
  1235. package/dist/channel-l8amaSI9.js +0 -653
  1236. package/dist/channel-lifecycle-DCl2GbRW.d.ts +0 -125
  1237. package/dist/channel-pairing-BRqfYy30.d.ts +0 -58
  1238. package/dist/channel-plugin-runtime-CvcVGjj4.js +0 -998
  1239. package/dist/channel-plugin-runtime-D5n9A86n.d.ts +0 -7
  1240. package/dist/channel-runtime-BAbg8Dcv.js +0 -408
  1241. package/dist/channel-sWtDTVwd.d.ts +0 -14
  1242. package/dist/channel.runtime-9o-iF8zm.js +0 -2528
  1243. package/dist/channel.runtime-BotO7RD0.js +0 -21009
  1244. package/dist/channel.runtime-BrDb4cP8.js +0 -88
  1245. package/dist/channel.runtime-C1cLfrDt.js +0 -254
  1246. package/dist/channel.runtime-CTM3VO2E.js +0 -4
  1247. package/dist/channel.runtime-CnodqvCJ.js +0 -733
  1248. package/dist/channel.runtime-Dmr8503H.js +0 -1008
  1249. package/dist/channel.runtime-DqzR3Gd9.js +0 -109
  1250. package/dist/channel.runtime-LOf0PHu_.js +0 -652
  1251. package/dist/channel.setup-1leD5F5B.js +0 -343
  1252. package/dist/channel.setup-D9UyWhXM.js +0 -1098
  1253. package/dist/channel.setup-DkVld-9Z.d.ts +0 -7
  1254. package/dist/channel.setup-DxT4prSl.d.ts +0 -8
  1255. package/dist/channel.setup-IHNFkdUD.js +0 -10
  1256. package/dist/channel.setup-YwXqilBB.d.ts +0 -6
  1257. package/dist/chat-DrycI6KH.js +0 -2666
  1258. package/dist/chrome-CgGY9FsG.js +0 -1503
  1259. package/dist/cli-backend-B3aNoTD4.d.ts +0 -5
  1260. package/dist/cli-backend-BVUFOLXj.d.ts +0 -5
  1261. package/dist/cli-compaction-DPmSHZx7.js +0 -347
  1262. package/dist/cli-metadata-eFfCoGmY.js +0 -22
  1263. package/dist/cli-nmYmL8lb.js +0 -1341
  1264. package/dist/cli-runner-BTOYShgV.js +0 -2
  1265. package/dist/cli-runner-DgXAxJVr.js +0 -540
  1266. package/dist/cli-runner.runtime-BeMsKcaS.js +0 -4
  1267. package/dist/cli-runner.runtime-DMD8X8-h.js +0 -3
  1268. package/dist/cli-shared-BAuePn3e.d.ts +0 -20
  1269. package/dist/cli-v6XF4hHd.d.ts +0 -20
  1270. package/dist/client-CKLZqMCW.js +0 -650
  1271. package/dist/client-adapter-B_0W-6Fx.js +0 -897
  1272. package/dist/client-factory-CdMLQFeA.js +0 -9
  1273. package/dist/command-auth-BxYfnQzs.js +0 -135
  1274. package/dist/command-execution-startup-CiV5yFW1.js +0 -87
  1275. package/dist/command-handlers-BAWROGlt.js +0 -1609
  1276. package/dist/command-registry-BqTMebZr.js +0 -4
  1277. package/dist/command-registry-C2Y8GeJl.js +0 -9
  1278. package/dist/command-registry-core-Bi-d0-WH.js +0 -110
  1279. package/dist/command-status.runtime-BSXHZzOq.js +0 -90
  1280. package/dist/commands-Z6AfrJar.d.ts +0 -113
  1281. package/dist/commands-acp-BYWOkjAx.js +0 -74
  1282. package/dist/commands-compact.runtime-Cyb7Pu12.js +0 -10
  1283. package/dist/commands-handlers.runtime-DdJ20XTn.js +0 -6154
  1284. package/dist/commands-status-6uhiUw13.js +0 -3
  1285. package/dist/commands-status-BJ5AnkOG.js +0 -16
  1286. package/dist/commands-status.runtime-6uhiUw13.js +0 -3
  1287. package/dist/commands-subagents-control.runtime-DZrrLjSk.js +0 -2
  1288. package/dist/commands-subagents-control.runtime-_R3XgUpp.js +0 -3
  1289. package/dist/commands-system-prompt-CHGtJPnx.js +0 -162
  1290. package/dist/commands-system-prompt-CM23NlDu.js +0 -2
  1291. package/dist/commands.runtime-DUEbtHG1.js +0 -176
  1292. package/dist/compact-BA6lVtLj.js +0 -480
  1293. package/dist/compact-BfC-utPW.js +0 -1141
  1294. package/dist/compact.runtime-BRL2wCqh.js +0 -12
  1295. package/dist/completion-cli-CYKoLZLl.js +0 -315
  1296. package/dist/computer-use-BWgYktaW.js +0 -367
  1297. package/dist/config-B_HanwOV.js +0 -373
  1298. package/dist/config-DhGtxK9v.js +0 -2
  1299. package/dist/config-cli-CI5UtWr-.js +0 -1633
  1300. package/dist/config-mutations-D2GtlLMA.js +0 -159
  1301. package/dist/config-schema-BKOfHz23.d.ts +0 -20
  1302. package/dist/configure-CuPwIiwW.js +0 -3
  1303. package/dist/configure.commands-BWpwrafi.js +0 -1251
  1304. package/dist/configure.commands-qzipmoDP.js +0 -2
  1305. package/dist/context-engine-host-compat-D246ZMR2.js +0 -2
  1306. package/dist/context-engine-host-compat-KMl-oqCw.js +0 -288
  1307. package/dist/context-engine-lifecycle-DvEDHkQz.js +0 -1274
  1308. package/dist/contracts-testkit-Ym3exIK5.d.ts +0 -145
  1309. package/dist/control-auth-B_RiUaHt.js +0 -114
  1310. package/dist/control-service-DcQFx6_O.js +0 -145
  1311. package/dist/control-ui/assets/agents-Bc8cIfWF.js +0 -1008
  1312. package/dist/control-ui/assets/channel-config-extras-DQru4ECs.js +0 -2
  1313. package/dist/control-ui/assets/channels-BfncerPV.js +0 -367
  1314. package/dist/control-ui/assets/cron-DHLcga_r.js +0 -1013
  1315. package/dist/control-ui/assets/debug-DprDzDn1.js +0 -97
  1316. package/dist/control-ui/assets/index-XTZKpkBL.js +0 -7370
  1317. package/dist/control-ui/assets/instances-D1_lOT13.js +0 -57
  1318. package/dist/control-ui/assets/logs-DINx8syb.js +0 -74
  1319. package/dist/control-ui/assets/nodes-BH4XOUmD.js +0 -436
  1320. package/dist/control-ui/assets/sessions-D5Xt25SY.js +0 -399
  1321. package/dist/control-ui/assets/skills-BmayrBHY.js +0 -314
  1322. package/dist/control-ui/assets/skills-shared-CHaYSJ_s.js +0 -11
  1323. package/dist/conversation-binding-runtime-_jhzwiiC.js +0 -4
  1324. package/dist/conversation-runtime-F5kCN0Sj.js +0 -31
  1325. package/dist/core-BpeKfqbI.d.ts +0 -224
  1326. package/dist/core-DE71gncT.js +0 -282
  1327. package/dist/core-api-B4L5WkKc.js +0 -5
  1328. package/dist/core-api-Q9oM19yY.js +0 -2
  1329. package/dist/crestodian-DLpxYmzP.js +0 -55
  1330. package/dist/daocore-runtime-BnYtDbMC.d.ts +0 -151
  1331. package/dist/daocore-tools-wNTIZIO3.js +0 -11727
  1332. package/dist/dashboard-SHmcCcnT.js +0 -263
  1333. package/dist/delivery-BA4di5Tw.js +0 -1002
  1334. package/dist/dev-Cr2Dhgoc.js +0 -97
  1335. package/dist/dialogue-xI4qAuLY.js +0 -37
  1336. package/dist/dir-fetch-tool-6d4yElM4.js +0 -565
  1337. package/dist/dir-list-tool-D2k-hax6.js +0 -100
  1338. package/dist/direct-dm-eGyFHTug.js +0 -64
  1339. package/dist/directive-handling.fast-lane-Ci1l6GN_.js +0 -68
  1340. package/dist/directive-handling.impl-Co3i_YQ4.js +0 -818
  1341. package/dist/directive-handling.impl-DHKC0TrU.js +0 -2
  1342. package/dist/directive-handling.model-selection-bv5KrHOw.js +0 -122
  1343. package/dist/directive-handling.persist.runtime-CPLg-YHh.js +0 -263
  1344. package/dist/dispatch-CdvERWY-.js +0 -1640
  1345. package/dist/dispatch-acp-transcript.runtime-BhQo1XEg.js +0 -40
  1346. package/dist/dispatch-acp.runtime-Dtiu2EgE.js +0 -18
  1347. package/dist/doctor-BzsPHvLP.js +0 -2
  1348. package/dist/doctor-Cg4FWB15.js +0 -6
  1349. package/dist/doctor-config-flow-SYjHcyu4.js +0 -1741
  1350. package/dist/doctor-core-checks-75amkN-e.js +0 -2
  1351. package/dist/doctor-core-checks-B1fu7KDm.js +0 -573
  1352. package/dist/doctor-health-contributions-BMdJKStr.js +0 -696
  1353. package/dist/doctor-health-vLyDQqfq.js +0 -65
  1354. package/dist/doctor-lint-DfvFyBgL.js +0 -94
  1355. package/dist/doctor-prompter-C-dTuOnw.js +0 -58
  1356. package/dist/doctor-state-integrity-Cv-ECLuv.js +0 -1231
  1357. package/dist/dynamic-tools-BG8ijDFH.js +0 -486
  1358. package/dist/embedded-backend-bRfALCWz.js +0 -579
  1359. package/dist/embedded-gateway-stub.runtime-CAh3IhtZ.js +0 -12
  1360. package/dist/embedding-provider-B7kg9IhC.d.ts +0 -16
  1361. package/dist/embedding-provider-jB1zjkZy.d.ts +0 -65
  1362. package/dist/embedding-provider-sea2CddJ.d.ts +0 -21
  1363. package/dist/exec-approvals-BBa28Sct.js +0 -149
  1364. package/dist/file-fetch-tool-DRIsI7eQ.js +0 -124
  1365. package/dist/file-write-tool-vTMh7eW6.js +0 -127
  1366. package/dist/format-nrhTS41q.js +0 -1145
  1367. package/dist/gateway-cli-CCgw11Ik.js +0 -435
  1368. package/dist/gateway-method-runtime-BNAVGCC_.js +0 -21
  1369. package/dist/gateway-runtime-DGdJumdK.d.ts +0 -163
  1370. package/dist/gemini-cli-provider-Bbpd5lx5.d.ts +0 -6
  1371. package/dist/get-reply-DGFCqKen.js +0 -4689
  1372. package/dist/get-reply-from-config.runtime-l7NTyCh5.js +0 -2
  1373. package/dist/graph-users-CGpakgek.js +0 -1419
  1374. package/dist/group-access-D095jQ78.js +0 -112
  1375. package/dist/group-keys-DnxWQtll.d.ts +0 -17
  1376. package/dist/handle-action.guild-admin-B3pALmMq.js +0 -288
  1377. package/dist/harness-Bs-sPbOD.js +0 -61
  1378. package/dist/health-4gWMIKHu.js +0 -4
  1379. package/dist/heartbeat-runner-Sky_Rjw7.js +0 -5
  1380. package/dist/heartbeat-runner.runtime-CRZ-NbrW.js +0 -4
  1381. package/dist/help-B68Ov4LD.js +0 -136
  1382. package/dist/hook-runtime-Cm73yH0T.d.ts +0 -107
  1383. package/dist/hooks-DWSdYas_.js +0 -534
  1384. package/dist/http-registry-CHKiFHCC.d.ts +0 -23
  1385. package/dist/image-generation-runtime-p-dfXZTf.d.ts +0 -21
  1386. package/dist/inbound-direct-dm-runtime-5z3W9Oqn.js +0 -2
  1387. package/dist/inbound-reply-dispatch-D7NeeFC1.js +0 -148
  1388. package/dist/index-CKAHTIU4.d.ts +0 -3971
  1389. package/dist/init-BXF3o80o.js +0 -59
  1390. package/dist/inline-buttons-DsHwKEVU.js +0 -40
  1391. package/dist/interactive-dispatch-BsKWomnh.d.ts +0 -143
  1392. package/dist/interactive-dispatch-CItEYOu3.d.ts +0 -56
  1393. package/dist/internal-events-TAN9dPEj.js +0 -90
  1394. package/dist/isolated-agent-CTrVGI6q.js +0 -2
  1395. package/dist/isolated-agent-DPyibJ8B.js +0 -1118
  1396. package/dist/lifecycle-BwTg0Djv.js +0 -571
  1397. package/dist/list.probe-BpM4PKu7.js +0 -449
  1398. package/dist/list.status-command-BbcloYBd.js +0 -789
  1399. package/dist/llm-slug-generator-UG7Bhj_y.js +0 -78
  1400. package/dist/loader-D6z2PEKl.d.ts +0 -142
  1401. package/dist/local-dispatch.runtime-CU6Y-BDa.js +0 -9
  1402. package/dist/manager-C3AVKMSl.d.ts +0 -356
  1403. package/dist/manager-CSN9j9hh.d.ts +0 -205
  1404. package/dist/manager.runtime-Da5LiiaQ.js +0 -2714
  1405. package/dist/markdown-to-line-BnESmsY4.js +0 -811
  1406. package/dist/mcp-http-C38KS7On.js +0 -2
  1407. package/dist/mcp-http-CcGhAZcF.js +0 -555
  1408. package/dist/media-understanding-provider-BCz5dVl6.js +0 -339
  1409. package/dist/memory-core-host-engine-storage-sWQlfr8J.d.ts +0 -54
  1410. package/dist/memory-embedding-adapter-BrGY0ecB.d.ts +0 -5
  1411. package/dist/message-actions-CQURSOZH.js +0 -145
  1412. package/dist/message-handler-C2U3bt-X.js +0 -1715
  1413. package/dist/message-handler-CwZfuHhP.js +0 -384
  1414. package/dist/message-handler.preflight-Cosa3kg0.js +0 -1125
  1415. package/dist/message-handler.process-BlKFMYXw.js +0 -1484
  1416. package/dist/migration-hAtbc95i.d.ts +0 -45
  1417. package/dist/model-B8M2deNL.js +0 -74
  1418. package/dist/model-Ck-vNyGd.d.ts +0 -33
  1419. package/dist/model-selection-v2wQWgsT.js +0 -272
  1420. package/dist/models-B7IiQBWY.js +0 -104
  1421. package/dist/models-CnWFsPX6.d.ts +0 -24
  1422. package/dist/models-DMNzBNgt.js +0 -2
  1423. package/dist/models-cli-CQaOg02d.js +0 -256
  1424. package/dist/monitor-Bd9kOezJ.js +0 -1370
  1425. package/dist/monitor-Cy6D6MyS.js +0 -715
  1426. package/dist/monitor-DStY23C4.js +0 -834
  1427. package/dist/monitor-DnF8eltK.js +0 -1657
  1428. package/dist/monitor-DrFJ63I1.js +0 -4377
  1429. package/dist/monitor-J8jOsDaJ.js +0 -60
  1430. package/dist/monitor-auth-DKkbt_CR.js +0 -179
  1431. package/dist/monitor-jp3H9Ri_.js +0 -2
  1432. package/dist/monitor-polling.runtime-DPCAacPc.js +0 -883
  1433. package/dist/monitor-tBNmyf1s.js +0 -2788
  1434. package/dist/monitor-webhook.runtime-BnjEsLRS.js +0 -387
  1435. package/dist/monitor.account-Gh8FuMEq.js +0 -5233
  1436. package/dist/monitor.runtime-Bdh6dxyq.js +0 -2
  1437. package/dist/monitor.webhook-BosT2ylg.js +0 -180
  1438. package/dist/node-cli-sessions-B0_DtIxz.js +0 -1228
  1439. package/dist/onboard-CiTp3HuT.js +0 -733
  1440. package/dist/onboard-helpers-6NgX4RkW.js +0 -251
  1441. package/dist/onboard-helpers-BwxJT_0T.js +0 -6
  1442. package/dist/onboard-remote-CNCFouj7.js +0 -212
  1443. package/dist/onboard-remote-DXzWgH_H.js +0 -2
  1444. package/dist/onboard-skills-Dx58zrXg.js +0 -160
  1445. package/dist/onboard-skills-qaynAMqw.js +0 -2
  1446. package/dist/openai-codex-provider-Bj9cyh4I.d.ts +0 -5
  1447. package/dist/openai-http-Dp0cp01u.js +0 -824
  1448. package/dist/openai-provider-Dm3YkkWf.d.ts +0 -5
  1449. package/dist/openresponses-http-acbxr5UW.js +0 -1173
  1450. package/dist/operations-BZVuEl9E.js +0 -805
  1451. package/dist/outbound-adapter-BKGzT1Rl.js +0 -543
  1452. package/dist/outbound-session-route-mWVuRF9I.js +0 -45
  1453. package/dist/outbound.runtime-BTjY78St.js +0 -2
  1454. package/dist/pairing-challenge-DD0D0sfM.d.ts +0 -87
  1455. package/dist/pi-embedded-CFP2IrYS.js +0 -3796
  1456. package/dist/pi-embedded-D8caT0Nm.js +0 -4
  1457. package/dist/pi-embedded.runtime-eBik36nq.js +0 -4
  1458. package/dist/pi-tools-DOiFN8QJ.js +0 -2413
  1459. package/dist/plan-Cq2-YWkv.js +0 -112
  1460. package/dist/plan-DZacZ3Zv.js +0 -81
  1461. package/dist/plugin-BcNkVMQf.d.ts +0 -17
  1462. package/dist/plugin-app-cache-key-CBK84hKp.js +0 -46
  1463. package/dist/plugin-enabled-CMfz3hfi.js +0 -233
  1464. package/dist/plugin-entry-BS5QKDoz.d.ts +0 -47
  1465. package/dist/plugin-k9ChkvvX.js +0 -12396
  1466. package/dist/plugin-registration-DzPoDboh.js +0 -88
  1467. package/dist/plugin-runtime-BNGhLQ-_.d.ts +0 -117
  1468. package/dist/plugin-service-BynKHNHj.d.ts +0 -24
  1469. package/dist/plugin-service-Ckp9CgP5.js +0 -1229
  1470. package/dist/policy-CBa8yH5k.js +0 -680
  1471. package/dist/policy-Dlam-IbU.js +0 -138
  1472. package/dist/prepare.runtime-B8h04--2.js +0 -732
  1473. package/dist/preview-warnings-DPDK9HPk.js +0 -392
  1474. package/dist/probe-Bts3wK7l.js +0 -682
  1475. package/dist/probe-ByHrOECy.js +0 -47
  1476. package/dist/probe-CXqCx5yV.js +0 -2204
  1477. package/dist/probe-fhhJ0LMx.js +0 -2
  1478. package/dist/program-DfNLP_PI.js +0 -131
  1479. package/dist/prompt-overlay-qKGGXVs-.d.ts +0 -23
  1480. package/dist/provider-CeG5mirD.js +0 -8735
  1481. package/dist/provider-D_TXf9b1.js +0 -152
  1482. package/dist/provider-Fb0fhEC5.js +0 -32
  1483. package/dist/provider-api-key-auth-BIph5btg.d.ts +0 -27
  1484. package/dist/provider-auth-result-BFvMZrH6.d.ts +0 -21
  1485. package/dist/provider-catalog-runtime-Du74RUel.d.ts +0 -23
  1486. package/dist/provider-catalog-shared-B3nN3sf2.d.ts +0 -62
  1487. package/dist/provider-dispatcher-DQ0FP7Oj.js +0 -22
  1488. package/dist/provider-hook-runtime-CRpS8VJ_.d.ts +0 -61
  1489. package/dist/provider-model-shared-GrPEK3SY.d.ts +0 -143
  1490. package/dist/provider-models-iUJVn9QI.d.ts +0 -12
  1491. package/dist/provider-policy-DliVEM__.d.ts +0 -30
  1492. package/dist/provider-registration-BxzmE1yB.d.ts +0 -6
  1493. package/dist/provider-registry-B4AQXjYK.d.ts +0 -8
  1494. package/dist/provider-registry-BHyB46kI.d.ts +0 -30
  1495. package/dist/provider-registry-CnfpUSqh.d.ts +0 -8
  1496. package/dist/provider-runtime-D3j0VBbF.d.ts +0 -359
  1497. package/dist/provider-self-hosted-setup-_11XAmRH.d.ts +0 -74
  1498. package/dist/provider-session.runtime-CIMJ-7ay.js +0 -9
  1499. package/dist/provider-stream-mWxYXsAm.d.ts +0 -140
  1500. package/dist/provider-stream-shared-QayId-fm.d.ts +0 -128
  1501. package/dist/provider-xNaUQ5Lv.js +0 -32
  1502. package/dist/provider.runtime-CGsYbZGk.js +0 -2
  1503. package/dist/providers.runtime-fmZQlSRt.d.ts +0 -25
  1504. package/dist/public-surface-loader-CuVkM64A.js +0 -114
  1505. package/dist/pw-ai-BDGftH9e.js +0 -3029
  1506. package/dist/pw-role-snapshot-C_P091Iv.js +0 -333
  1507. package/dist/reaction-level-DKxiNfWB.js +0 -19
  1508. package/dist/reaction-runtime-api-TY4aPHui.js +0 -116
  1509. package/dist/realtime-transcription-CmRx7wX7.d.ts +0 -43
  1510. package/dist/realtime-transcription-provider-BNca2pAl.js +0 -205
  1511. package/dist/realtime-transcription-provider-Csl2NRiB.d.ts +0 -5
  1512. package/dist/realtime-transcription-provider-CtUTdTS4.d.ts +0 -37
  1513. package/dist/realtime-transcription-provider-DKd69ns6.d.ts +0 -28
  1514. package/dist/realtime-transcription-provider-DPj1VZIg.d.ts +0 -32
  1515. package/dist/realtime-voice-CVgV9cqF.d.ts +0 -333
  1516. package/dist/realtime-voice-provider-CmtxwZon.d.ts +0 -5
  1517. package/dist/register-DLjqO2vR.js +0 -2178
  1518. package/dist/register.agent-FV7a6yzo.js +0 -156
  1519. package/dist/register.configure-DrkSyKW3.js +0 -16
  1520. package/dist/register.crestodian-CQGAa8z2.js +0 -24
  1521. package/dist/register.maintenance-tocHfiS3.js +0 -83
  1522. package/dist/register.onboard-BomHnBGE.js +0 -113
  1523. package/dist/register.runtime-6AmV3Vgs.js +0 -54
  1524. package/dist/register.runtime-CSz0gVBB.d.ts +0 -6
  1525. package/dist/register.setup-ENYtNAA5.js +0 -40
  1526. package/dist/register.subclis-BC6TefAM.js +0 -31
  1527. package/dist/register.subclis-DZdEZgSS.js +0 -3
  1528. package/dist/register.subclis-core-C-EfowrU.js +0 -273
  1529. package/dist/registry-VitXYFE8.d.ts +0 -91
  1530. package/dist/registry-types-C4eAzEgQ.d.ts +0 -392
  1531. package/dist/repair-sequencing-l8dFaytn.js +0 -640
  1532. package/dist/reply-delivery-DdeUWVuk.js +0 -196
  1533. package/dist/reply-runtime-Bd91JEZL.js +0 -11
  1534. package/dist/reply.runtime-l7NTyCh5.js +0 -2
  1535. package/dist/request-BY_4UukN.js +0 -54
  1536. package/dist/resolve-allowlist-C4lmxl4V.js +0 -220
  1537. package/dist/result-fallback-classifier-XORMMp30.js +0 -79
  1538. package/dist/root-help-CTW0Wyrf.js +0 -43
  1539. package/dist/route-dOf1WMkJ.js +0 -469
  1540. package/dist/route-resolution-BddNYZEI.js +0 -274
  1541. package/dist/routes-D0xw72Lf.js +0 -3602
  1542. package/dist/routes-TXSPQFWS.js +0 -2
  1543. package/dist/run-DpvUuaWB.js +0 -1162
  1544. package/dist/run-attempt-Bet0PiSc.js +0 -7704
  1545. package/dist/run-command-C5vMVqMt.js +0 -23
  1546. package/dist/run-command-pNDd7NqP.js +0 -2
  1547. package/dist/run-embedded.runtime-CBZV6YWj.js +0 -4
  1548. package/dist/run-execution-cli.runtime-DTQLV8tA.js +0 -4
  1549. package/dist/run-subagent-registry.runtime-DJCvSdhY.js +0 -2
  1550. package/dist/runtime-CNXeG8vX.js +0 -1287
  1551. package/dist/runtime-DEOSWxv9.js +0 -438
  1552. package/dist/runtime-DbTiSX85.d.ts +0 -17
  1553. package/dist/runtime-api-BCM7T4WV.js +0 -17
  1554. package/dist/runtime-api-BTnMvj8L.js +0 -13
  1555. package/dist/runtime-api-By6LEySM.js +0 -3
  1556. package/dist/runtime-api-Cd0b5LPQ.js +0 -4
  1557. package/dist/runtime-api-CtuDiikz.js +0 -21
  1558. package/dist/runtime-api-DjySILXC.js +0 -13
  1559. package/dist/runtime-api-XJTq_pyQ.js +0 -24
  1560. package/dist/runtime-api-k3v6Q0lb2.d.ts +0 -3151
  1561. package/dist/runtime-api.actions-BmsSg8Ai.js +0 -3
  1562. package/dist/runtime-api.actions-C2-n4QQ5.d.ts +0 -23
  1563. package/dist/runtime-api.monitor-DSk7Pd5H.js +0 -6
  1564. package/dist/runtime-api.send-D3sPncy9.js +0 -4
  1565. package/dist/runtime-api.send-t0FX9tXf.d.ts +0 -38
  1566. package/dist/runtime-api.threads-BK9cB4L1.js +0 -2
  1567. package/dist/runtime-channel--Wjr2ePx.js +0 -150
  1568. package/dist/runtime-channel-WdTa9hHZ.js +0 -2
  1569. package/dist/runtime-embedded-pi.runtime-BNYBvaxo.js +0 -2
  1570. package/dist/runtime-r3jS5wSq.js +0 -6179
  1571. package/dist/runtime-taskflow-DMBY6o56.d.ts +0 -435
  1572. package/dist/sanitize-outbound-D6IBCCpn.js +0 -127
  1573. package/dist/sdk-setup-tools-DcDrd8tW.js +0 -8
  1574. package/dist/secrets-OV1uTwRt.js +0 -113
  1575. package/dist/secrets-cli-llC7t41S.js +0 -149
  1576. package/dist/security-audit-BM_fypcl.js +0 -118
  1577. package/dist/security-audit-CQ2yKgF8.js +0 -122
  1578. package/dist/security-audit.runtime-CRgJUegH.js +0 -2
  1579. package/dist/selection-DkJ7MaPC.js +0 -16157
  1580. package/dist/selection-LeUiOSn0.js +0 -3
  1581. package/dist/send-B5TXXeBz.d.ts +0 -231
  1582. package/dist/send-C0ZHzB6o.js +0 -1631
  1583. package/dist/send-CXL3cM-w.js +0 -192
  1584. package/dist/send-CuDA29HM.js +0 -2
  1585. package/dist/send-D7qhwK7Z.js +0 -143
  1586. package/dist/send-DEMaBWpw.d.ts +0 -105
  1587. package/dist/send.components-BNeg1zrc.js +0 -2
  1588. package/dist/send.components-DwRyC_Hc.js +0 -500
  1589. package/dist/send.runtime-DBIUdxpO.js +0 -2
  1590. package/dist/send.types-DywwIqYK.d.ts +0 -160
  1591. package/dist/server-DGcm6Swr.js +0 -24
  1592. package/dist/server-DPvleC-x.js +0 -73
  1593. package/dist/server-context-BWBM4f-_.js +0 -955
  1594. package/dist/server-context-CFgwcLlu.js +0 -2
  1595. package/dist/server-cron-C1kChsjw.js +0 -2989
  1596. package/dist/server-cron-CS1EP5Li.js +0 -2
  1597. package/dist/server-methods-BcIlC8iD.js +0 -16494
  1598. package/dist/server-node-events-BAZCvZOy.js +0 -596
  1599. package/dist/server-plugin-bootstrap-cQUi21Uu.js +0 -70
  1600. package/dist/server-plugins-BRFre223.js +0 -432
  1601. package/dist/server-reload-handlers-DfcsAX-5.js +0 -714
  1602. package/dist/server-restart-sentinel-CFX5zQkM.js +0 -747
  1603. package/dist/server-restart-sentinel-DUvs77Q0.js +0 -2
  1604. package/dist/server-runtime-services-0vm5XmvV.js +0 -2
  1605. package/dist/server-runtime-services-CLz_vkLy.js +0 -267
  1606. package/dist/server-startup-plugins-CPXqqIRV.js +0 -113
  1607. package/dist/server-startup-post-attach-BkNe1Z6g.js +0 -716
  1608. package/dist/server-ws-runtime-rcJeRHFO.js +0 -349
  1609. package/dist/server.impl-a6knQ-N8.js +0 -2586
  1610. package/dist/service-H-BcELwS.js +0 -1446
  1611. package/dist/session-binding-BQliaqL7.js +0 -2
  1612. package/dist/session-binding-DPvZil_F.js +0 -219
  1613. package/dist/session-kill-http-DJMipluP.js +0 -121
  1614. package/dist/session-reset-service-Dn9FU5wA.js +0 -625
  1615. package/dist/session-route-JLWNmJxD.js +0 -93
  1616. package/dist/session-status.runtime-D0OptHcW.js +0 -2
  1617. package/dist/session-subagent-reactivation.runtime-BUmf1vNS.js +0 -2
  1618. package/dist/session-tab-registry-CoBvJVRj.js +0 -521
  1619. package/dist/sessions-history-http-B8CkLDAn.js +0 -430
  1620. package/dist/sessions.runtime-DbNqS_Gy.js +0 -2
  1621. package/dist/setup-CTZUUn1s.js +0 -586
  1622. package/dist/setup-D6fXOEjD.js +0 -2
  1623. package/dist/setup-api-DLPEXHCv.js +0 -29
  1624. package/dist/setup-core-DLXb29jm.js +0 -174
  1625. package/dist/setup-onboard-configure-help-fast-path-CrcZmKPI.js +0 -64
  1626. package/dist/setup-surface--Cct-rCt.js +0 -288
  1627. package/dist/setup-surface-CW8YN207.js +0 -320
  1628. package/dist/setup-surface-DIxcfqD0.js +0 -221
  1629. package/dist/setup-surface-IJ6kmKgi.js +0 -405
  1630. package/dist/setup.finalize-gWpWnCCk.js +0 -582
  1631. package/dist/setup.gateway-config-D_DaSfpW.js +0 -281
  1632. package/dist/setup.migration-import-CYZjCkle.js +0 -2
  1633. package/dist/setup.migration-import-CZJU4scH.js +0 -200
  1634. package/dist/shared-Bp_Fgv6B.js +0 -121
  1635. package/dist/shared-CLqPY0yv.d.ts +0 -115
  1636. package/dist/shared-client-OQdg8NGC.js +0 -629
  1637. package/dist/shared-client-dk1ICVBm.js +0 -2
  1638. package/dist/side-question-CbhRW3UI.js +0 -683
  1639. package/dist/simple-completion-runtime-XIF65b47.d.ts +0 -73
  1640. package/dist/skill-tool-dispatch.runtime-EcycYnWE.js +0 -143
  1641. package/dist/slash-state-BoX6WwB5.js +0 -2166
  1642. package/dist/speech-CvkJG5Mt.d.ts +0 -47
  1643. package/dist/speech-core-MG83lB3i.d.ts +0 -36
  1644. package/dist/speech-provider-1EN9hT-3.d.ts +0 -8
  1645. package/dist/speech-provider-67ebyEcs.js +0 -184
  1646. package/dist/speech-provider-B6tb45De.d.ts +0 -5
  1647. package/dist/speech-provider-C74wAyBX.d.ts +0 -5
  1648. package/dist/speech-provider-CYJoZZpj.d.ts +0 -8
  1649. package/dist/speech-provider-DavEMdKC.d.ts +0 -34
  1650. package/dist/speech-provider-DvFtveg6.d.ts +0 -5
  1651. package/dist/src-CbfOifft.js +0 -4256
  1652. package/dist/startup-context-YF24NARp.js +0 -313
  1653. package/dist/status-message-CcrZdfCO.js +0 -484
  1654. package/dist/status-message.runtime-Cptt1EPV.js +0 -6
  1655. package/dist/status-subagents.runtime-v2eijc4R.js +0 -18
  1656. package/dist/status-text-BWwar3Yc.js +0 -296
  1657. package/dist/status-tn3uQDY7.js +0 -73
  1658. package/dist/status.runtime-BFjTHLiQ.js +0 -2
  1659. package/dist/sticker-cache-Cs7LV_3a.js +0 -206
  1660. package/dist/sticker-vision.runtime-CyPMpoCs.js +0 -17
  1661. package/dist/stream-1rWKMSqV.d.ts +0 -16
  1662. package/dist/stream-Bk9TnoRV.d.ts +0 -10
  1663. package/dist/stream-DZeY9rhs.d.ts +0 -120
  1664. package/dist/stream-DgCoKjcL.d.ts +0 -19
  1665. package/dist/stream-exnufPSG.d.ts +0 -5
  1666. package/dist/stream-wrappers-D2EuY1tP.d.ts +0 -21
  1667. package/dist/subagent-announce-CRjGGxSB.js +0 -354
  1668. package/dist/subagent-announce-delivery-CbfRRdwt.js +0 -958
  1669. package/dist/subagent-control-VTsWynTB.js +0 -508
  1670. package/dist/subagent-hooks-BB__aHul.js +0 -2
  1671. package/dist/subagent-hooks-Cb5fJ2H0.js +0 -146
  1672. package/dist/subagent-hooks-CwVBMhp_.js +0 -2
  1673. package/dist/subagent-hooks-Cx9_GAMF.js +0 -116
  1674. package/dist/subagent-hooks-DOJhvTDx.js +0 -230
  1675. package/dist/subagent-hooks-DUMqhB3r.js +0 -2
  1676. package/dist/subagent-hooks-api-BDGmCxB2.js +0 -22
  1677. package/dist/subagent-hooks-api-CcTdPqP1.js +0 -23
  1678. package/dist/subagent-hooks-api-D18tQta6.js +0 -23
  1679. package/dist/subagent-orphan-recovery-6bNIX25Q.js +0 -352
  1680. package/dist/subagent-registry-DokIxoQ6.js +0 -2351
  1681. package/dist/subagent-registry-tlyJE0hN.js +0 -3
  1682. package/dist/subagent-session-cleanup-BWHQ6rcm.js +0 -525
  1683. package/dist/subagent-spawn-BUdUAwoc.js +0 -1164
  1684. package/dist/target-id-CI1U3MSO.js +0 -107
  1685. package/dist/targets-CbBORUXB.d.ts +0 -10
  1686. package/dist/targets-CgmlXrhv.js +0 -44
  1687. package/dist/targets-D-jSrLUN.js +0 -19
  1688. package/dist/targets-DPDu8x6v.js +0 -19
  1689. package/dist/targets-D_fXvxrg.d.ts +0 -10
  1690. package/dist/testing-D-48HuIK.js +0 -267
  1691. package/dist/thinking-policy-CY16OlCs.d.ts +0 -5
  1692. package/dist/thread-bindings-B9J0nGG7.js +0 -232
  1693. package/dist/thread-bindings-BByWvFZq.js +0 -8
  1694. package/dist/thread-bindings-Cxjm2mLg.js +0 -571
  1695. package/dist/thread-bindings-DQWmglaO.js +0 -228
  1696. package/dist/thread-bindings.discord-api-DWWDvMgL.js +0 -187
  1697. package/dist/thread-bindings.manager-CQW6bNs5.js +0 -2
  1698. package/dist/thread-bindings.manager-DpBYBs9s.js +0 -536
  1699. package/dist/thread-lifecycle-PpB8gTx1.js +0 -1614
  1700. package/dist/token-CBy6YYM_.js +0 -134
  1701. package/dist/tool-BCHcwX9p.js +0 -139
  1702. package/dist/tool-actions.runtime-Cwxr2NmB.js +0 -534
  1703. package/dist/tool-plugin-DHZYdwyJ.d.ts +0 -77
  1704. package/dist/tool-resolution-DQpf531V.js +0 -149
  1705. package/dist/tool-split-ClZW5eN5.d.ts +0 -19
  1706. package/dist/tools-effective-inventory-BHxeIAri.js +0 -204
  1707. package/dist/tools-invoke-http-Bv2LES5Q.js +0 -67
  1708. package/dist/tools-invoke-shared-Cf_ifab9.js +0 -200
  1709. package/dist/transport-stream-D_pZ9Qwv.d.ts +0 -42
  1710. package/dist/tts-CjTcF0YS.js +0 -66
  1711. package/dist/tui-D3_WpyGV.js +0 -2
  1712. package/dist/tui-Y8IezK6P.js +0 -4709
  1713. package/dist/tui-backend-BIJbrfDK.js +0 -256
  1714. package/dist/tui-cli-YVLQJGLU.js +0 -37
  1715. package/dist/types-CnKegQ41.d.ts +0 -786
  1716. package/dist/types-Dyry5PA_2.d.ts +0 -3650
  1717. package/dist/types.public-AUFnQi6j.d.ts +0 -70
  1718. package/dist/update-cli-B7MOXy4Y.js +0 -3664
  1719. package/dist/video-generation-runtime-Cc8klYNS.d.ts +0 -21
  1720. package/dist/video-model-catalog-XG42YlJS.d.ts +0 -16
  1721. package/dist/vision-tools-kEwnV2UO.js +0 -1409
  1722. package/dist/web-search-DH1W_lfx.js +0 -62
  1723. package/dist/web-search-provider.runtime-BX9TezsY.js +0 -328
  1724. package/dist/web-search-provider.runtime-BhRjYeyp.js +0 -2
  1725. package/dist/webhook-targets--wGRjxMd.d.ts +0 -99
  1726. package/dist/xai-oauth-BZQ--94U.js +0 -479
  1727. package/dist/xai-user-agent-SpZaKTGR.js +0 -32
  1728. package/dist/zod-schema.core-BhLPa6BF.d.ts +0 -166
  1729. /package/dist/{accounts-CqgATPC-2.d.ts → accounts-CqgATPC-.d.ts} +0 -0
  1730. /package/dist/{acp-runtime-backend-DU5R8SXu.js → acp-runtime-backend-DHyoMnZY.js} +0 -0
  1731. /package/dist/{channel-actions-Ce2Sna1a.js → channel-actions-B5OPAiNK.js} +0 -0
  1732. /package/dist/{command-status-runtime-Cj5vB8lc.js → command-status-runtime-BqQvv1BR.js} +0 -0
  1733. /package/dist/{delegate-BeKeQwNR.js → delegate-B1QIF1j8.js} +0 -0
  1734. /package/dist/{dispatch-acp-DXlzEM_A.js → dispatch-acp-Ch9ZmM4b.js} +0 -0
  1735. /package/dist/{heartbeat-runner-Dncw_0KS.js → heartbeat-runner-BkgH94IS.js} +0 -0
  1736. /package/dist/{library-6cU4n1-c.js → library-DP1oARlw.js} +0 -0
  1737. /package/dist/{run-executor.runtime-DjwaphFT.js → run-executor.runtime-Czk4Lxkj.js} +0 -0
  1738. /package/dist/{video-generation-core-BVVgDSdq.d.ts → server-plugins-BVVgDSdq.d.ts} +0 -0
  1739. /package/dist/{shared-BE5PSFeb.js → shared-SiM6kZAE.js} +0 -0
  1740. /package/dist/{model-ref-mtPT-mlX.d.ts → video-generation-core-mtPT-mlX.d.ts} +0 -0
@@ -1,4377 +0,0 @@
1
- import { a as normalizeLowercaseStringOrEmpty, c as normalizeOptionalString, d as normalizeStringifiedOptionalString } from "./string-coerce-DyL154ka.js";
2
- import { b as escapeRegExp } from "./utils-CNnMhEDp.js";
3
- import { F as resolveSessionStoreEntry } from "./store-load-BIBESNhm.js";
4
- import { a as getReplyPayloadTtsSupplement, n as buildTtsSupplementMediaPayload } from "./reply-payload-CiT5mlcY.js";
5
- import { i as writeJsonFileAtomically, n as readJsonFileWithFallback } from "./json-store-GaAZLixM.js";
6
- import { a as createChannelProgressDraftGate, c as formatChannelProgressDraftText, f as mergeChannelProgressDraftLine, i as buildChannelProgressDraftLineForEntry, o as formatChannelProgressDraftLine, p as normalizeChannelProgressDraftLineIdentity, s as formatChannelProgressDraftLineForEntry, u as isChannelProgressDraftWorkToolName, y as resolveChannelProgressDraftMaxLines } from "./channel-streaming-BubngPMB.js";
7
- import { a as resolveInboundLastRouteSessionKey } from "./resolve-route-CRSNQKby.js";
8
- import { c as defineStableChannelIngressIdentity, n as createChannelIngressResolver } from "./runtime-GmtZRRes.js";
9
- import { a as warnMissingProviderGroupPolicyFallbackOnce, n as resolveAllowlistProviderRuntimeGroupPolicy, r as resolveDefaultGroupPolicy, t as GROUP_POLICY_BLOCKED_LABEL } from "./runtime-group-policy-CmZDlIwd.js";
10
- import { l as resolvePinnedMainDmOwnerFromAllowlist } from "./dm-policy-shared-DvyNntb4.js";
11
- import { r as getAgentScopedMediaLocalRoots } from "./local-roots-DI7BgXSz.js";
12
- import { t as resolveAckReaction } from "./identity-CQsFzQh6.js";
13
- import { a as deliverWithFinalizableLivePreviewAdapter, n as createPreviewMessageReceipt, r as defineFinalizableLivePreviewAdapter } from "./live-CF0ee90S.js";
14
- import { c as resolveThreadBindingMaxAgeMsForChannel, o as resolveThreadBindingIdleTimeoutMsForChannel } from "./thread-bindings-policy-Cp-PsRJi.js";
15
- import "./string-coerce-runtime-DcopKqDR.js";
16
- import "./routing-tpBhvjSA.js";
17
- import { o as buildInboundHistoryFromEntries } from "./history-tSxfyRRl.js";
18
- import { n as createReplyPrefixOptions } from "./reply-prefix-K-f78Oaj.js";
19
- import { t as createTypingCallbacks } from "./typing-C657onUT.js";
20
- import { i as mergePairLoopGuardConfig } from "./pair-loop-guard-runtime-jabAgbOL.js";
21
- import { n as hasFinalChannelTurnDispatch } from "./dispatch-result-BM3RYtx4.js";
22
- import { t as evaluateSupplementalContextVisibility } from "./context-visibility-C9pX_aod.js";
23
- import { a as waitUntilAbort } from "./channel-lifecycle.core-CDt0hRZR.js";
24
- import { c as buildAllowlistResolutionSummary, d as patchAllowlistUsersInConfigEntries, f as summarizeMapping, l as canonicalizeAllowlistWithResolvedIds, s as addAllowlistUserEntriesFromConfigEntry } from "./allow-from-BsbZfqm-.js";
25
- import { n as isDangerousNameMatchingEnabled } from "./dangerous-name-matching-jjAiM0PK.js";
26
- import "./reply-history-DtXwRuqo.js";
27
- import { t as CHANNEL_APPROVAL_NATIVE_RUNTIME_CONTEXT_CAPABILITY } from "./approval-handler-adapter-runtime-uo1rB4v-.js";
28
- import { r as registerChannelRuntimeContext } from "./channel-runtime-context-DnHILMVu.js";
29
- import { t as resolveChannelContextVisibilityMode } from "./context-visibility-Si-TIKp_.js";
30
- import "./inbound-reply-dispatch-D7NeeFC1.js";
31
- import "./security-runtime-ZkIitjef.js";
32
- import { n as createTransportActivityStatusPatch, t as createConnectedChannelStatusPatch } from "./gateway-runtime-B-wNGN_a.js";
33
- import { n as logInboundDrop, r as logTypingFailure } from "./logging-Dr3f0mtP.js";
34
- import "./channel-feedback-TFG-nswW.js";
35
- import { n as toLocationContext, t as formatLocationText } from "./location-B0jdizlz.js";
36
- import "./channel-lifecycle-CvrjfUlH.js";
37
- import "./channel-ingress-runtime-DztBpKpZ.js";
38
- import "./channel-message-BntYSBp1.js";
39
- import { t as loadSessionStore } from "./session-store-runtime-iBECMRQO.js";
40
- import "./text-utility-runtime-Ca71VHQh.js";
41
- import { t as isMatrixQualifiedUserId } from "./target-ids-1sTIwV96.js";
42
- import { a as resolveMatrixAccountConfig, i as resolveMatrixAccountAllowlistConfig } from "./account-config-_tvJJI4y.js";
43
- import { t as getMatrixRuntime } from "./runtime-ChnGj6Xz.js";
44
- import { n as resolveConfiguredMatrixBotUserIds } from "./accounts-BXZNanVm.js";
45
- import { n as normalizeMatrixUserId, r as resolveMatrixAllowListMatch, t as normalizeMatrixAllowList } from "./allowlist-wB-C9Dsd.js";
46
- import { r as isMatrixNotFoundError, t as formatMatrixErrorMessage } from "./errors-C_3OG-D5.js";
47
- import { n as resolveMatrixRoomConfig, t as resolveMatrixStoredSessionMeta } from "./session-store-metadata-DRJE3qKo.js";
48
- import { i as resolveMatrixStateFilePath } from "./storage-I9fr2eqM.js";
49
- import { a as sendMessageMatrix, g as isPollStartType, h as isPollEventType, p as formatPollAsText, t as chunkMatrixText, v as parsePollStartContent } from "./send-DfqUmHfs.js";
50
- import { o as MATRIX_DAOCORE_FINALIZED_PREVIEW_KEY, r as promoteMatrixDirectRoomCandidate } from "./direct-management-BE4UOcoE.js";
51
- import { o as readJoinedMatrixMembers, r as isStrictDirectMembership, t as hasDirectMatrixMemberFlag } from "./direct-room-BifRU7rS.js";
52
- import { t as createMatrixThreadBindingManager } from "./thread-bindings-DO7PMphR.js";
53
- import { t as createAsyncLock } from "./async-lock-BcLS4KOc.js";
54
- import { n as LogService } from "./logger-DprntjwP.js";
55
- import { i as isMatrixMediaSizeLimitError, r as MatrixMediaSizeLimitError } from "./http-client-CEwFh2q3.js";
56
- import { i as throwIfMatrixStartupAborted, r as isMatrixStartupAbortError } from "./startup-abort-B-YL8CNT.js";
57
- import { n as isMatrixReadySyncState, r as isMatrixTerminalSyncState, t as isMatrixDisconnectedSyncState } from "./sync-state-CWbp0QSY.js";
58
- import { a as resolveMatrixMessageBody, i as resolveMatrixMessageAttachment, n as formatMatrixMediaUnavailableText, r as formatMatrixMessageText, s as fetchMatrixPollSnapshot, t as formatMatrixMediaTooLargeText } from "./media-text-CuIsAAfa.js";
59
- import { n as setActiveMatrixClient } from "./active-client-oYl5IAAm.js";
60
- import { t as isBunRuntime } from "./runtime-BefyhPWv.js";
61
- import { n as resolveMatrixAuth, r as resolveMatrixAuthContext, t as backfillMatrixAuthDeviceIdAfterStartup } from "./config-DP4X3YNh.js";
62
- import { i as resolveSharedMatrixClient, n as releaseSharedClientInstance } from "./shared-BTyRWv20.js";
63
- import "./client-BjlUMYqD.js";
64
- import "./runtime-api-BCM7T4WV.js";
65
- import { t as resolveMatrixTargets } from "./resolve-targets-BDwStIfv.js";
66
- import { t as formatMatrixEncryptedEventDisabledWarning } from "./encryption-guidance-I4Uh5jlB.js";
67
- import { a as EventType, i as resolveMatrixThreadRouting, n as resolveMatrixReplyToEventId, o as RelationType, r as resolveMatrixThreadRootId, t as resolveMatrixInboundRoute } from "./route-DfOmmYzX.js";
68
- import { format } from "node:util";
69
- //#region extensions/matrix/src/matrix/monitor/auto-join.ts
70
- function registerMatrixAutoJoin(params) {
71
- const { client, accountConfig, runtime } = params;
72
- const core = getMatrixRuntime();
73
- const logVerbose = (message) => {
74
- if (!core.logging.shouldLogVerbose()) return;
75
- runtime.log?.(message);
76
- };
77
- const autoJoin = accountConfig.autoJoin ?? "off";
78
- const rawAllowlist = (accountConfig.autoJoinAllowlist ?? []).map((entry) => normalizeStringifiedOptionalString(entry)).filter((entry) => Boolean(entry));
79
- const autoJoinAllowlist = new Set(rawAllowlist);
80
- const allowedRoomIds = new Set(rawAllowlist.filter((entry) => entry.startsWith("!")));
81
- const allowedAliases = rawAllowlist.filter((entry) => entry.startsWith("#"));
82
- const resolvedAliasRoomIds = /* @__PURE__ */ new Map();
83
- if (autoJoin === "off") return;
84
- if (autoJoin === "always") logVerbose("matrix: auto-join enabled for all invites");
85
- else logVerbose("matrix: auto-join enabled for allowlist invites");
86
- const resolveAllowedAliasRoomId = async (alias) => {
87
- if (resolvedAliasRoomIds.has(alias)) return resolvedAliasRoomIds.get(alias) ?? null;
88
- const resolved = await params.client.resolveRoom(alias);
89
- if (resolved) resolvedAliasRoomIds.set(alias, resolved);
90
- return resolved;
91
- };
92
- const resolveAllowedAliasRoomIds = async () => {
93
- return (await Promise.all(allowedAliases.map(async (alias) => {
94
- try {
95
- return await resolveAllowedAliasRoomId(alias);
96
- } catch (err) {
97
- runtime.error?.(`matrix: failed resolving allowlisted alias ${alias}: ${String(err)}`);
98
- return null;
99
- }
100
- }))).filter((roomId) => Boolean(roomId));
101
- };
102
- client.on("room.invite", async (roomId, _inviteEvent) => {
103
- if (autoJoin === "allowlist") {
104
- const allowedAliasRoomIds = await resolveAllowedAliasRoomIds();
105
- if (!(autoJoinAllowlist.has("*") || allowedRoomIds.has(roomId) || allowedAliasRoomIds.some((resolvedRoomId) => resolvedRoomId === roomId))) {
106
- logVerbose(`matrix: invite ignored (not in allowlist) room=${roomId}`);
107
- return;
108
- }
109
- }
110
- try {
111
- await client.joinRoom(roomId);
112
- logVerbose(`matrix: joined room ${roomId}`);
113
- } catch (err) {
114
- runtime.error?.(`matrix: failed to join room ${roomId}: ${String(err)}`);
115
- }
116
- });
117
- }
118
- //#endregion
119
- //#region extensions/matrix/src/matrix/monitor/config.ts
120
- function normalizeMatrixUserLookupEntry(raw) {
121
- return raw.replace(/^matrix:/i, "").replace(/^user:/i, "").trim();
122
- }
123
- function normalizeMatrixRoomLookupEntry(raw) {
124
- return raw.replace(/^matrix:/i, "").replace(/^(room|channel):/i, "").trim();
125
- }
126
- function filterResolvedMatrixAllowlistEntries(entries) {
127
- return entries.filter((entry) => {
128
- const trimmed = entry.trim();
129
- if (!trimmed) return false;
130
- if (trimmed === "*") return true;
131
- return isMatrixQualifiedUserId(normalizeMatrixUserLookupEntry(trimmed));
132
- });
133
- }
134
- function filterFailClosedMatrixAllowlistEntries(entries) {
135
- return entries.filter((entry) => entry.trim().length > 0);
136
- }
137
- function listResolvedMatrixAllowlistEntries(params) {
138
- const resolvedEntries = [];
139
- const seen = /* @__PURE__ */ new Set();
140
- for (const entry of params.entries) {
141
- const input = String(entry).trim();
142
- if (!input || seen.has(input)) continue;
143
- seen.add(input);
144
- const resolved = params.resolvedMap.get(input);
145
- if (!resolved?.resolved || !resolved.id) continue;
146
- const id = normalizeMatrixUserId(resolved.id);
147
- if (isMatrixQualifiedUserId(id)) resolvedEntries.push({
148
- input,
149
- id
150
- });
151
- }
152
- return resolvedEntries;
153
- }
154
- function normalizeConfiguredMatrixAllowlistEntries(entries) {
155
- const normalized = [];
156
- for (const entry of entries ?? []) {
157
- const trimmed = String(entry).trim();
158
- if (trimmed) normalized.push(trimmed);
159
- }
160
- return normalized;
161
- }
162
- function isMatrixDangerousNameMatchingEnabled(params) {
163
- return isDangerousNameMatchingEnabled(resolveMatrixAccountConfig({
164
- cfg: params.cfg,
165
- accountId: params.accountId
166
- }));
167
- }
168
- function addUniqueMatrixAllowlistEntry(params) {
169
- const trimmed = params.entry.trim();
170
- if (!trimmed) return;
171
- const key = trimmed.toLowerCase();
172
- if (params.seen.has(key)) return;
173
- params.seen.add(key);
174
- params.entries.push(trimmed);
175
- }
176
- function resolveStableMatrixMonitorUserEntries(entries) {
177
- const directMatches = [];
178
- for (const entry of entries) {
179
- const input = String(entry).trim();
180
- if (!input) continue;
181
- const query = normalizeMatrixUserLookupEntry(input);
182
- if (!query || query === "*") continue;
183
- directMatches.push(isMatrixQualifiedUserId(query) ? {
184
- input,
185
- resolved: true,
186
- id: normalizeMatrixUserId(query)
187
- } : {
188
- input,
189
- resolved: false
190
- });
191
- }
192
- return buildAllowlistResolutionSummary(directMatches);
193
- }
194
- function logStableMatrixAllowlistUnresolved(params) {
195
- if (params.unresolved.length === 0) return;
196
- summarizeMapping(params.label, [], params.unresolved, params.runtime);
197
- params.runtime.log?.(`${params.label} entries must be full Matrix IDs (example: @user:server). Unresolved entries will not match any sender. To match Matrix display names, set channels.matrix.dangerouslyAllowNameMatching=true.`);
198
- }
199
- function resolveStableMatrixMonitorUserAllowlist(params) {
200
- const allowList = params.allowList;
201
- const resolution = resolveStableMatrixMonitorUserEntries(allowList);
202
- const canonicalized = canonicalizeAllowlistWithResolvedIds({
203
- existing: allowList,
204
- resolvedMap: resolution.resolvedMap
205
- });
206
- logStableMatrixAllowlistUnresolved({
207
- label: params.label,
208
- unresolved: resolution.unresolved,
209
- runtime: params.runtime
210
- });
211
- return {
212
- entries: params.failClosedOnUnresolved ? filterFailClosedMatrixAllowlistEntries(canonicalized) : filterResolvedMatrixAllowlistEntries(canonicalized),
213
- resolvedEntries: listResolvedMatrixAllowlistEntries({
214
- entries: allowList,
215
- resolvedMap: resolution.resolvedMap
216
- })
217
- };
218
- }
219
- async function resolveMatrixMonitorUserEntries(params) {
220
- const directMatches = [];
221
- const pending = [];
222
- for (const entry of params.entries) {
223
- const input = String(entry).trim();
224
- if (!input) continue;
225
- const query = normalizeMatrixUserLookupEntry(input);
226
- if (!query || query === "*") continue;
227
- if (isMatrixQualifiedUserId(query)) {
228
- directMatches.push({
229
- input,
230
- resolved: true,
231
- id: normalizeMatrixUserId(query)
232
- });
233
- continue;
234
- }
235
- pending.push({
236
- input,
237
- query
238
- });
239
- }
240
- (pending.length === 0 ? [] : await params.resolveTargets({
241
- cfg: params.cfg,
242
- accountId: params.accountId,
243
- inputs: pending.map((entry) => entry.query),
244
- kind: "user",
245
- runtime: params.runtime
246
- })).forEach((entry, index) => {
247
- const source = pending[index];
248
- if (!source) return;
249
- directMatches.push({
250
- input: source.input,
251
- resolved: entry.resolved,
252
- id: entry.id ? normalizeMatrixUserId(entry.id) : void 0
253
- });
254
- });
255
- return buildAllowlistResolutionSummary(directMatches);
256
- }
257
- async function resolveMatrixMonitorUserAllowlist(params) {
258
- const allowList = (params.list ?? []).map(String);
259
- if (allowList.length === 0) return {
260
- entries: allowList,
261
- resolvedEntries: []
262
- };
263
- if (!isMatrixDangerousNameMatchingEnabled({
264
- cfg: params.cfg,
265
- accountId: params.accountId
266
- })) return resolveStableMatrixMonitorUserAllowlist({
267
- allowList,
268
- failClosedOnUnresolved: params.failClosedOnUnresolved,
269
- label: params.label,
270
- runtime: params.runtime
271
- });
272
- const resolution = await resolveMatrixMonitorUserEntries({
273
- cfg: params.cfg,
274
- accountId: params.accountId,
275
- entries: allowList,
276
- runtime: params.runtime,
277
- resolveTargets: params.resolveTargets
278
- });
279
- const canonicalized = canonicalizeAllowlistWithResolvedIds({
280
- existing: allowList,
281
- resolvedMap: resolution.resolvedMap
282
- });
283
- summarizeMapping(params.label, resolution.mapping, resolution.unresolved, params.runtime);
284
- if (resolution.unresolved.length > 0) params.runtime.log?.(`${params.label} entries must be full Matrix IDs (example: @user:server). Unresolved entries will not match any sender.`);
285
- return {
286
- entries: params.failClosedOnUnresolved ? filterFailClosedMatrixAllowlistEntries(canonicalized) : filterResolvedMatrixAllowlistEntries(canonicalized),
287
- resolvedEntries: listResolvedMatrixAllowlistEntries({
288
- entries: allowList,
289
- resolvedMap: resolution.resolvedMap
290
- })
291
- };
292
- }
293
- async function resolveMatrixMonitorLiveUserAllowlist(params) {
294
- const liveEntries = normalizeConfiguredMatrixAllowlistEntries(params.entries);
295
- if (liveEntries.length === 0) return [];
296
- const allowNameMatching = isMatrixDangerousNameMatchingEnabled({
297
- cfg: params.cfg,
298
- accountId: params.accountId
299
- });
300
- const effective = [];
301
- const seen = /* @__PURE__ */ new Set();
302
- const startupByInput = new Map((params.startupResolvedEntries ?? []).map((entry) => [entry.input, entry.id]));
303
- const pending = [];
304
- for (const entry of liveEntries) {
305
- const query = normalizeMatrixUserLookupEntry(entry);
306
- if (entry === "*") {
307
- addUniqueMatrixAllowlistEntry({
308
- entries: effective,
309
- seen,
310
- entry
311
- });
312
- continue;
313
- }
314
- if (isMatrixQualifiedUserId(query)) {
315
- addUniqueMatrixAllowlistEntry({
316
- entries: effective,
317
- seen,
318
- entry: normalizeMatrixUserId(query)
319
- });
320
- continue;
321
- }
322
- const startupId = startupByInput.get(entry);
323
- if (allowNameMatching && startupId) {
324
- addUniqueMatrixAllowlistEntry({
325
- entries: effective,
326
- seen,
327
- entry: startupId
328
- });
329
- continue;
330
- }
331
- if (allowNameMatching) {
332
- pending.push(entry);
333
- continue;
334
- }
335
- if (params.failClosedOnUnresolved) addUniqueMatrixAllowlistEntry({
336
- entries: effective,
337
- seen,
338
- entry
339
- });
340
- }
341
- if (pending.length === 0) return effective;
342
- const canonicalized = canonicalizeAllowlistWithResolvedIds({
343
- existing: pending,
344
- resolvedMap: (await resolveMatrixMonitorUserEntries({
345
- cfg: params.cfg,
346
- accountId: params.accountId,
347
- entries: pending,
348
- runtime: params.runtime,
349
- resolveTargets: params.resolveTargets ?? resolveMatrixTargets
350
- })).resolvedMap
351
- });
352
- const resolvedEntries = params.failClosedOnUnresolved ? filterFailClosedMatrixAllowlistEntries(canonicalized) : filterResolvedMatrixAllowlistEntries(canonicalized);
353
- for (const entry of resolvedEntries) addUniqueMatrixAllowlistEntry({
354
- entries: effective,
355
- seen,
356
- entry
357
- });
358
- return effective;
359
- }
360
- async function resolveMatrixMonitorRoomsConfig(params) {
361
- const roomsConfig = params.roomsConfig;
362
- if (!roomsConfig || Object.keys(roomsConfig).length === 0) return roomsConfig;
363
- const mapping = [];
364
- const unresolved = [];
365
- const nextRooms = {};
366
- const allowNameMatching = isMatrixDangerousNameMatchingEnabled({
367
- cfg: params.cfg,
368
- accountId: params.accountId
369
- });
370
- if (roomsConfig["*"]) nextRooms["*"] = roomsConfig["*"];
371
- const pending = [];
372
- for (const [entry, roomConfig] of Object.entries(roomsConfig)) {
373
- if (entry === "*") continue;
374
- const input = entry.trim();
375
- if (!input) continue;
376
- const cleaned = normalizeMatrixRoomLookupEntry(input);
377
- if (!cleaned) {
378
- unresolved.push(entry);
379
- continue;
380
- }
381
- if (cleaned.startsWith("!") && cleaned.includes(":")) {
382
- if (!nextRooms[cleaned]) nextRooms[cleaned] = roomConfig;
383
- if (cleaned !== input) mapping.push(`${input}→${cleaned}`);
384
- continue;
385
- }
386
- if (!cleaned.startsWith("#") && !allowNameMatching) {
387
- unresolved.push(input);
388
- continue;
389
- }
390
- pending.push({
391
- input,
392
- query: cleaned,
393
- config: roomConfig
394
- });
395
- }
396
- if (pending.length > 0) (await params.resolveTargets({
397
- cfg: params.cfg,
398
- accountId: params.accountId,
399
- inputs: pending.map((entry) => entry.query),
400
- kind: "group",
401
- runtime: params.runtime
402
- })).forEach((entry, index) => {
403
- const source = pending[index];
404
- if (!source) return;
405
- if (entry.resolved && entry.id) {
406
- const roomKey = normalizeMatrixRoomLookupEntry(entry.id);
407
- if (!nextRooms[roomKey]) nextRooms[roomKey] = source.config;
408
- mapping.push(`${source.input}→${roomKey}`);
409
- } else unresolved.push(source.input);
410
- });
411
- summarizeMapping("matrix rooms", mapping, unresolved, params.runtime);
412
- if (unresolved.length > 0) params.runtime.log?.("matrix rooms must be room IDs or aliases (example: !room:server or #alias:server). Unresolved entries are ignored.");
413
- const roomUsers = /* @__PURE__ */ new Set();
414
- for (const roomConfig of Object.values(nextRooms)) addAllowlistUserEntriesFromConfigEntry(roomUsers, roomConfig);
415
- if (roomUsers.size === 0) return nextRooms;
416
- if (!allowNameMatching) {
417
- const resolution = resolveStableMatrixMonitorUserEntries(Array.from(roomUsers));
418
- logStableMatrixAllowlistUnresolved({
419
- label: "matrix room users",
420
- unresolved: resolution.unresolved,
421
- runtime: params.runtime
422
- });
423
- return patchAllowlistUsersInConfigEntries({
424
- entries: nextRooms,
425
- resolvedMap: resolution.resolvedMap,
426
- strategy: "canonicalize"
427
- });
428
- }
429
- const resolution = await resolveMatrixMonitorUserEntries({
430
- cfg: params.cfg,
431
- accountId: params.accountId,
432
- entries: Array.from(roomUsers),
433
- runtime: params.runtime,
434
- resolveTargets: params.resolveTargets
435
- });
436
- summarizeMapping("matrix room users", resolution.mapping, resolution.unresolved, params.runtime);
437
- if (resolution.unresolved.length > 0) params.runtime.log?.("matrix room users entries must be full Matrix IDs (example: @user:server). Unresolved entries will not match any sender.");
438
- return patchAllowlistUsersInConfigEntries({
439
- entries: nextRooms,
440
- resolvedMap: resolution.resolvedMap,
441
- strategy: "canonicalize"
442
- });
443
- }
444
- async function resolveMatrixMonitorConfig(params) {
445
- const resolveTargets = params.resolveTargets ?? resolveMatrixTargets;
446
- const [allowFrom, groupAllowFrom, roomsConfig] = await Promise.all([
447
- resolveMatrixMonitorUserAllowlist({
448
- cfg: params.cfg,
449
- accountId: params.accountId,
450
- label: "matrix dm allowlist",
451
- list: params.allowFrom,
452
- runtime: params.runtime,
453
- resolveTargets
454
- }),
455
- resolveMatrixMonitorUserAllowlist({
456
- cfg: params.cfg,
457
- accountId: params.accountId,
458
- label: "matrix group allowlist",
459
- list: params.groupAllowFrom,
460
- failClosedOnUnresolved: true,
461
- runtime: params.runtime,
462
- resolveTargets
463
- }),
464
- resolveMatrixMonitorRoomsConfig({
465
- cfg: params.cfg,
466
- accountId: params.accountId,
467
- roomsConfig: params.roomsConfig,
468
- runtime: params.runtime,
469
- resolveTargets
470
- })
471
- ]);
472
- return {
473
- allowFrom: allowFrom.entries,
474
- allowFromResolvedEntries: allowFrom.resolvedEntries,
475
- groupAllowFrom: groupAllowFrom.entries,
476
- groupAllowFromResolvedEntries: groupAllowFrom.resolvedEntries,
477
- roomsConfig
478
- };
479
- }
480
- //#endregion
481
- //#region extensions/matrix/src/matrix/monitor/direct.ts
482
- const DM_CACHE_TTL_MS = 3e4;
483
- const RECENT_INVITE_TTL_MS = 3e4;
484
- const MAX_TRACKED_DM_ROOMS = 1024;
485
- const MAX_TRACKED_DM_MEMBER_FLAGS = 2048;
486
- function rememberBounded$1(map, key, value, maxSize = MAX_TRACKED_DM_ROOMS) {
487
- map.set(key, value);
488
- if (map.size > maxSize) {
489
- const oldest = map.keys().next().value;
490
- if (typeof oldest === "string") map.delete(oldest);
491
- }
492
- }
493
- function createDirectRoomTracker(client, opts = {}) {
494
- const log = opts.log ?? (() => {});
495
- let lastDmUpdateMs = 0;
496
- let hasSeededDmCache = false;
497
- let cachedSelfUserId = null;
498
- const joinedMembersCache = /* @__PURE__ */ new Map();
499
- const directMemberFlagCache = /* @__PURE__ */ new Map();
500
- const recentInviteCandidates = /* @__PURE__ */ new Map();
501
- const locallyPromotedDirectRooms = /* @__PURE__ */ new Map();
502
- const ensureSelfUserId = async () => {
503
- if (cachedSelfUserId) return cachedSelfUserId;
504
- try {
505
- cachedSelfUserId = await client.getUserId();
506
- } catch {
507
- cachedSelfUserId = null;
508
- }
509
- return cachedSelfUserId;
510
- };
511
- const refreshDmCache = async () => {
512
- const now = Date.now();
513
- if (now - lastDmUpdateMs < DM_CACHE_TTL_MS) return;
514
- lastDmUpdateMs = now;
515
- hasSeededDmCache = await client.dms.update() || hasSeededDmCache;
516
- };
517
- const resolveJoinedMembers = async (roomId) => {
518
- const cached = joinedMembersCache.get(roomId);
519
- const now = Date.now();
520
- if (cached && now - cached.ts < DM_CACHE_TTL_MS) return cached.members;
521
- try {
522
- const normalized = await readJoinedMatrixMembers(client, roomId);
523
- if (!normalized) throw new Error("membership unavailable");
524
- rememberBounded$1(joinedMembersCache, roomId, {
525
- members: normalized,
526
- ts: now
527
- });
528
- return normalized;
529
- } catch (err) {
530
- log(`matrix: dm member lookup failed room=${roomId} (${String(err)})`);
531
- return null;
532
- }
533
- };
534
- const resolveDirectMemberFlag = async (roomId, userId) => {
535
- const normalizedUserId = userId?.trim();
536
- if (!normalizedUserId) return null;
537
- const cacheKey = `${roomId}\n${normalizedUserId}`;
538
- const cached = directMemberFlagCache.get(cacheKey);
539
- const now = Date.now();
540
- if (cached && now - cached.ts < DM_CACHE_TTL_MS) return cached.isDirect;
541
- const isDirect = await hasDirectMatrixMemberFlag(client, roomId, normalizedUserId);
542
- rememberBounded$1(directMemberFlagCache, cacheKey, {
543
- isDirect,
544
- ts: now
545
- }, MAX_TRACKED_DM_MEMBER_FLAGS);
546
- return isDirect;
547
- };
548
- const hasRecentInviteCandidate = (roomId, remoteUserId) => {
549
- const normalizedRemoteUserId = remoteUserId?.trim();
550
- if (!normalizedRemoteUserId) return false;
551
- const cached = recentInviteCandidates.get(roomId);
552
- if (!cached) return false;
553
- if (Date.now() - cached.ts >= RECENT_INVITE_TTL_MS) {
554
- recentInviteCandidates.delete(roomId);
555
- return false;
556
- }
557
- return cached.remoteUserId === normalizedRemoteUserId;
558
- };
559
- const canPromoteRecentInvite = async (roomId) => {
560
- try {
561
- return await opts.canPromoteRecentInvite?.(roomId) ?? true;
562
- } catch (err) {
563
- log(`matrix: recent invite promotion veto failed room=${roomId} (${String(err)})`);
564
- return false;
565
- }
566
- };
567
- const canPromoteUnmappedStrictRoom = async (roomId) => {
568
- try {
569
- return await opts.canPromoteUnmappedStrictRoom?.(roomId) ?? false;
570
- } catch (err) {
571
- log(`matrix: unmapped strict room promotion veto failed room=${roomId} (${String(err)})`);
572
- return false;
573
- }
574
- };
575
- const shouldKeepLocallyPromotedDirectRoom = async (roomId) => {
576
- try {
577
- return await opts.shouldKeepLocallyPromotedDirectRoom?.(roomId);
578
- } catch (err) {
579
- log(`matrix: local promotion keep-check failed room=${roomId} (${String(err)})`);
580
- return;
581
- }
582
- };
583
- const isExplicitlyConfiguredRoom = async (roomId) => {
584
- try {
585
- return await opts.isExplicitlyConfiguredRoom?.(roomId) ?? false;
586
- } catch (err) {
587
- log(`matrix: configured room check failed room=${roomId} (${String(err)})`);
588
- return true;
589
- }
590
- };
591
- const hasLocallyPromotedDirectRoom = (roomId, remoteUserId) => {
592
- const normalizedRemoteUserId = remoteUserId?.trim();
593
- if (!normalizedRemoteUserId) return false;
594
- return locallyPromotedDirectRooms.get(roomId)?.remoteUserId === normalizedRemoteUserId;
595
- };
596
- const rememberLocallyPromotedDirectRoom = (roomId, remoteUserId) => {
597
- const normalizedRemoteUserId = remoteUserId.trim();
598
- if (!normalizedRemoteUserId) return;
599
- rememberBounded$1(locallyPromotedDirectRooms, roomId, { remoteUserId: normalizedRemoteUserId });
600
- };
601
- return {
602
- invalidateRoom: (roomId) => {
603
- joinedMembersCache.delete(roomId);
604
- for (const key of directMemberFlagCache.keys()) if (key.startsWith(`${roomId}\n`)) directMemberFlagCache.delete(key);
605
- lastDmUpdateMs = 0;
606
- log(`matrix: invalidated dm cache room=${roomId}`);
607
- },
608
- rememberInvite: (roomId, remoteUserId) => {
609
- const normalizedRemoteUserId = remoteUserId.trim();
610
- if (!normalizedRemoteUserId) return;
611
- rememberBounded$1(recentInviteCandidates, roomId, {
612
- remoteUserId: normalizedRemoteUserId,
613
- ts: Date.now()
614
- });
615
- log(`matrix: remembered invite candidate room=${roomId} sender=${normalizedRemoteUserId}`);
616
- },
617
- isDirectMessage: async (params) => {
618
- const { roomId, senderId } = params;
619
- if (await isExplicitlyConfiguredRoom(roomId)) {
620
- log(`matrix: dm rejected via explicit room config room=${roomId}`);
621
- return false;
622
- }
623
- const selfUserId = params.selfUserId ?? await ensureSelfUserId();
624
- const joinedMembers = await resolveJoinedMembers(roomId);
625
- const strictDirectMembership = isStrictDirectMembership({
626
- selfUserId,
627
- remoteUserId: senderId,
628
- joinedMembers
629
- });
630
- try {
631
- await refreshDmCache();
632
- } catch (err) {
633
- log(`matrix: dm cache refresh failed (${String(err)})`);
634
- }
635
- if (client.dms.isDm(roomId)) {
636
- if (strictDirectMembership) {
637
- log(`matrix: dm detected via m.direct room=${roomId}`);
638
- return true;
639
- }
640
- log(`matrix: ignoring stale m.direct classification room=${roomId}`);
641
- }
642
- if (strictDirectMembership) {
643
- const directViaSelf = await resolveDirectMemberFlag(roomId, selfUserId);
644
- if (directViaSelf === true) {
645
- log(`matrix: dm detected via member state room=${roomId}`);
646
- return true;
647
- }
648
- if (directViaSelf === false) {
649
- log(`matrix: dm rejected via member state room=${roomId}`);
650
- return false;
651
- }
652
- if (!hasSeededDmCache) {
653
- log(`matrix: dm detected via exact 2-member fallback before dm cache seed room=${roomId}`);
654
- return true;
655
- }
656
- if (hasLocallyPromotedDirectRoom(roomId, senderId)) {
657
- if (await shouldKeepLocallyPromotedDirectRoom(roomId) !== false) {
658
- log(`matrix: dm detected via local promotion room=${roomId}`);
659
- return true;
660
- }
661
- locallyPromotedDirectRooms.delete(roomId);
662
- log(`matrix: local promotion cleared room=${roomId}`);
663
- }
664
- if (hasRecentInviteCandidate(roomId, senderId) && await canPromoteRecentInvite(roomId)) {
665
- const promotion = await promoteMatrixDirectRoomCandidate({
666
- client,
667
- remoteUserId: senderId ?? "",
668
- roomId,
669
- selfUserId
670
- });
671
- if (promotion.classifyAsDirect) {
672
- rememberLocallyPromotedDirectRoom(roomId, senderId ?? "");
673
- log(`matrix: dm detected via recent invite room=${roomId} reason=${promotion.reason} repaired=${String(promotion.repaired)}`);
674
- return true;
675
- }
676
- }
677
- if (await canPromoteUnmappedStrictRoom(roomId)) {
678
- const promotion = await promoteMatrixDirectRoomCandidate({
679
- client,
680
- remoteUserId: senderId ?? "",
681
- roomId,
682
- selfUserId
683
- });
684
- if (promotion.classifyAsDirect) {
685
- rememberLocallyPromotedDirectRoom(roomId, senderId ?? "");
686
- log(`matrix: dm detected via per-room strict fallback room=${roomId} reason=${promotion.reason} repaired=${String(promotion.repaired)}`);
687
- return true;
688
- }
689
- }
690
- }
691
- log(`matrix: dm check room=${roomId} result=group members=${joinedMembers?.length ?? "unknown"}`);
692
- return false;
693
- }
694
- };
695
- }
696
- //#endregion
697
- //#region extensions/matrix/src/matrix/monitor/access-state.ts
698
- function normalizeMatrixEntry(raw) {
699
- return normalizeMatrixAllowList([raw ?? ""])[0] ?? null;
700
- }
701
- const matrixIngressIdentity = defineStableChannelIngressIdentity({
702
- key: "sender-id",
703
- normalize: normalizeMatrixEntry,
704
- matchEntry({ subject, entry }) {
705
- const senderId = subject.identifiers[0]?.value;
706
- return entry.value === "*" || resolveMatrixAllowListMatch({
707
- allowList: [entry.value],
708
- userId: senderId ?? ""
709
- }).allowed;
710
- }
711
- });
712
- function resolveMatrixGroupIngress(params) {
713
- if (params.groupPolicy === "disabled") return {
714
- groupPolicy: "disabled",
715
- groupAllowFrom: []
716
- };
717
- if (params.effectiveRoomUsers.length > 0) return {
718
- groupPolicy: "allowlist",
719
- groupAllowFrom: params.effectiveRoomUsers
720
- };
721
- if (params.groupPolicy === "allowlist" && params.effectiveGroupAllowFrom.length > 0) return {
722
- groupPolicy: "allowlist",
723
- groupAllowFrom: params.effectiveGroupAllowFrom
724
- };
725
- return {
726
- groupPolicy: "open",
727
- groupAllowFrom: []
728
- };
729
- }
730
- async function resolveMatrixMonitorAccessState(params) {
731
- const dmPolicy = params.dmPolicy ?? "pairing";
732
- const groupPolicy = params.groupPolicy ?? "open";
733
- const effectiveGroupAllowFrom = normalizeMatrixAllowList(params.groupAllowFrom);
734
- const effectiveRoomUsers = normalizeMatrixAllowList(params.roomUsers);
735
- const groupIngress = resolveMatrixGroupIngress({
736
- groupPolicy,
737
- effectiveGroupAllowFrom,
738
- effectiveRoomUsers
739
- });
740
- const accountId = params.accountId ?? "default";
741
- const eventKind = params.eventKind ?? "message";
742
- return {
743
- effectiveGroupAllowFrom,
744
- effectiveRoomUsers,
745
- messageIngress: await createChannelIngressResolver({
746
- channelId: "matrix",
747
- accountId,
748
- identity: matrixIngressIdentity,
749
- readStoreAllowFrom: async () => params.storeAllowFrom
750
- }).message({
751
- subject: { stableId: params.senderId },
752
- conversation: {
753
- kind: params.isRoom ? "group" : "direct",
754
- id: params.isRoom ? "matrix-room" : "matrix-dm"
755
- },
756
- event: {
757
- kind: eventKind,
758
- authMode: "inbound",
759
- mayPair: params.isRoom ? false : eventKind === "message"
760
- },
761
- dmPolicy,
762
- groupPolicy: params.isRoom ? groupIngress.groupPolicy : "disabled",
763
- policy: { groupAllowFromFallbackToAllowFrom: false },
764
- allowFrom: params.allowFrom,
765
- ...params.isRoom ? { groupAllowFrom: groupIngress.groupAllowFrom } : {}
766
- }),
767
- accountId,
768
- senderId: params.senderId,
769
- isRoom: params.isRoom
770
- };
771
- }
772
- async function resolveMatrixMonitorCommandAccess(state, params) {
773
- const commandAllowFrom = state.isRoom ? [] : state.messageIngress.senderAccess.effectiveAllowFrom;
774
- const commandGroupAllowFrom = state.effectiveRoomUsers.length > 0 ? state.effectiveRoomUsers : state.effectiveGroupAllowFrom;
775
- return (await createChannelIngressResolver({
776
- channelId: "matrix",
777
- accountId: state.accountId,
778
- identity: matrixIngressIdentity
779
- }).command({
780
- subject: { stableId: state.senderId },
781
- conversation: {
782
- kind: state.isRoom ? "group" : "direct",
783
- id: state.isRoom ? "matrix-room" : "matrix-dm"
784
- },
785
- dmPolicy: "allowlist",
786
- groupPolicy: "allowlist",
787
- policy: { groupAllowFromFallbackToAllowFrom: false },
788
- allowFrom: commandAllowFrom,
789
- groupAllowFrom: commandGroupAllowFrom,
790
- command: {
791
- useAccessGroups: params.useAccessGroups,
792
- allowTextCommands: params.allowTextCommands,
793
- hasControlCommand: params.hasControlCommand,
794
- groupOwnerAllowFrom: "none",
795
- commandGroupAllowFromFallbackToAllowFrom: false
796
- }
797
- })).commandAccess;
798
- }
799
- //#endregion
800
- //#region extensions/matrix/src/matrix/monitor/verification-utils.ts
801
- const VERIFICATION_EVENT_PREFIX = "m.key.verification.";
802
- const VERIFICATION_REQUEST_MSGTYPE = "m.key.verification.request";
803
- const VERIFICATION_NOTICE_PREFIXES = [
804
- "Matrix verification request received from ",
805
- "Matrix verification is ready with ",
806
- "Matrix verification started with ",
807
- "Matrix verification completed with ",
808
- "Matrix verification cancelled by ",
809
- "Matrix verification SAS with "
810
- ];
811
- function trimMaybeString$1(input) {
812
- return normalizeOptionalString(input) ?? "";
813
- }
814
- function isMatrixVerificationEventType(type) {
815
- return trimMaybeString$1(type).startsWith(VERIFICATION_EVENT_PREFIX);
816
- }
817
- function isMatrixVerificationRequestMsgType(msgtype) {
818
- return trimMaybeString$1(msgtype) === VERIFICATION_REQUEST_MSGTYPE;
819
- }
820
- function isMatrixVerificationNoticeBody(body) {
821
- const text = trimMaybeString$1(body);
822
- return VERIFICATION_NOTICE_PREFIXES.some((prefix) => text.startsWith(prefix));
823
- }
824
- function isMatrixVerificationRoomMessage(content) {
825
- return isMatrixVerificationRequestMsgType(content.msgtype) || trimMaybeString$1(content.msgtype) === "m.notice" && isMatrixVerificationNoticeBody(content.body);
826
- }
827
- const matrixVerificationConstants = {
828
- eventPrefix: VERIFICATION_EVENT_PREFIX,
829
- requestMsgtype: VERIFICATION_REQUEST_MSGTYPE
830
- };
831
- //#endregion
832
- //#region extensions/matrix/src/matrix/monitor/verification-events.ts
833
- const MAX_TRACKED_VERIFICATION_EVENTS = 1024;
834
- const SAS_NOTICE_RETRY_DELAY_MS = 750;
835
- const VERIFICATION_EVENT_STARTUP_GRACE_MS = 3e4;
836
- let matrixDirectRoomDepsPromise;
837
- async function loadMatrixDirectRoomDeps() {
838
- matrixDirectRoomDepsPromise ??= Promise.all([import("./direct-management-COFmFhJf.js"), import("./direct-room-o6lvHwv6.js")]).then(([directManagementModule, directRoomModule]) => ({
839
- inspectMatrixDirectRooms: directManagementModule.inspectMatrixDirectRooms,
840
- isStrictDirectRoom: directRoomModule.isStrictDirectRoom
841
- }));
842
- return await matrixDirectRoomDepsPromise;
843
- }
844
- function trimMaybeString(input) {
845
- if (typeof input !== "string") return null;
846
- const trimmed = input.trim();
847
- return trimmed.length > 0 ? trimmed : null;
848
- }
849
- function readVerificationSignal(event) {
850
- const type = trimMaybeString(event?.type) ?? "";
851
- const content = event?.content ?? {};
852
- const msgtype = trimMaybeString(content.msgtype) ?? "";
853
- const relatedEventId = trimMaybeString(content["m.relates_to"]?.event_id);
854
- const transactionId = trimMaybeString(content.transaction_id);
855
- if (type === EventType.RoomMessage && isMatrixVerificationRequestMsgType(msgtype)) return {
856
- stage: "request",
857
- flowId: trimMaybeString(event.event_id) ?? transactionId ?? relatedEventId
858
- };
859
- if (!isMatrixVerificationEventType(type)) return null;
860
- const flowId = transactionId ?? relatedEventId ?? trimMaybeString(event.event_id);
861
- if (type === `${matrixVerificationConstants.eventPrefix}request`) return {
862
- stage: "request",
863
- flowId
864
- };
865
- if (type === `${matrixVerificationConstants.eventPrefix}ready`) return {
866
- stage: "ready",
867
- flowId
868
- };
869
- if (type === "m.key.verification.start") return {
870
- stage: "start",
871
- flowId
872
- };
873
- if (type === "m.key.verification.cancel") return {
874
- stage: "cancel",
875
- flowId
876
- };
877
- if (type === "m.key.verification.done") return {
878
- stage: "done",
879
- flowId
880
- };
881
- return {
882
- stage: "other",
883
- flowId
884
- };
885
- }
886
- function formatVerificationStageNotice(params) {
887
- const { stage, senderId, event } = params;
888
- const content = event.content;
889
- switch (stage) {
890
- case "request": return `Matrix verification request received from ${senderId}. Open "Verify by emoji" in your Matrix client to continue.`;
891
- case "ready": return `Matrix verification is ready with ${senderId}. Choose "Verify by emoji" to reveal the emoji sequence.`;
892
- case "start": return `Matrix verification started with ${senderId}.`;
893
- case "done": return `Matrix verification completed with ${senderId}.`;
894
- case "cancel": {
895
- const code = trimMaybeString(content.code);
896
- const reason = trimMaybeString(content.reason);
897
- if (code && reason) return `Matrix verification cancelled by ${senderId} (${code}: ${reason}).`;
898
- if (reason) return `Matrix verification cancelled by ${senderId} (${reason}).`;
899
- return `Matrix verification cancelled by ${senderId}.`;
900
- }
901
- default: return null;
902
- }
903
- }
904
- function formatVerificationSasNotice(summary) {
905
- const sas = summary.sas;
906
- if (!sas) return null;
907
- const emojiLine = Array.isArray(sas.emoji) && sas.emoji.length > 0 ? `SAS emoji: ${sas.emoji.map(([emoji, name]) => `${trimMaybeString(emoji) ?? "?"} ${trimMaybeString(name) ?? "?"}`).join(" | ")}` : null;
908
- const decimalLine = Array.isArray(sas.decimal) && sas.decimal.length === 3 ? `SAS decimal: ${sas.decimal.join(" ")}` : null;
909
- if (!emojiLine && !decimalLine) return null;
910
- const lines = [`Matrix verification SAS with ${summary.otherUserId}:`];
911
- if (emojiLine) lines.push(emojiLine);
912
- if (decimalLine) lines.push(decimalLine);
913
- lines.push("If both sides match, choose 'They match' in your Matrix app.");
914
- return lines.join("\n");
915
- }
916
- function resolveVerificationFlowCandidates(params) {
917
- const { event, flowId } = params;
918
- const content = event.content;
919
- const candidates = /* @__PURE__ */ new Set();
920
- const add = (value) => {
921
- const normalized = trimMaybeString(value);
922
- if (normalized) candidates.add(normalized);
923
- };
924
- add(flowId);
925
- add(event.event_id);
926
- add(content.transaction_id);
927
- add(content["m.relates_to"]?.event_id);
928
- return Array.from(candidates);
929
- }
930
- function resolveSummaryRecency(summary) {
931
- const ts = Date.parse(summary.updatedAt ?? "");
932
- return Number.isFinite(ts) ? ts : 0;
933
- }
934
- function isActiveVerificationSummary(summary) {
935
- if (summary.completed === true) return false;
936
- if (summary.phaseName === "cancelled" || summary.phaseName === "done") return false;
937
- if (typeof summary.phase === "number" && summary.phase >= 4) return false;
938
- return true;
939
- }
940
- async function resolveVerificationSummaryForSignal(client, params) {
941
- if (!client.crypto) return null;
942
- await client.crypto.ensureVerificationDmTracked({
943
- roomId: params.roomId,
944
- userId: params.senderId
945
- }).catch(() => null);
946
- const list = await client.crypto.listVerifications();
947
- if (list.length === 0) return null;
948
- const candidates = resolveVerificationFlowCandidates({
949
- event: params.event,
950
- flowId: params.flowId
951
- });
952
- const byTransactionId = list.find((entry) => candidates.some((candidate) => entry.transactionId === candidate));
953
- if (byTransactionId) return byTransactionId;
954
- const { inspectMatrixDirectRooms, isStrictDirectRoom } = await loadMatrixDirectRoomDeps();
955
- const activeRoomId = trimMaybeString((await inspectMatrixDirectRooms({
956
- client,
957
- remoteUserId: params.senderId
958
- }).catch(() => null))?.activeRoomId);
959
- if (activeRoomId) {
960
- if (activeRoomId !== params.roomId) return null;
961
- } else if (!await isStrictDirectRoom({
962
- client,
963
- roomId: params.roomId,
964
- remoteUserId: params.senderId
965
- })) return null;
966
- const activeByUser = list.filter((entry) => entry.otherUserId === params.senderId && isActiveVerificationSummary(entry)).toSorted((a, b) => resolveSummaryRecency(b) - resolveSummaryRecency(a));
967
- const activeInRoom = activeByUser.filter((entry) => {
968
- return trimMaybeString(entry.roomId) === params.roomId;
969
- });
970
- if (activeInRoom.length > 0) return activeInRoom[0] ?? null;
971
- return activeByUser[0] ?? null;
972
- }
973
- async function resolveVerificationSasNoticeForSignal(client, params) {
974
- const summary = await resolveVerificationSummaryForSignal(client, params);
975
- const immediateNotice = summary && isActiveVerificationSummary(summary) ? formatVerificationSasNotice(summary) : null;
976
- if (immediateNotice || params.stage !== "ready" && params.stage !== "start") return {
977
- summary,
978
- sasNotice: immediateNotice
979
- };
980
- await new Promise((resolve) => setTimeout(resolve, params.sasNoticeRetryDelayMs ?? SAS_NOTICE_RETRY_DELAY_MS));
981
- const retriedSummary = await resolveVerificationSummaryForSignal(client, params);
982
- return {
983
- summary: retriedSummary,
984
- sasNotice: retriedSummary && isActiveVerificationSummary(retriedSummary) ? formatVerificationSasNotice(retriedSummary) : null
985
- };
986
- }
987
- function trackBounded(set, value) {
988
- if (!value || set.has(value)) return false;
989
- set.add(value);
990
- if (set.size > MAX_TRACKED_VERIFICATION_EVENTS) {
991
- const oldest = set.values().next().value;
992
- if (typeof oldest === "string") set.delete(oldest);
993
- }
994
- return true;
995
- }
996
- async function sendVerificationNotice(params) {
997
- const roomId = trimMaybeString(params.roomId);
998
- if (!roomId) return;
999
- try {
1000
- await params.client.sendMessage(roomId, {
1001
- msgtype: "m.notice",
1002
- body: params.body
1003
- });
1004
- } catch (err) {
1005
- params.logVerboseMessage(`matrix: failed sending verification notice room=${roomId}: ${String(err)}`);
1006
- }
1007
- }
1008
- async function isVerificationNoticeAuthorized(params) {
1009
- if (!params.dmEnabled || params.dmPolicy === "disabled") {
1010
- params.logVerboseMessage(`matrix: blocked verification sender ${params.senderId} (dmPolicy=${params.dmPolicy}, dmEnabled=${String(params.dmEnabled)})`);
1011
- return false;
1012
- }
1013
- const storeAllowFrom = params.dmPolicy !== "allowlist" && params.dmPolicy !== "open" ? await params.readStoreAllowFrom() : [];
1014
- if ((await resolveMatrixMonitorAccessState({
1015
- allowFrom: params.allowFrom,
1016
- storeAllowFrom,
1017
- dmPolicy: params.dmPolicy,
1018
- groupPolicy: "open",
1019
- groupAllowFrom: [],
1020
- roomUsers: [],
1021
- senderId: params.senderId,
1022
- isRoom: false
1023
- })).messageIngress.senderAccess.decision === "allow") return true;
1024
- params.logVerboseMessage(`matrix: blocked verification sender ${params.senderId} (dmPolicy=${params.dmPolicy})`);
1025
- return false;
1026
- }
1027
- function createMatrixVerificationEventRouter(params) {
1028
- const routerStartedAtMs = Date.now();
1029
- const routedVerificationEvents = /* @__PURE__ */ new Set();
1030
- const routedVerificationSasFingerprints = /* @__PURE__ */ new Set();
1031
- const routedVerificationStageNotices = /* @__PURE__ */ new Set();
1032
- const verificationFlowRooms = /* @__PURE__ */ new Map();
1033
- const verificationUserRooms = /* @__PURE__ */ new Map();
1034
- async function resolveActiveDirectRoomId(remoteUserId) {
1035
- const { inspectMatrixDirectRooms } = await loadMatrixDirectRoomDeps();
1036
- return trimMaybeString((await inspectMatrixDirectRooms({
1037
- client: params.client,
1038
- remoteUserId
1039
- }).catch(() => null))?.activeRoomId);
1040
- }
1041
- function shouldEmitVerificationEventNotice(event) {
1042
- const eventTs = typeof event.origin_server_ts === "number" && Number.isFinite(event.origin_server_ts) ? event.origin_server_ts : null;
1043
- if (eventTs === null) return true;
1044
- return eventTs >= routerStartedAtMs - VERIFICATION_EVENT_STARTUP_GRACE_MS;
1045
- }
1046
- function rememberVerificationRoom(roomId, event, flowId) {
1047
- for (const candidate of resolveVerificationFlowCandidates({
1048
- event,
1049
- flowId
1050
- })) {
1051
- verificationFlowRooms.set(candidate, roomId);
1052
- if (verificationFlowRooms.size > MAX_TRACKED_VERIFICATION_EVENTS) {
1053
- const oldest = verificationFlowRooms.keys().next().value;
1054
- if (typeof oldest === "string") verificationFlowRooms.delete(oldest);
1055
- }
1056
- }
1057
- }
1058
- function rememberVerificationUserRoom(remoteUserId, roomId) {
1059
- const normalizedUserId = trimMaybeString(remoteUserId);
1060
- const normalizedRoomId = trimMaybeString(roomId);
1061
- if (!normalizedUserId || !normalizedRoomId) return;
1062
- verificationUserRooms.delete(normalizedUserId);
1063
- verificationUserRooms.set(normalizedUserId, normalizedRoomId);
1064
- if (verificationUserRooms.size > MAX_TRACKED_VERIFICATION_EVENTS) {
1065
- const oldest = verificationUserRooms.keys().next().value;
1066
- if (typeof oldest === "string") verificationUserRooms.delete(oldest);
1067
- }
1068
- }
1069
- async function resolveSummaryRoomId(summary) {
1070
- const mappedRoomId = trimMaybeString(summary.roomId) ?? trimMaybeString(summary.transactionId ? verificationFlowRooms.get(summary.transactionId) : null) ?? trimMaybeString(verificationFlowRooms.get(summary.id));
1071
- if (mappedRoomId) return mappedRoomId;
1072
- const remoteUserId = trimMaybeString(summary.otherUserId);
1073
- if (!remoteUserId) return null;
1074
- const recentRoomId = trimMaybeString(verificationUserRooms.get(remoteUserId));
1075
- const activeRoomId = await resolveActiveDirectRoomId(remoteUserId);
1076
- if (recentRoomId && activeRoomId && recentRoomId === activeRoomId) return recentRoomId;
1077
- if (activeRoomId) return activeRoomId;
1078
- if (recentRoomId && await (await loadMatrixDirectRoomDeps()).isStrictDirectRoom({
1079
- client: params.client,
1080
- roomId: recentRoomId,
1081
- remoteUserId
1082
- })) return recentRoomId;
1083
- return null;
1084
- }
1085
- async function routeVerificationSummary(summary) {
1086
- const roomId = await resolveSummaryRoomId(summary);
1087
- if (!roomId || !isActiveVerificationSummary(summary)) return;
1088
- if (!await (await loadMatrixDirectRoomDeps()).isStrictDirectRoom({
1089
- client: params.client,
1090
- roomId,
1091
- remoteUserId: summary.otherUserId
1092
- })) {
1093
- params.logVerboseMessage(`matrix: ignoring verification summary outside strict DM room=${roomId} sender=${summary.otherUserId}`);
1094
- return;
1095
- }
1096
- if (!await isVerificationNoticeAuthorized({
1097
- senderId: summary.otherUserId,
1098
- allowFrom: params.allowFrom,
1099
- dmEnabled: params.dmEnabled,
1100
- dmPolicy: params.dmPolicy,
1101
- readStoreAllowFrom: params.readStoreAllowFrom,
1102
- logVerboseMessage: params.logVerboseMessage
1103
- })) return;
1104
- const sasNotice = formatVerificationSasNotice(summary);
1105
- if (!sasNotice) return;
1106
- if (!trackBounded(routedVerificationSasFingerprints, `${summary.id}:${JSON.stringify(summary.sas)}`)) return;
1107
- await sendVerificationNotice({
1108
- client: params.client,
1109
- roomId,
1110
- body: sasNotice,
1111
- logVerboseMessage: params.logVerboseMessage
1112
- });
1113
- }
1114
- function routeVerificationEvent(roomId, event) {
1115
- const senderId = trimMaybeString(event?.sender);
1116
- if (!senderId) return false;
1117
- const signal = readVerificationSignal(event);
1118
- if (!signal) return false;
1119
- rememberVerificationRoom(roomId, event, signal.flowId);
1120
- const routeTask = async () => {
1121
- if (!shouldEmitVerificationEventNotice(event)) {
1122
- params.logVerboseMessage(`matrix: ignoring historical verification event room=${roomId} id=${event.event_id ?? "unknown"} type=${event.type ?? "unknown"}`);
1123
- return;
1124
- }
1125
- const flowId = signal.flowId;
1126
- const sourceFingerprint = trimMaybeString(event?.event_id) ?? `${senderId}:${event.type}:${flowId ?? "none"}`;
1127
- if (!await (await loadMatrixDirectRoomDeps()).isStrictDirectRoom({
1128
- client: params.client,
1129
- roomId,
1130
- remoteUserId: senderId
1131
- })) {
1132
- params.logVerboseMessage(`matrix: ignoring verification event outside strict DM room=${roomId} sender=${senderId}`);
1133
- return;
1134
- }
1135
- if (!await isVerificationNoticeAuthorized({
1136
- senderId,
1137
- allowFrom: params.allowFrom,
1138
- dmEnabled: params.dmEnabled,
1139
- dmPolicy: params.dmPolicy,
1140
- readStoreAllowFrom: params.readStoreAllowFrom,
1141
- logVerboseMessage: params.logVerboseMessage
1142
- })) return;
1143
- rememberVerificationUserRoom(senderId, roomId);
1144
- if (!trackBounded(routedVerificationEvents, sourceFingerprint)) return;
1145
- const stageNotice = formatVerificationStageNotice({
1146
- stage: signal.stage,
1147
- senderId,
1148
- event
1149
- });
1150
- const { summary, sasNotice } = await resolveVerificationSasNoticeForSignal(params.client, {
1151
- roomId,
1152
- event,
1153
- senderId,
1154
- flowId,
1155
- stage: signal.stage,
1156
- sasNoticeRetryDelayMs: params.sasNoticeRetryDelayMs
1157
- }).catch(() => ({
1158
- summary: null,
1159
- sasNotice: null
1160
- }));
1161
- const notices = [];
1162
- if (stageNotice) {
1163
- if (trackBounded(routedVerificationStageNotices, `${roomId}:${senderId}:${flowId ?? sourceFingerprint}:${signal.stage}`)) notices.push(stageNotice);
1164
- }
1165
- if (summary && sasNotice) {
1166
- if (trackBounded(routedVerificationSasFingerprints, `${summary.id}:${JSON.stringify(summary.sas)}`)) notices.push(sasNotice);
1167
- }
1168
- if (notices.length === 0) return;
1169
- for (const body of notices) await sendVerificationNotice({
1170
- client: params.client,
1171
- roomId,
1172
- body,
1173
- logVerboseMessage: params.logVerboseMessage
1174
- });
1175
- };
1176
- if (params.runDetachedTask) params.runDetachedTask(`verification event handler room=${roomId} id=${event.event_id ?? "unknown"}`, routeTask);
1177
- else routeTask().catch((err) => {
1178
- params.logVerboseMessage(`matrix: failed routing verification event: ${String(err)}`);
1179
- });
1180
- return true;
1181
- }
1182
- return {
1183
- routeVerificationEvent,
1184
- routeVerificationSummary
1185
- };
1186
- }
1187
- //#endregion
1188
- //#region extensions/matrix/src/matrix/monitor/events.ts
1189
- const MATRIX_POST_HEALTHY_SYNC_DECRYPT_FAILURE_WINDOW_MS = 2 * 6e4;
1190
- const MATRIX_POST_HEALTHY_SYNC_DECRYPT_FAILURE_THRESHOLD = 3;
1191
- const MATRIX_POST_HEALTHY_SYNC_DECRYPT_FAILURE_SAMPLE_LIMIT = 3;
1192
- function formatMatrixPostHealthySyncDecryptionHint(accountId) {
1193
- return `matrix: repeated fresh encrypted messages are still failing to decrypt after Matrix resumed healthy sync. This device may still be missing new room keys. Check 'daocore matrix verify status --verbose --account ${accountId}' and 'daocore matrix devices list --account ${accountId}'.`;
1194
- }
1195
- function isFreshPostHealthySyncDecryptFailure(params) {
1196
- const { event, healthySyncSinceMs, graceMs = 0, nowMs } = params;
1197
- if (typeof healthySyncSinceMs !== "number" || !Number.isFinite(healthySyncSinceMs)) return false;
1198
- const eventTs = event.origin_server_ts;
1199
- if (!Number.isFinite(eventTs) || eventTs <= 0) return false;
1200
- if (eventTs < healthySyncSinceMs + graceMs) return false;
1201
- if (eventTs > nowMs + 6e4) return false;
1202
- return true;
1203
- }
1204
- function createMatrixPostHealthySyncDecryptFailureTracker(params) {
1205
- let observations = [];
1206
- let warningEmitted = false;
1207
- let trackedHealthySyncSinceMs;
1208
- const resetObservations = () => {
1209
- observations = [];
1210
- warningEmitted = false;
1211
- };
1212
- const pruneObservations = (nowMs) => {
1213
- observations = observations.filter((entry) => nowMs - entry.eventTs <= MATRIX_POST_HEALTHY_SYNC_DECRYPT_FAILURE_WINDOW_MS);
1214
- if (observations.length === 0) warningEmitted = false;
1215
- };
1216
- return { recordFailure(roomId, event, error) {
1217
- const nowMs = Date.now();
1218
- const healthySyncSinceMs = params.getHealthySyncSinceMs?.();
1219
- if (healthySyncSinceMs !== trackedHealthySyncSinceMs) {
1220
- trackedHealthySyncSinceMs = healthySyncSinceMs;
1221
- resetObservations();
1222
- }
1223
- if (!isFreshPostHealthySyncDecryptFailure({
1224
- event,
1225
- healthySyncSinceMs,
1226
- graceMs: params.startupGraceMs,
1227
- nowMs
1228
- })) return {
1229
- freshAfterHealthySync: false,
1230
- failureCount: 0
1231
- };
1232
- pruneObservations(nowMs);
1233
- const key = `${roomId}|${event.event_id}`;
1234
- if (!observations.some((entry) => entry.key === key)) observations.push({
1235
- key,
1236
- roomId,
1237
- eventId: event.event_id,
1238
- sender: typeof event.sender === "string" ? event.sender : null,
1239
- eventTs: event.origin_server_ts,
1240
- error: error.message
1241
- });
1242
- const failureCount = observations.length;
1243
- if (warningEmitted || failureCount < MATRIX_POST_HEALTHY_SYNC_DECRYPT_FAILURE_THRESHOLD) return {
1244
- freshAfterHealthySync: true,
1245
- failureCount
1246
- };
1247
- warningEmitted = true;
1248
- const rooms = [...new Set(observations.map((entry) => entry.roomId))].slice(0, MATRIX_POST_HEALTHY_SYNC_DECRYPT_FAILURE_SAMPLE_LIMIT);
1249
- const senders = [...new Set(observations.map((entry) => entry.sender).filter(Boolean))].slice(0, MATRIX_POST_HEALTHY_SYNC_DECRYPT_FAILURE_SAMPLE_LIMIT);
1250
- const eventIds = observations.slice(-3).map((entry) => entry.eventId);
1251
- const latestError = observations.at(-1)?.error ?? error.message;
1252
- return {
1253
- freshAfterHealthySync: true,
1254
- failureCount,
1255
- warning: {
1256
- rooms,
1257
- roomCount: new Set(observations.map((entry) => entry.roomId)).size,
1258
- senders,
1259
- senderCount: new Set(observations.map((entry) => entry.sender).filter(Boolean)).size,
1260
- eventIds,
1261
- latestError,
1262
- windowMs: MATRIX_POST_HEALTHY_SYNC_DECRYPT_FAILURE_WINDOW_MS
1263
- }
1264
- };
1265
- } };
1266
- }
1267
- function formatMatrixSelfDecryptionHint(accountId) {
1268
- return `matrix: failed to decrypt a message from this same Matrix user. This usually means another Matrix device did not share the room key, or another DaoCore runtime is using the same account. Check 'daocore matrix verify status --verbose --account ${accountId}' and 'daocore matrix devices list --account ${accountId}'.`;
1269
- }
1270
- async function resolveMatrixSelfUserId(client, logVerboseMessage) {
1271
- if (typeof client.getUserId !== "function") return null;
1272
- try {
1273
- return await client.getUserId() ?? null;
1274
- } catch (err) {
1275
- logVerboseMessage(`matrix: failed resolving self user id for decrypt warning: ${String(err)}`);
1276
- return null;
1277
- }
1278
- }
1279
- function registerMatrixMonitorEvents(params) {
1280
- const { cfg, client, auth, allowFrom, dmEnabled, dmPolicy, readStoreAllowFrom, directTracker, logVerboseMessage, warnedEncryptedRooms, warnedCryptoMissingRooms, logger, startupGraceMs, getHealthySyncSinceMs, formatNativeDependencyHint, onRoomMessage, runDetachedTask, sasNoticeRetryDelayMs } = params;
1281
- const postHealthySyncDecryptFailureTracker = createMatrixPostHealthySyncDecryptFailureTracker({
1282
- getHealthySyncSinceMs,
1283
- startupGraceMs
1284
- });
1285
- const { routeVerificationEvent, routeVerificationSummary } = createMatrixVerificationEventRouter({
1286
- client,
1287
- allowFrom,
1288
- dmEnabled,
1289
- dmPolicy,
1290
- readStoreAllowFrom,
1291
- logVerboseMessage,
1292
- runDetachedTask,
1293
- sasNoticeRetryDelayMs
1294
- });
1295
- const runMonitorTask = (label, task) => {
1296
- if (runDetachedTask) return runDetachedTask(label, task);
1297
- return Promise.resolve().then(task).catch((error) => {
1298
- logVerboseMessage(`matrix: ${label} failed (${String(error)})`);
1299
- });
1300
- };
1301
- client.on("room.message", (roomId, event) => {
1302
- if (routeVerificationEvent(roomId, event)) return;
1303
- runMonitorTask(`room message handler room=${roomId} id=${event.event_id ?? "unknown"}`, async () => {
1304
- await onRoomMessage(roomId, event);
1305
- });
1306
- });
1307
- client.on("room.encrypted_event", (roomId, event) => {
1308
- const eventId = event?.event_id ?? "unknown";
1309
- logVerboseMessage(`matrix: encrypted event room=${roomId} type=${event?.type ?? "unknown"} id=${eventId}`);
1310
- });
1311
- client.on("room.decrypted_event", (roomId, event) => {
1312
- const eventId = event?.event_id ?? "unknown";
1313
- const eventType = event?.type ?? "unknown";
1314
- logVerboseMessage(`matrix: decrypted event room=${roomId} type=${eventType} id=${eventId}`);
1315
- if (routeVerificationEvent(roomId, event)) return;
1316
- if (eventType !== EventType.RoomMessage) return;
1317
- runMonitorTask(`decrypted room message handler room=${roomId} id=${event.event_id ?? "unknown"}`, async () => {
1318
- await onRoomMessage(roomId, event);
1319
- });
1320
- });
1321
- client.on("room.failed_decryption", async (roomId, event, error) => {
1322
- const failureState = postHealthySyncDecryptFailureTracker.recordFailure(roomId, event, error);
1323
- const selfUserId = await resolveMatrixSelfUserId(client, logVerboseMessage);
1324
- const sender = typeof event.sender === "string" ? event.sender : null;
1325
- const senderMatchesOwnUser = Boolean(selfUserId && sender && selfUserId === sender);
1326
- logger.warn(failureState.freshAfterHealthySync ? "Failed to decrypt fresh post-healthy-sync message" : "Failed to decrypt message", {
1327
- roomId,
1328
- eventId: event.event_id,
1329
- sender,
1330
- senderMatchesOwnUser,
1331
- error: error.message,
1332
- freshAfterHealthySync: failureState.freshAfterHealthySync,
1333
- ...failureState.freshAfterHealthySync ? { postHealthySyncFailureCount: failureState.failureCount } : {}
1334
- });
1335
- if (failureState.warning) logger.warn(formatMatrixPostHealthySyncDecryptionHint(auth.accountId), {
1336
- roomId,
1337
- eventId: event.event_id,
1338
- failureCount: failureState.failureCount,
1339
- roomCount: failureState.warning.roomCount,
1340
- rooms: failureState.warning.rooms,
1341
- senderCount: failureState.warning.senderCount,
1342
- senders: failureState.warning.senders,
1343
- sampleEventIds: failureState.warning.eventIds,
1344
- latestError: failureState.warning.latestError,
1345
- windowMs: failureState.warning.windowMs
1346
- });
1347
- if (senderMatchesOwnUser) logger.warn(formatMatrixSelfDecryptionHint(auth.accountId), {
1348
- roomId,
1349
- eventId: event.event_id,
1350
- sender
1351
- });
1352
- logVerboseMessage(`matrix: failed decrypt room=${roomId} id=${event.event_id ?? "unknown"} freshAfterHealthySync=${String(failureState.freshAfterHealthySync)} error=${error.message}`);
1353
- });
1354
- client.on("verification.summary", (summary) => {
1355
- runMonitorTask("verification summary handler", async () => {
1356
- await routeVerificationSummary(summary);
1357
- });
1358
- });
1359
- client.on("room.invite", (roomId, event) => {
1360
- directTracker?.invalidateRoom(roomId);
1361
- const eventId = event?.event_id ?? "unknown";
1362
- const sender = event?.sender ?? "unknown";
1363
- const invitee = normalizeOptionalString(event?.state_key) ?? "";
1364
- const senderIsInvitee = Boolean(invitee) && (normalizeOptionalString(event?.sender) ?? "") === invitee;
1365
- const isDirect = (event?.content)?.is_direct === true;
1366
- const rememberedSender = normalizeOptionalString(event?.sender);
1367
- if (rememberedSender && !senderIsInvitee) directTracker?.rememberInvite?.(roomId, rememberedSender);
1368
- logVerboseMessage(`matrix: invite room=${roomId} sender=${sender} direct=${String(isDirect)} id=${eventId}`);
1369
- });
1370
- client.on("room.join", (roomId, event) => {
1371
- directTracker?.invalidateRoom(roomId);
1372
- logVerboseMessage(`matrix: join room=${roomId} id=${event?.event_id ?? "unknown"}`);
1373
- });
1374
- client.on("room.event", (roomId, event) => {
1375
- const eventType = event?.type ?? "unknown";
1376
- if (eventType === EventType.RoomMessageEncrypted) {
1377
- logVerboseMessage(`matrix: encrypted raw event room=${roomId} id=${event?.event_id ?? "unknown"}`);
1378
- if (auth.encryption !== true && !warnedEncryptedRooms.has(roomId)) {
1379
- warnedEncryptedRooms.add(roomId);
1380
- const warning = formatMatrixEncryptedEventDisabledWarning(cfg, auth.accountId);
1381
- logger.warn(warning, { roomId });
1382
- }
1383
- if (auth.encryption === true && !client.crypto && !warnedCryptoMissingRooms.has(roomId)) {
1384
- warnedCryptoMissingRooms.add(roomId);
1385
- const warning = `matrix: encryption enabled but crypto is unavailable; ${formatNativeDependencyHint({
1386
- packageName: "@matrix-org/matrix-sdk-crypto-nodejs",
1387
- manager: "pnpm",
1388
- downloadCommand: "node node_modules/@matrix-org/matrix-sdk-crypto-nodejs/download-lib.js"
1389
- })}`;
1390
- logger.warn(warning, { roomId });
1391
- }
1392
- return;
1393
- }
1394
- if (eventType === EventType.RoomMember) {
1395
- directTracker?.invalidateRoom(roomId);
1396
- const membership = (event?.content)?.membership;
1397
- logVerboseMessage(`matrix: member event room=${roomId} stateKey=${event.state_key ?? ""} membership=${membership ?? "unknown"}`);
1398
- }
1399
- if (eventType === EventType.Reaction) {
1400
- runMonitorTask(`reaction handler room=${roomId} id=${event.event_id ?? "unknown"}`, async () => {
1401
- await onRoomMessage(roomId, event);
1402
- });
1403
- return;
1404
- }
1405
- routeVerificationEvent(roomId, event);
1406
- });
1407
- }
1408
- //#endregion
1409
- //#region extensions/matrix/src/matrix/monitor/ack-config.ts
1410
- function resolveMatrixAckReactionConfig(params) {
1411
- const matrixConfig = params.cfg.channels?.matrix;
1412
- const accountConfig = resolveMatrixAccountConfig({
1413
- cfg: params.cfg,
1414
- accountId: params.accountId
1415
- });
1416
- return {
1417
- ackReaction: resolveAckReaction(params.cfg, params.agentId, {
1418
- channel: "matrix",
1419
- accountId: params.accountId ?? void 0
1420
- }).trim(),
1421
- ackReactionScope: accountConfig.ackReactionScope ?? matrixConfig?.ackReactionScope ?? params.cfg.messages?.ackReactionScope ?? "group-mentions"
1422
- };
1423
- }
1424
- //#endregion
1425
- //#region extensions/matrix/src/matrix/monitor/location.ts
1426
- function decodeGeoUriParamValue(value) {
1427
- try {
1428
- return decodeURIComponent(value);
1429
- } catch {
1430
- return value;
1431
- }
1432
- }
1433
- function parseGeoUri(value) {
1434
- const trimmed = value.trim();
1435
- if (!trimmed) return null;
1436
- if (!normalizeLowercaseStringOrEmpty(trimmed).startsWith("geo:")) return null;
1437
- const [coordsPart, ...paramParts] = trimmed.slice(4).split(";");
1438
- const coords = coordsPart.split(",");
1439
- if (coords.length < 2) return null;
1440
- const latitude = Number.parseFloat(coords[0] ?? "");
1441
- const longitude = Number.parseFloat(coords[1] ?? "");
1442
- if (!Number.isFinite(latitude) || !Number.isFinite(longitude)) return null;
1443
- const params = /* @__PURE__ */ new Map();
1444
- for (const part of paramParts) {
1445
- const segment = part.trim();
1446
- if (!segment) continue;
1447
- const eqIndex = segment.indexOf("=");
1448
- const rawKey = eqIndex === -1 ? segment : segment.slice(0, eqIndex);
1449
- const rawValue = eqIndex === -1 ? "" : segment.slice(eqIndex + 1);
1450
- const key = normalizeLowercaseStringOrEmpty(rawKey);
1451
- if (!key) continue;
1452
- const valuePart = rawValue.trim();
1453
- params.set(key, valuePart ? decodeGeoUriParamValue(valuePart) : "");
1454
- }
1455
- const accuracyRaw = params.get("u");
1456
- const accuracy = accuracyRaw ? Number.parseFloat(accuracyRaw) : void 0;
1457
- return {
1458
- latitude,
1459
- longitude,
1460
- accuracy: Number.isFinite(accuracy) ? accuracy : void 0
1461
- };
1462
- }
1463
- function resolveMatrixLocation(params) {
1464
- const { eventType, content } = params;
1465
- if (!(eventType === EventType.Location || eventType === EventType.RoomMessage && content.msgtype === EventType.Location)) return null;
1466
- const geoUri = normalizeOptionalString(content.geo_uri) ?? "";
1467
- if (!geoUri) return null;
1468
- const parsed = parseGeoUri(geoUri);
1469
- if (!parsed) return null;
1470
- const caption = normalizeOptionalString(content.body) ?? "";
1471
- const location = {
1472
- latitude: parsed.latitude,
1473
- longitude: parsed.longitude,
1474
- accuracy: parsed.accuracy,
1475
- caption: caption || void 0,
1476
- source: "pin",
1477
- isLive: false
1478
- };
1479
- return {
1480
- text: formatLocationText(location),
1481
- context: toLocationContext(location)
1482
- };
1483
- }
1484
- //#endregion
1485
- //#region extensions/matrix/src/matrix/monitor/media.ts
1486
- const MATRIX_MEDIA_DOWNLOAD_IDLE_TIMEOUT_MS = 3e4;
1487
- async function fetchMatrixMediaBuffer(params) {
1488
- try {
1489
- return { buffer: await params.client.downloadContent(params.mxcUrl, {
1490
- maxBytes: params.maxBytes,
1491
- readIdleTimeoutMs: MATRIX_MEDIA_DOWNLOAD_IDLE_TIMEOUT_MS
1492
- }) };
1493
- } catch (err) {
1494
- if (isMatrixMediaSizeLimitError(err)) throw err;
1495
- throw new Error(`Matrix media download failed: ${String(err)}`, { cause: err });
1496
- }
1497
- }
1498
- /**
1499
- * Download and decrypt encrypted media from a Matrix room.
1500
- * Uses the Matrix crypto adapter's decryptMedia helper.
1501
- */
1502
- async function fetchEncryptedMediaBuffer(params) {
1503
- if (!params.client.crypto) throw new Error("Cannot decrypt media: crypto not enabled");
1504
- const decrypted = await params.client.crypto.decryptMedia(params.file, {
1505
- maxBytes: params.maxBytes,
1506
- readIdleTimeoutMs: MATRIX_MEDIA_DOWNLOAD_IDLE_TIMEOUT_MS
1507
- });
1508
- if (decrypted.byteLength > params.maxBytes) throw new MatrixMediaSizeLimitError();
1509
- return { buffer: decrypted };
1510
- }
1511
- async function downloadMatrixMedia(params) {
1512
- let fetched;
1513
- if (typeof params.sizeBytes === "number" && params.sizeBytes > params.maxBytes) throw new MatrixMediaSizeLimitError();
1514
- if (params.file) fetched = await fetchEncryptedMediaBuffer({
1515
- client: params.client,
1516
- file: params.file,
1517
- maxBytes: params.maxBytes
1518
- });
1519
- else fetched = await fetchMatrixMediaBuffer({
1520
- client: params.client,
1521
- mxcUrl: params.mxcUrl,
1522
- maxBytes: params.maxBytes
1523
- });
1524
- if (!fetched) return null;
1525
- const headerType = params.contentType ?? void 0;
1526
- const saved = await getMatrixRuntime().channel.media.saveMediaBuffer(fetched.buffer, headerType, "inbound", params.maxBytes, params.originalFilename);
1527
- return {
1528
- path: saved.path,
1529
- contentType: saved.contentType,
1530
- placeholder: "[matrix media]"
1531
- };
1532
- }
1533
- //#endregion
1534
- //#region extensions/matrix/src/matrix/monitor/mentions.ts
1535
- const HTML_ENTITY_REPLACEMENTS = {
1536
- amp: "&",
1537
- apos: "'",
1538
- gt: ">",
1539
- lt: "<",
1540
- nbsp: " ",
1541
- quot: "\""
1542
- };
1543
- const MAX_UNICODE_SCALAR_VALUE = 1114111;
1544
- function decodeNumericHtmlEntity(match, rawValue, radix) {
1545
- const codePoint = Number.parseInt(rawValue, radix);
1546
- if (!Number.isSafeInteger(codePoint) || codePoint < 0 || codePoint > MAX_UNICODE_SCALAR_VALUE || codePoint >= 55296 && codePoint <= 57343) return match;
1547
- return String.fromCodePoint(codePoint);
1548
- }
1549
- function decodeHtmlEntities(value) {
1550
- return value.replace(/&(#x?[0-9a-f]+|\w+);/gi, (match, entity) => {
1551
- const normalized = normalizeLowercaseStringOrEmpty(entity);
1552
- if (normalized.startsWith("#x")) return decodeNumericHtmlEntity(match, normalized.slice(2), 16);
1553
- if (normalized.startsWith("#")) return decodeNumericHtmlEntity(match, normalized.slice(1), 10);
1554
- return HTML_ENTITY_REPLACEMENTS[normalized] ?? match;
1555
- });
1556
- }
1557
- function normalizeVisibleMentionText(value) {
1558
- return normalizeLowercaseStringOrEmpty(decodeHtmlEntities(value.replace(/<[^>]+>/g, " ").replace(/[\u200b-\u200f\u202a-\u202e\u2060-\u206f]/g, "")).replace(/\s+/g, " "));
1559
- }
1560
- function extractVisibleMentionText(value) {
1561
- return normalizeVisibleMentionText(value ?? "");
1562
- }
1563
- function resolveMatrixUserLocalpart(userId) {
1564
- const trimmed = userId.trim();
1565
- if (!trimmed.startsWith("@")) return null;
1566
- const colonIndex = trimmed.indexOf(":");
1567
- if (colonIndex <= 1) return null;
1568
- return trimmed.slice(1, colonIndex).trim() || null;
1569
- }
1570
- function resolveMatrixMentionPrefixCandidates(params) {
1571
- const candidates = [];
1572
- const seen = /* @__PURE__ */ new Set();
1573
- const append = (candidate) => {
1574
- const trimmed = candidate?.trim();
1575
- if (!trimmed) return;
1576
- const normalized = normalizeLowercaseStringOrEmpty(trimmed);
1577
- if (seen.has(normalized)) return;
1578
- seen.add(normalized);
1579
- candidates.push(trimmed);
1580
- };
1581
- append(params.userId);
1582
- const localpart = params.userId ? resolveMatrixUserLocalpart(params.userId) : null;
1583
- append(localpart ? `@${localpart}` : null);
1584
- append(params.displayName);
1585
- append(params.displayName ? `@${params.displayName}` : null);
1586
- return candidates;
1587
- }
1588
- function stripMatchedMatrixMentionPrefix(text, pattern) {
1589
- const match = text.match(pattern);
1590
- if (!match) return null;
1591
- return text.slice(match[0].length).trimStart();
1592
- }
1593
- function stripNativeMatrixMentionPrefix(text, candidate) {
1594
- return stripMatchedMatrixMentionPrefix(text, new RegExp(`^\\s*${escapeRegExp(candidate)}(?:\\s*[:,])?(?:\\s+|$)`, "i"));
1595
- }
1596
- function stripRegexMatrixMentionPrefix(text, pattern) {
1597
- const flags = pattern.flags.replace(/[gy]/g, "");
1598
- return stripMatchedMatrixMentionPrefix(text, new RegExp(`^\\s*(?:${pattern.source})(?:\\s*[:,])?(?:\\s+|$)`, flags));
1599
- }
1600
- function stripMatrixMentionPrefix(params) {
1601
- const text = params.text;
1602
- if (!text) return text;
1603
- for (const candidate of resolveMatrixMentionPrefixCandidates(params)) {
1604
- const stripped = stripNativeMatrixMentionPrefix(text, candidate);
1605
- if (stripped !== null) return stripped;
1606
- }
1607
- for (const pattern of params.mentionRegexes ?? []) {
1608
- const stripped = stripRegexMatrixMentionPrefix(text, pattern);
1609
- if (stripped !== null) return stripped;
1610
- }
1611
- return text;
1612
- }
1613
- function isVisibleMentionLabel(params) {
1614
- const cleaned = extractVisibleMentionText(params.text);
1615
- if (!cleaned) return false;
1616
- if (params.mentionRegexes.some((pattern) => pattern.test(cleaned))) return true;
1617
- const localpart = resolveMatrixUserLocalpart(params.userId);
1618
- return [
1619
- extractVisibleMentionText(params.userId),
1620
- localpart ? extractVisibleMentionText(localpart) : null,
1621
- localpart ? extractVisibleMentionText(`@${localpart}`) : null,
1622
- params.displayName ? extractVisibleMentionText(params.displayName) : null,
1623
- params.displayName ? extractVisibleMentionText(`@${params.displayName}`) : null
1624
- ].filter((value) => Boolean(value)).includes(cleaned);
1625
- }
1626
- function hasVisibleRoomMention(value) {
1627
- const cleaned = extractVisibleMentionText(value);
1628
- return /(^|[^a-z0-9_])@room\b/i.test(cleaned);
1629
- }
1630
- /**
1631
- * Check if formatted_body contains a matrix.to link whose visible label still
1632
- * looks like a real mention for the given user. Do not trust href alone, since
1633
- * senders can hide arbitrary matrix.to links behind unrelated link text.
1634
- * Many Matrix clients (including Element) use HTML links in formatted_body instead of
1635
- * or in addition to the m.mentions field.
1636
- */
1637
- function checkFormattedBodyMention(params) {
1638
- if (!params.formattedBody || !params.userId) return false;
1639
- for (const match of params.formattedBody.matchAll(/<a\b[^>]*href=(["'])(https:\/\/matrix\.to\/#[^"']+)\1[^>]*>(.*?)<\/a>/gis)) {
1640
- const href = match[2];
1641
- const visibleLabel = match[3] ?? "";
1642
- if (!href) continue;
1643
- try {
1644
- const parsed = new URL(href);
1645
- if (decodeURIComponent(parsed.hash.replace(/^#\/?/, "").trim()) !== params.userId.trim()) continue;
1646
- if (isVisibleMentionLabel({
1647
- text: visibleLabel,
1648
- userId: params.userId,
1649
- mentionRegexes: params.mentionRegexes,
1650
- displayName: params.displayName
1651
- })) return true;
1652
- } catch {
1653
- continue;
1654
- }
1655
- }
1656
- return false;
1657
- }
1658
- function resolveMentions(params) {
1659
- const mentions = params.content["m.mentions"];
1660
- const mentionedUsers = Array.isArray(mentions?.user_ids) ? new Set(mentions.user_ids) : /* @__PURE__ */ new Set();
1661
- const textMentioned = getMatrixRuntime().channel.mentions.matchesMentionPatterns(params.text ?? "", params.mentionRegexes);
1662
- const visibleRoomMention = hasVisibleRoomMention(params.text) || hasVisibleRoomMention(params.content.formatted_body);
1663
- const mentionedInFormattedBody = params.userId ? checkFormattedBodyMention({
1664
- formattedBody: params.content.formatted_body,
1665
- userId: params.userId,
1666
- displayName: params.displayName,
1667
- mentionRegexes: params.mentionRegexes
1668
- }) : false;
1669
- const metadataBackedUserMention = Boolean(params.userId && mentionedUsers.has(params.userId) && (mentionedInFormattedBody || textMentioned));
1670
- const metadataBackedRoomMention = Boolean(mentions?.room) && visibleRoomMention;
1671
- const explicitMention = mentionedInFormattedBody || metadataBackedUserMention || metadataBackedRoomMention;
1672
- return {
1673
- wasMentioned: explicitMention || textMentioned || visibleRoomMention,
1674
- hasExplicitMention: explicitMention
1675
- };
1676
- }
1677
- //#endregion
1678
- //#region extensions/matrix/src/matrix/monitor/replies.ts
1679
- const THINKING_TAG_RE = /<\s*\/?\s*(?:think(?:ing)?|thought|antthinking)\b[^<>]*>/gi;
1680
- const THINKING_BLOCK_RE = /<\s*(?:think(?:ing)?|thought|antthinking)\b[^<>]*>[\s\S]*?<\s*\/\s*(?:think(?:ing)?|thought|antthinking)\s*>/gi;
1681
- function shouldSuppressReasoningReplyText(text) {
1682
- if (typeof text !== "string") return false;
1683
- const trimmedStart = text.trimStart();
1684
- if (!trimmedStart) return false;
1685
- if (normalizeLowercaseStringOrEmpty(trimmedStart).startsWith("reasoning:")) return true;
1686
- THINKING_TAG_RE.lastIndex = 0;
1687
- if (!THINKING_TAG_RE.test(text)) return false;
1688
- THINKING_BLOCK_RE.lastIndex = 0;
1689
- const withoutThinkingBlocks = text.replace(THINKING_BLOCK_RE, "");
1690
- THINKING_TAG_RE.lastIndex = 0;
1691
- return !withoutThinkingBlocks.replace(THINKING_TAG_RE, "").trim();
1692
- }
1693
- async function deliverMatrixReplies(params) {
1694
- const core = getMatrixRuntime();
1695
- const tableMode = params.tableMode ?? core.channel.text.resolveMarkdownTableMode({
1696
- cfg: params.cfg,
1697
- channel: "matrix",
1698
- accountId: params.accountId
1699
- });
1700
- const logVerbose = (message) => {
1701
- if (core.logging.shouldLogVerbose()) params.runtime.log?.(message);
1702
- };
1703
- let hasReplied = false;
1704
- let deliveredAny = false;
1705
- for (const reply of params.replies) {
1706
- if (reply.isReasoning === true || shouldSuppressReasoningReplyText(reply.text)) {
1707
- logVerbose("matrix reply suppressed as reasoning-only");
1708
- continue;
1709
- }
1710
- const hasMedia = Boolean(reply?.mediaUrl) || (reply?.mediaUrls?.length ?? 0) > 0;
1711
- if (!reply?.text && !hasMedia) {
1712
- if (reply?.audioAsVoice) {
1713
- logVerbose("matrix reply has audioAsVoice without media/text; skipping");
1714
- continue;
1715
- }
1716
- params.runtime.error?.("matrix reply missing text/media");
1717
- continue;
1718
- }
1719
- const replyToIdRaw = reply.replyToId?.trim();
1720
- const replyToId = params.threadId || params.replyToMode === "off" ? void 0 : replyToIdRaw;
1721
- const rawText = reply.text ?? "";
1722
- const mediaList = reply.mediaUrls?.length ? reply.mediaUrls : reply.mediaUrl ? [reply.mediaUrl] : [];
1723
- const shouldIncludeReply = (id) => Boolean(id) && (params.replyToMode === "all" || !hasReplied);
1724
- const replyToIdForReply = shouldIncludeReply(replyToId) ? replyToId : void 0;
1725
- if (mediaList.length === 0) {
1726
- let sentTextChunk = false;
1727
- const { chunks } = chunkMatrixText(rawText, {
1728
- cfg: params.cfg,
1729
- accountId: params.accountId,
1730
- tableMode
1731
- });
1732
- for (const chunk of chunks) {
1733
- const trimmed = chunk.trim();
1734
- if (!trimmed) continue;
1735
- await sendMessageMatrix(params.roomId, trimmed, {
1736
- client: params.client,
1737
- cfg: params.cfg,
1738
- replyToId: replyToIdForReply,
1739
- threadId: params.threadId,
1740
- accountId: params.accountId
1741
- });
1742
- deliveredAny = true;
1743
- sentTextChunk = true;
1744
- }
1745
- if (replyToIdForReply && !hasReplied && sentTextChunk) hasReplied = true;
1746
- continue;
1747
- }
1748
- let first = true;
1749
- for (const mediaUrl of mediaList) {
1750
- const caption = first ? rawText : "";
1751
- await sendMessageMatrix(params.roomId, caption, {
1752
- client: params.client,
1753
- cfg: params.cfg,
1754
- mediaUrl,
1755
- mediaLocalRoots: params.mediaLocalRoots,
1756
- replyToId: replyToIdForReply,
1757
- threadId: params.threadId,
1758
- audioAsVoice: reply.audioAsVoice,
1759
- accountId: params.accountId
1760
- });
1761
- deliveredAny = true;
1762
- first = false;
1763
- }
1764
- if (replyToIdForReply && !hasReplied) hasReplied = true;
1765
- }
1766
- return deliveredAny;
1767
- }
1768
- //#endregion
1769
- //#region extensions/matrix/src/matrix/monitor/context-summary.ts
1770
- function trimMatrixMaybeString(value) {
1771
- if (typeof value !== "string") return;
1772
- return value.trim() || void 0;
1773
- }
1774
- function summarizeMatrixMessageContextEvent(event) {
1775
- if (isPollStartType(event.type)) {
1776
- const pollSummary = parsePollStartContent(event.content);
1777
- if (pollSummary) return formatPollAsText(pollSummary);
1778
- }
1779
- const content = event.content;
1780
- return formatMatrixMessageText({
1781
- body: resolveMatrixMessageBody({
1782
- body: trimMatrixMaybeString(content.body),
1783
- filename: trimMatrixMaybeString(content.filename),
1784
- msgtype: trimMatrixMaybeString(content.msgtype)
1785
- }),
1786
- attachment: resolveMatrixMessageAttachment({
1787
- body: trimMatrixMaybeString(content.body),
1788
- filename: trimMatrixMaybeString(content.filename),
1789
- msgtype: trimMatrixMaybeString(content.msgtype)
1790
- })
1791
- });
1792
- }
1793
- //#endregion
1794
- //#region extensions/matrix/src/matrix/monitor/reply-context.ts
1795
- const MAX_CACHED_REPLY_CONTEXTS = 256;
1796
- const MAX_REPLY_BODY_LENGTH = 500;
1797
- function truncateReplyBody(value) {
1798
- if (value.length <= MAX_REPLY_BODY_LENGTH) return value;
1799
- return `${value.slice(0, MAX_REPLY_BODY_LENGTH - 3)}...`;
1800
- }
1801
- function summarizeMatrixReplyEvent(event) {
1802
- const body = summarizeMatrixMessageContextEvent(event);
1803
- return body ? truncateReplyBody(body) : void 0;
1804
- }
1805
- /**
1806
- * Creates a cached resolver that fetches the body and sender of a replied-to
1807
- * Matrix event. This allows the agent to see the content of the message being
1808
- * replied to, not just its event ID.
1809
- */
1810
- function createMatrixReplyContextResolver(params) {
1811
- const cache = /* @__PURE__ */ new Map();
1812
- const remember = (key, value) => {
1813
- cache.set(key, value);
1814
- if (cache.size > MAX_CACHED_REPLY_CONTEXTS) {
1815
- const oldest = cache.keys().next().value;
1816
- if (typeof oldest === "string") cache.delete(oldest);
1817
- }
1818
- return value;
1819
- };
1820
- return async (input) => {
1821
- const cacheKey = `${input.roomId}:${input.eventId}`;
1822
- const cached = cache.get(cacheKey);
1823
- if (cached) {
1824
- cache.delete(cacheKey);
1825
- cache.set(cacheKey, cached);
1826
- return cached;
1827
- }
1828
- const event = await params.client.getEvent(input.roomId, input.eventId).catch((err) => {
1829
- params.logVerboseMessage(`matrix: failed resolving reply context room=${input.roomId} id=${input.eventId}: ${String(err)}`);
1830
- return null;
1831
- });
1832
- if (!event) return {};
1833
- const rawEvent = event;
1834
- if (rawEvent.unsigned?.redacted_because) return remember(cacheKey, {});
1835
- const replyToBody = summarizeMatrixReplyEvent(rawEvent);
1836
- if (!replyToBody) return remember(cacheKey, {});
1837
- const senderId = trimMatrixMaybeString(rawEvent.sender);
1838
- return remember(cacheKey, {
1839
- replyToBody,
1840
- replyToSender: (senderId && await params.getMemberDisplayName(input.roomId, senderId).catch(() => void 0)) ?? senderId,
1841
- replyToSenderId: senderId
1842
- });
1843
- };
1844
- }
1845
- //#endregion
1846
- //#region extensions/matrix/src/matrix/monitor/room-history.ts
1847
- /** Maximum entries retained per room (hard cap to bound memory). */
1848
- const DEFAULT_MAX_QUEUE_SIZE = 200;
1849
- /** Maximum number of rooms to retain queues for (FIFO eviction beyond this). */
1850
- const DEFAULT_MAX_ROOM_QUEUES = 1e3;
1851
- /** Maximum number of (agentId, roomId) watermark entries to retain. */
1852
- const MAX_WATERMARK_ENTRIES = 5e3;
1853
- /** Maximum prepared trigger snapshots retained per room for retry reuse. */
1854
- const MAX_PREPARED_TRIGGER_ENTRIES = 500;
1855
- function createRoomHistoryTrackerInternal(maxQueueSize = DEFAULT_MAX_QUEUE_SIZE, maxRoomQueues = DEFAULT_MAX_ROOM_QUEUES, maxWatermarkEntries = MAX_WATERMARK_ENTRIES, maxPreparedTriggerEntries = MAX_PREPARED_TRIGGER_ENTRIES) {
1856
- const roomQueues = /* @__PURE__ */ new Map();
1857
- /** Maps `${agentId}:${roomId}` → absolute consumed-up-to index */
1858
- const agentWatermarks = /* @__PURE__ */ new Map();
1859
- let nextQueueGeneration = 1;
1860
- function clearRoomWatermarks(roomId) {
1861
- const roomSuffix = `:${roomId}`;
1862
- for (const key of agentWatermarks.keys()) if (key.endsWith(roomSuffix)) agentWatermarks.delete(key);
1863
- }
1864
- function getOrCreateQueue(roomId) {
1865
- let queue = roomQueues.get(roomId);
1866
- if (!queue) {
1867
- queue = {
1868
- entries: [],
1869
- baseIndex: 0,
1870
- generation: nextQueueGeneration++,
1871
- preparedTriggers: /* @__PURE__ */ new Map()
1872
- };
1873
- roomQueues.set(roomId, queue);
1874
- if (roomQueues.size > maxRoomQueues) {
1875
- const oldest = roomQueues.keys().next().value;
1876
- if (oldest !== void 0) {
1877
- roomQueues.delete(oldest);
1878
- clearRoomWatermarks(oldest);
1879
- }
1880
- }
1881
- }
1882
- return queue;
1883
- }
1884
- function appendToQueue(queue, entry) {
1885
- queue.entries.push(entry);
1886
- if (queue.entries.length > maxQueueSize) {
1887
- const overflow = queue.entries.length - maxQueueSize;
1888
- queue.entries.splice(0, overflow);
1889
- queue.baseIndex += overflow;
1890
- }
1891
- return {
1892
- snapshotIdx: queue.baseIndex + queue.entries.length,
1893
- queueGeneration: queue.generation
1894
- };
1895
- }
1896
- function wmKey(agentId, roomId) {
1897
- return `${agentId}:${roomId}`;
1898
- }
1899
- function preparedTriggerKey(agentId, messageId) {
1900
- if (!messageId?.trim()) return null;
1901
- return `${agentId}:${messageId.trim()}`;
1902
- }
1903
- function rememberWatermark(key, snapshotIdx) {
1904
- const nextSnapshotIdx = Math.max(agentWatermarks.get(key) ?? 0, snapshotIdx);
1905
- if (agentWatermarks.has(key)) agentWatermarks.delete(key);
1906
- agentWatermarks.set(key, nextSnapshotIdx);
1907
- if (agentWatermarks.size > maxWatermarkEntries) {
1908
- const oldest = agentWatermarks.keys().next().value;
1909
- if (oldest !== void 0) agentWatermarks.delete(oldest);
1910
- }
1911
- }
1912
- function rememberPreparedTrigger(queue, retryKey, prepared) {
1913
- if (queue.preparedTriggers.has(retryKey)) queue.preparedTriggers.delete(retryKey);
1914
- queue.preparedTriggers.set(retryKey, prepared);
1915
- if (queue.preparedTriggers.size > maxPreparedTriggerEntries) {
1916
- const oldest = queue.preparedTriggers.keys().next().value;
1917
- if (oldest !== void 0) queue.preparedTriggers.delete(oldest);
1918
- }
1919
- return prepared;
1920
- }
1921
- function computePendingHistory(queue, agentId, roomId, limit) {
1922
- if (limit <= 0 || queue.entries.length === 0) return [];
1923
- const wm = agentWatermarks.get(wmKey(agentId, roomId)) ?? 0;
1924
- const startRel = Math.max(wm, queue.baseIndex) - queue.baseIndex;
1925
- const available = queue.entries.slice(startRel);
1926
- return available.length > limit ? available.slice(-limit) : available;
1927
- }
1928
- return {
1929
- recordPending(roomId, entry) {
1930
- appendToQueue(getOrCreateQueue(roomId), entry);
1931
- },
1932
- getPendingHistory(agentId, roomId, limit) {
1933
- const queue = roomQueues.get(roomId);
1934
- if (!queue) return [];
1935
- return computePendingHistory(queue, agentId, roomId, limit);
1936
- },
1937
- recordTrigger(roomId, entry) {
1938
- return appendToQueue(getOrCreateQueue(roomId), entry);
1939
- },
1940
- prepareTrigger(agentId, roomId, limit, entry) {
1941
- const queue = getOrCreateQueue(roomId);
1942
- const retryKey = preparedTriggerKey(agentId, entry.messageId);
1943
- if (retryKey) {
1944
- const prepared = queue.preparedTriggers.get(retryKey);
1945
- if (prepared) return rememberPreparedTrigger(queue, retryKey, prepared);
1946
- }
1947
- const prepared = {
1948
- history: computePendingHistory(queue, agentId, roomId, limit),
1949
- ...appendToQueue(queue, entry)
1950
- };
1951
- if (retryKey) return rememberPreparedTrigger(queue, retryKey, prepared);
1952
- return prepared;
1953
- },
1954
- consumeHistory(agentId, roomId, snapshot, messageId) {
1955
- const key = wmKey(agentId, roomId);
1956
- const queue = roomQueues.get(roomId);
1957
- if (!queue) {
1958
- agentWatermarks.delete(key);
1959
- return;
1960
- }
1961
- if (queue.generation !== snapshot.queueGeneration) return;
1962
- rememberWatermark(key, snapshot.snapshotIdx);
1963
- const retryKey = preparedTriggerKey(agentId, messageId);
1964
- if (queue && retryKey) queue.preparedTriggers.delete(retryKey);
1965
- }
1966
- };
1967
- }
1968
- function createRoomHistoryTracker(maxQueueSize = DEFAULT_MAX_QUEUE_SIZE, maxRoomQueues = DEFAULT_MAX_ROOM_QUEUES, maxWatermarkEntries = MAX_WATERMARK_ENTRIES, maxPreparedTriggerEntries = MAX_PREPARED_TRIGGER_ENTRIES) {
1969
- const tracker = createRoomHistoryTrackerInternal(maxQueueSize, maxRoomQueues, maxWatermarkEntries, maxPreparedTriggerEntries);
1970
- return {
1971
- recordPending: tracker.recordPending,
1972
- prepareTrigger: tracker.prepareTrigger,
1973
- consumeHistory: tracker.consumeHistory
1974
- };
1975
- }
1976
- //#endregion
1977
- //#region extensions/matrix/src/matrix/monitor/thread-context.ts
1978
- const MAX_TRACKED_THREAD_STARTERS = 256;
1979
- const MAX_THREAD_STARTER_BODY_LENGTH = 500;
1980
- function truncateThreadStarterBody(value) {
1981
- if (value.length <= MAX_THREAD_STARTER_BODY_LENGTH) return value;
1982
- return `${value.slice(0, MAX_THREAD_STARTER_BODY_LENGTH - 3)}...`;
1983
- }
1984
- function summarizeMatrixThreadStarterEvent(event) {
1985
- const body = summarizeMatrixMessageContextEvent(event);
1986
- if (body) return truncateThreadStarterBody(body);
1987
- const content = event.content;
1988
- const msgtype = trimMatrixMaybeString(content.msgtype);
1989
- if (msgtype) return `Matrix ${msgtype} message`;
1990
- const eventType = trimMatrixMaybeString(event.type);
1991
- return eventType ? `Matrix ${eventType} event` : void 0;
1992
- }
1993
- function formatMatrixThreadStarterBody(params) {
1994
- const senderLabel = params.senderName ?? params.senderId ?? "unknown sender";
1995
- const lines = [`Matrix thread root ${params.threadRootId} from ${senderLabel}:`];
1996
- if (params.summary) lines.push(params.summary);
1997
- return lines.join("\n");
1998
- }
1999
- function createMatrixThreadContextResolver(params) {
2000
- const cache = /* @__PURE__ */ new Map();
2001
- const remember = (key, value) => {
2002
- cache.set(key, value);
2003
- if (cache.size > MAX_TRACKED_THREAD_STARTERS) {
2004
- const oldest = cache.keys().next().value;
2005
- if (typeof oldest === "string") cache.delete(oldest);
2006
- }
2007
- return value;
2008
- };
2009
- return async (input) => {
2010
- const cacheKey = `${input.roomId}:${input.threadRootId}`;
2011
- const cached = cache.get(cacheKey);
2012
- if (cached) return cached;
2013
- const rootEvent = await params.client.getEvent(input.roomId, input.threadRootId).catch((err) => {
2014
- params.logVerboseMessage(`matrix: failed resolving thread root room=${input.roomId} id=${input.threadRootId}: ${String(err)}`);
2015
- return null;
2016
- });
2017
- if (!rootEvent) return { threadStarterBody: `Matrix thread root ${input.threadRootId}` };
2018
- const rawEvent = rootEvent;
2019
- const senderId = trimMatrixMaybeString(rawEvent.sender);
2020
- const senderName = senderId && await params.getMemberDisplayName(input.roomId, senderId).catch(() => void 0);
2021
- const senderLabel = senderName ?? senderId;
2022
- const summary = summarizeMatrixThreadStarterEvent(rawEvent);
2023
- return remember(cacheKey, {
2024
- threadStarterBody: formatMatrixThreadStarterBody({
2025
- threadRootId: input.threadRootId,
2026
- senderId,
2027
- senderName,
2028
- summary
2029
- }),
2030
- senderId,
2031
- senderLabel,
2032
- summary
2033
- });
2034
- };
2035
- }
2036
- //#endregion
2037
- //#region extensions/matrix/src/matrix/monitor/handler.ts
2038
- const ALLOW_FROM_STORE_CACHE_TTL_MS = 3e4;
2039
- const PAIRING_REPLY_COOLDOWN_MS = 5 * 6e4;
2040
- const MATRIX_TOOL_PROGRESS_MAX_CHARS = 300;
2041
- let matrixSendModulePromise;
2042
- let acpBindingRuntimePromise;
2043
- let sessionBindingRuntimePromise;
2044
- let matrixReactionEventsPromise;
2045
- let matrixDraftStreamPromise;
2046
- function loadMatrixSendModule() {
2047
- matrixSendModulePromise ??= import("./send-CSbH7LVX.js");
2048
- return matrixSendModulePromise;
2049
- }
2050
- function loadAcpBindingRuntime() {
2051
- acpBindingRuntimePromise ??= import("./plugin-sdk/acp-binding-runtime.js");
2052
- return acpBindingRuntimePromise;
2053
- }
2054
- function loadSessionBindingRuntime() {
2055
- sessionBindingRuntimePromise ??= import("./plugin-sdk/session-binding-runtime.js");
2056
- return sessionBindingRuntimePromise;
2057
- }
2058
- function loadMatrixReactionEvents() {
2059
- matrixReactionEventsPromise ??= import("./reaction-events-tcuNglzW.js");
2060
- return matrixReactionEventsPromise;
2061
- }
2062
- function loadMatrixDraftStream() {
2063
- matrixDraftStreamPromise ??= import("./draft-stream-DFUHfe0T.js");
2064
- return matrixDraftStreamPromise;
2065
- }
2066
- const MAX_TRACKED_PAIRING_REPLY_SENDERS = 512;
2067
- const MAX_TRACKED_SHARED_DM_CONTEXT_NOTICES = 512;
2068
- var MatrixRetryableInboundError = class extends Error {
2069
- constructor(message, options) {
2070
- super(message, options);
2071
- this.name = "MatrixRetryableInboundError";
2072
- }
2073
- };
2074
- async function redactMatrixDraftEvent(client, roomId, draftEventId) {
2075
- await client.redactEvent(roomId, draftEventId).catch(() => {});
2076
- }
2077
- function buildMatrixFinalizedPreviewContent() {
2078
- return { [MATRIX_DAOCORE_FINALIZED_PREVIEW_KEY]: true };
2079
- }
2080
- function resolveMatrixMentionPrecheckText(params) {
2081
- if (params.locationText?.trim()) return params.locationText.trim();
2082
- if (typeof params.content.body === "string" && params.content.body.trim()) return params.content.body.trim();
2083
- if (isPollStartType(params.eventType)) {
2084
- const parsed = parsePollStartContent(params.content);
2085
- if (parsed) return formatPollAsText(parsed);
2086
- }
2087
- return "";
2088
- }
2089
- function hasBundledMatrixReplacementRelation(event) {
2090
- const relations = event.unsigned?.["m.relations"];
2091
- if (!relations || typeof relations !== "object") return false;
2092
- return relations[RelationType.Replace] !== void 0;
2093
- }
2094
- function resolveMatrixInboundBodyText(params) {
2095
- if (params.mediaPlaceholder) return params.rawBody || params.mediaPlaceholder;
2096
- if (!params.mediaDownloadFailed || !params.hadMediaUrl) return params.rawBody;
2097
- if (params.mediaSizeLimitExceeded) return formatMatrixMediaTooLargeText({
2098
- body: params.rawBody,
2099
- filename: params.filename,
2100
- msgtype: params.msgtype
2101
- });
2102
- return formatMatrixMediaUnavailableText({
2103
- body: params.rawBody,
2104
- filename: params.filename,
2105
- msgtype: params.msgtype
2106
- });
2107
- }
2108
- function markTrackedRoomIfFirst(set, roomId) {
2109
- if (set.has(roomId)) return false;
2110
- set.add(roomId);
2111
- if (set.size > MAX_TRACKED_SHARED_DM_CONTEXT_NOTICES) {
2112
- const oldest = set.keys().next().value;
2113
- if (typeof oldest === "string") set.delete(oldest);
2114
- }
2115
- return true;
2116
- }
2117
- function resolveMatrixSharedDmContextNotice(params) {
2118
- if ((params.dmSessionScope ?? "per-user") === "per-room") return null;
2119
- if (params.sentRooms.has(params.roomId)) return null;
2120
- try {
2121
- const currentSession = resolveMatrixStoredSessionMeta(resolveSessionStoreEntry({
2122
- store: loadSessionStore(params.storePath),
2123
- sessionKey: params.sessionKey
2124
- }).existing);
2125
- if (!currentSession) return null;
2126
- if (currentSession.channel && currentSession.channel !== "matrix") return null;
2127
- if (currentSession.accountId && currentSession.accountId !== params.accountId) return null;
2128
- if (!currentSession.directUserId) return null;
2129
- if (!currentSession.roomId || currentSession.roomId === params.roomId) return null;
2130
- return [
2131
- "This Matrix DM is sharing a session with another Matrix DM room.",
2132
- "Use /focus here for a one-off isolated thread session when thread bindings are enabled, or set",
2133
- "channels.matrix.dm.sessionScope to per-room to isolate each Matrix DM room."
2134
- ].join(" ");
2135
- } catch (err) {
2136
- params.logVerboseMessage(`matrix: failed checking shared DM session notice room=${params.roomId} (${String(err)})`);
2137
- return null;
2138
- }
2139
- }
2140
- function resolveMatrixPendingHistoryText(params) {
2141
- if (params.mentionPrecheckText) return params.mentionPrecheckText;
2142
- if (!params.mediaUrl) return "";
2143
- const body = typeof params.content.body === "string" ? params.content.body.trim() : void 0;
2144
- const filename = typeof params.content.filename === "string" ? params.content.filename.trim() : void 0;
2145
- const msgtype = typeof params.content.msgtype === "string" ? params.content.msgtype : void 0;
2146
- return formatMatrixMessageText({
2147
- body: resolveMatrixMessageBody({
2148
- body,
2149
- filename,
2150
- msgtype
2151
- }),
2152
- attachment: resolveMatrixMessageAttachment({
2153
- body,
2154
- filename,
2155
- msgtype
2156
- })
2157
- }) ?? "";
2158
- }
2159
- function resolveMatrixAllowBotsMode(value) {
2160
- if (value === true) return "all";
2161
- if (value === "mentions") return "mentions";
2162
- return "off";
2163
- }
2164
- function formatMatrixToolProgressMarkdownCode(text) {
2165
- return `\`${(text.length <= MATRIX_TOOL_PROGRESS_MAX_CHARS ? text : `${text.slice(0, MATRIX_TOOL_PROGRESS_MAX_CHARS - 1).trimEnd()}...`).replaceAll("`", "'")}\``;
2166
- }
2167
- function createMatrixRoomMessageHandler(params) {
2168
- const { client, core, cfg, accountId, accountConfig, runtime, logger, logVerboseMessage, allowFromResolvedEntries = [], groupAllowFromResolvedEntries = [], roomsConfig, accountAllowBots, configuredBotUserIds = /* @__PURE__ */ new Set(), groupPolicy, replyToMode, threadReplies, dmThreadReplies, dmSessionScope, streaming, previewToolProgressEnabled, blockStreamingEnabled, dmEnabled, dmPolicy, textLimit, mediaMaxBytes, historyLimit, startupMs, startupGraceMs, dropPreStartupMessages, inboundDeduper, directTracker, getRoomInfo, getMemberDisplayName, needsRoomAliasesForConfig, resolveLiveUserAllowlist = resolveMatrixMonitorLiveUserAllowlist } = params;
2169
- const contextVisibilityMode = resolveChannelContextVisibilityMode({
2170
- cfg,
2171
- channel: "matrix",
2172
- accountId
2173
- });
2174
- let cachedStoreAllowFrom = null;
2175
- let liveDmAllowlistCache = null;
2176
- let liveGroupAllowlistCache = null;
2177
- const resolveCachedLiveAllowlist = async (params) => {
2178
- const accountConfig = resolveMatrixAccountConfig({
2179
- cfg: params.cfg,
2180
- accountId
2181
- });
2182
- const signature = JSON.stringify({
2183
- entries: (params.entries ?? []).map((entry) => String(entry).trim()),
2184
- failClosedOnUnresolved: params.failClosedOnUnresolved === true,
2185
- dangerouslyAllowNameMatching: isDangerousNameMatchingEnabled(accountConfig)
2186
- });
2187
- if (params.cache?.signature === signature) return params.cache.entries;
2188
- const entries = await resolveLiveUserAllowlist({
2189
- cfg: params.cfg,
2190
- accountId,
2191
- entries: params.entries,
2192
- failClosedOnUnresolved: params.failClosedOnUnresolved,
2193
- startupResolvedEntries: params.startupResolvedEntries,
2194
- runtime
2195
- });
2196
- const next = {
2197
- signature,
2198
- entries
2199
- };
2200
- params.updateCache(next);
2201
- return entries;
2202
- };
2203
- const pairingReplySentAtMsBySender = /* @__PURE__ */ new Map();
2204
- const resolveThreadContext = createMatrixThreadContextResolver({
2205
- client,
2206
- getMemberDisplayName,
2207
- logVerboseMessage
2208
- });
2209
- const resolveReplyContext = createMatrixReplyContextResolver({
2210
- client,
2211
- getMemberDisplayName,
2212
- logVerboseMessage
2213
- });
2214
- const roomHistoryTracker = createRoomHistoryTracker();
2215
- const roomIngressTails = /* @__PURE__ */ new Map();
2216
- const sharedDmContextNoticeRooms = /* @__PURE__ */ new Set();
2217
- const readStoreAllowFrom = async () => {
2218
- const now = Date.now();
2219
- if (cachedStoreAllowFrom && now < cachedStoreAllowFrom.expiresAtMs) return cachedStoreAllowFrom.value;
2220
- const value = await core.channel.pairing.readAllowFromStore({
2221
- channel: "matrix",
2222
- env: process.env,
2223
- accountId
2224
- }).catch(() => []);
2225
- cachedStoreAllowFrom = {
2226
- value,
2227
- expiresAtMs: now + ALLOW_FROM_STORE_CACHE_TTL_MS
2228
- };
2229
- return value;
2230
- };
2231
- const shouldSendPairingReply = (senderId, created) => {
2232
- const now = Date.now();
2233
- if (created) {
2234
- pairingReplySentAtMsBySender.set(senderId, now);
2235
- return true;
2236
- }
2237
- const lastSentAtMs = pairingReplySentAtMsBySender.get(senderId);
2238
- if (typeof lastSentAtMs === "number" && now - lastSentAtMs < PAIRING_REPLY_COOLDOWN_MS) return false;
2239
- pairingReplySentAtMsBySender.set(senderId, now);
2240
- if (pairingReplySentAtMsBySender.size > MAX_TRACKED_PAIRING_REPLY_SENDERS) {
2241
- const oldestSender = pairingReplySentAtMsBySender.keys().next().value;
2242
- if (typeof oldestSender === "string") pairingReplySentAtMsBySender.delete(oldestSender);
2243
- }
2244
- return true;
2245
- };
2246
- const runRoomIngress = async (roomId, task) => {
2247
- const previous = roomIngressTails.get(roomId) ?? Promise.resolve();
2248
- let releaseCurrent;
2249
- const current = new Promise((resolve) => {
2250
- releaseCurrent = resolve;
2251
- });
2252
- const chain = previous.catch(() => {}).then(() => current);
2253
- roomIngressTails.set(roomId, chain);
2254
- await previous.catch(() => {});
2255
- try {
2256
- return await task();
2257
- } finally {
2258
- releaseCurrent();
2259
- if (roomIngressTails.get(roomId) === chain) roomIngressTails.delete(roomId);
2260
- }
2261
- };
2262
- return async (roomId, event) => {
2263
- const eventId = typeof event.event_id === "string" ? event.event_id.trim() : "";
2264
- let claimedInboundEvent = false;
2265
- let draftStreamRef;
2266
- let draftConsumed = false;
2267
- try {
2268
- const eventType = event.type;
2269
- if (eventType === EventType.RoomMessageEncrypted) return;
2270
- const isPollEvent = isPollEventType(eventType);
2271
- const isReactionEvent = eventType === EventType.Reaction;
2272
- const locationContent = event.content;
2273
- const isLocationEvent = eventType === EventType.Location || eventType === EventType.RoomMessage && locationContent.msgtype === EventType.Location;
2274
- if (eventType !== EventType.RoomMessage && !isPollEvent && !isLocationEvent && !isReactionEvent) return;
2275
- logVerboseMessage(`matrix: inbound event room=${roomId} type=${eventType} id=${event.event_id ?? "unknown"}`);
2276
- if (event.unsigned?.redacted_because) return;
2277
- const senderId = event.sender;
2278
- if (!senderId) return;
2279
- const eventTs = event.origin_server_ts;
2280
- const eventAge = event.unsigned?.age;
2281
- const commitInboundEventIfClaimed = async () => {
2282
- if (!claimedInboundEvent || !inboundDeduper || !eventId) return;
2283
- await inboundDeduper.commitEvent({
2284
- roomId,
2285
- eventId
2286
- });
2287
- claimedInboundEvent = false;
2288
- };
2289
- const readIngressPrefix = async () => {
2290
- const selfUserId = await client.getUserId();
2291
- if (senderId === selfUserId) return;
2292
- if (dropPreStartupMessages) {
2293
- if (typeof eventTs === "number" && eventTs < startupMs - startupGraceMs) return;
2294
- if (typeof eventTs !== "number" && typeof eventAge === "number" && eventAge > startupGraceMs) return;
2295
- }
2296
- let content = event.content;
2297
- if (eventType === EventType.RoomMessage && isMatrixVerificationRoomMessage({
2298
- msgtype: content.msgtype,
2299
- body: content.body
2300
- })) {
2301
- logVerboseMessage(`matrix: skip verification/system room message room=${roomId}`);
2302
- return;
2303
- }
2304
- const locationPayload = resolveMatrixLocation({
2305
- eventType,
2306
- content
2307
- });
2308
- const relates = content["m.relates_to"];
2309
- if (relates && "rel_type" in relates && relates.rel_type === RelationType.Replace) return;
2310
- if (hasBundledMatrixReplacementRelation(event)) return;
2311
- if (eventId && inboundDeduper) {
2312
- claimedInboundEvent = inboundDeduper.claimEvent({
2313
- roomId,
2314
- eventId
2315
- });
2316
- if (!claimedInboundEvent) {
2317
- logVerboseMessage(`matrix: skip duplicate inbound event room=${roomId} id=${eventId}`);
2318
- return;
2319
- }
2320
- }
2321
- return {
2322
- content,
2323
- isDirectMessage: await directTracker.isDirectMessage({
2324
- roomId,
2325
- senderId,
2326
- selfUserId
2327
- }),
2328
- locationPayload,
2329
- selfUserId
2330
- };
2331
- };
2332
- const continueIngress = async (params) => {
2333
- let content = params.content;
2334
- const isDirectMessage = params.isDirectMessage;
2335
- const isRoom = !isDirectMessage;
2336
- const { locationPayload, selfUserId } = params;
2337
- if (isRoom && groupPolicy === "disabled") {
2338
- await commitInboundEventIfClaimed();
2339
- return;
2340
- }
2341
- const roomInfoForConfig = isRoom && needsRoomAliasesForConfig ? await getRoomInfo(roomId, { includeAliases: true }) : void 0;
2342
- const roomAliasesForConfig = roomInfoForConfig ? [roomInfoForConfig.canonicalAlias ?? "", ...roomInfoForConfig.altAliases].filter(Boolean) : [];
2343
- const roomConfigInfo = isRoom ? resolveMatrixRoomConfig({
2344
- rooms: roomsConfig,
2345
- roomId,
2346
- aliases: roomAliasesForConfig
2347
- }) : void 0;
2348
- const roomConfig = roomConfigInfo?.config;
2349
- const allowBotsMode = resolveMatrixAllowBotsMode(roomConfig?.allowBots ?? accountAllowBots);
2350
- const isConfiguredBotSender = configuredBotUserIds.has(senderId);
2351
- const roomMatchMeta = roomConfigInfo ? `matchKey=${roomConfigInfo.matchKey ?? "none"} matchSource=${roomConfigInfo.matchSource ?? "none"}` : "matchKey=none matchSource=none";
2352
- if (isConfiguredBotSender && allowBotsMode === "off") {
2353
- logVerboseMessage(`matrix: drop configured bot sender=${senderId} (allowBots=false${isDirectMessage ? "" : `, ${roomMatchMeta}`})`);
2354
- await commitInboundEventIfClaimed();
2355
- return;
2356
- }
2357
- const botLoopProtection = isConfiguredBotSender && senderId !== selfUserId ? {
2358
- scopeId: accountId,
2359
- conversationId: roomId,
2360
- senderId,
2361
- receiverId: selfUserId,
2362
- config: mergePairLoopGuardConfig(accountConfig?.botLoopProtection, roomConfig?.botLoopProtection),
2363
- defaultsConfig: cfg.channels?.defaults?.botLoopProtection,
2364
- defaultEnabled: true,
2365
- nowMs: eventTs ?? void 0
2366
- } : void 0;
2367
- if (isRoom && roomConfig && !roomConfigInfo?.allowed) {
2368
- logVerboseMessage(`matrix: room disabled room=${roomId} (${roomMatchMeta})`);
2369
- await commitInboundEventIfClaimed();
2370
- return;
2371
- }
2372
- if (isRoom && groupPolicy === "allowlist") {
2373
- if (!roomConfigInfo?.allowlistConfigured) {
2374
- logVerboseMessage(`matrix: drop room message (no allowlist, ${roomMatchMeta})`);
2375
- await commitInboundEventIfClaimed();
2376
- return;
2377
- }
2378
- if (!roomConfig) {
2379
- logVerboseMessage(`matrix: drop room message (not in allowlist, ${roomMatchMeta})`);
2380
- await commitInboundEventIfClaimed();
2381
- return;
2382
- }
2383
- }
2384
- let senderNamePromise = null;
2385
- const getSenderName = async () => {
2386
- senderNamePromise ??= getMemberDisplayName(roomId, senderId).catch(() => senderId);
2387
- return await senderNamePromise;
2388
- };
2389
- const storeAllowFrom = isDirectMessage && dmPolicy !== "allowlist" && dmPolicy !== "open" ? await readStoreAllowFrom() : [];
2390
- const roomUsers = roomConfig?.users ?? [];
2391
- const liveCfg = core.config.current();
2392
- const liveAccountAllowlists = resolveMatrixAccountAllowlistConfig({
2393
- cfg: liveCfg,
2394
- accountId
2395
- });
2396
- const accessState = await resolveMatrixMonitorAccessState({
2397
- allowFrom: await resolveCachedLiveAllowlist({
2398
- cfg: liveCfg,
2399
- entries: liveAccountAllowlists.dmAllowFrom,
2400
- startupResolvedEntries: allowFromResolvedEntries,
2401
- cache: liveDmAllowlistCache,
2402
- updateCache: (next) => {
2403
- liveDmAllowlistCache = next;
2404
- }
2405
- }),
2406
- storeAllowFrom,
2407
- dmPolicy,
2408
- groupPolicy,
2409
- groupAllowFrom: await resolveCachedLiveAllowlist({
2410
- cfg: liveCfg,
2411
- entries: liveAccountAllowlists.groupAllowFrom,
2412
- failClosedOnUnresolved: true,
2413
- startupResolvedEntries: groupAllowFromResolvedEntries,
2414
- cache: liveGroupAllowlistCache,
2415
- updateCache: (next) => {
2416
- liveGroupAllowlistCache = next;
2417
- }
2418
- }),
2419
- roomUsers,
2420
- senderId,
2421
- isRoom,
2422
- accountId,
2423
- eventKind: isReactionEvent ? "reaction" : "message"
2424
- });
2425
- const { effectiveGroupAllowFrom, effectiveRoomUsers, messageIngress } = accessState;
2426
- const ingressDecision = messageIngress.ingress;
2427
- if (isDirectMessage) {
2428
- if (!dmEnabled || dmPolicy === "disabled") {
2429
- await commitInboundEventIfClaimed();
2430
- return;
2431
- }
2432
- const senderReason = messageIngress.senderAccess.reasonCode;
2433
- if (ingressDecision.decision !== "allow") {
2434
- if (ingressDecision.admission === "pairing-required") {
2435
- const senderName = await getSenderName();
2436
- const { code, created } = await core.channel.pairing.upsertPairingRequest({
2437
- channel: "matrix",
2438
- id: senderId,
2439
- accountId,
2440
- meta: { name: senderName }
2441
- });
2442
- if (shouldSendPairingReply(senderId, created)) {
2443
- const pairingReply = core.channel.pairing.buildPairingReply({
2444
- channel: "matrix",
2445
- idLine: `Your Matrix user id: ${senderId}`,
2446
- code
2447
- });
2448
- logVerboseMessage(created ? `matrix pairing request sender=${senderId} name=${senderName ?? "unknown"} (reason=${senderReason})` : `matrix pairing reminder sender=${senderId} name=${senderName ?? "unknown"} (reason=${senderReason})`);
2449
- try {
2450
- const { sendMessageMatrix } = await loadMatrixSendModule();
2451
- await sendMessageMatrix(`room:${roomId}`, created ? pairingReply : `${pairingReply}\n\nPairing request is still pending approval. Reusing existing code.`, {
2452
- client,
2453
- cfg,
2454
- accountId
2455
- });
2456
- await commitInboundEventIfClaimed();
2457
- } catch (err) {
2458
- logVerboseMessage(`matrix pairing reply failed for ${senderId}: ${String(err)}`);
2459
- return;
2460
- }
2461
- } else {
2462
- logVerboseMessage(`matrix pairing reminder suppressed sender=${senderId} (cooldown)`);
2463
- await commitInboundEventIfClaimed();
2464
- }
2465
- }
2466
- if (isReactionEvent || dmPolicy !== "pairing") {
2467
- logVerboseMessage(`matrix: blocked ${isReactionEvent ? "reaction" : "dm"} sender ${senderId} (dmPolicy=${dmPolicy}, reason=${senderReason})`);
2468
- await commitInboundEventIfClaimed();
2469
- }
2470
- return;
2471
- }
2472
- }
2473
- if (isRoom && ingressDecision.decision !== "allow") {
2474
- logVerboseMessage(`matrix: blocked sender ${senderId} (ingress=${ingressDecision.reasonCode}, ${roomMatchMeta})`);
2475
- await commitInboundEventIfClaimed();
2476
- return;
2477
- }
2478
- if (isRoom) logVerboseMessage(`matrix: allow room ${roomId} (${roomMatchMeta})`);
2479
- if (isReactionEvent) {
2480
- const senderName = await getSenderName();
2481
- const { handleInboundMatrixReaction } = await loadMatrixReactionEvents();
2482
- await handleInboundMatrixReaction({
2483
- client,
2484
- core,
2485
- cfg,
2486
- accountId,
2487
- roomId,
2488
- event,
2489
- senderId,
2490
- senderLabel: senderName,
2491
- selfUserId,
2492
- isDirectMessage,
2493
- logVerboseMessage
2494
- });
2495
- await commitInboundEventIfClaimed();
2496
- return;
2497
- }
2498
- let pollSnapshotPromise = null;
2499
- const getPollSnapshot = async () => {
2500
- if (!isPollEvent) return null;
2501
- pollSnapshotPromise ??= fetchMatrixPollSnapshot(client, roomId, event).catch((err) => {
2502
- logVerboseMessage(`matrix: failed resolving poll snapshot room=${roomId} id=${event.event_id ?? "unknown"}: ${String(err)}`);
2503
- return null;
2504
- });
2505
- return await pollSnapshotPromise;
2506
- };
2507
- const mentionPrecheckText = resolveMatrixMentionPrecheckText({
2508
- eventType,
2509
- content,
2510
- locationText: locationPayload?.text
2511
- });
2512
- const contentUrl = "url" in content && typeof content.url === "string" ? content.url : void 0;
2513
- const contentFile = "file" in content && content.file && typeof content.file === "object" ? content.file : void 0;
2514
- const mediaUrl = contentUrl ?? contentFile?.url;
2515
- const pendingHistoryText = resolveMatrixPendingHistoryText({
2516
- mentionPrecheckText,
2517
- content,
2518
- mediaUrl
2519
- });
2520
- const pendingHistoryPollText = !pendingHistoryText && isPollEvent && historyLimit > 0 ? (await getPollSnapshot())?.text : "";
2521
- if (!mentionPrecheckText && !mediaUrl && !isPollEvent) {
2522
- await commitInboundEventIfClaimed();
2523
- return;
2524
- }
2525
- const messageId = event.event_id ?? "";
2526
- const threadRootId = resolveMatrixThreadRootId({
2527
- event,
2528
- content
2529
- });
2530
- const thread = resolveMatrixThreadRouting({
2531
- isDirectMessage,
2532
- threadReplies,
2533
- dmThreadReplies,
2534
- messageId,
2535
- threadRootId
2536
- });
2537
- const { route: _route, configuredBinding: _configuredBinding, runtimeBindingId: _runtimeBindingId } = resolveMatrixInboundRoute({
2538
- cfg,
2539
- accountId,
2540
- roomId,
2541
- senderId,
2542
- isDirectMessage,
2543
- dmSessionScope,
2544
- threadId: thread.threadId,
2545
- eventTs: eventTs ?? void 0,
2546
- resolveAgentRoute: core.channel.routing.resolveAgentRoute
2547
- });
2548
- const hasExplicitSessionBinding = _configuredBinding !== null || _runtimeBindingId !== null;
2549
- const agentMentionRegexes = core.channel.mentions.buildMentionRegexes(cfg, _route.agentId);
2550
- const selfDisplayName = content.formatted_body ? await getMemberDisplayName(roomId, selfUserId).catch(() => void 0) : void 0;
2551
- const { wasMentioned, hasExplicitMention } = resolveMentions({
2552
- content,
2553
- userId: selfUserId,
2554
- displayName: selfDisplayName,
2555
- text: mentionPrecheckText,
2556
- mentionRegexes: agentMentionRegexes
2557
- });
2558
- if (isConfiguredBotSender && allowBotsMode === "mentions" && !isDirectMessage && !wasMentioned) {
2559
- logVerboseMessage(`matrix: drop configured bot sender=${senderId} (allowBots=mentions, missing mention, ${roomMatchMeta})`);
2560
- await commitInboundEventIfClaimed();
2561
- return;
2562
- }
2563
- const allowTextCommands = core.channel.commands.shouldHandleTextCommands({
2564
- cfg,
2565
- surface: "matrix"
2566
- });
2567
- const useAccessGroups = cfg.commands?.useAccessGroups !== false;
2568
- const commandCheckText = stripMatrixMentionPrefix({
2569
- text: mentionPrecheckText,
2570
- userId: selfUserId,
2571
- displayName: selfDisplayName,
2572
- mentionRegexes: agentMentionRegexes
2573
- });
2574
- const hasControlCommandInMessage = core.channel.text.hasControlCommand(commandCheckText, cfg);
2575
- const commandAccess = await resolveMatrixMonitorCommandAccess(accessState, {
2576
- useAccessGroups,
2577
- allowTextCommands,
2578
- hasControlCommand: hasControlCommandInMessage
2579
- });
2580
- const commandAuthorized = commandAccess.authorized;
2581
- if (isRoom && commandAccess.shouldBlockControlCommand) {
2582
- logInboundDrop({
2583
- log: logVerboseMessage,
2584
- channel: "matrix",
2585
- reason: "control command (unauthorized)",
2586
- target: senderId
2587
- });
2588
- await commitInboundEventIfClaimed();
2589
- return;
2590
- }
2591
- const shouldRequireMention = isRoom ? roomConfig?.autoReply === true ? false : roomConfig?.autoReply === false ? true : typeof roomConfig?.requireMention === "boolean" ? roomConfig?.requireMention : true : false;
2592
- const shouldBypassMention = allowTextCommands && isRoom && shouldRequireMention && !wasMentioned && !hasExplicitMention && commandAuthorized && hasControlCommandInMessage;
2593
- const canDetectMention = agentMentionRegexes.length > 0 || hasExplicitMention;
2594
- if (isRoom && shouldRequireMention && !wasMentioned && !shouldBypassMention) {
2595
- const pendingHistoryBody = pendingHistoryText || pendingHistoryPollText;
2596
- if (historyLimit > 0 && pendingHistoryBody) {
2597
- const pendingEntry = {
2598
- sender: senderId,
2599
- body: pendingHistoryBody,
2600
- timestamp: eventTs ?? void 0,
2601
- messageId
2602
- };
2603
- roomHistoryTracker.recordPending(roomId, pendingEntry);
2604
- }
2605
- logger.info("skipping room message", {
2606
- roomId,
2607
- reason: "no-mention"
2608
- });
2609
- await commitInboundEventIfClaimed();
2610
- return;
2611
- }
2612
- if (isPollEvent) {
2613
- const pollSnapshot = await getPollSnapshot();
2614
- if (!pollSnapshot) return;
2615
- content = {
2616
- msgtype: "m.text",
2617
- body: pollSnapshot.text
2618
- };
2619
- }
2620
- let media = null;
2621
- let mediaDownloadFailed = false;
2622
- let mediaSizeLimitExceeded = false;
2623
- const finalContentUrl = "url" in content && typeof content.url === "string" ? content.url : void 0;
2624
- const finalContentFile = "file" in content && content.file && typeof content.file === "object" ? content.file : void 0;
2625
- const finalMediaUrl = finalContentUrl ?? finalContentFile?.url;
2626
- const contentBody = typeof content.body === "string" ? content.body.trim() : "";
2627
- const originalFilename = (typeof content.filename === "string" ? content.filename.trim() : "") || contentBody || void 0;
2628
- const contentInfo = "info" in content && content.info && typeof content.info === "object" ? content.info : void 0;
2629
- const contentType = contentInfo?.mimetype;
2630
- const contentSize = typeof contentInfo?.size === "number" ? contentInfo.size : void 0;
2631
- if (finalMediaUrl?.startsWith("mxc://")) try {
2632
- media = await downloadMatrixMedia({
2633
- client,
2634
- mxcUrl: finalMediaUrl,
2635
- contentType,
2636
- sizeBytes: contentSize,
2637
- maxBytes: mediaMaxBytes,
2638
- file: finalContentFile,
2639
- originalFilename
2640
- });
2641
- } catch (err) {
2642
- mediaDownloadFailed = true;
2643
- if (isMatrixMediaSizeLimitError(err)) mediaSizeLimitExceeded = true;
2644
- const errorText = formatMatrixErrorMessage(err);
2645
- logVerboseMessage(`matrix: media download failed room=${roomId} id=${event.event_id ?? "unknown"} type=${content.msgtype} error=${errorText}`);
2646
- logger.warn("matrix media download failed", {
2647
- roomId,
2648
- eventId: event.event_id,
2649
- msgtype: content.msgtype,
2650
- encrypted: Boolean(finalContentFile),
2651
- error: errorText
2652
- });
2653
- }
2654
- const bodyText = resolveMatrixInboundBodyText({
2655
- rawBody: locationPayload?.text ?? contentBody,
2656
- filename: typeof content.filename === "string" ? content.filename : void 0,
2657
- mediaPlaceholder: media?.placeholder,
2658
- msgtype: content.msgtype,
2659
- hadMediaUrl: Boolean(finalMediaUrl),
2660
- mediaDownloadFailed,
2661
- mediaSizeLimitExceeded
2662
- });
2663
- if (!bodyText) {
2664
- await commitInboundEventIfClaimed();
2665
- return;
2666
- }
2667
- const commandBodyText = hasControlCommandInMessage ? commandCheckText : bodyText;
2668
- const senderName = await getSenderName();
2669
- if (_configuredBinding) {
2670
- const { ensureConfiguredAcpBindingReady } = await loadAcpBindingRuntime();
2671
- if (!(await ensureConfiguredAcpBindingReady({
2672
- cfg,
2673
- configuredBinding: _configuredBinding
2674
- })).ok) {
2675
- logInboundDrop({
2676
- log: logVerboseMessage,
2677
- channel: "matrix",
2678
- reason: "configured ACP binding unavailable",
2679
- target: _configuredBinding.spec.conversationId
2680
- });
2681
- return;
2682
- }
2683
- }
2684
- if (_runtimeBindingId) {
2685
- const { getSessionBindingService } = await loadSessionBindingRuntime();
2686
- getSessionBindingService().touch(_runtimeBindingId, eventTs ?? void 0);
2687
- }
2688
- const preparedTrigger = isRoom && historyLimit > 0 ? roomHistoryTracker.prepareTrigger(_route.agentId, roomId, historyLimit, {
2689
- sender: senderName,
2690
- body: bodyText,
2691
- timestamp: eventTs ?? void 0,
2692
- messageId
2693
- }) : void 0;
2694
- return {
2695
- route: _route,
2696
- hasExplicitSessionBinding,
2697
- roomConfig,
2698
- isDirectMessage,
2699
- isRoom,
2700
- shouldRequireMention,
2701
- wasMentioned,
2702
- shouldBypassMention,
2703
- canDetectMention,
2704
- commandAuthorized,
2705
- inboundHistory: preparedTrigger ? buildInboundHistoryFromEntries({
2706
- entries: preparedTrigger.history,
2707
- limit: historyLimit
2708
- }) : void 0,
2709
- senderName,
2710
- bodyText,
2711
- commandBodyText,
2712
- media,
2713
- locationPayload,
2714
- messageId,
2715
- triggerSnapshot: preparedTrigger,
2716
- threadRootId,
2717
- thread,
2718
- botLoopProtection,
2719
- effectiveGroupAllowFrom,
2720
- effectiveRoomUsers
2721
- };
2722
- };
2723
- const ingressResult = historyLimit > 0 ? await runRoomIngress(roomId, async () => {
2724
- const prefix = await readIngressPrefix();
2725
- if (!prefix) return;
2726
- if (prefix.isDirectMessage) return { deferredPrefix: prefix };
2727
- return { ingressResult: await continueIngress(prefix) };
2728
- }) : void 0;
2729
- const resolvedIngressResult = historyLimit > 0 ? ingressResult?.deferredPrefix ? await continueIngress(ingressResult.deferredPrefix) : ingressResult?.ingressResult : await (async () => {
2730
- const prefix = await readIngressPrefix();
2731
- if (!prefix) return;
2732
- return await continueIngress(prefix);
2733
- })();
2734
- if (!resolvedIngressResult) return;
2735
- const { route: _route, hasExplicitSessionBinding, roomConfig, isDirectMessage, isRoom, shouldRequireMention, wasMentioned, shouldBypassMention, canDetectMention, commandAuthorized, inboundHistory, senderName, bodyText, commandBodyText, media, locationPayload, messageId, triggerSnapshot, threadRootId, thread, botLoopProtection, effectiveGroupAllowFrom, effectiveRoomUsers } = resolvedIngressResult;
2736
- const replyToEventId = resolveMatrixReplyToEventId(event.content);
2737
- const threadTarget = thread.threadId;
2738
- const isRoomContextSenderAllowed = (contextSenderId) => {
2739
- if (!isRoom || !contextSenderId) return true;
2740
- if (effectiveRoomUsers.length > 0) return resolveMatrixAllowListMatch({
2741
- allowList: effectiveRoomUsers,
2742
- userId: contextSenderId
2743
- }).allowed;
2744
- if (groupPolicy === "allowlist" && effectiveGroupAllowFrom.length > 0) return resolveMatrixAllowListMatch({
2745
- allowList: effectiveGroupAllowFrom,
2746
- userId: contextSenderId
2747
- }).allowed;
2748
- return true;
2749
- };
2750
- const shouldIncludeRoomContextSender = (kind, contextSenderId) => evaluateSupplementalContextVisibility({
2751
- mode: contextVisibilityMode,
2752
- kind,
2753
- senderAllowed: isRoomContextSenderAllowed(contextSenderId)
2754
- }).include;
2755
- let threadContext = threadRootId ? await resolveThreadContext({
2756
- roomId,
2757
- threadRootId
2758
- }) : void 0;
2759
- let threadContextBlockedByPolicy = false;
2760
- if (threadContext?.senderId && !shouldIncludeRoomContextSender("thread", threadContext.senderId)) {
2761
- logVerboseMessage(`matrix: drop thread root context (mode=${contextVisibilityMode})`);
2762
- threadContextBlockedByPolicy = true;
2763
- threadContext = void 0;
2764
- }
2765
- let replyContext;
2766
- if (replyToEventId && replyToEventId === threadRootId && threadContext?.summary) replyContext = {
2767
- replyToBody: threadContext.summary,
2768
- replyToSender: threadContext.senderLabel,
2769
- replyToSenderId: threadContext.senderId
2770
- };
2771
- else if (replyToEventId && replyToEventId === threadRootId && threadContextBlockedByPolicy) replyContext = await resolveReplyContext({
2772
- roomId,
2773
- eventId: replyToEventId
2774
- });
2775
- else replyContext = replyToEventId ? await resolveReplyContext({
2776
- roomId,
2777
- eventId: replyToEventId
2778
- }) : void 0;
2779
- if (replyContext?.replyToSenderId && !shouldIncludeRoomContextSender("quote", replyContext.replyToSenderId)) {
2780
- logVerboseMessage(`matrix: drop reply context (mode=${contextVisibilityMode})`);
2781
- replyContext = void 0;
2782
- }
2783
- const roomName = (isRoom ? await getRoomInfo(roomId) : void 0)?.name;
2784
- const envelopeFrom = isDirectMessage ? senderName : roomName ?? roomId;
2785
- const textWithId = `${bodyText}\n[matrix event id: ${messageId} room: ${roomId}]`;
2786
- const storePath = core.channel.session.resolveStorePath(cfg.session?.store, { agentId: _route.agentId });
2787
- const envelopeOptions = core.channel.reply.resolveEnvelopeFormatOptions(cfg);
2788
- const previousTimestamp = core.channel.session.readSessionUpdatedAt({
2789
- storePath,
2790
- sessionKey: _route.sessionKey
2791
- });
2792
- const sharedDmNoticeSessionKey = threadTarget ? _route.mainSessionKey || _route.sessionKey : _route.sessionKey;
2793
- const sharedDmContextNotice = isDirectMessage ? hasExplicitSessionBinding ? null : resolveMatrixSharedDmContextNotice({
2794
- storePath,
2795
- sessionKey: sharedDmNoticeSessionKey,
2796
- roomId,
2797
- accountId: _route.accountId,
2798
- dmSessionScope,
2799
- sentRooms: sharedDmContextNoticeRooms,
2800
- logVerboseMessage
2801
- }) : null;
2802
- const body = core.channel.reply.formatAgentEnvelope({
2803
- channel: "Matrix",
2804
- from: envelopeFrom,
2805
- timestamp: eventTs ?? void 0,
2806
- previousTimestamp,
2807
- envelope: envelopeOptions,
2808
- body: textWithId
2809
- });
2810
- const groupSystemPrompt = normalizeOptionalString(roomConfig?.systemPrompt);
2811
- const ctxPayload = core.channel.reply.finalizeInboundContext({
2812
- Body: body,
2813
- RawBody: bodyText,
2814
- CommandBody: commandBodyText,
2815
- BodyForAgent: bodyText,
2816
- BodyForCommands: commandBodyText,
2817
- InboundHistory: inboundHistory && inboundHistory.length > 0 ? inboundHistory : void 0,
2818
- From: isDirectMessage ? `matrix:${senderId}` : `matrix:channel:${roomId}`,
2819
- To: `room:${roomId}`,
2820
- SessionKey: _route.sessionKey,
2821
- AccountId: _route.accountId,
2822
- ChatType: isDirectMessage ? "direct" : "channel",
2823
- ConversationLabel: envelopeFrom,
2824
- SenderName: senderName,
2825
- SenderId: senderId,
2826
- SenderUsername: senderId.split(":")[0]?.replace(/^@/, ""),
2827
- GroupSubject: isRoom ? roomName ?? roomId : void 0,
2828
- GroupId: isRoom ? roomId : void 0,
2829
- GroupChannel: isRoom ? roomId : void 0,
2830
- GroupSystemPrompt: isRoom ? groupSystemPrompt : void 0,
2831
- Provider: "matrix",
2832
- Surface: "matrix",
2833
- WasMentioned: isRoom ? wasMentioned : void 0,
2834
- MessageSid: messageId,
2835
- ReplyToId: threadTarget ? void 0 : replyToEventId ?? void 0,
2836
- ReplyToBody: replyContext?.replyToBody,
2837
- ReplyToSender: replyContext?.replyToSender,
2838
- MessageThreadId: threadTarget,
2839
- ThreadStarterBody: threadContext?.threadStarterBody,
2840
- Timestamp: eventTs ?? void 0,
2841
- MediaPath: media?.path,
2842
- MediaType: media?.contentType,
2843
- MediaUrl: media?.path,
2844
- ...locationPayload?.context,
2845
- CommandAuthorized: commandAuthorized,
2846
- CommandSource: "text",
2847
- NativeChannelId: roomId,
2848
- NativeDirectUserId: isDirectMessage ? senderId : void 0,
2849
- OriginatingChannel: "matrix",
2850
- OriginatingTo: `room:${roomId}`
2851
- });
2852
- logVerboseMessage(`matrix inbound: room=${roomId} from=${senderId} preview="${bodyText.slice(0, 200).replace(/\n/g, "\\n")}"`);
2853
- const replyTarget = ctxPayload.To;
2854
- if (!replyTarget) {
2855
- runtime.error?.("matrix: missing reply target");
2856
- return;
2857
- }
2858
- const { ackReaction, ackReactionScope: ackScope } = resolveMatrixAckReactionConfig({
2859
- cfg,
2860
- agentId: _route.agentId,
2861
- accountId
2862
- });
2863
- const shouldAckReaction = () => Boolean(ackReaction && core.channel.reactions.shouldAckReaction({
2864
- scope: ackScope,
2865
- isDirect: isDirectMessage,
2866
- isGroup: isRoom,
2867
- isMentionableGroup: isRoom,
2868
- requireMention: shouldRequireMention,
2869
- canDetectMention,
2870
- effectiveWasMentioned: wasMentioned || shouldBypassMention,
2871
- shouldBypassMention
2872
- }));
2873
- if (shouldAckReaction() && messageId) loadMatrixSendModule().then(({ reactMatrixMessage }) => reactMatrixMessage(roomId, messageId, ackReaction, client)).catch((err) => {
2874
- logVerboseMessage(`matrix react failed for room ${roomId}: ${String(err)}`);
2875
- });
2876
- if (messageId) loadMatrixSendModule().then(({ sendReadReceiptMatrix }) => sendReadReceiptMatrix(roomId, messageId, client)).catch((err) => {
2877
- logVerboseMessage(`matrix: read receipt failed room=${roomId} id=${messageId}: ${String(err)}`);
2878
- });
2879
- const tableMode = core.channel.text.resolveMarkdownTableMode({
2880
- cfg,
2881
- channel: "matrix",
2882
- accountId: _route.accountId
2883
- });
2884
- const mediaLocalRoots = getAgentScopedMediaLocalRoots(cfg, _route.agentId);
2885
- let finalReplyDeliveryFailed = false;
2886
- let nonFinalReplyDeliveryFailed = false;
2887
- let retryableReplyDeliveryFailed = false;
2888
- const { onModelSelected, ...prefixOptions } = createReplyPrefixOptions({
2889
- cfg,
2890
- agentId: _route.agentId,
2891
- channel: "matrix",
2892
- accountId: _route.accountId
2893
- });
2894
- const typingCallbacks = createTypingCallbacks({
2895
- start: async () => {
2896
- const { sendTypingMatrix } = await loadMatrixSendModule();
2897
- await sendTypingMatrix(roomId, true, void 0, client);
2898
- },
2899
- stop: async () => {
2900
- const { sendTypingMatrix } = await loadMatrixSendModule();
2901
- await sendTypingMatrix(roomId, false, void 0, client);
2902
- },
2903
- onStartError: (err) => {
2904
- logTypingFailure({
2905
- log: logVerboseMessage,
2906
- channel: "matrix",
2907
- action: "start",
2908
- target: roomId,
2909
- error: err
2910
- });
2911
- },
2912
- onStopError: (err) => {
2913
- logTypingFailure({
2914
- log: logVerboseMessage,
2915
- channel: "matrix",
2916
- action: "stop",
2917
- target: roomId,
2918
- error: err
2919
- });
2920
- }
2921
- });
2922
- const draftStreamingEnabled = streaming !== "off";
2923
- const quietDraftStreaming = streaming === "quiet" || streaming === "progress";
2924
- const progressDraftStreaming = streaming === "progress";
2925
- const draftReplyToId = replyToMode !== "off" && !threadTarget ? messageId : void 0;
2926
- const draftStream = draftStreamingEnabled ? await loadMatrixDraftStream().then(({ createMatrixDraftStream }) => createMatrixDraftStream({
2927
- roomId,
2928
- client,
2929
- cfg,
2930
- mode: quietDraftStreaming ? "quiet" : "partial",
2931
- threadId: threadTarget,
2932
- replyToId: draftReplyToId,
2933
- preserveReplyId: replyToMode === "all",
2934
- accountId: _route.accountId,
2935
- log: logVerboseMessage
2936
- })) : void 0;
2937
- draftStreamRef = draftStream;
2938
- const shouldStreamPreviewToolProgress = Boolean(draftStream) && previewToolProgressEnabled;
2939
- const shouldSuppressDefaultToolProgressMessages = Boolean(draftStream) && (shouldStreamPreviewToolProgress || params.streaming === "progress");
2940
- let currentDraftMessageGeneration = 0;
2941
- let currentDraftBlockOffset = 0;
2942
- let latestDraftFullText = "";
2943
- const pendingDraftBoundaries = [];
2944
- const latestQueuedDraftBoundaryOffsets = /* @__PURE__ */ new Map();
2945
- let currentDraftReplyToId = draftReplyToId;
2946
- let previewToolProgressSuppressed = false;
2947
- let previewToolProgressLines = [];
2948
- const progressConfigEntry = params.accountConfig ?? cfg.channels?.matrix;
2949
- const progressSeed = `${_route.accountId}:${roomId}`;
2950
- const renderProgressDraft = () => {
2951
- if (!draftStream || !progressDraftStreaming) return;
2952
- const previewText = formatChannelProgressDraftText({
2953
- entry: progressConfigEntry,
2954
- lines: previewToolProgressLines,
2955
- seed: progressSeed,
2956
- formatLine: formatMatrixToolProgressMarkdownCode,
2957
- bullet: "-"
2958
- });
2959
- if (!previewText) return;
2960
- draftStream.update(previewText);
2961
- };
2962
- const progressDraftGate = createChannelProgressDraftGate({ onStart: renderProgressDraft });
2963
- const pushPreviewToolProgress = async (line, options) => {
2964
- if (!draftStream) return;
2965
- if (options?.toolName !== void 0 && !isChannelProgressDraftWorkToolName(options.toolName)) return;
2966
- const normalized = normalizeChannelProgressDraftLineIdentity(line);
2967
- const progressLine = typeof line === "object" && line !== void 0 ? line : normalized;
2968
- if (!progressDraftStreaming) {
2969
- if (!shouldStreamPreviewToolProgress || previewToolProgressSuppressed || !normalized) return;
2970
- const nextLines = mergeChannelProgressDraftLine(previewToolProgressLines, progressLine, { maxLines: resolveChannelProgressDraftMaxLines(progressConfigEntry) });
2971
- if (nextLines === previewToolProgressLines) return;
2972
- previewToolProgressLines = nextLines;
2973
- draftStream.update(formatChannelProgressDraftText({
2974
- entry: progressConfigEntry,
2975
- lines: previewToolProgressLines,
2976
- seed: progressSeed,
2977
- formatLine: formatMatrixToolProgressMarkdownCode,
2978
- bullet: "-"
2979
- }));
2980
- return;
2981
- }
2982
- if (shouldStreamPreviewToolProgress && !previewToolProgressSuppressed && normalized) previewToolProgressLines = mergeChannelProgressDraftLine(previewToolProgressLines, progressLine, { maxLines: resolveChannelProgressDraftMaxLines(progressConfigEntry) });
2983
- const alreadyStarted = progressDraftGate.hasStarted;
2984
- await progressDraftGate.noteWork();
2985
- if (alreadyStarted && progressDraftGate.hasStarted) renderProgressDraft();
2986
- };
2987
- const suppressPreviewToolProgressForAnswerText = (text) => {
2988
- if (!text?.trim()) return;
2989
- previewToolProgressSuppressed = true;
2990
- previewToolProgressLines = [];
2991
- };
2992
- const resetPreviewToolProgress = () => {
2993
- previewToolProgressSuppressed = false;
2994
- previewToolProgressLines = [];
2995
- };
2996
- const buildPreviewToolProgressReplyOptions = () => {
2997
- if (!shouldSuppressDefaultToolProgressMessages) return {};
2998
- const options = { suppressDefaultToolProgressMessages: true };
2999
- if (!shouldStreamPreviewToolProgress) return options;
3000
- return {
3001
- ...options,
3002
- onToolStart: async (payload) => {
3003
- const toolName = payload.name?.trim();
3004
- await pushPreviewToolProgress(formatChannelProgressDraftLineForEntry(progressConfigEntry, {
3005
- event: "tool",
3006
- name: toolName,
3007
- phase: payload.phase,
3008
- args: payload.args
3009
- }, payload.detailMode ? { detailMode: payload.detailMode } : void 0), { toolName });
3010
- },
3011
- onItemEvent: async (payload) => {
3012
- await pushPreviewToolProgress(buildChannelProgressDraftLineForEntry(progressConfigEntry, {
3013
- event: "item",
3014
- itemId: payload.itemId,
3015
- itemKind: payload.kind,
3016
- title: payload.title,
3017
- name: payload.name,
3018
- phase: payload.phase,
3019
- status: payload.status,
3020
- summary: payload.summary,
3021
- progressText: payload.progressText,
3022
- meta: payload.meta
3023
- }));
3024
- },
3025
- onPlanUpdate: async (payload) => {
3026
- if (payload.phase !== "update") return;
3027
- await pushPreviewToolProgress(formatChannelProgressDraftLine({
3028
- event: "plan",
3029
- phase: payload.phase,
3030
- title: payload.title,
3031
- explanation: payload.explanation,
3032
- steps: payload.steps
3033
- }));
3034
- },
3035
- onApprovalEvent: async (payload) => {
3036
- if (payload.phase !== "requested") return;
3037
- await pushPreviewToolProgress(formatChannelProgressDraftLine({
3038
- event: "approval",
3039
- phase: payload.phase,
3040
- title: payload.title,
3041
- command: payload.command,
3042
- reason: payload.reason,
3043
- message: payload.message
3044
- }));
3045
- },
3046
- onCommandOutput: async (payload) => {
3047
- if (payload.phase !== "end") return;
3048
- await pushPreviewToolProgress(formatChannelProgressDraftLine({
3049
- event: "command-output",
3050
- phase: payload.phase,
3051
- title: payload.title,
3052
- name: payload.name,
3053
- status: payload.status,
3054
- exitCode: payload.exitCode
3055
- }));
3056
- },
3057
- onPatchSummary: async (payload) => {
3058
- if (payload.phase !== "end") return;
3059
- await pushPreviewToolProgress(formatChannelProgressDraftLine({
3060
- event: "patch",
3061
- phase: payload.phase,
3062
- title: payload.title,
3063
- name: payload.name,
3064
- added: payload.added,
3065
- modified: payload.modified,
3066
- deleted: payload.deleted,
3067
- summary: payload.summary
3068
- }));
3069
- }
3070
- };
3071
- };
3072
- const getDisplayableDraftText = () => {
3073
- const nextDraftBoundaryOffset = pendingDraftBoundaries.find((boundary) => boundary.messageGeneration === currentDraftMessageGeneration)?.endOffset;
3074
- if (nextDraftBoundaryOffset === void 0) return latestDraftFullText.slice(currentDraftBlockOffset);
3075
- return latestDraftFullText.slice(currentDraftBlockOffset, nextDraftBoundaryOffset);
3076
- };
3077
- const updateDraftFromLatestFullText = () => {
3078
- const blockText = getDisplayableDraftText();
3079
- if (blockText) draftStream?.update(blockText);
3080
- };
3081
- const queueDraftBlockBoundary = (payload, context) => {
3082
- const payloadTextLength = payload.text?.length ?? 0;
3083
- const messageGeneration = context?.assistantMessageIndex ?? currentDraftMessageGeneration;
3084
- const nextDraftBoundaryOffset = (latestQueuedDraftBoundaryOffsets.get(messageGeneration) ?? 0) + payloadTextLength;
3085
- latestQueuedDraftBoundaryOffsets.set(messageGeneration, nextDraftBoundaryOffset);
3086
- pendingDraftBoundaries.push({
3087
- messageGeneration,
3088
- endOffset: nextDraftBoundaryOffset
3089
- });
3090
- };
3091
- const advanceDraftBlockBoundary = (options) => {
3092
- const completedBoundary = pendingDraftBoundaries.shift();
3093
- if (completedBoundary) {
3094
- if (!pendingDraftBoundaries.some((entry) => entry.messageGeneration === completedBoundary.messageGeneration)) latestQueuedDraftBoundaryOffsets.delete(completedBoundary.messageGeneration);
3095
- if (completedBoundary.messageGeneration === currentDraftMessageGeneration) currentDraftBlockOffset = completedBoundary.endOffset;
3096
- return;
3097
- }
3098
- if (options?.fallbackToLatestEnd) currentDraftBlockOffset = latestDraftFullText.length;
3099
- };
3100
- const resetDraftBlockOffsets = () => {
3101
- currentDraftMessageGeneration += 1;
3102
- currentDraftBlockOffset = 0;
3103
- latestDraftFullText = "";
3104
- };
3105
- const { dispatcher, replyOptions, markDispatchIdle, markRunComplete } = core.channel.reply.createReplyDispatcherWithTyping({
3106
- ...prefixOptions,
3107
- humanDelay: core.channel.reply.resolveHumanDelayConfig(cfg, _route.agentId),
3108
- deliver: async (payload, info) => {
3109
- if (draftStream && info.kind !== "tool" && !payload.isCompactionNotice) {
3110
- const hasMedia = Boolean(payload.mediaUrl) || (payload.mediaUrls?.length ?? 0) > 0;
3111
- const ttsSupplement = getReplyPayloadTtsSupplement(payload);
3112
- const fallbackPayload = ttsSupplement && ttsSupplement.visibleTextAlreadyDelivered !== true && !payload.text?.trim() ? {
3113
- ...payload,
3114
- text: ttsSupplement.spokenText
3115
- } : payload;
3116
- if (draftConsumed) {
3117
- await draftStream.discardPending();
3118
- await deliverMatrixReplies({
3119
- cfg,
3120
- replies: [fallbackPayload],
3121
- roomId,
3122
- client,
3123
- runtime,
3124
- textLimit,
3125
- replyToMode,
3126
- threadId: threadTarget,
3127
- accountId: _route.accountId,
3128
- mediaLocalRoots,
3129
- tableMode
3130
- });
3131
- return;
3132
- }
3133
- const payloadReplyToId = normalizeOptionalString(payload.replyToId);
3134
- const payloadReplyMismatch = replyToMode !== "off" && !threadTarget && payloadReplyToId !== currentDraftReplyToId;
3135
- let mustDeliverFinalNormally = draftStream.mustDeliverFinalNormally();
3136
- if (Boolean(payload.text?.trim()) && !payload.isError && !payloadReplyMismatch && !mustDeliverFinalNormally) {
3137
- await draftStream.stop();
3138
- mustDeliverFinalNormally = draftStream.mustDeliverFinalNormally();
3139
- } else await draftStream.discardPending();
3140
- const draftEventId = draftStream.eventId();
3141
- if (draftEventId && payload.text && !payload.isError && !hasMedia && !payloadReplyMismatch && !mustDeliverFinalNormally) {
3142
- const finalPreviewText = payload.text;
3143
- await deliverWithFinalizableLivePreviewAdapter({
3144
- kind: "final",
3145
- payload,
3146
- adapter: defineFinalizableLivePreviewAdapter({
3147
- draft: {
3148
- flush: async () => {},
3149
- clear: async () => {},
3150
- discardPending: async () => {},
3151
- id: () => draftEventId
3152
- },
3153
- buildFinalEdit: () => ({
3154
- text: finalPreviewText,
3155
- finalizeLive: !(quietDraftStreaming || !draftStream.matchesPreparedText(finalPreviewText)),
3156
- ...quietDraftStreaming ? { extraContent: buildMatrixFinalizedPreviewContent() } : {}
3157
- }),
3158
- editFinal: async (_draftEventId, edit) => {
3159
- if (edit.finalizeLive) {
3160
- if (!await draftStream.finalizeLive()) throw new Error("Matrix draft live finalize failed");
3161
- return;
3162
- }
3163
- const { editMessageMatrix } = await loadMatrixSendModule();
3164
- await editMessageMatrix(roomId, _draftEventId, edit.text, {
3165
- client,
3166
- cfg,
3167
- threadId: threadTarget,
3168
- accountId: _route.accountId,
3169
- extraContent: edit.extraContent
3170
- });
3171
- },
3172
- createPreviewReceipt: (id) => createPreviewMessageReceipt({
3173
- id,
3174
- ...threadTarget ? { threadId: threadTarget } : {},
3175
- ...currentDraftReplyToId ? { replyToId: currentDraftReplyToId } : {}
3176
- }),
3177
- logPreviewEditFailure: (err) => {
3178
- logVerboseMessage(`matrix: preview final edit failed: ${String(err)}`);
3179
- }
3180
- }),
3181
- deliverNormally: async () => {
3182
- await redactMatrixDraftEvent(client, roomId, draftEventId);
3183
- await deliverMatrixReplies({
3184
- cfg,
3185
- replies: [fallbackPayload],
3186
- roomId,
3187
- client,
3188
- runtime,
3189
- textLimit,
3190
- replyToMode,
3191
- threadId: threadTarget,
3192
- accountId: _route.accountId,
3193
- mediaLocalRoots,
3194
- tableMode
3195
- });
3196
- }
3197
- });
3198
- draftConsumed = true;
3199
- } else if (draftEventId && hasMedia && !payloadReplyMismatch) {
3200
- let textEditOk = !mustDeliverFinalNormally;
3201
- const payloadText = payload.text ?? ttsSupplement?.spokenText;
3202
- const payloadTextMatchesDraft = typeof payloadText === "string" && draftStream.matchesPreparedText(payloadText);
3203
- const reusesDraftTextUnchanged = typeof payloadText === "string" && Boolean(payloadText.trim()) && payloadTextMatchesDraft;
3204
- if (textEditOk && payloadText && (quietDraftStreaming || typeof payloadText === "string" && !payloadTextMatchesDraft)) {
3205
- const { editMessageMatrix } = await loadMatrixSendModule();
3206
- textEditOk = await editMessageMatrix(roomId, draftEventId, payloadText, {
3207
- client,
3208
- cfg,
3209
- threadId: threadTarget,
3210
- accountId: _route.accountId,
3211
- extraContent: quietDraftStreaming ? buildMatrixFinalizedPreviewContent() : void 0
3212
- }).then(() => true, () => false);
3213
- } else if (textEditOk && reusesDraftTextUnchanged) textEditOk = await draftStream.finalizeLive();
3214
- const reusesDraftAsFinalText = Boolean(payloadText?.trim()) && textEditOk;
3215
- if (!reusesDraftAsFinalText) await redactMatrixDraftEvent(client, roomId, draftEventId);
3216
- await deliverMatrixReplies({
3217
- cfg,
3218
- replies: [ttsSupplement && reusesDraftAsFinalText ? buildTtsSupplementMediaPayload(payload) : {
3219
- ...payload,
3220
- text: reusesDraftAsFinalText ? void 0 : payload.text ?? (ttsSupplement?.visibleTextAlreadyDelivered === true ? void 0 : ttsSupplement?.spokenText)
3221
- }],
3222
- roomId,
3223
- client,
3224
- runtime,
3225
- textLimit,
3226
- replyToMode,
3227
- threadId: threadTarget,
3228
- accountId: _route.accountId,
3229
- mediaLocalRoots,
3230
- tableMode
3231
- });
3232
- draftConsumed = true;
3233
- } else {
3234
- const draftRedacted = Boolean(draftEventId) && (payload.isError || payloadReplyMismatch || mustDeliverFinalNormally);
3235
- if (draftRedacted && draftEventId) await redactMatrixDraftEvent(client, roomId, draftEventId);
3236
- const deliveredFallback = await deliverMatrixReplies({
3237
- cfg,
3238
- replies: [fallbackPayload],
3239
- roomId,
3240
- client,
3241
- runtime,
3242
- textLimit,
3243
- replyToMode,
3244
- threadId: threadTarget,
3245
- accountId: _route.accountId,
3246
- mediaLocalRoots,
3247
- tableMode
3248
- });
3249
- if (draftRedacted || deliveredFallback) draftConsumed = true;
3250
- }
3251
- if (info.kind === "block") {
3252
- draftConsumed = false;
3253
- advanceDraftBlockBoundary({ fallbackToLatestEnd: true });
3254
- draftStream.reset();
3255
- currentDraftReplyToId = replyToMode === "all" ? draftReplyToId : void 0;
3256
- updateDraftFromLatestFullText();
3257
- const { sendTypingMatrix } = await loadMatrixSendModule();
3258
- await sendTypingMatrix(roomId, true, void 0, client).catch(() => {});
3259
- }
3260
- } else await deliverMatrixReplies({
3261
- cfg,
3262
- replies: [payload],
3263
- roomId,
3264
- client,
3265
- runtime,
3266
- textLimit,
3267
- replyToMode,
3268
- threadId: threadTarget,
3269
- accountId: _route.accountId,
3270
- mediaLocalRoots,
3271
- tableMode
3272
- });
3273
- },
3274
- onError: (err, info) => {
3275
- if (err instanceof MatrixRetryableInboundError) retryableReplyDeliveryFailed = true;
3276
- if (info.kind === "final") finalReplyDeliveryFailed = true;
3277
- else nonFinalReplyDeliveryFailed = true;
3278
- if (info.kind === "block") advanceDraftBlockBoundary({ fallbackToLatestEnd: true });
3279
- runtime.error?.(`matrix ${info.kind} reply failed: ${String(err)}`);
3280
- },
3281
- onReplyStart: typingCallbacks.onReplyStart,
3282
- onIdle: typingCallbacks.onIdle
3283
- });
3284
- const pinnedMainDmOwner = isDirectMessage ? await (async () => {
3285
- const livePinnedCfg = core.config.current();
3286
- const livePinnedDmAllowFrom = await resolveCachedLiveAllowlist({
3287
- cfg: livePinnedCfg,
3288
- entries: resolveMatrixAccountAllowlistConfig({
3289
- cfg: livePinnedCfg,
3290
- accountId
3291
- }).dmAllowFrom,
3292
- startupResolvedEntries: allowFromResolvedEntries,
3293
- cache: liveDmAllowlistCache,
3294
- updateCache: (next) => {
3295
- liveDmAllowlistCache = next;
3296
- }
3297
- });
3298
- return resolvePinnedMainDmOwnerFromAllowlist({
3299
- dmScope: livePinnedCfg.session?.dmScope,
3300
- allowFrom: livePinnedDmAllowFrom,
3301
- normalizeEntry: normalizeMatrixUserId
3302
- });
3303
- })() : null;
3304
- const inboundLastRouteSessionKey = resolveInboundLastRouteSessionKey({
3305
- route: _route,
3306
- sessionKey: _route.sessionKey
3307
- });
3308
- const turnResult = await core.channel.turn.run({
3309
- channel: "matrix",
3310
- accountId: _route.accountId,
3311
- raw: event,
3312
- adapter: {
3313
- ingest: () => ({
3314
- id: messageId,
3315
- rawText: bodyText,
3316
- textForAgent: ctxPayload.BodyForAgent,
3317
- textForCommands: ctxPayload.CommandBody,
3318
- raw: event
3319
- }),
3320
- resolveTurn: () => ({
3321
- channel: "matrix",
3322
- accountId: _route.accountId,
3323
- routeSessionKey: _route.sessionKey,
3324
- storePath,
3325
- ctxPayload,
3326
- recordInboundSession: core.channel.session.recordInboundSession,
3327
- botLoopProtection,
3328
- record: {
3329
- updateLastRoute: isDirectMessage ? {
3330
- sessionKey: inboundLastRouteSessionKey,
3331
- channel: "matrix",
3332
- to: `room:${roomId}`,
3333
- accountId: _route.accountId,
3334
- mainDmOwnerPin: inboundLastRouteSessionKey === _route.mainSessionKey && pinnedMainDmOwner ? {
3335
- ownerRecipient: pinnedMainDmOwner,
3336
- senderRecipient: normalizeMatrixUserId(senderId),
3337
- onSkip: ({ ownerRecipient, senderRecipient }) => {
3338
- logVerboseMessage(`matrix: skip main-session last route for ${senderRecipient} (pinned owner ${ownerRecipient})`);
3339
- }
3340
- } : void 0
3341
- } : void 0,
3342
- onRecordError: (err) => {
3343
- logger.warn("failed updating session meta", {
3344
- error: String(err),
3345
- storePath,
3346
- sessionKey: ctxPayload.SessionKey ?? _route.sessionKey
3347
- });
3348
- }
3349
- },
3350
- onPreDispatchFailure: () => core.channel.reply.settleReplyDispatcher({
3351
- dispatcher,
3352
- onSettled: () => {
3353
- markRunComplete();
3354
- markDispatchIdle();
3355
- }
3356
- }),
3357
- runDispatch: async () => {
3358
- if (sharedDmContextNotice && markTrackedRoomIfFirst(sharedDmContextNoticeRooms, roomId)) client.sendMessage(roomId, {
3359
- msgtype: "m.notice",
3360
- body: sharedDmContextNotice
3361
- }).catch((err) => {
3362
- logVerboseMessage(`matrix: failed sending shared DM session notice room=${roomId}: ${String(err)}`);
3363
- });
3364
- return await core.channel.reply.withReplyDispatcher({
3365
- dispatcher,
3366
- onSettled: () => {
3367
- markDispatchIdle();
3368
- },
3369
- run: async () => {
3370
- try {
3371
- return await core.channel.reply.dispatchReplyFromConfig({
3372
- ctx: ctxPayload,
3373
- cfg,
3374
- dispatcher,
3375
- replyOptions: {
3376
- ...replyOptions,
3377
- skillFilter: roomConfig?.skills,
3378
- disableBlockStreaming: !blockStreamingEnabled,
3379
- onPartialReply: draftStream ? (payload) => {
3380
- if (progressDraftStreaming) return;
3381
- latestDraftFullText = payload.text ?? "";
3382
- suppressPreviewToolProgressForAnswerText(latestDraftFullText);
3383
- updateDraftFromLatestFullText();
3384
- } : void 0,
3385
- onBlockReplyQueued: draftStream ? (payload, context) => {
3386
- if (payload.isCompactionNotice === true) return;
3387
- queueDraftBlockBoundary(payload, context);
3388
- } : void 0,
3389
- onAssistantMessageStart: draftStream ? () => {
3390
- resetDraftBlockOffsets();
3391
- resetPreviewToolProgress();
3392
- } : void 0,
3393
- ...buildPreviewToolProgressReplyOptions(),
3394
- onModelSelected
3395
- }
3396
- });
3397
- } finally {
3398
- progressDraftGate.cancel();
3399
- markRunComplete();
3400
- }
3401
- }
3402
- });
3403
- }
3404
- })
3405
- }
3406
- });
3407
- if (!turnResult.dispatched) {
3408
- if (turnResult.admission.kind === "drop" && turnResult.admission.reason === "bot-loop-protection") await commitInboundEventIfClaimed();
3409
- return;
3410
- }
3411
- const { dispatchResult } = turnResult;
3412
- const { queuedFinal, counts } = dispatchResult;
3413
- if (finalReplyDeliveryFailed) {
3414
- if (retryableReplyDeliveryFailed) {
3415
- logVerboseMessage(`matrix: final reply delivery failed room=${roomId} id=${messageId}; leaving event uncommitted`);
3416
- return;
3417
- }
3418
- logVerboseMessage(`matrix: final reply delivery failed room=${roomId} id=${messageId}; keeping replay committed`);
3419
- await commitInboundEventIfClaimed();
3420
- return;
3421
- }
3422
- if (!queuedFinal && nonFinalReplyDeliveryFailed) {
3423
- if (retryableReplyDeliveryFailed) {
3424
- logVerboseMessage(`matrix: non-final reply delivery failed room=${roomId} id=${messageId}; leaving event uncommitted`);
3425
- return;
3426
- }
3427
- logVerboseMessage(`matrix: non-final reply delivery failed room=${roomId} id=${messageId}; keeping replay committed`);
3428
- await commitInboundEventIfClaimed();
3429
- return;
3430
- }
3431
- if (isRoom && triggerSnapshot) roomHistoryTracker.consumeHistory(_route.agentId, roomId, triggerSnapshot, messageId);
3432
- if (!hasFinalChannelTurnDispatch({
3433
- queuedFinal,
3434
- counts
3435
- })) {
3436
- await commitInboundEventIfClaimed();
3437
- return;
3438
- }
3439
- const finalCount = counts.final;
3440
- logVerboseMessage(`matrix: delivered ${finalCount} reply${finalCount === 1 ? "" : "ies"} to ${replyTarget}`);
3441
- await commitInboundEventIfClaimed();
3442
- } catch (err) {
3443
- runtime.error?.(`matrix handler failed: ${String(err)}`);
3444
- } finally {
3445
- if (draftStreamRef) {
3446
- const draftEventId = await draftStreamRef.stop().catch(() => void 0);
3447
- if (draftEventId && !draftConsumed) await redactMatrixDraftEvent(client, roomId, draftEventId);
3448
- }
3449
- if (claimedInboundEvent && inboundDeduper && eventId) inboundDeduper.releaseEvent({
3450
- roomId,
3451
- eventId
3452
- });
3453
- }
3454
- };
3455
- }
3456
- //#endregion
3457
- //#region extensions/matrix/src/matrix/monitor/inbound-dedupe.ts
3458
- const INBOUND_DEDUPE_FILENAME = "inbound-dedupe.json";
3459
- const STORE_VERSION = 1;
3460
- const DEFAULT_MAX_ENTRIES = 2e4;
3461
- const DEFAULT_TTL_MS = 720 * 60 * 60 * 1e3;
3462
- const PERSIST_DEBOUNCE_MS = 250;
3463
- function normalizeEventPart(value) {
3464
- return value.trim();
3465
- }
3466
- function buildEventKey(params) {
3467
- const roomId = normalizeEventPart(params.roomId);
3468
- const eventId = normalizeEventPart(params.eventId);
3469
- return roomId && eventId ? `${roomId}|${eventId}` : "";
3470
- }
3471
- function resolveInboundDedupeStatePath(params) {
3472
- return resolveMatrixStateFilePath({
3473
- auth: params.auth,
3474
- env: params.env,
3475
- stateDir: params.stateDir,
3476
- filename: INBOUND_DEDUPE_FILENAME
3477
- });
3478
- }
3479
- function normalizeTimestamp(raw) {
3480
- if (typeof raw !== "number" || !Number.isFinite(raw)) return null;
3481
- return Math.max(0, Math.floor(raw));
3482
- }
3483
- function pruneSeenEvents(params) {
3484
- const { seen, ttlMs, maxEntries, nowMs } = params;
3485
- if (ttlMs > 0) {
3486
- const cutoff = nowMs - ttlMs;
3487
- for (const [key, ts] of seen) if (ts < cutoff) seen.delete(key);
3488
- }
3489
- const max = Math.max(0, Math.floor(maxEntries));
3490
- if (max <= 0) {
3491
- seen.clear();
3492
- return;
3493
- }
3494
- while (seen.size > max) {
3495
- const oldestKey = seen.keys().next().value;
3496
- if (typeof oldestKey !== "string") break;
3497
- seen.delete(oldestKey);
3498
- }
3499
- }
3500
- function toStoredState(params) {
3501
- pruneSeenEvents(params);
3502
- return {
3503
- version: STORE_VERSION,
3504
- entries: Array.from(params.seen.entries()).map(([key, ts]) => ({
3505
- key,
3506
- ts
3507
- }))
3508
- };
3509
- }
3510
- async function readStoredState(storagePath) {
3511
- const { value } = await readJsonFileWithFallback(storagePath, null);
3512
- if (value?.version !== STORE_VERSION || !Array.isArray(value.entries)) return null;
3513
- return value;
3514
- }
3515
- async function createMatrixInboundEventDeduper(params) {
3516
- const nowMs = params.nowMs ?? (() => Date.now());
3517
- const ttlMs = typeof params.ttlMs === "number" && Number.isFinite(params.ttlMs) ? Math.max(0, Math.floor(params.ttlMs)) : DEFAULT_TTL_MS;
3518
- const maxEntries = typeof params.maxEntries === "number" && Number.isFinite(params.maxEntries) ? Math.max(0, Math.floor(params.maxEntries)) : DEFAULT_MAX_ENTRIES;
3519
- const storagePath = params.storagePath ?? resolveInboundDedupeStatePath({
3520
- auth: params.auth,
3521
- env: params.env,
3522
- stateDir: params.stateDir
3523
- });
3524
- const seen = /* @__PURE__ */ new Map();
3525
- const pending = /* @__PURE__ */ new Set();
3526
- const persistLock = createAsyncLock();
3527
- try {
3528
- const stored = await readStoredState(storagePath);
3529
- for (const entry of stored?.entries ?? []) {
3530
- if (!entry || typeof entry.key !== "string") continue;
3531
- const key = entry.key.trim();
3532
- const ts = normalizeTimestamp(entry.ts);
3533
- if (!key || ts === null) continue;
3534
- seen.set(key, ts);
3535
- }
3536
- pruneSeenEvents({
3537
- seen,
3538
- ttlMs,
3539
- maxEntries,
3540
- nowMs: nowMs()
3541
- });
3542
- } catch (err) {
3543
- LogService.warn("MatrixInboundDedupe", "Failed loading Matrix inbound dedupe store:", err);
3544
- }
3545
- let dirty = false;
3546
- let persistTimer = null;
3547
- let persistPromise = null;
3548
- const persist = async () => {
3549
- dirty = false;
3550
- const payload = toStoredState({
3551
- seen,
3552
- ttlMs,
3553
- maxEntries,
3554
- nowMs: nowMs()
3555
- });
3556
- try {
3557
- await persistLock(async () => {
3558
- await writeJsonFileAtomically(storagePath, payload);
3559
- });
3560
- } catch (err) {
3561
- dirty = true;
3562
- throw err;
3563
- }
3564
- };
3565
- const flush = async () => {
3566
- if (persistTimer) {
3567
- clearTimeout(persistTimer);
3568
- persistTimer = null;
3569
- }
3570
- for (;;) {
3571
- if (!dirty && !persistPromise) break;
3572
- if (dirty && !persistPromise) persistPromise = persist().finally(() => {
3573
- persistPromise = null;
3574
- });
3575
- await persistPromise;
3576
- }
3577
- };
3578
- const schedulePersist = () => {
3579
- dirty = true;
3580
- if (persistTimer) return;
3581
- persistTimer = setTimeout(() => {
3582
- persistTimer = null;
3583
- flush().catch((err) => {
3584
- LogService.warn("MatrixInboundDedupe", "Failed persisting Matrix inbound dedupe store:", err);
3585
- });
3586
- }, PERSIST_DEBOUNCE_MS);
3587
- persistTimer.unref?.();
3588
- };
3589
- return {
3590
- claimEvent: ({ roomId, eventId }) => {
3591
- const key = buildEventKey({
3592
- roomId,
3593
- eventId
3594
- });
3595
- if (!key) return true;
3596
- pruneSeenEvents({
3597
- seen,
3598
- ttlMs,
3599
- maxEntries,
3600
- nowMs: nowMs()
3601
- });
3602
- if (seen.has(key) || pending.has(key)) return false;
3603
- pending.add(key);
3604
- return true;
3605
- },
3606
- commitEvent: async ({ roomId, eventId }) => {
3607
- const key = buildEventKey({
3608
- roomId,
3609
- eventId
3610
- });
3611
- if (!key) return;
3612
- pending.delete(key);
3613
- const ts = nowMs();
3614
- seen.delete(key);
3615
- seen.set(key, ts);
3616
- pruneSeenEvents({
3617
- seen,
3618
- ttlMs,
3619
- maxEntries,
3620
- nowMs: nowMs()
3621
- });
3622
- schedulePersist();
3623
- },
3624
- releaseEvent: ({ roomId, eventId }) => {
3625
- const key = buildEventKey({
3626
- roomId,
3627
- eventId
3628
- });
3629
- if (!key) return;
3630
- pending.delete(key);
3631
- },
3632
- flush,
3633
- stop: async () => {
3634
- try {
3635
- await flush();
3636
- } catch (err) {
3637
- LogService.warn("MatrixInboundDedupe", "Failed to flush Matrix inbound dedupe store during stop():", err);
3638
- }
3639
- }
3640
- };
3641
- }
3642
- //#endregion
3643
- //#region extensions/matrix/src/matrix/monitor/recent-invite.ts
3644
- function shouldPromoteRecentInviteRoom(params) {
3645
- if (!params.roomInfo.nameResolved || !params.roomInfo.aliasesResolved) return false;
3646
- const roomAliases = [params.roomInfo.canonicalAlias ?? "", ...params.roomInfo.altAliases].filter(Boolean);
3647
- if ((params.roomInfo.name?.trim() ?? "") || roomAliases.length > 0) return false;
3648
- return resolveMatrixRoomConfig({
3649
- rooms: params.rooms,
3650
- roomId: params.roomId,
3651
- aliases: roomAliases
3652
- }).matchSource === void 0;
3653
- }
3654
- //#endregion
3655
- //#region extensions/matrix/src/matrix/monitor/room-info.ts
3656
- const MAX_TRACKED_ROOM_INFO = 1024;
3657
- const MAX_TRACKED_MEMBER_DISPLAY_NAMES = 4096;
3658
- function rememberBounded(map, key, value, maxEntries) {
3659
- map.set(key, value);
3660
- if (map.size > maxEntries) {
3661
- const oldest = map.keys().next().value;
3662
- if (typeof oldest === "string") map.delete(oldest);
3663
- }
3664
- }
3665
- function createMatrixRoomInfoResolver(client) {
3666
- const roomNameCache = /* @__PURE__ */ new Map();
3667
- const roomAliasCache = /* @__PURE__ */ new Map();
3668
- const memberDisplayNameCache = /* @__PURE__ */ new Map();
3669
- const getRoomName = async (roomId) => {
3670
- if (roomNameCache.has(roomId)) return roomNameCache.get(roomId) ?? { nameResolved: false };
3671
- let name;
3672
- let nameResolved = false;
3673
- try {
3674
- const nameState = await client.getRoomStateEvent(roomId, "m.room.name", "");
3675
- nameResolved = true;
3676
- if (nameState && typeof nameState.name === "string") name = nameState.name;
3677
- } catch (err) {
3678
- if (isMatrixNotFoundError(err)) nameResolved = true;
3679
- }
3680
- const info = {
3681
- name,
3682
- nameResolved
3683
- };
3684
- if (nameResolved) rememberBounded(roomNameCache, roomId, info, MAX_TRACKED_ROOM_INFO);
3685
- return info;
3686
- };
3687
- const getRoomAliases = async (roomId) => {
3688
- const cached = roomAliasCache.get(roomId);
3689
- if (cached) return cached;
3690
- let canonicalAlias;
3691
- let altAliases = [];
3692
- let aliasesResolved = false;
3693
- try {
3694
- const aliasState = await client.getRoomStateEvent(roomId, "m.room.canonical_alias", "");
3695
- aliasesResolved = true;
3696
- if (aliasState && typeof aliasState.alias === "string") canonicalAlias = aliasState.alias;
3697
- const rawAliases = aliasState?.alt_aliases;
3698
- if (Array.isArray(rawAliases)) altAliases = rawAliases.filter((entry) => typeof entry === "string");
3699
- } catch (err) {
3700
- if (isMatrixNotFoundError(err)) aliasesResolved = true;
3701
- }
3702
- const info = {
3703
- canonicalAlias,
3704
- altAliases,
3705
- aliasesResolved
3706
- };
3707
- if (aliasesResolved) rememberBounded(roomAliasCache, roomId, info, MAX_TRACKED_ROOM_INFO);
3708
- return info;
3709
- };
3710
- const getRoomInfo = async (roomId, opts = {}) => {
3711
- const { name, nameResolved } = await getRoomName(roomId);
3712
- if (!opts.includeAliases) return {
3713
- name,
3714
- altAliases: [],
3715
- nameResolved,
3716
- aliasesResolved: false
3717
- };
3718
- return {
3719
- name,
3720
- nameResolved,
3721
- ...await getRoomAliases(roomId)
3722
- };
3723
- };
3724
- const getMemberDisplayName = async (roomId, userId) => {
3725
- const cacheKey = `${roomId}:${userId}`;
3726
- if (memberDisplayNameCache.has(cacheKey)) return memberDisplayNameCache.get(cacheKey) ?? userId;
3727
- const memberState = await client.getRoomStateEvent(roomId, "m.room.member", userId).catch(() => null);
3728
- const displayName = memberState && typeof memberState.displayname === "string" ? memberState.displayname : userId;
3729
- rememberBounded(memberDisplayNameCache, cacheKey, displayName, MAX_TRACKED_MEMBER_DISPLAY_NAMES);
3730
- return displayName;
3731
- };
3732
- return {
3733
- getRoomInfo,
3734
- getMemberDisplayName
3735
- };
3736
- }
3737
- //#endregion
3738
- //#region extensions/matrix/src/matrix/monitor/startup.ts
3739
- let matrixStartupMaintenanceDepsPromise;
3740
- async function loadMatrixStartupMaintenanceDeps() {
3741
- matrixStartupMaintenanceDepsPromise ??= Promise.all([
3742
- import("./config-update-DFAmVvUR.js"),
3743
- import("./device-health-CJqwWGmU.js"),
3744
- import("./profile-Bca_U_rV.js"),
3745
- import("./legacy-crypto-restore-C6KE1GDw.js"),
3746
- import("./startup-verification-CLS2tUc5.js")
3747
- ]).then(([configUpdateModule, deviceHealthModule, profileModule, legacyCryptoRestoreModule, startupVerificationModule]) => ({
3748
- updateMatrixAccountConfig: configUpdateModule.updateMatrixAccountConfig,
3749
- summarizeMatrixDeviceHealth: deviceHealthModule.summarizeMatrixDeviceHealth,
3750
- syncMatrixOwnProfile: profileModule.syncMatrixOwnProfile,
3751
- maybeRestoreLegacyMatrixBackup: legacyCryptoRestoreModule.maybeRestoreLegacyMatrixBackup,
3752
- ensureMatrixStartupVerification: startupVerificationModule.ensureMatrixStartupVerification
3753
- }));
3754
- return await matrixStartupMaintenanceDepsPromise;
3755
- }
3756
- async function runMatrixStartupMaintenance(params, deps) {
3757
- const runtimeDeps = deps ?? await loadMatrixStartupMaintenanceDeps();
3758
- throwIfMatrixStartupAborted(params.abortSignal);
3759
- try {
3760
- const profileSync = await runtimeDeps.syncMatrixOwnProfile({
3761
- client: params.client,
3762
- userId: params.auth.userId,
3763
- displayName: params.accountConfig.name,
3764
- avatarUrl: params.accountConfig.avatarUrl,
3765
- loadAvatarFromUrl: async (url, maxBytes) => await params.loadWebMedia(url, maxBytes)
3766
- });
3767
- throwIfMatrixStartupAborted(params.abortSignal);
3768
- if (profileSync.displayNameUpdated) params.logger.info(`matrix: profile display name updated for ${params.auth.userId}`);
3769
- if (profileSync.avatarUpdated) params.logger.info(`matrix: profile avatar updated for ${params.auth.userId}`);
3770
- if (profileSync.convertedAvatarFromHttp && profileSync.resolvedAvatarUrl && params.accountConfig.avatarUrl !== profileSync.resolvedAvatarUrl) {
3771
- const latestCfg = params.getRuntimeConfig();
3772
- const updatedCfg = runtimeDeps.updateMatrixAccountConfig(latestCfg, params.accountId, { avatarUrl: profileSync.resolvedAvatarUrl });
3773
- await params.replaceConfigFile(updatedCfg);
3774
- throwIfMatrixStartupAborted(params.abortSignal);
3775
- params.logVerboseMessage(`matrix: persisted converted avatar URL for account ${params.accountId} (${profileSync.resolvedAvatarUrl})`);
3776
- }
3777
- } catch (err) {
3778
- if (isMatrixStartupAbortError(err)) throw err;
3779
- params.logger.warn("matrix: failed to sync profile from config", { error: String(err) });
3780
- }
3781
- if (!(params.auth.encryption && params.client.crypto)) return;
3782
- try {
3783
- throwIfMatrixStartupAborted(params.abortSignal);
3784
- const deviceHealth = runtimeDeps.summarizeMatrixDeviceHealth(await params.client.listOwnDevices());
3785
- if (deviceHealth.staleDaoCoreDevices.length > 0) params.logger.warn(`matrix: stale DaoCore devices detected for ${params.auth.userId}: ${deviceHealth.staleDaoCoreDevices.map((device) => device.deviceId).join(", ")}. Run 'daocore matrix devices prune-stale --account ${params.effectiveAccountId}' to keep encrypted-room trust healthy.`);
3786
- } catch (err) {
3787
- if (isMatrixStartupAbortError(err)) throw err;
3788
- params.logger.debug?.("Failed to inspect matrix device hygiene (non-fatal)", { error: String(err) });
3789
- }
3790
- try {
3791
- throwIfMatrixStartupAborted(params.abortSignal);
3792
- const startupVerification = await runtimeDeps.ensureMatrixStartupVerification({
3793
- client: params.client,
3794
- auth: params.auth,
3795
- accountConfig: params.accountConfig,
3796
- env: params.env
3797
- });
3798
- throwIfMatrixStartupAborted(params.abortSignal);
3799
- if (startupVerification.kind === "verified") params.logger.info("matrix: device is verified by its owner and ready for encrypted rooms");
3800
- else if (startupVerification.kind === "disabled" || startupVerification.kind === "cooldown" || startupVerification.kind === "pending" || startupVerification.kind === "request-failed") {
3801
- params.logger.info("matrix: device not verified — run 'daocore matrix verify device <key>' to enable E2EE");
3802
- if (startupVerification.kind === "pending") params.logger.info("matrix: startup verification request is already pending; finish it in another Matrix client");
3803
- else if (startupVerification.kind === "cooldown") params.logVerboseMessage(`matrix: skipped startup verification request due to cooldown (retryAfterMs=${startupVerification.retryAfterMs ?? 0})`);
3804
- else if (startupVerification.kind === "request-failed") params.logger.debug?.("Matrix startup verification request failed (non-fatal)", { error: startupVerification.error ?? "unknown" });
3805
- } else if (startupVerification.kind === "requested") params.logger.info("matrix: device not verified — requested verification in another Matrix client");
3806
- } catch (err) {
3807
- if (isMatrixStartupAbortError(err)) throw err;
3808
- params.logger.debug?.("Failed to resolve matrix verification status (non-fatal)", { error: String(err) });
3809
- }
3810
- try {
3811
- throwIfMatrixStartupAborted(params.abortSignal);
3812
- const legacyCryptoRestore = await runtimeDeps.maybeRestoreLegacyMatrixBackup({
3813
- client: params.client,
3814
- auth: params.auth,
3815
- env: params.env
3816
- });
3817
- throwIfMatrixStartupAborted(params.abortSignal);
3818
- if (legacyCryptoRestore.kind === "restored") {
3819
- params.logger.info(`matrix: restored ${legacyCryptoRestore.imported}/${legacyCryptoRestore.total} room key(s) from legacy encrypted-state backup`);
3820
- if (legacyCryptoRestore.localOnlyKeys > 0) params.logger.warn(`matrix: ${legacyCryptoRestore.localOnlyKeys} legacy local-only room key(s) were never backed up and could not be restored automatically`);
3821
- } else if (legacyCryptoRestore.kind === "failed") {
3822
- params.logger.warn(`matrix: failed restoring room keys from legacy encrypted-state backup: ${legacyCryptoRestore.error}`);
3823
- if (legacyCryptoRestore.localOnlyKeys > 0) params.logger.warn(`matrix: ${legacyCryptoRestore.localOnlyKeys} legacy local-only room key(s) were never backed up and may remain unavailable until manually recovered`);
3824
- }
3825
- } catch (err) {
3826
- if (isMatrixStartupAbortError(err)) throw err;
3827
- params.logger.warn("matrix: failed restoring legacy encrypted-state backup", { error: String(err) });
3828
- }
3829
- }
3830
- //#endregion
3831
- //#region extensions/matrix/src/matrix/monitor/status.ts
3832
- function cloneLastDisconnect(value) {
3833
- if (!value || typeof value === "string") return value ?? null;
3834
- return { ...value };
3835
- }
3836
- function formatSyncError(error) {
3837
- if (!error) return null;
3838
- if (error instanceof Error) return error.message || error.name || "unknown";
3839
- return formatMatrixErrorMessage(error);
3840
- }
3841
- function createMatrixMonitorStatusController(params) {
3842
- const status = {
3843
- accountId: params.accountId,
3844
- ...params.baseUrl ? { baseUrl: params.baseUrl } : {},
3845
- connected: false,
3846
- lastConnectedAt: null,
3847
- lastDisconnect: null,
3848
- lastError: null,
3849
- healthState: "starting"
3850
- };
3851
- const emit = () => {
3852
- params.statusSink?.({
3853
- ...status,
3854
- lastDisconnect: cloneLastDisconnect(status.lastDisconnect)
3855
- });
3856
- };
3857
- const noteConnected = (at = Date.now(), options) => {
3858
- if (status.connected === true) status.lastEventAt = at;
3859
- else Object.assign(status, createConnectedChannelStatusPatch(at));
3860
- if (options?.transportActivity) Object.assign(status, createTransportActivityStatusPatch(at));
3861
- status.lastError = null;
3862
- status.lastDisconnect = null;
3863
- status.healthState = "healthy";
3864
- emit();
3865
- };
3866
- const noteDisconnected = (params) => {
3867
- const at = params.at ?? Date.now();
3868
- const error = formatSyncError(params.error);
3869
- status.connected = false;
3870
- status.lastEventAt = at;
3871
- status.lastDisconnect = {
3872
- at,
3873
- ...error ? { error } : {}
3874
- };
3875
- status.lastError = error;
3876
- status.healthState = params.state.toLowerCase();
3877
- emit();
3878
- };
3879
- emit();
3880
- return {
3881
- noteSyncState(state, error, at = Date.now()) {
3882
- if (isMatrixReadySyncState(state)) {
3883
- noteConnected(at, { transportActivity: state === "SYNCING" });
3884
- return;
3885
- }
3886
- if (isMatrixDisconnectedSyncState(state)) {
3887
- noteDisconnected({
3888
- state,
3889
- at,
3890
- error
3891
- });
3892
- return;
3893
- }
3894
- status.lastEventAt = at;
3895
- status.healthState = state.toLowerCase();
3896
- emit();
3897
- },
3898
- noteUnexpectedError(error, at = Date.now()) {
3899
- noteDisconnected({
3900
- state: "ERROR",
3901
- at,
3902
- error
3903
- });
3904
- },
3905
- markStopped(at = Date.now()) {
3906
- status.connected = false;
3907
- status.lastEventAt = at;
3908
- if (status.healthState !== "error") status.healthState = "stopped";
3909
- emit();
3910
- }
3911
- };
3912
- }
3913
- //#endregion
3914
- //#region extensions/matrix/src/matrix/monitor/sync-lifecycle.ts
3915
- function formatSyncLifecycleError(state, error) {
3916
- if (error instanceof Error) return error;
3917
- const message = typeof error === "string" && error.trim() ? error.trim() : void 0;
3918
- if (state === "STOPPED") return new Error(message ?? "Matrix sync stopped unexpectedly");
3919
- if (state === "ERROR") return new Error(message ?? "Matrix sync entered ERROR unexpectedly");
3920
- return new Error(message ?? `Matrix sync entered ${state} unexpectedly`);
3921
- }
3922
- function createMatrixMonitorSyncLifecycle(params) {
3923
- let fatalError = null;
3924
- let resolveFatalWait = null;
3925
- let rejectFatalWait = null;
3926
- const settleFatal = (error) => {
3927
- if (fatalError) return;
3928
- fatalError = error;
3929
- rejectFatalWait?.(error);
3930
- resolveFatalWait = null;
3931
- rejectFatalWait = null;
3932
- };
3933
- const onSyncState = (state, _prevState, error) => {
3934
- if (isMatrixTerminalSyncState(state) && !params.isStopping?.()) {
3935
- const fatalError = formatSyncLifecycleError(state, error);
3936
- params.statusController.noteUnexpectedError(fatalError);
3937
- settleFatal(fatalError);
3938
- return;
3939
- }
3940
- if (fatalError) return;
3941
- if (params.isStopping?.() && !isMatrixTerminalSyncState(state)) return;
3942
- params.statusController.noteSyncState(state, error);
3943
- };
3944
- const onUnexpectedError = (error) => {
3945
- if (params.isStopping?.()) return;
3946
- params.statusController.noteUnexpectedError(error);
3947
- settleFatal(error);
3948
- };
3949
- params.client.on("sync.state", onSyncState);
3950
- params.client.on("sync.unexpected_error", onUnexpectedError);
3951
- return {
3952
- async waitForFatalStop() {
3953
- if (fatalError) throw fatalError;
3954
- if (resolveFatalWait || rejectFatalWait) throw new Error("Matrix fatal-stop wait already in progress");
3955
- await new Promise((resolve, reject) => {
3956
- resolveFatalWait = resolve;
3957
- rejectFatalWait = (error) => reject(error);
3958
- });
3959
- },
3960
- dispose() {
3961
- resolveFatalWait?.();
3962
- resolveFatalWait = null;
3963
- rejectFatalWait = null;
3964
- params.client.off("sync.state", onSyncState);
3965
- params.client.off("sync.unexpected_error", onUnexpectedError);
3966
- }
3967
- };
3968
- }
3969
- //#endregion
3970
- //#region extensions/matrix/src/matrix/monitor/task-runner.ts
3971
- function createMatrixMonitorTaskRunner(params) {
3972
- const inFlight = /* @__PURE__ */ new Set();
3973
- const runDetachedTask = (label, task) => {
3974
- let trackedTask;
3975
- trackedTask = Promise.resolve().then(task).catch((error) => {
3976
- const message = String(error);
3977
- params.logVerboseMessage(`matrix: ${label} failed (${message})`);
3978
- params.logger.warn("matrix background task failed", {
3979
- task: label,
3980
- error: message
3981
- });
3982
- }).finally(() => {
3983
- inFlight.delete(trackedTask);
3984
- });
3985
- inFlight.add(trackedTask);
3986
- return trackedTask;
3987
- };
3988
- const waitForIdle = async () => {
3989
- while (inFlight.size > 0) await Promise.allSettled(Array.from(inFlight));
3990
- };
3991
- return {
3992
- runDetachedTask,
3993
- waitForIdle
3994
- };
3995
- }
3996
- //#endregion
3997
- //#region extensions/matrix/src/matrix/monitor/index.ts
3998
- function isMatrixStreamingConfig(streaming) {
3999
- return Boolean(streaming && typeof streaming === "object" && !Array.isArray(streaming));
4000
- }
4001
- function resolveMatrixStreamingMode(streaming) {
4002
- if (streaming === true || streaming === "partial") return "partial";
4003
- if (streaming === "quiet") return "quiet";
4004
- if (streaming === "progress") return "progress";
4005
- if (isMatrixStreamingConfig(streaming)) {
4006
- if (streaming.mode === "partial" || streaming.mode === "quiet" || streaming.mode === "progress") return streaming.mode;
4007
- }
4008
- return "off";
4009
- }
4010
- function resolveMatrixPreviewToolProgress(streaming) {
4011
- if (!isMatrixStreamingConfig(streaming)) return true;
4012
- if (resolveMatrixStreamingMode(streaming) === "progress") return streaming.progress?.toolProgress ?? streaming.preview?.toolProgress ?? true;
4013
- return streaming.preview?.toolProgress ?? true;
4014
- }
4015
- function resolveMatrixPreviewToolProgressEnabled(streaming) {
4016
- return resolveMatrixStreamingMode(streaming) !== "off" && resolveMatrixPreviewToolProgress(streaming);
4017
- }
4018
- const DEFAULT_MEDIA_MAX_MB = 20;
4019
- async function monitorMatrixProvider(opts = {}) {
4020
- if (opts.abortSignal?.aborted) return;
4021
- if (isBunRuntime()) throw new Error("Matrix provider requires Node (bun runtime not supported)");
4022
- const core = getMatrixRuntime();
4023
- let cfg = core.config.current();
4024
- if (cfg.channels?.["matrix"]?.enabled === false) return;
4025
- const logger = core.logging.getChildLogger({ module: "matrix-auto-reply" });
4026
- const formatRuntimeMessage = (...args) => format(...args);
4027
- const runtime = opts.runtime ?? {
4028
- log: (...args) => {
4029
- logger.info(formatRuntimeMessage(...args));
4030
- },
4031
- error: (...args) => {
4032
- logger.error(formatRuntimeMessage(...args));
4033
- },
4034
- exit: (code) => {
4035
- throw new Error(`exit ${code}`);
4036
- }
4037
- };
4038
- const logVerboseMessage = (message) => {
4039
- if (!core.logging.shouldLogVerbose()) return;
4040
- logger.debug?.(message);
4041
- };
4042
- const effectiveAccountId = resolveMatrixAuthContext({
4043
- cfg,
4044
- accountId: opts.accountId
4045
- }).accountId;
4046
- const accountConfig = resolveMatrixAccountConfig({
4047
- cfg,
4048
- accountId: effectiveAccountId
4049
- });
4050
- const allowlistOnly = accountConfig.allowlistOnly === true;
4051
- const accountAllowBots = accountConfig.allowBots;
4052
- let allowFrom = (accountConfig.dm?.allowFrom ?? []).map(String);
4053
- let groupAllowFrom = (accountConfig.groupAllowFrom ?? []).map(String);
4054
- let allowFromResolvedEntries = [];
4055
- let groupAllowFromResolvedEntries = [];
4056
- let roomsConfig = accountConfig.groups ?? accountConfig.rooms;
4057
- let needsRoomAliasesForConfig = false;
4058
- const configuredBotUserIds = resolveConfiguredMatrixBotUserIds({
4059
- cfg,
4060
- accountId: effectiveAccountId
4061
- });
4062
- ({allowFrom, allowFromResolvedEntries, groupAllowFrom, groupAllowFromResolvedEntries, roomsConfig} = await resolveMatrixMonitorConfig({
4063
- cfg,
4064
- accountId: effectiveAccountId,
4065
- allowFrom,
4066
- groupAllowFrom,
4067
- roomsConfig,
4068
- runtime
4069
- }));
4070
- needsRoomAliasesForConfig = Boolean(roomsConfig && Object.keys(roomsConfig).some((key) => key.trim().startsWith("#")));
4071
- cfg = {
4072
- ...cfg,
4073
- channels: {
4074
- ...cfg.channels,
4075
- matrix: {
4076
- ...cfg.channels?.["matrix"],
4077
- dm: {
4078
- ...cfg.channels?.["matrix"]?.dm,
4079
- allowFrom
4080
- },
4081
- groupAllowFrom,
4082
- ...roomsConfig ? { groups: roomsConfig } : {}
4083
- }
4084
- }
4085
- };
4086
- const auth = await resolveMatrixAuth({
4087
- cfg,
4088
- accountId: effectiveAccountId
4089
- });
4090
- const resolvedInitialSyncLimit = typeof opts.initialSyncLimit === "number" ? Math.max(0, Math.floor(opts.initialSyncLimit)) : auth.initialSyncLimit;
4091
- const authWithLimit = resolvedInitialSyncLimit === auth.initialSyncLimit ? auth : {
4092
- ...auth,
4093
- initialSyncLimit: resolvedInitialSyncLimit
4094
- };
4095
- const statusController = createMatrixMonitorStatusController({
4096
- accountId: auth.accountId,
4097
- baseUrl: auth.homeserver,
4098
- statusSink: opts.setStatus
4099
- });
4100
- let cleanedUp = false;
4101
- let client = null;
4102
- let threadBindingManager = null;
4103
- let inboundDeduper = null;
4104
- const monitorTaskRunner = createMatrixMonitorTaskRunner({
4105
- logger,
4106
- logVerboseMessage
4107
- });
4108
- let syncLifecycle = null;
4109
- const cleanup = async (mode = "persist") => {
4110
- if (cleanedUp) return;
4111
- cleanedUp = true;
4112
- try {
4113
- client?.stopSyncWithoutPersist();
4114
- if (client && mode === "persist") await client.drainPendingDecryptions("matrix monitor shutdown");
4115
- if (mode === "persist") await monitorTaskRunner.waitForIdle();
4116
- threadBindingManager?.stop();
4117
- await inboundDeduper?.stop();
4118
- if (client) await releaseSharedClientInstance(client, mode);
4119
- } finally {
4120
- client?.off("sync.state", onSyncState);
4121
- syncLifecycle?.dispose();
4122
- statusController.markStopped();
4123
- setActiveMatrixClient(null, auth.accountId);
4124
- }
4125
- };
4126
- const defaultGroupPolicy = resolveDefaultGroupPolicy(cfg);
4127
- const { groupPolicy: groupPolicyRaw, providerMissingFallbackApplied } = resolveAllowlistProviderRuntimeGroupPolicy({
4128
- providerConfigPresent: cfg.channels?.["matrix"] !== void 0,
4129
- groupPolicy: accountConfig.groupPolicy,
4130
- defaultGroupPolicy
4131
- });
4132
- warnMissingProviderGroupPolicyFallbackOnce({
4133
- providerMissingFallbackApplied,
4134
- providerKey: "matrix",
4135
- accountId: effectiveAccountId,
4136
- blockedLabel: GROUP_POLICY_BLOCKED_LABEL.room,
4137
- log: (message) => logVerboseMessage(message)
4138
- });
4139
- const groupPolicy = allowlistOnly && groupPolicyRaw === "open" ? "allowlist" : groupPolicyRaw;
4140
- const replyToMode = opts.replyToMode ?? accountConfig.replyToMode ?? "off";
4141
- const threadReplies = accountConfig.threadReplies ?? "inbound";
4142
- const dmThreadReplies = accountConfig.dm?.threadReplies;
4143
- const threadBindingIdleTimeoutMs = resolveThreadBindingIdleTimeoutMsForChannel({
4144
- cfg,
4145
- channel: "matrix",
4146
- accountId: effectiveAccountId
4147
- });
4148
- const threadBindingMaxAgeMs = resolveThreadBindingMaxAgeMsForChannel({
4149
- cfg,
4150
- channel: "matrix",
4151
- accountId: effectiveAccountId
4152
- });
4153
- const dmConfig = accountConfig.dm;
4154
- const dmEnabled = dmConfig?.enabled ?? true;
4155
- const dmPolicyRaw = dmConfig?.policy ?? "pairing";
4156
- const dmPolicy = allowlistOnly && dmPolicyRaw !== "disabled" ? "allowlist" : dmPolicyRaw;
4157
- const dmSessionScope = dmConfig?.sessionScope ?? "per-user";
4158
- const textLimit = core.channel.text.resolveTextChunkLimit(cfg, "matrix", effectiveAccountId);
4159
- const globalGroupChatHistoryLimit = cfg.messages?.groupChat?.historyLimit;
4160
- const historyLimit = Math.max(0, accountConfig.historyLimit ?? globalGroupChatHistoryLimit ?? 0);
4161
- const mediaMaxMb = opts.mediaMaxMb ?? accountConfig.mediaMaxMb ?? DEFAULT_MEDIA_MAX_MB;
4162
- const mediaMaxBytes = Math.max(1, mediaMaxMb) * 1024 * 1024;
4163
- const streaming = resolveMatrixStreamingMode(accountConfig.streaming);
4164
- const previewToolProgressEnabled = resolveMatrixPreviewToolProgressEnabled(accountConfig.streaming);
4165
- const blockStreamingEnabled = accountConfig.blockStreaming === true;
4166
- const startupMs = Date.now();
4167
- const startupGraceMs = 0;
4168
- const warnedEncryptedRooms = /* @__PURE__ */ new Set();
4169
- const warnedCryptoMissingRooms = /* @__PURE__ */ new Set();
4170
- let healthySyncSinceMs;
4171
- const noteSyncHealthState = (state, at = Date.now()) => {
4172
- if (isMatrixReadySyncState(state)) {
4173
- healthySyncSinceMs ??= at;
4174
- return;
4175
- }
4176
- if (isMatrixDisconnectedSyncState(state)) healthySyncSinceMs = void 0;
4177
- };
4178
- const onSyncState = (state) => {
4179
- noteSyncHealthState(state);
4180
- };
4181
- try {
4182
- client = await resolveSharedMatrixClient({
4183
- cfg,
4184
- auth: authWithLimit,
4185
- startClient: false,
4186
- accountId: auth.accountId
4187
- });
4188
- setActiveMatrixClient(client, auth.accountId);
4189
- inboundDeduper = await createMatrixInboundEventDeduper({
4190
- auth,
4191
- env: process.env
4192
- });
4193
- syncLifecycle = createMatrixMonitorSyncLifecycle({
4194
- client,
4195
- statusController,
4196
- isStopping: () => cleanedUp || opts.abortSignal?.aborted === true
4197
- });
4198
- client.on("sync.state", onSyncState);
4199
- const dropPreStartupMessages = !client.hasPersistedSyncState();
4200
- const { getRoomInfo, getMemberDisplayName } = createMatrixRoomInfoResolver(client);
4201
- const isExplicitlyConfiguredRoom = async (roomId) => {
4202
- const roomInfoForConfig = needsRoomAliasesForConfig ? await getRoomInfo(roomId, { includeAliases: true }) : void 0;
4203
- const aliases = roomInfoForConfig ? [roomInfoForConfig.canonicalAlias ?? "", ...roomInfoForConfig.altAliases].filter(Boolean) : [];
4204
- return resolveMatrixRoomConfig({
4205
- rooms: roomsConfig,
4206
- roomId,
4207
- aliases
4208
- }).matchSource === "direct";
4209
- };
4210
- const directTracker = createDirectRoomTracker(client, {
4211
- log: logVerboseMessage,
4212
- isExplicitlyConfiguredRoom,
4213
- canPromoteRecentInvite: async (roomId) => shouldPromoteRecentInviteRoom({
4214
- roomId,
4215
- roomInfo: await getRoomInfo(roomId, { includeAliases: true }),
4216
- rooms: roomsConfig
4217
- }),
4218
- ...dmSessionScope === "per-room" ? { canPromoteUnmappedStrictRoom: async (roomId) => shouldPromoteRecentInviteRoom({
4219
- roomId,
4220
- roomInfo: await getRoomInfo(roomId, { includeAliases: true }),
4221
- rooms: roomsConfig
4222
- }) } : {},
4223
- shouldKeepLocallyPromotedDirectRoom: async (roomId) => {
4224
- try {
4225
- const roomInfo = await getRoomInfo(roomId, { includeAliases: true });
4226
- if (!roomInfo.nameResolved || !roomInfo.aliasesResolved) return;
4227
- return shouldPromoteRecentInviteRoom({
4228
- roomId,
4229
- roomInfo,
4230
- rooms: roomsConfig
4231
- });
4232
- } catch (err) {
4233
- logVerboseMessage(`matrix: local promotion revalidation failed room=${roomId} (${String(err)})`);
4234
- return;
4235
- }
4236
- }
4237
- });
4238
- registerMatrixAutoJoin({
4239
- client,
4240
- accountConfig,
4241
- runtime
4242
- });
4243
- const handleRoomMessage = createMatrixRoomMessageHandler({
4244
- client,
4245
- core,
4246
- cfg,
4247
- accountId: effectiveAccountId,
4248
- accountConfig,
4249
- runtime,
4250
- logger,
4251
- logVerboseMessage,
4252
- allowFrom,
4253
- allowFromResolvedEntries,
4254
- groupAllowFrom,
4255
- groupAllowFromResolvedEntries,
4256
- roomsConfig,
4257
- accountAllowBots,
4258
- configuredBotUserIds,
4259
- groupPolicy,
4260
- replyToMode,
4261
- threadReplies,
4262
- dmThreadReplies,
4263
- dmSessionScope,
4264
- streaming,
4265
- previewToolProgressEnabled,
4266
- blockStreamingEnabled,
4267
- dmEnabled,
4268
- dmPolicy,
4269
- textLimit,
4270
- mediaMaxBytes,
4271
- historyLimit,
4272
- startupMs,
4273
- startupGraceMs,
4274
- dropPreStartupMessages,
4275
- inboundDeduper,
4276
- directTracker,
4277
- getRoomInfo,
4278
- getMemberDisplayName,
4279
- needsRoomAliasesForConfig
4280
- });
4281
- threadBindingManager = await createMatrixThreadBindingManager({
4282
- cfg,
4283
- accountId: effectiveAccountId,
4284
- auth,
4285
- client,
4286
- env: process.env,
4287
- idleTimeoutMs: threadBindingIdleTimeoutMs,
4288
- maxAgeMs: threadBindingMaxAgeMs,
4289
- logVerboseMessage
4290
- });
4291
- logVerboseMessage(`matrix: thread bindings ready account=${threadBindingManager.accountId} idleMs=${threadBindingIdleTimeoutMs} maxAgeMs=${threadBindingMaxAgeMs}`);
4292
- registerMatrixMonitorEvents({
4293
- cfg,
4294
- client,
4295
- auth,
4296
- allowFrom,
4297
- dmEnabled,
4298
- dmPolicy,
4299
- readStoreAllowFrom: async () => await core.channel.pairing.readAllowFromStore({
4300
- channel: "matrix",
4301
- env: process.env,
4302
- accountId: effectiveAccountId
4303
- }).catch(() => []),
4304
- directTracker,
4305
- logVerboseMessage,
4306
- warnedEncryptedRooms,
4307
- warnedCryptoMissingRooms,
4308
- logger,
4309
- startupGraceMs,
4310
- getHealthySyncSinceMs: () => healthySyncSinceMs,
4311
- formatNativeDependencyHint: core.system.formatNativeDependencyHint,
4312
- onRoomMessage: handleRoomMessage,
4313
- runDetachedTask: monitorTaskRunner.runDetachedTask
4314
- });
4315
- logVerboseMessage("matrix: starting client");
4316
- await resolveSharedMatrixClient({
4317
- cfg,
4318
- auth: authWithLimit,
4319
- accountId: auth.accountId,
4320
- abortSignal: opts.abortSignal
4321
- });
4322
- logVerboseMessage("matrix: client started");
4323
- logger.info(`matrix: logged in as ${auth.userId}`);
4324
- backfillMatrixAuthDeviceIdAfterStartup({
4325
- auth,
4326
- env: process.env,
4327
- abortSignal: opts.abortSignal
4328
- }).catch((err) => {
4329
- logVerboseMessage(`matrix: failed to backfill deviceId after startup (${String(err)})`);
4330
- });
4331
- registerChannelRuntimeContext({
4332
- channelRuntime: opts.channelRuntime,
4333
- channelId: "matrix",
4334
- accountId: effectiveAccountId,
4335
- capability: CHANNEL_APPROVAL_NATIVE_RUNTIME_CONTEXT_CAPABILITY,
4336
- context: { client },
4337
- abortSignal: opts.abortSignal
4338
- });
4339
- await runMatrixStartupMaintenance({
4340
- client,
4341
- auth,
4342
- accountId: effectiveAccountId,
4343
- effectiveAccountId,
4344
- accountConfig,
4345
- logger,
4346
- logVerboseMessage,
4347
- getRuntimeConfig: () => core.config.current(),
4348
- replaceConfigFile: async (nextCfg) => {
4349
- await core.config.replaceConfigFile({
4350
- nextConfig: nextCfg,
4351
- afterWrite: { mode: "auto" }
4352
- });
4353
- },
4354
- loadWebMedia: async (url, maxBytes) => await core.media.loadWebMedia(url, maxBytes),
4355
- env: process.env,
4356
- abortSignal: opts.abortSignal
4357
- });
4358
- await Promise.race([waitUntilAbort(opts.abortSignal, async () => {
4359
- try {
4360
- logVerboseMessage("matrix: stopping client");
4361
- await cleanup();
4362
- } catch (err) {
4363
- logger.warn("matrix: failed during monitor shutdown cleanup", { error: String(err) });
4364
- }
4365
- }), syncLifecycle.waitForFatalStop()]);
4366
- } catch (err) {
4367
- if (opts.abortSignal?.aborted === true && isMatrixStartupAbortError(err)) {
4368
- await cleanup("stop");
4369
- return;
4370
- }
4371
- statusController.noteUnexpectedError(err);
4372
- await cleanup();
4373
- throw err;
4374
- }
4375
- }
4376
- //#endregion
4377
- export { monitorMatrixProvider };