@larksuite/openclaw-lark 2025.7.15-beta.0
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 +21 -0
- package/README.md +76 -0
- package/bin/openclaw-lark.js +39 -0
- package/index.d.ts +36 -0
- package/index.js +188 -0
- package/openclaw.plugin.json +64 -0
- package/package.json +63 -0
- package/secret-contract-api.d.ts +15 -0
- package/secret-contract-api.js +78 -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 +242 -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 +340 -0
- package/skills/feishu-troubleshoot/SKILL.md +70 -0
- package/skills/feishu-update-doc/SKILL.md +285 -0
- package/src/card/builder.d.ts +152 -0
- package/src/card/builder.js +794 -0
- package/src/card/card-error.d.ts +91 -0
- package/src/card/card-error.js +206 -0
- package/src/card/cardkit.d.ts +90 -0
- package/src/card/cardkit.js +203 -0
- package/src/card/flush-controller.d.ts +45 -0
- package/src/card/flush-controller.js +138 -0
- package/src/card/image-resolver.d.ts +45 -0
- package/src/card/image-resolver.js +116 -0
- package/src/card/markdown-style.d.ts +16 -0
- package/src/card/markdown-style.js +106 -0
- package/src/card/reasoning-utils.d.ts +14 -0
- package/src/card/reasoning-utils.js +64 -0
- package/src/card/reply-dispatcher-types.d.ts +132 -0
- package/src/card/reply-dispatcher-types.js +61 -0
- package/src/card/reply-dispatcher.d.ts +15 -0
- package/src/card/reply-dispatcher.js +447 -0
- package/src/card/reply-mode.d.ts +41 -0
- package/src/card/reply-mode.js +70 -0
- package/src/card/streaming-card-controller.d.ts +118 -0
- package/src/card/streaming-card-controller.js +1045 -0
- package/src/card/tool-use-config.d.ts +26 -0
- package/src/card/tool-use-config.js +76 -0
- package/src/card/tool-use-display.d.ts +37 -0
- package/src/card/tool-use-display.js +476 -0
- package/src/card/tool-use-trace-store.d.ts +51 -0
- package/src/card/tool-use-trace-store.js +271 -0
- package/src/card/unavailable-guard.d.ts +35 -0
- package/src/card/unavailable-guard.js +87 -0
- package/src/channel/abort-detect.d.ts +47 -0
- package/src/channel/abort-detect.js +219 -0
- package/src/channel/chat-queue.d.ts +41 -0
- package/src/channel/chat-queue.js +68 -0
- package/src/channel/config-adapter.d.ts +23 -0
- package/src/channel/config-adapter.js +107 -0
- package/src/channel/directory.d.ts +57 -0
- package/src/channel/directory.js +197 -0
- package/src/channel/event-handlers.d.ts +17 -0
- package/src/channel/event-handlers.js +380 -0
- package/src/channel/interactive-dispatch.d.ts +59 -0
- package/src/channel/interactive-dispatch.js +195 -0
- package/src/channel/monitor.d.ts +17 -0
- package/src/channel/monitor.js +140 -0
- package/src/channel/onboarding-config.d.ts +18 -0
- package/src/channel/onboarding-config.js +96 -0
- package/src/channel/onboarding-migrate.d.ts +25 -0
- package/src/channel/onboarding-migrate.js +70 -0
- package/src/channel/onboarding.d.ts +12 -0
- package/src/channel/onboarding.js +300 -0
- package/src/channel/plugin.d.ts +13 -0
- package/src/channel/plugin.js +310 -0
- package/src/channel/probe.d.ts +14 -0
- package/src/channel/probe.js +24 -0
- package/src/channel/types.d.ts +37 -0
- package/src/channel/types.js +8 -0
- package/src/commands/auth.d.ts +21 -0
- package/src/commands/auth.js +165 -0
- package/src/commands/diagnose.d.ts +69 -0
- package/src/commands/diagnose.js +848 -0
- package/src/commands/doctor.d.ts +27 -0
- package/src/commands/doctor.js +588 -0
- package/src/commands/index.d.ts +25 -0
- package/src/commands/index.js +219 -0
- package/src/commands/locale.d.ts +7 -0
- package/src/commands/locale.js +8 -0
- package/src/core/accounts.d.ts +51 -0
- package/src/core/accounts.js +219 -0
- package/src/core/agent-config.d.ts +100 -0
- package/src/core/agent-config.js +148 -0
- package/src/core/api-error.d.ts +48 -0
- package/src/core/api-error.js +117 -0
- package/src/core/app-owner-fallback.d.ts +22 -0
- package/src/core/app-owner-fallback.js +39 -0
- package/src/core/app-scope-checker.d.ts +87 -0
- package/src/core/app-scope-checker.js +198 -0
- package/src/core/auth-errors.d.ts +144 -0
- package/src/core/auth-errors.js +160 -0
- package/src/core/card-action-operator.d.ts +33 -0
- package/src/core/card-action-operator.js +30 -0
- package/src/core/chat-info-cache.d.ts +67 -0
- package/src/core/chat-info-cache.js +165 -0
- package/src/core/comment-target.d.ts +65 -0
- package/src/core/comment-target.js +100 -0
- package/src/core/config-schema.d.ts +490 -0
- package/src/core/config-schema.js +223 -0
- package/src/core/device-flow.d.ts +77 -0
- package/src/core/device-flow.js +217 -0
- package/src/core/domains.d.ts +18 -0
- package/src/core/domains.js +34 -0
- package/src/core/feishu-fetch.d.ts +18 -0
- package/src/core/feishu-fetch.js +28 -0
- package/src/core/footer-config.d.ts +24 -0
- package/src/core/footer-config.js +51 -0
- package/src/core/lark-client.d.ts +125 -0
- package/src/core/lark-client.js +468 -0
- package/src/core/lark-logger.d.ts +23 -0
- package/src/core/lark-logger.js +160 -0
- package/src/core/lark-ticket.d.ts +29 -0
- package/src/core/lark-ticket.js +40 -0
- package/src/core/message-unavailable.d.ts +53 -0
- package/src/core/message-unavailable.js +142 -0
- package/src/core/owner-policy.d.ts +32 -0
- package/src/core/owner-policy.js +55 -0
- package/src/core/permission-url.d.ts +22 -0
- package/src/core/permission-url.js +76 -0
- package/src/core/raw-request.d.ts +27 -0
- package/src/core/raw-request.js +90 -0
- package/src/core/runtime-store.d.ts +13 -0
- package/src/core/runtime-store.js +29 -0
- package/src/core/scope-manager.d.ts +168 -0
- package/src/core/scope-manager.js +224 -0
- package/src/core/sdk-compat.d.ts +20 -0
- package/src/core/sdk-compat.js +28 -0
- package/src/core/security-check.d.ts +72 -0
- package/src/core/security-check.js +184 -0
- package/src/core/shutdown-hooks.d.ts +22 -0
- package/src/core/shutdown-hooks.js +61 -0
- package/src/core/synthetic-target.d.ts +33 -0
- package/src/core/synthetic-target.js +40 -0
- package/src/core/targets.d.ts +60 -0
- package/src/core/targets.js +173 -0
- package/src/core/token-store.d.ts +54 -0
- package/src/core/token-store.js +326 -0
- package/src/core/tool-client.d.ts +176 -0
- package/src/core/tool-client.js +426 -0
- package/src/core/tool-scopes.d.ts +156 -0
- package/src/core/tool-scopes.js +344 -0
- package/src/core/tools-config.d.ts +55 -0
- package/src/core/tools-config.js +143 -0
- package/src/core/types.d.ts +91 -0
- package/src/core/types.js +12 -0
- package/src/core/uat-client.d.ts +46 -0
- package/src/core/uat-client.js +192 -0
- package/src/core/version.d.ts +31 -0
- package/src/core/version.js +69 -0
- package/src/messaging/converters/audio.d.ts +8 -0
- package/src/messaging/converters/audio.js +24 -0
- package/src/messaging/converters/calendar.d.ts +13 -0
- package/src/messaging/converters/calendar.js +56 -0
- package/src/messaging/converters/content-converter-helpers.d.ts +30 -0
- package/src/messaging/converters/content-converter-helpers.js +82 -0
- package/src/messaging/converters/content-converter.d.ts +24 -0
- package/src/messaging/converters/content-converter.js +40 -0
- package/src/messaging/converters/file.d.ts +8 -0
- package/src/messaging/converters/file.js +24 -0
- package/src/messaging/converters/folder.d.ts +8 -0
- package/src/messaging/converters/folder.js +24 -0
- package/src/messaging/converters/hongbao.d.ts +8 -0
- package/src/messaging/converters/hongbao.js +20 -0
- package/src/messaging/converters/image.d.ts +8 -0
- package/src/messaging/converters/image.js +22 -0
- package/src/messaging/converters/index.d.ts +8 -0
- package/src/messaging/converters/index.js +53 -0
- package/src/messaging/converters/interactive/card-converter.d.ts +76 -0
- package/src/messaging/converters/interactive/card-converter.js +1177 -0
- package/src/messaging/converters/interactive/card-utils.d.ts +9 -0
- package/src/messaging/converters/interactive/card-utils.js +47 -0
- package/src/messaging/converters/interactive/index.d.ts +8 -0
- package/src/messaging/converters/interactive/index.js +25 -0
- package/src/messaging/converters/interactive/legacy.d.ts +11 -0
- package/src/messaging/converters/interactive/legacy.js +60 -0
- package/src/messaging/converters/interactive/types.d.ts +23 -0
- package/src/messaging/converters/interactive/types.js +27 -0
- package/src/messaging/converters/location.d.ts +8 -0
- package/src/messaging/converters/location.js +23 -0
- package/src/messaging/converters/merge-forward.d.ts +32 -0
- package/src/messaging/converters/merge-forward.js +235 -0
- package/src/messaging/converters/post.d.ts +11 -0
- package/src/messaging/converters/post.js +235 -0
- package/src/messaging/converters/share.d.ts +9 -0
- package/src/messaging/converters/share.js +28 -0
- package/src/messaging/converters/sticker.d.ts +8 -0
- package/src/messaging/converters/sticker.js +22 -0
- package/src/messaging/converters/system.d.ts +12 -0
- package/src/messaging/converters/system.js +36 -0
- package/src/messaging/converters/text.d.ts +8 -0
- package/src/messaging/converters/text.js +18 -0
- package/src/messaging/converters/todo.d.ts +8 -0
- package/src/messaging/converters/todo.js +45 -0
- package/src/messaging/converters/types.d.ts +114 -0
- package/src/messaging/converters/types.js +8 -0
- package/src/messaging/converters/unknown.d.ts +8 -0
- package/src/messaging/converters/unknown.js +20 -0
- package/src/messaging/converters/utils.d.ts +22 -0
- package/src/messaging/converters/utils.js +57 -0
- package/src/messaging/converters/video-chat.d.ts +8 -0
- package/src/messaging/converters/video-chat.js +31 -0
- package/src/messaging/converters/video.d.ts +8 -0
- package/src/messaging/converters/video.js +35 -0
- package/src/messaging/converters/vote.d.ts +8 -0
- package/src/messaging/converters/vote.js +28 -0
- package/src/messaging/inbound/bot-content.d.ts +84 -0
- package/src/messaging/inbound/bot-content.js +117 -0
- package/src/messaging/inbound/bot-loop-guard.d.ts +48 -0
- package/src/messaging/inbound/bot-loop-guard.js +89 -0
- package/src/messaging/inbound/comment-context.d.ts +82 -0
- package/src/messaging/inbound/comment-context.js +353 -0
- package/src/messaging/inbound/comment-handler.d.ts +30 -0
- package/src/messaging/inbound/comment-handler.js +269 -0
- package/src/messaging/inbound/dedup.d.ts +59 -0
- package/src/messaging/inbound/dedup.js +121 -0
- package/src/messaging/inbound/dispatch-builders.d.ts +104 -0
- package/src/messaging/inbound/dispatch-builders.js +241 -0
- package/src/messaging/inbound/dispatch-commands.d.ts +22 -0
- package/src/messaging/inbound/dispatch-commands.js +131 -0
- package/src/messaging/inbound/dispatch-context.d.ts +67 -0
- package/src/messaging/inbound/dispatch-context.js +153 -0
- package/src/messaging/inbound/dispatch.d.ts +50 -0
- package/src/messaging/inbound/dispatch.js +477 -0
- package/src/messaging/inbound/enrich.d.ts +102 -0
- package/src/messaging/inbound/enrich.js +236 -0
- package/src/messaging/inbound/gate-effects.d.ts +23 -0
- package/src/messaging/inbound/gate-effects.js +46 -0
- package/src/messaging/inbound/gate.d.ts +91 -0
- package/src/messaging/inbound/gate.js +342 -0
- package/src/messaging/inbound/handler-registry.d.ts +25 -0
- package/src/messaging/inbound/handler-registry.js +23 -0
- package/src/messaging/inbound/handler.d.ts +37 -0
- package/src/messaging/inbound/handler.js +286 -0
- package/src/messaging/inbound/media-resolver.d.ts +32 -0
- package/src/messaging/inbound/media-resolver.js +91 -0
- package/src/messaging/inbound/mention-registry.d.ts +59 -0
- package/src/messaging/inbound/mention-registry.js +115 -0
- package/src/messaging/inbound/mention.d.ts +48 -0
- package/src/messaging/inbound/mention.js +102 -0
- package/src/messaging/inbound/parse-io.d.ts +50 -0
- package/src/messaging/inbound/parse-io.js +86 -0
- package/src/messaging/inbound/parse.d.ts +28 -0
- package/src/messaging/inbound/parse.js +128 -0
- package/src/messaging/inbound/permission.d.ts +17 -0
- package/src/messaging/inbound/permission.js +44 -0
- package/src/messaging/inbound/policy.d.ts +95 -0
- package/src/messaging/inbound/policy.js +168 -0
- package/src/messaging/inbound/reaction-handler.d.ts +62 -0
- package/src/messaging/inbound/reaction-handler.js +259 -0
- package/src/messaging/inbound/sentinel-store.d.ts +37 -0
- package/src/messaging/inbound/sentinel-store.js +98 -0
- package/src/messaging/inbound/synthetic-message.d.ts +26 -0
- package/src/messaging/inbound/synthetic-message.js +59 -0
- package/src/messaging/inbound/user-name-cache-store.d.ts +62 -0
- package/src/messaging/inbound/user-name-cache-store.js +236 -0
- package/src/messaging/inbound/user-name-cache.d.ts +78 -0
- package/src/messaging/inbound/user-name-cache.js +306 -0
- package/src/messaging/inbound/vc-meeting-invited-handler.d.ts +20 -0
- package/src/messaging/inbound/vc-meeting-invited-handler.js +236 -0
- package/src/messaging/inbound/vc-sender.d.ts +41 -0
- package/src/messaging/inbound/vc-sender.js +53 -0
- package/src/messaging/outbound/actions.d.ts +16 -0
- package/src/messaging/outbound/actions.js +329 -0
- package/src/messaging/outbound/bot-peer-context.d.ts +42 -0
- package/src/messaging/outbound/bot-peer-context.js +40 -0
- package/src/messaging/outbound/chat-manage.d.ts +64 -0
- package/src/messaging/outbound/chat-manage.js +117 -0
- package/src/messaging/outbound/deliver.d.ts +186 -0
- package/src/messaging/outbound/deliver.js +410 -0
- package/src/messaging/outbound/fetch.d.ts +12 -0
- package/src/messaging/outbound/fetch.js +17 -0
- package/src/messaging/outbound/forward.d.ts +26 -0
- package/src/messaging/outbound/forward.js +51 -0
- package/src/messaging/outbound/media-url-utils.d.ts +29 -0
- package/src/messaging/outbound/media-url-utils.js +172 -0
- package/src/messaging/outbound/media.d.ts +260 -0
- package/src/messaging/outbound/media.js +865 -0
- package/src/messaging/outbound/normalize-mentions.d.ts +50 -0
- package/src/messaging/outbound/normalize-mentions.js +166 -0
- package/src/messaging/outbound/outbound-mention.d.ts +41 -0
- package/src/messaging/outbound/outbound-mention.js +112 -0
- package/src/messaging/outbound/outbound.d.ts +79 -0
- package/src/messaging/outbound/outbound.js +195 -0
- package/src/messaging/outbound/reactions.d.ts +124 -0
- package/src/messaging/outbound/reactions.js +384 -0
- package/src/messaging/outbound/send.d.ts +153 -0
- package/src/messaging/outbound/send.js +417 -0
- package/src/messaging/outbound/typing.d.ts +60 -0
- package/src/messaging/outbound/typing.js +139 -0
- package/src/messaging/shared/message-lookup.d.ts +54 -0
- package/src/messaging/shared/message-lookup.js +120 -0
- package/src/messaging/types.d.ts +316 -0
- package/src/messaging/types.js +11 -0
- package/src/tools/ask-user-question.d.ts +32 -0
- package/src/tools/ask-user-question.js +922 -0
- package/src/tools/auto-auth.d.ts +57 -0
- package/src/tools/auto-auth.js +904 -0
- package/src/tools/helpers.d.ts +264 -0
- package/src/tools/helpers.js +389 -0
- package/src/tools/mcp/doc/create.d.ts +12 -0
- package/src/tools/mcp/doc/create.js +47 -0
- package/src/tools/mcp/doc/fetch.d.ts +12 -0
- package/src/tools/mcp/doc/fetch.js +39 -0
- package/src/tools/mcp/doc/index.d.ts +12 -0
- package/src/tools/mcp/doc/index.js +50 -0
- package/src/tools/mcp/doc/update.d.ts +12 -0
- package/src/tools/mcp/doc/update.js +64 -0
- package/src/tools/mcp/shared.d.ts +59 -0
- package/src/tools/mcp/shared.js +239 -0
- package/src/tools/oapi/bitable/app-table-field.d.ts +16 -0
- package/src/tools/oapi/bitable/app-table-field.js +225 -0
- package/src/tools/oapi/bitable/app-table-record.d.ts +20 -0
- package/src/tools/oapi/bitable/app-table-record.js +439 -0
- package/src/tools/oapi/bitable/app-table-view.d.ts +16 -0
- package/src/tools/oapi/bitable/app-table-view.js +172 -0
- package/src/tools/oapi/bitable/app-table.d.ts +17 -0
- package/src/tools/oapi/bitable/app-table.js +195 -0
- package/src/tools/oapi/bitable/app.d.ts +18 -0
- package/src/tools/oapi/bitable/app.js +189 -0
- package/src/tools/oapi/bitable/index.d.ts +9 -0
- package/src/tools/oapi/bitable/index.js +17 -0
- package/src/tools/oapi/calendar/calendar.d.ts +15 -0
- package/src/tools/oapi/calendar/calendar.js +125 -0
- package/src/tools/oapi/calendar/event-attendee.d.ts +14 -0
- package/src/tools/oapi/calendar/event-attendee.js +161 -0
- package/src/tools/oapi/calendar/event.d.ts +16 -0
- package/src/tools/oapi/calendar/event.js +712 -0
- package/src/tools/oapi/calendar/freebusy.d.ts +13 -0
- package/src/tools/oapi/calendar/freebusy.js +114 -0
- package/src/tools/oapi/calendar/index.d.ts +8 -0
- package/src/tools/oapi/calendar/index.js +15 -0
- package/src/tools/oapi/chat/chat.d.ts +16 -0
- package/src/tools/oapi/chat/chat.js +127 -0
- package/src/tools/oapi/chat/index.d.ts +10 -0
- package/src/tools/oapi/chat/index.js +23 -0
- package/src/tools/oapi/chat/members.d.ts +11 -0
- package/src/tools/oapi/chat/members.js +84 -0
- package/src/tools/oapi/common/get-user.d.ts +12 -0
- package/src/tools/oapi/common/get-user.js +109 -0
- package/src/tools/oapi/common/index.d.ts +6 -0
- package/src/tools/oapi/common/index.js +11 -0
- package/src/tools/oapi/common/search-user.d.ts +11 -0
- package/src/tools/oapi/common/search-user.js +76 -0
- package/src/tools/oapi/drive/doc-comments.d.ts +15 -0
- package/src/tools/oapi/drive/doc-comments.js +351 -0
- package/src/tools/oapi/drive/doc-media.d.ts +19 -0
- package/src/tools/oapi/drive/doc-media.js +371 -0
- package/src/tools/oapi/drive/file.d.ts +19 -0
- package/src/tools/oapi/drive/file.js +519 -0
- package/src/tools/oapi/drive/index.d.ts +12 -0
- package/src/tools/oapi/drive/index.js +45 -0
- package/src/tools/oapi/helpers.d.ts +183 -0
- package/src/tools/oapi/helpers.js +385 -0
- package/src/tools/oapi/im/format-messages.d.ts +50 -0
- package/src/tools/oapi/im/format-messages.js +169 -0
- package/src/tools/oapi/im/index.d.ts +10 -0
- package/src/tools/oapi/im/index.js +25 -0
- package/src/tools/oapi/im/message-read.d.ts +13 -0
- package/src/tools/oapi/im/message-read.js +419 -0
- package/src/tools/oapi/im/message.d.ts +16 -0
- package/src/tools/oapi/im/message.js +152 -0
- package/src/tools/oapi/im/resource.d.ts +13 -0
- package/src/tools/oapi/im/resource.js +186 -0
- package/src/tools/oapi/im/time-utils.d.ts +46 -0
- package/src/tools/oapi/im/time-utils.js +212 -0
- package/src/tools/oapi/im/user-name-uat.d.ts +26 -0
- package/src/tools/oapi/im/user-name-uat.js +143 -0
- package/src/tools/oapi/index.d.ts +11 -0
- package/src/tools/oapi/index.js +64 -0
- package/src/tools/oapi/sdk-types.d.ts +96 -0
- package/src/tools/oapi/sdk-types.js +13 -0
- package/src/tools/oapi/search/doc-search.d.ts +13 -0
- package/src/tools/oapi/search/doc-search.js +194 -0
- package/src/tools/oapi/search/index.d.ts +12 -0
- package/src/tools/oapi/search/index.js +37 -0
- package/src/tools/oapi/sheets/index.d.ts +12 -0
- package/src/tools/oapi/sheets/index.js +35 -0
- package/src/tools/oapi/sheets/sheet.d.ts +16 -0
- package/src/tools/oapi/sheets/sheet.js +688 -0
- package/src/tools/oapi/task/attachment.d.ts +18 -0
- package/src/tools/oapi/task/attachment.js +107 -0
- package/src/tools/oapi/task/comment.d.ts +15 -0
- package/src/tools/oapi/task/comment.js +149 -0
- package/src/tools/oapi/task/index.d.ts +11 -0
- package/src/tools/oapi/task/index.js +21 -0
- package/src/tools/oapi/task/section.d.ts +17 -0
- package/src/tools/oapi/task/section.js +293 -0
- package/src/tools/oapi/task/subtask.d.ts +14 -0
- package/src/tools/oapi/task/subtask.js +171 -0
- package/src/tools/oapi/task/task.d.ts +19 -0
- package/src/tools/oapi/task/task.js +512 -0
- package/src/tools/oapi/task/task_agent.d.ts +14 -0
- package/src/tools/oapi/task/task_agent.js +108 -0
- package/src/tools/oapi/task/tasklist.d.ts +19 -0
- package/src/tools/oapi/task/tasklist.js +276 -0
- package/src/tools/oapi/wiki/index.d.ts +12 -0
- package/src/tools/oapi/wiki/index.js +42 -0
- package/src/tools/oapi/wiki/space-node.d.ts +17 -0
- package/src/tools/oapi/wiki/space-node.js +233 -0
- package/src/tools/oapi/wiki/space.d.ts +15 -0
- package/src/tools/oapi/wiki/space.js +133 -0
- package/src/tools/oauth-batch-auth.d.ts +11 -0
- package/src/tools/oauth-batch-auth.js +150 -0
- package/src/tools/oauth-cards.d.ts +39 -0
- package/src/tools/oauth-cards.js +324 -0
- package/src/tools/oauth.d.ts +47 -0
- package/src/tools/oauth.js +592 -0
- package/src/tools/onboarding-auth.d.ts +27 -0
- package/src/tools/onboarding-auth.js +133 -0
- package/src/tools/tat/im/index.d.ts +15 -0
- package/src/tools/tat/im/index.js +22 -0
- package/src/tools/tat/im/resource.d.ts +15 -0
- package/src/tools/tat/im/resource.js +192 -0
- package/tsdown.config.d.ts +2 -0
- package/tsdown.config.js +25 -0
- package/vitest.config.d.ts +2 -0
- package/vitest.config.js +12 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*
|
|
6
|
+
* Context enrichment for inbound Feishu messages.
|
|
7
|
+
*
|
|
8
|
+
* Enrichment phases:
|
|
9
|
+
*
|
|
10
|
+
* - **resolveSenderInfo** (lightweight, before gate) — resolves sender
|
|
11
|
+
* display name and tracks permission errors.
|
|
12
|
+
* - **prefetchUserNames** (after gate, before content resolution) — batch
|
|
13
|
+
* pre-warm the account-scoped user-name cache for the sender and all
|
|
14
|
+
* non-bot mentions so that downstream merge_forward expansion and
|
|
15
|
+
* quoted-message formatting can read names synchronously.
|
|
16
|
+
* - **resolveMedia** (after gate) — downloads binary media attachments
|
|
17
|
+
* using ResourceDescriptors from the converter phase.
|
|
18
|
+
* - **resolveQuotedContent** (after gate) — fetches the replied-to
|
|
19
|
+
* message text for context.
|
|
20
|
+
*
|
|
21
|
+
* Note: merge_forward expansion for the primary message is now handled
|
|
22
|
+
* at parse time in {@link parseMessageEvent}. Quoted merge_forward
|
|
23
|
+
* messages are still expanded here via {@link resolveQuotedContent}.
|
|
24
|
+
*/
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.resolveSenderInfo = resolveSenderInfo;
|
|
27
|
+
exports.prefetchUserNames = prefetchUserNames;
|
|
28
|
+
exports.resolveMedia = resolveMedia;
|
|
29
|
+
exports.substituteMediaPaths = substituteMediaPaths;
|
|
30
|
+
exports.resolveQuotedContent = resolveQuotedContent;
|
|
31
|
+
const fetch_1 = require("../outbound/fetch.js");
|
|
32
|
+
const permission_1 = require("./permission.js");
|
|
33
|
+
const user_name_cache_1 = require("./user-name-cache.js");
|
|
34
|
+
const media_resolver_1 = require("./media-resolver.js");
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// Phase 1: Sender info (lightweight, before gate)
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
/**
|
|
39
|
+
* Resolve the sender display name and track permission errors.
|
|
40
|
+
*
|
|
41
|
+
* This must run before the gate check because per-group sender
|
|
42
|
+
* allowlists may match on senderName.
|
|
43
|
+
*/
|
|
44
|
+
async function resolveSenderInfo(params) {
|
|
45
|
+
const { account, log } = params;
|
|
46
|
+
let ctx = params.ctx;
|
|
47
|
+
// Bots and users have separate name-resolution endpoints. The contact API
|
|
48
|
+
// does not return bot info, so dispatch on senderIsBot. Both endpoints
|
|
49
|
+
// populate the same account-scoped cache (keyed by openId).
|
|
50
|
+
//
|
|
51
|
+
// Skip resolution for unknown sender_types (e.g. anonymous, missing) — the
|
|
52
|
+
// contact API would 4xx and the bot API would not match. This preserves the
|
|
53
|
+
// pre-bot-support behavior of only resolving names for `sender_type === 'user'`.
|
|
54
|
+
const senderType = ctx.rawSender?.sender_type;
|
|
55
|
+
if (!ctx.senderIsBot && senderType !== 'user') {
|
|
56
|
+
log(`sender_type is "${senderType ?? 'undefined'}", skipping name resolution`);
|
|
57
|
+
return { ctx };
|
|
58
|
+
}
|
|
59
|
+
const senderResult = ctx.senderIsBot
|
|
60
|
+
? await (0, user_name_cache_1.resolveBotName)({ account, openId: ctx.senderId, log })
|
|
61
|
+
: await (0, user_name_cache_1.resolveUserName)({ account, openId: ctx.senderId, log });
|
|
62
|
+
if (senderResult.name) {
|
|
63
|
+
ctx = { ...ctx, senderName: senderResult.name };
|
|
64
|
+
log(`sender resolved: ${senderResult.name}`);
|
|
65
|
+
}
|
|
66
|
+
else if (senderResult.permissionError) {
|
|
67
|
+
log(`sender resolve failed: permission error code=${senderResult.permissionError.code}`);
|
|
68
|
+
}
|
|
69
|
+
// Track permission errors (with cooldown)
|
|
70
|
+
let permissionError;
|
|
71
|
+
if (senderResult.permissionError) {
|
|
72
|
+
const appKey = account.appId ?? 'default';
|
|
73
|
+
const now = Date.now();
|
|
74
|
+
const lastNotified = permission_1.permissionErrorNotifiedAt.get(appKey) ?? 0;
|
|
75
|
+
if (now - lastNotified > permission_1.PERMISSION_ERROR_COOLDOWN_MS) {
|
|
76
|
+
permission_1.permissionErrorNotifiedAt.set(appKey, now);
|
|
77
|
+
permissionError = senderResult.permissionError;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return { ctx, permissionError };
|
|
81
|
+
}
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Phase 1.5: Batch pre-warm user name cache (after gate)
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
/**
|
|
86
|
+
* Batch-prefetch user display names for the sender and all non-bot
|
|
87
|
+
* mentions. Mention names that are already known from the event payload
|
|
88
|
+
* are written into the cache for free.
|
|
89
|
+
*/
|
|
90
|
+
async function prefetchUserNames(params) {
|
|
91
|
+
const { ctx, account, log } = params;
|
|
92
|
+
if (!account.configured)
|
|
93
|
+
return;
|
|
94
|
+
const cache = (0, user_name_cache_1.getUserNameCache)(account.accountId);
|
|
95
|
+
// Seed cache with mention names already present in the event payload
|
|
96
|
+
for (const m of ctx.mentions) {
|
|
97
|
+
if (!m.isBot && m.openId && m.name) {
|
|
98
|
+
cache.set(m.openId, m.name);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Collect all openIds we care about
|
|
102
|
+
const openIds = new Set();
|
|
103
|
+
if (ctx.senderId)
|
|
104
|
+
openIds.add(ctx.senderId);
|
|
105
|
+
for (const m of ctx.mentions) {
|
|
106
|
+
if (!m.isBot && m.openId)
|
|
107
|
+
openIds.add(m.openId);
|
|
108
|
+
}
|
|
109
|
+
// Batch-resolve any that are still missing
|
|
110
|
+
const toResolve = cache.filterMissing([...openIds]);
|
|
111
|
+
if (toResolve.length > 0) {
|
|
112
|
+
await (0, user_name_cache_1.batchResolveUserNames)({ account, openIds: toResolve, log });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Download and save binary media attachments (images, files, audio,
|
|
117
|
+
* video, stickers) from the inbound message.
|
|
118
|
+
*
|
|
119
|
+
* Uses ResourceDescriptors extracted by content converters during the
|
|
120
|
+
* parse phase — no re-parsing of rawMessage.content needed.
|
|
121
|
+
*
|
|
122
|
+
* Returns a payload object whose keys (`MediaPath`, `MediaType`, …)
|
|
123
|
+
* are spread directly into the agent envelope, plus the raw mediaList
|
|
124
|
+
* for content substitution.
|
|
125
|
+
*/
|
|
126
|
+
async function resolveMedia(params) {
|
|
127
|
+
const { ctx, accountScopedCfg, account, log } = params;
|
|
128
|
+
const accountFeishuCfg = account.config;
|
|
129
|
+
const mediaMaxBytes = (accountFeishuCfg?.mediaMaxMb ?? 30) * 1024 * 1024;
|
|
130
|
+
const mediaList = await (0, media_resolver_1.downloadResources)({
|
|
131
|
+
cfg: accountScopedCfg,
|
|
132
|
+
messageId: ctx.messageId,
|
|
133
|
+
resources: ctx.resources,
|
|
134
|
+
maxBytes: mediaMaxBytes,
|
|
135
|
+
log,
|
|
136
|
+
accountId: account.accountId,
|
|
137
|
+
});
|
|
138
|
+
if (mediaList.length > 0) {
|
|
139
|
+
log(`media resolved: ${mediaList.length} attachment(s)`);
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
payload: (0, media_resolver_1.buildFeishuMediaPayload)(mediaList),
|
|
143
|
+
mediaList,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
// Media content substitution
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
/**
|
|
150
|
+
* Replace Feishu file-key references in message content with actual
|
|
151
|
+
* local file paths after download.
|
|
152
|
+
*
|
|
153
|
+
* This is critical for:
|
|
154
|
+
* - **Images / stickers**: The SDK's `detectAndLoadPromptImages` scans
|
|
155
|
+
* the prompt text for local file paths with image extensions.
|
|
156
|
+
* - **Audio / video / files**: Gives the AI meaningful context about
|
|
157
|
+
* what was received (the SDK reads these via `MediaPath` directly,
|
|
158
|
+
* but the text body should still reflect the actual attachments).
|
|
159
|
+
*/
|
|
160
|
+
function substituteMediaPaths(content, mediaList) {
|
|
161
|
+
let result = content;
|
|
162
|
+
for (const media of mediaList) {
|
|
163
|
+
const { fileKey, path, resourceType } = media;
|
|
164
|
+
switch (resourceType) {
|
|
165
|
+
case 'image':
|
|
166
|
+
//  → local path (SDK detects image extensions)
|
|
167
|
+
result = result.replace(``, path);
|
|
168
|
+
break;
|
|
169
|
+
case 'sticker':
|
|
170
|
+
// <sticker key="xxx"/> → local path (treated like image)
|
|
171
|
+
result = result.replace(`<sticker key="${fileKey}"/>`, path);
|
|
172
|
+
break;
|
|
173
|
+
case 'audio': {
|
|
174
|
+
// <audio key="xxx" .../> → [Audio: /path/to/audio.opus ...]
|
|
175
|
+
const audioRe = new RegExp(`<audio key="${escapeRegExp(fileKey)}"[^/]*/>`);
|
|
176
|
+
result = result.replace(audioRe, `[Audio: ${path}]`);
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
case 'file': {
|
|
180
|
+
// <file key="xxx" .../> → [File: /path/to/doc.pdf]
|
|
181
|
+
const fileRe = new RegExp(`<file key="${escapeRegExp(fileKey)}"[^/]*/>`);
|
|
182
|
+
result = result.replace(fileRe, `[File: ${path}]`);
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
case 'video': {
|
|
186
|
+
// <video key="xxx" .../> → [Video: /path/to/video.mp4]
|
|
187
|
+
const videoRe = new RegExp(`<video key="${escapeRegExp(fileKey)}"[^/]*/>`);
|
|
188
|
+
result = result.replace(videoRe, `[Video: ${path}]`);
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return result;
|
|
194
|
+
}
|
|
195
|
+
function escapeRegExp(s) {
|
|
196
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
197
|
+
}
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
// Phase 2b: Quoted / replied-to message (text context)
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
/**
|
|
202
|
+
* Fetch the text content of the message that the user replied to.
|
|
203
|
+
*
|
|
204
|
+
* If the quoted message is itself a merge_forward, its sub-messages are
|
|
205
|
+
* fetched and formatted as a single text block.
|
|
206
|
+
*
|
|
207
|
+
* Returns `"senderName: content"` when the sender name is available so
|
|
208
|
+
* the AI knows who originally wrote the quoted message.
|
|
209
|
+
*/
|
|
210
|
+
async function resolveQuotedContent(params) {
|
|
211
|
+
const { ctx, accountScopedCfg, account, log } = params;
|
|
212
|
+
if (!ctx.parentId)
|
|
213
|
+
return undefined;
|
|
214
|
+
try {
|
|
215
|
+
const quotedMsg = await (0, fetch_1.getMessageFeishu)({
|
|
216
|
+
cfg: accountScopedCfg,
|
|
217
|
+
messageId: ctx.parentId,
|
|
218
|
+
accountId: account.accountId,
|
|
219
|
+
expandForward: true,
|
|
220
|
+
});
|
|
221
|
+
if (!quotedMsg)
|
|
222
|
+
return undefined;
|
|
223
|
+
log(`feishu[${account.accountId}]: fetched quoted message: ${quotedMsg.content?.slice(0, 100)}`);
|
|
224
|
+
// Build quoted text with message_id prefix so AI can correlate
|
|
225
|
+
// file_key / image_key with the source message for resource download.
|
|
226
|
+
const prefix = `[message_id=${ctx.parentId}]`;
|
|
227
|
+
if (quotedMsg.senderName) {
|
|
228
|
+
return `${prefix} ${quotedMsg.senderName}: ${quotedMsg.content}`;
|
|
229
|
+
}
|
|
230
|
+
return `${prefix} ${quotedMsg.content}`;
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
log(`feishu[${account.accountId}]: failed to fetch quoted message: ${String(err)}`);
|
|
234
|
+
return undefined;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
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>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*
|
|
6
|
+
* Side-effect functions for the inbound message gate.
|
|
7
|
+
*
|
|
8
|
+
* Extracted from gate.ts to separate pure policy decisions from I/O
|
|
9
|
+
* operations (pairing request creation, message sending).
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.sendPairingReply = sendPairingReply;
|
|
13
|
+
const lark_client_1 = require("../../core/lark-client.js");
|
|
14
|
+
const send_1 = require("../outbound/send.js");
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Pairing reply
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
/**
|
|
19
|
+
* Create a pairing request and send a pairing reply message to the user.
|
|
20
|
+
*
|
|
21
|
+
* This is the side-effect portion of the DM pairing gate: the pure
|
|
22
|
+
* policy decision (whether to pair) is made in gate.ts, and this
|
|
23
|
+
* function executes the resulting I/O.
|
|
24
|
+
*/
|
|
25
|
+
async function sendPairingReply(params) {
|
|
26
|
+
const { senderId, chatId, accountId, accountScopedCfg } = params;
|
|
27
|
+
const core = lark_client_1.LarkClient.runtime;
|
|
28
|
+
const { code } = await core.channel.pairing.upsertPairingRequest({
|
|
29
|
+
channel: 'feishu',
|
|
30
|
+
id: senderId,
|
|
31
|
+
accountId,
|
|
32
|
+
});
|
|
33
|
+
const pairingReply = core.channel.pairing.buildPairingReply({
|
|
34
|
+
channel: 'feishu',
|
|
35
|
+
idLine: senderId,
|
|
36
|
+
code,
|
|
37
|
+
});
|
|
38
|
+
if (accountScopedCfg) {
|
|
39
|
+
await (0, send_1.sendMessageFeishu)({
|
|
40
|
+
cfg: accountScopedCfg,
|
|
41
|
+
to: chatId,
|
|
42
|
+
text: pairingReply,
|
|
43
|
+
accountId,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
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 } from 'openclaw/plugin-sdk';
|
|
26
|
+
import type { HistoryEntry } from 'openclaw/plugin-sdk/reply-history';
|
|
27
|
+
import type { MessageContext } from '../types';
|
|
28
|
+
import type { FeishuConfig, FeishuGroupConfig, LarkAccount } from '../../core/types';
|
|
29
|
+
/**
|
|
30
|
+
* Resolve the effective `respondToMentionAll` setting.
|
|
31
|
+
*
|
|
32
|
+
* Precedence: per-group > default ("*") group > global account config > false.
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveRespondToMentionAll(params: {
|
|
35
|
+
groupConfig?: {
|
|
36
|
+
respondToMentionAll?: boolean;
|
|
37
|
+
};
|
|
38
|
+
defaultConfig?: {
|
|
39
|
+
respondToMentionAll?: boolean;
|
|
40
|
+
};
|
|
41
|
+
accountFeishuCfg?: {
|
|
42
|
+
respondToMentionAll?: boolean;
|
|
43
|
+
};
|
|
44
|
+
}): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Resolve the effective allowBots setting.
|
|
47
|
+
*
|
|
48
|
+
* Precedence: per-group > default ("*") > account > 'mentions'.
|
|
49
|
+
*
|
|
50
|
+
* The `'mentions'` default lets bot-to-bot interaction work out of the box
|
|
51
|
+
* while still requiring an explicit @-mention in groups; DMs treat it as
|
|
52
|
+
* pass-through. Operators can opt into fully-open (`true`) or fully-closed
|
|
53
|
+
* (`false`) explicitly.
|
|
54
|
+
*/
|
|
55
|
+
export declare function resolveAllowBots(params: {
|
|
56
|
+
groupConfig?: FeishuGroupConfig;
|
|
57
|
+
defaultConfig?: FeishuGroupConfig;
|
|
58
|
+
accountFeishuCfg?: FeishuConfig;
|
|
59
|
+
}): boolean | 'mentions';
|
|
60
|
+
/**
|
|
61
|
+
* Read the pairing allowFrom store for the Feishu channel via the SDK runtime.
|
|
62
|
+
*/
|
|
63
|
+
declare function readAllowFromStore(accountId: string): Promise<string[]>;
|
|
64
|
+
export interface GateResult {
|
|
65
|
+
allowed: boolean;
|
|
66
|
+
reason?: string;
|
|
67
|
+
/** When a group message is rejected due to missing bot mention, the
|
|
68
|
+
* caller should record this entry into the chat history map. */
|
|
69
|
+
historyEntry?: HistoryEntry;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Read the pairing allowFrom store for the Feishu channel.
|
|
73
|
+
*
|
|
74
|
+
* Exported so that handler.ts can provide it as a closure to the SDK's
|
|
75
|
+
* `resolveSenderCommandAuthorization` helper.
|
|
76
|
+
*/
|
|
77
|
+
export { readAllowFromStore as readFeishuAllowFromStore };
|
|
78
|
+
/**
|
|
79
|
+
* Check whether an inbound message passes all access-control gates.
|
|
80
|
+
*
|
|
81
|
+
* The DM gate is async because it may read from the pairing store
|
|
82
|
+
* and send pairing request messages.
|
|
83
|
+
*/
|
|
84
|
+
export declare function checkMessageGate(params: {
|
|
85
|
+
ctx: MessageContext;
|
|
86
|
+
accountFeishuCfg?: FeishuConfig;
|
|
87
|
+
account: LarkAccount;
|
|
88
|
+
/** account 级别的 ClawdbotConfig(channels.feishu 已替换为 per-account 合并后的配置) */
|
|
89
|
+
accountScopedCfg?: ClawdbotConfig;
|
|
90
|
+
log: (...args: unknown[]) => void;
|
|
91
|
+
}): Promise<GateResult>;
|