@larksuite/openclaw-lark 2025.7.15-beta.0

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 (426) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +76 -0
  3. package/bin/openclaw-lark.js +39 -0
  4. package/index.d.ts +36 -0
  5. package/index.js +188 -0
  6. package/openclaw.plugin.json +64 -0
  7. package/package.json +63 -0
  8. package/secret-contract-api.d.ts +15 -0
  9. package/secret-contract-api.js +78 -0
  10. package/skills/feishu-bitable/SKILL.md +248 -0
  11. package/skills/feishu-bitable/references/examples.md +813 -0
  12. package/skills/feishu-bitable/references/field-properties.md +763 -0
  13. package/skills/feishu-bitable/references/record-values.md +911 -0
  14. package/skills/feishu-calendar/SKILL.md +242 -0
  15. package/skills/feishu-channel-rules/SKILL.md +18 -0
  16. package/skills/feishu-channel-rules/references/markdown-syntax.md +138 -0
  17. package/skills/feishu-create-doc/SKILL.md +719 -0
  18. package/skills/feishu-fetch-doc/SKILL.md +93 -0
  19. package/skills/feishu-im-read/SKILL.md +163 -0
  20. package/skills/feishu-task/SKILL.md +340 -0
  21. package/skills/feishu-troubleshoot/SKILL.md +70 -0
  22. package/skills/feishu-update-doc/SKILL.md +285 -0
  23. package/src/card/builder.d.ts +152 -0
  24. package/src/card/builder.js +794 -0
  25. package/src/card/card-error.d.ts +91 -0
  26. package/src/card/card-error.js +206 -0
  27. package/src/card/cardkit.d.ts +90 -0
  28. package/src/card/cardkit.js +203 -0
  29. package/src/card/flush-controller.d.ts +45 -0
  30. package/src/card/flush-controller.js +138 -0
  31. package/src/card/image-resolver.d.ts +45 -0
  32. package/src/card/image-resolver.js +116 -0
  33. package/src/card/markdown-style.d.ts +16 -0
  34. package/src/card/markdown-style.js +106 -0
  35. package/src/card/reasoning-utils.d.ts +14 -0
  36. package/src/card/reasoning-utils.js +64 -0
  37. package/src/card/reply-dispatcher-types.d.ts +132 -0
  38. package/src/card/reply-dispatcher-types.js +61 -0
  39. package/src/card/reply-dispatcher.d.ts +15 -0
  40. package/src/card/reply-dispatcher.js +447 -0
  41. package/src/card/reply-mode.d.ts +41 -0
  42. package/src/card/reply-mode.js +70 -0
  43. package/src/card/streaming-card-controller.d.ts +118 -0
  44. package/src/card/streaming-card-controller.js +1045 -0
  45. package/src/card/tool-use-config.d.ts +26 -0
  46. package/src/card/tool-use-config.js +76 -0
  47. package/src/card/tool-use-display.d.ts +37 -0
  48. package/src/card/tool-use-display.js +476 -0
  49. package/src/card/tool-use-trace-store.d.ts +51 -0
  50. package/src/card/tool-use-trace-store.js +271 -0
  51. package/src/card/unavailable-guard.d.ts +35 -0
  52. package/src/card/unavailable-guard.js +87 -0
  53. package/src/channel/abort-detect.d.ts +47 -0
  54. package/src/channel/abort-detect.js +219 -0
  55. package/src/channel/chat-queue.d.ts +41 -0
  56. package/src/channel/chat-queue.js +68 -0
  57. package/src/channel/config-adapter.d.ts +23 -0
  58. package/src/channel/config-adapter.js +107 -0
  59. package/src/channel/directory.d.ts +57 -0
  60. package/src/channel/directory.js +197 -0
  61. package/src/channel/event-handlers.d.ts +17 -0
  62. package/src/channel/event-handlers.js +380 -0
  63. package/src/channel/interactive-dispatch.d.ts +59 -0
  64. package/src/channel/interactive-dispatch.js +195 -0
  65. package/src/channel/monitor.d.ts +17 -0
  66. package/src/channel/monitor.js +140 -0
  67. package/src/channel/onboarding-config.d.ts +18 -0
  68. package/src/channel/onboarding-config.js +96 -0
  69. package/src/channel/onboarding-migrate.d.ts +25 -0
  70. package/src/channel/onboarding-migrate.js +70 -0
  71. package/src/channel/onboarding.d.ts +12 -0
  72. package/src/channel/onboarding.js +300 -0
  73. package/src/channel/plugin.d.ts +13 -0
  74. package/src/channel/plugin.js +310 -0
  75. package/src/channel/probe.d.ts +14 -0
  76. package/src/channel/probe.js +24 -0
  77. package/src/channel/types.d.ts +37 -0
  78. package/src/channel/types.js +8 -0
  79. package/src/commands/auth.d.ts +21 -0
  80. package/src/commands/auth.js +165 -0
  81. package/src/commands/diagnose.d.ts +69 -0
  82. package/src/commands/diagnose.js +848 -0
  83. package/src/commands/doctor.d.ts +27 -0
  84. package/src/commands/doctor.js +588 -0
  85. package/src/commands/index.d.ts +25 -0
  86. package/src/commands/index.js +219 -0
  87. package/src/commands/locale.d.ts +7 -0
  88. package/src/commands/locale.js +8 -0
  89. package/src/core/accounts.d.ts +51 -0
  90. package/src/core/accounts.js +219 -0
  91. package/src/core/agent-config.d.ts +100 -0
  92. package/src/core/agent-config.js +148 -0
  93. package/src/core/api-error.d.ts +48 -0
  94. package/src/core/api-error.js +117 -0
  95. package/src/core/app-owner-fallback.d.ts +22 -0
  96. package/src/core/app-owner-fallback.js +39 -0
  97. package/src/core/app-scope-checker.d.ts +87 -0
  98. package/src/core/app-scope-checker.js +198 -0
  99. package/src/core/auth-errors.d.ts +144 -0
  100. package/src/core/auth-errors.js +160 -0
  101. package/src/core/card-action-operator.d.ts +33 -0
  102. package/src/core/card-action-operator.js +30 -0
  103. package/src/core/chat-info-cache.d.ts +67 -0
  104. package/src/core/chat-info-cache.js +165 -0
  105. package/src/core/comment-target.d.ts +65 -0
  106. package/src/core/comment-target.js +100 -0
  107. package/src/core/config-schema.d.ts +490 -0
  108. package/src/core/config-schema.js +223 -0
  109. package/src/core/device-flow.d.ts +77 -0
  110. package/src/core/device-flow.js +217 -0
  111. package/src/core/domains.d.ts +18 -0
  112. package/src/core/domains.js +34 -0
  113. package/src/core/feishu-fetch.d.ts +18 -0
  114. package/src/core/feishu-fetch.js +28 -0
  115. package/src/core/footer-config.d.ts +24 -0
  116. package/src/core/footer-config.js +51 -0
  117. package/src/core/lark-client.d.ts +125 -0
  118. package/src/core/lark-client.js +468 -0
  119. package/src/core/lark-logger.d.ts +23 -0
  120. package/src/core/lark-logger.js +160 -0
  121. package/src/core/lark-ticket.d.ts +29 -0
  122. package/src/core/lark-ticket.js +40 -0
  123. package/src/core/message-unavailable.d.ts +53 -0
  124. package/src/core/message-unavailable.js +142 -0
  125. package/src/core/owner-policy.d.ts +32 -0
  126. package/src/core/owner-policy.js +55 -0
  127. package/src/core/permission-url.d.ts +22 -0
  128. package/src/core/permission-url.js +76 -0
  129. package/src/core/raw-request.d.ts +27 -0
  130. package/src/core/raw-request.js +90 -0
  131. package/src/core/runtime-store.d.ts +13 -0
  132. package/src/core/runtime-store.js +29 -0
  133. package/src/core/scope-manager.d.ts +168 -0
  134. package/src/core/scope-manager.js +224 -0
  135. package/src/core/sdk-compat.d.ts +20 -0
  136. package/src/core/sdk-compat.js +28 -0
  137. package/src/core/security-check.d.ts +72 -0
  138. package/src/core/security-check.js +184 -0
  139. package/src/core/shutdown-hooks.d.ts +22 -0
  140. package/src/core/shutdown-hooks.js +61 -0
  141. package/src/core/synthetic-target.d.ts +33 -0
  142. package/src/core/synthetic-target.js +40 -0
  143. package/src/core/targets.d.ts +60 -0
  144. package/src/core/targets.js +173 -0
  145. package/src/core/token-store.d.ts +54 -0
  146. package/src/core/token-store.js +326 -0
  147. package/src/core/tool-client.d.ts +176 -0
  148. package/src/core/tool-client.js +426 -0
  149. package/src/core/tool-scopes.d.ts +156 -0
  150. package/src/core/tool-scopes.js +344 -0
  151. package/src/core/tools-config.d.ts +55 -0
  152. package/src/core/tools-config.js +143 -0
  153. package/src/core/types.d.ts +91 -0
  154. package/src/core/types.js +12 -0
  155. package/src/core/uat-client.d.ts +46 -0
  156. package/src/core/uat-client.js +192 -0
  157. package/src/core/version.d.ts +31 -0
  158. package/src/core/version.js +69 -0
  159. package/src/messaging/converters/audio.d.ts +8 -0
  160. package/src/messaging/converters/audio.js +24 -0
  161. package/src/messaging/converters/calendar.d.ts +13 -0
  162. package/src/messaging/converters/calendar.js +56 -0
  163. package/src/messaging/converters/content-converter-helpers.d.ts +30 -0
  164. package/src/messaging/converters/content-converter-helpers.js +82 -0
  165. package/src/messaging/converters/content-converter.d.ts +24 -0
  166. package/src/messaging/converters/content-converter.js +40 -0
  167. package/src/messaging/converters/file.d.ts +8 -0
  168. package/src/messaging/converters/file.js +24 -0
  169. package/src/messaging/converters/folder.d.ts +8 -0
  170. package/src/messaging/converters/folder.js +24 -0
  171. package/src/messaging/converters/hongbao.d.ts +8 -0
  172. package/src/messaging/converters/hongbao.js +20 -0
  173. package/src/messaging/converters/image.d.ts +8 -0
  174. package/src/messaging/converters/image.js +22 -0
  175. package/src/messaging/converters/index.d.ts +8 -0
  176. package/src/messaging/converters/index.js +53 -0
  177. package/src/messaging/converters/interactive/card-converter.d.ts +76 -0
  178. package/src/messaging/converters/interactive/card-converter.js +1177 -0
  179. package/src/messaging/converters/interactive/card-utils.d.ts +9 -0
  180. package/src/messaging/converters/interactive/card-utils.js +47 -0
  181. package/src/messaging/converters/interactive/index.d.ts +8 -0
  182. package/src/messaging/converters/interactive/index.js +25 -0
  183. package/src/messaging/converters/interactive/legacy.d.ts +11 -0
  184. package/src/messaging/converters/interactive/legacy.js +60 -0
  185. package/src/messaging/converters/interactive/types.d.ts +23 -0
  186. package/src/messaging/converters/interactive/types.js +27 -0
  187. package/src/messaging/converters/location.d.ts +8 -0
  188. package/src/messaging/converters/location.js +23 -0
  189. package/src/messaging/converters/merge-forward.d.ts +32 -0
  190. package/src/messaging/converters/merge-forward.js +235 -0
  191. package/src/messaging/converters/post.d.ts +11 -0
  192. package/src/messaging/converters/post.js +235 -0
  193. package/src/messaging/converters/share.d.ts +9 -0
  194. package/src/messaging/converters/share.js +28 -0
  195. package/src/messaging/converters/sticker.d.ts +8 -0
  196. package/src/messaging/converters/sticker.js +22 -0
  197. package/src/messaging/converters/system.d.ts +12 -0
  198. package/src/messaging/converters/system.js +36 -0
  199. package/src/messaging/converters/text.d.ts +8 -0
  200. package/src/messaging/converters/text.js +18 -0
  201. package/src/messaging/converters/todo.d.ts +8 -0
  202. package/src/messaging/converters/todo.js +45 -0
  203. package/src/messaging/converters/types.d.ts +114 -0
  204. package/src/messaging/converters/types.js +8 -0
  205. package/src/messaging/converters/unknown.d.ts +8 -0
  206. package/src/messaging/converters/unknown.js +20 -0
  207. package/src/messaging/converters/utils.d.ts +22 -0
  208. package/src/messaging/converters/utils.js +57 -0
  209. package/src/messaging/converters/video-chat.d.ts +8 -0
  210. package/src/messaging/converters/video-chat.js +31 -0
  211. package/src/messaging/converters/video.d.ts +8 -0
  212. package/src/messaging/converters/video.js +35 -0
  213. package/src/messaging/converters/vote.d.ts +8 -0
  214. package/src/messaging/converters/vote.js +28 -0
  215. package/src/messaging/inbound/bot-content.d.ts +84 -0
  216. package/src/messaging/inbound/bot-content.js +117 -0
  217. package/src/messaging/inbound/bot-loop-guard.d.ts +48 -0
  218. package/src/messaging/inbound/bot-loop-guard.js +89 -0
  219. package/src/messaging/inbound/comment-context.d.ts +82 -0
  220. package/src/messaging/inbound/comment-context.js +353 -0
  221. package/src/messaging/inbound/comment-handler.d.ts +30 -0
  222. package/src/messaging/inbound/comment-handler.js +269 -0
  223. package/src/messaging/inbound/dedup.d.ts +59 -0
  224. package/src/messaging/inbound/dedup.js +121 -0
  225. package/src/messaging/inbound/dispatch-builders.d.ts +104 -0
  226. package/src/messaging/inbound/dispatch-builders.js +241 -0
  227. package/src/messaging/inbound/dispatch-commands.d.ts +22 -0
  228. package/src/messaging/inbound/dispatch-commands.js +131 -0
  229. package/src/messaging/inbound/dispatch-context.d.ts +67 -0
  230. package/src/messaging/inbound/dispatch-context.js +153 -0
  231. package/src/messaging/inbound/dispatch.d.ts +50 -0
  232. package/src/messaging/inbound/dispatch.js +477 -0
  233. package/src/messaging/inbound/enrich.d.ts +102 -0
  234. package/src/messaging/inbound/enrich.js +236 -0
  235. package/src/messaging/inbound/gate-effects.d.ts +23 -0
  236. package/src/messaging/inbound/gate-effects.js +46 -0
  237. package/src/messaging/inbound/gate.d.ts +91 -0
  238. package/src/messaging/inbound/gate.js +342 -0
  239. package/src/messaging/inbound/handler-registry.d.ts +25 -0
  240. package/src/messaging/inbound/handler-registry.js +23 -0
  241. package/src/messaging/inbound/handler.d.ts +37 -0
  242. package/src/messaging/inbound/handler.js +286 -0
  243. package/src/messaging/inbound/media-resolver.d.ts +32 -0
  244. package/src/messaging/inbound/media-resolver.js +91 -0
  245. package/src/messaging/inbound/mention-registry.d.ts +59 -0
  246. package/src/messaging/inbound/mention-registry.js +115 -0
  247. package/src/messaging/inbound/mention.d.ts +48 -0
  248. package/src/messaging/inbound/mention.js +102 -0
  249. package/src/messaging/inbound/parse-io.d.ts +50 -0
  250. package/src/messaging/inbound/parse-io.js +86 -0
  251. package/src/messaging/inbound/parse.d.ts +28 -0
  252. package/src/messaging/inbound/parse.js +128 -0
  253. package/src/messaging/inbound/permission.d.ts +17 -0
  254. package/src/messaging/inbound/permission.js +44 -0
  255. package/src/messaging/inbound/policy.d.ts +95 -0
  256. package/src/messaging/inbound/policy.js +168 -0
  257. package/src/messaging/inbound/reaction-handler.d.ts +62 -0
  258. package/src/messaging/inbound/reaction-handler.js +259 -0
  259. package/src/messaging/inbound/sentinel-store.d.ts +37 -0
  260. package/src/messaging/inbound/sentinel-store.js +98 -0
  261. package/src/messaging/inbound/synthetic-message.d.ts +26 -0
  262. package/src/messaging/inbound/synthetic-message.js +59 -0
  263. package/src/messaging/inbound/user-name-cache-store.d.ts +62 -0
  264. package/src/messaging/inbound/user-name-cache-store.js +236 -0
  265. package/src/messaging/inbound/user-name-cache.d.ts +78 -0
  266. package/src/messaging/inbound/user-name-cache.js +306 -0
  267. package/src/messaging/inbound/vc-meeting-invited-handler.d.ts +20 -0
  268. package/src/messaging/inbound/vc-meeting-invited-handler.js +236 -0
  269. package/src/messaging/inbound/vc-sender.d.ts +41 -0
  270. package/src/messaging/inbound/vc-sender.js +53 -0
  271. package/src/messaging/outbound/actions.d.ts +16 -0
  272. package/src/messaging/outbound/actions.js +329 -0
  273. package/src/messaging/outbound/bot-peer-context.d.ts +42 -0
  274. package/src/messaging/outbound/bot-peer-context.js +40 -0
  275. package/src/messaging/outbound/chat-manage.d.ts +64 -0
  276. package/src/messaging/outbound/chat-manage.js +117 -0
  277. package/src/messaging/outbound/deliver.d.ts +186 -0
  278. package/src/messaging/outbound/deliver.js +410 -0
  279. package/src/messaging/outbound/fetch.d.ts +12 -0
  280. package/src/messaging/outbound/fetch.js +17 -0
  281. package/src/messaging/outbound/forward.d.ts +26 -0
  282. package/src/messaging/outbound/forward.js +51 -0
  283. package/src/messaging/outbound/media-url-utils.d.ts +29 -0
  284. package/src/messaging/outbound/media-url-utils.js +172 -0
  285. package/src/messaging/outbound/media.d.ts +260 -0
  286. package/src/messaging/outbound/media.js +865 -0
  287. package/src/messaging/outbound/normalize-mentions.d.ts +50 -0
  288. package/src/messaging/outbound/normalize-mentions.js +166 -0
  289. package/src/messaging/outbound/outbound-mention.d.ts +41 -0
  290. package/src/messaging/outbound/outbound-mention.js +112 -0
  291. package/src/messaging/outbound/outbound.d.ts +79 -0
  292. package/src/messaging/outbound/outbound.js +195 -0
  293. package/src/messaging/outbound/reactions.d.ts +124 -0
  294. package/src/messaging/outbound/reactions.js +384 -0
  295. package/src/messaging/outbound/send.d.ts +153 -0
  296. package/src/messaging/outbound/send.js +417 -0
  297. package/src/messaging/outbound/typing.d.ts +60 -0
  298. package/src/messaging/outbound/typing.js +139 -0
  299. package/src/messaging/shared/message-lookup.d.ts +54 -0
  300. package/src/messaging/shared/message-lookup.js +120 -0
  301. package/src/messaging/types.d.ts +316 -0
  302. package/src/messaging/types.js +11 -0
  303. package/src/tools/ask-user-question.d.ts +32 -0
  304. package/src/tools/ask-user-question.js +922 -0
  305. package/src/tools/auto-auth.d.ts +57 -0
  306. package/src/tools/auto-auth.js +904 -0
  307. package/src/tools/helpers.d.ts +264 -0
  308. package/src/tools/helpers.js +389 -0
  309. package/src/tools/mcp/doc/create.d.ts +12 -0
  310. package/src/tools/mcp/doc/create.js +47 -0
  311. package/src/tools/mcp/doc/fetch.d.ts +12 -0
  312. package/src/tools/mcp/doc/fetch.js +39 -0
  313. package/src/tools/mcp/doc/index.d.ts +12 -0
  314. package/src/tools/mcp/doc/index.js +50 -0
  315. package/src/tools/mcp/doc/update.d.ts +12 -0
  316. package/src/tools/mcp/doc/update.js +64 -0
  317. package/src/tools/mcp/shared.d.ts +59 -0
  318. package/src/tools/mcp/shared.js +239 -0
  319. package/src/tools/oapi/bitable/app-table-field.d.ts +16 -0
  320. package/src/tools/oapi/bitable/app-table-field.js +225 -0
  321. package/src/tools/oapi/bitable/app-table-record.d.ts +20 -0
  322. package/src/tools/oapi/bitable/app-table-record.js +439 -0
  323. package/src/tools/oapi/bitable/app-table-view.d.ts +16 -0
  324. package/src/tools/oapi/bitable/app-table-view.js +172 -0
  325. package/src/tools/oapi/bitable/app-table.d.ts +17 -0
  326. package/src/tools/oapi/bitable/app-table.js +195 -0
  327. package/src/tools/oapi/bitable/app.d.ts +18 -0
  328. package/src/tools/oapi/bitable/app.js +189 -0
  329. package/src/tools/oapi/bitable/index.d.ts +9 -0
  330. package/src/tools/oapi/bitable/index.js +17 -0
  331. package/src/tools/oapi/calendar/calendar.d.ts +15 -0
  332. package/src/tools/oapi/calendar/calendar.js +125 -0
  333. package/src/tools/oapi/calendar/event-attendee.d.ts +14 -0
  334. package/src/tools/oapi/calendar/event-attendee.js +161 -0
  335. package/src/tools/oapi/calendar/event.d.ts +16 -0
  336. package/src/tools/oapi/calendar/event.js +712 -0
  337. package/src/tools/oapi/calendar/freebusy.d.ts +13 -0
  338. package/src/tools/oapi/calendar/freebusy.js +114 -0
  339. package/src/tools/oapi/calendar/index.d.ts +8 -0
  340. package/src/tools/oapi/calendar/index.js +15 -0
  341. package/src/tools/oapi/chat/chat.d.ts +16 -0
  342. package/src/tools/oapi/chat/chat.js +127 -0
  343. package/src/tools/oapi/chat/index.d.ts +10 -0
  344. package/src/tools/oapi/chat/index.js +23 -0
  345. package/src/tools/oapi/chat/members.d.ts +11 -0
  346. package/src/tools/oapi/chat/members.js +84 -0
  347. package/src/tools/oapi/common/get-user.d.ts +12 -0
  348. package/src/tools/oapi/common/get-user.js +109 -0
  349. package/src/tools/oapi/common/index.d.ts +6 -0
  350. package/src/tools/oapi/common/index.js +11 -0
  351. package/src/tools/oapi/common/search-user.d.ts +11 -0
  352. package/src/tools/oapi/common/search-user.js +76 -0
  353. package/src/tools/oapi/drive/doc-comments.d.ts +15 -0
  354. package/src/tools/oapi/drive/doc-comments.js +351 -0
  355. package/src/tools/oapi/drive/doc-media.d.ts +19 -0
  356. package/src/tools/oapi/drive/doc-media.js +371 -0
  357. package/src/tools/oapi/drive/file.d.ts +19 -0
  358. package/src/tools/oapi/drive/file.js +519 -0
  359. package/src/tools/oapi/drive/index.d.ts +12 -0
  360. package/src/tools/oapi/drive/index.js +45 -0
  361. package/src/tools/oapi/helpers.d.ts +183 -0
  362. package/src/tools/oapi/helpers.js +385 -0
  363. package/src/tools/oapi/im/format-messages.d.ts +50 -0
  364. package/src/tools/oapi/im/format-messages.js +169 -0
  365. package/src/tools/oapi/im/index.d.ts +10 -0
  366. package/src/tools/oapi/im/index.js +25 -0
  367. package/src/tools/oapi/im/message-read.d.ts +13 -0
  368. package/src/tools/oapi/im/message-read.js +419 -0
  369. package/src/tools/oapi/im/message.d.ts +16 -0
  370. package/src/tools/oapi/im/message.js +152 -0
  371. package/src/tools/oapi/im/resource.d.ts +13 -0
  372. package/src/tools/oapi/im/resource.js +186 -0
  373. package/src/tools/oapi/im/time-utils.d.ts +46 -0
  374. package/src/tools/oapi/im/time-utils.js +212 -0
  375. package/src/tools/oapi/im/user-name-uat.d.ts +26 -0
  376. package/src/tools/oapi/im/user-name-uat.js +143 -0
  377. package/src/tools/oapi/index.d.ts +11 -0
  378. package/src/tools/oapi/index.js +64 -0
  379. package/src/tools/oapi/sdk-types.d.ts +96 -0
  380. package/src/tools/oapi/sdk-types.js +13 -0
  381. package/src/tools/oapi/search/doc-search.d.ts +13 -0
  382. package/src/tools/oapi/search/doc-search.js +194 -0
  383. package/src/tools/oapi/search/index.d.ts +12 -0
  384. package/src/tools/oapi/search/index.js +37 -0
  385. package/src/tools/oapi/sheets/index.d.ts +12 -0
  386. package/src/tools/oapi/sheets/index.js +35 -0
  387. package/src/tools/oapi/sheets/sheet.d.ts +16 -0
  388. package/src/tools/oapi/sheets/sheet.js +688 -0
  389. package/src/tools/oapi/task/attachment.d.ts +18 -0
  390. package/src/tools/oapi/task/attachment.js +107 -0
  391. package/src/tools/oapi/task/comment.d.ts +15 -0
  392. package/src/tools/oapi/task/comment.js +149 -0
  393. package/src/tools/oapi/task/index.d.ts +11 -0
  394. package/src/tools/oapi/task/index.js +21 -0
  395. package/src/tools/oapi/task/section.d.ts +17 -0
  396. package/src/tools/oapi/task/section.js +293 -0
  397. package/src/tools/oapi/task/subtask.d.ts +14 -0
  398. package/src/tools/oapi/task/subtask.js +171 -0
  399. package/src/tools/oapi/task/task.d.ts +19 -0
  400. package/src/tools/oapi/task/task.js +512 -0
  401. package/src/tools/oapi/task/task_agent.d.ts +14 -0
  402. package/src/tools/oapi/task/task_agent.js +108 -0
  403. package/src/tools/oapi/task/tasklist.d.ts +19 -0
  404. package/src/tools/oapi/task/tasklist.js +276 -0
  405. package/src/tools/oapi/wiki/index.d.ts +12 -0
  406. package/src/tools/oapi/wiki/index.js +42 -0
  407. package/src/tools/oapi/wiki/space-node.d.ts +17 -0
  408. package/src/tools/oapi/wiki/space-node.js +233 -0
  409. package/src/tools/oapi/wiki/space.d.ts +15 -0
  410. package/src/tools/oapi/wiki/space.js +133 -0
  411. package/src/tools/oauth-batch-auth.d.ts +11 -0
  412. package/src/tools/oauth-batch-auth.js +150 -0
  413. package/src/tools/oauth-cards.d.ts +39 -0
  414. package/src/tools/oauth-cards.js +324 -0
  415. package/src/tools/oauth.d.ts +47 -0
  416. package/src/tools/oauth.js +592 -0
  417. package/src/tools/onboarding-auth.d.ts +27 -0
  418. package/src/tools/onboarding-auth.js +133 -0
  419. package/src/tools/tat/im/index.d.ts +15 -0
  420. package/src/tools/tat/im/index.js +22 -0
  421. package/src/tools/tat/im/resource.d.ts +15 -0
  422. package/src/tools/tat/im/resource.js +192 -0
  423. package/tsdown.config.d.ts +2 -0
  424. package/tsdown.config.js +25 -0
  425. package/vitest.config.d.ts +2 -0
  426. package/vitest.config.js +12 -0
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
4
+ * SPDX-License-Identifier: MIT
5
+ *
6
+ * Register all chat commands (/feishu_diagnose, /feishu_doctor, /feishu_auth, /feishu).
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.runFeishuStart = runFeishuStart;
10
+ exports.runFeishuStartI18n = runFeishuStartI18n;
11
+ exports.getFeishuHelp = getFeishuHelp;
12
+ exports.getFeishuHelpI18n = getFeishuHelpI18n;
13
+ exports.registerCommands = registerCommands;
14
+ const version_1 = require("../core/version.js");
15
+ const diagnose_1 = require("./diagnose.js");
16
+ const doctor_1 = require("./doctor.js");
17
+ const auth_1 = require("./auth.js");
18
+ // ---------------------------------------------------------------------------
19
+ // I18n text map for /feishu start, help, and error messages
20
+ // ---------------------------------------------------------------------------
21
+ const T = {
22
+ zh_cn: {
23
+ legacyNotDisabled: '❌ 检测到旧版插件未禁用。\n' +
24
+ '👉 请依次运行命令:\n' +
25
+ '```\n' +
26
+ 'openclaw config set plugins.entries.feishu.enabled false --json\n' +
27
+ 'openclaw gateway restart\n' +
28
+ '```',
29
+ toolsProfileWarn: (profile) => `⚠️ 工具 Profile 当前为 \`${profile}\`,飞书工具可能无法加载。请检查配置是否正确。\n`,
30
+ startFailed: (details) => `❌ 飞书 OpenClaw 插件启动失败:\n\n${details}`,
31
+ startWithWarnings: (version, details) => `⚠️ 飞书 OpenClaw 插件已启动 v${version}(存在警告)\n\n${details}`,
32
+ startOk: (version) => `✅ 飞书 OpenClaw 插件已启动 v${version}`,
33
+ helpTitle: (version) => `飞书OpenClaw插件 v${version}`,
34
+ helpUsage: '用法:',
35
+ helpStart: '/feishu start - 校验插件配置',
36
+ helpAuth: '/feishu auth - 批量授权用户权限',
37
+ helpDoctor: '/feishu doctor - 运行诊断',
38
+ helpHelp: '/feishu help - 显示此帮助',
39
+ diagFailed: (msg) => `诊断执行失败: ${msg}`,
40
+ authFailed: (msg) => `授权执行失败: ${msg}`,
41
+ execFailed: (msg) => `执行失败: ${msg}`,
42
+ },
43
+ en_us: {
44
+ legacyNotDisabled: '❌ Legacy plugin is not disabled.\n' +
45
+ '👉 Please run the following commands:\n' +
46
+ '```\n' +
47
+ 'openclaw config set plugins.entries.feishu.enabled false --json\n' +
48
+ 'openclaw gateway restart\n' +
49
+ '```',
50
+ toolsProfileWarn: (profile) => `⚠️ Tools profile is currently set to \`${profile}\`. Feishu tools may not load properly. Please check your configuration.\n`,
51
+ startFailed: (details) => `❌ Feishu OpenClaw plugin failed to start:\n\n${details}`,
52
+ startWithWarnings: (version, details) => `⚠️ Feishu OpenClaw plugin started v${version} (with warnings)\n\n${details}`,
53
+ startOk: (version) => `✅ Feishu OpenClaw plugin started v${version}`,
54
+ helpTitle: (version) => `Feishu OpenClaw Plugin v${version}`,
55
+ helpUsage: 'Usage:',
56
+ helpStart: '/feishu start - Validate plugin configuration',
57
+ helpAuth: '/feishu auth - Batch authorize user permissions',
58
+ helpDoctor: '/feishu doctor - Run diagnostics',
59
+ helpHelp: '/feishu help - Show this help',
60
+ diagFailed: (msg) => `Diagnostics failed: ${msg}`,
61
+ authFailed: (msg) => `Authorization failed: ${msg}`,
62
+ execFailed: (msg) => `Execution failed: ${msg}`,
63
+ },
64
+ };
65
+ // ---------------------------------------------------------------------------
66
+ // Exported i18n functions
67
+ // ---------------------------------------------------------------------------
68
+ /**
69
+ * 运行 /feishu start 校验,返回 Markdown 格式结果。
70
+ */
71
+ function runFeishuStart(config, locale = 'zh_cn') {
72
+ const t = T[locale];
73
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
74
+ const cfg = config;
75
+ const errors = [];
76
+ const warnings = [];
77
+ // 检查旧版插件是否已禁用 (error)
78
+ const feishuEntry = cfg.plugins?.entries?.feishu;
79
+ if (feishuEntry && feishuEntry.enabled !== false) {
80
+ errors.push(t.legacyNotDisabled);
81
+ }
82
+ // 检查 tools.profile (warning)
83
+ const profile = cfg.tools?.profile;
84
+ const incompleteProfiles = new Set(['minimal', 'coding', 'messaging']);
85
+ if (profile && incompleteProfiles.has(profile)) {
86
+ warnings.push(t.toolsProfileWarn(profile));
87
+ }
88
+ if (errors.length > 0) {
89
+ const all = [...errors, ...warnings];
90
+ return t.startFailed(all.join('\n\n'));
91
+ }
92
+ if (warnings.length > 0) {
93
+ return t.startWithWarnings((0, version_1.getPluginVersion)(), warnings.join('\n\n'));
94
+ }
95
+ return t.startOk((0, version_1.getPluginVersion)());
96
+ }
97
+ /**
98
+ * 运行 /feishu start,同时生成中英双语结果。
99
+ */
100
+ function runFeishuStartI18n(config) {
101
+ return {
102
+ zh_cn: runFeishuStart(config, 'zh_cn'),
103
+ en_us: runFeishuStart(config, 'en_us'),
104
+ };
105
+ }
106
+ /**
107
+ * 生成 /feishu help 帮助文本。
108
+ */
109
+ function getFeishuHelp(locale = 'zh_cn') {
110
+ const t = T[locale];
111
+ return (`${t.helpTitle((0, version_1.getPluginVersion)())}\n\n` +
112
+ `${t.helpUsage}\n` +
113
+ ` ${t.helpStart}\n` +
114
+ ` ${t.helpAuth}\n` +
115
+ ` ${t.helpDoctor}\n` +
116
+ ` ${t.helpHelp}`);
117
+ }
118
+ /**
119
+ * 生成 /feishu help,同时生成中英双语结果。
120
+ */
121
+ function getFeishuHelpI18n() {
122
+ return {
123
+ zh_cn: getFeishuHelp('zh_cn'),
124
+ en_us: getFeishuHelp('en_us'),
125
+ };
126
+ }
127
+ // ---------------------------------------------------------------------------
128
+ // Command registration
129
+ // ---------------------------------------------------------------------------
130
+ function registerCommands(api) {
131
+ // /feishu_diagnose
132
+ api.registerCommand({
133
+ name: 'feishu_diagnose',
134
+ description: 'Run Feishu plugin diagnostics to check config, connectivity, and permissions',
135
+ acceptsArgs: false,
136
+ requireAuth: true,
137
+ async handler(ctx) {
138
+ try {
139
+ const report = await (0, diagnose_1.runDiagnosis)({ config: ctx.config });
140
+ return { text: (0, diagnose_1.formatDiagReportText)(report) };
141
+ }
142
+ catch (err) {
143
+ return {
144
+ text: T.zh_cn.diagFailed(err instanceof Error ? err.message : String(err)),
145
+ };
146
+ }
147
+ },
148
+ });
149
+ // /feishu_doctor
150
+ api.registerCommand({
151
+ name: 'feishu_doctor',
152
+ description: 'Run Feishu plugin diagnostics',
153
+ acceptsArgs: false,
154
+ requireAuth: true,
155
+ async handler(ctx) {
156
+ try {
157
+ const markdown = await (0, doctor_1.runFeishuDoctor)(ctx.config, ctx.accountId);
158
+ return { text: markdown };
159
+ }
160
+ catch (err) {
161
+ return {
162
+ text: T.zh_cn.diagFailed(err instanceof Error ? err.message : String(err)),
163
+ };
164
+ }
165
+ },
166
+ });
167
+ // /feishu_auth
168
+ api.registerCommand({
169
+ name: 'feishu_auth',
170
+ description: 'Batch authorize user permissions for Feishu',
171
+ acceptsArgs: false,
172
+ requireAuth: true,
173
+ async handler(ctx) {
174
+ try {
175
+ const result = await (0, auth_1.runFeishuAuth)(ctx.config);
176
+ return { text: result };
177
+ }
178
+ catch (err) {
179
+ return {
180
+ text: T.zh_cn.authFailed(err instanceof Error ? err.message : String(err)),
181
+ };
182
+ }
183
+ },
184
+ });
185
+ // /feishu (统一入口,支持子命令)
186
+ api.registerCommand({
187
+ name: 'feishu',
188
+ description: 'Feishu plugin commands (subcommands: auth, doctor, start)',
189
+ acceptsArgs: true,
190
+ requireAuth: true,
191
+ async handler(ctx) {
192
+ const args = ctx.args?.trim().split(/\s+/) || [];
193
+ const subcommand = args[0]?.toLowerCase();
194
+ try {
195
+ // /feishu auth 或 /feishu onboarding
196
+ if (subcommand === 'auth' || subcommand === 'onboarding') {
197
+ const result = await (0, auth_1.runFeishuAuth)(ctx.config);
198
+ return { text: result };
199
+ }
200
+ // /feishu doctor
201
+ if (subcommand === 'doctor') {
202
+ const markdown = await (0, doctor_1.runFeishuDoctor)(ctx.config, ctx.accountId);
203
+ return { text: markdown };
204
+ }
205
+ // /feishu start
206
+ if (subcommand === 'start') {
207
+ return { text: runFeishuStart(ctx.config) };
208
+ }
209
+ // /feishu help 或无效子命令或无参数
210
+ return { text: getFeishuHelp() };
211
+ }
212
+ catch (err) {
213
+ return {
214
+ text: T.zh_cn.execFailed(err instanceof Error ? err.message : String(err)),
215
+ };
216
+ }
217
+ },
218
+ });
219
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Shared locale type for feishu command i18n.
6
+ */
7
+ export type FeishuLocale = 'zh_cn' | 'en_us';
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
4
+ * SPDX-License-Identifier: MIT
5
+ *
6
+ * Shared locale type for feishu command i18n.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Lark multi-account management.
6
+ *
7
+ * Account overrides live under `cfg.channels.feishu.accounts`.
8
+ * Each account may override any top-level Feishu config field;
9
+ * unset fields fall back to the top-level defaults.
10
+ */
11
+ import type { ClawdbotConfig } from 'openclaw/plugin-sdk';
12
+ import type { ConfiguredLarkAccount, FeishuConfig, LarkAccount, LarkCredentials } from './types';
13
+ /**
14
+ * List all account IDs defined in the Lark config.
15
+ *
16
+ * Returns `[DEFAULT_ACCOUNT_ID]` when no explicit accounts exist.
17
+ */
18
+ export declare function getLarkAccountIds(cfg: ClawdbotConfig): string[];
19
+ /** Return the first (default) account ID. */
20
+ export declare function getDefaultLarkAccountId(cfg: ClawdbotConfig): string;
21
+ /**
22
+ * Resolve a single account by merging the top-level config with
23
+ * account-level overrides. Account fields take precedence.
24
+ *
25
+ * Falls back to the default account when `accountId` is omitted or `null`.
26
+ */
27
+ export declare function getLarkAccount(cfg: ClawdbotConfig, accountId?: string | null): LarkAccount;
28
+ /**
29
+ * Build an account-scoped config view for downstream helpers that read from
30
+ * `cfg.channels.feishu`.
31
+ *
32
+ * In multi-account mode, many runtime helpers expect the merged account config
33
+ * to already be exposed at `cfg.channels.feishu`. This mirrors the inbound
34
+ * path behavior so outbound/tooling code resolves per-account settings
35
+ * consistently.
36
+ *
37
+ * @param cfg - Original top-level plugin config
38
+ * @param accountId - Optional target account ID
39
+ * @returns Config with `channels.feishu` replaced by the merged account config
40
+ */
41
+ export declare function createAccountScopedConfig(cfg: ClawdbotConfig, accountId?: string | null): ClawdbotConfig;
42
+ /** Return all accounts that are both configured and enabled. */
43
+ export declare function getEnabledLarkAccounts(cfg: ClawdbotConfig): LarkAccount[];
44
+ /**
45
+ * Extract API credentials from a Feishu config fragment.
46
+ *
47
+ * Returns `null` when `appId` or `appSecret` is missing.
48
+ */
49
+ export declare function getLarkCredentials(feishuCfg?: FeishuConfig): LarkCredentials | null;
50
+ /** Type guard: narrow `LarkAccount` to `ConfiguredLarkAccount`. */
51
+ export declare function isConfigured(account: LarkAccount): account is ConfiguredLarkAccount;
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
4
+ * SPDX-License-Identifier: MIT
5
+ *
6
+ * Lark multi-account management.
7
+ *
8
+ * Account overrides live under `cfg.channels.feishu.accounts`.
9
+ * Each account may override any top-level Feishu config field;
10
+ * unset fields fall back to the top-level defaults.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.getLarkAccountIds = getLarkAccountIds;
14
+ exports.getDefaultLarkAccountId = getDefaultLarkAccountId;
15
+ exports.getLarkAccount = getLarkAccount;
16
+ exports.createAccountScopedConfig = createAccountScopedConfig;
17
+ exports.getEnabledLarkAccounts = getEnabledLarkAccounts;
18
+ exports.getLarkCredentials = getLarkCredentials;
19
+ exports.isConfigured = isConfigured;
20
+ const account_id_1 = require("openclaw/plugin-sdk/account-id");
21
+ const normalizeAccountId = typeof account_id_1.normalizeAccountId === 'function'
22
+ ? account_id_1.normalizeAccountId
23
+ : (id) => id?.trim().toLowerCase() || undefined;
24
+ // ---------------------------------------------------------------------------
25
+ // Internal helpers
26
+ // ---------------------------------------------------------------------------
27
+ /** Extract the `channels.feishu` section from the top-level config. */
28
+ function getLarkConfig(cfg) {
29
+ return cfg?.channels?.feishu;
30
+ }
31
+ /** Return the per-account override map, if present. */
32
+ function getAccountMap(section) {
33
+ return section.accounts;
34
+ }
35
+ /** Strip the `accounts` key and return the remaining top-level config. */
36
+ function baseConfig(section) {
37
+ const { accounts: _ignored, ...rest } = section;
38
+ return rest;
39
+ }
40
+ /** Merge base config with account override (account fields take precedence).
41
+ * Performs a one-level deep merge for plain-object fields so that partial
42
+ * account overrides (e.g. `footer: { model: false }`) are merged with
43
+ * the base instead of replacing the entire object. */
44
+ function mergeAccountConfig(base, override) {
45
+ const result = { ...base };
46
+ for (const [key, value] of Object.entries(override)) {
47
+ if (value === undefined)
48
+ continue;
49
+ const baseVal = base[key];
50
+ // Deep-merge plain objects one level (footer, tools, heartbeat, etc.)
51
+ if (value &&
52
+ typeof value === 'object' &&
53
+ !Array.isArray(value) &&
54
+ baseVal &&
55
+ typeof baseVal === 'object' &&
56
+ !Array.isArray(baseVal)) {
57
+ result[key] = { ...baseVal, ...value };
58
+ }
59
+ else {
60
+ result[key] = value;
61
+ }
62
+ }
63
+ return result;
64
+ }
65
+ /** Coerce a domain string to `LarkBrand`, defaulting to `"feishu"`. */
66
+ function toBrand(domain) {
67
+ return domain ?? 'feishu';
68
+ }
69
+ // ---------------------------------------------------------------------------
70
+ // Public API
71
+ // ---------------------------------------------------------------------------
72
+ /**
73
+ * List all account IDs defined in the Lark config.
74
+ *
75
+ * Returns `[DEFAULT_ACCOUNT_ID]` when no explicit accounts exist.
76
+ */
77
+ function getLarkAccountIds(cfg) {
78
+ const section = getLarkConfig(cfg);
79
+ if (!section)
80
+ return [account_id_1.DEFAULT_ACCOUNT_ID];
81
+ const accountMap = getAccountMap(section);
82
+ if (!accountMap || Object.keys(accountMap).length === 0) {
83
+ return [account_id_1.DEFAULT_ACCOUNT_ID];
84
+ }
85
+ const accountIds = Object.keys(accountMap);
86
+ // 当 accounts 存在时,如果顶层也配置了 appId/appSecret(即默认机器人),
87
+ // 将 DEFAULT_ACCOUNT_ID 加入列表,确保顶层机器人不会被忽略。
88
+ // 但如果 accountMap 已经包含 default,则不重复添加。
89
+ const hasDefault = accountIds.some((id) => id.trim().toLowerCase() === account_id_1.DEFAULT_ACCOUNT_ID);
90
+ if (!hasDefault) {
91
+ const base = baseConfig(section);
92
+ if (base.appId && base.appSecret) {
93
+ return [account_id_1.DEFAULT_ACCOUNT_ID, ...accountIds];
94
+ }
95
+ }
96
+ return accountIds;
97
+ }
98
+ /** Return the first (default) account ID. */
99
+ function getDefaultLarkAccountId(cfg) {
100
+ return getLarkAccountIds(cfg)[0];
101
+ }
102
+ /**
103
+ * Resolve a single account by merging the top-level config with
104
+ * account-level overrides. Account fields take precedence.
105
+ *
106
+ * Falls back to the default account when `accountId` is omitted or `null`.
107
+ */
108
+ function getLarkAccount(cfg, accountId) {
109
+ const requestedId = accountId ? (normalizeAccountId(accountId) ?? account_id_1.DEFAULT_ACCOUNT_ID) : account_id_1.DEFAULT_ACCOUNT_ID;
110
+ const section = getLarkConfig(cfg);
111
+ if (!section) {
112
+ return {
113
+ accountId: requestedId,
114
+ enabled: false,
115
+ configured: false,
116
+ brand: 'feishu',
117
+ config: {},
118
+ };
119
+ }
120
+ const base = baseConfig(section);
121
+ const accountMap = getAccountMap(section);
122
+ const accountOverride = accountMap && requestedId !== account_id_1.DEFAULT_ACCOUNT_ID
123
+ ? accountMap[requestedId]
124
+ : undefined;
125
+ const merged = accountOverride
126
+ ? mergeAccountConfig(base, accountOverride)
127
+ : { ...base };
128
+ const appId = merged.appId;
129
+ const appSecret = merged.appSecret;
130
+ const configured = !!(appId && appSecret);
131
+ // Respect explicit `enabled` when set; otherwise derive from `configured`.
132
+ const enabled = !!(merged.enabled ?? configured);
133
+ const brand = toBrand(merged.domain);
134
+ if (configured) {
135
+ return {
136
+ accountId: requestedId,
137
+ enabled,
138
+ configured: true,
139
+ name: merged.name ?? undefined,
140
+ appId: appId,
141
+ appSecret: appSecret,
142
+ encryptKey: merged.encryptKey ?? undefined,
143
+ verificationToken: merged.verificationToken ?? undefined,
144
+ brand,
145
+ config: merged,
146
+ };
147
+ }
148
+ return {
149
+ accountId: requestedId,
150
+ enabled,
151
+ configured: false,
152
+ name: merged.name ?? undefined,
153
+ appId: appId ?? undefined,
154
+ appSecret: appSecret ?? undefined,
155
+ encryptKey: merged.encryptKey ?? undefined,
156
+ verificationToken: merged.verificationToken ?? undefined,
157
+ brand,
158
+ config: merged,
159
+ };
160
+ }
161
+ /**
162
+ * Build an account-scoped config view for downstream helpers that read from
163
+ * `cfg.channels.feishu`.
164
+ *
165
+ * In multi-account mode, many runtime helpers expect the merged account config
166
+ * to already be exposed at `cfg.channels.feishu`. This mirrors the inbound
167
+ * path behavior so outbound/tooling code resolves per-account settings
168
+ * consistently.
169
+ *
170
+ * @param cfg - Original top-level plugin config
171
+ * @param accountId - Optional target account ID
172
+ * @returns Config with `channels.feishu` replaced by the merged account config
173
+ */
174
+ function createAccountScopedConfig(cfg, accountId) {
175
+ const account = getLarkAccount(cfg, accountId);
176
+ return {
177
+ ...cfg,
178
+ channels: {
179
+ ...cfg.channels,
180
+ feishu: account.config,
181
+ },
182
+ };
183
+ }
184
+ /** Return all accounts that are both configured and enabled. */
185
+ function getEnabledLarkAccounts(cfg) {
186
+ const ids = getLarkAccountIds(cfg);
187
+ const results = [];
188
+ for (const id of ids) {
189
+ const account = getLarkAccount(cfg, id);
190
+ if (account.enabled && account.configured) {
191
+ results.push(account);
192
+ }
193
+ }
194
+ return results;
195
+ }
196
+ /**
197
+ * Extract API credentials from a Feishu config fragment.
198
+ *
199
+ * Returns `null` when `appId` or `appSecret` is missing.
200
+ */
201
+ function getLarkCredentials(feishuCfg) {
202
+ if (!feishuCfg)
203
+ return null;
204
+ const appId = feishuCfg.appId;
205
+ const appSecret = feishuCfg.appSecret;
206
+ if (!appId || !appSecret)
207
+ return null;
208
+ return {
209
+ appId,
210
+ appSecret,
211
+ encryptKey: feishuCfg.encryptKey ?? undefined,
212
+ verificationToken: feishuCfg.verificationToken ?? undefined,
213
+ brand: toBrand(feishuCfg.domain),
214
+ };
215
+ }
216
+ /** Type guard: narrow `LarkAccount` to `ConfiguredLarkAccount`. */
217
+ function isConfigured(account) {
218
+ return account.configured;
219
+ }
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Agent configuration helpers for the Lark/Feishu channel plugin.
3
+ *
4
+ * Reads agent-level configuration (identity, skills, tools, subagents)
5
+ * from the top-level `agents.list` in OpenClawConfig. These helpers
6
+ * bridge the gap between the SDK's agent infrastructure and the Feishu
7
+ * plugin's dispatch/reply layers.
8
+ */
9
+ import type { ClawdbotConfig } from 'openclaw/plugin-sdk';
10
+ /** Minimal agent identity fields used by the Feishu plugin. */
11
+ interface AgentIdentity {
12
+ name?: string;
13
+ emoji?: string;
14
+ avatar?: string;
15
+ }
16
+ /** Minimal agent tools policy fields. */
17
+ interface AgentToolsPolicy {
18
+ allow?: string[];
19
+ deny?: string[];
20
+ }
21
+ /** Shape of an agent entry in `config.agents.list`. */
22
+ interface AgentEntry {
23
+ id: string;
24
+ name?: string;
25
+ skills?: string[];
26
+ identity?: AgentIdentity;
27
+ tools?: AgentToolsPolicy & Record<string, unknown>;
28
+ subagents?: {
29
+ allowAgents?: string[];
30
+ };
31
+ }
32
+ /**
33
+ * Retrieve the full list of configured agents from config.
34
+ *
35
+ * @param cfg - The top-level application config.
36
+ * @returns Array of agent entries, or empty array if none configured.
37
+ */
38
+ export declare function listConfiguredAgents(cfg: ClawdbotConfig): AgentEntry[];
39
+ /**
40
+ * Look up a specific agent's configuration by its ID.
41
+ *
42
+ * @param cfg - The top-level application config.
43
+ * @param agentId - The agent ID to search for.
44
+ * @returns The matching agent entry, or `undefined` if not found.
45
+ */
46
+ export declare function resolveAgentEntry(cfg: ClawdbotConfig, agentId: string): AgentEntry | undefined;
47
+ /**
48
+ * Resolve a human-readable display name for an agent.
49
+ *
50
+ * Priority: `identity.name` > `name` > `undefined`.
51
+ *
52
+ * @param cfg - The top-level application config.
53
+ * @param agentId - The agent ID.
54
+ * @returns The display name, or `undefined` if none configured.
55
+ */
56
+ export declare function getAgentDisplayName(cfg: ClawdbotConfig, agentId: string): string | undefined;
57
+ /**
58
+ * Resolve the per-agent skills filter.
59
+ *
60
+ * @param cfg - The top-level application config.
61
+ * @param agentId - The agent ID.
62
+ * @returns Skill allowlist, or `undefined` if no agent-level filter.
63
+ */
64
+ export declare function getAgentSkillsFilter(cfg: ClawdbotConfig, agentId: string): string[] | undefined;
65
+ /**
66
+ * Resolve the per-agent tools policy (allow/deny lists).
67
+ *
68
+ * @param cfg - The top-level application config.
69
+ * @param agentId - The agent ID.
70
+ * @returns Tools policy object, or `undefined` if none configured.
71
+ */
72
+ export declare function getAgentToolsPolicy(cfg: ClawdbotConfig, agentId: string): AgentToolsPolicy | undefined;
73
+ /**
74
+ * Merge agent-level and group-level skill filters.
75
+ *
76
+ * When both are present, the effective filter is the intersection:
77
+ * a skill must appear in both lists to be included. When only one
78
+ * is present, that list is used as-is.
79
+ *
80
+ * @param agentSkills - Per-agent skill allowlist (from AgentConfig.skills).
81
+ * @param groupSkills - Per-group skill allowlist (from FeishuGroupConfig.skills).
82
+ * @returns Merged skill filter, or `undefined` if neither is set.
83
+ */
84
+ export declare function mergeSkillFilters(agentSkills: string[] | undefined, groupSkills: string[] | undefined): string[] | undefined;
85
+ /**
86
+ * Check whether a tool name is permitted by an agent's tool policy.
87
+ *
88
+ * Evaluation order:
89
+ * 1. If `deny` list exists and tool matches → denied.
90
+ * 2. If `allow` list exists and tool does NOT match → denied.
91
+ * 3. Otherwise → allowed.
92
+ *
93
+ * Supports glob-like patterns with trailing `*` (e.g. `feishu_calendar_*`).
94
+ *
95
+ * @param toolName - The tool name being invoked.
96
+ * @param policy - The agent's tool policy.
97
+ * @returns `true` if the tool is allowed, `false` if denied.
98
+ */
99
+ export declare function isToolAllowedByPolicy(toolName: string, policy: AgentToolsPolicy | undefined): boolean;
100
+ export {};