@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,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* Agent dispatch for inbound Feishu messages.
|
|
6
|
+
*
|
|
7
|
+
* Builds the agent envelope, prepends chat history context, and
|
|
8
|
+
* dispatches through the appropriate reply path (system command
|
|
9
|
+
* vs. normal streaming/static flow).
|
|
10
|
+
*
|
|
11
|
+
* Implementation details are split across focused modules:
|
|
12
|
+
* - dispatch-context.ts — DispatchContext type, route/session/event
|
|
13
|
+
* - dispatch-builders.ts — pure payload/body/envelope construction
|
|
14
|
+
* - dispatch-commands.ts — system command & permission notification
|
|
15
|
+
*/
|
|
16
|
+
import type { RuntimeEnv, HistoryEntry } from 'openclaw/plugin-sdk';
|
|
17
|
+
import type { MessageContext } from '../types';
|
|
18
|
+
import type { LarkAccount } from '../../core/types';
|
|
19
|
+
import type { FeishuGroupConfig } from '../../core/types';
|
|
20
|
+
import type { PermissionError } from './permission';
|
|
21
|
+
import type { ClawdbotConfig } from 'openclaw/plugin-sdk';
|
|
22
|
+
export declare function dispatchToAgent(params: {
|
|
23
|
+
ctx: MessageContext;
|
|
24
|
+
permissionError?: PermissionError;
|
|
25
|
+
mediaPayload: Record<string, unknown>;
|
|
26
|
+
quotedContent?: string;
|
|
27
|
+
account: LarkAccount;
|
|
28
|
+
/** account 级别的 ClawdbotConfig(channels.feishu 已替换为 per-account 合并后的配置) */
|
|
29
|
+
accountScopedCfg: ClawdbotConfig;
|
|
30
|
+
runtime?: RuntimeEnv;
|
|
31
|
+
chatHistories?: Map<string, HistoryEntry[]>;
|
|
32
|
+
historyLimit: number;
|
|
33
|
+
/** Override the message ID used for reply threading. When set, the
|
|
34
|
+
* reply-dispatcher uses this ID for typing indicators and card replies
|
|
35
|
+
* instead of ctx.messageId (which may be a synthetic ID). */
|
|
36
|
+
replyToMessageId?: string;
|
|
37
|
+
/** When set, controls whether the sender is authorized to execute
|
|
38
|
+
* control commands. Computed by the handler via the SDK's access
|
|
39
|
+
* group command gating system. */
|
|
40
|
+
commandAuthorized?: boolean;
|
|
41
|
+
/** Per-group configuration for skills, systemPrompt, etc. */
|
|
42
|
+
groupConfig?: FeishuGroupConfig;
|
|
43
|
+
/** Default group configuration from the "*" wildcard entry. */
|
|
44
|
+
defaultGroupConfig?: FeishuGroupConfig;
|
|
45
|
+
/** When true, the reply dispatcher skips typing indicators. */
|
|
46
|
+
skipTyping?: boolean;
|
|
47
|
+
}): Promise<void>;
|
|
48
|
+
//# sourceMappingURL=dispatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../../../src/messaging/inbound/dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAoBpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAwG1D,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC5C,GAAG,EAAE,cAAc,CAAC;IACpB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,0EAA0E;IAC1E,gBAAgB,EAAE,cAAc,CAAC;IACjC,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB;;kEAE8D;IAC9D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;uCAEmC;IACnC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,6DAA6D;IAC7D,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,+DAA+D;IAC/D,kBAAkB,CAAC,EAAE,iBAAiB,CAAC;IACvC,+DAA+D;IAC/D,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6GhB"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* Agent dispatch for inbound Feishu messages.
|
|
6
|
+
*
|
|
7
|
+
* Builds the agent envelope, prepends chat history context, and
|
|
8
|
+
* dispatches through the appropriate reply path (system command
|
|
9
|
+
* vs. normal streaming/static flow).
|
|
10
|
+
*
|
|
11
|
+
* Implementation details are split across focused modules:
|
|
12
|
+
* - dispatch-context.ts — DispatchContext type, route/session/event
|
|
13
|
+
* - dispatch-builders.ts — pure payload/body/envelope construction
|
|
14
|
+
* - dispatch-commands.ts — system command & permission notification
|
|
15
|
+
*/
|
|
16
|
+
import { clearHistoryEntriesIfEnabled } from 'openclaw/plugin-sdk';
|
|
17
|
+
import { larkLogger } from '../../core/lark-logger';
|
|
18
|
+
import { ticketElapsed } from '../../core/lark-ticket';
|
|
19
|
+
import { createFeishuReplyDispatcher } from '../../card/reply-dispatcher';
|
|
20
|
+
import { mentionedBot } from './mention';
|
|
21
|
+
import { buildQueueKey, threadScopedKey, registerActiveDispatcher, unregisterActiveDispatcher, } from '../../channel/chat-queue';
|
|
22
|
+
import { isLikelyAbortText } from '../../channel/abort-detect';
|
|
23
|
+
import { buildDispatchContext, resolveThreadSessionKey } from './dispatch-context';
|
|
24
|
+
import { buildMessageBody, buildBodyForAgent, buildInboundPayload, buildEnvelopeWithHistory, } from './dispatch-builders';
|
|
25
|
+
import { dispatchPermissionNotification, dispatchSystemCommand } from './dispatch-commands';
|
|
26
|
+
const log = larkLogger('inbound/dispatch');
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Internal: normal message dispatch
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
/**
|
|
31
|
+
* Dispatch a normal (non-command) message via the streaming card flow.
|
|
32
|
+
* Cleans up consumed history entries after dispatch completes.
|
|
33
|
+
*
|
|
34
|
+
* Note: history cleanup is intentionally placed here and NOT in the
|
|
35
|
+
* system-command path — command handlers don't consume history context,
|
|
36
|
+
* so the entries should be preserved for the next normal message.
|
|
37
|
+
*/
|
|
38
|
+
async function dispatchNormalMessage(dc, ctxPayload, chatHistories, historyKey, historyLimit, replyToMessageId, skillFilter, skipTyping) {
|
|
39
|
+
// Abort messages should never create streaming cards — dispatch via the
|
|
40
|
+
// plain-text system-command path so the SDK's abort handler can reply
|
|
41
|
+
// without touching CardKit.
|
|
42
|
+
if (isLikelyAbortText(dc.ctx.content?.trim() ?? '')) {
|
|
43
|
+
dc.log(`feishu[${dc.account.accountId}]: abort message detected, using plain-text dispatch`);
|
|
44
|
+
log.info('abort message detected, using plain-text dispatch');
|
|
45
|
+
await dispatchSystemCommand(dc, ctxPayload, false, replyToMessageId);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const { dispatcher, replyOptions, markDispatchIdle, markFullyComplete, abortCard } = createFeishuReplyDispatcher({
|
|
49
|
+
cfg: dc.accountScopedCfg,
|
|
50
|
+
agentId: dc.route.agentId,
|
|
51
|
+
chatId: dc.ctx.chatId,
|
|
52
|
+
replyToMessageId: replyToMessageId ?? dc.ctx.messageId,
|
|
53
|
+
accountId: dc.account.accountId,
|
|
54
|
+
chatType: dc.ctx.chatType,
|
|
55
|
+
skipTyping,
|
|
56
|
+
replyInThread: dc.isThread,
|
|
57
|
+
});
|
|
58
|
+
// Create an AbortController so the abort fast-path can cancel the
|
|
59
|
+
// underlying LLM request (not just the streaming card UI).
|
|
60
|
+
const abortController = new AbortController();
|
|
61
|
+
// Register the active dispatcher so the monitor abort fast-path can
|
|
62
|
+
// terminate the streaming card before this task completes.
|
|
63
|
+
const queueKey = buildQueueKey(dc.account.accountId, dc.ctx.chatId, dc.ctx.threadId);
|
|
64
|
+
registerActiveDispatcher(queueKey, { abortCard, abortController });
|
|
65
|
+
const effectiveSessionKey = dc.threadSessionKey ?? dc.route.sessionKey;
|
|
66
|
+
dc.log(`feishu[${dc.account.accountId}]: dispatching to agent (session=${effectiveSessionKey})`);
|
|
67
|
+
log.info(`dispatching to agent (session=${effectiveSessionKey})`);
|
|
68
|
+
try {
|
|
69
|
+
const { queuedFinal, counts } = await dc.core.channel.reply.dispatchReplyFromConfig({
|
|
70
|
+
ctx: ctxPayload,
|
|
71
|
+
cfg: dc.accountScopedCfg,
|
|
72
|
+
dispatcher,
|
|
73
|
+
replyOptions: {
|
|
74
|
+
...replyOptions,
|
|
75
|
+
abortSignal: abortController.signal,
|
|
76
|
+
...(skillFilter ? { skillFilter } : {}),
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
// Wait for all enqueued deliver() calls in the SDK's sendChain to
|
|
80
|
+
// complete before marking the dispatch as done. Without this,
|
|
81
|
+
// dispatchReplyFromConfig() may return while the final deliver() is
|
|
82
|
+
// still pending in the Promise chain, causing markFullyComplete() to
|
|
83
|
+
// block it and leaving completedText incomplete — which in turn makes
|
|
84
|
+
// the streaming card's final update show truncated content.
|
|
85
|
+
await dispatcher.waitForIdle();
|
|
86
|
+
markFullyComplete();
|
|
87
|
+
markDispatchIdle();
|
|
88
|
+
// Clean up consumed history entries
|
|
89
|
+
if (dc.isGroup && historyKey && chatHistories) {
|
|
90
|
+
clearHistoryEntriesIfEnabled({
|
|
91
|
+
historyMap: chatHistories,
|
|
92
|
+
historyKey,
|
|
93
|
+
limit: historyLimit,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
dc.log(`feishu[${dc.account.accountId}]: dispatch complete (queuedFinal=${queuedFinal}, replies=${counts.final})`);
|
|
97
|
+
log.info(`dispatch complete (replies=${counts.final}, elapsed=${ticketElapsed()}ms)`);
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
unregisterActiveDispatcher(queueKey);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
// Public API
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
export async function dispatchToAgent(params) {
|
|
107
|
+
// 1. Derive shared context (including route resolution + system event)
|
|
108
|
+
const dc = buildDispatchContext(params);
|
|
109
|
+
// 1b. Resolve thread session isolation (async: may query group info API)
|
|
110
|
+
if (dc.isThread && dc.ctx.threadId) {
|
|
111
|
+
dc.threadSessionKey = await resolveThreadSessionKey({
|
|
112
|
+
accountScopedCfg: dc.accountScopedCfg,
|
|
113
|
+
account: dc.account,
|
|
114
|
+
chatId: dc.ctx.chatId,
|
|
115
|
+
threadId: dc.ctx.threadId,
|
|
116
|
+
baseSessionKey: dc.route.sessionKey,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
// 2. Build annotated message body
|
|
120
|
+
const messageBody = buildMessageBody(params.ctx, params.quotedContent);
|
|
121
|
+
// 3. Permission-error notification (optional side-effect).
|
|
122
|
+
// Isolated so a failure here does not block the main message dispatch.
|
|
123
|
+
if (params.permissionError) {
|
|
124
|
+
try {
|
|
125
|
+
await dispatchPermissionNotification(dc, params.permissionError, params.replyToMessageId);
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
dc.error(`feishu[${dc.account.accountId}]: permission notification failed, continuing: ${String(err)}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// 4. Build main envelope (with group chat history)
|
|
132
|
+
const { combinedBody, historyKey } = buildEnvelopeWithHistory(dc, messageBody, params.chatHistories, params.historyLimit);
|
|
133
|
+
// 5. Build BodyForAgent with mention annotation (if any).
|
|
134
|
+
// SDK >= 2026.2.10 no longer falls back to Body for BodyForAgent,
|
|
135
|
+
// so we must set it explicitly to preserve the annotation.
|
|
136
|
+
const bodyForAgent = buildBodyForAgent(params.ctx);
|
|
137
|
+
// 6. Build InboundHistory for SDK metadata injection (>= 2026.2.10).
|
|
138
|
+
// The SDK's buildInboundUserContextPrefix renders these as structured
|
|
139
|
+
// JSON blocks; earlier SDK versions simply ignore unknown fields.
|
|
140
|
+
const threadHistoryKey = threadScopedKey(dc.ctx.chatId, dc.isThread ? dc.ctx.threadId : undefined);
|
|
141
|
+
const inboundHistory = dc.isGroup && params.chatHistories && params.historyLimit > 0
|
|
142
|
+
? (params.chatHistories.get(threadHistoryKey) ?? []).map((entry) => ({
|
|
143
|
+
sender: entry.sender,
|
|
144
|
+
body: entry.body,
|
|
145
|
+
timestamp: entry.timestamp ?? Date.now(),
|
|
146
|
+
}))
|
|
147
|
+
: undefined;
|
|
148
|
+
// 7. Build inbound context payload
|
|
149
|
+
const isBareNewOrReset = /^\/(?:new|reset)\s*$/i.test((params.ctx.content ?? '').trim());
|
|
150
|
+
const groupSystemPrompt = dc.isGroup
|
|
151
|
+
? params.groupConfig?.systemPrompt?.trim() || params.defaultGroupConfig?.systemPrompt?.trim() || undefined
|
|
152
|
+
: undefined;
|
|
153
|
+
const ctxPayload = buildInboundPayload(dc, {
|
|
154
|
+
body: combinedBody,
|
|
155
|
+
bodyForAgent,
|
|
156
|
+
rawBody: params.ctx.content,
|
|
157
|
+
commandBody: params.ctx.content,
|
|
158
|
+
senderName: params.ctx.senderName ?? params.ctx.senderId,
|
|
159
|
+
senderId: params.ctx.senderId,
|
|
160
|
+
messageSid: params.ctx.messageId,
|
|
161
|
+
wasMentioned: mentionedBot(params.ctx),
|
|
162
|
+
replyToBody: params.quotedContent,
|
|
163
|
+
inboundHistory,
|
|
164
|
+
extraFields: {
|
|
165
|
+
...params.mediaPayload,
|
|
166
|
+
...(groupSystemPrompt ? { GroupSystemPrompt: groupSystemPrompt } : {}),
|
|
167
|
+
...(dc.ctx.threadId ? { MessageThreadId: dc.ctx.threadId } : {}),
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
// 8. Dispatch: system command vs. normal message
|
|
171
|
+
const isCommand = dc.core.channel.commands.isControlCommandMessage(params.ctx.content, params.accountScopedCfg);
|
|
172
|
+
// Resolve per-group skill filter (per-group > default "*")
|
|
173
|
+
const skillFilter = dc.isGroup ? (params.groupConfig?.skills ?? params.defaultGroupConfig?.skills) : undefined;
|
|
174
|
+
if (isCommand) {
|
|
175
|
+
await dispatchSystemCommand(dc, ctxPayload, isBareNewOrReset, params.replyToMessageId);
|
|
176
|
+
// /new and /reset explicitly start a new session — clear pending history
|
|
177
|
+
if (isBareNewOrReset && dc.isGroup && historyKey && params.chatHistories) {
|
|
178
|
+
clearHistoryEntriesIfEnabled({
|
|
179
|
+
historyMap: params.chatHistories,
|
|
180
|
+
historyKey,
|
|
181
|
+
limit: params.historyLimit,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
// Normal message dispatch; history cleanup happens inside.
|
|
187
|
+
// System commands intentionally skip history cleanup — command handlers
|
|
188
|
+
// don't consume history context, so entries are preserved for the next
|
|
189
|
+
// normal message.
|
|
190
|
+
await dispatchNormalMessage(dc, ctxPayload, params.chatHistories, historyKey, params.historyLimit, params.replyToMessageId, skillFilter, params.skipTyping);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../../../src/messaging/inbound/dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* Context enrichment for inbound Feishu messages.
|
|
6
|
+
*
|
|
7
|
+
* Enrichment phases:
|
|
8
|
+
*
|
|
9
|
+
* - **resolveSenderInfo** (lightweight, before gate) — resolves sender
|
|
10
|
+
* display name and tracks permission errors.
|
|
11
|
+
* - **prefetchUserNames** (after gate, before content resolution) — batch
|
|
12
|
+
* pre-warm the account-scoped user-name cache for the sender and all
|
|
13
|
+
* non-bot mentions so that downstream merge_forward expansion and
|
|
14
|
+
* quoted-message formatting can read names synchronously.
|
|
15
|
+
* - **resolveMedia** (after gate) — downloads binary media attachments
|
|
16
|
+
* using ResourceDescriptors from the converter phase.
|
|
17
|
+
* - **resolveQuotedContent** (after gate) — fetches the replied-to
|
|
18
|
+
* message text for context.
|
|
19
|
+
*
|
|
20
|
+
* Note: merge_forward expansion for the primary message is now handled
|
|
21
|
+
* at parse time in {@link parseMessageEvent}. Quoted merge_forward
|
|
22
|
+
* messages are still expanded here via {@link resolveQuotedContent}.
|
|
23
|
+
*/
|
|
24
|
+
import type { ClawdbotConfig } from 'openclaw/plugin-sdk';
|
|
25
|
+
import type { MessageContext, FeishuMediaInfo } from '../types';
|
|
26
|
+
import type { LarkAccount } from '../../core/types';
|
|
27
|
+
import type { PermissionError } from './permission';
|
|
28
|
+
/**
|
|
29
|
+
* Resolve the sender display name and track permission errors.
|
|
30
|
+
*
|
|
31
|
+
* This must run before the gate check because per-group sender
|
|
32
|
+
* allowlists may match on senderName.
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveSenderInfo(params: {
|
|
35
|
+
ctx: MessageContext;
|
|
36
|
+
account: LarkAccount;
|
|
37
|
+
log: (...args: unknown[]) => void;
|
|
38
|
+
}): Promise<{
|
|
39
|
+
ctx: MessageContext;
|
|
40
|
+
permissionError?: PermissionError;
|
|
41
|
+
}>;
|
|
42
|
+
/**
|
|
43
|
+
* Batch-prefetch user display names for the sender and all non-bot
|
|
44
|
+
* mentions. Mention names that are already known from the event payload
|
|
45
|
+
* are written into the cache for free.
|
|
46
|
+
*/
|
|
47
|
+
export declare function prefetchUserNames(params: {
|
|
48
|
+
ctx: MessageContext;
|
|
49
|
+
account: LarkAccount;
|
|
50
|
+
log: (...args: unknown[]) => void;
|
|
51
|
+
}): Promise<void>;
|
|
52
|
+
/** Result of media resolution: envelope payload + per-file mapping. */
|
|
53
|
+
export interface ResolveMediaResult {
|
|
54
|
+
payload: Record<string, unknown>;
|
|
55
|
+
mediaList: FeishuMediaInfo[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Download and save binary media attachments (images, files, audio,
|
|
59
|
+
* video, stickers) from the inbound message.
|
|
60
|
+
*
|
|
61
|
+
* Uses ResourceDescriptors extracted by content converters during the
|
|
62
|
+
* parse phase — no re-parsing of rawMessage.content needed.
|
|
63
|
+
*
|
|
64
|
+
* Returns a payload object whose keys (`MediaPath`, `MediaType`, …)
|
|
65
|
+
* are spread directly into the agent envelope, plus the raw mediaList
|
|
66
|
+
* for content substitution.
|
|
67
|
+
*/
|
|
68
|
+
export declare function resolveMedia(params: {
|
|
69
|
+
ctx: MessageContext;
|
|
70
|
+
/** account 级别的 ClawdbotConfig(channels.feishu 已替换为 per-account 合并后的配置) */
|
|
71
|
+
accountScopedCfg: ClawdbotConfig;
|
|
72
|
+
account: LarkAccount;
|
|
73
|
+
log: (...args: unknown[]) => void;
|
|
74
|
+
}): Promise<ResolveMediaResult>;
|
|
75
|
+
/**
|
|
76
|
+
* Replace Feishu file-key references in message content with actual
|
|
77
|
+
* local file paths after download.
|
|
78
|
+
*
|
|
79
|
+
* This is critical for:
|
|
80
|
+
* - **Images / stickers**: The SDK's `detectAndLoadPromptImages` scans
|
|
81
|
+
* the prompt text for local file paths with image extensions.
|
|
82
|
+
* - **Audio / video / files**: Gives the AI meaningful context about
|
|
83
|
+
* what was received (the SDK reads these via `MediaPath` directly,
|
|
84
|
+
* but the text body should still reflect the actual attachments).
|
|
85
|
+
*/
|
|
86
|
+
export declare function substituteMediaPaths(content: string, mediaList: FeishuMediaInfo[]): string;
|
|
87
|
+
/**
|
|
88
|
+
* Fetch the text content of the message that the user replied to.
|
|
89
|
+
*
|
|
90
|
+
* If the quoted message is itself a merge_forward, its sub-messages are
|
|
91
|
+
* fetched and formatted as a single text block.
|
|
92
|
+
*
|
|
93
|
+
* Returns `"senderName: content"` when the sender name is available so
|
|
94
|
+
* the AI knows who originally wrote the quoted message.
|
|
95
|
+
*/
|
|
96
|
+
export declare function resolveQuotedContent(params: {
|
|
97
|
+
ctx: MessageContext;
|
|
98
|
+
/** account 级别的 ClawdbotConfig(channels.feishu 已替换为 per-account 合并后的配置) */
|
|
99
|
+
accountScopedCfg: ClawdbotConfig;
|
|
100
|
+
account: LarkAccount;
|
|
101
|
+
log: (...args: unknown[]) => void;
|
|
102
|
+
}): Promise<string | undefined>;
|
|
103
|
+
//# sourceMappingURL=enrich.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrich.d.ts","sourceRoot":"","sources":["../../../../src/messaging/inbound/enrich.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAWpD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,GAAG,EAAE,cAAc,CAAC;IACpB,OAAO,EAAE,WAAW,CAAC;IACrB,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACnC,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,cAAc,CAAC;IAAC,eAAe,CAAC,EAAE,eAAe,CAAA;CAAE,CAAC,CAsCtE;AAMD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,GAAG,EAAE,cAAc,CAAC;IACpB,OAAO,EAAE,WAAW,CAAC;IACrB,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACnC,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBhB;AAMD,uEAAuE;AACvE,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,EAAE,eAAe,EAAE,CAAC;CAC9B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE;IACzC,GAAG,EAAE,cAAc,CAAC;IACpB,0EAA0E;IAC1E,gBAAgB,EAAE,cAAc,CAAC;IACjC,OAAO,EAAE,WAAW,CAAC;IACrB,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACnC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAuB9B;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,MAAM,CAkC1F;AAUD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,GAAG,EAAE,cAAc,CAAC;IACpB,0EAA0E;IAC1E,gBAAgB,EAAE,cAAc,CAAC;IACjC,OAAO,EAAE,WAAW,CAAC;IACrB,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACnC,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA2B9B"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* Context enrichment for inbound Feishu messages.
|
|
6
|
+
*
|
|
7
|
+
* Enrichment phases:
|
|
8
|
+
*
|
|
9
|
+
* - **resolveSenderInfo** (lightweight, before gate) — resolves sender
|
|
10
|
+
* display name and tracks permission errors.
|
|
11
|
+
* - **prefetchUserNames** (after gate, before content resolution) — batch
|
|
12
|
+
* pre-warm the account-scoped user-name cache for the sender and all
|
|
13
|
+
* non-bot mentions so that downstream merge_forward expansion and
|
|
14
|
+
* quoted-message formatting can read names synchronously.
|
|
15
|
+
* - **resolveMedia** (after gate) — downloads binary media attachments
|
|
16
|
+
* using ResourceDescriptors from the converter phase.
|
|
17
|
+
* - **resolveQuotedContent** (after gate) — fetches the replied-to
|
|
18
|
+
* message text for context.
|
|
19
|
+
*
|
|
20
|
+
* Note: merge_forward expansion for the primary message is now handled
|
|
21
|
+
* at parse time in {@link parseMessageEvent}. Quoted merge_forward
|
|
22
|
+
* messages are still expanded here via {@link resolveQuotedContent}.
|
|
23
|
+
*/
|
|
24
|
+
import { PERMISSION_ERROR_COOLDOWN_MS, permissionErrorNotifiedAt } from './permission';
|
|
25
|
+
import { resolveUserName } from './user-name-cache';
|
|
26
|
+
import { downloadResources, buildFeishuMediaPayload } from './media-resolver';
|
|
27
|
+
import { getMessageFeishu } from '../outbound/fetch';
|
|
28
|
+
import { getUserNameCache, batchResolveUserNames } from './user-name-cache';
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// Phase 1: Sender info (lightweight, before gate)
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
/**
|
|
33
|
+
* Resolve the sender display name and track permission errors.
|
|
34
|
+
*
|
|
35
|
+
* This must run before the gate check because per-group sender
|
|
36
|
+
* allowlists may match on senderName.
|
|
37
|
+
*/
|
|
38
|
+
export async function resolveSenderInfo(params) {
|
|
39
|
+
const { account, log } = params;
|
|
40
|
+
let ctx = params.ctx;
|
|
41
|
+
// Only resolve display name for real users — the contact API
|
|
42
|
+
// does not return results for app/bot accounts.
|
|
43
|
+
if (ctx.rawSender?.sender_type !== 'user') {
|
|
44
|
+
log(`sender_type is "${ctx.rawSender?.sender_type}", skipping name resolution`);
|
|
45
|
+
return { ctx };
|
|
46
|
+
}
|
|
47
|
+
// Resolve sender display name (best-effort)
|
|
48
|
+
const senderResult = await resolveUserName({
|
|
49
|
+
account,
|
|
50
|
+
openId: ctx.senderId,
|
|
51
|
+
log,
|
|
52
|
+
});
|
|
53
|
+
if (senderResult.name) {
|
|
54
|
+
ctx = { ...ctx, senderName: senderResult.name };
|
|
55
|
+
log(`sender resolved: ${senderResult.name}`);
|
|
56
|
+
}
|
|
57
|
+
else if (senderResult.permissionError) {
|
|
58
|
+
log(`sender resolve failed: permission error code=${senderResult.permissionError.code}`);
|
|
59
|
+
}
|
|
60
|
+
// Track permission errors (with cooldown)
|
|
61
|
+
let permissionError;
|
|
62
|
+
if (senderResult.permissionError) {
|
|
63
|
+
const appKey = account.appId ?? 'default';
|
|
64
|
+
const now = Date.now();
|
|
65
|
+
const lastNotified = permissionErrorNotifiedAt.get(appKey) ?? 0;
|
|
66
|
+
if (now - lastNotified > PERMISSION_ERROR_COOLDOWN_MS) {
|
|
67
|
+
permissionErrorNotifiedAt.set(appKey, now);
|
|
68
|
+
permissionError = senderResult.permissionError;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return { ctx, permissionError };
|
|
72
|
+
}
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// Phase 1.5: Batch pre-warm user name cache (after gate)
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
/**
|
|
77
|
+
* Batch-prefetch user display names for the sender and all non-bot
|
|
78
|
+
* mentions. Mention names that are already known from the event payload
|
|
79
|
+
* are written into the cache for free.
|
|
80
|
+
*/
|
|
81
|
+
export async function prefetchUserNames(params) {
|
|
82
|
+
const { ctx, account, log } = params;
|
|
83
|
+
if (!account.configured)
|
|
84
|
+
return;
|
|
85
|
+
const cache = getUserNameCache(account.accountId);
|
|
86
|
+
// Seed cache with mention names already present in the event payload
|
|
87
|
+
for (const m of ctx.mentions) {
|
|
88
|
+
if (!m.isBot && m.openId && m.name) {
|
|
89
|
+
cache.set(m.openId, m.name);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Collect all openIds we care about
|
|
93
|
+
const openIds = new Set();
|
|
94
|
+
if (ctx.senderId)
|
|
95
|
+
openIds.add(ctx.senderId);
|
|
96
|
+
for (const m of ctx.mentions) {
|
|
97
|
+
if (!m.isBot && m.openId)
|
|
98
|
+
openIds.add(m.openId);
|
|
99
|
+
}
|
|
100
|
+
// Batch-resolve any that are still missing
|
|
101
|
+
const toResolve = cache.filterMissing([...openIds]);
|
|
102
|
+
if (toResolve.length > 0) {
|
|
103
|
+
await batchResolveUserNames({ account, openIds: toResolve, log });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Download and save binary media attachments (images, files, audio,
|
|
108
|
+
* video, stickers) from the inbound message.
|
|
109
|
+
*
|
|
110
|
+
* Uses ResourceDescriptors extracted by content converters during the
|
|
111
|
+
* parse phase — no re-parsing of rawMessage.content needed.
|
|
112
|
+
*
|
|
113
|
+
* Returns a payload object whose keys (`MediaPath`, `MediaType`, …)
|
|
114
|
+
* are spread directly into the agent envelope, plus the raw mediaList
|
|
115
|
+
* for content substitution.
|
|
116
|
+
*/
|
|
117
|
+
export async function resolveMedia(params) {
|
|
118
|
+
const { ctx, accountScopedCfg, account, log } = params;
|
|
119
|
+
const accountFeishuCfg = account.config;
|
|
120
|
+
const mediaMaxBytes = (accountFeishuCfg?.mediaMaxMb ?? 30) * 1024 * 1024;
|
|
121
|
+
const mediaList = await downloadResources({
|
|
122
|
+
cfg: accountScopedCfg,
|
|
123
|
+
messageId: ctx.messageId,
|
|
124
|
+
resources: ctx.resources,
|
|
125
|
+
maxBytes: mediaMaxBytes,
|
|
126
|
+
log,
|
|
127
|
+
accountId: account.accountId,
|
|
128
|
+
});
|
|
129
|
+
if (mediaList.length > 0) {
|
|
130
|
+
log(`media resolved: ${mediaList.length} attachment(s)`);
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
payload: buildFeishuMediaPayload(mediaList),
|
|
134
|
+
mediaList,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
// ---------------------------------------------------------------------------
|
|
138
|
+
// Media content substitution
|
|
139
|
+
// ---------------------------------------------------------------------------
|
|
140
|
+
/**
|
|
141
|
+
* Replace Feishu file-key references in message content with actual
|
|
142
|
+
* local file paths after download.
|
|
143
|
+
*
|
|
144
|
+
* This is critical for:
|
|
145
|
+
* - **Images / stickers**: The SDK's `detectAndLoadPromptImages` scans
|
|
146
|
+
* the prompt text for local file paths with image extensions.
|
|
147
|
+
* - **Audio / video / files**: Gives the AI meaningful context about
|
|
148
|
+
* what was received (the SDK reads these via `MediaPath` directly,
|
|
149
|
+
* but the text body should still reflect the actual attachments).
|
|
150
|
+
*/
|
|
151
|
+
export function substituteMediaPaths(content, mediaList) {
|
|
152
|
+
let result = content;
|
|
153
|
+
for (const media of mediaList) {
|
|
154
|
+
const { fileKey, path, resourceType } = media;
|
|
155
|
+
switch (resourceType) {
|
|
156
|
+
case 'image':
|
|
157
|
+
//  → local path (SDK detects image extensions)
|
|
158
|
+
result = result.replace(``, path);
|
|
159
|
+
break;
|
|
160
|
+
case 'sticker':
|
|
161
|
+
// <sticker key="xxx"/> → local path (treated like image)
|
|
162
|
+
result = result.replace(`<sticker key="${fileKey}"/>`, path);
|
|
163
|
+
break;
|
|
164
|
+
case 'audio': {
|
|
165
|
+
// <audio key="xxx" .../> → [Audio: /path/to/audio.opus ...]
|
|
166
|
+
const audioRe = new RegExp(`<audio key="${escapeRegExp(fileKey)}"[^/]*/>`);
|
|
167
|
+
result = result.replace(audioRe, `[Audio: ${path}]`);
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
case 'file': {
|
|
171
|
+
// <file key="xxx" .../> → [File: /path/to/doc.pdf]
|
|
172
|
+
const fileRe = new RegExp(`<file key="${escapeRegExp(fileKey)}"[^/]*/>`);
|
|
173
|
+
result = result.replace(fileRe, `[File: ${path}]`);
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
case 'video': {
|
|
177
|
+
// <video key="xxx" .../> → [Video: /path/to/video.mp4]
|
|
178
|
+
const videoRe = new RegExp(`<video key="${escapeRegExp(fileKey)}"[^/]*/>`);
|
|
179
|
+
result = result.replace(videoRe, `[Video: ${path}]`);
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
function escapeRegExp(s) {
|
|
187
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
188
|
+
}
|
|
189
|
+
// ---------------------------------------------------------------------------
|
|
190
|
+
// Phase 2b: Quoted / replied-to message (text context)
|
|
191
|
+
// ---------------------------------------------------------------------------
|
|
192
|
+
/**
|
|
193
|
+
* Fetch the text content of the message that the user replied to.
|
|
194
|
+
*
|
|
195
|
+
* If the quoted message is itself a merge_forward, its sub-messages are
|
|
196
|
+
* fetched and formatted as a single text block.
|
|
197
|
+
*
|
|
198
|
+
* Returns `"senderName: content"` when the sender name is available so
|
|
199
|
+
* the AI knows who originally wrote the quoted message.
|
|
200
|
+
*/
|
|
201
|
+
export async function resolveQuotedContent(params) {
|
|
202
|
+
const { ctx, accountScopedCfg, account, log } = params;
|
|
203
|
+
if (!ctx.parentId)
|
|
204
|
+
return undefined;
|
|
205
|
+
try {
|
|
206
|
+
const quotedMsg = await getMessageFeishu({
|
|
207
|
+
cfg: accountScopedCfg,
|
|
208
|
+
messageId: ctx.parentId,
|
|
209
|
+
accountId: account.accountId,
|
|
210
|
+
expandForward: true,
|
|
211
|
+
});
|
|
212
|
+
if (!quotedMsg)
|
|
213
|
+
return undefined;
|
|
214
|
+
log(`feishu[${account.accountId}]: fetched quoted message: ${quotedMsg.content?.slice(0, 100)}`);
|
|
215
|
+
// Build quoted text with message_id prefix so AI can correlate
|
|
216
|
+
// file_key / image_key with the source message for resource download.
|
|
217
|
+
const prefix = `[message_id=${ctx.parentId}]`;
|
|
218
|
+
if (quotedMsg.senderName) {
|
|
219
|
+
return `${prefix} ${quotedMsg.senderName}: ${quotedMsg.content}`;
|
|
220
|
+
}
|
|
221
|
+
return `${prefix} ${quotedMsg.content}`;
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
log(`feishu[${account.accountId}]: failed to fetch quoted message: ${String(err)}`);
|
|
225
|
+
return undefined;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=enrich.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrich.js","sourceRoot":"","sources":["../../../../src/messaging/inbound/enrich.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
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 type { ClawdbotConfig } from 'openclaw/plugin-sdk';
|
|
11
|
+
/**
|
|
12
|
+
* Create a pairing request and send a pairing reply message to the user.
|
|
13
|
+
*
|
|
14
|
+
* This is the side-effect portion of the DM pairing gate: the pure
|
|
15
|
+
* policy decision (whether to pair) is made in gate.ts, and this
|
|
16
|
+
* function executes the resulting I/O.
|
|
17
|
+
*/
|
|
18
|
+
export declare function sendPairingReply(params: {
|
|
19
|
+
senderId: string;
|
|
20
|
+
chatId: string;
|
|
21
|
+
accountId: string;
|
|
22
|
+
accountScopedCfg?: ClawdbotConfig;
|
|
23
|
+
}): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=gate-effects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-effects.d.ts","sourceRoot":"","sources":["../../../../src/messaging/inbound/gate-effects.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAQ1D;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,cAAc,CAAC;CACnC,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBhB"}
|