@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.
- package/LICENSE +10 -0
- package/README.md +283 -0
- package/index.d.ts +37 -0
- package/index.d.ts.map +1 -0
- package/index.js +119 -0
- package/index.js.map +1 -0
- package/openclaw.plugin.json +10 -0
- package/package.json +47 -0
- package/skills/feishu-bitable/SKILL.md +248 -0
- package/skills/feishu-bitable/references/examples.md +813 -0
- package/skills/feishu-bitable/references/field-properties.md +763 -0
- package/skills/feishu-bitable/references/record-values.md +911 -0
- package/skills/feishu-calendar/SKILL.md +244 -0
- package/skills/feishu-channel-rules/SKILL.md +18 -0
- package/skills/feishu-channel-rules/references/markdown-syntax.md +138 -0
- package/skills/feishu-create-doc/SKILL.md +719 -0
- package/skills/feishu-fetch-doc/SKILL.md +93 -0
- package/skills/feishu-im-read/SKILL.md +163 -0
- package/skills/feishu-task/SKILL.md +293 -0
- package/skills/feishu-troubleshoot/SKILL.md +70 -0
- package/skills/feishu-update-doc/SKILL.md +285 -0
- package/src/card/builder.d.ts +100 -0
- package/src/card/builder.d.ts.map +1 -0
- package/src/card/builder.js +381 -0
- package/src/card/builder.js.map +1 -0
- package/src/card/cardkit.d.ts +91 -0
- package/src/card/cardkit.d.ts.map +1 -0
- package/src/card/cardkit.js +182 -0
- package/src/card/cardkit.js.map +1 -0
- package/src/card/flush-controller.d.ts +46 -0
- package/src/card/flush-controller.d.ts.map +1 -0
- package/src/card/flush-controller.js +135 -0
- package/src/card/flush-controller.js.map +1 -0
- package/src/card/markdown-style.d.ts +17 -0
- package/src/card/markdown-style.d.ts.map +1 -0
- package/src/card/markdown-style.js +98 -0
- package/src/card/markdown-style.js.map +1 -0
- package/src/card/reply-dispatcher-types.d.ts +121 -0
- package/src/card/reply-dispatcher-types.d.ts.map +1 -0
- package/src/card/reply-dispatcher-types.js +58 -0
- package/src/card/reply-dispatcher-types.js.map +1 -0
- package/src/card/reply-dispatcher.d.ts +16 -0
- package/src/card/reply-dispatcher.d.ts.map +1 -0
- package/src/card/reply-dispatcher.js +293 -0
- package/src/card/reply-dispatcher.js.map +1 -0
- package/src/card/reply-mode.d.ts +39 -0
- package/src/card/reply-mode.d.ts.map +1 -0
- package/src/card/reply-mode.js +66 -0
- package/src/card/reply-mode.js.map +1 -0
- package/src/card/streaming-card-controller.d.ts +88 -0
- package/src/card/streaming-card-controller.d.ts.map +1 -0
- package/src/card/streaming-card-controller.js +717 -0
- package/src/card/streaming-card-controller.js.map +1 -0
- package/src/card/unavailable-guard.d.ts +36 -0
- package/src/card/unavailable-guard.d.ts.map +1 -0
- package/src/card/unavailable-guard.js +84 -0
- package/src/card/unavailable-guard.js.map +1 -0
- package/src/channel/abort-detect.d.ts +35 -0
- package/src/channel/abort-detect.d.ts.map +1 -0
- package/src/channel/abort-detect.js +125 -0
- package/src/channel/abort-detect.js.map +1 -0
- package/src/channel/chat-queue.d.ts +42 -0
- package/src/channel/chat-queue.d.ts.map +1 -0
- package/src/channel/chat-queue.js +59 -0
- package/src/channel/chat-queue.js.map +1 -0
- package/src/channel/config-adapter.d.ts +24 -0
- package/src/channel/config-adapter.d.ts.map +1 -0
- package/src/channel/config-adapter.js +102 -0
- package/src/channel/config-adapter.js.map +1 -0
- package/src/channel/directory.d.ts +58 -0
- package/src/channel/directory.d.ts.map +1 -0
- package/src/channel/directory.js +192 -0
- package/src/channel/directory.js.map +1 -0
- package/src/channel/event-handlers.d.ts +16 -0
- package/src/channel/event-handlers.d.ts.map +1 -0
- package/src/channel/event-handlers.js +222 -0
- package/src/channel/event-handlers.js.map +1 -0
- package/src/channel/monitor.d.ts +18 -0
- package/src/channel/monitor.d.ts.map +1 -0
- package/src/channel/monitor.js +128 -0
- package/src/channel/monitor.js.map +1 -0
- package/src/channel/onboarding-config.d.ts +18 -0
- package/src/channel/onboarding-config.d.ts.map +1 -0
- package/src/channel/onboarding-config.js +89 -0
- package/src/channel/onboarding-config.js.map +1 -0
- package/src/channel/onboarding-migrate.d.ts +26 -0
- package/src/channel/onboarding-migrate.d.ts.map +1 -0
- package/src/channel/onboarding-migrate.js +68 -0
- package/src/channel/onboarding-migrate.js.map +1 -0
- package/src/channel/onboarding.d.ts +13 -0
- package/src/channel/onboarding.d.ts.map +1 -0
- package/src/channel/onboarding.js +297 -0
- package/src/channel/onboarding.js.map +1 -0
- package/src/channel/plugin.d.ts +14 -0
- package/src/channel/plugin.d.ts.map +1 -0
- package/src/channel/plugin.js +279 -0
- package/src/channel/plugin.js.map +1 -0
- package/src/channel/probe.d.ts +15 -0
- package/src/channel/probe.d.ts.map +1 -0
- package/src/channel/probe.js +22 -0
- package/src/channel/probe.js.map +1 -0
- package/src/channel/types.d.ts +37 -0
- package/src/channel/types.d.ts.map +1 -0
- package/src/channel/types.js +8 -0
- package/src/channel/types.js.map +1 -0
- package/src/commands/auth.d.ts +16 -0
- package/src/commands/auth.d.ts.map +1 -0
- package/src/commands/auth.js +85 -0
- package/src/commands/auth.js.map +1 -0
- package/src/commands/diagnose.d.ts +70 -0
- package/src/commands/diagnose.d.ts.map +1 -0
- package/src/commands/diagnose.js +808 -0
- package/src/commands/diagnose.js.map +1 -0
- package/src/commands/doctor.d.ts +18 -0
- package/src/commands/doctor.d.ts.map +1 -0
- package/src/commands/doctor.js +439 -0
- package/src/commands/doctor.js.map +1 -0
- package/src/commands/index.d.ts +9 -0
- package/src/commands/index.d.ts.map +1 -0
- package/src/commands/index.js +208 -0
- package/src/commands/index.js.map +1 -0
- package/src/core/accounts.d.ts +38 -0
- package/src/core/accounts.d.ts.map +1 -0
- package/src/core/accounts.js +179 -0
- package/src/core/accounts.js.map +1 -0
- package/src/core/agent-config.d.ts +101 -0
- package/src/core/agent-config.d.ts.map +1 -0
- package/src/core/agent-config.js +140 -0
- package/src/core/agent-config.js.map +1 -0
- package/src/core/api-error.d.ts +49 -0
- package/src/core/api-error.d.ts.map +1 -0
- package/src/core/api-error.js +113 -0
- package/src/core/api-error.js.map +1 -0
- package/src/core/app-owner-fallback.d.ts +22 -0
- package/src/core/app-owner-fallback.d.ts.map +1 -0
- package/src/core/app-owner-fallback.js +39 -0
- package/src/core/app-owner-fallback.js.map +1 -0
- package/src/core/app-scope-checker.d.ts +88 -0
- package/src/core/app-scope-checker.d.ts.map +1 -0
- package/src/core/app-scope-checker.js +191 -0
- package/src/core/app-scope-checker.js.map +1 -0
- package/src/core/auth-errors.d.ts +143 -0
- package/src/core/auth-errors.d.ts.map +1 -0
- package/src/core/auth-errors.js +156 -0
- package/src/core/auth-errors.js.map +1 -0
- package/src/core/chat-info-cache.d.ts +58 -0
- package/src/core/chat-info-cache.d.ts.map +1 -0
- package/src/core/chat-info-cache.js +153 -0
- package/src/core/chat-info-cache.js.map +1 -0
- package/src/core/config-schema.d.ts +449 -0
- package/src/core/config-schema.d.ts.map +1 -0
- package/src/core/config-schema.js +201 -0
- package/src/core/config-schema.js.map +1 -0
- package/src/core/device-flow.d.ts +78 -0
- package/src/core/device-flow.d.ts.map +1 -0
- package/src/core/device-flow.js +213 -0
- package/src/core/device-flow.js.map +1 -0
- package/src/core/feishu-fetch.d.ts +19 -0
- package/src/core/feishu-fetch.d.ts.map +1 -0
- package/src/core/feishu-fetch.js +26 -0
- package/src/core/feishu-fetch.js.map +1 -0
- package/src/core/footer-config.d.ts +25 -0
- package/src/core/footer-config.d.ts.map +1 -0
- package/src/core/footer-config.js +40 -0
- package/src/core/footer-config.js.map +1 -0
- package/src/core/lark-client.d.ts +109 -0
- package/src/core/lark-client.d.ts.map +1 -0
- package/src/core/lark-client.js +354 -0
- package/src/core/lark-client.js.map +1 -0
- package/src/core/lark-logger.d.ts +24 -0
- package/src/core/lark-logger.d.ts.map +1 -0
- package/src/core/lark-logger.js +155 -0
- package/src/core/lark-logger.js.map +1 -0
- package/src/core/lark-ticket.d.ts +30 -0
- package/src/core/lark-ticket.d.ts.map +1 -0
- package/src/core/lark-ticket.js +36 -0
- package/src/core/lark-ticket.js.map +1 -0
- package/src/core/message-unavailable.d.ts +54 -0
- package/src/core/message-unavailable.d.ts.map +1 -0
- package/src/core/message-unavailable.js +131 -0
- package/src/core/message-unavailable.js.map +1 -0
- package/src/core/owner-policy.d.ts +32 -0
- package/src/core/owner-policy.d.ts.map +1 -0
- package/src/core/owner-policy.js +53 -0
- package/src/core/owner-policy.js.map +1 -0
- package/src/core/permission-url.d.ts +23 -0
- package/src/core/permission-url.d.ts.map +1 -0
- package/src/core/permission-url.js +73 -0
- package/src/core/permission-url.js.map +1 -0
- package/src/core/raw-request.d.ts +28 -0
- package/src/core/raw-request.d.ts.map +1 -0
- package/src/core/raw-request.js +63 -0
- package/src/core/raw-request.js.map +1 -0
- package/src/core/scope-manager.d.ts +169 -0
- package/src/core/scope-manager.d.ts.map +1 -0
- package/src/core/scope-manager.js +214 -0
- package/src/core/scope-manager.js.map +1 -0
- package/src/core/security-check.d.ts +73 -0
- package/src/core/security-check.d.ts.map +1 -0
- package/src/core/security-check.js +175 -0
- package/src/core/security-check.js.map +1 -0
- package/src/core/shutdown-hooks.d.ts +23 -0
- package/src/core/shutdown-hooks.d.ts.map +1 -0
- package/src/core/shutdown-hooks.js +57 -0
- package/src/core/shutdown-hooks.js.map +1 -0
- package/src/core/targets.d.ts +50 -0
- package/src/core/targets.d.ts.map +1 -0
- package/src/core/targets.js +128 -0
- package/src/core/targets.js.map +1 -0
- package/src/core/token-store.d.ts +55 -0
- package/src/core/token-store.d.ts.map +1 -0
- package/src/core/token-store.js +315 -0
- package/src/core/token-store.js.map +1 -0
- package/src/core/tool-client.d.ts +177 -0
- package/src/core/tool-client.d.ts.map +1 -0
- package/src/core/tool-client.js +381 -0
- package/src/core/tool-client.js.map +1 -0
- package/src/core/tool-scopes.d.ts +154 -0
- package/src/core/tool-scopes.d.ts.map +1 -0
- package/src/core/tool-scopes.js +326 -0
- package/src/core/tool-scopes.js.map +1 -0
- package/src/core/tools-config.d.ts +35 -0
- package/src/core/tools-config.d.ts.map +1 -0
- package/src/core/tools-config.js +88 -0
- package/src/core/tools-config.js.map +1 -0
- package/src/core/types.d.ts +88 -0
- package/src/core/types.d.ts.map +1 -0
- package/src/core/types.js +12 -0
- package/src/core/types.js.map +1 -0
- package/src/core/uat-client.d.ts +47 -0
- package/src/core/uat-client.d.ts.map +1 -0
- package/src/core/uat-client.js +173 -0
- package/src/core/uat-client.js.map +1 -0
- package/src/core/version.d.ts +26 -0
- package/src/core/version.d.ts.map +1 -0
- package/src/core/version.js +50 -0
- package/src/core/version.js.map +1 -0
- package/src/messaging/converters/audio.d.ts +9 -0
- package/src/messaging/converters/audio.d.ts.map +1 -0
- package/src/messaging/converters/audio.js +22 -0
- package/src/messaging/converters/audio.js.map +1 -0
- package/src/messaging/converters/calendar.d.ts +14 -0
- package/src/messaging/converters/calendar.d.ts.map +1 -0
- package/src/messaging/converters/calendar.js +51 -0
- package/src/messaging/converters/calendar.js.map +1 -0
- package/src/messaging/converters/content-converter.d.ts +42 -0
- package/src/messaging/converters/content-converter.d.ts.map +1 -0
- package/src/messaging/converters/content-converter.js +107 -0
- package/src/messaging/converters/content-converter.js.map +1 -0
- package/src/messaging/converters/file.d.ts +9 -0
- package/src/messaging/converters/file.d.ts.map +1 -0
- package/src/messaging/converters/file.js +21 -0
- package/src/messaging/converters/file.js.map +1 -0
- package/src/messaging/converters/folder.d.ts +9 -0
- package/src/messaging/converters/folder.d.ts.map +1 -0
- package/src/messaging/converters/folder.js +21 -0
- package/src/messaging/converters/folder.js.map +1 -0
- package/src/messaging/converters/hongbao.d.ts +9 -0
- package/src/messaging/converters/hongbao.d.ts.map +1 -0
- package/src/messaging/converters/hongbao.js +17 -0
- package/src/messaging/converters/hongbao.js.map +1 -0
- package/src/messaging/converters/image.d.ts +9 -0
- package/src/messaging/converters/image.d.ts.map +1 -0
- package/src/messaging/converters/image.js +19 -0
- package/src/messaging/converters/image.js.map +1 -0
- package/src/messaging/converters/index.d.ts +9 -0
- package/src/messaging/converters/index.d.ts.map +1 -0
- package/src/messaging/converters/index.js +51 -0
- package/src/messaging/converters/index.js.map +1 -0
- package/src/messaging/converters/interactive/card-converter.d.ts +77 -0
- package/src/messaging/converters/interactive/card-converter.d.ts.map +1 -0
- package/src/messaging/converters/interactive/card-converter.js +1174 -0
- package/src/messaging/converters/interactive/card-converter.js.map +1 -0
- package/src/messaging/converters/interactive/card-utils.d.ts +10 -0
- package/src/messaging/converters/interactive/card-utils.d.ts.map +1 -0
- package/src/messaging/converters/interactive/card-utils.js +43 -0
- package/src/messaging/converters/interactive/card-utils.js.map +1 -0
- package/src/messaging/converters/interactive/index.d.ts +9 -0
- package/src/messaging/converters/interactive/index.d.ts.map +1 -0
- package/src/messaging/converters/interactive/index.js +22 -0
- package/src/messaging/converters/interactive/index.js.map +1 -0
- package/src/messaging/converters/interactive/legacy.d.ts +12 -0
- package/src/messaging/converters/interactive/legacy.d.ts.map +1 -0
- package/src/messaging/converters/interactive/legacy.js +58 -0
- package/src/messaging/converters/interactive/legacy.js.map +1 -0
- package/src/messaging/converters/interactive/types.d.ts +24 -0
- package/src/messaging/converters/interactive/types.d.ts.map +1 -0
- package/src/messaging/converters/interactive/types.js +25 -0
- package/src/messaging/converters/interactive/types.js.map +1 -0
- package/src/messaging/converters/location.d.ts +9 -0
- package/src/messaging/converters/location.d.ts.map +1 -0
- package/src/messaging/converters/location.js +20 -0
- package/src/messaging/converters/location.js.map +1 -0
- package/src/messaging/converters/merge-forward.d.ts +33 -0
- package/src/messaging/converters/merge-forward.d.ts.map +1 -0
- package/src/messaging/converters/merge-forward.js +226 -0
- package/src/messaging/converters/merge-forward.js.map +1 -0
- package/src/messaging/converters/post.d.ts +12 -0
- package/src/messaging/converters/post.d.ts.map +1 -0
- package/src/messaging/converters/post.js +136 -0
- package/src/messaging/converters/post.js.map +1 -0
- package/src/messaging/converters/share.d.ts +10 -0
- package/src/messaging/converters/share.d.ts.map +1 -0
- package/src/messaging/converters/share.js +24 -0
- package/src/messaging/converters/share.js.map +1 -0
- package/src/messaging/converters/sticker.d.ts +9 -0
- package/src/messaging/converters/sticker.d.ts.map +1 -0
- package/src/messaging/converters/sticker.js +19 -0
- package/src/messaging/converters/sticker.js.map +1 -0
- package/src/messaging/converters/system.d.ts +13 -0
- package/src/messaging/converters/system.d.ts.map +1 -0
- package/src/messaging/converters/system.js +33 -0
- package/src/messaging/converters/system.js.map +1 -0
- package/src/messaging/converters/text.d.ts +9 -0
- package/src/messaging/converters/text.d.ts.map +1 -0
- package/src/messaging/converters/text.js +15 -0
- package/src/messaging/converters/text.js.map +1 -0
- package/src/messaging/converters/todo.d.ts +9 -0
- package/src/messaging/converters/todo.d.ts.map +1 -0
- package/src/messaging/converters/todo.js +42 -0
- package/src/messaging/converters/todo.js.map +1 -0
- package/src/messaging/converters/types.d.ts +108 -0
- package/src/messaging/converters/types.d.ts.map +1 -0
- package/src/messaging/converters/types.js +8 -0
- package/src/messaging/converters/types.js.map +1 -0
- package/src/messaging/converters/unknown.d.ts +9 -0
- package/src/messaging/converters/unknown.d.ts.map +1 -0
- package/src/messaging/converters/unknown.js +17 -0
- package/src/messaging/converters/unknown.js.map +1 -0
- package/src/messaging/converters/utils.d.ts +23 -0
- package/src/messaging/converters/utils.d.ts.map +1 -0
- package/src/messaging/converters/utils.js +52 -0
- package/src/messaging/converters/utils.js.map +1 -0
- package/src/messaging/converters/video-chat.d.ts +9 -0
- package/src/messaging/converters/video-chat.d.ts.map +1 -0
- package/src/messaging/converters/video-chat.js +24 -0
- package/src/messaging/converters/video-chat.js.map +1 -0
- package/src/messaging/converters/video.d.ts +9 -0
- package/src/messaging/converters/video.d.ts.map +1 -0
- package/src/messaging/converters/video.js +33 -0
- package/src/messaging/converters/video.js.map +1 -0
- package/src/messaging/converters/vote.d.ts +9 -0
- package/src/messaging/converters/vote.d.ts.map +1 -0
- package/src/messaging/converters/vote.js +25 -0
- package/src/messaging/converters/vote.js.map +1 -0
- package/src/messaging/inbound/dedup.d.ts +60 -0
- package/src/messaging/inbound/dedup.d.ts.map +1 -0
- package/src/messaging/inbound/dedup.js +117 -0
- package/src/messaging/inbound/dedup.js.map +1 -0
- package/src/messaging/inbound/dispatch-builders.d.ts +84 -0
- package/src/messaging/inbound/dispatch-builders.d.ts.map +1 -0
- package/src/messaging/inbound/dispatch-builders.js +153 -0
- package/src/messaging/inbound/dispatch-builders.js.map +1 -0
- package/src/messaging/inbound/dispatch-commands.d.ts +28 -0
- package/src/messaging/inbound/dispatch-commands.d.ts.map +1 -0
- package/src/messaging/inbound/dispatch-commands.js +113 -0
- package/src/messaging/inbound/dispatch-commands.js.map +1 -0
- package/src/messaging/inbound/dispatch-context.d.ts +68 -0
- package/src/messaging/inbound/dispatch-context.d.ts.map +1 -0
- package/src/messaging/inbound/dispatch-context.js +137 -0
- package/src/messaging/inbound/dispatch-context.js.map +1 -0
- package/src/messaging/inbound/dispatch.d.ts +48 -0
- package/src/messaging/inbound/dispatch.d.ts.map +1 -0
- package/src/messaging/inbound/dispatch.js +193 -0
- package/src/messaging/inbound/dispatch.js.map +1 -0
- package/src/messaging/inbound/enrich.d.ts +103 -0
- package/src/messaging/inbound/enrich.d.ts.map +1 -0
- package/src/messaging/inbound/enrich.js +228 -0
- package/src/messaging/inbound/enrich.js.map +1 -0
- package/src/messaging/inbound/gate-effects.d.ts +24 -0
- package/src/messaging/inbound/gate-effects.d.ts.map +1 -0
- package/src/messaging/inbound/gate-effects.js +44 -0
- package/src/messaging/inbound/gate-effects.js.map +1 -0
- package/src/messaging/inbound/gate.d.ts +61 -0
- package/src/messaging/inbound/gate.d.ts.map +1 -0
- package/src/messaging/inbound/gate.js +234 -0
- package/src/messaging/inbound/gate.js.map +1 -0
- package/src/messaging/inbound/handler.d.ts +36 -0
- package/src/messaging/inbound/handler.d.ts.map +1 -0
- package/src/messaging/inbound/handler.js +174 -0
- package/src/messaging/inbound/handler.js.map +1 -0
- package/src/messaging/inbound/media-resolver.d.ts +33 -0
- package/src/messaging/inbound/media-resolver.d.ts.map +1 -0
- package/src/messaging/inbound/media-resolver.js +88 -0
- package/src/messaging/inbound/media-resolver.js.map +1 -0
- package/src/messaging/inbound/mention.d.ts +40 -0
- package/src/messaging/inbound/mention.d.ts.map +1 -0
- package/src/messaging/inbound/mention.js +82 -0
- package/src/messaging/inbound/mention.js.map +1 -0
- package/src/messaging/inbound/parse-io.d.ts +51 -0
- package/src/messaging/inbound/parse-io.d.ts.map +1 -0
- package/src/messaging/inbound/parse-io.js +82 -0
- package/src/messaging/inbound/parse-io.js.map +1 -0
- package/src/messaging/inbound/parse.d.ts +29 -0
- package/src/messaging/inbound/parse.d.ts.map +1 -0
- package/src/messaging/inbound/parse.js +107 -0
- package/src/messaging/inbound/parse.js.map +1 -0
- package/src/messaging/inbound/permission.d.ts +18 -0
- package/src/messaging/inbound/permission.d.ts.map +1 -0
- package/src/messaging/inbound/permission.js +41 -0
- package/src/messaging/inbound/permission.js.map +1 -0
- package/src/messaging/inbound/policy.d.ts +95 -0
- package/src/messaging/inbound/policy.d.ts.map +1 -0
- package/src/messaging/inbound/policy.js +161 -0
- package/src/messaging/inbound/policy.js.map +1 -0
- package/src/messaging/inbound/reaction-handler.d.ts +62 -0
- package/src/messaging/inbound/reaction-handler.d.ts.map +1 -0
- package/src/messaging/inbound/reaction-handler.js +221 -0
- package/src/messaging/inbound/reaction-handler.js.map +1 -0
- package/src/messaging/inbound/user-name-cache.d.ts +83 -0
- package/src/messaging/inbound/user-name-cache.d.ts.map +1 -0
- package/src/messaging/inbound/user-name-cache.js +242 -0
- package/src/messaging/inbound/user-name-cache.js.map +1 -0
- package/src/messaging/outbound/actions.d.ts +17 -0
- package/src/messaging/outbound/actions.d.ts.map +1 -0
- package/src/messaging/outbound/actions.js +310 -0
- package/src/messaging/outbound/actions.js.map +1 -0
- package/src/messaging/outbound/chat-manage.d.ts +65 -0
- package/src/messaging/outbound/chat-manage.d.ts.map +1 -0
- package/src/messaging/outbound/chat-manage.js +112 -0
- package/src/messaging/outbound/chat-manage.js.map +1 -0
- package/src/messaging/outbound/deliver.d.ts +156 -0
- package/src/messaging/outbound/deliver.d.ts.map +1 -0
- package/src/messaging/outbound/deliver.js +299 -0
- package/src/messaging/outbound/deliver.js.map +1 -0
- package/src/messaging/outbound/fetch.d.ts +13 -0
- package/src/messaging/outbound/fetch.d.ts.map +1 -0
- package/src/messaging/outbound/fetch.js +13 -0
- package/src/messaging/outbound/fetch.js.map +1 -0
- package/src/messaging/outbound/forward.d.ts +27 -0
- package/src/messaging/outbound/forward.d.ts.map +1 -0
- package/src/messaging/outbound/forward.js +49 -0
- package/src/messaging/outbound/forward.js.map +1 -0
- package/src/messaging/outbound/media-url-utils.d.ts +30 -0
- package/src/messaging/outbound/media-url-utils.d.ts.map +1 -0
- package/src/messaging/outbound/media-url-utils.js +131 -0
- package/src/messaging/outbound/media-url-utils.js.map +1 -0
- package/src/messaging/outbound/media.d.ts +256 -0
- package/src/messaging/outbound/media.d.ts.map +1 -0
- package/src/messaging/outbound/media.js +749 -0
- package/src/messaging/outbound/media.js.map +1 -0
- package/src/messaging/outbound/outbound.d.ts +90 -0
- package/src/messaging/outbound/outbound.d.ts.map +1 -0
- package/src/messaging/outbound/outbound.js +112 -0
- package/src/messaging/outbound/outbound.js.map +1 -0
- package/src/messaging/outbound/reactions.d.ts +125 -0
- package/src/messaging/outbound/reactions.d.ts.map +1 -0
- package/src/messaging/outbound/reactions.js +379 -0
- package/src/messaging/outbound/reactions.js.map +1 -0
- package/src/messaging/outbound/send.d.ts +136 -0
- package/src/messaging/outbound/send.d.ts.map +1 -0
- package/src/messaging/outbound/send.js +289 -0
- package/src/messaging/outbound/send.js.map +1 -0
- package/src/messaging/outbound/typing.d.ts +61 -0
- package/src/messaging/outbound/typing.d.ts.map +1 -0
- package/src/messaging/outbound/typing.js +136 -0
- package/src/messaging/outbound/typing.js.map +1 -0
- package/src/messaging/shared/message-lookup.d.ts +55 -0
- package/src/messaging/shared/message-lookup.d.ts.map +1 -0
- package/src/messaging/shared/message-lookup.js +118 -0
- package/src/messaging/shared/message-lookup.js.map +1 -0
- package/src/messaging/types.d.ts +177 -0
- package/src/messaging/types.d.ts.map +1 -0
- package/src/messaging/types.js +11 -0
- package/src/messaging/types.js.map +1 -0
- package/src/tools/auto-auth.d.ts +57 -0
- package/src/tools/auto-auth.d.ts.map +1 -0
- package/src/tools/auto-auth.js +925 -0
- package/src/tools/auto-auth.js.map +1 -0
- package/src/tools/helpers.d.ts +220 -0
- package/src/tools/helpers.d.ts.map +1 -0
- package/src/tools/helpers.js +298 -0
- package/src/tools/helpers.js.map +1 -0
- package/src/tools/mcp/doc/create.d.ts +13 -0
- package/src/tools/mcp/doc/create.d.ts.map +1 -0
- package/src/tools/mcp/doc/create.js +45 -0
- package/src/tools/mcp/doc/create.js.map +1 -0
- package/src/tools/mcp/doc/fetch.d.ts +13 -0
- package/src/tools/mcp/doc/fetch.d.ts.map +1 -0
- package/src/tools/mcp/doc/fetch.js +37 -0
- package/src/tools/mcp/doc/fetch.js.map +1 -0
- package/src/tools/mcp/doc/index.d.ts +13 -0
- package/src/tools/mcp/doc/index.d.ts.map +1 -0
- package/src/tools/mcp/doc/index.js +42 -0
- package/src/tools/mcp/doc/index.js.map +1 -0
- package/src/tools/mcp/doc/update.d.ts +13 -0
- package/src/tools/mcp/doc/update.d.ts.map +1 -0
- package/src/tools/mcp/doc/update.js +62 -0
- package/src/tools/mcp/doc/update.js.map +1 -0
- package/src/tools/mcp/shared.d.ts +58 -0
- package/src/tools/mcp/shared.d.ts.map +1 -0
- package/src/tools/mcp/shared.js +224 -0
- package/src/tools/mcp/shared.js.map +1 -0
- package/src/tools/oapi/bitable/app-table-field.d.ts +17 -0
- package/src/tools/oapi/bitable/app-table-field.d.ts.map +1 -0
- package/src/tools/oapi/bitable/app-table-field.js +224 -0
- package/src/tools/oapi/bitable/app-table-field.js.map +1 -0
- package/src/tools/oapi/bitable/app-table-record.d.ts +21 -0
- package/src/tools/oapi/bitable/app-table-record.d.ts.map +1 -0
- package/src/tools/oapi/bitable/app-table-record.js +449 -0
- package/src/tools/oapi/bitable/app-table-record.js.map +1 -0
- package/src/tools/oapi/bitable/app-table-view.d.ts +18 -0
- package/src/tools/oapi/bitable/app-table-view.d.ts.map +1 -0
- package/src/tools/oapi/bitable/app-table-view.js +197 -0
- package/src/tools/oapi/bitable/app-table-view.js.map +1 -0
- package/src/tools/oapi/bitable/app-table.d.ts +20 -0
- package/src/tools/oapi/bitable/app-table.d.ts.map +1 -0
- package/src/tools/oapi/bitable/app-table.js +249 -0
- package/src/tools/oapi/bitable/app-table.js.map +1 -0
- package/src/tools/oapi/bitable/app.d.ts +19 -0
- package/src/tools/oapi/bitable/app.d.ts.map +1 -0
- package/src/tools/oapi/bitable/app.js +188 -0
- package/src/tools/oapi/bitable/app.js.map +1 -0
- package/src/tools/oapi/bitable/index.d.ts +10 -0
- package/src/tools/oapi/bitable/index.d.ts.map +1 -0
- package/src/tools/oapi/bitable/index.js +10 -0
- package/src/tools/oapi/bitable/index.js.map +1 -0
- package/src/tools/oapi/calendar/calendar.d.ts +16 -0
- package/src/tools/oapi/calendar/calendar.d.ts.map +1 -0
- package/src/tools/oapi/calendar/calendar.js +124 -0
- package/src/tools/oapi/calendar/calendar.js.map +1 -0
- package/src/tools/oapi/calendar/event-attendee.d.ts +17 -0
- package/src/tools/oapi/calendar/event-attendee.d.ts.map +1 -0
- package/src/tools/oapi/calendar/event-attendee.js +275 -0
- package/src/tools/oapi/calendar/event-attendee.js.map +1 -0
- package/src/tools/oapi/calendar/event.d.ts +17 -0
- package/src/tools/oapi/calendar/event.d.ts.map +1 -0
- package/src/tools/oapi/calendar/event.js +721 -0
- package/src/tools/oapi/calendar/event.js.map +1 -0
- package/src/tools/oapi/calendar/freebusy.d.ts +14 -0
- package/src/tools/oapi/calendar/freebusy.d.ts.map +1 -0
- package/src/tools/oapi/calendar/freebusy.js +113 -0
- package/src/tools/oapi/calendar/freebusy.js.map +1 -0
- package/src/tools/oapi/calendar/index.d.ts +9 -0
- package/src/tools/oapi/calendar/index.d.ts.map +1 -0
- package/src/tools/oapi/calendar/index.js +9 -0
- package/src/tools/oapi/calendar/index.js.map +1 -0
- package/src/tools/oapi/chat/chat.d.ts +17 -0
- package/src/tools/oapi/chat/chat.d.ts.map +1 -0
- package/src/tools/oapi/chat/chat.js +126 -0
- package/src/tools/oapi/chat/chat.js.map +1 -0
- package/src/tools/oapi/chat/index.d.ts +11 -0
- package/src/tools/oapi/chat/index.d.ts.map +1 -0
- package/src/tools/oapi/chat/index.js +16 -0
- package/src/tools/oapi/chat/index.js.map +1 -0
- package/src/tools/oapi/chat/members.d.ts +12 -0
- package/src/tools/oapi/chat/members.d.ts.map +1 -0
- package/src/tools/oapi/chat/members.js +83 -0
- package/src/tools/oapi/chat/members.js.map +1 -0
- package/src/tools/oapi/common/get-user.d.ts +13 -0
- package/src/tools/oapi/common/get-user.d.ts.map +1 -0
- package/src/tools/oapi/common/get-user.js +108 -0
- package/src/tools/oapi/common/get-user.js.map +1 -0
- package/src/tools/oapi/common/index.d.ts +7 -0
- package/src/tools/oapi/common/index.d.ts.map +1 -0
- package/src/tools/oapi/common/index.js +7 -0
- package/src/tools/oapi/common/index.js.map +1 -0
- package/src/tools/oapi/common/search-user.d.ts +12 -0
- package/src/tools/oapi/common/search-user.d.ts.map +1 -0
- package/src/tools/oapi/common/search-user.js +75 -0
- package/src/tools/oapi/common/search-user.js.map +1 -0
- package/src/tools/oapi/drive/doc-comments.d.ts +16 -0
- package/src/tools/oapi/drive/doc-comments.d.ts.map +1 -0
- package/src/tools/oapi/drive/doc-comments.js +288 -0
- package/src/tools/oapi/drive/doc-comments.js.map +1 -0
- package/src/tools/oapi/drive/doc-media.d.ts +20 -0
- package/src/tools/oapi/drive/doc-media.d.ts.map +1 -0
- package/src/tools/oapi/drive/doc-media.js +337 -0
- package/src/tools/oapi/drive/doc-media.js.map +1 -0
- package/src/tools/oapi/drive/file.d.ts +20 -0
- package/src/tools/oapi/drive/file.d.ts.map +1 -0
- package/src/tools/oapi/drive/file.js +485 -0
- package/src/tools/oapi/drive/file.js.map +1 -0
- package/src/tools/oapi/drive/index.d.ts +13 -0
- package/src/tools/oapi/drive/index.d.ts.map +1 -0
- package/src/tools/oapi/drive/index.js +37 -0
- package/src/tools/oapi/drive/index.js.map +1 -0
- package/src/tools/oapi/helpers.d.ts +174 -0
- package/src/tools/oapi/helpers.d.ts.map +1 -0
- package/src/tools/oapi/helpers.js +341 -0
- package/src/tools/oapi/helpers.js.map +1 -0
- package/src/tools/oapi/im/format-messages.d.ts +51 -0
- package/src/tools/oapi/im/format-messages.d.ts.map +1 -0
- package/src/tools/oapi/im/format-messages.js +166 -0
- package/src/tools/oapi/im/format-messages.js.map +1 -0
- package/src/tools/oapi/im/index.d.ts +11 -0
- package/src/tools/oapi/im/index.d.ts.map +1 -0
- package/src/tools/oapi/im/index.js +18 -0
- package/src/tools/oapi/im/index.js.map +1 -0
- package/src/tools/oapi/im/message-read.d.ts +14 -0
- package/src/tools/oapi/im/message-read.d.ts.map +1 -0
- package/src/tools/oapi/im/message-read.js +412 -0
- package/src/tools/oapi/im/message-read.js.map +1 -0
- package/src/tools/oapi/im/message.d.ts +17 -0
- package/src/tools/oapi/im/message.d.ts.map +1 -0
- package/src/tools/oapi/im/message.js +171 -0
- package/src/tools/oapi/im/message.js.map +1 -0
- package/src/tools/oapi/im/resource.d.ts +14 -0
- package/src/tools/oapi/im/resource.d.ts.map +1 -0
- package/src/tools/oapi/im/resource.js +152 -0
- package/src/tools/oapi/im/resource.js.map +1 -0
- package/src/tools/oapi/im/time-utils.d.ts +47 -0
- package/src/tools/oapi/im/time-utils.d.ts.map +1 -0
- package/src/tools/oapi/im/time-utils.js +202 -0
- package/src/tools/oapi/im/time-utils.js.map +1 -0
- package/src/tools/oapi/im/user-name-uat.d.ts +24 -0
- package/src/tools/oapi/im/user-name-uat.d.ts.map +1 -0
- package/src/tools/oapi/im/user-name-uat.js +128 -0
- package/src/tools/oapi/im/user-name-uat.js.map +1 -0
- package/src/tools/oapi/index.d.ts +12 -0
- package/src/tools/oapi/index.d.ts.map +1 -0
- package/src/tools/oapi/index.js +59 -0
- package/src/tools/oapi/index.js.map +1 -0
- package/src/tools/oapi/sdk-types.d.ts +97 -0
- package/src/tools/oapi/sdk-types.d.ts.map +1 -0
- package/src/tools/oapi/sdk-types.js +13 -0
- package/src/tools/oapi/sdk-types.js.map +1 -0
- package/src/tools/oapi/search/doc-search.d.ts +14 -0
- package/src/tools/oapi/search/doc-search.d.ts.map +1 -0
- package/src/tools/oapi/search/doc-search.js +203 -0
- package/src/tools/oapi/search/doc-search.js.map +1 -0
- package/src/tools/oapi/search/index.d.ts +13 -0
- package/src/tools/oapi/search/index.d.ts.map +1 -0
- package/src/tools/oapi/search/index.js +34 -0
- package/src/tools/oapi/search/index.js.map +1 -0
- package/src/tools/oapi/sheets/index.d.ts +13 -0
- package/src/tools/oapi/sheets/index.d.ts.map +1 -0
- package/src/tools/oapi/sheets/index.js +32 -0
- package/src/tools/oapi/sheets/index.js.map +1 -0
- package/src/tools/oapi/sheets/sheet.d.ts +17 -0
- package/src/tools/oapi/sheets/sheet.d.ts.map +1 -0
- package/src/tools/oapi/sheets/sheet.js +652 -0
- package/src/tools/oapi/sheets/sheet.js.map +1 -0
- package/src/tools/oapi/task/comment.d.ts +16 -0
- package/src/tools/oapi/task/comment.d.ts.map +1 -0
- package/src/tools/oapi/task/comment.js +142 -0
- package/src/tools/oapi/task/comment.js.map +1 -0
- package/src/tools/oapi/task/index.d.ts +9 -0
- package/src/tools/oapi/task/index.d.ts.map +1 -0
- package/src/tools/oapi/task/index.js +9 -0
- package/src/tools/oapi/task/index.js.map +1 -0
- package/src/tools/oapi/task/subtask.d.ts +15 -0
- package/src/tools/oapi/task/subtask.d.ts.map +1 -0
- package/src/tools/oapi/task/subtask.js +164 -0
- package/src/tools/oapi/task/subtask.js.map +1 -0
- package/src/tools/oapi/task/task.d.ts +17 -0
- package/src/tools/oapi/task/task.d.ts.map +1 -0
- package/src/tools/oapi/task/task.js +346 -0
- package/src/tools/oapi/task/task.js.map +1 -0
- package/src/tools/oapi/task/tasklist.d.ts +22 -0
- package/src/tools/oapi/task/tasklist.d.ts.map +1 -0
- package/src/tools/oapi/task/tasklist.js +323 -0
- package/src/tools/oapi/task/tasklist.js.map +1 -0
- package/src/tools/oapi/wiki/index.d.ts +13 -0
- package/src/tools/oapi/wiki/index.d.ts.map +1 -0
- package/src/tools/oapi/wiki/index.js +35 -0
- package/src/tools/oapi/wiki/index.js.map +1 -0
- package/src/tools/oapi/wiki/space-node.d.ts +18 -0
- package/src/tools/oapi/wiki/space-node.d.ts.map +1 -0
- package/src/tools/oapi/wiki/space-node.js +253 -0
- package/src/tools/oapi/wiki/space-node.js.map +1 -0
- package/src/tools/oapi/wiki/space.d.ts +16 -0
- package/src/tools/oapi/wiki/space.d.ts.map +1 -0
- package/src/tools/oapi/wiki/space.js +132 -0
- package/src/tools/oapi/wiki/space.js.map +1 -0
- package/src/tools/oauth-batch-auth.d.ts +12 -0
- package/src/tools/oauth-batch-auth.d.ts.map +1 -0
- package/src/tools/oauth-batch-auth.js +142 -0
- package/src/tools/oauth-batch-auth.js.map +1 -0
- package/src/tools/oauth-cards.d.ts +27 -0
- package/src/tools/oauth-cards.d.ts.map +1 -0
- package/src/tools/oauth-cards.js +251 -0
- package/src/tools/oauth-cards.js.map +1 -0
- package/src/tools/oauth.d.ts +48 -0
- package/src/tools/oauth.d.ts.map +1 -0
- package/src/tools/oauth.js +619 -0
- package/src/tools/oauth.js.map +1 -0
- package/src/tools/onboarding-auth.d.ts +28 -0
- package/src/tools/onboarding-auth.d.ts.map +1 -0
- package/src/tools/onboarding-auth.js +131 -0
- package/src/tools/onboarding-auth.js.map +1 -0
- package/src/tools/tat/im/index.d.ts +16 -0
- package/src/tools/tat/im/index.d.ts.map +1 -0
- package/src/tools/tat/im/index.js +19 -0
- package/src/tools/tat/im/index.js.map +1 -0
- package/src/tools/tat/im/resource.d.ts +16 -0
- package/src/tools/tat/im/resource.d.ts.map +1 -0
- package/src/tools/tat/im/resource.js +158 -0
- 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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"}
|