@openclaw/feishu 2026.6.8-beta.2 → 2026.6.9-beta.1

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 (281) hide show
  1. package/dist/api.js +78 -23
  2. package/dist/{channel-DwygSth-.js → channel-C9mW5kaS.js} +2 -2
  3. package/dist/channel-plugin-api.js +1 -1
  4. package/dist/{channel.runtime-CrqKcXaU.js → channel.runtime-BgUhHAja.js} +3 -3
  5. package/dist/{drive-8o3Omlnd.js → drive-9UfpmY27.js} +15 -2
  6. package/dist/{monitor-_1eNsUVp.js → monitor-BayUOr_U.js} +1 -1
  7. package/dist/{monitor.account-BhoLA1Y0.js → monitor.account-DzZWj0ob.js} +92 -48
  8. package/dist/{send-B3kteMF8.js → send-BozRcrbz.js} +32 -24
  9. package/dist/setup-api.js +1 -1
  10. package/node_modules/@protobufjs/aspromise/LICENSE +26 -0
  11. package/node_modules/@protobufjs/aspromise/README.md +13 -0
  12. package/node_modules/{protobufjs/src/util/aspromise.d.ts → @protobufjs/aspromise/index.d.ts} +13 -13
  13. package/node_modules/{protobufjs/src/util/aspromise.js → @protobufjs/aspromise/index.js} +52 -52
  14. package/node_modules/@protobufjs/aspromise/package.json +21 -0
  15. package/node_modules/@protobufjs/aspromise/tests/index.js +130 -0
  16. package/node_modules/@protobufjs/base64/LICENSE +26 -0
  17. package/node_modules/@protobufjs/base64/README.md +19 -0
  18. package/node_modules/{protobufjs/src/util/base64.d.ts → @protobufjs/base64/index.d.ts} +32 -32
  19. package/node_modules/{protobufjs/src/util/base64.js → @protobufjs/base64/index.js} +139 -146
  20. package/node_modules/@protobufjs/base64/package.json +21 -0
  21. package/node_modules/@protobufjs/base64/tests/index.js +46 -0
  22. package/node_modules/@protobufjs/codegen/LICENSE +26 -0
  23. package/node_modules/@protobufjs/codegen/README.md +49 -0
  24. package/node_modules/{protobufjs/src/util/codegen.d.ts → @protobufjs/codegen/index.d.ts} +31 -31
  25. package/node_modules/{protobufjs/src/util/codegen.js → @protobufjs/codegen/index.js} +112 -113
  26. package/node_modules/@protobufjs/codegen/package.json +13 -0
  27. package/node_modules/@protobufjs/codegen/tests/index.js +13 -0
  28. package/node_modules/@protobufjs/eventemitter/CHANGELOG.md +8 -0
  29. package/node_modules/@protobufjs/eventemitter/LICENSE +26 -0
  30. package/node_modules/@protobufjs/eventemitter/README.md +22 -0
  31. package/node_modules/{protobufjs/src/util/eventemitter.d.ts → @protobufjs/eventemitter/index.d.ts} +45 -45
  32. package/node_modules/{protobufjs/src/util/eventemitter.js → @protobufjs/eventemitter/index.js} +86 -86
  33. package/node_modules/@protobufjs/eventemitter/package.json +21 -0
  34. package/node_modules/@protobufjs/eventemitter/tests/index.js +83 -0
  35. package/node_modules/@protobufjs/fetch/CHANGELOG.md +8 -0
  36. package/node_modules/@protobufjs/fetch/LICENSE +26 -0
  37. package/node_modules/@protobufjs/fetch/README.md +13 -0
  38. package/node_modules/{protobufjs/src/util/fetch.d.ts → @protobufjs/fetch/index.d.ts} +56 -56
  39. package/node_modules/{protobufjs/src/util/fetch.js → @protobufjs/fetch/index.js} +112 -112
  40. package/node_modules/@protobufjs/fetch/package.json +27 -0
  41. package/node_modules/@protobufjs/fetch/tests/data/file.txt +1 -0
  42. package/node_modules/@protobufjs/fetch/tests/index.js +158 -0
  43. package/node_modules/@protobufjs/fetch/util/fs.js +11 -0
  44. package/node_modules/@protobufjs/float/LICENSE +26 -0
  45. package/node_modules/@protobufjs/float/README.md +102 -0
  46. package/node_modules/@protobufjs/float/bench/index.js +87 -0
  47. package/node_modules/@protobufjs/float/bench/suite.js +46 -0
  48. package/node_modules/{protobufjs/src/util/float.js → @protobufjs/float/index.js} +335 -335
  49. package/node_modules/@protobufjs/float/package.json +26 -0
  50. package/node_modules/@protobufjs/float/tests/index.js +100 -0
  51. package/node_modules/@protobufjs/inquire/CHANGELOG.md +8 -0
  52. package/node_modules/@protobufjs/inquire/LICENSE +26 -0
  53. package/node_modules/@protobufjs/inquire/README.md +13 -0
  54. package/node_modules/{protobufjs/src/util/inquire.d.ts → @protobufjs/inquire/index.d.ts} +10 -10
  55. package/node_modules/{protobufjs/src/util/inquire.js → @protobufjs/inquire/index.js} +38 -38
  56. package/node_modules/@protobufjs/inquire/package.json +21 -0
  57. package/node_modules/@protobufjs/inquire/tests/data/array.js +1 -0
  58. package/node_modules/@protobufjs/inquire/tests/data/emptyArray.js +1 -0
  59. package/node_modules/@protobufjs/inquire/tests/data/emptyObject.js +1 -0
  60. package/node_modules/@protobufjs/inquire/tests/data/object.js +1 -0
  61. package/node_modules/@protobufjs/inquire/tests/index.js +20 -0
  62. package/node_modules/@protobufjs/path/LICENSE +26 -0
  63. package/node_modules/@protobufjs/path/README.md +19 -0
  64. package/node_modules/{protobufjs/src/util/path.d.ts → @protobufjs/path/index.d.ts} +22 -22
  65. package/node_modules/{protobufjs/src/util/path.js → @protobufjs/path/index.js} +65 -72
  66. package/node_modules/@protobufjs/path/package.json +21 -0
  67. package/node_modules/@protobufjs/path/tests/index.js +60 -0
  68. package/node_modules/@protobufjs/pool/.npmignore +3 -0
  69. package/node_modules/@protobufjs/pool/LICENSE +26 -0
  70. package/node_modules/@protobufjs/pool/README.md +13 -0
  71. package/node_modules/{protobufjs/src/util/pool.d.ts → @protobufjs/pool/index.d.ts} +32 -32
  72. package/node_modules/{protobufjs/src/util/pool.js → @protobufjs/pool/index.js} +48 -48
  73. package/node_modules/@protobufjs/pool/package.json +21 -0
  74. package/node_modules/@protobufjs/pool/tests/index.js +33 -0
  75. package/node_modules/@protobufjs/utf8/LICENSE +26 -0
  76. package/node_modules/@protobufjs/utf8/README.md +20 -0
  77. package/node_modules/{protobufjs/src/util/utf8.d.ts → @protobufjs/utf8/index.d.ts} +24 -24
  78. package/node_modules/{protobufjs/src/util/utf8.js → @protobufjs/utf8/index.js} +104 -130
  79. package/node_modules/@protobufjs/utf8/package.json +21 -0
  80. package/node_modules/@protobufjs/utf8/tests/data/surrogate_pair_bug.txt +207 -0
  81. package/node_modules/@protobufjs/utf8/tests/data/utf8.txt +216 -0
  82. package/node_modules/@protobufjs/utf8/tests/index.js +74 -0
  83. package/node_modules/@types/node/LICENSE +21 -0
  84. package/node_modules/@types/node/README.md +15 -0
  85. package/node_modules/@types/node/assert/strict.d.ts +59 -0
  86. package/node_modules/@types/node/assert.d.ts +950 -0
  87. package/node_modules/@types/node/async_hooks.d.ts +711 -0
  88. package/node_modules/@types/node/buffer.buffer.d.ts +466 -0
  89. package/node_modules/@types/node/buffer.d.ts +1765 -0
  90. package/node_modules/@types/node/child_process.d.ts +1366 -0
  91. package/node_modules/@types/node/cluster.d.ts +432 -0
  92. package/node_modules/@types/node/compatibility/iterators.d.ts +21 -0
  93. package/node_modules/@types/node/console.d.ts +93 -0
  94. package/node_modules/@types/node/constants.d.ts +14 -0
  95. package/node_modules/@types/node/crypto.d.ts +4058 -0
  96. package/node_modules/@types/node/dgram.d.ts +537 -0
  97. package/node_modules/@types/node/diagnostics_channel.d.ts +552 -0
  98. package/node_modules/@types/node/dns/promises.d.ts +497 -0
  99. package/node_modules/@types/node/dns.d.ts +876 -0
  100. package/node_modules/@types/node/domain.d.ts +150 -0
  101. package/node_modules/@types/node/events.d.ts +1008 -0
  102. package/node_modules/@types/node/fs/promises.d.ts +1468 -0
  103. package/node_modules/@types/node/fs.d.ts +4780 -0
  104. package/node_modules/@types/node/globals.d.ts +150 -0
  105. package/node_modules/@types/node/globals.typedarray.d.ts +101 -0
  106. package/node_modules/@types/node/http.d.ts +2147 -0
  107. package/node_modules/@types/node/http2.d.ts +2485 -0
  108. package/node_modules/@types/node/https.d.ts +400 -0
  109. package/node_modules/@types/node/index.d.ts +117 -0
  110. package/node_modules/@types/node/inspector/promises.d.ts +35 -0
  111. package/node_modules/@types/node/inspector.d.ts +264 -0
  112. package/node_modules/@types/node/inspector.generated.d.ts +4406 -0
  113. package/node_modules/@types/node/module.d.ts +755 -0
  114. package/node_modules/@types/node/net.d.ts +970 -0
  115. package/node_modules/@types/node/os.d.ts +498 -0
  116. package/node_modules/@types/node/package.json +155 -0
  117. package/node_modules/@types/node/path/posix.d.ts +8 -0
  118. package/node_modules/@types/node/path/win32.d.ts +8 -0
  119. package/node_modules/@types/node/path.d.ts +178 -0
  120. package/node_modules/@types/node/perf_hooks.d.ts +612 -0
  121. package/node_modules/@types/node/process.d.ts +2204 -0
  122. package/node_modules/@types/node/punycode.d.ts +89 -0
  123. package/node_modules/@types/node/querystring.d.ts +139 -0
  124. package/node_modules/@types/node/quic.d.ts +897 -0
  125. package/node_modules/@types/node/readline/promises.d.ts +158 -0
  126. package/node_modules/@types/node/readline.d.ts +507 -0
  127. package/node_modules/@types/node/repl.d.ts +420 -0
  128. package/node_modules/@types/node/sea.d.ts +47 -0
  129. package/node_modules/@types/node/sqlite.d.ts +1068 -0
  130. package/node_modules/@types/node/stream/consumers.d.ts +114 -0
  131. package/node_modules/@types/node/stream/iter.d.ts +301 -0
  132. package/node_modules/@types/node/stream/promises.d.ts +211 -0
  133. package/node_modules/@types/node/stream/web.d.ts +300 -0
  134. package/node_modules/@types/node/stream.d.ts +1774 -0
  135. package/node_modules/@types/node/string_decoder.d.ts +27 -0
  136. package/node_modules/@types/node/test/reporters.d.ts +59 -0
  137. package/node_modules/@types/node/test.d.ts +2279 -0
  138. package/node_modules/@types/node/timers/promises.d.ts +93 -0
  139. package/node_modules/@types/node/timers.d.ts +149 -0
  140. package/node_modules/@types/node/tls.d.ts +1193 -0
  141. package/node_modules/@types/node/trace_events.d.ts +103 -0
  142. package/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +462 -0
  143. package/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
  144. package/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +36 -0
  145. package/node_modules/@types/node/ts5.6/index.d.ts +119 -0
  146. package/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
  147. package/node_modules/@types/node/ts5.7/index.d.ts +119 -0
  148. package/node_modules/@types/node/tty.d.ts +225 -0
  149. package/node_modules/@types/node/url.d.ts +556 -0
  150. package/node_modules/@types/node/util/types.d.ts +558 -0
  151. package/node_modules/@types/node/util.d.ts +1677 -0
  152. package/node_modules/@types/node/v8.d.ts +980 -0
  153. package/node_modules/@types/node/vm.d.ts +1136 -0
  154. package/node_modules/@types/node/wasi.d.ts +131 -0
  155. package/node_modules/@types/node/web-globals/abortcontroller.d.ts +59 -0
  156. package/node_modules/@types/node/web-globals/blob.d.ts +23 -0
  157. package/node_modules/@types/node/web-globals/console.d.ts +9 -0
  158. package/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
  159. package/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  160. package/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
  161. package/node_modules/@types/node/web-globals/events.d.ts +106 -0
  162. package/node_modules/@types/node/web-globals/fetch.d.ts +69 -0
  163. package/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
  164. package/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
  165. package/node_modules/@types/node/web-globals/navigator.d.ts +25 -0
  166. package/node_modules/@types/node/web-globals/performance.d.ts +45 -0
  167. package/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  168. package/node_modules/@types/node/web-globals/streams.d.ts +115 -0
  169. package/node_modules/@types/node/web-globals/timers.d.ts +44 -0
  170. package/node_modules/@types/node/web-globals/url.d.ts +24 -0
  171. package/node_modules/@types/node/worker_threads.d.ts +671 -0
  172. package/node_modules/@types/node/zlib/iter.d.ts +131 -0
  173. package/node_modules/@types/node/zlib.d.ts +589 -0
  174. package/node_modules/protobufjs/README.md +556 -263
  175. package/node_modules/protobufjs/dist/light/protobuf.js +1569 -1919
  176. package/node_modules/protobufjs/dist/light/protobuf.js.map +1 -1
  177. package/node_modules/protobufjs/dist/light/protobuf.min.js +3 -3
  178. package/node_modules/protobufjs/dist/light/protobuf.min.js.map +1 -1
  179. package/node_modules/protobufjs/dist/minimal/protobuf.js +906 -1132
  180. package/node_modules/protobufjs/dist/minimal/protobuf.js.map +1 -1
  181. package/node_modules/protobufjs/dist/minimal/protobuf.min.js +3 -3
  182. package/node_modules/protobufjs/dist/minimal/protobuf.min.js.map +1 -1
  183. package/node_modules/protobufjs/dist/protobuf.js +1576 -1993
  184. package/node_modules/protobufjs/dist/protobuf.js.map +1 -1
  185. package/node_modules/protobufjs/dist/protobuf.min.js +3 -3
  186. package/node_modules/protobufjs/dist/protobuf.min.js.map +1 -1
  187. package/node_modules/protobufjs/ext/descriptor/README.md +70 -3
  188. package/node_modules/protobufjs/ext/descriptor/index.d.ts +193 -0
  189. package/node_modules/protobufjs/ext/descriptor/index.js +1185 -1
  190. package/node_modules/protobufjs/ext/descriptor/test.js +54 -0
  191. package/node_modules/protobufjs/index.d.ts +720 -834
  192. package/node_modules/protobufjs/package.json +44 -20
  193. package/node_modules/protobufjs/src/converter.js +36 -60
  194. package/node_modules/protobufjs/src/decoder.js +53 -124
  195. package/node_modules/protobufjs/src/encoder.js +2 -10
  196. package/node_modules/protobufjs/src/enum.js +3 -8
  197. package/node_modules/protobufjs/src/field.js +11 -13
  198. package/node_modules/protobufjs/src/index-light.js +1 -1
  199. package/node_modules/protobufjs/src/mapfield.js +0 -1
  200. package/node_modules/protobufjs/src/message.js +11 -5
  201. package/node_modules/protobufjs/src/method.js +4 -5
  202. package/node_modules/protobufjs/src/namespace.js +3 -10
  203. package/node_modules/protobufjs/src/object.js +20 -20
  204. package/node_modules/protobufjs/src/oneof.js +0 -3
  205. package/node_modules/protobufjs/src/parse.js +16 -78
  206. package/node_modules/protobufjs/src/reader.js +31 -136
  207. package/node_modules/protobufjs/src/reader_buffer.js +3 -24
  208. package/node_modules/protobufjs/src/root.js +3 -7
  209. package/node_modules/protobufjs/src/roots.js +1 -1
  210. package/node_modules/protobufjs/src/service.js +6 -13
  211. package/node_modules/protobufjs/src/tokenize.js +1 -6
  212. package/node_modules/protobufjs/src/type.js +30 -44
  213. package/node_modules/protobufjs/src/typescript.jsdoc +15 -0
  214. package/node_modules/protobufjs/src/util/minimal.js +12 -36
  215. package/node_modules/protobufjs/src/util.js +17 -6
  216. package/node_modules/protobufjs/src/verifier.js +6 -6
  217. package/node_modules/protobufjs/src/wrappers.js +1 -0
  218. package/node_modules/protobufjs/src/writer.js +16 -42
  219. package/node_modules/protobufjs/src/writer_buffer.js +1 -18
  220. package/node_modules/protobufjs/tsconfig.json +5 -3
  221. package/node_modules/undici-types/LICENSE +21 -0
  222. package/node_modules/undici-types/README.md +6 -0
  223. package/node_modules/undici-types/agent.d.ts +32 -0
  224. package/node_modules/undici-types/api.d.ts +43 -0
  225. package/node_modules/undici-types/balanced-pool.d.ts +30 -0
  226. package/node_modules/undici-types/cache-interceptor.d.ts +179 -0
  227. package/node_modules/undici-types/cache.d.ts +36 -0
  228. package/node_modules/undici-types/client-stats.d.ts +15 -0
  229. package/node_modules/undici-types/client.d.ts +123 -0
  230. package/node_modules/undici-types/connector.d.ts +36 -0
  231. package/node_modules/undici-types/content-type.d.ts +21 -0
  232. package/node_modules/undici-types/cookies.d.ts +30 -0
  233. package/node_modules/undici-types/diagnostics-channel.d.ts +74 -0
  234. package/node_modules/undici-types/dispatcher.d.ts +279 -0
  235. package/node_modules/undici-types/env-http-proxy-agent.d.ts +22 -0
  236. package/node_modules/undici-types/errors.d.ts +177 -0
  237. package/node_modules/undici-types/eventsource.d.ts +66 -0
  238. package/node_modules/undici-types/fetch.d.ts +211 -0
  239. package/node_modules/undici-types/formdata.d.ts +108 -0
  240. package/node_modules/undici-types/global-dispatcher.d.ts +9 -0
  241. package/node_modules/undici-types/global-origin.d.ts +7 -0
  242. package/node_modules/undici-types/h2c-client.d.ts +73 -0
  243. package/node_modules/undici-types/handlers.d.ts +15 -0
  244. package/node_modules/undici-types/header.d.ts +160 -0
  245. package/node_modules/undici-types/index.d.ts +91 -0
  246. package/node_modules/undici-types/interceptors.d.ts +80 -0
  247. package/node_modules/undici-types/mock-agent.d.ts +68 -0
  248. package/node_modules/undici-types/mock-call-history.d.ts +111 -0
  249. package/node_modules/undici-types/mock-client.d.ts +27 -0
  250. package/node_modules/undici-types/mock-errors.d.ts +12 -0
  251. package/node_modules/undici-types/mock-interceptor.d.ts +94 -0
  252. package/node_modules/undici-types/mock-pool.d.ts +27 -0
  253. package/node_modules/undici-types/package.json +55 -0
  254. package/node_modules/undici-types/patch.d.ts +29 -0
  255. package/node_modules/undici-types/pool-stats.d.ts +19 -0
  256. package/node_modules/undici-types/pool.d.ts +41 -0
  257. package/node_modules/undici-types/proxy-agent.d.ts +29 -0
  258. package/node_modules/undici-types/readable.d.ts +68 -0
  259. package/node_modules/undici-types/retry-agent.d.ts +8 -0
  260. package/node_modules/undici-types/retry-handler.d.ts +125 -0
  261. package/node_modules/undici-types/round-robin-pool.d.ts +41 -0
  262. package/node_modules/undici-types/snapshot-agent.d.ts +109 -0
  263. package/node_modules/undici-types/socks5-proxy-agent.d.ts +25 -0
  264. package/node_modules/undici-types/util.d.ts +18 -0
  265. package/node_modules/undici-types/utility.d.ts +7 -0
  266. package/node_modules/undici-types/webidl.d.ts +347 -0
  267. package/node_modules/undici-types/websocket.d.ts +188 -0
  268. package/npm-shrinkwrap.json +95 -6
  269. package/package.json +4 -4
  270. package/skills/feishu-wiki/SKILL.md +10 -1
  271. package/node_modules/protobufjs/ext/README.md +0 -81
  272. package/node_modules/protobufjs/ext/descriptor.d.ts +0 -86
  273. package/node_modules/protobufjs/ext/descriptor.generated.d.ts +0 -409
  274. package/node_modules/protobufjs/ext/descriptor.js +0 -1266
  275. package/node_modules/protobufjs/ext/textformat.d.ts +0 -19
  276. package/node_modules/protobufjs/ext/textformat.generated.d.ts +0 -11
  277. package/node_modules/protobufjs/ext/textformat.js +0 -1235
  278. package/node_modules/protobufjs/google/protobuf/compiler/plugin.json +0 -126
  279. package/node_modules/protobufjs/google/protobuf/compiler/plugin.proto +0 -47
  280. package/node_modules/protobufjs/src/typescript.js +0 -25
  281. /package/node_modules/{protobufjs/src/util/float.d.ts → @protobufjs/float/index.d.ts} +0 -0
