@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,160 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
4
+ * SPDX-License-Identifier: MIT
5
+ *
6
+ * Structured logger factory for the Feishu plugin.
7
+ *
8
+ * Wraps `PluginRuntime.logging.getChildLogger()` with automatic
9
+ * LarkTicket injection from AsyncLocalStorage and a console fallback
10
+ * when the runtime is not yet initialised.
11
+ *
12
+ * Usage:
13
+ * const log = larkLogger("card/streaming");
14
+ * log.info("created entity", { cardId, sequence });
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.larkLogger = larkLogger;
18
+ const lark_ticket_1 = require("./lark-ticket.js");
19
+ const runtime_store_1 = require("./runtime-store.js");
20
+ // ---------------------------------------------------------------------------
21
+ // Console fallback (with ANSI colors)
22
+ // ---------------------------------------------------------------------------
23
+ // ANSI escape codes for colored console output
24
+ const CYAN = '\x1b[36m';
25
+ const YELLOW = '\x1b[33m';
26
+ const RED = '\x1b[31m';
27
+ const GRAY = '\x1b[90m';
28
+ const RESET = '\x1b[0m';
29
+ function consoleFallback(subsystem) {
30
+ const tag = `feishu/${subsystem}`;
31
+ /* eslint-disable no-console -- logger底层实现,console 是最终输出目标 */
32
+ return {
33
+ debug: (msg, meta) => console.debug(`${GRAY}[${tag}]${RESET}`, msg, ...(meta ? [meta] : [])),
34
+ info: (msg, meta) => console.log(`${CYAN}[${tag}]${RESET}`, msg, ...(meta ? [meta] : [])),
35
+ warn: (msg, meta) => console.warn(`${YELLOW}[${tag}]${RESET}`, msg, ...(meta ? [meta] : [])),
36
+ error: (msg, meta) => console.error(`${RED}[${tag}]${RESET}`, msg, ...(meta ? [meta] : [])),
37
+ };
38
+ /* eslint-enable no-console */
39
+ }
40
+ // ---------------------------------------------------------------------------
41
+ // Lazy runtime resolution
42
+ // ---------------------------------------------------------------------------
43
+ function resolveRuntimeLogger(subsystem) {
44
+ try {
45
+ const runtime = (0, runtime_store_1.tryGetLarkRuntime)();
46
+ if (!runtime)
47
+ return null;
48
+ return runtime.logging.getChildLogger({
49
+ subsystem: `feishu/${subsystem}`,
50
+ });
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ // ---------------------------------------------------------------------------
57
+ // LarkTicket enrichment
58
+ // ---------------------------------------------------------------------------
59
+ function getTraceMeta() {
60
+ const ctx = (0, lark_ticket_1.getTicket)();
61
+ if (!ctx)
62
+ return null;
63
+ const trace = {
64
+ accountId: ctx.accountId,
65
+ messageId: ctx.messageId,
66
+ chatId: ctx.chatId,
67
+ };
68
+ if (ctx.senderOpenId)
69
+ trace.senderOpenId = ctx.senderOpenId;
70
+ return trace;
71
+ }
72
+ function enrichMeta(meta) {
73
+ const trace = getTraceMeta();
74
+ if (!trace)
75
+ return meta ?? {};
76
+ return meta ? { ...trace, ...meta } : trace;
77
+ }
78
+ // ---------------------------------------------------------------------------
79
+ // Message formatting
80
+ // ---------------------------------------------------------------------------
81
+ /**
82
+ * Build a trace-aware prefix like `feishu[default][msg:om_xxx]:`.
83
+ *
84
+ * Mirrors the format used by `trace.ts` so log lines are consistent
85
+ * across the old and new logging systems.
86
+ */
87
+ function buildTracePrefix() {
88
+ const ctx = (0, lark_ticket_1.getTicket)();
89
+ if (!ctx)
90
+ return 'feishu:';
91
+ return `feishu[${ctx.accountId}][msg:${ctx.messageId}]:`;
92
+ }
93
+ /**
94
+ * Format message with inline meta for text-based log output.
95
+ *
96
+ * RuntimeLogger implementations typically ignore the `meta` parameter in
97
+ * their text output (gateway.log / console). To ensure meta is always
98
+ * visible, we serialize user-supplied meta into the message string and
99
+ * prepend the trace context prefix (accountId + messageId).
100
+ *
101
+ * Example:
102
+ * formatMessage("card.create response", { code: 0, cardId: "c_xxx" })
103
+ * → "feishu[default][msg:om_xxx]: card.create response (code=0, cardId=c_xxx)"
104
+ */
105
+ function formatMessage(message, meta) {
106
+ const prefix = buildTracePrefix();
107
+ if (!meta || Object.keys(meta).length === 0)
108
+ return `${prefix} ${message}`;
109
+ const parts = Object.entries(meta)
110
+ .map(([k, v]) => {
111
+ if (v === undefined || v == null)
112
+ return null;
113
+ if (typeof v === 'object')
114
+ return `${k}=${JSON.stringify(v)}`;
115
+ return `${k}=${v}`;
116
+ })
117
+ .filter(Boolean);
118
+ return parts.length > 0 ? `${prefix} ${message} (${parts.join(', ')})` : `${prefix} ${message}`;
119
+ }
120
+ // ---------------------------------------------------------------------------
121
+ // LarkLogger implementation
122
+ // ---------------------------------------------------------------------------
123
+ function createLarkLogger(subsystem) {
124
+ // RuntimeLogger is resolved lazily on first log call so that module-level
125
+ // `larkLogger()` calls work even before `LarkClient.setRuntime()`.
126
+ let cachedLogger = null;
127
+ let resolved = false;
128
+ function getLogger() {
129
+ if (!resolved) {
130
+ cachedLogger = resolveRuntimeLogger(subsystem);
131
+ if (cachedLogger)
132
+ resolved = true;
133
+ }
134
+ return cachedLogger ?? consoleFallback(subsystem);
135
+ }
136
+ return {
137
+ subsystem,
138
+ debug(message, meta) {
139
+ getLogger().debug?.(formatMessage(message, meta), enrichMeta(meta));
140
+ },
141
+ info(message, meta) {
142
+ getLogger().info(formatMessage(message, meta), enrichMeta(meta));
143
+ },
144
+ warn(message, meta) {
145
+ getLogger().warn(formatMessage(message, meta), enrichMeta(meta));
146
+ },
147
+ error(message, meta) {
148
+ getLogger().error(formatMessage(message, meta), enrichMeta(meta));
149
+ },
150
+ child(name) {
151
+ return createLarkLogger(`${subsystem}/${name}`);
152
+ },
153
+ };
154
+ }
155
+ // ---------------------------------------------------------------------------
156
+ // Public factory
157
+ // ---------------------------------------------------------------------------
158
+ function larkLogger(subsystem) {
159
+ return createLarkLogger(subsystem);
160
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Request-level ticket for the Feishu plugin.
6
+ *
7
+ * Uses Node.js AsyncLocalStorage to propagate a ticket (message_id,
8
+ * chat_id, account_id) through the entire async call chain without passing
9
+ * parameters explicitly. Call {@link withTicket} at the event entry point
10
+ * (monitor.ts) and use {@link getTicket} anywhere downstream.
11
+ */
12
+ export interface LarkTicket {
13
+ messageId: string;
14
+ chatId: string;
15
+ accountId: string;
16
+ startTime: number;
17
+ senderOpenId?: string;
18
+ chatType?: 'p2p' | 'group';
19
+ threadId?: string;
20
+ }
21
+ /**
22
+ * Run `fn` within a ticket context. All async operations spawned inside
23
+ * `fn` will inherit the context and can access it via {@link getTicket}.
24
+ */
25
+ export declare function withTicket<T>(ticket: LarkTicket, fn: () => T | Promise<T>): T | Promise<T>;
26
+ /** Return the current ticket, or `undefined` if not inside withTicket. */
27
+ export declare function getTicket(): LarkTicket | undefined;
28
+ /** Milliseconds elapsed since the current ticket was created, or 0. */
29
+ export declare function ticketElapsed(): number;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
4
+ * SPDX-License-Identifier: MIT
5
+ *
6
+ * Request-level ticket for the Feishu plugin.
7
+ *
8
+ * Uses Node.js AsyncLocalStorage to propagate a ticket (message_id,
9
+ * chat_id, account_id) through the entire async call chain without passing
10
+ * parameters explicitly. Call {@link withTicket} at the event entry point
11
+ * (monitor.ts) and use {@link getTicket} anywhere downstream.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.withTicket = withTicket;
15
+ exports.getTicket = getTicket;
16
+ exports.ticketElapsed = ticketElapsed;
17
+ const node_async_hooks_1 = require("node:async_hooks");
18
+ // ---------------------------------------------------------------------------
19
+ // Storage
20
+ // ---------------------------------------------------------------------------
21
+ const store = new node_async_hooks_1.AsyncLocalStorage();
22
+ // ---------------------------------------------------------------------------
23
+ // Public API
24
+ // ---------------------------------------------------------------------------
25
+ /**
26
+ * Run `fn` within a ticket context. All async operations spawned inside
27
+ * `fn` will inherit the context and can access it via {@link getTicket}.
28
+ */
29
+ function withTicket(ticket, fn) {
30
+ return store.run(ticket, fn);
31
+ }
32
+ /** Return the current ticket, or `undefined` if not inside withTicket. */
33
+ function getTicket() {
34
+ return store.getStore();
35
+ }
36
+ /** Milliseconds elapsed since the current ticket was created, or 0. */
37
+ function ticketElapsed() {
38
+ const t = store.getStore();
39
+ return t ? Date.now() - t.startTime : 0;
40
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * 消息不可用(已撤回/已删除)状态管理。
6
+ *
7
+ * 目标:
8
+ * 1) 当命中飞书终止错误码(230011/231003)时,按 message_id 标记不可用;
9
+ * 2) 后续针对该 message_id 的 API 调用直接短路,避免持续报错刷屏。
10
+ */
11
+ import type { LARK_ERROR } from './auth-errors';
12
+ export type TerminalMessageApiCode = typeof LARK_ERROR.MESSAGE_RECALLED | typeof LARK_ERROR.MESSAGE_DELETED;
13
+ export interface MessageUnavailableState {
14
+ apiCode: TerminalMessageApiCode;
15
+ markedAtMs: number;
16
+ operation?: string;
17
+ }
18
+ export declare function isTerminalMessageApiCode(code: unknown): code is TerminalMessageApiCode;
19
+ export declare function markMessageUnavailable(params: {
20
+ messageId: string;
21
+ apiCode: TerminalMessageApiCode;
22
+ operation?: string;
23
+ }): void;
24
+ export declare function getMessageUnavailableState(messageId: string | undefined): MessageUnavailableState | undefined;
25
+ export declare function isMessageUnavailable(messageId: string | undefined): boolean;
26
+ export declare function markMessageUnavailableFromError(params: {
27
+ messageId: string | undefined;
28
+ error: unknown;
29
+ operation?: string;
30
+ }): TerminalMessageApiCode | undefined;
31
+ export declare class MessageUnavailableError extends Error {
32
+ readonly messageId: string;
33
+ readonly apiCode: TerminalMessageApiCode;
34
+ readonly operation?: string;
35
+ constructor(params: {
36
+ messageId: string;
37
+ apiCode: TerminalMessageApiCode;
38
+ operation?: string;
39
+ });
40
+ }
41
+ export declare function isMessageUnavailableError(error: unknown): error is MessageUnavailableError;
42
+ export declare function assertMessageAvailable(messageId: string | undefined, operation?: string): void;
43
+ /**
44
+ * 针对 message_id 的统一保护:
45
+ * - 调用前检查是否已标记不可用;
46
+ * - 调用报错后识别 230011/231003 并标记;
47
+ * - 命中时抛出 MessageUnavailableError 供上游快速终止流程。
48
+ */
49
+ export declare function runWithMessageUnavailableGuard<T>(params: {
50
+ messageId: string | undefined;
51
+ operation: string;
52
+ fn: () => Promise<T>;
53
+ }): Promise<T>;
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
4
+ * SPDX-License-Identifier: MIT
5
+ *
6
+ * 消息不可用(已撤回/已删除)状态管理。
7
+ *
8
+ * 目标:
9
+ * 1) 当命中飞书终止错误码(230011/231003)时,按 message_id 标记不可用;
10
+ * 2) 后续针对该 message_id 的 API 调用直接短路,避免持续报错刷屏。
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.MessageUnavailableError = void 0;
14
+ exports.isTerminalMessageApiCode = isTerminalMessageApiCode;
15
+ exports.markMessageUnavailable = markMessageUnavailable;
16
+ exports.getMessageUnavailableState = getMessageUnavailableState;
17
+ exports.isMessageUnavailable = isMessageUnavailable;
18
+ exports.markMessageUnavailableFromError = markMessageUnavailableFromError;
19
+ exports.isMessageUnavailableError = isMessageUnavailableError;
20
+ exports.assertMessageAvailable = assertMessageAvailable;
21
+ exports.runWithMessageUnavailableGuard = runWithMessageUnavailableGuard;
22
+ const auth_errors_1 = require("./auth-errors.js");
23
+ const api_error_1 = require("./api-error.js");
24
+ const targets_1 = require("./targets.js");
25
+ const UNAVAILABLE_CACHE_TTL_MS = 30 * 60 * 1000;
26
+ const MAX_CACHE_SIZE_BEFORE_PRUNE = 512;
27
+ const unavailableMessageCache = new Map();
28
+ function pruneExpired(nowMs = Date.now()) {
29
+ for (const [messageId, state] of unavailableMessageCache) {
30
+ if (nowMs - state.markedAtMs > UNAVAILABLE_CACHE_TTL_MS) {
31
+ unavailableMessageCache.delete(messageId);
32
+ }
33
+ }
34
+ }
35
+ function isTerminalMessageApiCode(code) {
36
+ return typeof code === 'number' && auth_errors_1.MESSAGE_TERMINAL_CODES.has(code);
37
+ }
38
+ function markMessageUnavailable(params) {
39
+ const normalizedId = (0, targets_1.normalizeMessageId)(params.messageId);
40
+ if (!normalizedId)
41
+ return;
42
+ if (unavailableMessageCache.size >= MAX_CACHE_SIZE_BEFORE_PRUNE) {
43
+ pruneExpired();
44
+ }
45
+ unavailableMessageCache.set(normalizedId, {
46
+ apiCode: params.apiCode,
47
+ operation: params.operation,
48
+ markedAtMs: Date.now(),
49
+ });
50
+ }
51
+ function getMessageUnavailableState(messageId) {
52
+ const normalizedId = (0, targets_1.normalizeMessageId)(messageId);
53
+ if (!normalizedId)
54
+ return undefined;
55
+ const state = unavailableMessageCache.get(normalizedId);
56
+ if (!state)
57
+ return undefined;
58
+ if (Date.now() - state.markedAtMs > UNAVAILABLE_CACHE_TTL_MS) {
59
+ unavailableMessageCache.delete(normalizedId);
60
+ return undefined;
61
+ }
62
+ return state;
63
+ }
64
+ function isMessageUnavailable(messageId) {
65
+ return !!getMessageUnavailableState(messageId);
66
+ }
67
+ function markMessageUnavailableFromError(params) {
68
+ const normalizedId = (0, targets_1.normalizeMessageId)(params.messageId);
69
+ if (!normalizedId)
70
+ return undefined;
71
+ const code = (0, api_error_1.extractLarkApiCode)(params.error);
72
+ if (!isTerminalMessageApiCode(code))
73
+ return undefined;
74
+ markMessageUnavailable({
75
+ messageId: normalizedId,
76
+ apiCode: code,
77
+ operation: params.operation,
78
+ });
79
+ return code;
80
+ }
81
+ class MessageUnavailableError extends Error {
82
+ messageId;
83
+ apiCode;
84
+ operation;
85
+ constructor(params) {
86
+ const operationText = params.operation ? `, op=${params.operation}` : '';
87
+ super(`[feishu-message-unavailable] message ${params.messageId} unavailable (code=${params.apiCode}${operationText})`);
88
+ this.name = 'MessageUnavailableError';
89
+ this.messageId = params.messageId;
90
+ this.apiCode = params.apiCode;
91
+ this.operation = params.operation;
92
+ }
93
+ }
94
+ exports.MessageUnavailableError = MessageUnavailableError;
95
+ function isMessageUnavailableError(error) {
96
+ return (error instanceof MessageUnavailableError ||
97
+ (typeof error === 'object' && error != null && error.name === 'MessageUnavailableError'));
98
+ }
99
+ function assertMessageAvailable(messageId, operation) {
100
+ const normalizedId = (0, targets_1.normalizeMessageId)(messageId);
101
+ if (!normalizedId)
102
+ return;
103
+ const state = getMessageUnavailableState(normalizedId);
104
+ if (!state)
105
+ return;
106
+ throw new MessageUnavailableError({
107
+ messageId: normalizedId,
108
+ apiCode: state.apiCode,
109
+ operation: operation ?? state.operation,
110
+ });
111
+ }
112
+ /**
113
+ * 针对 message_id 的统一保护:
114
+ * - 调用前检查是否已标记不可用;
115
+ * - 调用报错后识别 230011/231003 并标记;
116
+ * - 命中时抛出 MessageUnavailableError 供上游快速终止流程。
117
+ */
118
+ async function runWithMessageUnavailableGuard(params) {
119
+ const normalizedId = (0, targets_1.normalizeMessageId)(params.messageId);
120
+ if (!normalizedId) {
121
+ return params.fn();
122
+ }
123
+ assertMessageAvailable(normalizedId, params.operation);
124
+ try {
125
+ return await params.fn();
126
+ }
127
+ catch (error) {
128
+ const code = markMessageUnavailableFromError({
129
+ messageId: normalizedId,
130
+ error,
131
+ operation: params.operation,
132
+ });
133
+ if (code) {
134
+ throw new MessageUnavailableError({
135
+ messageId: normalizedId,
136
+ apiCode: code,
137
+ operation: params.operation,
138
+ });
139
+ }
140
+ throw error;
141
+ }
142
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * owner-policy.ts — 应用 Owner 访问控制策略。
6
+ *
7
+ * 从 uat-client.ts 迁移 owner 检查逻辑到独立 policy 层。
8
+ * 提供 fail-close 策略(安全优先:授权发起路径)。
9
+ */
10
+ import type * as Lark from '@larksuiteoapi/node-sdk';
11
+ import type { ConfiguredLarkAccount } from './types';
12
+ /**
13
+ * 非应用 owner 尝试执行 owner-only 操作时抛出。
14
+ *
15
+ * 注意:`appOwnerId` 仅用于内部日志,不应序列化到用户可见的响应中,
16
+ * 以避免泄露 owner 的 open_id。
17
+ */
18
+ export declare class OwnerAccessDeniedError extends Error {
19
+ readonly userOpenId: string;
20
+ readonly appOwnerId: string;
21
+ constructor(userOpenId: string, appOwnerId: string);
22
+ }
23
+ /**
24
+ * 校验用户是否为应用 owner(fail-close 版本)。
25
+ *
26
+ * - 获取 owner 失败时 → 拒绝(安全优先)
27
+ * - owner 不匹配时 → 拒绝
28
+ *
29
+ * 适用于:`executeAuthorize`(OAuth 授权发起)、`commands/auth.ts`(批量授权)等
30
+ * 赋予实质性权限的入口。
31
+ */
32
+ export declare function assertOwnerAccessStrict(account: ConfiguredLarkAccount, sdk: Lark.Client, userOpenId: string): Promise<void>;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
4
+ * SPDX-License-Identifier: MIT
5
+ *
6
+ * owner-policy.ts — 应用 Owner 访问控制策略。
7
+ *
8
+ * 从 uat-client.ts 迁移 owner 检查逻辑到独立 policy 层。
9
+ * 提供 fail-close 策略(安全优先:授权发起路径)。
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.OwnerAccessDeniedError = void 0;
13
+ exports.assertOwnerAccessStrict = assertOwnerAccessStrict;
14
+ const app_owner_fallback_1 = require("./app-owner-fallback.js");
15
+ // ---------------------------------------------------------------------------
16
+ // Error class
17
+ // ---------------------------------------------------------------------------
18
+ /**
19
+ * 非应用 owner 尝试执行 owner-only 操作时抛出。
20
+ *
21
+ * 注意:`appOwnerId` 仅用于内部日志,不应序列化到用户可见的响应中,
22
+ * 以避免泄露 owner 的 open_id。
23
+ */
24
+ class OwnerAccessDeniedError extends Error {
25
+ userOpenId;
26
+ appOwnerId;
27
+ constructor(userOpenId, appOwnerId) {
28
+ super('Permission denied: Only the app owner is authorized to use this feature.');
29
+ this.name = 'OwnerAccessDeniedError';
30
+ this.userOpenId = userOpenId;
31
+ this.appOwnerId = appOwnerId;
32
+ }
33
+ }
34
+ exports.OwnerAccessDeniedError = OwnerAccessDeniedError;
35
+ // ---------------------------------------------------------------------------
36
+ // Policy functions
37
+ // ---------------------------------------------------------------------------
38
+ /**
39
+ * 校验用户是否为应用 owner(fail-close 版本)。
40
+ *
41
+ * - 获取 owner 失败时 → 拒绝(安全优先)
42
+ * - owner 不匹配时 → 拒绝
43
+ *
44
+ * 适用于:`executeAuthorize`(OAuth 授权发起)、`commands/auth.ts`(批量授权)等
45
+ * 赋予实质性权限的入口。
46
+ */
47
+ async function assertOwnerAccessStrict(account, sdk, userOpenId) {
48
+ const ownerOpenId = await (0, app_owner_fallback_1.getAppOwnerFallback)(account, sdk);
49
+ if (!ownerOpenId) {
50
+ throw new OwnerAccessDeniedError(userOpenId, 'unknown');
51
+ }
52
+ if (ownerOpenId !== userOpenId) {
53
+ throw new OwnerAccessDeniedError(userOpenId, ownerOpenId);
54
+ }
55
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Permission URL extraction utilities.
6
+ *
7
+ * Shared functions for extracting and processing permission grant URLs
8
+ * from Feishu API error messages.
9
+ */
10
+ /**
11
+ * Extract permission grant URL from a Feishu error message and optimize it
12
+ * by keeping only the highest-priority permission.
13
+ *
14
+ * @param msg - The error message containing the grant URL
15
+ * @returns The optimized grant URL with single permission, or empty string if not found
16
+ */
17
+ export declare function extractPermissionGrantUrl(msg: string): string;
18
+ /**
19
+ * Extract permission scopes from a Feishu error message.
20
+ * Looks for scopes in the format [scope1,scope2,...]
21
+ */
22
+ export declare function extractPermissionScopes(msg: string): string;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
4
+ * SPDX-License-Identifier: MIT
5
+ *
6
+ * Permission URL extraction utilities.
7
+ *
8
+ * Shared functions for extracting and processing permission grant URLs
9
+ * from Feishu API error messages.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.extractPermissionGrantUrl = extractPermissionGrantUrl;
13
+ exports.extractPermissionScopes = extractPermissionScopes;
14
+ // ---------------------------------------------------------------------------
15
+ // Permission priority
16
+ // ---------------------------------------------------------------------------
17
+ /**
18
+ * Permission priority for sorting.
19
+ * Lower number = higher priority.
20
+ * - read: 1 (highest)
21
+ * - write: 2
22
+ * - other / both read+write: 3 (lowest)
23
+ */
24
+ function getPermissionPriority(scope) {
25
+ const lowerScope = scope.toLowerCase();
26
+ const hasRead = lowerScope.includes('read');
27
+ const hasWrite = lowerScope.includes('write');
28
+ if (hasRead && !hasWrite)
29
+ return 1;
30
+ if (hasWrite && !hasRead)
31
+ return 2;
32
+ return 3;
33
+ }
34
+ /**
35
+ * Extract the highest-priority permission from a scope list.
36
+ * Returns the permission with the lowest priority number (read > write > other).
37
+ */
38
+ function extractHighestPriorityScope(scopeList) {
39
+ return scopeList.split(',').sort((a, b) => getPermissionPriority(a) - getPermissionPriority(b))[0] ?? '';
40
+ }
41
+ // ---------------------------------------------------------------------------
42
+ // Permission URL extraction
43
+ // ---------------------------------------------------------------------------
44
+ /**
45
+ * Extract permission grant URL from a Feishu error message and optimize it
46
+ * by keeping only the highest-priority permission.
47
+ *
48
+ * @param msg - The error message containing the grant URL
49
+ * @returns The optimized grant URL with single permission, or empty string if not found
50
+ */
51
+ function extractPermissionGrantUrl(msg) {
52
+ const urlMatch = msg.match(/https:\/\/[^\s]+\/app\/[^\s]+/);
53
+ if (!urlMatch?.[0]) {
54
+ return '';
55
+ }
56
+ try {
57
+ const url = new URL(urlMatch[0]);
58
+ const scopeListParam = url.searchParams.get('q') ?? '';
59
+ const firstScope = extractHighestPriorityScope(scopeListParam);
60
+ if (firstScope) {
61
+ url.searchParams.set('q', firstScope);
62
+ }
63
+ return url.href;
64
+ }
65
+ catch {
66
+ return urlMatch[0];
67
+ }
68
+ }
69
+ /**
70
+ * Extract permission scopes from a Feishu error message.
71
+ * Looks for scopes in the format [scope1,scope2,...]
72
+ */
73
+ function extractPermissionScopes(msg) {
74
+ const scopeMatch = msg.match(/\[([^\]]+)\]/);
75
+ return scopeMatch?.[1] ?? 'unknown';
76
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * raw-request.ts — 飞书 Open API 裸 HTTP 请求工具。
6
+ *
7
+ * 从 tool-client.ts 提取,提供不依赖 SDK 的直接 API 调用能力。
8
+ * 用于 SDK 未覆盖的 API 或需要精细控制请求的场景。
9
+ */
10
+ import type { LarkBrand } from './types';
11
+ /** 将 LarkBrand 映射为 API base URL。 */
12
+ export declare function resolveDomainUrl(brand: LarkBrand): string;
13
+ export interface RawLarkRequestOptions {
14
+ brand: LarkBrand;
15
+ path: string;
16
+ method?: string;
17
+ body?: unknown;
18
+ query?: Record<string, string>;
19
+ headers?: Record<string, string>;
20
+ accessToken?: string;
21
+ }
22
+ /**
23
+ * 发起 raw HTTP 请求到飞书 API,自动处理域名解析、header 注入和错误检测。
24
+ *
25
+ * 飞书 API 统一错误模式:返回 JSON 中 `code !== 0` 表示失败。
26
+ */
27
+ export declare function rawLarkRequest<T>(options: RawLarkRequestOptions): Promise<T>;