@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,236 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
4
+ * SPDX-License-Identifier: MIT
5
+ *
6
+ * Context enrichment for inbound Feishu messages.
7
+ *
8
+ * Enrichment phases:
9
+ *
10
+ * - **resolveSenderInfo** (lightweight, before gate) — resolves sender
11
+ * display name and tracks permission errors.
12
+ * - **prefetchUserNames** (after gate, before content resolution) — batch
13
+ * pre-warm the account-scoped user-name cache for the sender and all
14
+ * non-bot mentions so that downstream merge_forward expansion and
15
+ * quoted-message formatting can read names synchronously.
16
+ * - **resolveMedia** (after gate) — downloads binary media attachments
17
+ * using ResourceDescriptors from the converter phase.
18
+ * - **resolveQuotedContent** (after gate) — fetches the replied-to
19
+ * message text for context.
20
+ *
21
+ * Note: merge_forward expansion for the primary message is now handled
22
+ * at parse time in {@link parseMessageEvent}. Quoted merge_forward
23
+ * messages are still expanded here via {@link resolveQuotedContent}.
24
+ */
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.resolveSenderInfo = resolveSenderInfo;
27
+ exports.prefetchUserNames = prefetchUserNames;
28
+ exports.resolveMedia = resolveMedia;
29
+ exports.substituteMediaPaths = substituteMediaPaths;
30
+ exports.resolveQuotedContent = resolveQuotedContent;
31
+ const fetch_1 = require("../outbound/fetch.js");
32
+ const permission_1 = require("./permission.js");
33
+ const user_name_cache_1 = require("./user-name-cache.js");
34
+ const media_resolver_1 = require("./media-resolver.js");
35
+ // ---------------------------------------------------------------------------
36
+ // Phase 1: Sender info (lightweight, before gate)
37
+ // ---------------------------------------------------------------------------
38
+ /**
39
+ * Resolve the sender display name and track permission errors.
40
+ *
41
+ * This must run before the gate check because per-group sender
42
+ * allowlists may match on senderName.
43
+ */
44
+ async function resolveSenderInfo(params) {
45
+ const { account, log } = params;
46
+ let ctx = params.ctx;
47
+ // Bots and users have separate name-resolution endpoints. The contact API
48
+ // does not return bot info, so dispatch on senderIsBot. Both endpoints
49
+ // populate the same account-scoped cache (keyed by openId).
50
+ //
51
+ // Skip resolution for unknown sender_types (e.g. anonymous, missing) — the
52
+ // contact API would 4xx and the bot API would not match. This preserves the
53
+ // pre-bot-support behavior of only resolving names for `sender_type === 'user'`.
54
+ const senderType = ctx.rawSender?.sender_type;
55
+ if (!ctx.senderIsBot && senderType !== 'user') {
56
+ log(`sender_type is "${senderType ?? 'undefined'}", skipping name resolution`);
57
+ return { ctx };
58
+ }
59
+ const senderResult = ctx.senderIsBot
60
+ ? await (0, user_name_cache_1.resolveBotName)({ account, openId: ctx.senderId, log })
61
+ : await (0, user_name_cache_1.resolveUserName)({ account, openId: ctx.senderId, log });
62
+ if (senderResult.name) {
63
+ ctx = { ...ctx, senderName: senderResult.name };
64
+ log(`sender resolved: ${senderResult.name}`);
65
+ }
66
+ else if (senderResult.permissionError) {
67
+ log(`sender resolve failed: permission error code=${senderResult.permissionError.code}`);
68
+ }
69
+ // Track permission errors (with cooldown)
70
+ let permissionError;
71
+ if (senderResult.permissionError) {
72
+ const appKey = account.appId ?? 'default';
73
+ const now = Date.now();
74
+ const lastNotified = permission_1.permissionErrorNotifiedAt.get(appKey) ?? 0;
75
+ if (now - lastNotified > permission_1.PERMISSION_ERROR_COOLDOWN_MS) {
76
+ permission_1.permissionErrorNotifiedAt.set(appKey, now);
77
+ permissionError = senderResult.permissionError;
78
+ }
79
+ }
80
+ return { ctx, permissionError };
81
+ }
82
+ // ---------------------------------------------------------------------------
83
+ // Phase 1.5: Batch pre-warm user name cache (after gate)
84
+ // ---------------------------------------------------------------------------
85
+ /**
86
+ * Batch-prefetch user display names for the sender and all non-bot
87
+ * mentions. Mention names that are already known from the event payload
88
+ * are written into the cache for free.
89
+ */
90
+ async function prefetchUserNames(params) {
91
+ const { ctx, account, log } = params;
92
+ if (!account.configured)
93
+ return;
94
+ const cache = (0, user_name_cache_1.getUserNameCache)(account.accountId);
95
+ // Seed cache with mention names already present in the event payload
96
+ for (const m of ctx.mentions) {
97
+ if (!m.isBot && m.openId && m.name) {
98
+ cache.set(m.openId, m.name);
99
+ }
100
+ }
101
+ // Collect all openIds we care about
102
+ const openIds = new Set();
103
+ if (ctx.senderId)
104
+ openIds.add(ctx.senderId);
105
+ for (const m of ctx.mentions) {
106
+ if (!m.isBot && m.openId)
107
+ openIds.add(m.openId);
108
+ }
109
+ // Batch-resolve any that are still missing
110
+ const toResolve = cache.filterMissing([...openIds]);
111
+ if (toResolve.length > 0) {
112
+ await (0, user_name_cache_1.batchResolveUserNames)({ account, openIds: toResolve, log });
113
+ }
114
+ }
115
+ /**
116
+ * Download and save binary media attachments (images, files, audio,
117
+ * video, stickers) from the inbound message.
118
+ *
119
+ * Uses ResourceDescriptors extracted by content converters during the
120
+ * parse phase — no re-parsing of rawMessage.content needed.
121
+ *
122
+ * Returns a payload object whose keys (`MediaPath`, `MediaType`, …)
123
+ * are spread directly into the agent envelope, plus the raw mediaList
124
+ * for content substitution.
125
+ */
126
+ async function resolveMedia(params) {
127
+ const { ctx, accountScopedCfg, account, log } = params;
128
+ const accountFeishuCfg = account.config;
129
+ const mediaMaxBytes = (accountFeishuCfg?.mediaMaxMb ?? 30) * 1024 * 1024;
130
+ const mediaList = await (0, media_resolver_1.downloadResources)({
131
+ cfg: accountScopedCfg,
132
+ messageId: ctx.messageId,
133
+ resources: ctx.resources,
134
+ maxBytes: mediaMaxBytes,
135
+ log,
136
+ accountId: account.accountId,
137
+ });
138
+ if (mediaList.length > 0) {
139
+ log(`media resolved: ${mediaList.length} attachment(s)`);
140
+ }
141
+ return {
142
+ payload: (0, media_resolver_1.buildFeishuMediaPayload)(mediaList),
143
+ mediaList,
144
+ };
145
+ }
146
+ // ---------------------------------------------------------------------------
147
+ // Media content substitution
148
+ // ---------------------------------------------------------------------------
149
+ /**
150
+ * Replace Feishu file-key references in message content with actual
151
+ * local file paths after download.
152
+ *
153
+ * This is critical for:
154
+ * - **Images / stickers**: The SDK's `detectAndLoadPromptImages` scans
155
+ * the prompt text for local file paths with image extensions.
156
+ * - **Audio / video / files**: Gives the AI meaningful context about
157
+ * what was received (the SDK reads these via `MediaPath` directly,
158
+ * but the text body should still reflect the actual attachments).
159
+ */
160
+ function substituteMediaPaths(content, mediaList) {
161
+ let result = content;
162
+ for (const media of mediaList) {
163
+ const { fileKey, path, resourceType } = media;
164
+ switch (resourceType) {
165
+ case 'image':
166
+ // ![image](img_v3_xxx) → local path (SDK detects image extensions)
167
+ result = result.replace(`![image](${fileKey})`, path);
168
+ break;
169
+ case 'sticker':
170
+ // <sticker key="xxx"/> → local path (treated like image)
171
+ result = result.replace(`<sticker key="${fileKey}"/>`, path);
172
+ break;
173
+ case 'audio': {
174
+ // <audio key="xxx" .../> → [Audio: /path/to/audio.opus ...]
175
+ const audioRe = new RegExp(`<audio key="${escapeRegExp(fileKey)}"[^/]*/>`);
176
+ result = result.replace(audioRe, `[Audio: ${path}]`);
177
+ break;
178
+ }
179
+ case 'file': {
180
+ // <file key="xxx" .../> → [File: /path/to/doc.pdf]
181
+ const fileRe = new RegExp(`<file key="${escapeRegExp(fileKey)}"[^/]*/>`);
182
+ result = result.replace(fileRe, `[File: ${path}]`);
183
+ break;
184
+ }
185
+ case 'video': {
186
+ // <video key="xxx" .../> → [Video: /path/to/video.mp4]
187
+ const videoRe = new RegExp(`<video key="${escapeRegExp(fileKey)}"[^/]*/>`);
188
+ result = result.replace(videoRe, `[Video: ${path}]`);
189
+ break;
190
+ }
191
+ }
192
+ }
193
+ return result;
194
+ }
195
+ function escapeRegExp(s) {
196
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
197
+ }
198
+ // ---------------------------------------------------------------------------
199
+ // Phase 2b: Quoted / replied-to message (text context)
200
+ // ---------------------------------------------------------------------------
201
+ /**
202
+ * Fetch the text content of the message that the user replied to.
203
+ *
204
+ * If the quoted message is itself a merge_forward, its sub-messages are
205
+ * fetched and formatted as a single text block.
206
+ *
207
+ * Returns `"senderName: content"` when the sender name is available so
208
+ * the AI knows who originally wrote the quoted message.
209
+ */
210
+ async function resolveQuotedContent(params) {
211
+ const { ctx, accountScopedCfg, account, log } = params;
212
+ if (!ctx.parentId)
213
+ return undefined;
214
+ try {
215
+ const quotedMsg = await (0, fetch_1.getMessageFeishu)({
216
+ cfg: accountScopedCfg,
217
+ messageId: ctx.parentId,
218
+ accountId: account.accountId,
219
+ expandForward: true,
220
+ });
221
+ if (!quotedMsg)
222
+ return undefined;
223
+ log(`feishu[${account.accountId}]: fetched quoted message: ${quotedMsg.content?.slice(0, 100)}`);
224
+ // Build quoted text with message_id prefix so AI can correlate
225
+ // file_key / image_key with the source message for resource download.
226
+ const prefix = `[message_id=${ctx.parentId}]`;
227
+ if (quotedMsg.senderName) {
228
+ return `${prefix} ${quotedMsg.senderName}: ${quotedMsg.content}`;
229
+ }
230
+ return `${prefix} ${quotedMsg.content}`;
231
+ }
232
+ catch (err) {
233
+ log(`feishu[${account.accountId}]: failed to fetch quoted message: ${String(err)}`);
234
+ return undefined;
235
+ }
236
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Side-effect functions for the inbound message gate.
6
+ *
7
+ * Extracted from gate.ts to separate pure policy decisions from I/O
8
+ * operations (pairing request creation, message sending).
9
+ */
10
+ import type { ClawdbotConfig } from 'openclaw/plugin-sdk';
11
+ /**
12
+ * Create a pairing request and send a pairing reply message to the user.
13
+ *
14
+ * This is the side-effect portion of the DM pairing gate: the pure
15
+ * policy decision (whether to pair) is made in gate.ts, and this
16
+ * function executes the resulting I/O.
17
+ */
18
+ export declare function sendPairingReply(params: {
19
+ senderId: string;
20
+ chatId: string;
21
+ accountId: string;
22
+ accountScopedCfg?: ClawdbotConfig;
23
+ }): Promise<void>;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
4
+ * SPDX-License-Identifier: MIT
5
+ *
6
+ * Side-effect functions for the inbound message gate.
7
+ *
8
+ * Extracted from gate.ts to separate pure policy decisions from I/O
9
+ * operations (pairing request creation, message sending).
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.sendPairingReply = sendPairingReply;
13
+ const lark_client_1 = require("../../core/lark-client.js");
14
+ const send_1 = require("../outbound/send.js");
15
+ // ---------------------------------------------------------------------------
16
+ // Pairing reply
17
+ // ---------------------------------------------------------------------------
18
+ /**
19
+ * Create a pairing request and send a pairing reply message to the user.
20
+ *
21
+ * This is the side-effect portion of the DM pairing gate: the pure
22
+ * policy decision (whether to pair) is made in gate.ts, and this
23
+ * function executes the resulting I/O.
24
+ */
25
+ async function sendPairingReply(params) {
26
+ const { senderId, chatId, accountId, accountScopedCfg } = params;
27
+ const core = lark_client_1.LarkClient.runtime;
28
+ const { code } = await core.channel.pairing.upsertPairingRequest({
29
+ channel: 'feishu',
30
+ id: senderId,
31
+ accountId,
32
+ });
33
+ const pairingReply = core.channel.pairing.buildPairingReply({
34
+ channel: 'feishu',
35
+ idLine: senderId,
36
+ code,
37
+ });
38
+ if (accountScopedCfg) {
39
+ await (0, send_1.sendMessageFeishu)({
40
+ cfg: accountScopedCfg,
41
+ to: chatId,
42
+ text: pairingReply,
43
+ accountId,
44
+ });
45
+ }
46
+ }
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Policy gate for inbound Feishu messages.
6
+ *
7
+ * Determines whether a parsed message should be processed or rejected
8
+ * based on group/DM access policies, sender allowlists, and mention
9
+ * requirements.
10
+ *
11
+ * Group access follows the same two-layer model as Telegram:
12
+ *
13
+ * Layer 1 – Which GROUPS are allowed (SDK `resolveGroupPolicy`):
14
+ * - No `groups` configured + `groupPolicy: "open"` → any group passes
15
+ * - `groupPolicy: "allowlist"` or `groups` configured → acts as allowlist
16
+ * (explicit group IDs or `"*"` wildcard)
17
+ * - `groupPolicy: "disabled"` → all groups blocked
18
+ *
19
+ * Layer 2 – Which SENDERS are allowed within a group:
20
+ * - Per-group `groupPolicy` overrides global for sender filtering
21
+ * - `groupAllowFrom` (global) + per-group `allowFrom` are merged
22
+ * - `"open"` → any sender; `"allowlist"` → check merged list;
23
+ * `"disabled"` → block all senders
24
+ */
25
+ import type { ClawdbotConfig } from 'openclaw/plugin-sdk';
26
+ import type { HistoryEntry } from 'openclaw/plugin-sdk/reply-history';
27
+ import type { MessageContext } from '../types';
28
+ import type { FeishuConfig, FeishuGroupConfig, LarkAccount } from '../../core/types';
29
+ /**
30
+ * Resolve the effective `respondToMentionAll` setting.
31
+ *
32
+ * Precedence: per-group > default ("*") group > global account config > false.
33
+ */
34
+ export declare function resolveRespondToMentionAll(params: {
35
+ groupConfig?: {
36
+ respondToMentionAll?: boolean;
37
+ };
38
+ defaultConfig?: {
39
+ respondToMentionAll?: boolean;
40
+ };
41
+ accountFeishuCfg?: {
42
+ respondToMentionAll?: boolean;
43
+ };
44
+ }): boolean;
45
+ /**
46
+ * Resolve the effective allowBots setting.
47
+ *
48
+ * Precedence: per-group > default ("*") > account > 'mentions'.
49
+ *
50
+ * The `'mentions'` default lets bot-to-bot interaction work out of the box
51
+ * while still requiring an explicit @-mention in groups; DMs treat it as
52
+ * pass-through. Operators can opt into fully-open (`true`) or fully-closed
53
+ * (`false`) explicitly.
54
+ */
55
+ export declare function resolveAllowBots(params: {
56
+ groupConfig?: FeishuGroupConfig;
57
+ defaultConfig?: FeishuGroupConfig;
58
+ accountFeishuCfg?: FeishuConfig;
59
+ }): boolean | 'mentions';
60
+ /**
61
+ * Read the pairing allowFrom store for the Feishu channel via the SDK runtime.
62
+ */
63
+ declare function readAllowFromStore(accountId: string): Promise<string[]>;
64
+ export interface GateResult {
65
+ allowed: boolean;
66
+ reason?: string;
67
+ /** When a group message is rejected due to missing bot mention, the
68
+ * caller should record this entry into the chat history map. */
69
+ historyEntry?: HistoryEntry;
70
+ }
71
+ /**
72
+ * Read the pairing allowFrom store for the Feishu channel.
73
+ *
74
+ * Exported so that handler.ts can provide it as a closure to the SDK's
75
+ * `resolveSenderCommandAuthorization` helper.
76
+ */
77
+ export { readAllowFromStore as readFeishuAllowFromStore };
78
+ /**
79
+ * Check whether an inbound message passes all access-control gates.
80
+ *
81
+ * The DM gate is async because it may read from the pairing store
82
+ * and send pairing request messages.
83
+ */
84
+ export declare function checkMessageGate(params: {
85
+ ctx: MessageContext;
86
+ accountFeishuCfg?: FeishuConfig;
87
+ account: LarkAccount;
88
+ /** account 级别的 ClawdbotConfig(channels.feishu 已替换为 per-account 合并后的配置) */
89
+ accountScopedCfg?: ClawdbotConfig;
90
+ log: (...args: unknown[]) => void;
91
+ }): Promise<GateResult>;