package/dist/api.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { r as listEnabledFeishuAccounts } from "./accounts-Cfzht2Hc.js";
2
- import { a as setFeishuNamedAccountEnabled, i as feishuSetupAdapter, n as feishuSetupWizard, r as runFeishuLogin, t as feishuPlugin } from "./channel-DwygSth-.js";
2
+ import { a as setFeishuNamedAccountEnabled, i as feishuSetupAdapter, n as feishuSetupWizard, r as runFeishuLogin, t as feishuPlugin } from "./channel-C9mW5kaS.js";
3
3
  import { a as parseFeishuTargetId, i as parseFeishuDirectConversationId, n as buildFeishuModelOverrideParentCandidates, r as parseFeishuConversationId, t as buildFeishuConversationId } from "./conversation-id-DuL575sn.js";
4
4
  import { t as getFeishuRuntime } from "./runtime-C5JxBWZp.js";
5
5
  import { r as createFeishuClient } from "./client-BhMNZBJD.js";
6
- import { a as jsonToolResult, d as registerFeishuChatTools, f as createFeishuToolClient, h as resolveToolsConfig, m as resolveFeishuToolAccount, n as registerFeishuDriveTools, o as toolExecutionErrorResult, p as resolveAnyEnabledFeishuToolsConfig, s as unknownToolActionResult } from "./drive-8o3Omlnd.js";
6
+ import { a as jsonToolResult, d as registerFeishuChatTools, f as createFeishuToolClient, h as resolveToolsConfig, m as resolveFeishuToolAccount, n as registerFeishuDriveTools, o as toolExecutionErrorResult, p as resolveAnyEnabledFeishuToolsConfig, s as unknownToolActionResult } from "./drive-9UfpmY27.js";
7
7
  import { n as getFeishuThreadBindingManager, r as testing, t as createFeishuThreadBindingManager } from "./thread-bindings-V0bwk0A1.js";
