@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,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* Side-effect functions for the inbound message gate.
|
|
6
|
+
*
|
|
7
|
+
* Extracted from gate.ts to separate pure policy decisions from I/O
|
|
8
|
+
* operations (pairing request creation, message sending).
|
|
9
|
+
*/
|
|
10
|
+
import { LarkClient } from '../../core/lark-client';
|
|
11
|
+
import { sendMessageFeishu } from '../outbound/send';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Pairing reply
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/**
|
|
16
|
+
* Create a pairing request and send a pairing reply message to the user.
|
|
17
|
+
*
|
|
18
|
+
* This is the side-effect portion of the DM pairing gate: the pure
|
|
19
|
+
* policy decision (whether to pair) is made in gate.ts, and this
|
|
20
|
+
* function executes the resulting I/O.
|
|
21
|
+
*/
|
|
22
|
+
export async function sendPairingReply(params) {
|
|
23
|
+
const { senderId, chatId, accountId, accountScopedCfg } = params;
|
|
24
|
+
const core = LarkClient.runtime;
|
|
25
|
+
const { code } = await core.channel.pairing.upsertPairingRequest({
|
|
26
|
+
channel: 'feishu',
|
|
27
|
+
id: senderId,
|
|
28
|
+
accountId,
|
|
29
|
+
});
|
|
30
|
+
const pairingReply = core.channel.pairing.buildPairingReply({
|
|
31
|
+
channel: 'feishu',
|
|
32
|
+
idLine: senderId,
|
|
33
|
+
code,
|
|
34
|
+
});
|
|
35
|
+
if (accountScopedCfg) {
|
|
36
|
+
await sendMessageFeishu({
|
|
37
|
+
cfg: accountScopedCfg,
|
|
38
|
+
to: chatId,
|
|
39
|
+
text: pairingReply,
|
|
40
|
+
accountId,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=gate-effects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-effects.js","sourceRoot":"","sources":["../../../../src/messaging/inbound/gate-effects.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAKtC;IACC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;IACjE,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC;IAEhC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC;QAC/D,OAAO,EAAE,QAAQ;QACjB,EAAE,EAAE,QAAQ;QACZ,SAAS;KACV,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC1D,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,QAAQ;QAChB,IAAI;KACL,CAAC,CAAC;IAEH,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,iBAAiB,CAAC;YACtB,GAAG,EAAE,gBAAgB;YACrB,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,YAAY;YAClB,SAAS;SACV,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* Policy gate for inbound Feishu messages.
|
|
6
|
+
*
|
|
7
|
+
* Determines whether a parsed message should be processed or rejected
|
|
8
|
+
* based on group/DM access policies, sender allowlists, and mention
|
|
9
|
+
* requirements.
|
|
10
|
+
*
|
|
11
|
+
* Group access follows the same two-layer model as Telegram:
|
|
12
|
+
*
|
|
13
|
+
* Layer 1 – Which GROUPS are allowed (SDK `resolveGroupPolicy`):
|
|
14
|
+
* - No `groups` configured + `groupPolicy: "open"` → any group passes
|
|
15
|
+
* - `groupPolicy: "allowlist"` or `groups` configured → acts as allowlist
|
|
16
|
+
* (explicit group IDs or `"*"` wildcard)
|
|
17
|
+
* - `groupPolicy: "disabled"` → all groups blocked
|
|
18
|
+
*
|
|
19
|
+
* Layer 2 – Which SENDERS are allowed within a group:
|
|
20
|
+
* - Per-group `groupPolicy` overrides global for sender filtering
|
|
21
|
+
* - `groupAllowFrom` (global) + per-group `allowFrom` are merged
|
|
22
|
+
* - `"open"` → any sender; `"allowlist"` → check merged list;
|
|
23
|
+
* `"disabled"` → block all senders
|
|
24
|
+
*/
|
|
25
|
+
import type { ClawdbotConfig, HistoryEntry } from 'openclaw/plugin-sdk';
|
|
26
|
+
import type { MessageContext } from '../types';
|
|
27
|
+
import type { FeishuConfig } from '../../core/types';
|
|
28
|
+
import type { LarkAccount } from '../../core/types';
|
|
29
|
+
/**
|
|
30
|
+
* Read the pairing allowFrom store for the Feishu channel via the SDK runtime.
|
|
31
|
+
*/
|
|
32
|
+
declare function readAllowFromStore(accountId: string): Promise<string[]>;
|
|
33
|
+
export interface GateResult {
|
|
34
|
+
allowed: boolean;
|
|
35
|
+
reason?: string;
|
|
36
|
+
/** When a group message is rejected due to missing bot mention, the
|
|
37
|
+
* caller should record this entry into the chat history map. */
|
|
38
|
+
historyEntry?: HistoryEntry;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Read the pairing allowFrom store for the Feishu channel.
|
|
42
|
+
*
|
|
43
|
+
* Exported so that handler.ts can provide it as a closure to the SDK's
|
|
44
|
+
* `resolveSenderCommandAuthorization` helper.
|
|
45
|
+
*/
|
|
46
|
+
export { readAllowFromStore as readFeishuAllowFromStore };
|
|
47
|
+
/**
|
|
48
|
+
* Check whether an inbound message passes all access-control gates.
|
|
49
|
+
*
|
|
50
|
+
* The DM gate is async because it may read from the pairing store
|
|
51
|
+
* and send pairing request messages.
|
|
52
|
+
*/
|
|
53
|
+
export declare function checkMessageGate(params: {
|
|
54
|
+
ctx: MessageContext;
|
|
55
|
+
accountFeishuCfg?: FeishuConfig;
|
|
56
|
+
account: LarkAccount;
|
|
57
|
+
/** account 级别的 ClawdbotConfig(channels.feishu 已替换为 per-account 合并后的配置) */
|
|
58
|
+
accountScopedCfg?: ClawdbotConfig;
|
|
59
|
+
log: (...args: unknown[]) => void;
|
|
60
|
+
}): Promise<GateResult>;
|
|
61
|
+
//# sourceMappingURL=gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../../../src/messaging/inbound/gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAmBpD;;GAEG;AACH,iBAAe,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAMtE;AAMD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;qEACiE;IACjE,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAMD;;;;;GAKG;AACH,OAAO,EAAE,kBAAkB,IAAI,wBAAwB,EAAE,CAAC;AAE1D;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,GAAG,EAAE,cAAc,CAAC;IACpB,gBAAgB,CAAC,EAAE,YAAY,CAAC;IAChC,OAAO,EAAE,WAAW,CAAC;IACrB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,cAAc,CAAC;IAClC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACnC,GAAG,OAAO,CAAC,UAAU,CAAC,CAStB"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* Policy gate for inbound Feishu messages.
|
|
6
|
+
*
|
|
7
|
+
* Determines whether a parsed message should be processed or rejected
|
|
8
|
+
* based on group/DM access policies, sender allowlists, and mention
|
|
9
|
+
* requirements.
|
|
10
|
+
*
|
|
11
|
+
* Group access follows the same two-layer model as Telegram:
|
|
12
|
+
*
|
|
13
|
+
* Layer 1 – Which GROUPS are allowed (SDK `resolveGroupPolicy`):
|
|
14
|
+
* - No `groups` configured + `groupPolicy: "open"` → any group passes
|
|
15
|
+
* - `groupPolicy: "allowlist"` or `groups` configured → acts as allowlist
|
|
16
|
+
* (explicit group IDs or `"*"` wildcard)
|
|
17
|
+
* - `groupPolicy: "disabled"` → all groups blocked
|
|
18
|
+
*
|
|
19
|
+
* Layer 2 – Which SENDERS are allowed within a group:
|
|
20
|
+
* - Per-group `groupPolicy` overrides global for sender filtering
|
|
21
|
+
* - `groupAllowFrom` (global) + per-group `allowFrom` are merged
|
|
22
|
+
* - `"open"` → any sender; `"allowlist"` → check merged list;
|
|
23
|
+
* `"disabled"` → block all senders
|
|
24
|
+
*/
|
|
25
|
+
import { LarkClient } from '../../core/lark-client';
|
|
26
|
+
import { resolveFeishuGroupConfig, resolveFeishuAllowlistMatch, isFeishuGroupAllowed, splitLegacyGroupAllowFrom, resolveGroupSenderPolicyContext, } from './policy';
|
|
27
|
+
import { mentionedBot } from './mention';
|
|
28
|
+
import { sendPairingReply } from './gate-effects';
|
|
29
|
+
/** Prevent spamming the legacy groupAllowFrom migration warning. */
|
|
30
|
+
let legacyGroupAllowFromWarned = false;
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// Helpers
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
/**
|
|
35
|
+
* Read the pairing allowFrom store for the Feishu channel via the SDK runtime.
|
|
36
|
+
*/
|
|
37
|
+
async function readAllowFromStore(accountId) {
|
|
38
|
+
const core = LarkClient.runtime;
|
|
39
|
+
return await core.channel.pairing.readAllowFromStore({
|
|
40
|
+
channel: 'feishu',
|
|
41
|
+
accountId,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Public API
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
/**
|
|
48
|
+
* Read the pairing allowFrom store for the Feishu channel.
|
|
49
|
+
*
|
|
50
|
+
* Exported so that handler.ts can provide it as a closure to the SDK's
|
|
51
|
+
* `resolveSenderCommandAuthorization` helper.
|
|
52
|
+
*/
|
|
53
|
+
export { readAllowFromStore as readFeishuAllowFromStore };
|
|
54
|
+
/**
|
|
55
|
+
* Check whether an inbound message passes all access-control gates.
|
|
56
|
+
*
|
|
57
|
+
* The DM gate is async because it may read from the pairing store
|
|
58
|
+
* and send pairing request messages.
|
|
59
|
+
*/
|
|
60
|
+
export async function checkMessageGate(params) {
|
|
61
|
+
const { ctx, accountFeishuCfg, account, accountScopedCfg, log } = params;
|
|
62
|
+
const isGroup = ctx.chatType === 'group';
|
|
63
|
+
if (isGroup) {
|
|
64
|
+
return checkGroupGate({ ctx, accountFeishuCfg, account, accountScopedCfg, log });
|
|
65
|
+
}
|
|
66
|
+
return checkDmGate({ ctx, accountFeishuCfg, account, accountScopedCfg, log });
|
|
67
|
+
}
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// Internal: group gate
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
function checkGroupGate(params) {
|
|
72
|
+
const { ctx, accountFeishuCfg, account, accountScopedCfg, log } = params;
|
|
73
|
+
const core = LarkClient.runtime;
|
|
74
|
+
// ---- Legacy compat: groupAllowFrom with chat_id entries ----
|
|
75
|
+
// Older Feishu configs used groupAllowFrom with chat_ids (oc_xxx) to
|
|
76
|
+
// control which groups are allowed. The correct semantic (aligned with
|
|
77
|
+
// Telegram) is sender_ids. Detect and split so both layers still work.
|
|
78
|
+
const rawGroupAllowFrom = accountFeishuCfg?.groupAllowFrom ?? [];
|
|
79
|
+
const { legacyChatIds, senderAllowFrom: senderGroupAllowFrom } = splitLegacyGroupAllowFrom(rawGroupAllowFrom);
|
|
80
|
+
if (legacyChatIds.length > 0 && !legacyGroupAllowFromWarned) {
|
|
81
|
+
legacyGroupAllowFromWarned = true;
|
|
82
|
+
log(`feishu[${account.accountId}]: ⚠️ groupAllowFrom contains chat_id entries ` +
|
|
83
|
+
`(${legacyChatIds.join(', ')}). groupAllowFrom is for SENDER filtering ` +
|
|
84
|
+
`(open_ids like ou_xxx). Please move chat_ids to "groups" config instead:\n` +
|
|
85
|
+
` channels.feishu.groups: {\n` +
|
|
86
|
+
legacyChatIds.map((id) => ` "${id}": {},`).join('\n') +
|
|
87
|
+
`\n }`);
|
|
88
|
+
}
|
|
89
|
+
// ---- Layer 1: Group-level access (SDK) ----
|
|
90
|
+
// The SDK reads `channels.feishu.groups` as an allowlist of group IDs.
|
|
91
|
+
// - No groups configured + groupPolicy "open" → any group passes
|
|
92
|
+
// - groupPolicy "allowlist" (or groups configured) → only listed groups pass
|
|
93
|
+
// - groupPolicy "disabled" → all groups blocked
|
|
94
|
+
const groupAccess = core.channel.groups.resolveGroupPolicy({
|
|
95
|
+
cfg: accountScopedCfg ?? {},
|
|
96
|
+
channel: 'feishu',
|
|
97
|
+
groupId: ctx.chatId,
|
|
98
|
+
accountId: account.accountId,
|
|
99
|
+
groupIdCaseInsensitive: true,
|
|
100
|
+
hasGroupAllowFrom: senderGroupAllowFrom.length > 0,
|
|
101
|
+
});
|
|
102
|
+
// Legacy compat: if SDK rejects the group but the chat_id is in the
|
|
103
|
+
// old-style groupAllowFrom, allow it (backward compatibility).
|
|
104
|
+
// Track whether this group was admitted via legacy path so we can skip
|
|
105
|
+
// sender filtering below (old semantic: chat_id in groupAllowFrom meant
|
|
106
|
+
// "allow this group for any sender").
|
|
107
|
+
let legacyGroupAdmit = false;
|
|
108
|
+
if (!groupAccess.allowed) {
|
|
109
|
+
const chatIdLower = ctx.chatId.toLowerCase();
|
|
110
|
+
const legacyMatch = legacyChatIds.some((id) => String(id).toLowerCase() === chatIdLower);
|
|
111
|
+
if (!legacyMatch) {
|
|
112
|
+
log(`feishu[${account.accountId}]: group ${ctx.chatId} blocked by group-level policy`);
|
|
113
|
+
return { allowed: false, reason: 'group_not_allowed' };
|
|
114
|
+
}
|
|
115
|
+
legacyGroupAdmit = true;
|
|
116
|
+
}
|
|
117
|
+
// ---- Per-group config (Feishu-specific fields) ----
|
|
118
|
+
const groupConfig = resolveFeishuGroupConfig({
|
|
119
|
+
cfg: accountFeishuCfg,
|
|
120
|
+
groupId: ctx.chatId,
|
|
121
|
+
});
|
|
122
|
+
const defaultConfig = accountFeishuCfg?.groups?.['*'];
|
|
123
|
+
// Per-group enabled flag
|
|
124
|
+
const enabled = groupConfig?.enabled ?? defaultConfig?.enabled;
|
|
125
|
+
if (enabled === false) {
|
|
126
|
+
log(`feishu[${account.accountId}]: group ${ctx.chatId} disabled by per-group config`);
|
|
127
|
+
return { allowed: false, reason: 'group_disabled' };
|
|
128
|
+
}
|
|
129
|
+
// ---- Layer 2: Sender-level access ----
|
|
130
|
+
// Per-group groupPolicy overrides the global groupPolicy for sender filtering.
|
|
131
|
+
// senderGroupAllowFrom (global, oc_ entries excluded) + per-group allowFrom.
|
|
132
|
+
//
|
|
133
|
+
// Legacy compat: when a group was admitted via old-style chat_id in
|
|
134
|
+
// groupAllowFrom AND there is no explicit per-group sender config,
|
|
135
|
+
// skip sender filtering (old semantic = "group allowed, any sender").
|
|
136
|
+
const hasExplicitSenderConfig = senderGroupAllowFrom.length > 0 || (groupConfig?.allowFrom ?? []).length > 0 || groupConfig?.groupPolicy != null;
|
|
137
|
+
if (!(legacyGroupAdmit && !hasExplicitSenderConfig)) {
|
|
138
|
+
const { senderPolicy, senderAllowFrom } = resolveGroupSenderPolicyContext({
|
|
139
|
+
groupConfig,
|
|
140
|
+
defaultConfig,
|
|
141
|
+
accountFeishuCfg,
|
|
142
|
+
senderGroupAllowFrom,
|
|
143
|
+
});
|
|
144
|
+
const senderAllowed = isFeishuGroupAllowed({
|
|
145
|
+
groupPolicy: senderPolicy,
|
|
146
|
+
allowFrom: senderAllowFrom,
|
|
147
|
+
senderId: ctx.senderId,
|
|
148
|
+
senderName: ctx.senderName,
|
|
149
|
+
});
|
|
150
|
+
if (!senderAllowed) {
|
|
151
|
+
log(`feishu[${account.accountId}]: sender ${ctx.senderId} not allowed in group ${ctx.chatId}`);
|
|
152
|
+
return { allowed: false, reason: 'sender_not_allowed' };
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// ---- Mention requirement (SDK) ----
|
|
156
|
+
// SDK precedence: per-group > default ("*") > requireMentionOverride > true
|
|
157
|
+
const requireMention = core.channel.groups.resolveRequireMention({
|
|
158
|
+
cfg: accountScopedCfg ?? {},
|
|
159
|
+
channel: 'feishu',
|
|
160
|
+
groupId: ctx.chatId,
|
|
161
|
+
accountId: account.accountId,
|
|
162
|
+
groupIdCaseInsensitive: true,
|
|
163
|
+
requireMentionOverride: accountFeishuCfg?.requireMention,
|
|
164
|
+
});
|
|
165
|
+
if (requireMention && !mentionedBot(ctx)) {
|
|
166
|
+
log(`feishu[${account.accountId}]: message in group ${ctx.chatId} did not mention bot, recording to history`);
|
|
167
|
+
return {
|
|
168
|
+
allowed: false,
|
|
169
|
+
reason: 'no_mention',
|
|
170
|
+
historyEntry: {
|
|
171
|
+
sender: ctx.senderId,
|
|
172
|
+
body: `${ctx.senderName ?? ctx.senderId}: ${ctx.content}`,
|
|
173
|
+
timestamp: Date.now(),
|
|
174
|
+
messageId: ctx.messageId,
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
return { allowed: true };
|
|
179
|
+
}
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
// Internal: DM gate
|
|
182
|
+
// ---------------------------------------------------------------------------
|
|
183
|
+
async function checkDmGate(params) {
|
|
184
|
+
const { ctx, accountFeishuCfg, account, accountScopedCfg, log } = params;
|
|
185
|
+
const dmPolicy = accountFeishuCfg?.dmPolicy ?? 'pairing';
|
|
186
|
+
const configAllowFrom = accountFeishuCfg?.allowFrom ?? [];
|
|
187
|
+
if (dmPolicy === 'disabled') {
|
|
188
|
+
log(`feishu[${account.accountId}]: DM disabled by policy, rejecting sender ${ctx.senderId}`);
|
|
189
|
+
return { allowed: false, reason: 'dm_disabled' };
|
|
190
|
+
}
|
|
191
|
+
if (dmPolicy === 'open') {
|
|
192
|
+
return { allowed: true };
|
|
193
|
+
}
|
|
194
|
+
if (dmPolicy === 'allowlist') {
|
|
195
|
+
const storeAllowFrom = await readAllowFromStore(account.accountId).catch(() => []);
|
|
196
|
+
const combinedAllowFrom = [...configAllowFrom, ...storeAllowFrom];
|
|
197
|
+
const match = resolveFeishuAllowlistMatch({
|
|
198
|
+
allowFrom: combinedAllowFrom,
|
|
199
|
+
senderId: ctx.senderId,
|
|
200
|
+
senderName: ctx.senderName,
|
|
201
|
+
});
|
|
202
|
+
if (!match.allowed) {
|
|
203
|
+
log(`feishu[${account.accountId}]: sender ${ctx.senderId} not in DM allowlist`);
|
|
204
|
+
return { allowed: false, reason: 'dm_not_allowed' };
|
|
205
|
+
}
|
|
206
|
+
return { allowed: true };
|
|
207
|
+
}
|
|
208
|
+
// dmPolicy === "pairing"
|
|
209
|
+
const storeAllowFrom = await readAllowFromStore(account.accountId).catch(() => []);
|
|
210
|
+
const combinedAllowFrom = [...configAllowFrom, ...storeAllowFrom];
|
|
211
|
+
const match = resolveFeishuAllowlistMatch({
|
|
212
|
+
allowFrom: combinedAllowFrom,
|
|
213
|
+
senderId: ctx.senderId,
|
|
214
|
+
senderName: ctx.senderName,
|
|
215
|
+
});
|
|
216
|
+
if (match.allowed) {
|
|
217
|
+
return { allowed: true };
|
|
218
|
+
}
|
|
219
|
+
// Sender not yet paired — create a pairing request and notify them
|
|
220
|
+
log(`feishu[${account.accountId}]: sender ${ctx.senderId} not paired, creating pairing request`);
|
|
221
|
+
try {
|
|
222
|
+
await sendPairingReply({
|
|
223
|
+
senderId: ctx.senderId,
|
|
224
|
+
chatId: ctx.chatId,
|
|
225
|
+
accountId: account.accountId,
|
|
226
|
+
accountScopedCfg,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
catch (err) {
|
|
230
|
+
log(`feishu[${account.accountId}]: failed to create pairing request for ${ctx.senderId}: ${String(err)}`);
|
|
231
|
+
}
|
|
232
|
+
return { allowed: false, reason: 'pairing_pending' };
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../../../src/messaging/inbound/gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* Inbound message handling pipeline for the Feishu/Lark channel plugin.
|
|
6
|
+
*
|
|
7
|
+
* Orchestrates a seven-stage pipeline:
|
|
8
|
+
* 1. Account resolution
|
|
9
|
+
* 2. Event parsing → parse.ts (merge_forward expanded in-place)
|
|
10
|
+
* 3. Sender enrichment → enrich.ts (lightweight, before gate)
|
|
11
|
+
* 4. Policy gate → gate.ts
|
|
12
|
+
* 5. User name prefetch → enrich.ts (batch cache warm-up)
|
|
13
|
+
* 6. Content resolution → enrich.ts (media / quote, parallel)
|
|
14
|
+
* 7. Agent dispatch → dispatch.ts
|
|
15
|
+
*/
|
|
16
|
+
import type { ClawdbotConfig, RuntimeEnv } from 'openclaw/plugin-sdk';
|
|
17
|
+
import { type HistoryEntry } from 'openclaw/plugin-sdk';
|
|
18
|
+
import type { FeishuMessageEvent } from '../types';
|
|
19
|
+
export declare function handleFeishuMessage(params: {
|
|
20
|
+
cfg: ClawdbotConfig;
|
|
21
|
+
event: FeishuMessageEvent;
|
|
22
|
+
botOpenId?: string;
|
|
23
|
+
runtime?: RuntimeEnv;
|
|
24
|
+
chatHistories?: Map<string, HistoryEntry[]>;
|
|
25
|
+
accountId?: string;
|
|
26
|
+
/** Override the message ID used for reply threading (typing indicators,
|
|
27
|
+
* card replies, etc.). Useful for synthetic messages whose message_id
|
|
28
|
+
* is not a real Feishu message ID. */
|
|
29
|
+
replyToMessageId?: string;
|
|
30
|
+
/** When true, skip the policy gate (mention requirement, allowlist).
|
|
31
|
+
* Used for synthetic messages that are not real user messages. */
|
|
32
|
+
forceMention?: boolean;
|
|
33
|
+
/** When true, skip the typing indicator for this dispatch (e.g. reactions). */
|
|
34
|
+
skipTyping?: boolean;
|
|
35
|
+
}): Promise<void>;
|
|
36
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/messaging/inbound/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAwBnD,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;2CAEuC;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;uEACmE;IACnE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkKhB"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* Inbound message handling pipeline for the Feishu/Lark channel plugin.
|
|
6
|
+
*
|
|
7
|
+
* Orchestrates a seven-stage pipeline:
|
|
8
|
+
* 1. Account resolution
|
|
9
|
+
* 2. Event parsing → parse.ts (merge_forward expanded in-place)
|
|
10
|
+
* 3. Sender enrichment → enrich.ts (lightweight, before gate)
|
|
11
|
+
* 4. Policy gate → gate.ts
|
|
12
|
+
* 5. User name prefetch → enrich.ts (batch cache warm-up)
|
|
13
|
+
* 6. Content resolution → enrich.ts (media / quote, parallel)
|
|
14
|
+
* 7. Agent dispatch → dispatch.ts
|
|
15
|
+
*/
|
|
16
|
+
import { recordPendingHistoryEntryIfEnabled, DEFAULT_GROUP_HISTORY_LIMIT, resolveSenderCommandAuthorization, isNormalizedSenderAllowed, } from 'openclaw/plugin-sdk';
|
|
17
|
+
import { getLarkAccount } from '../../core/accounts';
|
|
18
|
+
import { LarkClient } from '../../core/lark-client';
|
|
19
|
+
import { larkLogger } from '../../core/lark-logger';
|
|
20
|
+
import { ticketElapsed } from '../../core/lark-ticket';
|
|
21
|
+
import { parseMessageEvent } from './parse';
|
|
22
|
+
import { resolveSenderInfo, prefetchUserNames, resolveMedia, resolveQuotedContent, substituteMediaPaths, } from './enrich';
|
|
23
|
+
import { checkMessageGate, readFeishuAllowFromStore } from './gate';
|
|
24
|
+
import { dispatchToAgent } from './dispatch';
|
|
25
|
+
import { resolveFeishuGroupConfig, splitLegacyGroupAllowFrom } from './policy';
|
|
26
|
+
import { threadScopedKey } from '../../channel/chat-queue';
|
|
27
|
+
const logger = larkLogger('inbound/handler');
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Public: handle inbound message
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
export async function handleFeishuMessage(params) {
|
|
32
|
+
const { cfg, event, botOpenId, runtime, chatHistories, accountId, replyToMessageId, forceMention, skipTyping } = params;
|
|
33
|
+
// 1. Account resolution
|
|
34
|
+
const account = getLarkAccount(cfg, accountId);
|
|
35
|
+
const accountFeishuCfg = account.config;
|
|
36
|
+
// ★ 多账号配置隔离:构造 account 级别的 ClawdbotConfig
|
|
37
|
+
//
|
|
38
|
+
// 在多账号场景下,每个 account 可以独立配置 groupPolicy / requireMention
|
|
39
|
+
// 等策略。但 SDK 的 resolveGroupPolicy / resolveRequireMention 等函数从
|
|
40
|
+
// cfg.channels.feishu 读取配置,而 cfg 是顶层全局配置,不包含 per-account
|
|
41
|
+
// 的覆盖值。
|
|
42
|
+
//
|
|
43
|
+
// 这里将 cfg.channels.feishu 替换为经过 getLarkAccount() 合并后的
|
|
44
|
+
// accountFeishuCfg(= base config + account override),确保下游所有 SDK 调用
|
|
45
|
+
// 都能正确读取当前 account 的配置。
|
|
46
|
+
const accountScopedCfg = {
|
|
47
|
+
...cfg,
|
|
48
|
+
channels: { ...cfg.channels, feishu: accountFeishuCfg },
|
|
49
|
+
};
|
|
50
|
+
const log = runtime?.log ?? ((...args) => logger.info(args.map(String).join(' ')));
|
|
51
|
+
const error = runtime?.error ?? ((...args) => logger.error(args.map(String).join(' ')));
|
|
52
|
+
// 2. Parse event → MessageContext (merge_forward expanded in-place)
|
|
53
|
+
let ctx = await parseMessageEvent(event, botOpenId, {
|
|
54
|
+
cfg: accountScopedCfg,
|
|
55
|
+
accountId: account.accountId,
|
|
56
|
+
});
|
|
57
|
+
// 3. Enrich (lightweight): sender name + permission error tracking
|
|
58
|
+
const { ctx: enrichedCtx, permissionError } = await resolveSenderInfo({
|
|
59
|
+
ctx,
|
|
60
|
+
account,
|
|
61
|
+
log,
|
|
62
|
+
});
|
|
63
|
+
ctx = enrichedCtx;
|
|
64
|
+
log(`feishu[${account.accountId}]: received message from ${ctx.senderId} in ${ctx.chatId} (${ctx.chatType})`);
|
|
65
|
+
logger.info(`received from ${ctx.senderId} in ${ctx.chatId} (${ctx.chatType})`);
|
|
66
|
+
const historyLimit = Math.max(0, accountFeishuCfg?.historyLimit ?? accountScopedCfg.messages?.groupChat?.historyLimit ?? DEFAULT_GROUP_HISTORY_LIMIT);
|
|
67
|
+
// 4. Gate: policy / access-control checks (skipped for synthetic messages)
|
|
68
|
+
const gate = forceMention
|
|
69
|
+
? { allowed: true }
|
|
70
|
+
: await checkMessageGate({ ctx, accountFeishuCfg, account, accountScopedCfg, log });
|
|
71
|
+
if (!gate.allowed) {
|
|
72
|
+
if (gate.reason === 'no_mention') {
|
|
73
|
+
logger.info(`rejected: no bot mention in group ${ctx.chatId}`);
|
|
74
|
+
}
|
|
75
|
+
// Record history entry if the gate produced one (group no-mention case)
|
|
76
|
+
if (gate.historyEntry && chatHistories) {
|
|
77
|
+
const historyKey = threadScopedKey(ctx.chatId, ctx.threadId);
|
|
78
|
+
recordPendingHistoryEntryIfEnabled({
|
|
79
|
+
historyMap: chatHistories,
|
|
80
|
+
historyKey,
|
|
81
|
+
limit: historyLimit,
|
|
82
|
+
entry: gate.historyEntry,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
// 5. Batch pre-warm user name cache (sender + mentions)
|
|
88
|
+
await prefetchUserNames({ ctx, account, log });
|
|
89
|
+
// 6. Enrich (heavyweight, after gate — parallel where possible)
|
|
90
|
+
const enrichParams = { ctx, accountScopedCfg, account, log };
|
|
91
|
+
const [mediaResult, quotedContent] = await Promise.all([
|
|
92
|
+
resolveMedia(enrichParams),
|
|
93
|
+
resolveQuotedContent(enrichParams),
|
|
94
|
+
]);
|
|
95
|
+
// 6b. Replace Feishu file-key placeholders in content with local
|
|
96
|
+
// file paths so the SDK can detect images for native vision and
|
|
97
|
+
// the AI receives meaningful file references.
|
|
98
|
+
if (mediaResult.mediaList.length > 0) {
|
|
99
|
+
ctx = {
|
|
100
|
+
...ctx,
|
|
101
|
+
content: substituteMediaPaths(ctx.content, mediaResult.mediaList),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
// 7. Compute commandAuthorized via SDK access group command gating
|
|
105
|
+
const core = LarkClient.runtime;
|
|
106
|
+
const isGroup = ctx.chatType === 'group';
|
|
107
|
+
const dmPolicy = accountFeishuCfg?.dmPolicy ?? 'pairing';
|
|
108
|
+
// Resolve per-group config early — shared by both command authorization
|
|
109
|
+
// and dispatch (step 8).
|
|
110
|
+
const groupConfig = isGroup ? resolveFeishuGroupConfig({ cfg: accountFeishuCfg, groupId: ctx.chatId }) : undefined;
|
|
111
|
+
const defaultGroupConfig = isGroup ? accountFeishuCfg?.groups?.['*'] : undefined;
|
|
112
|
+
// Build the sender allowlist for command authorization in group context.
|
|
113
|
+
// Excludes legacy oc_xxx chat-id entries (group admission, not sender identity).
|
|
114
|
+
//
|
|
115
|
+
// When the explicit group sender policy is "open", pass ["*"] to align
|
|
116
|
+
// command authorization with chat access (if you can chat, you can run
|
|
117
|
+
// commands). When no policy is configured (undefined fallback), default to
|
|
118
|
+
// allowlist behaviour — only users in accountFeishuCfg.allowFrom (owner list) or
|
|
119
|
+
// an explicit groupAllowFrom/per-group allowFrom can run commands.
|
|
120
|
+
const configuredGroupAllowFrom = (() => {
|
|
121
|
+
if (!isGroup)
|
|
122
|
+
return undefined;
|
|
123
|
+
// Exclude legacy oc_xxx chat-id entries from groupAllowFrom (sender filter only).
|
|
124
|
+
const { senderAllowFrom } = splitLegacyGroupAllowFrom(accountFeishuCfg?.groupAllowFrom ?? []);
|
|
125
|
+
const senderGroupAllowFrom = senderAllowFrom;
|
|
126
|
+
const perGroupAllowFrom = (groupConfig?.allowFrom ?? []).map(String);
|
|
127
|
+
const defaultSenderAllowFrom = !groupConfig && defaultGroupConfig?.allowFrom ? defaultGroupConfig.allowFrom.map(String) : [];
|
|
128
|
+
const combined = [...senderGroupAllowFrom, ...perGroupAllowFrom, ...defaultSenderAllowFrom];
|
|
129
|
+
if (combined.length > 0)
|
|
130
|
+
return combined;
|
|
131
|
+
// No allowFrom list configured — check if sender policy is explicitly "open".
|
|
132
|
+
// Do NOT fall back to "open" as a default: unset policy → allowlist behaviour.
|
|
133
|
+
const explicitSenderPolicy = groupConfig?.groupPolicy ?? defaultGroupConfig?.groupPolicy ?? accountFeishuCfg?.groupPolicy;
|
|
134
|
+
return explicitSenderPolicy === 'open' ? ['*'] : [];
|
|
135
|
+
})();
|
|
136
|
+
const { commandAuthorized } = await resolveSenderCommandAuthorization({
|
|
137
|
+
rawBody: ctx.content,
|
|
138
|
+
cfg: accountScopedCfg,
|
|
139
|
+
isGroup,
|
|
140
|
+
dmPolicy,
|
|
141
|
+
configuredAllowFrom: (accountFeishuCfg?.allowFrom ?? []).map(String),
|
|
142
|
+
configuredGroupAllowFrom,
|
|
143
|
+
senderId: ctx.senderId,
|
|
144
|
+
isSenderAllowed: (senderId, allowFrom) => isNormalizedSenderAllowed({ senderId, allowFrom }),
|
|
145
|
+
readAllowFromStore: () => readFeishuAllowFromStore(account.accountId),
|
|
146
|
+
shouldComputeCommandAuthorized: core.channel.commands.shouldComputeCommandAuthorized,
|
|
147
|
+
resolveCommandAuthorizedFromAuthorizers: core.channel.commands.resolveCommandAuthorizedFromAuthorizers,
|
|
148
|
+
});
|
|
149
|
+
// 8. Dispatch to agent
|
|
150
|
+
// groupConfig and defaultGroupConfig are already resolved above.
|
|
151
|
+
try {
|
|
152
|
+
await dispatchToAgent({
|
|
153
|
+
ctx,
|
|
154
|
+
permissionError,
|
|
155
|
+
mediaPayload: mediaResult.payload,
|
|
156
|
+
quotedContent,
|
|
157
|
+
account,
|
|
158
|
+
accountScopedCfg,
|
|
159
|
+
runtime,
|
|
160
|
+
chatHistories,
|
|
161
|
+
historyLimit,
|
|
162
|
+
replyToMessageId,
|
|
163
|
+
commandAuthorized,
|
|
164
|
+
groupConfig,
|
|
165
|
+
defaultGroupConfig,
|
|
166
|
+
skipTyping,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
error(`feishu[${account.accountId}]: failed to dispatch message: ${String(err)}`);
|
|
171
|
+
logger.error(`dispatch failed: ${String(err)} (elapsed=${ticketElapsed()}ms)`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../../src/messaging/inbound/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EACL,kCAAkC,EAClC,2BAA2B,EAC3B,iCAAiC,EACjC,yBAAyB,GAE1B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAmB,MAAM,QAAQ,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,MAAM,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;AAE7C,8EAA8E;AAC9E,iCAAiC;AACjC,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAgBzC;IACC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,GAC5G,MAAM,CAAC;IAET,wBAAwB;IACxB,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC/C,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAExC,0CAA0C;IAC1C,EAAE;IACF,2DAA2D;IAC3D,gEAAgE;IAChE,2DAA2D;IAC3D,UAAU;IACV,EAAE;IACF,wDAAwD;IACxD,qEAAqE;IACrE,0BAA0B;IAC1B,MAAM,gBAAgB,GAAmB;QACvC,GAAG,GAAG;QACN,QAAQ,EAAE,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE;KACxD,CAAC;IAEF,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAEnG,oEAAoE;IACpE,IAAI,GAAG,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE;QAClD,GAAG,EAAE,gBAAgB;QACrB,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;IAEH,mEAAmE;IACnE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,MAAM,iBAAiB,CAAC;QACpE,GAAG;QACH,OAAO;QACP,GAAG;KACJ,CAAC,CAAC;IACH,GAAG,GAAG,WAAW,CAAC;IAElB,GAAG,CAAC,UAAU,OAAO,CAAC,SAAS,4BAA4B,GAAG,CAAC,QAAQ,OAAO,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC9G,MAAM,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,QAAQ,OAAO,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC;IAEhF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAC3B,CAAC,EACD,gBAAgB,EAAE,YAAY,IAAI,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,IAAI,2BAA2B,CACpH,CAAC;IAEF,2EAA2E;IAC3E,MAAM,IAAI,GAAG,YAAY;QACvB,CAAC,CAAE,EAAE,OAAO,EAAE,IAAI,EAAiB;QACnC,CAAC,CAAC,MAAM,gBAAgB,CAAC,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IACtF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,qCAAqC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,wEAAwE;QACxE,IAAI,IAAI,CAAC,YAAY,IAAI,aAAa,EAAE,CAAC;YACvC,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC7D,kCAAkC,CAAC;gBACjC,UAAU,EAAE,aAAa;gBACzB,UAAU;gBACV,KAAK,EAAE,YAAY;gBACnB,KAAK,EAAE,IAAI,CAAC,YAAY;aACzB,CAAC,CAAC;QACL,CAAC;QACD,OAAO;IACT,CAAC;IAED,wDAAwD;IACxD,MAAM,iBAAiB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IAE/C,gEAAgE;IAChE,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAC7D,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACrD,YAAY,CAAC,YAAY,CAAC;QAC1B,oBAAoB,CAAC,YAAY,CAAC;KACnC,CAAC,CAAC;IAEH,iEAAiE;IACjE,oEAAoE;IACpE,kDAAkD;IAClD,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,GAAG,GAAG;YACJ,GAAG,GAAG;YACN,OAAO,EAAE,oBAAoB,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC;SAClE,CAAC;IACJ,CAAC;IAED,mEAAmE;IACnE,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC;IAChC,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC;IACzC,MAAM,QAAQ,GAAG,gBAAgB,EAAE,QAAQ,IAAI,SAAS,CAAC;IAEzD,wEAAwE;IACxE,yBAAyB;IACzB,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnH,MAAM,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEjF,yEAAyE;IACzE,iFAAiF;IACjF,EAAE;IACF,uEAAuE;IACvE,uEAAuE;IACvE,4EAA4E;IAC5E,iFAAiF;IACjF,mEAAmE;IACnE,MAAM,wBAAwB,GAAG,CAAC,GAAG,EAAE;QACrC,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAC/B,kFAAkF;QAClF,MAAM,EAAE,eAAe,EAAE,GAAG,yBAAyB,CAAC,gBAAgB,EAAE,cAAc,IAAI,EAAE,CAAC,CAAC;QAC9F,MAAM,oBAAoB,GAAG,eAAe,CAAC;QAC7C,MAAM,iBAAiB,GAAG,CAAC,WAAW,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrE,MAAM,sBAAsB,GAC1B,CAAC,WAAW,IAAI,kBAAkB,EAAE,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChG,MAAM,QAAQ,GAAG,CAAC,GAAG,oBAAoB,EAAE,GAAG,iBAAiB,EAAE,GAAG,sBAAsB,CAAC,CAAC;QAC5F,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,QAAQ,CAAC;QACzC,8EAA8E;QAC9E,+EAA+E;QAC/E,MAAM,oBAAoB,GACxB,WAAW,EAAE,WAAW,IAAI,kBAAkB,EAAE,WAAW,IAAI,gBAAgB,EAAE,WAAW,CAAC;QAC/F,OAAO,oBAAoB,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,iCAAiC,CAAC;QACpE,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,GAAG,EAAE,gBAAgB;QACrB,OAAO;QACP,QAAQ;QACR,mBAAmB,EAAE,CAAC,gBAAgB,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;QACpE,wBAAwB;QACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,eAAe,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC,yBAAyB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;QAC5F,kBAAkB,EAAE,GAAG,EAAE,CAAC,wBAAwB,CAAC,OAAO,CAAC,SAAS,CAAC;QACrE,8BAA8B,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,8BAA8B;QACpF,uCAAuC,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,uCAAuC;KACvG,CAAC,CAAC;IAEH,uBAAuB;IACvB,iEAAiE;IAEjE,IAAI,CAAC;QACH,MAAM,eAAe,CAAC;YACpB,GAAG;YACH,eAAe;YACf,YAAY,EAAE,WAAW,CAAC,OAAO;YACjC,aAAa;YACb,OAAO;YACP,gBAAgB;YAChB,OAAO;YACP,aAAa;YACb,YAAY;YACZ,gBAAgB;YAChB,iBAAiB;YACjB,WAAW;YACX,kBAAkB;YAClB,UAAU;SACX,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CAAC,UAAU,OAAO,CAAC,SAAS,kCAAkC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClF,MAAM,CAAC,KAAK,CAAC,oBAAoB,MAAM,CAAC,GAAG,CAAC,aAAa,aAAa,EAAE,KAAK,CAAC,CAAC;IACjF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* Media resolution and payload building for inbound Feishu messages.
|
|
6
|
+
*
|
|
7
|
+
* Downloads media files based on ResourceDescriptors extracted during
|
|
8
|
+
* the content converter phase, and builds the payload object spread
|
|
9
|
+
* into the agent envelope.
|
|
10
|
+
*/
|
|
11
|
+
import type { ClawdbotConfig } from 'openclaw/plugin-sdk';
|
|
12
|
+
import type { FeishuMediaInfo, ResourceDescriptor } from '../types';
|
|
13
|
+
/**
|
|
14
|
+
* Download media files based on pre-extracted ResourceDescriptors from
|
|
15
|
+
* the converter phase.
|
|
16
|
+
*/
|
|
17
|
+
export declare function downloadResources(params: {
|
|
18
|
+
cfg: ClawdbotConfig;
|
|
19
|
+
messageId: string;
|
|
20
|
+
resources: ResourceDescriptor[];
|
|
21
|
+
maxBytes: number;
|
|
22
|
+
log?: (msg: string) => void;
|
|
23
|
+
accountId?: string;
|
|
24
|
+
}): Promise<FeishuMediaInfo[]>;
|
|
25
|
+
export declare function buildFeishuMediaPayload(mediaList: FeishuMediaInfo[]): {
|
|
26
|
+
MediaPath?: string;
|
|
27
|
+
MediaType?: string;
|
|
28
|
+
MediaUrl?: string;
|
|
29
|
+
MediaPaths?: string[];
|
|
30
|
+
MediaUrls?: string[];
|
|
31
|
+
MediaTypes?: string[];
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=media-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-resolver.d.ts","sourceRoot":"","sources":["../../../../src/messaging/inbound/media-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAQpE;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,GAAG,EAAE,cAAc,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CA2C7B;AAqBD,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CAaA"}
|