stableclaw 2026.4.6 → 2026.4.8

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 (2751) hide show
  1. package/README.md +22 -290
  2. package/package.json +1 -73
  3. package/dist/.buildstamp +0 -1
  4. package/dist/abort-C9luPDzM.js +0 -192
  5. package/dist/abort-cutoff-B1ws4nOb.js +0 -56
  6. package/dist/abort-cutoff.runtime-DyRUNN6p.js +0 -20
  7. package/dist/abort-cutoff.runtime.js +0 -1
  8. package/dist/abort-primitives-CGyFwJ93.js +0 -92
  9. package/dist/abort-signal-CrrraMAi.js +0 -13
  10. package/dist/abort.runtime-oBiooAFx.js +0 -2
  11. package/dist/abort.runtime.js +0 -1
  12. package/dist/access-DIqrGWVo.js +0 -81
  13. package/dist/access-control-DfV6HWO9.js +0 -152
  14. package/dist/account-action-gate-eHi2MB4J.js +0 -12
  15. package/dist/account-core-DOelA7Wl.js +0 -26
  16. package/dist/account-helpers-CafpxP7V.js +0 -1
  17. package/dist/account-helpers-jJOgsae3.js +0 -102
  18. package/dist/account-id-DXal1kRJ.js +0 -1
  19. package/dist/account-inspect-CfagweUE.js +0 -158
  20. package/dist/account-inspect-DOt4IDX6.js +0 -92
  21. package/dist/account-inspect-pnXre-7b.js +0 -81
  22. package/dist/account-lookup-CLJxpfHr.js +0 -17
  23. package/dist/account-resolution-CbKUJkzG.js +0 -30
  24. package/dist/account-selection-B8a_DqXo.js +0 -222
  25. package/dist/account-snapshot-fields-mr-1u321.js +0 -130
  26. package/dist/account-summary-DA6ds0Hk.js +0 -36
  27. package/dist/accounts-CO-lK8jJ.js +0 -150
  28. package/dist/accounts-D419O6Gq.js +0 -2
  29. package/dist/accounts-DKMLcV4g.js +0 -132
  30. package/dist/accounts-DdiZwn14.js +0 -57
  31. package/dist/accounts-SWhOQhoA.js +0 -58
  32. package/dist/accounts-iR2U_Vs4.js +0 -41
  33. package/dist/accounts-jsSym1md.js +0 -102
  34. package/dist/accounts-p4Eir-wB.js +0 -107
  35. package/dist/accounts-uAWNlC7q.js +0 -94
  36. package/dist/accounts-x23pAGjm.js +0 -137
  37. package/dist/accounts.runtime-PJOhs60R.js +0 -2
  38. package/dist/accounts.runtime.js +0 -1
  39. package/dist/ack-reactions-fcKs7CQ_.js +0 -43
  40. package/dist/acp-cli-ByWTIhFx.js +0 -2207
  41. package/dist/acp-runtime-D7wrReOP.js +0 -8
  42. package/dist/acp-stateful-target-driver-DY2EfkQt.js +0 -60
  43. package/dist/action-runtime-BdRtmydq.js +0 -318
  44. package/dist/action-runtime-DvNB5A61.js +0 -72
  45. package/dist/action-runtime-api-BnVs42oX.js +0 -1028
  46. package/dist/actions-CUYHtUqe.js +0 -531
  47. package/dist/actions.runtime-BBrSlYkH.js +0 -18
  48. package/dist/actions.runtime-DB4aKmBO.js +0 -5
  49. package/dist/actions.runtime-bdKprwSE.js +0 -2
  50. package/dist/actions.runtime.js +0 -1
  51. package/dist/active-listener-SB9ihcaC.js +0 -46
  52. package/dist/agent-command-C_MGil8o.js +0 -1457
  53. package/dist/agent-list-MRXQwyo0.js +0 -52
  54. package/dist/agent-media-payload-DDTSvr-n.js +0 -17
  55. package/dist/agent-paths-D711oayD.js +0 -12
  56. package/dist/agent-runner-utils-DEYzwZHa.js +0 -182
  57. package/dist/agent-runner.runtime-v2uIsAVy.js +0 -2218
  58. package/dist/agent-runner.runtime.js +0 -1
  59. package/dist/agent-runtime-Cz19IsmJ.js +0 -142
  60. package/dist/agent-s4m0Xp6V.js +0 -2
  61. package/dist/agent-scope-rWWUivuC.js +0 -215
  62. package/dist/agent-tools-login-DU1gQC9-.js +0 -57
  63. package/dist/agents/auth-profiles.runtime.js +0 -7
  64. package/dist/agents/pi-model-discovery-runtime.js +0 -2
  65. package/dist/agents-B2W3IoEe.js +0 -888
  66. package/dist/agents-DmE3LRim.js +0 -5
  67. package/dist/agents.config-D6XoJFQ-.js +0 -3
  68. package/dist/agents.config-Ui_tQc3C.js +0 -121
  69. package/dist/allow-from-Bj0HDNYh.js +0 -20
  70. package/dist/allow-from-CJwSUt_K.js +0 -9
  71. package/dist/allow-from-xOap1t02.js +0 -62
  72. package/dist/allow-list-DeRUbyj4.js +0 -319
  73. package/dist/allowed-updates-aOgPxM0g.js +0 -31
  74. package/dist/allowlist-config-edit-Ch2EvAYo.js +0 -279
  75. package/dist/allowlist-match-Dm6AqFEs.js +0 -63
  76. package/dist/ansi-B_0KjIJj.js +0 -54
  77. package/dist/anthropic-vertex-Stff_3_3.js +0 -21
  78. package/dist/anthropic-vertex-stream-DgR8-m-G.js +0 -653
  79. package/dist/api-7Pf2fGBp.js +0 -11
  80. package/dist/api-B80kCRiV.js +0 -11
  81. package/dist/api-B8_Wwelx.js +0 -2
  82. package/dist/api-BLI24uxW.js +0 -2
  83. package/dist/api-BLSg8PM8.js +0 -2
  84. package/dist/api-BRy2h4ZA.js +0 -2
  85. package/dist/api-BU_YBaOK.js +0 -3
  86. package/dist/api-BXQjqvPC.js +0 -2
  87. package/dist/api-BY9iT-AK.js +0 -106
  88. package/dist/api-BipiQQoS.js +0 -2
  89. package/dist/api-Bk5mFOju.js +0 -10
  90. package/dist/api-BrsLZRXn.js +0 -3
  91. package/dist/api-C16j1Xno.js +0 -2
  92. package/dist/api-CGtiPyfv.js +0 -8358
  93. package/dist/api-CHIsf5Wl.js +0 -21
  94. package/dist/api-CP9q4gi6.js +0 -19
  95. package/dist/api-CWPDpJCM.js +0 -2
  96. package/dist/api-CaMdAP9T.js +0 -2
  97. package/dist/api-CftMlodx.js +0 -5
  98. package/dist/api-Cpj_QQAF.js +0 -5
  99. package/dist/api-D13mhDzE.js +0 -33
  100. package/dist/api-DGcbqpSh.js +0 -2
  101. package/dist/api-DIGFhGqm.js +0 -30
  102. package/dist/api-DNxTJAiA.js +0 -5
  103. package/dist/api-DasNTWRo.js +0 -2
  104. package/dist/api-Dn7n2sWC.js +0 -74
  105. package/dist/api-Drq06O1M2.js +0 -6
  106. package/dist/api-OOJHubHS.js +0 -77
  107. package/dist/api-XH46JouJ.js +0 -2
  108. package/dist/api-builder-uuKvRs_O.js +0 -66
  109. package/dist/api-e3cIcFaV.js +0 -1
  110. package/dist/api-fetch-CvBBI8q8.js +0 -35
  111. package/dist/api-key-rotation-BCssmYGp.js +0 -150
  112. package/dist/api-rPpH8518.js +0 -322
  113. package/dist/api-w-46PN0B.js +0 -2
  114. package/dist/apply-DfjUTAkv.js +0 -485
  115. package/dist/apply.runtime-B-srtEUl.js +0 -2
  116. package/dist/apply.runtime-DOG87kW8.js +0 -166
  117. package/dist/apply.runtime.js +0 -1
  118. package/dist/approval-native-CI9-iVJa.js +0 -79
  119. package/dist/approval-native-runtime-2AVlvrdL.js +0 -399
  120. package/dist/approval-renderers-BTKeDNRo.js +0 -87
  121. package/dist/approval-runtime-DIA8ohXa.js +0 -262
  122. package/dist/archive-BaCqqQP1.js +0 -537
  123. package/dist/arg-split-get0R_Yr.js +0 -38
  124. package/dist/artifacts-DXKlQp1z.js +0 -52
  125. package/dist/assistant-error-format-CFSPB8qt.js +0 -109
  126. package/dist/async-lock-QqhPYwhW.js +0 -19
  127. package/dist/attachment-normalize-CMMyswNa.js +0 -921
  128. package/dist/audio-BxqNDSFq.js +0 -53
  129. package/dist/audio-DZWA6M9B.js +0 -41
  130. package/dist/audit-86J-sIQq.js +0 -54
  131. package/dist/audit-D9O3O-41.js +0 -86
  132. package/dist/audit-DwAT-Kzg.js +0 -892
  133. package/dist/audit-channel.allow-from.runtime-DmuUvr2f.js +0 -5
  134. package/dist/audit-channel.allow-from.runtime.js +0 -1
  135. package/dist/audit-channel.collect.runtime-B76LAkrF.js +0 -528
  136. package/dist/audit-channel.collect.runtime.js +0 -1
  137. package/dist/audit-channel.discord.runtime-qM5u1Hnl.js +0 -5
  138. package/dist/audit-channel.discord.runtime.js +0 -1
  139. package/dist/audit-channel.telegram.runtime-DpwmRUPy.js +0 -8
  140. package/dist/audit-channel.telegram.runtime.js +0 -1
  141. package/dist/audit-channel.zalouser.runtime-CzlFZYsv.js +0 -5
  142. package/dist/audit-channel.zalouser.runtime.js +0 -1
  143. package/dist/audit-extra.async-BupKW2BB.js +0 -820
  144. package/dist/audit-fs-B3GdTjId.js +0 -375
  145. package/dist/audit-membership-runtime-n195y1jy.js +0 -55
  146. package/dist/audit.deep.runtime-2gZPpwj8.js +0 -2
  147. package/dist/audit.deep.runtime.js +0 -1
  148. package/dist/audit.nondeep.runtime-6MT8p_25.js +0 -831
  149. package/dist/audit.nondeep.runtime.js +0 -1
  150. package/dist/audit.runtime-jdG0-1Bq.js +0 -7
  151. package/dist/audit.runtime.js +0 -1
  152. package/dist/auth-CmL8nlqP.js +0 -371
  153. package/dist/auth-Zya_1BCc.js +0 -181
  154. package/dist/auth-choice-CSSk-2VN.js +0 -69
  155. package/dist/auth-choice-Uyll2O8p.js +0 -341
  156. package/dist/auth-choice-legacy-5XgU4yCZ.js +0 -44
  157. package/dist/auth-choice-options-DTRb6fq4.js +0 -98
  158. package/dist/auth-choice-prompt-BAQTSD2R.js +0 -36
  159. package/dist/auth-choice-prompt-D6qkTw8h.js +0 -2
  160. package/dist/auth-choice-x5Cm9EXp.js +0 -3
  161. package/dist/auth-choice.apply-helpers-CtKCiOT4.js +0 -2
  162. package/dist/auth-choice.plugin-providers.runtime-BVH7Kq_W.js +0 -11
  163. package/dist/auth-choice.plugin-providers.runtime.js +0 -1
  164. package/dist/auth-health-BBleirOY.js +0 -165
  165. package/dist/auth-mode-policy-BD7_M2AG.js +0 -18
  166. package/dist/auth-profiles-B0SpzBJv.js +0 -440
  167. package/dist/auth-rate-limit-OkMcM1wH.js +0 -119
  168. package/dist/auth-store-Bro-SY1-.js +0 -242
  169. package/dist/avatar-policy-pho6U35i.js +0 -67
  170. package/dist/backend-config-CNAjcjho.js +0 -311
  171. package/dist/backoff-nvVV-tHk.js +0 -18
  172. package/dist/backup-create-CkkM1HNg.js +0 -462
  173. package/dist/backup-health-BWSliymu.js +0 -59
  174. package/dist/banner-DPWatUan.js +0 -370
  175. package/dist/banner-lDKgB6uE.js +0 -2
  176. package/dist/base-session-key-CRSigEPk.js +0 -14
  177. package/dist/binaries-CWBYavgU.js +0 -2
  178. package/dist/binaries-sPf-9aLM.js +0 -11
  179. package/dist/binding-registry-BkSvI4jO.js +0 -520
  180. package/dist/binding-targets-CdIq3brX.js +0 -99
  181. package/dist/bindings-AuReyzvX.js +0 -21
  182. package/dist/bindings-CYhLRcr8.js +0 -69
  183. package/dist/block-reply-pipeline-GSCCinHx.js +0 -266
  184. package/dist/block-streaming-4outFa6R.js +0 -107
  185. package/dist/bluebubbles-CorTCHc9.js +0 -64
  186. package/dist/bluebubbles-D2WymlOg.js +0 -235
  187. package/dist/bluebubbles-policy-C3d8eqhQ.js +0 -13
  188. package/dist/bonjour-cache-cleanup-BZJ-GrdX.js +0 -126
  189. package/dist/boolean-BEhDlAk_.js +0 -29
  190. package/dist/boolean-param-B807dWHx.js +0 -13
  191. package/dist/bot-BM1bybV7.js +0 -4268
  192. package/dist/bot-message-context-CdedyAq_.js +0 -2
  193. package/dist/bot-message-context-DKGx6N8p.js +0 -1175
  194. package/dist/bot-message-context.runtime-ClW1x1V5.js +0 -7
  195. package/dist/bot-message-context.runtime.js +0 -1
  196. package/dist/bot-message-context.session.runtime-BWjdkRuf.js +0 -12
  197. package/dist/bot-message-context.session.runtime.js +0 -1
  198. package/dist/bot-native-commands.delivery.runtime-CgfbR-Nj.js +0 -3
  199. package/dist/bot-native-commands.delivery.runtime.js +0 -1
  200. package/dist/bot-native-commands.runtime-DCz7w0aK.js +0 -11
  201. package/dist/bot-native-commands.runtime.js +0 -1
  202. package/dist/boundary-file-read-DB4ibbUg.js +0 -192
  203. package/dist/brave-web-search-provider-B7m_Mprt.js +0 -441
  204. package/dist/brew-B9JEV5Jj.js +0 -44
  205. package/dist/browser-config-D_OlwMzh.js +0 -226
  206. package/dist/browser-open-C9FOO4U_.js +0 -94
  207. package/dist/browser-runtime-CnWZ_eLQ.js +0 -185
  208. package/dist/browser-support-Cdp2Gr_6.js +0 -34
  209. package/dist/btw-command-CPUGSdlD.js +0 -16
  210. package/dist/build-info.json +0 -5
  211. package/dist/bundle-lsp-CCIAK1od.js +0 -93
  212. package/dist/bundled/boot-md/HOOK.md +0 -20
  213. package/dist/bundled/boot-md/handler.js +0 -180
  214. package/dist/bundled/bootstrap-extra-files/HOOK.md +0 -53
  215. package/dist/bundled/bootstrap-extra-files/handler.js +0 -42
  216. package/dist/bundled/command-logger/HOOK.md +0 -122
  217. package/dist/bundled/command-logger/handler.js +0 -56
  218. package/dist/bundled/session-memory/HOOK.md +0 -108
  219. package/dist/bundled/session-memory/handler.js +0 -196
  220. package/dist/bundled/workflow-summary/HOOK.md +0 -123
  221. package/dist/bundled/workflow-summary/handler.js +0 -115
  222. package/dist/bundled-capability-metadata-BpPgIy_5.js +0 -40
  223. package/dist/bundled-compat-BLlVmkDi.js +0 -64
  224. package/dist/bundled-sources-BQTCt2mJ.js +0 -53
  225. package/dist/button-types-B3_mzf8P.js +0 -54
  226. package/dist/cache-controls-DBdT4I-H.js +0 -40
  227. package/dist/call-dy-GwrXS.js +0 -649
  228. package/dist/call-ti-nPnzT.js +0 -2
  229. package/dist/canvas-host/a2ui/.bundle.hash +0 -1
  230. package/dist/canvas-host/a2ui/a2ui.bundle.js +0 -14896
  231. package/dist/canvas-host/a2ui/index.html +0 -307
  232. package/dist/capability-provider-runtime-CFUC5NbJ.js +0 -40
  233. package/dist/catalog-5PPtilI5.js +0 -274
  234. package/dist/channel-2EW4xzvV.js +0 -788
  235. package/dist/channel-BiRtGLF8.js +0 -1135
  236. package/dist/channel-C3AVw0Nl.js +0 -883
  237. package/dist/channel-CPe2XmyD.js +0 -1217
  238. package/dist/channel-CVFWRvjf.js +0 -337
  239. package/dist/channel-Cs0onQ6d.js +0 -4976
  240. package/dist/channel-D18v9r53.js +0 -1661
  241. package/dist/channel-D2n2s8Le.js +0 -208
  242. package/dist/channel-DWKApPW2.js +0 -454
  243. package/dist/channel-Depm5C-f.js +0 -800
  244. package/dist/channel-DwTcZxFU.js +0 -1129
  245. package/dist/channel-LT5vI3EK.js +0 -361
  246. package/dist/channel-XgThIGmf.js +0 -698
  247. package/dist/channel-account-context-CWd3uN_m.js +0 -104
  248. package/dist/channel-actions-DSvaYD1T.js +0 -39
  249. package/dist/channel-bQKtZIt6.js +0 -599
  250. package/dist/channel-catalog.json +0 -3
  251. package/dist/channel-config-D0eO5f5m.js +0 -115
  252. package/dist/channel-config-helpers-CLFL8FLU.js +0 -482
  253. package/dist/channel-config-primitives-DwsP66Ak.js +0 -3
  254. package/dist/channel-config-schema-DsguzRfd.js +0 -6
  255. package/dist/channel-config-writes-DQZOOZZ8.js +0 -1
  256. package/dist/channel-configured-B6WgvouH.js +0 -108
  257. package/dist/channel-feedback-DiLm9hqS.js +0 -257
  258. package/dist/channel-inbound-CXD3aSAK.js +0 -30
  259. package/dist/channel-issues-C-49e607.js +0 -13
  260. package/dist/channel-lifecycle-BnjeZxB6.js +0 -286
  261. package/dist/channel-lifecycle.core-Cn3zeU0h.js +0 -69
  262. package/dist/channel-options-DXJ7b7Ye.js +0 -39
  263. package/dist/channel-pairing-Byr3MFbN.js +0 -68
  264. package/dist/channel-plugin-common-D2EFcTg8.js +0 -4
  265. package/dist/channel-plugin-ids-DiOSWlnO.js +0 -56
  266. package/dist/channel-plugin-resolution-SMHmHx5v.js +0 -144
  267. package/dist/channel-policy-B-XKjrjK.js +0 -32
  268. package/dist/channel-reply-pipeline-BtBcBCNu.js +0 -16
  269. package/dist/channel-resolution-Du3EtWh1.js +0 -60
  270. package/dist/channel-runtime-F8_51GPp.js +0 -9
  271. package/dist/channel-selection-Bz3pl14y.js +0 -125
  272. package/dist/channel-send-result-CyfDCXJG.js +0 -40
  273. package/dist/channel-setup-yWpuHwhm.js +0 -51
  274. package/dist/channel-shared-gHcJ8n-f.js +0 -58
  275. package/dist/channel-status-CyoeLEnj.js +0 -2
  276. package/dist/channel-summary-5zHt-z1E.js +0 -139
  277. package/dist/channel-summary-B_fbXZ3l.js +0 -2
  278. package/dist/channel-target-DHO43h-I.js +0 -157
  279. package/dist/channel-targets-C8ZPfJmV.js +0 -18
  280. package/dist/channel-y-bXwYi3.js +0 -783
  281. package/dist/channel.runtime-B2SEUCf0.js +0 -14
  282. package/dist/channel.runtime-BF5qdBeA.js +0 -5
  283. package/dist/channel.runtime-BPaq6EO_.js +0 -108
  284. package/dist/channel.runtime-BV8FGxyb.js +0 -373
  285. package/dist/channel.runtime-CGnamSTC.js +0 -125
  286. package/dist/channel.runtime-CRNf20Ct.js +0 -80
  287. package/dist/channel.runtime-CRSWVexY.js +0 -335
  288. package/dist/channel.runtime-Cg6DmoTp.js +0 -783
  289. package/dist/channel.runtime-CpHTHeFR.js +0 -309
  290. package/dist/channel.runtime-ZdhCn8XI.js +0 -3315
  291. package/dist/channel.runtime-cXufT2kW.js +0 -61
  292. package/dist/channel.runtime.js +0 -1
  293. package/dist/channel.setup-Bq1vgxXZ.js +0 -279
  294. package/dist/channels-BZC2kp_G.js +0 -409
  295. package/dist/channels-CMeYB3bY.js +0 -1134
  296. package/dist/channels-cli-BIzqRmuu.js +0 -246
  297. package/dist/channels-status-issues-DqTdy1lq.js +0 -17
  298. package/dist/chat-envelope-DlGbh8k2.js +0 -158
  299. package/dist/chat-meta-wVbKo1sw.js +0 -700
  300. package/dist/chat-target-prefixes-DCF8a_Lp.js +0 -156
  301. package/dist/chat-type-DXjGtE-S.js +0 -10
  302. package/dist/chunk-CW-a7Cfh.js +0 -334
  303. package/dist/chunk-CrysgU_F.js +0 -36
  304. package/dist/chutes-oauth-Bh3BTMMG.js +0 -127
  305. package/dist/cjk-chars-Dl_Ko7yI.js +0 -50
  306. package/dist/clack-prompter-C5PtKpUH.js +0 -112
  307. package/dist/clawbot-cli-CgHyabtp.js +0 -9
  308. package/dist/clawhub-CDs2LE11.js +0 -263
  309. package/dist/clawhub-CO6YnoQZ.js +0 -163
  310. package/dist/cli/daemon-cli.js +0 -9
  311. package/dist/cli-CoOwN-V4.js +0 -164
  312. package/dist/cli-CpOL_jWZ.js +0 -152
  313. package/dist/cli-DCp06hI2.js +0 -2
  314. package/dist/cli-DVSDSUQm.js +0 -695
  315. package/dist/cli-backend-B20k67rv.js +0 -44
  316. package/dist/cli-backend-CcuyEMrq.js +0 -1
  317. package/dist/cli-backend-DMTxL8mq.js +0 -40
  318. package/dist/cli-backend-M4CTb3mq.js +0 -49
  319. package/dist/cli-migration-BwqQvUer.js +0 -100
  320. package/dist/cli-name-C3PA6Rhs.js +0 -21
  321. package/dist/cli-runner-8SNo1pKS.js +0 -1014
  322. package/dist/cli-runtime-ChUqI2f-.js +0 -3
  323. package/dist/cli-shared-01J1LZRE.js +0 -72
  324. package/dist/cli-startup-metadata.json +0 -14
  325. package/dist/cli-utils-eYXt_xAg.js +0 -40
  326. package/dist/cli-watchdog-defaults-Dff-MFUz.js +0 -14
  327. package/dist/cli.runtime-WWGaX6X6.js +0 -547
  328. package/dist/cli.runtime.js +0 -1
  329. package/dist/client-BFxjGELJ.js +0 -5
  330. package/dist/client-C8_DsF-r.js +0 -7
  331. package/dist/client-bootstrap-BiVps8T6.js +0 -2
  332. package/dist/client-bootstrap-CFGCltAu.js +0 -121
  333. package/dist/client-lEilgam1.js +0 -87
  334. package/dist/cmd-argv-BbyQhzAC.js +0 -68
  335. package/dist/code-execution-CPcuE0sX.js +0 -142
  336. package/dist/codex-native-web-search-CyrsDBZ2.js +0 -155
  337. package/dist/codex-native-web-search-PFJu8fcM.js +0 -2
  338. package/dist/collection-runtime-DJjFReXJ.js +0 -1
  339. package/dist/command-auth-BAkZv3cP.js +0 -356
  340. package/dist/command-auth-native-Bsp5Doyd.js +0 -3
  341. package/dist/command-auth-tqFmaIaJ.js +0 -64
  342. package/dist/command-detection-BV7Ipg_0.js +0 -49
  343. package/dist/command-detection-DyqWl5Nq.js +0 -2
  344. package/dist/command-format-CX1xXtgB.js +0 -22
  345. package/dist/command-format-DwYoemR9.js +0 -2
  346. package/dist/command-gating-NyDk7t84.js +0 -40
  347. package/dist/command-options-BUoAEXAi.js +0 -25
  348. package/dist/command-poll-backoff-B7RiSvcV.js +0 -56
  349. package/dist/command-poll-backoff.runtime-DX9gobB0.js +0 -7
  350. package/dist/command-poll-backoff.runtime.js +0 -1
  351. package/dist/command-queue-CxEmvSGT.js +0 -253
  352. package/dist/command-registry-CaJXKNoO.js +0 -3
  353. package/dist/command-registry-Ct0qor9d.js +0 -199
  354. package/dist/command-secret-gateway-43O-1Hnf.js +0 -2
  355. package/dist/command-secret-gateway-C39SFGHd.js +0 -442
  356. package/dist/command-secret-targets-Bns-l1xV.js +0 -2
  357. package/dist/command-secret-targets-CTrFghcj.js +0 -87
  358. package/dist/command-surface-CfP1vask.js +0 -2
  359. package/dist/commands/status.summary.runtime.js +0 -146
  360. package/dist/commands-BxWe27p0.js +0 -42
  361. package/dist/commands-CiyPyNRY.js +0 -194
  362. package/dist/commands-acp-BeCm2Wnq.js +0 -990
  363. package/dist/commands-context-DbfMrVv4.js +0 -33
  364. package/dist/commands-core-CEmQydIV.js +0 -241
  365. package/dist/commands-core.runtime-BYooAQbc.js +0 -2
  366. package/dist/commands-core.runtime.js +0 -1
  367. package/dist/commands-handlers.runtime-CEAP4Yv2.js +0 -3707
  368. package/dist/commands-handlers.runtime.js +0 -1
  369. package/dist/commands-info-COwAtIWb.js +0 -651
  370. package/dist/commands-models-B4EJh5Fy.js +0 -395
  371. package/dist/commands-o21Y9Xck.js +0 -4
  372. package/dist/commands-registry-DgMc5_jk.js +0 -295
  373. package/dist/commands-registry.data-5O2FOeZl.js +0 -935
  374. package/dist/commands-registry.runtime-CT_YXpwM.js +0 -2
  375. package/dist/commands-registry.runtime.js +0 -1
  376. package/dist/commands-status.runtime-D4F4iVUh.js +0 -2
  377. package/dist/commands-status.runtime.js +0 -1
  378. package/dist/commands.runtime-_ALsMFcS.js +0 -4
  379. package/dist/commands.runtime.js +0 -1
  380. package/dist/common-Dbmo0I1E.js +0 -206
  381. package/dist/compact.runtime-CBfyBJbR.js +0 -7
  382. package/dist/compact.runtime.js +0 -1
  383. package/dist/completion-cli-COhEd9CF.js +0 -2
  384. package/dist/completion-cli-DHe4Rit5.js +0 -466
  385. package/dist/components-CamLdbbq.js +0 -797
  386. package/dist/components-DPbtLC3x.js +0 -2
  387. package/dist/config-CKJA2kAO.js +0 -53
  388. package/dist/config-D7-9dK3i.js +0 -138
  389. package/dist/config-DJ29sg5U.js +0 -475
  390. package/dist/config-DJNI2tTK.js +0 -136
  391. package/dist/config-Dr2GRT3y.js +0 -135
  392. package/dist/config-DsqKYjeo.js +0 -421
  393. package/dist/config-Q9kc32gz.js +0 -41
  394. package/dist/config-RUefx-_1.js +0 -8
  395. package/dist/config-cli-BqlYHmPA.js +0 -945
  396. package/dist/config-error-handler-BKRR0_j_.js +0 -197
  397. package/dist/config-error-handler-CT1igiX6.js +0 -2
  398. package/dist/config-eval-hTWq4IVy.js +0 -100
  399. package/dist/config-guard-Bk3_wSTH.js +0 -113
  400. package/dist/config-helpers-DLVbtn1B.js +0 -117
  401. package/dist/config-paths-BKYh__Ga.js +0 -8
  402. package/dist/config-paths-DP5yXXo2.js +0 -102
  403. package/dist/config-presence-omlqvhAQ.js +0 -79
  404. package/dist/config-regex-CvZFnWkO.js +0 -39
  405. package/dist/config-runtime-ngoccXmP.js +0 -13
  406. package/dist/config-schema-B3sQY5B_.js +0 -133
  407. package/dist/config-schema-B_2MhEQY.js +0 -71
  408. package/dist/config-schema-BpIXBNbc.js +0 -202
  409. package/dist/config-schema-BtfQOmdV.js +0 -115
  410. package/dist/config-schema-Bw-Xbo_T.js +0 -85
  411. package/dist/config-schema-Cqj-Mugi.js +0 -105
  412. package/dist/config-schema-DQSj_ZL_.js +0 -29
  413. package/dist/config-schema-Pe1Vn9kb.js +0 -17
  414. package/dist/config-schema-f7nntJMh.js +0 -25
  415. package/dist/config-schema-lBqODOnr.js +0 -25
  416. package/dist/config-schema-mfJ91WLf.js +0 -65
  417. package/dist/config-secret-input.runtime-B_HyRtgE.js +0 -3
  418. package/dist/config-secret-input.runtime.js +0 -1
  419. package/dist/config-state-DfIk9ME6.js +0 -289
  420. package/dist/config-status-Bnobp1-p.js +0 -2
  421. package/dist/config-status-Db93sFQB.js +0 -109
  422. package/dist/config-update-B_S0YQ_Y.js +0 -3
  423. package/dist/config-update-CK4EDDeD.js +0 -127
  424. package/dist/config-validation-Bh_sg7RW.js +0 -276
  425. package/dist/config-value-CMTdBw5q.js +0 -25
  426. package/dist/configure-CGDY1YR7.js +0 -1140
  427. package/dist/configure-V8jejRHr.js +0 -2
  428. package/dist/configured-provider-fallback-DWYDg0L7.js +0 -15
  429. package/dist/connection-auth-CKM60o55.js +0 -30
  430. package/dist/connection-details-DyVOoGG6.js +0 -56
  431. package/dist/constants-Bq55qi82.js +0 -71
  432. package/dist/constants-CimYBSye.js +0 -4
  433. package/dist/content-blocks-DuKJNUtm.js +0 -785
  434. package/dist/context-D-9a98Zk.js +0 -227
  435. package/dist/context-visibility-DTMZdcAH.js +0 -14
  436. package/dist/context-visibility-vOvLMUrZ.js +0 -35
  437. package/dist/context-window-guard-WE0ENAeQ.js +0 -46
  438. package/dist/control-ui-assets-DVYAF-2p.js +0 -240
  439. package/dist/control-ui-shared-BKXkFsA7.js +0 -29
  440. package/dist/conversation-binding-C2nuZ3Eg.js +0 -520
  441. package/dist/conversation-binding-input-CBwdWDC4.js +0 -250
  442. package/dist/conversation-bindings-Cq4z4vhr.js +0 -210
  443. package/dist/conversation-id-4JeHag0a.js +0 -168
  444. package/dist/conversation-id-CXuzm-Ub.js +0 -116
  445. package/dist/conversation-id-DCTwJCZF.js +0 -43
  446. package/dist/conversation-label-C2xTELop.js +0 -32
  447. package/dist/conversation-runtime-bArk0IjJ.js +0 -85
  448. package/dist/core-DaMVvavf.js +0 -195
  449. package/dist/core-api-D0U2iGRK.js +0 -670
  450. package/dist/core-command-descriptors-DxRm2H1p.js +0 -91
  451. package/dist/create-client-BOKOxyiu.js +0 -58
  452. package/dist/create-client-Bzn467Jo.js +0 -2
  453. package/dist/credentials-BGPs1gIX.js +0 -242
  454. package/dist/credentials-DUoYFiLk.js +0 -22
  455. package/dist/credentials-read-CDYtvkBt.js +0 -74
  456. package/dist/credentials-read-KB395CbD.js +0 -2
  457. package/dist/credentials-write.runtime-Bx7mKj4E.js +0 -9
  458. package/dist/credentials-write.runtime.js +0 -1
  459. package/dist/creds-files-CTtTs6zG.js +0 -19
  460. package/dist/cron-cli-Di3TakVa.js +0 -644
  461. package/dist/crypto-node.runtime-DI0fQ6wI.js +0 -5
  462. package/dist/crypto-node.runtime.js +0 -1
  463. package/dist/crypto-runtime-Bc-jKPlv.js +0 -1036
  464. package/dist/current-time--aIDbABZ.js +0 -20
  465. package/dist/daemon-cli-Cnry1ft1.js +0 -370
  466. package/dist/daemon-install-de_bWPuS.js +0 -63
  467. package/dist/daemon-install-plan.shared-u00bwv47.js +0 -222
  468. package/dist/daemon-runtime-DPejcJWG.js +0 -12
  469. package/dist/dangerous-name-matching-DnCDaXzP.js +0 -48
  470. package/dist/dangerous-name-runtime-Dinw00TZ.js +0 -1
  471. package/dist/dangerous-tools-C3RlQe7u.js +0 -38
  472. package/dist/date-time-DRQ0-oaw.js +0 -118
  473. package/dist/ddg-search-provider-B0zLjcDN.js +0 -182
  474. package/dist/dedupe-DZbQYOSD.js +0 -59
  475. package/dist/default-account-warnings-BCrmijcz.js +0 -15
  476. package/dist/default-models-Br0v8QOH.js +0 -35
  477. package/dist/defaults-DAt--D9n.js +0 -6
  478. package/dist/defaults-D_Y_lvUP.js +0 -7
  479. package/dist/defaults-MkMfnGzi.js +0 -7
  480. package/dist/delegate-CLP7zDS_.js +0 -43
  481. package/dist/deliver-CIUEKe4q.js +0 -954
  482. package/dist/deliver-LN-Yg8wS.js +0 -3
  483. package/dist/deliver-reply-DL-CSF43.js +0 -238
  484. package/dist/deliver-runtime-CoqXhxlS.js +0 -2
  485. package/dist/delivery-CL_3vFSl.js +0 -834
  486. package/dist/delivery-context-CoAL-jTI.js +0 -106
  487. package/dist/delivery-info-DTAUApso.js +0 -40
  488. package/dist/delivery-queue-DBW69jH4.js +0 -2
  489. package/dist/delivery-queue-DMubgaLa.js +0 -289
  490. package/dist/deps-34N0Nmbl.js +0 -67
  491. package/dist/deps-BVogrCia.js +0 -2
  492. package/dist/deps-DZJpA4XG.js +0 -153
  493. package/dist/detect-Zrcrs8SP.js +0 -12
  494. package/dist/detect-binary-CEX186X6.js +0 -30
  495. package/dist/device-auth-D_0GUMYY.js +0 -19
  496. package/dist/device-bootstrap-Bnn4K3fQ.js +0 -3
  497. package/dist/device-bootstrap-bwpHYQhY.js +0 -176
  498. package/dist/device-health-B3q7Cmqn.js +0 -2
  499. package/dist/device-health-DhmPD0gq.js +0 -16
  500. package/dist/device-identity-Cak311si.js +0 -2
  501. package/dist/device-identity-Doxo0HJx.js +0 -140
  502. package/dist/device-metadata-normalization-B5_zplC_.js +0 -21
  503. package/dist/device-pairing-BCpR-Vtb.js +0 -520
  504. package/dist/devices-cli-DYPkfzsG.js +0 -328
  505. package/dist/diagnostic-DfKz60Xk.js +0 -311
  506. package/dist/diagnostic-events-CUSmY-rn.js +0 -48
  507. package/dist/diagnostic-flags-DLDDycUv.js +0 -64
  508. package/dist/diagnostic-runtime-ZQC4AswI.js +0 -1
  509. package/dist/diagnostics-Cxl1bFGj.js +0 -33
  510. package/dist/diagnostics-GjF7wpY9.js +0 -2
  511. package/dist/diagnostics-otel-C2RQUlQT.js +0 -3
  512. package/dist/diffs-DsHt689X.js +0 -2
  513. package/dist/direct-dm-ByuWacLn.js +0 -139
  514. package/dist/direct-management-DEtuCcDL.js +0 -2
  515. package/dist/direct-management-DMp7MOnt.js +0 -300
  516. package/dist/direct-room-ARYWsCbX.js +0 -2
  517. package/dist/direct-room-DYlSJOU_.js +0 -67
  518. package/dist/directive-handling.defaults-BMh2DXTA.js +0 -19
  519. package/dist/directive-handling.fast-lane-CBX4jbax.js +0 -2
  520. package/dist/directive-handling.fast-lane-DRvycpgg.js +0 -64
  521. package/dist/directive-handling.impl-BKJf5Ltu.js +0 -672
  522. package/dist/directive-handling.impl-BkdGnm-T.js +0 -2
  523. package/dist/directive-handling.levels-BHOBnnn8.js +0 -2
  524. package/dist/directive-handling.levels-CecoBNlK.js +0 -12
  525. package/dist/directive-handling.parse-BuTiWmrT.js +0 -375
  526. package/dist/directive-handling.persist-D9RYevoA.js +0 -133
  527. package/dist/directive-handling.persist.runtime-Cb_unTVH.js +0 -2
  528. package/dist/directive-handling.persist.runtime.js +0 -1
  529. package/dist/directive-handling.shared-_Zvt3-ej.js +0 -158
  530. package/dist/directive-tags-Cm0H6Dn_.js +0 -109
  531. package/dist/directives-f-UxcP8D.js +0 -209
  532. package/dist/directory-cache-CM_EUchr.js +0 -62
  533. package/dist/directory-cli-D6N59tzr.js +0 -238
  534. package/dist/directory-config-helpers-BCrssKbI.js +0 -141
  535. package/dist/directory-runtime-CAabZ_XW.js +0 -20
  536. package/dist/directory.static-TKo2MeNR.js +0 -45
  537. package/dist/discord-BOpl5w4U.js +0 -5
  538. package/dist/discord-account-wyFuLDq_.js +0 -11
  539. package/dist/discord-core-BpzKxDZ7.js +0 -5
  540. package/dist/discord-lOPvIxp4.js +0 -11
  541. package/dist/discord-runtime-surface-Dm5WUtCV.js +0 -67
  542. package/dist/discord-session-key-DaPto1yr.js +0 -11
  543. package/dist/discord-surface-Cg_Mu9MI.js +0 -30
  544. package/dist/discord-thread-bindings-zIOp1Tj4.js +0 -29
  545. package/dist/discord-timeouts-Di5n5LAU.js +0 -12
  546. package/dist/discovery-DLbFJLD_.js +0 -171
  547. package/dist/dispatch-C4gGGYZt.js +0 -858
  548. package/dist/dispatch-acp.runtime-DUHj6bP-.js +0 -884
  549. package/dist/dispatch-acp.runtime.js +0 -1
  550. package/dist/dist-7JNqoGV7.js +0 -3
  551. package/dist/dist-BqJPEiV8.js +0 -14245
  552. package/dist/dist-DdE56Pmi.js +0 -503
  553. package/dist/dist-shQCTuJB.js +0 -1239
  554. package/dist/dm-policy-shared-C99GNVxp.js +0 -188
  555. package/dist/dns-cli-vQBAzTmg.js +0 -192
  556. package/dist/docker-BN7sQKCb.js +0 -789
  557. package/dist/docs-cli-Br6cfKoS.js +0 -156
  558. package/dist/doctor-completion-Cf0GcTXR.js +0 -90
  559. package/dist/doctor-config-preflight-C2cKYiKe.js +0 -2
  560. package/dist/doctor-config-preflight-DNbO-_N8.js +0 -148
  561. package/dist/doctor-state-migrations-BXkbeSFy.js +0 -2
  562. package/dist/doctor-state-migrations-G3shZ-W_.js +0 -3
  563. package/dist/dotenv-CelghjA4.js +0 -11
  564. package/dist/dotenv-Csg1Xj8n.js +0 -113
  565. package/dist/embedding-provider-Aey9VsDb.js +0 -129
  566. package/dist/enable-BgSxsKp_.js +0 -57
  567. package/dist/encryption-guidance-62xAQFP4.js +0 -33
  568. package/dist/entry-status-3ymZYX2l.js +0 -172
  569. package/dist/entry.js +0 -209
  570. package/dist/env-CK3eZNIX.js +0 -40
  571. package/dist/env-overrides-CcDOWo0Y.js +0 -346
  572. package/dist/env-overrides.runtime-CKb7-Q72.js +0 -7
  573. package/dist/env-overrides.runtime.js +0 -1
  574. package/dist/env-substitution-UhJwb0ys.js +0 -136
  575. package/dist/envelope-CrC9AdBL.js +0 -137
  576. package/dist/error-runtime-D-gKufd_.js +0 -2
  577. package/dist/error-text-BC9WfvfX.js +0 -24
  578. package/dist/errors-Bs2h5H8p.js +0 -71
  579. package/dist/errors-CjFsF-QY.js +0 -9
  580. package/dist/exa-web-search-provider-DUUlmDcV.js +0 -355
  581. package/dist/exec-BO6vYjRf.js +0 -368
  582. package/dist/exec-CD7C9g-b.js +0 -2
  583. package/dist/exec-approval-reply-CFOEcmIv.js +0 -189
  584. package/dist/exec-approval-session-target-BbsAlD1Q.js +0 -159
  585. package/dist/exec-approvals-3UDrE7Q9.js +0 -1565
  586. package/dist/exec-approvals-CW5axvaY.js +0 -121
  587. package/dist/exec-approvals-cli-BPYvtJv-.js +0 -483
  588. package/dist/exec-approvals-effective-DbLJfkpe.js +0 -140
  589. package/dist/exec-safe-bin-runtime-policy-218hHVyc.js +0 -90
  590. package/dist/exec-safety-XzKkUSvE.js +0 -24
  591. package/dist/export-html/template.css +0 -1060
  592. package/dist/export-html/template.html +0 -88
  593. package/dist/export-html/template.js +0 -1875
  594. package/dist/export-html/vendor/highlight.min.js +0 -1213
  595. package/dist/export-html/vendor/marked.min.js +0 -6
  596. package/dist/extension-shared-V_4IXpRU.js +0 -74
  597. package/dist/extensionAPI.js +0 -17
  598. package/dist/extensions/acpx/index.js +0 -1855
  599. package/dist/extensions/acpx/mcp-proxy.mjs +0 -151
  600. package/dist/extensions/acpx/openclaw.plugin.json +0 -132
  601. package/dist/extensions/acpx/package.json +0 -14
  602. package/dist/extensions/acpx/runtime-api.js +0 -5
  603. package/dist/extensions/acpx/skills/acp-router/SKILL.md +0 -245
  604. package/dist/extensions/aicq-chat/index.js +0 -284
  605. package/dist/extensions/aicq-chat/openclaw.plugin.json +0 -30
  606. package/dist/extensions/amazon-bedrock/api.js +0 -3
  607. package/dist/extensions/amazon-bedrock/discovery.js +0 -2
  608. package/dist/extensions/amazon-bedrock/index.js +0 -65
  609. package/dist/extensions/amazon-bedrock/openclaw.plugin.json +0 -44
  610. package/dist/extensions/amazon-bedrock/package.json +0 -23
  611. package/dist/extensions/anthropic/api.js +0 -3
  612. package/dist/extensions/anthropic/cli-backend.js +0 -2
  613. package/dist/extensions/anthropic/cli-migration.js +0 -2
  614. package/dist/extensions/anthropic/cli-shared.js +0 -2
  615. package/dist/extensions/anthropic/index.js +0 -357
  616. package/dist/extensions/anthropic/media-understanding-provider.js +0 -2
  617. package/dist/extensions/anthropic/openclaw.plugin.json +0 -64
  618. package/dist/extensions/anthropic/package.json +0 -12
  619. package/dist/extensions/anthropic/stream-wrappers.js +0 -2
  620. package/dist/extensions/anthropic/test-api.js +0 -2
  621. package/dist/extensions/anthropic-vertex/api.js +0 -4
  622. package/dist/extensions/anthropic-vertex/index.js +0 -36
  623. package/dist/extensions/anthropic-vertex/openclaw.plugin.json +0 -12
  624. package/dist/extensions/anthropic-vertex/package.json +0 -12
  625. package/dist/extensions/anthropic-vertex/provider-catalog.js +0 -2
  626. package/dist/extensions/anthropic-vertex/region.js +0 -2
  627. package/dist/extensions/bluebubbles/api.js +0 -5
  628. package/dist/extensions/bluebubbles/channel-config-api.js +0 -2
  629. package/dist/extensions/bluebubbles/index.js +0 -13
  630. package/dist/extensions/bluebubbles/openclaw.plugin.json +0 -11
  631. package/dist/extensions/bluebubbles/package.json +0 -48
  632. package/dist/extensions/bluebubbles/runtime-api.js +0 -2
  633. package/dist/extensions/bluebubbles/setup-entry.js +0 -26
  634. package/dist/extensions/brave/index.js +0 -13
  635. package/dist/extensions/brave/openclaw.plugin.json +0 -50
  636. package/dist/extensions/brave/package.json +0 -12
  637. package/dist/extensions/brave/test-api.js +0 -2
  638. package/dist/extensions/brave/web-search-provider.js +0 -2
  639. package/dist/extensions/browser/browser-runtime-api.js +0 -4
  640. package/dist/extensions/browser/index.js +0 -20
  641. package/dist/extensions/browser/openclaw.plugin.json +0 -9
  642. package/dist/extensions/browser/package.json +0 -12
  643. package/dist/extensions/browser/runtime-api.js +0 -6
  644. package/dist/extensions/browser/test-support.js +0 -50
  645. package/dist/extensions/byteplus/api.js +0 -3
  646. package/dist/extensions/byteplus/index.js +0 -63
  647. package/dist/extensions/byteplus/models.js +0 -2
  648. package/dist/extensions/byteplus/openclaw.plugin.json +0 -33
  649. package/dist/extensions/byteplus/package.json +0 -12
  650. package/dist/extensions/byteplus/provider-catalog.js +0 -2
  651. package/dist/extensions/chutes/api.js +0 -3
  652. package/dist/extensions/chutes/index.js +0 -143
  653. package/dist/extensions/chutes/models.js +0 -2
  654. package/dist/extensions/chutes/onboard.js +0 -3
  655. package/dist/extensions/chutes/openclaw.plugin.json +0 -44
  656. package/dist/extensions/chutes/package.json +0 -12
  657. package/dist/extensions/chutes/provider-catalog.js +0 -2
  658. package/dist/extensions/cloudflare-ai-gateway/api.js +0 -3
  659. package/dist/extensions/cloudflare-ai-gateway/index.js +0 -188
  660. package/dist/extensions/cloudflare-ai-gateway/models.js +0 -2
  661. package/dist/extensions/cloudflare-ai-gateway/onboard.js +0 -2
  662. package/dist/extensions/cloudflare-ai-gateway/openclaw.plugin.json +0 -33
  663. package/dist/extensions/cloudflare-ai-gateway/package.json +0 -12
  664. package/dist/extensions/copilot-proxy/index.js +0 -125
  665. package/dist/extensions/copilot-proxy/openclaw.plugin.json +0 -27
  666. package/dist/extensions/copilot-proxy/package.json +0 -12
  667. package/dist/extensions/copilot-proxy/runtime-api.js +0 -3
  668. package/dist/extensions/deepgram/audio.js +0 -2
  669. package/dist/extensions/deepgram/index.js +0 -13
  670. package/dist/extensions/deepgram/media-understanding-provider.js +0 -2
  671. package/dist/extensions/deepgram/openclaw.plugin.json +0 -13
  672. package/dist/extensions/deepgram/package.json +0 -12
  673. package/dist/extensions/deepseek/api.js +0 -3
  674. package/dist/extensions/deepseek/index.js +0 -33
  675. package/dist/extensions/deepseek/models.js +0 -2
  676. package/dist/extensions/deepseek/onboard.js +0 -2
  677. package/dist/extensions/deepseek/openclaw.plugin.json +0 -32
  678. package/dist/extensions/deepseek/package.json +0 -12
  679. package/dist/extensions/deepseek/provider-catalog.js +0 -2
  680. package/dist/extensions/device-pair/api.js +0 -10
  681. package/dist/extensions/device-pair/index.js +0 -483
  682. package/dist/extensions/device-pair/notify.js +0 -2
  683. package/dist/extensions/device-pair/openclaw.plugin.json +0 -21
  684. package/dist/extensions/device-pair/qr-image.js +0 -3
  685. package/dist/extensions/diagnostics-otel/api.js +0 -6
  686. package/dist/extensions/diagnostics-otel/index.js +0 -485
  687. package/dist/extensions/diagnostics-otel/openclaw.plugin.json +0 -8
  688. package/dist/extensions/diagnostics-otel/package.json +0 -27
  689. package/dist/extensions/diffs/api.js +0 -4
  690. package/dist/extensions/diffs/assets/viewer-runtime.js +0 -1888
  691. package/dist/extensions/diffs/index.js +0 -2058
  692. package/dist/extensions/diffs/openclaw.plugin.json +0 -226
  693. package/dist/extensions/diffs/package.json +0 -24
  694. package/dist/extensions/diffs/runtime-api.js +0 -3
  695. package/dist/extensions/diffs/skills/diffs/SKILL.md +0 -23
  696. package/dist/extensions/discord/action-runtime-api.js +0 -2
  697. package/dist/extensions/discord/api.js +0 -14
  698. package/dist/extensions/discord/channel-config-api.js +0 -2
  699. package/dist/extensions/discord/index.js +0 -612
  700. package/dist/extensions/discord/openclaw.plugin.json +0 -11
  701. package/dist/extensions/discord/package.json +0 -52
  702. package/dist/extensions/discord/runtime-api.js +0 -230
  703. package/dist/extensions/discord/session-key-api.js +0 -2
  704. package/dist/extensions/discord/setup-entry.js +0 -10
  705. package/dist/extensions/discord/test-api.js +0 -45
  706. package/dist/extensions/discord/timeouts.js +0 -2
  707. package/dist/extensions/duckduckgo/index.js +0 -13
  708. package/dist/extensions/duckduckgo/openclaw.plugin.json +0 -41
  709. package/dist/extensions/duckduckgo/package.json +0 -12
  710. package/dist/extensions/duckduckgo/web-search-provider.js +0 -2
  711. package/dist/extensions/elevenlabs/index.js +0 -13
  712. package/dist/extensions/elevenlabs/openclaw.plugin.json +0 -13
  713. package/dist/extensions/elevenlabs/package.json +0 -12
  714. package/dist/extensions/elevenlabs/speech-provider.js +0 -2
  715. package/dist/extensions/elevenlabs/test-api.js +0 -2
  716. package/dist/extensions/elevenlabs/tts.js +0 -2
  717. package/dist/extensions/exa/index.js +0 -13
  718. package/dist/extensions/exa/openclaw.plugin.json +0 -39
  719. package/dist/extensions/exa/package.json +0 -12
  720. package/dist/extensions/exa/web-search-provider.js +0 -2
  721. package/dist/extensions/fal/image-generation-provider.js +0 -2
  722. package/dist/extensions/fal/index.js +0 -45
  723. package/dist/extensions/fal/onboard.js +0 -2
  724. package/dist/extensions/fal/openclaw.plugin.json +0 -40
  725. package/dist/extensions/fal/package.json +0 -12
  726. package/dist/extensions/feishu/api.js +0 -7
  727. package/dist/extensions/feishu/index.js +0 -2531
  728. package/dist/extensions/feishu/openclaw.plugin.json +0 -14
  729. package/dist/extensions/feishu/package.json +0 -52
  730. package/dist/extensions/feishu/runtime-api.js +0 -34
  731. package/dist/extensions/feishu/session-key-api.js +0 -2
  732. package/dist/extensions/feishu/setup-api.js +0 -2
  733. package/dist/extensions/feishu/setup-entry.js +0 -6
  734. package/dist/extensions/feishu/skills/feishu-doc/SKILL.md +0 -211
  735. package/dist/extensions/feishu/skills/feishu-doc/references/block-types.md +0 -103
  736. package/dist/extensions/feishu/skills/feishu-drive/SKILL.md +0 -97
  737. package/dist/extensions/feishu/skills/feishu-perm/SKILL.md +0 -119
  738. package/dist/extensions/feishu/skills/feishu-wiki/SKILL.md +0 -111
  739. package/dist/extensions/firecrawl/api.js +0 -33
  740. package/dist/extensions/firecrawl/index.js +0 -184
  741. package/dist/extensions/firecrawl/openclaw.plugin.json +0 -87
  742. package/dist/extensions/firecrawl/package.json +0 -12
  743. package/dist/extensions/firecrawl/web-search-provider.js +0 -2
  744. package/dist/extensions/github-copilot/api.js +0 -2
  745. package/dist/extensions/github-copilot/index.js +0 -138
  746. package/dist/extensions/github-copilot/login.js +0 -2
  747. package/dist/extensions/github-copilot/models-defaults.js +0 -38
  748. package/dist/extensions/github-copilot/models.js +0 -2
  749. package/dist/extensions/github-copilot/openclaw.plugin.json +0 -31
  750. package/dist/extensions/github-copilot/package.json +0 -12
  751. package/dist/extensions/github-copilot/token.js +0 -3
  752. package/dist/extensions/github-copilot/usage.js +0 -2
  753. package/dist/extensions/google/api.js +0 -3
  754. package/dist/extensions/google/cli-backend.js +0 -2
  755. package/dist/extensions/google/gemini-cli-provider.js +0 -110
  756. package/dist/extensions/google/google-shared.test-helpers.js +0 -92
  757. package/dist/extensions/google/image-generation-provider.js +0 -162
  758. package/dist/extensions/google/index.js +0 -213
  759. package/dist/extensions/google/media-understanding-provider.js +0 -104
  760. package/dist/extensions/google/model-id.js +0 -2
  761. package/dist/extensions/google/oauth.credentials.js +0 -2
  762. package/dist/extensions/google/oauth.flow.js +0 -2
  763. package/dist/extensions/google/oauth.http.js +0 -2
  764. package/dist/extensions/google/oauth.js +0 -3
  765. package/dist/extensions/google/oauth.project.js +0 -2
  766. package/dist/extensions/google/oauth.runtime.js +0 -2
  767. package/dist/extensions/google/oauth.shared.js +0 -2
  768. package/dist/extensions/google/oauth.token.js +0 -2
  769. package/dist/extensions/google/openclaw.plugin.json +0 -89
  770. package/dist/extensions/google/package.json +0 -12
  771. package/dist/extensions/google/provider-models.js +0 -2
  772. package/dist/extensions/google/runtime-api.js +0 -4
  773. package/dist/extensions/google/test-api.js +0 -2
  774. package/dist/extensions/google/web-search-provider.js +0 -2
  775. package/dist/extensions/googlechat/api.js +0 -2
  776. package/dist/extensions/googlechat/channel-config-api.js +0 -7
  777. package/dist/extensions/googlechat/index.js +0 -13
  778. package/dist/extensions/googlechat/openclaw.plugin.json +0 -11
  779. package/dist/extensions/googlechat/package.json +0 -48
  780. package/dist/extensions/googlechat/runtime-api.js +0 -39
  781. package/dist/extensions/googlechat/setup-entry.js +0 -6
  782. package/dist/extensions/googlechat/test-api.js +0 -3
  783. package/dist/extensions/groq/index.js +0 -13
  784. package/dist/extensions/groq/media-understanding-provider.js +0 -2
  785. package/dist/extensions/groq/openclaw.plugin.json +0 -13
  786. package/dist/extensions/groq/package.json +0 -12
  787. package/dist/extensions/huggingface/api.js +0 -4
  788. package/dist/extensions/huggingface/index.js +0 -54
  789. package/dist/extensions/huggingface/models.js +0 -2
  790. package/dist/extensions/huggingface/onboard.js +0 -2
  791. package/dist/extensions/huggingface/openclaw.plugin.json +0 -34
  792. package/dist/extensions/huggingface/package.json +0 -12
  793. package/dist/extensions/huggingface/provider-catalog.js +0 -3
  794. package/dist/extensions/imessage/api.js +0 -4
  795. package/dist/extensions/imessage/channel-config-api.js +0 -2
  796. package/dist/extensions/imessage/index.js +0 -211
  797. package/dist/extensions/imessage/openclaw.plugin.json +0 -11
  798. package/dist/extensions/imessage/package.json +0 -26
  799. package/dist/extensions/imessage/runtime-api.js +0 -11
  800. package/dist/extensions/imessage/setup-entry.js +0 -13
  801. package/dist/extensions/irc/api.js +0 -2
  802. package/dist/extensions/irc/channel-config-api.js +0 -2
  803. package/dist/extensions/irc/index.js +0 -12
  804. package/dist/extensions/irc/openclaw.plugin.json +0 -11
  805. package/dist/extensions/irc/package.json +0 -28
  806. package/dist/extensions/irc/setup-entry.js +0 -6
  807. package/dist/extensions/kilocode/api.js +0 -3
  808. package/dist/extensions/kilocode/index.js +0 -37
  809. package/dist/extensions/kilocode/onboard.js +0 -3
  810. package/dist/extensions/kilocode/openclaw.plugin.json +0 -33
  811. package/dist/extensions/kilocode/package.json +0 -12
  812. package/dist/extensions/kilocode/provider-catalog.js +0 -2
  813. package/dist/extensions/kilocode/provider-models.js +0 -2
  814. package/dist/extensions/kilocode/shared.js +0 -2
  815. package/dist/extensions/kimi-coding/api.js +0 -3
  816. package/dist/extensions/kimi-coding/index.js +0 -81
  817. package/dist/extensions/kimi-coding/onboard.js +0 -2
  818. package/dist/extensions/kimi-coding/openclaw.plugin.json +0 -38
  819. package/dist/extensions/kimi-coding/package.json +0 -12
  820. package/dist/extensions/kimi-coding/provider-catalog.js +0 -2
  821. package/dist/extensions/kimi-coding/stream.js +0 -2
  822. package/dist/extensions/line/api.js +0 -13
  823. package/dist/extensions/line/index.js +0 -815
  824. package/dist/extensions/line/openclaw.plugin.json +0 -11
  825. package/dist/extensions/line/package.json +0 -41
  826. package/dist/extensions/line/runtime-api.js +0 -11
  827. package/dist/extensions/line/setup-api.js +0 -3
  828. package/dist/extensions/line/setup-entry.js +0 -15
  829. package/dist/extensions/litellm/api.js +0 -2
  830. package/dist/extensions/litellm/index.js +0 -36
  831. package/dist/extensions/litellm/onboard.js +0 -2
  832. package/dist/extensions/litellm/openclaw.plugin.json +0 -33
  833. package/dist/extensions/litellm/package.json +0 -12
  834. package/dist/extensions/litellm/provider-catalog.js +0 -2
  835. package/dist/extensions/llm-task/api.js +0 -6
  836. package/dist/extensions/llm-task/index.js +0 -156
  837. package/dist/extensions/llm-task/openclaw.plugin.json +0 -33
  838. package/dist/extensions/llm-task/package.json +0 -16
  839. package/dist/extensions/lobster/index.js +0 -232
  840. package/dist/extensions/lobster/openclaw.plugin.json +0 -10
  841. package/dist/extensions/lobster/package.json +0 -17
  842. package/dist/extensions/lobster/runtime-api.js +0 -4
  843. package/dist/extensions/matrix/api.js +0 -10
  844. package/dist/extensions/matrix/helper-api.js +0 -3
  845. package/dist/extensions/matrix/index.js +0 -44
  846. package/dist/extensions/matrix/legacy-crypto-inspector.js +0 -41
  847. package/dist/extensions/matrix/openclaw.plugin.json +0 -11
  848. package/dist/extensions/matrix/package.json +0 -53
  849. package/dist/extensions/matrix/plugin-entry.handlers.runtime.js +0 -48
  850. package/dist/extensions/matrix/runtime-api.js +0 -25
  851. package/dist/extensions/matrix/setup-entry.js +0 -6
  852. package/dist/extensions/matrix/test-api.js +0 -3
  853. package/dist/extensions/matrix/thread-bindings-runtime.js +0 -2
  854. package/dist/extensions/mattermost/api.js +0 -2
  855. package/dist/extensions/mattermost/index.js +0 -15
  856. package/dist/extensions/mattermost/openclaw.plugin.json +0 -11
  857. package/dist/extensions/mattermost/package.json +0 -41
  858. package/dist/extensions/mattermost/runtime-api.js +0 -41
  859. package/dist/extensions/mattermost/setup-entry.js +0 -6
  860. package/dist/extensions/memory-core/api.js +0 -1
  861. package/dist/extensions/memory-core/index.js +0 -440
  862. package/dist/extensions/memory-core/openclaw.plugin.json +0 -9
  863. package/dist/extensions/memory-core/package.json +0 -23
  864. package/dist/extensions/memory-core/runtime-api.js +0 -3
  865. package/dist/extensions/memory-lancedb/api.js +0 -4
  866. package/dist/extensions/memory-lancedb/config.js +0 -2
  867. package/dist/extensions/memory-lancedb/index.js +0 -7037
  868. package/dist/extensions/memory-lancedb/lancedb-runtime.js +0 -2
  869. package/dist/extensions/memory-lancedb/openclaw.plugin.json +0 -92
  870. package/dist/extensions/memory-lancedb/package.json +0 -24
  871. package/dist/extensions/microsoft/index.js +0 -13
  872. package/dist/extensions/microsoft/openclaw.plugin.json +0 -13
  873. package/dist/extensions/microsoft/package.json +0 -15
  874. package/dist/extensions/microsoft/speech-provider.js +0 -2
  875. package/dist/extensions/microsoft/test-api.js +0 -2
  876. package/dist/extensions/microsoft/tts.js +0 -2
  877. package/dist/extensions/microsoft-foundry/auth.js +0 -2
  878. package/dist/extensions/microsoft-foundry/cli.js +0 -2
  879. package/dist/extensions/microsoft-foundry/index.js +0 -13
  880. package/dist/extensions/microsoft-foundry/onboard.js +0 -3
  881. package/dist/extensions/microsoft-foundry/openclaw.plugin.json +0 -39
  882. package/dist/extensions/microsoft-foundry/package.json +0 -12
  883. package/dist/extensions/microsoft-foundry/provider.js +0 -2
  884. package/dist/extensions/microsoft-foundry/runtime.js +0 -2
  885. package/dist/extensions/microsoft-foundry/shared-runtime.js +0 -3
  886. package/dist/extensions/microsoft-foundry/shared.js +0 -2
  887. package/dist/extensions/minimax/api.js +0 -6
  888. package/dist/extensions/minimax/image-generation-provider.js +0 -2
  889. package/dist/extensions/minimax/index.js +0 -219
  890. package/dist/extensions/minimax/media-understanding-provider.js +0 -2
  891. package/dist/extensions/minimax/model-definitions.js +0 -2
  892. package/dist/extensions/minimax/oauth.js +0 -2
  893. package/dist/extensions/minimax/oauth.runtime.js +0 -2
  894. package/dist/extensions/minimax/onboard.js +0 -2
  895. package/dist/extensions/minimax/openclaw.plugin.json +0 -98
  896. package/dist/extensions/minimax/package.json +0 -12
  897. package/dist/extensions/minimax/provider-catalog.js +0 -2
  898. package/dist/extensions/minimax/provider-models.js +0 -2
  899. package/dist/extensions/mistral/api.js +0 -5
  900. package/dist/extensions/mistral/index.js +0 -79
  901. package/dist/extensions/mistral/media-understanding-provider.js +0 -2
  902. package/dist/extensions/mistral/model-definitions.js +0 -2
  903. package/dist/extensions/mistral/onboard.js +0 -2
  904. package/dist/extensions/mistral/openclaw.plugin.json +0 -37
  905. package/dist/extensions/mistral/package.json +0 -12
  906. package/dist/extensions/mistral/provider-catalog.js +0 -2
  907. package/dist/extensions/modelstudio/api.js +0 -4
  908. package/dist/extensions/modelstudio/index.js +0 -111
  909. package/dist/extensions/modelstudio/model-definitions.js +0 -2
  910. package/dist/extensions/modelstudio/models.js +0 -2
  911. package/dist/extensions/modelstudio/onboard.js +0 -3
  912. package/dist/extensions/modelstudio/openclaw.plugin.json +0 -75
  913. package/dist/extensions/modelstudio/package.json +0 -12
  914. package/dist/extensions/modelstudio/provider-catalog.js +0 -2
  915. package/dist/extensions/moonshot/api.js +0 -4
  916. package/dist/extensions/moonshot/index.js +0 -58
  917. package/dist/extensions/moonshot/media-understanding-provider.js +0 -2
  918. package/dist/extensions/moonshot/onboard.js +0 -2
  919. package/dist/extensions/moonshot/openclaw.plugin.json +0 -87
  920. package/dist/extensions/moonshot/package.json +0 -12
  921. package/dist/extensions/moonshot/provider-catalog.js +0 -2
  922. package/dist/extensions/moonshot/test-api.js +0 -2
  923. package/dist/extensions/moonshot/web-search-provider.js +0 -2
  924. package/dist/extensions/msteams/api.js +0 -2
  925. package/dist/extensions/msteams/channel-config-api.js +0 -2
  926. package/dist/extensions/msteams/index.js +0 -13
  927. package/dist/extensions/msteams/openclaw.plugin.json +0 -11
  928. package/dist/extensions/msteams/package.json +0 -48
  929. package/dist/extensions/msteams/runtime-api.js +0 -47
  930. package/dist/extensions/msteams/setup-entry.js +0 -6
  931. package/dist/extensions/msteams/test-api.js +0 -2
  932. package/dist/extensions/nextcloud-talk/api.js +0 -2
  933. package/dist/extensions/nextcloud-talk/index.js +0 -12
  934. package/dist/extensions/nextcloud-talk/openclaw.plugin.json +0 -11
  935. package/dist/extensions/nextcloud-talk/package.json +0 -45
  936. package/dist/extensions/nextcloud-talk/runtime-api.js +0 -35
  937. package/dist/extensions/nextcloud-talk/setup-entry.js +0 -6
  938. package/dist/extensions/nostr/api.js +0 -15
  939. package/dist/extensions/nostr/index.js +0 -559
  940. package/dist/extensions/nostr/openclaw.plugin.json +0 -11
  941. package/dist/extensions/nostr/package.json +0 -44
  942. package/dist/extensions/nostr/runtime-api.js +0 -15
  943. package/dist/extensions/nostr/setup-api.js +0 -2
  944. package/dist/extensions/nostr/setup-entry.js +0 -6
  945. package/dist/extensions/nostr/test-api.js +0 -2
  946. package/dist/extensions/nvidia/api.js +0 -2
  947. package/dist/extensions/nvidia/index.js +0 -16
  948. package/dist/extensions/nvidia/openclaw.plugin.json +0 -17
  949. package/dist/extensions/nvidia/package.json +0 -12
  950. package/dist/extensions/nvidia/provider-catalog.js +0 -2
  951. package/dist/extensions/ollama/api.js +0 -3
  952. package/dist/extensions/ollama/index.js +0 -139
  953. package/dist/extensions/ollama/openclaw.plugin.json +0 -29
  954. package/dist/extensions/ollama/package.json +0 -12
  955. package/dist/extensions/ollama/runtime-api.js +0 -3
  956. package/dist/extensions/open-prose/index.js +0 -10
  957. package/dist/extensions/open-prose/openclaw.plugin.json +0 -13
  958. package/dist/extensions/open-prose/package.json +0 -12
  959. package/dist/extensions/open-prose/runtime-api.js +0 -3
  960. package/dist/extensions/open-prose/skills/prose/LICENSE +0 -21
  961. package/dist/extensions/open-prose/skills/prose/SKILL.md +0 -323
  962. package/dist/extensions/open-prose/skills/prose/alt-borges.md +0 -141
  963. package/dist/extensions/open-prose/skills/prose/alts/arabian-nights.md +0 -229
  964. package/dist/extensions/open-prose/skills/prose/alts/borges.md +0 -360
  965. package/dist/extensions/open-prose/skills/prose/alts/folk.md +0 -322
  966. package/dist/extensions/open-prose/skills/prose/alts/homer.md +0 -217
  967. package/dist/extensions/open-prose/skills/prose/alts/kafka.md +0 -373
  968. package/dist/extensions/open-prose/skills/prose/alts/shared-appendix.md +0 -35
  969. package/dist/extensions/open-prose/skills/prose/compiler.md +0 -2971
  970. package/dist/extensions/open-prose/skills/prose/examples/01-hello-world.prose +0 -4
  971. package/dist/extensions/open-prose/skills/prose/examples/02-research-and-summarize.prose +0 -6
  972. package/dist/extensions/open-prose/skills/prose/examples/03-code-review.prose +0 -17
  973. package/dist/extensions/open-prose/skills/prose/examples/04-write-and-refine.prose +0 -14
  974. package/dist/extensions/open-prose/skills/prose/examples/05-debug-issue.prose +0 -20
  975. package/dist/extensions/open-prose/skills/prose/examples/06-explain-codebase.prose +0 -17
  976. package/dist/extensions/open-prose/skills/prose/examples/07-refactor.prose +0 -20
  977. package/dist/extensions/open-prose/skills/prose/examples/08-blog-post.prose +0 -20
  978. package/dist/extensions/open-prose/skills/prose/examples/09-research-with-agents.prose +0 -25
  979. package/dist/extensions/open-prose/skills/prose/examples/10-code-review-agents.prose +0 -32
  980. package/dist/extensions/open-prose/skills/prose/examples/11-skills-and-imports.prose +0 -27
  981. package/dist/extensions/open-prose/skills/prose/examples/12-secure-agent-permissions.prose +0 -43
  982. package/dist/extensions/open-prose/skills/prose/examples/13-variables-and-context.prose +0 -51
  983. package/dist/extensions/open-prose/skills/prose/examples/14-composition-blocks.prose +0 -48
  984. package/dist/extensions/open-prose/skills/prose/examples/15-inline-sequences.prose +0 -23
  985. package/dist/extensions/open-prose/skills/prose/examples/16-parallel-reviews.prose +0 -19
  986. package/dist/extensions/open-prose/skills/prose/examples/17-parallel-research.prose +0 -19
  987. package/dist/extensions/open-prose/skills/prose/examples/18-mixed-parallel-sequential.prose +0 -36
  988. package/dist/extensions/open-prose/skills/prose/examples/19-advanced-parallel.prose +0 -71
  989. package/dist/extensions/open-prose/skills/prose/examples/20-fixed-loops.prose +0 -20
  990. package/dist/extensions/open-prose/skills/prose/examples/21-pipeline-operations.prose +0 -35
  991. package/dist/extensions/open-prose/skills/prose/examples/22-error-handling.prose +0 -51
  992. package/dist/extensions/open-prose/skills/prose/examples/23-retry-with-backoff.prose +0 -63
  993. package/dist/extensions/open-prose/skills/prose/examples/24-choice-blocks.prose +0 -86
  994. package/dist/extensions/open-prose/skills/prose/examples/25-conditionals.prose +0 -114
  995. package/dist/extensions/open-prose/skills/prose/examples/26-parameterized-blocks.prose +0 -100
  996. package/dist/extensions/open-prose/skills/prose/examples/27-string-interpolation.prose +0 -105
  997. package/dist/extensions/open-prose/skills/prose/examples/28-automated-pr-review.prose +0 -37
  998. package/dist/extensions/open-prose/skills/prose/examples/28-gas-town.prose +0 -1572
  999. package/dist/extensions/open-prose/skills/prose/examples/29-captains-chair.prose +0 -218
  1000. package/dist/extensions/open-prose/skills/prose/examples/30-captains-chair-simple.prose +0 -42
  1001. package/dist/extensions/open-prose/skills/prose/examples/31-captains-chair-with-memory.prose +0 -145
  1002. package/dist/extensions/open-prose/skills/prose/examples/33-pr-review-autofix.prose +0 -168
  1003. package/dist/extensions/open-prose/skills/prose/examples/34-content-pipeline.prose +0 -204
  1004. package/dist/extensions/open-prose/skills/prose/examples/35-feature-factory.prose +0 -296
  1005. package/dist/extensions/open-prose/skills/prose/examples/36-bug-hunter.prose +0 -237
  1006. package/dist/extensions/open-prose/skills/prose/examples/37-the-forge.prose +0 -1474
  1007. package/dist/extensions/open-prose/skills/prose/examples/38-skill-scan.prose +0 -455
  1008. package/dist/extensions/open-prose/skills/prose/examples/39-architect-by-simulation.prose +0 -277
  1009. package/dist/extensions/open-prose/skills/prose/examples/40-rlm-self-refine.prose +0 -32
  1010. package/dist/extensions/open-prose/skills/prose/examples/41-rlm-divide-conquer.prose +0 -38
  1011. package/dist/extensions/open-prose/skills/prose/examples/42-rlm-filter-recurse.prose +0 -46
  1012. package/dist/extensions/open-prose/skills/prose/examples/43-rlm-pairwise.prose +0 -50
  1013. package/dist/extensions/open-prose/skills/prose/examples/44-run-endpoint-ux-test.prose +0 -261
  1014. package/dist/extensions/open-prose/skills/prose/examples/45-plugin-release.prose +0 -159
  1015. package/dist/extensions/open-prose/skills/prose/examples/45-run-endpoint-ux-test-with-remediation.prose +0 -637
  1016. package/dist/extensions/open-prose/skills/prose/examples/46-run-endpoint-ux-test-fast.prose +0 -148
  1017. package/dist/extensions/open-prose/skills/prose/examples/46-workflow-crystallizer.prose +0 -225
  1018. package/dist/extensions/open-prose/skills/prose/examples/47-language-self-improvement.prose +0 -356
  1019. package/dist/extensions/open-prose/skills/prose/examples/48-habit-miner.prose +0 -445
  1020. package/dist/extensions/open-prose/skills/prose/examples/49-prose-run-retrospective.prose +0 -210
  1021. package/dist/extensions/open-prose/skills/prose/examples/README.md +0 -391
  1022. package/dist/extensions/open-prose/skills/prose/examples/roadmap/README.md +0 -22
  1023. package/dist/extensions/open-prose/skills/prose/examples/roadmap/iterative-refinement.prose +0 -20
  1024. package/dist/extensions/open-prose/skills/prose/examples/roadmap/parallel-review.prose +0 -18
  1025. package/dist/extensions/open-prose/skills/prose/examples/roadmap/simple-pipeline.prose +0 -17
  1026. package/dist/extensions/open-prose/skills/prose/examples/roadmap/syntax/open-prose-syntax.prose +0 -223
  1027. package/dist/extensions/open-prose/skills/prose/guidance/antipatterns.md +0 -951
  1028. package/dist/extensions/open-prose/skills/prose/guidance/patterns.md +0 -700
  1029. package/dist/extensions/open-prose/skills/prose/guidance/system-prompt.md +0 -180
  1030. package/dist/extensions/open-prose/skills/prose/help.md +0 -144
  1031. package/dist/extensions/open-prose/skills/prose/lib/README.md +0 -108
  1032. package/dist/extensions/open-prose/skills/prose/lib/calibrator.prose +0 -215
  1033. package/dist/extensions/open-prose/skills/prose/lib/cost-analyzer.prose +0 -174
  1034. package/dist/extensions/open-prose/skills/prose/lib/error-forensics.prose +0 -250
  1035. package/dist/extensions/open-prose/skills/prose/lib/inspector.prose +0 -196
  1036. package/dist/extensions/open-prose/skills/prose/lib/profiler.prose +0 -460
  1037. package/dist/extensions/open-prose/skills/prose/lib/program-improver.prose +0 -275
  1038. package/dist/extensions/open-prose/skills/prose/lib/project-memory.prose +0 -118
  1039. package/dist/extensions/open-prose/skills/prose/lib/user-memory.prose +0 -93
  1040. package/dist/extensions/open-prose/skills/prose/lib/vm-improver.prose +0 -243
  1041. package/dist/extensions/open-prose/skills/prose/primitives/session.md +0 -593
  1042. package/dist/extensions/open-prose/skills/prose/prose.md +0 -1237
  1043. package/dist/extensions/open-prose/skills/prose/state/filesystem.md +0 -498
  1044. package/dist/extensions/open-prose/skills/prose/state/in-context.md +0 -384
  1045. package/dist/extensions/open-prose/skills/prose/state/postgres.md +0 -880
  1046. package/dist/extensions/open-prose/skills/prose/state/sqlite.md +0 -531
  1047. package/dist/extensions/openai/api.js +0 -4
  1048. package/dist/extensions/openai/cli-backend.js +0 -2
  1049. package/dist/extensions/openai/default-models.js +0 -2
  1050. package/dist/extensions/openai/image-generation-provider.js +0 -2
  1051. package/dist/extensions/openai/index.js +0 -24
  1052. package/dist/extensions/openai/media-understanding-provider.js +0 -2
  1053. package/dist/extensions/openai/openai-codex-auth-identity.js +0 -2
  1054. package/dist/extensions/openai/openai-codex-catalog.js +0 -2
  1055. package/dist/extensions/openai/openai-codex-provider.js +0 -2
  1056. package/dist/extensions/openai/openai-codex-provider.runtime.js +0 -14
  1057. package/dist/extensions/openai/openai-provider.js +0 -2
  1058. package/dist/extensions/openai/openclaw.plugin.json +0 -61
  1059. package/dist/extensions/openai/package.json +0 -12
  1060. package/dist/extensions/openai/shared.js +0 -4
  1061. package/dist/extensions/openai/speech-provider.js +0 -2
  1062. package/dist/extensions/openai/test-api.js +0 -5
  1063. package/dist/extensions/openai/tts.js +0 -2
  1064. package/dist/extensions/opencode/api.js +0 -3
  1065. package/dist/extensions/opencode/index.js +0 -63
  1066. package/dist/extensions/opencode/onboard.js +0 -2
  1067. package/dist/extensions/opencode/openclaw.plugin.json +0 -33
  1068. package/dist/extensions/opencode/package.json +0 -12
  1069. package/dist/extensions/opencode-go/api.js +0 -3
  1070. package/dist/extensions/opencode-go/index.js +0 -54
  1071. package/dist/extensions/opencode-go/onboard.js +0 -2
  1072. package/dist/extensions/opencode-go/openclaw.plugin.json +0 -33
  1073. package/dist/extensions/opencode-go/package.json +0 -12
  1074. package/dist/extensions/openrouter/api.js +0 -3
  1075. package/dist/extensions/openrouter/index.js +0 -121
  1076. package/dist/extensions/openrouter/media-understanding-provider.js +0 -2
  1077. package/dist/extensions/openrouter/onboard.js +0 -2
  1078. package/dist/extensions/openrouter/openclaw.plugin.json +0 -37
  1079. package/dist/extensions/openrouter/package.json +0 -12
  1080. package/dist/extensions/openrouter/provider-catalog.js +0 -2
  1081. package/dist/extensions/openshell/index.js +0 -919
  1082. package/dist/extensions/openshell/openclaw.plugin.json +0 -118
  1083. package/dist/extensions/openshell/package.json +0 -12
  1084. package/dist/extensions/perplexity/index.js +0 -13
  1085. package/dist/extensions/perplexity/openclaw.plugin.json +0 -54
  1086. package/dist/extensions/perplexity/package.json +0 -12
  1087. package/dist/extensions/perplexity/test-api.js +0 -2
  1088. package/dist/extensions/perplexity/web-search-provider.js +0 -2
  1089. package/dist/extensions/phone-control/index.js +0 -283
  1090. package/dist/extensions/phone-control/openclaw.plugin.json +0 -11
  1091. package/dist/extensions/phone-control/runtime-api.js +0 -3
  1092. package/dist/extensions/qianfan/api.js +0 -3
  1093. package/dist/extensions/qianfan/index.js +0 -26
  1094. package/dist/extensions/qianfan/onboard.js +0 -2
  1095. package/dist/extensions/qianfan/openclaw.plugin.json +0 -32
  1096. package/dist/extensions/qianfan/package.json +0 -12
  1097. package/dist/extensions/qianfan/provider-catalog.js +0 -2
  1098. package/dist/extensions/qqbot/api.js +0 -173
  1099. package/dist/extensions/qqbot/index.js +0 -445
  1100. package/dist/extensions/qqbot/openclaw.plugin.json +0 -257
  1101. package/dist/extensions/qqbot/package.json +0 -52
  1102. package/dist/extensions/qqbot/runtime-api.js +0 -2
  1103. package/dist/extensions/qqbot/setup-entry.js +0 -6
  1104. package/dist/extensions/qqbot/skills/qqbot-channel/SKILL.md +0 -262
  1105. package/dist/extensions/qqbot/skills/qqbot-channel/references/api_references.md +0 -521
  1106. package/dist/extensions/qqbot/skills/qqbot-media/SKILL.md +0 -36
  1107. package/dist/extensions/qqbot/skills/qqbot-remind/SKILL.md +0 -149
  1108. package/dist/extensions/searxng/index.js +0 -13
  1109. package/dist/extensions/searxng/openclaw.plugin.json +0 -46
  1110. package/dist/extensions/searxng/package.json +0 -12
  1111. package/dist/extensions/searxng/web-search-provider.js +0 -2
  1112. package/dist/extensions/sglang/api.js +0 -4
  1113. package/dist/extensions/sglang/defaults.js +0 -2
  1114. package/dist/extensions/sglang/index.js +0 -77
  1115. package/dist/extensions/sglang/models.js +0 -2
  1116. package/dist/extensions/sglang/openclaw.plugin.json +0 -29
  1117. package/dist/extensions/sglang/package.json +0 -12
  1118. package/dist/extensions/signal/api.js +0 -7
  1119. package/dist/extensions/signal/channel-config-api.js +0 -2
  1120. package/dist/extensions/signal/index.js +0 -319
  1121. package/dist/extensions/signal/openclaw.plugin.json +0 -11
  1122. package/dist/extensions/signal/package.json +0 -24
  1123. package/dist/extensions/signal/reaction-runtime-api.js +0 -2
  1124. package/dist/extensions/signal/runtime-api.js +0 -24
  1125. package/dist/extensions/signal/setup-entry.js +0 -13
  1126. package/dist/extensions/signal/test-api.js +0 -111
  1127. package/dist/extensions/slack/api.js +0 -10
  1128. package/dist/extensions/slack/channel-config-api.js +0 -2
  1129. package/dist/extensions/slack/index.js +0 -12
  1130. package/dist/extensions/slack/openclaw.plugin.json +0 -11
  1131. package/dist/extensions/slack/package.json +0 -31
  1132. package/dist/extensions/slack/runtime-api.js +0 -110
  1133. package/dist/extensions/slack/setup-entry.js +0 -12
  1134. package/dist/extensions/slack/test-api.js +0 -47
  1135. package/dist/extensions/stepfun/index.js +0 -163
  1136. package/dist/extensions/stepfun/onboard.js +0 -3
  1137. package/dist/extensions/stepfun/openclaw.plugin.json +0 -83
  1138. package/dist/extensions/stepfun/package.json +0 -12
  1139. package/dist/extensions/stepfun/provider-catalog.js +0 -2
  1140. package/dist/extensions/synology-chat/index.js +0 -12
  1141. package/dist/extensions/synology-chat/openclaw.plugin.json +0 -11
  1142. package/dist/extensions/synology-chat/package.json +0 -26
  1143. package/dist/extensions/synology-chat/setup-api.js +0 -2
  1144. package/dist/extensions/synology-chat/setup-entry.js +0 -6
  1145. package/dist/extensions/synthetic/api.js +0 -4
  1146. package/dist/extensions/synthetic/index.js +0 -27
  1147. package/dist/extensions/synthetic/models.js +0 -2
  1148. package/dist/extensions/synthetic/onboard.js +0 -3
  1149. package/dist/extensions/synthetic/openclaw.plugin.json +0 -32
  1150. package/dist/extensions/synthetic/package.json +0 -12
  1151. package/dist/extensions/synthetic/provider-catalog.js +0 -2
  1152. package/dist/extensions/talk-voice/api.js +0 -3
  1153. package/dist/extensions/talk-voice/index.js +0 -160
  1154. package/dist/extensions/talk-voice/openclaw.plugin.json +0 -11
  1155. package/dist/extensions/tavily/index.js +0 -128
  1156. package/dist/extensions/tavily/openclaw.plugin.json +0 -53
  1157. package/dist/extensions/tavily/package.json +0 -12
  1158. package/dist/extensions/tavily/skills/tavily/SKILL.md +0 -94
  1159. package/dist/extensions/tavily/web-search-provider.js +0 -2
  1160. package/dist/extensions/telegram/allow-from.js +0 -2
  1161. package/dist/extensions/telegram/api.js +0 -14
  1162. package/dist/extensions/telegram/channel-config-api.js +0 -2
  1163. package/dist/extensions/telegram/index.js +0 -12
  1164. package/dist/extensions/telegram/openclaw.plugin.json +0 -11
  1165. package/dist/extensions/telegram/package.json +0 -37
  1166. package/dist/extensions/telegram/runtime-api.js +0 -25
  1167. package/dist/extensions/telegram/session-key-api.js +0 -2
  1168. package/dist/extensions/telegram/setup-entry.js +0 -13
  1169. package/dist/extensions/telegram/test-api.js +0 -88
  1170. package/dist/extensions/telegram/test-support.js +0 -46
  1171. package/dist/extensions/telegram/update-offset-runtime-api.js +0 -2
  1172. package/dist/extensions/thread-ownership/api.js +0 -5
  1173. package/dist/extensions/thread-ownership/index.js +0 -82
  1174. package/dist/extensions/thread-ownership/openclaw.plugin.json +0 -30
  1175. package/dist/extensions/tlon/api.js +0 -14
  1176. package/dist/extensions/tlon/index.js +0 -150
  1177. package/dist/extensions/tlon/openclaw.plugin.json +0 -12
  1178. package/dist/extensions/tlon/package.json +0 -44
  1179. package/dist/extensions/tlon/runtime-api.js +0 -14
  1180. package/dist/extensions/tlon/setup-api.js +0 -3
  1181. package/dist/extensions/tlon/setup-entry.js +0 -6
  1182. package/dist/extensions/tlon/test-api.js +0 -2
  1183. package/dist/extensions/together/api.js +0 -3
  1184. package/dist/extensions/together/index.js +0 -26
  1185. package/dist/extensions/together/models.js +0 -2
  1186. package/dist/extensions/together/onboard.js +0 -2
  1187. package/dist/extensions/together/openclaw.plugin.json +0 -32
  1188. package/dist/extensions/together/package.json +0 -12
  1189. package/dist/extensions/together/provider-catalog.js +0 -2
  1190. package/dist/extensions/twitch/api.js +0 -9
  1191. package/dist/extensions/twitch/index.js +0 -1090
  1192. package/dist/extensions/twitch/openclaw.plugin.json +0 -11
  1193. package/dist/extensions/twitch/package.json +0 -29
  1194. package/dist/extensions/twitch/runtime-api.js +0 -9
  1195. package/dist/extensions/venice/api.js +0 -3
  1196. package/dist/extensions/venice/index.js +0 -55
  1197. package/dist/extensions/venice/models.js +0 -2
  1198. package/dist/extensions/venice/onboard.js +0 -3
  1199. package/dist/extensions/venice/openclaw.plugin.json +0 -32
  1200. package/dist/extensions/venice/package.json +0 -12
  1201. package/dist/extensions/venice/provider-catalog.js +0 -2
  1202. package/dist/extensions/vercel-ai-gateway/api.js +0 -4
  1203. package/dist/extensions/vercel-ai-gateway/index.js +0 -30
  1204. package/dist/extensions/vercel-ai-gateway/models.js +0 -2
  1205. package/dist/extensions/vercel-ai-gateway/onboard.js +0 -2
  1206. package/dist/extensions/vercel-ai-gateway/openclaw.plugin.json +0 -32
  1207. package/dist/extensions/vercel-ai-gateway/package.json +0 -12
  1208. package/dist/extensions/vercel-ai-gateway/provider-catalog.js +0 -2
  1209. package/dist/extensions/vllm/api.js +0 -4
  1210. package/dist/extensions/vllm/defaults.js +0 -2
  1211. package/dist/extensions/vllm/index.js +0 -78
  1212. package/dist/extensions/vllm/models.js +0 -2
  1213. package/dist/extensions/vllm/openclaw.plugin.json +0 -29
  1214. package/dist/extensions/vllm/package.json +0 -12
  1215. package/dist/extensions/voice-call/api.js +0 -7
  1216. package/dist/extensions/voice-call/index.js +0 -698
  1217. package/dist/extensions/voice-call/openclaw.plugin.json +0 -700
  1218. package/dist/extensions/voice-call/package.json +0 -33
  1219. package/dist/extensions/voice-call/runtime-api.js +0 -7
  1220. package/dist/extensions/voice-call/runtime-entry.js +0 -2
  1221. package/dist/extensions/volcengine/api.js +0 -3
  1222. package/dist/extensions/volcengine/index.js +0 -63
  1223. package/dist/extensions/volcengine/models.js +0 -2
  1224. package/dist/extensions/volcengine/openclaw.plugin.json +0 -33
  1225. package/dist/extensions/volcengine/package.json +0 -12
  1226. package/dist/extensions/volcengine/provider-catalog.js +0 -2
  1227. package/dist/extensions/whatsapp/action-runtime-api.js +0 -2
  1228. package/dist/extensions/whatsapp/action-runtime.runtime.js +0 -2
  1229. package/dist/extensions/whatsapp/api.js +0 -8
  1230. package/dist/extensions/whatsapp/auth-presence.js +0 -2
  1231. package/dist/extensions/whatsapp/channel-config-api.js +0 -2
  1232. package/dist/extensions/whatsapp/constants.js +0 -2
  1233. package/dist/extensions/whatsapp/index.js +0 -12
  1234. package/dist/extensions/whatsapp/light-runtime-api.js +0 -5
  1235. package/dist/extensions/whatsapp/login-qr-api.js +0 -2
  1236. package/dist/extensions/whatsapp/openclaw.plugin.json +0 -11
  1237. package/dist/extensions/whatsapp/package.json +0 -45
  1238. package/dist/extensions/whatsapp/runtime-api.js +0 -334
  1239. package/dist/extensions/whatsapp/setup-entry.js +0 -23
  1240. package/dist/extensions/whatsapp/test-api.js +0 -76
  1241. package/dist/extensions/xai/api.js +0 -6
  1242. package/dist/extensions/xai/code-execution.js +0 -2
  1243. package/dist/extensions/xai/index.js +0 -122
  1244. package/dist/extensions/xai/model-definitions.js +0 -2
  1245. package/dist/extensions/xai/model-id.js +0 -2
  1246. package/dist/extensions/xai/onboard.js +0 -2
  1247. package/dist/extensions/xai/openclaw.plugin.json +0 -157
  1248. package/dist/extensions/xai/package.json +0 -12
  1249. package/dist/extensions/xai/provider-catalog.js +0 -2
  1250. package/dist/extensions/xai/provider-models.js +0 -2
  1251. package/dist/extensions/xai/stream.js +0 -2
  1252. package/dist/extensions/xai/web-search.js +0 -2
  1253. package/dist/extensions/xai/x-search.js +0 -2
  1254. package/dist/extensions/xiaomi/api.js +0 -3
  1255. package/dist/extensions/xiaomi/index.js +0 -37
  1256. package/dist/extensions/xiaomi/onboard.js +0 -2
  1257. package/dist/extensions/xiaomi/openclaw.plugin.json +0 -32
  1258. package/dist/extensions/xiaomi/package.json +0 -12
  1259. package/dist/extensions/xiaomi/provider-catalog.js +0 -2
  1260. package/dist/extensions/zai/api.js +0 -3
  1261. package/dist/extensions/zai/detect.js +0 -2
  1262. package/dist/extensions/zai/index.js +0 -239
  1263. package/dist/extensions/zai/media-understanding-provider.js +0 -2
  1264. package/dist/extensions/zai/model-definitions.js +0 -2
  1265. package/dist/extensions/zai/onboard.js +0 -2
  1266. package/dist/extensions/zai/openclaw.plugin.json +0 -94
  1267. package/dist/extensions/zai/package.json +0 -12
  1268. package/dist/extensions/zai/runtime-api.js +0 -3
  1269. package/dist/extensions/zalo/api.js +0 -3
  1270. package/dist/extensions/zalo/index.js +0 -13
  1271. package/dist/extensions/zalo/openclaw.plugin.json +0 -11
  1272. package/dist/extensions/zalo/package.json +0 -47
  1273. package/dist/extensions/zalo/runtime-api.js +0 -38
  1274. package/dist/extensions/zalo/setup-entry.js +0 -6
  1275. package/dist/extensions/zalo/test-api.js +0 -2
  1276. package/dist/extensions/zalouser/api.js +0 -2
  1277. package/dist/extensions/zalouser/index.js +0 -599
  1278. package/dist/extensions/zalouser/openclaw.plugin.json +0 -11
  1279. package/dist/extensions/zalouser/package.json +0 -48
  1280. package/dist/extensions/zalouser/runtime-api.js +0 -30
  1281. package/dist/extensions/zalouser/setup-entry.js +0 -13
  1282. package/dist/extensions/zalouser/test-api.js +0 -5
  1283. package/dist/external-content-DtoRY-d1.js +0 -242
  1284. package/dist/facade-runtime-Bpi4Gy-u.js +0 -263
  1285. package/dist/failover-error-BrdBIFg2.js +0 -180
  1286. package/dist/feishu-81Iv8tqF.js +0 -18
  1287. package/dist/feishu-conversation-NmEqAxSA.js +0 -17
  1288. package/dist/feishu-setup-DXAK6GqE.js +0 -12
  1289. package/dist/fetch-7dbKQPT5.js +0 -256
  1290. package/dist/fetch-BjiGl865.js +0 -418
  1291. package/dist/fetch-Bp23aO5S.js +0 -65
  1292. package/dist/fetch-guard-BnhVFBtf.js +0 -150
  1293. package/dist/fetch-mock-WghRRNpK.js +0 -6
  1294. package/dist/fetch-runtime-DfFmkkZH.js +0 -4
  1295. package/dist/fetch-timeout-BKMGkHu9.js +0 -58
  1296. package/dist/file-identity-DPm-6kp0.js +0 -567
  1297. package/dist/file-lock-CH0V9dhL.js +0 -141
  1298. package/dist/file-lock-D292sbfa.js +0 -2
  1299. package/dist/firecrawl-client-GOGPuEeg.js +0 -338
  1300. package/dist/firecrawl-search-provider-ptp7GNAt.js +0 -47
  1301. package/dist/format-BwzSM9vY.js +0 -24
  1302. package/dist/format-D38w0aKT.js +0 -817
  1303. package/dist/format-DCFsK8oa.js +0 -19
  1304. package/dist/format-datetime-Bl6-b7G1.js +0 -73
  1305. package/dist/format-duration-DqcpDYkZ.js +0 -57
  1306. package/dist/format-relative-CYrRyrT7.js +0 -54
  1307. package/dist/frontmatter-Ba2Hn11b.js +0 -45
  1308. package/dist/frontmatter-Cjxy4vX8.js +0 -210
  1309. package/dist/fs-safe-BQ59ttjX.js +0 -999
  1310. package/dist/gateway-CWPyH-P7.js +0 -2575
  1311. package/dist/gateway-cli-BmPBPCcJ.js +0 -1572
  1312. package/dist/gateway-discovery-targets--oNzWOVw.js +0 -430
  1313. package/dist/gateway-install-token-tyQyR2ED.js +0 -230
  1314. package/dist/gateway-lock-BbUQuUet.js +0 -292
  1315. package/dist/gateway-presence-BVCIm1hy.js +0 -15
  1316. package/dist/gateway-registry-tQcIThkV.js +0 -74
  1317. package/dist/gateway-rpc-BXdoSPN7.js +0 -26
  1318. package/dist/gateway-runtime-C7EhkU_c.js +0 -12
  1319. package/dist/gaxios-fetch-compat-D4gl5582.js +0 -180
  1320. package/dist/gemini-auth-Dlpcd9MB.js +0 -29
  1321. package/dist/gemini-web-search-provider-CkNEl2du.js +0 -162
  1322. package/dist/get-reply-from-config.runtime-vBmBttxw.js +0 -2
  1323. package/dist/get-reply-from-config.runtime.js +0 -1
  1324. package/dist/git-commit-BS28SZVT.js +0 -2
  1325. package/dist/git-commit-ChiOoWyK.js +0 -177
  1326. package/dist/github-copilot-login-B8s4OVQ4.js +0 -11
  1327. package/dist/github-copilot-token-BwXtH-ZJ.js +0 -2
  1328. package/dist/github-copilot-token-D81Wvm8b.js +0 -2
  1329. package/dist/github-copilot-token-beHjQGOp.js +0 -91
  1330. package/dist/global-singleton-54zT3rCn.js +0 -13
  1331. package/dist/global-singleton-iOq2_-p8.js +0 -1
  1332. package/dist/global-state-DUuMGgts.js +0 -17
  1333. package/dist/globals-CDtV0ht8.js +0 -25
  1334. package/dist/gmail-setup-utils-CxXfU7cy.js +0 -421
  1335. package/dist/google-Cx1_z3Q3.js +0 -24
  1336. package/dist/googlechat-CoiMNDC2.js +0 -37
  1337. package/dist/graph-users-BmZWavVH.js +0 -917
  1338. package/dist/group-access-BZZ3FNmb.js +0 -32
  1339. package/dist/group-access-BjveEAjz.js +0 -113
  1340. package/dist/group-access-owHLoCWX.js +0 -119
  1341. package/dist/group-activation-ClEb7qwj.js +0 -22
  1342. package/dist/group-id-CcsUNOct.js +0 -11
  1343. package/dist/group-policy-Bb8dxOpM.js +0 -25
  1344. package/dist/group-policy-G9GcSyph.js +0 -201
  1345. package/dist/group-policy-wS9F8Y_i.js +0 -51
  1346. package/dist/group-policy-warnings-CL2gHsXM.js +0 -196
  1347. package/dist/groups.runtime-K758xQFV.js +0 -6
  1348. package/dist/groups.runtime.js +0 -1
  1349. package/dist/handle-action-CE4vpa7G.js +0 -500
  1350. package/dist/health-D_KQbqQY.js +0 -577
  1351. package/dist/health-a1VPtSyV.js +0 -2
  1352. package/dist/health-format-COR93f8W.js +0 -26
  1353. package/dist/heartbeat-C_TrErgd.js +0 -122
  1354. package/dist/heartbeat-reply-payload-C7Ac3fOZ.js +0 -13
  1355. package/dist/heartbeat-summary-v5gPj5bd.js +0 -57
  1356. package/dist/heartbeat-visibility-CHMO4pmJ.js +0 -102
  1357. package/dist/help-CyR1Oo4X.js +0 -81
  1358. package/dist/help-format-l1phKNA8.js +0 -15
  1359. package/dist/helpers-COHnQbWX.js +0 -32
  1360. package/dist/helpers-DNpD7VMo.js +0 -24
  1361. package/dist/history-B4mW8GfY.js +0 -102
  1362. package/dist/home-dir-n9onX5PG.js +0 -83
  1363. package/dist/hook-runner-global-C9GhdBtf.js +0 -632
  1364. package/dist/hook-runner-global-Cr_Pthp4.js +0 -2
  1365. package/dist/hook-runtime-DK8QF-2x.js +0 -3
  1366. package/dist/hooks-cli-XCo-7nz9.js +0 -353
  1367. package/dist/hooks-policy-BmULXBcp.js +0 -20
  1368. package/dist/hooks-status-D_ZxRD0H.js +0 -86
  1369. package/dist/host-env-security-SlXI58bc.js +0 -290
  1370. package/dist/host-runtime-BGHb06HN.js +0 -1
  1371. package/dist/hostname-BRYLr_mh.js +0 -8
  1372. package/dist/http-body-CfdQSEp0.js +0 -238
  1373. package/dist/http-client-_3i4-nw5.js +0 -294
  1374. package/dist/http-registry-ZGSBfYSe.js +0 -54
  1375. package/dist/http-route-overlap-C8lbolN5.js +0 -101
  1376. package/dist/identity-BoQQh6Y8.js +0 -26
  1377. package/dist/identity-D64Wfv_s.js +0 -29
  1378. package/dist/identity-DvwF6Yix.js +0 -84
  1379. package/dist/identity-avatar-DPBgVwpU.js +0 -86
  1380. package/dist/identity-file-BtIJI4dn.js +0 -60
  1381. package/dist/image-C4V19x9x.js +0 -152
  1382. package/dist/image-generation-BbOnazXi.js +0 -1
  1383. package/dist/image-generation-provider-CQK8HA0O.js +0 -136
  1384. package/dist/image-generation-provider-CWUvRxmv.js +0 -131
  1385. package/dist/image-generation-provider-F2sfNjcr.js +0 -281
  1386. package/dist/image-ops-BJKjhMAu.js +0 -476
  1387. package/dist/image-runtime-DodXcK2e.js +0 -7
  1388. package/dist/imessage-2ukkzufG.js +0 -19
  1389. package/dist/inbound-context-Cxvd3JHZ.js +0 -59
  1390. package/dist/inbound-context-Czd3FdNb.js +0 -52
  1391. package/dist/inbound-debounce-CI7l3R36.js +0 -159
  1392. package/dist/inbound-envelope-LyHTUTue.js +0 -61
  1393. package/dist/inbound-reply-dispatch-BdeY6N-k.js +0 -73
  1394. package/dist/inbound-text-CacimZtw.js +0 -14
  1395. package/dist/inbound.runtime-CqX3n132.js +0 -3
  1396. package/dist/inbound.runtime.js +0 -1
  1397. package/dist/includes-Ccr-Q5DB.js +0 -188
  1398. package/dist/includes-scan-DVvYLj4S.js +0 -55
  1399. package/dist/index.js +0 -56
  1400. package/dist/infra/warning-filter.js +0 -2
  1401. package/dist/infra-runtime-Cl0iZpRS.js +0 -22
  1402. package/dist/input-files-PZC6ZR4W.js +0 -251
  1403. package/dist/input-provenance-8GBFuk0Q.js +0 -44
  1404. package/dist/inspect-B8dw6NVJ.js +0 -286
  1405. package/dist/install-Bk7XyvtC.js +0 -590
  1406. package/dist/install-package-dir-C2ba2toB.js +0 -284
  1407. package/dist/install-safe-path-CkCd0rWS.js +0 -69
  1408. package/dist/install-security-scan-C02VaEU9.js +0 -22
  1409. package/dist/install-security-scan.runtime-CDUuS6Dl.js +0 -299
  1410. package/dist/install-security-scan.runtime.js +0 -1
  1411. package/dist/install-source-utils-2tdWQmwI.js +0 -167
  1412. package/dist/install-target-CBNysuiP.js +0 -175
  1413. package/dist/install.runtime-D_zKCpnB.js +0 -11
  1414. package/dist/install.runtime-DjQozvMe.js +0 -27
  1415. package/dist/install.runtime.js +0 -1
  1416. package/dist/installs-BnAbQ70v.js +0 -28
  1417. package/dist/interactive-CEnsu1RT.js +0 -8
  1418. package/dist/interactive-runtime-Bxq5ztle.js +0 -1
  1419. package/dist/internal-Lk0wFTNq.js +0 -411
  1420. package/dist/internal-hooks-C3ziA7w_.js +0 -155
  1421. package/dist/io-BUxKr33U.js +0 -2236
  1422. package/dist/io-BuMkfjp3.js +0 -4
  1423. package/dist/ip-BZP18dDl.js +0 -208
  1424. package/dist/ipv4-Xiyu1rvD.js +0 -82
  1425. package/dist/irc-DXfYh-Sd.js +0 -14
  1426. package/dist/irc-surface-Di-joPuc.js +0 -15
  1427. package/dist/is-main-Bv5ej4lF.js +0 -27
  1428. package/dist/issue-format-8Eylt-2O.js +0 -2
  1429. package/dist/issue-format-DLZczJ0U.js +0 -31
  1430. package/dist/json-file-5xJqyXrK.js +0 -23
  1431. package/dist/json-files-C4lsZ_HR.js +0 -72
  1432. package/dist/json-mode-4O1xL2fT.js +0 -34
  1433. package/dist/json-pointer-C30cknnZ.js +0 -43
  1434. package/dist/json-store-FUgu1pyj.js +0 -37
  1435. package/dist/keyed-async-queue-BTOTBE8n.js +0 -32
  1436. package/dist/kill-tree-CIfAbzdN.js +0 -2
  1437. package/dist/kill-tree-CUPpLbeq.js +0 -82
  1438. package/dist/kimi-web-search-provider-Cb3F9_Da.js +0 -224
  1439. package/dist/known-users-DjerpGCB.js +0 -167
  1440. package/dist/lancedb-runtime-DTb_mDUG.js +0 -201
  1441. package/dist/launchd-cp98MUhz.js +0 -517
  1442. package/dist/lazy-runtime-C6LCAM-L.js +0 -29
  1443. package/dist/lazy-runtime-yh_WT4on.js +0 -1
  1444. package/dist/lazy-service-module-CeifO9oo.js +0 -24
  1445. package/dist/legacy-crypto-restore-CsHmLVjY.js +0 -85
  1446. package/dist/legacy-names-CFo8Oe-2.js +0 -9
  1447. package/dist/legacy-web-search-Bn8F2jrN.js +0 -140
  1448. package/dist/legacy.shared-oZM32end.js +0 -45
  1449. package/dist/level-overrides-gqc8xfh2.js +0 -36
  1450. package/dist/library-ChjjeniJ.js +0 -44
  1451. package/dist/lifecycle-core-Ce_ZEvjl.js +0 -402
  1452. package/dist/line-Be0jY3CU.js +0 -4
  1453. package/dist/line-runtime-B0ZGTK81.js +0 -60
  1454. package/dist/line-surface-BTopinac.js +0 -27
  1455. package/dist/links-D7o22Ygt.js +0 -17
  1456. package/dist/listeners-_47QWN8-.js +0 -14
  1457. package/dist/llm-slug-generator-Dv-sLOW9.js +0 -68
  1458. package/dist/llm-slug-generator.js +0 -2
  1459. package/dist/llm-task-BDA3i86A.js +0 -3
  1460. package/dist/load-BXSzQ8YA.js +0 -28
  1461. package/dist/load-options-BqszWkkN.js +0 -36
  1462. package/dist/loader-DsZDoLQ6.js +0 -2519
  1463. package/dist/local-file-access-PajXzDdK.js +0 -49
  1464. package/dist/local-roots-DrpNBv4b.js +0 -46
  1465. package/dist/location-CtMHXE-d.js +0 -42
  1466. package/dist/logger-Bc2lC3X3.js +0 -79
  1467. package/dist/logger-CIV9WBoa.js +0 -11
  1468. package/dist/logger-DdGvppaE.js +0 -75
  1469. package/dist/logger-MWEZrHUL.js +0 -582
  1470. package/dist/logging-B1QD0DRq.js +0 -2
  1471. package/dist/logging-CAfgK7sj.js +0 -3
  1472. package/dist/logging-ColPHIDT.js +0 -16
  1473. package/dist/logging-D4xyCEzZ.js +0 -85
  1474. package/dist/logging-Dt_aiHur.js +0 -13
  1475. package/dist/logging-Dywye6yZ.js +0 -2
  1476. package/dist/logging-core-hw7Df6Hl.js +0 -3
  1477. package/dist/login-BrqdQcNh.js +0 -108
  1478. package/dist/login-DSqrZNW-.js +0 -2333
  1479. package/dist/login-qr-Dm3iC25_.js +0 -212
  1480. package/dist/login-qr-api-BxRDJKkp.js +0 -16
  1481. package/dist/logs-cli-CxjV80As.js +0 -221
  1482. package/dist/magic-string.es-CVHNyqW1.js +0 -1011
  1483. package/dist/main-session-BbO0A-No.js +0 -38
  1484. package/dist/manager-c_fEco8X.js +0 -2773
  1485. package/dist/manager-runtime-Vy_F8ORR.js +0 -2
  1486. package/dist/manager.runtime-Bm1Knq-3.js +0 -670
  1487. package/dist/manager.runtime.js +0 -1
  1488. package/dist/manifest-f_gihArl.js +0 -237
  1489. package/dist/manifest-registry-Kx5Z2lJL.js +0 -1069
  1490. package/dist/map-size-BBQq2RPq.js +0 -15
  1491. package/dist/markdown-table-runtime-Dx12DQTq.js +0 -2
  1492. package/dist/markdown-tables-CSlyhQVP.js +0 -31
  1493. package/dist/mask-api-key-BYVFDQdo.js +0 -10
  1494. package/dist/matrix-NDa-FoaE.js +0 -351
  1495. package/dist/matrix-config-helpers-D0D-oL7I.js +0 -153
  1496. package/dist/matrix-helper-DioFIiaO.js +0 -20
  1497. package/dist/matrix-migration-snapshot-DAOFFSgM.js +0 -714
  1498. package/dist/matrix-ouiFsVI1.js +0 -39
  1499. package/dist/matrix-runtime-heavy-KUEg_MfD.js +0 -4
  1500. package/dist/matrix-runtime-shared-B6aE5Uu6.js +0 -1
  1501. package/dist/matrix-runtime-surface-R78Hde6Q.js +0 -12
  1502. package/dist/matrix-surface-B-nU-e0B.js +0 -13
  1503. package/dist/matrix-thread-bindings-B77Krs8r.js +0 -12
  1504. package/dist/mattermost-Cg2PI71s.js +0 -18
  1505. package/dist/mcp/plugin-tools-serve.js +0 -105
  1506. package/dist/mcp-cli-BMNT4RIm.js +0 -768
  1507. package/dist/mcp-config-3y1z3N2x.js +0 -118
  1508. package/dist/media-CUdiVhEt.js +0 -1691
  1509. package/dist/media-limits-DmcT5KnO.js +0 -14
  1510. package/dist/media-runtime-8QR_uTs0.js +0 -295
  1511. package/dist/media-understanding-CpMkSmKj.js +0 -51
  1512. package/dist/media-understanding-provider-C0xVBaas.js +0 -11
  1513. package/dist/media-understanding-provider-C8RSrdEy.js +0 -16
  1514. package/dist/media-understanding-provider-CCB6_bwc2.js +0 -9
  1515. package/dist/media-understanding-provider-CZ83ep6L.js +0 -16
  1516. package/dist/media-understanding-provider-Cmcg82YY.js +0 -28
  1517. package/dist/media-understanding-provider-D1_z5Kwx.js +0 -11
  1518. package/dist/media-understanding-provider-DC9bhcFj.js +0 -11
  1519. package/dist/media-understanding-provider-DbMV-bHu.js +0 -17
  1520. package/dist/media-understanding-provider-Drg3Vyoe.js +0 -86
  1521. package/dist/media-understanding-runtime-JIhXSD7e.js +0 -15
  1522. package/dist/media-understanding.runtime-2Muvvak4.js +0 -7
  1523. package/dist/media-understanding.runtime.js +0 -1
  1524. package/dist/memory-DPYsR3Cn.js +0 -228
  1525. package/dist/memory-core-engine-runtime-DP_nzKMm.js +0 -14
  1526. package/dist/memory-core-host-engine-embeddings-BhsmnP-6.js +0 -1370
  1527. package/dist/memory-core-host-engine-foundation-CtFD8jpc.js +0 -10
  1528. package/dist/memory-core-host-engine-qmd-DCvmid82.js +0 -375
  1529. package/dist/memory-core-host-engine-storage-N3YflxjF.js +0 -109
  1530. package/dist/memory-core-host-multimodal-BVd6eEE3.js +0 -1
  1531. package/dist/memory-core-host-query-Bxzu0mAD.js +0 -2
  1532. package/dist/memory-core-host-runtime-cli-nz5fxbbn.js +0 -10
  1533. package/dist/memory-core-host-runtime-core-BcGQFQUw.js +0 -8
  1534. package/dist/memory-core-host-runtime-files-DO5A0pY5.js +0 -3
  1535. package/dist/memory-core-host-secret-CQAiTACg.js +0 -1
  1536. package/dist/memory-core-host-status-0g2XexDn.js +0 -44
  1537. package/dist/memory-embedding-providers-BOMS0u3X.js +0 -34
  1538. package/dist/memory-lancedb-kZBcB07O.js +0 -2
  1539. package/dist/memory-runtime-BIGGpmaC.js +0 -2
  1540. package/dist/memory-runtime-XyiDon5w.js +0 -34
  1541. package/dist/memory-search-CQFSugEg.js +0 -2
  1542. package/dist/memory-search-DpAYXyjc.js +0 -202
  1543. package/dist/memory-state-DDJh6L4-.js +0 -41
  1544. package/dist/mention-gating-_kzByrvM.js +0 -25
  1545. package/dist/mentions-BCBF5Klg.js +0 -65
  1546. package/dist/mentions-BKYgZd-C.js +0 -155
  1547. package/dist/merge-patch-CtvE2OP0.js +0 -65
  1548. package/dist/message-Dna6Vsdg.js +0 -205
  1549. package/dist/message-action-discovery-CPTCAl8K.js +0 -133
  1550. package/dist/message-action-runner-Byldnjex.js +0 -1703
  1551. package/dist/message-channel-bEWdw4ul.js +0 -105
  1552. package/dist/message-handler-C9TRy9hy.js +0 -1771
  1553. package/dist/message-hook-mappers-CzwFvq_c.js +0 -255
  1554. package/dist/messages-CQT2FDZ3.js +0 -270
  1555. package/dist/method-scopes-B6e_KuRU.js +0 -2663
  1556. package/dist/migrate-cli-C_iDle77.js +0 -500
  1557. package/dist/migration-snapshot.runtime-DAzTUgU-.js +0 -3
  1558. package/dist/migration-snapshot.runtime.js +0 -1
  1559. package/dist/mime-DkaKoCVP.js +0 -156
  1560. package/dist/min-host-version-CIhgRq0c.js +0 -349
  1561. package/dist/minimax-vlm-Dh6g-MLh.js +0 -512
  1562. package/dist/model-auth-DcCyGs_6.js +0 -377
  1563. package/dist/model-auth-env-OT6ucjoP.js +0 -63
  1564. package/dist/model-auth-label-fGtOs2u-.js +0 -45
  1565. package/dist/model-auth-markers-D2z_AIuC.js +0 -70
  1566. package/dist/model-auth-runtime-shared-DnhseQ_3.js +0 -18
  1567. package/dist/model-buttons-zQ-cRhqo.js +0 -187
  1568. package/dist/model-catalog-f9zO4b6C.js +0 -208
  1569. package/dist/model-catalog.runtime-iRu_OMJS.js +0 -2
  1570. package/dist/model-catalog.runtime.js +0 -1
  1571. package/dist/model-definitions-BGWurJeM.js +0 -49
  1572. package/dist/model-definitions-C-e07VgA.js +0 -255
  1573. package/dist/model-definitions-DUANiLUG.js +0 -126
  1574. package/dist/model-definitions-DrxdjAkB.js +0 -202
  1575. package/dist/model-id-9W_sHLHy.js +0 -12
  1576. package/dist/model-id-DEv7HEyl.js +0 -20
  1577. package/dist/model-input-DwbpFRYm.js +0 -20
  1578. package/dist/model-overrides-BaecXmMv.js +0 -84
  1579. package/dist/model-overrides-UUODi1G1.js +0 -91
  1580. package/dist/model-param-b-BHlbSl5R.js +0 -15
  1581. package/dist/model-picker-BgVMnja3.js +0 -439
  1582. package/dist/model-picker-D8elZqN_.js +0 -3
  1583. package/dist/model-picker.runtime-BUfgRpvT.js +0 -15
  1584. package/dist/model-picker.runtime.js +0 -1
  1585. package/dist/model-runtime-CkjgxQmB.js +0 -1772
  1586. package/dist/model-selection-DXY5nwui.js +0 -407
  1587. package/dist/model-selection-Dx6Ag-ZE.js +0 -505
  1588. package/dist/model-suppression-C8XSEnsv.js +0 -24
  1589. package/dist/model-suppression.runtime-Dqra9AAF.js +0 -7
  1590. package/dist/model-suppression.runtime.js +0 -1
  1591. package/dist/models--Ze_o5z6.js +0 -193
  1592. package/dist/models-7_w_ynp7.js +0 -35
  1593. package/dist/models-BMmB_oQc.js +0 -130
  1594. package/dist/models-B_TKM4gG.js +0 -18
  1595. package/dist/models-B_UROL5b.js +0 -3
  1596. package/dist/models-BmDGSZCK.js +0 -31
  1597. package/dist/models-BywIyTzh.js +0 -126
  1598. package/dist/models-C5GB-E7D.js +0 -154
  1599. package/dist/models-DU3Lv10g.js +0 -754
  1600. package/dist/models-VgpjMiqM.js +0 -138
  1601. package/dist/models-_DZVZ2Na.js +0 -18
  1602. package/dist/models-bBe0FFJe.js +0 -2550
  1603. package/dist/models-cli-kZR11PgM.js +0 -197
  1604. package/dist/models-config-D6j7jkCN.js +0 -2
  1605. package/dist/models-config-lYKxSxLo.js +0 -1106
  1606. package/dist/models-config.runtime-D2tdVUsi.js +0 -2
  1607. package/dist/models-config.runtime.js +0 -1
  1608. package/dist/models-emJUoDsF.js +0 -40
  1609. package/dist/models-gPCm0Fco.js +0 -122
  1610. package/dist/models-mi7nu17U.js +0 -99
  1611. package/dist/models-nUP9ZPV8.js +0 -552
  1612. package/dist/models-provider-runtime-DfIZ0cvV.js +0 -2
  1613. package/dist/monitor-BEjwRY59.js +0 -3622
  1614. package/dist/monitor-BiwufaF7.js +0 -718
  1615. package/dist/monitor-BqwlHm94.js +0 -3660
  1616. package/dist/monitor-Cj6Atk8I.js +0 -676
  1617. package/dist/monitor-D2qBnOYz.js +0 -666
  1618. package/dist/monitor-DZmBV1Nj2.js +0 -2
  1619. package/dist/monitor-RMoB6sGQ.js +0 -4067
  1620. package/dist/monitor-auth-EvlH1zbN.js +0 -192
  1621. package/dist/monitor-lbUydC5_.js +0 -1525
  1622. package/dist/monitor-polling.runtime-O6ZG6yYv.js +0 -307
  1623. package/dist/monitor-polling.runtime.js +0 -1
  1624. package/dist/monitor-provider-x4TUmYNN.js +0 -1782
  1625. package/dist/monitor-vE0skDM1.js +0 -687
  1626. package/dist/monitor-webhook.runtime-DoTv_oZv.js +0 -297
  1627. package/dist/monitor-webhook.runtime.js +0 -1
  1628. package/dist/moonshot-stream-wrappers-Csssd6kW.js +0 -24
  1629. package/dist/moonshot-thinking-stream-wrappers-D3j6Q9Yk.js +0 -69
  1630. package/dist/msteams-DsFLaFEV.js +0 -33
  1631. package/dist/multimodal-DoXQtvBl.js +0 -66
  1632. package/dist/mutable-allowlist-detectors-CbFK2eTK.js +0 -62
  1633. package/dist/native-command-registry-B4BAqmAW.js +0 -2
  1634. package/dist/native-command-session-targets-DfUCBY63.js +0 -10
  1635. package/dist/net-DjzoSxQo.js +0 -265
  1636. package/dist/network-discovery-display-h8MqTMCI.js +0 -48
  1637. package/dist/network-mode-QjJNOXMa.js +0 -17
  1638. package/dist/nextcloud-talk-COZ5YrPY.js +0 -18
  1639. package/dist/node-cli-z8LHYl1w.js +0 -2323
  1640. package/dist/node-command-policy-DoeXKD1V.js +0 -205
  1641. package/dist/node-commands-ycnRypMq.js +0 -11
  1642. package/dist/node-require-BgDD9bTi.js +0 -14
  1643. package/dist/node-resolve-Drr1RIcN.js +0 -110
  1644. package/dist/node-service-Nyf8eLc4.js +0 -68
  1645. package/dist/node-startup-env-CVMjxAUF.js +0 -50
  1646. package/dist/nodes-cli-BMyafV_R.js +0 -1044
  1647. package/dist/nodes-screen-oyGHNlY5.js +0 -219
  1648. package/dist/nodes.helpers-DKBA9twS.js +0 -203
  1649. package/dist/normalize-C46CugdT.js +0 -35
  1650. package/dist/normalize-reply-VrMa_PA2.js +0 -500
  1651. package/dist/normalize-secret-input-CC9iFcnK.js +0 -32
  1652. package/dist/nostr-DGfd-Skj.js +0 -19
  1653. package/dist/note-B5R9zt2K.js +0 -109
  1654. package/dist/notify-CKEt6MKY.js +0 -298
  1655. package/dist/npm-registry-spec-dWUFCqDk.js +0 -100
  1656. package/dist/oauth-BBIy_OBl.js +0 -152
  1657. package/dist/oauth-DzMUt9ZO.js +0 -56
  1658. package/dist/oauth.credentials-CKrXIXPf.js +0 -119
  1659. package/dist/oauth.flow-Dd6MZcHS.js +0 -122
  1660. package/dist/oauth.http-CZlbXoZD.js +0 -23
  1661. package/dist/oauth.project-DAVNbct7.js +0 -125
  1662. package/dist/oauth.shared-D1_wwlyt.js +0 -26
  1663. package/dist/oauth.token-CnB-w_v2.js +0 -42
  1664. package/dist/ollama-EE_SvO8P.js +0 -26
  1665. package/dist/onboard-2otvb4-n.js +0 -307
  1666. package/dist/onboard-72nGEzpd.js +0 -25
  1667. package/dist/onboard-B14oDS4M.js +0 -23
  1668. package/dist/onboard-BH5hcOyK.js +0 -39
  1669. package/dist/onboard-BRkQIFt_.js +0 -25
  1670. package/dist/onboard-BSArlkkq.js +0 -73
  1671. package/dist/onboard-Bau_HSmO.js +0 -36
  1672. package/dist/onboard-BsqpQhXj.js +0 -591
  1673. package/dist/onboard-CBa7u1iZ.js +0 -25
  1674. package/dist/onboard-CLKZrJow.js +0 -29
  1675. package/dist/onboard-COaMJ5wS.js +0 -28
  1676. package/dist/onboard-CbTQZti9.js +0 -48
  1677. package/dist/onboard-Ce3rcBNR.js +0 -29
  1678. package/dist/onboard-CiMzgSvO.js +0 -67
  1679. package/dist/onboard-DNuWjUOg.js +0 -17
  1680. package/dist/onboard-DY3JtOcX.js +0 -47
  1681. package/dist/onboard-Dd_eFJ7g.js +0 -25
  1682. package/dist/onboard-DgMI-C3P.js +0 -24
  1683. package/dist/onboard-Dj3Kkl9C.js +0 -49
  1684. package/dist/onboard-Djne8OY8.js +0 -34
  1685. package/dist/onboard-DnNU28xK.js +0 -48
  1686. package/dist/onboard-MFS79j1I.js +0 -23
  1687. package/dist/onboard-REHqRyQm.js +0 -26
  1688. package/dist/onboard-VVnzyvuh.js +0 -46
  1689. package/dist/onboard-channels-B8UocRdo.js +0 -705
  1690. package/dist/onboard-channels-Ci5QQyQ0.js +0 -2
  1691. package/dist/onboard-config-7edS4yYd.js +0 -2
  1692. package/dist/onboard-config-C-6p2HNL.js +0 -29
  1693. package/dist/onboard-custom-BREC7K0s.js +0 -2
  1694. package/dist/onboard-custom-D7oXiV6u.js +0 -646
  1695. package/dist/onboard-helpers-BCIfy96O.js +0 -4
  1696. package/dist/onboard-helpers-CLedS83g.js +0 -227
  1697. package/dist/onboard-hooks-DW0gav3i.js +0 -52
  1698. package/dist/onboard-lh38uUOa.js +0 -25
  1699. package/dist/onboard-rH_HA9v-.js +0 -34
  1700. package/dist/onboard-remote-DG5Rb2y7.js +0 -2
  1701. package/dist/onboard-remote-DgDwHLCW.js +0 -193
  1702. package/dist/onboard-search-Bz78SAON.js +0 -339
  1703. package/dist/onboard-skills-BK1iF6NI.js +0 -2
  1704. package/dist/onboard-skills-Cfs4Gz-d.js +0 -134
  1705. package/dist/openai-B3atWWiZ.js +0 -21
  1706. package/dist/openai-codex-auth-identity-blYgqX5I.js +0 -40
  1707. package/dist/openai-codex-catalog-DQoW5ntP.js +0 -11
  1708. package/dist/openai-codex-provider-BeX3_fQL.js +0 -254
  1709. package/dist/openai-provider-DfSRc815.js +0 -272
  1710. package/dist/openai-stream-wrappers-Cmn9nSYj.js +0 -338
  1711. package/dist/openclaw-exec-env-DnTrPIdx.js +0 -17
  1712. package/dist/openclaw-root-F1SOdmJ0.js +0 -88
  1713. package/dist/openclaw-tools.runtime-Dx73yE1V.js +0 -2
  1714. package/dist/openclaw-tools.runtime.js +0 -1
  1715. package/dist/operator-approvals-client-NQtGN5k_.js +0 -33
  1716. package/dist/order-DNBhjW6F.js +0 -744
  1717. package/dist/origin-routing-BC2EzQqM.js +0 -15
  1718. package/dist/origin-routing-BVUTLJGu.js +0 -2
  1719. package/dist/os-summary-CdlXkpL1.js +0 -26
  1720. package/dist/outbound-adapter-D6WGzS7P.js +0 -183
  1721. package/dist/outbound-ek4CqhT2.js +0 -2
  1722. package/dist/outbound-hgMEZIU9.js +0 -2739
  1723. package/dist/outbound-media-B2ZrkOxl.js +0 -15
  1724. package/dist/outbound-runtime-CtDmQy3z.js +0 -2
  1725. package/dist/outbound-send-deps-COPf3lwV.js +0 -7
  1726. package/dist/outbound-session-DHKvttsz.js +0 -41
  1727. package/dist/pairing-challenge-O7jo1Q5R.js +0 -33
  1728. package/dist/pairing-cli-BEUxC5EH.js +0 -116
  1729. package/dist/pairing-labels-Cj1fFxG9.js +0 -7
  1730. package/dist/pairing-message-FaqHPEFk.js +0 -4
  1731. package/dist/pairing-messages-DxLpe0GE.js +0 -23
  1732. package/dist/pairing-pending-DGyUpmjC.js +0 -14
  1733. package/dist/pairing-store-B171dUVa.js +0 -617
  1734. package/dist/pairing-token-CnyXOU__.js +0 -88
  1735. package/dist/param-readers-CqAoT2n2.js +0 -2
  1736. package/dist/parse-duration-D9q1V0xx.js +0 -41
  1737. package/dist/parse-finite-number-CzdLC_gQ.js +0 -30
  1738. package/dist/parse-json-compat-DfjRYtKX.js +0 -11
  1739. package/dist/parse-log-line-Cd0JHPGg.js +0 -43
  1740. package/dist/parse-port-BFmNhrtE.js +0 -8
  1741. package/dist/parse-timeout-bktz0495.js +0 -27
  1742. package/dist/path-alias-guards-BeOn9PZR.js +0 -40
  1743. package/dist/path-env-C2F1kvna.js +0 -87
  1744. package/dist/path-safety-2mfHCe0n.js +0 -12
  1745. package/dist/paths-Bw8Ci57u.js +0 -2
  1746. package/dist/paths-GWMNxnBn.js +0 -201
  1747. package/dist/paths-xpks599B.js +0 -180
  1748. package/dist/payload-S8niBCaz.js +0 -90
  1749. package/dist/pdf-extract-Cm83kt2M.js +0 -73
  1750. package/dist/perplexity-web-search-provider-Cgr2BYVk.js +0 -423
  1751. package/dist/persistent-bindings.lifecycle-CAOm8v8I.js +0 -159
  1752. package/dist/persistent-dedupe-DoNHVMWs.js +0 -116
  1753. package/dist/pi-embedded-DEAtCIdT.js +0 -40616
  1754. package/dist/pi-embedded-helpers-BVjvCsor.js +0 -1733
  1755. package/dist/pi-embedded.runtime-Ctj3QFs-.js +0 -4
  1756. package/dist/pi-embedded.runtime.js +0 -1
  1757. package/dist/pi-model-discovery-KjI5xf8m.js +0 -188
  1758. package/dist/pi-settings-BJzoHYF9.js +0 -57
  1759. package/dist/pi-tools.before-tool-call.runtime-DJ6s0GDV.js +0 -354
  1760. package/dist/pi-tools.before-tool-call.runtime.js +0 -1
  1761. package/dist/plugin-auto-enable-BZvicayR.js +0 -400
  1762. package/dist/plugin-entry-D0vhddM4.js +0 -25
  1763. package/dist/plugin-entry.runtime-Xd644UDA.js +0 -112
  1764. package/dist/plugin-entry.runtime.js +0 -1
  1765. package/dist/plugin-error-boundary-RI4ByQoA.js +0 -55
  1766. package/dist/plugin-error-handler-DWUTf_UF.js +0 -109
  1767. package/dist/plugin-health-checker-2c6LyJwr.js +0 -125
  1768. package/dist/plugin-hot-reload-CA3__dZN.js +0 -215
  1769. package/dist/plugin-install-BjVLwj7-.js +0 -230
  1770. package/dist/plugin-install-CjwMt13j.js +0 -2
  1771. package/dist/plugin-install-config-policy-MApev-w-.js +0 -93
  1772. package/dist/plugin-install-path-warnings-BkBH-k4n.js +0 -40
  1773. package/dist/plugin-install-plan-0fWhyVBN.js +0 -50
  1774. package/dist/plugin-registry-CORVyKHv.js +0 -74
  1775. package/dist/plugin-registry-Dl1iIh7W.js +0 -2
  1776. package/dist/plugin-runtime-Dd1YN95W.js +0 -6
  1777. package/dist/plugin-sdk/account-core.js +0 -8
  1778. package/dist/plugin-sdk/account-helpers.js +0 -4
  1779. package/dist/plugin-sdk/account-id.js +0 -3
  1780. package/dist/plugin-sdk/account-resolution.js +0 -12
  1781. package/dist/plugin-sdk/acp-runtime.js +0 -3
  1782. package/dist/plugin-sdk/agent-config-primitives.js +0 -3
  1783. package/dist/plugin-sdk/agent-runtime.js +0 -29
  1784. package/dist/plugin-sdk/allow-from.js +0 -5
  1785. package/dist/plugin-sdk/allowlist-config-edit.js +0 -2
  1786. package/dist/plugin-sdk/amazon-bedrock.js +0 -15
  1787. package/dist/plugin-sdk/anthropic-vertex.js +0 -2
  1788. package/dist/plugin-sdk/approval-runtime.js +0 -8
  1789. package/dist/plugin-sdk/bluebubbles-policy.js +0 -2
  1790. package/dist/plugin-sdk/bluebubbles.js +0 -39
  1791. package/dist/plugin-sdk/boolean-param.js +0 -2
  1792. package/dist/plugin-sdk/browser-runtime.js +0 -3
  1793. package/dist/plugin-sdk/browser-support.js +0 -44
  1794. package/dist/plugin-sdk/browser.js +0 -15
  1795. package/dist/plugin-sdk/byteplus.js +0 -17
  1796. package/dist/plugin-sdk/channel-actions.js +0 -3
  1797. package/dist/plugin-sdk/channel-config-helpers.js +0 -2
  1798. package/dist/plugin-sdk/channel-config-primitives.js +0 -4
  1799. package/dist/plugin-sdk/channel-config-schema.js +0 -7
  1800. package/dist/plugin-sdk/channel-config-writes.js +0 -3
  1801. package/dist/plugin-sdk/channel-contract.js +0 -1
  1802. package/dist/plugin-sdk/channel-feedback.js +0 -5
  1803. package/dist/plugin-sdk/channel-inbound.js +0 -10
  1804. package/dist/plugin-sdk/channel-lifecycle.js +0 -3
  1805. package/dist/plugin-sdk/channel-pairing.js +0 -2
  1806. package/dist/plugin-sdk/channel-policy.js +0 -6
  1807. package/dist/plugin-sdk/channel-reply-pipeline.js +0 -2
  1808. package/dist/plugin-sdk/channel-runtime.js +0 -16
  1809. package/dist/plugin-sdk/channel-send-result.js +0 -2
  1810. package/dist/plugin-sdk/channel-setup.js +0 -5
  1811. package/dist/plugin-sdk/channel-status.js +0 -5
  1812. package/dist/plugin-sdk/channel-targets.js +0 -5
  1813. package/dist/plugin-sdk/chutes.js +0 -20
  1814. package/dist/plugin-sdk/cli-backend.js +0 -3
  1815. package/dist/plugin-sdk/cli-runtime.js +0 -7
  1816. package/dist/plugin-sdk/cloudflare-ai-gateway.js +0 -18
  1817. package/dist/plugin-sdk/collection-runtime.js +0 -3
  1818. package/dist/plugin-sdk/command-auth-native.js +0 -6
  1819. package/dist/plugin-sdk/command-auth.js +0 -14
  1820. package/dist/plugin-sdk/command-detection.js +0 -3
  1821. package/dist/plugin-sdk/command-surface.js +0 -3
  1822. package/dist/plugin-sdk/compat.js +0 -35
  1823. package/dist/plugin-sdk/config-runtime.js +0 -25
  1824. package/dist/plugin-sdk/conversation-runtime.js +0 -15
  1825. package/dist/plugin-sdk/core.js +0 -22
  1826. package/dist/plugin-sdk/dangerous-name-runtime.js +0 -3
  1827. package/dist/plugin-sdk/deepseek.js +0 -14
  1828. package/dist/plugin-sdk/device-bootstrap.js +0 -4
  1829. package/dist/plugin-sdk/diagnostic-runtime.js +0 -4
  1830. package/dist/plugin-sdk/diagnostics-otel.js +0 -6
  1831. package/dist/plugin-sdk/diffs.js +0 -4
  1832. package/dist/plugin-sdk/direct-dm.js +0 -2
  1833. package/dist/plugin-sdk/directory-runtime.js +0 -5
  1834. package/dist/plugin-sdk/discord-account.js +0 -2
  1835. package/dist/plugin-sdk/discord-core.js +0 -9
  1836. package/dist/plugin-sdk/discord-runtime-surface.js +0 -2
  1837. package/dist/plugin-sdk/discord-session-key.js +0 -2
  1838. package/dist/plugin-sdk/discord-surface.js +0 -2
  1839. package/dist/plugin-sdk/discord-thread-bindings.js +0 -2
  1840. package/dist/plugin-sdk/discord-timeouts.js +0 -2
  1841. package/dist/plugin-sdk/discord.js +0 -21
  1842. package/dist/plugin-sdk/error-runtime.js +0 -3
  1843. package/dist/plugin-sdk/extension-shared.js +0 -3
  1844. package/dist/plugin-sdk/feishu-conversation.js +0 -2
  1845. package/dist/plugin-sdk/feishu-setup.js +0 -2
  1846. package/dist/plugin-sdk/feishu.js +0 -34
  1847. package/dist/plugin-sdk/fetch-runtime.js +0 -7
  1848. package/dist/plugin-sdk/file-lock.js +0 -2
  1849. package/dist/plugin-sdk/gateway-runtime.js +0 -4
  1850. package/dist/plugin-sdk/github-copilot-login.js +0 -2
  1851. package/dist/plugin-sdk/github-copilot-token.js +0 -3
  1852. package/dist/plugin-sdk/global-singleton.js +0 -4
  1853. package/dist/plugin-sdk/google.js +0 -2
  1854. package/dist/plugin-sdk/googlechat.js +0 -38
  1855. package/dist/plugin-sdk/group-access.js +0 -2
  1856. package/dist/plugin-sdk/hook-runtime.js +0 -4
  1857. package/dist/plugin-sdk/host-runtime.js +0 -4
  1858. package/dist/plugin-sdk/huggingface.js +0 -18
  1859. package/dist/plugin-sdk/image-generation-core.js +0 -63
  1860. package/dist/plugin-sdk/image-generation.js +0 -2
  1861. package/dist/plugin-sdk/index.js +0 -5
  1862. package/dist/plugin-sdk/infra-runtime.js +0 -45
  1863. package/dist/plugin-sdk/interactive-runtime.js +0 -4
  1864. package/dist/plugin-sdk/irc-surface.js +0 -2
  1865. package/dist/plugin-sdk/irc.js +0 -30
  1866. package/dist/plugin-sdk/json-store.js +0 -3
  1867. package/dist/plugin-sdk/keyed-async-queue.js +0 -2
  1868. package/dist/plugin-sdk/kilocode.js +0 -23
  1869. package/dist/plugin-sdk/kimi-coding.js +0 -11
  1870. package/dist/plugin-sdk/lazy-runtime.js +0 -3
  1871. package/dist/plugin-sdk/line-core.js +0 -6
  1872. package/dist/plugin-sdk/line-runtime.js +0 -2
  1873. package/dist/plugin-sdk/line-surface.js +0 -2
  1874. package/dist/plugin-sdk/line.js +0 -9
  1875. package/dist/plugin-sdk/llm-task.js +0 -6
  1876. package/dist/plugin-sdk/logging-core.js +0 -5
  1877. package/dist/plugin-sdk/markdown-table-runtime.js +0 -3
  1878. package/dist/plugin-sdk/matrix-helper.js +0 -2
  1879. package/dist/plugin-sdk/matrix-runtime-heavy.js +0 -5
  1880. package/dist/plugin-sdk/matrix-runtime-shared.js +0 -3
  1881. package/dist/plugin-sdk/matrix-runtime-surface.js +0 -2
  1882. package/dist/plugin-sdk/matrix-surface.js +0 -2
  1883. package/dist/plugin-sdk/matrix-thread-bindings.js +0 -2
  1884. package/dist/plugin-sdk/matrix.js +0 -53
  1885. package/dist/plugin-sdk/mattermost-policy.js +0 -11
  1886. package/dist/plugin-sdk/mattermost.js +0 -41
  1887. package/dist/plugin-sdk/media-runtime.js +0 -17
  1888. package/dist/plugin-sdk/media-understanding-runtime.js +0 -2
  1889. package/dist/plugin-sdk/media-understanding.js +0 -3
  1890. package/dist/plugin-sdk/memory-core-engine-runtime.js +0 -2
  1891. package/dist/plugin-sdk/memory-core-host-engine-embeddings.js +0 -6
  1892. package/dist/plugin-sdk/memory-core-host-engine-foundation.js +0 -17
  1893. package/dist/plugin-sdk/memory-core-host-engine-qmd.js +0 -3
  1894. package/dist/plugin-sdk/memory-core-host-engine-storage.js +0 -4
  1895. package/dist/plugin-sdk/memory-core-host-multimodal.js +0 -3
  1896. package/dist/plugin-sdk/memory-core-host-query.js +0 -3
  1897. package/dist/plugin-sdk/memory-core-host-runtime-cli.js +0 -12
  1898. package/dist/plugin-sdk/memory-core-host-runtime-core.js +0 -14
  1899. package/dist/plugin-sdk/memory-core-host-runtime-files.js +0 -4
  1900. package/dist/plugin-sdk/memory-core-host-secret.js +0 -3
  1901. package/dist/plugin-sdk/memory-core-host-status.js +0 -2
  1902. package/dist/plugin-sdk/memory-core.js +0 -29
  1903. package/dist/plugin-sdk/memory-lancedb.js +0 -4
  1904. package/dist/plugin-sdk/minimax.js +0 -24
  1905. package/dist/plugin-sdk/mistral.js +0 -17
  1906. package/dist/plugin-sdk/models-provider-runtime.js +0 -3
  1907. package/dist/plugin-sdk/modelstudio-definitions.js +0 -19
  1908. package/dist/plugin-sdk/modelstudio.js +0 -24
  1909. package/dist/plugin-sdk/moonshot.js +0 -17
  1910. package/dist/plugin-sdk/msteams.js +0 -46
  1911. package/dist/plugin-sdk/native-command-registry.js +0 -3
  1912. package/dist/plugin-sdk/nextcloud-talk.js +0 -35
  1913. package/dist/plugin-sdk/nostr.js +0 -14
  1914. package/dist/plugin-sdk/nvidia.js +0 -11
  1915. package/dist/plugin-sdk/ollama-surface.js +0 -24
  1916. package/dist/plugin-sdk/ollama.js +0 -2
  1917. package/dist/plugin-sdk/openai.js +0 -2
  1918. package/dist/plugin-sdk/opencode-go.js +0 -14
  1919. package/dist/plugin-sdk/opencode.js +0 -15
  1920. package/dist/plugin-sdk/outbound-runtime.js +0 -5
  1921. package/dist/plugin-sdk/param-readers.js +0 -3
  1922. package/dist/plugin-sdk/plugin-entry.js +0 -3
  1923. package/dist/plugin-sdk/plugin-runtime.js +0 -8
  1924. package/dist/plugin-sdk/process-runtime.js +0 -3
  1925. package/dist/plugin-sdk/provider-auth-api-key.js +0 -9
  1926. package/dist/plugin-sdk/provider-auth-login.js +0 -2
  1927. package/dist/plugin-sdk/provider-auth-result.js +0 -2
  1928. package/dist/plugin-sdk/provider-auth-runtime.js +0 -5
  1929. package/dist/plugin-sdk/provider-auth.js +0 -17
  1930. package/dist/plugin-sdk/provider-catalog-shared.js +0 -2
  1931. package/dist/plugin-sdk/provider-entry.js +0 -2
  1932. package/dist/plugin-sdk/provider-env-vars.js +0 -3
  1933. package/dist/plugin-sdk/provider-http.js +0 -6
  1934. package/dist/plugin-sdk/provider-model-shared.js +0 -5
  1935. package/dist/plugin-sdk/provider-moonshot.js +0 -3
  1936. package/dist/plugin-sdk/provider-onboard.js +0 -3
  1937. package/dist/plugin-sdk/provider-setup.js +0 -3
  1938. package/dist/plugin-sdk/provider-stream.js +0 -4
  1939. package/dist/plugin-sdk/provider-tools.js +0 -2
  1940. package/dist/plugin-sdk/provider-usage.js +0 -3
  1941. package/dist/plugin-sdk/provider-web-fetch.js +0 -6
  1942. package/dist/plugin-sdk/provider-web-search.js +0 -7
  1943. package/dist/plugin-sdk/provider-zai-endpoint.js +0 -2
  1944. package/dist/plugin-sdk/qianfan.js +0 -13
  1945. package/dist/plugin-sdk/reply-chunking.js +0 -4
  1946. package/dist/plugin-sdk/reply-dispatch-runtime.js +0 -5
  1947. package/dist/plugin-sdk/reply-history.js +0 -3
  1948. package/dist/plugin-sdk/reply-payload.js +0 -2
  1949. package/dist/plugin-sdk/reply-runtime.js +0 -14
  1950. package/dist/plugin-sdk/request-url.js +0 -2
  1951. package/dist/plugin-sdk/retry-runtime.js +0 -4
  1952. package/dist/plugin-sdk/root-alias.cjs +0 -347
  1953. package/dist/plugin-sdk/routing.js +0 -9
  1954. package/dist/plugin-sdk/runtime-config-snapshot.js +0 -3
  1955. package/dist/plugin-sdk/runtime-env.js +0 -17
  1956. package/dist/plugin-sdk/runtime-group-policy.js +0 -3
  1957. package/dist/plugin-sdk/runtime-store.js +0 -2
  1958. package/dist/plugin-sdk/runtime.js +0 -9
  1959. package/dist/plugin-sdk/sandbox.js +0 -6
  1960. package/dist/plugin-sdk/secret-input.js +0 -4
  1961. package/dist/plugin-sdk/security-runtime.js +0 -6
  1962. package/dist/plugin-sdk/self-hosted-provider-setup.js +0 -2
  1963. package/dist/plugin-sdk/session-store-runtime.js +0 -4
  1964. package/dist/plugin-sdk/setup-adapter-runtime.js +0 -3
  1965. package/dist/plugin-sdk/setup-runtime.js +0 -6
  1966. package/dist/plugin-sdk/setup-tools.js +0 -6
  1967. package/dist/plugin-sdk/setup.js +0 -13
  1968. package/dist/plugin-sdk/sglang.js +0 -15
  1969. package/dist/plugin-sdk/signal-account.js +0 -2
  1970. package/dist/plugin-sdk/signal-surface.js +0 -2
  1971. package/dist/plugin-sdk/signal.js +0 -24
  1972. package/dist/plugin-sdk/skill-commands-runtime.js +0 -3
  1973. package/dist/plugin-sdk/slack-account.js +0 -2
  1974. package/dist/plugin-sdk/slack-core.js +0 -7
  1975. package/dist/plugin-sdk/slack-runtime-surface.js +0 -2
  1976. package/dist/plugin-sdk/slack-surface.js +0 -2
  1977. package/dist/plugin-sdk/slack-target-parser.js +0 -2
  1978. package/dist/plugin-sdk/slack-targets.js +0 -3
  1979. package/dist/plugin-sdk/slack.js +0 -20
  1980. package/dist/plugin-sdk/speech-core.js +0 -4
  1981. package/dist/plugin-sdk/speech-runtime.js +0 -2
  1982. package/dist/plugin-sdk/speech.js +0 -5
  1983. package/dist/plugin-sdk/ssrf-runtime.js +0 -6
  1984. package/dist/plugin-sdk/state-paths.js +0 -3
  1985. package/dist/plugin-sdk/status-helpers.js +0 -4
  1986. package/dist/plugin-sdk/string-normalization-runtime.js +0 -3
  1987. package/dist/plugin-sdk/synthetic.js +0 -17
  1988. package/dist/plugin-sdk/telegram-account.js +0 -2
  1989. package/dist/plugin-sdk/telegram-allow-from.js +0 -12
  1990. package/dist/plugin-sdk/telegram-command-config.js +0 -3
  1991. package/dist/plugin-sdk/telegram-core.js +0 -18
  1992. package/dist/plugin-sdk/telegram-surface.js +0 -42
  1993. package/dist/plugin-sdk/temp-path.js +0 -4
  1994. package/dist/plugin-sdk/testing.js +0 -11
  1995. package/dist/plugin-sdk/text-runtime.js +0 -19
  1996. package/dist/plugin-sdk/thread-bindings-runtime.js +0 -4
  1997. package/dist/plugin-sdk/thread-ownership.js +0 -5
  1998. package/dist/plugin-sdk/tlon.js +0 -13
  1999. package/dist/plugin-sdk/together.js +0 -16
  2000. package/dist/plugin-sdk/tool-send.js +0 -2
  2001. package/dist/plugin-sdk/twitch.js +0 -8
  2002. package/dist/plugin-sdk/venice.js +0 -16
  2003. package/dist/plugin-sdk/vllm.js +0 -15
  2004. package/dist/plugin-sdk/voice-call.js +0 -7
  2005. package/dist/plugin-sdk/volcengine.js +0 -17
  2006. package/dist/plugin-sdk/web-media.js +0 -4
  2007. package/dist/plugin-sdk/webhook-ingress.js +0 -9
  2008. package/dist/plugin-sdk/webhook-path.js +0 -2
  2009. package/dist/plugin-sdk/webhook-request-guards.js +0 -3
  2010. package/dist/plugin-sdk/whatsapp-auth-presence.js +0 -2
  2011. package/dist/plugin-sdk/whatsapp-core.js +0 -11
  2012. package/dist/plugin-sdk/whatsapp-shared.js +0 -5
  2013. package/dist/plugin-sdk/whatsapp-surface.js +0 -2
  2014. package/dist/plugin-sdk/whatsapp-targets.js +0 -2
  2015. package/dist/plugin-sdk/windows-spawn.js +0 -2
  2016. package/dist/plugin-sdk/xai.js +0 -27
  2017. package/dist/plugin-sdk/zalo-setup.js +0 -2
  2018. package/dist/plugin-sdk/zalo.js +0 -38
  2019. package/dist/plugin-sdk/zalouser.js +0 -29
  2020. package/dist/plugin-sdk/zod.js +0 -3
  2021. package/dist/plugins/build-smoke-entry.js +0 -4
  2022. package/dist/plugins/provider-runtime.runtime.js +0 -2
  2023. package/dist/plugins/runtime/index.js +0 -2
  2024. package/dist/plugins/runtime/runtime-line.contract.js +0 -23
  2025. package/dist/plugins-DcjzAZWt.js +0 -5
  2026. package/dist/plugins-allowlist-DoZlIC4p.js +0 -14
  2027. package/dist/plugins-cli-G6GhHHD0.js +0 -561
  2028. package/dist/plugins-command-helpers-CIYzoC65.js +0 -116
  2029. package/dist/plugins-install-persist-C5-bJdRb.js +0 -121
  2030. package/dist/plugins-update-command-CsT_saJm.js +0 -974
  2031. package/dist/plugins-w6xUzHby.js +0 -40
  2032. package/dist/pluralkit-B_DWQnc5.js +0 -21
  2033. package/dist/pluralkit-Bez5QVFC.js +0 -2
  2034. package/dist/policy-D6OQdw73.js +0 -173
  2035. package/dist/policy-DXeeH8B2.js +0 -147
  2036. package/dist/poll-params-DTVSSuok.js +0 -52
  2037. package/dist/polls-CMmT0F_y.js +0 -35
  2038. package/dist/port-defaults-Dajs4Obu.js +0 -30
  2039. package/dist/ports-DuU-A86K.js +0 -262
  2040. package/dist/ports-ZA1n2It7.js +0 -432
  2041. package/dist/ports-lsof-Cw_6T7ru.js +0 -25
  2042. package/dist/ports-probe-DeuK48Pq.js +0 -14
  2043. package/dist/preflight-audio-DTSBExi8.js +0 -48
  2044. package/dist/preflight-audio.runtime-BJRLyBvf.js +0 -7
  2045. package/dist/preflight-audio.runtime.js +0 -1
  2046. package/dist/prepare-BQBndJUC.js +0 -1301
  2047. package/dist/probe-BO4hbHvs.js +0 -435
  2048. package/dist/probe-DPv2pfj5.js +0 -1868
  2049. package/dist/probe-DlO2Q9rN.js +0 -170
  2050. package/dist/probe-RbbTQOHx.js +0 -178
  2051. package/dist/probe-auth-Bl9MHtlP.js +0 -2
  2052. package/dist/probe-auth-CUfEH7di.js +0 -63
  2053. package/dist/probe-eYLpFww_.js +0 -137
  2054. package/dist/probe-kfBMuOWF.js +0 -2
  2055. package/dist/probe-wktb4WTP.js +0 -349
  2056. package/dist/probe.runtime-BhbUesak.js +0 -2
  2057. package/dist/probe.runtime.js +0 -1
  2058. package/dist/process-runtime-CBFMzhIk.js +0 -2
  2059. package/dist/process-scoped-map-C7IoOrV-.js +0 -61
  2060. package/dist/profile-B5n9yLlB.js +0 -2
  2061. package/dist/profile-CmsqnPsu.js +0 -107
  2062. package/dist/profile-update-D6f10CZk.js +0 -67
  2063. package/dist/profile-utils-C7uzTwgJ.js +0 -15
  2064. package/dist/profiles-BoNergZo.js +0 -79
  2065. package/dist/program-BuKG0Ntx.js +0 -158
  2066. package/dist/program-context-DDmlbmbl.js +0 -2
  2067. package/dist/program-context-DQOnR5c_.js +0 -10
  2068. package/dist/progress-DQvXYKne.js +0 -132
  2069. package/dist/prompt-COzf5LIJ.js +0 -2
  2070. package/dist/prompt-OSmU-o7R.js +0 -20
  2071. package/dist/prompt-select-styled-yYL3el77.js +0 -6432
  2072. package/dist/prompt-style-DekFM6h7.js +0 -7
  2073. package/dist/prompts-MtRTsZpw.js +0 -9
  2074. package/dist/prototype-keys-DrjhYNcz.js +0 -11
  2075. package/dist/provider-BWTXmDq3.js +0 -3685
  2076. package/dist/provider-BrmcrkEe.js +0 -70
  2077. package/dist/provider-ByBRbhW5.js +0 -7216
  2078. package/dist/provider-api-key-auth-BcyipSdy.js +0 -109
  2079. package/dist/provider-api-key-auth.runtime-BRu_8L4m.js +0 -14
  2080. package/dist/provider-api-key-auth.runtime.js +0 -1
  2081. package/dist/provider-attribution-DMVujx9B.js +0 -285
  2082. package/dist/provider-auth-DK2UmYsZ.js +0 -43
  2083. package/dist/provider-auth-api-key-99KxscjW.js +0 -5
  2084. package/dist/provider-auth-choice-GbHta8Bp.js +0 -134
  2085. package/dist/provider-auth-choice-helpers-CO2MnSGR.js +0 -58
  2086. package/dist/provider-auth-choice-preference-DvAqSMGK.js +0 -44
  2087. package/dist/provider-auth-choice.runtime-B8R63sLq.js +0 -14
  2088. package/dist/provider-auth-choice.runtime-DypTKgMQ.js +0 -2
  2089. package/dist/provider-auth-choice.runtime.js +0 -1
  2090. package/dist/provider-auth-choices-n-JV1XgU.js +0 -65
  2091. package/dist/provider-auth-guidance-DAB9sGGR.js +0 -35
  2092. package/dist/provider-auth-helpers-gmTAji1W.js +0 -92
  2093. package/dist/provider-auth-input-GgY_tjJh.js +0 -116
  2094. package/dist/provider-auth-login-BYbccnB1.js +0 -8
  2095. package/dist/provider-auth-login.runtime-DnSxCwqU.js +0 -196
  2096. package/dist/provider-auth-login.runtime.js +0 -1
  2097. package/dist/provider-auth-mode-Dbja5LLX.js +0 -20
  2098. package/dist/provider-auth-ref-BErMfwCd.js +0 -171
  2099. package/dist/provider-auth-ref-DEF_hE2R.js +0 -2
  2100. package/dist/provider-auth-result-DiUxDF1G.js +0 -31
  2101. package/dist/provider-auth-runtime-BwMq9oMD.js +0 -32
  2102. package/dist/provider-catalog--Qc0q0I-.js +0 -26
  2103. package/dist/provider-catalog-A_s8JQaq.js +0 -18
  2104. package/dist/provider-catalog-B-EcLvBI.js +0 -11
  2105. package/dist/provider-catalog-Bte-HucL.js +0 -44
  2106. package/dist/provider-catalog-C63Rfat7.js +0 -11
  2107. package/dist/provider-catalog-C7q0Vb3S.js +0 -95
  2108. package/dist/provider-catalog-CCnuf8d3.js +0 -49
  2109. package/dist/provider-catalog-CYQ7k_Db.js +0 -48
  2110. package/dist/provider-catalog-CnlB2mMZ.js +0 -11
  2111. package/dist/provider-catalog-CoyAbDZX.js +0 -56
  2112. package/dist/provider-catalog-CtqhFopw.js +0 -48
  2113. package/dist/provider-catalog-CyGxB_aR.js +0 -18
  2114. package/dist/provider-catalog-D1pmWiDQ.js +0 -48
  2115. package/dist/provider-catalog-DGgsalJv.js +0 -12
  2116. package/dist/provider-catalog-DLdTTMmW.js +0 -11
  2117. package/dist/provider-catalog-DZzX7Vwk.js +0 -54
  2118. package/dist/provider-catalog-J2dZciKS.js +0 -11
  2119. package/dist/provider-catalog-LVrcrz-W.js +0 -36
  2120. package/dist/provider-catalog-aIN0QojF.js +0 -11
  2121. package/dist/provider-catalog-shared-Db9nbr1B.js +0 -28
  2122. package/dist/provider-discovery.runtime-BCUAsMMz.js +0 -10
  2123. package/dist/provider-discovery.runtime.js +0 -1
  2124. package/dist/provider-dispatcher-COxXbow_.js +0 -22
  2125. package/dist/provider-entry-CT_YeII_.js +0 -86
  2126. package/dist/provider-env-vars-4Bon7Y2X.js +0 -121
  2127. package/dist/provider-env-vars-Np7qkDjC.js +0 -2
  2128. package/dist/provider-flow-Dlg1GcXQ.js +0 -93
  2129. package/dist/provider-http-DQQ317hc.js +0 -3
  2130. package/dist/provider-id-CHzLB538.js +0 -30
  2131. package/dist/provider-model-defaults-dSPzPas0.js +0 -5
  2132. package/dist/provider-model-primary-D8SgLcOd.js +0 -26
  2133. package/dist/provider-model-shared-GO1WT2fY.js +0 -104
  2134. package/dist/provider-models-BG8YwJaY.js +0 -117
  2135. package/dist/provider-models-BVVCdM8F.js +0 -22
  2136. package/dist/provider-models-D2UZvTo3.js +0 -46
  2137. package/dist/provider-moonshot-Cl8urWHL.js +0 -2
  2138. package/dist/provider-oauth-flow-Bu2gIeX6.js +0 -33
  2139. package/dist/provider-onboard-CTEHTjfw.js +0 -264
  2140. package/dist/provider-openai-codex-oauth-tls-DdLUDuIM.js +0 -101
  2141. package/dist/provider-registry-Ljtt6CKE.js +0 -49
  2142. package/dist/provider-request-config-CIrbwAnR.js +0 -209
  2143. package/dist/provider-runtime-BBFXlsU0.js +0 -2
  2144. package/dist/provider-runtime-D_itmv9t.js +0 -291
  2145. package/dist/provider-runtime.runtime-B_oC992d.js +0 -26
  2146. package/dist/provider-runtime.runtime.js +0 -1
  2147. package/dist/provider-self-hosted-setup-BlNrSREL.js +0 -272
  2148. package/dist/provider-session.runtime-DQyRV-t3.js +0 -7
  2149. package/dist/provider-session.runtime.js +0 -1
  2150. package/dist/provider-setup-CSrOyU04.js +0 -2
  2151. package/dist/provider-stream-m5D8QZPz.js +0 -289
  2152. package/dist/provider-tools-NuJzTqa1.js +0 -37
  2153. package/dist/provider-usage-BB5mQ8Fg.js +0 -3
  2154. package/dist/provider-usage-CbPs3eFQ.js +0 -2
  2155. package/dist/provider-usage-DG1gff_M.js +0 -375
  2156. package/dist/provider-usage.fetch-DHWQ4YZu.js +0 -633
  2157. package/dist/provider-web-fetch-QzED2vth.js +0 -5
  2158. package/dist/provider-web-search-CVMEZcl8.js +0 -306
  2159. package/dist/provider-wizard-B0ocsg3q.js +0 -209
  2160. package/dist/provider-zai-endpoint-DoIy5HQf.js +0 -116
  2161. package/dist/provider.runtime-jHt6447e.js +0 -2
  2162. package/dist/provider.runtime.js +0 -1
  2163. package/dist/providers-DUy2TaM-.js +0 -59
  2164. package/dist/providers.runtime-Bz0X8DZ2.js +0 -60
  2165. package/dist/providers.runtime.js +0 -1
  2166. package/dist/proxy-env-D4H9qI5l.js +0 -40
  2167. package/dist/proxy-fetch-DiyTLcAR.js +0 -55
  2168. package/dist/proxy-hcRRmsDd.js +0 -121
  2169. package/dist/pw-ai-Cp64-UGh.js +0 -2037
  2170. package/dist/qmd-manager-D2rMomsU.js +0 -1740
  2171. package/dist/qr-cli-DuANCi-n.js +0 -2
  2172. package/dist/qr-cli-lr5CcLr8.js +0 -367
  2173. package/dist/qr-image-DOcoqAUw.js +0 -2
  2174. package/dist/query-expansion-85HlYbKD.js +0 -633
  2175. package/dist/queue-CtO0M_P1.js +0 -663
  2176. package/dist/reaction-runtime-api-B4KmfKtJ.js +0 -114
  2177. package/dist/reactions-5N2KSGJ2.js +0 -258
  2178. package/dist/read-only-account-inspect-Y_ijOKJ3.js +0 -9
  2179. package/dist/read-only-account-inspect.telegram-BSjjDWnM.js +0 -202
  2180. package/dist/reasoning-tags-CAmbBXLr.js +0 -77
  2181. package/dist/recovery-key-store-DqgdfMc7.js +0 -283
  2182. package/dist/redact-BDinS1q9.js +0 -102
  2183. package/dist/redact-identifier-S69DDJn1.js +0 -13
  2184. package/dist/redact-sensitive-url-CAJSZ_7g.js +0 -50
  2185. package/dist/redirect-headers-CGxONG_L.js +0 -25
  2186. package/dist/ref-contract-CC5BLDoS.js +0 -53
  2187. package/dist/region-BFGEM88n.js +0 -62
  2188. package/dist/register-lazy-command-D6EEI-zz.js +0 -43
  2189. package/dist/register.agent-D1eKwVU7.js +0 -239
  2190. package/dist/register.backup-S8hwHpZL.js +0 -236
  2191. package/dist/register.configure-CJrQ3u9y.js +0 -15
  2192. package/dist/register.maintenance-BrKWl7_D.js +0 -449
  2193. package/dist/register.message-BCWJfH2h.js +0 -642
  2194. package/dist/register.onboard-zzNq0pJS.js +0 -79
  2195. package/dist/register.setup-BLQwDKzc.js +0 -104
  2196. package/dist/register.status-health-sessions-B4TUEudf.js +0 -1206
  2197. package/dist/register.subclis-B0pG22H2.js +0 -295
  2198. package/dist/register.subclis-BEM0mzJb.js +0 -3
  2199. package/dist/registry-ByjnKj3u.js +0 -219
  2200. package/dist/registry-CuFNdbH5.js +0 -60
  2201. package/dist/registry-DvqOrcbF.js +0 -675
  2202. package/dist/registry-mVzzlPf7.js +0 -50
  2203. package/dist/repair-IMBZnz-L.js +0 -112
  2204. package/dist/replies-BCoZ2HxY.js +0 -118
  2205. package/dist/reply-D8bUQd-Q.js +0 -3176
  2206. package/dist/reply-blocks-CjCUTZru.js +0 -103
  2207. package/dist/reply-chunking-CxFd5izq.js +0 -3
  2208. package/dist/reply-dispatch-runtime-Bk9RDzB9.js +0 -3
  2209. package/dist/reply-history-DtTaPEgt.js +0 -2
  2210. package/dist/reply-payload-CRYI4jIB.js +0 -232
  2211. package/dist/reply-payloads-CQXH7ury.js +0 -116
  2212. package/dist/reply-payloads-dedupe-BKObDjVe.js +0 -135
  2213. package/dist/reply-payloads-dedupe.runtime-SbVNMvEs.js +0 -2
  2214. package/dist/reply-payloads-dedupe.runtime.js +0 -1
  2215. package/dist/reply-prefix-Eema_xXG.js +0 -39
  2216. package/dist/reply-runtime-DUrpJTzu.js +0 -123
  2217. package/dist/reply.runtime-Cdb_6NI1.js +0 -2
  2218. package/dist/reply.runtime.js +0 -1
  2219. package/dist/request-url-B8k-YRRH.js +0 -10
  2220. package/dist/resolve-C3pJ2gj_.js +0 -174
  2221. package/dist/resolve-C_pCWwC0.js +0 -619
  2222. package/dist/resolve-allowlist-HrJ_3icS.js +0 -147
  2223. package/dist/resolve-cbCi7mbs.js +0 -2
  2224. package/dist/resolve-channels-BTyErRev.js +0 -226
  2225. package/dist/resolve-channels-DvV-fUQv.js +0 -263
  2226. package/dist/resolve-configured-secret-input-string-BasQGOd9.js +0 -112
  2227. package/dist/resolve-route-EE8E7OAF.js +0 -486
  2228. package/dist/resolve-system-bin-TC907QYo.js +0 -120
  2229. package/dist/resolve-targets-B1MvBWpT.js +0 -280
  2230. package/dist/resolve-users-BfVoBZG_.js +0 -145
  2231. package/dist/resolve-utils-ClmKSkEQ.js +0 -102
  2232. package/dist/response-generator-ACP21F1j.js +0 -153
  2233. package/dist/response-prefix-template-Cp4tg6Qw.js +0 -50
  2234. package/dist/restart-sentinel-B3EigRIb.js +0 -70
  2235. package/dist/restart-stale-pids-dsB3eE6_.js +0 -187
  2236. package/dist/retry-CIAqcw7C.js +0 -76
  2237. package/dist/retry-policy-BJ5Q68It.js +0 -58
  2238. package/dist/retry-runtime-Cbu5zDnX.js +0 -3
  2239. package/dist/rooms-B1IyUfuR.js +0 -325
  2240. package/dist/root-help-Bwa-vlhy.js +0 -53
  2241. package/dist/route-reply-bC07YRDb.js +0 -133
  2242. package/dist/route-reply.runtime-dS2XMwkv.js +0 -2
  2243. package/dist/route-reply.runtime.js +0 -1
  2244. package/dist/route-resolution-DQHmIfWN.js +0 -461
  2245. package/dist/routes-CWXihJFR.js +0 -6884
  2246. package/dist/routing-BVt9nMN-.js +0 -16
  2247. package/dist/rpc-5eaI-FsF.js +0 -67
  2248. package/dist/rpc-context-Dimdo4io.js +0 -155
  2249. package/dist/run-command-2jxKF1a6.js +0 -32
  2250. package/dist/run-main-BKeNUaXq.js +0 -425
  2251. package/dist/run-with-concurrency-DGLkItan.js +0 -41
  2252. package/dist/runner-COmi-bB0.js +0 -1479
  2253. package/dist/runs-CX-70k4f.js +0 -616
  2254. package/dist/runtime-1phb9iVo.js +0 -6
  2255. package/dist/runtime-B8hqEtu6.js +0 -181
  2256. package/dist/runtime-BpHrcXgA.js +0 -5
  2257. package/dist/runtime-BscSIjIL.js +0 -126
  2258. package/dist/runtime-C8qvwPYG.js +0 -286
  2259. package/dist/runtime-CBX_rq4O.js +0 -18
  2260. package/dist/runtime-CC1YDOst.js +0 -5
  2261. package/dist/runtime-CIE7xJwu.js +0 -5
  2262. package/dist/runtime-CNZi_czi.js +0 -42
  2263. package/dist/runtime-CPw-0dWW.js +0 -5
  2264. package/dist/runtime-DXdxDbJm.js +0 -102
  2265. package/dist/runtime-DofOSZ5U.js +0 -2153
  2266. package/dist/runtime-api-B4Zb5p1_.js +0 -2
  2267. package/dist/runtime-api-BB2RZPnq.js +0 -2
  2268. package/dist/runtime-api-BJnw1_pK.js +0 -2
  2269. package/dist/runtime-api-BTf2rLCn.js +0 -2
  2270. package/dist/runtime-api-BTgAUySz.js +0 -2
  2271. package/dist/runtime-api-BVftCkYc.js +0 -2484
  2272. package/dist/runtime-api-BWaVsvsK.js +0 -14
  2273. package/dist/runtime-api-BXlE282E.js +0 -2
  2274. package/dist/runtime-api-Ba7wWBWO.js +0 -1
  2275. package/dist/runtime-api-BfZqvwkY.js +0 -2
  2276. package/dist/runtime-api-Bja3afzd.js +0 -3676
  2277. package/dist/runtime-api-C7cX3f2r.js +0 -2
  2278. package/dist/runtime-api-CCKblcQO.js +0 -81
  2279. package/dist/runtime-api-CEmQSooZ.js +0 -2
  2280. package/dist/runtime-api-CWQMIahu.js +0 -241
  2281. package/dist/runtime-api-Ch1E1gvT.js +0 -2
  2282. package/dist/runtime-api-CjgyJEjn.js +0 -2
  2283. package/dist/runtime-api-CuqnElJG.js +0 -3
  2284. package/dist/runtime-api-DOyNJNHi.js +0 -2
  2285. package/dist/runtime-api-DUbp7oPz.js +0 -2
  2286. package/dist/runtime-api-DZDDizAj.js +0 -1
  2287. package/dist/runtime-api-DZcQIyI0.js +0 -1
  2288. package/dist/runtime-api-Di-XE7J4.js +0 -3
  2289. package/dist/runtime-api-Dq7rdsm6.js +0 -2
  2290. package/dist/runtime-api-DxO7sIvA.js +0 -120
  2291. package/dist/runtime-api-Dzz1aWyq.js +0 -29
  2292. package/dist/runtime-api-_dg5Me1l.js +0 -2
  2293. package/dist/runtime-config-snapshot-DqWNFIej.js +0 -2
  2294. package/dist/runtime-d8L2hZ57.js +0 -5
  2295. package/dist/runtime-discord-ops.runtime-C2o0995d.js +0 -25
  2296. package/dist/runtime-discord-ops.runtime.js +0 -1
  2297. package/dist/runtime-embedded-pi.runtime-Bk8vHdbc.js +0 -2
  2298. package/dist/runtime-embedded-pi.runtime.js +0 -1
  2299. package/dist/runtime-entry-BypP0hpR.js +0 -4925
  2300. package/dist/runtime-env-SHKgcATc.js +0 -9
  2301. package/dist/runtime-forwarders-ev8FdVyV.js +0 -44
  2302. package/dist/runtime-group-policy-DXJJCWpk.js +0 -1
  2303. package/dist/runtime-group-policy-zTp8fKRK.js +0 -59
  2304. package/dist/runtime-guard-78ESz4Qy.js +0 -70
  2305. package/dist/runtime-kS8e4c6-.js +0 -125
  2306. package/dist/runtime-media-understanding.runtime-CpPWzWdQ.js +0 -2
  2307. package/dist/runtime-media-understanding.runtime.js +0 -1
  2308. package/dist/runtime-model-auth.runtime-1Gsp1j1n.js +0 -2
  2309. package/dist/runtime-model-auth.runtime.js +0 -1
  2310. package/dist/runtime-parse-vvG9x7Ps.js +0 -83
  2311. package/dist/runtime-paths-NiQSNveu.js +0 -305
  2312. package/dist/runtime-plugin-boundary-CzRNh2jW.js +0 -65
  2313. package/dist/runtime-schema-uKXWjWrD.js +0 -14440
  2314. package/dist/runtime-slack-ops.runtime-MQwSRdp3.js +0 -15
  2315. package/dist/runtime-slack-ops.runtime.js +0 -1
  2316. package/dist/runtime-status-2omGgKaM.js +0 -109
  2317. package/dist/runtime-status-Cc383GkB.js +0 -15
  2318. package/dist/runtime-store-CT3yRBe_.js +0 -22
  2319. package/dist/runtime-tts.runtime-DTfPYn3H.js +0 -2
  2320. package/dist/runtime-tts.runtime.js +0 -1
  2321. package/dist/runtime-uvckmk15.js +0 -68
  2322. package/dist/runtime-web-tools-Cf6BXnCm.js +0 -2042
  2323. package/dist/runtime-whatsapp-boundary-Bs8RrKxP.js +0 -139
  2324. package/dist/runtime-whatsapp-boundary-C5mx67ac.js +0 -2
  2325. package/dist/safe-regex-tLlDZYfM.js +0 -244
  2326. package/dist/safe-text-DhIQbZid.js +0 -16
  2327. package/dist/sandbox-DkZ4-LBj.js +0 -4
  2328. package/dist/sandbox-cli-Cho_k3dA.js +0 -443
  2329. package/dist/sandbox-f4-hZNCj.js +0 -2710
  2330. package/dist/sandbox-paths-Br54mtAJ.js +0 -146
  2331. package/dist/sanitize-env-vars-BpNLWkzd.js +0 -82
  2332. package/dist/scan-paths-Bln7l19-.js +0 -28
  2333. package/dist/schema-validator-DofqBvJi.js +0 -176
  2334. package/dist/scoped-expiring-id-cache-C8wyKEV-.js +0 -35
  2335. package/dist/scp-host-B9NPcVwn.js +0 -62
  2336. package/dist/sdk-Ba91_ru8.js +0 -1108
  2337. package/dist/searxng-search-provider-CUEJoeaQ.js +0 -220
  2338. package/dist/secret-equal-fMR1DjSl.js +0 -9
  2339. package/dist/secret-file-BNKBIds0.js +0 -11
  2340. package/dist/secret-file-DwDmPLSX.js +0 -92
  2341. package/dist/secret-input-4MqmO__N.js +0 -13
  2342. package/dist/secret-input-Bqf5ho4v.js +0 -38
  2343. package/dist/secret-input-DyzcNLLY.js +0 -2
  2344. package/dist/secrets-cli-DAP4hi4r.js +0 -2112
  2345. package/dist/secure-random-Diy9rj1m.js +0 -20
  2346. package/dist/security-cli-2WQVKZ3w.js +0 -477
  2347. package/dist/security-runtime-BSQDlFPi.js +0 -55
  2348. package/dist/semver-compare-DkYCMcwG.js +0 -53
  2349. package/dist/send--GwzHbbI.js +0 -100
  2350. package/dist/send-4ZItW1GB.js +0 -3
  2351. package/dist/send-B1YVZR_q.js +0 -1076
  2352. package/dist/send-B6AgLKhw.js +0 -178
  2353. package/dist/send-CAosrV3E.js +0 -2
  2354. package/dist/send-CTHiX-WN.js +0 -442
  2355. package/dist/send-CywIIzow.js +0 -318
  2356. package/dist/send-DZ2VaVTD.js +0 -856
  2357. package/dist/send-deps-Cuc-dTy5.js +0 -19
  2358. package/dist/send-policy-Dz5lteoO.js +0 -60
  2359. package/dist/send-q09VUMe3.js +0 -532
  2360. package/dist/send.components-Cbi5ixnJ.js +0 -844
  2361. package/dist/send.components-dLe6ppiS.js +0 -2
  2362. package/dist/server-BRW1HQ2M.js +0 -67
  2363. package/dist/server-Clq20rV8.js +0 -27990
  2364. package/dist/server-middleware-Ubw3OFd1.js +0 -108
  2365. package/dist/server-node-events-kgWhdE2I.js +0 -454
  2366. package/dist/server-startup-matrix-migration-DJZgJiUa.js +0 -1348
  2367. package/dist/service-2O78fADl.js +0 -867
  2368. package/dist/service-BCUDr0mF.js +0 -2
  2369. package/dist/session-BIwHn1FL.js +0 -137
  2370. package/dist/session-BJudz6Rb.js +0 -50
  2371. package/dist/session-archive.runtime-8FrIp7MP.js +0 -2
  2372. package/dist/session-archive.runtime.js +0 -1
  2373. package/dist/session-binding-service-D7bUc7mS.js +0 -421
  2374. package/dist/session-context-DbS6R7x0.js +0 -23
  2375. package/dist/session-conversation-5Z-WApq_.js +0 -15
  2376. package/dist/session-conversation-BC-SPGma.js +0 -135
  2377. package/dist/session-conversation-D-Olnomz.js +0 -27
  2378. package/dist/session-cost-usage-5iS5N1Rs.js +0 -651
  2379. package/dist/session-cost-usage-ibiGeH7Z.js +0 -2
  2380. package/dist/session-envelope-RE_1D3fZ.js +0 -18
  2381. package/dist/session-errors-CoC2qhLC.js +0 -63
  2382. package/dist/session-file-CnTnoAyl.js +0 -120
  2383. package/dist/session-fork.runtime-Bb9nNLwX.js +0 -50
  2384. package/dist/session-fork.runtime.js +0 -1
  2385. package/dist/session-hooks-D4zcaOKV.js +0 -109
  2386. package/dist/session-key-CQMUjsSp.js +0 -52
  2387. package/dist/session-key-Do__tq1E.js +0 -279
  2388. package/dist/session-key-normalization-BamCBtxj.js +0 -22
  2389. package/dist/session-override-CHm5auQy.js +0 -100
  2390. package/dist/session-reset-model.runtime-DD5SooaH.js +0 -119
  2391. package/dist/session-reset-model.runtime.js +0 -1
  2392. package/dist/session-route-O1Pb7Oid.js +0 -91
  2393. package/dist/session-store-runtime-ePmbOWO1.js +0 -2
  2394. package/dist/session-subagent-reactivation.runtime-BwUDVflj.js +0 -2
  2395. package/dist/session-subagent-reactivation.runtime.js +0 -1
  2396. package/dist/session-transcript-files.fs-CyBs2u56.js +0 -149
  2397. package/dist/session-updates-C33bkLCm.js +0 -222
  2398. package/dist/session-updates.runtime-BHLQJ71D.js +0 -2
  2399. package/dist/session-updates.runtime.js +0 -1
  2400. package/dist/session-utils-C0HJP9m_.js +0 -1743
  2401. package/dist/session-write-lock-C7svKLqX.js +0 -343
  2402. package/dist/sessions-CkaONOVi.js +0 -224
  2403. package/dist/sessions-Dqj9fL_x.js +0 -2
  2404. package/dist/sessions-j2hbBGOS.js +0 -443
  2405. package/dist/setup-0GrDtpRN.js +0 -427
  2406. package/dist/setup-BrOJEPVN.js +0 -15
  2407. package/dist/setup-adapter-runtime-CyIIvoms.js +0 -2
  2408. package/dist/setup-api-1P88M5pV.js +0 -2
  2409. package/dist/setup-binary-CXmsVXWb.js +0 -2
  2410. package/dist/setup-bootstrap-QdrIAyis.js +0 -54
  2411. package/dist/setup-core-BqPbreVF.js +0 -256
  2412. package/dist/setup-core-CFzSqpD7.js +0 -256
  2413. package/dist/setup-core-DJHWTJKX.js +0 -383
  2414. package/dist/setup-core-DT1fK9yD.js +0 -146
  2415. package/dist/setup-core-kjYyNYvv.js +0 -48
  2416. package/dist/setup-core-t03VZdcn.js +0 -160
  2417. package/dist/setup-group-access-BQbnTk8B.js +0 -70
  2418. package/dist/setup-helpers-0yWIq2cW.js +0 -390
  2419. package/dist/setup-runtime-BChXvJOO.js +0 -4
  2420. package/dist/setup-surface-B8loJ-nJ.js +0 -272
  2421. package/dist/setup-surface-BKizDP2g.js +0 -237
  2422. package/dist/setup-surface-BOd4V0w5.js +0 -261
  2423. package/dist/setup-surface-BaLQtvFW.js +0 -353
  2424. package/dist/setup-surface-Bha7U86Z.js +0 -72
  2425. package/dist/setup-surface-BkHkduRm.js +0 -450
  2426. package/dist/setup-surface-CDfudYpT2.js +0 -261
  2427. package/dist/setup-surface-CT-Erp53.js +0 -346
  2428. package/dist/setup-surface-Co1jSLDk.js +0 -656
  2429. package/dist/setup-surface-D0joW4q1.js +0 -333
  2430. package/dist/setup-surface-D9rWJb4Z.js +0 -1447
  2431. package/dist/setup-surface-D_CJfyJ1.js +0 -381
  2432. package/dist/setup-surface-DbVJ8CAj.js +0 -484
  2433. package/dist/setup-surface-Di1q12ha.js +0 -97
  2434. package/dist/setup-surface-LWupQ_eL.js +0 -304
  2435. package/dist/setup-tools-Cb6PLN3L.js +0 -4
  2436. package/dist/setup-wizard-helpers-CA5yiprq.js +0 -841
  2437. package/dist/setup-wizard-proxy-bmMo6OPA.js +0 -127
  2438. package/dist/setup.finalize-DvGlwfbU.js +0 -443
  2439. package/dist/setup.gateway-config-D_eSo_Jz.js +0 -246
  2440. package/dist/setup.secret-input-BAQnay16.js +0 -25
  2441. package/dist/shared-1nXP7RAM.js +0 -78
  2442. package/dist/shared-6u4-kP5J.js +0 -221
  2443. package/dist/shared-BnSR7joQ.js +0 -144
  2444. package/dist/shared-BsLpgVLV.js +0 -37
  2445. package/dist/shared-C-PSF7Rv.js +0 -64
  2446. package/dist/shared-C1MrVu4M.js +0 -180
  2447. package/dist/shared-CA8QQ_O5.js +0 -94
  2448. package/dist/shared-CCV62W5K.js +0 -2
  2449. package/dist/shared-CHJjz6Zz.js +0 -72
  2450. package/dist/shared-CK49TKED.js +0 -50
  2451. package/dist/shared-CL7I4ij0.js +0 -160
  2452. package/dist/shared-Cr7ijuS4.js +0 -198
  2453. package/dist/shared-D61IX915.js +0 -10
  2454. package/dist/shared-Dr9OQu4c.js +0 -64
  2455. package/dist/shared-DwxV-O-g.js +0 -136
  2456. package/dist/shared-dWHdeoyy.js +0 -126
  2457. package/dist/shared-runtime-yV5uP0IO.js +0 -7
  2458. package/dist/shell-argv-B9p91CMW.js +0 -72
  2459. package/dist/shell-env-BTztt4a1.js +0 -181
  2460. package/dist/signal-B1kD3iF3.js +0 -46
  2461. package/dist/signal-DP8FUJOa.js +0 -6
  2462. package/dist/signal-Dvmeol77.js +0 -13
  2463. package/dist/signal-account-CYKnyxZK.js +0 -11
  2464. package/dist/signal-cli-install-DcmsRDbB.js +0 -188
  2465. package/dist/signal-surface-AbofIH7s.js +0 -21
  2466. package/dist/simple-completion-transport-Dl5DzRWP.js +0 -24
  2467. package/dist/skill-commands-CH4lfyW8.js +0 -77
  2468. package/dist/skill-commands-base-CvVjZByy.js +0 -60
  2469. package/dist/skill-commands-runtime-zpWkVBay.js +0 -2
  2470. package/dist/skill-commands.runtime-BKa5oyH-.js +0 -2
  2471. package/dist/skill-commands.runtime.js +0 -1
  2472. package/dist/skill-scanner-bqroDZTs.js +0 -354
  2473. package/dist/skills-D0K7gu2V.js +0 -972
  2474. package/dist/skills-DFTLIGCd.js +0 -4
  2475. package/dist/skills-clawhub-KJGw0uGT.js +0 -274
  2476. package/dist/skills-cli-DziAPxba.js +0 -369
  2477. package/dist/skills-install-CQeO3Sll.js +0 -819
  2478. package/dist/skills-remote-BojLLDxp.js +0 -584
  2479. package/dist/skills-status-BINZ_svK.js +0 -2
  2480. package/dist/skills-status-CdQUttuP.js +0 -170
  2481. package/dist/slack-BuMSbx3k.js +0 -6
  2482. package/dist/slack-DMg3O5YT.js +0 -9
  2483. package/dist/slack-account-LEbfbXys.js +0 -11
  2484. package/dist/slack-core-oqCiyGw8.js +0 -4
  2485. package/dist/slack-runtime-surface-CyaeT7yk.js +0 -18
  2486. package/dist/slack-surface-1yTIS5Q8.js +0 -44
  2487. package/dist/slack-target-parser-CruIJ5w5.js +0 -12
  2488. package/dist/slack-targets-ukxuKR1I.js +0 -45
  2489. package/dist/slash-commands-CRuXC74L.js +0 -672
  2490. package/dist/slash-commands.runtime-F6b9KUnh.js +0 -20
  2491. package/dist/slash-commands.runtime.js +0 -1
  2492. package/dist/slash-dispatch.runtime-CItGyoBF.js +0 -38
  2493. package/dist/slash-dispatch.runtime.js +0 -1
  2494. package/dist/slash-skill-commands.runtime-Caw0oNvV.js +0 -8
  2495. package/dist/slash-skill-commands.runtime.js +0 -1
  2496. package/dist/slots-Dq-2eIRb.js +0 -93
  2497. package/dist/speech-Ceb4ISD4.js +0 -46
  2498. package/dist/speech-provider-BHjDbut-.js +0 -190
  2499. package/dist/speech-provider-D45m9grJ.js +0 -154
  2500. package/dist/speech-provider-DM1ZXsz2.js +0 -385
  2501. package/dist/speech-runtime-CNvOkPw4.js +0 -34
  2502. package/dist/src-Dn1TYXp6.js +0 -2739
  2503. package/dist/ssh-config-C1ipLHgq.js +0 -77
  2504. package/dist/ssh-tunnel-BwMCLc2e.js +0 -159
  2505. package/dist/ssh-tunnel-D5YdH2SQ.js +0 -2
  2506. package/dist/ssrf-Duye12M_.js +0 -246
  2507. package/dist/ssrf-policy-5L7qS2kK.js +0 -69
  2508. package/dist/ssrf-runtime-bpDM5Bgo.js +0 -5
  2509. package/dist/stable-node-path-n7TARbHZ.js +0 -32
  2510. package/dist/stage-sandbox-media.runtime-Tlgx4F6M.js +0 -229
  2511. package/dist/stage-sandbox-media.runtime.js +0 -1
  2512. package/dist/stagger-Cs-6sySM.js +0 -54
  2513. package/dist/startup-verification-DS8Rlwfj.js +0 -131
  2514. package/dist/state-migrations-ssGF0Trg.js +0 -845
  2515. package/dist/state-paths-LoYjHd5L.js +0 -2
  2516. package/dist/status-B7yRr4OV.js +0 -3
  2517. package/dist/status-BM1Lyqo6.js +0 -261
  2518. package/dist/status-BekOC_tW.js +0 -650
  2519. package/dist/status-CxodlqzZ.js +0 -2
  2520. package/dist/status-DHbl5eIj.js +0 -608
  2521. package/dist/status-PsQV2sfU.js +0 -44
  2522. package/dist/status-all-C53a3881.js +0 -798
  2523. package/dist/status-helpers-CCJSSrVJ.js +0 -170
  2524. package/dist/status-issues-M-RUxHvm.js +0 -336
  2525. package/dist/status-issues-qWKbW6r2.js +0 -187
  2526. package/dist/status-json-B66tF12J.js +0 -86
  2527. package/dist/status.agent-local-B8Sw_p6M.js +0 -59
  2528. package/dist/status.command.text-runtime-csZS5yHm.js +0 -18
  2529. package/dist/status.daemon-D0GzvHft.js +0 -25
  2530. package/dist/status.format-C1VNrTBi.js +0 -44
  2531. package/dist/status.gateway-probe-4INUEsUo.js +0 -15
  2532. package/dist/status.link-channel-CJtR5UX6.js +0 -35
  2533. package/dist/status.node-mode-Bva3wbBI.js +0 -2
  2534. package/dist/status.node-mode-CneoXHPW.js +0 -32
  2535. package/dist/status.scan-t1kfm4e0.js +0 -264
  2536. package/dist/status.scan.deps.runtime-CCaTJlzV.js +0 -18
  2537. package/dist/status.scan.deps.runtime.js +0 -1
  2538. package/dist/status.scan.fast-json-DmzN3HuU.js +0 -97
  2539. package/dist/status.scan.fast-json-gu6uL_BR.js +0 -2
  2540. package/dist/status.scan.json-core-JjMIy9YZ.js +0 -254
  2541. package/dist/status.scan.runtime-r_5mTC8f.js +0 -9
  2542. package/dist/status.scan.runtime.js +0 -1
  2543. package/dist/status.service-summary-DnbDBXMs.js +0 -32
  2544. package/dist/status.summary-CbEhZE0h.js +0 -210
  2545. package/dist/status.summary-SLm6uT22.js +0 -2
  2546. package/dist/status.update-Bw9CvcCc.js +0 -2
  2547. package/dist/status.update-CLnevxJb.js +0 -79
  2548. package/dist/sticker-cache-C_FrWgaA.js +0 -1573
  2549. package/dist/sticker-vision.runtime-DR7e08nD.js +0 -16
  2550. package/dist/sticker-vision.runtime.js +0 -1
  2551. package/dist/storage-CPQLpmgN.js +0 -234
  2552. package/dist/storage-paths-DvC4vQo1.js +0 -51
  2553. package/dist/store-8ONMiMTI.js +0 -365
  2554. package/dist/store-DQJZr0Yf.js +0 -767
  2555. package/dist/store-Dxcm2vsw.js +0 -140
  2556. package/dist/store-_OZh8RrM.js +0 -1343
  2557. package/dist/store-read-JHUhrL0Z.js +0 -16
  2558. package/dist/store.runtime-Dmqv-8M7.js +0 -2
  2559. package/dist/store.runtime.js +0 -1
  2560. package/dist/stream-CGrFe0j0.js +0 -123
  2561. package/dist/stream-D9HOuZmn.js +0 -633
  2562. package/dist/stream-Di_JOWoE.js +0 -180
  2563. package/dist/stream-wrappers-D-DlMIYG.js +0 -136
  2564. package/dist/string-normalization-Ddc4JXRe.js +0 -19
  2565. package/dist/string-normalization-runtime-CCsvs1ds.js +0 -1
  2566. package/dist/string-sample-BIWt11jp.js +0 -11
  2567. package/dist/strip-inbound-meta-DvHTlpJG.js +0 -155
  2568. package/dist/subagent-orphan-recovery-Do8Az2RD.js +0 -206
  2569. package/dist/subagent-registry-runtime-D5PNyCsh.js +0 -2
  2570. package/dist/subcli-descriptors-Dasenv4J.js +0 -151
  2571. package/dist/subsystem-C9VSlEcV.js +0 -582
  2572. package/dist/supervisor-log.runtime-CZe76kAj.js +0 -8
  2573. package/dist/supervisor-log.runtime.js +0 -1
  2574. package/dist/system-cli-2-HDh_Ev.js +0 -58
  2575. package/dist/system-events-5SDw3lix.js +0 -93
  2576. package/dist/system-events-BuGmSpuG.js +0 -34
  2577. package/dist/system-message-0oem5MWV.js +0 -16
  2578. package/dist/system-run-command-BmlO5dn2.js +0 -301
  2579. package/dist/systemd-B2HBHMpF.js +0 -588
  2580. package/dist/systemd-hints-DkRlAuPR.js +0 -325
  2581. package/dist/systemd-linger-BBPBJSm0.js +0 -68
  2582. package/dist/systemd-linger-DiWO9n2E.js +0 -2
  2583. package/dist/table-CY2XIg3l.js +0 -305
  2584. package/dist/tables-D6qL6k4d.js +0 -832
  2585. package/dist/tailnet-CZMxMuGK.js +0 -76
  2586. package/dist/tailscale-mpS_cTve.js +0 -238
  2587. package/dist/tailscale-status-Dg2Iov5f.js +0 -71
  2588. package/dist/target-errors-ThNFqo8X.js +0 -26
  2589. package/dist/target-ids-O3O6piTN.js +0 -76
  2590. package/dist/target-parsing-Boyj_2v0.js +0 -41
  2591. package/dist/target-registry-BHJcVSo1.js +0 -1269
  2592. package/dist/targets-C7I_wjs2.js +0 -283
  2593. package/dist/targets-CZA632lq.js +0 -39
  2594. package/dist/targets-Dz1dx4G8.js +0 -78
  2595. package/dist/targets-Zd0-pJu7.js +0 -748
  2596. package/dist/targets-krmeAAxz.js +0 -70
  2597. package/dist/task-registry-delivery-runtime-BnkUa6Mp.js +0 -2
  2598. package/dist/task-registry.audit-DbCRt5MR.js +0 -320
  2599. package/dist/task-registry.audit.shared-SH4MOLKM.js +0 -18
  2600. package/dist/task-registry.maintenance-DfZmDWog.js +0 -2
  2601. package/dist/task-registry.summary-SoFiECCc.js +0 -44
  2602. package/dist/tavily-search-provider-BCY1kfQB.js +0 -227
  2603. package/dist/telegram/audit.js +0 -2
  2604. package/dist/telegram/token.js +0 -2
  2605. package/dist/telegram-Cq20PSxw.js +0 -23
  2606. package/dist/telegram-account-vRRwyfuA.js +0 -11
  2607. package/dist/telegram-command-config-BiHhXScJ.js +0 -1
  2608. package/dist/telegram-core-DTJayyAj.js +0 -6
  2609. package/dist/telegram-custom-commands-C-nv8yoB.js +0 -75
  2610. package/dist/temp-download-Ccatr7zI.js +0 -62
  2611. package/dist/temp-path-JU2kkd64.js +0 -2
  2612. package/dist/templating-Bu436Euy.js +0 -24
  2613. package/dist/testing-BrrgubIp.js +0 -690
  2614. package/dist/text-chunking-BTs2yTSd.js +0 -12
  2615. package/dist/text-chunking-ByXwyFNP.js +0 -20
  2616. package/dist/text-format-lEYRGxj5.js +0 -8
  2617. package/dist/text-runtime-D9ApM_8O.js +0 -398
  2618. package/dist/theme-Bb-qluq6.js +0 -2
  2619. package/dist/theme-wBMZmJzz.js +0 -34
  2620. package/dist/thinking-Dga2zdtd.js +0 -68
  2621. package/dist/thinking.shared-D6IkoLJU.js +0 -243
  2622. package/dist/thread-bindings-BMnz7w-V.js +0 -219
  2623. package/dist/thread-bindings-BbQWOcMr.js +0 -352
  2624. package/dist/thread-bindings-Bv0I9sBY.js +0 -534
  2625. package/dist/thread-bindings-C3jMrVvp.js +0 -778
  2626. package/dist/thread-bindings-policy-Br8s4hQ6.js +0 -172
  2627. package/dist/thread-bindings-runtime-CbG63N4N.js +0 -2
  2628. package/dist/thread-bindings-shared-DjSYaoHi.js +0 -95
  2629. package/dist/thread-bindings.discord-api-NFR5qsWt.js +0 -487
  2630. package/dist/thread-ownership-DG810AQi.js +0 -3
  2631. package/dist/threading-1Z_3y_Dp.js +0 -2
  2632. package/dist/threading-Hl8nWez6.js +0 -832
  2633. package/dist/threading-helpers-BpqyeyAU.js +0 -14
  2634. package/dist/threading-tool-context-DxV30qIW.js +0 -157
  2635. package/dist/timeouts-B1NiHSGi.js +0 -74
  2636. package/dist/tlon-C54Qojl0.js +0 -20
  2637. package/dist/tmp-openclaw-dir-B44_vmJv.js +0 -102
  2638. package/dist/token-BlUJQi_X.js +0 -2
  2639. package/dist/token-CDYFJvj8.js +0 -82
  2640. package/dist/token-kCjtGElJ.js +0 -45
  2641. package/dist/tokens-C2f9Klbt.js +0 -66
  2642. package/dist/tool-actions.runtime-aB0DgLk7.js +0 -532
  2643. package/dist/tool-actions.runtime.js +0 -1
  2644. package/dist/tool-display-C7h9IZa_.js +0 -1607
  2645. package/dist/tool-images-BDUvc_pd.js +0 -270
  2646. package/dist/tool-mutation-DIBpIegg.js +0 -140
  2647. package/dist/tool-policy-FUm_F19C.js +0 -515
  2648. package/dist/tool-policy-match-CCFHTsu9.js +0 -49
  2649. package/dist/tool-send-DClM4vsZ.js +0 -16
  2650. package/dist/tools-54j1hYBv.js +0 -123
  2651. package/dist/tools-effective-inventory-C09suj6-.js +0 -148
  2652. package/dist/tools.runtime-VBFxIXC8.js +0 -4
  2653. package/dist/tools.runtime.js +0 -1
  2654. package/dist/transcript-events-Dc7U5QmQ.js +0 -29
  2655. package/dist/transport-ready-Cje3USX4.js +0 -36
  2656. package/dist/tts-CTM9C09A.js +0 -2
  2657. package/dist/tts-Ck_K3tIi.js +0 -84
  2658. package/dist/tts-auto-mode-bD-u2biE.js +0 -14
  2659. package/dist/tts-bTuorllO.js +0 -102
  2660. package/dist/tts-eOLiJF6d.js +0 -29
  2661. package/dist/tts.runtime-ChTwy0yH.js +0 -3
  2662. package/dist/tts.runtime.js +0 -1
  2663. package/dist/tui-CrM-Bz3i.js +0 -3899
  2664. package/dist/tui-cli-aVL5aPGw.js +0 -31
  2665. package/dist/twitch-CFFlkhYG.js +0 -15
  2666. package/dist/typebox-DmerPHaM.js +0 -22
  2667. package/dist/types-BzNSmNk3.js +0 -12
  2668. package/dist/types-DAzqpvqD.js +0 -83
  2669. package/dist/types-DVJVELY7.js +0 -471
  2670. package/dist/types-DqNppUoh.js +0 -15
  2671. package/dist/types.secrets-BpcqHPAv.js +0 -80
  2672. package/dist/types.tools-BTQL6INB.js +0 -22
  2673. package/dist/typing-BnCchGtL.js +0 -8
  2674. package/dist/typing-Bugg5LPP.js +0 -68
  2675. package/dist/typing-J_ktpWeA.js +0 -2
  2676. package/dist/typing-mode-DDYL_0TG.js +0 -75
  2677. package/dist/typing-policy-CaZhrM-F.js +0 -11
  2678. package/dist/typing-start-guard-Cgjgzy5e.js +0 -73
  2679. package/dist/ui-BLDY9-7R.js +0 -212
  2680. package/dist/undici-global-dispatcher-CcNdQ7Dt.js +0 -99
  2681. package/dist/unhandled-rejections-CA_e1R-O.js +0 -2
  2682. package/dist/unhandled-rejections-V7U9keRG.js +0 -241
  2683. package/dist/update-CcALvtl_.js +0 -1253
  2684. package/dist/update-channels-Dn1F57Kf.js +0 -78
  2685. package/dist/update-check-CoDVxy35.js +0 -354
  2686. package/dist/update-cli-BWOYy_Mp.js +0 -1447
  2687. package/dist/update-offset-store-BLZmshZE.js +0 -75
  2688. package/dist/usage-CC7-wLUi.js +0 -39
  2689. package/dist/usage-format-C7nMV1jc.js +0 -513
  2690. package/dist/utils-CN_F_3Qg.js +0 -243
  2691. package/dist/utils-Cgw9Y0-Q.js +0 -2
  2692. package/dist/validation-BNNAUmDO.js +0 -18521
  2693. package/dist/verification-B4ogZ29M.js +0 -130
  2694. package/dist/verification-B99uVIxo.js +0 -2
  2695. package/dist/version-BNzJ37Re.js +0 -79
  2696. package/dist/version-Dw0eJ-1F.js +0 -2
  2697. package/dist/voice-call-Dt6m6oA3.js +0 -4
  2698. package/dist/wait-YXJvtMmp.js +0 -7
  2699. package/dist/warning-filter-GX8LpGKz.js +0 -57
  2700. package/dist/web-fetch-utils-CoVia2ez.js +0 -413
  2701. package/dist/web-media-D9opLz21.js +0 -2
  2702. package/dist/web-media-DHlguFej.js +0 -339
  2703. package/dist/web-search-BcSDWJK9.js +0 -169
  2704. package/dist/web-search-providers-CqY6CVp3.js +0 -21
  2705. package/dist/web-search-providers.runtime-BHjzPQW-.js +0 -113
  2706. package/dist/web-search-providers.runtime.js +0 -1
  2707. package/dist/web-search-providers.shared-CMeQec8y.js +0 -421
  2708. package/dist/web-search-shared-B5mHm7QD.js +0 -87
  2709. package/dist/webhook-ingress-CTl81NUR.js +0 -164
  2710. package/dist/webhook-memory-guards-B6k3g-po.js +0 -129
  2711. package/dist/webhook-path-CklCw5kp.js +0 -22
  2712. package/dist/webhook-request-guards-CxDPmU9e.js +0 -178
  2713. package/dist/webhook-shared-Bw9wLe6L.js +0 -370
  2714. package/dist/webhooks-cli-DPRITERU.js +0 -326
  2715. package/dist/whatsapp-CSzf1Nu0.js +0 -5
  2716. package/dist/whatsapp-D18Otn45.js +0 -30
  2717. package/dist/whatsapp-auth-presence-B5GZUgTA.js +0 -41
  2718. package/dist/whatsapp-core-Be0P_p4R.js +0 -7
  2719. package/dist/whatsapp-heartbeat-a2-OB01n.js +0 -85
  2720. package/dist/whatsapp-shared-ChjLiMDw.js +0 -56
  2721. package/dist/whatsapp-shared-FR_Jw-NH.js +0 -4
  2722. package/dist/whatsapp-surface-Dwrfi_SD.js +0 -26
  2723. package/dist/whatsapp-targets-59A3BDBi.js +0 -13
  2724. package/dist/widearea-dns-CfQt6b3q.js +0 -125
  2725. package/dist/windows-argv-DDAf3waz.js +0 -345
  2726. package/dist/windows-install-roots-XI3CvO9O.js +0 -149
  2727. package/dist/windows-spawn-DKvkg_66.js +0 -154
  2728. package/dist/with-timeout-B2smrGj0.js +0 -214
  2729. package/dist/with-timeout-BmJKiOMd.js +0 -13
  2730. package/dist/workflow-summary-BMvffn8D.js +0 -2
  2731. package/dist/workflow-summary-NvN5lUvK.js +0 -167
  2732. package/dist/workspace-D5P9nuJd.js +0 -479
  2733. package/dist/workspace-D5UiPYKk.js +0 -306
  2734. package/dist/workspace-dirs-CRv8Jwfz.js +0 -13
  2735. package/dist/ws-97FEIc7w.js +0 -11
  2736. package/dist/ws-log-BaAOgG9m.js +0 -281
  2737. package/dist/ws-logging-M92fgmyp.js +0 -10
  2738. package/dist/wsl-ytdRZp54.js +0 -57
  2739. package/dist/x-search-FsMNZ7d0.js +0 -166
  2740. package/dist/x-search-shared-D0tVMJk9.js +0 -124
  2741. package/dist/zalo-CNoa7XH7.js +0 -13
  2742. package/dist/zalo-js-HktBGDbg.js +0 -1156
  2743. package/dist/zalo-setup-BT-xGElf.js +0 -14
  2744. package/dist/zalouser-TwyfhIYz.js +0 -22
  2745. package/dist/zod-1Wegy5nx.js +0 -7
  2746. package/dist/zod-parse-HlGwTZP3.js +0 -14
  2747. package/dist/zod-schema.agent-runtime-DFC7a3eV.js +0 -602
  2748. package/dist/zod-schema.core-C1Ewlj9j.js +0 -520
  2749. package/dist/zod-schema.providers-core-Bmbs-R4l.js +0 -1541
  2750. package/dist/zod-schema.providers-whatsapp-CanJPkvb.js +0 -132
  2751. package/dist/zod-schema.sensitive-DEzKzMxI.js +0 -5
@@ -1,4976 +0,0 @@
1
- import { t as formatDocsLink } from "./links-D7o22Ygt.js";
2
- import { r as normalizeProviderId } from "./provider-id-CHzLB538.js";
3
- import { _ as normalizeAccountId, d as resolveThreadSessionKeys$1, g as DEFAULT_ACCOUNT_ID } from "./session-key-Do__tq1E.js";
4
- import { a as hasConfiguredSecretInput, c as normalizeResolvedSecretInputString, l as normalizeSecretInputString } from "./types.secrets-BpcqHPAv.js";
5
- import { I as requireOpenAllowFrom, h as MarkdownConfigSchema, l as GroupPolicySchema, n as BlockStreamingCoalesceSchema, o as DmPolicySchema } from "./zod-schema.core-C1Ewlj9j.js";
6
- import { r as buildChannelConfigSchema } from "./config-schema-mfJ91WLf.js";
7
- import { t as safeEqualSecret } from "./secret-equal-fMR1DjSl.js";
8
- import { o as isTrustedProxyAddress, u as resolveClientIp } from "./net-DjzoSxQo.js";
9
- import { i as loadSessionStore } from "./store-_OZh8RrM.js";
10
- import { l as resolveStorePath } from "./paths-xpks599B.js";
11
- import { i as parseStrictPositiveInteger } from "./parse-finite-number-CzdLC_gQ.js";
12
- import { n as safeParseWithSchema, t as safeParseJsonWithSchema } from "./zod-parse-HlGwTZP3.js";
13
- import { t as rawDataToString } from "./ws-97FEIc7w.js";
14
- import { t as createDedupeCache } from "./dedupe-DZbQYOSD.js";
15
- import { a as createSetupInputPresenceValidator, n as applySetupAccountConfigPatch, s as migrateBaseNameToDefaultAccount, t as applyAccountNameToChannelSection } from "./setup-helpers-0yWIq2cW.js";
16
- import { a as warnMissingProviderGroupPolicyFallbackOnce, n as resolveAllowlistProviderRuntimeGroupPolicy, r as resolveDefaultGroupPolicy } from "./runtime-group-policy-zTp8fKRK.js";
17
- import { d as createDefaultChannelRuntimeState, u as createComputedAccountStatusAdapter } from "./status-helpers-CCJSSrVJ.js";
18
- import { n as fetchWithSsrFGuard } from "./fetch-guard-BnhVFBtf.js";
19
- import { i as deliverTextOrMediaReply, p as resolveSendableOutboundReplyParts } from "./reply-payload-CRYI4jIB.js";
20
- import { r as getAgentScopedMediaLocalRoots } from "./local-roots-DrpNBv4b.js";
21
- import { n as describeAccountSnapshot, s as resolveMergedAccountConfig, t as createAccountListHelpers } from "./account-helpers-jJOgsae3.js";
22
- import { c as createScopedChannelConfigAdapter, t as adaptScopedAccountAccessor } from "./channel-config-helpers-CLFL8FLU.js";
23
- import { n as resolveChannelGroupRequireMention } from "./group-policy-G9GcSyph.js";
24
- import { o as stripChannelTargetPrefix, r as createChatChannelPlugin, s as stripTargetKindPrefix, t as buildChannelOutboundSessionRoute } from "./core-DaMVvavf.js";
25
- import { t as normalizeOutboundThreadId } from "./routing-BVt9nMN-.js";
26
- import { r as buildSecretInputSchema } from "./secret-input-Bqf5ho4v.js";
27
- import { i as formatInboundFromLabel$1 } from "./envelope-CrC9AdBL.js";
28
- import { n as resolveControlCommandGate } from "./command-gating-NyDk7t84.js";
29
- import { t as resolveMarkdownTableMode } from "./markdown-tables-CSlyhQVP.js";
30
- import { t as convertMarkdownTables } from "./tables-D6qL6k4d.js";
31
- import { t as resolveChannelMediaMaxBytes } from "./media-limits-DmcT5KnO.js";
32
- import { f as createStandardChannelSetupStatus } from "./setup-wizard-helpers-CA5yiprq.js";
33
- import { i as resolveStoredModelOverride } from "./model-selection-DXY5nwui.js";
34
- import { t as createAccountStatusSink } from "./channel-lifecycle.core-Cn3zeU0h.js";
35
- import { t as createPluginRuntimeStore } from "./runtime-store-CT3yRBe_.js";
36
- import { n as formatNormalizedAllowFromEntries } from "./allow-from-xOap1t02.js";
37
- import { n as readStoreAllowFromForDmPolicy, o as resolveDmGroupAccessWithLists, t as DM_GROUP_ACCESS_REASON } from "./dm-policy-shared-C99GNVxp.js";
38
- import { t as createRestrictSendersChannelSecurity } from "./channel-policy-B-XKjrjK.js";
39
- import { a as buildPendingHistoryContextFromMap, s as clearHistoryEntriesIfEnabled, u as recordPendingHistoryEntryIfEnabled } from "./history-B4mW8GfY.js";
40
- import { t as createChannelDirectoryAdapter } from "./directory-runtime-CAabZ_XW.js";
41
- import "./setup-BrOJEPVN.js";
42
- import "./setup-runtime-BChXvJOO.js";
43
- import { d as createResolvedApproverActionAuthAdapter, t as resolveApprovalApprovers } from "./approval-runtime-DIA8ohXa.js";
44
- import { n as isDangerousNameMatchingEnabled } from "./dangerous-name-matching-DnCDaXzP.js";
45
- import "./config-runtime-ngoccXmP.js";
46
- import { t as createChannelReplyPipeline } from "./channel-reply-pipeline-BtBcBCNu.js";
47
- import { a as isRequestBodyLimitError, s as readRequestBodyWithLimit } from "./http-body-CfdQSEp0.js";
48
- import "./ssrf-runtime-bpDM5Bgo.js";
49
- import { t as buildAgentMediaPayload } from "./agent-media-payload-DDTSvr-n.js";
50
- import "./text-runtime-D9ApM_8O.js";
51
- import { t as registerPluginHttpRoute } from "./http-registry-ZGSBfYSe.js";
52
- import { t as buildModelsProviderData } from "./commands-models-B4EJh5Fy.js";
53
- import "./account-resolution-CbKUJkzG.js";
54
- import { n as logInboundDrop, r as logTypingFailure } from "./logging-ColPHIDT.js";
55
- import { n as createChannelPairingController, r as createLoggedPairingApprovalNotifier } from "./channel-pairing-Byr3MFbN.js";
56
- import "./browser-support-Cdp2Gr_6.js";
57
- import { t as listSkillCommandsForAgents } from "./skill-commands-CH4lfyW8.js";
58
- import { t as loadOutboundMediaFromUrl } from "./outbound-media-B2ZrkOxl.js";
59
- import { n as buildPassiveProbedChannelStatusSummary } from "./extension-shared-V_4IXpRU.js";
60
- import "./channel-config-primitives-DwsP66Ak.js";
61
- import { t as createMessageToolButtonsSchema } from "./channel-actions-DSvaYD1T.js";
62
- import { t as chunkTextForOutbound } from "./text-chunking-BTs2yTSd.js";
63
- import { t as zod_exports } from "./zod-1Wegy5nx.js";
64
- import "./runtime-api-BB2RZPnq.js";
65
- import { n as isMattermostSenderAllowed, r as normalizeMattermostAllowList, t as authorizeMattermostCommandInvocation } from "./monitor-auth-EvlH1zbN.js";
66
- import { createHash, createHmac } from "node:crypto";
67
- import WebSocket$1 from "ws";
68
- import { Type } from "@sinclair/typebox";
69
- //#region extensions/mattermost/src/mattermost/client.ts
70
- const MattermostPostSchema = zod_exports.z.object({
71
- id: zod_exports.z.string(),
72
- user_id: zod_exports.z.string().nullable().optional(),
73
- channel_id: zod_exports.z.string().nullable().optional(),
74
- message: zod_exports.z.string().nullable().optional(),
75
- file_ids: zod_exports.z.array(zod_exports.z.string()).nullable().optional(),
76
- type: zod_exports.z.string().nullable().optional(),
77
- root_id: zod_exports.z.string().nullable().optional(),
78
- create_at: zod_exports.z.number().nullable().optional(),
79
- props: zod_exports.z.record(zod_exports.z.string(), zod_exports.z.unknown()).nullable().optional()
80
- }).passthrough();
81
- function normalizeMattermostBaseUrl(raw) {
82
- const trimmed = raw?.trim();
83
- if (!trimmed) return;
84
- return trimmed.replace(/\/+$/, "").replace(/\/api\/v4$/i, "");
85
- }
86
- function buildMattermostApiUrl(baseUrl, path) {
87
- const normalized = normalizeMattermostBaseUrl(baseUrl);
88
- if (!normalized) throw new Error("Mattermost baseUrl is required");
89
- return `${normalized}/api/v4${path.startsWith("/") ? path : `/${path}`}`;
90
- }
91
- async function readMattermostError(res) {
92
- if ((res.headers.get("content-type") ?? "").includes("application/json")) {
93
- const data = await res.json();
94
- if (data?.message) return data.message;
95
- return JSON.stringify(data);
96
- }
97
- return await res.text();
98
- }
99
- function createMattermostClient(params) {
100
- const baseUrl = normalizeMattermostBaseUrl(params.baseUrl);
101
- if (!baseUrl) throw new Error("Mattermost baseUrl is required");
102
- const apiBaseUrl = `${baseUrl}/api/v4`;
103
- const token = params.botToken.trim();
104
- const externalFetchImpl = params.fetchImpl;
105
- const NULL_BODY_STATUSES = new Set([
106
- 101,
107
- 204,
108
- 205,
109
- 304
110
- ]);
111
- const guardedFetchImpl = async (input, init) => {
112
- const { response, release } = await fetchWithSsrFGuard({
113
- url: typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url,
114
- init,
115
- auditContext: "mattermost-api",
116
- policy: params.allowPrivateNetwork ? { allowPrivateNetwork: true } : void 0
117
- });
118
- try {
119
- const bodyBytes = NULL_BODY_STATUSES.has(response.status) ? null : await response.arrayBuffer();
120
- return new Response(bodyBytes, {
121
- status: response.status,
122
- headers: response.headers
123
- });
124
- } finally {
125
- await release();
126
- }
127
- };
128
- const fetchImpl = externalFetchImpl ?? guardedFetchImpl;
129
- const request = async (path, init) => {
130
- const url = buildMattermostApiUrl(baseUrl, path);
131
- const headers = new Headers(init?.headers);
132
- headers.set("Authorization", `Bearer ${token}`);
133
- if (typeof init?.body === "string" && !headers.has("Content-Type")) headers.set("Content-Type", "application/json");
134
- const res = await fetchImpl(url, {
135
- ...init,
136
- headers
137
- });
138
- if (!res.ok) {
139
- const detail = await readMattermostError(res);
140
- throw new Error(`Mattermost API ${res.status} ${res.statusText}: ${detail || "unknown error"}`);
141
- }
142
- if (res.status === 204) return;
143
- if ((res.headers.get("content-type") ?? "").includes("application/json")) return await res.json();
144
- return await res.text();
145
- };
146
- return {
147
- baseUrl,
148
- apiBaseUrl,
149
- token,
150
- request,
151
- fetchImpl
152
- };
153
- }
154
- async function fetchMattermostMe(client) {
155
- return await client.request("/users/me");
156
- }
157
- async function fetchMattermostUser(client, userId) {
158
- return await client.request(`/users/${userId}`);
159
- }
160
- async function fetchMattermostUserByUsername(client, username) {
161
- return await client.request(`/users/username/${encodeURIComponent(username)}`);
162
- }
163
- async function fetchMattermostChannel(client, channelId) {
164
- return await client.request(`/channels/${channelId}`);
165
- }
166
- async function fetchMattermostChannelByName(client, teamId, channelName) {
167
- return await client.request(`/teams/${teamId}/channels/name/${encodeURIComponent(channelName)}`);
168
- }
169
- async function sendMattermostTyping(client, params) {
170
- const payload = { channel_id: params.channelId };
171
- const parentId = params.parentId?.trim();
172
- if (parentId) payload.parent_id = parentId;
173
- await client.request("/users/me/typing", {
174
- method: "POST",
175
- body: JSON.stringify(payload)
176
- });
177
- }
178
- async function createMattermostDirectChannel(client, userIds, signal) {
179
- return await client.request("/channels/direct", {
180
- method: "POST",
181
- body: JSON.stringify(userIds),
182
- signal
183
- });
184
- }
185
- const RETRYABLE_NETWORK_ERROR_CODES = new Set([
186
- "ECONNRESET",
187
- "ECONNREFUSED",
188
- "ETIMEDOUT",
189
- "ESOCKETTIMEDOUT",
190
- "ECONNABORTED",
191
- "ENOTFOUND",
192
- "EAI_AGAIN",
193
- "EHOSTUNREACH",
194
- "ENETUNREACH",
195
- "EPIPE",
196
- "UND_ERR_CONNECT_TIMEOUT",
197
- "UND_ERR_DNS_RESOLVE_FAILED",
198
- "UND_ERR_CONNECT",
199
- "UND_ERR_SOCKET",
200
- "UND_ERR_HEADERS_TIMEOUT",
201
- "UND_ERR_BODY_TIMEOUT"
202
- ]);
203
- const RETRYABLE_NETWORK_ERROR_NAMES = new Set([
204
- "AbortError",
205
- "TimeoutError",
206
- "ConnectTimeoutError",
207
- "HeadersTimeoutError",
208
- "BodyTimeoutError"
209
- ]);
210
- const RETRYABLE_NETWORK_MESSAGE_SNIPPETS = [
211
- "network error",
212
- "timeout",
213
- "timed out",
214
- "abort",
215
- "connection refused",
216
- "econnreset",
217
- "econnrefused",
218
- "etimedout",
219
- "enotfound",
220
- "socket hang up",
221
- "getaddrinfo"
222
- ];
223
- /**
224
- * Creates a Mattermost DM channel with exponential backoff retry logic.
225
- * Retries on transient errors (429, 5xx, network errors) but not on
226
- * client errors (4xx except 429) or permanent failures.
227
- */
228
- async function createMattermostDirectChannelWithRetry(client, userIds, options = {}) {
229
- const { maxRetries = 3, initialDelayMs = 1e3, maxDelayMs = 1e4, timeoutMs = 3e4, onRetry } = options;
230
- let lastError;
231
- for (let attempt = 0; attempt <= maxRetries; attempt++) try {
232
- const controller = new AbortController();
233
- const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
234
- try {
235
- return await createMattermostDirectChannel(client, userIds, controller.signal);
236
- } finally {
237
- clearTimeout(timeoutId);
238
- }
239
- } catch (err) {
240
- lastError = err instanceof Error ? err : new Error(String(err));
241
- if (attempt >= maxRetries) break;
242
- if (!isRetryableError(lastError)) throw lastError;
243
- const exponentialDelay = initialDelayMs * Math.pow(2, attempt);
244
- const jitter = Math.random() * exponentialDelay;
245
- const delayMs = Math.min(exponentialDelay + jitter, maxDelayMs);
246
- if (onRetry) onRetry(attempt + 1, delayMs, lastError);
247
- await sleep(delayMs);
248
- }
249
- throw lastError ?? /* @__PURE__ */ new Error("Failed to create DM channel after retries");
250
- }
251
- function isRetryableError(error) {
252
- const candidates = collectErrorCandidates(error);
253
- const messages = candidates.map((candidate) => readErrorMessage(candidate)?.toLowerCase()).filter((message) => Boolean(message));
254
- if (messages.some((message) => /mattermost api 5\d{2}\b/.test(message))) return true;
255
- if (messages.some((message) => /mattermost api 429\b/.test(message) || message.includes("too many requests"))) return true;
256
- for (const message of messages) {
257
- const clientErrorMatch = message.match(/mattermost api (4\d{2})\b/);
258
- if (!clientErrorMatch) continue;
259
- const statusCode = parseInt(clientErrorMatch[1], 10);
260
- if (statusCode >= 400 && statusCode < 500) return false;
261
- }
262
- if (messages.some((message) => /mattermost api \d{3}\b/.test(message))) return false;
263
- if (candidates.map((candidate) => readErrorCode(candidate)).filter((code) => Boolean(code)).some((code) => RETRYABLE_NETWORK_ERROR_CODES.has(code))) return true;
264
- if (candidates.map((candidate) => readErrorName(candidate)).filter((name) => Boolean(name)).some((name) => RETRYABLE_NETWORK_ERROR_NAMES.has(name))) return true;
265
- return messages.some((message) => RETRYABLE_NETWORK_MESSAGE_SNIPPETS.some((pattern) => message.includes(pattern)));
266
- }
267
- function collectErrorCandidates(error) {
268
- const queue = [error];
269
- const seen = /* @__PURE__ */ new Set();
270
- const candidates = [];
271
- while (queue.length > 0) {
272
- const current = queue.shift();
273
- if (!current || seen.has(current)) continue;
274
- seen.add(current);
275
- candidates.push(current);
276
- if (typeof current !== "object") continue;
277
- const nested = current;
278
- queue.push(nested.cause, nested.reason);
279
- if (Array.isArray(nested.errors)) queue.push(...nested.errors);
280
- }
281
- return candidates;
282
- }
283
- function readErrorMessage(error) {
284
- if (!error || typeof error !== "object") return;
285
- const message = error.message;
286
- return typeof message === "string" && message.trim() ? message : void 0;
287
- }
288
- function readErrorName(error) {
289
- if (!error || typeof error !== "object") return;
290
- const name = error.name;
291
- return typeof name === "string" && name.trim() ? name : void 0;
292
- }
293
- function readErrorCode(error) {
294
- if (!error || typeof error !== "object") return;
295
- const { code, errno } = error;
296
- const raw = typeof code === "string" && code.trim() ? code : errno;
297
- if (typeof raw === "string" && raw.trim()) return raw.trim().toUpperCase();
298
- if (typeof raw === "number" && Number.isFinite(raw)) return String(raw);
299
- }
300
- function sleep(ms) {
301
- return new Promise((resolve) => setTimeout(resolve, ms));
302
- }
303
- async function createMattermostPost(client, params) {
304
- const payload = {
305
- channel_id: params.channelId,
306
- message: params.message
307
- };
308
- if (params.rootId) payload.root_id = params.rootId;
309
- if (params.fileIds?.length) payload.file_ids = params.fileIds;
310
- if (params.props) payload.props = params.props;
311
- return await client.request("/posts", {
312
- method: "POST",
313
- body: JSON.stringify(payload)
314
- });
315
- }
316
- async function fetchMattermostUserTeams(client, userId) {
317
- return await client.request(`/users/${userId}/teams`);
318
- }
319
- async function updateMattermostPost(client, postId, params) {
320
- const payload = { id: postId };
321
- if (params.message !== void 0) payload.message = params.message;
322
- if (params.props !== void 0) payload.props = params.props;
323
- return await client.request(`/posts/${postId}`, {
324
- method: "PUT",
325
- body: JSON.stringify(payload)
326
- });
327
- }
328
- async function uploadMattermostFile(client, params) {
329
- const form = new FormData();
330
- const fileName = params.fileName?.trim() || "upload";
331
- const bytes = Uint8Array.from(params.buffer);
332
- const blob = params.contentType ? new Blob([bytes], { type: params.contentType }) : new Blob([bytes]);
333
- form.append("files", blob, fileName);
334
- form.append("channel_id", params.channelId);
335
- const res = await client.fetchImpl(`${client.apiBaseUrl}/files`, {
336
- method: "POST",
337
- headers: { Authorization: `Bearer ${client.token}` },
338
- body: form
339
- });
340
- if (!res.ok) {
341
- const detail = await readMattermostError(res);
342
- throw new Error(`Mattermost API ${res.status} ${res.statusText}: ${detail || "unknown error"}`);
343
- }
344
- const info = (await res.json()).file_infos?.[0];
345
- if (!info?.id) throw new Error("Mattermost file upload failed");
346
- return info;
347
- }
348
- //#endregion
349
- //#region extensions/mattermost/src/mattermost/accounts.ts
350
- const mattermostAccountHelpers = createAccountListHelpers("mattermost");
351
- function listMattermostAccountIds(cfg) {
352
- return mattermostAccountHelpers.listAccountIds(cfg);
353
- }
354
- function resolveDefaultMattermostAccountId(cfg) {
355
- return mattermostAccountHelpers.resolveDefaultAccountId(cfg);
356
- }
357
- function mergeMattermostAccountConfig(cfg, accountId) {
358
- return resolveMergedAccountConfig({
359
- channelConfig: cfg.channels?.mattermost,
360
- accounts: cfg.channels?.mattermost?.accounts,
361
- accountId,
362
- omitKeys: ["defaultAccount"],
363
- nestedObjectKeys: ["commands"]
364
- });
365
- }
366
- function resolveMattermostRequireMention(config) {
367
- if (config.chatmode === "oncall") return true;
368
- if (config.chatmode === "onmessage") return false;
369
- if (config.chatmode === "onchar") return true;
370
- return config.requireMention;
371
- }
372
- function resolveMattermostAccount(params) {
373
- const accountId = normalizeAccountId(params.accountId);
374
- const baseEnabled = params.cfg.channels?.mattermost?.enabled !== false;
375
- const merged = mergeMattermostAccountConfig(params.cfg, accountId);
376
- const accountEnabled = merged.enabled !== false;
377
- const enabled = baseEnabled && accountEnabled;
378
- const allowEnv = accountId === DEFAULT_ACCOUNT_ID;
379
- const envToken = allowEnv ? process.env.MATTERMOST_BOT_TOKEN?.trim() : void 0;
380
- const envUrl = allowEnv ? process.env.MATTERMOST_URL?.trim() : void 0;
381
- const configToken = params.allowUnresolvedSecretRef ? normalizeSecretInputString(merged.botToken) : normalizeResolvedSecretInputString({
382
- value: merged.botToken,
383
- path: `channels.mattermost.accounts.${accountId}.botToken`
384
- });
385
- const configUrl = merged.baseUrl?.trim();
386
- const botToken = configToken || envToken;
387
- const baseUrl = normalizeMattermostBaseUrl(configUrl || envUrl);
388
- const requireMention = resolveMattermostRequireMention(merged);
389
- const botTokenSource = configToken ? "config" : envToken ? "env" : "none";
390
- const baseUrlSource = configUrl ? "config" : envUrl ? "env" : "none";
391
- return {
392
- accountId,
393
- enabled,
394
- name: merged.name?.trim() || void 0,
395
- botToken,
396
- baseUrl,
397
- botTokenSource,
398
- baseUrlSource,
399
- config: merged,
400
- chatmode: merged.chatmode,
401
- oncharPrefixes: merged.oncharPrefixes,
402
- requireMention,
403
- textChunkLimit: merged.textChunkLimit,
404
- blockStreaming: merged.blockStreaming,
405
- blockStreamingCoalesce: merged.blockStreamingCoalesce
406
- };
407
- }
408
- /**
409
- * Resolve the effective replyToMode for a given chat type.
410
- * Mattermost auto-threading only applies to channel and group messages.
411
- */
412
- function resolveMattermostReplyToMode(account, kind) {
413
- if (kind === "direct") return "off";
414
- return account.config.replyToMode ?? "off";
415
- }
416
- //#endregion
417
- //#region extensions/mattermost/src/approval-auth.ts
418
- const MATTERMOST_USER_ID_RE = /^[a-z0-9]{26}$/;
419
- function normalizeMattermostApproverId(value) {
420
- const normalized = String(value).trim().replace(/^(mattermost|user):/i, "").replace(/^@/, "").trim().toLowerCase();
421
- return MATTERMOST_USER_ID_RE.test(normalized) ? normalized : void 0;
422
- }
423
- const mattermostApprovalAuth = createResolvedApproverActionAuthAdapter({
424
- channelLabel: "Mattermost",
425
- resolveApprovers: ({ cfg, accountId }) => {
426
- const account = resolveMattermostAccount({
427
- cfg,
428
- accountId
429
- }).config;
430
- return resolveApprovalApprovers({
431
- allowFrom: account.allowFrom,
432
- normalizeApprover: normalizeMattermostApproverId
433
- });
434
- },
435
- normalizeSenderId: (value) => normalizeMattermostApproverId(value)
436
- });
437
- //#endregion
438
- //#region extensions/mattermost/src/config-schema-core.ts
439
- function requireMattermostOpenAllowFrom(params) {
440
- requireOpenAllowFrom({
441
- policy: params.policy,
442
- allowFrom: params.allowFrom,
443
- ctx: params.ctx,
444
- path: ["allowFrom"],
445
- message: "channels.mattermost.dmPolicy=\"open\" requires channels.mattermost.allowFrom to include \"*\""
446
- });
447
- }
448
- const DmChannelRetrySchema = zod_exports.z.object({
449
- maxRetries: zod_exports.z.number().int().min(0).max(10).optional(),
450
- initialDelayMs: zod_exports.z.number().int().min(100).max(6e4).optional(),
451
- maxDelayMs: zod_exports.z.number().int().min(1e3).max(6e4).optional(),
452
- timeoutMs: zod_exports.z.number().int().min(5e3).max(12e4).optional()
453
- }).strict().refine((data) => {
454
- if (data.initialDelayMs !== void 0 && data.maxDelayMs !== void 0) return data.initialDelayMs <= data.maxDelayMs;
455
- return true;
456
- }, {
457
- message: "initialDelayMs must be less than or equal to maxDelayMs",
458
- path: ["initialDelayMs"]
459
- }).optional();
460
- const MattermostSlashCommandsSchema = zod_exports.z.object({
461
- native: zod_exports.z.union([zod_exports.z.boolean(), zod_exports.z.literal("auto")]).optional(),
462
- nativeSkills: zod_exports.z.union([zod_exports.z.boolean(), zod_exports.z.literal("auto")]).optional(),
463
- callbackPath: zod_exports.z.string().optional(),
464
- callbackUrl: zod_exports.z.string().optional()
465
- }).strict().optional();
466
- const MattermostAccountSchemaBase = zod_exports.z.object({
467
- name: zod_exports.z.string().optional(),
468
- capabilities: zod_exports.z.array(zod_exports.z.string()).optional(),
469
- dangerouslyAllowNameMatching: zod_exports.z.boolean().optional(),
470
- markdown: MarkdownConfigSchema,
471
- enabled: zod_exports.z.boolean().optional(),
472
- configWrites: zod_exports.z.boolean().optional(),
473
- botToken: buildSecretInputSchema().optional(),
474
- baseUrl: zod_exports.z.string().optional(),
475
- chatmode: zod_exports.z.enum([
476
- "oncall",
477
- "onmessage",
478
- "onchar"
479
- ]).optional(),
480
- oncharPrefixes: zod_exports.z.array(zod_exports.z.string()).optional(),
481
- requireMention: zod_exports.z.boolean().optional(),
482
- dmPolicy: DmPolicySchema.optional().default("pairing"),
483
- allowFrom: zod_exports.z.array(zod_exports.z.union([zod_exports.z.string(), zod_exports.z.number()])).optional(),
484
- groupAllowFrom: zod_exports.z.array(zod_exports.z.union([zod_exports.z.string(), zod_exports.z.number()])).optional(),
485
- groupPolicy: GroupPolicySchema.optional().default("allowlist"),
486
- textChunkLimit: zod_exports.z.number().int().positive().optional(),
487
- chunkMode: zod_exports.z.enum(["length", "newline"]).optional(),
488
- blockStreaming: zod_exports.z.boolean().optional(),
489
- blockStreamingCoalesce: BlockStreamingCoalesceSchema.optional(),
490
- replyToMode: zod_exports.z.enum([
491
- "off",
492
- "first",
493
- "all"
494
- ]).optional(),
495
- responsePrefix: zod_exports.z.string().optional(),
496
- actions: zod_exports.z.object({ reactions: zod_exports.z.boolean().optional() }).optional(),
497
- commands: MattermostSlashCommandsSchema,
498
- interactions: zod_exports.z.object({
499
- callbackBaseUrl: zod_exports.z.string().optional(),
500
- allowedSourceIps: zod_exports.z.array(zod_exports.z.string()).optional()
501
- }).optional(),
502
- allowPrivateNetwork: zod_exports.z.boolean().optional(),
503
- dmChannelRetry: DmChannelRetrySchema
504
- }).strict();
505
- const MattermostAccountSchema = MattermostAccountSchemaBase.superRefine((value, ctx) => {
506
- requireMattermostOpenAllowFrom({
507
- policy: value.dmPolicy,
508
- allowFrom: value.allowFrom,
509
- ctx
510
- });
511
- });
512
- //#endregion
513
- //#region extensions/mattermost/src/config-surface.ts
514
- const MattermostChannelConfigSchema = buildChannelConfigSchema(MattermostAccountSchemaBase.extend({
515
- accounts: zod_exports.z.record(zod_exports.z.string(), MattermostAccountSchema.optional()).optional(),
516
- defaultAccount: zod_exports.z.string().optional()
517
- }).superRefine((value, ctx) => {
518
- requireMattermostOpenAllowFrom({
519
- policy: value.dmPolicy,
520
- allowFrom: value.allowFrom,
521
- ctx
522
- });
523
- }));
524
- //#endregion
525
- //#region extensions/mattermost/src/group-mentions.ts
526
- function resolveMattermostGroupRequireMention(params) {
527
- const account = resolveMattermostAccount({
528
- cfg: params.cfg,
529
- accountId: params.accountId
530
- });
531
- const requireMentionOverride = typeof params.requireMentionOverride === "boolean" ? params.requireMentionOverride : account.requireMention;
532
- return resolveChannelGroupRequireMention({
533
- cfg: params.cfg,
534
- channel: "mattermost",
535
- groupId: params.groupId,
536
- accountId: params.accountId,
537
- requireMentionOverride
538
- });
539
- }
540
- //#endregion
541
- //#region extensions/mattermost/src/mattermost/directory.ts
542
- function buildClient(params) {
543
- const account = resolveMattermostAccount({
544
- cfg: params.cfg,
545
- accountId: params.accountId
546
- });
547
- if (!account.enabled || !account.botToken || !account.baseUrl) return null;
548
- return createMattermostClient({
549
- baseUrl: account.baseUrl,
550
- botToken: account.botToken,
551
- allowPrivateNetwork: account.config?.allowPrivateNetwork === true
552
- });
553
- }
554
- /**
555
- * Build clients from ALL enabled accounts (deduplicated by token).
556
- *
557
- * We always scan every account because:
558
- * - Private channels are only visible to bots that are members
559
- * - The requesting agent's account may have an expired/invalid token
560
- *
561
- * This means a single healthy bot token is enough for directory discovery.
562
- */
563
- function buildClients(params) {
564
- const accountIds = listMattermostAccountIds(params.cfg);
565
- const seen = /* @__PURE__ */ new Set();
566
- const clients = [];
567
- for (const id of accountIds) {
568
- const client = buildClient({
569
- cfg: params.cfg,
570
- accountId: id
571
- });
572
- if (client && !seen.has(client.token)) {
573
- seen.add(client.token);
574
- clients.push(client);
575
- }
576
- }
577
- return clients;
578
- }
579
- /**
580
- * List channels (public + private) visible to any configured bot account.
581
- *
582
- * NOTE: Uses per_page=200 which covers most instances. Mattermost does not
583
- * return a "has more" indicator, so very large instances (200+ channels per bot)
584
- * may see incomplete results. Pagination can be added if needed.
585
- */
586
- async function listMattermostDirectoryGroups(params) {
587
- const clients = buildClients(params);
588
- if (!clients.length) return [];
589
- const q = params.query?.trim().toLowerCase() || "";
590
- const seenIds = /* @__PURE__ */ new Set();
591
- const entries = [];
592
- for (const client of clients) try {
593
- const me = await fetchMattermostMe(client);
594
- const channels = await client.request(`/users/${me.id}/channels?per_page=200`);
595
- for (const ch of channels) {
596
- if (ch.type !== "O" && ch.type !== "P") continue;
597
- if (seenIds.has(ch.id)) continue;
598
- if (q) {
599
- const name = (ch.name ?? "").toLowerCase();
600
- const display = (ch.display_name ?? "").toLowerCase();
601
- if (!name.includes(q) && !display.includes(q)) continue;
602
- }
603
- seenIds.add(ch.id);
604
- entries.push({
605
- kind: "group",
606
- id: `channel:${ch.id}`,
607
- name: ch.name ?? void 0,
608
- handle: ch.display_name ?? void 0
609
- });
610
- }
611
- } catch (err) {
612
- console.debug?.("[mattermost-directory] listGroups: skipping account:", err?.message);
613
- continue;
614
- }
615
- return params.limit && params.limit > 0 ? entries.slice(0, params.limit) : entries;
616
- }
617
- /**
618
- * List team members as peer directory entries.
619
- *
620
- * Uses only the first available client since all bots in a team see the same
621
- * user list (unlike channels where membership varies). Uses the first team
622
- * returned — multi-team setups will only see members from that team.
623
- *
624
- * NOTE: per_page=200 for member listing; same pagination caveat as groups.
625
- */
626
- async function listMattermostDirectoryPeers(params) {
627
- const clients = buildClients(params);
628
- if (!clients.length) return [];
629
- const client = clients[0];
630
- try {
631
- const me = await fetchMattermostMe(client);
632
- const teams = await client.request("/users/me/teams");
633
- if (!teams.length) return [];
634
- const teamId = teams[0].id;
635
- const q = params.query?.trim().toLowerCase() || "";
636
- let users;
637
- if (q) users = await client.request("/users/search", {
638
- method: "POST",
639
- body: JSON.stringify({
640
- term: q,
641
- team_id: teamId
642
- })
643
- });
644
- else {
645
- const userIds = (await client.request(`/teams/${teamId}/members?per_page=200`)).map((m) => m.user_id).filter((id) => id !== me.id);
646
- if (!userIds.length) return [];
647
- users = await client.request("/users/ids", {
648
- method: "POST",
649
- body: JSON.stringify(userIds)
650
- });
651
- }
652
- const entries = users.filter((u) => u.id !== me.id).map((u) => ({
653
- kind: "user",
654
- id: `user:${u.id}`,
655
- name: u.username ?? void 0,
656
- handle: [u.first_name, u.last_name].filter(Boolean).join(" ").trim() || u.nickname || void 0
657
- }));
658
- return params.limit && params.limit > 0 ? entries.slice(0, params.limit) : entries;
659
- } catch (err) {
660
- console.debug?.("[mattermost-directory] listPeers failed:", err?.message);
661
- return [];
662
- }
663
- }
664
- //#endregion
665
- //#region extensions/mattermost/src/runtime.ts
666
- const { setRuntime: setMattermostRuntime, getRuntime: getMattermostRuntime } = createPluginRuntimeStore("Mattermost runtime not initialized");
667
- //#endregion
668
- //#region extensions/mattermost/src/mattermost/interactions.ts
669
- const INTERACTION_MAX_BODY_BYTES = 64 * 1024;
670
- const INTERACTION_BODY_TIMEOUT_MS = 1e4;
671
- const SIGNED_CHANNEL_ID_CONTEXT_KEY = "__openclaw_channel_id";
672
- const callbackUrls = /* @__PURE__ */ new Map();
673
- function setInteractionCallbackUrl(accountId, url) {
674
- callbackUrls.set(accountId, url);
675
- }
676
- function resolveInteractionCallbackPath(accountId) {
677
- return `/mattermost/interactions/${accountId}`;
678
- }
679
- function isWildcardBindHost(rawHost) {
680
- const trimmed = rawHost.trim();
681
- if (!trimmed) return false;
682
- const host = trimmed.startsWith("[") && trimmed.endsWith("]") ? trimmed.slice(1, -1) : trimmed;
683
- return host === "0.0.0.0" || host === "::" || host === "0:0:0:0:0:0:0:0" || host === "::0";
684
- }
685
- function normalizeCallbackBaseUrl(baseUrl) {
686
- return baseUrl.trim().replace(/\/+$/, "");
687
- }
688
- function headerValue(value) {
689
- if (Array.isArray(value)) return value[0]?.trim() || void 0;
690
- return value?.trim() || void 0;
691
- }
692
- function isAllowedInteractionSource(params) {
693
- const { allowedSourceIps } = params;
694
- if (!allowedSourceIps?.length) return true;
695
- return isTrustedProxyAddress(resolveClientIp({
696
- remoteAddr: params.req.socket?.remoteAddress,
697
- forwardedFor: headerValue(params.req.headers["x-forwarded-for"]),
698
- realIp: headerValue(params.req.headers["x-real-ip"]),
699
- trustedProxies: params.trustedProxies,
700
- allowRealIpFallback: params.allowRealIpFallback
701
- }), allowedSourceIps);
702
- }
703
- /**
704
- * Resolve the interaction callback URL for an account.
705
- * Falls back to computing it from interactions.callbackBaseUrl or gateway host config.
706
- */
707
- function computeInteractionCallbackUrl(accountId, cfg) {
708
- const path = resolveInteractionCallbackPath(accountId);
709
- const callbackBaseUrl = cfg?.interactions?.callbackBaseUrl?.trim() ?? cfg?.channels?.mattermost?.interactions?.callbackBaseUrl?.trim();
710
- if (callbackBaseUrl) return `${normalizeCallbackBaseUrl(callbackBaseUrl)}${path}`;
711
- const port = typeof cfg?.gateway?.port === "number" ? cfg.gateway.port : 18789;
712
- let host = cfg?.gateway?.customBindHost && !isWildcardBindHost(cfg.gateway.customBindHost) ? cfg.gateway.customBindHost.trim() : "localhost";
713
- if (host.includes(":") && !(host.startsWith("[") && host.endsWith("]"))) host = `[${host}]`;
714
- return `http://${host}:${port}${path}`;
715
- }
716
- /**
717
- * Resolve the interaction callback URL for an account.
718
- * Prefers the in-memory registered URL (set by the gateway monitor) so callers outside the
719
- * monitor lifecycle can reuse the runtime-validated callback destination.
720
- */
721
- function resolveInteractionCallbackUrl(accountId, cfg) {
722
- const cached = callbackUrls.get(accountId);
723
- if (cached) return cached;
724
- return computeInteractionCallbackUrl(accountId, cfg);
725
- }
726
- const interactionSecrets = /* @__PURE__ */ new Map();
727
- let defaultInteractionSecret;
728
- function deriveInteractionSecret(botToken) {
729
- return createHmac("sha256", "openclaw-mattermost-interactions").update(botToken).digest("hex");
730
- }
731
- function setInteractionSecret(accountIdOrBotToken, botToken) {
732
- if (typeof botToken === "string") {
733
- interactionSecrets.set(accountIdOrBotToken, deriveInteractionSecret(botToken));
734
- return;
735
- }
736
- defaultInteractionSecret = deriveInteractionSecret(accountIdOrBotToken);
737
- }
738
- function getInteractionSecret(accountId) {
739
- const scoped = accountId ? interactionSecrets.get(accountId) : void 0;
740
- if (scoped) return scoped;
741
- if (defaultInteractionSecret) return defaultInteractionSecret;
742
- if (interactionSecrets.size === 1) {
743
- const first = interactionSecrets.values().next().value;
744
- if (typeof first === "string") return first;
745
- }
746
- throw new Error("Interaction secret not initialized — call setInteractionSecret(accountId, botToken) first");
747
- }
748
- function canonicalizeInteractionContext(value) {
749
- if (Array.isArray(value)) return value.map((item) => canonicalizeInteractionContext(item));
750
- if (value && typeof value === "object") {
751
- const entries = Object.entries(value).filter(([, entryValue]) => entryValue !== void 0).sort(([left], [right]) => left.localeCompare(right)).map(([key, entryValue]) => [key, canonicalizeInteractionContext(entryValue)]);
752
- return Object.fromEntries(entries);
753
- }
754
- return value;
755
- }
756
- function generateInteractionToken(context, accountId) {
757
- const secret = getInteractionSecret(accountId);
758
- const payload = JSON.stringify(canonicalizeInteractionContext(context));
759
- return createHmac("sha256", secret).update(payload).digest("hex");
760
- }
761
- function verifyInteractionToken(context, token, accountId) {
762
- return safeEqualSecret(generateInteractionToken(context, accountId), token);
763
- }
764
- /**
765
- * Build Mattermost `props.attachments` with interactive buttons.
766
- *
767
- * Each button includes an HMAC token in its integration context so the
768
- * callback handler can verify the request originated from a legitimate
769
- * button click (Mattermost's recommended security pattern).
770
- */
771
- /**
772
- * Sanitize a button ID so Mattermost's action router can match it.
773
- * Mattermost uses the action ID in the URL path `/api/v4/posts/{id}/actions/{actionId}`
774
- * and IDs containing hyphens or underscores break the server-side routing.
775
- * See: https://github.com/mattermost/mattermost/issues/25747
776
- */
777
- function sanitizeActionId(id) {
778
- return id.replace(/[-_]/g, "");
779
- }
780
- function buildButtonAttachments(params) {
781
- const actions = params.buttons.map((btn) => {
782
- const safeId = sanitizeActionId(btn.id);
783
- const context = {
784
- action_id: safeId,
785
- ...btn.context
786
- };
787
- const token = generateInteractionToken(context, params.accountId);
788
- return {
789
- id: safeId,
790
- type: "button",
791
- name: btn.name,
792
- style: btn.style,
793
- integration: {
794
- url: params.callbackUrl,
795
- context: {
796
- ...context,
797
- _token: token
798
- }
799
- }
800
- };
801
- });
802
- return [{
803
- text: params.text ?? "",
804
- actions
805
- }];
806
- }
807
- function buildButtonProps(params) {
808
- const buttons = params.buttons.flatMap((item) => Array.isArray(item) ? item : [item]).map((btn) => ({
809
- id: String(btn.id ?? btn.callback_data ?? "").trim(),
810
- name: String(btn.text ?? btn.name ?? btn.label ?? "").trim(),
811
- style: btn.style ?? "default",
812
- context: typeof btn.context === "object" && btn.context !== null ? {
813
- ...btn.context,
814
- [SIGNED_CHANNEL_ID_CONTEXT_KEY]: params.channelId
815
- } : { [SIGNED_CHANNEL_ID_CONTEXT_KEY]: params.channelId }
816
- })).filter((btn) => btn.id && btn.name);
817
- if (buttons.length === 0) return;
818
- return { attachments: buildButtonAttachments({
819
- callbackUrl: params.callbackUrl,
820
- accountId: params.accountId,
821
- buttons,
822
- text: params.text
823
- }) };
824
- }
825
- function readInteractionBody(req) {
826
- return new Promise((resolve, reject) => {
827
- const chunks = [];
828
- let totalBytes = 0;
829
- const timer = setTimeout(() => {
830
- req.destroy();
831
- reject(/* @__PURE__ */ new Error("Request body read timeout"));
832
- }, INTERACTION_BODY_TIMEOUT_MS);
833
- req.on("data", (chunk) => {
834
- totalBytes += chunk.length;
835
- if (totalBytes > INTERACTION_MAX_BODY_BYTES) {
836
- req.destroy();
837
- clearTimeout(timer);
838
- reject(/* @__PURE__ */ new Error("Request body too large"));
839
- return;
840
- }
841
- chunks.push(chunk);
842
- });
843
- req.on("end", () => {
844
- clearTimeout(timer);
845
- resolve(Buffer.concat(chunks).toString("utf8"));
846
- });
847
- req.on("error", (err) => {
848
- clearTimeout(timer);
849
- reject(err);
850
- });
851
- });
852
- }
853
- function createMattermostInteractionHandler(params) {
854
- const { client, accountId, log } = params;
855
- const core = getMattermostRuntime();
856
- return async (req, res) => {
857
- if (req.method !== "POST") {
858
- res.statusCode = 405;
859
- res.setHeader("Allow", "POST");
860
- res.setHeader("Content-Type", "application/json");
861
- res.end(JSON.stringify({ error: "Method Not Allowed" }));
862
- return;
863
- }
864
- if (!isAllowedInteractionSource({
865
- req,
866
- allowedSourceIps: params.allowedSourceIps,
867
- trustedProxies: params.trustedProxies,
868
- allowRealIpFallback: params.allowRealIpFallback
869
- })) {
870
- log?.(`mattermost interaction: rejected callback source remote=${req.socket?.remoteAddress ?? "?"}`);
871
- res.statusCode = 403;
872
- res.setHeader("Content-Type", "application/json");
873
- res.end(JSON.stringify({ error: "Forbidden origin" }));
874
- return;
875
- }
876
- let payload;
877
- try {
878
- const raw = await readInteractionBody(req);
879
- payload = JSON.parse(raw);
880
- } catch (err) {
881
- log?.(`mattermost interaction: failed to parse body: ${String(err)}`);
882
- res.statusCode = 400;
883
- res.setHeader("Content-Type", "application/json");
884
- res.end(JSON.stringify({ error: "Invalid request body" }));
885
- return;
886
- }
887
- const context = payload.context;
888
- if (!context) {
889
- res.statusCode = 400;
890
- res.setHeader("Content-Type", "application/json");
891
- res.end(JSON.stringify({ error: "Missing context" }));
892
- return;
893
- }
894
- const token = context._token;
895
- if (typeof token !== "string") {
896
- log?.("mattermost interaction: missing _token in context");
897
- res.statusCode = 403;
898
- res.setHeader("Content-Type", "application/json");
899
- res.end(JSON.stringify({ error: "Missing token" }));
900
- return;
901
- }
902
- const { _token, ...contextWithoutToken } = context;
903
- if (!verifyInteractionToken(contextWithoutToken, token, accountId)) {
904
- log?.("mattermost interaction: invalid _token");
905
- res.statusCode = 403;
906
- res.setHeader("Content-Type", "application/json");
907
- res.end(JSON.stringify({ error: "Invalid token" }));
908
- return;
909
- }
910
- const actionId = context.action_id;
911
- if (typeof actionId !== "string") {
912
- res.statusCode = 400;
913
- res.setHeader("Content-Type", "application/json");
914
- res.end(JSON.stringify({ error: "Missing action_id in context" }));
915
- return;
916
- }
917
- const signedChannelId = typeof contextWithoutToken[SIGNED_CHANNEL_ID_CONTEXT_KEY] === "string" ? contextWithoutToken[SIGNED_CHANNEL_ID_CONTEXT_KEY].trim() : "";
918
- if (signedChannelId && signedChannelId !== payload.channel_id) {
919
- log?.(`mattermost interaction: signed channel mismatch payload=${payload.channel_id} signed=${signedChannelId}`);
920
- res.statusCode = 403;
921
- res.setHeader("Content-Type", "application/json");
922
- res.end(JSON.stringify({ error: "Channel mismatch" }));
923
- return;
924
- }
925
- const userName = payload.user_name ?? payload.user_id;
926
- let originalMessage = "";
927
- let originalPost = null;
928
- let clickedButtonName = null;
929
- try {
930
- originalPost = await client.request(`/posts/${payload.post_id}`);
931
- const postChannelId = originalPost.channel_id?.trim();
932
- if (!postChannelId || postChannelId !== payload.channel_id) {
933
- log?.(`mattermost interaction: post channel mismatch payload=${payload.channel_id} post=${postChannelId ?? "<missing>"}`);
934
- res.statusCode = 403;
935
- res.setHeader("Content-Type", "application/json");
936
- res.end(JSON.stringify({ error: "Post/channel mismatch" }));
937
- return;
938
- }
939
- originalMessage = originalPost.message ?? "";
940
- const postAttachments = Array.isArray(originalPost?.props?.attachments) ? originalPost.props.attachments : [];
941
- for (const att of postAttachments) {
942
- const match = att.actions?.find((a) => a.id === actionId);
943
- if (match?.name) {
944
- clickedButtonName = match.name;
945
- break;
946
- }
947
- }
948
- if (clickedButtonName === null) {
949
- log?.(`mattermost interaction: action ${actionId} not found in post ${payload.post_id}`);
950
- res.statusCode = 403;
951
- res.setHeader("Content-Type", "application/json");
952
- res.end(JSON.stringify({ error: "Unknown action" }));
953
- return;
954
- }
955
- } catch (err) {
956
- log?.(`mattermost interaction: failed to validate post ${payload.post_id}: ${String(err)}`);
957
- res.statusCode = 500;
958
- res.setHeader("Content-Type", "application/json");
959
- res.end(JSON.stringify({ error: "Failed to validate interaction" }));
960
- return;
961
- }
962
- if (!originalPost) {
963
- log?.(`mattermost interaction: missing fetched post ${payload.post_id}`);
964
- res.statusCode = 500;
965
- res.setHeader("Content-Type", "application/json");
966
- res.end(JSON.stringify({ error: "Failed to load interaction post" }));
967
- return;
968
- }
969
- log?.(`mattermost interaction: action=${actionId} user=${payload.user_name ?? payload.user_id} post=${payload.post_id} channel=${payload.channel_id}`);
970
- if (params.authorizeButtonClick) try {
971
- const authorization = await params.authorizeButtonClick({
972
- payload,
973
- post: originalPost
974
- });
975
- if (!authorization.ok) {
976
- res.statusCode = authorization.statusCode ?? 200;
977
- res.setHeader("Content-Type", "application/json");
978
- res.end(JSON.stringify(authorization.response ?? { ephemeral_text: "You are not allowed to use this action here." }));
979
- return;
980
- }
981
- } catch (err) {
982
- log?.(`mattermost interaction: authorization failed: ${String(err)}`);
983
- res.statusCode = 500;
984
- res.setHeader("Content-Type", "application/json");
985
- res.end(JSON.stringify({ error: "Interaction authorization failed" }));
986
- return;
987
- }
988
- if (params.handleInteraction) try {
989
- const response = await params.handleInteraction({
990
- payload,
991
- userName,
992
- actionId,
993
- actionName: clickedButtonName,
994
- originalMessage,
995
- context: contextWithoutToken,
996
- post: originalPost
997
- });
998
- if (response !== null) {
999
- res.statusCode = 200;
1000
- res.setHeader("Content-Type", "application/json");
1001
- res.end(JSON.stringify(response));
1002
- return;
1003
- }
1004
- } catch (err) {
1005
- log?.(`mattermost interaction: custom handler failed: ${String(err)}`);
1006
- res.statusCode = 500;
1007
- res.setHeader("Content-Type", "application/json");
1008
- res.end(JSON.stringify({ error: "Interaction handler failed" }));
1009
- return;
1010
- }
1011
- try {
1012
- const eventLabel = `Mattermost button click: action="${actionId}" by ${payload.user_name ?? payload.user_id} in channel ${payload.channel_id}`;
1013
- const sessionKey = params.resolveSessionKey ? await params.resolveSessionKey({
1014
- channelId: payload.channel_id,
1015
- userId: payload.user_id,
1016
- post: originalPost
1017
- }) : `agent:main:mattermost:${accountId}:${payload.channel_id}`;
1018
- core.system.enqueueSystemEvent(eventLabel, {
1019
- sessionKey,
1020
- contextKey: `mattermost:interaction:${payload.post_id}:${actionId}`
1021
- });
1022
- } catch (err) {
1023
- log?.(`mattermost interaction: system event dispatch failed: ${String(err)}`);
1024
- }
1025
- try {
1026
- await updateMattermostPost(client, payload.post_id, {
1027
- message: originalMessage,
1028
- props: { attachments: [{ text: `✓ **${clickedButtonName}** selected by @${userName}` }] }
1029
- });
1030
- } catch (err) {
1031
- log?.(`mattermost interaction: failed to update post ${payload.post_id}: ${String(err)}`);
1032
- }
1033
- res.statusCode = 200;
1034
- res.setHeader("Content-Type", "application/json");
1035
- res.end("{}");
1036
- if (params.dispatchButtonClick) try {
1037
- await params.dispatchButtonClick({
1038
- channelId: payload.channel_id,
1039
- userId: payload.user_id,
1040
- userName,
1041
- actionId,
1042
- actionName: clickedButtonName,
1043
- postId: payload.post_id,
1044
- post: originalPost
1045
- });
1046
- } catch (err) {
1047
- log?.(`mattermost interaction: dispatchButtonClick failed: ${String(err)}`);
1048
- }
1049
- };
1050
- }
1051
- //#endregion
1052
- //#region extensions/mattermost/src/mattermost/model-picker.ts
1053
- const MATTERMOST_MODEL_PICKER_CONTEXT_KEY = "oc_model_picker";
1054
- const MODELS_PAGE_SIZE = 8;
1055
- const ACTION_IDS = {
1056
- providers: "mdlprov",
1057
- list: "mdllist",
1058
- select: "mdlsel",
1059
- back: "mdlback"
1060
- };
1061
- function splitModelRef(modelRef) {
1062
- const match = (modelRef?.trim())?.match(/^([^/]+)\/(.+)$/u);
1063
- if (!match) return null;
1064
- const provider = normalizeProviderId(match[1]);
1065
- const model = match[2].trim();
1066
- if (!provider || !model) return null;
1067
- return {
1068
- provider,
1069
- model
1070
- };
1071
- }
1072
- function normalizePage(value) {
1073
- if (!Number.isFinite(value)) return 1;
1074
- return Math.max(1, Math.floor(value));
1075
- }
1076
- function paginateItems(items, page, pageSize = MODELS_PAGE_SIZE) {
1077
- const totalPages = Math.max(1, Math.ceil(items.length / pageSize));
1078
- const safePage = Math.max(1, Math.min(normalizePage(page), totalPages));
1079
- const start = (safePage - 1) * pageSize;
1080
- return {
1081
- items: items.slice(start, start + pageSize),
1082
- page: safePage,
1083
- totalPages,
1084
- hasPrev: safePage > 1,
1085
- hasNext: safePage < totalPages,
1086
- totalItems: items.length
1087
- };
1088
- }
1089
- function buildContext(state) {
1090
- return {
1091
- [MATTERMOST_MODEL_PICKER_CONTEXT_KEY]: true,
1092
- ...state
1093
- };
1094
- }
1095
- function buildButtonId(state) {
1096
- const digest = createHash("sha256").update(JSON.stringify(state)).digest("hex").slice(0, 12);
1097
- return `${ACTION_IDS[state.action]}${digest}`;
1098
- }
1099
- function buildButton(params) {
1100
- const baseState = params.action === "providers" || params.action === "back" ? {
1101
- action: params.action,
1102
- ownerUserId: params.ownerUserId
1103
- } : params.action === "list" ? {
1104
- action: "list",
1105
- ownerUserId: params.ownerUserId,
1106
- provider: normalizeProviderId(params.provider ?? ""),
1107
- page: normalizePage(params.page)
1108
- } : {
1109
- action: "select",
1110
- ownerUserId: params.ownerUserId,
1111
- provider: normalizeProviderId(params.provider ?? ""),
1112
- page: normalizePage(params.page),
1113
- model: String(params.model ?? "").trim()
1114
- };
1115
- return {
1116
- id: buildButtonId(baseState),
1117
- text: params.text,
1118
- ...params.style ? { style: params.style } : {},
1119
- context: buildContext(baseState)
1120
- };
1121
- }
1122
- function getProviderModels(data, provider) {
1123
- return [...data.byProvider.get(normalizeProviderId(provider)) ?? /* @__PURE__ */ new Set()].toSorted();
1124
- }
1125
- function formatCurrentModelLine(currentModel) {
1126
- const parsed = splitModelRef(currentModel);
1127
- if (!parsed) return "Current: default";
1128
- return `Current: ${parsed.provider}/${parsed.model}`;
1129
- }
1130
- function resolveMattermostModelPickerEntry(commandText) {
1131
- const normalized = commandText.trim().replace(/\s+/g, " ");
1132
- if (/^\/model$/i.test(normalized)) return { kind: "summary" };
1133
- if (/^\/models$/i.test(normalized)) return { kind: "providers" };
1134
- const providerMatch = normalized.match(/^\/models\s+(\S+)$/i);
1135
- if (!providerMatch?.[1]) return null;
1136
- return {
1137
- kind: "models",
1138
- provider: normalizeProviderId(providerMatch[1])
1139
- };
1140
- }
1141
- function parseMattermostModelPickerContext(context) {
1142
- if (!context || context[MATTERMOST_MODEL_PICKER_CONTEXT_KEY] !== true) return null;
1143
- const ownerUserId = String(context.ownerUserId ?? "").trim();
1144
- const action = String(context.action ?? "").trim();
1145
- if (!ownerUserId) return null;
1146
- if (action === "providers" || action === "back") return {
1147
- action,
1148
- ownerUserId
1149
- };
1150
- const provider = normalizeProviderId(String(context.provider ?? ""));
1151
- const page = Number.parseInt(String(context.page ?? "1"), 10);
1152
- if (!provider) return null;
1153
- if (action === "list") return {
1154
- action,
1155
- ownerUserId,
1156
- provider,
1157
- page: normalizePage(page)
1158
- };
1159
- if (action === "select") {
1160
- const model = String(context.model ?? "").trim();
1161
- if (!model) return null;
1162
- return {
1163
- action,
1164
- ownerUserId,
1165
- provider,
1166
- page: normalizePage(page),
1167
- model
1168
- };
1169
- }
1170
- return null;
1171
- }
1172
- function buildMattermostAllowedModelRefs(data) {
1173
- const refs = /* @__PURE__ */ new Set();
1174
- for (const provider of data.providers) for (const model of data.byProvider.get(provider) ?? []) refs.add(`${provider}/${model}`);
1175
- return refs;
1176
- }
1177
- function resolveMattermostModelPickerCurrentModel(params) {
1178
- const fallback = `${params.data.resolvedDefault.provider}/${params.data.resolvedDefault.model}`;
1179
- try {
1180
- const storePath = resolveStorePath(params.cfg.session?.store, { agentId: params.route.agentId });
1181
- const sessionStore = params.skipCache ? loadSessionStore(storePath, { skipCache: true }) : loadSessionStore(storePath);
1182
- const sessionEntry = sessionStore[params.route.sessionKey];
1183
- const override = resolveStoredModelOverride({
1184
- sessionEntry,
1185
- sessionStore,
1186
- sessionKey: params.route.sessionKey
1187
- });
1188
- if (!override?.model) return fallback;
1189
- const provider = (override.provider || params.data.resolvedDefault.provider).trim();
1190
- return provider ? `${provider}/${override.model}` : fallback;
1191
- } catch {
1192
- return fallback;
1193
- }
1194
- }
1195
- function renderMattermostModelSummaryView(params) {
1196
- return {
1197
- text: [
1198
- formatCurrentModelLine(params.currentModel),
1199
- "",
1200
- "Tap below to browse models, or use:",
1201
- "/oc_model <provider/model> to switch",
1202
- "/oc_model status for details"
1203
- ].join("\n"),
1204
- buttons: [[buildButton({
1205
- action: "providers",
1206
- ownerUserId: params.ownerUserId,
1207
- text: "Browse providers",
1208
- style: "primary"
1209
- })]]
1210
- };
1211
- }
1212
- function renderMattermostProviderPickerView(params) {
1213
- const currentProvider = splitModelRef(params.currentModel)?.provider;
1214
- const rows = params.data.providers.map((provider) => [buildButton({
1215
- action: "list",
1216
- ownerUserId: params.ownerUserId,
1217
- text: `${provider} (${params.data.byProvider.get(provider)?.size ?? 0})`,
1218
- provider,
1219
- page: 1,
1220
- style: provider === currentProvider ? "primary" : "default"
1221
- })]);
1222
- return {
1223
- text: [
1224
- formatCurrentModelLine(params.currentModel),
1225
- "",
1226
- "Select a provider:"
1227
- ].join("\n"),
1228
- buttons: rows
1229
- };
1230
- }
1231
- function renderMattermostModelsPickerView(params) {
1232
- const provider = normalizeProviderId(params.provider);
1233
- const models = getProviderModels(params.data, provider);
1234
- const current = splitModelRef(params.currentModel);
1235
- if (models.length === 0) return {
1236
- text: [
1237
- formatCurrentModelLine(params.currentModel),
1238
- "",
1239
- `Unknown provider: ${provider}`
1240
- ].join("\n"),
1241
- buttons: [[buildButton({
1242
- action: "back",
1243
- ownerUserId: params.ownerUserId,
1244
- text: "Back to providers"
1245
- })]]
1246
- };
1247
- const page = paginateItems(models, params.page);
1248
- const rows = page.items.map((model) => {
1249
- const isCurrent = current?.provider === provider && current.model === model;
1250
- return [buildButton({
1251
- action: "select",
1252
- ownerUserId: params.ownerUserId,
1253
- text: isCurrent ? `${model} [current]` : model,
1254
- provider,
1255
- model,
1256
- page: page.page,
1257
- style: isCurrent ? "primary" : "default"
1258
- })];
1259
- });
1260
- const navRow = [];
1261
- if (page.hasPrev) navRow.push(buildButton({
1262
- action: "list",
1263
- ownerUserId: params.ownerUserId,
1264
- text: "Prev",
1265
- provider,
1266
- page: page.page - 1
1267
- }));
1268
- if (page.hasNext) navRow.push(buildButton({
1269
- action: "list",
1270
- ownerUserId: params.ownerUserId,
1271
- text: "Next",
1272
- provider,
1273
- page: page.page + 1
1274
- }));
1275
- if (navRow.length > 0) rows.push(navRow);
1276
- rows.push([buildButton({
1277
- action: "back",
1278
- ownerUserId: params.ownerUserId,
1279
- text: "Back to providers"
1280
- })]);
1281
- return {
1282
- text: [
1283
- `Models (${provider}) - ${page.totalItems} available`,
1284
- formatCurrentModelLine(params.currentModel),
1285
- `Page ${page.page}/${page.totalPages}`,
1286
- "Select a model to switch immediately."
1287
- ].join("\n"),
1288
- buttons: rows
1289
- };
1290
- }
1291
- //#endregion
1292
- //#region extensions/mattermost/src/mattermost/monitor-gating.ts
1293
- function mapMattermostChannelTypeToChatType(channelType) {
1294
- if (!channelType) return "channel";
1295
- const normalized = channelType.trim().toUpperCase();
1296
- if (normalized === "D") return "direct";
1297
- if (normalized === "G" || normalized === "P") return "group";
1298
- return "channel";
1299
- }
1300
- function evaluateMattermostMentionGate(params) {
1301
- const shouldRequireMention = params.kind !== "direct" && params.resolveRequireMention({
1302
- cfg: params.cfg,
1303
- channel: "mattermost",
1304
- accountId: params.accountId,
1305
- groupId: params.channelId,
1306
- requireMentionOverride: params.requireMentionOverride
1307
- });
1308
- const shouldBypassMention = params.isControlCommand && shouldRequireMention && !params.wasMentioned && params.commandAuthorized;
1309
- const effectiveWasMentioned = params.wasMentioned || shouldBypassMention || params.oncharTriggered;
1310
- if (params.oncharEnabled && !params.oncharTriggered && !params.wasMentioned && !params.isControlCommand) return {
1311
- shouldRequireMention,
1312
- shouldBypassMention,
1313
- effectiveWasMentioned,
1314
- dropReason: "onchar-not-triggered"
1315
- };
1316
- if (params.kind !== "direct" && shouldRequireMention && params.canDetectMention && !effectiveWasMentioned) return {
1317
- shouldRequireMention,
1318
- shouldBypassMention,
1319
- effectiveWasMentioned,
1320
- dropReason: "missing-mention"
1321
- };
1322
- return {
1323
- shouldRequireMention,
1324
- shouldBypassMention,
1325
- effectiveWasMentioned,
1326
- dropReason: null
1327
- };
1328
- }
1329
- //#endregion
1330
- //#region extensions/mattermost/src/mattermost/monitor-helpers.ts
1331
- const formatInboundFromLabel = formatInboundFromLabel$1;
1332
- function resolveThreadSessionKeys(params) {
1333
- return resolveThreadSessionKeys$1({
1334
- ...params,
1335
- normalizeThreadId: (threadId) => threadId
1336
- });
1337
- }
1338
- /**
1339
- * Strip bot mention from message text while preserving newlines and
1340
- * block-level Markdown formatting (headings, lists, blockquotes).
1341
- */
1342
- function normalizeMention(text, mention) {
1343
- if (!mention) return text.trim();
1344
- const escaped = mention.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
1345
- const hasMentionRe = new RegExp(`@${escaped}\\b`, "i");
1346
- const leadingMentionRe = new RegExp(`^([\\t ]*)@${escaped}\\b[\\t ]*`, "i");
1347
- const trailingMentionRe = new RegExp(`[\\t ]*@${escaped}\\b[\\t ]*$`, "i");
1348
- const normalizedLines = text.split("\n").map((line) => {
1349
- const hadMention = hasMentionRe.test(line);
1350
- const normalizedLine = line.replace(leadingMentionRe, "$1").replace(trailingMentionRe, "").replace(new RegExp(`@${escaped}\\b`, "gi"), "").replace(/(\S)[ \t]{2,}/g, "$1 ");
1351
- return {
1352
- text: normalizedLine,
1353
- mentionOnlyBlank: hadMention && normalizedLine.trim() === ""
1354
- };
1355
- });
1356
- while (normalizedLines[0]?.mentionOnlyBlank) normalizedLines.shift();
1357
- while (normalizedLines.at(-1)?.text.trim() === "") normalizedLines.pop();
1358
- return normalizedLines.map((line) => line.text).join("\n");
1359
- }
1360
- //#endregion
1361
- //#region extensions/mattermost/src/mattermost/monitor-onchar.ts
1362
- const DEFAULT_ONCHAR_PREFIXES = [">", "!"];
1363
- function resolveOncharPrefixes(prefixes) {
1364
- const cleaned = prefixes?.map((entry) => entry.trim()).filter(Boolean) ?? DEFAULT_ONCHAR_PREFIXES;
1365
- return cleaned.length > 0 ? cleaned : DEFAULT_ONCHAR_PREFIXES;
1366
- }
1367
- function stripOncharPrefix(text, prefixes) {
1368
- const trimmed = text.trimStart();
1369
- for (const prefix of prefixes) {
1370
- if (!prefix) continue;
1371
- if (trimmed.startsWith(prefix)) return {
1372
- triggered: true,
1373
- stripped: trimmed.slice(prefix.length).trimStart()
1374
- };
1375
- }
1376
- return {
1377
- triggered: false,
1378
- stripped: text
1379
- };
1380
- }
1381
- //#endregion
1382
- //#region extensions/mattermost/src/mattermost/monitor-resources.ts
1383
- const CHANNEL_CACHE_TTL_MS = 5 * 6e4;
1384
- const USER_CACHE_TTL_MS = 10 * 6e4;
1385
- function createMattermostMonitorResources(params) {
1386
- const { accountId, callbackUrl, client, logger, mediaMaxBytes, fetchRemoteMedia, saveMediaBuffer, mediaKindFromMime } = params;
1387
- const channelCache = /* @__PURE__ */ new Map();
1388
- const userCache = /* @__PURE__ */ new Map();
1389
- const resolveMattermostMedia = async (fileIds) => {
1390
- const ids = (fileIds ?? []).map((id) => id?.trim()).filter(Boolean);
1391
- if (ids.length === 0) return [];
1392
- const out = [];
1393
- for (const fileId of ids) try {
1394
- const fetched = await fetchRemoteMedia({
1395
- url: `${client.apiBaseUrl}/files/${fileId}`,
1396
- requestInit: { headers: { Authorization: `Bearer ${client.token}` } },
1397
- filePathHint: fileId,
1398
- maxBytes: mediaMaxBytes,
1399
- ssrfPolicy: { allowedHostnames: [new URL(client.baseUrl).hostname] }
1400
- });
1401
- const saved = await saveMediaBuffer(Buffer.from(fetched.buffer), fetched.contentType ?? void 0, "inbound", mediaMaxBytes);
1402
- const contentType = saved.contentType ?? fetched.contentType ?? void 0;
1403
- out.push({
1404
- path: saved.path,
1405
- contentType,
1406
- kind: mediaKindFromMime(contentType) ?? "unknown"
1407
- });
1408
- } catch (err) {
1409
- logger.debug?.(`mattermost: failed to download file ${fileId}: ${String(err)}`);
1410
- }
1411
- return out;
1412
- };
1413
- const sendTypingIndicator = async (channelId, parentId) => {
1414
- await sendMattermostTyping(client, {
1415
- channelId,
1416
- parentId
1417
- });
1418
- };
1419
- const resolveChannelInfo = async (channelId) => {
1420
- const cached = channelCache.get(channelId);
1421
- if (cached && cached.expiresAt > Date.now()) return cached.value;
1422
- try {
1423
- const info = await fetchMattermostChannel(client, channelId);
1424
- channelCache.set(channelId, {
1425
- value: info,
1426
- expiresAt: Date.now() + CHANNEL_CACHE_TTL_MS
1427
- });
1428
- return info;
1429
- } catch (err) {
1430
- logger.debug?.(`mattermost: channel lookup failed: ${String(err)}`);
1431
- channelCache.set(channelId, {
1432
- value: null,
1433
- expiresAt: Date.now() + CHANNEL_CACHE_TTL_MS
1434
- });
1435
- return null;
1436
- }
1437
- };
1438
- const resolveUserInfo = async (userId) => {
1439
- const cached = userCache.get(userId);
1440
- if (cached && cached.expiresAt > Date.now()) return cached.value;
1441
- try {
1442
- const info = await fetchMattermostUser(client, userId);
1443
- userCache.set(userId, {
1444
- value: info,
1445
- expiresAt: Date.now() + USER_CACHE_TTL_MS
1446
- });
1447
- return info;
1448
- } catch (err) {
1449
- logger.debug?.(`mattermost: user lookup failed: ${String(err)}`);
1450
- userCache.set(userId, {
1451
- value: null,
1452
- expiresAt: Date.now() + USER_CACHE_TTL_MS
1453
- });
1454
- return null;
1455
- }
1456
- };
1457
- const buildModelPickerProps = (channelId, buttons) => buildButtonProps({
1458
- callbackUrl,
1459
- accountId,
1460
- channelId,
1461
- buttons
1462
- });
1463
- const updateModelPickerPost = async (params) => {
1464
- const props = buildModelPickerProps(params.channelId, params.buttons ?? []) ?? { attachments: [] };
1465
- await updateMattermostPost(client, params.postId, {
1466
- message: params.message,
1467
- props
1468
- });
1469
- return {};
1470
- };
1471
- return {
1472
- resolveMattermostMedia,
1473
- sendTypingIndicator,
1474
- resolveChannelInfo,
1475
- resolveUserInfo,
1476
- updateModelPickerPost
1477
- };
1478
- }
1479
- //#endregion
1480
- //#region extensions/mattermost/src/mattermost/slash-commands.ts
1481
- /**
1482
- * Built-in OpenClaw commands to register as native slash commands.
1483
- * These mirror the text-based commands already handled by the gateway.
1484
- */
1485
- const DEFAULT_COMMAND_SPECS = [
1486
- {
1487
- trigger: "oc_status",
1488
- originalName: "status",
1489
- description: "Show session status (model, usage, uptime)",
1490
- autoComplete: true
1491
- },
1492
- {
1493
- trigger: "oc_model",
1494
- originalName: "model",
1495
- description: "View or change the current model",
1496
- autoComplete: true,
1497
- autoCompleteHint: "[model-name]"
1498
- },
1499
- {
1500
- trigger: "oc_models",
1501
- originalName: "models",
1502
- description: "Browse available models",
1503
- autoComplete: true,
1504
- autoCompleteHint: "[provider]"
1505
- },
1506
- {
1507
- trigger: "oc_new",
1508
- originalName: "new",
1509
- description: "Start a new conversation session",
1510
- autoComplete: true
1511
- },
1512
- {
1513
- trigger: "oc_help",
1514
- originalName: "help",
1515
- description: "Show available commands",
1516
- autoComplete: true
1517
- },
1518
- {
1519
- trigger: "oc_think",
1520
- originalName: "think",
1521
- description: "Set thinking/reasoning level",
1522
- autoComplete: true,
1523
- autoCompleteHint: "[off|low|medium|high]"
1524
- },
1525
- {
1526
- trigger: "oc_reasoning",
1527
- originalName: "reasoning",
1528
- description: "Toggle reasoning mode",
1529
- autoComplete: true,
1530
- autoCompleteHint: "[on|off]"
1531
- },
1532
- {
1533
- trigger: "oc_verbose",
1534
- originalName: "verbose",
1535
- description: "Toggle verbose mode",
1536
- autoComplete: true,
1537
- autoCompleteHint: "[on|off]"
1538
- }
1539
- ];
1540
- /**
1541
- * List existing custom slash commands for a team.
1542
- */
1543
- async function listMattermostCommands(client, teamId) {
1544
- return await client.request(`/commands?team_id=${encodeURIComponent(teamId)}&custom_only=true`);
1545
- }
1546
- /**
1547
- * Create a custom slash command on a Mattermost team.
1548
- */
1549
- async function createMattermostCommand(client, params) {
1550
- return await client.request("/commands", {
1551
- method: "POST",
1552
- body: JSON.stringify(params)
1553
- });
1554
- }
1555
- /**
1556
- * Delete a custom slash command.
1557
- */
1558
- async function deleteMattermostCommand(client, commandId) {
1559
- await client.request(`/commands/${encodeURIComponent(commandId)}`, { method: "DELETE" });
1560
- }
1561
- /**
1562
- * Update an existing custom slash command.
1563
- */
1564
- async function updateMattermostCommand(client, params) {
1565
- return await client.request(`/commands/${encodeURIComponent(params.id)}`, {
1566
- method: "PUT",
1567
- body: JSON.stringify(params)
1568
- });
1569
- }
1570
- /**
1571
- * Register all OpenClaw slash commands for a given team.
1572
- * Skips commands that are already registered with the same trigger + callback URL.
1573
- * Returns the list of newly created command IDs.
1574
- */
1575
- async function registerSlashCommands(params) {
1576
- const { client, teamId, creatorUserId, callbackUrl, commands, log } = params;
1577
- const normalizedCreatorUserId = creatorUserId.trim();
1578
- if (!normalizedCreatorUserId) throw new Error("creatorUserId is required for slash command reconciliation");
1579
- let existing = [];
1580
- try {
1581
- existing = await listMattermostCommands(client, teamId);
1582
- } catch (err) {
1583
- log?.(`mattermost: failed to list existing commands: ${String(err)}`);
1584
- throw err;
1585
- }
1586
- const existingByTrigger = /* @__PURE__ */ new Map();
1587
- for (const cmd of existing) {
1588
- const list = existingByTrigger.get(cmd.trigger) ?? [];
1589
- list.push(cmd);
1590
- existingByTrigger.set(cmd.trigger, list);
1591
- }
1592
- const registered = [];
1593
- for (const spec of commands) {
1594
- const existingForTrigger = existingByTrigger.get(spec.trigger) ?? [];
1595
- const ownedCommands = existingForTrigger.filter((cmd) => cmd.creator_id?.trim() === normalizedCreatorUserId);
1596
- const foreignCommands = existingForTrigger.filter((cmd) => cmd.creator_id?.trim() !== normalizedCreatorUserId);
1597
- if (ownedCommands.length === 0 && foreignCommands.length > 0) {
1598
- log?.(`mattermost: trigger /${spec.trigger} already used by non-OpenClaw command(s); skipping to avoid mutating external integrations`);
1599
- continue;
1600
- }
1601
- if (ownedCommands.length > 1) log?.(`mattermost: multiple owned commands found for /${spec.trigger}; using the first and leaving extras untouched`);
1602
- const existingCmd = ownedCommands[0];
1603
- if (existingCmd && existingCmd.url === callbackUrl) {
1604
- log?.(`mattermost: command /${spec.trigger} already registered (id=${existingCmd.id})`);
1605
- registered.push({
1606
- id: existingCmd.id,
1607
- trigger: spec.trigger,
1608
- teamId,
1609
- token: existingCmd.token,
1610
- managed: false
1611
- });
1612
- continue;
1613
- }
1614
- if (existingCmd && existingCmd.url !== callbackUrl) {
1615
- log?.(`mattermost: command /${spec.trigger} exists with different callback URL; updating (id=${existingCmd.id})`);
1616
- try {
1617
- const updated = await updateMattermostCommand(client, {
1618
- id: existingCmd.id,
1619
- team_id: teamId,
1620
- trigger: spec.trigger,
1621
- method: "P",
1622
- url: callbackUrl,
1623
- description: spec.description,
1624
- auto_complete: spec.autoComplete,
1625
- auto_complete_desc: spec.description,
1626
- auto_complete_hint: spec.autoCompleteHint
1627
- });
1628
- registered.push({
1629
- id: updated.id,
1630
- trigger: spec.trigger,
1631
- teamId,
1632
- token: updated.token,
1633
- managed: false
1634
- });
1635
- continue;
1636
- } catch (err) {
1637
- log?.(`mattermost: failed to update command /${spec.trigger} (id=${existingCmd.id}): ${String(err)}`);
1638
- try {
1639
- await deleteMattermostCommand(client, existingCmd.id);
1640
- log?.(`mattermost: deleted stale command /${spec.trigger} (id=${existingCmd.id})`);
1641
- } catch (deleteErr) {
1642
- log?.(`mattermost: failed to delete stale command /${spec.trigger} (id=${existingCmd.id}): ${String(deleteErr)}`);
1643
- continue;
1644
- }
1645
- }
1646
- }
1647
- try {
1648
- const created = await createMattermostCommand(client, {
1649
- team_id: teamId,
1650
- trigger: spec.trigger,
1651
- method: "P",
1652
- url: callbackUrl,
1653
- description: spec.description,
1654
- auto_complete: spec.autoComplete,
1655
- auto_complete_desc: spec.description,
1656
- auto_complete_hint: spec.autoCompleteHint
1657
- });
1658
- log?.(`mattermost: registered command /${spec.trigger} (id=${created.id})`);
1659
- registered.push({
1660
- id: created.id,
1661
- trigger: spec.trigger,
1662
- teamId,
1663
- token: created.token,
1664
- managed: true
1665
- });
1666
- } catch (err) {
1667
- log?.(`mattermost: failed to register command /${spec.trigger}: ${String(err)}`);
1668
- }
1669
- }
1670
- return registered;
1671
- }
1672
- /**
1673
- * Clean up all registered slash commands.
1674
- */
1675
- async function cleanupSlashCommands(params) {
1676
- const { client, commands, log } = params;
1677
- for (const cmd of commands) {
1678
- if (!cmd.managed) continue;
1679
- try {
1680
- await deleteMattermostCommand(client, cmd.id);
1681
- log?.(`mattermost: deleted command /${cmd.trigger} (id=${cmd.id})`);
1682
- } catch (err) {
1683
- log?.(`mattermost: failed to delete command /${cmd.trigger}: ${String(err)}`);
1684
- }
1685
- }
1686
- }
1687
- /**
1688
- * Parse a Mattermost slash command callback payload from a URL-encoded or JSON body.
1689
- */
1690
- function parseSlashCommandPayload(body, contentType) {
1691
- if (!body) return null;
1692
- try {
1693
- if (contentType?.includes("application/json")) {
1694
- const parsed = JSON.parse(body);
1695
- const token = typeof parsed.token === "string" ? parsed.token : "";
1696
- const teamId = typeof parsed.team_id === "string" ? parsed.team_id : "";
1697
- const channelId = typeof parsed.channel_id === "string" ? parsed.channel_id : "";
1698
- const userId = typeof parsed.user_id === "string" ? parsed.user_id : "";
1699
- const command = typeof parsed.command === "string" ? parsed.command : "";
1700
- if (!token || !teamId || !channelId || !userId || !command) return null;
1701
- return {
1702
- token,
1703
- team_id: teamId,
1704
- team_domain: typeof parsed.team_domain === "string" ? parsed.team_domain : void 0,
1705
- channel_id: channelId,
1706
- channel_name: typeof parsed.channel_name === "string" ? parsed.channel_name : void 0,
1707
- user_id: userId,
1708
- user_name: typeof parsed.user_name === "string" ? parsed.user_name : void 0,
1709
- command,
1710
- text: typeof parsed.text === "string" ? parsed.text : "",
1711
- trigger_id: typeof parsed.trigger_id === "string" ? parsed.trigger_id : void 0,
1712
- response_url: typeof parsed.response_url === "string" ? parsed.response_url : void 0
1713
- };
1714
- }
1715
- const params = new URLSearchParams(body);
1716
- const token = params.get("token");
1717
- const teamId = params.get("team_id");
1718
- const channelId = params.get("channel_id");
1719
- const userId = params.get("user_id");
1720
- const command = params.get("command");
1721
- if (!token || !teamId || !channelId || !userId || !command) return null;
1722
- return {
1723
- token,
1724
- team_id: teamId,
1725
- team_domain: params.get("team_domain") ?? void 0,
1726
- channel_id: channelId,
1727
- channel_name: params.get("channel_name") ?? void 0,
1728
- user_id: userId,
1729
- user_name: params.get("user_name") ?? void 0,
1730
- command,
1731
- text: params.get("text") ?? "",
1732
- trigger_id: params.get("trigger_id") ?? void 0,
1733
- response_url: params.get("response_url") ?? void 0
1734
- };
1735
- } catch {
1736
- return null;
1737
- }
1738
- }
1739
- /**
1740
- * Map the trigger word back to the original OpenClaw command name.
1741
- * e.g. "oc_status" -> "/status", "oc_model" -> "/model"
1742
- */
1743
- function resolveCommandText(trigger, text, triggerMap) {
1744
- const commandName = triggerMap?.get(trigger) ?? (trigger.startsWith("oc_") ? trigger.slice(3) : trigger);
1745
- const args = text.trim();
1746
- return args ? `/${commandName} ${args}` : `/${commandName}`;
1747
- }
1748
- const DEFAULT_CALLBACK_PATH = "/api/channels/mattermost/command";
1749
- /**
1750
- * Ensure the callback path starts with a leading `/` to prevent
1751
- * malformed URLs like `http://host:portapi/...`.
1752
- */
1753
- function normalizeCallbackPath(path) {
1754
- const trimmed = path.trim();
1755
- if (!trimmed) return DEFAULT_CALLBACK_PATH;
1756
- return trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
1757
- }
1758
- function resolveSlashCommandConfig(raw) {
1759
- return {
1760
- native: raw?.native ?? "auto",
1761
- nativeSkills: raw?.nativeSkills ?? "auto",
1762
- callbackPath: normalizeCallbackPath(raw?.callbackPath ?? DEFAULT_CALLBACK_PATH),
1763
- callbackUrl: raw?.callbackUrl?.trim() || void 0
1764
- };
1765
- }
1766
- function isSlashCommandsEnabled(config) {
1767
- if (config.native === true) return true;
1768
- if (config.native === false) return false;
1769
- return false;
1770
- }
1771
- /**
1772
- * Build the callback URL that Mattermost will POST to when a command is invoked.
1773
- */
1774
- function resolveCallbackUrl(params) {
1775
- if (params.config.callbackUrl) return params.config.callbackUrl;
1776
- const isWildcardBindHost = (rawHost) => {
1777
- const trimmed = rawHost.trim();
1778
- if (!trimmed) return false;
1779
- const host = trimmed.startsWith("[") && trimmed.endsWith("]") ? trimmed.slice(1, -1) : trimmed;
1780
- return host === "0.0.0.0" || host === "::" || host === "0:0:0:0:0:0:0:0" || host === "::0";
1781
- };
1782
- let host = params.gatewayHost && !isWildcardBindHost(params.gatewayHost) ? params.gatewayHost : "localhost";
1783
- const path = normalizeCallbackPath(params.config.callbackPath);
1784
- if (host.includes(":") && !(host.startsWith("[") && host.endsWith("]"))) host = `[${host}]`;
1785
- return `http://${host}:${params.gatewayPort}${path}`;
1786
- }
1787
- //#endregion
1788
- //#region extensions/mattermost/src/mattermost/reply-delivery.ts
1789
- async function deliverMattermostReplyPayload(params) {
1790
- const reply = resolveSendableOutboundReplyParts(params.payload, { text: params.core.channel.text.convertMarkdownTables(params.payload.text ?? "", params.tableMode) });
1791
- const mediaLocalRoots = getAgentScopedMediaLocalRoots(params.cfg, params.agentId);
1792
- const chunkMode = params.core.channel.text.resolveChunkMode(params.cfg, "mattermost", params.accountId);
1793
- await deliverTextOrMediaReply({
1794
- payload: params.payload,
1795
- text: reply.text,
1796
- chunkText: (value) => params.core.channel.text.chunkMarkdownTextWithMode(value, params.textLimit, chunkMode),
1797
- sendText: async (chunk) => {
1798
- await params.sendMessage(params.to, chunk, {
1799
- cfg: params.cfg,
1800
- accountId: params.accountId,
1801
- replyToId: params.replyToId
1802
- });
1803
- },
1804
- sendMedia: async ({ mediaUrl, caption }) => {
1805
- await params.sendMessage(params.to, caption ?? "", {
1806
- cfg: params.cfg,
1807
- accountId: params.accountId,
1808
- mediaUrl,
1809
- mediaLocalRoots,
1810
- replyToId: params.replyToId
1811
- });
1812
- }
1813
- });
1814
- }
1815
- //#endregion
1816
- //#region extensions/mattermost/src/mattermost/target-resolution.ts
1817
- const mattermostOpaqueTargetCache = /* @__PURE__ */ new Map();
1818
- function cacheKey$1(baseUrl, token, id) {
1819
- return `${baseUrl}::${token}::${id}`;
1820
- }
1821
- /** Mattermost IDs are 26-character lowercase alphanumeric strings. */
1822
- function isMattermostId(value) {
1823
- return /^[a-z0-9]{26}$/.test(value);
1824
- }
1825
- function isExplicitMattermostTarget(raw) {
1826
- const trimmed = raw.trim();
1827
- if (!trimmed) return false;
1828
- return /^(channel|user|mattermost):/i.test(trimmed) || trimmed.startsWith("@") || trimmed.startsWith("#");
1829
- }
1830
- function parseMattermostApiStatus(err) {
1831
- if (!err || typeof err !== "object") return;
1832
- const msg = "message" in err ? String(err.message ?? "") : "";
1833
- const match = /Mattermost API (\d{3})\b/.exec(msg);
1834
- if (!match) return;
1835
- const code = Number(match[1]);
1836
- return Number.isFinite(code) ? code : void 0;
1837
- }
1838
- async function resolveMattermostOpaqueTarget(params) {
1839
- const input = params.input.trim();
1840
- if (!input || isExplicitMattermostTarget(input) || !isMattermostId(input)) return null;
1841
- const account = params.cfg && (!params.token || !params.baseUrl) ? resolveMattermostAccount({
1842
- cfg: params.cfg,
1843
- accountId: params.accountId
1844
- }) : null;
1845
- const token = params.token?.trim() || account?.botToken?.trim();
1846
- const baseUrl = normalizeMattermostBaseUrl(params.baseUrl ?? account?.baseUrl);
1847
- if (!token || !baseUrl) return null;
1848
- const key = cacheKey$1(baseUrl, token, input);
1849
- const cached = mattermostOpaqueTargetCache.get(key);
1850
- if (cached === true) return {
1851
- kind: "user",
1852
- id: input,
1853
- to: `user:${input}`
1854
- };
1855
- if (cached === false) return {
1856
- kind: "channel",
1857
- id: input,
1858
- to: `channel:${input}`
1859
- };
1860
- const client = createMattermostClient({
1861
- baseUrl,
1862
- botToken: token,
1863
- allowPrivateNetwork: account?.config?.allowPrivateNetwork === true
1864
- });
1865
- try {
1866
- await fetchMattermostUser(client, input);
1867
- mattermostOpaqueTargetCache.set(key, true);
1868
- return {
1869
- kind: "user",
1870
- id: input,
1871
- to: `user:${input}`
1872
- };
1873
- } catch (err) {
1874
- if (parseMattermostApiStatus(err) === 404) mattermostOpaqueTargetCache.set(key, false);
1875
- return {
1876
- kind: "channel",
1877
- id: input,
1878
- to: `channel:${input}`
1879
- };
1880
- }
1881
- }
1882
- //#endregion
1883
- //#region extensions/mattermost/src/mattermost/send.ts
1884
- const botUserCache = /* @__PURE__ */ new Map();
1885
- const userByNameCache = /* @__PURE__ */ new Map();
1886
- const channelByNameCache = /* @__PURE__ */ new Map();
1887
- const dmChannelCache = /* @__PURE__ */ new Map();
1888
- const getCore = () => getMattermostRuntime();
1889
- function recordMattermostOutboundActivity(accountId) {
1890
- try {
1891
- getCore().channel.activity.record({
1892
- channel: "mattermost",
1893
- accountId,
1894
- direction: "outbound"
1895
- });
1896
- } catch (error) {
1897
- if (!(error instanceof Error) || error.message !== "Mattermost runtime not initialized") throw error;
1898
- }
1899
- }
1900
- function cacheKey(baseUrl, token) {
1901
- return `${baseUrl}::${token}`;
1902
- }
1903
- function normalizeMessage(text, mediaUrl) {
1904
- return [text.trim(), mediaUrl?.trim()].filter(Boolean).join("\n");
1905
- }
1906
- function isHttpUrl(value) {
1907
- return /^https?:\/\//i.test(value);
1908
- }
1909
- function parseMattermostTarget(raw) {
1910
- const trimmed = raw.trim();
1911
- if (!trimmed) throw new Error("Recipient is required for Mattermost sends");
1912
- const lower = trimmed.toLowerCase();
1913
- if (lower.startsWith("channel:")) {
1914
- const id = trimmed.slice(8).trim();
1915
- if (!id) throw new Error("Channel id is required for Mattermost sends");
1916
- if (id.startsWith("#")) {
1917
- const name = id.slice(1).trim();
1918
- if (!name) throw new Error("Channel name is required for Mattermost sends");
1919
- return {
1920
- kind: "channel-name",
1921
- name
1922
- };
1923
- }
1924
- if (!isMattermostId(id)) return {
1925
- kind: "channel-name",
1926
- name: id
1927
- };
1928
- return {
1929
- kind: "channel",
1930
- id
1931
- };
1932
- }
1933
- if (lower.startsWith("user:")) {
1934
- const id = trimmed.slice(5).trim();
1935
- if (!id) throw new Error("User id is required for Mattermost sends");
1936
- return {
1937
- kind: "user",
1938
- id
1939
- };
1940
- }
1941
- if (lower.startsWith("mattermost:")) {
1942
- const id = trimmed.slice(11).trim();
1943
- if (!id) throw new Error("User id is required for Mattermost sends");
1944
- return {
1945
- kind: "user",
1946
- id
1947
- };
1948
- }
1949
- if (trimmed.startsWith("@")) {
1950
- const username = trimmed.slice(1).trim();
1951
- if (!username) throw new Error("Username is required for Mattermost sends");
1952
- return {
1953
- kind: "user",
1954
- username
1955
- };
1956
- }
1957
- if (trimmed.startsWith("#")) {
1958
- const name = trimmed.slice(1).trim();
1959
- if (!name) throw new Error("Channel name is required for Mattermost sends");
1960
- return {
1961
- kind: "channel-name",
1962
- name
1963
- };
1964
- }
1965
- if (!isMattermostId(trimmed)) return {
1966
- kind: "channel-name",
1967
- name: trimmed
1968
- };
1969
- return {
1970
- kind: "channel",
1971
- id: trimmed
1972
- };
1973
- }
1974
- async function resolveBotUser(baseUrl, token, allowPrivateNetwork) {
1975
- const key = cacheKey(baseUrl, token);
1976
- const cached = botUserCache.get(key);
1977
- if (cached) return cached;
1978
- const user = await fetchMattermostMe(createMattermostClient({
1979
- baseUrl,
1980
- botToken: token,
1981
- allowPrivateNetwork
1982
- }));
1983
- botUserCache.set(key, user);
1984
- return user;
1985
- }
1986
- async function resolveUserIdByUsername(params) {
1987
- const { baseUrl, token, username } = params;
1988
- const key = `${cacheKey(baseUrl, token)}::${username.toLowerCase()}`;
1989
- const cached = userByNameCache.get(key);
1990
- if (cached?.id) return cached.id;
1991
- const user = await fetchMattermostUserByUsername(createMattermostClient({
1992
- baseUrl,
1993
- botToken: token,
1994
- allowPrivateNetwork: params.allowPrivateNetwork
1995
- }), username);
1996
- userByNameCache.set(key, user);
1997
- return user.id;
1998
- }
1999
- async function resolveChannelIdByName(params) {
2000
- const { baseUrl, token, name } = params;
2001
- const key = `${cacheKey(baseUrl, token)}::channel::${name.toLowerCase()}`;
2002
- const cached = channelByNameCache.get(key);
2003
- if (cached) return cached;
2004
- const client = createMattermostClient({
2005
- baseUrl,
2006
- botToken: token,
2007
- allowPrivateNetwork: params.allowPrivateNetwork
2008
- });
2009
- const teams = await fetchMattermostUserTeams(client, (await fetchMattermostMe(client)).id);
2010
- for (const team of teams) try {
2011
- const channel = await fetchMattermostChannelByName(client, team.id, name);
2012
- if (channel?.id) {
2013
- channelByNameCache.set(key, channel.id);
2014
- return channel.id;
2015
- }
2016
- } catch {}
2017
- throw new Error(`Mattermost channel "#${name}" not found in any team the bot belongs to`);
2018
- }
2019
- function mergeDmRetryOptions(base, override) {
2020
- const merged = {
2021
- maxRetries: override?.maxRetries ?? base?.maxRetries,
2022
- initialDelayMs: override?.initialDelayMs ?? base?.initialDelayMs,
2023
- maxDelayMs: override?.maxDelayMs ?? base?.maxDelayMs,
2024
- timeoutMs: override?.timeoutMs ?? base?.timeoutMs,
2025
- onRetry: override?.onRetry
2026
- };
2027
- if (merged.maxRetries === void 0 && merged.initialDelayMs === void 0 && merged.maxDelayMs === void 0 && merged.timeoutMs === void 0 && merged.onRetry === void 0) return;
2028
- return merged;
2029
- }
2030
- async function resolveTargetChannelId(params) {
2031
- if (params.target.kind === "channel") return params.target.id;
2032
- if (params.target.kind === "channel-name") return await resolveChannelIdByName({
2033
- baseUrl: params.baseUrl,
2034
- token: params.token,
2035
- name: params.target.name,
2036
- allowPrivateNetwork: params.allowPrivateNetwork
2037
- });
2038
- const userId = params.target.id ? params.target.id : await resolveUserIdByUsername({
2039
- baseUrl: params.baseUrl,
2040
- token: params.token,
2041
- username: params.target.username ?? "",
2042
- allowPrivateNetwork: params.allowPrivateNetwork
2043
- });
2044
- const dmKey = `${cacheKey(params.baseUrl, params.token)}::dm::${userId}`;
2045
- const cachedDm = dmChannelCache.get(dmKey);
2046
- if (cachedDm) return cachedDm;
2047
- const botUser = await resolveBotUser(params.baseUrl, params.token, params.allowPrivateNetwork);
2048
- const channel = await createMattermostDirectChannelWithRetry(createMattermostClient({
2049
- baseUrl: params.baseUrl,
2050
- botToken: params.token,
2051
- allowPrivateNetwork: params.allowPrivateNetwork
2052
- }), [botUser.id, userId], {
2053
- ...params.dmRetryOptions,
2054
- onRetry: (attempt, delayMs, error) => {
2055
- params.dmRetryOptions?.onRetry?.(attempt, delayMs, error);
2056
- if (params.logger) params.logger.warn?.(`DM channel creation retry ${attempt} after ${delayMs}ms: ${error.message}`);
2057
- }
2058
- });
2059
- dmChannelCache.set(dmKey, channel.id);
2060
- return channel.id;
2061
- }
2062
- async function resolveMattermostSendContext(to, opts = {}) {
2063
- const core = getCore();
2064
- const logger = core.logging.getChildLogger({ module: "mattermost" });
2065
- const cfg = opts.cfg ?? core.config.loadConfig();
2066
- const account = resolveMattermostAccount({
2067
- cfg,
2068
- accountId: opts.accountId
2069
- });
2070
- const token = opts.botToken?.trim() || account.botToken?.trim();
2071
- if (!token) throw new Error(`Mattermost bot token missing for account "${account.accountId}" (set channels.mattermost.accounts.${account.accountId}.botToken or MATTERMOST_BOT_TOKEN for default).`);
2072
- const baseUrl = normalizeMattermostBaseUrl(opts.baseUrl ?? account.baseUrl);
2073
- if (!baseUrl) throw new Error(`Mattermost baseUrl missing for account "${account.accountId}" (set channels.mattermost.accounts.${account.accountId}.baseUrl or MATTERMOST_URL for default).`);
2074
- const trimmedTo = to?.trim() ?? "";
2075
- const opaqueTarget = await resolveMattermostOpaqueTarget({
2076
- input: trimmedTo,
2077
- token,
2078
- baseUrl
2079
- });
2080
- const target = opaqueTarget?.kind === "user" ? {
2081
- kind: "user",
2082
- id: opaqueTarget.id
2083
- } : opaqueTarget?.kind === "channel" ? {
2084
- kind: "channel",
2085
- id: opaqueTarget.id
2086
- } : parseMattermostTarget(trimmedTo);
2087
- const dmRetryOptions = mergeDmRetryOptions(account.config.dmChannelRetry ? {
2088
- maxRetries: account.config.dmChannelRetry.maxRetries,
2089
- initialDelayMs: account.config.dmChannelRetry.initialDelayMs,
2090
- maxDelayMs: account.config.dmChannelRetry.maxDelayMs,
2091
- timeoutMs: account.config.dmChannelRetry.timeoutMs
2092
- } : void 0, opts.dmRetryOptions);
2093
- const allowPrivateNetwork = account.config.allowPrivateNetwork === true;
2094
- const channelId = await resolveTargetChannelId({
2095
- target,
2096
- baseUrl,
2097
- token,
2098
- allowPrivateNetwork,
2099
- dmRetryOptions,
2100
- logger: core.logging.shouldLogVerbose() ? logger : void 0
2101
- });
2102
- return {
2103
- cfg,
2104
- accountId: account.accountId,
2105
- token,
2106
- baseUrl,
2107
- channelId,
2108
- allowPrivateNetwork
2109
- };
2110
- }
2111
- async function sendMessageMattermost(to, text, opts = {}) {
2112
- const core = getCore();
2113
- const logger = core.logging.getChildLogger({ module: "mattermost" });
2114
- const { cfg, accountId, token, baseUrl, channelId, allowPrivateNetwork } = await resolveMattermostSendContext(to, opts);
2115
- const client = createMattermostClient({
2116
- baseUrl,
2117
- botToken: token,
2118
- allowPrivateNetwork
2119
- });
2120
- let props = opts.props;
2121
- if (!props && Array.isArray(opts.buttons) && opts.buttons.length > 0) {
2122
- setInteractionSecret(accountId, token);
2123
- props = buildButtonProps({
2124
- callbackUrl: resolveInteractionCallbackUrl(accountId, {
2125
- gateway: cfg.gateway,
2126
- interactions: resolveMattermostAccount({
2127
- cfg,
2128
- accountId
2129
- }).config?.interactions
2130
- }),
2131
- accountId,
2132
- channelId,
2133
- buttons: opts.buttons,
2134
- text: opts.attachmentText
2135
- });
2136
- }
2137
- let message = text?.trim() ?? "";
2138
- let fileIds;
2139
- let uploadError;
2140
- const mediaUrl = opts.mediaUrl?.trim();
2141
- if (mediaUrl) try {
2142
- const media = await loadOutboundMediaFromUrl(mediaUrl, {
2143
- mediaLocalRoots: opts.mediaLocalRoots,
2144
- mediaReadFile: opts.mediaReadFile
2145
- });
2146
- fileIds = [(await uploadMattermostFile(client, {
2147
- channelId,
2148
- buffer: media.buffer,
2149
- fileName: media.fileName ?? "upload",
2150
- contentType: media.contentType ?? void 0
2151
- })).id];
2152
- } catch (err) {
2153
- uploadError = err instanceof Error ? err : new Error(String(err));
2154
- if (core.logging.shouldLogVerbose()) logger.debug?.(`mattermost send: media upload failed, falling back to URL text: ${String(err)}`);
2155
- message = normalizeMessage(message, isHttpUrl(mediaUrl) ? mediaUrl : "");
2156
- }
2157
- if (message) {
2158
- const tableMode = resolveMarkdownTableMode({
2159
- cfg,
2160
- channel: "mattermost",
2161
- accountId
2162
- });
2163
- message = convertMarkdownTables(message, tableMode);
2164
- }
2165
- if (!message && (!fileIds || fileIds.length === 0)) {
2166
- if (uploadError) throw new Error(`Mattermost media upload failed: ${uploadError.message}`);
2167
- throw new Error("Mattermost message is empty");
2168
- }
2169
- const post = await createMattermostPost(client, {
2170
- channelId,
2171
- message,
2172
- rootId: opts.replyToId,
2173
- fileIds,
2174
- props
2175
- });
2176
- recordMattermostOutboundActivity(accountId);
2177
- return {
2178
- messageId: post.id ?? "unknown",
2179
- channelId
2180
- };
2181
- }
2182
- //#endregion
2183
- //#region extensions/mattermost/src/mattermost/slash-http.ts
2184
- const MAX_BODY_BYTES = 64 * 1024;
2185
- const BODY_READ_TIMEOUT_MS = 5e3;
2186
- /**
2187
- * Read the full request body as a string.
2188
- */
2189
- function readBody(req, maxBytes) {
2190
- return readRequestBodyWithLimit(req, {
2191
- maxBytes,
2192
- timeoutMs: BODY_READ_TIMEOUT_MS
2193
- });
2194
- }
2195
- function sendJsonResponse(res, status, body) {
2196
- res.statusCode = status;
2197
- res.setHeader("Content-Type", "application/json; charset=utf-8");
2198
- res.end(JSON.stringify(body));
2199
- }
2200
- async function authorizeSlashInvocation(params) {
2201
- const { account, cfg, client, commandText, channelId, senderId, senderName, log } = params;
2202
- const core = getMattermostRuntime();
2203
- let channelInfo = null;
2204
- try {
2205
- channelInfo = await fetchMattermostChannel(client, channelId);
2206
- } catch (err) {
2207
- log?.(`mattermost: slash channel lookup failed for ${channelId}: ${String(err)}`);
2208
- }
2209
- if (!channelInfo) return {
2210
- ok: false,
2211
- denyResponse: {
2212
- response_type: "ephemeral",
2213
- text: "Temporary error: unable to determine channel type. Please try again."
2214
- },
2215
- commandAuthorized: false,
2216
- channelInfo: null,
2217
- kind: "channel",
2218
- chatType: "channel",
2219
- channelName: "",
2220
- channelDisplay: "",
2221
- roomLabel: `#${channelId}`
2222
- };
2223
- const allowTextCommands = core.channel.commands.shouldHandleTextCommands({
2224
- cfg,
2225
- surface: "mattermost"
2226
- });
2227
- const hasControlCommand = core.channel.text.hasControlCommand(commandText, cfg);
2228
- const storeAllowFrom = normalizeMattermostAllowList(await core.channel.pairing.readAllowFromStore({
2229
- channel: "mattermost",
2230
- accountId: account.accountId
2231
- }).catch(() => []));
2232
- const decision = authorizeMattermostCommandInvocation({
2233
- account,
2234
- cfg,
2235
- senderId,
2236
- senderName,
2237
- channelId,
2238
- channelInfo,
2239
- storeAllowFrom,
2240
- allowTextCommands,
2241
- hasControlCommand
2242
- });
2243
- if (!decision.ok) {
2244
- if (decision.denyReason === "dm-pairing") {
2245
- const { code } = await core.channel.pairing.upsertPairingRequest({
2246
- channel: "mattermost",
2247
- accountId: account.accountId,
2248
- id: senderId,
2249
- meta: { name: senderName }
2250
- });
2251
- return {
2252
- ...decision,
2253
- denyResponse: {
2254
- response_type: "ephemeral",
2255
- text: core.channel.pairing.buildPairingReply({
2256
- channel: "mattermost",
2257
- idLine: `Your Mattermost user id: ${senderId}`,
2258
- code
2259
- })
2260
- }
2261
- };
2262
- }
2263
- const denyText = decision.denyReason === "unknown-channel" ? "Temporary error: unable to determine channel type. Please try again." : decision.denyReason === "dm-disabled" ? "This bot is not accepting direct messages." : decision.denyReason === "channels-disabled" ? "Slash commands are disabled in channels." : decision.denyReason === "channel-no-allowlist" ? "Slash commands are not configured for this channel (no allowlist)." : "Unauthorized.";
2264
- return {
2265
- ...decision,
2266
- denyResponse: {
2267
- response_type: "ephemeral",
2268
- text: denyText
2269
- }
2270
- };
2271
- }
2272
- return {
2273
- ...decision,
2274
- denyResponse: void 0
2275
- };
2276
- }
2277
- /**
2278
- * Create the HTTP request handler for Mattermost slash command callbacks.
2279
- *
2280
- * This handler is registered as a plugin HTTP route and receives POSTs
2281
- * from the Mattermost server when a user invokes a registered slash command.
2282
- */
2283
- function createSlashCommandHttpHandler(params) {
2284
- const { account, cfg, runtime, commandTokens, triggerMap, log } = params;
2285
- return async (req, res) => {
2286
- if (req.method !== "POST") {
2287
- res.statusCode = 405;
2288
- res.setHeader("Allow", "POST");
2289
- res.end("Method Not Allowed");
2290
- return;
2291
- }
2292
- let body;
2293
- try {
2294
- body = await readBody(req, MAX_BODY_BYTES);
2295
- } catch (error) {
2296
- if (isRequestBodyLimitError(error, "REQUEST_BODY_TIMEOUT")) {
2297
- res.statusCode = 408;
2298
- res.end("Request body timeout");
2299
- return;
2300
- }
2301
- res.statusCode = 413;
2302
- res.end("Payload Too Large");
2303
- return;
2304
- }
2305
- const contentType = req.headers["content-type"] ?? "";
2306
- const payload = parseSlashCommandPayload(body, contentType);
2307
- if (!payload) {
2308
- sendJsonResponse(res, 400, {
2309
- response_type: "ephemeral",
2310
- text: "Invalid slash command payload."
2311
- });
2312
- return;
2313
- }
2314
- if (commandTokens.size === 0 || !commandTokens.has(payload.token)) {
2315
- sendJsonResponse(res, 401, {
2316
- response_type: "ephemeral",
2317
- text: "Unauthorized: invalid command token."
2318
- });
2319
- return;
2320
- }
2321
- const trigger = payload.command.replace(/^\//, "").trim();
2322
- const commandText = resolveCommandText(trigger, payload.text, triggerMap);
2323
- const channelId = payload.channel_id;
2324
- const senderId = payload.user_id;
2325
- const senderName = payload.user_name ?? senderId;
2326
- const client = createMattermostClient({
2327
- baseUrl: account.baseUrl ?? "",
2328
- botToken: account.botToken ?? "",
2329
- allowPrivateNetwork: account.config?.allowPrivateNetwork === true
2330
- });
2331
- const auth = await authorizeSlashInvocation({
2332
- account,
2333
- cfg,
2334
- client,
2335
- commandText,
2336
- channelId,
2337
- senderId,
2338
- senderName,
2339
- log
2340
- });
2341
- if (!auth.ok) {
2342
- sendJsonResponse(res, 200, auth.denyResponse ?? {
2343
- response_type: "ephemeral",
2344
- text: "Unauthorized."
2345
- });
2346
- return;
2347
- }
2348
- log?.(`mattermost: slash command /${trigger} from ${senderName} in ${channelId}`);
2349
- sendJsonResponse(res, 200, {
2350
- response_type: "ephemeral",
2351
- text: "Processing..."
2352
- });
2353
- try {
2354
- await handleSlashCommandAsync({
2355
- account,
2356
- cfg,
2357
- runtime,
2358
- client,
2359
- commandText,
2360
- channelId,
2361
- senderId,
2362
- senderName,
2363
- teamId: payload.team_id,
2364
- triggerId: payload.trigger_id,
2365
- kind: auth.kind,
2366
- chatType: auth.chatType,
2367
- channelName: auth.channelName,
2368
- channelDisplay: auth.channelDisplay,
2369
- roomLabel: auth.roomLabel,
2370
- commandAuthorized: auth.commandAuthorized,
2371
- log
2372
- });
2373
- } catch (err) {
2374
- log?.(`mattermost: slash command handler error: ${String(err)}`);
2375
- try {
2376
- await sendMessageMattermost(`channel:${channelId}`, "Sorry, something went wrong processing that command.", {
2377
- cfg,
2378
- accountId: account.accountId
2379
- });
2380
- } catch {}
2381
- }
2382
- };
2383
- }
2384
- async function handleSlashCommandAsync(params) {
2385
- const { account, cfg, runtime, client, commandText, channelId, senderId, senderName, teamId, kind, chatType, channelName, channelDisplay, roomLabel, commandAuthorized, triggerId, log } = params;
2386
- const core = getMattermostRuntime();
2387
- const route = core.channel.routing.resolveAgentRoute({
2388
- cfg,
2389
- channel: "mattermost",
2390
- accountId: account.accountId,
2391
- teamId,
2392
- peer: {
2393
- kind,
2394
- id: kind === "direct" ? senderId : channelId
2395
- }
2396
- });
2397
- const fromLabel = kind === "direct" ? `Mattermost DM from ${senderName}` : `Mattermost message in ${roomLabel} from ${senderName}`;
2398
- const to = kind === "direct" ? `user:${senderId}` : `channel:${channelId}`;
2399
- const pickerEntry = resolveMattermostModelPickerEntry(commandText);
2400
- if (pickerEntry) {
2401
- const data = await buildModelsProviderData(cfg, route.agentId);
2402
- if (data.providers.length === 0) {
2403
- await sendMessageMattermost(to, "No models available.", {
2404
- cfg,
2405
- accountId: account.accountId
2406
- });
2407
- return;
2408
- }
2409
- const currentModel = resolveMattermostModelPickerCurrentModel({
2410
- cfg,
2411
- route,
2412
- data
2413
- });
2414
- const view = pickerEntry.kind === "summary" ? renderMattermostModelSummaryView({
2415
- ownerUserId: senderId,
2416
- currentModel
2417
- }) : pickerEntry.kind === "providers" ? renderMattermostProviderPickerView({
2418
- ownerUserId: senderId,
2419
- data,
2420
- currentModel
2421
- }) : renderMattermostModelsPickerView({
2422
- ownerUserId: senderId,
2423
- data,
2424
- provider: pickerEntry.provider,
2425
- page: 1,
2426
- currentModel
2427
- });
2428
- await sendMessageMattermost(to, view.text, {
2429
- cfg,
2430
- accountId: account.accountId,
2431
- buttons: view.buttons
2432
- });
2433
- runtime.log?.(`delivered model picker to ${to}`);
2434
- return;
2435
- }
2436
- const ctxPayload = core.channel.reply.finalizeInboundContext({
2437
- Body: commandText,
2438
- BodyForAgent: commandText,
2439
- RawBody: commandText,
2440
- CommandBody: commandText,
2441
- From: kind === "direct" ? `mattermost:${senderId}` : kind === "group" ? `mattermost:group:${channelId}` : `mattermost:channel:${channelId}`,
2442
- To: to,
2443
- SessionKey: route.sessionKey,
2444
- AccountId: route.accountId,
2445
- ChatType: chatType,
2446
- ConversationLabel: fromLabel,
2447
- GroupSubject: kind !== "direct" ? channelDisplay || roomLabel : void 0,
2448
- SenderName: senderName,
2449
- SenderId: senderId,
2450
- Provider: "mattermost",
2451
- Surface: "mattermost",
2452
- MessageSid: triggerId ?? `slash-${Date.now()}`,
2453
- Timestamp: Date.now(),
2454
- WasMentioned: true,
2455
- CommandAuthorized: commandAuthorized,
2456
- CommandSource: "native",
2457
- OriginatingChannel: "mattermost",
2458
- OriginatingTo: to
2459
- });
2460
- const textLimit = core.channel.text.resolveTextChunkLimit(cfg, "mattermost", account.accountId, { fallbackLimit: account.textChunkLimit ?? 4e3 });
2461
- const tableMode = core.channel.text.resolveMarkdownTableMode({
2462
- cfg,
2463
- channel: "mattermost",
2464
- accountId: account.accountId
2465
- });
2466
- const { onModelSelected, typingCallbacks, ...replyPipeline } = createChannelReplyPipeline({
2467
- cfg,
2468
- agentId: route.agentId,
2469
- channel: "mattermost",
2470
- accountId: account.accountId,
2471
- typing: {
2472
- start: () => sendMattermostTyping(client, { channelId }),
2473
- onStartError: (err) => {
2474
- logTypingFailure({
2475
- log: (message) => log?.(message),
2476
- channel: "mattermost",
2477
- target: channelId,
2478
- error: err
2479
- });
2480
- }
2481
- }
2482
- });
2483
- const humanDelay = core.channel.reply.resolveHumanDelayConfig(cfg, route.agentId);
2484
- const { dispatcher, replyOptions, markDispatchIdle } = core.channel.reply.createReplyDispatcherWithTyping({
2485
- ...replyPipeline,
2486
- humanDelay,
2487
- deliver: async (payload) => {
2488
- await deliverMattermostReplyPayload({
2489
- core,
2490
- cfg,
2491
- payload,
2492
- to,
2493
- accountId: account.accountId,
2494
- agentId: route.agentId,
2495
- textLimit,
2496
- tableMode,
2497
- sendMessage: sendMessageMattermost
2498
- });
2499
- runtime.log?.(`delivered slash reply to ${to}`);
2500
- },
2501
- onError: (err, info) => {
2502
- runtime.error?.(`mattermost slash ${info.kind} reply failed: ${String(err)}`);
2503
- },
2504
- onReplyStart: typingCallbacks?.onReplyStart
2505
- });
2506
- await core.channel.reply.withReplyDispatcher({
2507
- dispatcher,
2508
- onSettled: () => {
2509
- markDispatchIdle();
2510
- },
2511
- run: () => core.channel.reply.dispatchReplyFromConfig({
2512
- ctx: ctxPayload,
2513
- cfg,
2514
- dispatcher,
2515
- replyOptions: {
2516
- ...replyOptions,
2517
- disableBlockStreaming: typeof account.blockStreaming === "boolean" ? !account.blockStreaming : void 0,
2518
- onModelSelected
2519
- }
2520
- })
2521
- });
2522
- }
2523
- //#endregion
2524
- //#region extensions/mattermost/src/mattermost/slash-state.ts
2525
- /** Map from accountId → per-account slash command state. */
2526
- const accountStates = /* @__PURE__ */ new Map();
2527
- function resolveSlashHandlerForToken(token) {
2528
- const matches = [];
2529
- for (const [accountId, state] of accountStates) if (state.commandTokens.has(token) && state.handler) matches.push({
2530
- accountId,
2531
- handler: state.handler
2532
- });
2533
- if (matches.length === 0) return { kind: "none" };
2534
- if (matches.length === 1) return {
2535
- kind: "single",
2536
- handler: matches[0].handler,
2537
- accountIds: [matches[0].accountId]
2538
- };
2539
- return {
2540
- kind: "ambiguous",
2541
- accountIds: matches.map((entry) => entry.accountId)
2542
- };
2543
- }
2544
- /**
2545
- * Get the slash command state for a specific account, or null if not activated.
2546
- */
2547
- function getSlashCommandState(accountId) {
2548
- return accountStates.get(accountId) ?? null;
2549
- }
2550
- /**
2551
- * Activate slash commands for a specific account.
2552
- * Called from the monitor after bot connects.
2553
- */
2554
- function activateSlashCommands(params) {
2555
- const { account, commandTokens, registeredCommands, triggerMap, api, log } = params;
2556
- const accountId = account.accountId;
2557
- const tokenSet = new Set(commandTokens);
2558
- const handler = createSlashCommandHttpHandler({
2559
- account,
2560
- cfg: api.cfg,
2561
- runtime: api.runtime,
2562
- commandTokens: tokenSet,
2563
- triggerMap,
2564
- log
2565
- });
2566
- accountStates.set(accountId, {
2567
- commandTokens: tokenSet,
2568
- registeredCommands,
2569
- handler,
2570
- account,
2571
- triggerMap: triggerMap ?? /* @__PURE__ */ new Map()
2572
- });
2573
- log?.(`mattermost: slash commands activated for account ${accountId} (${registeredCommands.length} commands)`);
2574
- }
2575
- /**
2576
- * Deactivate slash commands for a specific account (on shutdown/disconnect).
2577
- */
2578
- function deactivateSlashCommands(accountId) {
2579
- if (accountId) {
2580
- const state = accountStates.get(accountId);
2581
- if (state) {
2582
- state.commandTokens.clear();
2583
- state.registeredCommands = [];
2584
- state.handler = null;
2585
- accountStates.delete(accountId);
2586
- }
2587
- } else {
2588
- for (const [, state] of accountStates) {
2589
- state.commandTokens.clear();
2590
- state.registeredCommands = [];
2591
- state.handler = null;
2592
- }
2593
- accountStates.clear();
2594
- }
2595
- }
2596
- /**
2597
- * Register the HTTP route for slash command callbacks.
2598
- * Called during plugin registration.
2599
- *
2600
- * The single HTTP route dispatches to the correct per-account handler
2601
- * by matching the inbound token against each account's registered tokens.
2602
- */
2603
- function registerSlashCommandRoute(api) {
2604
- const mmConfig = api.config.channels?.mattermost;
2605
- const callbackPaths = /* @__PURE__ */ new Set();
2606
- const addCallbackPaths = (raw) => {
2607
- const resolved = resolveSlashCommandConfig(raw);
2608
- callbackPaths.add(resolved.callbackPath);
2609
- if (resolved.callbackUrl) try {
2610
- const urlPath = new URL(resolved.callbackUrl).pathname;
2611
- if (urlPath && urlPath !== resolved.callbackPath) callbackPaths.add(urlPath);
2612
- } catch {}
2613
- };
2614
- const commandsRaw = mmConfig?.commands;
2615
- addCallbackPaths(commandsRaw);
2616
- const accountsRaw = mmConfig?.accounts ?? {};
2617
- for (const accountId of Object.keys(accountsRaw)) {
2618
- const accountCommandsRaw = accountsRaw[accountId]?.commands;
2619
- addCallbackPaths(accountCommandsRaw);
2620
- }
2621
- const routeHandler = async (req, res) => {
2622
- if (accountStates.size === 0) {
2623
- res.statusCode = 503;
2624
- res.setHeader("Content-Type", "application/json; charset=utf-8");
2625
- res.end(JSON.stringify({
2626
- response_type: "ephemeral",
2627
- text: "Slash commands are not yet initialized. Please try again in a moment."
2628
- }));
2629
- return;
2630
- }
2631
- if (accountStates.size === 1) {
2632
- const [, state] = [...accountStates.entries()][0];
2633
- if (!state.handler) {
2634
- res.statusCode = 503;
2635
- res.setHeader("Content-Type", "application/json; charset=utf-8");
2636
- res.end(JSON.stringify({
2637
- response_type: "ephemeral",
2638
- text: "Slash commands are not yet initialized. Please try again in a moment."
2639
- }));
2640
- return;
2641
- }
2642
- await state.handler(req, res);
2643
- return;
2644
- }
2645
- const chunks = [];
2646
- const MAX_BODY = 64 * 1024;
2647
- let size = 0;
2648
- for await (const chunk of req) {
2649
- size += chunk.length;
2650
- if (size > MAX_BODY) {
2651
- res.statusCode = 413;
2652
- res.end("Payload Too Large");
2653
- return;
2654
- }
2655
- chunks.push(chunk);
2656
- }
2657
- const bodyStr = Buffer.concat(chunks).toString("utf8");
2658
- let token = null;
2659
- const ct = req.headers["content-type"] ?? "";
2660
- try {
2661
- if (ct.includes("application/json")) token = JSON.parse(bodyStr).token ?? null;
2662
- else token = new URLSearchParams(bodyStr).get("token");
2663
- } catch {}
2664
- const match = token ? resolveSlashHandlerForToken(token) : { kind: "none" };
2665
- if (match.kind === "none") {
2666
- res.statusCode = 401;
2667
- res.setHeader("Content-Type", "application/json; charset=utf-8");
2668
- res.end(JSON.stringify({
2669
- response_type: "ephemeral",
2670
- text: "Unauthorized: invalid command token."
2671
- }));
2672
- return;
2673
- }
2674
- if (match.kind === "ambiguous") {
2675
- api.logger.warn?.(`mattermost: slash callback token matched multiple accounts (${match.accountIds?.join(", ")})`);
2676
- res.statusCode = 409;
2677
- res.setHeader("Content-Type", "application/json; charset=utf-8");
2678
- res.end(JSON.stringify({
2679
- response_type: "ephemeral",
2680
- text: "Conflict: command token is not unique across accounts."
2681
- }));
2682
- return;
2683
- }
2684
- const matchedHandler = match.handler;
2685
- const { Readable } = await import("node:stream");
2686
- const syntheticReq = new Readable({ read() {
2687
- this.push(Buffer.from(bodyStr, "utf8"));
2688
- this.push(null);
2689
- } });
2690
- syntheticReq.method = req.method;
2691
- syntheticReq.url = req.url;
2692
- syntheticReq.headers = req.headers;
2693
- await matchedHandler(syntheticReq, res);
2694
- };
2695
- for (const callbackPath of callbackPaths) {
2696
- api.registerHttpRoute({
2697
- path: callbackPath,
2698
- auth: "plugin",
2699
- handler: routeHandler
2700
- });
2701
- api.logger.info?.(`mattermost: registered slash command callback at ${callbackPath}`);
2702
- }
2703
- }
2704
- //#endregion
2705
- //#region extensions/mattermost/src/mattermost/monitor-slash.ts
2706
- function isLoopbackHost$1(hostname) {
2707
- return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1";
2708
- }
2709
- function buildSlashCommands(params) {
2710
- const commandsToRegister = [...DEFAULT_COMMAND_SPECS];
2711
- if (!params.nativeSkills) return commandsToRegister;
2712
- try {
2713
- const skillCommands = listSkillCommandsForAgents({ cfg: params.cfg });
2714
- for (const spec of skillCommands) {
2715
- const name = typeof spec.name === "string" ? spec.name.trim() : "";
2716
- if (!name) continue;
2717
- const trigger = name.startsWith("oc_") ? name : `oc_${name}`;
2718
- commandsToRegister.push({
2719
- trigger,
2720
- description: spec.description || `Run skill ${name}`,
2721
- autoComplete: true,
2722
- autoCompleteHint: "[args]",
2723
- originalName: name
2724
- });
2725
- }
2726
- } catch (err) {
2727
- params.runtime.error?.(`mattermost: failed to list skill commands: ${String(err)}`);
2728
- }
2729
- return commandsToRegister;
2730
- }
2731
- function dedupeSlashCommands(commands) {
2732
- const seen = /* @__PURE__ */ new Set();
2733
- return commands.filter((cmd) => {
2734
- const key = cmd.trigger.trim();
2735
- if (!key || seen.has(key)) return false;
2736
- seen.add(key);
2737
- return true;
2738
- });
2739
- }
2740
- function buildTriggerMap(commands) {
2741
- const triggerMap = /* @__PURE__ */ new Map();
2742
- for (const cmd of commands) if (cmd.originalName) triggerMap.set(cmd.trigger, cmd.originalName);
2743
- return triggerMap;
2744
- }
2745
- function warnOnSuspiciousCallbackUrl(params) {
2746
- try {
2747
- const mmHost = new URL(normalizeMattermostBaseUrl(params.baseUrl) ?? params.baseUrl).hostname;
2748
- const callbackHost = new URL(params.callbackUrl).hostname;
2749
- if (isLoopbackHost$1(callbackHost) && !isLoopbackHost$1(mmHost)) params.runtime.error?.(`mattermost: slash commands callbackUrl resolved to ${params.callbackUrl} (loopback) while baseUrl is ${params.baseUrl}. This MAY be unreachable depending on your deployment. If native slash commands don't work, set channels.mattermost.commands.callbackUrl to a URL reachable from the Mattermost server (e.g. your public reverse proxy URL).`);
2750
- } catch {}
2751
- }
2752
- async function registerSlashCommandsAcrossTeams(params) {
2753
- const registered = [];
2754
- let teamRegistrationFailures = 0;
2755
- for (const team of params.teams) try {
2756
- const created = await registerSlashCommands({
2757
- client: params.client,
2758
- teamId: team.id,
2759
- creatorUserId: params.botUserId,
2760
- callbackUrl: params.callbackUrl,
2761
- commands: params.commands,
2762
- log: (msg) => params.runtime.log?.(msg)
2763
- });
2764
- registered.push(...created);
2765
- } catch (err) {
2766
- teamRegistrationFailures += 1;
2767
- params.runtime.error?.(`mattermost: failed to register slash commands for team ${team.id}: ${String(err)}`);
2768
- }
2769
- return {
2770
- registered,
2771
- teamRegistrationFailures
2772
- };
2773
- }
2774
- async function registerMattermostMonitorSlashCommands(params) {
2775
- const commandsRaw = params.account.config.commands;
2776
- const slashConfig = resolveSlashCommandConfig(commandsRaw);
2777
- if (!isSlashCommandsEnabled(slashConfig)) return;
2778
- try {
2779
- const teams = await fetchMattermostUserTeams(params.client, params.botUserId);
2780
- const slashCallbackUrl = resolveCallbackUrl({
2781
- config: slashConfig,
2782
- gatewayPort: parseStrictPositiveInteger(process.env.OPENCLAW_GATEWAY_PORT?.trim()) ?? params.cfg.gateway?.port ?? 18789,
2783
- gatewayHost: params.cfg.gateway?.customBindHost ?? void 0
2784
- });
2785
- warnOnSuspiciousCallbackUrl({
2786
- runtime: params.runtime,
2787
- baseUrl: params.baseUrl,
2788
- callbackUrl: slashCallbackUrl
2789
- });
2790
- const dedupedCommands = dedupeSlashCommands(buildSlashCommands({
2791
- cfg: params.cfg,
2792
- runtime: params.runtime,
2793
- nativeSkills: slashConfig.nativeSkills === true
2794
- }));
2795
- const { registered, teamRegistrationFailures } = await registerSlashCommandsAcrossTeams({
2796
- client: params.client,
2797
- teams,
2798
- botUserId: params.botUserId,
2799
- callbackUrl: slashCallbackUrl,
2800
- commands: dedupedCommands,
2801
- runtime: params.runtime
2802
- });
2803
- if (registered.length === 0) {
2804
- params.runtime.error?.("mattermost: native slash commands enabled but no commands could be registered; keeping slash callbacks inactive");
2805
- return;
2806
- }
2807
- if (teamRegistrationFailures > 0) params.runtime.error?.(`mattermost: slash command registration completed with ${teamRegistrationFailures} team error(s)`);
2808
- activateSlashCommands({
2809
- account: params.account,
2810
- commandTokens: registered.map((cmd) => cmd.token).filter(Boolean),
2811
- registeredCommands: registered,
2812
- triggerMap: buildTriggerMap(dedupedCommands),
2813
- api: {
2814
- cfg: params.cfg,
2815
- runtime: params.runtime
2816
- },
2817
- log: (msg) => params.runtime.log?.(msg)
2818
- });
2819
- params.runtime.log?.(`mattermost: slash commands registered (${registered.length} commands across ${teams.length} teams, callback=${slashCallbackUrl})`);
2820
- } catch (err) {
2821
- params.runtime.error?.(`mattermost: failed to register slash commands: ${String(err)}`);
2822
- }
2823
- }
2824
- //#endregion
2825
- //#region extensions/mattermost/src/mattermost/monitor-websocket.ts
2826
- const MattermostEventPayloadSchema = zod_exports.z.object({
2827
- event: zod_exports.z.string().optional(),
2828
- data: zod_exports.z.object({
2829
- post: zod_exports.z.union([zod_exports.z.string(), MattermostPostSchema]).optional(),
2830
- reaction: zod_exports.z.union([zod_exports.z.string(), zod_exports.z.record(zod_exports.z.string(), zod_exports.z.unknown())]).optional(),
2831
- channel_id: zod_exports.z.string().optional(),
2832
- channel_name: zod_exports.z.string().optional(),
2833
- channel_display_name: zod_exports.z.string().optional(),
2834
- channel_type: zod_exports.z.string().optional(),
2835
- sender_name: zod_exports.z.string().optional(),
2836
- team_id: zod_exports.z.string().optional()
2837
- }).optional(),
2838
- broadcast: zod_exports.z.object({
2839
- channel_id: zod_exports.z.string().optional(),
2840
- team_id: zod_exports.z.string().optional(),
2841
- user_id: zod_exports.z.string().optional()
2842
- }).optional()
2843
- });
2844
- function parseMattermostEventPayload(raw) {
2845
- return safeParseJsonWithSchema(MattermostEventPayloadSchema, raw);
2846
- }
2847
- function parseMattermostPost(value) {
2848
- if (typeof value === "string") return safeParseJsonWithSchema(MattermostPostSchema, value);
2849
- return safeParseWithSchema(MattermostPostSchema, value);
2850
- }
2851
- var WebSocketClosedBeforeOpenError = class extends Error {
2852
- constructor(code, reason) {
2853
- super(`websocket closed before open (code ${code})`);
2854
- this.code = code;
2855
- this.reason = reason;
2856
- this.name = "WebSocketClosedBeforeOpenError";
2857
- }
2858
- };
2859
- const defaultMattermostWebSocketFactory = (url) => new WebSocket$1(url);
2860
- function parsePostedPayload(payload) {
2861
- if (payload.event !== "posted") return null;
2862
- const postData = payload.data?.post;
2863
- if (!postData) return null;
2864
- const post = parseMattermostPost(postData);
2865
- if (!post) return null;
2866
- return {
2867
- payload,
2868
- post
2869
- };
2870
- }
2871
- function createMattermostConnectOnce(opts) {
2872
- const webSocketFactory = opts.webSocketFactory ?? defaultMattermostWebSocketFactory;
2873
- const healthCheckIntervalMs = opts.healthCheckIntervalMs ?? 3e4;
2874
- return async () => {
2875
- const ws = webSocketFactory(opts.wsUrl);
2876
- const onAbort = () => ws.terminate();
2877
- opts.abortSignal?.addEventListener("abort", onAbort, { once: true });
2878
- const getBotUpdateAt = opts.getBotUpdateAt;
2879
- try {
2880
- return await new Promise((resolve, reject) => {
2881
- let opened = false;
2882
- let settled = false;
2883
- let healthCheckEnabled = getBotUpdateAt != null;
2884
- let healthCheckInFlight = false;
2885
- let healthCheckTimer;
2886
- let initialUpdateAt;
2887
- const clearTimers = () => {
2888
- if (healthCheckTimer !== void 0) {
2889
- clearTimeout(healthCheckTimer);
2890
- healthCheckTimer = void 0;
2891
- }
2892
- };
2893
- const stopHealthChecks = () => {
2894
- healthCheckEnabled = false;
2895
- clearTimers();
2896
- };
2897
- const scheduleHealthCheck = () => {
2898
- if (!getBotUpdateAt || !healthCheckEnabled || settled || healthCheckInFlight) return;
2899
- healthCheckTimer = setTimeout(() => {
2900
- healthCheckTimer = void 0;
2901
- runHealthCheck();
2902
- }, healthCheckIntervalMs);
2903
- };
2904
- const runHealthCheck = async () => {
2905
- if (!getBotUpdateAt || !healthCheckEnabled || settled || healthCheckInFlight) return;
2906
- healthCheckInFlight = true;
2907
- try {
2908
- const current = await getBotUpdateAt();
2909
- if (!healthCheckEnabled || settled) return;
2910
- if (initialUpdateAt === void 0) {
2911
- initialUpdateAt = current;
2912
- return;
2913
- }
2914
- if (current !== initialUpdateAt) {
2915
- opts.runtime.log?.(`mattermost: bot account updated (update_at changed: ${initialUpdateAt} → ${current}) — reconnecting`);
2916
- stopHealthChecks();
2917
- ws.terminate();
2918
- }
2919
- } catch (err) {
2920
- if (!healthCheckEnabled || settled) return;
2921
- const label = initialUpdateAt === void 0 ? "mattermost: failed to get initial update_at" : "mattermost: health check error";
2922
- opts.runtime.error?.(`${label}: ${String(err)}`);
2923
- } finally {
2924
- healthCheckInFlight = false;
2925
- scheduleHealthCheck();
2926
- }
2927
- };
2928
- const resolveOnce = () => {
2929
- if (settled) return;
2930
- settled = true;
2931
- stopHealthChecks();
2932
- resolve();
2933
- };
2934
- const rejectOnce = (error) => {
2935
- if (settled) return;
2936
- settled = true;
2937
- stopHealthChecks();
2938
- reject(error);
2939
- };
2940
- ws.on("open", () => {
2941
- opened = true;
2942
- opts.statusSink?.({
2943
- connected: true,
2944
- lastConnectedAt: Date.now(),
2945
- lastError: null
2946
- });
2947
- ws.send(JSON.stringify({
2948
- seq: opts.nextSeq(),
2949
- action: "authentication_challenge",
2950
- data: { token: opts.botToken }
2951
- }));
2952
- if (getBotUpdateAt) runHealthCheck();
2953
- });
2954
- ws.on("message", async (data) => {
2955
- const payload = parseMattermostEventPayload(rawDataToString(data));
2956
- if (!payload) return;
2957
- if (payload.event === "reaction_added" || payload.event === "reaction_removed") {
2958
- if (!opts.onReaction) return;
2959
- try {
2960
- await opts.onReaction(payload);
2961
- } catch (err) {
2962
- opts.runtime.error?.(`mattermost reaction handler failed: ${String(err)}`);
2963
- }
2964
- return;
2965
- }
2966
- if (payload.event !== "posted") return;
2967
- const parsed = parsePostedPayload(payload);
2968
- if (!parsed) return;
2969
- try {
2970
- await opts.onPosted(parsed.post, parsed.payload);
2971
- } catch (err) {
2972
- opts.runtime.error?.(`mattermost handler failed: ${String(err)}`);
2973
- }
2974
- });
2975
- ws.on("close", (code, reason) => {
2976
- stopHealthChecks();
2977
- const message = reasonToString(reason);
2978
- opts.statusSink?.({
2979
- connected: false,
2980
- lastDisconnect: {
2981
- at: Date.now(),
2982
- status: code,
2983
- error: message || void 0
2984
- }
2985
- });
2986
- if (opened) {
2987
- resolveOnce();
2988
- return;
2989
- }
2990
- rejectOnce(new WebSocketClosedBeforeOpenError(code, message || void 0));
2991
- });
2992
- ws.on("error", (err) => {
2993
- opts.runtime.error?.(`mattermost websocket error: ${String(err)}`);
2994
- opts.statusSink?.({ lastError: String(err) });
2995
- try {
2996
- ws.close();
2997
- } catch {}
2998
- });
2999
- });
3000
- } finally {
3001
- opts.abortSignal?.removeEventListener("abort", onAbort);
3002
- }
3003
- };
3004
- }
3005
- function reasonToString(reason) {
3006
- if (!reason) return "";
3007
- if (typeof reason === "string") return reason;
3008
- return reason.length > 0 ? reason.toString("utf8") : "";
3009
- }
3010
- //#endregion
3011
- //#region extensions/mattermost/src/mattermost/reconnect.ts
3012
- /**
3013
- * Reconnection loop with exponential backoff.
3014
- *
3015
- * Calls `connectFn` in a while loop. On normal resolve (connection closed),
3016
- * the backoff resets. On thrown error (connection failed), the current delay is
3017
- * used, then doubled for the next retry.
3018
- * The loop exits when `abortSignal` fires.
3019
- */
3020
- async function runWithReconnect(connectFn, opts = {}) {
3021
- const { initialDelayMs = 2e3, maxDelayMs = 6e4 } = opts;
3022
- const jitterRatio = Math.max(0, opts.jitterRatio ?? 0);
3023
- const random = opts.random ?? Math.random;
3024
- let retryDelay = initialDelayMs;
3025
- let attempt = 0;
3026
- while (!opts.abortSignal?.aborted) {
3027
- let shouldIncreaseDelay = false;
3028
- let outcome = "resolved";
3029
- let error;
3030
- try {
3031
- await connectFn();
3032
- retryDelay = initialDelayMs;
3033
- } catch (err) {
3034
- if (opts.abortSignal?.aborted) return;
3035
- outcome = "rejected";
3036
- error = err;
3037
- opts.onError?.(err);
3038
- shouldIncreaseDelay = true;
3039
- }
3040
- if (opts.abortSignal?.aborted) return;
3041
- const delayMs = withJitter(retryDelay, jitterRatio, random);
3042
- if (!(opts.shouldReconnect?.({
3043
- attempt,
3044
- delayMs,
3045
- outcome,
3046
- error
3047
- }) ?? true)) return;
3048
- opts.onReconnect?.(delayMs);
3049
- await sleepAbortable(delayMs, opts.abortSignal);
3050
- if (shouldIncreaseDelay) retryDelay = Math.min(retryDelay * 2, maxDelayMs);
3051
- attempt++;
3052
- }
3053
- }
3054
- function withJitter(baseMs, jitterRatio, random) {
3055
- if (jitterRatio <= 0) return baseMs;
3056
- const normalized = Math.max(0, Math.min(1, random()));
3057
- const spread = baseMs * jitterRatio;
3058
- return Math.max(1, Math.round(baseMs - spread + normalized * spread * 2));
3059
- }
3060
- function sleepAbortable(ms, signal) {
3061
- return new Promise((resolve) => {
3062
- if (signal?.aborted) {
3063
- resolve();
3064
- return;
3065
- }
3066
- const onAbort = () => {
3067
- clearTimeout(timer);
3068
- resolve();
3069
- };
3070
- const timer = setTimeout(() => {
3071
- signal?.removeEventListener("abort", onAbort);
3072
- resolve();
3073
- }, ms);
3074
- signal?.addEventListener("abort", onAbort, { once: true });
3075
- });
3076
- }
3077
- //#endregion
3078
- //#region extensions/mattermost/src/mattermost/monitor.ts
3079
- const RECENT_MATTERMOST_MESSAGE_TTL_MS = 5 * 6e4;
3080
- const RECENT_MATTERMOST_MESSAGE_MAX = 2e3;
3081
- function isLoopbackHost(hostname) {
3082
- return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1";
3083
- }
3084
- function normalizeInteractionSourceIps(values) {
3085
- return (values ?? []).map((value) => value.trim()).filter(Boolean);
3086
- }
3087
- const recentInboundMessages = createDedupeCache({
3088
- ttlMs: RECENT_MATTERMOST_MESSAGE_TTL_MS,
3089
- maxSize: RECENT_MATTERMOST_MESSAGE_MAX
3090
- });
3091
- function resolveRuntime(opts) {
3092
- return opts.runtime ?? {
3093
- log: console.log,
3094
- error: console.error,
3095
- exit: (code) => {
3096
- throw new Error(`exit ${code}`);
3097
- }
3098
- };
3099
- }
3100
- function isSystemPost(post) {
3101
- const type = post.type?.trim();
3102
- return Boolean(type);
3103
- }
3104
- function channelChatType(kind) {
3105
- if (kind === "direct") return "direct";
3106
- if (kind === "group") return "group";
3107
- return "channel";
3108
- }
3109
- function resolveMattermostReplyRootId(params) {
3110
- const threadRootId = params.threadRootId?.trim();
3111
- if (threadRootId) return threadRootId;
3112
- return params.replyToId?.trim() || void 0;
3113
- }
3114
- function resolveMattermostEffectiveReplyToId(params) {
3115
- const threadRootId = params.threadRootId?.trim();
3116
- if (threadRootId && params.replyToMode !== "off") return threadRootId;
3117
- if (params.kind === "direct") return;
3118
- const postId = params.postId?.trim();
3119
- if (!postId) return;
3120
- return params.replyToMode === "all" || params.replyToMode === "first" ? postId : void 0;
3121
- }
3122
- function resolveMattermostThreadSessionContext(params) {
3123
- const effectiveReplyToId = resolveMattermostEffectiveReplyToId({
3124
- kind: params.kind,
3125
- postId: params.postId,
3126
- replyToMode: params.replyToMode,
3127
- threadRootId: params.threadRootId
3128
- });
3129
- const threadKeys = resolveThreadSessionKeys({
3130
- baseSessionKey: params.baseSessionKey,
3131
- threadId: effectiveReplyToId,
3132
- parentSessionKey: effectiveReplyToId ? params.baseSessionKey : void 0
3133
- });
3134
- return {
3135
- effectiveReplyToId,
3136
- sessionKey: threadKeys.sessionKey,
3137
- parentSessionKey: threadKeys.parentSessionKey
3138
- };
3139
- }
3140
- function resolveMattermostReactionChannelId(payload) {
3141
- return payload.broadcast?.channel_id?.trim() || payload.data?.channel_id?.trim() || void 0;
3142
- }
3143
- function buildMattermostAttachmentPlaceholder(mediaList) {
3144
- if (mediaList.length === 0) return "";
3145
- if (mediaList.length === 1) return `<media:${mediaList[0].kind === "unknown" ? "document" : mediaList[0].kind}>`;
3146
- const allImages = mediaList.every((media) => media.kind === "image");
3147
- const label = allImages ? "image" : "file";
3148
- const suffix = mediaList.length === 1 ? label : `${label}s`;
3149
- return `${allImages ? "<media:image>" : "<media:document>"} (${mediaList.length} ${suffix})`;
3150
- }
3151
- function buildMattermostWsUrl(baseUrl) {
3152
- const normalized = normalizeMattermostBaseUrl(baseUrl);
3153
- if (!normalized) throw new Error("Mattermost baseUrl is required");
3154
- return `${normalized.replace(/^http/i, "ws")}/api/v4/websocket`;
3155
- }
3156
- async function monitorMattermostProvider(opts = {}) {
3157
- const core = getMattermostRuntime();
3158
- const runtime = resolveRuntime(opts);
3159
- const cfg = opts.config ?? core.config.loadConfig();
3160
- const account = resolveMattermostAccount({
3161
- cfg,
3162
- accountId: opts.accountId
3163
- });
3164
- const pairing = createChannelPairingController({
3165
- core,
3166
- channel: "mattermost",
3167
- accountId: account.accountId
3168
- });
3169
- const allowNameMatching = isDangerousNameMatchingEnabled(account.config);
3170
- const botToken = opts.botToken?.trim() || account.botToken?.trim();
3171
- if (!botToken) throw new Error(`Mattermost bot token missing for account "${account.accountId}" (set channels.mattermost.accounts.${account.accountId}.botToken or MATTERMOST_BOT_TOKEN for default).`);
3172
- const baseUrl = normalizeMattermostBaseUrl(opts.baseUrl ?? account.baseUrl);
3173
- if (!baseUrl) throw new Error(`Mattermost baseUrl missing for account "${account.accountId}" (set channels.mattermost.accounts.${account.accountId}.baseUrl or MATTERMOST_URL for default).`);
3174
- const client = createMattermostClient({
3175
- baseUrl,
3176
- botToken,
3177
- allowPrivateNetwork: account.config?.allowPrivateNetwork === true
3178
- });
3179
- let botUser;
3180
- await runWithReconnect(async () => {
3181
- botUser = await fetchMattermostMe(client);
3182
- }, {
3183
- abortSignal: opts.abortSignal,
3184
- jitterRatio: .2,
3185
- shouldReconnect: ({ outcome }) => outcome === "rejected",
3186
- onError: (err) => {
3187
- runtime.error?.(`mattermost: API auth failed: ${String(err)}`);
3188
- opts.statusSink?.({
3189
- lastError: String(err),
3190
- connected: false
3191
- });
3192
- },
3193
- onReconnect: (delayMs) => {
3194
- runtime.log?.(`mattermost: API not accessible, retrying in ${Math.round(delayMs / 1e3)}s`);
3195
- }
3196
- });
3197
- if (opts.abortSignal?.aborted) return;
3198
- const botUserId = botUser.id;
3199
- const botUsername = botUser.username?.trim() || void 0;
3200
- runtime.log?.(`mattermost connected as ${botUsername ? `@${botUsername}` : botUserId}`);
3201
- await registerMattermostMonitorSlashCommands({
3202
- client,
3203
- cfg,
3204
- runtime,
3205
- account,
3206
- baseUrl,
3207
- botUserId
3208
- });
3209
- const slashEnabled = getSlashCommandState(account.accountId) != null;
3210
- setInteractionSecret(account.accountId, botToken);
3211
- const interactionPath = resolveInteractionCallbackPath(account.accountId);
3212
- const callbackUrl = computeInteractionCallbackUrl(account.accountId, {
3213
- gateway: cfg.gateway,
3214
- interactions: account.config.interactions
3215
- });
3216
- setInteractionCallbackUrl(account.accountId, callbackUrl);
3217
- const allowedInteractionSourceIps = normalizeInteractionSourceIps(account.config.interactions?.allowedSourceIps);
3218
- try {
3219
- const mmHost = new URL(baseUrl).hostname;
3220
- const callbackHost = new URL(callbackUrl).hostname;
3221
- if (isLoopbackHost(callbackHost) && !isLoopbackHost(mmHost)) runtime.error?.(`mattermost: interactions callbackUrl resolved to ${callbackUrl} (loopback) while baseUrl is ${baseUrl}. This MAY be unreachable depending on your deployment. If button clicks don't work, set channels.mattermost.interactions.callbackBaseUrl to a URL reachable from the Mattermost server (e.g. your public reverse proxy URL).`);
3222
- if (!isLoopbackHost(callbackHost) && allowedInteractionSourceIps.length === 0) runtime.error?.(`mattermost: interactions callbackUrl resolved to ${callbackUrl} without channels.mattermost.interactions.allowedSourceIps. For safety, non-loopback callback sources will be rejected until you allowlist the Mattermost server or trusted ingress IPs.`);
3223
- } catch {}
3224
- const effectiveInteractionSourceIps = allowedInteractionSourceIps.length > 0 ? allowedInteractionSourceIps : ["127.0.0.1", "::1"];
3225
- const unregisterInteractions = registerPluginHttpRoute({
3226
- path: interactionPath,
3227
- fallbackPath: "/mattermost/interactions/default",
3228
- auth: "plugin",
3229
- handler: createMattermostInteractionHandler({
3230
- client,
3231
- botUserId,
3232
- accountId: account.accountId,
3233
- allowedSourceIps: effectiveInteractionSourceIps,
3234
- trustedProxies: cfg.gateway?.trustedProxies,
3235
- allowRealIpFallback: cfg.gateway?.allowRealIpFallback === true,
3236
- handleInteraction: handleModelPickerInteraction,
3237
- authorizeButtonClick: async ({ payload, post }) => {
3238
- const channelInfo = await resolveChannelInfo(payload.channel_id);
3239
- const isDirect = channelInfo?.type?.trim().toUpperCase() === "D";
3240
- const allowTextCommands = core.channel.commands.shouldHandleTextCommands({
3241
- cfg,
3242
- surface: "mattermost"
3243
- });
3244
- const decision = authorizeMattermostCommandInvocation({
3245
- account,
3246
- cfg,
3247
- senderId: payload.user_id,
3248
- senderName: payload.user_name ?? "",
3249
- channelId: payload.channel_id,
3250
- channelInfo,
3251
- storeAllowFrom: isDirect ? await readStoreAllowFromForDmPolicy({
3252
- provider: "mattermost",
3253
- accountId: account.accountId,
3254
- dmPolicy: account.config.dmPolicy ?? "pairing",
3255
- readStore: pairing.readStoreForDmPolicy
3256
- }) : void 0,
3257
- allowTextCommands,
3258
- hasControlCommand: false
3259
- });
3260
- if (decision.ok) return { ok: true };
3261
- return {
3262
- ok: false,
3263
- response: {
3264
- update: {
3265
- message: post.message ?? "",
3266
- props: post.props ?? void 0
3267
- },
3268
- ephemeral_text: `OpenClaw ignored this action for ${decision.roomLabel}.`
3269
- }
3270
- };
3271
- },
3272
- resolveSessionKey: async ({ channelId, userId, post }) => {
3273
- const channelInfo = await resolveChannelInfo(channelId);
3274
- const kind = mapMattermostChannelTypeToChatType(channelInfo?.type);
3275
- const teamId = channelInfo?.team_id ?? void 0;
3276
- const route = core.channel.routing.resolveAgentRoute({
3277
- cfg,
3278
- channel: "mattermost",
3279
- accountId: account.accountId,
3280
- teamId,
3281
- peer: {
3282
- kind,
3283
- id: kind === "direct" ? userId : channelId
3284
- }
3285
- });
3286
- const replyToMode = resolveMattermostReplyToMode(account, kind);
3287
- return resolveMattermostThreadSessionContext({
3288
- baseSessionKey: route.sessionKey,
3289
- kind,
3290
- postId: post.id || void 0,
3291
- replyToMode,
3292
- threadRootId: post.root_id
3293
- }).sessionKey;
3294
- },
3295
- dispatchButtonClick: async (opts) => {
3296
- const channelInfo = await resolveChannelInfo(opts.channelId);
3297
- const kind = mapMattermostChannelTypeToChatType(channelInfo?.type);
3298
- const chatType = channelChatType(kind);
3299
- const teamId = channelInfo?.team_id ?? void 0;
3300
- const channelName = channelInfo?.name ?? void 0;
3301
- const channelDisplay = channelInfo?.display_name ?? channelName ?? opts.channelId;
3302
- const route = core.channel.routing.resolveAgentRoute({
3303
- cfg,
3304
- channel: "mattermost",
3305
- accountId: account.accountId,
3306
- teamId,
3307
- peer: {
3308
- kind,
3309
- id: kind === "direct" ? opts.userId : opts.channelId
3310
- }
3311
- });
3312
- const replyToMode = resolveMattermostReplyToMode(account, kind);
3313
- const threadContext = resolveMattermostThreadSessionContext({
3314
- baseSessionKey: route.sessionKey,
3315
- kind,
3316
- postId: opts.post.id || opts.postId,
3317
- replyToMode,
3318
- threadRootId: opts.post.root_id
3319
- });
3320
- const to = kind === "direct" ? `user:${opts.userId}` : `channel:${opts.channelId}`;
3321
- const bodyText = `[Button click: user @${opts.userName} selected "${opts.actionName}"]`;
3322
- const ctxPayload = core.channel.reply.finalizeInboundContext({
3323
- Body: bodyText,
3324
- BodyForAgent: bodyText,
3325
- RawBody: bodyText,
3326
- CommandBody: bodyText,
3327
- From: kind === "direct" ? `mattermost:${opts.userId}` : kind === "group" ? `mattermost:group:${opts.channelId}` : `mattermost:channel:${opts.channelId}`,
3328
- To: to,
3329
- SessionKey: threadContext.sessionKey,
3330
- ParentSessionKey: threadContext.parentSessionKey,
3331
- AccountId: route.accountId,
3332
- ChatType: chatType,
3333
- ConversationLabel: `mattermost:${opts.userName}`,
3334
- GroupSubject: kind !== "direct" ? channelDisplay : void 0,
3335
- GroupChannel: channelName ? `#${channelName}` : void 0,
3336
- GroupSpace: teamId,
3337
- SenderName: opts.userName,
3338
- SenderId: opts.userId,
3339
- Provider: "mattermost",
3340
- Surface: "mattermost",
3341
- MessageSid: `interaction:${opts.postId}:${opts.actionId}`,
3342
- ReplyToId: threadContext.effectiveReplyToId,
3343
- MessageThreadId: threadContext.effectiveReplyToId,
3344
- WasMentioned: true,
3345
- CommandAuthorized: false,
3346
- OriginatingChannel: "mattermost",
3347
- OriginatingTo: to
3348
- });
3349
- const textLimit = core.channel.text.resolveTextChunkLimit(cfg, "mattermost", account.accountId, { fallbackLimit: account.textChunkLimit ?? 4e3 });
3350
- const tableMode = core.channel.text.resolveMarkdownTableMode({
3351
- cfg,
3352
- channel: "mattermost",
3353
- accountId: account.accountId
3354
- });
3355
- const { onModelSelected, typingCallbacks, ...replyPipeline } = createChannelReplyPipeline({
3356
- cfg,
3357
- agentId: route.agentId,
3358
- channel: "mattermost",
3359
- accountId: account.accountId,
3360
- typing: {
3361
- start: () => sendTypingIndicator(opts.channelId, threadContext.effectiveReplyToId),
3362
- onStartError: (err) => {
3363
- logTypingFailure({
3364
- log: (message) => logger.debug?.(message),
3365
- channel: "mattermost",
3366
- target: opts.channelId,
3367
- error: err
3368
- });
3369
- }
3370
- }
3371
- });
3372
- const { dispatcher, replyOptions, markDispatchIdle } = core.channel.reply.createReplyDispatcherWithTyping({
3373
- ...replyPipeline,
3374
- humanDelay: core.channel.reply.resolveHumanDelayConfig(cfg, route.agentId),
3375
- deliver: async (payload) => {
3376
- await deliverMattermostReplyPayload({
3377
- core,
3378
- cfg,
3379
- payload,
3380
- to,
3381
- accountId: account.accountId,
3382
- agentId: route.agentId,
3383
- replyToId: resolveMattermostReplyRootId({
3384
- threadRootId: threadContext.effectiveReplyToId,
3385
- replyToId: payload.replyToId
3386
- }),
3387
- textLimit,
3388
- tableMode,
3389
- sendMessage: sendMessageMattermost
3390
- });
3391
- runtime.log?.(`delivered button-click reply to ${to}`);
3392
- },
3393
- onError: (err, info) => {
3394
- runtime.error?.(`mattermost button-click ${info.kind} reply failed: ${String(err)}`);
3395
- },
3396
- onReplyStart: typingCallbacks?.onReplyStart
3397
- });
3398
- await core.channel.reply.dispatchReplyFromConfig({
3399
- ctx: ctxPayload,
3400
- cfg,
3401
- dispatcher,
3402
- replyOptions: {
3403
- ...replyOptions,
3404
- disableBlockStreaming: typeof account.blockStreaming === "boolean" ? !account.blockStreaming : void 0,
3405
- onModelSelected
3406
- }
3407
- });
3408
- markDispatchIdle();
3409
- },
3410
- log: (msg) => runtime.log?.(msg)
3411
- }),
3412
- pluginId: "mattermost",
3413
- source: "mattermost-interactions",
3414
- accountId: account.accountId,
3415
- log: (msg) => runtime.log?.(msg)
3416
- });
3417
- const logger = core.logging.getChildLogger({ module: "mattermost" });
3418
- const logVerboseMessage = (message) => {
3419
- if (!core.logging.shouldLogVerbose()) return;
3420
- logger.debug?.(message);
3421
- };
3422
- const mediaMaxBytes = resolveChannelMediaMaxBytes({
3423
- cfg,
3424
- resolveChannelLimitMb: () => void 0,
3425
- accountId: account.accountId
3426
- }) ?? 8 * 1024 * 1024;
3427
- const historyLimit = Math.max(0, cfg.messages?.groupChat?.historyLimit ?? 50);
3428
- const channelHistories = /* @__PURE__ */ new Map();
3429
- const defaultGroupPolicy = resolveDefaultGroupPolicy(cfg);
3430
- const { groupPolicy, providerMissingFallbackApplied } = resolveAllowlistProviderRuntimeGroupPolicy({
3431
- providerConfigPresent: cfg.channels?.mattermost !== void 0,
3432
- groupPolicy: account.config.groupPolicy,
3433
- defaultGroupPolicy
3434
- });
3435
- warnMissingProviderGroupPolicyFallbackOnce({
3436
- providerMissingFallbackApplied,
3437
- providerKey: "mattermost",
3438
- accountId: account.accountId,
3439
- log: (message) => logVerboseMessage(message)
3440
- });
3441
- const { resolveMattermostMedia, sendTypingIndicator, resolveChannelInfo, resolveUserInfo, updateModelPickerPost } = createMattermostMonitorResources({
3442
- accountId: account.accountId,
3443
- callbackUrl,
3444
- client,
3445
- logger: { debug: (message) => logger.debug?.(String(message)) },
3446
- mediaMaxBytes,
3447
- fetchRemoteMedia: (params) => core.channel.media.fetchRemoteMedia(params),
3448
- saveMediaBuffer: (buffer, contentType, direction, maxBytes) => core.channel.media.saveMediaBuffer(Buffer.from(buffer), contentType, direction, maxBytes),
3449
- mediaKindFromMime: (contentType) => core.media.mediaKindFromMime(contentType)
3450
- });
3451
- const runModelPickerCommand = async (params) => {
3452
- const to = params.kind === "direct" ? `user:${params.senderId}` : `channel:${params.channelId}`;
3453
- const fromLabel = params.kind === "direct" ? `Mattermost DM from ${params.senderName}` : `Mattermost message in ${params.roomLabel} from ${params.senderName}`;
3454
- const ctxPayload = core.channel.reply.finalizeInboundContext({
3455
- Body: params.commandText,
3456
- BodyForAgent: params.commandText,
3457
- RawBody: params.commandText,
3458
- CommandBody: params.commandText,
3459
- From: params.kind === "direct" ? `mattermost:${params.senderId}` : params.kind === "group" ? `mattermost:group:${params.channelId}` : `mattermost:channel:${params.channelId}`,
3460
- To: to,
3461
- SessionKey: params.sessionKey,
3462
- ParentSessionKey: params.parentSessionKey,
3463
- AccountId: params.route.accountId,
3464
- ChatType: params.chatType,
3465
- ConversationLabel: fromLabel,
3466
- GroupSubject: params.kind !== "direct" ? params.channelDisplay || params.roomLabel : void 0,
3467
- GroupChannel: params.channelName ? `#${params.channelName}` : void 0,
3468
- GroupSpace: params.teamId,
3469
- SenderName: params.senderName,
3470
- SenderId: params.senderId,
3471
- Provider: "mattermost",
3472
- Surface: "mattermost",
3473
- MessageSid: `interaction:${params.postId}:${Date.now()}`,
3474
- ReplyToId: params.effectiveReplyToId,
3475
- MessageThreadId: params.effectiveReplyToId,
3476
- Timestamp: Date.now(),
3477
- WasMentioned: true,
3478
- CommandAuthorized: params.commandAuthorized,
3479
- CommandSource: "native",
3480
- OriginatingChannel: "mattermost",
3481
- OriginatingTo: to
3482
- });
3483
- const tableMode = core.channel.text.resolveMarkdownTableMode({
3484
- cfg,
3485
- channel: "mattermost",
3486
- accountId: account.accountId
3487
- });
3488
- const textLimit = core.channel.text.resolveTextChunkLimit(cfg, "mattermost", account.accountId, { fallbackLimit: account.textChunkLimit ?? 4e3 });
3489
- const shouldDeliverReplies = params.deliverReplies === true;
3490
- const { onModelSelected, typingCallbacks, ...replyPipeline } = createChannelReplyPipeline({
3491
- cfg,
3492
- agentId: params.route.agentId,
3493
- channel: "mattermost",
3494
- accountId: account.accountId,
3495
- typing: shouldDeliverReplies ? {
3496
- start: () => sendTypingIndicator(params.channelId, params.effectiveReplyToId),
3497
- onStartError: (err) => {
3498
- logTypingFailure({
3499
- log: (message) => logger.debug?.(message),
3500
- channel: "mattermost",
3501
- target: params.channelId,
3502
- error: err
3503
- });
3504
- }
3505
- } : void 0
3506
- });
3507
- const capturedTexts = [];
3508
- const { dispatcher, replyOptions, markDispatchIdle } = core.channel.reply.createReplyDispatcherWithTyping({
3509
- ...replyPipeline,
3510
- deliver: async (payload) => {
3511
- const trimmedPayload = {
3512
- ...payload,
3513
- text: core.channel.text.convertMarkdownTables(payload.text ?? "", tableMode).trim()
3514
- };
3515
- if (!shouldDeliverReplies) {
3516
- if (trimmedPayload.text) capturedTexts.push(trimmedPayload.text);
3517
- return;
3518
- }
3519
- await deliverMattermostReplyPayload({
3520
- core,
3521
- cfg,
3522
- payload: trimmedPayload,
3523
- to,
3524
- accountId: account.accountId,
3525
- agentId: params.route.agentId,
3526
- replyToId: resolveMattermostReplyRootId({
3527
- threadRootId: params.effectiveReplyToId,
3528
- replyToId: trimmedPayload.replyToId
3529
- }),
3530
- textLimit,
3531
- tableMode: "off",
3532
- sendMessage: sendMessageMattermost
3533
- });
3534
- },
3535
- onError: (err, info) => {
3536
- runtime.error?.(`mattermost model picker ${info.kind} reply failed: ${String(err)}`);
3537
- },
3538
- onReplyStart: typingCallbacks?.onReplyStart
3539
- });
3540
- await core.channel.reply.withReplyDispatcher({
3541
- dispatcher,
3542
- onSettled: () => {
3543
- markDispatchIdle();
3544
- },
3545
- run: () => core.channel.reply.dispatchReplyFromConfig({
3546
- ctx: ctxPayload,
3547
- cfg,
3548
- dispatcher,
3549
- replyOptions: {
3550
- ...replyOptions,
3551
- disableBlockStreaming: typeof account.blockStreaming === "boolean" ? !account.blockStreaming : void 0,
3552
- onModelSelected
3553
- }
3554
- })
3555
- });
3556
- return capturedTexts.join("\n\n").trim();
3557
- };
3558
- async function handleModelPickerInteraction(params) {
3559
- const pickerState = parseMattermostModelPickerContext(params.context);
3560
- if (!pickerState) return null;
3561
- if (pickerState.ownerUserId !== params.payload.user_id) return { ephemeral_text: "Only the person who opened this picker can use it." };
3562
- const channelInfo = await resolveChannelInfo(params.payload.channel_id);
3563
- const pickerCommandText = pickerState.action === "select" ? `/model ${pickerState.provider}/${pickerState.model}` : pickerState.action === "list" ? `/models ${pickerState.provider}` : "/models";
3564
- const allowTextCommands = core.channel.commands.shouldHandleTextCommands({
3565
- cfg,
3566
- surface: "mattermost"
3567
- });
3568
- const hasControlCommand = core.channel.text.hasControlCommand(pickerCommandText, cfg);
3569
- const dmPolicy = account.config.dmPolicy ?? "pairing";
3570
- const storeAllowFrom = normalizeMattermostAllowList(await readStoreAllowFromForDmPolicy({
3571
- provider: "mattermost",
3572
- accountId: account.accountId,
3573
- dmPolicy,
3574
- readStore: pairing.readStoreForDmPolicy
3575
- }));
3576
- const auth = authorizeMattermostCommandInvocation({
3577
- account,
3578
- cfg,
3579
- senderId: params.payload.user_id,
3580
- senderName: params.userName,
3581
- channelId: params.payload.channel_id,
3582
- channelInfo,
3583
- storeAllowFrom,
3584
- allowTextCommands,
3585
- hasControlCommand
3586
- });
3587
- if (!auth.ok) {
3588
- if (auth.denyReason === "dm-pairing") {
3589
- const { code } = await pairing.upsertPairingRequest({
3590
- id: params.payload.user_id,
3591
- meta: { name: params.userName }
3592
- });
3593
- return { ephemeral_text: core.channel.pairing.buildPairingReply({
3594
- channel: "mattermost",
3595
- idLine: `Your Mattermost user id: ${params.payload.user_id}`,
3596
- code
3597
- }) };
3598
- }
3599
- return { ephemeral_text: auth.denyReason === "unknown-channel" ? "Temporary error: unable to determine channel type. Please try again." : auth.denyReason === "dm-disabled" ? "This bot is not accepting direct messages." : auth.denyReason === "channels-disabled" ? "Model picker actions are disabled in channels." : auth.denyReason === "channel-no-allowlist" ? "Model picker actions are not configured for this channel." : "Unauthorized." };
3600
- }
3601
- const kind = auth.kind;
3602
- const chatType = auth.chatType;
3603
- const teamId = auth.channelInfo.team_id ?? params.payload.team_id ?? void 0;
3604
- const channelName = auth.channelName || void 0;
3605
- const channelDisplay = auth.channelDisplay || auth.channelName || params.payload.channel_id;
3606
- const roomLabel = auth.roomLabel;
3607
- const route = core.channel.routing.resolveAgentRoute({
3608
- cfg,
3609
- channel: "mattermost",
3610
- accountId: account.accountId,
3611
- teamId,
3612
- peer: {
3613
- kind,
3614
- id: kind === "direct" ? params.payload.user_id : params.payload.channel_id
3615
- }
3616
- });
3617
- const replyToMode = resolveMattermostReplyToMode(account, kind);
3618
- const threadContext = resolveMattermostThreadSessionContext({
3619
- baseSessionKey: route.sessionKey,
3620
- kind,
3621
- postId: params.post.id || params.payload.post_id,
3622
- replyToMode,
3623
- threadRootId: params.post.root_id
3624
- });
3625
- const modelSessionRoute = {
3626
- agentId: route.agentId,
3627
- sessionKey: threadContext.sessionKey
3628
- };
3629
- const data = await buildModelsProviderData(cfg, route.agentId);
3630
- if (data.providers.length === 0) return await updateModelPickerPost({
3631
- channelId: params.payload.channel_id,
3632
- postId: params.payload.post_id,
3633
- message: "No models available."
3634
- });
3635
- if (pickerState.action === "providers" || pickerState.action === "back") {
3636
- const currentModel = resolveMattermostModelPickerCurrentModel({
3637
- cfg,
3638
- route: modelSessionRoute,
3639
- data
3640
- });
3641
- const view = renderMattermostProviderPickerView({
3642
- ownerUserId: pickerState.ownerUserId,
3643
- data,
3644
- currentModel
3645
- });
3646
- return await updateModelPickerPost({
3647
- channelId: params.payload.channel_id,
3648
- postId: params.payload.post_id,
3649
- message: view.text,
3650
- buttons: view.buttons
3651
- });
3652
- }
3653
- if (pickerState.action === "list") {
3654
- const currentModel = resolveMattermostModelPickerCurrentModel({
3655
- cfg,
3656
- route: modelSessionRoute,
3657
- data
3658
- });
3659
- const view = renderMattermostModelsPickerView({
3660
- ownerUserId: pickerState.ownerUserId,
3661
- data,
3662
- provider: pickerState.provider,
3663
- page: pickerState.page,
3664
- currentModel
3665
- });
3666
- return await updateModelPickerPost({
3667
- channelId: params.payload.channel_id,
3668
- postId: params.payload.post_id,
3669
- message: view.text,
3670
- buttons: view.buttons
3671
- });
3672
- }
3673
- const targetModelRef = `${pickerState.provider}/${pickerState.model}`;
3674
- if (!buildMattermostAllowedModelRefs(data).has(targetModelRef)) return { ephemeral_text: `That model is no longer available: ${targetModelRef}` };
3675
- (async () => {
3676
- try {
3677
- await runModelPickerCommand({
3678
- commandText: `/model ${targetModelRef}`,
3679
- commandAuthorized: auth.commandAuthorized,
3680
- route,
3681
- sessionKey: threadContext.sessionKey,
3682
- parentSessionKey: threadContext.parentSessionKey,
3683
- channelId: params.payload.channel_id,
3684
- senderId: params.payload.user_id,
3685
- senderName: params.userName,
3686
- kind,
3687
- chatType,
3688
- channelName,
3689
- channelDisplay,
3690
- roomLabel,
3691
- teamId,
3692
- postId: params.payload.post_id,
3693
- effectiveReplyToId: threadContext.effectiveReplyToId,
3694
- deliverReplies: true
3695
- });
3696
- const updatedModel = resolveMattermostModelPickerCurrentModel({
3697
- cfg,
3698
- route: modelSessionRoute,
3699
- data,
3700
- skipCache: true
3701
- });
3702
- const view = renderMattermostModelsPickerView({
3703
- ownerUserId: pickerState.ownerUserId,
3704
- data,
3705
- provider: pickerState.provider,
3706
- page: pickerState.page,
3707
- currentModel: updatedModel
3708
- });
3709
- await updateModelPickerPost({
3710
- channelId: params.payload.channel_id,
3711
- postId: params.payload.post_id,
3712
- message: view.text,
3713
- buttons: view.buttons
3714
- });
3715
- } catch (err) {
3716
- runtime.error?.(`mattermost model picker select failed: ${String(err)}`);
3717
- }
3718
- })();
3719
- return {};
3720
- }
3721
- const handlePost = async (post, payload, messageIds) => {
3722
- const channelId = post.channel_id ?? payload.data?.channel_id ?? payload.broadcast?.channel_id;
3723
- if (!channelId) {
3724
- logVerboseMessage("mattermost: drop post (missing channel id)");
3725
- return;
3726
- }
3727
- const allMessageIds = messageIds?.length ? messageIds : post.id ? [post.id] : [];
3728
- if (allMessageIds.length === 0) {
3729
- logVerboseMessage("mattermost: drop post (missing message id)");
3730
- return;
3731
- }
3732
- const dedupeEntries = allMessageIds.map((id) => recentInboundMessages.check(`${account.accountId}:${id}`));
3733
- if (dedupeEntries.length > 0 && dedupeEntries.every(Boolean)) {
3734
- logVerboseMessage(`mattermost: drop post (dedupe account=${account.accountId} ids=${allMessageIds.length})`);
3735
- return;
3736
- }
3737
- const senderId = post.user_id ?? payload.broadcast?.user_id;
3738
- if (!senderId) {
3739
- logVerboseMessage("mattermost: drop post (missing sender id)");
3740
- return;
3741
- }
3742
- if (senderId === botUserId) {
3743
- logVerboseMessage(`mattermost: drop post (self sender=${senderId})`);
3744
- return;
3745
- }
3746
- if (isSystemPost(post)) {
3747
- logVerboseMessage(`mattermost: drop post (system post type=${post.type ?? "unknown"})`);
3748
- return;
3749
- }
3750
- const channelInfo = await resolveChannelInfo(channelId);
3751
- const kind = mapMattermostChannelTypeToChatType(payload.data?.channel_type ?? channelInfo?.type ?? void 0);
3752
- const chatType = channelChatType(kind);
3753
- const senderName = payload.data?.sender_name?.trim() || (await resolveUserInfo(senderId))?.username?.trim() || senderId;
3754
- const rawText = post.message?.trim() || "";
3755
- const dmPolicy = account.config.dmPolicy ?? "pairing";
3756
- const normalizedAllowFrom = normalizeMattermostAllowList(account.config.allowFrom ?? []);
3757
- const normalizedGroupAllowFrom = normalizeMattermostAllowList(account.config.groupAllowFrom ?? []);
3758
- const storeAllowFrom = normalizeMattermostAllowList(await readStoreAllowFromForDmPolicy({
3759
- provider: "mattermost",
3760
- accountId: account.accountId,
3761
- dmPolicy,
3762
- readStore: pairing.readStoreForDmPolicy
3763
- }));
3764
- const accessDecision = resolveDmGroupAccessWithLists({
3765
- isGroup: kind !== "direct",
3766
- dmPolicy,
3767
- groupPolicy,
3768
- allowFrom: normalizedAllowFrom,
3769
- groupAllowFrom: normalizedGroupAllowFrom,
3770
- storeAllowFrom,
3771
- isSenderAllowed: (allowFrom) => isMattermostSenderAllowed({
3772
- senderId,
3773
- senderName,
3774
- allowFrom,
3775
- allowNameMatching
3776
- })
3777
- });
3778
- const effectiveAllowFrom = accessDecision.effectiveAllowFrom;
3779
- const effectiveGroupAllowFrom = accessDecision.effectiveGroupAllowFrom;
3780
- const allowTextCommands = core.channel.commands.shouldHandleTextCommands({
3781
- cfg,
3782
- surface: "mattermost"
3783
- });
3784
- const hasControlCommand = core.channel.text.hasControlCommand(rawText, cfg);
3785
- const isControlCommand = allowTextCommands && hasControlCommand;
3786
- const useAccessGroups = cfg.commands?.useAccessGroups !== false;
3787
- const commandDmAllowFrom = kind === "direct" ? effectiveAllowFrom : normalizedAllowFrom;
3788
- const senderAllowedForCommands = isMattermostSenderAllowed({
3789
- senderId,
3790
- senderName,
3791
- allowFrom: commandDmAllowFrom,
3792
- allowNameMatching
3793
- });
3794
- const groupAllowedForCommands = isMattermostSenderAllowed({
3795
- senderId,
3796
- senderName,
3797
- allowFrom: effectiveGroupAllowFrom,
3798
- allowNameMatching
3799
- });
3800
- const commandGate = resolveControlCommandGate({
3801
- useAccessGroups,
3802
- authorizers: [{
3803
- configured: commandDmAllowFrom.length > 0,
3804
- allowed: senderAllowedForCommands
3805
- }, {
3806
- configured: effectiveGroupAllowFrom.length > 0,
3807
- allowed: groupAllowedForCommands
3808
- }],
3809
- allowTextCommands,
3810
- hasControlCommand
3811
- });
3812
- const commandAuthorized = commandGate.commandAuthorized;
3813
- if (accessDecision.decision !== "allow") {
3814
- if (kind === "direct") {
3815
- if (accessDecision.reasonCode === DM_GROUP_ACCESS_REASON.DM_POLICY_DISABLED) {
3816
- logVerboseMessage(`mattermost: drop dm (dmPolicy=disabled sender=${senderId})`);
3817
- return;
3818
- }
3819
- if (accessDecision.decision === "pairing") {
3820
- const { code, created } = await pairing.upsertPairingRequest({
3821
- id: senderId,
3822
- meta: { name: senderName }
3823
- });
3824
- logVerboseMessage(`mattermost: pairing request sender=${senderId} created=${created}`);
3825
- if (created) try {
3826
- await sendMessageMattermost(`user:${senderId}`, core.channel.pairing.buildPairingReply({
3827
- channel: "mattermost",
3828
- idLine: `Your Mattermost user id: ${senderId}`,
3829
- code
3830
- }), {
3831
- cfg,
3832
- accountId: account.accountId
3833
- });
3834
- opts.statusSink?.({ lastOutboundAt: Date.now() });
3835
- } catch (err) {
3836
- logVerboseMessage(`mattermost: pairing reply failed for ${senderId}: ${String(err)}`);
3837
- }
3838
- return;
3839
- }
3840
- logVerboseMessage(`mattermost: drop dm sender=${senderId} (dmPolicy=${dmPolicy})`);
3841
- return;
3842
- }
3843
- if (accessDecision.reasonCode === DM_GROUP_ACCESS_REASON.GROUP_POLICY_DISABLED) {
3844
- logVerboseMessage("mattermost: drop group message (groupPolicy=disabled)");
3845
- return;
3846
- }
3847
- if (accessDecision.reasonCode === DM_GROUP_ACCESS_REASON.GROUP_POLICY_EMPTY_ALLOWLIST) {
3848
- logVerboseMessage("mattermost: drop group message (no group allowlist)");
3849
- return;
3850
- }
3851
- if (accessDecision.reasonCode === DM_GROUP_ACCESS_REASON.GROUP_POLICY_NOT_ALLOWLISTED) {
3852
- logVerboseMessage(`mattermost: drop group sender=${senderId} (not in groupAllowFrom)`);
3853
- return;
3854
- }
3855
- logVerboseMessage(`mattermost: drop group message (groupPolicy=${groupPolicy} reason=${accessDecision.reason})`);
3856
- return;
3857
- }
3858
- if (kind !== "direct" && commandGate.shouldBlock) {
3859
- logInboundDrop({
3860
- log: logVerboseMessage,
3861
- channel: "mattermost",
3862
- reason: "control command (unauthorized)",
3863
- target: senderId
3864
- });
3865
- return;
3866
- }
3867
- const teamId = payload.data?.team_id ?? channelInfo?.team_id ?? void 0;
3868
- const channelName = payload.data?.channel_name ?? channelInfo?.name ?? "";
3869
- const channelDisplay = payload.data?.channel_display_name ?? channelInfo?.display_name ?? channelName;
3870
- const roomLabel = channelName ? `#${channelName}` : channelDisplay || `#${channelId}`;
3871
- const route = core.channel.routing.resolveAgentRoute({
3872
- cfg,
3873
- channel: "mattermost",
3874
- accountId: account.accountId,
3875
- teamId,
3876
- peer: {
3877
- kind,
3878
- id: kind === "direct" ? senderId : channelId
3879
- }
3880
- });
3881
- const baseSessionKey = route.sessionKey;
3882
- const threadRootId = post.root_id?.trim() || void 0;
3883
- const replyToMode = resolveMattermostReplyToMode(account, kind);
3884
- const { effectiveReplyToId, sessionKey, parentSessionKey } = resolveMattermostThreadSessionContext({
3885
- baseSessionKey,
3886
- kind,
3887
- postId: post.id,
3888
- replyToMode,
3889
- threadRootId
3890
- });
3891
- const historyKey = kind === "direct" ? null : sessionKey;
3892
- const mentionRegexes = core.channel.mentions.buildMentionRegexes(cfg, route.agentId);
3893
- const wasMentioned = kind !== "direct" && ((botUsername ? rawText.toLowerCase().includes(`@${botUsername.toLowerCase()}`) : false) || core.channel.mentions.matchesMentionPatterns(rawText, mentionRegexes));
3894
- const pendingBody = rawText || (post.file_ids?.length ? `[Mattermost ${post.file_ids.length === 1 ? "file" : "files"}]` : "");
3895
- const pendingSender = senderName;
3896
- const recordPendingHistory = () => {
3897
- const trimmed = pendingBody.trim();
3898
- recordPendingHistoryEntryIfEnabled({
3899
- historyMap: channelHistories,
3900
- limit: historyLimit,
3901
- historyKey: historyKey ?? "",
3902
- entry: historyKey && trimmed ? {
3903
- sender: pendingSender,
3904
- body: trimmed,
3905
- timestamp: typeof post.create_at === "number" ? post.create_at : void 0,
3906
- messageId: post.id ?? void 0
3907
- } : null
3908
- });
3909
- };
3910
- const oncharEnabled = account.chatmode === "onchar" && kind !== "direct";
3911
- const oncharPrefixes = oncharEnabled ? resolveOncharPrefixes(account.oncharPrefixes) : [];
3912
- const oncharResult = oncharEnabled ? stripOncharPrefix(rawText, oncharPrefixes) : {
3913
- triggered: false,
3914
- stripped: rawText
3915
- };
3916
- const oncharTriggered = oncharResult.triggered;
3917
- const canDetectMention = Boolean(botUsername) || mentionRegexes.length > 0;
3918
- const mentionDecision = evaluateMattermostMentionGate({
3919
- kind,
3920
- cfg,
3921
- accountId: account.accountId,
3922
- channelId,
3923
- threadRootId,
3924
- requireMentionOverride: account.requireMention,
3925
- resolveRequireMention: core.channel.groups.resolveRequireMention,
3926
- wasMentioned,
3927
- isControlCommand,
3928
- commandAuthorized,
3929
- oncharEnabled,
3930
- oncharTriggered,
3931
- canDetectMention
3932
- });
3933
- const { shouldRequireMention, shouldBypassMention } = mentionDecision;
3934
- if (mentionDecision.dropReason === "onchar-not-triggered") {
3935
- logVerboseMessage(`mattermost: drop group message (onchar not triggered channel=${channelId} sender=${senderId})`);
3936
- recordPendingHistory();
3937
- return;
3938
- }
3939
- if (mentionDecision.dropReason === "missing-mention") {
3940
- logVerboseMessage(`mattermost: drop group message (missing mention channel=${channelId} sender=${senderId} requireMention=${shouldRequireMention} bypass=${shouldBypassMention} canDetectMention=${canDetectMention})`);
3941
- recordPendingHistory();
3942
- return;
3943
- }
3944
- const mediaList = await resolveMattermostMedia(post.file_ids);
3945
- const mediaPlaceholder = buildMattermostAttachmentPlaceholder(mediaList);
3946
- const bodyText = normalizeMention([oncharTriggered ? oncharResult.stripped : rawText, mediaPlaceholder].filter(Boolean).join("\n").trim(), botUsername);
3947
- if (!bodyText) {
3948
- logVerboseMessage(`mattermost: drop group message (empty body after normalization channel=${channelId} sender=${senderId})`);
3949
- return;
3950
- }
3951
- core.channel.activity.record({
3952
- channel: "mattermost",
3953
- accountId: account.accountId,
3954
- direction: "inbound"
3955
- });
3956
- const fromLabel = formatInboundFromLabel({
3957
- isGroup: kind !== "direct",
3958
- groupLabel: channelDisplay || roomLabel,
3959
- groupId: channelId,
3960
- groupFallback: roomLabel || "Channel",
3961
- directLabel: senderName,
3962
- directId: senderId
3963
- });
3964
- const preview = bodyText.replace(/\s+/g, " ").slice(0, 160);
3965
- const inboundLabel = kind === "direct" ? `Mattermost DM from ${senderName}` : `Mattermost message in ${roomLabel} from ${senderName}`;
3966
- core.system.enqueueSystemEvent(`${inboundLabel}: ${preview}`, {
3967
- sessionKey,
3968
- contextKey: `mattermost:message:${channelId}:${post.id ?? "unknown"}`
3969
- });
3970
- const textWithId = `${bodyText}\n[mattermost message id: ${post.id ?? "unknown"} channel: ${channelId}]`;
3971
- let combinedBody = core.channel.reply.formatInboundEnvelope({
3972
- channel: "Mattermost",
3973
- from: fromLabel,
3974
- timestamp: typeof post.create_at === "number" ? post.create_at : void 0,
3975
- body: textWithId,
3976
- chatType,
3977
- sender: {
3978
- name: senderName,
3979
- id: senderId
3980
- }
3981
- });
3982
- if (historyKey) combinedBody = buildPendingHistoryContextFromMap({
3983
- historyMap: channelHistories,
3984
- historyKey,
3985
- limit: historyLimit,
3986
- currentMessage: combinedBody,
3987
- formatEntry: (entry) => core.channel.reply.formatInboundEnvelope({
3988
- channel: "Mattermost",
3989
- from: fromLabel,
3990
- timestamp: entry.timestamp,
3991
- body: `${entry.body}${entry.messageId ? ` [id:${entry.messageId} channel:${channelId}]` : ""}`,
3992
- chatType,
3993
- senderLabel: entry.sender
3994
- })
3995
- });
3996
- const to = kind === "direct" ? `user:${senderId}` : `channel:${channelId}`;
3997
- const mediaPayload = buildAgentMediaPayload(mediaList);
3998
- const commandBody = rawText.trim();
3999
- const inboundHistory = historyKey && historyLimit > 0 ? (channelHistories.get(historyKey) ?? []).map((entry) => ({
4000
- sender: entry.sender,
4001
- body: entry.body,
4002
- timestamp: entry.timestamp
4003
- })) : void 0;
4004
- const ctxPayload = core.channel.reply.finalizeInboundContext({
4005
- Body: combinedBody,
4006
- BodyForAgent: bodyText,
4007
- InboundHistory: inboundHistory,
4008
- RawBody: bodyText,
4009
- CommandBody: commandBody,
4010
- BodyForCommands: commandBody,
4011
- From: kind === "direct" ? `mattermost:${senderId}` : kind === "group" ? `mattermost:group:${channelId}` : `mattermost:channel:${channelId}`,
4012
- To: to,
4013
- SessionKey: sessionKey,
4014
- ParentSessionKey: parentSessionKey,
4015
- AccountId: route.accountId,
4016
- ChatType: chatType,
4017
- ConversationLabel: fromLabel,
4018
- GroupSubject: kind !== "direct" ? channelDisplay || roomLabel : void 0,
4019
- GroupChannel: channelName ? `#${channelName}` : void 0,
4020
- GroupSpace: teamId,
4021
- SenderName: senderName,
4022
- SenderId: senderId,
4023
- Provider: "mattermost",
4024
- Surface: "mattermost",
4025
- MessageSid: post.id ?? void 0,
4026
- MessageSids: allMessageIds.length > 1 ? allMessageIds : void 0,
4027
- MessageSidFirst: allMessageIds.length > 1 ? allMessageIds[0] : void 0,
4028
- MessageSidLast: allMessageIds.length > 1 ? allMessageIds[allMessageIds.length - 1] : void 0,
4029
- ReplyToId: effectiveReplyToId,
4030
- MessageThreadId: effectiveReplyToId,
4031
- Timestamp: typeof post.create_at === "number" ? post.create_at : void 0,
4032
- WasMentioned: kind !== "direct" ? mentionDecision.effectiveWasMentioned : void 0,
4033
- CommandAuthorized: commandAuthorized,
4034
- OriginatingChannel: "mattermost",
4035
- OriginatingTo: to,
4036
- ...mediaPayload
4037
- });
4038
- if (kind === "direct") {
4039
- const sessionCfg = cfg.session;
4040
- const storePath = core.channel.session.resolveStorePath(sessionCfg?.store, { agentId: route.agentId });
4041
- await core.channel.session.updateLastRoute({
4042
- storePath,
4043
- sessionKey: route.mainSessionKey,
4044
- deliveryContext: {
4045
- channel: "mattermost",
4046
- to,
4047
- accountId: route.accountId
4048
- }
4049
- });
4050
- }
4051
- const previewLine = bodyText.slice(0, 200).replace(/\n/g, "\\n");
4052
- logVerboseMessage(`mattermost inbound: from=${ctxPayload.From} len=${bodyText.length} preview="${previewLine}"`);
4053
- const textLimit = core.channel.text.resolveTextChunkLimit(cfg, "mattermost", account.accountId, { fallbackLimit: account.textChunkLimit ?? 4e3 });
4054
- const tableMode = core.channel.text.resolveMarkdownTableMode({
4055
- cfg,
4056
- channel: "mattermost",
4057
- accountId: account.accountId
4058
- });
4059
- const { onModelSelected, typingCallbacks, ...replyPipeline } = createChannelReplyPipeline({
4060
- cfg,
4061
- agentId: route.agentId,
4062
- channel: "mattermost",
4063
- accountId: account.accountId,
4064
- typing: {
4065
- start: () => sendTypingIndicator(channelId, effectiveReplyToId),
4066
- onStartError: (err) => {
4067
- logTypingFailure({
4068
- log: (message) => logger.debug?.(message),
4069
- channel: "mattermost",
4070
- target: channelId,
4071
- error: err
4072
- });
4073
- }
4074
- }
4075
- });
4076
- const { dispatcher, replyOptions, markDispatchIdle } = core.channel.reply.createReplyDispatcherWithTyping({
4077
- ...replyPipeline,
4078
- humanDelay: core.channel.reply.resolveHumanDelayConfig(cfg, route.agentId),
4079
- typingCallbacks,
4080
- deliver: async (payload) => {
4081
- await deliverMattermostReplyPayload({
4082
- core,
4083
- cfg,
4084
- payload,
4085
- to,
4086
- accountId: account.accountId,
4087
- agentId: route.agentId,
4088
- replyToId: resolveMattermostReplyRootId({
4089
- threadRootId: effectiveReplyToId,
4090
- replyToId: payload.replyToId
4091
- }),
4092
- textLimit,
4093
- tableMode,
4094
- sendMessage: sendMessageMattermost
4095
- });
4096
- runtime.log?.(`delivered reply to ${to}`);
4097
- },
4098
- onError: (err, info) => {
4099
- runtime.error?.(`mattermost ${info.kind} reply failed: ${String(err)}`);
4100
- }
4101
- });
4102
- await core.channel.reply.withReplyDispatcher({
4103
- dispatcher,
4104
- onSettled: () => {
4105
- markDispatchIdle();
4106
- },
4107
- run: () => core.channel.reply.dispatchReplyFromConfig({
4108
- ctx: ctxPayload,
4109
- cfg,
4110
- dispatcher,
4111
- replyOptions: {
4112
- ...replyOptions,
4113
- disableBlockStreaming: typeof account.blockStreaming === "boolean" ? !account.blockStreaming : void 0,
4114
- onModelSelected
4115
- }
4116
- })
4117
- });
4118
- if (historyKey) clearHistoryEntriesIfEnabled({
4119
- historyMap: channelHistories,
4120
- historyKey,
4121
- limit: historyLimit
4122
- });
4123
- };
4124
- const handleReactionEvent = async (payload) => {
4125
- const reactionData = payload.data?.reaction;
4126
- if (!reactionData) return;
4127
- let reaction = null;
4128
- if (typeof reactionData === "string") try {
4129
- reaction = JSON.parse(reactionData);
4130
- } catch {
4131
- return;
4132
- }
4133
- else if (typeof reactionData === "object") reaction = reactionData;
4134
- if (!reaction) return;
4135
- const userId = reaction.user_id?.trim();
4136
- const postId = reaction.post_id?.trim();
4137
- const emojiName = reaction.emoji_name?.trim();
4138
- if (!userId || !postId || !emojiName) return;
4139
- if (userId === botUserId) return;
4140
- const action = payload.event === "reaction_removed" ? "removed" : "added";
4141
- const senderName = (await resolveUserInfo(userId))?.username?.trim() || userId;
4142
- const channelId = resolveMattermostReactionChannelId(payload);
4143
- if (!channelId) {
4144
- logVerboseMessage(`mattermost: drop reaction (no channel_id in broadcast, cannot enforce policy)`);
4145
- return;
4146
- }
4147
- const channelInfo = await resolveChannelInfo(channelId);
4148
- if (!channelInfo?.type) {
4149
- logVerboseMessage(`mattermost: drop reaction (cannot resolve channel type for ${channelId})`);
4150
- return;
4151
- }
4152
- const kind = mapMattermostChannelTypeToChatType(channelInfo.type);
4153
- const dmPolicy = account.config.dmPolicy ?? "pairing";
4154
- const storeAllowFrom = normalizeMattermostAllowList(await readStoreAllowFromForDmPolicy({
4155
- provider: "mattermost",
4156
- accountId: account.accountId,
4157
- dmPolicy,
4158
- readStore: pairing.readStoreForDmPolicy
4159
- }));
4160
- const reactionAccess = resolveDmGroupAccessWithLists({
4161
- isGroup: kind !== "direct",
4162
- dmPolicy,
4163
- groupPolicy,
4164
- allowFrom: normalizeMattermostAllowList(account.config.allowFrom ?? []),
4165
- groupAllowFrom: normalizeMattermostAllowList(account.config.groupAllowFrom ?? []),
4166
- storeAllowFrom,
4167
- isSenderAllowed: (allowFrom) => isMattermostSenderAllowed({
4168
- senderId: userId,
4169
- senderName,
4170
- allowFrom,
4171
- allowNameMatching
4172
- })
4173
- });
4174
- if (reactionAccess.decision !== "allow") {
4175
- if (kind === "direct") logVerboseMessage(`mattermost: drop reaction (dmPolicy=${dmPolicy} sender=${userId} reason=${reactionAccess.reason})`);
4176
- else logVerboseMessage(`mattermost: drop reaction (groupPolicy=${groupPolicy} sender=${userId} reason=${reactionAccess.reason} channel=${channelId})`);
4177
- return;
4178
- }
4179
- const teamId = channelInfo?.team_id ?? void 0;
4180
- const sessionKey = core.channel.routing.resolveAgentRoute({
4181
- cfg,
4182
- channel: "mattermost",
4183
- accountId: account.accountId,
4184
- teamId,
4185
- peer: {
4186
- kind,
4187
- id: kind === "direct" ? userId : channelId
4188
- }
4189
- }).sessionKey;
4190
- const eventText = `Mattermost reaction ${action}: :${emojiName}: by @${senderName} on post ${postId} in channel ${channelId}`;
4191
- core.system.enqueueSystemEvent(eventText, {
4192
- sessionKey,
4193
- contextKey: `mattermost:reaction:${postId}:${emojiName}:${userId}:${action}`
4194
- });
4195
- logVerboseMessage(`mattermost reaction: ${action} :${emojiName}: by ${senderName} on ${postId}`);
4196
- };
4197
- const inboundDebounceMs = core.channel.debounce.resolveInboundDebounceMs({
4198
- cfg,
4199
- channel: "mattermost"
4200
- });
4201
- const debouncer = core.channel.debounce.createInboundDebouncer({
4202
- debounceMs: inboundDebounceMs,
4203
- buildKey: (entry) => {
4204
- const channelId = entry.post.channel_id ?? entry.payload.data?.channel_id ?? entry.payload.broadcast?.channel_id;
4205
- if (!channelId) return null;
4206
- const threadId = entry.post.root_id?.trim();
4207
- const threadKey = threadId ? `thread:${threadId}` : "channel";
4208
- return `mattermost:${account.accountId}:${channelId}:${threadKey}`;
4209
- },
4210
- shouldDebounce: (entry) => {
4211
- if (entry.post.file_ids && entry.post.file_ids.length > 0) return false;
4212
- const text = entry.post.message?.trim() ?? "";
4213
- if (!text) return false;
4214
- return !core.channel.text.hasControlCommand(text, cfg);
4215
- },
4216
- onFlush: async (entries) => {
4217
- const last = entries.at(-1);
4218
- if (!last) return;
4219
- if (entries.length === 1) {
4220
- await handlePost(last.post, last.payload);
4221
- return;
4222
- }
4223
- const combinedText = entries.map((entry) => entry.post.message?.trim() ?? "").filter(Boolean).join("\n");
4224
- const mergedPost = {
4225
- ...last.post,
4226
- message: combinedText,
4227
- file_ids: []
4228
- };
4229
- const ids = entries.map((entry) => entry.post.id).filter(Boolean);
4230
- await handlePost(mergedPost, last.payload, ids.length > 0 ? ids : void 0);
4231
- },
4232
- onError: (err) => {
4233
- runtime.error?.(`mattermost debounce flush failed: ${String(err)}`);
4234
- }
4235
- });
4236
- const wsUrl = buildMattermostWsUrl(baseUrl);
4237
- let seq = 1;
4238
- const connectOnce = createMattermostConnectOnce({
4239
- wsUrl,
4240
- botToken,
4241
- abortSignal: opts.abortSignal,
4242
- statusSink: opts.statusSink,
4243
- runtime,
4244
- webSocketFactory: opts.webSocketFactory,
4245
- nextSeq: () => seq++,
4246
- getBotUpdateAt: async () => {
4247
- return (await fetchMattermostMe(client)).update_at ?? 0;
4248
- },
4249
- onPosted: async (post, payload) => {
4250
- await debouncer.enqueue({
4251
- post,
4252
- payload
4253
- });
4254
- },
4255
- onReaction: async (payload) => {
4256
- await handleReactionEvent(payload);
4257
- }
4258
- });
4259
- let slashShutdownCleanup = null;
4260
- if (slashEnabled) {
4261
- const runAbortCleanup = () => {
4262
- if (slashShutdownCleanup) return;
4263
- const commands = getSlashCommandState(account.accountId)?.registeredCommands ?? [];
4264
- deactivateSlashCommands(account.accountId);
4265
- slashShutdownCleanup = cleanupSlashCommands({
4266
- client,
4267
- commands,
4268
- log: (msg) => runtime.log?.(msg)
4269
- }).catch((err) => {
4270
- runtime.error?.(`mattermost: slash cleanup failed: ${String(err)}`);
4271
- });
4272
- };
4273
- if (opts.abortSignal?.aborted) runAbortCleanup();
4274
- else opts.abortSignal?.addEventListener("abort", runAbortCleanup, { once: true });
4275
- }
4276
- try {
4277
- await runWithReconnect(connectOnce, {
4278
- abortSignal: opts.abortSignal,
4279
- jitterRatio: .2,
4280
- onError: (err) => {
4281
- runtime.error?.(`mattermost connection failed: ${String(err)}`);
4282
- opts.statusSink?.({
4283
- lastError: String(err),
4284
- connected: false
4285
- });
4286
- },
4287
- onReconnect: (delayMs) => {
4288
- runtime.log?.(`mattermost reconnecting in ${Math.round(delayMs / 1e3)}s`);
4289
- }
4290
- });
4291
- } finally {
4292
- unregisterInteractions?.();
4293
- }
4294
- if (slashShutdownCleanup) await slashShutdownCleanup;
4295
- }
4296
- //#endregion
4297
- //#region extensions/mattermost/src/mattermost/probe.ts
4298
- async function probeMattermost(baseUrl, botToken, timeoutMs = 2500, allowPrivateNetwork = false) {
4299
- const normalized = normalizeMattermostBaseUrl(baseUrl);
4300
- if (!normalized) return {
4301
- ok: false,
4302
- error: "baseUrl missing"
4303
- };
4304
- const url = `${normalized}/api/v4/users/me`;
4305
- const start = Date.now();
4306
- const controller = timeoutMs > 0 ? new AbortController() : void 0;
4307
- let timer = null;
4308
- if (controller) timer = setTimeout(() => controller.abort(), timeoutMs);
4309
- try {
4310
- const { response: res, release } = await fetchWithSsrFGuard({
4311
- url,
4312
- init: {
4313
- headers: { Authorization: `Bearer ${botToken}` },
4314
- signal: controller?.signal
4315
- },
4316
- auditContext: "mattermost-probe",
4317
- policy: allowPrivateNetwork ? { allowPrivateNetwork: true } : void 0
4318
- });
4319
- try {
4320
- const elapsedMs = Date.now() - start;
4321
- if (!res.ok) {
4322
- const detail = await readMattermostError(res);
4323
- return {
4324
- ok: false,
4325
- status: res.status,
4326
- error: detail || res.statusText,
4327
- elapsedMs
4328
- };
4329
- }
4330
- const bot = await res.json();
4331
- return {
4332
- ok: true,
4333
- status: res.status,
4334
- elapsedMs,
4335
- bot
4336
- };
4337
- } finally {
4338
- await release();
4339
- }
4340
- } catch (err) {
4341
- return {
4342
- ok: false,
4343
- status: null,
4344
- error: err instanceof Error ? err.message : String(err),
4345
- elapsedMs: Date.now() - start
4346
- };
4347
- } finally {
4348
- if (timer) clearTimeout(timer);
4349
- }
4350
- }
4351
- //#endregion
4352
- //#region extensions/mattermost/src/mattermost/reactions.ts
4353
- const BOT_USER_CACHE_TTL_MS = 10 * 6e4;
4354
- const botUserIdCache = /* @__PURE__ */ new Map();
4355
- async function resolveBotUserId(client, cacheKey) {
4356
- const cached = botUserIdCache.get(cacheKey);
4357
- if (cached && cached.expiresAt > Date.now()) return cached.userId;
4358
- const userId = (await fetchMattermostMe(client))?.id?.trim();
4359
- if (!userId) return null;
4360
- botUserIdCache.set(cacheKey, {
4361
- userId,
4362
- expiresAt: Date.now() + BOT_USER_CACHE_TTL_MS
4363
- });
4364
- return userId;
4365
- }
4366
- async function addMattermostReaction(params) {
4367
- return runMattermostReaction(params, {
4368
- action: "add",
4369
- mutation: createReaction
4370
- });
4371
- }
4372
- async function removeMattermostReaction(params) {
4373
- return runMattermostReaction(params, {
4374
- action: "remove",
4375
- mutation: deleteReaction
4376
- });
4377
- }
4378
- async function runMattermostReaction(params, options) {
4379
- const resolved = resolveMattermostAccount({
4380
- cfg: params.cfg,
4381
- accountId: params.accountId
4382
- });
4383
- const baseUrl = resolved.baseUrl?.trim();
4384
- const botToken = resolved.botToken?.trim();
4385
- if (!baseUrl || !botToken) return {
4386
- ok: false,
4387
- error: "Mattermost botToken/baseUrl missing."
4388
- };
4389
- const client = createMattermostClient({
4390
- baseUrl,
4391
- botToken,
4392
- fetchImpl: params.fetchImpl,
4393
- allowPrivateNetwork: resolved.config?.allowPrivateNetwork === true
4394
- });
4395
- const userId = await resolveBotUserId(client, `${baseUrl}:${botToken}`);
4396
- if (!userId) return {
4397
- ok: false,
4398
- error: "Mattermost reactions failed: could not resolve bot user id."
4399
- };
4400
- try {
4401
- await options.mutation(client, {
4402
- userId,
4403
- postId: params.postId,
4404
- emojiName: params.emojiName
4405
- });
4406
- } catch (err) {
4407
- return {
4408
- ok: false,
4409
- error: `Mattermost ${options.action} reaction failed: ${String(err)}`
4410
- };
4411
- }
4412
- return { ok: true };
4413
- }
4414
- async function createReaction(client, params) {
4415
- await client.request("/reactions", {
4416
- method: "POST",
4417
- body: JSON.stringify({
4418
- user_id: params.userId,
4419
- post_id: params.postId,
4420
- emoji_name: params.emojiName
4421
- })
4422
- });
4423
- }
4424
- async function deleteReaction(client, params) {
4425
- const emoji = encodeURIComponent(params.emojiName);
4426
- await client.request(`/users/${params.userId}/posts/${params.postId}/reactions/${emoji}`, { method: "DELETE" });
4427
- }
4428
- //#endregion
4429
- //#region extensions/mattermost/src/normalize.ts
4430
- function normalizeMattermostMessagingTarget(raw) {
4431
- const trimmed = raw.trim();
4432
- if (!trimmed) return;
4433
- const lower = trimmed.toLowerCase();
4434
- if (lower.startsWith("channel:")) {
4435
- const id = trimmed.slice(8).trim();
4436
- return id ? `channel:${id}` : void 0;
4437
- }
4438
- if (lower.startsWith("group:")) {
4439
- const id = trimmed.slice(6).trim();
4440
- return id ? `channel:${id}` : void 0;
4441
- }
4442
- if (lower.startsWith("user:")) {
4443
- const id = trimmed.slice(5).trim();
4444
- return id ? `user:${id}` : void 0;
4445
- }
4446
- if (lower.startsWith("mattermost:")) {
4447
- const id = trimmed.slice(11).trim();
4448
- return id ? `user:${id}` : void 0;
4449
- }
4450
- if (trimmed.startsWith("@")) {
4451
- const id = trimmed.slice(1).trim();
4452
- return id ? `@${id}` : void 0;
4453
- }
4454
- if (trimmed.startsWith("#")) return;
4455
- }
4456
- function looksLikeMattermostTargetId(raw, normalized) {
4457
- const trimmed = raw.trim();
4458
- if (!trimmed) return false;
4459
- if (/^(user|channel|group|mattermost):/i.test(trimmed)) return true;
4460
- if (trimmed.startsWith("@")) return true;
4461
- return /^[a-z0-9]{26}$/i.test(trimmed) || /^[a-z0-9]{26}__[a-z0-9]{26}$/i.test(trimmed);
4462
- }
4463
- //#endregion
4464
- //#region extensions/mattermost/src/session-route.ts
4465
- function resolveMattermostOutboundSessionRoute(params) {
4466
- let trimmed = stripChannelTargetPrefix(params.target, "mattermost");
4467
- if (!trimmed) return null;
4468
- const lower = trimmed.toLowerCase();
4469
- const resolvedKind = params.resolvedTarget?.kind;
4470
- const isUser = resolvedKind === "user" || resolvedKind !== "channel" && resolvedKind !== "group" && (lower.startsWith("user:") || trimmed.startsWith("@"));
4471
- if (trimmed.startsWith("@")) trimmed = trimmed.slice(1).trim();
4472
- const rawId = stripTargetKindPrefix(trimmed);
4473
- if (!rawId) return null;
4474
- const baseRoute = buildChannelOutboundSessionRoute({
4475
- cfg: params.cfg,
4476
- agentId: params.agentId,
4477
- channel: "mattermost",
4478
- accountId: params.accountId,
4479
- peer: {
4480
- kind: isUser ? "direct" : "channel",
4481
- id: rawId
4482
- },
4483
- chatType: isUser ? "direct" : "channel",
4484
- from: isUser ? `mattermost:${rawId}` : `mattermost:channel:${rawId}`,
4485
- to: isUser ? `user:${rawId}` : `channel:${rawId}`
4486
- });
4487
- const threadId = normalizeOutboundThreadId(params.replyToId ?? params.threadId);
4488
- const threadKeys = resolveThreadSessionKeys$1({
4489
- baseSessionKey: baseRoute.baseSessionKey,
4490
- threadId
4491
- });
4492
- return {
4493
- ...baseRoute,
4494
- sessionKey: threadKeys.sessionKey,
4495
- ...threadId !== void 0 ? { threadId } : {}
4496
- };
4497
- }
4498
- //#endregion
4499
- //#region extensions/mattermost/src/setup-core.ts
4500
- const channel$1 = "mattermost";
4501
- function isMattermostConfigured(account) {
4502
- return (Boolean(account.botToken?.trim()) || hasConfiguredSecretInput(account.config.botToken)) && Boolean(account.baseUrl);
4503
- }
4504
- function resolveMattermostAccountWithSecrets(cfg, accountId) {
4505
- return resolveMattermostAccount({
4506
- cfg,
4507
- accountId,
4508
- allowUnresolvedSecretRef: true
4509
- });
4510
- }
4511
- const mattermostSetupAdapter = {
4512
- resolveAccountId: ({ accountId }) => normalizeAccountId(accountId),
4513
- applyAccountName: ({ cfg, accountId, name }) => applyAccountNameToChannelSection({
4514
- cfg,
4515
- channelKey: channel$1,
4516
- accountId,
4517
- name
4518
- }),
4519
- validateInput: createSetupInputPresenceValidator({
4520
- defaultAccountOnlyEnvError: "Mattermost env vars can only be used for the default account.",
4521
- whenNotUseEnv: [{
4522
- someOf: ["botToken", "token"],
4523
- message: "Mattermost requires --bot-token and --http-url (or --use-env)."
4524
- }, {
4525
- someOf: ["httpUrl"],
4526
- message: "Mattermost requires --bot-token and --http-url (or --use-env)."
4527
- }],
4528
- validate: ({ accountId, input }) => {
4529
- const token = input.botToken ?? input.token;
4530
- const baseUrl = normalizeMattermostBaseUrl(input.httpUrl);
4531
- if (!input.useEnv && (!token || !baseUrl)) return "Mattermost requires --bot-token and --http-url (or --use-env).";
4532
- if (input.httpUrl && !baseUrl) return "Mattermost --http-url must include a valid base URL.";
4533
- return null;
4534
- }
4535
- }),
4536
- applyAccountConfig: ({ cfg, accountId, input }) => {
4537
- const token = input.botToken ?? input.token;
4538
- const baseUrl = normalizeMattermostBaseUrl(input.httpUrl);
4539
- const namedConfig = applyAccountNameToChannelSection({
4540
- cfg,
4541
- channelKey: channel$1,
4542
- accountId,
4543
- name: input.name
4544
- });
4545
- return applySetupAccountConfigPatch({
4546
- cfg: accountId !== "default" ? migrateBaseNameToDefaultAccount({
4547
- cfg: namedConfig,
4548
- channelKey: channel$1
4549
- }) : namedConfig,
4550
- channelKey: channel$1,
4551
- accountId,
4552
- patch: input.useEnv ? {} : {
4553
- ...token ? { botToken: token } : {},
4554
- ...baseUrl ? { baseUrl } : {}
4555
- }
4556
- });
4557
- }
4558
- };
4559
- //#endregion
4560
- //#region extensions/mattermost/src/setup-surface.ts
4561
- const channel = "mattermost";
4562
- const mattermostSetupWizard = {
4563
- channel,
4564
- status: createStandardChannelSetupStatus({
4565
- channelLabel: "Mattermost",
4566
- configuredLabel: "configured",
4567
- unconfiguredLabel: "needs token + url",
4568
- configuredHint: "configured",
4569
- unconfiguredHint: "needs setup",
4570
- configuredScore: 2,
4571
- unconfiguredScore: 1,
4572
- resolveConfigured: ({ cfg }) => listMattermostAccountIds(cfg).some((accountId) => isMattermostConfigured(resolveMattermostAccountWithSecrets(cfg, accountId)))
4573
- }),
4574
- introNote: {
4575
- title: "Mattermost bot token",
4576
- lines: [
4577
- "1) Mattermost System Console -> Integrations -> Bot Accounts",
4578
- "2) Create a bot + copy its token",
4579
- "3) Use your server base URL (e.g., https://chat.example.com)",
4580
- "Tip: the bot must be a member of any channel you want it to monitor.",
4581
- `Docs: ${formatDocsLink("/mattermost", "mattermost")}`
4582
- ],
4583
- shouldShow: ({ cfg, accountId }) => !isMattermostConfigured(resolveMattermostAccountWithSecrets(cfg, accountId))
4584
- },
4585
- envShortcut: {
4586
- prompt: "MATTERMOST_BOT_TOKEN + MATTERMOST_URL detected. Use env vars?",
4587
- preferredEnvVar: "MATTERMOST_BOT_TOKEN",
4588
- isAvailable: ({ cfg, accountId }) => {
4589
- if (accountId !== "default") return false;
4590
- const resolvedAccount = resolveMattermostAccountWithSecrets(cfg, accountId);
4591
- const hasConfigValues = hasConfiguredSecretInput(resolvedAccount.config.botToken) || Boolean(resolvedAccount.config.baseUrl?.trim());
4592
- return Boolean(process.env.MATTERMOST_BOT_TOKEN?.trim() && process.env.MATTERMOST_URL?.trim() && !hasConfigValues);
4593
- },
4594
- apply: ({ cfg, accountId }) => applySetupAccountConfigPatch({
4595
- cfg,
4596
- channelKey: channel,
4597
- accountId,
4598
- patch: {}
4599
- })
4600
- },
4601
- credentials: [{
4602
- inputKey: "botToken",
4603
- providerHint: channel,
4604
- credentialLabel: "bot token",
4605
- preferredEnvVar: "MATTERMOST_BOT_TOKEN",
4606
- envPrompt: "MATTERMOST_BOT_TOKEN + MATTERMOST_URL detected. Use env vars?",
4607
- keepPrompt: "Mattermost bot token already configured. Keep it?",
4608
- inputPrompt: "Enter Mattermost bot token",
4609
- inspect: ({ cfg, accountId }) => {
4610
- const resolvedAccount = resolveMattermostAccountWithSecrets(cfg, accountId);
4611
- return {
4612
- accountConfigured: isMattermostConfigured(resolvedAccount),
4613
- hasConfiguredValue: hasConfiguredSecretInput(resolvedAccount.config.botToken)
4614
- };
4615
- }
4616
- }],
4617
- textInputs: [{
4618
- inputKey: "httpUrl",
4619
- message: "Enter Mattermost base URL",
4620
- confirmCurrentValue: false,
4621
- currentValue: ({ cfg, accountId }) => resolveMattermostAccountWithSecrets(cfg, accountId).baseUrl ?? process.env.MATTERMOST_URL?.trim(),
4622
- initialValue: ({ cfg, accountId }) => resolveMattermostAccountWithSecrets(cfg, accountId).baseUrl ?? process.env.MATTERMOST_URL?.trim(),
4623
- shouldPrompt: ({ cfg, accountId, credentialValues, currentValue }) => {
4624
- const resolvedAccount = resolveMattermostAccountWithSecrets(cfg, accountId);
4625
- const tokenConfigured = Boolean(resolvedAccount.botToken?.trim()) || hasConfiguredSecretInput(resolvedAccount.config.botToken);
4626
- return Boolean(credentialValues.botToken) || !tokenConfigured || !currentValue;
4627
- },
4628
- validate: ({ value }) => normalizeMattermostBaseUrl(value) ? void 0 : "Mattermost base URL must include a valid base URL.",
4629
- normalizeValue: ({ value }) => normalizeMattermostBaseUrl(value) ?? value.trim()
4630
- }],
4631
- disable: (cfg) => ({
4632
- ...cfg,
4633
- channels: {
4634
- ...cfg.channels,
4635
- mattermost: {
4636
- ...cfg.channels?.mattermost,
4637
- enabled: false
4638
- }
4639
- }
4640
- })
4641
- };
4642
- //#endregion
4643
- //#region extensions/mattermost/src/channel.ts
4644
- const mattermostSecurityAdapter = createRestrictSendersChannelSecurity({
4645
- channelKey: "mattermost",
4646
- resolveDmPolicy: (account) => account.config.dmPolicy,
4647
- resolveDmAllowFrom: (account) => account.config.allowFrom,
4648
- resolveGroupPolicy: (account) => account.config.groupPolicy,
4649
- surface: "Mattermost channels",
4650
- openScope: "any member",
4651
- groupPolicyPath: "channels.mattermost.groupPolicy",
4652
- groupAllowFromPath: "channels.mattermost.groupAllowFrom",
4653
- policyPathSuffix: "dmPolicy",
4654
- normalizeDmEntry: (raw) => normalizeAllowEntry(raw)
4655
- });
4656
- function describeMattermostMessageTool({ cfg }) {
4657
- const enabledAccounts = listMattermostAccountIds(cfg).map((accountId) => resolveMattermostAccount({
4658
- cfg,
4659
- accountId
4660
- })).filter((account) => account.enabled).filter((account) => Boolean(account.botToken?.trim() && account.baseUrl?.trim()));
4661
- const actions = [];
4662
- if (enabledAccounts.length > 0) actions.push("send");
4663
- const baseReactions = (cfg.channels?.mattermost?.actions)?.reactions;
4664
- if (enabledAccounts.some((account) => {
4665
- return (account.config.actions?.reactions ?? baseReactions ?? true) !== false;
4666
- })) actions.push("react");
4667
- return {
4668
- actions,
4669
- capabilities: enabledAccounts.length > 0 ? ["buttons"] : [],
4670
- schema: enabledAccounts.length > 0 ? { properties: { buttons: Type.Optional(createMessageToolButtonsSchema()) } } : null
4671
- };
4672
- }
4673
- const mattermostMessageActions = {
4674
- describeMessageTool: describeMattermostMessageTool,
4675
- supportsAction: ({ action }) => {
4676
- return action === "send" || action === "react";
4677
- },
4678
- handleAction: async ({ action, params, cfg, accountId }) => {
4679
- if (action === "react") {
4680
- const resolvedAccountId = accountId ?? resolveDefaultMattermostAccountId(cfg);
4681
- const mattermostConfig = cfg.channels?.mattermost;
4682
- if (!(resolveMattermostAccount({
4683
- cfg,
4684
- accountId: resolvedAccountId
4685
- }).config.actions?.reactions ?? mattermostConfig?.actions?.reactions ?? true)) throw new Error("Mattermost reactions are disabled in config");
4686
- const { postId, emojiName, remove } = parseMattermostReactActionParams(params);
4687
- if (remove) {
4688
- const result = await removeMattermostReaction({
4689
- cfg,
4690
- postId,
4691
- emojiName,
4692
- accountId: resolvedAccountId
4693
- });
4694
- if (!result.ok) throw new Error(result.error);
4695
- return {
4696
- content: [{
4697
- type: "text",
4698
- text: `Removed reaction :${emojiName}: from ${postId}`
4699
- }],
4700
- details: {}
4701
- };
4702
- }
4703
- const result = await addMattermostReaction({
4704
- cfg,
4705
- postId,
4706
- emojiName,
4707
- accountId: resolvedAccountId
4708
- });
4709
- if (!result.ok) throw new Error(result.error);
4710
- return {
4711
- content: [{
4712
- type: "text",
4713
- text: `Reacted with :${emojiName}: on ${postId}`
4714
- }],
4715
- details: {}
4716
- };
4717
- }
4718
- if (action !== "send") throw new Error(`Unsupported Mattermost action: ${action}`);
4719
- const to = typeof params.to === "string" ? params.to.trim() : typeof params.target === "string" ? params.target.trim() : "";
4720
- if (!to) throw new Error("Mattermost send requires a target (to).");
4721
- const message = typeof params.message === "string" ? params.message : "";
4722
- const replyToId = readMattermostReplyToId(params);
4723
- const resolvedAccountId = accountId || void 0;
4724
- const mediaUrl = typeof params.media === "string" ? params.media.trim() || void 0 : void 0;
4725
- const result = await sendMessageMattermost(to, message, {
4726
- accountId: resolvedAccountId,
4727
- replyToId,
4728
- buttons: Array.isArray(params.buttons) ? params.buttons : void 0,
4729
- attachmentText: typeof params.attachmentText === "string" ? params.attachmentText : void 0,
4730
- mediaUrl
4731
- });
4732
- return {
4733
- content: [{
4734
- type: "text",
4735
- text: JSON.stringify({
4736
- ok: true,
4737
- channel: "mattermost",
4738
- messageId: result.messageId,
4739
- channelId: result.channelId
4740
- })
4741
- }],
4742
- details: {}
4743
- };
4744
- }
4745
- };
4746
- const meta = {
4747
- id: "mattermost",
4748
- label: "Mattermost",
4749
- selectionLabel: "Mattermost (plugin)",
4750
- detailLabel: "Mattermost Bot",
4751
- docsPath: "/channels/mattermost",
4752
- docsLabel: "mattermost",
4753
- blurb: "self-hosted Slack-style chat; install the plugin to enable.",
4754
- systemImage: "bubble.left.and.bubble.right",
4755
- order: 65,
4756
- quickstartAllowFrom: true
4757
- };
4758
- function readTrimmedString(value) {
4759
- if (typeof value !== "string") return;
4760
- return value.trim() || void 0;
4761
- }
4762
- function parseMattermostReactActionParams(params) {
4763
- const postId = readTrimmedString(params.messageId) ?? readTrimmedString(params.postId);
4764
- if (!postId) throw new Error("Mattermost react requires messageId (post id)");
4765
- const emojiName = readTrimmedString(params.emoji)?.replace(/^:+|:+$/g, "");
4766
- if (!emojiName) throw new Error("Mattermost react requires emoji");
4767
- return {
4768
- postId,
4769
- emojiName,
4770
- remove: params.remove === true
4771
- };
4772
- }
4773
- function readMattermostReplyToId(params) {
4774
- return readTrimmedString(params.replyToId) ?? readTrimmedString(params.replyTo);
4775
- }
4776
- function normalizeAllowEntry(entry) {
4777
- return entry.trim().replace(/^(mattermost|user):/i, "").replace(/^@/, "").toLowerCase();
4778
- }
4779
- function formatAllowEntry(entry) {
4780
- const trimmed = entry.trim();
4781
- if (!trimmed) return "";
4782
- if (trimmed.startsWith("@")) {
4783
- const username = trimmed.slice(1).trim();
4784
- return username ? `@${username.toLowerCase()}` : "";
4785
- }
4786
- return trimmed.replace(/^(mattermost|user):/i, "").toLowerCase();
4787
- }
4788
- const mattermostConfigAdapter = createScopedChannelConfigAdapter({
4789
- sectionKey: "mattermost",
4790
- listAccountIds: listMattermostAccountIds,
4791
- resolveAccount: adaptScopedAccountAccessor(resolveMattermostAccount),
4792
- defaultAccountId: resolveDefaultMattermostAccountId,
4793
- clearBaseFields: [
4794
- "botToken",
4795
- "baseUrl",
4796
- "name"
4797
- ],
4798
- resolveAllowFrom: (account) => account.config.allowFrom,
4799
- formatAllowFrom: (allowFrom) => formatNormalizedAllowFromEntries({
4800
- allowFrom,
4801
- normalizeEntry: formatAllowEntry
4802
- })
4803
- });
4804
- const mattermostPlugin = createChatChannelPlugin({
4805
- base: {
4806
- id: "mattermost",
4807
- meta: { ...meta },
4808
- setup: mattermostSetupAdapter,
4809
- setupWizard: mattermostSetupWizard,
4810
- capabilities: {
4811
- chatTypes: [
4812
- "direct",
4813
- "channel",
4814
- "group",
4815
- "thread"
4816
- ],
4817
- reactions: true,
4818
- threads: true,
4819
- media: true,
4820
- nativeCommands: true
4821
- },
4822
- streaming: { blockStreamingCoalesceDefaults: {
4823
- minChars: 1500,
4824
- idleMs: 1e3
4825
- } },
4826
- reload: { configPrefixes: ["channels.mattermost"] },
4827
- configSchema: MattermostChannelConfigSchema,
4828
- config: {
4829
- ...mattermostConfigAdapter,
4830
- isConfigured: (account) => Boolean(account.botToken && account.baseUrl),
4831
- describeAccount: (account) => describeAccountSnapshot({
4832
- account,
4833
- configured: Boolean(account.botToken && account.baseUrl),
4834
- extra: {
4835
- botTokenSource: account.botTokenSource,
4836
- baseUrl: account.baseUrl
4837
- }
4838
- })
4839
- },
4840
- auth: mattermostApprovalAuth,
4841
- groups: { resolveRequireMention: resolveMattermostGroupRequireMention },
4842
- actions: mattermostMessageActions,
4843
- directory: createChannelDirectoryAdapter({
4844
- listGroups: async (params) => listMattermostDirectoryGroups(params),
4845
- listGroupsLive: async (params) => listMattermostDirectoryGroups(params),
4846
- listPeers: async (params) => listMattermostDirectoryPeers(params),
4847
- listPeersLive: async (params) => listMattermostDirectoryPeers(params)
4848
- }),
4849
- messaging: {
4850
- normalizeTarget: normalizeMattermostMessagingTarget,
4851
- resolveOutboundSessionRoute: (params) => resolveMattermostOutboundSessionRoute(params),
4852
- targetResolver: {
4853
- looksLikeId: looksLikeMattermostTargetId,
4854
- hint: "<channelId|user:ID|channel:ID>",
4855
- resolveTarget: async ({ cfg, accountId, input }) => {
4856
- const resolved = await resolveMattermostOpaqueTarget({
4857
- input,
4858
- cfg,
4859
- accountId
4860
- });
4861
- if (!resolved) return null;
4862
- return {
4863
- to: resolved.to,
4864
- kind: resolved.kind,
4865
- source: "directory"
4866
- };
4867
- }
4868
- }
4869
- },
4870
- status: createComputedAccountStatusAdapter({
4871
- defaultRuntime: createDefaultChannelRuntimeState(DEFAULT_ACCOUNT_ID, {
4872
- connected: false,
4873
- lastConnectedAt: null,
4874
- lastDisconnect: null
4875
- }),
4876
- buildChannelSummary: ({ snapshot }) => buildPassiveProbedChannelStatusSummary(snapshot, {
4877
- botTokenSource: snapshot.botTokenSource ?? "none",
4878
- connected: snapshot.connected ?? false,
4879
- baseUrl: snapshot.baseUrl ?? null
4880
- }),
4881
- probeAccount: async ({ account, timeoutMs }) => {
4882
- const token = account.botToken?.trim();
4883
- const baseUrl = account.baseUrl?.trim();
4884
- if (!token || !baseUrl) return {
4885
- ok: false,
4886
- error: "bot token or baseUrl missing"
4887
- };
4888
- return await probeMattermost(baseUrl, token, timeoutMs, account.config.allowPrivateNetwork === true);
4889
- },
4890
- resolveAccountSnapshot: ({ account, runtime }) => ({
4891
- accountId: account.accountId,
4892
- name: account.name,
4893
- enabled: account.enabled,
4894
- configured: Boolean(account.botToken && account.baseUrl),
4895
- extra: {
4896
- botTokenSource: account.botTokenSource,
4897
- baseUrl: account.baseUrl,
4898
- connected: runtime?.connected ?? false,
4899
- lastConnectedAt: runtime?.lastConnectedAt ?? null,
4900
- lastDisconnect: runtime?.lastDisconnect ?? null
4901
- }
4902
- })
4903
- }),
4904
- gateway: { startAccount: async (ctx) => {
4905
- const account = ctx.account;
4906
- const statusSink = createAccountStatusSink({
4907
- accountId: ctx.accountId,
4908
- setStatus: ctx.setStatus
4909
- });
4910
- statusSink({
4911
- baseUrl: account.baseUrl,
4912
- botTokenSource: account.botTokenSource
4913
- });
4914
- ctx.log?.info(`[${account.accountId}] starting channel`);
4915
- return monitorMattermostProvider({
4916
- botToken: account.botToken ?? void 0,
4917
- baseUrl: account.baseUrl ?? void 0,
4918
- accountId: account.accountId,
4919
- config: ctx.cfg,
4920
- runtime: ctx.runtime,
4921
- abortSignal: ctx.abortSignal,
4922
- statusSink
4923
- });
4924
- } }
4925
- },
4926
- pairing: { text: {
4927
- idLabel: "mattermostUserId",
4928
- message: "OpenClaw: your access has been approved.",
4929
- normalizeAllowEntry: (entry) => normalizeAllowEntry(entry),
4930
- notify: createLoggedPairingApprovalNotifier(({ id }) => `[mattermost] User ${id} approved for pairing`)
4931
- } },
4932
- threading: { scopedAccountReplyToMode: {
4933
- resolveAccount: (cfg, accountId) => resolveMattermostAccount({
4934
- cfg,
4935
- accountId: accountId ?? "default"
4936
- }),
4937
- resolveReplyToMode: (account, chatType) => resolveMattermostReplyToMode(account, chatType === "direct" || chatType === "group" || chatType === "channel" ? chatType : "channel")
4938
- } },
4939
- security: mattermostSecurityAdapter,
4940
- outbound: {
4941
- base: {
4942
- deliveryMode: "direct",
4943
- chunker: chunkTextForOutbound,
4944
- chunkerMode: "markdown",
4945
- textChunkLimit: 4e3,
4946
- resolveTarget: ({ to }) => {
4947
- const trimmed = to?.trim();
4948
- if (!trimmed) return {
4949
- ok: false,
4950
- error: /* @__PURE__ */ new Error("Delivering to Mattermost requires --to <channelId|@username|user:ID|channel:ID>")
4951
- };
4952
- return {
4953
- ok: true,
4954
- to: trimmed
4955
- };
4956
- }
4957
- },
4958
- attachedResults: {
4959
- channel: "mattermost",
4960
- sendText: async ({ cfg, to, text, accountId, replyToId, threadId }) => await sendMessageMattermost(to, text, {
4961
- cfg,
4962
- accountId: accountId ?? void 0,
4963
- replyToId: replyToId ?? (threadId != null ? String(threadId) : void 0)
4964
- }),
4965
- sendMedia: async ({ cfg, to, text, mediaUrl, mediaLocalRoots, accountId, replyToId, threadId }) => await sendMessageMattermost(to, text, {
4966
- cfg,
4967
- accountId: accountId ?? void 0,
4968
- mediaUrl,
4969
- mediaLocalRoots,
4970
- replyToId: replyToId ?? (threadId != null ? String(threadId) : void 0)
4971
- })
4972
- }
4973
- }
4974
- });
4975
- //#endregion
4976
- export { registerSlashCommandRoute as n, setMattermostRuntime as r, mattermostPlugin as t };