8
8
  import { n as handleFeishuSubagentEnded, r as handleFeishuSubagentSpawning, t as handleFeishuSubagentDeliveryTarget } from "./subagent-hooks-1pqt5tAA.js";
9
9
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, readStringValue, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
@@ -1398,12 +1398,20 @@ function registerFeishuDocTools(api) {
1398
1398
  const getClient = (params, defaultAccountId) => createFeishuToolClient({
1399
1399
  api,
1400
1400
  executeParams: params,
1401
- defaultAccountId
1401
+ defaultAccountId,
1402
+ requiredTool: {
1403
+ family: "doc",
1404
+ label: "Doc"
1405
+ }
1402
1406
  });
1403
1407
  const getMediaMaxBytes = (params, defaultAccountId) => (resolveFeishuToolAccount({
1404
1408
  api,
1405
1409
  executeParams: params,
1406
- defaultAccountId
1410
+ defaultAccountId,
1411
+ requiredTool: {
1412
+ family: "doc",
1413
+ label: "Doc"
1414
+ }
1407
1415
  }).config?.mediaMaxMb ?? 30) * 1024 * 1024;
1408
1416
  if (toolsCfg.doc) {
1409
1417
  api.registerTool((ctx) => {
@@ -1461,7 +1469,14 @@ function registerFeishuDocTools(api) {
1461
1469
  parameters: Type.Object({}),
1462
1470
  async execute() {
1463
1471
  try {
1464
- return json$1(await listAppScopes(getClient(void 0, ctx.agentAccountId)));
1472
+ return json$1(await listAppScopes(createFeishuToolClient({
1473
+ api,
1474
+ defaultAccountId: ctx.agentAccountId,
1475
+ requiredTool: {
1476
+ family: "scopes",
1477
+ label: "App Scopes"
1478
+ }
1479
+ })));
1465
1480
  } catch (err) {
1466
1481
  return json$1({ error: formatErrorMessage(err) });
1467
1482
  }
@@ -1474,11 +1489,23 @@ function registerFeishuDocTools(api) {
1474
1489
  //#region extensions/feishu/src/wiki-schema.ts
1475
1490
  const WIKI_SPACE_ID_DESCRIPTION = "Knowledge space ID. Treat as an opaque string and keep it quoted; never pass numeric-looking IDs as numbers.";
1476
1491
  const FeishuWikiSchema = Type.Union([
1477
- Type.Object({ action: Type.Literal("spaces") }),
1492
+ Type.Object({
1493
+ action: Type.Literal("spaces"),
1494
+ page_size: optionalPositiveIntegerSchema({
1495
+ maximum: 50,
1496
+ description: "Page size (1-50, default 50)"
1497
+ }),
1498
+ page_token: Type.Optional(Type.String({ description: "Pagination token" }))
1499
+ }),
1478
1500
  Type.Object({
1479
1501
  action: Type.Literal("nodes"),
1480
1502
  space_id: Type.String({ description: WIKI_SPACE_ID_DESCRIPTION }),
1481
- parent_node_token: Type.Optional(Type.String({ description: "Parent node token (optional, omit for root)" }))
1503
+ parent_node_token: Type.Optional(Type.String({ description: "Parent node token (optional, omit for root)" })),
1504
+ page_size: optionalPositiveIntegerSchema({
1505
+ maximum: 50,
1506
+ description: "Page size (1-50, default 50)"
1507
+ }),
1508
+ page_token: Type.Optional(Type.String({ description: "Pagination token" }))
1482
1509
  }),
1483
1510
  Type.Object({
1484
1511
  action: Type.Literal("get"),
@@ -1516,6 +1543,7 @@ const FeishuWikiSchema = Type.Union([
1516
1543
  ]);
1517
1544
  //#endregion
1518
1545
  //#region extensions/feishu/src/wiki.ts
1546
+ const WIKI_PAGE_SIZE = 50;
1519
1547
  const WIKI_ACCESS_HINT = "To grant wiki access: Open wiki space → Settings → Members → Add the bot. See: https://open.feishu.cn/document/server-docs/docs/wiki-v2/wiki-qa#a40ad4ca";
1520
1548
  function requireWikiSpaceId(value, fieldName) {
1521
1549
  if (typeof value !== "string") throw new Error(`${fieldName} must be a string. Feishu wiki space IDs are opaque identifiers; pass them quoted to avoid JavaScript number precision loss.`);
@@ -1527,8 +1555,17 @@ function optionalWikiSpaceId(value, fieldName) {
1527
1555
  if (value === void 0 || value === null || value === "") return;
1528
1556
  return requireWikiSpaceId(value, fieldName);
1529
1557
  }
1530
- async function listSpaces(client) {
1531
- const res = await client.wiki.space.list({});
1558
+ function readWikiPageSize(params) {
1559
+ return readPositiveIntegerParam(params, "page_size", {
1560
+ max: WIKI_PAGE_SIZE,
1561
+ message: "page_size must be a positive integer between 1 and 50"
1562
+ }) ?? WIKI_PAGE_SIZE;
1563
+ }
1564
+ async function listSpaces(client, pageSize, pageToken) {
1565
+ const res = await client.wiki.space.list({ params: {
1566
+ page_size: pageSize,
1567
+ page_token: pageToken
1568
+ } });
1532
1569
  if (res.code !== 0) throw new Error(res.msg);
1533
1570
  const spaces = res.data?.items?.map((s) => ({
1534
1571
  space_id: s.space_id,
@@ -1538,22 +1575,32 @@ async function listSpaces(client) {
1538
1575
  })) ?? [];
1539
1576
  return {
1540
1577
  spaces,
1541
- ...spaces.length === 0 && { hint: WIKI_ACCESS_HINT }
1578
+ has_more: res.data?.has_more ?? false,
1579
+ page_token: res.data?.page_token,
1580
+ ...spaces.length === 0 && pageToken === void 0 && res.data?.has_more !== true && { hint: WIKI_ACCESS_HINT }
1542
1581
  };
1543
1582
  }
1544
- async function listNodes(client, spaceId, parentNodeToken) {
1583
+ async function listNodes(client, spaceId, parentNodeToken, pageSize, pageToken) {
1545
1584
  const res = await client.wiki.spaceNode.list({
1546
1585
  path: { space_id: spaceId },
1547
- params: { parent_node_token: parentNodeToken }
1586
+ params: {
1587
+ parent_node_token: parentNodeToken,
1588
+ page_size: pageSize,
1589
+ page_token: pageToken
1590
+ }
1548
1591
  });
1549
1592
  if (res.code !== 0) throw new Error(res.msg);
1550
- return { nodes: res.data?.items?.map((n) => ({
1551
- node_token: n.node_token,
1552
- obj_token: n.obj_token,
1553
- obj_type: n.obj_type,
1554
- title: n.title,
1555
- has_child: n.has_child
1556
- })) ?? [] };
1593
+ return {
1594
+ nodes: res.data?.items?.map((n) => ({
1595
+ node_token: n.node_token,
1596
+ obj_token: n.obj_token,
1597
+ obj_type: n.obj_type,
1598
+ title: n.title,
1599
+ has_child: n.has_child
1600
+ })) ?? [],
1601
+ has_more: res.data?.has_more ?? false,
1602
+ page_token: res.data?.page_token
1603
+ };
1557
1604
  }
1558
1605
  async function getNode(client, token) {
1559
1606
  const res = await client.wiki.space.getNode({ params: { token } });
@@ -1640,13 +1687,17 @@ function registerFeishuWikiTools(api) {
1640
1687
  const createClient = () => createFeishuToolClient({
1641
1688
  api,
1642
1689
  executeParams: p,
1643
- defaultAccountId
1690
+ defaultAccountId,
1691
+ requiredTool: {
1692
+ family: "wiki",
1693
+ label: "Wiki"
1694
+ }
1644
1695
  });
1645
1696
  switch (p.action) {
1646
- case "spaces": return jsonToolResult(await listSpaces(createClient()));
1697
+ case "spaces": return jsonToolResult(await listSpaces(createClient(), readWikiPageSize(p), p.page_token));
1647
1698
  case "nodes": {
1648
1699
  const spaceId = requireWikiSpaceId(p.space_id, "space_id");
1649
- return jsonToolResult(await listNodes(createClient(), spaceId, p.parent_node_token));
1700
+ return jsonToolResult(await listNodes(createClient(), spaceId, p.parent_node_token, readWikiPageSize(p), p.page_token));
1650
1701
  }
1651
1702
  case "get": return jsonToolResult(await getNode(createClient(), p.token));
1652
1703
  case "search":
@@ -1787,7 +1838,11 @@ function registerFeishuPermTools(api) {
1787
1838
  const client = createFeishuToolClient({
1788
1839
  api,
1789
1840
  executeParams: p,
1790
- defaultAccountId
1841
+ defaultAccountId,
1842
+ requiredTool: {
1843
+ family: "perm",
1844
+ label: "Perm"
1845
+ }
1791
1846
  });
1792
1847
  switch (p.action) {
1793
1848
  case "list": return jsonToolResult(await listMembers(client, p.token, p.type));
@@ -1735,7 +1735,7 @@ const meta = {
1735
1735
  order: 70,
1736
1736
  preferSessionLookupForAnnounceTarget: true
1737
1737
  };
1738
- const loadFeishuChannelRuntime = createLazyRuntimeNamedExport(() => import("./channel.runtime-CrqKcXaU.js"), "feishuChannelRuntime");
1738
+ const loadFeishuChannelRuntime = createLazyRuntimeNamedExport(() => import("./channel.runtime-BgUhHAja.js"), "feishuChannelRuntime");
1739
1739
  function toFeishuMessageSendResult(result, kind) {
1740
1740
  const receipt = result.receipt ?? createFeishuSendReceipt({
1741
1741
  messageId: result.messageId,
@@ -2551,7 +2551,7 @@ const feishuPlugin = createChatChannelPlugin({
2551
2551
  })
2552
2552
  }),
2553
2553
  gateway: { startAccount: async (ctx) => {
2554
- const { monitorFeishuProvider } = await import("./monitor-_1eNsUVp.js");
2554
+ const { monitorFeishuProvider } = await import("./monitor-BayUOr_U.js");
2555
2555
  const account = resolveFeishuRuntimeAccount({
2556
2556
  cfg: ctx.cfg,
2557
2557
  accountId: ctx.accountId
@@ -1,2 +1,2 @@
1
- import { t as feishuPlugin } from "./channel-DwygSth-.js";
1
+ import { t as feishuPlugin } from "./channel-C9mW5kaS.js";
2
2
  export { feishuPlugin };
@@ -1,9 +1,9 @@
1
1
  import { o as resolveFeishuAccount, s as resolveFeishuRuntimeAccount, v as parseFeishuCommentTarget } from "./accounts-Cfzht2Hc.js";
2
- import { h as listFeishuDirectoryPeers, m as listFeishuDirectoryGroups, o as buildFeishuPresentationCardElements } from "./channel-DwygSth-.js";
2
+ import { h as listFeishuDirectoryPeers, m as listFeishuDirectoryGroups, o as buildFeishuPresentationCardElements } from "./channel-C9mW5kaS.js";
3
3
  import { r as createFeishuClient } from "./client-BhMNZBJD.js";
4
- import { c as getChatInfo, l as getChatMembers, r as cleanupAmbientCommentTypingReaction, t as deliverCommentThreadText, u as getFeishuMemberInfo } from "./drive-8o3Omlnd.js";
4
+ import { c as getChatInfo, l as getChatMembers, r as cleanupAmbientCommentTypingReaction, t as deliverCommentThreadText, u as getFeishuMemberInfo } from "./drive-9UfpmY27.js";
5
5
  import { chunkTextForOutbound } from "./runtime-api.js";
6
- import { a as sendCardFeishu, c as sendStructuredCardFeishu, g as shouldSuppressFeishuTextForVoiceMedia, h as sendMediaFeishu, i as resolveFeishuCardTemplate, n as getMessageFeishu, o as sendMarkdownCardFeishu, s as sendMessageFeishu, t as editMessageFeishu } from "./send-B3kteMF8.js";
6
+ import { a as sendCardFeishu, c as sendStructuredCardFeishu, g as shouldSuppressFeishuTextForVoiceMedia, h as sendMediaFeishu, i as resolveFeishuCardTemplate, n as getMessageFeishu, o as sendMarkdownCardFeishu, s as sendMessageFeishu, t as editMessageFeishu } from "./send-BozRcrbz.js";
7
7
  import { t as probeFeishu } from "./probe-BjKRV7em.js";
8
8
  import { interactiveReplyToPresentation, normalizeInteractiveReply, normalizeMessagePresentation, renderMessagePresentationFallbackText, resolveInteractiveTextFallback } from "openclaw/plugin-sdk/interactive-runtime";
9
9
  import { isRecord, normalizeLowercaseStringOrEmpty, normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
@@ -50,13 +50,22 @@ function resolveImplicitToolAccountId(params) {
50
50
  }
51
51
  const configuredDefaultAccountId = normalizeOptionalString((params.api.config?.channels?.feishu)?.defaultAccount);
52
52
  if (configuredDefaultAccountId) return configuredDefaultAccountId;
53
+ if (params.requiredTool && params.api.config) for (const accountId of listFeishuAccountIds(params.api.config)) {
54
+ const account = resolveFeishuAccount({
55
+ cfg: params.api.config,
56
+ accountId
57
+ });
58
+ if (account.enabled && account.configured && resolveToolsConfig(account.config.tools)[params.requiredTool.family]) return accountId;
59
+ }
53
60
  }
54
61
  function resolveFeishuToolAccount(params) {
55
62
  if (!params.api.config) throw new Error("Feishu config unavailable");
56
- return resolveFeishuRuntimeAccount({
63
+ const account = resolveFeishuRuntimeAccount({
57
64
  cfg: params.api.config,
58
65
  accountId: resolveImplicitToolAccountId(params)
59
66
  });
67
+ if (params.requiredTool && !resolveToolsConfig(account.config.tools)[params.requiredTool.family]) throw new Error(`Feishu ${params.requiredTool.label} tools are disabled for account "${account.accountId}"`);
68
+ return account;
60
69
  }
61
70
  function createFeishuToolClient(params) {
62
71
  return createFeishuClient(resolveFeishuToolAccount(params));
@@ -862,7 +871,11 @@ function registerFeishuDriveTools(api) {
862
871
  const client = createFeishuToolClient({
863
872
  api,
864
873
  executeParams: p,
865
- defaultAccountId
874
+ defaultAccountId,
875
+ requiredTool: {
876
+ family: "drive",
877
+ label: "Drive"
878
+ }
866
879
  });
867
880
  switch (p.action) {
868
881
  case "list": return jsonToolResult(await listFolder(client, p.folder_token));
@@ -3,7 +3,7 @@ import { f as fetchBotIdentityForMonitor } from "./monitor.state-QV66eUNA.js";
3
3
  //#region extensions/feishu/src/monitor.ts
4
4
  let monitorAccountRuntimePromise;
5
5
  async function loadMonitorAccountRuntime() {
6
- monitorAccountRuntimePromise ??= import("./monitor.account-BhoLA1Y0.js");
6
+ monitorAccountRuntimePromise ??= import("./monitor.account-DzZWj0ob.js");
7
7
  return await monitorAccountRuntimePromise;
8
8
  }
9
9
  async function monitorFeishuProvider(opts = {}) {
@@ -1,14 +1,14 @@
1
1
  import { _ as normalizeCommentFileType, c as encodeQuery, d as isRecord$1, f as normalizeString, g as buildFeishuCommentTarget, h as requestFeishuApi, l as extractReplyText, m as readString, o as resolveFeishuAccount, p as parseCommentContentElements, s as resolveFeishuRuntimeAccount } from "./accounts-Cfzht2Hc.js";
2
2
  import { i as resolveReceiveIdType } from "./targets-BUjQ1TcA.js";
3
- import { c as normalizeFeishuAllowEntry, d as resolveFeishuGroupConversationIngressAccess, f as resolveFeishuGroupSenderActivationIngressAccess, l as resolveFeishuDmIngressAccess, p as resolveFeishuReplyPolicy, s as hasExplicitFeishuGroupConfig, u as resolveFeishuGroupConfig } from "./channel-DwygSth-.js";
3
+ import { c as normalizeFeishuAllowEntry, d as resolveFeishuGroupConversationIngressAccess, f as resolveFeishuGroupSenderActivationIngressAccess, l as resolveFeishuDmIngressAccess, p as resolveFeishuReplyPolicy, s as hasExplicitFeishuGroupConfig, u as resolveFeishuGroupConfig } from "./channel-C9mW5kaS.js";
4
4
  import { c as decodeFeishuCardAction, o as buildFeishuCardActionTextFallback, s as createFeishuCardInteractionEnvelope } from "./send-result-DSsIa4-p.js";
5
5
  import { t as buildFeishuConversationId } from "./conversation-id-DuL575sn.js";
6
6
  import { t as getFeishuRuntime } from "./runtime-C5JxBWZp.js";
7
7
  import { a as getFeishuUserAgent, i as createFeishuWSClient, n as createEventDispatcher, r as createFeishuClient } from "./client-BhMNZBJD.js";
8
- import { c as getChatInfo, i as createCommentTypingReactionLifecycle, t as deliverCommentThreadText } from "./drive-8o3Omlnd.js";
8
+ import { c as getChatInfo, i as createCommentTypingReactionLifecycle, t as deliverCommentThreadText } from "./drive-9UfpmY27.js";
9
9
  import { t as createFeishuThreadBindingManager } from "./thread-bindings-V0bwk0A1.js";
10
10
  import { createReplyPrefixContext, evaluateSupplementalContextVisibility, loadSessionStore, normalizeAgentId as normalizeAgentId$2, resolveChannelContextVisibilityMode, resolveSessionStoreEntry } from "./runtime-api.js";
11
- import { _ as normalizeFeishuExternalKey, a as sendCardFeishu, c as sendStructuredCardFeishu, d as isFeishuBroadcastMention, f as isMentionForwardRequest, g as shouldSuppressFeishuTextForVoiceMedia, h as sendMediaFeishu, i as resolveFeishuCardTemplate, l as parsePostContent, m as saveMessageResourceFeishu, n as getMessageFeishu, p as isFeishuGroupChatType, r as listFeishuThreadMessages, s as sendMessageFeishu, u as extractMentionTargets } from "./send-B3kteMF8.js";
11
+ import { _ as normalizeFeishuExternalKey, a as sendCardFeishu, c as sendStructuredCardFeishu, d as isFeishuBroadcastMention, f as isMentionForwardRequest, g as shouldSuppressFeishuTextForVoiceMedia, h as sendMediaFeishu, i as resolveFeishuCardTemplate, l as parsePostContent, m as saveMessageResourceFeishu, n as getMessageFeishu, p as isFeishuGroupChatType, r as listFeishuThreadMessages, s as sendMessageFeishu, u as extractMentionTargets } from "./send-BozRcrbz.js";
12
12
  import { i as waitForAbortableDelay, r as raceWithTimeoutAndAbort } from "./probe-BjKRV7em.js";
13
13
  import { a as clearFeishuBotIdentityState, c as httpServers, d as wsClients, f as fetchBotIdentityForMonitor, i as botOpenIds, l as recordWebhookStatus, n as FEISHU_WEBHOOK_MAX_BODY_BYTES, o as closeTrackedFeishuHttpServer, r as botNames, s as feishuWebhookRateLimiter, t as FEISHU_WEBHOOK_BODY_TIMEOUT_MS, u as setFeishuBotIdentityState } from "./monitor.state-QV66eUNA.js";
14
14
  import { createChannelMessageReplyPipeline, formatChannelProgressDraftLineForEntry, isChannelProgressDraftWorkToolName, resolveAgentOutboundIdentity } from "openclaw/plugin-sdk/channel-outbound";
@@ -646,11 +646,32 @@ function resolveMessageMediaParts(messageType, content) {
646
646
  default: return fileKey ? [`file_key:${fileKey}`] : imageKey ? [`image_key:${imageKey}`] : [];
647
647
  }
648
648
  }
649
+ function resolveSenderIdentity(event) {
650
+ const senderId = event.sender?.sender_id;
651
+ return senderId?.open_id?.trim() || senderId?.union_id?.trim() || senderId?.user_id?.trim() || void 0;
652
+ }
653
+ function resolveTextRetryDedupeKey(event) {
654
+ const createTime = event.message.create_time?.trim();
655
+ const chatId = event.message.chat_id?.trim();
656
+ const senderId = resolveSenderIdentity(event);
657
+ if (!createTime || parseStrictNonNegativeInteger(createTime) === void 0 || !chatId || !senderId) return;
658
+ const contentHash = createHash("sha256").update(event.message.content, "utf8").digest("hex").slice(0, 32);
659
+ return JSON.stringify([
660
+ "text-retry",
661
+ senderId,
662
+ chatId,
663
+ createTime,
664
+ contentHash
665
+ ]);
666
+ }
649
667
  function resolveFeishuMessageDedupeKey(event) {
650
668
  const messageId = event.message.message_id?.trim();
651
669
  if (!messageId) return;
652
- const mediaParts = resolveMessageMediaParts(event.message.message_type.trim(), event.message.content);
653
- return mediaParts.length > 0 ? buildMediaDedupeKey(messageId, mediaParts) : messageId;
670
+ const messageType = event.message.message_type.trim();
671
+ const mediaParts = resolveMessageMediaParts(messageType, event.message.content);
672
+ if (mediaParts.length > 0) return buildMediaDedupeKey(messageId, mediaParts);
673
+ if (messageType === "text") return resolveTextRetryDedupeKey(event) ?? messageId;
674
+ return messageId;
654
675
  }
655
676
  //#endregion
656
677
  //#region extensions/feishu/src/dynamic-agent.ts
@@ -1395,6 +1416,12 @@ async function removeTypingIndicator(params) {
1395
1416
  function shouldUseCard(text) {
1396
1417
  return /```[\s\S]*?```/.test(text) || /\|.+\|[\r\n]+\|[-:| ]+\|/.test(text);
1397
1418
  }
1419
+ function mergeStreamingFinalText(previousText, nextText, appendError) {
1420
+ if (!appendError || !previousText) return nextText;
1421
+ if (nextText.startsWith(previousText)) return nextText;
1422
+ if (previousText.endsWith(`\n\n${nextText}`)) return previousText;
1423
+ return `${previousText}\n\n${nextText}`;
1424
+ }
1398
1425
  /** Maximum age (ms) for a message to receive a typing indicator reaction.
1399
1426
  * Messages older than this are likely replays after context compaction (#30418). */
1400
1427
  const TYPING_INDICATOR_MAX_AGE_MS = 2 * 6e4;
@@ -1445,7 +1472,7 @@ function resolveCardNote(agentId, identity, prefixCtx) {
1445
1472
  }
1446
1473
  function createFeishuReplyDispatcher(params) {
1447
1474
  const core = getFeishuRuntime();
1448
- const { cfg, agentId, chatId, replyToMessageId, typingTargetMessageId: explicitTypingTargetMessageId, skipReplyToInMessages, replyInThread, threadReply, rootId, accountId, identity } = params;
1475
+ const { cfg, agentId, chatId, replyToMessageId, typingTargetMessageId: explicitTypingTargetMessageId, skipReplyToInMessages, replyInThread, threadReply, rootId, accountId, identity, mentionTargets } = params;
1449
1476
  const sendReplyToMessageId = skipReplyToInMessages ? void 0 : replyToMessageId;
1450
1477
  const typingTargetMessageId = explicitTypingTargetMessageId?.trim() || replyToMessageId;
1451
1478
  const threadReplyMode = threadReply === true;
@@ -1520,6 +1547,7 @@ function createFeishuReplyDispatcher(params) {
1520
1547
  let statusLine = "";
1521
1548
  let snapshotBaseText = "";
1522
1549
  let lastSnapshotTextLength = 0;
1550
+ let hasStreamingFinalText = false;
1523
1551
  const deliveredFinalTexts = /* @__PURE__ */ new Set();
1524
1552
  let partialUpdateQueue = Promise.resolve();
1525
1553
  let streamingStartPromise = null;
@@ -1609,6 +1637,7 @@ function createFeishuReplyDispatcher(params) {
1609
1637
  statusLine = "";
1610
1638
  snapshotBaseText = "";
1611
1639
  lastSnapshotTextLength = 0;
1640
+ hasStreamingFinalText = false;
1612
1641
  };
1613
1642
  const closeStreaming = async (options) => {
1614
1643
  try {
@@ -1775,7 +1804,7 @@ function createFeishuReplyDispatcher(params) {
1775
1804
  ...payload,
1776
1805
  text: payloadText
1777
1806
  });
1778
- const text = reply.text;
1807
+ const text = info?.kind === "final" ? mergeStreamingFinalText(streamText, reply.text, payload.isError === true && hasStreamingFinalText) : reply.text;
1779
1808
  const hasText = reply.hasText;
1780
1809
  const hasMedia = reply.hasMedia;
1781
1810
  const hasVoiceMedia = hasMedia && reply.mediaUrls.some((mediaUrl) => shouldSuppressFeishuTextForVoiceMedia({
@@ -1811,6 +1840,7 @@ function createFeishuReplyDispatcher(params) {
1811
1840
  });
1812
1841
  if (info?.kind === "final") {
1813
1842
  streamText = text;
1843
+ hasStreamingFinalText = true;
1814
1844
  snapshotBaseText = "";
1815
1845
  lastSnapshotTextLength = text.length;
1816
1846
  flushStreamingCardUpdate(buildCombinedStreamText(reasoningText, streamText));
@@ -1843,7 +1873,7 @@ function createFeishuReplyDispatcher(params) {
1843
1873
  text,
1844
1874
  useCard: false,
1845
1875
  infoKind: info?.kind,
1846
- sendChunk: async ({ chunk }) => {
1876
+ sendChunk: async ({ chunk, isFirst }) => {
1847
1877
  await sendMessageFeishu({
1848
1878
  cfg,
1849
1879
  to: chatId,
@@ -1851,7 +1881,8 @@ function createFeishuReplyDispatcher(params) {
1851
1881
  replyToMessageId: sendReplyToMessageId,
1852
1882
  replyInThread: effectiveReplyInThread,
1853
1883
  allowTopLevelReplyFallback,
1854
- accountId
1884
+ accountId,
1885
+ ...info?.kind === "final" && isFirst && mentionTargets?.length ? { mentions: mentionTargets } : {}
1855
1886
  });
1856
1887
  }
1857
1888
  });
@@ -2124,7 +2155,7 @@ async function filterFetchedGroupContextMessages(messages, params) {
2124
2155
  }) ? message : void 0))).filter((message) => message !== void 0);
2125
2156
  }
2126
2157
  async function handleFeishuMessage(params) {
2127
- const { cfg, event, botOpenId, botName, runtime, channelRuntime, chatHistories, accountId, processingClaimHeld = false } = params;
2158
+ const { cfg, event, botOpenId, botName, runtime, channelRuntime, chatHistories, accountId, processingClaimHeld = false, messageDedupeKey: messageDedupeKeyOverride } = params;
2128
2159
  const account = resolveFeishuRuntimeAccount({
2129
2160
  cfg,
2130
2161
  accountId
@@ -2133,7 +2164,7 @@ async function handleFeishuMessage(params) {
2133
2164
  const log = runtime?.log ?? console.log;
2134
2165
  const error = runtime?.error ?? console.error;
2135
2166
  const messageId = event.message.message_id;
2136
- const messageDedupeKey = resolveFeishuMessageDedupeKey(event);
2167
+ const messageDedupeKey = messageDedupeKeyOverride ?? resolveFeishuMessageDedupeKey(event);
2137
2168
  if (!await finalizeFeishuMessageProcessing({
2138
2169
  messageId: messageDedupeKey,
2139
2170
  namespace: account.accountId,
@@ -2316,7 +2347,7 @@ async function handleFeishuMessage(params) {
2316
2347
  }
2317
2348
  }
2318
2349
  try {
2319
- const core = { channel: channelRuntime ?? getFeishuRuntime().channel };
2350
+ const core = { channel: channelRuntime?.inbound ? channelRuntime : getFeishuRuntime().channel };
2320
2351
  const pairing = createChannelPairingController({
2321
2352
  core,
2322
2353
  channel: "feishu",
@@ -2525,8 +2556,33 @@ async function handleFeishuMessage(params) {
2525
2556
  log,
2526
2557
  accountId: account.accountId
2527
2558
  });
2528
- if (!ctx.content.trim() && mediaList.length === 0) {
2529
- log(`feishu[${account.accountId}]: skipping empty message (no text, no media) from ${ctx.senderOpenId}`);
2559
+ let quotedMessageInfo = null;
2560
+ let quotedContent;
2561
+ if (ctx.parentId) try {
2562
+ quotedMessageInfo = await getMessageFeishu({
2563
+ cfg,
2564
+ messageId: ctx.parentId,
2565
+ accountId: account.accountId
2566
+ });
2567
+ if (quotedMessageInfo && await shouldIncludeFetchedGroupContextMessage({
2568
+ cfg,
2569
+ accountId: account.accountId,
2570
+ chatId: ctx.chatId,
2571
+ isGroup,
2572
+ allowFrom: effectiveGroupSenderAllowFrom,
2573
+ mode: contextVisibilityMode,
2574
+ kind: "quote",
2575
+ senderId: quotedMessageInfo.senderId,
2576
+ senderType: quotedMessageInfo.senderType
2577
+ })) {
2578
+ quotedContent = quotedMessageInfo.content;
2579
+ log(`feishu[${account.accountId}]: fetched quoted message: ${quotedContent?.slice(0, 100)}`);
2580
+ } else if (quotedMessageInfo) log(`feishu[${account.accountId}]: skipped quoted message from sender ${quotedMessageInfo.senderId ?? "unknown"} (mode=${contextVisibilityMode})`);
2581
+ } catch (err) {
2582
+ log(`feishu[${account.accountId}]: failed to fetch quoted message: ${String(err)}`);
2583
+ }
2584
+ if (!ctx.content.trim() && mediaList.length === 0 && !quotedContent?.trim()) {
2585
+ log(`feishu[${account.accountId}]: skipping empty message (no text, no media, no quoted) from ${ctx.senderOpenId}`);
2530
2586
  return;
2531
2587
  }
2532
2588
  const audioTranscript = await resolveFeishuAudioPreflightTranscript({
@@ -2566,31 +2622,6 @@ async function handleFeishuMessage(params) {
2566
2622
  mayPair: false,
2567
2623
  command: { hasControlCommand: true }
2568
2624
  })).commandAccess.authorized : void 0;
2569
- let quotedMessageInfo = null;
2570
- let quotedContent;
2571
- if (ctx.parentId) try {
2572
- quotedMessageInfo = await getMessageFeishu({
2573
- cfg,
2574
- messageId: ctx.parentId,
2575
- accountId: account.accountId
2576
- });
2577
- if (quotedMessageInfo && await shouldIncludeFetchedGroupContextMessage({
2578
- cfg,
2579
- accountId: account.accountId,
2580
- chatId: ctx.chatId,
2581
- isGroup,
2582
- allowFrom: effectiveGroupSenderAllowFrom,
2583
- mode: contextVisibilityMode,
2584
- kind: "quote",
2585
- senderId: quotedMessageInfo.senderId,
2586
- senderType: quotedMessageInfo.senderType
2587
- })) {
2588
- quotedContent = quotedMessageInfo.content;
2589
- log(`feishu[${account.accountId}]: fetched quoted message: ${quotedContent?.slice(0, 100)}`);
2590
- } else if (quotedMessageInfo) log(`feishu[${account.accountId}]: skipped quoted message from sender ${quotedMessageInfo.senderId ?? "unknown"} (mode=${contextVisibilityMode})`);
2591
- } catch (err) {
2592
- log(`feishu[${account.accountId}]: failed to fetch quoted message: ${String(err)}`);
2593
- }
2594
2625
  const isTopicSessionForThread = isGroup && (groupSession?.groupSessionScope === "group_topic" || groupSession?.groupSessionScope === "group_topic_sender");
2595
2626
  const envelopeOptions = core.channel.reply.resolveEnvelopeFormatOptions(cfg);
2596
2627
  const messageBody = buildFeishuAgentBody({
@@ -2884,6 +2915,7 @@ async function handleFeishuMessage(params) {
2884
2915
  threadReply,
2885
2916
  accountId: account.accountId,
2886
2917
  identity,
2918
+ mentionTargets: ctx.mentionTargets,
2887
2919
  messageCreateTimeMs,
2888
2920
  sessionKey: agentSessionKey
2889
2921
  });
@@ -3026,6 +3058,7 @@ async function handleFeishuMessage(params) {
3026
3058
  threadReply,
3027
3059
  accountId: account.accountId,
3028
3060
  identity,
3061
+ mentionTargets: ctx.mentionTargets,
3029
3062
  messageCreateTimeMs,
3030
3063
  sessionKey: route.sessionKey
3031
3064
  });
@@ -3225,6 +3258,8 @@ function releaseFeishuCardActionToken(params) {
3225
3258
  }
3226
3259
  function buildSyntheticMessageEvent(event, content, chatType) {
3227
3260
  const replyTargetMessageId = event.context.open_message_id ?? event.open_message_id;
3261
+ const isTemporaryCardActionId = replyTargetMessageId?.startsWith("card-action-c-");
3262
+ const validReplyTargetId = replyTargetMessageId && !isTemporaryCardActionId ? replyTargetMessageId : void 0;
3228
3263
  return {
3229
3264
  sender: { sender_id: {
3230
3265
  open_id: event.operator.open_id,
@@ -3233,9 +3268,9 @@ function buildSyntheticMessageEvent(event, content, chatType) {
3233
3268
  } },
3234
3269
  message: {
3235
3270
  message_id: `card-action-${event.token}`,
3236
- ...replyTargetMessageId ? { reply_target_message_id: replyTargetMessageId } : {},
3237
- ...replyTargetMessageId ? { typing_target_message_id: replyTargetMessageId } : {},
3238
- ...!replyTargetMessageId ? { suppress_reply_target: true } : {},
3271
+ ...validReplyTargetId ? { reply_target_message_id: validReplyTargetId } : {},
3272
+ ...validReplyTargetId ? { typing_target_message_id: validReplyTargetId } : {},
3273
+ ...!validReplyTargetId ? { suppress_reply_target: true } : {},
3239
3274
  chat_id: event.context.chat_id || event.operator.open_id,
3240
3275
  chat_type: chatType,
3241
3276
  message_type: "text",
@@ -4908,7 +4943,7 @@ function createFeishuMessageReceiveHandler({ cfg, channelRuntime, accountId, run
4908
4943
  const enqueue = createSequentialQueue({ onTaskTimeout: (key, timeoutMs) => {
4909
4944
  log(`feishu[${accountId}]: per-chat task exceeded ${timeoutMs}ms cap (key=${key}); evicting from queue so later same-key messages can proceed (#70133)`);
4910
4945
  } });
4911
- const dispatchFeishuMessage = async (event) => {
4946
+ const dispatchFeishuMessage = async (event, messageDedupeKey) => {
4912
4947
  const sequentialKey = resolveSequentialKey({
4913
4948
  accountId,
4914
4949
  event,
@@ -4924,7 +4959,8 @@ function createFeishuMessageReceiveHandler({ cfg, channelRuntime, accountId, run
4924
4959
  channelRuntime,
4925
4960
  chatHistories,
4926
4961
  accountId,
4927
- processingClaimHeld: true
4962
+ processingClaimHeld: true,
4963
+ messageDedupeKey
4928
4964
  });
4929
4965
  await enqueue(sequentialKey, task);
4930
4966
  };
@@ -4965,7 +5001,7 @@ function createFeishuMessageReceiveHandler({ cfg, channelRuntime, accountId, run
4965
5001
  const last = entries.at(-1);
4966
5002
  if (!last) return;
4967
5003
  if (entries.length === 1) {
4968
- await dispatchFeishuMessage(last);
5004
+ await dispatchFeishuMessage(last, resolveFeishuMessageDedupeKey(last));
4969
5005
  return;
4970
5006
  }
4971
5007
  const dedupedEntries = dedupeFeishuDebounceEntriesByDedupeKey(entries);
@@ -4973,7 +5009,8 @@ function createFeishuMessageReceiveHandler({ cfg, channelRuntime, accountId, run
4973
5009
  for (const entry of dedupedEntries) if (!await hasProcessedMessage(resolveFeishuMessageDedupeKey(entry), accountId, log)) freshEntries.push(entry);
4974
5010
  const dispatchEntry = freshEntries.at(-1);
4975
5011
  if (!dispatchEntry) return;
4976
- await recordSuppressedMessageIds(dedupedEntries, resolveFeishuMessageDedupeKey(dispatchEntry));
5012
+ const dispatchDedupeKey = resolveFeishuMessageDedupeKey(dispatchEntry);
5013
+ await recordSuppressedMessageIds(dedupedEntries, dispatchDedupeKey);
4977
5014
  const combinedText = freshEntries.map((entry) => resolveDebounceText(entry)).filter(Boolean).join("\n");
4978
5015
  const mergedMentions = resolveFeishuDebounceMentions({
4979
5016
  entries: freshEntries,
@@ -4989,7 +5026,7 @@ function createFeishuMessageReceiveHandler({ cfg, channelRuntime, accountId, run
4989
5026
  } : {},
4990
5027
  mentions: mergedMentions ?? dispatchEntry.message.mentions
4991
5028
  }
4992
- });
5029
+ }, dispatchDedupeKey);
4993
5030
  },
4994
5031
  onError: (err, entries) => {
4995
5032
  for (const entry of entries) releaseFeishuMessageProcessing(resolveFeishuMessageDedupeKey(entry), accountId);
@@ -5003,6 +5040,12 @@ function createFeishuMessageReceiveHandler({ cfg, channelRuntime, accountId, run
5003
5040
  return;
5004
5041
  }
5005
5042
  const messageId = event.message?.message_id?.trim();
5043
+ const botOpenId = getBotOpenId(accountId)?.trim();
5044
+ const senderOpenId = event.sender.sender_id.open_id?.trim();
5045
+ if (botOpenId && senderOpenId === botOpenId) {
5046
+ log(`feishu[${accountId}]: dropping self-authored message ${messageId ?? "unknown"}`);
5047
+ return;
5048
+ }
5006
5049
  const messageDedupeKey = resolveFeishuMessageDedupeKey(event);
5007
5050
  if (!tryBeginFeishuMessageProcessing(messageDedupeKey, accountId)) {
5008
5051
  log(`feishu[${accountId}]: dropping duplicate event for message ${messageId}`);
@@ -5406,7 +5449,7 @@ function parseFeishuCardActionEventPayload(value) {
5406
5449
  const unionId = firstString(operator.union_id, readFeishuIdentityField(operatorUserId, "union_id"));
5407
5450
  const tag = readString(action.tag);
5408
5451
  const actionValue = action.value;
5409
- const openMessageId = firstString(value.open_message_id, context.open_message_id);
5452
+ const openMessageId = firstString(context.open_message_id, value.open_message_id);
5410
5453
  const contextOpenId = firstString(context.open_id, openId);
5411
5454
  const contextUserId = firstString(context.user_id, userId);
5412
5455
  const chatId = firstString(context.chat_id, context.open_chat_id);
@@ -5465,6 +5508,7 @@ function registerEventHandlers(eventDispatcher, context) {
5465
5508
  resolveSequentialKey: getFeishuSequentialKey
5466
5509
  }),
5467
5510
  "im.message.message_read_v1": async () => {},
5511
+ "im.chat.access_event.bot_p2p_chat_entered_v1": async () => {},
5468
5512
  "im.chat.member.bot.added_v1": async (data) => {
5469
5513
  try {
5470
5514
  const event = parseFeishuBotAddedEventPayload(data);