@lark-project/openclaw-lark-project 2026.3.131

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 (368) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +80 -0
  3. package/README.zh.md +80 -0
  4. package/dist/index.js +172 -0
  5. package/dist/index.js.map +7 -0
  6. package/dist/skills/feishu-bitable/SKILL.md +248 -0
  7. package/dist/skills/feishu-bitable/references/examples.md +813 -0
  8. package/dist/skills/feishu-bitable/references/field-properties.md +763 -0
  9. package/dist/skills/feishu-bitable/references/record-values.md +911 -0
  10. package/dist/skills/feishu-calendar/SKILL.md +244 -0
  11. package/dist/skills/feishu-channel-rules/SKILL.md +18 -0
  12. package/dist/skills/feishu-channel-rules/references/markdown-syntax.md +138 -0
  13. package/dist/skills/feishu-create-doc/SKILL.md +719 -0
  14. package/dist/skills/feishu-fetch-doc/SKILL.md +93 -0
  15. package/dist/skills/feishu-im-read/SKILL.md +163 -0
  16. package/dist/skills/feishu-project/SKILL.md +122 -0
  17. package/dist/skills/feishu-task/SKILL.md +293 -0
  18. package/dist/skills/feishu-troubleshoot/SKILL.md +70 -0
  19. package/dist/skills/feishu-update-doc/SKILL.md +285 -0
  20. package/dist/src/card/builder.js +293 -0
  21. package/dist/src/card/builder.js.map +7 -0
  22. package/dist/src/card/cardkit.js +126 -0
  23. package/dist/src/card/cardkit.js.map +7 -0
  24. package/dist/src/card/flush-controller.js +107 -0
  25. package/dist/src/card/flush-controller.js.map +7 -0
  26. package/dist/src/card/markdown-style.js +57 -0
  27. package/dist/src/card/markdown-style.js.map +7 -0
  28. package/dist/src/card/reply-dispatcher-types.js +39 -0
  29. package/dist/src/card/reply-dispatcher-types.js.map +7 -0
  30. package/dist/src/card/reply-dispatcher.js +245 -0
  31. package/dist/src/card/reply-dispatcher.js.map +7 -0
  32. package/dist/src/card/reply-mode.js +29 -0
  33. package/dist/src/card/reply-mode.js.map +7 -0
  34. package/dist/src/card/streaming-card-controller.js +653 -0
  35. package/dist/src/card/streaming-card-controller.js.map +7 -0
  36. package/dist/src/card/unavailable-guard.js +76 -0
  37. package/dist/src/card/unavailable-guard.js.map +7 -0
  38. package/dist/src/channel/abort-detect.js +79 -0
  39. package/dist/src/channel/abort-detect.js.map +7 -0
  40. package/dist/src/channel/chat-queue.js +50 -0
  41. package/dist/src/channel/chat-queue.js.map +7 -0
  42. package/dist/src/channel/config-adapter.js +89 -0
  43. package/dist/src/channel/config-adapter.js.map +7 -0
  44. package/dist/src/channel/directory.js +133 -0
  45. package/dist/src/channel/directory.js.map +7 -0
  46. package/dist/src/channel/event-handlers.js +175 -0
  47. package/dist/src/channel/event-handlers.js.map +7 -0
  48. package/dist/src/channel/monitor.js +108 -0
  49. package/dist/src/channel/monitor.js.map +7 -0
  50. package/dist/src/channel/onboarding-config.js +76 -0
  51. package/dist/src/channel/onboarding-config.js.map +7 -0
  52. package/dist/src/channel/onboarding-migrate.js +55 -0
  53. package/dist/src/channel/onboarding-migrate.js.map +7 -0
  54. package/dist/src/channel/onboarding.js +285 -0
  55. package/dist/src/channel/onboarding.js.map +7 -0
  56. package/dist/src/channel/plugin.js +260 -0
  57. package/dist/src/channel/plugin.js.map +7 -0
  58. package/dist/src/channel/probe.js +14 -0
  59. package/dist/src/channel/probe.js.map +7 -0
  60. package/dist/src/channel/types.js +1 -0
  61. package/dist/src/channel/types.js.map +7 -0
  62. package/dist/src/commands/auth.js +73 -0
  63. package/dist/src/commands/auth.js.map +7 -0
  64. package/dist/src/commands/diagnose.js +658 -0
  65. package/dist/src/commands/diagnose.js.map +7 -0
  66. package/dist/src/commands/doctor.js +327 -0
  67. package/dist/src/commands/doctor.js.map +7 -0
  68. package/dist/src/commands/index.js +124 -0
  69. package/dist/src/commands/index.js.map +7 -0
  70. package/dist/src/core/accounts.js +129 -0
  71. package/dist/src/core/accounts.js.map +7 -0
  72. package/dist/src/core/agent-config.js +60 -0
  73. package/dist/src/core/agent-config.js.map +7 -0
  74. package/dist/src/core/api-error.js +55 -0
  75. package/dist/src/core/api-error.js.map +7 -0
  76. package/dist/src/core/app-owner-fallback.js +17 -0
  77. package/dist/src/core/app-owner-fallback.js.map +7 -0
  78. package/dist/src/core/app-scope-checker.js +95 -0
  79. package/dist/src/core/app-scope-checker.js.map +7 -0
  80. package/dist/src/core/auth-errors.js +120 -0
  81. package/dist/src/core/auth-errors.js.map +7 -0
  82. package/dist/src/core/chat-info-cache.js +102 -0
  83. package/dist/src/core/chat-info-cache.js.map +7 -0
  84. package/dist/src/core/config-schema.js +150 -0
  85. package/dist/src/core/config-schema.js.map +7 -0
  86. package/dist/src/core/device-flow.js +174 -0
  87. package/dist/src/core/device-flow.js.map +7 -0
  88. package/dist/src/core/feishu-fetch.js +12 -0
  89. package/dist/src/core/feishu-fetch.js.map +7 -0
  90. package/dist/src/core/footer-config.js +16 -0
  91. package/dist/src/core/footer-config.js.map +7 -0
  92. package/dist/src/core/lark-client.js +322 -0
  93. package/dist/src/core/lark-client.js.map +7 -0
  94. package/dist/src/core/lark-logger.js +92 -0
  95. package/dist/src/core/lark-logger.js.map +7 -0
  96. package/dist/src/core/lark-ticket.js +18 -0
  97. package/dist/src/core/lark-ticket.js.map +7 -0
  98. package/dist/src/core/message-unavailable.js +119 -0
  99. package/dist/src/core/message-unavailable.js.map +7 -0
  100. package/dist/src/core/owner-policy.js +25 -0
  101. package/dist/src/core/owner-policy.js.map +7 -0
  102. package/dist/src/core/permission-url.js +37 -0
  103. package/dist/src/core/permission-url.js.map +7 -0
  104. package/dist/src/core/project-auth.js +177 -0
  105. package/dist/src/core/project-auth.js.map +7 -0
  106. package/dist/src/core/project-oauth-flow.js +124 -0
  107. package/dist/src/core/project-oauth-flow.js.map +7 -0
  108. package/dist/src/core/project-token-store.js +172 -0
  109. package/dist/src/core/project-token-store.js.map +7 -0
  110. package/dist/src/core/raw-request.js +45 -0
  111. package/dist/src/core/raw-request.js.map +7 -0
  112. package/dist/src/core/scope-manager.js +62 -0
  113. package/dist/src/core/scope-manager.js.map +7 -0
  114. package/dist/src/core/security-check.js +118 -0
  115. package/dist/src/core/security-check.js.map +7 -0
  116. package/dist/src/core/shutdown-hooks.js +37 -0
  117. package/dist/src/core/shutdown-hooks.js.map +7 -0
  118. package/dist/src/core/targets.js +55 -0
  119. package/dist/src/core/targets.js.map +7 -0
  120. package/dist/src/core/token-store.js +215 -0
  121. package/dist/src/core/token-store.js.map +7 -0
  122. package/dist/src/core/tool-client.js +335 -0
  123. package/dist/src/core/tool-client.js.map +7 -0
  124. package/dist/src/core/tool-scopes.js +207 -0
  125. package/dist/src/core/tool-scopes.js.map +7 -0
  126. package/dist/src/core/tools-config.js +57 -0
  127. package/dist/src/core/tools-config.js.map +7 -0
  128. package/dist/src/core/types.js +1 -0
  129. package/dist/src/core/types.js.map +7 -0
  130. package/dist/src/core/uat-client.js +124 -0
  131. package/dist/src/core/uat-client.js.map +7 -0
  132. package/dist/src/core/version.js +27 -0
  133. package/dist/src/core/version.js.map +7 -0
  134. package/dist/src/messaging/converters/audio.js +19 -0
  135. package/dist/src/messaging/converters/audio.js.map +7 -0
  136. package/dist/src/messaging/converters/calendar.js +46 -0
  137. package/dist/src/messaging/converters/calendar.js.map +7 -0
  138. package/dist/src/messaging/converters/content-converter.js +61 -0
  139. package/dist/src/messaging/converters/content-converter.js.map +7 -0
  140. package/dist/src/messaging/converters/file.js +18 -0
  141. package/dist/src/messaging/converters/file.js.map +7 -0
  142. package/dist/src/messaging/converters/folder.js +18 -0
  143. package/dist/src/messaging/converters/folder.js.map +7 -0
  144. package/dist/src/messaging/converters/hongbao.js +14 -0
  145. package/dist/src/messaging/converters/hongbao.js.map +7 -0
  146. package/dist/src/messaging/converters/image.js +16 -0
  147. package/dist/src/messaging/converters/image.js.map +7 -0
  148. package/dist/src/messaging/converters/index.js +48 -0
  149. package/dist/src/messaging/converters/index.js.map +7 -0
  150. package/dist/src/messaging/converters/interactive/card-converter.js +1040 -0
  151. package/dist/src/messaging/converters/interactive/card-converter.js.map +7 -0
  152. package/dist/src/messaging/converters/interactive/card-utils.js +36 -0
  153. package/dist/src/messaging/converters/interactive/card-utils.js.map +7 -0
  154. package/dist/src/messaging/converters/interactive/index.js +19 -0
  155. package/dist/src/messaging/converters/interactive/index.js.map +7 -0
  156. package/dist/src/messaging/converters/interactive/legacy.js +53 -0
  157. package/dist/src/messaging/converters/interactive/legacy.js.map +7 -0
  158. package/dist/src/messaging/converters/interactive/types.js +23 -0
  159. package/dist/src/messaging/converters/interactive/types.js.map +7 -0
  160. package/dist/src/messaging/converters/location.js +17 -0
  161. package/dist/src/messaging/converters/location.js.map +7 -0
  162. package/dist/src/messaging/converters/merge-forward.js +143 -0
  163. package/dist/src/messaging/converters/merge-forward.js.map +7 -0
  164. package/dist/src/messaging/converters/post.js +113 -0
  165. package/dist/src/messaging/converters/post.js.map +7 -0
  166. package/dist/src/messaging/converters/share.js +22 -0
  167. package/dist/src/messaging/converters/share.js.map +7 -0
  168. package/dist/src/messaging/converters/sticker.js +16 -0
  169. package/dist/src/messaging/converters/sticker.js.map +7 -0
  170. package/dist/src/messaging/converters/system.js +25 -0
  171. package/dist/src/messaging/converters/system.js.map +7 -0
  172. package/dist/src/messaging/converters/text.js +12 -0
  173. package/dist/src/messaging/converters/text.js.map +7 -0
  174. package/dist/src/messaging/converters/todo.js +37 -0
  175. package/dist/src/messaging/converters/todo.js.map +7 -0
  176. package/dist/src/messaging/converters/types.js +1 -0
  177. package/dist/src/messaging/converters/types.js.map +7 -0
  178. package/dist/src/messaging/converters/unknown.js +13 -0
  179. package/dist/src/messaging/converters/unknown.js.map +7 -0
  180. package/dist/src/messaging/converters/utils.js +35 -0
  181. package/dist/src/messaging/converters/utils.js.map +7 -0
  182. package/dist/src/messaging/converters/video-chat.js +21 -0
  183. package/dist/src/messaging/converters/video-chat.js.map +7 -0
  184. package/dist/src/messaging/converters/video.js +30 -0
  185. package/dist/src/messaging/converters/video.js.map +7 -0
  186. package/dist/src/messaging/converters/vote.js +24 -0
  187. package/dist/src/messaging/converters/vote.js.map +7 -0
  188. package/dist/src/messaging/inbound/dedup.js +82 -0
  189. package/dist/src/messaging/inbound/dedup.js.map +7 -0
  190. package/dist/src/messaging/inbound/dispatch-builders.js +98 -0
  191. package/dist/src/messaging/inbound/dispatch-builders.js.map +7 -0
  192. package/dist/src/messaging/inbound/dispatch-commands.js +94 -0
  193. package/dist/src/messaging/inbound/dispatch-commands.js.map +7 -0
  194. package/dist/src/messaging/inbound/dispatch-context.js +96 -0
  195. package/dist/src/messaging/inbound/dispatch-context.js.map +7 -0
  196. package/dist/src/messaging/inbound/dispatch.js +150 -0
  197. package/dist/src/messaging/inbound/dispatch.js.map +7 -0
  198. package/dist/src/messaging/inbound/enrich.js +137 -0
  199. package/dist/src/messaging/inbound/enrich.js.map +7 -0
  200. package/dist/src/messaging/inbound/gate-effects.js +28 -0
  201. package/dist/src/messaging/inbound/gate-effects.js.map +7 -0
  202. package/dist/src/messaging/inbound/gate.js +163 -0
  203. package/dist/src/messaging/inbound/gate.js.map +7 -0
  204. package/dist/src/messaging/inbound/handler.js +132 -0
  205. package/dist/src/messaging/inbound/handler.js.map +7 -0
  206. package/dist/src/messaging/inbound/media-resolver.js +70 -0
  207. package/dist/src/messaging/inbound/media-resolver.js.map +7 -0
  208. package/dist/src/messaging/inbound/mention.js +50 -0
  209. package/dist/src/messaging/inbound/mention.js.map +7 -0
  210. package/dist/src/messaging/inbound/parse-io.js +41 -0
  211. package/dist/src/messaging/inbound/parse-io.js.map +7 -0
  212. package/dist/src/messaging/inbound/parse.js +79 -0
  213. package/dist/src/messaging/inbound/parse.js.map +7 -0
  214. package/dist/src/messaging/inbound/permission.js +30 -0
  215. package/dist/src/messaging/inbound/permission.js.map +7 -0
  216. package/dist/src/messaging/inbound/policy.js +83 -0
  217. package/dist/src/messaging/inbound/policy.js.map +7 -0
  218. package/dist/src/messaging/inbound/reaction-handler.js +162 -0
  219. package/dist/src/messaging/inbound/reaction-handler.js.map +7 -0
  220. package/dist/src/messaging/inbound/user-name-cache.js +172 -0
  221. package/dist/src/messaging/inbound/user-name-cache.js.map +7 -0
  222. package/dist/src/messaging/outbound/actions.js +239 -0
  223. package/dist/src/messaging/outbound/actions.js.map +7 -0
  224. package/dist/src/messaging/outbound/chat-manage.js +74 -0
  225. package/dist/src/messaging/outbound/chat-manage.js.map +7 -0
  226. package/dist/src/messaging/outbound/deliver.js +162 -0
  227. package/dist/src/messaging/outbound/deliver.js.map +7 -0
  228. package/dist/src/messaging/outbound/fetch.js +7 -0
  229. package/dist/src/messaging/outbound/fetch.js.map +7 -0
  230. package/dist/src/messaging/outbound/forward.js +31 -0
  231. package/dist/src/messaging/outbound/forward.js.map +7 -0
  232. package/dist/src/messaging/outbound/media-url-utils.js +101 -0
  233. package/dist/src/messaging/outbound/media-url-utils.js.map +7 -0
  234. package/dist/src/messaging/outbound/media.js +463 -0
  235. package/dist/src/messaging/outbound/media.js.map +7 -0
  236. package/dist/src/messaging/outbound/outbound.js +95 -0
  237. package/dist/src/messaging/outbound/outbound.js.map +7 -0
  238. package/dist/src/messaging/outbound/reactions.js +312 -0
  239. package/dist/src/messaging/outbound/reactions.js.map +7 -0
  240. package/dist/src/messaging/outbound/send.js +194 -0
  241. package/dist/src/messaging/outbound/send.js.map +7 -0
  242. package/dist/src/messaging/outbound/typing.js +77 -0
  243. package/dist/src/messaging/outbound/typing.js.map +7 -0
  244. package/dist/src/messaging/shared/message-lookup.js +84 -0
  245. package/dist/src/messaging/shared/message-lookup.js.map +7 -0
  246. package/dist/src/messaging/types.js +1 -0
  247. package/dist/src/messaging/types.js.map +7 -0
  248. package/dist/src/tools/auto-auth.js +714 -0
  249. package/dist/src/tools/auto-auth.js.map +7 -0
  250. package/dist/src/tools/helpers.js +133 -0
  251. package/dist/src/tools/helpers.js.map +7 -0
  252. package/dist/src/tools/mcp/doc/create.js +35 -0
  253. package/dist/src/tools/mcp/doc/create.js.map +7 -0
  254. package/dist/src/tools/mcp/doc/fetch.js +33 -0
  255. package/dist/src/tools/mcp/doc/fetch.js.map +7 -0
  256. package/dist/src/tools/mcp/doc/index.js +32 -0
  257. package/dist/src/tools/mcp/doc/index.js.map +7 -0
  258. package/dist/src/tools/mcp/doc/update.js +61 -0
  259. package/dist/src/tools/mcp/doc/update.js.map +7 -0
  260. package/dist/src/tools/mcp/project/endpoint.js +25 -0
  261. package/dist/src/tools/mcp/project/endpoint.js.map +7 -0
  262. package/dist/src/tools/mcp/project/index.js +27 -0
  263. package/dist/src/tools/mcp/project/index.js.map +7 -0
  264. package/dist/src/tools/mcp/project/tools.js +579 -0
  265. package/dist/src/tools/mcp/project/tools.js.map +7 -0
  266. package/dist/src/tools/mcp/shared.js +170 -0
  267. package/dist/src/tools/mcp/shared.js.map +7 -0
  268. package/dist/src/tools/oapi/bitable/app-table-field.js +244 -0
  269. package/dist/src/tools/oapi/bitable/app-table-field.js.map +7 -0
  270. package/dist/src/tools/oapi/bitable/app-table-record.js +501 -0
  271. package/dist/src/tools/oapi/bitable/app-table-record.js.map +7 -0
  272. package/dist/src/tools/oapi/bitable/app-table-view.js +226 -0
  273. package/dist/src/tools/oapi/bitable/app-table-view.js.map +7 -0
  274. package/dist/src/tools/oapi/bitable/app-table.js +278 -0
  275. package/dist/src/tools/oapi/bitable/app-table.js.map +7 -0
  276. package/dist/src/tools/oapi/bitable/app.js +200 -0
  277. package/dist/src/tools/oapi/bitable/app.js.map +7 -0
  278. package/dist/src/tools/oapi/bitable/index.js +13 -0
  279. package/dist/src/tools/oapi/bitable/index.js.map +7 -0
  280. package/dist/src/tools/oapi/calendar/calendar.js +131 -0
  281. package/dist/src/tools/oapi/calendar/calendar.js.map +7 -0
  282. package/dist/src/tools/oapi/calendar/event-attendee.js +301 -0
  283. package/dist/src/tools/oapi/calendar/event-attendee.js.map +7 -0
  284. package/dist/src/tools/oapi/calendar/event.js +834 -0
  285. package/dist/src/tools/oapi/calendar/event.js.map +7 -0
  286. package/dist/src/tools/oapi/calendar/freebusy.js +111 -0
  287. package/dist/src/tools/oapi/calendar/freebusy.js.map +7 -0
  288. package/dist/src/tools/oapi/calendar/index.js +11 -0
  289. package/dist/src/tools/oapi/calendar/index.js.map +7 -0
  290. package/dist/src/tools/oapi/chat/chat.js +132 -0
  291. package/dist/src/tools/oapi/chat/chat.js.map +7 -0
  292. package/dist/src/tools/oapi/chat/index.js +11 -0
  293. package/dist/src/tools/oapi/chat/index.js.map +7 -0
  294. package/dist/src/tools/oapi/chat/members.js +83 -0
  295. package/dist/src/tools/oapi/chat/members.js.map +7 -0
  296. package/dist/src/tools/oapi/common/get-user.js +95 -0
  297. package/dist/src/tools/oapi/common/get-user.js.map +7 -0
  298. package/dist/src/tools/oapi/common/index.js +7 -0
  299. package/dist/src/tools/oapi/common/index.js.map +7 -0
  300. package/dist/src/tools/oapi/common/search-user.js +67 -0
  301. package/dist/src/tools/oapi/common/search-user.js.map +7 -0
  302. package/dist/src/tools/oapi/drive/doc-comments.js +310 -0
  303. package/dist/src/tools/oapi/drive/doc-comments.js.map +7 -0
  304. package/dist/src/tools/oapi/drive/doc-media.js +314 -0
  305. package/dist/src/tools/oapi/drive/doc-media.js.map +7 -0
  306. package/dist/src/tools/oapi/drive/file.js +548 -0
  307. package/dist/src/tools/oapi/drive/file.js.map +7 -0
  308. package/dist/src/tools/oapi/drive/index.js +29 -0
  309. package/dist/src/tools/oapi/drive/index.js.map +7 -0
  310. package/dist/src/tools/oapi/helpers.js +199 -0
  311. package/dist/src/tools/oapi/helpers.js.map +7 -0
  312. package/dist/src/tools/oapi/im/format-messages.js +128 -0
  313. package/dist/src/tools/oapi/im/format-messages.js.map +7 -0
  314. package/dist/src/tools/oapi/im/index.js +15 -0
  315. package/dist/src/tools/oapi/im/index.js.map +7 -0
  316. package/dist/src/tools/oapi/im/message-read.js +404 -0
  317. package/dist/src/tools/oapi/im/message-read.js.map +7 -0
  318. package/dist/src/tools/oapi/im/message.js +179 -0
  319. package/dist/src/tools/oapi/im/message.js.map +7 -0
  320. package/dist/src/tools/oapi/im/resource.js +126 -0
  321. package/dist/src/tools/oapi/im/resource.js.map +7 -0
  322. package/dist/src/tools/oapi/im/time-utils.js +169 -0
  323. package/dist/src/tools/oapi/im/time-utils.js.map +7 -0
  324. package/dist/src/tools/oapi/im/user-name-uat.js +103 -0
  325. package/dist/src/tools/oapi/im/user-name-uat.js.map +7 -0
  326. package/dist/src/tools/oapi/index.js +56 -0
  327. package/dist/src/tools/oapi/index.js.map +7 -0
  328. package/dist/src/tools/oapi/sdk-types.js +1 -0
  329. package/dist/src/tools/oapi/sdk-types.js.map +7 -0
  330. package/dist/src/tools/oapi/search/doc-search.js +215 -0
  331. package/dist/src/tools/oapi/search/doc-search.js.map +7 -0
  332. package/dist/src/tools/oapi/search/index.js +25 -0
  333. package/dist/src/tools/oapi/search/index.js.map +7 -0
  334. package/dist/src/tools/oapi/sheets/index.js +25 -0
  335. package/dist/src/tools/oapi/sheets/index.js.map +7 -0
  336. package/dist/src/tools/oapi/sheets/sheet.js +652 -0
  337. package/dist/src/tools/oapi/sheets/sheet.js.map +7 -0
  338. package/dist/src/tools/oapi/task/comment.js +151 -0
  339. package/dist/src/tools/oapi/task/comment.js.map +7 -0
  340. package/dist/src/tools/oapi/task/index.js +11 -0
  341. package/dist/src/tools/oapi/task/index.js.map +7 -0
  342. package/dist/src/tools/oapi/task/subtask.js +175 -0
  343. package/dist/src/tools/oapi/task/subtask.js.map +7 -0
  344. package/dist/src/tools/oapi/task/task.js +405 -0
  345. package/dist/src/tools/oapi/task/task.js.map +7 -0
  346. package/dist/src/tools/oapi/task/tasklist.js +366 -0
  347. package/dist/src/tools/oapi/task/tasklist.js.map +7 -0
  348. package/dist/src/tools/oapi/wiki/index.js +27 -0
  349. package/dist/src/tools/oapi/wiki/index.js.map +7 -0
  350. package/dist/src/tools/oapi/wiki/space-node.js +311 -0
  351. package/dist/src/tools/oapi/wiki/space-node.js.map +7 -0
  352. package/dist/src/tools/oapi/wiki/space.js +148 -0
  353. package/dist/src/tools/oapi/wiki/space.js.map +7 -0
  354. package/dist/src/tools/oauth-batch-auth.js +125 -0
  355. package/dist/src/tools/oauth-batch-auth.js.map +7 -0
  356. package/dist/src/tools/oauth-cards.js +269 -0
  357. package/dist/src/tools/oauth-cards.js.map +7 -0
  358. package/dist/src/tools/oauth.js +538 -0
  359. package/dist/src/tools/oauth.js.map +7 -0
  360. package/dist/src/tools/onboarding-auth.js +101 -0
  361. package/dist/src/tools/onboarding-auth.js.map +7 -0
  362. package/dist/src/tools/project-oauth.js +305 -0
  363. package/dist/src/tools/project-oauth.js.map +7 -0
  364. package/dist/src/tools/tat/im/index.js +9 -0
  365. package/dist/src/tools/tat/im/index.js.map +7 -0
  366. package/dist/src/tools/tat/im/resource.js +123 -0
  367. package/dist/src/tools/tat/im/resource.js.map +7 -0
  368. package/package.json +64 -0
