@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,183 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * OAPI 工具专用辅助函数
6
+ *
7
+ * 提供 OAPI 工具特有的功能(如时间转换),并复用通用辅助函数。
8
+ */
9
+ import type { ClawdbotConfig } from 'openclaw/plugin-sdk';
10
+ import type { Client as LarkClient } from '@larksuiteoapi/node-sdk';
11
+ export { formatToolResult, formatToolError, createToolLogger, createClientGetter, createToolContext, getFirstAccount, validateRequiredParams, validateEnum, checkToolRegistration, registerTool, } from '../helpers';
12
+ export type { ToolResult, ClientGetter, ToolContext } from '../helpers';
13
+ export { ToolClient, createToolClient, NeedAuthorizationError, AppScopeMissingError, UserAuthRequiredError, UserScopeInsufficientError, } from '../../core/tool-client';
14
+ export type { ApiFn, InvokeFn, InvokeOptions, InvokeByPathOptions, AuthHint, TryInvokeResult, } from '../../core/tool-client';
15
+ import type { SchemaOptions, TUnsafe } from '@sinclair/typebox';
16
+ import type { ToolResult } from '../helpers';
17
+ /**
18
+ * 从配置直接创建飞书客户端(OAPI 工具常用模式)
19
+ *
20
+ * 这是对 createClientGetter 的简化封装,直接返回客户端实例而非 getter 函数。
21
+ *
22
+ * @param config - OpenClaw 配置对象
23
+ * @returns 飞书 SDK 客户端实例
24
+ * @throws 如果没有启用的账号
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * export function registerMyOapiTool(api: OpenClawPluginApi) {
29
+ * api.registerTool({
30
+ * name: "my_oapi_tool",
31
+ * async execute(_toolCallId, params) {
32
+ * const client = createFeishuClientFromConfig(api.config);
33
+ * const res = await client.calendar.calendarEvent.list({ ... });
34
+ * return json(res.data);
35
+ * }
36
+ * });
37
+ * }
38
+ * ```
39
+ */
40
+ export declare function createFeishuClientFromConfig(config: ClawdbotConfig): LarkClient;
41
+ /**
42
+ * 格式化返回值为 JSON(OAPI 工具常用简化接口)
43
+ *
44
+ * 这是对 formatToolResult 的简化封装,函数名更短便于频繁使用。
45
+ *
46
+ * @param data - 要返回的数据
47
+ * @returns 格式化的工具返回值
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * return json({ task: taskData });
52
+ * return json({ error: "Invalid parameter" });
53
+ * ```
54
+ */
55
+ export declare function json(data: unknown): ToolResult;
56
+ /**
57
+ * 解析时间字符串为 Unix 时间戳(秒)
58
+ *
59
+ * 支持多种格式:
60
+ * 1. ISO 8601 / RFC 3339(带时区):"2024-01-01T00:00:00+08:00"
61
+ * 2. 不带时区的格式(默认为北京时间 UTC+8):
62
+ * - "2026-02-25 14:30"
63
+ * - "2026-02-25 14:30:00"
64
+ * - "2026-02-25T14:30:00"
65
+ *
66
+ * @param input - 时间字符串
67
+ * @returns Unix 时间戳字符串(秒),解析失败返回 null
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * parseTimeToTimestamp("2026-02-25T14:30:00+08:00") // => "1740459000"
72
+ * parseTimeToTimestamp("2026-02-25 14:30") // => "1740459000" (默认北京时间)
73
+ * parseTimeToTimestamp("2026-02-25T14:30:00") // => "1740459000" (默认北京时间)
74
+ * parseTimeToTimestamp("invalid") // => null
75
+ * ```
76
+ */
77
+ export declare function parseTimeToTimestamp(input: string): string | null;
78
+ /**
79
+ * 解析时间字符串为 Unix 时间戳(毫秒)
80
+ *
81
+ * 支持多种格式:
82
+ * 1. ISO 8601 / RFC 3339(带时区):"2024-01-01T00:00:00+08:00"
83
+ * 2. 不带时区的格式(默认为北京时间 UTC+8):
84
+ * - "2026-02-25 14:30"
85
+ * - "2026-02-25 14:30:00"
86
+ * - "2026-02-25T14:30:00"
87
+ *
88
+ * @param input - 时间字符串
89
+ * @returns Unix 时间戳字符串(毫秒),解析失败返回 null
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * parseTimeToTimestampMs("2026-02-25T14:30:00+08:00") // => "1740459000000"
94
+ * parseTimeToTimestampMs("2026-02-25 14:30") // => "1740459000000" (默认北京时间)
95
+ * parseTimeToTimestampMs("2026-02-25T14:30:00") // => "1740459000000" (默认北京时间)
96
+ * parseTimeToTimestampMs("invalid") // => null
97
+ * ```
98
+ */
99
+ export declare function parseTimeToTimestampMs(input: string): string | null;
100
+ /**
101
+ * 解析时间字符串为 RFC 3339 格式(用于 freebusy API)
102
+ *
103
+ * 支持多种格式:
104
+ * 1. ISO 8601 / RFC 3339(带时区):"2024-01-01T00:00:00+08:00" - 直接返回
105
+ * 2. 不带时区的格式(默认为北京时间 UTC+8):
106
+ * - "2026-02-25 14:30" - 转换为 "2026-02-25T14:30:00+08:00"
107
+ * - "2026-02-25 14:30:00" - 转换为 "2026-02-25T14:30:00+08:00"
108
+ * - "2026-02-25T14:30:00" - 转换为 "2026-02-25T14:30:00+08:00"
109
+ *
110
+ * @param input - 时间字符串
111
+ * @returns RFC 3339 格式的时间字符串,解析失败返回 null
112
+ *
113
+ * @example
114
+ * ```typescript
115
+ * parseTimeToRFC3339("2026-02-25T14:30:00+08:00") // => "2026-02-25T14:30:00+08:00"
116
+ * parseTimeToRFC3339("2026-02-25 14:30") // => "2026-02-25T14:30:00+08:00"
117
+ * parseTimeToRFC3339("2026-02-25T14:30:00") // => "2026-02-25T14:30:00+08:00"
118
+ * ```
119
+ */
120
+ export declare function parseTimeToRFC3339(input: string): string | null;
121
+ /**
122
+ * 转换时间范围对象(用于 search 等 API)
123
+ *
124
+ * 将包含 ISO 8601 格式时间字符串的时间范围转换为时间戳。
125
+ *
126
+ * @param timeRange - 时间范围对象,包含可选的 start 和 end 字段
127
+ * @param unit - 时间戳单位,'s' 为秒,'ms' 为毫秒,默认为 's'
128
+ * @returns 转换后的时间范围对象,包含数字类型的时间戳
129
+ * @throws 如果时间格式错误
130
+ *
131
+ * @example
132
+ * ```typescript
133
+ * convertTimeRange({ start: "2026-02-25T14:00:00+08:00", end: "2026-02-25T18:00:00+08:00" })
134
+ * // => { start: 1740459000, end: 1740473400 }
135
+ *
136
+ * convertTimeRange({ start: "2026-02-25T14:00:00+08:00" }, 'ms')
137
+ * // => { start: 1740459000000 }
138
+ * ```
139
+ */
140
+ export declare function convertTimeRange(timeRange: {
141
+ start?: string;
142
+ end?: string;
143
+ } | undefined, unit?: 's' | 'ms'): {
144
+ start?: number;
145
+ end?: number;
146
+ } | undefined;
147
+ export declare const SHANGHAI_UTC_OFFSET_HOURS = 8;
148
+ export declare const SHANGHAI_OFFSET_SUFFIX = "+08:00";
149
+ export declare function pad2(value: number): string;
150
+ /**
151
+ * Convert a Unix timestamp (seconds or milliseconds) to ISO 8601 string
152
+ * in the Asia/Shanghai timezone.
153
+ *
154
+ * Auto-detects seconds vs milliseconds based on magnitude.
155
+ *
156
+ * @returns e.g. `"2026-02-25T14:30:00+08:00"`, or `null` on invalid input
157
+ */
158
+ export declare function unixTimestampToISO8601(raw: string | number | undefined): string | null;
159
+ /**
160
+ * Re-export 飞书 API 错误处理函数
161
+ *
162
+ * 这些函数专门用于处理飞书 Open API 的响应和错误。
163
+ */
164
+ export { assertLarkOk, formatLarkError } from '../../core/api-error';
165
+ /**
166
+ * Check whether an error is a structured invoke-level auth/permission error.
167
+ *
168
+ * Useful in intermediate catch blocks that need to let auth errors bubble up
169
+ * to the outer `handleInvokeErrorWithAutoAuth`.
170
+ *
171
+ * For "allow-to-fail" sub-operations, prefer `client.tryInvoke()` over
172
+ * manual `isInvokeError` + throw.
173
+ */
174
+ export declare function isInvokeError(err: unknown): boolean;
175
+ export { handleInvokeErrorWithAutoAuth } from '../auto-auth';
176
+ /**
177
+ * 创建 LLM 友好的字符串枚举 schema。
178
+ *
179
+ * 与 `Type.Union([Type.Literal('a'), Type.Literal('b')])` 不同,
180
+ * 本函数生成 `{ type: 'string', enum: ['a', 'b'] }` 格式,
181
+ * 兼容性更好。
182
+ */
183
+ export declare function StringEnum<T extends string>(values: T[], options?: SchemaOptions): TUnsafe<T>;
@@ -0,0 +1,385 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
4
+ * SPDX-License-Identifier: MIT
5
+ *
6
+ * OAPI 工具专用辅助函数
7
+ *
8
+ * 提供 OAPI 工具特有的功能(如时间转换),并复用通用辅助函数。
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.handleInvokeErrorWithAutoAuth = exports.formatLarkError = exports.assertLarkOk = exports.SHANGHAI_OFFSET_SUFFIX = exports.SHANGHAI_UTC_OFFSET_HOURS = exports.UserScopeInsufficientError = exports.UserAuthRequiredError = exports.AppScopeMissingError = exports.NeedAuthorizationError = exports.createToolClient = exports.ToolClient = exports.registerTool = exports.checkToolRegistration = exports.validateEnum = exports.validateRequiredParams = exports.getFirstAccount = exports.createToolContext = exports.createClientGetter = exports.createToolLogger = exports.formatToolError = exports.formatToolResult = void 0;
12
+ exports.createFeishuClientFromConfig = createFeishuClientFromConfig;
13
+ exports.json = json;
14
+ exports.parseTimeToTimestamp = parseTimeToTimestamp;
15
+ exports.parseTimeToTimestampMs = parseTimeToTimestampMs;
16
+ exports.parseTimeToRFC3339 = parseTimeToRFC3339;
17
+ exports.convertTimeRange = convertTimeRange;
18
+ exports.pad2 = pad2;
19
+ exports.unixTimestampToISO8601 = unixTimestampToISO8601;
20
+ exports.isInvokeError = isInvokeError;
21
+ exports.StringEnum = StringEnum;
22
+ // ---------------------------------------------------------------------------
23
+ // 通用功能(从 tools/helpers.ts 导入)
24
+ // ---------------------------------------------------------------------------
25
+ var helpers_1 = require("../helpers.js");
26
+ Object.defineProperty(exports, "formatToolResult", { enumerable: true, get: function () { return helpers_1.formatToolResult; } });
27
+ Object.defineProperty(exports, "formatToolError", { enumerable: true, get: function () { return helpers_1.formatToolError; } });
28
+ Object.defineProperty(exports, "createToolLogger", { enumerable: true, get: function () { return helpers_1.createToolLogger; } });
29
+ Object.defineProperty(exports, "createClientGetter", { enumerable: true, get: function () { return helpers_1.createClientGetter; } });
30
+ Object.defineProperty(exports, "createToolContext", { enumerable: true, get: function () { return helpers_1.createToolContext; } });
31
+ Object.defineProperty(exports, "getFirstAccount", { enumerable: true, get: function () { return helpers_1.getFirstAccount; } });
32
+ Object.defineProperty(exports, "validateRequiredParams", { enumerable: true, get: function () { return helpers_1.validateRequiredParams; } });
33
+ Object.defineProperty(exports, "validateEnum", { enumerable: true, get: function () { return helpers_1.validateEnum; } });
34
+ Object.defineProperty(exports, "checkToolRegistration", { enumerable: true, get: function () { return helpers_1.checkToolRegistration; } });
35
+ Object.defineProperty(exports, "registerTool", { enumerable: true, get: function () { return helpers_1.registerTool; } });
36
+ // ---------------------------------------------------------------------------
37
+ // ToolClient(工具层统一客户端)
38
+ // ---------------------------------------------------------------------------
39
+ var tool_client_1 = require("../../core/tool-client.js");
40
+ Object.defineProperty(exports, "ToolClient", { enumerable: true, get: function () { return tool_client_1.ToolClient; } });
41
+ Object.defineProperty(exports, "createToolClient", { enumerable: true, get: function () { return tool_client_1.createToolClient; } });
42
+ Object.defineProperty(exports, "NeedAuthorizationError", { enumerable: true, get: function () { return tool_client_1.NeedAuthorizationError; } });
43
+ Object.defineProperty(exports, "AppScopeMissingError", { enumerable: true, get: function () { return tool_client_1.AppScopeMissingError; } });
44
+ Object.defineProperty(exports, "UserAuthRequiredError", { enumerable: true, get: function () { return tool_client_1.UserAuthRequiredError; } });
45
+ Object.defineProperty(exports, "UserScopeInsufficientError", { enumerable: true, get: function () { return tool_client_1.UserScopeInsufficientError; } });
46
+ // ---------------------------------------------------------------------------
47
+ // OAPI 专用:客户端便捷创建
48
+ // ---------------------------------------------------------------------------
49
+ const typebox_1 = require("@sinclair/typebox");
50
+ const helpers_2 = require("../helpers.js");
51
+ /**
52
+ * 从配置直接创建飞书客户端(OAPI 工具常用模式)
53
+ *
54
+ * 这是对 createClientGetter 的简化封装,直接返回客户端实例而非 getter 函数。
55
+ *
56
+ * @param config - OpenClaw 配置对象
57
+ * @returns 飞书 SDK 客户端实例
58
+ * @throws 如果没有启用的账号
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * export function registerMyOapiTool(api: OpenClawPluginApi) {
63
+ * api.registerTool({
64
+ * name: "my_oapi_tool",
65
+ * async execute(_toolCallId, params) {
66
+ * const client = createFeishuClientFromConfig(api.config);
67
+ * const res = await client.calendar.calendarEvent.list({ ... });
68
+ * return json(res.data);
69
+ * }
70
+ * });
71
+ * }
72
+ * ```
73
+ */
74
+ function createFeishuClientFromConfig(config) {
75
+ const getClient = (0, helpers_2.createClientGetter)(config);
76
+ return getClient();
77
+ }
78
+ // ---------------------------------------------------------------------------
79
+ // OAPI 专用:返回值格式化(简化版)
80
+ // ---------------------------------------------------------------------------
81
+ /**
82
+ * 格式化返回值为 JSON(OAPI 工具常用简化接口)
83
+ *
84
+ * 这是对 formatToolResult 的简化封装,函数名更短便于频繁使用。
85
+ *
86
+ * @param data - 要返回的数据
87
+ * @returns 格式化的工具返回值
88
+ *
89
+ * @example
90
+ * ```typescript
91
+ * return json({ task: taskData });
92
+ * return json({ error: "Invalid parameter" });
93
+ * ```
94
+ */
95
+ function json(data) {
96
+ return (0, helpers_2.formatToolResult)(data);
97
+ }
98
+ // ---------------------------------------------------------------------------
99
+ // OAPI 专用:时间转换工具
100
+ // ---------------------------------------------------------------------------
101
+ /**
102
+ * 解析时间字符串为 Unix 时间戳(秒)
103
+ *
104
+ * 支持多种格式:
105
+ * 1. ISO 8601 / RFC 3339(带时区):"2024-01-01T00:00:00+08:00"
106
+ * 2. 不带时区的格式(默认为北京时间 UTC+8):
107
+ * - "2026-02-25 14:30"
108
+ * - "2026-02-25 14:30:00"
109
+ * - "2026-02-25T14:30:00"
110
+ *
111
+ * @param input - 时间字符串
112
+ * @returns Unix 时间戳字符串(秒),解析失败返回 null
113
+ *
114
+ * @example
115
+ * ```typescript
116
+ * parseTimeToTimestamp("2026-02-25T14:30:00+08:00") // => "1740459000"
117
+ * parseTimeToTimestamp("2026-02-25 14:30") // => "1740459000" (默认北京时间)
118
+ * parseTimeToTimestamp("2026-02-25T14:30:00") // => "1740459000" (默认北京时间)
119
+ * parseTimeToTimestamp("invalid") // => null
120
+ * ```
121
+ */
122
+ function parseTimeToTimestamp(input) {
123
+ try {
124
+ const trimmed = input.trim();
125
+ // 检查是否包含时区信息(Z 或 +/- 偏移)
126
+ const hasTimezone = /[Zz]$|[+-]\d{2}:\d{2}$/.test(trimmed);
127
+ if (hasTimezone) {
128
+ // 有时区信息,直接解析
129
+ const date = new Date(trimmed);
130
+ if (isNaN(date.getTime()))
131
+ return null;
132
+ return Math.floor(date.getTime() / 1000).toString();
133
+ }
134
+ // 没有时区信息,当作北京时间处理
135
+ // 支持格式:YYYY-MM-DD HH:mm 或 YYYY-MM-DD HH:mm:ss 或 YYYY-MM-DDTHH:mm:ss
136
+ const normalized = trimmed.replace('T', ' ');
137
+ const match = normalized.match(/^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2})(?::(\d{2}))?$/);
138
+ if (!match) {
139
+ // 尝试直接解析(可能是其他 ISO 8601 格式)
140
+ const date = new Date(trimmed);
141
+ if (isNaN(date.getTime()))
142
+ return null;
143
+ return Math.floor(date.getTime() / 1000).toString();
144
+ }
145
+ const [, year, month, day, hour, minute, second] = match;
146
+ // 当作北京时间(UTC+8),转换为 UTC
147
+ const utcDate = new Date(Date.UTC(parseInt(year), parseInt(month) - 1, parseInt(day), parseInt(hour) - 8, // 北京时间减去 8 小时得到 UTC
148
+ parseInt(minute), parseInt(second ?? '0')));
149
+ return Math.floor(utcDate.getTime() / 1000).toString();
150
+ }
151
+ catch {
152
+ return null;
153
+ }
154
+ }
155
+ /**
156
+ * 解析时间字符串为 Unix 时间戳(毫秒)
157
+ *
158
+ * 支持多种格式:
159
+ * 1. ISO 8601 / RFC 3339(带时区):"2024-01-01T00:00:00+08:00"
160
+ * 2. 不带时区的格式(默认为北京时间 UTC+8):
161
+ * - "2026-02-25 14:30"
162
+ * - "2026-02-25 14:30:00"
163
+ * - "2026-02-25T14:30:00"
164
+ *
165
+ * @param input - 时间字符串
166
+ * @returns Unix 时间戳字符串(毫秒),解析失败返回 null
167
+ *
168
+ * @example
169
+ * ```typescript
170
+ * parseTimeToTimestampMs("2026-02-25T14:30:00+08:00") // => "1740459000000"
171
+ * parseTimeToTimestampMs("2026-02-25 14:30") // => "1740459000000" (默认北京时间)
172
+ * parseTimeToTimestampMs("2026-02-25T14:30:00") // => "1740459000000" (默认北京时间)
173
+ * parseTimeToTimestampMs("invalid") // => null
174
+ * ```
175
+ */
176
+ function parseTimeToTimestampMs(input) {
177
+ try {
178
+ const trimmed = input.trim();
179
+ // 检查是否包含时区信息(Z 或 +/- 偏移)
180
+ const hasTimezone = /[Zz]$|[+-]\d{2}:\d{2}$/.test(trimmed);
181
+ if (hasTimezone) {
182
+ // 有时区信息,直接解析
183
+ const date = new Date(trimmed);
184
+ if (isNaN(date.getTime()))
185
+ return null;
186
+ return date.getTime().toString();
187
+ }
188
+ // 没有时区信息,当作北京时间处理
189
+ // 支持格式:YYYY-MM-DD HH:mm 或 YYYY-MM-DD HH:mm:ss 或 YYYY-MM-DDTHH:mm:ss
190
+ const normalized = trimmed.replace('T', ' ');
191
+ const match = normalized.match(/^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2})(?::(\d{2}))?$/);
192
+ if (!match) {
193
+ // 尝试直接解析(可能是其他 ISO 8601 格式)
194
+ const date = new Date(trimmed);
195
+ if (isNaN(date.getTime()))
196
+ return null;
197
+ return date.getTime().toString();
198
+ }
199
+ const [, year, month, day, hour, minute, second] = match;
200
+ // 当作北京时间(UTC+8),转换为 UTC
201
+ const utcDate = new Date(Date.UTC(parseInt(year), parseInt(month) - 1, parseInt(day), parseInt(hour) - 8, // 北京时间减去 8 小时得到 UTC
202
+ parseInt(minute), parseInt(second ?? '0')));
203
+ return utcDate.getTime().toString();
204
+ }
205
+ catch {
206
+ return null;
207
+ }
208
+ }
209
+ /**
210
+ * 解析时间字符串为 RFC 3339 格式(用于 freebusy API)
211
+ *
212
+ * 支持多种格式:
213
+ * 1. ISO 8601 / RFC 3339(带时区):"2024-01-01T00:00:00+08:00" - 直接返回
214
+ * 2. 不带时区的格式(默认为北京时间 UTC+8):
215
+ * - "2026-02-25 14:30" - 转换为 "2026-02-25T14:30:00+08:00"
216
+ * - "2026-02-25 14:30:00" - 转换为 "2026-02-25T14:30:00+08:00"
217
+ * - "2026-02-25T14:30:00" - 转换为 "2026-02-25T14:30:00+08:00"
218
+ *
219
+ * @param input - 时间字符串
220
+ * @returns RFC 3339 格式的时间字符串,解析失败返回 null
221
+ *
222
+ * @example
223
+ * ```typescript
224
+ * parseTimeToRFC3339("2026-02-25T14:30:00+08:00") // => "2026-02-25T14:30:00+08:00"
225
+ * parseTimeToRFC3339("2026-02-25 14:30") // => "2026-02-25T14:30:00+08:00"
226
+ * parseTimeToRFC3339("2026-02-25T14:30:00") // => "2026-02-25T14:30:00+08:00"
227
+ * ```
228
+ */
229
+ function parseTimeToRFC3339(input) {
230
+ try {
231
+ const trimmed = input.trim();
232
+ // 检查是否包含时区信息(Z 或 +/- 偏移)
233
+ const hasTimezone = /[Zz]$|[+-]\d{2}:\d{2}$/.test(trimmed);
234
+ if (hasTimezone) {
235
+ // 有时区信息,验证后直接返回
236
+ const date = new Date(trimmed);
237
+ if (isNaN(date.getTime()))
238
+ return null;
239
+ return trimmed;
240
+ }
241
+ // 没有时区信息,当作北京时间处理,转换为 RFC 3339 格式
242
+ // 支持格式:YYYY-MM-DD HH:mm 或 YYYY-MM-DD HH:mm:ss 或 YYYY-MM-DDTHH:mm:ss
243
+ const normalized = trimmed.replace('T', ' ');
244
+ const match = normalized.match(/^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2})(?::(\d{2}))?$/);
245
+ if (!match) {
246
+ // 尝试直接解析(可能是其他 ISO 8601 格式)
247
+ const date = new Date(trimmed);
248
+ if (isNaN(date.getTime()))
249
+ return null;
250
+ // 如果能解析但没有时区,添加 +08:00
251
+ return trimmed.includes('T') ? `${trimmed}+08:00` : trimmed;
252
+ }
253
+ const [, year, month, day, hour, minute, second] = match;
254
+ const sec = second ?? '00';
255
+ // 直接构造 RFC 3339 格式(北京时间 UTC+8)
256
+ return `${year}-${month}-${day}T${hour}:${minute}:${sec}+08:00`;
257
+ }
258
+ catch {
259
+ return null;
260
+ }
261
+ }
262
+ /**
263
+ * 转换时间范围对象(用于 search 等 API)
264
+ *
265
+ * 将包含 ISO 8601 格式时间字符串的时间范围转换为时间戳。
266
+ *
267
+ * @param timeRange - 时间范围对象,包含可选的 start 和 end 字段
268
+ * @param unit - 时间戳单位,'s' 为秒,'ms' 为毫秒,默认为 's'
269
+ * @returns 转换后的时间范围对象,包含数字类型的时间戳
270
+ * @throws 如果时间格式错误
271
+ *
272
+ * @example
273
+ * ```typescript
274
+ * convertTimeRange({ start: "2026-02-25T14:00:00+08:00", end: "2026-02-25T18:00:00+08:00" })
275
+ * // => { start: 1740459000, end: 1740473400 }
276
+ *
277
+ * convertTimeRange({ start: "2026-02-25T14:00:00+08:00" }, 'ms')
278
+ * // => { start: 1740459000000 }
279
+ * ```
280
+ */
281
+ function convertTimeRange(timeRange, unit = 's') {
282
+ if (!timeRange)
283
+ return undefined;
284
+ const result = {};
285
+ const parseFn = unit === 'ms' ? parseTimeToTimestampMs : parseTimeToTimestamp;
286
+ if (timeRange.start) {
287
+ const ts = parseFn(timeRange.start);
288
+ if (!ts) {
289
+ throw new Error(`Invalid time format for start. Must use ISO 8601 / RFC 3339 with timezone, e.g. "2024-01-01T00:00:00+08:00". Received: ${timeRange.start}`);
290
+ }
291
+ result.start = parseInt(ts, 10);
292
+ }
293
+ if (timeRange.end) {
294
+ const ts = parseFn(timeRange.end);
295
+ if (!ts) {
296
+ throw new Error(`Invalid time format for end. Must use ISO 8601 / RFC 3339 with timezone, e.g. "2024-01-01T00:00:00+08:00". Received: ${timeRange.end}`);
297
+ }
298
+ result.end = parseInt(ts, 10);
299
+ }
300
+ return Object.keys(result).length > 0 ? result : undefined;
301
+ }
302
+ // ---------------------------------------------------------------------------
303
+ // OAPI 专用:Unix 时间戳 → ISO 8601 (上海时区)
304
+ // ---------------------------------------------------------------------------
305
+ exports.SHANGHAI_UTC_OFFSET_HOURS = 8;
306
+ exports.SHANGHAI_OFFSET_SUFFIX = '+08:00';
307
+ function pad2(value) {
308
+ return String(value).padStart(2, '0');
309
+ }
310
+ /**
311
+ * Convert a Unix timestamp (seconds or milliseconds) to ISO 8601 string
312
+ * in the Asia/Shanghai timezone.
313
+ *
314
+ * Auto-detects seconds vs milliseconds based on magnitude.
315
+ *
316
+ * @returns e.g. `"2026-02-25T14:30:00+08:00"`, or `null` on invalid input
317
+ */
318
+ function unixTimestampToISO8601(raw) {
319
+ if (raw === undefined || raw == null)
320
+ return null;
321
+ const text = typeof raw === 'number' ? String(raw) : String(raw).trim();
322
+ if (!/^-?\d+$/.test(text))
323
+ return null;
324
+ const num = Number(text);
325
+ if (!Number.isFinite(num))
326
+ return null;
327
+ const utcMs = Math.abs(num) >= 1e12 ? num : num * 1000;
328
+ const beijingDate = new Date(utcMs + exports.SHANGHAI_UTC_OFFSET_HOURS * 60 * 60 * 1000);
329
+ if (Number.isNaN(beijingDate.getTime()))
330
+ return null;
331
+ const year = beijingDate.getUTCFullYear();
332
+ const month = pad2(beijingDate.getUTCMonth() + 1);
333
+ const day = pad2(beijingDate.getUTCDate());
334
+ const hour = pad2(beijingDate.getUTCHours());
335
+ const minute = pad2(beijingDate.getUTCMinutes());
336
+ const second = pad2(beijingDate.getUTCSeconds());
337
+ return `${year}-${month}-${day}T${hour}:${minute}:${second}${exports.SHANGHAI_OFFSET_SUFFIX}`;
338
+ }
339
+ // ---------------------------------------------------------------------------
340
+ // OAPI 专用:飞书 API 错误处理
341
+ // ---------------------------------------------------------------------------
342
+ /**
343
+ * Re-export 飞书 API 错误处理函数
344
+ *
345
+ * 这些函数专门用于处理飞书 Open API 的响应和错误。
346
+ */
347
+ var api_error_1 = require("../../core/api-error.js");
348
+ Object.defineProperty(exports, "assertLarkOk", { enumerable: true, get: function () { return api_error_1.assertLarkOk; } });
349
+ Object.defineProperty(exports, "formatLarkError", { enumerable: true, get: function () { return api_error_1.formatLarkError; } });
350
+ // ---------------------------------------------------------------------------
351
+ // OAPI 专用:invoke() 错误判断
352
+ // ---------------------------------------------------------------------------
353
+ const tool_client_2 = require("../../core/tool-client.js");
354
+ /**
355
+ * Check whether an error is a structured invoke-level auth/permission error.
356
+ *
357
+ * Useful in intermediate catch blocks that need to let auth errors bubble up
358
+ * to the outer `handleInvokeErrorWithAutoAuth`.
359
+ *
360
+ * For "allow-to-fail" sub-operations, prefer `client.tryInvoke()` over
361
+ * manual `isInvokeError` + throw.
362
+ */
363
+ function isInvokeError(err) {
364
+ return (err instanceof tool_client_2.UserAuthRequiredError ||
365
+ err instanceof tool_client_2.AppScopeMissingError ||
366
+ err instanceof tool_client_2.UserScopeInsufficientError);
367
+ }
368
+ // ---------------------------------------------------------------------------
369
+ // 自动授权:handleInvokeErrorWithAutoAuth
370
+ // ---------------------------------------------------------------------------
371
+ var auto_auth_1 = require("../auto-auth.js");
372
+ Object.defineProperty(exports, "handleInvokeErrorWithAutoAuth", { enumerable: true, get: function () { return auto_auth_1.handleInvokeErrorWithAutoAuth; } });
373
+ // ---------------------------------------------------------------------------
374
+ // Schema 辅助:LLM 友好的字符串枚举
375
+ // ---------------------------------------------------------------------------
376
+ /**
377
+ * 创建 LLM 友好的字符串枚举 schema。
378
+ *
379
+ * 与 `Type.Union([Type.Literal('a'), Type.Literal('b')])` 不同,
380
+ * 本函数生成 `{ type: 'string', enum: ['a', 'b'] }` 格式,
381
+ * 兼容性更好。
382
+ */
383
+ function StringEnum(values, options) {
384
+ return typebox_1.Type.Unsafe({ type: 'string', enum: values, ...options });
385
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * 消息格式化公共函数
6
+ *
7
+ * 将飞书 IM API 返回的原始消息对象转换为 AI 可读的 JSON 格式。
8
+ * 由 feishu_im_user_get_messages 和 feishu_im_user_get_thread_messages 共享。
9
+ *
10
+ * 所有 API 调用均通过 UAT(用户身份)进行。
11
+ */
12
+ import type { LarkAccount } from '../../../core/types';
13
+ import type { ToolClient } from '../../../core/tool-client';
14
+ import type { ApiMessageItem, ConvertContext } from '../../../messaging/converters/types';
15
+ export interface FormattedMessage {
16
+ message_id: string;
17
+ msg_type: string;
18
+ content: string;
19
+ sender: {
20
+ id: string;
21
+ sender_type: string;
22
+ name?: string;
23
+ };
24
+ create_time: string;
25
+ /** 回复的消息 ID(parent_id)。有 thread_id 时省略,因为话题上下文可推断 */
26
+ reply_to?: string;
27
+ thread_id?: string;
28
+ mentions?: Array<{
29
+ key: string;
30
+ id: string;
31
+ name: string;
32
+ }>;
33
+ deleted: boolean;
34
+ updated: boolean;
35
+ }
36
+ /**
37
+ * 格式化单条消息对象。
38
+ *
39
+ * 使用 convertMessageContent 将 body.content 转为 AI 可读文本,
40
+ * 并过滤掉 AI 不需要的字段(upper_message_id、tenant_key 等)。
41
+ */
42
+ export declare function formatMessageItem(item: ApiMessageItem, accountId: string, nameResolver: (openId: string) => string | undefined, ctxOverrides?: Partial<ConvertContext>): Promise<FormattedMessage>;
43
+ /**
44
+ * 批量格式化消息列表(UAT 路径)。
45
+ *
46
+ * 先批量解析所有 sender 的名字(写入 UAT 缓存),再逐条格式化。
47
+ * 这样 formatMessageItem 中的 sender.name 和 converter 的
48
+ * resolveUserName 都能从 UAT 缓存中读到名字。
49
+ */
50
+ export declare function formatMessageList(items: ApiMessageItem[], account: LarkAccount, log: (...args: unknown[]) => void, client: ToolClient): Promise<FormattedMessage[]>;