@larksuite/openclaw-lark 2026.3.9

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 (689) hide show
  1. package/LICENSE +10 -0
  2. package/README.md +283 -0
  3. package/index.d.ts +37 -0
  4. package/index.d.ts.map +1 -0
  5. package/index.js +119 -0
  6. package/index.js.map +1 -0
  7. package/openclaw.plugin.json +10 -0
  8. package/package.json +47 -0
  9. package/skills/feishu-bitable/SKILL.md +248 -0
  10. package/skills/feishu-bitable/references/examples.md +813 -0
  11. package/skills/feishu-bitable/references/field-properties.md +763 -0
  12. package/skills/feishu-bitable/references/record-values.md +911 -0
  13. package/skills/feishu-calendar/SKILL.md +244 -0
  14. package/skills/feishu-channel-rules/SKILL.md +18 -0
  15. package/skills/feishu-channel-rules/references/markdown-syntax.md +138 -0
  16. package/skills/feishu-create-doc/SKILL.md +719 -0
  17. package/skills/feishu-fetch-doc/SKILL.md +93 -0
  18. package/skills/feishu-im-read/SKILL.md +163 -0
  19. package/skills/feishu-task/SKILL.md +293 -0
  20. package/skills/feishu-troubleshoot/SKILL.md +70 -0
  21. package/skills/feishu-update-doc/SKILL.md +285 -0
  22. package/src/card/builder.d.ts +100 -0
  23. package/src/card/builder.d.ts.map +1 -0
  24. package/src/card/builder.js +381 -0
  25. package/src/card/builder.js.map +1 -0
  26. package/src/card/cardkit.d.ts +91 -0
  27. package/src/card/cardkit.d.ts.map +1 -0
  28. package/src/card/cardkit.js +182 -0
  29. package/src/card/cardkit.js.map +1 -0
  30. package/src/card/flush-controller.d.ts +46 -0
  31. package/src/card/flush-controller.d.ts.map +1 -0
  32. package/src/card/flush-controller.js +135 -0
  33. package/src/card/flush-controller.js.map +1 -0
  34. package/src/card/markdown-style.d.ts +17 -0
  35. package/src/card/markdown-style.d.ts.map +1 -0
  36. package/src/card/markdown-style.js +98 -0
  37. package/src/card/markdown-style.js.map +1 -0
  38. package/src/card/reply-dispatcher-types.d.ts +121 -0
  39. package/src/card/reply-dispatcher-types.d.ts.map +1 -0
  40. package/src/card/reply-dispatcher-types.js +58 -0
  41. package/src/card/reply-dispatcher-types.js.map +1 -0
  42. package/src/card/reply-dispatcher.d.ts +16 -0
  43. package/src/card/reply-dispatcher.d.ts.map +1 -0
  44. package/src/card/reply-dispatcher.js +293 -0
  45. package/src/card/reply-dispatcher.js.map +1 -0
  46. package/src/card/reply-mode.d.ts +39 -0
  47. package/src/card/reply-mode.d.ts.map +1 -0
  48. package/src/card/reply-mode.js +66 -0
  49. package/src/card/reply-mode.js.map +1 -0
  50. package/src/card/streaming-card-controller.d.ts +88 -0
  51. package/src/card/streaming-card-controller.d.ts.map +1 -0
  52. package/src/card/streaming-card-controller.js +717 -0
  53. package/src/card/streaming-card-controller.js.map +1 -0
  54. package/src/card/unavailable-guard.d.ts +36 -0
  55. package/src/card/unavailable-guard.d.ts.map +1 -0
  56. package/src/card/unavailable-guard.js +84 -0
  57. package/src/card/unavailable-guard.js.map +1 -0
  58. package/src/channel/abort-detect.d.ts +35 -0
  59. package/src/channel/abort-detect.d.ts.map +1 -0
  60. package/src/channel/abort-detect.js +125 -0
  61. package/src/channel/abort-detect.js.map +1 -0
  62. package/src/channel/chat-queue.d.ts +42 -0
  63. package/src/channel/chat-queue.d.ts.map +1 -0
  64. package/src/channel/chat-queue.js +59 -0
  65. package/src/channel/chat-queue.js.map +1 -0
  66. package/src/channel/config-adapter.d.ts +24 -0
  67. package/src/channel/config-adapter.d.ts.map +1 -0
  68. package/src/channel/config-adapter.js +102 -0
  69. package/src/channel/config-adapter.js.map +1 -0
  70. package/src/channel/directory.d.ts +58 -0
  71. package/src/channel/directory.d.ts.map +1 -0
  72. package/src/channel/directory.js +192 -0
  73. package/src/channel/directory.js.map +1 -0
  74. package/src/channel/event-handlers.d.ts +16 -0
  75. package/src/channel/event-handlers.d.ts.map +1 -0
  76. package/src/channel/event-handlers.js +222 -0
  77. package/src/channel/event-handlers.js.map +1 -0
  78. package/src/channel/monitor.d.ts +18 -0
  79. package/src/channel/monitor.d.ts.map +1 -0
  80. package/src/channel/monitor.js +128 -0
  81. package/src/channel/monitor.js.map +1 -0
  82. package/src/channel/onboarding-config.d.ts +18 -0
  83. package/src/channel/onboarding-config.d.ts.map +1 -0
  84. package/src/channel/onboarding-config.js +89 -0
  85. package/src/channel/onboarding-config.js.map +1 -0
  86. package/src/channel/onboarding-migrate.d.ts +26 -0
  87. package/src/channel/onboarding-migrate.d.ts.map +1 -0
  88. package/src/channel/onboarding-migrate.js +68 -0
  89. package/src/channel/onboarding-migrate.js.map +1 -0
  90. package/src/channel/onboarding.d.ts +13 -0
  91. package/src/channel/onboarding.d.ts.map +1 -0
  92. package/src/channel/onboarding.js +297 -0
  93. package/src/channel/onboarding.js.map +1 -0
  94. package/src/channel/plugin.d.ts +14 -0
  95. package/src/channel/plugin.d.ts.map +1 -0
  96. package/src/channel/plugin.js +279 -0
  97. package/src/channel/plugin.js.map +1 -0
  98. package/src/channel/probe.d.ts +15 -0
  99. package/src/channel/probe.d.ts.map +1 -0
  100. package/src/channel/probe.js +22 -0
  101. package/src/channel/probe.js.map +1 -0
  102. package/src/channel/types.d.ts +37 -0
  103. package/src/channel/types.d.ts.map +1 -0
  104. package/src/channel/types.js +8 -0
  105. package/src/channel/types.js.map +1 -0
  106. package/src/commands/auth.d.ts +16 -0
  107. package/src/commands/auth.d.ts.map +1 -0
  108. package/src/commands/auth.js +85 -0
  109. package/src/commands/auth.js.map +1 -0
  110. package/src/commands/diagnose.d.ts +70 -0
  111. package/src/commands/diagnose.d.ts.map +1 -0
  112. package/src/commands/diagnose.js +808 -0
  113. package/src/commands/diagnose.js.map +1 -0
  114. package/src/commands/doctor.d.ts +18 -0
  115. package/src/commands/doctor.d.ts.map +1 -0
  116. package/src/commands/doctor.js +439 -0
  117. package/src/commands/doctor.js.map +1 -0
  118. package/src/commands/index.d.ts +9 -0
  119. package/src/commands/index.d.ts.map +1 -0
  120. package/src/commands/index.js +208 -0
  121. package/src/commands/index.js.map +1 -0
  122. package/src/core/accounts.d.ts +38 -0
  123. package/src/core/accounts.d.ts.map +1 -0
  124. package/src/core/accounts.js +179 -0
  125. package/src/core/accounts.js.map +1 -0
  126. package/src/core/agent-config.d.ts +101 -0
  127. package/src/core/agent-config.d.ts.map +1 -0
  128. package/src/core/agent-config.js +140 -0
  129. package/src/core/agent-config.js.map +1 -0
  130. package/src/core/api-error.d.ts +49 -0
  131. package/src/core/api-error.d.ts.map +1 -0
  132. package/src/core/api-error.js +113 -0
  133. package/src/core/api-error.js.map +1 -0
  134. package/src/core/app-owner-fallback.d.ts +22 -0
  135. package/src/core/app-owner-fallback.d.ts.map +1 -0
  136. package/src/core/app-owner-fallback.js +39 -0
  137. package/src/core/app-owner-fallback.js.map +1 -0
  138. package/src/core/app-scope-checker.d.ts +88 -0
  139. package/src/core/app-scope-checker.d.ts.map +1 -0
  140. package/src/core/app-scope-checker.js +191 -0
  141. package/src/core/app-scope-checker.js.map +1 -0
  142. package/src/core/auth-errors.d.ts +143 -0
  143. package/src/core/auth-errors.d.ts.map +1 -0
  144. package/src/core/auth-errors.js +156 -0
  145. package/src/core/auth-errors.js.map +1 -0
  146. package/src/core/chat-info-cache.d.ts +58 -0
  147. package/src/core/chat-info-cache.d.ts.map +1 -0
  148. package/src/core/chat-info-cache.js +153 -0
  149. package/src/core/chat-info-cache.js.map +1 -0
  150. package/src/core/config-schema.d.ts +449 -0
  151. package/src/core/config-schema.d.ts.map +1 -0
  152. package/src/core/config-schema.js +201 -0
  153. package/src/core/config-schema.js.map +1 -0
  154. package/src/core/device-flow.d.ts +78 -0
  155. package/src/core/device-flow.d.ts.map +1 -0
  156. package/src/core/device-flow.js +213 -0
  157. package/src/core/device-flow.js.map +1 -0
  158. package/src/core/feishu-fetch.d.ts +19 -0
  159. package/src/core/feishu-fetch.d.ts.map +1 -0
  160. package/src/core/feishu-fetch.js +26 -0
  161. package/src/core/feishu-fetch.js.map +1 -0
  162. package/src/core/footer-config.d.ts +25 -0
  163. package/src/core/footer-config.d.ts.map +1 -0
  164. package/src/core/footer-config.js +40 -0
  165. package/src/core/footer-config.js.map +1 -0
  166. package/src/core/lark-client.d.ts +109 -0
  167. package/src/core/lark-client.d.ts.map +1 -0
  168. package/src/core/lark-client.js +354 -0
  169. package/src/core/lark-client.js.map +1 -0
  170. package/src/core/lark-logger.d.ts +24 -0
  171. package/src/core/lark-logger.d.ts.map +1 -0
  172. package/src/core/lark-logger.js +155 -0
  173. package/src/core/lark-logger.js.map +1 -0
  174. package/src/core/lark-ticket.d.ts +30 -0
  175. package/src/core/lark-ticket.d.ts.map +1 -0
  176. package/src/core/lark-ticket.js +36 -0
  177. package/src/core/lark-ticket.js.map +1 -0
  178. package/src/core/message-unavailable.d.ts +54 -0
  179. package/src/core/message-unavailable.d.ts.map +1 -0
  180. package/src/core/message-unavailable.js +131 -0
  181. package/src/core/message-unavailable.js.map +1 -0
  182. package/src/core/owner-policy.d.ts +32 -0
  183. package/src/core/owner-policy.d.ts.map +1 -0
  184. package/src/core/owner-policy.js +53 -0
  185. package/src/core/owner-policy.js.map +1 -0
  186. package/src/core/permission-url.d.ts +23 -0
  187. package/src/core/permission-url.d.ts.map +1 -0
  188. package/src/core/permission-url.js +73 -0
  189. package/src/core/permission-url.js.map +1 -0
  190. package/src/core/raw-request.d.ts +28 -0
  191. package/src/core/raw-request.d.ts.map +1 -0
  192. package/src/core/raw-request.js +63 -0
  193. package/src/core/raw-request.js.map +1 -0
  194. package/src/core/scope-manager.d.ts +169 -0
  195. package/src/core/scope-manager.d.ts.map +1 -0
  196. package/src/core/scope-manager.js +214 -0
  197. package/src/core/scope-manager.js.map +1 -0
  198. package/src/core/security-check.d.ts +73 -0
  199. package/src/core/security-check.d.ts.map +1 -0
  200. package/src/core/security-check.js +175 -0
  201. package/src/core/security-check.js.map +1 -0
  202. package/src/core/shutdown-hooks.d.ts +23 -0
  203. package/src/core/shutdown-hooks.d.ts.map +1 -0
  204. package/src/core/shutdown-hooks.js +57 -0
  205. package/src/core/shutdown-hooks.js.map +1 -0
  206. package/src/core/targets.d.ts +50 -0
  207. package/src/core/targets.d.ts.map +1 -0
  208. package/src/core/targets.js +128 -0
  209. package/src/core/targets.js.map +1 -0
  210. package/src/core/token-store.d.ts +55 -0
  211. package/src/core/token-store.d.ts.map +1 -0
  212. package/src/core/token-store.js +315 -0
  213. package/src/core/token-store.js.map +1 -0
  214. package/src/core/tool-client.d.ts +177 -0
  215. package/src/core/tool-client.d.ts.map +1 -0
  216. package/src/core/tool-client.js +381 -0
  217. package/src/core/tool-client.js.map +1 -0
  218. package/src/core/tool-scopes.d.ts +154 -0
  219. package/src/core/tool-scopes.d.ts.map +1 -0
  220. package/src/core/tool-scopes.js +326 -0
  221. package/src/core/tool-scopes.js.map +1 -0
  222. package/src/core/tools-config.d.ts +35 -0
  223. package/src/core/tools-config.d.ts.map +1 -0
  224. package/src/core/tools-config.js +88 -0
  225. package/src/core/tools-config.js.map +1 -0
  226. package/src/core/types.d.ts +88 -0
  227. package/src/core/types.d.ts.map +1 -0
  228. package/src/core/types.js +12 -0
  229. package/src/core/types.js.map +1 -0
  230. package/src/core/uat-client.d.ts +47 -0
  231. package/src/core/uat-client.d.ts.map +1 -0
  232. package/src/core/uat-client.js +173 -0
  233. package/src/core/uat-client.js.map +1 -0
  234. package/src/core/version.d.ts +26 -0
  235. package/src/core/version.d.ts.map +1 -0
  236. package/src/core/version.js +50 -0
  237. package/src/core/version.js.map +1 -0
  238. package/src/messaging/converters/audio.d.ts +9 -0
  239. package/src/messaging/converters/audio.d.ts.map +1 -0
  240. package/src/messaging/converters/audio.js +22 -0
  241. package/src/messaging/converters/audio.js.map +1 -0
  242. package/src/messaging/converters/calendar.d.ts +14 -0
  243. package/src/messaging/converters/calendar.d.ts.map +1 -0
  244. package/src/messaging/converters/calendar.js +51 -0
  245. package/src/messaging/converters/calendar.js.map +1 -0
  246. package/src/messaging/converters/content-converter.d.ts +42 -0
  247. package/src/messaging/converters/content-converter.d.ts.map +1 -0
  248. package/src/messaging/converters/content-converter.js +107 -0
  249. package/src/messaging/converters/content-converter.js.map +1 -0
  250. package/src/messaging/converters/file.d.ts +9 -0
  251. package/src/messaging/converters/file.d.ts.map +1 -0
  252. package/src/messaging/converters/file.js +21 -0
  253. package/src/messaging/converters/file.js.map +1 -0
  254. package/src/messaging/converters/folder.d.ts +9 -0
  255. package/src/messaging/converters/folder.d.ts.map +1 -0
  256. package/src/messaging/converters/folder.js +21 -0
  257. package/src/messaging/converters/folder.js.map +1 -0
  258. package/src/messaging/converters/hongbao.d.ts +9 -0
  259. package/src/messaging/converters/hongbao.d.ts.map +1 -0
  260. package/src/messaging/converters/hongbao.js +17 -0
  261. package/src/messaging/converters/hongbao.js.map +1 -0
  262. package/src/messaging/converters/image.d.ts +9 -0
  263. package/src/messaging/converters/image.d.ts.map +1 -0
  264. package/src/messaging/converters/image.js +19 -0
  265. package/src/messaging/converters/image.js.map +1 -0
  266. package/src/messaging/converters/index.d.ts +9 -0
  267. package/src/messaging/converters/index.d.ts.map +1 -0
  268. package/src/messaging/converters/index.js +51 -0
  269. package/src/messaging/converters/index.js.map +1 -0
  270. package/src/messaging/converters/interactive/card-converter.d.ts +77 -0
  271. package/src/messaging/converters/interactive/card-converter.d.ts.map +1 -0
  272. package/src/messaging/converters/interactive/card-converter.js +1174 -0
  273. package/src/messaging/converters/interactive/card-converter.js.map +1 -0
  274. package/src/messaging/converters/interactive/card-utils.d.ts +10 -0
  275. package/src/messaging/converters/interactive/card-utils.d.ts.map +1 -0
  276. package/src/messaging/converters/interactive/card-utils.js +43 -0
  277. package/src/messaging/converters/interactive/card-utils.js.map +1 -0
  278. package/src/messaging/converters/interactive/index.d.ts +9 -0
  279. package/src/messaging/converters/interactive/index.d.ts.map +1 -0
  280. package/src/messaging/converters/interactive/index.js +22 -0
  281. package/src/messaging/converters/interactive/index.js.map +1 -0
  282. package/src/messaging/converters/interactive/legacy.d.ts +12 -0
  283. package/src/messaging/converters/interactive/legacy.d.ts.map +1 -0
  284. package/src/messaging/converters/interactive/legacy.js +58 -0
  285. package/src/messaging/converters/interactive/legacy.js.map +1 -0
  286. package/src/messaging/converters/interactive/types.d.ts +24 -0
  287. package/src/messaging/converters/interactive/types.d.ts.map +1 -0
  288. package/src/messaging/converters/interactive/types.js +25 -0
  289. package/src/messaging/converters/interactive/types.js.map +1 -0
  290. package/src/messaging/converters/location.d.ts +9 -0
  291. package/src/messaging/converters/location.d.ts.map +1 -0
  292. package/src/messaging/converters/location.js +20 -0
  293. package/src/messaging/converters/location.js.map +1 -0
  294. package/src/messaging/converters/merge-forward.d.ts +33 -0
  295. package/src/messaging/converters/merge-forward.d.ts.map +1 -0
  296. package/src/messaging/converters/merge-forward.js +226 -0
  297. package/src/messaging/converters/merge-forward.js.map +1 -0
  298. package/src/messaging/converters/post.d.ts +12 -0
  299. package/src/messaging/converters/post.d.ts.map +1 -0
  300. package/src/messaging/converters/post.js +136 -0
  301. package/src/messaging/converters/post.js.map +1 -0
  302. package/src/messaging/converters/share.d.ts +10 -0
  303. package/src/messaging/converters/share.d.ts.map +1 -0
  304. package/src/messaging/converters/share.js +24 -0
  305. package/src/messaging/converters/share.js.map +1 -0
  306. package/src/messaging/converters/sticker.d.ts +9 -0
  307. package/src/messaging/converters/sticker.d.ts.map +1 -0
  308. package/src/messaging/converters/sticker.js +19 -0
  309. package/src/messaging/converters/sticker.js.map +1 -0
  310. package/src/messaging/converters/system.d.ts +13 -0
  311. package/src/messaging/converters/system.d.ts.map +1 -0
  312. package/src/messaging/converters/system.js +33 -0
  313. package/src/messaging/converters/system.js.map +1 -0
  314. package/src/messaging/converters/text.d.ts +9 -0
  315. package/src/messaging/converters/text.d.ts.map +1 -0
  316. package/src/messaging/converters/text.js +15 -0
  317. package/src/messaging/converters/text.js.map +1 -0
  318. package/src/messaging/converters/todo.d.ts +9 -0
  319. package/src/messaging/converters/todo.d.ts.map +1 -0
  320. package/src/messaging/converters/todo.js +42 -0
  321. package/src/messaging/converters/todo.js.map +1 -0
  322. package/src/messaging/converters/types.d.ts +108 -0
  323. package/src/messaging/converters/types.d.ts.map +1 -0
  324. package/src/messaging/converters/types.js +8 -0
  325. package/src/messaging/converters/types.js.map +1 -0
  326. package/src/messaging/converters/unknown.d.ts +9 -0
  327. package/src/messaging/converters/unknown.d.ts.map +1 -0
  328. package/src/messaging/converters/unknown.js +17 -0
  329. package/src/messaging/converters/unknown.js.map +1 -0
  330. package/src/messaging/converters/utils.d.ts +23 -0
  331. package/src/messaging/converters/utils.d.ts.map +1 -0
  332. package/src/messaging/converters/utils.js +52 -0
  333. package/src/messaging/converters/utils.js.map +1 -0
  334. package/src/messaging/converters/video-chat.d.ts +9 -0
  335. package/src/messaging/converters/video-chat.d.ts.map +1 -0
  336. package/src/messaging/converters/video-chat.js +24 -0
  337. package/src/messaging/converters/video-chat.js.map +1 -0
  338. package/src/messaging/converters/video.d.ts +9 -0
  339. package/src/messaging/converters/video.d.ts.map +1 -0
  340. package/src/messaging/converters/video.js +33 -0
  341. package/src/messaging/converters/video.js.map +1 -0
  342. package/src/messaging/converters/vote.d.ts +9 -0
  343. package/src/messaging/converters/vote.d.ts.map +1 -0
  344. package/src/messaging/converters/vote.js +25 -0
  345. package/src/messaging/converters/vote.js.map +1 -0
  346. package/src/messaging/inbound/dedup.d.ts +60 -0
  347. package/src/messaging/inbound/dedup.d.ts.map +1 -0
  348. package/src/messaging/inbound/dedup.js +117 -0
  349. package/src/messaging/inbound/dedup.js.map +1 -0
  350. package/src/messaging/inbound/dispatch-builders.d.ts +84 -0
  351. package/src/messaging/inbound/dispatch-builders.d.ts.map +1 -0
  352. package/src/messaging/inbound/dispatch-builders.js +153 -0
  353. package/src/messaging/inbound/dispatch-builders.js.map +1 -0
  354. package/src/messaging/inbound/dispatch-commands.d.ts +28 -0
  355. package/src/messaging/inbound/dispatch-commands.d.ts.map +1 -0
  356. package/src/messaging/inbound/dispatch-commands.js +113 -0
  357. package/src/messaging/inbound/dispatch-commands.js.map +1 -0
  358. package/src/messaging/inbound/dispatch-context.d.ts +68 -0
  359. package/src/messaging/inbound/dispatch-context.d.ts.map +1 -0
  360. package/src/messaging/inbound/dispatch-context.js +137 -0
  361. package/src/messaging/inbound/dispatch-context.js.map +1 -0
  362. package/src/messaging/inbound/dispatch.d.ts +48 -0
  363. package/src/messaging/inbound/dispatch.d.ts.map +1 -0
  364. package/src/messaging/inbound/dispatch.js +193 -0
  365. package/src/messaging/inbound/dispatch.js.map +1 -0
  366. package/src/messaging/inbound/enrich.d.ts +103 -0
  367. package/src/messaging/inbound/enrich.d.ts.map +1 -0
  368. package/src/messaging/inbound/enrich.js +228 -0
  369. package/src/messaging/inbound/enrich.js.map +1 -0
  370. package/src/messaging/inbound/gate-effects.d.ts +24 -0
  371. package/src/messaging/inbound/gate-effects.d.ts.map +1 -0
  372. package/src/messaging/inbound/gate-effects.js +44 -0
  373. package/src/messaging/inbound/gate-effects.js.map +1 -0
  374. package/src/messaging/inbound/gate.d.ts +61 -0
  375. package/src/messaging/inbound/gate.d.ts.map +1 -0
  376. package/src/messaging/inbound/gate.js +234 -0
  377. package/src/messaging/inbound/gate.js.map +1 -0
  378. package/src/messaging/inbound/handler.d.ts +36 -0
  379. package/src/messaging/inbound/handler.d.ts.map +1 -0
  380. package/src/messaging/inbound/handler.js +174 -0
  381. package/src/messaging/inbound/handler.js.map +1 -0
  382. package/src/messaging/inbound/media-resolver.d.ts +33 -0
  383. package/src/messaging/inbound/media-resolver.d.ts.map +1 -0
  384. package/src/messaging/inbound/media-resolver.js +88 -0
  385. package/src/messaging/inbound/media-resolver.js.map +1 -0
  386. package/src/messaging/inbound/mention.d.ts +40 -0
  387. package/src/messaging/inbound/mention.d.ts.map +1 -0
  388. package/src/messaging/inbound/mention.js +82 -0
  389. package/src/messaging/inbound/mention.js.map +1 -0
  390. package/src/messaging/inbound/parse-io.d.ts +51 -0
  391. package/src/messaging/inbound/parse-io.d.ts.map +1 -0
  392. package/src/messaging/inbound/parse-io.js +82 -0
  393. package/src/messaging/inbound/parse-io.js.map +1 -0
  394. package/src/messaging/inbound/parse.d.ts +29 -0
  395. package/src/messaging/inbound/parse.d.ts.map +1 -0
  396. package/src/messaging/inbound/parse.js +107 -0
  397. package/src/messaging/inbound/parse.js.map +1 -0
  398. package/src/messaging/inbound/permission.d.ts +18 -0
  399. package/src/messaging/inbound/permission.d.ts.map +1 -0
  400. package/src/messaging/inbound/permission.js +41 -0
  401. package/src/messaging/inbound/permission.js.map +1 -0
  402. package/src/messaging/inbound/policy.d.ts +95 -0
  403. package/src/messaging/inbound/policy.d.ts.map +1 -0
  404. package/src/messaging/inbound/policy.js +161 -0
  405. package/src/messaging/inbound/policy.js.map +1 -0
  406. package/src/messaging/inbound/reaction-handler.d.ts +62 -0
  407. package/src/messaging/inbound/reaction-handler.d.ts.map +1 -0
  408. package/src/messaging/inbound/reaction-handler.js +221 -0
  409. package/src/messaging/inbound/reaction-handler.js.map +1 -0
  410. package/src/messaging/inbound/user-name-cache.d.ts +83 -0
  411. package/src/messaging/inbound/user-name-cache.d.ts.map +1 -0
  412. package/src/messaging/inbound/user-name-cache.js +242 -0
  413. package/src/messaging/inbound/user-name-cache.js.map +1 -0
  414. package/src/messaging/outbound/actions.d.ts +17 -0
  415. package/src/messaging/outbound/actions.d.ts.map +1 -0
  416. package/src/messaging/outbound/actions.js +310 -0
  417. package/src/messaging/outbound/actions.js.map +1 -0
  418. package/src/messaging/outbound/chat-manage.d.ts +65 -0
  419. package/src/messaging/outbound/chat-manage.d.ts.map +1 -0
  420. package/src/messaging/outbound/chat-manage.js +112 -0
  421. package/src/messaging/outbound/chat-manage.js.map +1 -0
  422. package/src/messaging/outbound/deliver.d.ts +156 -0
  423. package/src/messaging/outbound/deliver.d.ts.map +1 -0
  424. package/src/messaging/outbound/deliver.js +299 -0
  425. package/src/messaging/outbound/deliver.js.map +1 -0
  426. package/src/messaging/outbound/fetch.d.ts +13 -0
  427. package/src/messaging/outbound/fetch.d.ts.map +1 -0
  428. package/src/messaging/outbound/fetch.js +13 -0
  429. package/src/messaging/outbound/fetch.js.map +1 -0
  430. package/src/messaging/outbound/forward.d.ts +27 -0
  431. package/src/messaging/outbound/forward.d.ts.map +1 -0
  432. package/src/messaging/outbound/forward.js +49 -0
  433. package/src/messaging/outbound/forward.js.map +1 -0
  434. package/src/messaging/outbound/media-url-utils.d.ts +30 -0
  435. package/src/messaging/outbound/media-url-utils.d.ts.map +1 -0
  436. package/src/messaging/outbound/media-url-utils.js +131 -0
  437. package/src/messaging/outbound/media-url-utils.js.map +1 -0
  438. package/src/messaging/outbound/media.d.ts +256 -0
  439. package/src/messaging/outbound/media.d.ts.map +1 -0
  440. package/src/messaging/outbound/media.js +749 -0
  441. package/src/messaging/outbound/media.js.map +1 -0
  442. package/src/messaging/outbound/outbound.d.ts +90 -0
  443. package/src/messaging/outbound/outbound.d.ts.map +1 -0
  444. package/src/messaging/outbound/outbound.js +112 -0
  445. package/src/messaging/outbound/outbound.js.map +1 -0
  446. package/src/messaging/outbound/reactions.d.ts +125 -0
  447. package/src/messaging/outbound/reactions.d.ts.map +1 -0
  448. package/src/messaging/outbound/reactions.js +379 -0
  449. package/src/messaging/outbound/reactions.js.map +1 -0
  450. package/src/messaging/outbound/send.d.ts +136 -0
  451. package/src/messaging/outbound/send.d.ts.map +1 -0
  452. package/src/messaging/outbound/send.js +289 -0
  453. package/src/messaging/outbound/send.js.map +1 -0
  454. package/src/messaging/outbound/typing.d.ts +61 -0
  455. package/src/messaging/outbound/typing.d.ts.map +1 -0
  456. package/src/messaging/outbound/typing.js +136 -0
  457. package/src/messaging/outbound/typing.js.map +1 -0
  458. package/src/messaging/shared/message-lookup.d.ts +55 -0
  459. package/src/messaging/shared/message-lookup.d.ts.map +1 -0
  460. package/src/messaging/shared/message-lookup.js +118 -0
  461. package/src/messaging/shared/message-lookup.js.map +1 -0
  462. package/src/messaging/types.d.ts +177 -0
  463. package/src/messaging/types.d.ts.map +1 -0
  464. package/src/messaging/types.js +11 -0
  465. package/src/messaging/types.js.map +1 -0
  466. package/src/tools/auto-auth.d.ts +57 -0
  467. package/src/tools/auto-auth.d.ts.map +1 -0
  468. package/src/tools/auto-auth.js +925 -0
  469. package/src/tools/auto-auth.js.map +1 -0
  470. package/src/tools/helpers.d.ts +220 -0
  471. package/src/tools/helpers.d.ts.map +1 -0
  472. package/src/tools/helpers.js +298 -0
  473. package/src/tools/helpers.js.map +1 -0
  474. package/src/tools/mcp/doc/create.d.ts +13 -0
  475. package/src/tools/mcp/doc/create.d.ts.map +1 -0
  476. package/src/tools/mcp/doc/create.js +45 -0
  477. package/src/tools/mcp/doc/create.js.map +1 -0
  478. package/src/tools/mcp/doc/fetch.d.ts +13 -0
  479. package/src/tools/mcp/doc/fetch.d.ts.map +1 -0
  480. package/src/tools/mcp/doc/fetch.js +37 -0
  481. package/src/tools/mcp/doc/fetch.js.map +1 -0
  482. package/src/tools/mcp/doc/index.d.ts +13 -0
  483. package/src/tools/mcp/doc/index.d.ts.map +1 -0
  484. package/src/tools/mcp/doc/index.js +42 -0
  485. package/src/tools/mcp/doc/index.js.map +1 -0
  486. package/src/tools/mcp/doc/update.d.ts +13 -0
  487. package/src/tools/mcp/doc/update.d.ts.map +1 -0
  488. package/src/tools/mcp/doc/update.js +62 -0
  489. package/src/tools/mcp/doc/update.js.map +1 -0
  490. package/src/tools/mcp/shared.d.ts +58 -0
  491. package/src/tools/mcp/shared.d.ts.map +1 -0
  492. package/src/tools/mcp/shared.js +224 -0
  493. package/src/tools/mcp/shared.js.map +1 -0
  494. package/src/tools/oapi/bitable/app-table-field.d.ts +17 -0
  495. package/src/tools/oapi/bitable/app-table-field.d.ts.map +1 -0
  496. package/src/tools/oapi/bitable/app-table-field.js +224 -0
  497. package/src/tools/oapi/bitable/app-table-field.js.map +1 -0
  498. package/src/tools/oapi/bitable/app-table-record.d.ts +21 -0
  499. package/src/tools/oapi/bitable/app-table-record.d.ts.map +1 -0
  500. package/src/tools/oapi/bitable/app-table-record.js +449 -0
  501. package/src/tools/oapi/bitable/app-table-record.js.map +1 -0
  502. package/src/tools/oapi/bitable/app-table-view.d.ts +18 -0
  503. package/src/tools/oapi/bitable/app-table-view.d.ts.map +1 -0
  504. package/src/tools/oapi/bitable/app-table-view.js +197 -0
  505. package/src/tools/oapi/bitable/app-table-view.js.map +1 -0
  506. package/src/tools/oapi/bitable/app-table.d.ts +20 -0
  507. package/src/tools/oapi/bitable/app-table.d.ts.map +1 -0
  508. package/src/tools/oapi/bitable/app-table.js +249 -0
  509. package/src/tools/oapi/bitable/app-table.js.map +1 -0
  510. package/src/tools/oapi/bitable/app.d.ts +19 -0
  511. package/src/tools/oapi/bitable/app.d.ts.map +1 -0
  512. package/src/tools/oapi/bitable/app.js +188 -0
  513. package/src/tools/oapi/bitable/app.js.map +1 -0
  514. package/src/tools/oapi/bitable/index.d.ts +10 -0
  515. package/src/tools/oapi/bitable/index.d.ts.map +1 -0
  516. package/src/tools/oapi/bitable/index.js +10 -0
  517. package/src/tools/oapi/bitable/index.js.map +1 -0
  518. package/src/tools/oapi/calendar/calendar.d.ts +16 -0
  519. package/src/tools/oapi/calendar/calendar.d.ts.map +1 -0
  520. package/src/tools/oapi/calendar/calendar.js +124 -0
  521. package/src/tools/oapi/calendar/calendar.js.map +1 -0
  522. package/src/tools/oapi/calendar/event-attendee.d.ts +17 -0
  523. package/src/tools/oapi/calendar/event-attendee.d.ts.map +1 -0
  524. package/src/tools/oapi/calendar/event-attendee.js +275 -0
  525. package/src/tools/oapi/calendar/event-attendee.js.map +1 -0
  526. package/src/tools/oapi/calendar/event.d.ts +17 -0
  527. package/src/tools/oapi/calendar/event.d.ts.map +1 -0
  528. package/src/tools/oapi/calendar/event.js +721 -0
  529. package/src/tools/oapi/calendar/event.js.map +1 -0
  530. package/src/tools/oapi/calendar/freebusy.d.ts +14 -0
  531. package/src/tools/oapi/calendar/freebusy.d.ts.map +1 -0
  532. package/src/tools/oapi/calendar/freebusy.js +113 -0
  533. package/src/tools/oapi/calendar/freebusy.js.map +1 -0
  534. package/src/tools/oapi/calendar/index.d.ts +9 -0
  535. package/src/tools/oapi/calendar/index.d.ts.map +1 -0
  536. package/src/tools/oapi/calendar/index.js +9 -0
  537. package/src/tools/oapi/calendar/index.js.map +1 -0
  538. package/src/tools/oapi/chat/chat.d.ts +17 -0
  539. package/src/tools/oapi/chat/chat.d.ts.map +1 -0
  540. package/src/tools/oapi/chat/chat.js +126 -0
  541. package/src/tools/oapi/chat/chat.js.map +1 -0
  542. package/src/tools/oapi/chat/index.d.ts +11 -0
  543. package/src/tools/oapi/chat/index.d.ts.map +1 -0
  544. package/src/tools/oapi/chat/index.js +16 -0
  545. package/src/tools/oapi/chat/index.js.map +1 -0
  546. package/src/tools/oapi/chat/members.d.ts +12 -0
  547. package/src/tools/oapi/chat/members.d.ts.map +1 -0
  548. package/src/tools/oapi/chat/members.js +83 -0
  549. package/src/tools/oapi/chat/members.js.map +1 -0
  550. package/src/tools/oapi/common/get-user.d.ts +13 -0
  551. package/src/tools/oapi/common/get-user.d.ts.map +1 -0
  552. package/src/tools/oapi/common/get-user.js +108 -0
  553. package/src/tools/oapi/common/get-user.js.map +1 -0
  554. package/src/tools/oapi/common/index.d.ts +7 -0
  555. package/src/tools/oapi/common/index.d.ts.map +1 -0
  556. package/src/tools/oapi/common/index.js +7 -0
  557. package/src/tools/oapi/common/index.js.map +1 -0
  558. package/src/tools/oapi/common/search-user.d.ts +12 -0
  559. package/src/tools/oapi/common/search-user.d.ts.map +1 -0
  560. package/src/tools/oapi/common/search-user.js +75 -0
  561. package/src/tools/oapi/common/search-user.js.map +1 -0
  562. package/src/tools/oapi/drive/doc-comments.d.ts +16 -0
  563. package/src/tools/oapi/drive/doc-comments.d.ts.map +1 -0
  564. package/src/tools/oapi/drive/doc-comments.js +288 -0
  565. package/src/tools/oapi/drive/doc-comments.js.map +1 -0
  566. package/src/tools/oapi/drive/doc-media.d.ts +20 -0
  567. package/src/tools/oapi/drive/doc-media.d.ts.map +1 -0
  568. package/src/tools/oapi/drive/doc-media.js +337 -0
  569. package/src/tools/oapi/drive/doc-media.js.map +1 -0
  570. package/src/tools/oapi/drive/file.d.ts +20 -0
  571. package/src/tools/oapi/drive/file.d.ts.map +1 -0
  572. package/src/tools/oapi/drive/file.js +485 -0
  573. package/src/tools/oapi/drive/file.js.map +1 -0
  574. package/src/tools/oapi/drive/index.d.ts +13 -0
  575. package/src/tools/oapi/drive/index.d.ts.map +1 -0
  576. package/src/tools/oapi/drive/index.js +37 -0
  577. package/src/tools/oapi/drive/index.js.map +1 -0
  578. package/src/tools/oapi/helpers.d.ts +174 -0
  579. package/src/tools/oapi/helpers.d.ts.map +1 -0
  580. package/src/tools/oapi/helpers.js +341 -0
  581. package/src/tools/oapi/helpers.js.map +1 -0
  582. package/src/tools/oapi/im/format-messages.d.ts +51 -0
  583. package/src/tools/oapi/im/format-messages.d.ts.map +1 -0
  584. package/src/tools/oapi/im/format-messages.js +166 -0
  585. package/src/tools/oapi/im/format-messages.js.map +1 -0
  586. package/src/tools/oapi/im/index.d.ts +11 -0
  587. package/src/tools/oapi/im/index.d.ts.map +1 -0
  588. package/src/tools/oapi/im/index.js +18 -0
  589. package/src/tools/oapi/im/index.js.map +1 -0
  590. package/src/tools/oapi/im/message-read.d.ts +14 -0
  591. package/src/tools/oapi/im/message-read.d.ts.map +1 -0
  592. package/src/tools/oapi/im/message-read.js +412 -0
  593. package/src/tools/oapi/im/message-read.js.map +1 -0
  594. package/src/tools/oapi/im/message.d.ts +17 -0
  595. package/src/tools/oapi/im/message.d.ts.map +1 -0
  596. package/src/tools/oapi/im/message.js +171 -0
  597. package/src/tools/oapi/im/message.js.map +1 -0
  598. package/src/tools/oapi/im/resource.d.ts +14 -0
  599. package/src/tools/oapi/im/resource.d.ts.map +1 -0
  600. package/src/tools/oapi/im/resource.js +152 -0
  601. package/src/tools/oapi/im/resource.js.map +1 -0
  602. package/src/tools/oapi/im/time-utils.d.ts +47 -0
  603. package/src/tools/oapi/im/time-utils.d.ts.map +1 -0
  604. package/src/tools/oapi/im/time-utils.js +202 -0
  605. package/src/tools/oapi/im/time-utils.js.map +1 -0
  606. package/src/tools/oapi/im/user-name-uat.d.ts +24 -0
  607. package/src/tools/oapi/im/user-name-uat.d.ts.map +1 -0
  608. package/src/tools/oapi/im/user-name-uat.js +128 -0
  609. package/src/tools/oapi/im/user-name-uat.js.map +1 -0
  610. package/src/tools/oapi/index.d.ts +12 -0
  611. package/src/tools/oapi/index.d.ts.map +1 -0
  612. package/src/tools/oapi/index.js +59 -0
  613. package/src/tools/oapi/index.js.map +1 -0
  614. package/src/tools/oapi/sdk-types.d.ts +97 -0
  615. package/src/tools/oapi/sdk-types.d.ts.map +1 -0
  616. package/src/tools/oapi/sdk-types.js +13 -0
  617. package/src/tools/oapi/sdk-types.js.map +1 -0
  618. package/src/tools/oapi/search/doc-search.d.ts +14 -0
  619. package/src/tools/oapi/search/doc-search.d.ts.map +1 -0
  620. package/src/tools/oapi/search/doc-search.js +203 -0
  621. package/src/tools/oapi/search/doc-search.js.map +1 -0
  622. package/src/tools/oapi/search/index.d.ts +13 -0
  623. package/src/tools/oapi/search/index.d.ts.map +1 -0
  624. package/src/tools/oapi/search/index.js +34 -0
  625. package/src/tools/oapi/search/index.js.map +1 -0
  626. package/src/tools/oapi/sheets/index.d.ts +13 -0
  627. package/src/tools/oapi/sheets/index.d.ts.map +1 -0
  628. package/src/tools/oapi/sheets/index.js +32 -0
  629. package/src/tools/oapi/sheets/index.js.map +1 -0
  630. package/src/tools/oapi/sheets/sheet.d.ts +17 -0
  631. package/src/tools/oapi/sheets/sheet.d.ts.map +1 -0
  632. package/src/tools/oapi/sheets/sheet.js +652 -0
  633. package/src/tools/oapi/sheets/sheet.js.map +1 -0
  634. package/src/tools/oapi/task/comment.d.ts +16 -0
  635. package/src/tools/oapi/task/comment.d.ts.map +1 -0
  636. package/src/tools/oapi/task/comment.js +142 -0
  637. package/src/tools/oapi/task/comment.js.map +1 -0
  638. package/src/tools/oapi/task/index.d.ts +9 -0
  639. package/src/tools/oapi/task/index.d.ts.map +1 -0
  640. package/src/tools/oapi/task/index.js +9 -0
  641. package/src/tools/oapi/task/index.js.map +1 -0
  642. package/src/tools/oapi/task/subtask.d.ts +15 -0
  643. package/src/tools/oapi/task/subtask.d.ts.map +1 -0
  644. package/src/tools/oapi/task/subtask.js +164 -0
  645. package/src/tools/oapi/task/subtask.js.map +1 -0
  646. package/src/tools/oapi/task/task.d.ts +17 -0
  647. package/src/tools/oapi/task/task.d.ts.map +1 -0
  648. package/src/tools/oapi/task/task.js +346 -0
  649. package/src/tools/oapi/task/task.js.map +1 -0
  650. package/src/tools/oapi/task/tasklist.d.ts +22 -0
  651. package/src/tools/oapi/task/tasklist.d.ts.map +1 -0
  652. package/src/tools/oapi/task/tasklist.js +323 -0
  653. package/src/tools/oapi/task/tasklist.js.map +1 -0
  654. package/src/tools/oapi/wiki/index.d.ts +13 -0
  655. package/src/tools/oapi/wiki/index.d.ts.map +1 -0
  656. package/src/tools/oapi/wiki/index.js +35 -0
  657. package/src/tools/oapi/wiki/index.js.map +1 -0
  658. package/src/tools/oapi/wiki/space-node.d.ts +18 -0
  659. package/src/tools/oapi/wiki/space-node.d.ts.map +1 -0
  660. package/src/tools/oapi/wiki/space-node.js +253 -0
  661. package/src/tools/oapi/wiki/space-node.js.map +1 -0
  662. package/src/tools/oapi/wiki/space.d.ts +16 -0
  663. package/src/tools/oapi/wiki/space.d.ts.map +1 -0
  664. package/src/tools/oapi/wiki/space.js +132 -0
  665. package/src/tools/oapi/wiki/space.js.map +1 -0
  666. package/src/tools/oauth-batch-auth.d.ts +12 -0
  667. package/src/tools/oauth-batch-auth.d.ts.map +1 -0
  668. package/src/tools/oauth-batch-auth.js +142 -0
  669. package/src/tools/oauth-batch-auth.js.map +1 -0
  670. package/src/tools/oauth-cards.d.ts +27 -0
  671. package/src/tools/oauth-cards.d.ts.map +1 -0
  672. package/src/tools/oauth-cards.js +251 -0
  673. package/src/tools/oauth-cards.js.map +1 -0
  674. package/src/tools/oauth.d.ts +48 -0
  675. package/src/tools/oauth.d.ts.map +1 -0
  676. package/src/tools/oauth.js +619 -0
  677. package/src/tools/oauth.js.map +1 -0
  678. package/src/tools/onboarding-auth.d.ts +28 -0
  679. package/src/tools/onboarding-auth.d.ts.map +1 -0
  680. package/src/tools/onboarding-auth.js +131 -0
  681. package/src/tools/onboarding-auth.js.map +1 -0
  682. package/src/tools/tat/im/index.d.ts +16 -0
  683. package/src/tools/tat/im/index.d.ts.map +1 -0
  684. package/src/tools/tat/im/index.js +19 -0
  685. package/src/tools/tat/im/index.js.map +1 -0
  686. package/src/tools/tat/im/resource.d.ts +16 -0
  687. package/src/tools/tat/im/resource.d.ts.map +1 -0
  688. package/src/tools/tat/im/resource.js +158 -0
  689. package/src/tools/tat/im/resource.js.map +1 -0
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Side-effect functions for the inbound message gate.
6
+ *
7
+ * Extracted from gate.ts to separate pure policy decisions from I/O
8
+ * operations (pairing request creation, message sending).
9
+ */
10
+ import { LarkClient } from '../../core/lark-client';
11
+ import { sendMessageFeishu } from '../outbound/send';
12
+ // ---------------------------------------------------------------------------
13
+ // Pairing reply
14
+ // ---------------------------------------------------------------------------
15
+ /**
16
+ * Create a pairing request and send a pairing reply message to the user.
17
+ *
18
+ * This is the side-effect portion of the DM pairing gate: the pure
19
+ * policy decision (whether to pair) is made in gate.ts, and this
20
+ * function executes the resulting I/O.
21
+ */
22
+ export async function sendPairingReply(params) {
23
+ const { senderId, chatId, accountId, accountScopedCfg } = params;
24
+ const core = LarkClient.runtime;
25
+ const { code } = await core.channel.pairing.upsertPairingRequest({
26
+ channel: 'feishu',
27
+ id: senderId,
28
+ accountId,
29
+ });
30
+ const pairingReply = core.channel.pairing.buildPairingReply({
31
+ channel: 'feishu',
32
+ idLine: senderId,
33
+ code,
34
+ });
35
+ if (accountScopedCfg) {
36
+ await sendMessageFeishu({
37
+ cfg: accountScopedCfg,
38
+ to: chatId,
39
+ text: pairingReply,
40
+ accountId,
41
+ });
42
+ }
43
+ }
44
+ //# sourceMappingURL=gate-effects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-effects.js","sourceRoot":"","sources":["../../../../src/messaging/inbound/gate-effects.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAKtC;IACC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;IACjE,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC;IAEhC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC;QAC/D,OAAO,EAAE,QAAQ;QACjB,EAAE,EAAE,QAAQ;QACZ,SAAS;KACV,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC1D,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,QAAQ;QAChB,IAAI;KACL,CAAC,CAAC;IAEH,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,iBAAiB,CAAC;YACtB,GAAG,EAAE,gBAAgB;YACrB,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,YAAY;YAClB,SAAS;SACV,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Policy gate for inbound Feishu messages.
6
+ *
7
+ * Determines whether a parsed message should be processed or rejected
8
+ * based on group/DM access policies, sender allowlists, and mention
9
+ * requirements.
10
+ *
11
+ * Group access follows the same two-layer model as Telegram:
12
+ *
13
+ * Layer 1 – Which GROUPS are allowed (SDK `resolveGroupPolicy`):
14
+ * - No `groups` configured + `groupPolicy: "open"` → any group passes
15
+ * - `groupPolicy: "allowlist"` or `groups` configured → acts as allowlist
16
+ * (explicit group IDs or `"*"` wildcard)
17
+ * - `groupPolicy: "disabled"` → all groups blocked
18
+ *
19
+ * Layer 2 – Which SENDERS are allowed within a group:
20
+ * - Per-group `groupPolicy` overrides global for sender filtering
21
+ * - `groupAllowFrom` (global) + per-group `allowFrom` are merged
22
+ * - `"open"` → any sender; `"allowlist"` → check merged list;
23
+ * `"disabled"` → block all senders
24
+ */
25
+ import type { ClawdbotConfig, HistoryEntry } from 'openclaw/plugin-sdk';
26
+ import type { MessageContext } from '../types';
27
+ import type { FeishuConfig } from '../../core/types';
28
+ import type { LarkAccount } from '../../core/types';
29
+ /**
30
+ * Read the pairing allowFrom store for the Feishu channel via the SDK runtime.
31
+ */
32
+ declare function readAllowFromStore(accountId: string): Promise<string[]>;
33
+ export interface GateResult {
34
+ allowed: boolean;
35
+ reason?: string;
36
+ /** When a group message is rejected due to missing bot mention, the
37
+ * caller should record this entry into the chat history map. */
38
+ historyEntry?: HistoryEntry;
39
+ }
40
+ /**
41
+ * Read the pairing allowFrom store for the Feishu channel.
42
+ *
43
+ * Exported so that handler.ts can provide it as a closure to the SDK's
44
+ * `resolveSenderCommandAuthorization` helper.
45
+ */
46
+ export { readAllowFromStore as readFeishuAllowFromStore };
47
+ /**
48
+ * Check whether an inbound message passes all access-control gates.
49
+ *
50
+ * The DM gate is async because it may read from the pairing store
51
+ * and send pairing request messages.
52
+ */
53
+ export declare function checkMessageGate(params: {
54
+ ctx: MessageContext;
55
+ accountFeishuCfg?: FeishuConfig;
56
+ account: LarkAccount;
57
+ /** account 级别的 ClawdbotConfig(channels.feishu 已替换为 per-account 合并后的配置) */
58
+ accountScopedCfg?: ClawdbotConfig;
59
+ log: (...args: unknown[]) => void;
60
+ }): Promise<GateResult>;
61
+ //# sourceMappingURL=gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../../../src/messaging/inbound/gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAmBpD;;GAEG;AACH,iBAAe,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAMtE;AAMD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;qEACiE;IACjE,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAMD;;;;;GAKG;AACH,OAAO,EAAE,kBAAkB,IAAI,wBAAwB,EAAE,CAAC;AAE1D;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,GAAG,EAAE,cAAc,CAAC;IACpB,gBAAgB,CAAC,EAAE,YAAY,CAAC;IAChC,OAAO,EAAE,WAAW,CAAC;IACrB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,cAAc,CAAC;IAClC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACnC,GAAG,OAAO,CAAC,UAAU,CAAC,CAStB"}
@@ -0,0 +1,234 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Policy gate for inbound Feishu messages.
6
+ *
7
+ * Determines whether a parsed message should be processed or rejected
8
+ * based on group/DM access policies, sender allowlists, and mention
9
+ * requirements.
10
+ *
11
+ * Group access follows the same two-layer model as Telegram:
12
+ *
13
+ * Layer 1 – Which GROUPS are allowed (SDK `resolveGroupPolicy`):
14
+ * - No `groups` configured + `groupPolicy: "open"` → any group passes
15
+ * - `groupPolicy: "allowlist"` or `groups` configured → acts as allowlist
16
+ * (explicit group IDs or `"*"` wildcard)
17
+ * - `groupPolicy: "disabled"` → all groups blocked
18
+ *
19
+ * Layer 2 – Which SENDERS are allowed within a group:
20
+ * - Per-group `groupPolicy` overrides global for sender filtering
21
+ * - `groupAllowFrom` (global) + per-group `allowFrom` are merged
22
+ * - `"open"` → any sender; `"allowlist"` → check merged list;
23
+ * `"disabled"` → block all senders
24
+ */
25
+ import { LarkClient } from '../../core/lark-client';
26
+ import { resolveFeishuGroupConfig, resolveFeishuAllowlistMatch, isFeishuGroupAllowed, splitLegacyGroupAllowFrom, resolveGroupSenderPolicyContext, } from './policy';
27
+ import { mentionedBot } from './mention';
28
+ import { sendPairingReply } from './gate-effects';
29
+ /** Prevent spamming the legacy groupAllowFrom migration warning. */
30
+ let legacyGroupAllowFromWarned = false;
31
+ // ---------------------------------------------------------------------------
32
+ // Helpers
33
+ // ---------------------------------------------------------------------------
34
+ /**
35
+ * Read the pairing allowFrom store for the Feishu channel via the SDK runtime.
36
+ */
37
+ async function readAllowFromStore(accountId) {
38
+ const core = LarkClient.runtime;
39
+ return await core.channel.pairing.readAllowFromStore({
40
+ channel: 'feishu',
41
+ accountId,
42
+ });
43
+ }
44
+ // ---------------------------------------------------------------------------
45
+ // Public API
46
+ // ---------------------------------------------------------------------------
47
+ /**
48
+ * Read the pairing allowFrom store for the Feishu channel.
49
+ *
50
+ * Exported so that handler.ts can provide it as a closure to the SDK's
51
+ * `resolveSenderCommandAuthorization` helper.
52
+ */
53
+ export { readAllowFromStore as readFeishuAllowFromStore };
54
+ /**
55
+ * Check whether an inbound message passes all access-control gates.
56
+ *
57
+ * The DM gate is async because it may read from the pairing store
58
+ * and send pairing request messages.
59
+ */
60
+ export async function checkMessageGate(params) {
61
+ const { ctx, accountFeishuCfg, account, accountScopedCfg, log } = params;
62
+ const isGroup = ctx.chatType === 'group';
63
+ if (isGroup) {
64
+ return checkGroupGate({ ctx, accountFeishuCfg, account, accountScopedCfg, log });
65
+ }
66
+ return checkDmGate({ ctx, accountFeishuCfg, account, accountScopedCfg, log });
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Internal: group gate
70
+ // ---------------------------------------------------------------------------
71
+ function checkGroupGate(params) {
72
+ const { ctx, accountFeishuCfg, account, accountScopedCfg, log } = params;
73
+ const core = LarkClient.runtime;
74
+ // ---- Legacy compat: groupAllowFrom with chat_id entries ----
75
+ // Older Feishu configs used groupAllowFrom with chat_ids (oc_xxx) to
76
+ // control which groups are allowed. The correct semantic (aligned with
77
+ // Telegram) is sender_ids. Detect and split so both layers still work.
78
+ const rawGroupAllowFrom = accountFeishuCfg?.groupAllowFrom ?? [];
79
+ const { legacyChatIds, senderAllowFrom: senderGroupAllowFrom } = splitLegacyGroupAllowFrom(rawGroupAllowFrom);
80
+ if (legacyChatIds.length > 0 && !legacyGroupAllowFromWarned) {
81
+ legacyGroupAllowFromWarned = true;
82
+ log(`feishu[${account.accountId}]: ⚠️ groupAllowFrom contains chat_id entries ` +
83
+ `(${legacyChatIds.join(', ')}). groupAllowFrom is for SENDER filtering ` +
84
+ `(open_ids like ou_xxx). Please move chat_ids to "groups" config instead:\n` +
85
+ ` channels.feishu.groups: {\n` +
86
+ legacyChatIds.map((id) => ` "${id}": {},`).join('\n') +
87
+ `\n }`);
88
+ }
89
+ // ---- Layer 1: Group-level access (SDK) ----
90
+ // The SDK reads `channels.feishu.groups` as an allowlist of group IDs.
91
+ // - No groups configured + groupPolicy "open" → any group passes
92
+ // - groupPolicy "allowlist" (or groups configured) → only listed groups pass
93
+ // - groupPolicy "disabled" → all groups blocked
94
+ const groupAccess = core.channel.groups.resolveGroupPolicy({
95
+ cfg: accountScopedCfg ?? {},
96
+ channel: 'feishu',
97
+ groupId: ctx.chatId,
98
+ accountId: account.accountId,
99
+ groupIdCaseInsensitive: true,
100
+ hasGroupAllowFrom: senderGroupAllowFrom.length > 0,
101
+ });
102
+ // Legacy compat: if SDK rejects the group but the chat_id is in the
103
+ // old-style groupAllowFrom, allow it (backward compatibility).
104
+ // Track whether this group was admitted via legacy path so we can skip
105
+ // sender filtering below (old semantic: chat_id in groupAllowFrom meant
106
+ // "allow this group for any sender").
107
+ let legacyGroupAdmit = false;
108
+ if (!groupAccess.allowed) {
109
+ const chatIdLower = ctx.chatId.toLowerCase();
110
+ const legacyMatch = legacyChatIds.some((id) => String(id).toLowerCase() === chatIdLower);
111
+ if (!legacyMatch) {
112
+ log(`feishu[${account.accountId}]: group ${ctx.chatId} blocked by group-level policy`);
113
+ return { allowed: false, reason: 'group_not_allowed' };
114
+ }
115
+ legacyGroupAdmit = true;
116
+ }
117
+ // ---- Per-group config (Feishu-specific fields) ----
118
+ const groupConfig = resolveFeishuGroupConfig({
119
+ cfg: accountFeishuCfg,
120
+ groupId: ctx.chatId,
121
+ });
122
+ const defaultConfig = accountFeishuCfg?.groups?.['*'];
123
+ // Per-group enabled flag
124
+ const enabled = groupConfig?.enabled ?? defaultConfig?.enabled;
125
+ if (enabled === false) {
126
+ log(`feishu[${account.accountId}]: group ${ctx.chatId} disabled by per-group config`);
127
+ return { allowed: false, reason: 'group_disabled' };
128
+ }
129
+ // ---- Layer 2: Sender-level access ----
130
+ // Per-group groupPolicy overrides the global groupPolicy for sender filtering.
131
+ // senderGroupAllowFrom (global, oc_ entries excluded) + per-group allowFrom.
132
+ //
133
+ // Legacy compat: when a group was admitted via old-style chat_id in
134
+ // groupAllowFrom AND there is no explicit per-group sender config,
135
+ // skip sender filtering (old semantic = "group allowed, any sender").
136
+ const hasExplicitSenderConfig = senderGroupAllowFrom.length > 0 || (groupConfig?.allowFrom ?? []).length > 0 || groupConfig?.groupPolicy != null;
137
+ if (!(legacyGroupAdmit && !hasExplicitSenderConfig)) {
138
+ const { senderPolicy, senderAllowFrom } = resolveGroupSenderPolicyContext({
139
+ groupConfig,
140
+ defaultConfig,
141
+ accountFeishuCfg,
142
+ senderGroupAllowFrom,
143
+ });
144
+ const senderAllowed = isFeishuGroupAllowed({
145
+ groupPolicy: senderPolicy,
146
+ allowFrom: senderAllowFrom,
147
+ senderId: ctx.senderId,
148
+ senderName: ctx.senderName,
149
+ });
150
+ if (!senderAllowed) {
151
+ log(`feishu[${account.accountId}]: sender ${ctx.senderId} not allowed in group ${ctx.chatId}`);
152
+ return { allowed: false, reason: 'sender_not_allowed' };
153
+ }
154
+ }
155
+ // ---- Mention requirement (SDK) ----
156
+ // SDK precedence: per-group > default ("*") > requireMentionOverride > true
157
+ const requireMention = core.channel.groups.resolveRequireMention({
158
+ cfg: accountScopedCfg ?? {},
159
+ channel: 'feishu',
160
+ groupId: ctx.chatId,
161
+ accountId: account.accountId,
162
+ groupIdCaseInsensitive: true,
163
+ requireMentionOverride: accountFeishuCfg?.requireMention,
164
+ });
165
+ if (requireMention && !mentionedBot(ctx)) {
166
+ log(`feishu[${account.accountId}]: message in group ${ctx.chatId} did not mention bot, recording to history`);
167
+ return {
168
+ allowed: false,
169
+ reason: 'no_mention',
170
+ historyEntry: {
171
+ sender: ctx.senderId,
172
+ body: `${ctx.senderName ?? ctx.senderId}: ${ctx.content}`,
173
+ timestamp: Date.now(),
174
+ messageId: ctx.messageId,
175
+ },
176
+ };
177
+ }
178
+ return { allowed: true };
179
+ }
180
+ // ---------------------------------------------------------------------------
181
+ // Internal: DM gate
182
+ // ---------------------------------------------------------------------------
183
+ async function checkDmGate(params) {
184
+ const { ctx, accountFeishuCfg, account, accountScopedCfg, log } = params;
185
+ const dmPolicy = accountFeishuCfg?.dmPolicy ?? 'pairing';
186
+ const configAllowFrom = accountFeishuCfg?.allowFrom ?? [];
187
+ if (dmPolicy === 'disabled') {
188
+ log(`feishu[${account.accountId}]: DM disabled by policy, rejecting sender ${ctx.senderId}`);
189
+ return { allowed: false, reason: 'dm_disabled' };
190
+ }
191
+ if (dmPolicy === 'open') {
192
+ return { allowed: true };
193
+ }
194
+ if (dmPolicy === 'allowlist') {
195
+ const storeAllowFrom = await readAllowFromStore(account.accountId).catch(() => []);
196
+ const combinedAllowFrom = [...configAllowFrom, ...storeAllowFrom];
197
+ const match = resolveFeishuAllowlistMatch({
198
+ allowFrom: combinedAllowFrom,
199
+ senderId: ctx.senderId,
200
+ senderName: ctx.senderName,
201
+ });
202
+ if (!match.allowed) {
203
+ log(`feishu[${account.accountId}]: sender ${ctx.senderId} not in DM allowlist`);
204
+ return { allowed: false, reason: 'dm_not_allowed' };
205
+ }
206
+ return { allowed: true };
207
+ }
208
+ // dmPolicy === "pairing"
209
+ const storeAllowFrom = await readAllowFromStore(account.accountId).catch(() => []);
210
+ const combinedAllowFrom = [...configAllowFrom, ...storeAllowFrom];
211
+ const match = resolveFeishuAllowlistMatch({
212
+ allowFrom: combinedAllowFrom,
213
+ senderId: ctx.senderId,
214
+ senderName: ctx.senderName,
215
+ });
216
+ if (match.allowed) {
217
+ return { allowed: true };
218
+ }
219
+ // Sender not yet paired — create a pairing request and notify them
220
+ log(`feishu[${account.accountId}]: sender ${ctx.senderId} not paired, creating pairing request`);
221
+ try {
222
+ await sendPairingReply({
223
+ senderId: ctx.senderId,
224
+ chatId: ctx.chatId,
225
+ accountId: account.accountId,
226
+ accountScopedCfg,
227
+ });
228
+ }
229
+ catch (err) {
230
+ log(`feishu[${account.accountId}]: failed to create pairing request for ${ctx.senderId}: ${String(err)}`);
231
+ }
232
+ return { allowed: false, reason: 'pairing_pending' };
233
+ }
234
+ //# sourceMappingURL=gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../../../src/messaging/inbound/gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Inbound message handling pipeline for the Feishu/Lark channel plugin.
6
+ *
7
+ * Orchestrates a seven-stage pipeline:
8
+ * 1. Account resolution
9
+ * 2. Event parsing → parse.ts (merge_forward expanded in-place)
10
+ * 3. Sender enrichment → enrich.ts (lightweight, before gate)
11
+ * 4. Policy gate → gate.ts
12
+ * 5. User name prefetch → enrich.ts (batch cache warm-up)
13
+ * 6. Content resolution → enrich.ts (media / quote, parallel)
14
+ * 7. Agent dispatch → dispatch.ts
15
+ */
16
+ import type { ClawdbotConfig, RuntimeEnv } from 'openclaw/plugin-sdk';
17
+ import { type HistoryEntry } from 'openclaw/plugin-sdk';
18
+ import type { FeishuMessageEvent } from '../types';
19
+ export declare function handleFeishuMessage(params: {
20
+ cfg: ClawdbotConfig;
21
+ event: FeishuMessageEvent;
22
+ botOpenId?: string;
23
+ runtime?: RuntimeEnv;
24
+ chatHistories?: Map<string, HistoryEntry[]>;
25
+ accountId?: string;
26
+ /** Override the message ID used for reply threading (typing indicators,
27
+ * card replies, etc.). Useful for synthetic messages whose message_id
28
+ * is not a real Feishu message ID. */
29
+ replyToMessageId?: string;
30
+ /** When true, skip the policy gate (mention requirement, allowlist).
31
+ * Used for synthetic messages that are not real user messages. */
32
+ forceMention?: boolean;
33
+ /** When true, skip the typing indicator for this dispatch (e.g. reactions). */
34
+ skipTyping?: boolean;
35
+ }): Promise<void>;
36
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/messaging/inbound/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAwBnD,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;2CAEuC;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;uEACmE;IACnE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkKhB"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Inbound message handling pipeline for the Feishu/Lark channel plugin.
6
+ *
7
+ * Orchestrates a seven-stage pipeline:
8
+ * 1. Account resolution
9
+ * 2. Event parsing → parse.ts (merge_forward expanded in-place)
10
+ * 3. Sender enrichment → enrich.ts (lightweight, before gate)
11
+ * 4. Policy gate → gate.ts
12
+ * 5. User name prefetch → enrich.ts (batch cache warm-up)
13
+ * 6. Content resolution → enrich.ts (media / quote, parallel)
14
+ * 7. Agent dispatch → dispatch.ts
15
+ */
16
+ import { recordPendingHistoryEntryIfEnabled, DEFAULT_GROUP_HISTORY_LIMIT, resolveSenderCommandAuthorization, isNormalizedSenderAllowed, } from 'openclaw/plugin-sdk';
17
+ import { getLarkAccount } from '../../core/accounts';
18
+ import { LarkClient } from '../../core/lark-client';
19
+ import { larkLogger } from '../../core/lark-logger';
20
+ import { ticketElapsed } from '../../core/lark-ticket';
21
+ import { parseMessageEvent } from './parse';
22
+ import { resolveSenderInfo, prefetchUserNames, resolveMedia, resolveQuotedContent, substituteMediaPaths, } from './enrich';
23
+ import { checkMessageGate, readFeishuAllowFromStore } from './gate';
24
+ import { dispatchToAgent } from './dispatch';
25
+ import { resolveFeishuGroupConfig, splitLegacyGroupAllowFrom } from './policy';
26
+ import { threadScopedKey } from '../../channel/chat-queue';
27
+ const logger = larkLogger('inbound/handler');
28
+ // ---------------------------------------------------------------------------
29
+ // Public: handle inbound message
30
+ // ---------------------------------------------------------------------------
31
+ export async function handleFeishuMessage(params) {
32
+ const { cfg, event, botOpenId, runtime, chatHistories, accountId, replyToMessageId, forceMention, skipTyping } = params;
33
+ // 1. Account resolution
34
+ const account = getLarkAccount(cfg, accountId);
35
+ const accountFeishuCfg = account.config;
36
+ // ★ 多账号配置隔离:构造 account 级别的 ClawdbotConfig
37
+ //
38
+ // 在多账号场景下,每个 account 可以独立配置 groupPolicy / requireMention
39
+ // 等策略。但 SDK 的 resolveGroupPolicy / resolveRequireMention 等函数从
40
+ // cfg.channels.feishu 读取配置,而 cfg 是顶层全局配置,不包含 per-account
41
+ // 的覆盖值。
42
+ //
43
+ // 这里将 cfg.channels.feishu 替换为经过 getLarkAccount() 合并后的
44
+ // accountFeishuCfg(= base config + account override),确保下游所有 SDK 调用
45
+ // 都能正确读取当前 account 的配置。
46
+ const accountScopedCfg = {
47
+ ...cfg,
48
+ channels: { ...cfg.channels, feishu: accountFeishuCfg },
49
+ };
50
+ const log = runtime?.log ?? ((...args) => logger.info(args.map(String).join(' ')));
51
+ const error = runtime?.error ?? ((...args) => logger.error(args.map(String).join(' ')));
52
+ // 2. Parse event → MessageContext (merge_forward expanded in-place)
53
+ let ctx = await parseMessageEvent(event, botOpenId, {
54
+ cfg: accountScopedCfg,
55
+ accountId: account.accountId,
56
+ });
57
+ // 3. Enrich (lightweight): sender name + permission error tracking
58
+ const { ctx: enrichedCtx, permissionError } = await resolveSenderInfo({
59
+ ctx,
60
+ account,
61
+ log,
62
+ });
63
+ ctx = enrichedCtx;
64
+ log(`feishu[${account.accountId}]: received message from ${ctx.senderId} in ${ctx.chatId} (${ctx.chatType})`);
65
+ logger.info(`received from ${ctx.senderId} in ${ctx.chatId} (${ctx.chatType})`);
66
+ const historyLimit = Math.max(0, accountFeishuCfg?.historyLimit ?? accountScopedCfg.messages?.groupChat?.historyLimit ?? DEFAULT_GROUP_HISTORY_LIMIT);
67
+ // 4. Gate: policy / access-control checks (skipped for synthetic messages)
68
+ const gate = forceMention
69
+ ? { allowed: true }
70
+ : await checkMessageGate({ ctx, accountFeishuCfg, account, accountScopedCfg, log });
71
+ if (!gate.allowed) {
72
+ if (gate.reason === 'no_mention') {
73
+ logger.info(`rejected: no bot mention in group ${ctx.chatId}`);
74
+ }
75
+ // Record history entry if the gate produced one (group no-mention case)
76
+ if (gate.historyEntry && chatHistories) {
77
+ const historyKey = threadScopedKey(ctx.chatId, ctx.threadId);
78
+ recordPendingHistoryEntryIfEnabled({
79
+ historyMap: chatHistories,
80
+ historyKey,
81
+ limit: historyLimit,
82
+ entry: gate.historyEntry,
83
+ });
84
+ }
85
+ return;
86
+ }
87
+ // 5. Batch pre-warm user name cache (sender + mentions)
88
+ await prefetchUserNames({ ctx, account, log });
89
+ // 6. Enrich (heavyweight, after gate — parallel where possible)
90
+ const enrichParams = { ctx, accountScopedCfg, account, log };
91
+ const [mediaResult, quotedContent] = await Promise.all([
92
+ resolveMedia(enrichParams),
93
+ resolveQuotedContent(enrichParams),
94
+ ]);
95
+ // 6b. Replace Feishu file-key placeholders in content with local
96
+ // file paths so the SDK can detect images for native vision and
97
+ // the AI receives meaningful file references.
98
+ if (mediaResult.mediaList.length > 0) {
99
+ ctx = {
100
+ ...ctx,
101
+ content: substituteMediaPaths(ctx.content, mediaResult.mediaList),
102
+ };
103
+ }
104
+ // 7. Compute commandAuthorized via SDK access group command gating
105
+ const core = LarkClient.runtime;
106
+ const isGroup = ctx.chatType === 'group';
107
+ const dmPolicy = accountFeishuCfg?.dmPolicy ?? 'pairing';
108
+ // Resolve per-group config early — shared by both command authorization
109
+ // and dispatch (step 8).
110
+ const groupConfig = isGroup ? resolveFeishuGroupConfig({ cfg: accountFeishuCfg, groupId: ctx.chatId }) : undefined;
111
+ const defaultGroupConfig = isGroup ? accountFeishuCfg?.groups?.['*'] : undefined;
112
+ // Build the sender allowlist for command authorization in group context.
113
+ // Excludes legacy oc_xxx chat-id entries (group admission, not sender identity).
114
+ //
115
+ // When the explicit group sender policy is "open", pass ["*"] to align
116
+ // command authorization with chat access (if you can chat, you can run
117
+ // commands). When no policy is configured (undefined fallback), default to
118
+ // allowlist behaviour — only users in accountFeishuCfg.allowFrom (owner list) or
119
+ // an explicit groupAllowFrom/per-group allowFrom can run commands.
120
+ const configuredGroupAllowFrom = (() => {
121
+ if (!isGroup)
122
+ return undefined;
123
+ // Exclude legacy oc_xxx chat-id entries from groupAllowFrom (sender filter only).
124
+ const { senderAllowFrom } = splitLegacyGroupAllowFrom(accountFeishuCfg?.groupAllowFrom ?? []);
125
+ const senderGroupAllowFrom = senderAllowFrom;
126
+ const perGroupAllowFrom = (groupConfig?.allowFrom ?? []).map(String);
127
+ const defaultSenderAllowFrom = !groupConfig && defaultGroupConfig?.allowFrom ? defaultGroupConfig.allowFrom.map(String) : [];
128
+ const combined = [...senderGroupAllowFrom, ...perGroupAllowFrom, ...defaultSenderAllowFrom];
129
+ if (combined.length > 0)
130
+ return combined;
131
+ // No allowFrom list configured — check if sender policy is explicitly "open".
132
+ // Do NOT fall back to "open" as a default: unset policy → allowlist behaviour.
133
+ const explicitSenderPolicy = groupConfig?.groupPolicy ?? defaultGroupConfig?.groupPolicy ?? accountFeishuCfg?.groupPolicy;
134
+ return explicitSenderPolicy === 'open' ? ['*'] : [];
135
+ })();
136
+ const { commandAuthorized } = await resolveSenderCommandAuthorization({
137
+ rawBody: ctx.content,
138
+ cfg: accountScopedCfg,
139
+ isGroup,
140
+ dmPolicy,
141
+ configuredAllowFrom: (accountFeishuCfg?.allowFrom ?? []).map(String),
142
+ configuredGroupAllowFrom,
143
+ senderId: ctx.senderId,
144
+ isSenderAllowed: (senderId, allowFrom) => isNormalizedSenderAllowed({ senderId, allowFrom }),
145
+ readAllowFromStore: () => readFeishuAllowFromStore(account.accountId),
146
+ shouldComputeCommandAuthorized: core.channel.commands.shouldComputeCommandAuthorized,
147
+ resolveCommandAuthorizedFromAuthorizers: core.channel.commands.resolveCommandAuthorizedFromAuthorizers,
148
+ });
149
+ // 8. Dispatch to agent
150
+ // groupConfig and defaultGroupConfig are already resolved above.
151
+ try {
152
+ await dispatchToAgent({
153
+ ctx,
154
+ permissionError,
155
+ mediaPayload: mediaResult.payload,
156
+ quotedContent,
157
+ account,
158
+ accountScopedCfg,
159
+ runtime,
160
+ chatHistories,
161
+ historyLimit,
162
+ replyToMessageId,
163
+ commandAuthorized,
164
+ groupConfig,
165
+ defaultGroupConfig,
166
+ skipTyping,
167
+ });
168
+ }
169
+ catch (err) {
170
+ error(`feishu[${account.accountId}]: failed to dispatch message: ${String(err)}`);
171
+ logger.error(`dispatch failed: ${String(err)} (elapsed=${ticketElapsed()}ms)`);
172
+ }
173
+ }
174
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../../src/messaging/inbound/handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Media resolution and payload building for inbound Feishu messages.
6
+ *
7
+ * Downloads media files based on ResourceDescriptors extracted during
8
+ * the content converter phase, and builds the payload object spread
9
+ * into the agent envelope.
10
+ */
11
+ import type { ClawdbotConfig } from 'openclaw/plugin-sdk';
12
+ import type { FeishuMediaInfo, ResourceDescriptor } from '../types';
13
+ /**
14
+ * Download media files based on pre-extracted ResourceDescriptors from
15
+ * the converter phase.
16
+ */
17
+ export declare function downloadResources(params: {
18
+ cfg: ClawdbotConfig;
19
+ messageId: string;
20
+ resources: ResourceDescriptor[];
21
+ maxBytes: number;
22
+ log?: (msg: string) => void;
23
+ accountId?: string;
24
+ }): Promise<FeishuMediaInfo[]>;
25
+ export declare function buildFeishuMediaPayload(mediaList: FeishuMediaInfo[]): {
26
+ MediaPath?: string;
27
+ MediaType?: string;
28
+ MediaUrl?: string;
29
+ MediaPaths?: string[];
30
+ MediaUrls?: string[];
31
+ MediaTypes?: string[];
32
+ };
33
+ //# sourceMappingURL=media-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-resolver.d.ts","sourceRoot":"","sources":["../../../../src/messaging/inbound/media-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAQpE;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,GAAG,EAAE,cAAc,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CA2C7B;AAqBD,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CAaA"}