@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Lark Technologies Pte. Ltd.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,80 @@
1
+ # OpenClaw Lark/Feishu Plugin
2
+
3
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
4
+ [![npm version](https://img.shields.io/npm/v/@larksuiteoapi/feishu-openclaw-plugin.svg)](https://www.npmjs.com/package/@larksuiteoapi/feishu-openclaw-plugin)
5
+ [![Node.js Version](https://img.shields.io/badge/node-%3E%3D22-blue.svg)](https://nodejs.org/)
6
+
7
+ [中文版](./README.zh.md) | English
8
+
9
+ This is the official Lark/Feishu plugin for OpenClaw, developed and maintained by the Lark/Feishu Open Platform team. It seamlessly connects your OpenClaw Agent to your Lark/Feishu workspace, enabling it to directly read from and write to messages, docs, bases, calendars, tasks, and more.
10
+
11
+ ## Features
12
+
13
+ This plugin provides comprehensive Lark/Feishu integration for OpenClaw, including:
14
+
15
+ | Category | Capabilities |
16
+ |------|------|
17
+ | 💬 Messenger | Read messages (group/DM history, thread replies), send messages, reply to messages, search messages, download images/files |
18
+ | 📄 Docs | Create, update, and read documents |
19
+ | 📊 Base | Create/manage bases, tables, fields, records (CRUD, batch operations, advanced filtering), views |
20
+ | 📈 Sheets | Create, edit, and view spreadsheets |
21
+ | 📅 Calendar | Manage calendars and events (create/query/update/delete/search), manage attendees, check free/busy status |
22
+ | ✅ Tasks | Manage tasks (create/query/update/complete), manage task lists, subtasks, and comments |
23
+
24
+ Additionally, the plugin supports:
25
+ - **📱 Interactive Cards**: Real-time status updates (Thinking/Generating/Complete), plus confirmation buttons for sensitive operations
26
+ - **🌊 Streaming Responses**: Live streaming text directly within message cards
27
+ - **🔒 Permission Policies**: Flexible access control policies for DMs and group chats
28
+ - **⚙️ Advanced Group Configuration**: Per-group settings including allowlists, skill bindings, and custom system prompts
29
+
30
+ ## Security & Risk Warnings (Read Before Use)
31
+
32
+ **Core risk:** This plugin connects to your work data via Lark/Feishu APIs—messages, docs, calendars, contacts. Anything the AI can read could theoretically be leaked. While we have implemented security protections, AI systems are not yet mature or stable enough to guarantee absolute safety.
33
+
34
+ **Strong recommendations:**
35
+ - Use a personal account for evaluation and testing at this stage.
36
+ - Use the related Lark/Feishu apps personally, and avoid deploying to large numbers of users.
37
+ - Avoid using it in group chats to reduce the risk of data exposure.
38
+ - Using this bot for multiple users and/or with a company Feishu account may introduce data security and privacy risks. Make sure you comply with your organization’s internal data security and privacy requirements to avoid data leakage, privilege escalation, privacy violations, or related consequences.
39
+
40
+ **Other operational risks**
41
+ - AI is not perfect and may hallucinate: It may sometimes misunderstand your intent or generate content that appears reasonable but is inaccurate.
42
+ - Some operations are irreversible: For example, messages sent by the AI on your behalf are sent in your name and cannot be undone once sent.
43
+ - **Mitigation advice:** For important operations involving sending, modifying, or writing data, always **preview first, then confirm**. Never allow the AI to operate in a fully autonomous mode without human oversight.
44
+
45
+ **Disclaimer:**
46
+
47
+ This software is licensed under the MIT License. When running, it calls Lark/Feishu Open Platform APIs. To use these APIs, you must comply with the following agreements and privacy policies:
48
+
49
+ - [Feishu Privacy Policy](https://www.feishu.cn/en/privacy?from=openclaw_plugin_readme)
50
+ - [Feishu User Terms of Service](https://www.feishu.cn/en/terms?from=openclaw_plugin_readme)
51
+ - [Feishu Store App Service Provider Security Management Specifications](https://open.larkoffice.com/document/uAjLw4CM/uMzNwEjLzcDMx4yM3ATM/management-practice/app-service-provider-security-management-specifications)
52
+
53
+ - [Lark Privacy Policy](https://www.larksuite.com/user-terms-of-service)
54
+ - [Lark User Terms of Service](https://www.larksuite.com/privacy-policy)
55
+
56
+ ## Requirements & Installation
57
+
58
+ Before you start, make sure you have the following:
59
+
60
+ - **Node.js**: `v22` or higher.
61
+ - **OpenClaw**: OpenClaw is installed and works properly. For details, visit the [OpenClaw official website](https://openclaw.ai).
62
+
63
+ > **Note**: OpenClaw version must be **2026.2.26** or higher. Check with `openclaw -v`. If below this version, you may encounter issues. Upgrade with:
64
+ > ```bash
65
+ > npm install -g openclaw
66
+ > ```
67
+
68
+ ## Usage Guide
69
+
70
+ [How to Use the Official Lark/Feishu Plugin for OpenClaw](https://bytedance.larkoffice.com/docx/MFK7dDFLFoVlOGxWCv5cTXKmnMh)
71
+
72
+ ## Contributing
73
+
74
+ Community contributions are welcome! If you find a bug or have feature suggestions, please submit an [Issue](https://github.com/larksuite/openclaw-larksuite/issues) or a [Pull Request](https://github.com/larksuite/openclaw-larksuite/pulls).
75
+
76
+ For major changes, we recommend discussing with us first via an Issue.
77
+
78
+ ## License
79
+
80
+ This project is licensed under the **MIT License**. See [LICENSE](./LICENSE.md) for details.
package/README.zh.md ADDED
@@ -0,0 +1,80 @@
1
+ # OpenClaw Lark/飞书 插件
2
+
3
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
4
+ [![npm version](https://img.shields.io/npm/v/@larksuiteoapi/feishu-openclaw-plugin.svg)](https://www.npmjs.com/package/@larksuiteoapi/feishu-openclaw-plugin)
5
+ [![Node.js Version](https://img.shields.io/badge/node-%3E%3D22-blue.svg)](https://nodejs.org/)
6
+
7
+ [English](./README.md) | 中文版
8
+
9
+ 这是 OpenClaw 的官方 Lark/飞书 插件,由 Lark/飞书开放平台团队开发和维护。它将你的 OpenClaw Agent 无缝对接到 Lark/飞书 工作区,赋予其直接读写消息、文档、多维表格、日历、任务等应用的能力。
10
+
11
+ ## 特性
12
+
13
+ 本插件为 OpenClaw 提供了全面的 Lark/飞书集成能力,主要包括:
14
+
15
+ | 类别 | 能力 |
16
+ |------|------|
17
+ | 💬 消息 | 消息读取(群聊/单聊历史、话题回复)、消息发送、消息回复、消息搜索、图片/文件下载 |
18
+ | 📄 文档 | 创建云文档、更新云文档、读取云文档内容 |
19
+ | 📊 多维表格 | 创建/管理多维表格、数据表、字段、记录(增删改查、批量操作、高级筛选)、视图 |
20
+ | 📈 电子表格 | 创建、编辑、查看电子表格 |
21
+ | 📅 日历日程 | 日历管理、日程管理(创建/查询/修改/删除/搜索)、参会人管理、忙闲查询 |
22
+ | ✅ 任务 | 任务管理(创建/查询/更新/完成)、清单管理、子任务、评论 |
23
+
24
+ 此外,插件还支持:
25
+ - **📱 交互式卡片**:实时状态更新(思考中/生成中/完成状态),提供敏感操作的确认按钮
26
+ - **🌊 流式回复**:在消息卡片中提供实时的流式响应
27
+ - **🔒 权限策略**:为私聊和群聊提供灵活的访问控制策略
28
+ - **⚙️ 高级群组配置**:每个群聊的独立设置,包括白名单、技能绑定和自定义系统提示词
29
+
30
+ ## 安全与风险提示(使用前必读)
31
+
32
+ **核心风险:** 这个插件通过 Lark/飞书接口连接了你的工作数据——消息、文档、日历、联系人,AI 能读到的东西理论上就有泄露的可能。虽然我们做了安全防护,但 AI 系统本身还不够成熟稳定,不能保证万无一失。
33
+
34
+ **强烈建议:**
35
+
36
+ - 现阶段优先使用个人账号进行体验和测试。
37
+ - 相关 Lark/飞书应用推荐个人使用,不建议开放给多人使用。
38
+ - 建议避免在群聊中使用,降低你的数据泄露风险。
39
+
40
+ **其他操作风险**
41
+ - AI 并不完美,可能存在"幻觉":它有时会误解您的意图,或者生成看似合理但不准确的内容。
42
+ - 部分操作不可逆转:例如,AI 代发的 Lark/飞书消息是以您的名义发出的,发出后即成事实。
43
+ - **应对建议:** 对于涉及发送、修改、写入等重要操作,请务必做到**"先预览,再确认"**,切勿让 AI 处于完全脱离人工干预的"全自动驾驶"状态。
44
+ - 作为机器人供多人使用或者通过公司飞书账号使用可能会导致数据安全和隐私风险,请注意使用时需要遵守企业内的数据安全和隐私要求,避免发生数据泄露、权限突破、侵犯隐私等后果
45
+
46
+ **免责声明:**
47
+
48
+ 本软件的代码采用MIT许可证。
49
+ 该软件运行时会调用Lark/飞书开放平台的API,使用这些API需要遵守如下协议和隐私政策:
50
+
51
+ - [飞书用户服务协议](https://www.feishu.cn/terms)
52
+ - [飞书隐私政策](https://www.feishu.cn/privacy)
53
+ - [飞书开放平台独立软件服务商安全管理运营规范](https://open.larkoffice.com/document/uAjLw4CM/uMzNwEjLzcDMx4yM3ATM/management-practice/app-service-provider-security-management-specifications)
54
+ - [Lark用户服务协议](https://www.larksuite.com/user-terms-of-service)
55
+ - [Lark隐私政策](https://www.larksuite.com/privacy-policy)
56
+
57
+ ## 安装与要求
58
+
59
+ 在开始之前,请确保你已准备好以下各项:
60
+
61
+ - **Node.js**: `v22` 或更高版本。
62
+ - **OpenClaw**: OpenClaw 已成功安装并可运行。详情请访问 [OpenClaw 官方网站](https://openclaw.ai)。
63
+
64
+ > **注意**:OpenClaw 版本需在 **2026.2.26** 及以上,可通过 `openclaw -v` 命令查看。如果低于该版本可能出现异常,执行以下命令升级:
65
+ > ```bash
66
+ > npm install -g openclaw
67
+ > ```
68
+
69
+ ## 使用说明
70
+ [OpenClaw Lark/飞书官方插件使用指南](https://bytedance.larkoffice.com/docx/MFK7dDFLFoVlOGxWCv5cTXKmnMh)
71
+
72
+ ## 贡献
73
+
74
+ 我们欢迎社区的贡献!如果你发现 Bug 或有功能建议,请随时提交 [Issue](https://github.com/larksuite/openclaw-larksuite/issues) 或 [Pull Request](https://github.com/larksuite/openclaw-larksuite/pulls)。
75
+
76
+ 对于较大的改动,我们建议你先通过 Issue 与我们讨论。
77
+
78
+ ## 许可证
79
+
80
+ 本项目基于 **MIT 许可证**。详情请参阅 [LICENSE](./LICENSE.md) 文件。
package/dist/index.js ADDED
@@ -0,0 +1,172 @@
1
+ import { emptyPluginConfigSchema } from "openclaw/plugin-sdk";
2
+ import { feishuPlugin } from "./src/channel/plugin";
3
+ import { LarkClient } from "./src/core/lark-client";
4
+ import { registerOapiTools } from "./src/tools/oapi/index";
5
+ import { registerFeishuMcpDocTools } from "./src/tools/mcp/doc/index";
6
+ import { registerFeishuMcpProjectTools } from "./src/tools/mcp/project/index";
7
+ import { registerFeishuOAuthTool } from "./src/tools/oauth";
8
+ import { registerFeishuOAuthBatchAuthTool } from "./src/tools/oauth-batch-auth";
9
+ import { registerFeishuProjectOAuthTool } from "./src/tools/project-oauth";
10
+ import {
11
+ runDiagnosis,
12
+ formatDiagReportCli,
13
+ traceByMessageId,
14
+ formatTraceOutput,
15
+ analyzeTrace
16
+ } from "./src/commands/diagnose";
17
+ import { registerCommands } from "./src/commands/index";
18
+ import { larkLogger } from "./src/core/lark-logger";
19
+ import { emitSecurityWarnings } from "./src/core/security-check";
20
+ const log = larkLogger("plugin");
21
+ import { monitorFeishuProvider } from "./src/channel/monitor";
22
+ import { sendMessageFeishu, sendCardFeishu, updateCardFeishu, editMessageFeishu } from "./src/messaging/outbound/send";
23
+ import { getMessageFeishu } from "./src/messaging/outbound/fetch";
24
+ import {
25
+ uploadImageLark,
26
+ uploadFileLark,
27
+ sendImageLark,
28
+ sendFileLark,
29
+ sendAudioLark,
30
+ uploadAndSendMediaLark
31
+ } from "./src/messaging/outbound/media";
32
+ import {
33
+ sendTextLark,
34
+ sendCardLark,
35
+ sendMediaLark
36
+ } from "./src/messaging/outbound/deliver";
37
+ import { probeFeishu } from "./src/channel/probe";
38
+ import {
39
+ addReactionFeishu,
40
+ removeReactionFeishu,
41
+ listReactionsFeishu,
42
+ FeishuEmoji,
43
+ VALID_FEISHU_EMOJI_TYPES
44
+ } from "./src/messaging/outbound/reactions";
45
+ import { forwardMessageFeishu } from "./src/messaging/outbound/forward";
46
+ import {
47
+ updateChatFeishu,
48
+ addChatMembersFeishu,
49
+ removeChatMembersFeishu,
50
+ listChatMembersFeishu
51
+ } from "./src/messaging/outbound/chat-manage";
52
+ import { feishuMessageActions } from "./src/messaging/outbound/actions";
53
+ import {
54
+ mentionedBot,
55
+ nonBotMentions,
56
+ extractMessageBody,
57
+ formatMentionForText,
58
+ formatMentionForCard,
59
+ formatMentionAllForText,
60
+ formatMentionAllForCard,
61
+ buildMentionedMessage,
62
+ buildMentionedCardContent
63
+ } from "./src/messaging/inbound/mention";
64
+ import { feishuPlugin as feishuPlugin2 } from "./src/channel/plugin";
65
+ import { handleFeishuReaction } from "./src/messaging/inbound/reaction-handler";
66
+ import { parseMessageEvent } from "./src/messaging/inbound/parse";
67
+ import { checkMessageGate } from "./src/messaging/inbound/gate";
68
+ import { isMessageExpired } from "./src/messaging/inbound/dedup";
69
+ const plugin = {
70
+ id: "feishu-openclaw-plugin",
71
+ name: "Feishu",
72
+ description: "Lark/Feishu channel plugin with im/doc/wiki/drive/task/calendar tools",
73
+ configSchema: emptyPluginConfigSchema(),
74
+ register(api) {
75
+ LarkClient.setRuntime(api.runtime);
76
+ api.registerChannel({ plugin: feishuPlugin });
77
+ registerOapiTools(api);
78
+ registerFeishuMcpDocTools(api);
79
+ registerFeishuMcpProjectTools(api);
80
+ registerFeishuOAuthTool(api);
81
+ registerFeishuOAuthBatchAuthTool(api);
82
+ registerFeishuProjectOAuthTool(api);
83
+ api.on("before_tool_call", (event) => {
84
+ log.info(`tool call: ${event.toolName} params=${JSON.stringify(event.params)}`);
85
+ });
86
+ api.on("after_tool_call", (event) => {
87
+ if (event.error) {
88
+ log.error(`tool fail: ${event.toolName} ${event.error} (${event.durationMs ?? 0}ms)`);
89
+ } else {
90
+ log.info(`tool done: ${event.toolName} ok (${event.durationMs ?? 0}ms)`);
91
+ }
92
+ });
93
+ api.registerCli(
94
+ (ctx) => {
95
+ ctx.program.command("feishu-diagnose").description("\u8FD0\u884C\u98DE\u4E66\u63D2\u4EF6\u8BCA\u65AD\uFF0C\u68C0\u67E5\u914D\u7F6E\u3001\u8FDE\u901A\u6027\u548C\u6743\u9650\u72B6\u6001").option("--trace <messageId>", "\u6309 message_id \u8FFD\u8E2A\u5B8C\u6574\u5904\u7406\u94FE\u8DEF").option("--analyze", "\u5206\u6790\u8FFD\u8E2A\u65E5\u5FD7\uFF08\u9700\u914D\u5408 --trace \u4F7F\u7528\uFF09").action(async (opts) => {
96
+ try {
97
+ if (opts.trace) {
98
+ const lines = await traceByMessageId(opts.trace);
99
+ console.log(formatTraceOutput(lines, opts.trace));
100
+ if (opts.analyze && lines.length > 0) {
101
+ console.log(analyzeTrace(lines, opts.trace));
102
+ }
103
+ } else {
104
+ const report = await runDiagnosis({
105
+ config: ctx.config,
106
+ logger: ctx.logger
107
+ });
108
+ console.log(formatDiagReportCli(report));
109
+ if (report.overallStatus === "unhealthy") {
110
+ process.exitCode = 1;
111
+ }
112
+ }
113
+ } catch (err) {
114
+ ctx.logger.error(`\u8BCA\u65AD\u547D\u4EE4\u6267\u884C\u5931\u8D25: ${err}`);
115
+ process.exitCode = 1;
116
+ }
117
+ });
118
+ },
119
+ { commands: ["feishu-diagnose"] }
120
+ );
121
+ registerCommands(api);
122
+ if (api.config) {
123
+ emitSecurityWarnings(api.config, api.logger);
124
+ }
125
+ }
126
+ };
127
+ var index_default = plugin;
128
+ export {
129
+ FeishuEmoji,
130
+ VALID_FEISHU_EMOJI_TYPES,
131
+ addChatMembersFeishu,
132
+ addReactionFeishu,
133
+ buildMentionedCardContent,
134
+ buildMentionedMessage,
135
+ checkMessageGate,
136
+ index_default as default,
137
+ editMessageFeishu,
138
+ extractMessageBody,
139
+ feishuMessageActions,
140
+ feishuPlugin2 as feishuPlugin,
141
+ formatMentionAllForCard,
142
+ formatMentionAllForText,
143
+ formatMentionForCard,
144
+ formatMentionForText,
145
+ forwardMessageFeishu,
146
+ getMessageFeishu,
147
+ handleFeishuReaction,
148
+ isMessageExpired,
149
+ listChatMembersFeishu,
150
+ listReactionsFeishu,
151
+ mentionedBot,
152
+ monitorFeishuProvider,
153
+ nonBotMentions,
154
+ parseMessageEvent,
155
+ probeFeishu,
156
+ removeChatMembersFeishu,
157
+ removeReactionFeishu,
158
+ sendAudioLark,
159
+ sendCardFeishu,
160
+ sendCardLark,
161
+ sendFileLark,
162
+ sendImageLark,
163
+ sendMediaLark,
164
+ sendMessageFeishu,
165
+ sendTextLark,
166
+ updateCardFeishu,
167
+ updateChatFeishu,
168
+ uploadAndSendMediaLark,
169
+ uploadFileLark,
170
+ uploadImageLark
171
+ };
172
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../index.ts"],
4
+ "sourcesContent": ["/**\n * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n *\n * OpenClaw Lark/Feishu plugin entry point.\n *\n * Registers the Feishu channel and all tool families:\n * doc, wiki, drive, perm, bitable, task, calendar.\n */\n\nimport type { OpenClawPluginApi } from 'openclaw/plugin-sdk';\nimport { emptyPluginConfigSchema } from 'openclaw/plugin-sdk';\nimport { feishuPlugin } from './src/channel/plugin';\nimport { LarkClient } from './src/core/lark-client';\nimport { registerOapiTools } from './src/tools/oapi/index';\nimport { registerFeishuMcpDocTools } from './src/tools/mcp/doc/index';\nimport { registerFeishuMcpProjectTools } from './src/tools/mcp/project/index';\nimport { registerFeishuOAuthTool } from './src/tools/oauth';\nimport { registerFeishuOAuthBatchAuthTool } from './src/tools/oauth-batch-auth';\nimport { registerFeishuProjectOAuthTool } from './src/tools/project-oauth';\nimport {\n runDiagnosis,\n formatDiagReportCli,\n traceByMessageId,\n formatTraceOutput,\n analyzeTrace,\n} from './src/commands/diagnose';\nimport { registerCommands } from './src/commands/index';\nimport { larkLogger } from './src/core/lark-logger';\nimport { emitSecurityWarnings } from './src/core/security-check';\n\nconst log = larkLogger('plugin');\n\n// ---------------------------------------------------------------------------\n// Re-exports for external consumers\n// ---------------------------------------------------------------------------\n\nexport { monitorFeishuProvider } from './src/channel/monitor';\nexport { sendMessageFeishu, sendCardFeishu, updateCardFeishu, editMessageFeishu } from './src/messaging/outbound/send';\nexport { getMessageFeishu } from './src/messaging/outbound/fetch';\nexport {\n uploadImageLark,\n uploadFileLark,\n sendImageLark,\n sendFileLark,\n sendAudioLark,\n uploadAndSendMediaLark,\n} from './src/messaging/outbound/media';\nexport {\n sendTextLark,\n sendCardLark,\n sendMediaLark,\n type SendTextLarkParams,\n type SendCardLarkParams,\n type SendMediaLarkParams,\n} from './src/messaging/outbound/deliver';\nexport { type FeishuChannelData } from './src/messaging/outbound/outbound';\nexport { probeFeishu } from './src/channel/probe';\nexport {\n addReactionFeishu,\n removeReactionFeishu,\n listReactionsFeishu,\n FeishuEmoji,\n VALID_FEISHU_EMOJI_TYPES,\n} from './src/messaging/outbound/reactions';\nexport { forwardMessageFeishu } from './src/messaging/outbound/forward';\nexport {\n updateChatFeishu,\n addChatMembersFeishu,\n removeChatMembersFeishu,\n listChatMembersFeishu,\n} from './src/messaging/outbound/chat-manage';\nexport { feishuMessageActions } from './src/messaging/outbound/actions';\nexport {\n mentionedBot,\n nonBotMentions,\n extractMessageBody,\n formatMentionForText,\n formatMentionForCard,\n formatMentionAllForText,\n formatMentionAllForCard,\n buildMentionedMessage,\n buildMentionedCardContent,\n type MentionInfo,\n} from './src/messaging/inbound/mention';\nexport { feishuPlugin } from './src/channel/plugin';\nexport type {\n MessageContext,\n RawMessage,\n RawSender,\n FeishuMessageContext,\n FeishuReactionCreatedEvent,\n} from './src/messaging/types';\nexport { handleFeishuReaction } from './src/messaging/inbound/reaction-handler';\nexport { parseMessageEvent } from './src/messaging/inbound/parse';\nexport { checkMessageGate } from './src/messaging/inbound/gate';\nexport { isMessageExpired } from './src/messaging/inbound/dedup';\n\n// ---------------------------------------------------------------------------\n// Plugin definition\n// ---------------------------------------------------------------------------\n\nconst plugin = {\n id: 'feishu-openclaw-plugin',\n name: 'Feishu',\n description: 'Lark/Feishu channel plugin with im/doc/wiki/drive/task/calendar tools',\n configSchema: emptyPluginConfigSchema(),\n register(api: OpenClawPluginApi) {\n LarkClient.setRuntime(api.runtime);\n api.registerChannel({ plugin: feishuPlugin });\n\n // ========================================\n\n // Register OAPI tools (calendar, task - using Feishu Open API directly)\n registerOapiTools(api);\n\n // Register MCP doc tools (using Model Context Protocol)\n registerFeishuMcpDocTools(api);\n\n // Register MCP project tools (Meego - using independent OAuth)\n registerFeishuMcpProjectTools(api);\n\n // Register OAuth tool (UAT device flow authorization)\n registerFeishuOAuthTool(api);\n\n // Register OAuth batch auth tool (batch authorization for all app scopes)\n registerFeishuOAuthBatchAuthTool(api);\n\n // Register Feishu Project OAuth tool (independent OAuth for Meego)\n registerFeishuProjectOAuthTool(api);\n\n // ---- Tool call hooks (auto-trace AI tool invocations) ----\n\n api.on('before_tool_call', (event) => {\n log.info(`tool call: ${event.toolName} params=${JSON.stringify(event.params)}`);\n });\n\n api.on('after_tool_call', (event) => {\n if (event.error) {\n log.error(`tool fail: ${event.toolName} ${event.error} (${event.durationMs ?? 0}ms)`);\n } else {\n log.info(`tool done: ${event.toolName} ok (${event.durationMs ?? 0}ms)`);\n }\n });\n\n // ---- Diagnostic commands ----\n\n // CLI: openclaw feishu-diagnose [--trace <messageId>]\n api.registerCli(\n (ctx) => {\n ctx.program\n .command('feishu-diagnose')\n .description('\u8FD0\u884C\u98DE\u4E66\u63D2\u4EF6\u8BCA\u65AD\uFF0C\u68C0\u67E5\u914D\u7F6E\u3001\u8FDE\u901A\u6027\u548C\u6743\u9650\u72B6\u6001')\n .option('--trace <messageId>', '\u6309 message_id \u8FFD\u8E2A\u5B8C\u6574\u5904\u7406\u94FE\u8DEF')\n .option('--analyze', '\u5206\u6790\u8FFD\u8E2A\u65E5\u5FD7\uFF08\u9700\u914D\u5408 --trace \u4F7F\u7528\uFF09')\n .action(async (opts: { trace?: string; analyze?: boolean }) => {\n try {\n if (opts.trace) {\n const lines = await traceByMessageId(opts.trace);\n // eslint-disable-next-line no-console -- CLI \u547D\u4EE4\u76F4\u63A5\u8F93\u51FA\u5230\u7EC8\u7AEF\n console.log(formatTraceOutput(lines, opts.trace));\n if (opts.analyze && lines.length > 0) {\n // eslint-disable-next-line no-console -- CLI \u547D\u4EE4\u76F4\u63A5\u8F93\u51FA\u5230\u7EC8\u7AEF\n console.log(analyzeTrace(lines, opts.trace));\n }\n } else {\n const report = await runDiagnosis({\n config: ctx.config,\n logger: ctx.logger,\n });\n // eslint-disable-next-line no-console -- CLI \u547D\u4EE4\u76F4\u63A5\u8F93\u51FA\u5230\u7EC8\u7AEF\n console.log(formatDiagReportCli(report));\n if (report.overallStatus === 'unhealthy') {\n process.exitCode = 1;\n }\n }\n } catch (err) {\n ctx.logger.error(`\u8BCA\u65AD\u547D\u4EE4\u6267\u884C\u5931\u8D25: ${err}`);\n process.exitCode = 1;\n }\n });\n },\n { commands: ['feishu-diagnose'] },\n );\n\n // Chat commands: /feishu_diagnose, /feishu_doctor, /feishu_auth, /feishu\n registerCommands(api);\n\n // ---- Multi-account security checks ----\n if (api.config) {\n emitSecurityWarnings(api.config, api.logger);\n }\n },\n};\n\nexport default plugin;\n"],
5
+ "mappings": "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",
6
+ "names": ["feishuPlugin"]
7
+ }
@@ -0,0 +1,248 @@
1
+ ---
2
+ name: feishu-bitable
3
+ description: |
4
+ 飞书多维表格(Bitable)的创建、查询、编辑和管理工具。包含 27 种字段类型支持、高级筛选、批量操作和视图管理。
5
+
6
+ **当以下情况时使用此 Skill**:
7
+ (1) 需要创建或管理飞书多维表格 App
8
+ (2) 需要在多维表格中新增、查询、修改、删除记录(行数据)
9
+ (3) 需要管理字段(列)、视图、数据表
10
+ (4) 用户提到"多维表格"、"bitable"、"数据表"、"记录"、"字段"
11
+ (5) 需要批量导入数据或批量更新多维表格
12
+ ---
13
+
14
+ # Feishu Bitable (多维表格) SKILL
15
+
16
+ ## 🚨 执行前必读
17
+
18
+ - ✅ **创建数据表**:支持两种模式 — ① 明确需求时,在 `create` 时通过 `table.fields` 一次性定义字段(减少 API 调用);② 探索式场景时,使用默认表 + 逐步修改字段(更稳定,易调整)
19
+ - ⚠️ **默认表的空行坑**:`app.create` 自带的默认表中会有空记录(空行)!插入数据前建议先调用 `feishu_bitable_app_table_record.list` + `batch_delete` 删除空行,避免数据污染
20
+ - ✅ **写记录前**:先调用 `feishu_bitable_app_table_field.list` 获取字段 type/ui_type
21
+ - ✅ **人员字段**:默认 open_id(ou_...),值必须是 `[{id:"ou_xxx"}]`(数组对象)
22
+ - ✅ **日期字段**:毫秒时间戳(例如 `1674206443000`),不是秒
23
+ - ✅ **单选字段**:字符串(例如 `"选项1"`),不是数组
24
+ - ✅ **多选字段**:字符串数组(例如 `["选项1", "选项2"]`)
25
+ - ✅ **附件字段**:必须先上传到当前多维表格,使用返回的 file_token
26
+ - ✅ **批量上限**:单次 ≤ 500 条,超过需分批(批量操作是原子性的)
27
+ - ✅ **并发限制**:同一数据表不支持并发写,需串行调用 + 延迟 0.5-1 秒
28
+
29
+ ---
30
+
31
+ ## 📋 快速索引:意图 → 工具 → 必填参数
32
+
33
+ | 用户意图 | 工具 | action | 必填参数 | 常用可选 |
34
+ |---------|------|--------|---------|---------|
35
+ | 查表有哪些字段 | feishu_bitable_app_table_field | list | app_token, table_id | - |
36
+ | 查记录 | feishu_bitable_app_table_record | list | app_token, table_id | filter, sort, field_names |
37
+ | 新增一行 | feishu_bitable_app_table_record | create | app_token, table_id, fields | - |
38
+ | 批量导入 | feishu_bitable_app_table_record | batch_create | app_token, table_id, records (≤500) | - |
39
+ | 更新一行 | feishu_bitable_app_table_record | update | app_token, table_id, record_id, fields | - |
40
+ | 批量更新 | feishu_bitable_app_table_record | batch_update | app_token, table_id, records (≤500) | - |
41
+ | 创建多维表格 | feishu_bitable_app | create | name | folder_token |
42
+ | 创建数据表 | feishu_bitable_app_table | create | app_token, name | fields |
43
+ | 创建字段 | feishu_bitable_app_table_field | create | app_token, table_id, field_name, type | property |
44
+ | 创建视图 | feishu_bitable_app_table_view | create | app_token, table_id, view_name, view_type | - |
45
+
46
+ ---
47
+
48
+ ## 🎯 核心约束(Schema 未透露的知识)
49
+
50
+ ### 📚 详细参考文档
51
+
52
+ **当遇到字段配置、记录值格式问题或需要完整示例时,查阅以下文档**:
53
+
54
+ - **[字段 Property 配置详解](references/field-properties.md)** - 每种字段类型创建/更新时需要的 `property` 参数结构(单选的 options、进度的 min/max、关联的 table_id 等)
55
+ - **[记录值数据结构详解](references/record-values.md)** - 每种字段类型在记录中对应的 `fields` 值格式(人员字段只传 id、日期是毫秒时间戳、附件需先上传等)
56
+ - **[使用场景完整示例](references/examples.md)** - 8 个完整场景示例(创建表模式对比、批量导入、筛选查询、附件处理、关联字段等)
57
+
58
+ **何时查阅**:
59
+ - 创建/更新字段时收到 `125408X` 错误码(property 结构错误)→ 查 field-properties.md
60
+ - 写入记录时收到 `125406X` 错误码(字段值转换失败)→ 查 record-values.md
61
+ - 需要完整的操作流程和参数示例 → 查 examples.md
62
+
63
+ ---
64
+
65
+ ### 1. 字段类型与值格式必须严格匹配
66
+
67
+ **Bitable 最大的坑**:不同字段类型对 value 的数据结构要求完全不同。
68
+
69
+ #### 最易错的字段类型(完整列表见 [record-values.md](references/record-values.md))
70
+
71
+ | type | ui_type | 字段类型 | 正确格式 | ❌ 常见错误 |
72
+ |------|---------|----------|---------|-----------|
73
+ | 11 | User | 人员 | `[{id: "ou_xxx"}]` | 传字符串 `"ou_xxx"` 或 `[{name: "张三"}]` |
74
+ | 5 | DateTime | 日期 | `1674206443000`(毫秒) | 传秒时间戳或字符串 |
75
+ | 3 | SingleSelect | 单选 | `"选项名"` | 传数组 `["选项名"]` |
76
+ | 4 | MultiSelect | 多选 | `["选项1", "选项2"]` | 传字符串 `"选项1"` |
77
+ | 15 | Url | 超链接 | `{link: "...", text: "..."}` | 只传字符串 URL |
78
+ | 17 | Attachment | 附件 | `[{file_token: "..."}]` | 传外部 URL 或本地路径 |
79
+
80
+ **强制流程**:
81
+ 1. 先调用 `feishu_bitable_app_table_field.list` 获取字段的 `type` 和 `ui_type`
82
+ 2. 根据上表或 [record-values.md](references/record-values.md) 构造正确格式
83
+ 3. 错误码 `125406X` 或 `1254015` → 检查字段值格式
84
+
85
+ **人员字段特别注意**:
86
+ - 默认使用 open_id(ou_...),与 calendar/task 一致
87
+ - 格式:`[{id: "ou_xxx"}]`(数组对象)
88
+ - **只能传 id 字段**,不能传 name/email 等
89
+
90
+
91
+ ## 📌 核心使用场景
92
+
93
+ > **完整示例**: 查阅 [examples.md](references/examples.md) 了解更多场景(创建表模式对比、空行处理、附件上传、关联字段等)
94
+
95
+ ### 场景 1: 查字段类型(必做第一步)
96
+
97
+ ```json
98
+ {
99
+ "action": "list",
100
+ "app_token": "S404b...",
101
+ "table_id": "tbl..."
102
+ }
103
+ ```
104
+
105
+ **返回**:包含每个字段的 `field_id`、`field_name`、`type`、`ui_type`、`property`
106
+
107
+ ### 场景 2: 批量导入客户数据
108
+
109
+ ```json
110
+ {
111
+ "action": "batch_create",
112
+ "app_token": "S404b...",
113
+ "table_id": "tbl...",
114
+ "records": [
115
+ {
116
+ "fields": {
117
+ "客户名称": "Bytedance",
118
+ "负责人": [{"id": "ou_xxx"}],
119
+ "签约日期": 1674206443000,
120
+ "状态": "进行中"
121
+ }
122
+ },
123
+ {
124
+ "fields": {
125
+ "客户名称": "飞书",
126
+ "负责人": [{"id": "ou_yyy"}],
127
+ "签约日期": 1675416243000,
128
+ "状态": "已完成"
129
+ }
130
+ }
131
+ ]
132
+ }
133
+ ```
134
+
135
+ **字段值格式**:
136
+ - 人员:`[{id: "ou_xxx"}]`(数组对象)
137
+ - 日期:毫秒时间戳
138
+ - 单选:字符串
139
+ - 多选:字符串数组
140
+
141
+ **限制**: 最多 500 条记录
142
+
143
+ ### 场景 3: 筛选查询(高级筛选)
144
+
145
+ ```json
146
+ {
147
+ "action": "list",
148
+ "app_token": "S404b...",
149
+ "table_id": "tbl...",
150
+ "filter": {
151
+ "conjunction": "and",
152
+ "conditions": [
153
+ {
154
+ "field_name": "状态",
155
+ "operator": "is",
156
+ "value": ["进行中"]
157
+ },
158
+ {
159
+ "field_name": "截止日期",
160
+ "operator": "isLess",
161
+ "value": ["ExactDate", "1740441600000"]
162
+ }
163
+ ]
164
+ },
165
+ "sort": [
166
+ {
167
+ "field_name": "截止日期",
168
+ "desc": false
169
+ }
170
+ ]
171
+ }
172
+ ```
173
+
174
+ **filter 说明**:
175
+ - 支持 10 种 operator(is/isNot/contains/isEmpty 等,见附录 C)
176
+ - ⚠️ **isEmpty/isNotEmpty 必须传 `value: []`**(虽然逻辑上不需要值,但 API 要求必须传空数组)
177
+ - 日期筛选可使用 `["Today"]`、`["ExactDate", "时间戳"]` 等
178
+ - `sort` 可指定多个排序字段
179
+
180
+ ---
181
+
182
+ ## 🔍 常见错误与排查
183
+
184
+ | 错误码 | 错误现象 | 根本原因 | 解决方案 |
185
+ |--------|---------|---------|---------|
186
+ | 1254064 | DatetimeFieldConvFail | 日期字段格式错误 | **必须用毫秒时间戳**(如 `1772121600000`),不能用字符串(`"2026-02-27"`、RFC3339)或秒级时间戳 |
187
+ | 1254068 | URLFieldConvFail | 超链接字段格式错误 | **必须用对象** `{text: "显示文本", link: "URL"}`,不能直接传字符串 URL |
188
+ | 1254066 | UserFieldConvFail | 人员字段格式错误或 ID 类型不匹配 | 必须传 `[{id: "ou_xxx"}]`,确认 `user_id_type` |
189
+ | 1254015 | Field types do not match | 字段值格式与类型不匹配 | 先 list 字段,按类型构造正确格式 |
190
+ | 1254104 | RecordAddOnceExceedLimit | 批量创建超过 500 条 | 分批调用,每批 ≤ 500 |
191
+ | 1254291 | Write conflict | 并发写冲突 | 串行调用 + 延迟 0.5-1 秒 |
192
+ | 1254303 | AttachPermNotAllow | 附件未上传到当前表格 | 先调用上传素材接口 |
193
+ | 1254045 | FieldNameNotFound | 字段名不存在 | 检查字段名(包括空格、大小写) |
194
+
195
+ ---
196
+
197
+ ## 📚 附录:背景知识
198
+
199
+ ### A. 资源层级关系
200
+
201
+ ```
202
+ App (多维表格应用)
203
+ ├── Table (数据表) ×100
204
+ │ ├── Record (记录/行) ×20,000
205
+ │ ├── Field (字段/列) ×300
206
+ │ └── View (视图) ×200
207
+ └── Dashboard (仪表盘)
208
+ ```
209
+
210
+ ### B. 筛选条件 operator 列表
211
+
212
+ | operator | 含义 | 支持字段 | value 要求 |
213
+ |----------|------|----------|-----------|
214
+ | `is` | 等于 | 所有 | 单个值 |
215
+ | `isNot` | 不等于 | 除日期外 | 单个值 |
216
+ | `contains` | 包含 | 除日期外 | 可多个值 |
217
+ | `doesNotContain` | 不包含 | 除日期外 | 可多个值 |
218
+ | `isEmpty` | 为空 | 所有 | 必须为 `[]` |
219
+ | `isNotEmpty` | 不为空 | 所有 | 必须为 `[]` |
220
+ | `isGreater` | 大于 | 数字、日期 | 单个值 |
221
+ | `isGreaterEqual` | 大于等于 | 数字(不支持日期) | 单个值 |
222
+ | `isLess` | 小于 | 数字、日期 | 单个值 |
223
+ | `isLessEqual` | 小于等于 | 数字(不支持日期) | 单个值 |
224
+
225
+ **日期字段特殊值**: `["Today"]`, `["Tomorrow"]`, `["ExactDate", "时间戳"]` 等(完整列表见 [examples.md](references/examples.md#场景-3-筛选查询高级筛选))
226
+
227
+ ### C. 使用限制
228
+
229
+ | 限制项 | 上限 |
230
+ |--------|------|
231
+ | 数据表 + 仪表盘 | 100(单个 App) |
232
+ | 记录数 | 20,000(单个数据表) |
233
+ | 字段数 | 300(单个数据表) |
234
+ | 视图数 | 200(单个数据表) |
235
+ | 批量创建/更新/删除 | 500(单次 API 调用) |
236
+ | 单元格文本 | 10 万字符 |
237
+ | 单选/多选选项 | 20,000(单个字段) |
238
+ | 单元格附件 | 100 |
239
+ | 单元格人员 | 1,000 |
240
+
241
+
242
+
243
+ ### D. 其他约束
244
+
245
+ - 从其他数据源同步的数据表,**不支持增删改**记录
246
+ - 公式字段、查看引用字段是**只读**的
247
+ - 删除操作**无法恢复**
248
+ - 视图筛选条件使用 `field_id`,需先调用 field.list 获取