openclaw-multi-auto 1.6.2 → 1.6.5

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 (192) hide show
  1. package/dist/{audio-preflight-DoPfNXDz.js → audio-preflight-DpxQCpsA.js} +4 -4
  2. package/dist/{audio-transcription-runner-CzjuH3uL.js → audio-transcription-runner-28fcRNNi.js} +1 -1
  3. package/dist/build-info.json +3 -3
  4. package/dist/bundled/boot-md/handler.js +6 -6
  5. package/dist/bundled/session-memory/handler.js +6 -6
  6. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  7. package/dist/{chrome-DlhJHqj8.js → chrome-DwizpzOC.js} +8 -8
  8. package/dist/{deliver-CApVJA_l.js → deliver-D4o6VIur.js} +1 -1
  9. package/dist/{deliver-runtime-D1z-h5eg.js → deliver-runtime-P-G3bPjW.js} +3 -3
  10. package/dist/{deps-send-whatsapp.runtime-Dz_4fi2D.js → deps-send-whatsapp.runtime-CJkTHkah.js} +7 -7
  11. package/dist/{image-B3Mz7N5I.js → image-Bbn53mzj.js} +1 -1
  12. package/dist/{image-runtime-DWjhow2W.js → image-runtime-CVv2ra9J.js} +3 -3
  13. package/dist/llm-slug-generator.js +6 -6
  14. package/dist/{pi-embedded-bcjMe3wj.js → pi-embedded-BaGj07T0.js} +24 -24
  15. package/dist/{pi-embedded-helpers-D5yyGEvA.js → pi-embedded-helpers-wy0DZvx1.js} +3 -3
  16. package/dist/plugin-sdk/{accounts-DyFCXtHv.js → accounts-BslAlVYS.js} +2 -2
  17. package/dist/plugin-sdk/{accounts-BJAXxY46.js → accounts-C3m65--E.js} +2 -2
  18. package/dist/plugin-sdk/{accounts-C1j7HSL0.js → accounts-CNCCkdEF.js} +3 -3
  19. package/dist/plugin-sdk/{active-listener-B_sLJTXM.js → active-listener-CkPnMUkB.js} +2 -2
  20. package/dist/plugin-sdk/{api-key-rotation-8nyyt1kx.js → api-key-rotation-BXnNsojA.js} +2 -2
  21. package/dist/plugin-sdk/{audio-preflight-C_aSAPR1.js → audio-preflight-CtO4fFvp.js} +26 -26
  22. package/dist/plugin-sdk/{audio-transcription-runner-CB53F7_7.js → audio-transcription-runner-DnxvOS1-.js} +11 -11
  23. package/dist/plugin-sdk/{audit-membership-runtime-BXndI4LG.js → audit-membership-runtime-BpfoSk8M.js} +2 -2
  24. package/dist/plugin-sdk/{channel-activity-C5y8AgAV.js → channel-activity-WJYxcJ3S.js} +3 -3
  25. package/dist/plugin-sdk/{channel-web-DBTRO03V.js → channel-web-dO5k3ubM.js} +18 -18
  26. package/dist/plugin-sdk/{chrome-f00sZkDX.js → chrome-CjNTuJML.js} +6 -6
  27. package/dist/plugin-sdk/{commands-registry-BJ_NxG2F.js → commands-registry-CdYjoI0i.js} +4 -4
  28. package/dist/plugin-sdk/{common-Cf27Jwxu.js → common-oYc5vPFl.js} +2 -2
  29. package/dist/plugin-sdk/compat.js +50 -50
  30. package/dist/plugin-sdk/{config-CHQrpx-Q.js → config-B1z-UxQ3.js} +7 -7
  31. package/dist/plugin-sdk/{deliver-DNEuetST.js → deliver-D5_6T567.js} +10 -10
  32. package/dist/plugin-sdk/deliver-runtime-C5dgvvga.js +32 -0
  33. package/dist/plugin-sdk/deps-send-discord.runtime-Dg4N7PHJ.js +23 -0
  34. package/dist/plugin-sdk/deps-send-imessage.runtime-0OEwzMQm.js +22 -0
  35. package/dist/plugin-sdk/deps-send-signal.runtime-BM1jRt3G.js +21 -0
  36. package/dist/plugin-sdk/deps-send-slack.runtime-1E3BYRdF.js +19 -0
  37. package/dist/plugin-sdk/deps-send-telegram.runtime-DNCxIflA.js +24 -0
  38. package/dist/plugin-sdk/deps-send-whatsapp.runtime-OLwr-9c8.js +57 -0
  39. package/dist/plugin-sdk/{diagnostic-LYUUmjJ5.js → diagnostic-Bxxu0ig-.js} +2 -2
  40. package/dist/plugin-sdk/discord.js +6 -6
  41. package/dist/plugin-sdk/{errors-CtMWwS2Z.js → errors-B3cHyZZA.js} +1 -1
  42. package/dist/plugin-sdk/{fetch-guard-CxYB5Kg6.js → fetch-guard-Dcgod0tg.js} +2 -2
  43. package/dist/plugin-sdk/{fs-safe-DtfhxbrI.js → fs-safe-BaKqI3G4.js} +3 -3
  44. package/dist/plugin-sdk/{image-BwjYjRHx.js → image-B2mQW9Rb.js} +6 -6
  45. package/dist/plugin-sdk/{image-ops-BnZKcbd6.js → image-ops-Cbzr4U9l.js} +2 -2
  46. package/dist/plugin-sdk/image-runtime-BFm45j49.js +25 -0
  47. package/dist/plugin-sdk/{ir-Z4hX67TJ.js → ir-ZEmrTr4J.js} +7 -7
  48. package/dist/plugin-sdk/{local-roots-KhjQw04O.js → local-roots-CIPRxA-4.js} +4 -4
  49. package/dist/plugin-sdk/{logger-DHIIvMxj.js → logger-CvPFVOgT.js} +2 -2
  50. package/dist/plugin-sdk/{login-C31642Ld.js → login-CCTew9bt.js} +4 -4
  51. package/dist/plugin-sdk/{login-qr--y2SG_Ue.js → login-qr-BI3Vi_wJ.js} +5 -5
  52. package/dist/plugin-sdk/{manager-2UZBMCc7.js → manager-BEoYPn7R.js} +8 -8
  53. package/dist/plugin-sdk/manager-runtime-DxclHQ4U.js +15 -0
  54. package/dist/plugin-sdk/{outbound-Ba0QUI5h.js → outbound-ByOw1K6W.js} +5 -5
  55. package/dist/plugin-sdk/{outbound-attachment-B1Laso-8.js → outbound-attachment-BzVhxRRw.js} +2 -2
  56. package/dist/plugin-sdk/{path-alias-guards-C7Vm5DZ1.js → path-alias-guards-sWayacde.js} +1 -1
  57. package/dist/plugin-sdk/{paths-DopV9PQG.js → paths-Dpg3qxcl.js} +1 -1
  58. package/dist/plugin-sdk/{pi-embedded-helpers-DnA_OCzP.js → pi-embedded-helpers-DIxXkGJf.js} +16 -16
  59. package/dist/plugin-sdk/{pi-model-discovery-DdPqXk8f.js → pi-model-discovery-DM_2uFtj.js} +1 -1
  60. package/dist/plugin-sdk/pi-model-discovery-runtime-BuzvkvNR.js +8 -0
  61. package/dist/plugin-sdk/{pi-tools.before-tool-call.runtime-DxFHiLUE.js → pi-tools.before-tool-call.runtime-w1dqL_ty.js} +4 -4
  62. package/dist/plugin-sdk/{plugins-CbCt4osF.js → plugins-C4USiH29.js} +4 -4
  63. package/dist/plugin-sdk/{proxy-env-C63mMdas.js → proxy-env-ET-rp8eg.js} +1 -1
  64. package/dist/plugin-sdk/{proxy-fetch-Ch95c_Y2.js → proxy-fetch-uDXGKG3Z.js} +1 -1
  65. package/dist/plugin-sdk/{pw-ai-DpJk62D4.js → pw-ai-CyOt3RDA.js} +9 -9
  66. package/dist/plugin-sdk/{qmd-manager-Ca-iSfEE.js → qmd-manager-BySdoVR7.js} +7 -7
  67. package/dist/plugin-sdk/{query-expansion-B_Xe41Ab.js → query-expansion-C6uS-7lj.js} +4 -4
  68. package/dist/plugin-sdk/{redact-hp9TOulW.js → redact-Bvxt1T_Q.js} +1 -1
  69. package/dist/plugin-sdk/{reply-CovBlFea.js → reply-CTCSeQqW.js} +73 -73
  70. package/dist/plugin-sdk/{resolve-outbound-target-BbrHgyUk.js → resolve-outbound-target-Bw8YNANu.js} +2 -2
  71. package/dist/plugin-sdk/{run-with-concurrency-BR1DXa8T.js → run-with-concurrency-C_KCHwvf.js} +1 -1
  72. package/dist/plugin-sdk/runtime-whatsapp-login.runtime-BxgRDkhc.js +10 -0
  73. package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-elOqrkfg.js +19 -0
  74. package/dist/plugin-sdk/{send-BvAtLLPl.js → send-BZ6nYFZr.js} +5 -5
  75. package/dist/plugin-sdk/{send-BTztm3D2.js → send-C0w6xP2x.js} +6 -6
  76. package/dist/plugin-sdk/{send-CWJUuG0i.js → send-CFf-1V89.js} +8 -8
  77. package/dist/plugin-sdk/{send-EcglC4cG.js → send-CY-Qfwia.js} +7 -7
  78. package/dist/plugin-sdk/{send-BXpXBwM_.js → send-qPyNGSe4.js} +13 -13
  79. package/dist/plugin-sdk/{session-k256LJZT.js → session-COrvpvUQ.js} +3 -3
  80. package/dist/plugin-sdk/{skill-commands-DoRqLzxm.js → skill-commands-DZqhtmiv.js} +4 -4
  81. package/dist/plugin-sdk/{skills-QudILG6e.js → skills-Cw_vXEJb.js} +6 -6
  82. package/dist/plugin-sdk/slack.js +2 -2
  83. package/dist/plugin-sdk/slash-commands.runtime-D67JLweo.js +13 -0
  84. package/dist/plugin-sdk/slash-dispatch.runtime-DvcpvCJ0.js +52 -0
  85. package/dist/plugin-sdk/slash-skill-commands.runtime-BM1x3azR.js +16 -0
  86. package/dist/plugin-sdk/{store-BbDQw3g6.js → store-CMHj6IIw.js} +2 -2
  87. package/dist/plugin-sdk/subagent-registry-runtime-1lbDyRzz.js +52 -0
  88. package/dist/plugin-sdk/{tables-BhvloMKN.js → tables-CSqrHsKL.js} +1 -1
  89. package/dist/plugin-sdk/{thinking-URzkT-3p.js → thinking-DOnsR_A8.js} +7 -7
  90. package/dist/plugin-sdk/{tokens-DgNRBwIg.js → tokens-BDr0Z9o3.js} +1 -1
  91. package/dist/plugin-sdk/{tool-images-Gk_-0y2N.js → tool-images-eEfOVkzf.js} +2 -2
  92. package/dist/plugin-sdk/web-BLyT64pW.js +56 -0
  93. package/dist/plugin-sdk/{whatsapp-actions-RcZ6vp61.js → whatsapp-actions-xcleMoMv.js} +17 -17
  94. package/dist/plugin-sdk/whatsapp.js +50 -50
  95. package/dist/{pw-ai-CDQDCfUa.js → pw-ai-Cl1Lc7RC.js} +1 -1
  96. package/dist/{slash-dispatch.runtime-CWbpp23S.js → slash-dispatch.runtime-DoBAQBU5.js} +6 -6
  97. package/dist/{subagent-registry-runtime-DEVpAaAP.js → subagent-registry-runtime-ppWS3tVu.js} +6 -6
  98. package/dist/{web-NWKn8ABz.js → web-CzWRVmFt.js} +6 -6
  99. package/package.json +1 -1
  100. package/scripts/create-instance.sh +11 -13
  101. package/dist/plugin-sdk/accounts-CJWOBzwB.js +0 -35
  102. package/dist/plugin-sdk/accounts-DP1-L-QS.js +0 -288
  103. package/dist/plugin-sdk/accounts-DZhWlEg3.js +0 -46
  104. package/dist/plugin-sdk/active-listener-CftX5jLD.js +0 -50
  105. package/dist/plugin-sdk/api-key-rotation-BRE4X2tf.js +0 -181
  106. package/dist/plugin-sdk/audio-preflight-DGEUDxxR.js +0 -69
  107. package/dist/plugin-sdk/audio-transcription-runner-DkoPNPYt.js +0 -2176
  108. package/dist/plugin-sdk/audit-membership-runtime-DSBHHw7o.js +0 -58
  109. package/dist/plugin-sdk/channel-activity-F3d0yUwy.js +0 -94
  110. package/dist/plugin-sdk/channel-web-QF7EpjeP.js +0 -2256
  111. package/dist/plugin-sdk/chrome-BXoCyCkY.js +0 -2415
  112. package/dist/plugin-sdk/commands-registry-t7cXBTfN.js +0 -1125
  113. package/dist/plugin-sdk/config-BkEnz2Po.js +0 -17913
  114. package/dist/plugin-sdk/deliver-B6AG_l67.js +0 -1694
  115. package/dist/plugin-sdk/deliver-runtime-BFdqklJM.js +0 -32
  116. package/dist/plugin-sdk/deliver-runtime-D585kJZc.js +0 -32
  117. package/dist/plugin-sdk/deps-send-discord.runtime-DuqpYwU0.js +0 -23
  118. package/dist/plugin-sdk/deps-send-discord.runtime-a_OKY2js.js +0 -23
  119. package/dist/plugin-sdk/deps-send-imessage.runtime-Baxy9TD4.js +0 -22
  120. package/dist/plugin-sdk/deps-send-imessage.runtime-CZ2rS8Lb.js +0 -22
  121. package/dist/plugin-sdk/deps-send-signal.runtime-BdqiWhIh.js +0 -21
  122. package/dist/plugin-sdk/deps-send-signal.runtime-BwXoCrFl.js +0 -21
  123. package/dist/plugin-sdk/deps-send-slack.runtime-04s36qiC.js +0 -19
  124. package/dist/plugin-sdk/deps-send-slack.runtime-CLmKjgso.js +0 -19
  125. package/dist/plugin-sdk/deps-send-telegram.runtime-BKfdBKnZ.js +0 -24
  126. package/dist/plugin-sdk/deps-send-telegram.runtime-LE5tkPvr.js +0 -24
  127. package/dist/plugin-sdk/deps-send-whatsapp.runtime-BOTwkbx_.js +0 -57
  128. package/dist/plugin-sdk/deps-send-whatsapp.runtime-Bz57lobC.js +0 -57
  129. package/dist/plugin-sdk/diagnostic-CsP-lEkI.js +0 -319
  130. package/dist/plugin-sdk/errors-DaiAM-yU.js +0 -54
  131. package/dist/plugin-sdk/fetch-guard-DETCcJzQ.js +0 -156
  132. package/dist/plugin-sdk/fs-safe-B8y811FR.js +0 -352
  133. package/dist/plugin-sdk/image-DjTEkYZE.js +0 -2310
  134. package/dist/plugin-sdk/image-ops-BSiMpAw4.js +0 -584
  135. package/dist/plugin-sdk/image-runtime-6xPp8m5a.js +0 -25
  136. package/dist/plugin-sdk/image-runtime-B8twoubs.js +0 -25
  137. package/dist/plugin-sdk/ir-DQ7_HbvK.js +0 -1296
  138. package/dist/plugin-sdk/local-roots-BUP4YBmR.js +0 -186
  139. package/dist/plugin-sdk/logger-CZY9KIoY.js +0 -1163
  140. package/dist/plugin-sdk/login-BxEKLlCo.js +0 -57
  141. package/dist/plugin-sdk/login-qr-BQIpMPr9.js +0 -320
  142. package/dist/plugin-sdk/manager-I6KbPihW.js +0 -3917
  143. package/dist/plugin-sdk/manager-runtime-CFfYYWIQ.js +0 -15
  144. package/dist/plugin-sdk/manager-runtime-CMeLwose.js +0 -15
  145. package/dist/plugin-sdk/outbound-NS6UHnB6.js +0 -212
  146. package/dist/plugin-sdk/outbound-attachment-Dy6fyf6H.js +0 -19
  147. package/dist/plugin-sdk/path-alias-guards-DBjLbIX_.js +0 -43
  148. package/dist/plugin-sdk/paths-vTM3Lh3X.js +0 -166
  149. package/dist/plugin-sdk/pi-embedded-helpers-1R1gu7eX.js +0 -9627
  150. package/dist/plugin-sdk/pi-model-discovery-runtime-D8CJhtJY.js +0 -8
  151. package/dist/plugin-sdk/pi-model-discovery-runtime-Do9o-dUd.js +0 -8
  152. package/dist/plugin-sdk/pi-model-discovery-v-XPUOOf.js +0 -134
  153. package/dist/plugin-sdk/pi-tools.before-tool-call.runtime-D4sFsIks.js +0 -354
  154. package/dist/plugin-sdk/plugins-DeBZB9l_.js +0 -864
  155. package/dist/plugin-sdk/proxy-fetch-ChxOhWF4.js +0 -38
  156. package/dist/plugin-sdk/pw-ai-DEOmCSSC.js +0 -1938
  157. package/dist/plugin-sdk/qmd-manager-HyYKoEch.js +0 -1448
  158. package/dist/plugin-sdk/query-expansion-CeyKUeDW.js +0 -1011
  159. package/dist/plugin-sdk/redact-DjVX-1N3.js +0 -319
  160. package/dist/plugin-sdk/reply-DAo_Jt8K.js +0 -97916
  161. package/dist/plugin-sdk/resolve-outbound-target-B42qgQS9.js +0 -40
  162. package/dist/plugin-sdk/run-with-concurrency-Bt_ks0Qa.js +0 -1994
  163. package/dist/plugin-sdk/runtime-whatsapp-login.runtime-B6W989eF.js +0 -10
  164. package/dist/plugin-sdk/runtime-whatsapp-login.runtime-SkO91TZH.js +0 -10
  165. package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-B0VWK5hm.js +0 -19
  166. package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-c_GDFy37.js +0 -19
  167. package/dist/plugin-sdk/send-CQpMudwO.js +0 -2587
  168. package/dist/plugin-sdk/send-DQHLzVyO.js +0 -414
  169. package/dist/plugin-sdk/send-DTB24bEF.js +0 -3135
  170. package/dist/plugin-sdk/send-DfHadjZ_.js +0 -503
  171. package/dist/plugin-sdk/send-XXlW2iny.js +0 -540
  172. package/dist/plugin-sdk/session-6TF6MyaC.js +0 -169
  173. package/dist/plugin-sdk/skill-commands-CkGeFUMl.js +0 -342
  174. package/dist/plugin-sdk/skills-CBkHBYPq.js +0 -1428
  175. package/dist/plugin-sdk/slash-commands.runtime-CxliuGaP.js +0 -13
  176. package/dist/plugin-sdk/slash-commands.runtime-DS6vCNSL.js +0 -13
  177. package/dist/plugin-sdk/slash-dispatch.runtime-BXrxb2wd.js +0 -52
  178. package/dist/plugin-sdk/slash-dispatch.runtime-DFaeYlJQ.js +0 -52
  179. package/dist/plugin-sdk/slash-skill-commands.runtime-0M0OLCxq.js +0 -16
  180. package/dist/plugin-sdk/slash-skill-commands.runtime-Bd6qQ2oT.js +0 -16
  181. package/dist/plugin-sdk/ssrf-cFtplYtS.js +0 -202
  182. package/dist/plugin-sdk/store-5nyxY3WU.js +0 -81
  183. package/dist/plugin-sdk/subagent-registry-runtime-1uwQbuXj.js +0 -52
  184. package/dist/plugin-sdk/subagent-registry-runtime-DCtmDwna.js +0 -52
  185. package/dist/plugin-sdk/tables-C47P4GTN.js +0 -55
  186. package/dist/plugin-sdk/target-errors-Blia4S69.js +0 -195
  187. package/dist/plugin-sdk/thinking-Bo2eosVa.js +0 -1206
  188. package/dist/plugin-sdk/tokens-B1PW5Ayy.js +0 -52
  189. package/dist/plugin-sdk/tool-images-xpqbP6RR.js +0 -274
  190. package/dist/plugin-sdk/web-B74yhL2N.js +0 -56
  191. package/dist/plugin-sdk/web-CVxZbXyH.js +0 -56
  192. package/dist/plugin-sdk/whatsapp-actions-Bw0H9g-n.js +0 -80
