@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,169 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Scope 管理模块
6
+ *
7
+ * 为所有工具动作提供类型安全的 scope 查询和检查功能。
8
+ *
9
+ * ## 三个核心概念
10
+ *
11
+ * ### 1. Required Scopes(API 需要的权限)
12
+ * - 定义:每个 API 调用所需的飞书权限列表
13
+ * - 来源:tool-scopes.ts(手动维护的类型化配置)
14
+ * - 示例:`["calendar:calendar.event:create", "calendar:calendar.event:update"]`
15
+ * - 用途:判断应用和用户是否需要申请/授权权限
16
+ *
17
+ * ### 2. App Granted Scopes(应用已开通的权限)
18
+ * - 定义:应用在飞书开放平台配置并获得管理员批准的权限
19
+ * - 来源:通过 API 查询 `/open-apis/application/v6/applications`
20
+ * - 作用:应用级权限前置检查,避免无效的用户授权请求
21
+ * - 检查时机:在请求用户授权前
22
+ *
23
+ * ### 3. User Granted Scopes(用户授权的权限)
24
+ * - 定义:用户通过 OAuth 流程明确授权给应用的权限
25
+ * - 来源:OAuth token 中的 scope 字段
26
+ * - 作用:用户级权限检查,确保用户已授权所需权限
27
+ * - 检查时机:每次 API 调用前
28
+ *
29
+ * ## 权限检查流程
30
+ *
31
+ * ```
32
+ * 1. 获取 Required Scopes (API 需要什么权限?)
33
+ * ↓
34
+ * 2. 检查 App Granted Scopes (应用开通了吗?)
35
+ * ↓ 是
36
+ * 3. 检查 User Granted Scopes (用户授权了吗?)
37
+ * ↓ 是
38
+ * 4. 调用 API
39
+ * ```
40
+ */
41
+ import { type ToolActionKey, type ToolScopeMapping, TOOL_SCOPES } from './tool-scopes';
42
+ export type { ToolActionKey, ToolScopeMapping };
43
+ export { TOOL_SCOPES };
44
+ /**
45
+ * 获取单个工具动作所需的 scopes(Required Scopes)
46
+ *
47
+ * @param toolAction - 工具动作键(例如 "feishu_calendar_event.create")
48
+ * @returns API 需要的 scope 字符串数组
49
+ *
50
+ * @example
51
+ * ```ts
52
+ * const requiredScopes = getRequiredScopes("feishu_calendar_event.create");
53
+ * // 返回: ["calendar:calendar.event:create", "calendar:calendar.event:update"]
54
+ * ```
55
+ */
56
+ export declare function getRequiredScopes(toolAction: ToolActionKey): string[];
57
+ /**
58
+ * 获取多个工具动作的合并 Required Scopes(去重)
59
+ *
60
+ * @param toolActions - 工具动作键数组
61
+ * @returns 去重并排序后的 scope 字符串数组
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * const requiredScopes = getRequiredScopesForActions([
66
+ * "feishu_calendar_event.create",
67
+ * "feishu_calendar_event.list"
68
+ * ]);
69
+ * // 返回两个动作的所有唯一 scopes
70
+ * ```
71
+ */
72
+ export declare function getRequiredScopesForActions(toolActions: ToolActionKey[]): string[];
73
+ /**
74
+ * 检查工具动作是否需要任何 scope
75
+ *
76
+ * @param toolAction - 工具动作键
77
+ * @returns 如果动作需要至少一个 scope 则返回 true
78
+ *
79
+ * @example
80
+ * ```ts
81
+ * hasRequiredScopes("feishu_calendar_event.create"); // true
82
+ * hasRequiredScopes("feishu_sheets_spreadsheet.create"); // false (空数组)
83
+ * ```
84
+ */
85
+ export declare function hasRequiredScopes(toolAction: ToolActionKey): boolean;
86
+ /**
87
+ * 获取需要特定 scope 的所有工具动作
88
+ *
89
+ * @param scope - Scope 字符串(例如 "calendar:calendar.event:create")
90
+ * @returns 需要此 scope 的工具动作键数组
91
+ *
92
+ * @example
93
+ * ```ts
94
+ * const actions = getActionsForScope("calendar:calendar.event:create");
95
+ * // 返回: ["feishu_calendar_event.create"]
96
+ * ```
97
+ */
98
+ export declare function getActionsForScope(scope: string): ToolActionKey[];
99
+ /**
100
+ * 检查应用是否开通了工具动作所需的所有权限(App Granted Scopes)
101
+ *
102
+ * @param toolAction - 工具动作键
103
+ * @param appGrantedScopes - 应用已开通的 scope 集合(来自开放平台)
104
+ * @returns 如果应用已开通所有必需的 scopes 则返回 true
105
+ *
106
+ * @example
107
+ * ```ts
108
+ * const appScopes = new Set([
109
+ * "calendar:calendar.event:create",
110
+ * "calendar:calendar.event:update"
111
+ * ]);
112
+ * checkAppScopes("feishu_calendar_event.create", appScopes); // true
113
+ *
114
+ * const partialAppScopes = new Set(["calendar:calendar.event:create"]);
115
+ * checkAppScopes("feishu_calendar_event.create", partialAppScopes); // false
116
+ * ```
117
+ */
118
+ export declare function checkAppScopes(toolAction: ToolActionKey, appGrantedScopes: Set<string> | string[]): boolean;
119
+ /**
120
+ * 获取应用未开通的 scopes
121
+ *
122
+ * @param toolAction - 工具动作键
123
+ * @param appGrantedScopes - 应用已开通的 scope 集合
124
+ * @returns 应用未开通的 scope 字符串数组
125
+ *
126
+ * @example
127
+ * ```ts
128
+ * const appScopes = new Set(["calendar:calendar.event:create"]);
129
+ * const missing = getMissingAppScopes("feishu_calendar_event.create", appScopes);
130
+ * // 返回: ["calendar:calendar.event:update"]
131
+ * ```
132
+ */
133
+ export declare function getMissingAppScopes(toolAction: ToolActionKey, appGrantedScopes: Set<string> | string[]): string[];
134
+ /**
135
+ * 检查用户是否授权了工具动作所需的所有权限(User Granted Scopes)
136
+ *
137
+ * @param toolAction - 工具动作键
138
+ * @param userGrantedScopes - 用户已授权的 scope 集合(来自 OAuth token)
139
+ * @returns 如果用户已授权所有必需的 scopes 则返回 true
140
+ *
141
+ * @example
142
+ * ```ts
143
+ * const userScopes = new Set([
144
+ * "calendar:calendar.event:create",
145
+ * "calendar:calendar.event:update"
146
+ * ]);
147
+ * checkUserScopes("feishu_calendar_event.create", userScopes); // true
148
+ *
149
+ * const partialUserScopes = new Set(["calendar:calendar.event:create"]);
150
+ * checkUserScopes("feishu_calendar_event.create", partialUserScopes); // false
151
+ * ```
152
+ */
153
+ export declare function checkUserScopes(toolAction: ToolActionKey, userGrantedScopes: Set<string> | string[]): boolean;
154
+ /**
155
+ * 获取用户未授权的 scopes
156
+ *
157
+ * @param toolAction - 工具动作键
158
+ * @param userGrantedScopes - 用户已授权的 scope 集合
159
+ * @returns 用户未授权的 scope 字符串数组
160
+ *
161
+ * @example
162
+ * ```ts
163
+ * const userScopes = new Set(["calendar:calendar.event:create"]);
164
+ * const missing = getMissingUserScopes("feishu_calendar_event.create", userScopes);
165
+ * // 返回: ["calendar:calendar.event:update"]
166
+ * ```
167
+ */
168
+ export declare function getMissingUserScopes(toolAction: ToolActionKey, userGrantedScopes: Set<string> | string[]): string[];
169
+ //# sourceMappingURL=scope-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-manager.d.ts","sourceRoot":"","sources":["../../../src/core/scope-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAIvF,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,CAAC;AAIvB;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,aAAa,GAAG,MAAM,EAAE,CAErE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,MAAM,EAAE,CASlF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,aAAa,GAAG,OAAO,CAEpE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAUjE;AAID;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,GAAG,OAAO,CAW3G;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAKjH;AAID;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,GAAG,OAAO,CAW7G;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAKnH"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Scope 管理模块
6
+ *
7
+ * 为所有工具动作提供类型安全的 scope 查询和检查功能。
8
+ *
9
+ * ## 三个核心概念
10
+ *
11
+ * ### 1. Required Scopes(API 需要的权限)
12
+ * - 定义:每个 API 调用所需的飞书权限列表
13
+ * - 来源:tool-scopes.ts(手动维护的类型化配置)
14
+ * - 示例:`["calendar:calendar.event:create", "calendar:calendar.event:update"]`
15
+ * - 用途:判断应用和用户是否需要申请/授权权限
16
+ *
17
+ * ### 2. App Granted Scopes(应用已开通的权限)
18
+ * - 定义:应用在飞书开放平台配置并获得管理员批准的权限
19
+ * - 来源:通过 API 查询 `/open-apis/application/v6/applications`
20
+ * - 作用:应用级权限前置检查,避免无效的用户授权请求
21
+ * - 检查时机:在请求用户授权前
22
+ *
23
+ * ### 3. User Granted Scopes(用户授权的权限)
24
+ * - 定义:用户通过 OAuth 流程明确授权给应用的权限
25
+ * - 来源:OAuth token 中的 scope 字段
26
+ * - 作用:用户级权限检查,确保用户已授权所需权限
27
+ * - 检查时机:每次 API 调用前
28
+ *
29
+ * ## 权限检查流程
30
+ *
31
+ * ```
32
+ * 1. 获取 Required Scopes (API 需要什么权限?)
33
+ * ↓
34
+ * 2. 检查 App Granted Scopes (应用开通了吗?)
35
+ * ↓ 是
36
+ * 3. 检查 User Granted Scopes (用户授权了吗?)
37
+ * ↓ 是
38
+ * 4. 调用 API
39
+ * ```
40
+ */
41
+ import { TOOL_SCOPES } from './tool-scopes';
42
+ export { TOOL_SCOPES };
43
+ // ===== 函数:Required Scopes(API 需要的权限)=====
44
+ /**
45
+ * 获取单个工具动作所需的 scopes(Required Scopes)
46
+ *
47
+ * @param toolAction - 工具动作键(例如 "feishu_calendar_event.create")
48
+ * @returns API 需要的 scope 字符串数组
49
+ *
50
+ * @example
51
+ * ```ts
52
+ * const requiredScopes = getRequiredScopes("feishu_calendar_event.create");
53
+ * // 返回: ["calendar:calendar.event:create", "calendar:calendar.event:update"]
54
+ * ```
55
+ */
56
+ export function getRequiredScopes(toolAction) {
57
+ return TOOL_SCOPES[toolAction] ?? [];
58
+ }
59
+ /**
60
+ * 获取多个工具动作的合并 Required Scopes(去重)
61
+ *
62
+ * @param toolActions - 工具动作键数组
63
+ * @returns 去重并排序后的 scope 字符串数组
64
+ *
65
+ * @example
66
+ * ```ts
67
+ * const requiredScopes = getRequiredScopesForActions([
68
+ * "feishu_calendar_event.create",
69
+ * "feishu_calendar_event.list"
70
+ * ]);
71
+ * // 返回两个动作的所有唯一 scopes
72
+ * ```
73
+ */
74
+ export function getRequiredScopesForActions(toolActions) {
75
+ const scopesSet = new Set();
76
+ for (const action of toolActions) {
77
+ const scopes = getRequiredScopes(action);
78
+ scopes.forEach((scope) => scopesSet.add(scope));
79
+ }
80
+ return Array.from(scopesSet).sort();
81
+ }
82
+ /**
83
+ * 检查工具动作是否需要任何 scope
84
+ *
85
+ * @param toolAction - 工具动作键
86
+ * @returns 如果动作需要至少一个 scope 则返回 true
87
+ *
88
+ * @example
89
+ * ```ts
90
+ * hasRequiredScopes("feishu_calendar_event.create"); // true
91
+ * hasRequiredScopes("feishu_sheets_spreadsheet.create"); // false (空数组)
92
+ * ```
93
+ */
94
+ export function hasRequiredScopes(toolAction) {
95
+ return getRequiredScopes(toolAction).length > 0;
96
+ }
97
+ /**
98
+ * 获取需要特定 scope 的所有工具动作
99
+ *
100
+ * @param scope - Scope 字符串(例如 "calendar:calendar.event:create")
101
+ * @returns 需要此 scope 的工具动作键数组
102
+ *
103
+ * @example
104
+ * ```ts
105
+ * const actions = getActionsForScope("calendar:calendar.event:create");
106
+ * // 返回: ["feishu_calendar_event.create"]
107
+ * ```
108
+ */
109
+ export function getActionsForScope(scope) {
110
+ const actions = [];
111
+ for (const [action, scopes] of Object.entries(TOOL_SCOPES)) {
112
+ if (scopes.includes(scope)) {
113
+ actions.push(action);
114
+ }
115
+ }
116
+ return actions;
117
+ }
118
+ // ===== 函数:App Scope 检查 =====
119
+ /**
120
+ * 检查应用是否开通了工具动作所需的所有权限(App Granted Scopes)
121
+ *
122
+ * @param toolAction - 工具动作键
123
+ * @param appGrantedScopes - 应用已开通的 scope 集合(来自开放平台)
124
+ * @returns 如果应用已开通所有必需的 scopes 则返回 true
125
+ *
126
+ * @example
127
+ * ```ts
128
+ * const appScopes = new Set([
129
+ * "calendar:calendar.event:create",
130
+ * "calendar:calendar.event:update"
131
+ * ]);
132
+ * checkAppScopes("feishu_calendar_event.create", appScopes); // true
133
+ *
134
+ * const partialAppScopes = new Set(["calendar:calendar.event:create"]);
135
+ * checkAppScopes("feishu_calendar_event.create", partialAppScopes); // false
136
+ * ```
137
+ */
138
+ export function checkAppScopes(toolAction, appGrantedScopes) {
139
+ const requiredScopes = getRequiredScopes(toolAction);
140
+ // 如果不需要任何 scope,则总是满足要求
141
+ if (requiredScopes.length === 0) {
142
+ return true;
143
+ }
144
+ const grantedSet = Array.isArray(appGrantedScopes) ? new Set(appGrantedScopes) : appGrantedScopes;
145
+ return requiredScopes.every((scope) => grantedSet.has(scope));
146
+ }
147
+ /**
148
+ * 获取应用未开通的 scopes
149
+ *
150
+ * @param toolAction - 工具动作键
151
+ * @param appGrantedScopes - 应用已开通的 scope 集合
152
+ * @returns 应用未开通的 scope 字符串数组
153
+ *
154
+ * @example
155
+ * ```ts
156
+ * const appScopes = new Set(["calendar:calendar.event:create"]);
157
+ * const missing = getMissingAppScopes("feishu_calendar_event.create", appScopes);
158
+ * // 返回: ["calendar:calendar.event:update"]
159
+ * ```
160
+ */
161
+ export function getMissingAppScopes(toolAction, appGrantedScopes) {
162
+ const requiredScopes = getRequiredScopes(toolAction);
163
+ const grantedSet = Array.isArray(appGrantedScopes) ? new Set(appGrantedScopes) : appGrantedScopes;
164
+ return requiredScopes.filter((scope) => !grantedSet.has(scope));
165
+ }
166
+ // ===== 函数:User Scope 检查 =====
167
+ /**
168
+ * 检查用户是否授权了工具动作所需的所有权限(User Granted Scopes)
169
+ *
170
+ * @param toolAction - 工具动作键
171
+ * @param userGrantedScopes - 用户已授权的 scope 集合(来自 OAuth token)
172
+ * @returns 如果用户已授权所有必需的 scopes 则返回 true
173
+ *
174
+ * @example
175
+ * ```ts
176
+ * const userScopes = new Set([
177
+ * "calendar:calendar.event:create",
178
+ * "calendar:calendar.event:update"
179
+ * ]);
180
+ * checkUserScopes("feishu_calendar_event.create", userScopes); // true
181
+ *
182
+ * const partialUserScopes = new Set(["calendar:calendar.event:create"]);
183
+ * checkUserScopes("feishu_calendar_event.create", partialUserScopes); // false
184
+ * ```
185
+ */
186
+ export function checkUserScopes(toolAction, userGrantedScopes) {
187
+ const requiredScopes = getRequiredScopes(toolAction);
188
+ // 如果不需要任何 scope,则总是满足要求
189
+ if (requiredScopes.length === 0) {
190
+ return true;
191
+ }
192
+ const grantedSet = Array.isArray(userGrantedScopes) ? new Set(userGrantedScopes) : userGrantedScopes;
193
+ return requiredScopes.every((scope) => grantedSet.has(scope));
194
+ }
195
+ /**
196
+ * 获取用户未授权的 scopes
197
+ *
198
+ * @param toolAction - 工具动作键
199
+ * @param userGrantedScopes - 用户已授权的 scope 集合
200
+ * @returns 用户未授权的 scope 字符串数组
201
+ *
202
+ * @example
203
+ * ```ts
204
+ * const userScopes = new Set(["calendar:calendar.event:create"]);
205
+ * const missing = getMissingUserScopes("feishu_calendar_event.create", userScopes);
206
+ * // 返回: ["calendar:calendar.event:update"]
207
+ * ```
208
+ */
209
+ export function getMissingUserScopes(toolAction, userGrantedScopes) {
210
+ const requiredScopes = getRequiredScopes(toolAction);
211
+ const grantedSet = Array.isArray(userGrantedScopes) ? new Set(userGrantedScopes) : userGrantedScopes;
212
+ return requiredScopes.filter((scope) => !grantedSet.has(scope));
213
+ }
214
+ //# sourceMappingURL=scope-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-manager.js","sourceRoot":"","sources":["../../../src/core/scope-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Multi-account isolation checks.
6
+ *
7
+ * Detects potentially unsafe configurations where multiple Feishu accounts
8
+ * belonging to different tenants (different appId) share the default agent
9
+ * without proper isolation via agents + bindings.
10
+ */
11
+ import type { ClawdbotConfig } from 'openclaw/plugin-sdk';
12
+ import type { LarkAccount } from './types';
13
+ export type IsolationStatus =
14
+ /** Single account / same appId / no multi-tenant concern */
15
+ {
16
+ mode: 'not-applicable';
17
+ }
18
+ /** All accounts have bindings pointing to different agents */
19
+ | {
20
+ mode: 'isolated';
21
+ accounts: LarkAccount[];
22
+ }
23
+ /** All accounts have bindings but share the same agent (explicit choice) */
24
+ | {
25
+ mode: 'shared-explicit';
26
+ accounts: LarkAccount[];
27
+ sharedAgentId: string;
28
+ }
29
+ /** Some or all accounts have no bindings — implicit sharing, risky */
30
+ | {
31
+ mode: 'shared-implicit';
32
+ accounts: LarkAccount[];
33
+ unboundAccounts: LarkAccount[];
34
+ };
35
+ /**
36
+ * Diagnose whether multiple enabled accounts from different tenants
37
+ * are properly isolated via agent bindings.
38
+ */
39
+ export declare function checkMultiAccountIsolation(cfg: ClawdbotConfig): IsolationStatus;
40
+ /**
41
+ * Check whether `session.dmScope` is set to per-account isolation.
42
+ *
43
+ * Without this setting, different bots talking to the same user share
44
+ * the same session — even if agent bindings are configured.
45
+ */
46
+ export declare function needsDmScopeFix(cfg: ClawdbotConfig): boolean;
47
+ /** Return the fix command string, or null if not needed. */
48
+ export declare function getDmScopeFixCommand(cfg: ClawdbotConfig): string | null;
49
+ /**
50
+ * Generate a combined warning block for doctor / start.
51
+ * Returns null when everything is fine.
52
+ */
53
+ export declare function formatIsolationWarning(status: IsolationStatus, cfg?: ClawdbotConfig): string | null;
54
+ /**
55
+ * Generate `openclaw config set` commands for per-account isolation.
56
+ */
57
+ export declare function generateIsolationFixCommands(cfg: ClawdbotConfig): {
58
+ commands: string[];
59
+ preview: string;
60
+ } | null;
61
+ /**
62
+ * Generate commands for explicitly sharing the same agent across accounts.
63
+ */
64
+ export declare function generateSharedAgentCommands(cfg: ClawdbotConfig): {
65
+ commands: string[];
66
+ preview: string;
67
+ } | null;
68
+ export declare function collectIsolationWarnings(_cfg: ClawdbotConfig): string[];
69
+ export declare function emitSecurityWarnings(_cfg: ClawdbotConfig, _logger: {
70
+ warn?: (msg: string) => void;
71
+ info?: (msg: string) => void;
72
+ }): void;
73
+ //# sourceMappingURL=security-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-check.d.ts","sourceRoot":"","sources":["../../../src/core/security-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAM3C,MAAM,MAAM,eAAe;AACzB,4DAA4D;AAC1D;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE;AAC5B,8DAA8D;GAC5D;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAA;CAAE;AAC/C,4EAA4E;GAC1E;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE;AAC7E,sEAAsE;GACpE;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;IAAC,eAAe,EAAE,WAAW,EAAE,CAAA;CAAE,CAAC;AAMzF;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,cAAc,GAAG,eAAe,CA8B/E;AAuBD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAI5D;AAED,4DAA4D;AAC5D,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAGvE;AAeD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,CAAC,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAsBnG;AAMD;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,cAAc,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA2BhH;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,cAAc,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAqB/G;AAMD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,EAAE,CAGvE;AAMD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GACtE,IAAI,CAEN"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Multi-account isolation checks.
6
+ *
7
+ * Detects potentially unsafe configurations where multiple Feishu accounts
8
+ * belonging to different tenants (different appId) share the default agent
9
+ * without proper isolation via agents + bindings.
10
+ */
11
+ import { getEnabledLarkAccounts } from './accounts';
12
+ // ---------------------------------------------------------------------------
13
+ // Check logic
14
+ // ---------------------------------------------------------------------------
15
+ /**
16
+ * Diagnose whether multiple enabled accounts from different tenants
17
+ * are properly isolated via agent bindings.
18
+ */
19
+ export function checkMultiAccountIsolation(cfg) {
20
+ const accounts = getEnabledLarkAccounts(cfg);
21
+ if (accounts.length <= 1)
22
+ return { mode: 'not-applicable' };
23
+ const appIds = new Set(accounts.map((a) => (a.configured ? a.appId : undefined)).filter((id) => !!id));
24
+ if (appIds.size <= 1)
25
+ return { mode: 'not-applicable' };
26
+ const feishuBindings = cfg.bindings?.filter((b) => b.match?.channel === 'feishu' && b.match?.accountId);
27
+ if (!feishuBindings || feishuBindings.length === 0) {
28
+ return { mode: 'shared-implicit', accounts, unboundAccounts: accounts };
29
+ }
30
+ const boundAccountIds = new Set(feishuBindings.map((b) => b.match.accountId));
31
+ const unboundAccounts = accounts.filter((a) => !boundAccountIds.has(a.accountId));
32
+ if (unboundAccounts.length > 0) {
33
+ return { mode: 'shared-implicit', accounts, unboundAccounts };
34
+ }
35
+ const agentIds = new Set(feishuBindings.map((b) => b.agentId));
36
+ if (agentIds.size === 1) {
37
+ return {
38
+ mode: 'shared-explicit',
39
+ accounts,
40
+ sharedAgentId: agentIds.values().next().value,
41
+ };
42
+ }
43
+ return { mode: 'isolated', accounts };
44
+ }
45
+ // ---------------------------------------------------------------------------
46
+ // Helpers
47
+ // ---------------------------------------------------------------------------
48
+ function accountNames(accounts) {
49
+ return accounts.map((a) => a.name ?? a.accountId).join('、');
50
+ }
51
+ function isMultiTenant(cfg) {
52
+ const accounts = getEnabledLarkAccounts(cfg);
53
+ if (accounts.length <= 1)
54
+ return false;
55
+ const appIds = new Set(accounts.map((a) => (a.configured ? a.appId : undefined)).filter((id) => !!id));
56
+ return appIds.size > 1;
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ // Session dmScope
60
+ // ---------------------------------------------------------------------------
61
+ const RECOMMENDED_DM_SCOPE = 'per-account-channel-peer';
62
+ /**
63
+ * Check whether `session.dmScope` is set to per-account isolation.
64
+ *
65
+ * Without this setting, different bots talking to the same user share
66
+ * the same session — even if agent bindings are configured.
67
+ */
68
+ export function needsDmScopeFix(cfg) {
69
+ if (!isMultiTenant(cfg))
70
+ return false;
71
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
72
+ return cfg.session?.dmScope !== RECOMMENDED_DM_SCOPE;
73
+ }
74
+ /** Return the fix command string, or null if not needed. */
75
+ export function getDmScopeFixCommand(cfg) {
76
+ if (!needsDmScopeFix(cfg))
77
+ return null;
78
+ return `openclaw config set session.dmScope "${RECOMMENDED_DM_SCOPE}"`;
79
+ }
80
+ /** User-facing dmScope warning block (markdown). */
81
+ function formatDmScopeWarning() {
82
+ return ('⚠️ **私聊消息串混**\n\n' +
83
+ '当同一个用户同时使用多个机器人时,不同机器人的私聊消息会混在同一段对话里,' +
84
+ '导致 AI 无法区分用户在跟哪个机器人说话。');
85
+ }
86
+ // ---------------------------------------------------------------------------
87
+ // Warning text for /feishu doctor & /feishu start
88
+ // ---------------------------------------------------------------------------
89
+ /**
90
+ * Generate a combined warning block for doctor / start.
91
+ * Returns null when everything is fine.
92
+ */
93
+ export function formatIsolationWarning(status, cfg) {
94
+ const sections = [];
95
+ // Agent sharing warning
96
+ if (status.mode === 'shared-implicit') {
97
+ const names = accountNames(status.accounts);
98
+ sections.push(`⚠️ **多个机器人共用记忆,对话内容可能互相可见**\n\n` +
99
+ `当前 ${status.accounts.length} 个飞书机器人(${names})共用同一个 AI 记忆。\n` +
100
+ `用户 A 跟机器人「${status.accounts[0].name ?? status.accounts[0].accountId}」说的话,` +
101
+ `可能出现在机器人「${status.accounts[1]?.name ?? status.accounts[1]?.accountId ?? '...'}」的回复中。\n\n` +
102
+ `👉 发送 **/feishu isolate** 一键查看修复方案`);
103
+ }
104
+ // dmScope warning
105
+ if (cfg && needsDmScopeFix(cfg)) {
106
+ sections.push(formatDmScopeWarning() + '\n\n' + '👉 发送 **/feishu isolate** 一键查看修复方案');
107
+ }
108
+ if (sections.length === 0)
109
+ return null;
110
+ return sections.join('\n\n---\n\n');
111
+ }
112
+ // ---------------------------------------------------------------------------
113
+ // Fix command generation
114
+ // ---------------------------------------------------------------------------
115
+ /**
116
+ * Generate `openclaw config set` commands for per-account isolation.
117
+ */
118
+ export function generateIsolationFixCommands(cfg) {
119
+ const status = checkMultiAccountIsolation(cfg);
120
+ if (status.mode !== 'shared-implicit')
121
+ return null;
122
+ const accounts = status.accounts;
123
+ const commands = [];
124
+ const agentsList = accounts.map((a) => ({
125
+ id: `feishu-${a.accountId}`,
126
+ name: `飞书 ${a.name ?? a.accountId}`,
127
+ }));
128
+ commands.push(`openclaw config set agents.list '${JSON.stringify(agentsList)}' --json`);
129
+ const bindings = accounts.map((a) => ({
130
+ match: { channel: 'feishu', accountId: a.accountId },
131
+ agentId: `feishu-${a.accountId}`,
132
+ }));
133
+ commands.push(`openclaw config set bindings '${JSON.stringify(bindings)}' --json`);
134
+ const dmScopeCmd = getDmScopeFixCommand(cfg);
135
+ if (dmScopeCmd)
136
+ commands.push(dmScopeCmd);
137
+ commands.push('openclaw gateway restart');
138
+ const previewLines = accounts.map((a) => ` ${a.name ?? a.accountId} → 独立记忆(feishu-${a.accountId})`);
139
+ return { commands, preview: previewLines.join('\n') };
140
+ }
141
+ /**
142
+ * Generate commands for explicitly sharing the same agent across accounts.
143
+ */
144
+ export function generateSharedAgentCommands(cfg) {
145
+ const status = checkMultiAccountIsolation(cfg);
146
+ if (status.mode !== 'shared-implicit')
147
+ return null;
148
+ const accounts = status.accounts;
149
+ const commands = [];
150
+ const bindings = accounts.map((a) => ({
151
+ match: { channel: 'feishu', accountId: a.accountId },
152
+ agentId: 'default',
153
+ }));
154
+ commands.push(`openclaw config set bindings '${JSON.stringify(bindings)}' --json`);
155
+ const dmScopeCmd = getDmScopeFixCommand(cfg);
156
+ if (dmScopeCmd)
157
+ commands.push(dmScopeCmd);
158
+ commands.push('openclaw gateway restart');
159
+ const previewLines = accounts.map((a) => ` ${a.name ?? a.accountId} → 共用记忆(default)`);
160
+ return { commands, preview: previewLines.join('\n') };
161
+ }
162
+ // ---------------------------------------------------------------------------
163
+ // collectWarnings adapter (for SDK security.collectWarnings)
164
+ // ---------------------------------------------------------------------------
165
+ export function collectIsolationWarnings(_cfg) {
166
+ // TODO: 产品明确多账号隔离方案后再透出告警
167
+ return [];
168
+ }
169
+ // ---------------------------------------------------------------------------
170
+ // Startup log
171
+ // ---------------------------------------------------------------------------
172
+ export function emitSecurityWarnings(_cfg, _logger) {
173
+ // TODO: 产品明确多账号隔离方案后再透出告警
174
+ }
175
+ //# sourceMappingURL=security-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-check.js","sourceRoot":"","sources":["../../../src/core/security-check.ts"],"names":[],"mappings":"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"}