@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,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/tools/mcp/project/tools.ts"],
4
+ "sourcesContent": ["/**\n * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n *\n * \u98DE\u4E66\u9879\u76EE MCP \u5DE5\u5177\u6CE8\u518C\n *\n * \u6BCF\u4E2A\u5DE5\u5177\u4F7F\u7528\u98DE\u4E66\u9879\u76EE\u4E13\u5C5E\u7684 MCP \u7AEF\u70B9\u548C\u72EC\u7ACB\u7684 OAuth token\u3002\n * \u4E0D\u901A\u8FC7 registerMcpTool\uFF08\u4F7F\u7528\u98DE\u4E66 Open API UAT\uFF09\uFF0C\u800C\u662F\u4F7F\u7528\n * registerProjectMcpTool \u5305\u88C5\u51FD\u6570\u3002\n *\n * \u5DE5\u5177\u53C2\u6570\u7B7E\u540D\u53C2\u7167\u98DE\u4E66\u9879\u76EE MCP Server \u7684\u5B9E\u9645\u5B9A\u4E49\u3002\n */\n\nimport type { OpenClawPluginApi } from 'openclaw/plugin-sdk';\nimport type { TSchema } from '@sinclair/typebox';\nimport { Type } from '@sinclair/typebox';\nimport type { McpRpcResponse } from '../shared';\nimport { isRecord, unwrapJsonRpcResult } from '../shared';\nimport { createToolContext, formatToolResult } from '../../helpers';\nimport { getProjectStoredToken, projectTokenStatus, getProjectClientId } from '../../../core/project-token-store';\nimport { getTicket } from '../../../core/lark-ticket';\nimport { larkLogger } from '../../../core/lark-logger';\n\nconst log = larkLogger('tools/mcp/project');\n\n// ---------------------------------------------------------------------------\n// \u98DE\u4E66\u9879\u76EE MCP \u4E13\u7528 JSON-RPC \u5BA2\u6237\u7AEF\uFF08\u4F7F\u7528\u6807\u51C6 OAuth Bearer \u8BA4\u8BC1\uFF09\n// ---------------------------------------------------------------------------\n\nasync function callProjectMcpTool(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n accessToken: string,\n endpoint: string,\n): Promise<unknown> {\n const body = {\n jsonrpc: '2.0',\n id: toolCallId,\n method: 'tools/call',\n params: { name, arguments: args },\n };\n\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${accessToken}`,\n },\n body: JSON.stringify(body),\n });\n\n const text = await res.text();\n if (!res.ok) {\n throw new Error(`MCP HTTP ${res.status} ${res.statusText}: ${text.slice(0, 4000)}`);\n }\n\n let data: McpRpcResponse;\n try {\n data = JSON.parse(text) as McpRpcResponse;\n } catch {\n throw new Error(`MCP \u8FD4\u56DE\u975E JSON\uFF1A${text.slice(0, 4000)}`);\n }\n\n if ('error' in data) {\n throw new Error(`MCP error ${data.error.code}: ${data.error.message}`);\n }\n\n return unwrapJsonRpcResult(data.result);\n}\n\n// ---------------------------------------------------------------------------\n// \u98DE\u4E66\u9879\u76EE MCP \u5DE5\u5177\u901A\u7528\u6CE8\u518C\u51FD\u6570\n// ---------------------------------------------------------------------------\n\ninterface ProjectMcpToolConfig {\n name: string;\n mcpToolName: string;\n label: string;\n description: string;\n schema: TSchema;\n endpoint: string;\n}\n\nexport function registerProjectMcpTool(\n api: OpenClawPluginApi,\n config: ProjectMcpToolConfig,\n): void {\n const { log: toolLog } = createToolContext(api, config.name);\n\n api.registerTool(\n {\n name: config.name,\n label: config.label,\n description: config.description,\n parameters: config.schema,\n async execute(toolCallId, params) {\n const p = params as Record<string, unknown>;\n try {\n const startTime = Date.now();\n\n const ticket = getTicket();\n const senderOpenId = ticket?.senderOpenId;\n if (!senderOpenId) {\n return formatToolResult({\n error: '\u65E0\u6CD5\u83B7\u53D6\u5F53\u524D\u7528\u6237\u8EAB\u4EFD\uFF0C\u8BF7\u5728\u98DE\u4E66\u5BF9\u8BDD\u4E2D\u4F7F\u7528\u6B64\u5DE5\u5177\u3002',\n });\n }\n\n const clientId = await getProjectClientId(senderOpenId);\n if (!clientId) {\n return formatToolResult({\n error: 'project_auth_required',\n message: '\u98DE\u4E66\u9879\u76EE\u672A\u6388\u6743\u3002\u8BF7\u5148\u8C03\u7528 feishu_project_oauth \u5DE5\u5177\u5B8C\u6210\u6388\u6743\u3002',\n });\n }\n\n const token = await getProjectStoredToken(clientId, senderOpenId);\n if (!token || projectTokenStatus(token) === 'expired') {\n return formatToolResult({\n error: 'project_auth_required',\n message: '\u98DE\u4E66\u9879\u76EE\u672A\u6388\u6743\u6216\u6388\u6743\u5DF2\u8FC7\u671F\u3002\u8BF7\u8C03\u7528 feishu_project_oauth \u5DE5\u5177\u7684 authorize \u64CD\u4F5C\u5B8C\u6210\u6388\u6743\u3002',\n });\n }\n\n const result = await callProjectMcpTool(\n config.mcpToolName,\n p,\n toolCallId,\n token.accessToken,\n config.endpoint,\n );\n\n const duration = Date.now() - startTime;\n toolLog.debug?.(`${config.mcpToolName} succeeded in ${duration}ms`);\n\n // MCP \u8FD4\u56DE\u503C\u5904\u7406\uFF08\u540C registerMcpTool \u903B\u8F91\uFF09\n if (isRecord(result) && Array.isArray((result as Record<string, unknown>).content)) {\n const mcpContent = (result as Record<string, unknown>).content as Array<{\n type: string;\n text: string;\n }>;\n let details: unknown = result;\n if (mcpContent.length === 1 && mcpContent[0]?.type === 'text') {\n try {\n details = JSON.parse(mcpContent[0].text);\n } catch {\n // text is not JSON\n }\n }\n return {\n content: mcpContent.map((c) => ({\n type: 'text' as const,\n text: c.text,\n })),\n details,\n };\n }\n return formatToolResult(result);\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n toolLog.error(`${config.mcpToolName} failed: ${errMsg}`);\n return formatToolResult({\n error: errMsg,\n hint: '\u5982\u679C\u662F\u6388\u6743\u95EE\u9898\uFF0C\u8BF7\u8C03\u7528 feishu_project_oauth \u5DE5\u5177\u91CD\u65B0\u6388\u6743\u3002',\n });\n }\n },\n },\n { name: config.name },\n );\n}\n\n// ---------------------------------------------------------------------------\n// \u5177\u4F53\u5DE5\u5177\u6CE8\u518C\uFF08\u53C2\u6570\u7B7E\u540D\u5339\u914D\u98DE\u4E66\u9879\u76EE MCP Server \u5B9E\u9645\u5B9A\u4E49\uFF09\n// ---------------------------------------------------------------------------\n\nexport function registerProjectTools(api: OpenClawPluginApi, endpoint: string) {\n let count = 0;\n\n // list_todo \u2014 \u5F85\u529E/\u5DF2\u529E/\u8D85\u671F/\u672C\u5468\u5230\u671F\n registerProjectMcpTool(api, {\n name: 'feishu_project_list_todo',\n mcpToolName: 'list_todo',\n label: 'Feishu Project: \u5F85\u529E\u5217\u8868',\n description:\n '\u83B7\u53D6\u5F53\u524D\u7528\u6237\u7684\u98DE\u4E66\u9879\u76EE\u5DE5\u4F5C\u9879\u5217\u8868\u3002\u652F\u6301\u67E5\u8BE2\u7C7B\u578B\uFF1A' +\n 'todo(\u5F85\u529E)\u3001done(\u5DF2\u529E)\u3001overdue(\u5DF2\u8D85\u671F)\u3001this_week(\u672C\u5468\u5230\u671F)\u3002',\n schema: Type.Object({\n action: Type.String({\n description: '\u67E5\u8BE2\u7C7B\u578B\u3002todo \u4E3A\u5F85\u529E, done \u4E3A\u5DF2\u529E, overdue \u4E3A\u5DF2\u8D85\u671F, this_week \u4E3A\u672C\u5468\u5230\u671F',\n }),\n asset_key: Type.Optional(\n Type.String({ description: '\u5DE5\u4F5C\u533A key\uFF0C\u683C\u5F0F\u4E3A Asset_\uFF0C\u4EC5\u5728\u63A5\u53E3\u62A5\u9519\u9700\u8981\u9009\u62E9\u65F6\u4F20\u9012' }),\n ),\n page_num: Type.Optional(\n Type.Number({ description: '\u9875\u7801\uFF0C\u4ECE 1 \u5F00\u59CB\u9012\u589E\uFF0C\u6BCF\u9875 50 \u6761' }),\n ),\n }),\n endpoint,\n });\n count++;\n\n // search_by_mql \u2014 MQL \u67E5\u8BE2\n registerProjectMcpTool(api, {\n name: 'feishu_project_search_by_mql',\n mcpToolName: 'search_by_mql',\n label: 'Feishu Project: MQL \u641C\u7D22',\n description:\n '\u4F7F\u7528 MQL \u641C\u7D22\u98DE\u4E66\u9879\u76EE\u5DE5\u4F5C\u9879\u3002MQL \u57FA\u4E8E SQL \u8BED\u6CD5\u6269\u5C55\u3002' +\n '\u4F7F\u7528\u524D\u9700\u5148\u7528 get_workitem_info \u786E\u8BA4\u7A7A\u95F4\u548C\u5DE5\u4F5C\u9879\u7C7B\u578B\u3002' +\n 'select \u540E\u4F7F\u7528\u53EF\u8BFB\u6027\u5F3A\u7684\u5B57\u6BB5\u540D\u79F0\uFF08\u5982\"\u4EFB\u52A1\u540D\u79F0\"\u800C\u975E\"name\"\uFF09\u3002',\n schema: Type.Object({\n project_key: Type.String({\n description: '\u7A7A\u95F4 projectKey\u3001simpleName \u6216\u7A7A\u95F4\u540D',\n }),\n mql: Type.Optional(\n Type.String({\n description:\n 'MQL \u8BED\u53E5\u3002\u8BED\u6CD5\uFF1Aselect `\u5B57\u6BB5\u540D` from `\u7A7A\u95F4\u540D`.`\u5DE5\u4F5C\u9879\u540D` where `\u5B57\u6BB5\u540D` = \\'\u5B57\u6BB5\u503C\\'',\n }),\n ),\n helper: Type.Optional(\n Type.String({\n description: '\u5E2E\u52A9\u5DE5\u5177\u3002\u8F93\u5165 \"helper\" \u83B7\u53D6\u6240\u6709\u547D\u4EE4\u548C\u7528\u6CD5\u793A\u4F8B',\n }),\n ),\n session_id: Type.Optional(\n Type.String({ description: 'sessionID\uFF0C\u7528\u4E8E\u5206\u9875\u67E5\u8BE2\uFF0C\u4F20\u5165\u540E\u4E0D\u89E3\u6790 mql' }),\n ),\n group_pagination_list: Type.Optional(\n Type.Array(\n Type.Object({\n group_id: Type.Optional(Type.String({ description: '\u5206\u7EC4 ID' })),\n page_num: Type.Optional(Type.Number({ description: '\u9875\u7801\uFF0C\u4ECE 1 \u5F00\u59CB' })),\n }),\n ),\n ),\n }),\n endpoint,\n });\n count++;\n\n // get_workitem_info \u2014 \u83B7\u53D6\u5DE5\u4F5C\u9879\u7C7B\u578B\u7684\u5B57\u6BB5\u4E0E\u89D2\u8272\u4FE1\u606F\n registerProjectMcpTool(api, {\n name: 'feishu_project_get_workitem_info',\n mcpToolName: 'get_workitem_info',\n label: 'Feishu Project: \u5DE5\u4F5C\u9879\u7C7B\u578B\u4FE1\u606F',\n description: '\u83B7\u53D6\u4E00\u4E2A\u5DE5\u4F5C\u9879\u7C7B\u578B\u5177\u5907\u7684\u53EF\u7528\u5B57\u6BB5\u4E0E\u89D2\u8272\u4FE1\u606F\u3002',\n schema: Type.Object({\n project_key: Type.Optional(\n Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n ),\n work_item_type: Type.String({\n description: '\u5DE5\u4F5C\u9879\u7C7B\u578B\u7684\u7CFB\u7EDF\u6807\u8BC6\u6216\u540D\u79F0\uFF0C\u5982 story\u3001\u9700\u6C42\u3001issue\u3001\u7F3A\u9677\u7B49',\n }),\n }),\n endpoint,\n });\n count++;\n\n // get_workitem_brief \u2014 \u83B7\u53D6\u5DE5\u4F5C\u9879\u6982\u51B5\n registerProjectMcpTool(api, {\n name: 'feishu_project_get_workitem_brief',\n mcpToolName: 'get_workitem_brief',\n label: 'Feishu Project: \u5DE5\u4F5C\u9879\u6982\u51B5',\n description: '\u83B7\u53D6\u4E00\u4E2A\u5DE5\u4F5C\u9879\u5B9E\u4F8B\u7684\u6982\u51B5\u4FE1\u606F\u3002',\n schema: Type.Object({\n project_key: Type.Optional(\n Type.String({ description: '\u7A7A\u95F4 projectKey \u6216 simpleName' }),\n ),\n work_item_id: Type.String({\n description: '\u5DE5\u4F5C\u9879 ID \u6216\u540D\u79F0',\n }),\n fields: Type.Optional(\n Type.Array(Type.String({ description: '\u8981\u67E5\u8BE2\u7684 field_key \u6216 field_name' })),\n ),\n }),\n endpoint,\n });\n count++;\n\n // get_workitem_field_meta \u2014 \u83B7\u53D6\u521B\u5EFA\u5DE5\u4F5C\u9879\u5143\u4FE1\u606F\n registerProjectMcpTool(api, {\n name: 'feishu_project_get_workitem_field_meta',\n mcpToolName: 'get_workitem_field_meta',\n label: 'Feishu Project: \u5B57\u6BB5\u5143\u4FE1\u606F',\n description: '\u83B7\u53D6\u521B\u5EFA\u5DE5\u4F5C\u9879\u65F6\u7684\u5B57\u6BB5\u5143\u4FE1\u606F\uFF08\u5B57\u6BB5\u540D\u3001\u7C7B\u578B\u3001\u9009\u9879\u7B49\uFF09\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n work_item_type_key: Type.String({ description: '\u5DE5\u4F5C\u9879\u7C7B\u578B key' }),\n }),\n endpoint,\n });\n count++;\n\n // create_workitem \u2014 \u521B\u5EFA\u5DE5\u4F5C\u9879\n registerProjectMcpTool(api, {\n name: 'feishu_project_create_workitem',\n mcpToolName: 'create_workitem',\n label: 'Feishu Project: \u521B\u5EFA\u5DE5\u4F5C\u9879',\n description: '\u521B\u5EFA\u4E00\u6761\u5DE5\u4F5C\u9879\u5B9E\u4F8B\u3002\u521B\u5EFA\u6210\u529F\u540E\u83B7\u5F97\u8BE6\u60C5\u9875 URL\u3002',\n schema: Type.Object({\n project_key: Type.Optional(\n Type.String({ description: '\u7A7A\u95F4 projectKey \u6216 simpleName' }),\n ),\n work_item_type: Type.String({\n description: '\u5DE5\u4F5C\u9879\u7C7B\u578B',\n }),\n fields: Type.Optional(\n Type.Array(\n Type.Object({\n field_key: Type.String({ description: '\u5B57\u6BB5 key' }),\n field_value: Type.String({\n description: '\u5B57\u6BB5\u503C\u3002\u65F6\u95F4\u7C7B\u9700\u4F20 16 \u4F4D unix \u6BEB\u79D2\u65F6\u95F4\u6233\uFF0C\u4EBA\u5458\u7C7B\u9700\u7528\u82F1\u6587\u9017\u53F7\u533A\u9694',\n }),\n }),\n ),\n ),\n }),\n endpoint,\n });\n count++;\n\n // update_field \u2014 \u4FEE\u6539\u5DE5\u4F5C\u9879\u5B57\u6BB5\n registerProjectMcpTool(api, {\n name: 'feishu_project_update_field',\n mcpToolName: 'update_field',\n label: 'Feishu Project: \u4FEE\u6539\u5B57\u6BB5',\n description: '\u4FEE\u6539\u6307\u5B9A\u5DE5\u4F5C\u9879\u5B9E\u4F8B\u7684\u5B57\u6BB5\u503C\uFF0C\u652F\u6301\u4E00\u6B21\u4FEE\u6539\u591A\u4E2A\u5B57\u6BB5\u3002',\n schema: Type.Object({\n project_key: Type.Optional(\n Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n ),\n work_item_id: Type.String({\n description: '\u5DE5\u4F5C\u9879 ID \u6216\u540D\u79F0',\n }),\n fields: Type.Optional(\n Type.Array(\n Type.Object({\n field_key: Type.String({ description: '\u5B57\u6BB5 key' }),\n field_value: Type.String({\n description: '\u5B57\u6BB5\u503C\u3002\u65F6\u95F4\u7C7B\u9700\u4F20 16 \u4F4D unix \u6BEB\u79D2\u65F6\u95F4\u6233\uFF0C\u4EBA\u5458\u7C7B\u9700\u7528\u82F1\u6587\u9017\u53F7\u533A\u9694',\n }),\n }),\n ),\n ),\n }),\n endpoint,\n });\n count++;\n\n // add_comment \u2014 \u6DFB\u52A0\u8BC4\u8BBA\n registerProjectMcpTool(api, {\n name: 'feishu_project_add_comment',\n mcpToolName: 'add_comment',\n label: 'Feishu Project: \u6DFB\u52A0\u8BC4\u8BBA',\n description: '\u5728\u6307\u5B9A\u5DE5\u4F5C\u9879\u7684\u8BC4\u8BBA/\u5907\u6CE8\u9875\u6DFB\u52A0\u4E00\u6761\u8BC4\u8BBA\uFF0C\u652F\u6301 markdown \u683C\u5F0F\u3002',\n schema: Type.Object({\n project_key: Type.Optional(\n Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n ),\n work_item_id: Type.String({\n description: '\u5DE5\u4F5C\u9879 ID \u6216\u540D\u79F0',\n }),\n work_item_type: Type.Optional(\n Type.String({ description: '\u5DE5\u4F5C\u9879\u7C7B\u578B' }),\n ),\n comment_content: Type.String({\n description: '\u8BC4\u8BBA\u5185\u5BB9\uFF0C\u652F\u6301 markdown \u683C\u5F0F',\n }),\n url: Type.Optional(\n Type.String({ description: '\u5DE5\u4F5C\u9879 URL\uFF0C\u53EF\u4ECE\u4E2D\u89E3\u6790 project_key \u7B49\u4FE1\u606F' }),\n ),\n }),\n endpoint,\n });\n count++;\n\n // finish_node \u2014 \u5B8C\u6210\u8282\u70B9/\u6D41\u8F6C\u72B6\u6001\n registerProjectMcpTool(api, {\n name: 'feishu_project_finish_node',\n mcpToolName: 'finish_node',\n label: 'Feishu Project: \u6D41\u8F6C\u72B6\u6001',\n description: '\u5B8C\u6210\u67D0\u4E2A\u8282\u70B9\uFF0C\u6D41\u8F6C\u5DE5\u4F5C\u9879\u5230\u4E0B\u4E00\u4E2A\u72B6\u6001\u3002',\n schema: Type.Object({\n project_key: Type.Optional(\n Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n ),\n work_item_id: Type.String({\n description: '\u5DE5\u4F5C\u9879 ID \u6216\u540D\u79F0',\n }),\n node_id: Type.String({\n description: '\u8981\u5B8C\u6210\u6D41\u8F6C\u7684\u8282\u70B9 ID \u6216\u8282\u70B9\u540D\u79F0',\n }),\n }),\n endpoint,\n });\n count++;\n\n // get_node_detail \u2014 \u83B7\u53D6\u8282\u70B9\u8BE6\u60C5\n registerProjectMcpTool(api, {\n name: 'feishu_project_get_node_detail',\n mcpToolName: 'get_node_detail',\n label: 'Feishu Project: \u8282\u70B9\u8BE6\u60C5',\n description: '\u83B7\u53D6\u6307\u5B9A\u8282\u70B9\u7684\u5173\u952E\u4FE1\u606F\uFF0C\u5305\u62EC\u8282\u70B9\u4FE1\u606F\u3001\u5B50\u9879\u4FE1\u606F\u3001\u81EA\u5B9A\u4E49\u5B57\u6BB5\u4FE1\u606F\u3002',\n schema: Type.Object({\n project_key: Type.Optional(\n Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n ),\n work_item_id: Type.String({ description: '\u5DE5\u4F5C\u9879 ID' }),\n node_id: Type.String({ description: '\u8282\u70B9\u540D\u79F0\u6216\u8282\u70B9 ID' }),\n node_ids: Type.Optional(\n Type.Array(Type.String({ description: '\u8282\u70B9\u540D\u79F0\u6216\u8282\u70B9 ID \u5217\u8868' })),\n ),\n }),\n endpoint,\n });\n count++;\n\n // get_transitable_statuses \u2014 \u83B7\u53D6\u53EF\u6D41\u8F6C\u72B6\u6001\n registerProjectMcpTool(api, {\n name: 'feishu_project_get_transitable_statuses',\n mcpToolName: 'get_transitable_statuses',\n label: 'Feishu Project: \u53EF\u6D41\u8F6C\u72B6\u6001',\n description: '\u83B7\u53D6\u72B6\u6001\u6D41\u5DE5\u4F5C\u9879\u7684\u53EF\u6D41\u8F6C\u72B6\u6001\u5217\u8868\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n work_item_id: Type.String({ description: '\u5DE5\u4F5C\u9879 ID' }),\n work_item_type_key: Type.String({ description: '\u5DE5\u4F5C\u9879\u7C7B\u578B key' }),\n user_key: Type.String({ description: '\u7528\u6237 userKey' }),\n }),\n endpoint,\n });\n count++;\n\n // list_workitem_types \u2014 \u83B7\u53D6\u5DE5\u4F5C\u9879\u7C7B\u578B\u5217\u8868\n registerProjectMcpTool(api, {\n name: 'feishu_project_list_workitem_types',\n mcpToolName: 'list_workitem_types',\n label: 'Feishu Project: \u5DE5\u4F5C\u9879\u7C7B\u578B\u5217\u8868',\n description: '\u83B7\u53D6\u7A7A\u95F4\u4E0B\u7684\u6240\u6709\u5DE5\u4F5C\u9879\u7C7B\u578B\u5217\u8868\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n }),\n endpoint,\n });\n count++;\n\n // search_project_info \u2014 \u67E5\u8BE2\u7A7A\u95F4\u4FE1\u606F\n registerProjectMcpTool(api, {\n name: 'feishu_project_search_project_info',\n mcpToolName: 'search_project_info',\n label: 'Feishu Project: \u67E5\u8BE2\u7A7A\u95F4',\n description: '\u67E5\u8BE2\u98DE\u4E66\u9879\u76EE\u7A7A\u95F4\u57FA\u7840\u4FE1\u606F\u3002',\n schema: Type.Object({\n project_key: Type.String({\n description: '\u7A7A\u95F4 projectKey\u3001simpleName \u6216\u7A7A\u95F4\u540D\u79F0',\n }),\n }),\n endpoint,\n });\n count++;\n\n // search_user_info \u2014 \u67E5\u8BE2\u7528\u6237\u4FE1\u606F\n registerProjectMcpTool(api, {\n name: 'feishu_project_search_user_info',\n mcpToolName: 'search_user_info',\n label: 'Feishu Project: \u67E5\u8BE2\u7528\u6237',\n description: '\u6279\u91CF\u67E5\u8BE2\u7528\u6237\u57FA\u7840\u4FE1\u606F\uFF0C\u6700\u591A 20 \u4E2A\u3002',\n schema: Type.Object({\n user_keys: Type.Array(\n Type.String({ description: 'userKey\u3001Email \u6216\u540D\u5B57' }),\n ),\n project_key: Type.Optional(\n Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n ),\n }),\n endpoint,\n });\n count++;\n\n // list_workitem_comments \u2014 \u67E5\u8BE2\u8BC4\u8BBA\u5217\u8868\n registerProjectMcpTool(api, {\n name: 'feishu_project_list_workitem_comments',\n mcpToolName: 'list_workitem_comments',\n label: 'Feishu Project: \u8BC4\u8BBA\u5217\u8868',\n description: '\u67E5\u8BE2\u5DE5\u4F5C\u9879\u8BC4\u8BBA\u5217\u8868\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n work_item_id: Type.String({ description: '\u5DE5\u4F5C\u9879 ID \u6216\u540D\u79F0' }),\n page_num: Type.Optional(Type.Number({ description: '\u9875\u7801\uFF0C\u9ED8\u8BA4 1' })),\n start_time: Type.Optional(Type.Number({ description: '\u5F00\u59CB\u65F6\u95F4\uFF0CUnix \u6BEB\u79D2\u65F6\u95F4\u6233' })),\n end_time: Type.Optional(Type.Number({ description: '\u7ED3\u675F\u65F6\u95F4\uFF0CUnix \u6BEB\u79D2\u65F6\u95F4\u6233' })),\n }),\n endpoint,\n });\n count++;\n\n // search_view_by_title \u2014 \u641C\u7D22\u89C6\u56FE\n registerProjectMcpTool(api, {\n name: 'feishu_project_search_view_by_title',\n mcpToolName: 'search_view_by_title',\n label: 'Feishu Project: \u641C\u7D22\u89C6\u56FE',\n description: '\u901A\u8FC7\u89C6\u56FE\u540D\u79F0\u6A21\u7CCA\u67E5\u8BE2\u89C6\u56FE ID\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n view_scope: Type.String({\n description: '\u5DE5\u4F5C\u9879\u7C7B\u578B\uFF1A\u9700\u6C42\u4E3A storyView\uFF0C\u7F3A\u9677\u4E3A issueView\uFF0C\u7248\u672C\u4E3A version\uFF0C\u81EA\u5B9A\u4E49\u7C7B\u578B\u4E3A\u5BF9\u5E94 key',\n }),\n key_word: Type.String({ description: '\u89C6\u56FE\u540D\u79F0\u5173\u952E\u5B57' }),\n }),\n endpoint,\n });\n count++;\n\n // get_view_detail \u2014 \u83B7\u53D6\u89C6\u56FE\u8BE6\u60C5\n registerProjectMcpTool(api, {\n name: 'feishu_project_get_view_detail',\n mcpToolName: 'get_view_detail',\n label: 'Feishu Project: \u89C6\u56FE\u8BE6\u60C5',\n description: '\u83B7\u53D6\u6307\u5B9A\u89C6\u56FE\u7684\u5DE5\u4F5C\u9879\u5217\u8868\u3002',\n schema: Type.Object({\n view_id: Type.String({ description: '\u89C6\u56FE ID' }),\n project_key: Type.Optional(Type.String({ description: '\u7A7A\u95F4 projectKey' })),\n fields: Type.Optional(\n Type.Array(Type.String({ description: '\u8981\u67E5\u8BE2\u7684 field_key \u6216 field_name' })),\n ),\n page_num: Type.Optional(Type.Number({ description: '\u5206\u9875\u9875\u7801' })),\n }),\n endpoint,\n });\n count++;\n\n // get_workitem_man_hour_records \u2014 \u5DE5\u65F6\u8BB0\u5F55\n registerProjectMcpTool(api, {\n name: 'feishu_project_get_workitem_man_hour_records',\n mcpToolName: 'get_workitem_man_hour_records',\n label: 'Feishu Project: \u5DE5\u65F6\u8BB0\u5F55',\n description: '\u83B7\u53D6\u5DE5\u4F5C\u9879\u7684\u5DE5\u65F6\u767B\u8BB0\u8BB0\u5F55\u5217\u8868\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n work_item_type_key: Type.String({ description: '\u5DE5\u4F5C\u9879\u7C7B\u578B key' }),\n work_item_id: Type.Number({ description: '\u5DE5\u4F5C\u9879\u5B9E\u4F8B ID' }),\n page_num: Type.Optional(Type.Number({ description: '\u5206\u9875\u9875\u7801\uFF0C\u6BCF\u9875\u9ED8\u8BA4 20' })),\n }),\n endpoint,\n });\n count++;\n\n // get_workitem_op_record \u2014 \u64CD\u4F5C\u8BB0\u5F55\n registerProjectMcpTool(api, {\n name: 'feishu_project_get_workitem_op_record',\n mcpToolName: 'get_workitem_op_record',\n label: 'Feishu Project: \u64CD\u4F5C\u8BB0\u5F55',\n description: '\u83B7\u53D6\u6307\u5B9A\u7A7A\u95F4\u4E0B\u4E00\u4E2A\u5DE5\u4F5C\u9879\u5B9E\u4F8B\u7684\u64CD\u4F5C\u8BB0\u5F55\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n work_item_id: Type.Number({ description: '\u5DE5\u4F5C\u9879 ID' }),\n start: Type.Optional(Type.Number({ description: '\u5F00\u59CB\u65F6\u95F4\uFF0C\u6BEB\u79D2\u7EA7\u65F6\u95F4\u6233' })),\n end: Type.Optional(Type.Number({ description: '\u7ED3\u675F\u65F6\u95F4\uFF0C\u6BEB\u79D2\u7EA7\u65F6\u95F4\u6233\uFF0C\u4E0E start \u914D\u5408\u6700\u957F 7 \u5929' })),\n operation_type: Type.Optional(\n Type.Array(Type.String({ description: '\u64CD\u4F5C\u7C7B\u578B\uFF1Amodify/create/delete/terminate/restore/complete/rollback/add/remove' })),\n ),\n start_from: Type.Optional(Type.String({ description: '\u5206\u9875\u53C2\u6570\uFF0C\u4F7F\u7528\u4E0A\u6B21\u8FD4\u56DE\u7684 start_from' })),\n }),\n endpoint,\n });\n count++;\n\n // list_schedule \u2014 \u6392\u671F\u67E5\u8BE2\n registerProjectMcpTool(api, {\n name: 'feishu_project_list_schedule',\n mcpToolName: 'list_schedule',\n label: 'Feishu Project: \u6392\u671F\u67E5\u8BE2',\n description: '\u6309\u7A7A\u95F4\u548C\u7528\u6237\u67E5\u8BE2\u6307\u5B9A\u65F6\u95F4\u8303\u56F4\u5185\u7684\u6392\u671F\u660E\u7EC6\uFF0C\u7528\u4E8E\u4EBA\u529B\u8D1F\u8377\u4E0E\u6392\u671F\u5206\u6790\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey\u3001\u540D\u79F0\u6216 simple_name' }),\n user_keys: Type.Array(\n Type.String({ description: '\u7528\u6237\u540D\u79F0\u3001\u90AE\u7BB1\u6216 userkey\uFF0C\u6700\u591A 20 \u4E2A' }),\n ),\n start_time: Type.String({ description: '\u5F00\u59CB\u65F6\u95F4\uFF0C\u683C\u5F0F 2006-01-01' }),\n end_time: Type.String({ description: '\u7ED3\u675F\u65F6\u95F4\uFF0C\u683C\u5F0F 2006-01-01\uFF0C\u6700\u5927\u4E0D\u8D85\u8FC7 3 \u4E2A\u6708' }),\n work_item_type_keys: Type.Optional(\n Type.Array(Type.String({ description: '\u5DE5\u4F5C\u9879\u7C7B\u578B key\uFF0C\u4F20 _all \u67E5\u8BE2\u6240\u6709\u7C7B\u578B' })),\n ),\n }),\n endpoint,\n });\n count++;\n\n // list_related_workitems \u2014 \u5173\u8054\u5DE5\u4F5C\u9879\n registerProjectMcpTool(api, {\n name: 'feishu_project_list_related_workitems',\n mcpToolName: 'list_related_workitems',\n label: 'Feishu Project: \u5173\u8054\u5DE5\u4F5C\u9879',\n description: '\u67E5\u8BE2\u67D0\u4E2A\u5173\u8054\u5DE5\u4F5C\u9879\u5B57\u6BB5\u6240\u5173\u8054\u7684\u5DE5\u4F5C\u9879\u5B9E\u4F8B\u7B80\u8981\u4FE1\u606F\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n work_item_type_key: Type.String({ description: '\u6E90\u5DE5\u4F5C\u9879\u7C7B\u578B' }),\n work_item_id: Type.Number({ description: '\u6E90\u5DE5\u4F5C\u9879\u5B9E\u4F8B ID' }),\n relation_work_item_type_key: Type.String({ description: '\u5173\u8054\u7684\u76EE\u6807\u5DE5\u4F5C\u9879\u7C7B\u578B' }),\n relation_key: Type.String({ description: '\u5173\u8054\u5173\u7CFB key \u6216\u5BF9\u63A5\u6807\u8BC6' }),\n relation_type: Type.Optional(Type.Number({ description: '\u5173\u8054\u6807\u8BC6\u65B9\u5F0F\uFF1A0=\u5B57\u6BB5ID\uFF0C1=\u5BF9\u63A5\u6807\u8BC6\u3002\u9ED8\u8BA4 0' })),\n page_num: Type.Optional(Type.Number({ description: '\u9875\u7801\uFF0C\u4ECE 1 \u5F00\u59CB' })),\n page_size: Type.Optional(Type.Number({ description: '\u6BCF\u9875\u6570\u91CF\uFF0C\u6700\u5927 50' })),\n }),\n endpoint,\n });\n count++;\n\n // list_workitem_relations \u2014 \u7A7A\u95F4\u5173\u8054\u5173\u7CFB\n registerProjectMcpTool(api, {\n name: 'feishu_project_list_workitem_relations',\n mcpToolName: 'list_workitem_relations',\n label: 'Feishu Project: \u5173\u8054\u5173\u7CFB\u5217\u8868',\n description: '\u67E5\u8BE2\u67D0\u4E2A\u7A7A\u95F4\u4E0B\u7684\u6240\u6709\u5DE5\u4F5C\u9879\u5173\u8054\u5173\u7CFB\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n }),\n endpoint,\n });\n count++;\n\n // list_team_members \u2014 \u56E2\u961F\u6210\u5458\n registerProjectMcpTool(api, {\n name: 'feishu_project_list_team_members',\n mcpToolName: 'list_team_members',\n label: 'Feishu Project: \u56E2\u961F\u6210\u5458',\n description: '\u67E5\u8BE2\u56E2\u961F\u4FE1\u606F\u548C\u6210\u5458\u5217\u8868\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n team_id: Type.String({ description: '\u56E2\u961F ID' }),\n page_token: Type.Optional(Type.String({ description: '\u5206\u9875 token\uFF0C\u9996\u9875\u4E0D\u4F20' })),\n }),\n endpoint,\n });\n count++;\n\n // list_charts \u2014 \u5EA6\u91CF\u56FE\u8868\n registerProjectMcpTool(api, {\n name: 'feishu_project_list_charts',\n mcpToolName: 'list_charts',\n label: 'Feishu Project: \u5EA6\u91CF\u56FE\u8868',\n description: '\u67E5\u8BE2\u6307\u5B9A\u7A7A\u95F4\u89C6\u56FE\u4E0B\u7684\u6240\u6709\u5EA6\u91CF\u56FE\u8868\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n view_id: Type.String({ description: '\u89C6\u56FE ID' }),\n page_num: Type.Optional(Type.Number({ description: '\u9875\u7801\uFF0C\u9ED8\u8BA4 1' })),\n page_size: Type.Optional(Type.Number({ description: '\u6BCF\u9875\u6761\u6570\uFF0C\u9ED8\u8BA4 50\uFF0C\u6700\u5927 200' })),\n }),\n endpoint,\n });\n count++;\n\n // create_fixed_view \u2014 \u521B\u5EFA\u56FA\u5B9A\u89C6\u56FE\n registerProjectMcpTool(api, {\n name: 'feishu_project_create_fixed_view',\n mcpToolName: 'create_fixed_view',\n label: 'Feishu Project: \u521B\u5EFA\u56FA\u5B9A\u89C6\u56FE',\n description: '\u5728\u6307\u5B9A\u7A7A\u95F4\u548C\u5DE5\u4F5C\u9879\u7C7B\u578B\u4E0B\u65B0\u589E\u4E00\u4E2A\u56FA\u5B9A\u89C6\u56FE\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n name: Type.String({ description: '\u56FA\u5B9A\u89C6\u56FE\u540D\u79F0' }),\n work_item_type_key: Type.String({ description: '\u5DE5\u4F5C\u9879\u7C7B\u578B key' }),\n work_item_id_list: Type.Array(\n Type.Number({ description: '\u5DE5\u4F5C\u9879 ID' }),\n { description: '\u9700\u8981\u6DFB\u52A0\u5165\u89C6\u56FE\u7684\u5DE5\u4F5C\u9879 ID \u5217\u8868\uFF0C\u4E0A\u9650 200 \u4E2A' },\n ),\n cooperation_mode: Type.Optional(\n Type.Number({ description: '\u534F\u4F5C\u6A21\u5F0F\uFF1A1=\u6307\u5B9A\u4EBA\u5458/\u56E2\u961F, 2=\u5168\u90E8\u7BA1\u7406\u5458, 3=\u5168\u90E8\u6210\u5458\u3002\u9ED8\u8BA4 1' }),\n ),\n }),\n endpoint,\n });\n count++;\n\n // update_fixed_view \u2014 \u66F4\u65B0\u56FA\u5B9A\u89C6\u56FE\n registerProjectMcpTool(api, {\n name: 'feishu_project_update_fixed_view',\n mcpToolName: 'update_fixed_view',\n label: 'Feishu Project: \u66F4\u65B0\u56FA\u5B9A\u89C6\u56FE',\n description: '\u66F4\u65B0\u56FA\u5B9A\u89C6\u56FE\u7684\u5DE5\u4F5C\u9879\u5217\u8868\uFF08\u65B0\u589E\u6216\u5220\u9664\uFF0C\u4E0D\u80FD\u540C\u65F6\u64CD\u4F5C\uFF09\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n view_id: Type.String({ description: '\u56FA\u5B9A\u89C6\u56FE ID' }),\n work_item_type_key: Type.String({ description: '\u5DE5\u4F5C\u9879\u7C7B\u578B key' }),\n add_work_item_ids: Type.Optional(\n Type.Array(Type.Number(), { description: '\u9700\u8981\u6DFB\u52A0\u7684\u5DE5\u4F5C\u9879 ID \u5217\u8868\uFF0C\u4E0A\u9650 200' }),\n ),\n remove_work_item_ids: Type.Optional(\n Type.Array(Type.Number(), { description: '\u9700\u8981\u5220\u9664\u7684\u5DE5\u4F5C\u9879 ID \u5217\u8868\uFF0C\u4E0A\u9650 200' }),\n ),\n }),\n endpoint,\n });\n count++;\n\n log.info(`registered ${count} project MCP tools with endpoint=${endpoint}`);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,170 @@
1
+ import { createToolContext, formatToolResult } from "../helpers";
2
+ import { handleInvokeErrorWithAutoAuth } from "../oapi/helpers";
3
+ import { getUserAgent } from "../../core/version";
4
+ import fs from "node:fs";
5
+ import path from "node:path";
6
+ function isRecord(v) {
7
+ return typeof v === "object" && v !== null;
8
+ }
9
+ function extractMcpUrlFromConfig(cfg) {
10
+ if (!isRecord(cfg)) return void 0;
11
+ const channels = cfg.channels;
12
+ if (!isRecord(channels)) return void 0;
13
+ const feishu = channels.feishu;
14
+ if (!isRecord(feishu)) return void 0;
15
+ const url = feishu.mcpEndpoint;
16
+ const legacyUrl = feishu.mcp_url;
17
+ const chosen = typeof url === "string" ? url : typeof legacyUrl === "string" ? legacyUrl : void 0;
18
+ if (typeof chosen !== "string") return void 0;
19
+ const trimmed = chosen.trim();
20
+ return trimmed ? trimmed : void 0;
21
+ }
22
+ function unwrapJsonRpcResult(v) {
23
+ if (!isRecord(v)) return v;
24
+ const hasJsonRpc = typeof v.jsonrpc === "string";
25
+ const hasId = "id" in v;
26
+ const hasResult = "result" in v;
27
+ const hasError = "error" in v;
28
+ if (hasJsonRpc && (hasResult || hasError)) {
29
+ if (hasError) {
30
+ const err = v.error;
31
+ if (isRecord(err) && typeof err.message === "string") {
32
+ throw new Error(err.message);
33
+ }
34
+ throw new Error("MCP \u8FD4\u56DE error\uFF0C\u4F46\u65E0\u6CD5\u89E3\u6790 message");
35
+ }
36
+ return unwrapJsonRpcResult(v.result);
37
+ }
38
+ if (!hasJsonRpc && !hasId && hasResult && !hasError) {
39
+ return unwrapJsonRpcResult(v.result);
40
+ }
41
+ return v;
42
+ }
43
+ let mcpEndpointOverride;
44
+ function setMcpEndpointOverride(endpoint) {
45
+ mcpEndpointOverride = endpoint;
46
+ }
47
+ function readMcpUrlFromOpenclawJson() {
48
+ try {
49
+ const p = path.join(process.cwd(), ".openclaw", "openclaw.json");
50
+ if (!fs.existsSync(p)) return void 0;
51
+ const raw = fs.readFileSync(p, "utf8");
52
+ const cfg = JSON.parse(raw);
53
+ return extractMcpUrlFromConfig(cfg);
54
+ } catch {
55
+ return void 0;
56
+ }
57
+ }
58
+ function getMcpEndpoint() {
59
+ return mcpEndpointOverride || readMcpUrlFromOpenclawJson() || process.env.FEISHU_MCP_ENDPOINT?.trim() || "https://mcp.feishu.cn/mcp";
60
+ }
61
+ function buildAuthHeader() {
62
+ const token = process.env.FEISHU_MCP_BEARER_TOKEN?.trim() || process.env.FEISHU_MCP_TOKEN?.trim();
63
+ if (!token) return void 0;
64
+ return token.toLowerCase().startsWith("bearer ") ? token : `Bearer ${token}`;
65
+ }
66
+ async function callMcpTool(name, args, toolCallId, uat) {
67
+ const endpoint = getMcpEndpoint();
68
+ const auth = buildAuthHeader();
69
+ const body = {
70
+ jsonrpc: "2.0",
71
+ id: toolCallId,
72
+ method: "tools/call",
73
+ params: {
74
+ name,
75
+ arguments: args
76
+ }
77
+ };
78
+ const headers = {
79
+ "Content-Type": "application/json",
80
+ "X-Lark-MCP-UAT": uat,
81
+ "X-Lark-MCP-Allowed-Tools": name,
82
+ "User-Agent": getUserAgent()
83
+ };
84
+ if (auth) headers.authorization = auth;
85
+ const res = await fetch(endpoint, {
86
+ method: "POST",
87
+ headers,
88
+ body: JSON.stringify(body)
89
+ });
90
+ const text = await res.text();
91
+ if (!res.ok) {
92
+ throw new Error(`MCP HTTP ${res.status} ${res.statusText}: ${text.slice(0, 4e3)}`);
93
+ }
94
+ let data;
95
+ try {
96
+ data = JSON.parse(text);
97
+ } catch {
98
+ throw new Error(`MCP \u8FD4\u56DE\u975E JSON\uFF1A${text.slice(0, 4e3)}`);
99
+ }
100
+ if ("error" in data) {
101
+ throw new Error(`MCP error ${data.error.code}: ${data.error.message}`);
102
+ }
103
+ return unwrapJsonRpcResult(data.result);
104
+ }
105
+ function registerMcpTool(api, config) {
106
+ const { toolClient, log } = createToolContext(api, config.name);
107
+ api.registerTool(
108
+ {
109
+ name: config.name,
110
+ label: config.label,
111
+ description: config.description,
112
+ parameters: config.schema,
113
+ async execute(toolCallId, params) {
114
+ const p = params;
115
+ try {
116
+ log.debug?.(`Calling ${config.mcpToolName} (toolCallId: ${toolCallId})`);
117
+ const startTime = Date.now();
118
+ config.validate?.(p);
119
+ const client = toolClient();
120
+ const result = await client.invoke(
121
+ config.toolActionKey,
122
+ async (_sdk, _opts, uat) => {
123
+ if (!uat) {
124
+ throw new Error("UAT not available");
125
+ }
126
+ return callMcpTool(config.mcpToolName, p, toolCallId, uat);
127
+ },
128
+ {
129
+ as: "user"
130
+ }
131
+ );
132
+ const duration = Date.now() - startTime;
133
+ log.debug?.(`${config.mcpToolName} succeeded in ${duration}ms`);
134
+ if (isRecord(result) && Array.isArray(result.content)) {
135
+ const mcpContent = result.content;
136
+ let details = result;
137
+ if (mcpContent.length === 1 && mcpContent[0]?.type === "text") {
138
+ try {
139
+ details = JSON.parse(mcpContent[0].text);
140
+ } catch {
141
+ }
142
+ }
143
+ return {
144
+ content: mcpContent.map((c) => ({
145
+ type: "text",
146
+ text: c.text
147
+ })),
148
+ details
149
+ };
150
+ }
151
+ return formatToolResult(result);
152
+ } catch (err) {
153
+ const errMsg = err instanceof Error ? err.message : String(err);
154
+ log.error(`${config.mcpToolName} failed: ${errMsg}`);
155
+ return handleInvokeErrorWithAutoAuth(err, api.config);
156
+ }
157
+ }
158
+ },
159
+ { name: config.name }
160
+ );
161
+ }
162
+ export {
163
+ callMcpTool,
164
+ extractMcpUrlFromConfig,
165
+ isRecord,
166
+ registerMcpTool,
167
+ setMcpEndpointOverride,
168
+ unwrapJsonRpcResult
169
+ };
170
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/mcp/shared.ts"],
4
+ "sourcesContent": ["/**\n * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n *\n * MCP \u5DE5\u5177\u7684\u5171\u4EAB\u4EE3\u7801\uFF08\u6240\u6709\u4E1A\u52A1\u57DF\u5171\u4EAB\uFF09\n * \u5305\u542B\uFF1AMCP \u5BA2\u6237\u7AEF\u3001\u7C7B\u578B\u5B9A\u4E49\u3001\u901A\u7528\u8F85\u52A9\u51FD\u6570\n */\n\nimport type { OpenClawPluginApi } from 'openclaw/plugin-sdk';\nimport type { TSchema } from '@sinclair/typebox';\nimport { createToolContext, formatToolResult } from '../helpers';\nimport { handleInvokeErrorWithAutoAuth } from '../oapi/helpers';\nimport { getUserAgent } from '../../core/version';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n// ---------------------------------------------------------------------------\n// \u7C7B\u578B\u5B9A\u4E49\n// ---------------------------------------------------------------------------\n\nexport interface McpRpcSuccess {\n jsonrpc: '2.0';\n id: number | string;\n result: unknown;\n}\n\nexport interface McpRpcError {\n jsonrpc: '2.0';\n id: number | string | null;\n error: { code: number; message: string; data?: unknown };\n}\n\nexport type McpRpcResponse = McpRpcSuccess | McpRpcError;\n\nimport type { ToolActionKey } from '../../core/scope-manager';\n\nexport interface McpToolConfig<T = unknown> {\n name: string;\n mcpToolName: string;\n toolActionKey: ToolActionKey; // \u65B0\u589E\uFF1A\u5DE5\u5177\u52A8\u4F5C\u952E\n label: string;\n description: string;\n schema: TSchema;\n validate?: (params: T) => void;\n}\n\n// ---------------------------------------------------------------------------\n// \u8F85\u52A9\u51FD\u6570\n// ---------------------------------------------------------------------------\n\nexport function isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null;\n}\n\n/**\n * \u4ECE\u914D\u7F6E\u5BF9\u8C61\u4E2D\u63D0\u53D6 MCP endpoint URL\n */\nexport function extractMcpUrlFromConfig(cfg: unknown): string | undefined {\n if (!isRecord(cfg)) return undefined;\n const channels = cfg.channels;\n if (!isRecord(channels)) return undefined;\n const feishu = channels.feishu;\n if (!isRecord(feishu)) return undefined;\n const url = feishu.mcpEndpoint;\n const legacyUrl = feishu.mcp_url;\n const chosen = typeof url === 'string' ? url : typeof legacyUrl === 'string' ? legacyUrl : undefined;\n if (typeof chosen !== 'string') return undefined;\n const trimmed = chosen.trim();\n return trimmed ? trimmed : undefined;\n}\n\n/**\n * \u90E8\u5206 MCP \u7F51\u5173/\u4EE3\u7406\u4F1A\u5728 result \u5185\u518D\u6B21\u5305\u4E00\u5C42 JSON-RPC envelope\u3002\n * \u8FD9\u91CC\u505A\u4E00\u6B21\u9012\u5F52\u89E3\u5305\uFF0C\u786E\u4FDD\u5DE5\u5177\u6700\u7EC8\u8FD4\u56DE\u7684\u662F\u7EAF result JSON\uFF08\u4E0D\u5305\u542B jsonrpc/id\uFF09\u3002\n */\nexport function unwrapJsonRpcResult(v: unknown): unknown {\n if (!isRecord(v)) return v;\n\n const hasJsonRpc = typeof v.jsonrpc === 'string';\n const hasId = 'id' in v;\n const hasResult = 'result' in v;\n const hasError = 'error' in v;\n\n if (hasJsonRpc && (hasResult || hasError)) {\n if (hasError) {\n const err = v.error;\n if (isRecord(err) && typeof err.message === 'string') {\n throw new Error(err.message);\n }\n throw new Error('MCP \u8FD4\u56DE error\uFF0C\u4F46\u65E0\u6CD5\u89E3\u6790 message');\n }\n return unwrapJsonRpcResult(v.result);\n }\n\n // \u67D0\u4E9B\u5B9E\u73B0\u53EF\u80FD\u53EA\u5305\u4E86 { result: ... } \u800C\u6CA1\u6709 jsonrpc \u5B57\u6BB5\n if (!hasJsonRpc && !hasId && hasResult && !hasError) {\n return unwrapJsonRpcResult(v.result);\n }\n\n return v;\n}\n\n// ---------------------------------------------------------------------------\n// MCP \u914D\u7F6E\u7BA1\u7406\n// ---------------------------------------------------------------------------\n\nlet mcpEndpointOverride: string | undefined;\n\nexport function setMcpEndpointOverride(endpoint: string | undefined) {\n mcpEndpointOverride = endpoint;\n}\n\nfunction readMcpUrlFromOpenclawJson(): string | undefined {\n // \u4F18\u5148\u8BFB\u53D6\u5DE5\u4F5C\u76EE\u5F55\u4E0B\u7684 `.openclaw/openclaw.json`\n // \u7EA6\u5B9A\uFF1Achannels.feishu.mcpEndpoint\uFF08\u517C\u5BB9\u65E7\u5B57\u6BB5 mcp_url\uFF09\n try {\n const p = path.join(process.cwd(), '.openclaw', 'openclaw.json');\n if (!fs.existsSync(p)) return undefined;\n\n const raw = fs.readFileSync(p, 'utf8');\n const cfg = JSON.parse(raw) as unknown;\n return extractMcpUrlFromConfig(cfg);\n } catch {\n // \u914D\u7F6E\u7F3A\u5931/JSON \u89E3\u6790\u5931\u8D25\u7B49\u60C5\u51B5\uFF0C\u5FFD\u7565\u5E76\u56DE\u9000\u5230\u9ED8\u8BA4\u903B\u8F91\n return undefined;\n }\n}\n\nfunction getMcpEndpoint(): string {\n // \u4F18\u5148\u7EA7\uFF1A\u8FD0\u884C\u65F6\u8986\u76D6 > \u914D\u7F6E\u6587\u4EF6 > \u73AF\u5883\u53D8\u91CF > \u9ED8\u8BA4\u503C\n return (\n mcpEndpointOverride ||\n readMcpUrlFromOpenclawJson() ||\n process.env.FEISHU_MCP_ENDPOINT?.trim() ||\n 'https://mcp.feishu.cn/mcp'\n );\n}\n\nfunction buildAuthHeader(): string | undefined {\n // \u5141\u8BB8\u901A\u8FC7\u73AF\u5883\u53D8\u91CF\u6CE8\u5165\u9274\u6743\uFF08\u82E5\u670D\u52A1\u7AEF\u8981\u6C42\uFF09\n const token = process.env.FEISHU_MCP_BEARER_TOKEN?.trim() || process.env.FEISHU_MCP_TOKEN?.trim();\n\n if (!token) return undefined;\n return token.toLowerCase().startsWith('bearer ') ? token : `Bearer ${token}`;\n}\n\n// ---------------------------------------------------------------------------\n// MCP JSON-RPC \u5BA2\u6237\u7AEF\n// ---------------------------------------------------------------------------\n\n/**\n * \u8C03\u7528 MCP \u5DE5\u5177\n * @param name MCP \u5DE5\u5177\u540D\u79F0\n * @param args \u5DE5\u5177\u53C2\u6570\n * @param toolCallId \u5DE5\u5177\u8C03\u7528 ID\n * @param uat \u7528\u6237\u8BBF\u95EE\u4EE4\u724C(\u7531 invoke \u6743\u9650\u68C0\u67E5\u540E\u4F20\u5165)\n */\nexport async function callMcpTool(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n uat: string,\n): Promise<unknown> {\n const endpoint = getMcpEndpoint();\n const auth = buildAuthHeader();\n\n const body = {\n jsonrpc: '2.0',\n id: toolCallId,\n method: 'tools/call',\n params: {\n name,\n arguments: args,\n },\n };\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Lark-MCP-UAT': uat,\n 'X-Lark-MCP-Allowed-Tools': name,\n 'User-Agent': getUserAgent(),\n };\n if (auth) headers.authorization = auth;\n\n const res = await fetch(endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n });\n\n const text = await res.text();\n if (!res.ok) {\n throw new Error(`MCP HTTP ${res.status} ${res.statusText}: ${text.slice(0, 4000)}`);\n }\n\n let data: McpRpcResponse;\n try {\n data = JSON.parse(text) as McpRpcResponse;\n } catch {\n throw new Error(`MCP \u8FD4\u56DE\u975E JSON\uFF1A${text.slice(0, 4000)}`);\n }\n\n if ('error' in data) {\n throw new Error(`MCP error ${data.error.code}: ${data.error.message}`);\n }\n\n return unwrapJsonRpcResult(data.result);\n}\n\n// ---------------------------------------------------------------------------\n// Scope \u7BA1\u7406\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// \u901A\u7528\u5DE5\u5177\u6CE8\u518C\u51FD\u6570\n// ---------------------------------------------------------------------------\n\n/**\n * \u6CE8\u518C MCP \u5DE5\u5177\u7684\u901A\u7528\u51FD\u6570 (\u4F7F\u7528 invoke \u673A\u5236\u8FDB\u884C\u6743\u9650\u68C0\u67E5)\n */\nexport function registerMcpTool<T extends Record<string, unknown>>(\n api: OpenClawPluginApi,\n config: McpToolConfig<T>,\n): void {\n const { toolClient, log } = createToolContext(api, config.name);\n\n api.registerTool(\n {\n name: config.name,\n label: config.label,\n description: config.description,\n parameters: config.schema,\n async execute(toolCallId, params) {\n const p = params as T;\n try {\n log.debug?.(`Calling ${config.mcpToolName} (toolCallId: ${toolCallId})`);\n const startTime = Date.now();\n\n // \u6267\u884C\u53C2\u6570\u9A8C\u8BC1\n config.validate?.(p);\n\n const client = toolClient();\n\n // \u901A\u8FC7 invoke \u8FDB\u884C\u6743\u9650\u68C0\u67E5\u5E76\u8C03\u7528 MCP\n // \u4E25\u683C\u6A21\u5F0F\uFF1A\u5FC5\u987B\u62E5\u6709 toolActionKey \u6240\u9700\u7684\u6240\u6709 scope\n const result = await client.invoke(\n config.toolActionKey,\n async (_sdk, _opts, uat) => {\n // \u6743\u9650\u68C0\u67E5\u5DF2\u901A\u8FC7\uFF0C\u76F4\u63A5\u4F7F\u7528 invoke \u4F20\u5165\u7684 UAT\n if (!uat) {\n throw new Error('UAT not available');\n }\n return callMcpTool(config.mcpToolName, p, toolCallId, uat);\n },\n {\n as: 'user',\n },\n );\n\n const duration = Date.now() - startTime;\n log.debug?.(`${config.mcpToolName} succeeded in ${duration}ms`);\n\n // MCP tools/call \u8FD4\u56DE\u503C\u5DF2\u7ECF\u662F { content: [{ type, text }] } \u683C\u5F0F\uFF0C\n // \u76F4\u63A5\u900F\u4F20 content\uFF0C\u907F\u514D\u88AB formatToolResult \u518D\u5305\u4E00\u5C42\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (isRecord(result) && Array.isArray((result as any).content)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mcpContent = (result as any).content as Array<{\n type: string;\n text: string;\n }>;\n let details: unknown = result;\n if (mcpContent.length === 1 && mcpContent[0]?.type === 'text') {\n try {\n details = JSON.parse(mcpContent[0].text);\n } catch {\n // text \u4E0D\u662F JSON\uFF0C\u4FDD\u7559\u539F\u59CB result\n }\n }\n return {\n content: mcpContent.map((c) => ({\n type: 'text' as const,\n text: c.text,\n })),\n details,\n };\n }\n return formatToolResult(result);\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n log.error(`${config.mcpToolName} failed: ${errMsg}`);\n return handleInvokeErrorWithAutoAuth(err, api.config);\n }\n },\n },\n { name: config.name },\n );\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,244 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { json, createToolContext, assertLarkOk, handleInvokeErrorWithAutoAuth } from "../helpers";
3
+ const FeishuBitableAppTableFieldSchema = Type.Union([
4
+ // CREATE (P1)
5
+ Type.Object({
6
+ action: Type.Literal("create"),
7
+ app_token: Type.String({ description: "\u591A\u7EF4\u8868\u683C token" }),
8
+ table_id: Type.String({ description: "\u6570\u636E\u8868 ID" }),
9
+ field_name: Type.String({ description: "\u5B57\u6BB5\u540D\u79F0" }),
10
+ type: Type.Number({
11
+ description: "\u5B57\u6BB5\u7C7B\u578B\uFF081=\u6587\u672C\uFF0C2=\u6570\u5B57\uFF0C3=\u5355\u9009\uFF0C4=\u591A\u9009\uFF0C5=\u65E5\u671F\uFF0C7=\u590D\u9009\u6846\uFF0C11=\u4EBA\u5458\uFF0C13=\u7535\u8BDD\uFF0C15=\u8D85\u94FE\u63A5\uFF0C17=\u9644\u4EF6\uFF0C1001=\u521B\u5EFA\u65F6\u95F4\uFF0C1002=\u4FEE\u6539\u65F6\u95F4\u7B49\uFF09"
12
+ }),
13
+ property: Type.Optional(
14
+ Type.Any({
15
+ description: "\u5B57\u6BB5\u5C5E\u6027\u914D\u7F6E\uFF08\u6839\u636E\u7C7B\u578B\u800C\u5B9A\uFF0C\u4F8B\u5982\u5355\u9009/\u591A\u9009\u9700\u8981options\uFF0C\u6570\u5B57\u9700\u8981formatter\u7B49\uFF09\u3002\u26A0\uFE0F \u91CD\u8981\uFF1A\u8D85\u94FE\u63A5\u5B57\u6BB5\uFF08type=15\uFF09\u5FC5\u987B\u5B8C\u5168\u7701\u7565\u6B64\u53C2\u6570\uFF0C\u4F20\u7A7A\u5BF9\u8C61 {} \u4E5F\u4F1A\u62A5\u9519\uFF08URLFieldPropertyError\uFF09\u3002"
16
+ })
17
+ )
18
+ }),
19
+ // LIST (P1)
20
+ Type.Object({
21
+ action: Type.Literal("list"),
22
+ app_token: Type.String({ description: "\u591A\u7EF4\u8868\u683C token" }),
23
+ table_id: Type.String({ description: "\u6570\u636E\u8868 ID" }),
24
+ view_id: Type.Optional(Type.String({ description: "\u89C6\u56FE ID\uFF08\u53EF\u9009\uFF09" })),
25
+ page_size: Type.Optional(Type.Number({ description: "\u6BCF\u9875\u6570\u91CF\uFF0C\u9ED8\u8BA4 50\uFF0C\u6700\u5927 100" })),
26
+ page_token: Type.Optional(Type.String({ description: "\u5206\u9875\u6807\u8BB0" }))
27
+ }),
28
+ // UPDATE (P1)
29
+ Type.Object({
30
+ action: Type.Literal("update"),
31
+ app_token: Type.String({ description: "\u591A\u7EF4\u8868\u683C token" }),
32
+ table_id: Type.String({ description: "\u6570\u636E\u8868 ID" }),
33
+ field_id: Type.String({ description: "\u5B57\u6BB5 ID" }),
34
+ field_name: Type.Optional(Type.String({ description: "\u5B57\u6BB5\u540D\uFF08\u53EF\u9009\uFF0C\u4E0D\u4F20\u5219\u4E0D\u4FEE\u6539\uFF09" })),
35
+ type: Type.Optional(
36
+ Type.Number({
37
+ description: "\u5B57\u6BB5\u7C7B\u578B\uFF08\u53EF\u9009\uFF0C\u4E0D\u4F20\u5219\u81EA\u52A8\u67E5\u8BE2\uFF09\uFF1A1=\u6587\u672C, 2=\u6570\u5B57, 3=\u5355\u9009, 4=\u591A\u9009, 5=\u65E5\u671F, 7=\u590D\u9009\u6846, 11=\u4EBA\u5458, 13=\u7535\u8BDD, 15=\u8D85\u94FE\u63A5, 17=\u9644\u4EF6\u7B49"
38
+ })
39
+ ),
40
+ property: Type.Optional(Type.Any({ description: "\u5B57\u6BB5\u5C5E\u6027\u914D\u7F6E\uFF08\u53EF\u9009\uFF0C\u4E0D\u4F20\u5219\u81EA\u52A8\u67E5\u8BE2\uFF09" }))
41
+ }),
42
+ // DELETE (P1)
43
+ Type.Object({
44
+ action: Type.Literal("delete"),
45
+ app_token: Type.String({ description: "\u591A\u7EF4\u8868\u683C token" }),
46
+ table_id: Type.String({ description: "\u6570\u636E\u8868 ID" }),
47
+ field_id: Type.String({ description: "\u5B57\u6BB5 ID" })
48
+ })
49
+ ]);
50
+ function registerFeishuBitableAppTableFieldTool(api) {
51
+ if (!api.config) return;
52
+ const cfg = api.config;
53
+ const { toolClient, log } = createToolContext(api, "feishu_bitable_app_table_field");
54
+ api.registerTool(
55
+ {
56
+ name: "feishu_bitable_app_table_field",
57
+ label: "Feishu Bitable Fields",
58
+ description: "\u3010\u4EE5\u7528\u6237\u8EAB\u4EFD\u3011\u98DE\u4E66\u591A\u7EF4\u8868\u683C\u5B57\u6BB5\uFF08\u5217\uFF09\u7BA1\u7406\u5DE5\u5177\u3002\u5F53\u7528\u6237\u8981\u6C42\u521B\u5EFA/\u67E5\u8BE2/\u66F4\u65B0/\u5220\u9664\u5B57\u6BB5\u3001\u8C03\u6574\u8868\u7ED3\u6784\u65F6\u4F7F\u7528\u3002Actions: create\uFF08\u521B\u5EFA\u5B57\u6BB5\uFF09, list\uFF08\u5217\u51FA\u6240\u6709\u5B57\u6BB5\uFF09, update\uFF08\u66F4\u65B0\u5B57\u6BB5\uFF0C\u652F\u6301\u53EA\u4F20 field_name \u6539\u540D\uFF09, delete\uFF08\u5220\u9664\u5B57\u6BB5\uFF09\u3002",
59
+ parameters: FeishuBitableAppTableFieldSchema,
60
+ async execute(_toolCallId, params) {
61
+ const p = params;
62
+ try {
63
+ const client = toolClient();
64
+ switch (p.action) {
65
+ // -----------------------------------------------------------------
66
+ // CREATE
67
+ // -----------------------------------------------------------------
68
+ case "create": {
69
+ log.info(
70
+ `create: app_token=${p.app_token}, table_id=${p.table_id}, field_name=${p.field_name}, type=${p.type}`
71
+ );
72
+ let propertyToSend = p.property;
73
+ if ((p.type === 15 || p.type === 7) && p.property !== void 0) {
74
+ const fieldTypeName = p.type === 15 ? "URL" : "Checkbox";
75
+ log.warn(
76
+ `create: ${fieldTypeName} field (type=${p.type}) detected with property parameter. Removing property to avoid API error. ${fieldTypeName} fields must omit the property parameter entirely.`
77
+ );
78
+ propertyToSend = void 0;
79
+ }
80
+ const res = await client.invoke(
81
+ "feishu_bitable_app_table_field.create",
82
+ (sdk, opts) => sdk.bitable.appTableField.create(
83
+ {
84
+ path: {
85
+ app_token: p.app_token,
86
+ table_id: p.table_id
87
+ },
88
+ data: {
89
+ field_name: p.field_name,
90
+ type: p.type,
91
+ property: propertyToSend
92
+ }
93
+ },
94
+ opts
95
+ ),
96
+ { as: "user" }
97
+ );
98
+ assertLarkOk(res);
99
+ const data = res.data;
100
+ log.info(`create: created field ${data?.field?.field_id ?? "unknown"}`);
101
+ return json({
102
+ field: data?.field ?? res.data
103
+ });
104
+ }
105
+ // -----------------------------------------------------------------
106
+ // LIST
107
+ // -----------------------------------------------------------------
108
+ case "list": {
109
+ log.info(`list: app_token=${p.app_token}, table_id=${p.table_id}, view_id=${p.view_id ?? "none"}`);
110
+ const res = await client.invoke(
111
+ "feishu_bitable_app_table_field.list",
112
+ (sdk, opts) => sdk.bitable.appTableField.list(
113
+ {
114
+ path: {
115
+ app_token: p.app_token,
116
+ table_id: p.table_id
117
+ },
118
+ params: {
119
+ view_id: p.view_id,
120
+ page_size: p.page_size,
121
+ page_token: p.page_token
122
+ }
123
+ },
124
+ opts
125
+ ),
126
+ { as: "user" }
127
+ );
128
+ assertLarkOk(res);
129
+ const data = res.data;
130
+ log.info(`list: returned ${data?.items?.length ?? 0} fields`);
131
+ return json({
132
+ fields: data?.items,
133
+ has_more: data?.has_more ?? false,
134
+ page_token: data?.page_token
135
+ });
136
+ }
137
+ // -----------------------------------------------------------------
138
+ // UPDATE
139
+ // -----------------------------------------------------------------
140
+ case "update": {
141
+ log.info(`update: app_token=${p.app_token}, table_id=${p.table_id}, field_id=${p.field_id}`);
142
+ let finalFieldName = p.field_name;
143
+ let finalType = p.type;
144
+ let finalProperty = p.property;
145
+ if (!finalType || !finalFieldName) {
146
+ log.info(`update: missing type or field_name, auto-querying field info`);
147
+ const listRes = await client.invoke(
148
+ "feishu_bitable_app_table_field.update",
149
+ (sdk, opts) => sdk.bitable.appTableField.list(
150
+ {
151
+ path: {
152
+ app_token: p.app_token,
153
+ table_id: p.table_id
154
+ },
155
+ params: {
156
+ page_size: 500
157
+ }
158
+ },
159
+ opts
160
+ ),
161
+ { as: "user" }
162
+ );
163
+ assertLarkOk(listRes);
164
+ const listData = listRes.data;
165
+ const currentField = listData?.items?.find((f) => f.field_id === p.field_id);
166
+ if (!currentField) {
167
+ return json({
168
+ error: `field ${p.field_id} does not exist`,
169
+ hint: "Please verify field_id is correct. Use list action to view all fields."
170
+ });
171
+ }
172
+ finalFieldName = p.field_name || currentField.field_name;
173
+ finalType = p.type ?? currentField.type;
174
+ finalProperty = p.property !== void 0 ? p.property : currentField.property;
175
+ log.info(`update: auto-filled type=${finalType}, field_name=${finalFieldName}`);
176
+ }
177
+ const updateData = {
178
+ field_name: finalFieldName,
179
+ type: finalType
180
+ };
181
+ if (finalProperty !== void 0) {
182
+ updateData.property = finalProperty;
183
+ }
184
+ const res = await client.invoke(
185
+ "feishu_bitable_app_table_field.update",
186
+ (sdk, opts) => sdk.bitable.appTableField.update(
187
+ {
188
+ path: {
189
+ app_token: p.app_token,
190
+ table_id: p.table_id,
191
+ field_id: p.field_id
192
+ },
193
+ data: updateData
194
+ },
195
+ opts
196
+ ),
197
+ { as: "user" }
198
+ );
199
+ assertLarkOk(res);
200
+ log.info(`update: updated field ${p.field_id}`);
201
+ const updateData2 = res.data;
202
+ return json({
203
+ field: updateData2?.field ?? res.data
204
+ });
205
+ }
206
+ // -----------------------------------------------------------------
207
+ // DELETE
208
+ // -----------------------------------------------------------------
209
+ case "delete": {
210
+ log.info(`delete: app_token=${p.app_token}, table_id=${p.table_id}, field_id=${p.field_id}`);
211
+ const res = await client.invoke(
212
+ "feishu_bitable_app_table_field.delete",
213
+ (sdk, opts) => sdk.bitable.appTableField.delete(
214
+ {
215
+ path: {
216
+ app_token: p.app_token,
217
+ table_id: p.table_id,
218
+ field_id: p.field_id
219
+ }
220
+ },
221
+ opts
222
+ ),
223
+ { as: "user" }
224
+ );
225
+ assertLarkOk(res);
226
+ log.info(`delete: deleted field ${p.field_id}`);
227
+ return json({
228
+ success: true
229
+ });
230
+ }
231
+ }
232
+ } catch (err) {
233
+ return await handleInvokeErrorWithAutoAuth(err, cfg);
234
+ }
235
+ }
236
+ },
237
+ { name: "feishu_bitable_app_table_field" }
238
+ );
239
+ api.logger.info?.("feishu_bitable_app_table_field: Registered feishu_bitable_app_table_field tool");
240
+ }
241
+ export {
242
+ registerFeishuBitableAppTableFieldTool
243
+ };
244
+ //# sourceMappingURL=app-table-field.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/tools/oapi/bitable/app-table-field.ts"],
4
+ "sourcesContent": ["/**\n * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n *\n * feishu_bitable_app_table_field tool -- Manage Feishu Bitable fields (columns).\n *\n * P1 Actions: create, list, update, delete\n *\n * Uses the Feishu Bitable v1 API:\n * - create: POST /open-apis/bitable/v1/apps/:app_token/tables/:table_id/fields\n * - list: GET /open-apis/bitable/v1/apps/:app_token/tables/:table_id/fields\n * - update: PUT /open-apis/bitable/v1/apps/:app_token/tables/:table_id/fields/:field_id\n * - delete: DELETE /open-apis/bitable/v1/apps/:app_token/tables/:table_id/fields/:field_id\n */\n\nimport type { OpenClawPluginApi } from 'openclaw/plugin-sdk';\nimport { Type } from '@sinclair/typebox';\n\nimport { json, createToolContext, assertLarkOk, handleInvokeErrorWithAutoAuth } from '../helpers';\nimport type { PaginatedData, FieldData } from '../sdk-types';\n\n// ---------------------------------------------------------------------------\n// Schema\n// ---------------------------------------------------------------------------\n\nconst FeishuBitableAppTableFieldSchema = Type.Union([\n // CREATE (P1)\n Type.Object({\n action: Type.Literal('create'),\n app_token: Type.String({ description: '\u591A\u7EF4\u8868\u683C token' }),\n table_id: Type.String({ description: '\u6570\u636E\u8868 ID' }),\n field_name: Type.String({ description: '\u5B57\u6BB5\u540D\u79F0' }),\n type: Type.Number({\n description:\n '\u5B57\u6BB5\u7C7B\u578B\uFF081=\u6587\u672C\uFF0C2=\u6570\u5B57\uFF0C3=\u5355\u9009\uFF0C4=\u591A\u9009\uFF0C5=\u65E5\u671F\uFF0C7=\u590D\u9009\u6846\uFF0C11=\u4EBA\u5458\uFF0C13=\u7535\u8BDD\uFF0C15=\u8D85\u94FE\u63A5\uFF0C17=\u9644\u4EF6\uFF0C1001=\u521B\u5EFA\u65F6\u95F4\uFF0C1002=\u4FEE\u6539\u65F6\u95F4\u7B49\uFF09',\n }),\n property: Type.Optional(\n Type.Any({\n description:\n '\u5B57\u6BB5\u5C5E\u6027\u914D\u7F6E\uFF08\u6839\u636E\u7C7B\u578B\u800C\u5B9A\uFF0C\u4F8B\u5982\u5355\u9009/\u591A\u9009\u9700\u8981options\uFF0C\u6570\u5B57\u9700\u8981formatter\u7B49\uFF09\u3002' +\n '\u26A0\uFE0F \u91CD\u8981\uFF1A\u8D85\u94FE\u63A5\u5B57\u6BB5\uFF08type=15\uFF09\u5FC5\u987B\u5B8C\u5168\u7701\u7565\u6B64\u53C2\u6570\uFF0C\u4F20\u7A7A\u5BF9\u8C61 {} \u4E5F\u4F1A\u62A5\u9519\uFF08URLFieldPropertyError\uFF09\u3002',\n }),\n ),\n }),\n\n // LIST (P1)\n Type.Object({\n action: Type.Literal('list'),\n app_token: Type.String({ description: '\u591A\u7EF4\u8868\u683C token' }),\n table_id: Type.String({ description: '\u6570\u636E\u8868 ID' }),\n view_id: Type.Optional(Type.String({ description: '\u89C6\u56FE ID\uFF08\u53EF\u9009\uFF09' })),\n page_size: Type.Optional(Type.Number({ description: '\u6BCF\u9875\u6570\u91CF\uFF0C\u9ED8\u8BA4 50\uFF0C\u6700\u5927 100' })),\n page_token: Type.Optional(Type.String({ description: '\u5206\u9875\u6807\u8BB0' })),\n }),\n\n // UPDATE (P1)\n Type.Object({\n action: Type.Literal('update'),\n app_token: Type.String({ description: '\u591A\u7EF4\u8868\u683C token' }),\n table_id: Type.String({ description: '\u6570\u636E\u8868 ID' }),\n field_id: Type.String({ description: '\u5B57\u6BB5 ID' }),\n field_name: Type.Optional(Type.String({ description: '\u5B57\u6BB5\u540D\uFF08\u53EF\u9009\uFF0C\u4E0D\u4F20\u5219\u4E0D\u4FEE\u6539\uFF09' })),\n type: Type.Optional(\n Type.Number({\n description:\n '\u5B57\u6BB5\u7C7B\u578B\uFF08\u53EF\u9009\uFF0C\u4E0D\u4F20\u5219\u81EA\u52A8\u67E5\u8BE2\uFF09\uFF1A1=\u6587\u672C, 2=\u6570\u5B57, 3=\u5355\u9009, 4=\u591A\u9009, 5=\u65E5\u671F, 7=\u590D\u9009\u6846, 11=\u4EBA\u5458, 13=\u7535\u8BDD, 15=\u8D85\u94FE\u63A5, 17=\u9644\u4EF6\u7B49',\n }),\n ),\n property: Type.Optional(Type.Any({ description: '\u5B57\u6BB5\u5C5E\u6027\u914D\u7F6E\uFF08\u53EF\u9009\uFF0C\u4E0D\u4F20\u5219\u81EA\u52A8\u67E5\u8BE2\uFF09' })),\n }),\n\n // DELETE (P1)\n Type.Object({\n action: Type.Literal('delete'),\n app_token: Type.String({ description: '\u591A\u7EF4\u8868\u683C token' }),\n table_id: Type.String({ description: '\u6570\u636E\u8868 ID' }),\n field_id: Type.String({ description: '\u5B57\u6BB5 ID' }),\n }),\n]);\n\n// ---------------------------------------------------------------------------\n// Params type\n// ---------------------------------------------------------------------------\n\ntype FeishuBitableAppTableFieldParams =\n | {\n action: 'create';\n app_token: string;\n table_id: string;\n field_name: string;\n type: number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n property?: any;\n }\n | {\n action: 'list';\n app_token: string;\n table_id: string;\n view_id?: string;\n page_size?: number;\n page_token?: string;\n }\n | {\n action: 'update';\n app_token: string;\n table_id: string;\n field_id: string;\n field_name?: string;\n type?: number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n property?: any;\n }\n | {\n action: 'delete';\n app_token: string;\n table_id: string;\n field_id: string;\n };\n\n// ---------------------------------------------------------------------------\n// Registration\n// ---------------------------------------------------------------------------\n\nexport function registerFeishuBitableAppTableFieldTool(api: OpenClawPluginApi) {\n if (!api.config) return;\n\n const cfg = api.config;\n\n const { toolClient, log } = createToolContext(api, 'feishu_bitable_app_table_field');\n\n api.registerTool(\n {\n name: 'feishu_bitable_app_table_field',\n label: 'Feishu Bitable Fields',\n description:\n '\u3010\u4EE5\u7528\u6237\u8EAB\u4EFD\u3011\u98DE\u4E66\u591A\u7EF4\u8868\u683C\u5B57\u6BB5\uFF08\u5217\uFF09\u7BA1\u7406\u5DE5\u5177\u3002\u5F53\u7528\u6237\u8981\u6C42\u521B\u5EFA/\u67E5\u8BE2/\u66F4\u65B0/\u5220\u9664\u5B57\u6BB5\u3001\u8C03\u6574\u8868\u7ED3\u6784\u65F6\u4F7F\u7528\u3002Actions: create\uFF08\u521B\u5EFA\u5B57\u6BB5\uFF09, list\uFF08\u5217\u51FA\u6240\u6709\u5B57\u6BB5\uFF09, update\uFF08\u66F4\u65B0\u5B57\u6BB5\uFF0C\u652F\u6301\u53EA\u4F20 field_name \u6539\u540D\uFF09, delete\uFF08\u5220\u9664\u5B57\u6BB5\uFF09\u3002',\n parameters: FeishuBitableAppTableFieldSchema,\n async execute(_toolCallId, params) {\n const p = params as FeishuBitableAppTableFieldParams;\n\n try {\n const client = toolClient();\n\n switch (p.action) {\n // -----------------------------------------------------------------\n // CREATE\n // -----------------------------------------------------------------\n case 'create': {\n log.info(\n `create: app_token=${p.app_token}, table_id=${p.table_id}, field_name=${p.field_name}, type=${p.type}`,\n );\n\n // \u7279\u6B8A\u5904\u7406\uFF1A\u8D85\u94FE\u63A5\u5B57\u6BB5\uFF08type=15\uFF09\u548C\u590D\u9009\u6846\u5B57\u6BB5\uFF08type=7\uFF09\u4E0D\u80FD\u4F20 property\uFF0C\u5373\u4F7F\u662F\u7A7A\u5BF9\u8C61\u4E5F\u4F1A\u62A5\u9519\n let propertyToSend = p.property;\n if ((p.type === 15 || p.type === 7) && p.property !== undefined) {\n const fieldTypeName = p.type === 15 ? 'URL' : 'Checkbox';\n log.warn(\n `create: ${fieldTypeName} field (type=${p.type}) detected with property parameter. ` +\n `Removing property to avoid API error. ` +\n `${fieldTypeName} fields must omit the property parameter entirely.`,\n );\n propertyToSend = undefined;\n }\n\n const res = await client.invoke(\n 'feishu_bitable_app_table_field.create',\n (sdk, opts) =>\n sdk.bitable.appTableField.create(\n {\n path: {\n app_token: p.app_token,\n table_id: p.table_id,\n },\n data: {\n field_name: p.field_name,\n type: p.type,\n property: propertyToSend,\n },\n },\n opts,\n ),\n { as: 'user' },\n );\n assertLarkOk(res);\n\n const data = res.data as FieldData | undefined;\n\n log.info(`create: created field ${data?.field?.field_id ?? 'unknown'}`);\n\n return json({\n field: data?.field ?? res.data,\n });\n }\n\n // -----------------------------------------------------------------\n // LIST\n // -----------------------------------------------------------------\n case 'list': {\n log.info(`list: app_token=${p.app_token}, table_id=${p.table_id}, view_id=${p.view_id ?? 'none'}`);\n\n const res = await client.invoke(\n 'feishu_bitable_app_table_field.list',\n (sdk, opts) =>\n sdk.bitable.appTableField.list(\n {\n path: {\n app_token: p.app_token,\n table_id: p.table_id,\n },\n params: {\n view_id: p.view_id,\n page_size: p.page_size,\n page_token: p.page_token,\n },\n },\n opts,\n ),\n { as: 'user' },\n );\n assertLarkOk(res);\n\n const data = res.data as PaginatedData | undefined;\n\n log.info(`list: returned ${data?.items?.length ?? 0} fields`);\n\n return json({\n fields: data?.items,\n has_more: data?.has_more ?? false,\n page_token: data?.page_token,\n });\n }\n\n // -----------------------------------------------------------------\n // UPDATE\n // -----------------------------------------------------------------\n case 'update': {\n log.info(`update: app_token=${p.app_token}, table_id=${p.table_id}, field_id=${p.field_id}`);\n\n // \u5982\u679C\u7F3A\u5C11 type \u6216 field_name\uFF0C\u81EA\u52A8\u67E5\u8BE2\u5F53\u524D\u5B57\u6BB5\u4FE1\u606F\n let finalFieldName = p.field_name;\n let finalType = p.type;\n let finalProperty = p.property;\n\n if (!finalType || !finalFieldName) {\n log.info(`update: missing type or field_name, auto-querying field info`);\n\n const listRes = await client.invoke(\n 'feishu_bitable_app_table_field.update',\n (sdk, opts) =>\n sdk.bitable.appTableField.list(\n {\n path: {\n app_token: p.app_token,\n table_id: p.table_id,\n },\n params: {\n page_size: 500,\n },\n },\n opts,\n ),\n { as: 'user' },\n );\n assertLarkOk(listRes);\n\n \n const listData = listRes.data as\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | PaginatedData<{ field_id?: string; field_name?: string; type?: number; property?: any }>\n | undefined;\n const currentField = listData?.items?.find((f) => f.field_id === p.field_id);\n\n if (!currentField) {\n return json({\n error: `field ${p.field_id} does not exist`,\n hint: 'Please verify field_id is correct. Use list action to view all fields.',\n });\n }\n\n // \u5408\u5E76\uFF1A\u7528\u6237\u4F20\u7684\u4F18\u5148\uFF0C\u5426\u5219\u7528\u67E5\u8BE2\u5230\u7684\n finalFieldName = p.field_name || currentField.field_name;\n finalType = p.type ?? currentField.type;\n finalProperty = p.property !== undefined ? p.property : currentField.property;\n\n log.info(`update: auto-filled type=${finalType}, field_name=${finalFieldName}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const updateData: any = {\n field_name: finalFieldName,\n type: finalType,\n };\n if (finalProperty !== undefined) {\n updateData.property = finalProperty;\n }\n\n const res = await client.invoke(\n 'feishu_bitable_app_table_field.update',\n (sdk, opts) =>\n sdk.bitable.appTableField.update(\n {\n path: {\n app_token: p.app_token,\n table_id: p.table_id,\n field_id: p.field_id,\n },\n data: updateData,\n },\n opts,\n ),\n { as: 'user' },\n );\n assertLarkOk(res);\n\n log.info(`update: updated field ${p.field_id}`);\n\n const updateData2 = res.data as FieldData | undefined;\n\n return json({\n field: updateData2?.field ?? res.data,\n });\n }\n\n // -----------------------------------------------------------------\n // DELETE\n // -----------------------------------------------------------------\n case 'delete': {\n log.info(`delete: app_token=${p.app_token}, table_id=${p.table_id}, field_id=${p.field_id}`);\n\n const res = await client.invoke(\n 'feishu_bitable_app_table_field.delete',\n (sdk, opts) =>\n sdk.bitable.appTableField.delete(\n {\n path: {\n app_token: p.app_token,\n table_id: p.table_id,\n field_id: p.field_id,\n },\n },\n opts,\n ),\n { as: 'user' },\n );\n assertLarkOk(res);\n\n log.info(`delete: deleted field ${p.field_id}`);\n\n return json({\n success: true,\n });\n }\n }\n } catch (err) {\n return await handleInvokeErrorWithAutoAuth(err, cfg);\n }\n },\n },\n { name: 'feishu_bitable_app_table_field' },\n );\n\n api.logger.info?.('feishu_bitable_app_table_field: Registered feishu_bitable_app_table_field tool');\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }