@larksuite/openclaw-lark 2026.3.9

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 (689) hide show
  1. package/LICENSE +10 -0
  2. package/README.md +283 -0
  3. package/index.d.ts +37 -0
  4. package/index.d.ts.map +1 -0
  5. package/index.js +119 -0
  6. package/index.js.map +1 -0
  7. package/openclaw.plugin.json +10 -0
  8. package/package.json +47 -0
  9. package/skills/feishu-bitable/SKILL.md +248 -0
  10. package/skills/feishu-bitable/references/examples.md +813 -0
  11. package/skills/feishu-bitable/references/field-properties.md +763 -0
  12. package/skills/feishu-bitable/references/record-values.md +911 -0
  13. package/skills/feishu-calendar/SKILL.md +244 -0
  14. package/skills/feishu-channel-rules/SKILL.md +18 -0
  15. package/skills/feishu-channel-rules/references/markdown-syntax.md +138 -0
  16. package/skills/feishu-create-doc/SKILL.md +719 -0
  17. package/skills/feishu-fetch-doc/SKILL.md +93 -0
  18. package/skills/feishu-im-read/SKILL.md +163 -0
  19. package/skills/feishu-task/SKILL.md +293 -0
  20. package/skills/feishu-troubleshoot/SKILL.md +70 -0
  21. package/skills/feishu-update-doc/SKILL.md +285 -0
  22. package/src/card/builder.d.ts +100 -0
  23. package/src/card/builder.d.ts.map +1 -0
  24. package/src/card/builder.js +381 -0
  25. package/src/card/builder.js.map +1 -0
  26. package/src/card/cardkit.d.ts +91 -0
  27. package/src/card/cardkit.d.ts.map +1 -0
  28. package/src/card/cardkit.js +182 -0
  29. package/src/card/cardkit.js.map +1 -0
  30. package/src/card/flush-controller.d.ts +46 -0
  31. package/src/card/flush-controller.d.ts.map +1 -0
  32. package/src/card/flush-controller.js +135 -0
  33. package/src/card/flush-controller.js.map +1 -0
  34. package/src/card/markdown-style.d.ts +17 -0
  35. package/src/card/markdown-style.d.ts.map +1 -0
  36. package/src/card/markdown-style.js +98 -0
  37. package/src/card/markdown-style.js.map +1 -0
  38. package/src/card/reply-dispatcher-types.d.ts +121 -0
  39. package/src/card/reply-dispatcher-types.d.ts.map +1 -0
  40. package/src/card/reply-dispatcher-types.js +58 -0
  41. package/src/card/reply-dispatcher-types.js.map +1 -0
  42. package/src/card/reply-dispatcher.d.ts +16 -0
  43. package/src/card/reply-dispatcher.d.ts.map +1 -0
  44. package/src/card/reply-dispatcher.js +293 -0
  45. package/src/card/reply-dispatcher.js.map +1 -0
  46. package/src/card/reply-mode.d.ts +39 -0
  47. package/src/card/reply-mode.d.ts.map +1 -0
  48. package/src/card/reply-mode.js +66 -0
  49. package/src/card/reply-mode.js.map +1 -0
  50. package/src/card/streaming-card-controller.d.ts +88 -0
  51. package/src/card/streaming-card-controller.d.ts.map +1 -0
  52. package/src/card/streaming-card-controller.js +717 -0
  53. package/src/card/streaming-card-controller.js.map +1 -0
  54. package/src/card/unavailable-guard.d.ts +36 -0
  55. package/src/card/unavailable-guard.d.ts.map +1 -0
  56. package/src/card/unavailable-guard.js +84 -0
  57. package/src/card/unavailable-guard.js.map +1 -0
  58. package/src/channel/abort-detect.d.ts +35 -0
  59. package/src/channel/abort-detect.d.ts.map +1 -0
  60. package/src/channel/abort-detect.js +125 -0
  61. package/src/channel/abort-detect.js.map +1 -0
  62. package/src/channel/chat-queue.d.ts +42 -0
  63. package/src/channel/chat-queue.d.ts.map +1 -0
  64. package/src/channel/chat-queue.js +59 -0
  65. package/src/channel/chat-queue.js.map +1 -0
  66. package/src/channel/config-adapter.d.ts +24 -0
  67. package/src/channel/config-adapter.d.ts.map +1 -0
  68. package/src/channel/config-adapter.js +102 -0
  69. package/src/channel/config-adapter.js.map +1 -0
  70. package/src/channel/directory.d.ts +58 -0
  71. package/src/channel/directory.d.ts.map +1 -0
  72. package/src/channel/directory.js +192 -0
  73. package/src/channel/directory.js.map +1 -0
  74. package/src/channel/event-handlers.d.ts +16 -0
  75. package/src/channel/event-handlers.d.ts.map +1 -0
  76. package/src/channel/event-handlers.js +222 -0
  77. package/src/channel/event-handlers.js.map +1 -0
  78. package/src/channel/monitor.d.ts +18 -0
  79. package/src/channel/monitor.d.ts.map +1 -0
  80. package/src/channel/monitor.js +128 -0
  81. package/src/channel/monitor.js.map +1 -0
  82. package/src/channel/onboarding-config.d.ts +18 -0
  83. package/src/channel/onboarding-config.d.ts.map +1 -0
  84. package/src/channel/onboarding-config.js +89 -0
  85. package/src/channel/onboarding-config.js.map +1 -0
  86. package/src/channel/onboarding-migrate.d.ts +26 -0
  87. package/src/channel/onboarding-migrate.d.ts.map +1 -0
  88. package/src/channel/onboarding-migrate.js +68 -0
  89. package/src/channel/onboarding-migrate.js.map +1 -0
  90. package/src/channel/onboarding.d.ts +13 -0
  91. package/src/channel/onboarding.d.ts.map +1 -0
  92. package/src/channel/onboarding.js +297 -0
  93. package/src/channel/onboarding.js.map +1 -0
  94. package/src/channel/plugin.d.ts +14 -0
  95. package/src/channel/plugin.d.ts.map +1 -0
  96. package/src/channel/plugin.js +279 -0
  97. package/src/channel/plugin.js.map +1 -0
  98. package/src/channel/probe.d.ts +15 -0
  99. package/src/channel/probe.d.ts.map +1 -0
  100. package/src/channel/probe.js +22 -0
  101. package/src/channel/probe.js.map +1 -0
  102. package/src/channel/types.d.ts +37 -0
  103. package/src/channel/types.d.ts.map +1 -0
  104. package/src/channel/types.js +8 -0
  105. package/src/channel/types.js.map +1 -0
  106. package/src/commands/auth.d.ts +16 -0
  107. package/src/commands/auth.d.ts.map +1 -0
  108. package/src/commands/auth.js +85 -0
  109. package/src/commands/auth.js.map +1 -0
  110. package/src/commands/diagnose.d.ts +70 -0
  111. package/src/commands/diagnose.d.ts.map +1 -0
  112. package/src/commands/diagnose.js +808 -0
  113. package/src/commands/diagnose.js.map +1 -0
  114. package/src/commands/doctor.d.ts +18 -0
  115. package/src/commands/doctor.d.ts.map +1 -0
  116. package/src/commands/doctor.js +439 -0
  117. package/src/commands/doctor.js.map +1 -0
  118. package/src/commands/index.d.ts +9 -0
  119. package/src/commands/index.d.ts.map +1 -0
  120. package/src/commands/index.js +208 -0
  121. package/src/commands/index.js.map +1 -0
  122. package/src/core/accounts.d.ts +38 -0
  123. package/src/core/accounts.d.ts.map +1 -0
  124. package/src/core/accounts.js +179 -0
  125. package/src/core/accounts.js.map +1 -0
  126. package/src/core/agent-config.d.ts +101 -0
  127. package/src/core/agent-config.d.ts.map +1 -0
  128. package/src/core/agent-config.js +140 -0
  129. package/src/core/agent-config.js.map +1 -0
  130. package/src/core/api-error.d.ts +49 -0
  131. package/src/core/api-error.d.ts.map +1 -0
  132. package/src/core/api-error.js +113 -0
  133. package/src/core/api-error.js.map +1 -0
  134. package/src/core/app-owner-fallback.d.ts +22 -0
  135. package/src/core/app-owner-fallback.d.ts.map +1 -0
  136. package/src/core/app-owner-fallback.js +39 -0
  137. package/src/core/app-owner-fallback.js.map +1 -0
  138. package/src/core/app-scope-checker.d.ts +88 -0
  139. package/src/core/app-scope-checker.d.ts.map +1 -0
  140. package/src/core/app-scope-checker.js +191 -0
  141. package/src/core/app-scope-checker.js.map +1 -0
  142. package/src/core/auth-errors.d.ts +143 -0
  143. package/src/core/auth-errors.d.ts.map +1 -0
  144. package/src/core/auth-errors.js +156 -0
  145. package/src/core/auth-errors.js.map +1 -0
  146. package/src/core/chat-info-cache.d.ts +58 -0
  147. package/src/core/chat-info-cache.d.ts.map +1 -0
  148. package/src/core/chat-info-cache.js +153 -0
  149. package/src/core/chat-info-cache.js.map +1 -0
  150. package/src/core/config-schema.d.ts +449 -0
  151. package/src/core/config-schema.d.ts.map +1 -0
  152. package/src/core/config-schema.js +201 -0
  153. package/src/core/config-schema.js.map +1 -0
  154. package/src/core/device-flow.d.ts +78 -0
  155. package/src/core/device-flow.d.ts.map +1 -0
  156. package/src/core/device-flow.js +213 -0
  157. package/src/core/device-flow.js.map +1 -0
  158. package/src/core/feishu-fetch.d.ts +19 -0
  159. package/src/core/feishu-fetch.d.ts.map +1 -0
  160. package/src/core/feishu-fetch.js +26 -0
  161. package/src/core/feishu-fetch.js.map +1 -0
  162. package/src/core/footer-config.d.ts +25 -0
  163. package/src/core/footer-config.d.ts.map +1 -0
  164. package/src/core/footer-config.js +40 -0
  165. package/src/core/footer-config.js.map +1 -0
  166. package/src/core/lark-client.d.ts +109 -0
  167. package/src/core/lark-client.d.ts.map +1 -0
  168. package/src/core/lark-client.js +354 -0
  169. package/src/core/lark-client.js.map +1 -0
  170. package/src/core/lark-logger.d.ts +24 -0
  171. package/src/core/lark-logger.d.ts.map +1 -0
  172. package/src/core/lark-logger.js +155 -0
  173. package/src/core/lark-logger.js.map +1 -0
  174. package/src/core/lark-ticket.d.ts +30 -0
  175. package/src/core/lark-ticket.d.ts.map +1 -0
  176. package/src/core/lark-ticket.js +36 -0
  177. package/src/core/lark-ticket.js.map +1 -0
  178. package/src/core/message-unavailable.d.ts +54 -0
  179. package/src/core/message-unavailable.d.ts.map +1 -0
  180. package/src/core/message-unavailable.js +131 -0
  181. package/src/core/message-unavailable.js.map +1 -0
  182. package/src/core/owner-policy.d.ts +32 -0
  183. package/src/core/owner-policy.d.ts.map +1 -0
  184. package/src/core/owner-policy.js +53 -0
  185. package/src/core/owner-policy.js.map +1 -0
  186. package/src/core/permission-url.d.ts +23 -0
  187. package/src/core/permission-url.d.ts.map +1 -0
  188. package/src/core/permission-url.js +73 -0
  189. package/src/core/permission-url.js.map +1 -0
  190. package/src/core/raw-request.d.ts +28 -0
  191. package/src/core/raw-request.d.ts.map +1 -0
  192. package/src/core/raw-request.js +63 -0
  193. package/src/core/raw-request.js.map +1 -0
  194. package/src/core/scope-manager.d.ts +169 -0
  195. package/src/core/scope-manager.d.ts.map +1 -0
  196. package/src/core/scope-manager.js +214 -0
  197. package/src/core/scope-manager.js.map +1 -0
  198. package/src/core/security-check.d.ts +73 -0
  199. package/src/core/security-check.d.ts.map +1 -0
  200. package/src/core/security-check.js +175 -0
  201. package/src/core/security-check.js.map +1 -0
  202. package/src/core/shutdown-hooks.d.ts +23 -0
  203. package/src/core/shutdown-hooks.d.ts.map +1 -0
  204. package/src/core/shutdown-hooks.js +57 -0
  205. package/src/core/shutdown-hooks.js.map +1 -0
  206. package/src/core/targets.d.ts +50 -0
  207. package/src/core/targets.d.ts.map +1 -0
  208. package/src/core/targets.js +128 -0
  209. package/src/core/targets.js.map +1 -0
  210. package/src/core/token-store.d.ts +55 -0
  211. package/src/core/token-store.d.ts.map +1 -0
  212. package/src/core/token-store.js +315 -0
  213. package/src/core/token-store.js.map +1 -0
  214. package/src/core/tool-client.d.ts +177 -0
  215. package/src/core/tool-client.d.ts.map +1 -0
  216. package/src/core/tool-client.js +381 -0
  217. package/src/core/tool-client.js.map +1 -0
  218. package/src/core/tool-scopes.d.ts +154 -0
  219. package/src/core/tool-scopes.d.ts.map +1 -0
  220. package/src/core/tool-scopes.js +326 -0
  221. package/src/core/tool-scopes.js.map +1 -0
  222. package/src/core/tools-config.d.ts +35 -0
  223. package/src/core/tools-config.d.ts.map +1 -0
  224. package/src/core/tools-config.js +88 -0
  225. package/src/core/tools-config.js.map +1 -0
  226. package/src/core/types.d.ts +88 -0
  227. package/src/core/types.d.ts.map +1 -0
  228. package/src/core/types.js +12 -0
  229. package/src/core/types.js.map +1 -0
  230. package/src/core/uat-client.d.ts +47 -0
  231. package/src/core/uat-client.d.ts.map +1 -0
  232. package/src/core/uat-client.js +173 -0
  233. package/src/core/uat-client.js.map +1 -0
  234. package/src/core/version.d.ts +26 -0
  235. package/src/core/version.d.ts.map +1 -0
  236. package/src/core/version.js +50 -0
  237. package/src/core/version.js.map +1 -0
  238. package/src/messaging/converters/audio.d.ts +9 -0
  239. package/src/messaging/converters/audio.d.ts.map +1 -0
  240. package/src/messaging/converters/audio.js +22 -0
  241. package/src/messaging/converters/audio.js.map +1 -0
  242. package/src/messaging/converters/calendar.d.ts +14 -0
  243. package/src/messaging/converters/calendar.d.ts.map +1 -0
  244. package/src/messaging/converters/calendar.js +51 -0
  245. package/src/messaging/converters/calendar.js.map +1 -0
  246. package/src/messaging/converters/content-converter.d.ts +42 -0
  247. package/src/messaging/converters/content-converter.d.ts.map +1 -0
  248. package/src/messaging/converters/content-converter.js +107 -0
  249. package/src/messaging/converters/content-converter.js.map +1 -0
  250. package/src/messaging/converters/file.d.ts +9 -0
  251. package/src/messaging/converters/file.d.ts.map +1 -0
  252. package/src/messaging/converters/file.js +21 -0
  253. package/src/messaging/converters/file.js.map +1 -0
  254. package/src/messaging/converters/folder.d.ts +9 -0
  255. package/src/messaging/converters/folder.d.ts.map +1 -0
  256. package/src/messaging/converters/folder.js +21 -0
  257. package/src/messaging/converters/folder.js.map +1 -0
  258. package/src/messaging/converters/hongbao.d.ts +9 -0
  259. package/src/messaging/converters/hongbao.d.ts.map +1 -0
  260. package/src/messaging/converters/hongbao.js +17 -0
  261. package/src/messaging/converters/hongbao.js.map +1 -0
  262. package/src/messaging/converters/image.d.ts +9 -0
  263. package/src/messaging/converters/image.d.ts.map +1 -0
  264. package/src/messaging/converters/image.js +19 -0
  265. package/src/messaging/converters/image.js.map +1 -0
  266. package/src/messaging/converters/index.d.ts +9 -0
  267. package/src/messaging/converters/index.d.ts.map +1 -0
  268. package/src/messaging/converters/index.js +51 -0
  269. package/src/messaging/converters/index.js.map +1 -0
  270. package/src/messaging/converters/interactive/card-converter.d.ts +77 -0
  271. package/src/messaging/converters/interactive/card-converter.d.ts.map +1 -0
  272. package/src/messaging/converters/interactive/card-converter.js +1174 -0
  273. package/src/messaging/converters/interactive/card-converter.js.map +1 -0
  274. package/src/messaging/converters/interactive/card-utils.d.ts +10 -0
  275. package/src/messaging/converters/interactive/card-utils.d.ts.map +1 -0
  276. package/src/messaging/converters/interactive/card-utils.js +43 -0
  277. package/src/messaging/converters/interactive/card-utils.js.map +1 -0
  278. package/src/messaging/converters/interactive/index.d.ts +9 -0
  279. package/src/messaging/converters/interactive/index.d.ts.map +1 -0
  280. package/src/messaging/converters/interactive/index.js +22 -0
  281. package/src/messaging/converters/interactive/index.js.map +1 -0
  282. package/src/messaging/converters/interactive/legacy.d.ts +12 -0
  283. package/src/messaging/converters/interactive/legacy.d.ts.map +1 -0
  284. package/src/messaging/converters/interactive/legacy.js +58 -0
  285. package/src/messaging/converters/interactive/legacy.js.map +1 -0
  286. package/src/messaging/converters/interactive/types.d.ts +24 -0
  287. package/src/messaging/converters/interactive/types.d.ts.map +1 -0
  288. package/src/messaging/converters/interactive/types.js +25 -0
  289. package/src/messaging/converters/interactive/types.js.map +1 -0
  290. package/src/messaging/converters/location.d.ts +9 -0
  291. package/src/messaging/converters/location.d.ts.map +1 -0
  292. package/src/messaging/converters/location.js +20 -0
  293. package/src/messaging/converters/location.js.map +1 -0
  294. package/src/messaging/converters/merge-forward.d.ts +33 -0
  295. package/src/messaging/converters/merge-forward.d.ts.map +1 -0
  296. package/src/messaging/converters/merge-forward.js +226 -0
  297. package/src/messaging/converters/merge-forward.js.map +1 -0
  298. package/src/messaging/converters/post.d.ts +12 -0
  299. package/src/messaging/converters/post.d.ts.map +1 -0
  300. package/src/messaging/converters/post.js +136 -0
  301. package/src/messaging/converters/post.js.map +1 -0
  302. package/src/messaging/converters/share.d.ts +10 -0
  303. package/src/messaging/converters/share.d.ts.map +1 -0
  304. package/src/messaging/converters/share.js +24 -0
  305. package/src/messaging/converters/share.js.map +1 -0
  306. package/src/messaging/converters/sticker.d.ts +9 -0
  307. package/src/messaging/converters/sticker.d.ts.map +1 -0
  308. package/src/messaging/converters/sticker.js +19 -0
  309. package/src/messaging/converters/sticker.js.map +1 -0
  310. package/src/messaging/converters/system.d.ts +13 -0
  311. package/src/messaging/converters/system.d.ts.map +1 -0
  312. package/src/messaging/converters/system.js +33 -0
  313. package/src/messaging/converters/system.js.map +1 -0
  314. package/src/messaging/converters/text.d.ts +9 -0
  315. package/src/messaging/converters/text.d.ts.map +1 -0
  316. package/src/messaging/converters/text.js +15 -0
  317. package/src/messaging/converters/text.js.map +1 -0
  318. package/src/messaging/converters/todo.d.ts +9 -0
  319. package/src/messaging/converters/todo.d.ts.map +1 -0
  320. package/src/messaging/converters/todo.js +42 -0
  321. package/src/messaging/converters/todo.js.map +1 -0
  322. package/src/messaging/converters/types.d.ts +108 -0
  323. package/src/messaging/converters/types.d.ts.map +1 -0
  324. package/src/messaging/converters/types.js +8 -0
  325. package/src/messaging/converters/types.js.map +1 -0
  326. package/src/messaging/converters/unknown.d.ts +9 -0
  327. package/src/messaging/converters/unknown.d.ts.map +1 -0
  328. package/src/messaging/converters/unknown.js +17 -0
  329. package/src/messaging/converters/unknown.js.map +1 -0
  330. package/src/messaging/converters/utils.d.ts +23 -0
  331. package/src/messaging/converters/utils.d.ts.map +1 -0
  332. package/src/messaging/converters/utils.js +52 -0
  333. package/src/messaging/converters/utils.js.map +1 -0
  334. package/src/messaging/converters/video-chat.d.ts +9 -0
  335. package/src/messaging/converters/video-chat.d.ts.map +1 -0
  336. package/src/messaging/converters/video-chat.js +24 -0
  337. package/src/messaging/converters/video-chat.js.map +1 -0
  338. package/src/messaging/converters/video.d.ts +9 -0
  339. package/src/messaging/converters/video.d.ts.map +1 -0
  340. package/src/messaging/converters/video.js +33 -0
  341. package/src/messaging/converters/video.js.map +1 -0
  342. package/src/messaging/converters/vote.d.ts +9 -0
  343. package/src/messaging/converters/vote.d.ts.map +1 -0
  344. package/src/messaging/converters/vote.js +25 -0
  345. package/src/messaging/converters/vote.js.map +1 -0
  346. package/src/messaging/inbound/dedup.d.ts +60 -0
  347. package/src/messaging/inbound/dedup.d.ts.map +1 -0
  348. package/src/messaging/inbound/dedup.js +117 -0
  349. package/src/messaging/inbound/dedup.js.map +1 -0
  350. package/src/messaging/inbound/dispatch-builders.d.ts +84 -0
  351. package/src/messaging/inbound/dispatch-builders.d.ts.map +1 -0
  352. package/src/messaging/inbound/dispatch-builders.js +153 -0
  353. package/src/messaging/inbound/dispatch-builders.js.map +1 -0
  354. package/src/messaging/inbound/dispatch-commands.d.ts +28 -0
  355. package/src/messaging/inbound/dispatch-commands.d.ts.map +1 -0
  356. package/src/messaging/inbound/dispatch-commands.js +113 -0
  357. package/src/messaging/inbound/dispatch-commands.js.map +1 -0
  358. package/src/messaging/inbound/dispatch-context.d.ts +68 -0
  359. package/src/messaging/inbound/dispatch-context.d.ts.map +1 -0
  360. package/src/messaging/inbound/dispatch-context.js +137 -0
  361. package/src/messaging/inbound/dispatch-context.js.map +1 -0
  362. package/src/messaging/inbound/dispatch.d.ts +48 -0
  363. package/src/messaging/inbound/dispatch.d.ts.map +1 -0
  364. package/src/messaging/inbound/dispatch.js +193 -0
  365. package/src/messaging/inbound/dispatch.js.map +1 -0
  366. package/src/messaging/inbound/enrich.d.ts +103 -0
  367. package/src/messaging/inbound/enrich.d.ts.map +1 -0
  368. package/src/messaging/inbound/enrich.js +228 -0
  369. package/src/messaging/inbound/enrich.js.map +1 -0
  370. package/src/messaging/inbound/gate-effects.d.ts +24 -0
  371. package/src/messaging/inbound/gate-effects.d.ts.map +1 -0
  372. package/src/messaging/inbound/gate-effects.js +44 -0
  373. package/src/messaging/inbound/gate-effects.js.map +1 -0
  374. package/src/messaging/inbound/gate.d.ts +61 -0
  375. package/src/messaging/inbound/gate.d.ts.map +1 -0
  376. package/src/messaging/inbound/gate.js +234 -0
  377. package/src/messaging/inbound/gate.js.map +1 -0
  378. package/src/messaging/inbound/handler.d.ts +36 -0
  379. package/src/messaging/inbound/handler.d.ts.map +1 -0
  380. package/src/messaging/inbound/handler.js +174 -0
  381. package/src/messaging/inbound/handler.js.map +1 -0
  382. package/src/messaging/inbound/media-resolver.d.ts +33 -0
  383. package/src/messaging/inbound/media-resolver.d.ts.map +1 -0
  384. package/src/messaging/inbound/media-resolver.js +88 -0
  385. package/src/messaging/inbound/media-resolver.js.map +1 -0
  386. package/src/messaging/inbound/mention.d.ts +40 -0
  387. package/src/messaging/inbound/mention.d.ts.map +1 -0
  388. package/src/messaging/inbound/mention.js +82 -0
  389. package/src/messaging/inbound/mention.js.map +1 -0
  390. package/src/messaging/inbound/parse-io.d.ts +51 -0
  391. package/src/messaging/inbound/parse-io.d.ts.map +1 -0
  392. package/src/messaging/inbound/parse-io.js +82 -0
  393. package/src/messaging/inbound/parse-io.js.map +1 -0
  394. package/src/messaging/inbound/parse.d.ts +29 -0
  395. package/src/messaging/inbound/parse.d.ts.map +1 -0
  396. package/src/messaging/inbound/parse.js +107 -0
  397. package/src/messaging/inbound/parse.js.map +1 -0
  398. package/src/messaging/inbound/permission.d.ts +18 -0
  399. package/src/messaging/inbound/permission.d.ts.map +1 -0
  400. package/src/messaging/inbound/permission.js +41 -0
  401. package/src/messaging/inbound/permission.js.map +1 -0
  402. package/src/messaging/inbound/policy.d.ts +95 -0
  403. package/src/messaging/inbound/policy.d.ts.map +1 -0
  404. package/src/messaging/inbound/policy.js +161 -0
  405. package/src/messaging/inbound/policy.js.map +1 -0
  406. package/src/messaging/inbound/reaction-handler.d.ts +62 -0
  407. package/src/messaging/inbound/reaction-handler.d.ts.map +1 -0
  408. package/src/messaging/inbound/reaction-handler.js +221 -0
  409. package/src/messaging/inbound/reaction-handler.js.map +1 -0
  410. package/src/messaging/inbound/user-name-cache.d.ts +83 -0
  411. package/src/messaging/inbound/user-name-cache.d.ts.map +1 -0
  412. package/src/messaging/inbound/user-name-cache.js +242 -0
  413. package/src/messaging/inbound/user-name-cache.js.map +1 -0
  414. package/src/messaging/outbound/actions.d.ts +17 -0
  415. package/src/messaging/outbound/actions.d.ts.map +1 -0
  416. package/src/messaging/outbound/actions.js +310 -0
  417. package/src/messaging/outbound/actions.js.map +1 -0
  418. package/src/messaging/outbound/chat-manage.d.ts +65 -0
  419. package/src/messaging/outbound/chat-manage.d.ts.map +1 -0
  420. package/src/messaging/outbound/chat-manage.js +112 -0
  421. package/src/messaging/outbound/chat-manage.js.map +1 -0
  422. package/src/messaging/outbound/deliver.d.ts +156 -0
  423. package/src/messaging/outbound/deliver.d.ts.map +1 -0
  424. package/src/messaging/outbound/deliver.js +299 -0
  425. package/src/messaging/outbound/deliver.js.map +1 -0
  426. package/src/messaging/outbound/fetch.d.ts +13 -0
  427. package/src/messaging/outbound/fetch.d.ts.map +1 -0
  428. package/src/messaging/outbound/fetch.js +13 -0
  429. package/src/messaging/outbound/fetch.js.map +1 -0
  430. package/src/messaging/outbound/forward.d.ts +27 -0
  431. package/src/messaging/outbound/forward.d.ts.map +1 -0
  432. package/src/messaging/outbound/forward.js +49 -0
  433. package/src/messaging/outbound/forward.js.map +1 -0
  434. package/src/messaging/outbound/media-url-utils.d.ts +30 -0
  435. package/src/messaging/outbound/media-url-utils.d.ts.map +1 -0
  436. package/src/messaging/outbound/media-url-utils.js +131 -0
  437. package/src/messaging/outbound/media-url-utils.js.map +1 -0
  438. package/src/messaging/outbound/media.d.ts +256 -0
  439. package/src/messaging/outbound/media.d.ts.map +1 -0
  440. package/src/messaging/outbound/media.js +749 -0
  441. package/src/messaging/outbound/media.js.map +1 -0
  442. package/src/messaging/outbound/outbound.d.ts +90 -0
  443. package/src/messaging/outbound/outbound.d.ts.map +1 -0
  444. package/src/messaging/outbound/outbound.js +112 -0
  445. package/src/messaging/outbound/outbound.js.map +1 -0
  446. package/src/messaging/outbound/reactions.d.ts +125 -0
  447. package/src/messaging/outbound/reactions.d.ts.map +1 -0
  448. package/src/messaging/outbound/reactions.js +379 -0
  449. package/src/messaging/outbound/reactions.js.map +1 -0
  450. package/src/messaging/outbound/send.d.ts +136 -0
  451. package/src/messaging/outbound/send.d.ts.map +1 -0
  452. package/src/messaging/outbound/send.js +289 -0
  453. package/src/messaging/outbound/send.js.map +1 -0
  454. package/src/messaging/outbound/typing.d.ts +61 -0
  455. package/src/messaging/outbound/typing.d.ts.map +1 -0
  456. package/src/messaging/outbound/typing.js +136 -0
  457. package/src/messaging/outbound/typing.js.map +1 -0
  458. package/src/messaging/shared/message-lookup.d.ts +55 -0
  459. package/src/messaging/shared/message-lookup.d.ts.map +1 -0
  460. package/src/messaging/shared/message-lookup.js +118 -0
  461. package/src/messaging/shared/message-lookup.js.map +1 -0
  462. package/src/messaging/types.d.ts +177 -0
  463. package/src/messaging/types.d.ts.map +1 -0
  464. package/src/messaging/types.js +11 -0
  465. package/src/messaging/types.js.map +1 -0
  466. package/src/tools/auto-auth.d.ts +57 -0
  467. package/src/tools/auto-auth.d.ts.map +1 -0
  468. package/src/tools/auto-auth.js +925 -0
  469. package/src/tools/auto-auth.js.map +1 -0
  470. package/src/tools/helpers.d.ts +220 -0
  471. package/src/tools/helpers.d.ts.map +1 -0
  472. package/src/tools/helpers.js +298 -0
  473. package/src/tools/helpers.js.map +1 -0
  474. package/src/tools/mcp/doc/create.d.ts +13 -0
  475. package/src/tools/mcp/doc/create.d.ts.map +1 -0
  476. package/src/tools/mcp/doc/create.js +45 -0
  477. package/src/tools/mcp/doc/create.js.map +1 -0
  478. package/src/tools/mcp/doc/fetch.d.ts +13 -0
  479. package/src/tools/mcp/doc/fetch.d.ts.map +1 -0
  480. package/src/tools/mcp/doc/fetch.js +37 -0
  481. package/src/tools/mcp/doc/fetch.js.map +1 -0
  482. package/src/tools/mcp/doc/index.d.ts +13 -0
  483. package/src/tools/mcp/doc/index.d.ts.map +1 -0
  484. package/src/tools/mcp/doc/index.js +42 -0
  485. package/src/tools/mcp/doc/index.js.map +1 -0
  486. package/src/tools/mcp/doc/update.d.ts +13 -0
  487. package/src/tools/mcp/doc/update.d.ts.map +1 -0
  488. package/src/tools/mcp/doc/update.js +62 -0
  489. package/src/tools/mcp/doc/update.js.map +1 -0
  490. package/src/tools/mcp/shared.d.ts +58 -0
  491. package/src/tools/mcp/shared.d.ts.map +1 -0
  492. package/src/tools/mcp/shared.js +224 -0
  493. package/src/tools/mcp/shared.js.map +1 -0
  494. package/src/tools/oapi/bitable/app-table-field.d.ts +17 -0
  495. package/src/tools/oapi/bitable/app-table-field.d.ts.map +1 -0
  496. package/src/tools/oapi/bitable/app-table-field.js +224 -0
  497. package/src/tools/oapi/bitable/app-table-field.js.map +1 -0
  498. package/src/tools/oapi/bitable/app-table-record.d.ts +21 -0
  499. package/src/tools/oapi/bitable/app-table-record.d.ts.map +1 -0
  500. package/src/tools/oapi/bitable/app-table-record.js +449 -0
  501. package/src/tools/oapi/bitable/app-table-record.js.map +1 -0
  502. package/src/tools/oapi/bitable/app-table-view.d.ts +18 -0
  503. package/src/tools/oapi/bitable/app-table-view.d.ts.map +1 -0
  504. package/src/tools/oapi/bitable/app-table-view.js +197 -0
  505. package/src/tools/oapi/bitable/app-table-view.js.map +1 -0
  506. package/src/tools/oapi/bitable/app-table.d.ts +20 -0
  507. package/src/tools/oapi/bitable/app-table.d.ts.map +1 -0
  508. package/src/tools/oapi/bitable/app-table.js +249 -0
  509. package/src/tools/oapi/bitable/app-table.js.map +1 -0
  510. package/src/tools/oapi/bitable/app.d.ts +19 -0
  511. package/src/tools/oapi/bitable/app.d.ts.map +1 -0
  512. package/src/tools/oapi/bitable/app.js +188 -0
  513. package/src/tools/oapi/bitable/app.js.map +1 -0
  514. package/src/tools/oapi/bitable/index.d.ts +10 -0
  515. package/src/tools/oapi/bitable/index.d.ts.map +1 -0
  516. package/src/tools/oapi/bitable/index.js +10 -0
  517. package/src/tools/oapi/bitable/index.js.map +1 -0
  518. package/src/tools/oapi/calendar/calendar.d.ts +16 -0
  519. package/src/tools/oapi/calendar/calendar.d.ts.map +1 -0
  520. package/src/tools/oapi/calendar/calendar.js +124 -0
  521. package/src/tools/oapi/calendar/calendar.js.map +1 -0
  522. package/src/tools/oapi/calendar/event-attendee.d.ts +17 -0
  523. package/src/tools/oapi/calendar/event-attendee.d.ts.map +1 -0
  524. package/src/tools/oapi/calendar/event-attendee.js +275 -0
  525. package/src/tools/oapi/calendar/event-attendee.js.map +1 -0
  526. package/src/tools/oapi/calendar/event.d.ts +17 -0
  527. package/src/tools/oapi/calendar/event.d.ts.map +1 -0
  528. package/src/tools/oapi/calendar/event.js +721 -0
  529. package/src/tools/oapi/calendar/event.js.map +1 -0
  530. package/src/tools/oapi/calendar/freebusy.d.ts +14 -0
  531. package/src/tools/oapi/calendar/freebusy.d.ts.map +1 -0
  532. package/src/tools/oapi/calendar/freebusy.js +113 -0
  533. package/src/tools/oapi/calendar/freebusy.js.map +1 -0
  534. package/src/tools/oapi/calendar/index.d.ts +9 -0
  535. package/src/tools/oapi/calendar/index.d.ts.map +1 -0
  536. package/src/tools/oapi/calendar/index.js +9 -0
  537. package/src/tools/oapi/calendar/index.js.map +1 -0
  538. package/src/tools/oapi/chat/chat.d.ts +17 -0
  539. package/src/tools/oapi/chat/chat.d.ts.map +1 -0
  540. package/src/tools/oapi/chat/chat.js +126 -0
  541. package/src/tools/oapi/chat/chat.js.map +1 -0
  542. package/src/tools/oapi/chat/index.d.ts +11 -0
  543. package/src/tools/oapi/chat/index.d.ts.map +1 -0
  544. package/src/tools/oapi/chat/index.js +16 -0
  545. package/src/tools/oapi/chat/index.js.map +1 -0
  546. package/src/tools/oapi/chat/members.d.ts +12 -0
  547. package/src/tools/oapi/chat/members.d.ts.map +1 -0
  548. package/src/tools/oapi/chat/members.js +83 -0
  549. package/src/tools/oapi/chat/members.js.map +1 -0
  550. package/src/tools/oapi/common/get-user.d.ts +13 -0
  551. package/src/tools/oapi/common/get-user.d.ts.map +1 -0
  552. package/src/tools/oapi/common/get-user.js +108 -0
  553. package/src/tools/oapi/common/get-user.js.map +1 -0
  554. package/src/tools/oapi/common/index.d.ts +7 -0
  555. package/src/tools/oapi/common/index.d.ts.map +1 -0
  556. package/src/tools/oapi/common/index.js +7 -0
  557. package/src/tools/oapi/common/index.js.map +1 -0
  558. package/src/tools/oapi/common/search-user.d.ts +12 -0
  559. package/src/tools/oapi/common/search-user.d.ts.map +1 -0
  560. package/src/tools/oapi/common/search-user.js +75 -0
  561. package/src/tools/oapi/common/search-user.js.map +1 -0
  562. package/src/tools/oapi/drive/doc-comments.d.ts +16 -0
  563. package/src/tools/oapi/drive/doc-comments.d.ts.map +1 -0
  564. package/src/tools/oapi/drive/doc-comments.js +288 -0
  565. package/src/tools/oapi/drive/doc-comments.js.map +1 -0
  566. package/src/tools/oapi/drive/doc-media.d.ts +20 -0
  567. package/src/tools/oapi/drive/doc-media.d.ts.map +1 -0
  568. package/src/tools/oapi/drive/doc-media.js +337 -0
  569. package/src/tools/oapi/drive/doc-media.js.map +1 -0
  570. package/src/tools/oapi/drive/file.d.ts +20 -0
  571. package/src/tools/oapi/drive/file.d.ts.map +1 -0
  572. package/src/tools/oapi/drive/file.js +485 -0
  573. package/src/tools/oapi/drive/file.js.map +1 -0
  574. package/src/tools/oapi/drive/index.d.ts +13 -0
  575. package/src/tools/oapi/drive/index.d.ts.map +1 -0
  576. package/src/tools/oapi/drive/index.js +37 -0
  577. package/src/tools/oapi/drive/index.js.map +1 -0
  578. package/src/tools/oapi/helpers.d.ts +174 -0
  579. package/src/tools/oapi/helpers.d.ts.map +1 -0
  580. package/src/tools/oapi/helpers.js +341 -0
  581. package/src/tools/oapi/helpers.js.map +1 -0
  582. package/src/tools/oapi/im/format-messages.d.ts +51 -0
  583. package/src/tools/oapi/im/format-messages.d.ts.map +1 -0
  584. package/src/tools/oapi/im/format-messages.js +166 -0
  585. package/src/tools/oapi/im/format-messages.js.map +1 -0
  586. package/src/tools/oapi/im/index.d.ts +11 -0
  587. package/src/tools/oapi/im/index.d.ts.map +1 -0
  588. package/src/tools/oapi/im/index.js +18 -0
  589. package/src/tools/oapi/im/index.js.map +1 -0
  590. package/src/tools/oapi/im/message-read.d.ts +14 -0
  591. package/src/tools/oapi/im/message-read.d.ts.map +1 -0
  592. package/src/tools/oapi/im/message-read.js +412 -0
  593. package/src/tools/oapi/im/message-read.js.map +1 -0
  594. package/src/tools/oapi/im/message.d.ts +17 -0
  595. package/src/tools/oapi/im/message.d.ts.map +1 -0
  596. package/src/tools/oapi/im/message.js +171 -0
  597. package/src/tools/oapi/im/message.js.map +1 -0
  598. package/src/tools/oapi/im/resource.d.ts +14 -0
  599. package/src/tools/oapi/im/resource.d.ts.map +1 -0
  600. package/src/tools/oapi/im/resource.js +152 -0
  601. package/src/tools/oapi/im/resource.js.map +1 -0
  602. package/src/tools/oapi/im/time-utils.d.ts +47 -0
  603. package/src/tools/oapi/im/time-utils.d.ts.map +1 -0
  604. package/src/tools/oapi/im/time-utils.js +202 -0
  605. package/src/tools/oapi/im/time-utils.js.map +1 -0
  606. package/src/tools/oapi/im/user-name-uat.d.ts +24 -0
  607. package/src/tools/oapi/im/user-name-uat.d.ts.map +1 -0
  608. package/src/tools/oapi/im/user-name-uat.js +128 -0
  609. package/src/tools/oapi/im/user-name-uat.js.map +1 -0
  610. package/src/tools/oapi/index.d.ts +12 -0
  611. package/src/tools/oapi/index.d.ts.map +1 -0
  612. package/src/tools/oapi/index.js +59 -0
  613. package/src/tools/oapi/index.js.map +1 -0
  614. package/src/tools/oapi/sdk-types.d.ts +97 -0
  615. package/src/tools/oapi/sdk-types.d.ts.map +1 -0
  616. package/src/tools/oapi/sdk-types.js +13 -0
  617. package/src/tools/oapi/sdk-types.js.map +1 -0
  618. package/src/tools/oapi/search/doc-search.d.ts +14 -0
  619. package/src/tools/oapi/search/doc-search.d.ts.map +1 -0
  620. package/src/tools/oapi/search/doc-search.js +203 -0
  621. package/src/tools/oapi/search/doc-search.js.map +1 -0
  622. package/src/tools/oapi/search/index.d.ts +13 -0
  623. package/src/tools/oapi/search/index.d.ts.map +1 -0
  624. package/src/tools/oapi/search/index.js +34 -0
  625. package/src/tools/oapi/search/index.js.map +1 -0
  626. package/src/tools/oapi/sheets/index.d.ts +13 -0
  627. package/src/tools/oapi/sheets/index.d.ts.map +1 -0
  628. package/src/tools/oapi/sheets/index.js +32 -0
  629. package/src/tools/oapi/sheets/index.js.map +1 -0
  630. package/src/tools/oapi/sheets/sheet.d.ts +17 -0
  631. package/src/tools/oapi/sheets/sheet.d.ts.map +1 -0
  632. package/src/tools/oapi/sheets/sheet.js +652 -0
  633. package/src/tools/oapi/sheets/sheet.js.map +1 -0
  634. package/src/tools/oapi/task/comment.d.ts +16 -0
  635. package/src/tools/oapi/task/comment.d.ts.map +1 -0
  636. package/src/tools/oapi/task/comment.js +142 -0
  637. package/src/tools/oapi/task/comment.js.map +1 -0
  638. package/src/tools/oapi/task/index.d.ts +9 -0
  639. package/src/tools/oapi/task/index.d.ts.map +1 -0
  640. package/src/tools/oapi/task/index.js +9 -0
  641. package/src/tools/oapi/task/index.js.map +1 -0
  642. package/src/tools/oapi/task/subtask.d.ts +15 -0
  643. package/src/tools/oapi/task/subtask.d.ts.map +1 -0
  644. package/src/tools/oapi/task/subtask.js +164 -0
  645. package/src/tools/oapi/task/subtask.js.map +1 -0
  646. package/src/tools/oapi/task/task.d.ts +17 -0
  647. package/src/tools/oapi/task/task.d.ts.map +1 -0
  648. package/src/tools/oapi/task/task.js +346 -0
  649. package/src/tools/oapi/task/task.js.map +1 -0
  650. package/src/tools/oapi/task/tasklist.d.ts +22 -0
  651. package/src/tools/oapi/task/tasklist.d.ts.map +1 -0
  652. package/src/tools/oapi/task/tasklist.js +323 -0
  653. package/src/tools/oapi/task/tasklist.js.map +1 -0
  654. package/src/tools/oapi/wiki/index.d.ts +13 -0
  655. package/src/tools/oapi/wiki/index.d.ts.map +1 -0
  656. package/src/tools/oapi/wiki/index.js +35 -0
  657. package/src/tools/oapi/wiki/index.js.map +1 -0
  658. package/src/tools/oapi/wiki/space-node.d.ts +18 -0
  659. package/src/tools/oapi/wiki/space-node.d.ts.map +1 -0
  660. package/src/tools/oapi/wiki/space-node.js +253 -0
  661. package/src/tools/oapi/wiki/space-node.js.map +1 -0
  662. package/src/tools/oapi/wiki/space.d.ts +16 -0
  663. package/src/tools/oapi/wiki/space.d.ts.map +1 -0
  664. package/src/tools/oapi/wiki/space.js +132 -0
  665. package/src/tools/oapi/wiki/space.js.map +1 -0
  666. package/src/tools/oauth-batch-auth.d.ts +12 -0
  667. package/src/tools/oauth-batch-auth.d.ts.map +1 -0
  668. package/src/tools/oauth-batch-auth.js +142 -0
  669. package/src/tools/oauth-batch-auth.js.map +1 -0
  670. package/src/tools/oauth-cards.d.ts +27 -0
  671. package/src/tools/oauth-cards.d.ts.map +1 -0
  672. package/src/tools/oauth-cards.js +251 -0
  673. package/src/tools/oauth-cards.js.map +1 -0
  674. package/src/tools/oauth.d.ts +48 -0
  675. package/src/tools/oauth.d.ts.map +1 -0
  676. package/src/tools/oauth.js +619 -0
  677. package/src/tools/oauth.js.map +1 -0
  678. package/src/tools/onboarding-auth.d.ts +28 -0
  679. package/src/tools/onboarding-auth.d.ts.map +1 -0
  680. package/src/tools/onboarding-auth.js +131 -0
  681. package/src/tools/onboarding-auth.js.map +1 -0
  682. package/src/tools/tat/im/index.d.ts +16 -0
  683. package/src/tools/tat/im/index.d.ts.map +1 -0
  684. package/src/tools/tat/im/index.js +19 -0
  685. package/src/tools/tat/im/index.js.map +1 -0
  686. package/src/tools/tat/im/resource.d.ts +16 -0
  687. package/src/tools/tat/im/resource.d.ts.map +1 -0
  688. package/src/tools/tat/im/resource.js +158 -0
  689. package/src/tools/tat/im/resource.js.map +1 -0
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * App Scope Checker — 查询应用已开通的 scope 列表。
6
+ *
7
+ * 通过 `GET /open-apis/application/v6/applications/:app_id` (TAT) 获取
8
+ * 应用信息,从 `app.scopes` 中提取已开通的 scope 字符串列表。
9
+ *
10
+ * 结果带 30 秒内存缓存,避免每次 invoke() 都调远程 API。
11
+ * scope 检查失败后可调 {@link invalidateAppScopeCache} 清缓存重查。
12
+ */
13
+ /* eslint-disable @typescript-eslint/no-explicit-any */
14
+ import { larkLogger } from './lark-logger';
15
+ const log = larkLogger('core/app-scope-checker');
16
+ import { AppScopeCheckFailedError } from './auth-errors';
17
+ // ---------------------------------------------------------------------------
18
+ // Cache
19
+ // ---------------------------------------------------------------------------
20
+ const cache = new Map();
21
+ const CACHE_TTL_MS = 30 * 1000; // 30 秒
22
+ /** 清除指定 appId 的缓存。 */
23
+ export function invalidateAppScopeCache(appId) {
24
+ cache.delete(appId);
25
+ }
26
+ // ---------------------------------------------------------------------------
27
+ // Fetch
28
+ // ---------------------------------------------------------------------------
29
+ /**
30
+ * 获取应用已开通的 scope 列表。
31
+ *
32
+ * 需要应用自身有 `application:application:self_manage` 权限。
33
+ * `appId` 可传 `"me"` 查自己。
34
+ *
35
+ * @param sdk - Lark SDK 实例
36
+ * @param appId - 应用 ID
37
+ * @param tokenType - token 类型,用于过滤只支持特定 token 类型的 scope
38
+ * @returns scope 字符串数组,如 `["calendar:calendar", "task:task:write"]`
39
+ */
40
+ export async function getAppGrantedScopes(sdk, appId, tokenType) {
41
+ // 1. 检查缓存
42
+ const cached = cache.get(appId);
43
+ if (cached && Date.now() - cached.fetchedAt < CACHE_TTL_MS) {
44
+ // 从缓存中过滤出支持当前 token 类型的 scope
45
+ return cached.rawScopes
46
+ .filter((s) => {
47
+ if (tokenType && s.token_types && Array.isArray(s.token_types)) {
48
+ return s.token_types.includes(tokenType);
49
+ }
50
+ return true;
51
+ })
52
+ .map((s) => s.scope);
53
+ }
54
+ // 2. 调用 API
55
+ try {
56
+ const res = await sdk.request({
57
+ method: 'GET',
58
+ url: `/open-apis/application/v6/applications/${appId}`,
59
+ params: { lang: 'zh_cn' },
60
+ });
61
+ if (res.code !== 0) {
62
+ // 任何 API 错误都认为是应用缺少 application:application:self_manage 权限
63
+ throw new AppScopeCheckFailedError(appId);
64
+ }
65
+ // 响应结构: res.data.app.scopes → [{ scope: "xxx", description, level, token_types?: string[] }]
66
+ // 或者从 app_version 中获取 scopes
67
+ const app = res.data?.app ?? res.app ?? res.data;
68
+ const rawScopes = app?.scopes ?? app?.online_version?.scopes ?? [];
69
+ // 提取并验证 scope 字符串
70
+ const validScopes = rawScopes
71
+ .filter((s) => typeof s.scope === 'string' && s.scope.length > 0)
72
+ .map((s) => ({ scope: s.scope, token_types: s.token_types }));
73
+ // 3. 写缓存(缓存完整数据,包含 token_types 和原始 app 对象)
74
+ cache.set(appId, { rawScopes: validScopes, rawApp: app, fetchedAt: Date.now() });
75
+ log.info(`fetched ${validScopes.length} scopes for app ${appId}`);
76
+ // 4. 根据 tokenType 过滤
77
+ const scopes = validScopes
78
+ .filter((s) => {
79
+ if (tokenType && s.token_types && Array.isArray(s.token_types)) {
80
+ return s.token_types.includes(tokenType);
81
+ }
82
+ return true;
83
+ })
84
+ .map((s) => s.scope);
85
+ log.info(`returning ${scopes.length} scopes${tokenType ? ` for ${tokenType} token` : ''}`);
86
+ return scopes;
87
+ }
88
+ catch (err) {
89
+ // 如果是 AppScopeCheckFailedError,重新抛出(不吞掉)
90
+ if (err instanceof AppScopeCheckFailedError) {
91
+ throw err;
92
+ }
93
+ // 检查是否是权限相关的 HTTP 错误(400/403)
94
+ // axios/SDK 异常对象通常包含 response.status 或 status 字段
95
+ const statusCode = err?.response?.status || err?.status || err?.statusCode;
96
+ const isPermissionError = statusCode === 400 ||
97
+ statusCode === 403 ||
98
+ (err instanceof Error && (err.message.includes('status code 400') || err.message.includes('status code 403')));
99
+ if (isPermissionError) {
100
+ throw new AppScopeCheckFailedError(appId);
101
+ }
102
+ log.warn(`failed to fetch scopes for ${appId}: ${err instanceof Error ? err.message : err}`);
103
+ // 其他查询失败不阻塞调用,返回空数组(后续 API 调用如果缺 scope 会被服务端拒绝)
104
+ return [];
105
+ }
106
+ }
107
+ // ---------------------------------------------------------------------------
108
+ // App info
109
+ // ---------------------------------------------------------------------------
110
+ /**
111
+ * 获取应用信息,包括 owner 信息。
112
+ *
113
+ * 复用 getAppGrantedScopes 的 API 调用和缓存。
114
+ * 如果缓存中已有数据且未过期,直接从缓存提取。
115
+ *
116
+ * @param sdk - Lark SDK 实例
117
+ * @param appId - 应用 ID(可传 "me")
118
+ */
119
+ export async function getAppInfo(sdk, appId) {
120
+ // 先确保缓存已填充(调一次 getAppGrantedScopes 来触发 API + 缓存)
121
+ await getAppGrantedScopes(sdk, appId);
122
+ const cached = cache.get(appId);
123
+ const rawApp = cached?.rawApp;
124
+ // 提取 owner 信息
125
+ const owner = rawApp?.owner;
126
+ const creatorId = rawApp?.creator_id;
127
+ // 统一 owner 定义:type=2(企业内成员)用 owner_id,否则回退 creator_id
128
+ // 兼容两种字段名(owner_type 和 type)
129
+ const ownerTypeValue = owner?.owner_type ?? owner?.type;
130
+ const effectiveOwnerOpenId = ownerTypeValue === 2 && owner?.owner_id ? owner.owner_id : (creatorId ?? owner?.owner_id);
131
+ return {
132
+ appId,
133
+ creatorId,
134
+ ownerOpenId: owner?.owner_id,
135
+ ownerType: owner?.owner_type,
136
+ effectiveOwnerOpenId,
137
+ scopes: cached?.rawScopes ?? [],
138
+ };
139
+ }
140
+ // ---------------------------------------------------------------------------
141
+ // Scope intersection
142
+ // ---------------------------------------------------------------------------
143
+ /**
144
+ * 计算 APP 已有 ∩ OAPI 需要 的交集。
145
+ *
146
+ * 用于传给 OAuth 的 scope 参数 — 只请求 APP 已开通且 API 需要的 scope。
147
+ *
148
+ * @param appGranted - 应用已开通的 scope 列表
149
+ * @param apiRequired - OAPI 要求的 scope 列表
150
+ * @returns 交集 scope 列表
151
+ */
152
+ export function intersectScopes(appGranted, apiRequired) {
153
+ const grantedSet = new Set(appGranted);
154
+ return apiRequired.filter((s) => grantedSet.has(s));
155
+ }
156
+ /**
157
+ * 计算 OAPI 需要但 APP 未开通的 scope(差集)。
158
+ *
159
+ * 用于 AppScopeMissingError 的 missingScopes。
160
+ *
161
+ * @param appGranted - 应用已开通的 scope 列表
162
+ * @param apiRequired - OAPI 要求的 scope 列表
163
+ * @returns 缺失的 scope 列表
164
+ */
165
+ export function missingScopes(appGranted, apiRequired) {
166
+ const grantedSet = new Set(appGranted);
167
+ return apiRequired.filter((s) => !grantedSet.has(s));
168
+ }
169
+ /**
170
+ * 校验应用已开通的 scope 是否满足要求。
171
+ *
172
+ * 与 tool-client.ts invoke() 的 scope 校验逻辑完全一致,作为唯一真值来源:
173
+ * - `scopeNeedType === "all"`: appScopes 必须包含 requiredScopes 的全部项
174
+ * - 其他(默认 "one"): appScopes 与 requiredScopes 的交集非空即可
175
+ * - appScopes 为空: 视为满足(API 查询失败,退回服务端判断)
176
+ *
177
+ * @param appScopes - 应用已开通的 scope 列表(由 getAppGrantedScopes 返回)
178
+ * @param requiredScopes - 需要的 scope 列表
179
+ * @param scopeNeedType - "all" 表示全部必须,undefined/"one" 表示任一即可
180
+ */
181
+ export function isAppScopeSatisfied(appScopes, requiredScopes, scopeNeedType) {
182
+ if (appScopes.length === 0)
183
+ return true; // API 查询失败 → 退回服务端判断
184
+ if (requiredScopes.length === 0)
185
+ return true;
186
+ if (scopeNeedType === 'all') {
187
+ return missingScopes(appScopes, requiredScopes).length === 0;
188
+ }
189
+ return intersectScopes(appScopes, requiredScopes).length > 0;
190
+ }
191
+ //# sourceMappingURL=app-scope-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-scope-checker.js","sourceRoot":"","sources":["../../../src/core/app-scope-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * auth-errors.ts — 统一错误类型定义。
6
+ *
7
+ * 所有与认证/授权/scope 相关的错误类型集中在此文件,
8
+ * 解除 tool-client ↔ app-scope-checker 循环依赖。
9
+ *
10
+ * 其他模块应直接 import 此文件,或通过 tool-client / uat-client 的 re-export 使用。
11
+ */
12
+ /** 飞书 OAPI 错误码常量,替代各处硬编码的 magic number。 */
13
+ export declare const LARK_ERROR: {
14
+ /** 应用 scope 不足(租户维度) */
15
+ readonly APP_SCOPE_MISSING: 99991672;
16
+ /** 用户 token scope 不足 */
17
+ readonly USER_SCOPE_INSUFFICIENT: 99991679;
18
+ /** access_token 无效 */
19
+ readonly TOKEN_INVALID: 99991668;
20
+ /** access_token 已过期 */
21
+ readonly TOKEN_EXPIRED: 99991669;
22
+ /** refresh_token 无效 */
23
+ readonly REFRESH_TOKEN_INVALID: 20003;
24
+ /** refresh_token 已过期 */
25
+ readonly REFRESH_TOKEN_EXPIRED: 20004;
26
+ /** refresh_token 缺失 */
27
+ readonly REFRESH_TOKEN_MISSING: 20024;
28
+ /** refresh_token 已被吊销 */
29
+ readonly REFRESH_TOKEN_REVOKED: 20063;
30
+ /** 消息已被撤回 */
31
+ readonly MESSAGE_RECALLED: 230011;
32
+ /** 消息已被删除 */
33
+ readonly MESSAGE_DELETED: 231003;
34
+ };
35
+ /** 不可恢复的 refresh_token 错误码集合,遇到后需要重新授权。 */
36
+ export declare const REFRESH_TOKEN_IRRECOVERABLE: ReadonlySet<number>;
37
+ /** 消息终止错误码集合(撤回/删除),遇到后应停止对该消息的后续操作。 */
38
+ export declare const MESSAGE_TERMINAL_CODES: ReadonlySet<number>;
39
+ /** access_token 失效相关的错误码集合,遇到后可尝试刷新重试。 */
40
+ export declare const TOKEN_RETRY_CODES: ReadonlySet<number>;
41
+ /** invoke() 错误共享的 scope 信息。 */
42
+ export interface ScopeErrorInfo {
43
+ apiName: string;
44
+ scopes: string[];
45
+ /** 应用 scope 是否已验证通过。false 表示 app scope 检查失败,scope 信息可能不准确。 */
46
+ appScopeVerified?: boolean;
47
+ /** 应用 ID,用于生成开放平台权限管理链接。 */
48
+ appId?: string;
49
+ }
50
+ /** OAuth 授权提示信息,与 handleInvokeError 返回的结构一致。 */
51
+ export interface AuthHint {
52
+ error: string;
53
+ api: string;
54
+ required_scope: string;
55
+ user_open_id: string;
56
+ message: string;
57
+ next_tool_call: {
58
+ tool: 'feishu_oauth';
59
+ params: {
60
+ action: 'authorize';
61
+ scope: string;
62
+ };
63
+ };
64
+ }
65
+ /** tryInvoke 返回值的判别联合体。 */
66
+ export type TryInvokeResult<T> = {
67
+ ok: true;
68
+ data: T;
69
+ } | {
70
+ ok: false;
71
+ error: string;
72
+ authHint: AuthHint;
73
+ } | {
74
+ ok: false;
75
+ error: string;
76
+ authHint?: undefined;
77
+ };
78
+ /**
79
+ * Thrown when no valid UAT exists and the user needs to (re-)authorise.
80
+ * Callers should catch this and trigger the OAuth flow.
81
+ */
82
+ export declare class NeedAuthorizationError extends Error {
83
+ readonly userOpenId: string;
84
+ constructor(userOpenId: string);
85
+ }
86
+ /**
87
+ * 应用缺少 application:application:self_manage 权限,无法查询应用权限配置。
88
+ *
89
+ * 需要管理员在飞书开放平台开通 application:application:self_manage 权限。
90
+ */
91
+ export declare class AppScopeCheckFailedError extends Error {
92
+ /** 应用 ID,用于生成开放平台权限管理链接。 */
93
+ readonly appId?: string;
94
+ constructor(appId?: string);
95
+ }
96
+ /**
97
+ * 应用未开通 OAPI 所需 scope。
98
+ *
99
+ * 需要管理员在飞书开放平台开通权限。
100
+ */
101
+ export declare class AppScopeMissingError extends Error {
102
+ readonly apiName: string;
103
+ /** OAPI 需要但 APP 未开通的 scope 列表。 */
104
+ readonly missingScopes: string[];
105
+ /** 工具的全部所需 scope(含已开通的),用于应用权限完成后一次性发起用户授权。 */
106
+ readonly allRequiredScopes?: string[];
107
+ /** 应用 ID,用于生成开放平台权限管理链接。 */
108
+ readonly appId?: string;
109
+ readonly scopeNeedType?: 'one' | 'all';
110
+ /** 触发此错误时使用的 token 类型,用于保持 card action 二次校验一致。 */
111
+ readonly tokenType?: 'user' | 'tenant';
112
+ constructor(info: ScopeErrorInfo, scopeNeedType?: 'one' | 'all', tokenType?: 'user' | 'tenant', allRequiredScopes?: string[]);
113
+ }
114
+ /**
115
+ * 用户未授权或 scope 不足,需要发起 OAuth 授权。
116
+ *
117
+ * `requiredScopes` 为 APP∩OAPI 的有效 scope,可直接传给
118
+ * `feishu_oauth authorize --scope`。
119
+ */
120
+ export declare class UserAuthRequiredError extends Error {
121
+ readonly userOpenId: string;
122
+ readonly apiName: string;
123
+ /** APP∩OAPI 交集 scope,传给 OAuth authorize。 */
124
+ readonly requiredScopes: string[];
125
+ /** 应用 scope 是否已验证通过。false 时 requiredScopes 可能不准确。 */
126
+ readonly appScopeVerified: boolean;
127
+ /** 应用 ID,用于生成开放平台权限管理链接。 */
128
+ readonly appId?: string;
129
+ constructor(userOpenId: string, info: ScopeErrorInfo);
130
+ }
131
+ /**
132
+ * 服务端报 99991679 — 用户 token 的 scope 不足。
133
+ *
134
+ * 需要增量授权:用缺失的 scope 发起新 Device Flow。
135
+ */
136
+ export declare class UserScopeInsufficientError extends Error {
137
+ readonly userOpenId: string;
138
+ readonly apiName: string;
139
+ /** 缺失的 scope 列表。 */
140
+ readonly missingScopes: string[];
141
+ constructor(userOpenId: string, info: ScopeErrorInfo);
142
+ }
143
+ //# sourceMappingURL=auth-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-errors.d.ts","sourceRoot":"","sources":["../../../src/core/auth-errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * auth-errors.ts — 统一错误类型定义。
6
+ *
7
+ * 所有与认证/授权/scope 相关的错误类型集中在此文件,
8
+ * 解除 tool-client ↔ app-scope-checker 循环依赖。
9
+ *
10
+ * 其他模块应直接 import 此文件,或通过 tool-client / uat-client 的 re-export 使用。
11
+ */
12
+ // ---------------------------------------------------------------------------
13
+ // Feishu error code constants
14
+ // ---------------------------------------------------------------------------
15
+ /** 飞书 OAPI 错误码常量,替代各处硬编码的 magic number。 */
16
+ export const LARK_ERROR = {
17
+ /** 应用 scope 不足(租户维度) */
18
+ APP_SCOPE_MISSING: 99991672,
19
+ /** 用户 token scope 不足 */
20
+ USER_SCOPE_INSUFFICIENT: 99991679,
21
+ /** access_token 无效 */
22
+ TOKEN_INVALID: 99991668,
23
+ /** access_token 已过期 */
24
+ TOKEN_EXPIRED: 99991669,
25
+ /** refresh_token 无效 */
26
+ REFRESH_TOKEN_INVALID: 20003,
27
+ /** refresh_token 已过期 */
28
+ REFRESH_TOKEN_EXPIRED: 20004,
29
+ /** refresh_token 缺失 */
30
+ REFRESH_TOKEN_MISSING: 20024,
31
+ /** refresh_token 已被吊销 */
32
+ REFRESH_TOKEN_REVOKED: 20063,
33
+ /** 消息已被撤回 */
34
+ MESSAGE_RECALLED: 230011,
35
+ /** 消息已被删除 */
36
+ MESSAGE_DELETED: 231003,
37
+ };
38
+ /** 不可恢复的 refresh_token 错误码集合,遇到后需要重新授权。 */
39
+ export const REFRESH_TOKEN_IRRECOVERABLE = new Set([
40
+ LARK_ERROR.REFRESH_TOKEN_INVALID,
41
+ LARK_ERROR.REFRESH_TOKEN_EXPIRED,
42
+ LARK_ERROR.REFRESH_TOKEN_MISSING,
43
+ LARK_ERROR.REFRESH_TOKEN_REVOKED,
44
+ ]);
45
+ /** 消息终止错误码集合(撤回/删除),遇到后应停止对该消息的后续操作。 */
46
+ export const MESSAGE_TERMINAL_CODES = new Set([
47
+ LARK_ERROR.MESSAGE_RECALLED,
48
+ LARK_ERROR.MESSAGE_DELETED,
49
+ ]);
50
+ /** access_token 失效相关的错误码集合,遇到后可尝试刷新重试。 */
51
+ export const TOKEN_RETRY_CODES = new Set([LARK_ERROR.TOKEN_INVALID, LARK_ERROR.TOKEN_EXPIRED]);
52
+ // ---------------------------------------------------------------------------
53
+ // Error classes
54
+ // ---------------------------------------------------------------------------
55
+ /**
56
+ * Thrown when no valid UAT exists and the user needs to (re-)authorise.
57
+ * Callers should catch this and trigger the OAuth flow.
58
+ */
59
+ export class NeedAuthorizationError extends Error {
60
+ userOpenId;
61
+ constructor(userOpenId) {
62
+ super('need_user_authorization');
63
+ this.name = 'NeedAuthorizationError';
64
+ this.userOpenId = userOpenId;
65
+ }
66
+ }
67
+ /**
68
+ * 应用缺少 application:application:self_manage 权限,无法查询应用权限配置。
69
+ *
70
+ * 需要管理员在飞书开放平台开通 application:application:self_manage 权限。
71
+ */
72
+ export class AppScopeCheckFailedError extends Error {
73
+ /** 应用 ID,用于生成开放平台权限管理链接。 */
74
+ appId;
75
+ constructor(appId) {
76
+ super('应用缺少 application:application:self_manage 权限,无法查询应用权限配置。请管理员在开放平台开通该权限。');
77
+ this.name = 'AppScopeCheckFailedError';
78
+ this.appId = appId;
79
+ }
80
+ }
81
+ /**
82
+ * 应用未开通 OAPI 所需 scope。
83
+ *
84
+ * 需要管理员在飞书开放平台开通权限。
85
+ */
86
+ export class AppScopeMissingError extends Error {
87
+ apiName;
88
+ /** OAPI 需要但 APP 未开通的 scope 列表。 */
89
+ missingScopes;
90
+ /** 工具的全部所需 scope(含已开通的),用于应用权限完成后一次性发起用户授权。 */
91
+ allRequiredScopes;
92
+ /** 应用 ID,用于生成开放平台权限管理链接。 */
93
+ appId;
94
+ scopeNeedType;
95
+ /** 触发此错误时使用的 token 类型,用于保持 card action 二次校验一致。 */
96
+ tokenType;
97
+ constructor(info, scopeNeedType, tokenType, allRequiredScopes) {
98
+ if (scopeNeedType === 'one') {
99
+ super(`应用缺少权限 [${info.scopes.join(', ')}](开启任一权限即可),请管理员在开放平台开通。`);
100
+ }
101
+ else {
102
+ super(`应用缺少权限 [${info.scopes.join(', ')}],请管理员在开放平台开通。`);
103
+ }
104
+ this.name = 'AppScopeMissingError';
105
+ this.apiName = info.apiName;
106
+ this.missingScopes = info.scopes;
107
+ this.allRequiredScopes = allRequiredScopes;
108
+ this.appId = info.appId;
109
+ this.scopeNeedType = scopeNeedType;
110
+ this.tokenType = tokenType;
111
+ }
112
+ }
113
+ /**
114
+ * 用户未授权或 scope 不足,需要发起 OAuth 授权。
115
+ *
116
+ * `requiredScopes` 为 APP∩OAPI 的有效 scope,可直接传给
117
+ * `feishu_oauth authorize --scope`。
118
+ */
119
+ export class UserAuthRequiredError extends Error {
120
+ userOpenId;
121
+ apiName;
122
+ /** APP∩OAPI 交集 scope,传给 OAuth authorize。 */
123
+ requiredScopes;
124
+ /** 应用 scope 是否已验证通过。false 时 requiredScopes 可能不准确。 */
125
+ appScopeVerified;
126
+ /** 应用 ID,用于生成开放平台权限管理链接。 */
127
+ appId;
128
+ constructor(userOpenId, info) {
129
+ super('need_user_authorization');
130
+ this.name = 'UserAuthRequiredError';
131
+ this.userOpenId = userOpenId;
132
+ this.apiName = info.apiName;
133
+ this.requiredScopes = info.scopes;
134
+ this.appId = info.appId;
135
+ this.appScopeVerified = info.appScopeVerified ?? true;
136
+ }
137
+ }
138
+ /**
139
+ * 服务端报 99991679 — 用户 token 的 scope 不足。
140
+ *
141
+ * 需要增量授权:用缺失的 scope 发起新 Device Flow。
142
+ */
143
+ export class UserScopeInsufficientError extends Error {
144
+ userOpenId;
145
+ apiName;
146
+ /** 缺失的 scope 列表。 */
147
+ missingScopes;
148
+ constructor(userOpenId, info) {
149
+ super('user_scope_insufficient');
150
+ this.name = 'UserScopeInsufficientError';
151
+ this.userOpenId = userOpenId;
152
+ this.apiName = info.apiName;
153
+ this.missingScopes = info.scopes;
154
+ }
155
+ }
156
+ //# sourceMappingURL=auth-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-errors.js","sourceRoot":"","sources":["../../../src/core/auth-errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Account-scoped LRU cache for Feishu group/chat metadata.
6
+ *
7
+ * Caches the result of `im.chat.get` (chat_mode, group_message_type, etc.)
8
+ * to avoid repeated OAPI calls for every inbound message.
9
+ *
10
+ * Key fields cached:
11
+ * - `chat_mode`: "group" | "topic" | "p2p"
12
+ * - `group_message_type`: "chat" | "thread" (only for chat_mode=group)
13
+ */
14
+ import type { ClawdbotConfig } from 'openclaw/plugin-sdk';
15
+ export interface ChatInfo {
16
+ chatMode: 'group' | 'topic' | 'p2p';
17
+ groupMessageType?: 'chat' | 'thread';
18
+ }
19
+ /** Clear chat-info caches (called from LarkClient.clearCache). */
20
+ export declare function clearChatInfoCache(accountId?: string): void;
21
+ /**
22
+ * Determine whether a group supports thread sessions.
23
+ *
24
+ * Returns `true` when the group is a topic group (`chat_mode=topic`) or
25
+ * a normal group with thread message mode (`group_message_type=thread`).
26
+ *
27
+ * Results are cached per-account with a 1-hour TTL to minimise OAPI calls.
28
+ */
29
+ export declare function isThreadCapableGroup(params: {
30
+ cfg: ClawdbotConfig;
31
+ chatId: string;
32
+ accountId?: string;
33
+ }): Promise<boolean>;
34
+ /**
35
+ * Fetch (or read from cache) the chat metadata for a given chat ID.
36
+ *
37
+ * Returns `undefined` when the API call fails (best-effort).
38
+ */
39
+ export declare function getChatInfo(params: {
40
+ cfg: ClawdbotConfig;
41
+ chatId: string;
42
+ accountId?: string;
43
+ }): Promise<ChatInfo | undefined>;
44
+ /**
45
+ * Determine the chat type (p2p or group) for a given chat ID.
46
+ *
47
+ * Delegates to the shared {@link getChatInfo} cache (account-scoped LRU with
48
+ * 1-hour TTL) so that chat metadata is fetched at most once across all
49
+ * call-sites (dispatch, reaction handler, etc.).
50
+ *
51
+ * Falls back to "p2p" if the API call fails.
52
+ */
53
+ export declare function getChatTypeFeishu(params: {
54
+ cfg: ClawdbotConfig;
55
+ chatId: string;
56
+ accountId?: string;
57
+ }): Promise<'p2p' | 'group'>;
58
+ //# sourceMappingURL=chat-info-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-info-cache.d.ts","sourceRoot":"","sources":["../../../src/core/chat-info-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAU1D,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC;IACpC,gBAAgB,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CACtC;AAsED,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAQ3D;AAMD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,OAAO,CAAC,CAKnB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE;IACxC,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CA8BhC;AAMD;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,CAK3B"}