@@ -1,414 +0,0 @@
1
- import { n as loadConfig } from "./config-BkEnz2Po.js";
2
- import { L as logVerbose } from "./logger-CZY9KIoY.js";
3
- import { F as resolveSlackBotToken, M as resolveSlackAccount, m as parseSlackTarget } from "./plugins-DeBZB9l_.js";
4
- import { r as withTrustedEnvProxyGuardedFetchMode, t as fetchWithSsrFGuard } from "./fetch-guard-DETCcJzQ.js";
5
- import { c as chunkMarkdownTextWithMode, d as resolveChunkMode, f as resolveTextChunkLimit, i as resolveMarkdownTableMode, n as markdownToIR, t as chunkMarkdownIR, v as loadWebMedia } from "./ir-DQ7_HbvK.js";
6
- import { t as renderMarkdownWithMarkers } from "./render-HmipMDlP.js";
7
- import { i as isSilentReplyText } from "./tokens-DgNRBwIg.js";
8
- import { WebClient } from "@slack/web-api";
9
-
10
- //#region src/slack/blocks-input.ts
11
- const SLACK_MAX_BLOCKS = 50;
12
- function parseBlocksJson(raw) {
13
- try {
14
- return JSON.parse(raw);
15
- } catch {
16
- throw new Error("blocks must be valid JSON");
17
- }
18
- }
19
- function assertBlocksArray(raw) {
20
- if (!Array.isArray(raw)) throw new Error("blocks must be an array");
21
- if (raw.length === 0) throw new Error("blocks must contain at least one block");
22
- if (raw.length > SLACK_MAX_BLOCKS) throw new Error(`blocks cannot exceed ${SLACK_MAX_BLOCKS} items`);
23
- for (const block of raw) {
24
- if (!block || typeof block !== "object" || Array.isArray(block)) throw new Error("each block must be an object");
25
- const type = block.type;
26
- if (typeof type !== "string" || type.trim().length === 0) throw new Error("each block must include a non-empty string type");
27
- }
28
- }
29
- function validateSlackBlocksArray(raw) {
30
- assertBlocksArray(raw);
31
- return raw;
32
- }
33
- function parseSlackBlocksInput(raw) {
34
- if (raw == null) return;
35
- return validateSlackBlocksArray(typeof raw === "string" ? parseBlocksJson(raw) : raw);
36
- }
37
-
38
- //#endregion
39
- //#region src/slack/client.ts
40
- const SLACK_DEFAULT_RETRY_OPTIONS = {
41
- retries: 2,
42
- factor: 2,
43
- minTimeout: 500,
44
- maxTimeout: 3e3,
45
- randomize: true
46
- };
47
- function resolveSlackWebClientOptions(options = {}) {
48
- return {
49
- ...options,
50
- retryConfig: options.retryConfig ?? SLACK_DEFAULT_RETRY_OPTIONS
51
- };
52
- }
53
- function createSlackWebClient(token, options = {}) {
54
- return new WebClient(token, resolveSlackWebClientOptions(options));
55
- }
56
-
57
- //#endregion
58
- //#region src/slack/blocks-fallback.ts
59
- function cleanCandidate(value) {
60
- if (typeof value !== "string") return;
61
- const normalized = value.replace(/\s+/g, " ").trim();
62
- return normalized.length > 0 ? normalized : void 0;
63
- }
64
- function readSectionText(block) {
65
- return cleanCandidate(block.text?.text);
66
- }
67
- function readHeaderText(block) {
68
- return cleanCandidate(block.text?.text);
69
- }
70
- function readImageText(block) {
71
- return cleanCandidate(block.alt_text) ?? cleanCandidate(block.title?.text);
72
- }
73
- function readVideoText(block) {
74
- return cleanCandidate(block.title?.text) ?? cleanCandidate(block.alt_text);
75
- }
76
- function readContextText(block) {
77
- if (!Array.isArray(block.elements)) return;
78
- const textParts = block.elements.map((element) => cleanCandidate(element.text)).filter((value) => Boolean(value));
79
- return textParts.length > 0 ? textParts.join(" ") : void 0;
80
- }
81
- function buildSlackBlocksFallbackText(blocks) {
82
- for (const raw of blocks) {
83
- const block = raw;
84
- switch (block.type) {
85
- case "header": {
86
- const text = readHeaderText(block);
87
- if (text) return text;
88
- break;
89
- }
90
- case "section": {
91
- const text = readSectionText(block);
92
- if (text) return text;
93
- break;
94
- }
95
- case "image": {
96
- const text = readImageText(block);
97
- if (text) return text;
98
- return "Shared an image";
99
- }
100
- case "video": {
101
- const text = readVideoText(block);
102
- if (text) return text;
103
- return "Shared a video";
104
- }
105
- case "file": return "Shared a file";
106
- case "context": {
107
- const text = readContextText(block);
108
- if (text) return text;
109
- break;
110
- }
111
- default: break;
112
- }
113
- }
114
- return "Shared a Block Kit message";
115
- }
116
-
117
- //#endregion
118
- //#region src/slack/format.ts
119
- function escapeSlackMrkdwnSegment(text) {
120
- return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
121
- }
122
- const SLACK_ANGLE_TOKEN_RE = /<[^>\n]+>/g;
123
- function isAllowedSlackAngleToken(token) {
124
- if (!token.startsWith("<") || !token.endsWith(">")) return false;
125
- const inner = token.slice(1, -1);
126
- return inner.startsWith("@") || inner.startsWith("#") || inner.startsWith("!") || inner.startsWith("mailto:") || inner.startsWith("tel:") || inner.startsWith("http://") || inner.startsWith("https://") || inner.startsWith("slack://");
127
- }
128
- function escapeSlackMrkdwnContent(text) {
129
- if (!text) return "";
130
- if (!text.includes("&") && !text.includes("<") && !text.includes(">")) return text;
131
- SLACK_ANGLE_TOKEN_RE.lastIndex = 0;
132
- const out = [];
133
- let lastIndex = 0;
134
- for (let match = SLACK_ANGLE_TOKEN_RE.exec(text); match; match = SLACK_ANGLE_TOKEN_RE.exec(text)) {
135
- const matchIndex = match.index ?? 0;
136
- out.push(escapeSlackMrkdwnSegment(text.slice(lastIndex, matchIndex)));
137
- const token = match[0] ?? "";
138
- out.push(isAllowedSlackAngleToken(token) ? token : escapeSlackMrkdwnSegment(token));
139
- lastIndex = matchIndex + token.length;
140
- }
141
- out.push(escapeSlackMrkdwnSegment(text.slice(lastIndex)));
142
- return out.join("");
143
- }
144
- function escapeSlackMrkdwnText(text) {
145
- if (!text) return "";
146
- if (!text.includes("&") && !text.includes("<") && !text.includes(">")) return text;
147
- return text.split("\n").map((line) => {
148
- if (line.startsWith("> ")) return `> ${escapeSlackMrkdwnContent(line.slice(2))}`;
149
- return escapeSlackMrkdwnContent(line);
150
- }).join("\n");
151
- }
152
- function buildSlackLink(link, text) {
153
- const href = link.href.trim();
154
- if (!href) return null;
155
- const trimmedLabel = text.slice(link.start, link.end).trim();
156
- const comparableHref = href.startsWith("mailto:") ? href.slice(7) : href;
157
- if (!(trimmedLabel.length > 0 && trimmedLabel !== href && trimmedLabel !== comparableHref)) return null;
158
- const safeHref = escapeSlackMrkdwnSegment(href);
159
- return {
160
- start: link.start,
161
- end: link.end,
162
- open: `<${safeHref}|`,
163
- close: ">"
164
- };
165
- }
166
- function buildSlackRenderOptions() {
167
- return {
168
- styleMarkers: {
169
- bold: {
170
- open: "*",
171
- close: "*"
172
- },
173
- italic: {
174
- open: "_",
175
- close: "_"
176
- },
177
- strikethrough: {
178
- open: "~",
179
- close: "~"
180
- },
181
- code: {
182
- open: "`",
183
- close: "`"
184
- },
185
- code_block: {
186
- open: "```\n",
187
- close: "```"
188
- }
189
- },
190
- escapeText: escapeSlackMrkdwnText,
191
- buildLink: buildSlackLink
192
- };
193
- }
194
- function markdownToSlackMrkdwn(markdown, options = {}) {
195
- return renderMarkdownWithMarkers(markdownToIR(markdown ?? "", {
196
- linkify: false,
197
- autolink: false,
198
- headingStyle: "bold",
199
- blockquotePrefix: "> ",
200
- tableMode: options.tableMode
201
- }), buildSlackRenderOptions());
202
- }
203
- function normalizeSlackOutboundText(markdown) {
204
- return markdownToSlackMrkdwn(markdown ?? "");
205
- }
206
- function markdownToSlackMrkdwnChunks(markdown, limit, options = {}) {
207
- const chunks = chunkMarkdownIR(markdownToIR(markdown ?? "", {
208
- linkify: false,
209
- autolink: false,
210
- headingStyle: "bold",
211
- blockquotePrefix: "> ",
212
- tableMode: options.tableMode
213
- }), limit);
214
- const renderOptions = buildSlackRenderOptions();
215
- return chunks.map((chunk) => renderMarkdownWithMarkers(chunk, renderOptions));
216
- }
217
-
218
- //#endregion
219
- //#region src/slack/send.ts
220
- const SLACK_TEXT_LIMIT = 4e3;
221
- const SLACK_UPLOAD_SSRF_POLICY = {
222
- allowedHostnames: [
223
- "*.slack.com",
224
- "*.slack-edge.com",
225
- "*.slack-files.com"
226
- ],
227
- allowRfc2544BenchmarkRange: true
228
- };
229
- function hasCustomIdentity(identity) {
230
- return Boolean(identity?.username || identity?.iconUrl || identity?.iconEmoji);
231
- }
232
- function isSlackCustomizeScopeError(err) {
233
- if (!(err instanceof Error)) return false;
234
- const maybeData = err;
235
- if (maybeData.data?.error?.toLowerCase() !== "missing_scope") return false;
236
- if ((maybeData.data?.needed?.toLowerCase())?.includes("chat:write.customize")) return true;
237
- return [...maybeData.data?.response_metadata?.scopes ?? [], ...maybeData.data?.response_metadata?.acceptedScopes ?? []].map((scope) => scope.toLowerCase()).includes("chat:write.customize");
238
- }
239
- async function postSlackMessageBestEffort(params) {
240
- const basePayload = {
241
- channel: params.channelId,
242
- text: params.text,
243
- thread_ts: params.threadTs,
244
- ...params.blocks?.length ? { blocks: params.blocks } : {}
245
- };
246
- try {
247
- if (params.identity?.iconUrl) return await params.client.chat.postMessage({
248
- ...basePayload,
249
- ...params.identity.username ? { username: params.identity.username } : {},
250
- icon_url: params.identity.iconUrl
251
- });
252
- if (params.identity?.iconEmoji) return await params.client.chat.postMessage({
253
- ...basePayload,
254
- ...params.identity.username ? { username: params.identity.username } : {},
255
- icon_emoji: params.identity.iconEmoji
256
- });
257
- return await params.client.chat.postMessage({
258
- ...basePayload,
259
- ...params.identity?.username ? { username: params.identity.username } : {}
260
- });
261
- } catch (err) {
262
- if (!hasCustomIdentity(params.identity) || !isSlackCustomizeScopeError(err)) throw err;
263
- logVerbose("slack send: missing chat:write.customize, retrying without custom identity");
264
- return params.client.chat.postMessage(basePayload);
265
- }
266
- }
267
- function resolveToken(params) {
268
- const explicit = resolveSlackBotToken(params.explicit);
269
- if (explicit) return explicit;
270
- const fallback = resolveSlackBotToken(params.fallbackToken);
271
- if (!fallback) {
272
- logVerbose(`slack send: missing bot token for account=${params.accountId} explicit=${Boolean(params.explicit)} source=${params.fallbackSource ?? "unknown"}`);
273
- throw new Error(`Slack bot token missing for account "${params.accountId}" (set channels.slack.accounts.${params.accountId}.botToken or SLACK_BOT_TOKEN for default).`);
274
- }
275
- return fallback;
276
- }
277
- function parseRecipient(raw) {
278
- const target = parseSlackTarget(raw);
279
- if (!target) throw new Error("Recipient is required for Slack sends");
280
- return {
281
- kind: target.kind,
282
- id: target.id
283
- };
284
- }
285
- async function resolveChannelId(client, recipient) {
286
- if (!(recipient.kind === "user" || /^U[A-Z0-9]+$/i.test(recipient.id))) return { channelId: recipient.id };
287
- const channelId = (await client.conversations.open({ users: recipient.id })).channel?.id;
288
- if (!channelId) throw new Error("Failed to open Slack DM channel");
289
- return {
290
- channelId,
291
- isDm: true
292
- };
293
- }
294
- async function uploadSlackFile(params) {
295
- const { buffer, contentType, fileName } = await loadWebMedia(params.mediaUrl, {
296
- maxBytes: params.maxBytes,
297
- localRoots: params.mediaLocalRoots
298
- });
299
- const uploadUrlResp = await params.client.files.getUploadURLExternal({
300
- filename: fileName ?? "upload",
301
- length: buffer.length
302
- });
303
- if (!uploadUrlResp.ok || !uploadUrlResp.upload_url || !uploadUrlResp.file_id) throw new Error(`Failed to get upload URL: ${uploadUrlResp.error ?? "unknown error"}`);
304
- const uploadBody = new Uint8Array(buffer);
305
- const { response: uploadResp, release } = await fetchWithSsrFGuard(withTrustedEnvProxyGuardedFetchMode({
306
- url: uploadUrlResp.upload_url,
307
- init: {
308
- method: "POST",
309
- ...contentType ? { headers: { "Content-Type": contentType } } : {},
310
- body: uploadBody
311
- },
312
- policy: SLACK_UPLOAD_SSRF_POLICY,
313
- auditContext: "slack-upload-file"
314
- }));
315
- try {
316
- if (!uploadResp.ok) throw new Error(`Failed to upload file: HTTP ${uploadResp.status}`);
317
- } finally {
318
- await release();
319
- }
320
- const completeResp = await params.client.files.completeUploadExternal({
321
- files: [{
322
- id: uploadUrlResp.file_id,
323
- title: fileName ?? "upload"
324
- }],
325
- channel_id: params.channelId,
326
- ...params.caption ? { initial_comment: params.caption } : {},
327
- ...params.threadTs ? { thread_ts: params.threadTs } : {}
328
- });
329
- if (!completeResp.ok) throw new Error(`Failed to complete upload: ${completeResp.error ?? "unknown error"}`);
330
- return uploadUrlResp.file_id;
331
- }
332
- async function sendMessageSlack(to, message, opts = {}) {
333
- const trimmedMessage = message?.trim() ?? "";
334
- if (isSilentReplyText(trimmedMessage) && !opts.mediaUrl && !opts.blocks) {
335
- logVerbose("slack send: suppressed NO_REPLY token before API call");
336
- return {
337
- messageId: "suppressed",
338
- channelId: ""
339
- };
340
- }
341
- const blocks = opts.blocks == null ? void 0 : validateSlackBlocksArray(opts.blocks);
342
- if (!trimmedMessage && !opts.mediaUrl && !blocks) throw new Error("Slack send requires text, blocks, or media");
343
- const cfg = opts.cfg ?? loadConfig();
344
- const account = resolveSlackAccount({
345
- cfg,
346
- accountId: opts.accountId
347
- });
348
- const token = resolveToken({
349
- explicit: opts.token,
350
- accountId: account.accountId,
351
- fallbackToken: account.botToken,
352
- fallbackSource: account.botTokenSource
353
- });
354
- const client = opts.client ?? createSlackWebClient(token);
355
- const { channelId } = await resolveChannelId(client, parseRecipient(to));
356
- if (blocks) {
357
- if (opts.mediaUrl) throw new Error("Slack send does not support blocks with mediaUrl");
358
- return {
359
- messageId: (await postSlackMessageBestEffort({
360
- client,
361
- channelId,
362
- text: trimmedMessage || buildSlackBlocksFallbackText(blocks),
363
- threadTs: opts.threadTs,
364
- identity: opts.identity,
365
- blocks
366
- })).ts ?? "unknown",
367
- channelId
368
- };
369
- }
370
- const textLimit = resolveTextChunkLimit(cfg, "slack", account.accountId);
371
- const chunkLimit = Math.min(textLimit, SLACK_TEXT_LIMIT);
372
- const tableMode = resolveMarkdownTableMode({
373
- cfg,
374
- channel: "slack",
375
- accountId: account.accountId
376
- });
377
- const chunkMode = resolveChunkMode(cfg, "slack", account.accountId);
378
- const chunks = (chunkMode === "newline" ? chunkMarkdownTextWithMode(trimmedMessage, chunkLimit, chunkMode) : [trimmedMessage]).flatMap((markdown) => markdownToSlackMrkdwnChunks(markdown, chunkLimit, { tableMode }));
379
- if (!chunks.length && trimmedMessage) chunks.push(trimmedMessage);
380
- const mediaMaxBytes = typeof account.config.mediaMaxMb === "number" ? account.config.mediaMaxMb * 1024 * 1024 : void 0;
381
- let lastMessageId = "";
382
- if (opts.mediaUrl) {
383
- const [firstChunk, ...rest] = chunks;
384
- lastMessageId = await uploadSlackFile({
385
- client,
386
- channelId,
387
- mediaUrl: opts.mediaUrl,
388
- mediaLocalRoots: opts.mediaLocalRoots,
389
- caption: firstChunk,
390
- threadTs: opts.threadTs,
391
- maxBytes: mediaMaxBytes
392
- });
393
- for (const chunk of rest) lastMessageId = (await postSlackMessageBestEffort({
394
- client,
395
- channelId,
396
- text: chunk,
397
- threadTs: opts.threadTs,
398
- identity: opts.identity
399
- })).ts ?? lastMessageId;
400
- } else for (const chunk of chunks.length ? chunks : [""]) lastMessageId = (await postSlackMessageBestEffort({
401
- client,
402
- channelId,
403
- text: chunk,
404
- threadTs: opts.threadTs,
405
- identity: opts.identity
406
- })).ts ?? lastMessageId;
407
- return {
408
- messageId: lastMessageId || "unknown",
409
- channelId
410
- };
411
- }
412
-
413
- //#endregion
414
- export { createSlackWebClient as a, validateSlackBlocksArray as c, buildSlackBlocksFallbackText as i, markdownToSlackMrkdwnChunks as n, resolveSlackWebClientOptions as o, normalizeSlackOutboundText as r, parseSlackBlocksInput as s, sendMessageSlack as t };