@@ -0,0 +1,404 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { assertLarkOk, createToolContext, getFirstAccount, handleInvokeErrorWithAutoAuth, json } from "../helpers";
3
+ import { dateTimeToSecondsString, parseTimeRangeToSeconds } from "./time-utils";
4
+ import { formatMessageList } from "./format-messages";
5
+ import { getUATUserName, batchResolveUserNamesAsUser } from "./user-name-uat";
6
+ function sortRuleToSortType(rule) {
7
+ return rule === "create_time_asc" ? "ByCreateTimeAsc" : "ByCreateTimeDesc";
8
+ }
9
+ async function resolveP2PChatId(client, openId, log) {
10
+ const res = await client.invokeByPath("feishu_im_user_get_messages.default", "/open-apis/im/v1/chat_p2p/batch_query", {
11
+ method: "POST",
12
+ body: { chatter_ids: [openId] },
13
+ query: { user_id_type: "open_id" },
14
+ as: "user"
15
+ });
16
+ const chats = res.data?.p2p_chats;
17
+ if (!chats?.length) {
18
+ log.info(`batch_query: no p2p chat found for open_id=${openId}`);
19
+ throw new Error(`no 1-on-1 chat found with open_id=${openId}. You may not have chat history with this user.`);
20
+ }
21
+ log.info(`batch_query: resolved chat_id=${chats[0].chat_id}`);
22
+ return chats[0].chat_id;
23
+ }
24
+ function resolveTimeRange(p, logInfo) {
25
+ if (p.relative_time) {
26
+ const range = parseTimeRangeToSeconds(p.relative_time);
27
+ logInfo(`relative_time="${p.relative_time}" \u2192 start=${range.start}, end=${range.end}`);
28
+ return range;
29
+ }
30
+ return {
31
+ start: p.start_time ? dateTimeToSecondsString(p.start_time) : void 0,
32
+ end: p.end_time ? dateTimeToSecondsString(p.end_time) : void 0
33
+ };
34
+ }
35
+ async function formatAndReturn(res, config, log, client) {
36
+ const items = res.data?.items ?? [];
37
+ const account = getFirstAccount(config);
38
+ const messages = await formatMessageList(
39
+ items,
40
+ account,
41
+ (...args) => log.info(args.map(String).join(" ")),
42
+ client
43
+ );
44
+ const hasMore = res.data?.has_more ?? false;
45
+ const pageToken = res.data?.page_token;
46
+ log.info(`list: returned ${messages.length} messages, has_more=${hasMore}`);
47
+ return json({ messages, has_more: hasMore, page_token: pageToken });
48
+ }
49
+ const GetMessagesSchema = Type.Object({
50
+ open_id: Type.Optional(
51
+ Type.String({
52
+ description: "\u7528\u6237 open_id\uFF08ou_xxx\uFF09\uFF0C\u83B7\u53D6\u4E0E\u8BE5\u7528\u6237\u7684\u5355\u804A\u6D88\u606F\u3002\u4E0E chat_id \u4E92\u65A5"
53
+ })
54
+ ),
55
+ chat_id: Type.Optional(
56
+ Type.String({
57
+ description: "\u4F1A\u8BDD ID\uFF08oc_xxx\uFF09\uFF0C\u652F\u6301\u5355\u804A\u548C\u7FA4\u804A\u3002\u4E0E open_id \u4E92\u65A5"
58
+ })
59
+ ),
60
+ sort_rule: Type.Optional(
61
+ Type.Union([Type.Literal("create_time_asc"), Type.Literal("create_time_desc")], {
62
+ description: "\u6392\u5E8F\u65B9\u5F0F\uFF0C\u9ED8\u8BA4 create_time_desc\uFF08\u6700\u65B0\u6D88\u606F\u5728\u524D\uFF09"
63
+ })
64
+ ),
65
+ page_size: Type.Optional(Type.Number({ description: "\u6BCF\u9875\u6D88\u606F\u6570\uFF081-50\uFF09\uFF0C\u9ED8\u8BA4 50", minimum: 1, maximum: 50 })),
66
+ page_token: Type.Optional(Type.String({ description: "\u5206\u9875\u6807\u8BB0\uFF0C\u7528\u4E8E\u83B7\u53D6\u4E0B\u4E00\u9875" })),
67
+ relative_time: Type.Optional(
68
+ Type.String({
69
+ description: "\u76F8\u5BF9\u65F6\u95F4\u8303\u56F4\uFF1Atoday / yesterday / day_before_yesterday / this_week / last_week / this_month / last_month / last_{N}_{unit}\uFF08unit: minutes/hours/days\uFF09\u3002\u4E0E start_time/end_time \u4E92\u65A5"
70
+ })
71
+ ),
72
+ start_time: Type.Optional(
73
+ Type.String({
74
+ description: "\u8D77\u59CB\u65F6\u95F4\uFF08ISO 8601 \u683C\u5F0F\uFF0C\u5982 2026-02-27T00:00:00+08:00\uFF09\u3002\u4E0E relative_time \u4E92\u65A5"
75
+ })
76
+ ),
77
+ end_time: Type.Optional(
78
+ Type.String({
79
+ description: "\u7ED3\u675F\u65F6\u95F4\uFF08ISO 8601 \u683C\u5F0F\uFF0C\u5982 2026-02-27T23:59:59+08:00\uFF09\u3002\u4E0E relative_time \u4E92\u65A5"
80
+ })
81
+ )
82
+ });
83
+ function registerGetMessages(api) {
84
+ if (!api.config) return;
85
+ const config = api.config;
86
+ const { toolClient, log } = createToolContext(api, "feishu_im_user_get_messages");
87
+ api.registerTool(
88
+ {
89
+ name: "feishu_im_user_get_messages",
90
+ label: "Feishu: Get IM Messages",
91
+ description: "\u3010\u4EE5\u7528\u6237\u8EAB\u4EFD\u3011\u83B7\u53D6\u7FA4\u804A\u6216\u5355\u804A\u7684\u5386\u53F2\u6D88\u606F\u3002\n\n\u7528\u6CD5\uFF1A\n- \u901A\u8FC7 chat_id \u83B7\u53D6\u7FA4\u804A/\u5355\u804A\u6D88\u606F\n- \u901A\u8FC7 open_id \u83B7\u53D6\u4E0E\u6307\u5B9A\u7528\u6237\u7684\u5355\u804A\u6D88\u606F\uFF08\u81EA\u52A8\u89E3\u6790 chat_id\uFF09\n- \u652F\u6301\u65F6\u95F4\u8303\u56F4\u8FC7\u6EE4\uFF1Arelative_time\uFF08\u5982 today\u3001last_3_days\uFF09\u6216 start_time/end_time\uFF08ISO 8601 \u683C\u5F0F\uFF09\n- \u652F\u6301\u5206\u9875\uFF1Apage_size + page_token\n\n\u3010\u53C2\u6570\u7EA6\u675F\u3011\n- open_id \u548C chat_id \u5FC5\u987B\u4E8C\u9009\u4E00\uFF0C\u4E0D\u80FD\u540C\u65F6\u63D0\u4F9B\n- relative_time \u548C start_time/end_time \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528\n- page_size \u8303\u56F4 1-50\uFF0C\u9ED8\u8BA4 50\n\n\u8FD4\u56DE\u6D88\u606F\u5217\u8868\uFF0C\u6BCF\u6761\u6D88\u606F\u5305\u542B message_id\u3001msg_type\u3001content\uFF08AI \u53EF\u8BFB\u6587\u672C\uFF09\u3001sender\u3001create_time \u7B49\u5B57\u6BB5\u3002",
92
+ parameters: GetMessagesSchema,
93
+ async execute(_toolCallId, params) {
94
+ const p = params;
95
+ try {
96
+ if (p.open_id && p.chat_id) {
97
+ return json({ error: "cannot provide both open_id and chat_id, please provide only one" });
98
+ }
99
+ if (!p.open_id && !p.chat_id) {
100
+ return json({ error: "either open_id or chat_id is required" });
101
+ }
102
+ if (p.relative_time && (p.start_time || p.end_time)) {
103
+ return json({ error: "cannot use both relative_time and start_time/end_time" });
104
+ }
105
+ const client = toolClient();
106
+ let chatId = p.chat_id ?? "";
107
+ if (p.open_id) {
108
+ log.info(`resolving P2P chat for open_id=${p.open_id}`);
109
+ chatId = await resolveP2PChatId(client, p.open_id, log);
110
+ }
111
+ const time = resolveTimeRange(p, log.info);
112
+ log.info(
113
+ `list: chat_id=${chatId}, sort=${p.sort_rule ?? "create_time_desc"}, page_size=${p.page_size ?? 50}`
114
+ );
115
+ const res = await client.invoke(
116
+ "feishu_im_user_get_messages.default",
117
+ (sdk, opts) => sdk.im.v1.message.list(
118
+ {
119
+ params: {
120
+ container_id_type: "chat",
121
+ container_id: chatId,
122
+ start_time: time.start,
123
+ end_time: time.end,
124
+ sort_type: sortRuleToSortType(p.sort_rule),
125
+ page_size: p.page_size ?? 50,
126
+ page_token: p.page_token,
127
+ card_msg_content_type: "raw_card_content"
128
+ }
129
+ },
130
+ opts
131
+ ),
132
+ {
133
+ as: "user"
134
+ }
135
+ );
136
+ assertLarkOk(res);
137
+ return formatAndReturn(res, config, log, client);
138
+ } catch (err) {
139
+ return await handleInvokeErrorWithAutoAuth(err, config);
140
+ }
141
+ }
142
+ },
143
+ { name: "feishu_im_user_get_messages" }
144
+ );
145
+ }
146
+ const GetThreadMessagesSchema = Type.Object({
147
+ thread_id: Type.String({ description: "\u8BDD\u9898 ID\uFF08omt_xxx \u683C\u5F0F\uFF09" }),
148
+ sort_rule: Type.Optional(
149
+ Type.Union([Type.Literal("create_time_asc"), Type.Literal("create_time_desc")], {
150
+ description: "\u6392\u5E8F\u65B9\u5F0F\uFF0C\u9ED8\u8BA4 create_time_desc\uFF08\u6700\u65B0\u6D88\u606F\u5728\u524D\uFF09"
151
+ })
152
+ ),
153
+ page_size: Type.Optional(Type.Number({ description: "\u6BCF\u9875\u6D88\u606F\u6570\uFF081-50\uFF09\uFF0C\u9ED8\u8BA4 50", minimum: 1, maximum: 50 })),
154
+ page_token: Type.Optional(Type.String({ description: "\u5206\u9875\u6807\u8BB0\uFF0C\u7528\u4E8E\u83B7\u53D6\u4E0B\u4E00\u9875" }))
155
+ });
156
+ function registerGetThreadMessages(api) {
157
+ if (!api.config) return;
158
+ const config = api.config;
159
+ const { toolClient, log } = createToolContext(api, "feishu_im_user_get_thread_messages");
160
+ api.registerTool(
161
+ {
162
+ name: "feishu_im_user_get_thread_messages",
163
+ label: "Feishu: Get Thread Messages",
164
+ description: "\u3010\u4EE5\u7528\u6237\u8EAB\u4EFD\u3011\u83B7\u53D6\u8BDD\u9898\uFF08thread\uFF09\u5185\u7684\u6D88\u606F\u5217\u8868\u3002\n\n\u7528\u6CD5\uFF1A\n- \u901A\u8FC7 thread_id\uFF08omt_xxx\uFF09\u83B7\u53D6\u8BDD\u9898\u5185\u7684\u6240\u6709\u6D88\u606F\n- \u652F\u6301\u5206\u9875\uFF1Apage_size + page_token\n\n\u3010\u6CE8\u610F\u3011\u8BDD\u9898\u6D88\u606F\u4E0D\u652F\u6301\u65F6\u95F4\u8303\u56F4\u8FC7\u6EE4\uFF08\u98DE\u4E66 API \u9650\u5236\uFF09\n\n\u8FD4\u56DE\u6D88\u606F\u5217\u8868\uFF0C\u683C\u5F0F\u540C feishu_im_user_get_messages\u3002",
165
+ parameters: GetThreadMessagesSchema,
166
+ async execute(_toolCallId, params) {
167
+ const p = params;
168
+ try {
169
+ const client = toolClient();
170
+ log.info(
171
+ `list: thread_id=${p.thread_id}, sort=${p.sort_rule ?? "create_time_desc"}, page_size=${p.page_size ?? 50}`
172
+ );
173
+ const res = await client.invoke(
174
+ "feishu_im_user_get_messages.default",
175
+ (sdk, opts) => sdk.im.v1.message.list(
176
+ {
177
+ params: {
178
+ container_id_type: "thread",
179
+ container_id: p.thread_id,
180
+ sort_type: sortRuleToSortType(p.sort_rule),
181
+ page_size: p.page_size ?? 50,
182
+ page_token: p.page_token,
183
+ card_msg_content_type: "raw_card_content"
184
+ }
185
+ },
186
+ opts
187
+ ),
188
+ {
189
+ as: "user"
190
+ }
191
+ );
192
+ assertLarkOk(res);
193
+ return formatAndReturn(res, config, log, client);
194
+ } catch (err) {
195
+ return await handleInvokeErrorWithAutoAuth(err, config);
196
+ }
197
+ }
198
+ },
199
+ { name: "feishu_im_user_get_thread_messages" }
200
+ );
201
+ }
202
+ const SearchMessagesSchema = Type.Object({
203
+ query: Type.Optional(Type.String({ description: "\u641C\u7D22\u5173\u952E\u8BCD\uFF0C\u5339\u914D\u6D88\u606F\u5185\u5BB9\u3002\u53EF\u4E3A\u7A7A\u5B57\u7B26\u4E32\u8868\u793A\u4E0D\u6309\u5185\u5BB9\u8FC7\u6EE4" })),
204
+ sender_ids: Type.Optional(
205
+ Type.Array(Type.String({ description: "\u53D1\u9001\u8005\u7684 open_id\uFF08ou_xxx\uFF09" }), {
206
+ description: "\u53D1\u9001\u8005 open_id \u5217\u8868\u3002\u5982\u9700\u6839\u636E\u7528\u6237\u540D\u67E5\u627E open_id\uFF0C\u8BF7\u5148\u4F7F\u7528 search_user \u5DE5\u5177"
207
+ })
208
+ ),
209
+ chat_id: Type.Optional(Type.String({ description: "\u9650\u5B9A\u641C\u7D22\u8303\u56F4\u7684\u4F1A\u8BDD ID\uFF08oc_xxx\uFF09" })),
210
+ mention_ids: Type.Optional(
211
+ Type.Array(Type.String({ description: "\u88AB@\u7528\u6237\u7684 open_id\uFF08ou_xxx\uFF09" }), { description: "\u88AB@\u7528\u6237\u7684 open_id \u5217\u8868" })
212
+ ),
213
+ message_type: Type.Optional(
214
+ Type.Union([Type.Literal("file"), Type.Literal("image"), Type.Literal("media")], {
215
+ description: "\u6D88\u606F\u7C7B\u578B\u8FC7\u6EE4\uFF1Afile / image / media\u3002\u4E3A\u7A7A\u5219\u641C\u7D22\u6240\u6709\u7C7B\u578B"
216
+ })
217
+ ),
218
+ sender_type: Type.Optional(
219
+ Type.Union([Type.Literal("user"), Type.Literal("bot"), Type.Literal("all")], {
220
+ description: "\u53D1\u9001\u8005\u7C7B\u578B\uFF1Auser / bot / all\u3002\u9ED8\u8BA4 user"
221
+ })
222
+ ),
223
+ chat_type: Type.Optional(
224
+ Type.Union([Type.Literal("group"), Type.Literal("p2p")], {
225
+ description: "\u4F1A\u8BDD\u7C7B\u578B\uFF1Agroup\uFF08\u7FA4\u804A\uFF09/ p2p\uFF08\u5355\u804A\uFF09"
226
+ })
227
+ ),
228
+ relative_time: Type.Optional(
229
+ Type.String({
230
+ description: "\u76F8\u5BF9\u65F6\u95F4\u8303\u56F4\uFF1Atoday / yesterday / day_before_yesterday / this_week / last_week / this_month / last_month / last_{N}_{unit}\uFF08unit: minutes/hours/days\uFF09\u3002\u4E0E start_time/end_time \u4E92\u65A5"
231
+ })
232
+ ),
233
+ start_time: Type.Optional(
234
+ Type.String({
235
+ description: "\u8D77\u59CB\u65F6\u95F4\uFF08ISO 8601 \u683C\u5F0F\uFF0C\u5982 2026-02-27T00:00:00+08:00\uFF09\u3002\u4E0E relative_time \u4E92\u65A5"
236
+ })
237
+ ),
238
+ end_time: Type.Optional(
239
+ Type.String({
240
+ description: "\u7ED3\u675F\u65F6\u95F4\uFF08ISO 8601 \u683C\u5F0F\uFF0C\u5982 2026-02-27T23:59:59+08:00\uFF09\u3002\u4E0E relative_time \u4E92\u65A5"
241
+ })
242
+ ),
243
+ page_size: Type.Optional(Type.Number({ description: "\u6BCF\u9875\u6D88\u606F\u6570\uFF081-50\uFF09\uFF0C\u9ED8\u8BA4 50", minimum: 1, maximum: 50 })),
244
+ page_token: Type.Optional(Type.String({ description: "\u5206\u9875\u6807\u8BB0\uFF0C\u7528\u4E8E\u83B7\u53D6\u4E0B\u4E00\u9875" }))
245
+ });
246
+ function buildSearchData(p, time) {
247
+ const data = {
248
+ query: p.query ?? "",
249
+ start_time: time.start,
250
+ end_time: time.end
251
+ };
252
+ if (p.sender_ids?.length) data.from_ids = p.sender_ids;
253
+ if (p.chat_id) data.chat_ids = [p.chat_id];
254
+ if (p.mention_ids?.length) data.at_chatter_ids = p.mention_ids;
255
+ if (p.message_type) data.message_type = p.message_type;
256
+ if (p.sender_type && p.sender_type !== "all") data.from_type = p.sender_type;
257
+ if (p.chat_type) data.chat_type = p.chat_type === "group" ? "group_chat" : "p2p_chat";
258
+ return data;
259
+ }
260
+ async function fetchChatContexts(client, chatIds, logInfo, logWarn) {
261
+ const map = /* @__PURE__ */ new Map();
262
+ if (chatIds.length === 0) return map;
263
+ try {
264
+ logInfo(`batch_query: requesting ${chatIds.length} chat_ids: ${chatIds.join(", ")}`);
265
+ const res = await client.invokeByPath("feishu_im_user_search_messages.default", "/open-apis/im/v1/chats/batch_query", {
266
+ method: "POST",
267
+ body: { chat_ids: chatIds },
268
+ query: { user_id_type: "open_id" },
269
+ as: "user"
270
+ });
271
+ logInfo(`batch_query: response code=${res.code}, msg=${res.msg}, items=${res.data?.items?.length ?? 0}`);
272
+ if (res.code !== 0) {
273
+ logWarn(`batch_query: API returned error code=${res.code}, msg=${res.msg}`);
274
+ }
275
+ for (const c of res.data?.items ?? []) {
276
+ if (c.chat_id) {
277
+ map.set(c.chat_id, {
278
+ name: c.name ?? "",
279
+ chat_mode: c.chat_mode ?? "",
280
+ p2p_target_id: c.p2p_target_id
281
+ });
282
+ }
283
+ }
284
+ } catch (err) {
285
+ logInfo(`batch_query chats failed, skipping: ${err}`);
286
+ }
287
+ return map;
288
+ }
289
+ async function resolveP2PTargetNames(chatMap, client, logFn) {
290
+ const ids = [...new Set([...chatMap.values()].map((c) => c.p2p_target_id).filter((id) => !!id))];
291
+ if (ids.length > 0) {
292
+ await batchResolveUserNamesAsUser({ client, openIds: ids, log: logFn });
293
+ }
294
+ }
295
+ function enrichMessages(messages, items, chatMap, nameResolver) {
296
+ return messages.map((msg, idx) => {
297
+ const chatId = items[idx]?.chat_id;
298
+ const ctx = chatId ? chatMap.get(chatId) : void 0;
299
+ if (!chatId || !ctx) return { ...msg, chat_id: chatId };
300
+ if (ctx.chat_mode === "p2p" && ctx.p2p_target_id) {
301
+ const name = nameResolver(ctx.p2p_target_id);
302
+ return {
303
+ ...msg,
304
+ chat_id: chatId,
305
+ chat_type: "p2p",
306
+ chat_name: name || void 0,
307
+ chat_partner: { open_id: ctx.p2p_target_id, name: name || void 0 }
308
+ };
309
+ }
310
+ return {
311
+ ...msg,
312
+ chat_id: chatId,
313
+ chat_type: ctx.chat_mode,
314
+ chat_name: ctx.name || void 0
315
+ };
316
+ });
317
+ }
318
+ function registerSearchMessages(api) {
319
+ if (!api.config) return;
320
+ const config = api.config;
321
+ const { toolClient, log } = createToolContext(api, "feishu_im_user_search_messages");
322
+ api.registerTool(
323
+ {
324
+ name: "feishu_im_user_search_messages",
325
+ label: "Feishu: Search Messages",
326
+ description: "\u3010\u4EE5\u7528\u6237\u8EAB\u4EFD\u3011\u8DE8\u4F1A\u8BDD\u641C\u7D22\u98DE\u4E66\u6D88\u606F\u3002\n\n\u7528\u6CD5\uFF1A\n- \u6309\u5173\u952E\u8BCD\u641C\u7D22\u6D88\u606F\u5185\u5BB9\n- \u6309\u53D1\u9001\u8005\u3001\u88AB@\u7528\u6237\u3001\u6D88\u606F\u7C7B\u578B\u8FC7\u6EE4\n- \u6309\u65F6\u95F4\u8303\u56F4\u8FC7\u6EE4\uFF1Arelative_time \u6216 start_time/end_time\n- \u9650\u5B9A\u5728\u67D0\u4E2A\u4F1A\u8BDD\u5185\u641C\u7D22\uFF08chat_id\uFF09\n- \u652F\u6301\u5206\u9875\uFF1Apage_size + page_token\n\n\u3010\u53C2\u6570\u7EA6\u675F\u3011\n- \u6240\u6709\u53C2\u6570\u5747\u53EF\u9009\uFF0C\u4F46\u81F3\u5C11\u5E94\u63D0\u4F9B\u4E00\u4E2A\u8FC7\u6EE4\u6761\u4EF6\n- relative_time \u548C start_time/end_time \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528\n- page_size \u8303\u56F4 1-50\uFF0C\u9ED8\u8BA4 50\n\n\u8FD4\u56DE\u6D88\u606F\u5217\u8868\uFF0C\u6BCF\u6761\u6D88\u606F\u5305\u542B message_id\u3001msg_type\u3001content\u3001sender\u3001create_time \u7B49\u5B57\u6BB5\u3002\n\u6BCF\u6761\u6D88\u606F\u8FD8\u5305\u542B chat_id\u3001chat_type\uFF08p2p/group\uFF09\u3001chat_name\uFF08\u7FA4\u540D\u6216\u5355\u804A\u5BF9\u65B9\u540D\u5B57\uFF09\u3002\n\u5355\u804A\u6D88\u606F\u989D\u5916\u5305\u542B chat_partner\uFF08\u5BF9\u65B9 open_id \u548C\u540D\u5B57\uFF09\u3002\n\u641C\u7D22\u7ED3\u679C\u4E2D\u7684 chat_id \u548C thread_id \u53EF\u914D\u5408 feishu_im_user_get_messages / feishu_im_user_get_thread_messages \u67E5\u770B\u4E0A\u4E0B\u6587\u3002",
327
+ parameters: SearchMessagesSchema,
328
+ async execute(_toolCallId, params) {
329
+ const p = params;
330
+ try {
331
+ if (p.relative_time && (p.start_time || p.end_time)) {
332
+ return json({ error: "cannot use both relative_time and start_time/end_time" });
333
+ }
334
+ const client = toolClient();
335
+ const account = getFirstAccount(config);
336
+ const logFn = (...args) => log.info(args.map(String).join(" "));
337
+ const time = resolveTimeRange(p, log.info);
338
+ const searchData = buildSearchData(p, {
339
+ start: time.start ?? "978307200",
340
+ end: time.end ?? Math.floor(Date.now() / 1e3).toString()
341
+ });
342
+ log.info(`search: query="${p.query ?? ""}", page_size=${p.page_size ?? 50}`);
343
+ const searchRes = await client.invoke(
344
+ "feishu_im_user_search_messages.default",
345
+ (sdk, opts) => sdk.search.message.create(
346
+ {
347
+ data: searchData,
348
+ params: {
349
+ user_id_type: "open_id",
350
+ page_size: p.page_size ?? 50,
351
+ page_token: p.page_token
352
+ }
353
+ },
354
+ opts
355
+ ),
356
+ {
357
+ as: "user"
358
+ }
359
+ );
360
+ assertLarkOk(searchRes);
361
+ const messageIds = searchRes.data?.items ?? [];
362
+ const hasMore = searchRes.data?.has_more ?? false;
363
+ const pageToken = searchRes.data?.page_token;
364
+ log.info(`search: found ${messageIds.length} IDs, has_more=${hasMore}`);
365
+ if (messageIds.length === 0) {
366
+ return json({ messages: [], has_more: hasMore, page_token: pageToken });
367
+ }
368
+ const queryStr = messageIds.map((id) => `message_ids=${encodeURIComponent(id)}`).join("&");
369
+ const mgetRes = await client.invokeByPath("feishu_im_user_search_messages.default", `/open-apis/im/v1/messages/mget?${queryStr}`, {
370
+ method: "GET",
371
+ query: { user_id_type: "open_id", card_msg_content_type: "raw_card_content" },
372
+ as: "user"
373
+ });
374
+ const items = mgetRes.data?.items ?? [];
375
+ log.info(`mget: ${items.length} details`);
376
+ const chatIds = [
377
+ ...new Set(items.map((i) => i.chat_id).filter(Boolean))
378
+ ];
379
+ const chatMap = await fetchChatContexts(client, chatIds, log.info, log.warn);
380
+ const p2pChats = [...chatMap.entries()].filter(([, v]) => v.chat_mode === "p2p");
381
+ log.info(`chats: ${chatMap.size}/${chatIds.length} resolved, p2p=${p2pChats.length}`);
382
+ const messages = await formatMessageList(items, account, logFn, client);
383
+ await resolveP2PTargetNames(chatMap, client, logFn);
384
+ const uatNameResolver = (id) => getUATUserName(account.accountId, id);
385
+ const result = enrichMessages(messages, items, chatMap, uatNameResolver);
386
+ log.info(`result: ${result.length} messages, has_more=${hasMore}`);
387
+ return json({ messages: result, has_more: hasMore, page_token: pageToken });
388
+ } catch (err) {
389
+ return await handleInvokeErrorWithAutoAuth(err, config);
390
+ }
391
+ }
392
+ },
393
+ { name: "feishu_im_user_search_messages" }
394
+ );
395
+ }
396
+ function registerMessageReadTools(api) {
397
+ registerGetMessages(api);
398
+ registerGetThreadMessages(api);
399
+ registerSearchMessages(api);
400
+ }
401
+ export {
402
+ registerMessageReadTools
403
+ };
404
+ //# sourceMappingURL=message-read.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/tools/oapi/im/message-read.ts"],
4
+ "sourcesContent": ["/**\n * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n *\n * \u6D88\u606F\u8BFB\u53D6\u5DE5\u5177\u96C6 -- \u4EE5\u7528\u6237\u8EAB\u4EFD\u83B7\u53D6/\u641C\u7D22\u98DE\u4E66\u6D88\u606F\n *\n * \u5305\u542B\uFF1A\n * - feishu_im_user_get_messages (chat_id / open_id \u2192 \u4F1A\u8BDD\u6D88\u606F)\n * - feishu_im_user_get_thread_messages (thread_id \u2192 \u8BDD\u9898\u6D88\u606F)\n * - feishu_im_user_search_messages (\u8DE8\u4F1A\u8BDD\u5173\u952E\u8BCD\u641C\u7D22)\n */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { OpenClawPluginApi } from 'openclaw/plugin-sdk';\nimport { Type } from '@sinclair/typebox';\nimport type { ToolClient } from '../helpers';\nimport { assertLarkOk, createToolContext, getFirstAccount, handleInvokeErrorWithAutoAuth, json } from '../helpers';\nimport { dateTimeToSecondsString, parseTimeRangeToSeconds } from './time-utils';\nimport { formatMessageList, type FormattedMessage } from './format-messages';\nimport { getUATUserName, batchResolveUserNamesAsUser } from './user-name-uat';\n\n// ===========================================================================\n// Shared helpers\n// ===========================================================================\n\nfunction sortRuleToSortType(rule?: 'create_time_asc' | 'create_time_desc'): 'ByCreateTimeAsc' | 'ByCreateTimeDesc' {\n return rule === 'create_time_asc' ? 'ByCreateTimeAsc' : 'ByCreateTimeDesc';\n}\n\n/** open_id \u2192 chat_id (P2P \u5355\u804A) */\nasync function resolveP2PChatId(\n client: ToolClient,\n openId: string,\n log: { info: (msg: string) => void },\n): Promise<string> {\n const res = await client.invokeByPath<{\n code?: number;\n msg?: string;\n data?: { p2p_chats?: Array<{ chat_id: string }> };\n }>('feishu_im_user_get_messages.default', '/open-apis/im/v1/chat_p2p/batch_query', {\n method: 'POST',\n body: { chatter_ids: [openId] },\n query: { user_id_type: 'open_id' },\n as: 'user',\n });\n\n const chats = res.data?.p2p_chats;\n if (!chats?.length) {\n log.info(`batch_query: no p2p chat found for open_id=${openId}`);\n throw new Error(`no 1-on-1 chat found with open_id=${openId}. You may not have chat history with this user.`);\n }\n\n log.info(`batch_query: resolved chat_id=${chats[0].chat_id}`);\n return chats[0].chat_id;\n}\n\n/** \u89E3\u6790\u65F6\u95F4\u53C2\u6570\uFF0C\u8FD4\u56DE\u79D2\u7EA7\u65F6\u95F4\u6233\u5B57\u7B26\u4E32 */\nfunction resolveTimeRange(\n p: { relative_time?: string; start_time?: string; end_time?: string },\n logInfo: (msg: string) => void,\n): { start?: string; end?: string } {\n if (p.relative_time) {\n const range = parseTimeRangeToSeconds(p.relative_time);\n logInfo(`relative_time=\"${p.relative_time}\" \u2192 start=${range.start}, end=${range.end}`);\n return range;\n }\n return {\n start: p.start_time ? dateTimeToSecondsString(p.start_time) : undefined,\n end: p.end_time ? dateTimeToSecondsString(p.end_time) : undefined,\n };\n}\n\n/** \u683C\u5F0F\u5316 message.list \u7ED3\u679C\u5E76\u8FD4\u56DE */\nasync function formatAndReturn(res: any, config: any, log: { info: (msg: string) => void }, client: ToolClient) {\n const items = res.data?.items ?? [];\n const account = getFirstAccount(config);\n const messages = await formatMessageList(\n items,\n account,\n (...args: unknown[]) => log.info(args.map(String).join(' ')),\n client,\n );\n\n const hasMore: boolean = res.data?.has_more ?? false;\n const pageToken: string | undefined = res.data?.page_token;\n log.info(`list: returned ${messages.length} messages, has_more=${hasMore}`);\n\n return json({ messages, has_more: hasMore, page_token: pageToken });\n}\n\n// ===========================================================================\n// feishu_im_user_get_messages\n// ===========================================================================\n\nconst GetMessagesSchema = Type.Object({\n open_id: Type.Optional(\n Type.String({\n description: '\u7528\u6237 open_id\uFF08ou_xxx\uFF09\uFF0C\u83B7\u53D6\u4E0E\u8BE5\u7528\u6237\u7684\u5355\u804A\u6D88\u606F\u3002\u4E0E chat_id \u4E92\u65A5',\n }),\n ),\n chat_id: Type.Optional(\n Type.String({\n description: '\u4F1A\u8BDD ID\uFF08oc_xxx\uFF09\uFF0C\u652F\u6301\u5355\u804A\u548C\u7FA4\u804A\u3002\u4E0E open_id \u4E92\u65A5',\n }),\n ),\n sort_rule: Type.Optional(\n Type.Union([Type.Literal('create_time_asc'), Type.Literal('create_time_desc')], {\n description: '\u6392\u5E8F\u65B9\u5F0F\uFF0C\u9ED8\u8BA4 create_time_desc\uFF08\u6700\u65B0\u6D88\u606F\u5728\u524D\uFF09',\n }),\n ),\n page_size: Type.Optional(Type.Number({ description: '\u6BCF\u9875\u6D88\u606F\u6570\uFF081-50\uFF09\uFF0C\u9ED8\u8BA4 50', minimum: 1, maximum: 50 })),\n page_token: Type.Optional(Type.String({ description: '\u5206\u9875\u6807\u8BB0\uFF0C\u7528\u4E8E\u83B7\u53D6\u4E0B\u4E00\u9875' })),\n relative_time: Type.Optional(\n Type.String({\n description:\n '\u76F8\u5BF9\u65F6\u95F4\u8303\u56F4\uFF1Atoday / yesterday / day_before_yesterday / this_week / last_week / this_month / last_month / last_{N}_{unit}\uFF08unit: minutes/hours/days\uFF09\u3002\u4E0E start_time/end_time \u4E92\u65A5',\n }),\n ),\n start_time: Type.Optional(\n Type.String({\n description: '\u8D77\u59CB\u65F6\u95F4\uFF08ISO 8601 \u683C\u5F0F\uFF0C\u5982 2026-02-27T00:00:00+08:00\uFF09\u3002\u4E0E relative_time \u4E92\u65A5',\n }),\n ),\n end_time: Type.Optional(\n Type.String({\n description: '\u7ED3\u675F\u65F6\u95F4\uFF08ISO 8601 \u683C\u5F0F\uFF0C\u5982 2026-02-27T23:59:59+08:00\uFF09\u3002\u4E0E relative_time \u4E92\u65A5',\n }),\n ),\n});\n\ninterface GetMessagesParams {\n open_id?: string;\n chat_id?: string;\n sort_rule?: 'create_time_asc' | 'create_time_desc';\n page_size?: number;\n page_token?: string;\n relative_time?: string;\n start_time?: string;\n end_time?: string;\n}\n\nfunction registerGetMessages(api: OpenClawPluginApi) {\n if (!api.config) return;\n const config = api.config;\n const { toolClient, log } = createToolContext(api, 'feishu_im_user_get_messages');\n\n api.registerTool(\n {\n name: 'feishu_im_user_get_messages',\n label: 'Feishu: Get IM Messages',\n description:\n '\u3010\u4EE5\u7528\u6237\u8EAB\u4EFD\u3011\u83B7\u53D6\u7FA4\u804A\u6216\u5355\u804A\u7684\u5386\u53F2\u6D88\u606F\u3002' +\n '\\n\\n\u7528\u6CD5\uFF1A' +\n '\\n- \u901A\u8FC7 chat_id \u83B7\u53D6\u7FA4\u804A/\u5355\u804A\u6D88\u606F' +\n '\\n- \u901A\u8FC7 open_id \u83B7\u53D6\u4E0E\u6307\u5B9A\u7528\u6237\u7684\u5355\u804A\u6D88\u606F\uFF08\u81EA\u52A8\u89E3\u6790 chat_id\uFF09' +\n '\\n- \u652F\u6301\u65F6\u95F4\u8303\u56F4\u8FC7\u6EE4\uFF1Arelative_time\uFF08\u5982 today\u3001last_3_days\uFF09\u6216 start_time/end_time\uFF08ISO 8601 \u683C\u5F0F\uFF09' +\n '\\n- \u652F\u6301\u5206\u9875\uFF1Apage_size + page_token' +\n '\\n\\n\u3010\u53C2\u6570\u7EA6\u675F\u3011' +\n '\\n- open_id \u548C chat_id \u5FC5\u987B\u4E8C\u9009\u4E00\uFF0C\u4E0D\u80FD\u540C\u65F6\u63D0\u4F9B' +\n '\\n- relative_time \u548C start_time/end_time \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528' +\n '\\n- page_size \u8303\u56F4 1-50\uFF0C\u9ED8\u8BA4 50' +\n '\\n\\n\u8FD4\u56DE\u6D88\u606F\u5217\u8868\uFF0C\u6BCF\u6761\u6D88\u606F\u5305\u542B message_id\u3001msg_type\u3001content\uFF08AI \u53EF\u8BFB\u6587\u672C\uFF09\u3001sender\u3001create_time \u7B49\u5B57\u6BB5\u3002',\n parameters: GetMessagesSchema,\n async execute(_toolCallId: string, params: unknown) {\n const p = params as GetMessagesParams;\n try {\n if (p.open_id && p.chat_id) {\n return json({ error: 'cannot provide both open_id and chat_id, please provide only one' });\n }\n if (!p.open_id && !p.chat_id) {\n return json({ error: 'either open_id or chat_id is required' });\n }\n if (p.relative_time && (p.start_time || p.end_time)) {\n return json({ error: 'cannot use both relative_time and start_time/end_time' });\n }\n\n const client = toolClient();\n\n let chatId = p.chat_id ?? '';\n if (p.open_id) {\n log.info(`resolving P2P chat for open_id=${p.open_id}`);\n chatId = await resolveP2PChatId(client, p.open_id, log);\n }\n\n const time = resolveTimeRange(p, log.info);\n log.info(\n `list: chat_id=${chatId}, sort=${p.sort_rule ?? 'create_time_desc'}, page_size=${p.page_size ?? 50}`,\n );\n\n const res = await client.invoke(\n 'feishu_im_user_get_messages.default',\n (sdk, opts) =>\n sdk.im.v1.message.list(\n {\n params: {\n container_id_type: 'chat',\n container_id: chatId,\n start_time: time.start,\n end_time: time.end,\n sort_type: sortRuleToSortType(p.sort_rule),\n page_size: p.page_size ?? 50,\n page_token: p.page_token,\n card_msg_content_type: 'raw_card_content',\n } as any,\n },\n opts,\n ),\n {\n as: 'user',\n },\n );\n assertLarkOk(res);\n\n return formatAndReturn(res, config, log, client);\n } catch (err) {\n return await handleInvokeErrorWithAutoAuth(err, config);\n }\n },\n },\n { name: 'feishu_im_user_get_messages' },\n );\n}\n\n// ===========================================================================\n// feishu_im_user_get_thread_messages\n// ===========================================================================\n\nconst GetThreadMessagesSchema = Type.Object({\n thread_id: Type.String({ description: '\u8BDD\u9898 ID\uFF08omt_xxx \u683C\u5F0F\uFF09' }),\n sort_rule: Type.Optional(\n Type.Union([Type.Literal('create_time_asc'), Type.Literal('create_time_desc')], {\n description: '\u6392\u5E8F\u65B9\u5F0F\uFF0C\u9ED8\u8BA4 create_time_desc\uFF08\u6700\u65B0\u6D88\u606F\u5728\u524D\uFF09',\n }),\n ),\n page_size: Type.Optional(Type.Number({ description: '\u6BCF\u9875\u6D88\u606F\u6570\uFF081-50\uFF09\uFF0C\u9ED8\u8BA4 50', minimum: 1, maximum: 50 })),\n page_token: Type.Optional(Type.String({ description: '\u5206\u9875\u6807\u8BB0\uFF0C\u7528\u4E8E\u83B7\u53D6\u4E0B\u4E00\u9875' })),\n});\n\ninterface GetThreadMessagesParams {\n thread_id: string;\n sort_rule?: 'create_time_asc' | 'create_time_desc';\n page_size?: number;\n page_token?: string;\n}\n\nfunction registerGetThreadMessages(api: OpenClawPluginApi) {\n if (!api.config) return;\n const config = api.config;\n const { toolClient, log } = createToolContext(api, 'feishu_im_user_get_thread_messages');\n\n api.registerTool(\n {\n name: 'feishu_im_user_get_thread_messages',\n label: 'Feishu: Get Thread Messages',\n description:\n '\u3010\u4EE5\u7528\u6237\u8EAB\u4EFD\u3011\u83B7\u53D6\u8BDD\u9898\uFF08thread\uFF09\u5185\u7684\u6D88\u606F\u5217\u8868\u3002' +\n '\\n\\n\u7528\u6CD5\uFF1A' +\n '\\n- \u901A\u8FC7 thread_id\uFF08omt_xxx\uFF09\u83B7\u53D6\u8BDD\u9898\u5185\u7684\u6240\u6709\u6D88\u606F' +\n '\\n- \u652F\u6301\u5206\u9875\uFF1Apage_size + page_token' +\n '\\n\\n\u3010\u6CE8\u610F\u3011\u8BDD\u9898\u6D88\u606F\u4E0D\u652F\u6301\u65F6\u95F4\u8303\u56F4\u8FC7\u6EE4\uFF08\u98DE\u4E66 API \u9650\u5236\uFF09' +\n '\\n\\n\u8FD4\u56DE\u6D88\u606F\u5217\u8868\uFF0C\u683C\u5F0F\u540C feishu_im_user_get_messages\u3002',\n parameters: GetThreadMessagesSchema,\n async execute(_toolCallId: string, params: unknown) {\n const p = params as GetThreadMessagesParams;\n try {\n const client = toolClient();\n log.info(\n `list: thread_id=${p.thread_id}, sort=${p.sort_rule ?? 'create_time_desc'}, page_size=${p.page_size ?? 50}`,\n );\n\n const res = await client.invoke(\n 'feishu_im_user_get_messages.default',\n (sdk, opts) =>\n sdk.im.v1.message.list(\n {\n params: {\n container_id_type: 'thread',\n container_id: p.thread_id,\n sort_type: sortRuleToSortType(p.sort_rule),\n page_size: p.page_size ?? 50,\n page_token: p.page_token,\n card_msg_content_type: 'raw_card_content',\n } as any,\n },\n opts,\n ),\n {\n as: 'user',\n },\n );\n assertLarkOk(res);\n\n return formatAndReturn(res, config, log, client);\n } catch (err) {\n return await handleInvokeErrorWithAutoAuth(err, config);\n }\n },\n },\n { name: 'feishu_im_user_get_thread_messages' },\n );\n}\n\n// ===========================================================================\n// feishu_im_user_search_messages\n// ===========================================================================\n\nconst SearchMessagesSchema = Type.Object({\n query: Type.Optional(Type.String({ description: '\u641C\u7D22\u5173\u952E\u8BCD\uFF0C\u5339\u914D\u6D88\u606F\u5185\u5BB9\u3002\u53EF\u4E3A\u7A7A\u5B57\u7B26\u4E32\u8868\u793A\u4E0D\u6309\u5185\u5BB9\u8FC7\u6EE4' })),\n sender_ids: Type.Optional(\n Type.Array(Type.String({ description: '\u53D1\u9001\u8005\u7684 open_id\uFF08ou_xxx\uFF09' }), {\n description: '\u53D1\u9001\u8005 open_id \u5217\u8868\u3002\u5982\u9700\u6839\u636E\u7528\u6237\u540D\u67E5\u627E open_id\uFF0C\u8BF7\u5148\u4F7F\u7528 search_user \u5DE5\u5177',\n }),\n ),\n chat_id: Type.Optional(Type.String({ description: '\u9650\u5B9A\u641C\u7D22\u8303\u56F4\u7684\u4F1A\u8BDD ID\uFF08oc_xxx\uFF09' })),\n mention_ids: Type.Optional(\n Type.Array(Type.String({ description: '\u88AB@\u7528\u6237\u7684 open_id\uFF08ou_xxx\uFF09' }), { description: '\u88AB@\u7528\u6237\u7684 open_id \u5217\u8868' }),\n ),\n message_type: Type.Optional(\n Type.Union([Type.Literal('file'), Type.Literal('image'), Type.Literal('media')], {\n description: '\u6D88\u606F\u7C7B\u578B\u8FC7\u6EE4\uFF1Afile / image / media\u3002\u4E3A\u7A7A\u5219\u641C\u7D22\u6240\u6709\u7C7B\u578B',\n }),\n ),\n sender_type: Type.Optional(\n Type.Union([Type.Literal('user'), Type.Literal('bot'), Type.Literal('all')], {\n description: '\u53D1\u9001\u8005\u7C7B\u578B\uFF1Auser / bot / all\u3002\u9ED8\u8BA4 user',\n }),\n ),\n chat_type: Type.Optional(\n Type.Union([Type.Literal('group'), Type.Literal('p2p')], {\n description: '\u4F1A\u8BDD\u7C7B\u578B\uFF1Agroup\uFF08\u7FA4\u804A\uFF09/ p2p\uFF08\u5355\u804A\uFF09',\n }),\n ),\n relative_time: Type.Optional(\n Type.String({\n description:\n '\u76F8\u5BF9\u65F6\u95F4\u8303\u56F4\uFF1Atoday / yesterday / day_before_yesterday / this_week / last_week / this_month / last_month / last_{N}_{unit}\uFF08unit: minutes/hours/days\uFF09\u3002\u4E0E start_time/end_time \u4E92\u65A5',\n }),\n ),\n start_time: Type.Optional(\n Type.String({\n description: '\u8D77\u59CB\u65F6\u95F4\uFF08ISO 8601 \u683C\u5F0F\uFF0C\u5982 2026-02-27T00:00:00+08:00\uFF09\u3002\u4E0E relative_time \u4E92\u65A5',\n }),\n ),\n end_time: Type.Optional(\n Type.String({\n description: '\u7ED3\u675F\u65F6\u95F4\uFF08ISO 8601 \u683C\u5F0F\uFF0C\u5982 2026-02-27T23:59:59+08:00\uFF09\u3002\u4E0E relative_time \u4E92\u65A5',\n }),\n ),\n page_size: Type.Optional(Type.Number({ description: '\u6BCF\u9875\u6D88\u606F\u6570\uFF081-50\uFF09\uFF0C\u9ED8\u8BA4 50', minimum: 1, maximum: 50 })),\n page_token: Type.Optional(Type.String({ description: '\u5206\u9875\u6807\u8BB0\uFF0C\u7528\u4E8E\u83B7\u53D6\u4E0B\u4E00\u9875' })),\n});\n\ninterface SearchMessagesParams {\n query?: string;\n sender_ids?: string[];\n chat_id?: string;\n mention_ids?: string[];\n message_type?: 'file' | 'image' | 'media';\n sender_type?: 'user' | 'bot' | 'all';\n chat_type?: 'group' | 'p2p';\n relative_time?: string;\n start_time?: string;\n end_time?: string;\n page_size?: number;\n page_token?: string;\n}\n\n// -- search \u4E13\u7528 helpers --\n\ninterface ChatContext {\n name: string;\n chat_mode: string;\n p2p_target_id?: string;\n}\n\nfunction buildSearchData(p: SearchMessagesParams, time: { start: string; end: string }): Record<string, unknown> {\n const data: Record<string, unknown> = {\n query: p.query ?? '',\n start_time: time.start,\n end_time: time.end,\n };\n if (p.sender_ids?.length) data.from_ids = p.sender_ids;\n if (p.chat_id) data.chat_ids = [p.chat_id];\n if (p.mention_ids?.length) data.at_chatter_ids = p.mention_ids;\n if (p.message_type) data.message_type = p.message_type;\n if (p.sender_type && p.sender_type !== 'all') data.from_type = p.sender_type;\n if (p.chat_type) data.chat_type = p.chat_type === 'group' ? 'group_chat' : 'p2p_chat';\n return data;\n}\n\nasync function fetchChatContexts(\n client: ToolClient,\n chatIds: string[],\n logInfo: (msg: string) => void,\n logWarn: (msg: string) => void,\n): Promise<Map<string, ChatContext>> {\n const map = new Map<string, ChatContext>();\n if (chatIds.length === 0) return map;\n\n try {\n logInfo(`batch_query: requesting ${chatIds.length} chat_ids: ${chatIds.join(', ')}`);\n const res = await client.invokeByPath<{\n code?: number;\n msg?: string;\n data?: {\n items?: Array<{\n chat_id?: string;\n name?: string;\n chat_mode?: string;\n p2p_target_id?: string;\n }>;\n };\n }>('feishu_im_user_search_messages.default', '/open-apis/im/v1/chats/batch_query', {\n method: 'POST',\n body: { chat_ids: chatIds },\n query: { user_id_type: 'open_id' },\n as: 'user',\n });\n logInfo(`batch_query: response code=${res.code}, msg=${res.msg}, items=${res.data?.items?.length ?? 0}`);\n if (res.code !== 0) {\n logWarn(`batch_query: API returned error code=${res.code}, msg=${res.msg}`);\n }\n for (const c of res.data?.items ?? []) {\n if (c.chat_id) {\n map.set(c.chat_id, {\n name: c.name ?? '',\n chat_mode: c.chat_mode ?? '',\n p2p_target_id: c.p2p_target_id,\n });\n }\n }\n } catch (err) {\n logInfo(`batch_query chats failed, skipping: ${err}`);\n }\n return map;\n}\n\nasync function resolveP2PTargetNames(\n chatMap: Map<string, ChatContext>,\n client: ToolClient,\n logFn: (...args: unknown[]) => void,\n): Promise<void> {\n const ids = [...new Set([...chatMap.values()].map((c) => c.p2p_target_id).filter((id): id is string => !!id))];\n if (ids.length > 0) {\n await batchResolveUserNamesAsUser({ client, openIds: ids, log: logFn });\n }\n}\n\nfunction enrichMessages(\n messages: FormattedMessage[],\n items: any[],\n chatMap: Map<string, ChatContext>,\n nameResolver: (openId: string) => string | undefined,\n) {\n return messages.map((msg, idx) => {\n const chatId: string | undefined = items[idx]?.chat_id;\n const ctx = chatId ? chatMap.get(chatId) : undefined;\n if (!chatId || !ctx) return { ...msg, chat_id: chatId };\n\n if (ctx.chat_mode === 'p2p' && ctx.p2p_target_id) {\n const name = nameResolver(ctx.p2p_target_id);\n return {\n ...msg,\n chat_id: chatId,\n chat_type: 'p2p' as const,\n chat_name: name || undefined,\n chat_partner: { open_id: ctx.p2p_target_id, name: name || undefined },\n };\n }\n\n return {\n ...msg,\n chat_id: chatId,\n chat_type: ctx.chat_mode,\n chat_name: ctx.name || undefined,\n };\n });\n}\n\nfunction registerSearchMessages(api: OpenClawPluginApi) {\n if (!api.config) return;\n const config = api.config;\n const { toolClient, log } = createToolContext(api, 'feishu_im_user_search_messages');\n\n api.registerTool(\n {\n name: 'feishu_im_user_search_messages',\n label: 'Feishu: Search Messages',\n description:\n '\u3010\u4EE5\u7528\u6237\u8EAB\u4EFD\u3011\u8DE8\u4F1A\u8BDD\u641C\u7D22\u98DE\u4E66\u6D88\u606F\u3002' +\n '\\n\\n\u7528\u6CD5\uFF1A' +\n '\\n- \u6309\u5173\u952E\u8BCD\u641C\u7D22\u6D88\u606F\u5185\u5BB9' +\n '\\n- \u6309\u53D1\u9001\u8005\u3001\u88AB@\u7528\u6237\u3001\u6D88\u606F\u7C7B\u578B\u8FC7\u6EE4' +\n '\\n- \u6309\u65F6\u95F4\u8303\u56F4\u8FC7\u6EE4\uFF1Arelative_time \u6216 start_time/end_time' +\n '\\n- \u9650\u5B9A\u5728\u67D0\u4E2A\u4F1A\u8BDD\u5185\u641C\u7D22\uFF08chat_id\uFF09' +\n '\\n- \u652F\u6301\u5206\u9875\uFF1Apage_size + page_token' +\n '\\n\\n\u3010\u53C2\u6570\u7EA6\u675F\u3011' +\n '\\n- \u6240\u6709\u53C2\u6570\u5747\u53EF\u9009\uFF0C\u4F46\u81F3\u5C11\u5E94\u63D0\u4F9B\u4E00\u4E2A\u8FC7\u6EE4\u6761\u4EF6' +\n '\\n- relative_time \u548C start_time/end_time \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528' +\n '\\n- page_size \u8303\u56F4 1-50\uFF0C\u9ED8\u8BA4 50' +\n '\\n\\n\u8FD4\u56DE\u6D88\u606F\u5217\u8868\uFF0C\u6BCF\u6761\u6D88\u606F\u5305\u542B message_id\u3001msg_type\u3001content\u3001sender\u3001create_time \u7B49\u5B57\u6BB5\u3002' +\n '\\n\u6BCF\u6761\u6D88\u606F\u8FD8\u5305\u542B chat_id\u3001chat_type\uFF08p2p/group\uFF09\u3001chat_name\uFF08\u7FA4\u540D\u6216\u5355\u804A\u5BF9\u65B9\u540D\u5B57\uFF09\u3002' +\n '\\n\u5355\u804A\u6D88\u606F\u989D\u5916\u5305\u542B chat_partner\uFF08\u5BF9\u65B9 open_id \u548C\u540D\u5B57\uFF09\u3002' +\n '\\n\u641C\u7D22\u7ED3\u679C\u4E2D\u7684 chat_id \u548C thread_id \u53EF\u914D\u5408 feishu_im_user_get_messages / feishu_im_user_get_thread_messages \u67E5\u770B\u4E0A\u4E0B\u6587\u3002',\n parameters: SearchMessagesSchema,\n\n async execute(_toolCallId: string, params: unknown) {\n const p = params as SearchMessagesParams;\n try {\n if (p.relative_time && (p.start_time || p.end_time)) {\n return json({ error: 'cannot use both relative_time and start_time/end_time' });\n }\n\n const client = toolClient();\n const account = getFirstAccount(config);\n const logFn = (...args: unknown[]) => log.info(args.map(String).join(' '));\n\n // 1. \u641C\u7D22\u6D88\u606F ID\n const time = resolveTimeRange(p, log.info);\n const searchData = buildSearchData(p, {\n start: time.start ?? '978307200',\n end: time.end ?? Math.floor(Date.now() / 1000).toString(),\n });\n log.info(`search: query=\"${p.query ?? ''}\", page_size=${p.page_size ?? 50}`);\n\n const searchRes = await client.invoke(\n 'feishu_im_user_search_messages.default',\n (sdk, opts) =>\n sdk.search.message.create(\n {\n data: searchData as any,\n params: {\n user_id_type: 'open_id',\n page_size: p.page_size ?? 50,\n page_token: p.page_token,\n },\n },\n opts!,\n ),\n {\n as: 'user',\n },\n );\n assertLarkOk(searchRes as any);\n\n const messageIds: string[] = (searchRes as any).data?.items ?? [];\n const hasMore: boolean = (searchRes as any).data?.has_more ?? false;\n const pageToken: string | undefined = (searchRes as any).data?.page_token;\n log.info(`search: found ${messageIds.length} IDs, has_more=${hasMore}`);\n\n if (messageIds.length === 0) {\n return json({ messages: [], has_more: hasMore, page_token: pageToken });\n }\n\n // 2. \u6279\u91CF\u83B7\u53D6\u6D88\u606F\u8BE6\u60C5\n const queryStr = messageIds.map((id) => `message_ids=${encodeURIComponent(id)}`).join('&');\n const mgetRes = await client.invokeByPath<{\n code?: number;\n msg?: string;\n data?: { items?: any[] };\n }>('feishu_im_user_search_messages.default', `/open-apis/im/v1/messages/mget?${queryStr}`, {\n method: 'GET',\n query: { user_id_type: 'open_id', card_msg_content_type: 'raw_card_content' },\n as: 'user',\n });\n const items = mgetRes.data?.items ?? [];\n log.info(`mget: ${items.length} details`);\n\n // 3. \u6279\u91CF\u83B7\u53D6\u4F1A\u8BDD\u4FE1\u606F\n const chatIds = [\n ...new Set(items.map((i: any) => i.chat_id as string | undefined).filter(Boolean)),\n ] as string[];\n const chatMap = await fetchChatContexts(client, chatIds, log.info, log.warn);\n const p2pChats = [...chatMap.entries()].filter(([, v]) => v.chat_mode === 'p2p');\n log.info(`chats: ${chatMap.size}/${chatIds.length} resolved, p2p=${p2pChats.length}`);\n\n // 4. \u683C\u5F0F\u5316\u6D88\u606F\uFF08\u586B\u5145 sender \u540D\u5B57\u7F13\u5B58\uFF0C\u4F7F\u7528 UAT\uFF09\n const messages = await formatMessageList(items, account, logFn, client);\n\n // 5. \u89E3\u6790 p2p \u5BF9\u65B9\u7528\u6237\u540D\uFF08\u4F7F\u7528 UAT\uFF09\n await resolveP2PTargetNames(chatMap, client, logFn);\n\n // 6. \u62FC\u88C5\u8FD4\u56DE\n const uatNameResolver = (id: string) => getUATUserName(account.accountId, id);\n const result = enrichMessages(messages, items, chatMap, uatNameResolver);\n log.info(`result: ${result.length} messages, has_more=${hasMore}`);\n\n return json({ messages: result, has_more: hasMore, page_token: pageToken });\n } catch (err) {\n return await handleInvokeErrorWithAutoAuth(err, config);\n }\n },\n },\n { name: 'feishu_im_user_search_messages' },\n );\n}\n\n// ===========================================================================\n// Unified registration\n// ===========================================================================\n\nexport function registerMessageReadTools(api: OpenClawPluginApi) {\n registerGetMessages(api);\n registerGetThreadMessages(api);\n registerSearchMessages(api);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }