@lark-project/openclaw-lark-project 2026.3.131
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 +80 -0
- package/README.zh.md +80 -0
- package/dist/index.js +172 -0
- package/dist/index.js.map +7 -0
- package/dist/skills/feishu-bitable/SKILL.md +248 -0
- package/dist/skills/feishu-bitable/references/examples.md +813 -0
- package/dist/skills/feishu-bitable/references/field-properties.md +763 -0
- package/dist/skills/feishu-bitable/references/record-values.md +911 -0
- package/dist/skills/feishu-calendar/SKILL.md +244 -0
- package/dist/skills/feishu-channel-rules/SKILL.md +18 -0
- package/dist/skills/feishu-channel-rules/references/markdown-syntax.md +138 -0
- package/dist/skills/feishu-create-doc/SKILL.md +719 -0
- package/dist/skills/feishu-fetch-doc/SKILL.md +93 -0
- package/dist/skills/feishu-im-read/SKILL.md +163 -0
- package/dist/skills/feishu-project/SKILL.md +122 -0
- package/dist/skills/feishu-task/SKILL.md +293 -0
- package/dist/skills/feishu-troubleshoot/SKILL.md +70 -0
- package/dist/skills/feishu-update-doc/SKILL.md +285 -0
- package/dist/src/card/builder.js +293 -0
- package/dist/src/card/builder.js.map +7 -0
- package/dist/src/card/cardkit.js +126 -0
- package/dist/src/card/cardkit.js.map +7 -0
- package/dist/src/card/flush-controller.js +107 -0
- package/dist/src/card/flush-controller.js.map +7 -0
- package/dist/src/card/markdown-style.js +57 -0
- package/dist/src/card/markdown-style.js.map +7 -0
- package/dist/src/card/reply-dispatcher-types.js +39 -0
- package/dist/src/card/reply-dispatcher-types.js.map +7 -0
- package/dist/src/card/reply-dispatcher.js +245 -0
- package/dist/src/card/reply-dispatcher.js.map +7 -0
- package/dist/src/card/reply-mode.js +29 -0
- package/dist/src/card/reply-mode.js.map +7 -0
- package/dist/src/card/streaming-card-controller.js +653 -0
- package/dist/src/card/streaming-card-controller.js.map +7 -0
- package/dist/src/card/unavailable-guard.js +76 -0
- package/dist/src/card/unavailable-guard.js.map +7 -0
- package/dist/src/channel/abort-detect.js +79 -0
- package/dist/src/channel/abort-detect.js.map +7 -0
- package/dist/src/channel/chat-queue.js +50 -0
- package/dist/src/channel/chat-queue.js.map +7 -0
- package/dist/src/channel/config-adapter.js +89 -0
- package/dist/src/channel/config-adapter.js.map +7 -0
- package/dist/src/channel/directory.js +133 -0
- package/dist/src/channel/directory.js.map +7 -0
- package/dist/src/channel/event-handlers.js +175 -0
- package/dist/src/channel/event-handlers.js.map +7 -0
- package/dist/src/channel/monitor.js +108 -0
- package/dist/src/channel/monitor.js.map +7 -0
- package/dist/src/channel/onboarding-config.js +76 -0
- package/dist/src/channel/onboarding-config.js.map +7 -0
- package/dist/src/channel/onboarding-migrate.js +55 -0
- package/dist/src/channel/onboarding-migrate.js.map +7 -0
- package/dist/src/channel/onboarding.js +285 -0
- package/dist/src/channel/onboarding.js.map +7 -0
- package/dist/src/channel/plugin.js +260 -0
- package/dist/src/channel/plugin.js.map +7 -0
- package/dist/src/channel/probe.js +14 -0
- package/dist/src/channel/probe.js.map +7 -0
- package/dist/src/channel/types.js +1 -0
- package/dist/src/channel/types.js.map +7 -0
- package/dist/src/commands/auth.js +73 -0
- package/dist/src/commands/auth.js.map +7 -0
- package/dist/src/commands/diagnose.js +658 -0
- package/dist/src/commands/diagnose.js.map +7 -0
- package/dist/src/commands/doctor.js +327 -0
- package/dist/src/commands/doctor.js.map +7 -0
- package/dist/src/commands/index.js +124 -0
- package/dist/src/commands/index.js.map +7 -0
- package/dist/src/core/accounts.js +129 -0
- package/dist/src/core/accounts.js.map +7 -0
- package/dist/src/core/agent-config.js +60 -0
- package/dist/src/core/agent-config.js.map +7 -0
- package/dist/src/core/api-error.js +55 -0
- package/dist/src/core/api-error.js.map +7 -0
- package/dist/src/core/app-owner-fallback.js +17 -0
- package/dist/src/core/app-owner-fallback.js.map +7 -0
- package/dist/src/core/app-scope-checker.js +95 -0
- package/dist/src/core/app-scope-checker.js.map +7 -0
- package/dist/src/core/auth-errors.js +120 -0
- package/dist/src/core/auth-errors.js.map +7 -0
- package/dist/src/core/chat-info-cache.js +102 -0
- package/dist/src/core/chat-info-cache.js.map +7 -0
- package/dist/src/core/config-schema.js +150 -0
- package/dist/src/core/config-schema.js.map +7 -0
- package/dist/src/core/device-flow.js +174 -0
- package/dist/src/core/device-flow.js.map +7 -0
- package/dist/src/core/feishu-fetch.js +12 -0
- package/dist/src/core/feishu-fetch.js.map +7 -0
- package/dist/src/core/footer-config.js +16 -0
- package/dist/src/core/footer-config.js.map +7 -0
- package/dist/src/core/lark-client.js +322 -0
- package/dist/src/core/lark-client.js.map +7 -0
- package/dist/src/core/lark-logger.js +92 -0
- package/dist/src/core/lark-logger.js.map +7 -0
- package/dist/src/core/lark-ticket.js +18 -0
- package/dist/src/core/lark-ticket.js.map +7 -0
- package/dist/src/core/message-unavailable.js +119 -0
- package/dist/src/core/message-unavailable.js.map +7 -0
- package/dist/src/core/owner-policy.js +25 -0
- package/dist/src/core/owner-policy.js.map +7 -0
- package/dist/src/core/permission-url.js +37 -0
- package/dist/src/core/permission-url.js.map +7 -0
- package/dist/src/core/project-auth.js +177 -0
- package/dist/src/core/project-auth.js.map +7 -0
- package/dist/src/core/project-oauth-flow.js +124 -0
- package/dist/src/core/project-oauth-flow.js.map +7 -0
- package/dist/src/core/project-token-store.js +172 -0
- package/dist/src/core/project-token-store.js.map +7 -0
- package/dist/src/core/raw-request.js +45 -0
- package/dist/src/core/raw-request.js.map +7 -0
- package/dist/src/core/scope-manager.js +62 -0
- package/dist/src/core/scope-manager.js.map +7 -0
- package/dist/src/core/security-check.js +118 -0
- package/dist/src/core/security-check.js.map +7 -0
- package/dist/src/core/shutdown-hooks.js +37 -0
- package/dist/src/core/shutdown-hooks.js.map +7 -0
- package/dist/src/core/targets.js +55 -0
- package/dist/src/core/targets.js.map +7 -0
- package/dist/src/core/token-store.js +215 -0
- package/dist/src/core/token-store.js.map +7 -0
- package/dist/src/core/tool-client.js +335 -0
- package/dist/src/core/tool-client.js.map +7 -0
- package/dist/src/core/tool-scopes.js +207 -0
- package/dist/src/core/tool-scopes.js.map +7 -0
- package/dist/src/core/tools-config.js +57 -0
- package/dist/src/core/tools-config.js.map +7 -0
- package/dist/src/core/types.js +1 -0
- package/dist/src/core/types.js.map +7 -0
- package/dist/src/core/uat-client.js +124 -0
- package/dist/src/core/uat-client.js.map +7 -0
- package/dist/src/core/version.js +27 -0
- package/dist/src/core/version.js.map +7 -0
- package/dist/src/messaging/converters/audio.js +19 -0
- package/dist/src/messaging/converters/audio.js.map +7 -0
- package/dist/src/messaging/converters/calendar.js +46 -0
- package/dist/src/messaging/converters/calendar.js.map +7 -0
- package/dist/src/messaging/converters/content-converter.js +61 -0
- package/dist/src/messaging/converters/content-converter.js.map +7 -0
- package/dist/src/messaging/converters/file.js +18 -0
- package/dist/src/messaging/converters/file.js.map +7 -0
- package/dist/src/messaging/converters/folder.js +18 -0
- package/dist/src/messaging/converters/folder.js.map +7 -0
- package/dist/src/messaging/converters/hongbao.js +14 -0
- package/dist/src/messaging/converters/hongbao.js.map +7 -0
- package/dist/src/messaging/converters/image.js +16 -0
- package/dist/src/messaging/converters/image.js.map +7 -0
- package/dist/src/messaging/converters/index.js +48 -0
- package/dist/src/messaging/converters/index.js.map +7 -0
- package/dist/src/messaging/converters/interactive/card-converter.js +1040 -0
- package/dist/src/messaging/converters/interactive/card-converter.js.map +7 -0
- package/dist/src/messaging/converters/interactive/card-utils.js +36 -0
- package/dist/src/messaging/converters/interactive/card-utils.js.map +7 -0
- package/dist/src/messaging/converters/interactive/index.js +19 -0
- package/dist/src/messaging/converters/interactive/index.js.map +7 -0
- package/dist/src/messaging/converters/interactive/legacy.js +53 -0
- package/dist/src/messaging/converters/interactive/legacy.js.map +7 -0
- package/dist/src/messaging/converters/interactive/types.js +23 -0
- package/dist/src/messaging/converters/interactive/types.js.map +7 -0
- package/dist/src/messaging/converters/location.js +17 -0
- package/dist/src/messaging/converters/location.js.map +7 -0
- package/dist/src/messaging/converters/merge-forward.js +143 -0
- package/dist/src/messaging/converters/merge-forward.js.map +7 -0
- package/dist/src/messaging/converters/post.js +113 -0
- package/dist/src/messaging/converters/post.js.map +7 -0
- package/dist/src/messaging/converters/share.js +22 -0
- package/dist/src/messaging/converters/share.js.map +7 -0
- package/dist/src/messaging/converters/sticker.js +16 -0
- package/dist/src/messaging/converters/sticker.js.map +7 -0
- package/dist/src/messaging/converters/system.js +25 -0
- package/dist/src/messaging/converters/system.js.map +7 -0
- package/dist/src/messaging/converters/text.js +12 -0
- package/dist/src/messaging/converters/text.js.map +7 -0
- package/dist/src/messaging/converters/todo.js +37 -0
- package/dist/src/messaging/converters/todo.js.map +7 -0
- package/dist/src/messaging/converters/types.js +1 -0
- package/dist/src/messaging/converters/types.js.map +7 -0
- package/dist/src/messaging/converters/unknown.js +13 -0
- package/dist/src/messaging/converters/unknown.js.map +7 -0
- package/dist/src/messaging/converters/utils.js +35 -0
- package/dist/src/messaging/converters/utils.js.map +7 -0
- package/dist/src/messaging/converters/video-chat.js +21 -0
- package/dist/src/messaging/converters/video-chat.js.map +7 -0
- package/dist/src/messaging/converters/video.js +30 -0
- package/dist/src/messaging/converters/video.js.map +7 -0
- package/dist/src/messaging/converters/vote.js +24 -0
- package/dist/src/messaging/converters/vote.js.map +7 -0
- package/dist/src/messaging/inbound/dedup.js +82 -0
- package/dist/src/messaging/inbound/dedup.js.map +7 -0
- package/dist/src/messaging/inbound/dispatch-builders.js +98 -0
- package/dist/src/messaging/inbound/dispatch-builders.js.map +7 -0
- package/dist/src/messaging/inbound/dispatch-commands.js +94 -0
- package/dist/src/messaging/inbound/dispatch-commands.js.map +7 -0
- package/dist/src/messaging/inbound/dispatch-context.js +96 -0
- package/dist/src/messaging/inbound/dispatch-context.js.map +7 -0
- package/dist/src/messaging/inbound/dispatch.js +150 -0
- package/dist/src/messaging/inbound/dispatch.js.map +7 -0
- package/dist/src/messaging/inbound/enrich.js +137 -0
- package/dist/src/messaging/inbound/enrich.js.map +7 -0
- package/dist/src/messaging/inbound/gate-effects.js +28 -0
- package/dist/src/messaging/inbound/gate-effects.js.map +7 -0
- package/dist/src/messaging/inbound/gate.js +163 -0
- package/dist/src/messaging/inbound/gate.js.map +7 -0
- package/dist/src/messaging/inbound/handler.js +132 -0
- package/dist/src/messaging/inbound/handler.js.map +7 -0
- package/dist/src/messaging/inbound/media-resolver.js +70 -0
- package/dist/src/messaging/inbound/media-resolver.js.map +7 -0
- package/dist/src/messaging/inbound/mention.js +50 -0
- package/dist/src/messaging/inbound/mention.js.map +7 -0
- package/dist/src/messaging/inbound/parse-io.js +41 -0
- package/dist/src/messaging/inbound/parse-io.js.map +7 -0
- package/dist/src/messaging/inbound/parse.js +79 -0
- package/dist/src/messaging/inbound/parse.js.map +7 -0
- package/dist/src/messaging/inbound/permission.js +30 -0
- package/dist/src/messaging/inbound/permission.js.map +7 -0
- package/dist/src/messaging/inbound/policy.js +83 -0
- package/dist/src/messaging/inbound/policy.js.map +7 -0
- package/dist/src/messaging/inbound/reaction-handler.js +162 -0
- package/dist/src/messaging/inbound/reaction-handler.js.map +7 -0
- package/dist/src/messaging/inbound/user-name-cache.js +172 -0
- package/dist/src/messaging/inbound/user-name-cache.js.map +7 -0
- package/dist/src/messaging/outbound/actions.js +239 -0
- package/dist/src/messaging/outbound/actions.js.map +7 -0
- package/dist/src/messaging/outbound/chat-manage.js +74 -0
- package/dist/src/messaging/outbound/chat-manage.js.map +7 -0
- package/dist/src/messaging/outbound/deliver.js +162 -0
- package/dist/src/messaging/outbound/deliver.js.map +7 -0
- package/dist/src/messaging/outbound/fetch.js +7 -0
- package/dist/src/messaging/outbound/fetch.js.map +7 -0
- package/dist/src/messaging/outbound/forward.js +31 -0
- package/dist/src/messaging/outbound/forward.js.map +7 -0
- package/dist/src/messaging/outbound/media-url-utils.js +101 -0
- package/dist/src/messaging/outbound/media-url-utils.js.map +7 -0
- package/dist/src/messaging/outbound/media.js +463 -0
- package/dist/src/messaging/outbound/media.js.map +7 -0
- package/dist/src/messaging/outbound/outbound.js +95 -0
- package/dist/src/messaging/outbound/outbound.js.map +7 -0
- package/dist/src/messaging/outbound/reactions.js +312 -0
- package/dist/src/messaging/outbound/reactions.js.map +7 -0
- package/dist/src/messaging/outbound/send.js +194 -0
- package/dist/src/messaging/outbound/send.js.map +7 -0
- package/dist/src/messaging/outbound/typing.js +77 -0
- package/dist/src/messaging/outbound/typing.js.map +7 -0
- package/dist/src/messaging/shared/message-lookup.js +84 -0
- package/dist/src/messaging/shared/message-lookup.js.map +7 -0
- package/dist/src/messaging/types.js +1 -0
- package/dist/src/messaging/types.js.map +7 -0
- package/dist/src/tools/auto-auth.js +714 -0
- package/dist/src/tools/auto-auth.js.map +7 -0
- package/dist/src/tools/helpers.js +133 -0
- package/dist/src/tools/helpers.js.map +7 -0
- package/dist/src/tools/mcp/doc/create.js +35 -0
- package/dist/src/tools/mcp/doc/create.js.map +7 -0
- package/dist/src/tools/mcp/doc/fetch.js +33 -0
- package/dist/src/tools/mcp/doc/fetch.js.map +7 -0
- package/dist/src/tools/mcp/doc/index.js +32 -0
- package/dist/src/tools/mcp/doc/index.js.map +7 -0
- package/dist/src/tools/mcp/doc/update.js +61 -0
- package/dist/src/tools/mcp/doc/update.js.map +7 -0
- package/dist/src/tools/mcp/project/endpoint.js +25 -0
- package/dist/src/tools/mcp/project/endpoint.js.map +7 -0
- package/dist/src/tools/mcp/project/index.js +27 -0
- package/dist/src/tools/mcp/project/index.js.map +7 -0
- package/dist/src/tools/mcp/project/tools.js +579 -0
- package/dist/src/tools/mcp/project/tools.js.map +7 -0
- package/dist/src/tools/mcp/shared.js +170 -0
- package/dist/src/tools/mcp/shared.js.map +7 -0
- package/dist/src/tools/oapi/bitable/app-table-field.js +244 -0
- package/dist/src/tools/oapi/bitable/app-table-field.js.map +7 -0
- package/dist/src/tools/oapi/bitable/app-table-record.js +501 -0
- package/dist/src/tools/oapi/bitable/app-table-record.js.map +7 -0
- package/dist/src/tools/oapi/bitable/app-table-view.js +226 -0
- package/dist/src/tools/oapi/bitable/app-table-view.js.map +7 -0
- package/dist/src/tools/oapi/bitable/app-table.js +278 -0
- package/dist/src/tools/oapi/bitable/app-table.js.map +7 -0
- package/dist/src/tools/oapi/bitable/app.js +200 -0
- package/dist/src/tools/oapi/bitable/app.js.map +7 -0
- package/dist/src/tools/oapi/bitable/index.js +13 -0
- package/dist/src/tools/oapi/bitable/index.js.map +7 -0
- package/dist/src/tools/oapi/calendar/calendar.js +131 -0
- package/dist/src/tools/oapi/calendar/calendar.js.map +7 -0
- package/dist/src/tools/oapi/calendar/event-attendee.js +301 -0
- package/dist/src/tools/oapi/calendar/event-attendee.js.map +7 -0
- package/dist/src/tools/oapi/calendar/event.js +834 -0
- package/dist/src/tools/oapi/calendar/event.js.map +7 -0
- package/dist/src/tools/oapi/calendar/freebusy.js +111 -0
- package/dist/src/tools/oapi/calendar/freebusy.js.map +7 -0
- package/dist/src/tools/oapi/calendar/index.js +11 -0
- package/dist/src/tools/oapi/calendar/index.js.map +7 -0
- package/dist/src/tools/oapi/chat/chat.js +132 -0
- package/dist/src/tools/oapi/chat/chat.js.map +7 -0
- package/dist/src/tools/oapi/chat/index.js +11 -0
- package/dist/src/tools/oapi/chat/index.js.map +7 -0
- package/dist/src/tools/oapi/chat/members.js +83 -0
- package/dist/src/tools/oapi/chat/members.js.map +7 -0
- package/dist/src/tools/oapi/common/get-user.js +95 -0
- package/dist/src/tools/oapi/common/get-user.js.map +7 -0
- package/dist/src/tools/oapi/common/index.js +7 -0
- package/dist/src/tools/oapi/common/index.js.map +7 -0
- package/dist/src/tools/oapi/common/search-user.js +67 -0
- package/dist/src/tools/oapi/common/search-user.js.map +7 -0
- package/dist/src/tools/oapi/drive/doc-comments.js +310 -0
- package/dist/src/tools/oapi/drive/doc-comments.js.map +7 -0
- package/dist/src/tools/oapi/drive/doc-media.js +314 -0
- package/dist/src/tools/oapi/drive/doc-media.js.map +7 -0
- package/dist/src/tools/oapi/drive/file.js +548 -0
- package/dist/src/tools/oapi/drive/file.js.map +7 -0
- package/dist/src/tools/oapi/drive/index.js +29 -0
- package/dist/src/tools/oapi/drive/index.js.map +7 -0
- package/dist/src/tools/oapi/helpers.js +199 -0
- package/dist/src/tools/oapi/helpers.js.map +7 -0
- package/dist/src/tools/oapi/im/format-messages.js +128 -0
- package/dist/src/tools/oapi/im/format-messages.js.map +7 -0
- package/dist/src/tools/oapi/im/index.js +15 -0
- package/dist/src/tools/oapi/im/index.js.map +7 -0
- package/dist/src/tools/oapi/im/message-read.js +404 -0
- package/dist/src/tools/oapi/im/message-read.js.map +7 -0
- package/dist/src/tools/oapi/im/message.js +179 -0
- package/dist/src/tools/oapi/im/message.js.map +7 -0
- package/dist/src/tools/oapi/im/resource.js +126 -0
- package/dist/src/tools/oapi/im/resource.js.map +7 -0
- package/dist/src/tools/oapi/im/time-utils.js +169 -0
- package/dist/src/tools/oapi/im/time-utils.js.map +7 -0
- package/dist/src/tools/oapi/im/user-name-uat.js +103 -0
- package/dist/src/tools/oapi/im/user-name-uat.js.map +7 -0
- package/dist/src/tools/oapi/index.js +56 -0
- package/dist/src/tools/oapi/index.js.map +7 -0
- package/dist/src/tools/oapi/sdk-types.js +1 -0
- package/dist/src/tools/oapi/sdk-types.js.map +7 -0
- package/dist/src/tools/oapi/search/doc-search.js +215 -0
- package/dist/src/tools/oapi/search/doc-search.js.map +7 -0
- package/dist/src/tools/oapi/search/index.js +25 -0
- package/dist/src/tools/oapi/search/index.js.map +7 -0
- package/dist/src/tools/oapi/sheets/index.js +25 -0
- package/dist/src/tools/oapi/sheets/index.js.map +7 -0
- package/dist/src/tools/oapi/sheets/sheet.js +652 -0
- package/dist/src/tools/oapi/sheets/sheet.js.map +7 -0
- package/dist/src/tools/oapi/task/comment.js +151 -0
- package/dist/src/tools/oapi/task/comment.js.map +7 -0
- package/dist/src/tools/oapi/task/index.js +11 -0
- package/dist/src/tools/oapi/task/index.js.map +7 -0
- package/dist/src/tools/oapi/task/subtask.js +175 -0
- package/dist/src/tools/oapi/task/subtask.js.map +7 -0
- package/dist/src/tools/oapi/task/task.js +405 -0
- package/dist/src/tools/oapi/task/task.js.map +7 -0
- package/dist/src/tools/oapi/task/tasklist.js +366 -0
- package/dist/src/tools/oapi/task/tasklist.js.map +7 -0
- package/dist/src/tools/oapi/wiki/index.js +27 -0
- package/dist/src/tools/oapi/wiki/index.js.map +7 -0
- package/dist/src/tools/oapi/wiki/space-node.js +311 -0
- package/dist/src/tools/oapi/wiki/space-node.js.map +7 -0
- package/dist/src/tools/oapi/wiki/space.js +148 -0
- package/dist/src/tools/oapi/wiki/space.js.map +7 -0
- package/dist/src/tools/oauth-batch-auth.js +125 -0
- package/dist/src/tools/oauth-batch-auth.js.map +7 -0
- package/dist/src/tools/oauth-cards.js +269 -0
- package/dist/src/tools/oauth-cards.js.map +7 -0
- package/dist/src/tools/oauth.js +538 -0
- package/dist/src/tools/oauth.js.map +7 -0
- package/dist/src/tools/onboarding-auth.js +101 -0
- package/dist/src/tools/onboarding-auth.js.map +7 -0
- package/dist/src/tools/project-oauth.js +305 -0
- package/dist/src/tools/project-oauth.js.map +7 -0
- package/dist/src/tools/tat/im/index.js +9 -0
- package/dist/src/tools/tat/im/index.js.map +7 -0
- package/dist/src/tools/tat/im/resource.js +123 -0
- package/dist/src/tools/tat/im/resource.js.map +7 -0
- package/package.json +64 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/tools/mcp/project/tools.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n *\n * \u98DE\u4E66\u9879\u76EE MCP \u5DE5\u5177\u6CE8\u518C\n *\n * \u6BCF\u4E2A\u5DE5\u5177\u4F7F\u7528\u98DE\u4E66\u9879\u76EE\u4E13\u5C5E\u7684 MCP \u7AEF\u70B9\u548C\u72EC\u7ACB\u7684 OAuth token\u3002\n * \u4E0D\u901A\u8FC7 registerMcpTool\uFF08\u4F7F\u7528\u98DE\u4E66 Open API UAT\uFF09\uFF0C\u800C\u662F\u4F7F\u7528\n * registerProjectMcpTool \u5305\u88C5\u51FD\u6570\u3002\n *\n * \u5DE5\u5177\u53C2\u6570\u7B7E\u540D\u53C2\u7167\u98DE\u4E66\u9879\u76EE MCP Server \u7684\u5B9E\u9645\u5B9A\u4E49\u3002\n */\n\nimport type { OpenClawPluginApi } from 'openclaw/plugin-sdk';\nimport type { TSchema } from '@sinclair/typebox';\nimport { Type } from '@sinclair/typebox';\nimport type { McpRpcResponse } from '../shared';\nimport { isRecord, unwrapJsonRpcResult } from '../shared';\nimport { createToolContext, formatToolResult } from '../../helpers';\nimport { getProjectStoredToken, projectTokenStatus, getProjectClientId } from '../../../core/project-token-store';\nimport { getTicket } from '../../../core/lark-ticket';\nimport { larkLogger } from '../../../core/lark-logger';\n\nconst log = larkLogger('tools/mcp/project');\n\n// ---------------------------------------------------------------------------\n// \u98DE\u4E66\u9879\u76EE MCP \u4E13\u7528 JSON-RPC \u5BA2\u6237\u7AEF\uFF08\u4F7F\u7528\u6807\u51C6 OAuth Bearer \u8BA4\u8BC1\uFF09\n// ---------------------------------------------------------------------------\n\nasync function callProjectMcpTool(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n accessToken: string,\n endpoint: string,\n): Promise<unknown> {\n const body = {\n jsonrpc: '2.0',\n id: toolCallId,\n method: 'tools/call',\n params: { name, arguments: args },\n };\n\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${accessToken}`,\n },\n body: JSON.stringify(body),\n });\n\n const text = await res.text();\n if (!res.ok) {\n throw new Error(`MCP HTTP ${res.status} ${res.statusText}: ${text.slice(0, 4000)}`);\n }\n\n let data: McpRpcResponse;\n try {\n data = JSON.parse(text) as McpRpcResponse;\n } catch {\n throw new Error(`MCP \u8FD4\u56DE\u975E JSON\uFF1A${text.slice(0, 4000)}`);\n }\n\n if ('error' in data) {\n throw new Error(`MCP error ${data.error.code}: ${data.error.message}`);\n }\n\n return unwrapJsonRpcResult(data.result);\n}\n\n// ---------------------------------------------------------------------------\n// \u98DE\u4E66\u9879\u76EE MCP \u5DE5\u5177\u901A\u7528\u6CE8\u518C\u51FD\u6570\n// ---------------------------------------------------------------------------\n\ninterface ProjectMcpToolConfig {\n name: string;\n mcpToolName: string;\n label: string;\n description: string;\n schema: TSchema;\n endpoint: string;\n}\n\nexport function registerProjectMcpTool(\n api: OpenClawPluginApi,\n config: ProjectMcpToolConfig,\n): void {\n const { log: toolLog } = createToolContext(api, config.name);\n\n api.registerTool(\n {\n name: config.name,\n label: config.label,\n description: config.description,\n parameters: config.schema,\n async execute(toolCallId, params) {\n const p = params as Record<string, unknown>;\n try {\n const startTime = Date.now();\n\n const ticket = getTicket();\n const senderOpenId = ticket?.senderOpenId;\n if (!senderOpenId) {\n return formatToolResult({\n error: '\u65E0\u6CD5\u83B7\u53D6\u5F53\u524D\u7528\u6237\u8EAB\u4EFD\uFF0C\u8BF7\u5728\u98DE\u4E66\u5BF9\u8BDD\u4E2D\u4F7F\u7528\u6B64\u5DE5\u5177\u3002',\n });\n }\n\n const clientId = await getProjectClientId(senderOpenId);\n if (!clientId) {\n return formatToolResult({\n error: 'project_auth_required',\n message: '\u98DE\u4E66\u9879\u76EE\u672A\u6388\u6743\u3002\u8BF7\u5148\u8C03\u7528 feishu_project_oauth \u5DE5\u5177\u5B8C\u6210\u6388\u6743\u3002',\n });\n }\n\n const token = await getProjectStoredToken(clientId, senderOpenId);\n if (!token || projectTokenStatus(token) === 'expired') {\n return formatToolResult({\n error: 'project_auth_required',\n message: '\u98DE\u4E66\u9879\u76EE\u672A\u6388\u6743\u6216\u6388\u6743\u5DF2\u8FC7\u671F\u3002\u8BF7\u8C03\u7528 feishu_project_oauth \u5DE5\u5177\u7684 authorize \u64CD\u4F5C\u5B8C\u6210\u6388\u6743\u3002',\n });\n }\n\n const result = await callProjectMcpTool(\n config.mcpToolName,\n p,\n toolCallId,\n token.accessToken,\n config.endpoint,\n );\n\n const duration = Date.now() - startTime;\n toolLog.debug?.(`${config.mcpToolName} succeeded in ${duration}ms`);\n\n // MCP \u8FD4\u56DE\u503C\u5904\u7406\uFF08\u540C registerMcpTool \u903B\u8F91\uFF09\n if (isRecord(result) && Array.isArray((result as Record<string, unknown>).content)) {\n const mcpContent = (result as Record<string, unknown>).content as Array<{\n type: string;\n text: string;\n }>;\n let details: unknown = result;\n if (mcpContent.length === 1 && mcpContent[0]?.type === 'text') {\n try {\n details = JSON.parse(mcpContent[0].text);\n } catch {\n // text is not JSON\n }\n }\n return {\n content: mcpContent.map((c) => ({\n type: 'text' as const,\n text: c.text,\n })),\n details,\n };\n }\n return formatToolResult(result);\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n toolLog.error(`${config.mcpToolName} failed: ${errMsg}`);\n return formatToolResult({\n error: errMsg,\n hint: '\u5982\u679C\u662F\u6388\u6743\u95EE\u9898\uFF0C\u8BF7\u8C03\u7528 feishu_project_oauth \u5DE5\u5177\u91CD\u65B0\u6388\u6743\u3002',\n });\n }\n },\n },\n { name: config.name },\n );\n}\n\n// ---------------------------------------------------------------------------\n// \u5177\u4F53\u5DE5\u5177\u6CE8\u518C\uFF08\u53C2\u6570\u7B7E\u540D\u5339\u914D\u98DE\u4E66\u9879\u76EE MCP Server \u5B9E\u9645\u5B9A\u4E49\uFF09\n// ---------------------------------------------------------------------------\n\nexport function registerProjectTools(api: OpenClawPluginApi, endpoint: string) {\n let count = 0;\n\n // list_todo \u2014 \u5F85\u529E/\u5DF2\u529E/\u8D85\u671F/\u672C\u5468\u5230\u671F\n registerProjectMcpTool(api, {\n name: 'feishu_project_list_todo',\n mcpToolName: 'list_todo',\n label: 'Feishu Project: \u5F85\u529E\u5217\u8868',\n description:\n '\u83B7\u53D6\u5F53\u524D\u7528\u6237\u7684\u98DE\u4E66\u9879\u76EE\u5DE5\u4F5C\u9879\u5217\u8868\u3002\u652F\u6301\u67E5\u8BE2\u7C7B\u578B\uFF1A' +\n 'todo(\u5F85\u529E)\u3001done(\u5DF2\u529E)\u3001overdue(\u5DF2\u8D85\u671F)\u3001this_week(\u672C\u5468\u5230\u671F)\u3002',\n schema: Type.Object({\n action: Type.String({\n description: '\u67E5\u8BE2\u7C7B\u578B\u3002todo \u4E3A\u5F85\u529E, done \u4E3A\u5DF2\u529E, overdue \u4E3A\u5DF2\u8D85\u671F, this_week \u4E3A\u672C\u5468\u5230\u671F',\n }),\n asset_key: Type.Optional(\n Type.String({ description: '\u5DE5\u4F5C\u533A key\uFF0C\u683C\u5F0F\u4E3A Asset_\uFF0C\u4EC5\u5728\u63A5\u53E3\u62A5\u9519\u9700\u8981\u9009\u62E9\u65F6\u4F20\u9012' }),\n ),\n page_num: Type.Optional(\n Type.Number({ description: '\u9875\u7801\uFF0C\u4ECE 1 \u5F00\u59CB\u9012\u589E\uFF0C\u6BCF\u9875 50 \u6761' }),\n ),\n }),\n endpoint,\n });\n count++;\n\n // search_by_mql \u2014 MQL \u67E5\u8BE2\n registerProjectMcpTool(api, {\n name: 'feishu_project_search_by_mql',\n mcpToolName: 'search_by_mql',\n label: 'Feishu Project: MQL \u641C\u7D22',\n description:\n '\u4F7F\u7528 MQL \u641C\u7D22\u98DE\u4E66\u9879\u76EE\u5DE5\u4F5C\u9879\u3002MQL \u57FA\u4E8E SQL \u8BED\u6CD5\u6269\u5C55\u3002' +\n '\u4F7F\u7528\u524D\u9700\u5148\u7528 get_workitem_info \u786E\u8BA4\u7A7A\u95F4\u548C\u5DE5\u4F5C\u9879\u7C7B\u578B\u3002' +\n 'select \u540E\u4F7F\u7528\u53EF\u8BFB\u6027\u5F3A\u7684\u5B57\u6BB5\u540D\u79F0\uFF08\u5982\"\u4EFB\u52A1\u540D\u79F0\"\u800C\u975E\"name\"\uFF09\u3002',\n schema: Type.Object({\n project_key: Type.String({\n description: '\u7A7A\u95F4 projectKey\u3001simpleName \u6216\u7A7A\u95F4\u540D',\n }),\n mql: Type.Optional(\n Type.String({\n description:\n 'MQL \u8BED\u53E5\u3002\u8BED\u6CD5\uFF1Aselect `\u5B57\u6BB5\u540D` from `\u7A7A\u95F4\u540D`.`\u5DE5\u4F5C\u9879\u540D` where `\u5B57\u6BB5\u540D` = \\'\u5B57\u6BB5\u503C\\'',\n }),\n ),\n helper: Type.Optional(\n Type.String({\n description: '\u5E2E\u52A9\u5DE5\u5177\u3002\u8F93\u5165 \"helper\" \u83B7\u53D6\u6240\u6709\u547D\u4EE4\u548C\u7528\u6CD5\u793A\u4F8B',\n }),\n ),\n session_id: Type.Optional(\n Type.String({ description: 'sessionID\uFF0C\u7528\u4E8E\u5206\u9875\u67E5\u8BE2\uFF0C\u4F20\u5165\u540E\u4E0D\u89E3\u6790 mql' }),\n ),\n group_pagination_list: Type.Optional(\n Type.Array(\n Type.Object({\n group_id: Type.Optional(Type.String({ description: '\u5206\u7EC4 ID' })),\n page_num: Type.Optional(Type.Number({ description: '\u9875\u7801\uFF0C\u4ECE 1 \u5F00\u59CB' })),\n }),\n ),\n ),\n }),\n endpoint,\n });\n count++;\n\n // get_workitem_info \u2014 \u83B7\u53D6\u5DE5\u4F5C\u9879\u7C7B\u578B\u7684\u5B57\u6BB5\u4E0E\u89D2\u8272\u4FE1\u606F\n registerProjectMcpTool(api, {\n name: 'feishu_project_get_workitem_info',\n mcpToolName: 'get_workitem_info',\n label: 'Feishu Project: \u5DE5\u4F5C\u9879\u7C7B\u578B\u4FE1\u606F',\n description: '\u83B7\u53D6\u4E00\u4E2A\u5DE5\u4F5C\u9879\u7C7B\u578B\u5177\u5907\u7684\u53EF\u7528\u5B57\u6BB5\u4E0E\u89D2\u8272\u4FE1\u606F\u3002',\n schema: Type.Object({\n project_key: Type.Optional(\n Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n ),\n work_item_type: Type.String({\n description: '\u5DE5\u4F5C\u9879\u7C7B\u578B\u7684\u7CFB\u7EDF\u6807\u8BC6\u6216\u540D\u79F0\uFF0C\u5982 story\u3001\u9700\u6C42\u3001issue\u3001\u7F3A\u9677\u7B49',\n }),\n }),\n endpoint,\n });\n count++;\n\n // get_workitem_brief \u2014 \u83B7\u53D6\u5DE5\u4F5C\u9879\u6982\u51B5\n registerProjectMcpTool(api, {\n name: 'feishu_project_get_workitem_brief',\n mcpToolName: 'get_workitem_brief',\n label: 'Feishu Project: \u5DE5\u4F5C\u9879\u6982\u51B5',\n description: '\u83B7\u53D6\u4E00\u4E2A\u5DE5\u4F5C\u9879\u5B9E\u4F8B\u7684\u6982\u51B5\u4FE1\u606F\u3002',\n schema: Type.Object({\n project_key: Type.Optional(\n Type.String({ description: '\u7A7A\u95F4 projectKey \u6216 simpleName' }),\n ),\n work_item_id: Type.String({\n description: '\u5DE5\u4F5C\u9879 ID \u6216\u540D\u79F0',\n }),\n fields: Type.Optional(\n Type.Array(Type.String({ description: '\u8981\u67E5\u8BE2\u7684 field_key \u6216 field_name' })),\n ),\n }),\n endpoint,\n });\n count++;\n\n // get_workitem_field_meta \u2014 \u83B7\u53D6\u521B\u5EFA\u5DE5\u4F5C\u9879\u5143\u4FE1\u606F\n registerProjectMcpTool(api, {\n name: 'feishu_project_get_workitem_field_meta',\n mcpToolName: 'get_workitem_field_meta',\n label: 'Feishu Project: \u5B57\u6BB5\u5143\u4FE1\u606F',\n description: '\u83B7\u53D6\u521B\u5EFA\u5DE5\u4F5C\u9879\u65F6\u7684\u5B57\u6BB5\u5143\u4FE1\u606F\uFF08\u5B57\u6BB5\u540D\u3001\u7C7B\u578B\u3001\u9009\u9879\u7B49\uFF09\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n work_item_type_key: Type.String({ description: '\u5DE5\u4F5C\u9879\u7C7B\u578B key' }),\n }),\n endpoint,\n });\n count++;\n\n // create_workitem \u2014 \u521B\u5EFA\u5DE5\u4F5C\u9879\n registerProjectMcpTool(api, {\n name: 'feishu_project_create_workitem',\n mcpToolName: 'create_workitem',\n label: 'Feishu Project: \u521B\u5EFA\u5DE5\u4F5C\u9879',\n description: '\u521B\u5EFA\u4E00\u6761\u5DE5\u4F5C\u9879\u5B9E\u4F8B\u3002\u521B\u5EFA\u6210\u529F\u540E\u83B7\u5F97\u8BE6\u60C5\u9875 URL\u3002',\n schema: Type.Object({\n project_key: Type.Optional(\n Type.String({ description: '\u7A7A\u95F4 projectKey \u6216 simpleName' }),\n ),\n work_item_type: Type.String({\n description: '\u5DE5\u4F5C\u9879\u7C7B\u578B',\n }),\n fields: Type.Optional(\n Type.Array(\n Type.Object({\n field_key: Type.String({ description: '\u5B57\u6BB5 key' }),\n field_value: Type.String({\n description: '\u5B57\u6BB5\u503C\u3002\u65F6\u95F4\u7C7B\u9700\u4F20 16 \u4F4D unix \u6BEB\u79D2\u65F6\u95F4\u6233\uFF0C\u4EBA\u5458\u7C7B\u9700\u7528\u82F1\u6587\u9017\u53F7\u533A\u9694',\n }),\n }),\n ),\n ),\n }),\n endpoint,\n });\n count++;\n\n // update_field \u2014 \u4FEE\u6539\u5DE5\u4F5C\u9879\u5B57\u6BB5\n registerProjectMcpTool(api, {\n name: 'feishu_project_update_field',\n mcpToolName: 'update_field',\n label: 'Feishu Project: \u4FEE\u6539\u5B57\u6BB5',\n description: '\u4FEE\u6539\u6307\u5B9A\u5DE5\u4F5C\u9879\u5B9E\u4F8B\u7684\u5B57\u6BB5\u503C\uFF0C\u652F\u6301\u4E00\u6B21\u4FEE\u6539\u591A\u4E2A\u5B57\u6BB5\u3002',\n schema: Type.Object({\n project_key: Type.Optional(\n Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n ),\n work_item_id: Type.String({\n description: '\u5DE5\u4F5C\u9879 ID \u6216\u540D\u79F0',\n }),\n fields: Type.Optional(\n Type.Array(\n Type.Object({\n field_key: Type.String({ description: '\u5B57\u6BB5 key' }),\n field_value: Type.String({\n description: '\u5B57\u6BB5\u503C\u3002\u65F6\u95F4\u7C7B\u9700\u4F20 16 \u4F4D unix \u6BEB\u79D2\u65F6\u95F4\u6233\uFF0C\u4EBA\u5458\u7C7B\u9700\u7528\u82F1\u6587\u9017\u53F7\u533A\u9694',\n }),\n }),\n ),\n ),\n }),\n endpoint,\n });\n count++;\n\n // add_comment \u2014 \u6DFB\u52A0\u8BC4\u8BBA\n registerProjectMcpTool(api, {\n name: 'feishu_project_add_comment',\n mcpToolName: 'add_comment',\n label: 'Feishu Project: \u6DFB\u52A0\u8BC4\u8BBA',\n description: '\u5728\u6307\u5B9A\u5DE5\u4F5C\u9879\u7684\u8BC4\u8BBA/\u5907\u6CE8\u9875\u6DFB\u52A0\u4E00\u6761\u8BC4\u8BBA\uFF0C\u652F\u6301 markdown \u683C\u5F0F\u3002',\n schema: Type.Object({\n project_key: Type.Optional(\n Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n ),\n work_item_id: Type.String({\n description: '\u5DE5\u4F5C\u9879 ID \u6216\u540D\u79F0',\n }),\n work_item_type: Type.Optional(\n Type.String({ description: '\u5DE5\u4F5C\u9879\u7C7B\u578B' }),\n ),\n comment_content: Type.String({\n description: '\u8BC4\u8BBA\u5185\u5BB9\uFF0C\u652F\u6301 markdown \u683C\u5F0F',\n }),\n url: Type.Optional(\n Type.String({ description: '\u5DE5\u4F5C\u9879 URL\uFF0C\u53EF\u4ECE\u4E2D\u89E3\u6790 project_key \u7B49\u4FE1\u606F' }),\n ),\n }),\n endpoint,\n });\n count++;\n\n // finish_node \u2014 \u5B8C\u6210\u8282\u70B9/\u6D41\u8F6C\u72B6\u6001\n registerProjectMcpTool(api, {\n name: 'feishu_project_finish_node',\n mcpToolName: 'finish_node',\n label: 'Feishu Project: \u6D41\u8F6C\u72B6\u6001',\n description: '\u5B8C\u6210\u67D0\u4E2A\u8282\u70B9\uFF0C\u6D41\u8F6C\u5DE5\u4F5C\u9879\u5230\u4E0B\u4E00\u4E2A\u72B6\u6001\u3002',\n schema: Type.Object({\n project_key: Type.Optional(\n Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n ),\n work_item_id: Type.String({\n description: '\u5DE5\u4F5C\u9879 ID \u6216\u540D\u79F0',\n }),\n node_id: Type.String({\n description: '\u8981\u5B8C\u6210\u6D41\u8F6C\u7684\u8282\u70B9 ID \u6216\u8282\u70B9\u540D\u79F0',\n }),\n }),\n endpoint,\n });\n count++;\n\n // get_node_detail \u2014 \u83B7\u53D6\u8282\u70B9\u8BE6\u60C5\n registerProjectMcpTool(api, {\n name: 'feishu_project_get_node_detail',\n mcpToolName: 'get_node_detail',\n label: 'Feishu Project: \u8282\u70B9\u8BE6\u60C5',\n description: '\u83B7\u53D6\u6307\u5B9A\u8282\u70B9\u7684\u5173\u952E\u4FE1\u606F\uFF0C\u5305\u62EC\u8282\u70B9\u4FE1\u606F\u3001\u5B50\u9879\u4FE1\u606F\u3001\u81EA\u5B9A\u4E49\u5B57\u6BB5\u4FE1\u606F\u3002',\n schema: Type.Object({\n project_key: Type.Optional(\n Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n ),\n work_item_id: Type.String({ description: '\u5DE5\u4F5C\u9879 ID' }),\n node_id: Type.String({ description: '\u8282\u70B9\u540D\u79F0\u6216\u8282\u70B9 ID' }),\n node_ids: Type.Optional(\n Type.Array(Type.String({ description: '\u8282\u70B9\u540D\u79F0\u6216\u8282\u70B9 ID \u5217\u8868' })),\n ),\n }),\n endpoint,\n });\n count++;\n\n // get_transitable_statuses \u2014 \u83B7\u53D6\u53EF\u6D41\u8F6C\u72B6\u6001\n registerProjectMcpTool(api, {\n name: 'feishu_project_get_transitable_statuses',\n mcpToolName: 'get_transitable_statuses',\n label: 'Feishu Project: \u53EF\u6D41\u8F6C\u72B6\u6001',\n description: '\u83B7\u53D6\u72B6\u6001\u6D41\u5DE5\u4F5C\u9879\u7684\u53EF\u6D41\u8F6C\u72B6\u6001\u5217\u8868\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n work_item_id: Type.String({ description: '\u5DE5\u4F5C\u9879 ID' }),\n work_item_type_key: Type.String({ description: '\u5DE5\u4F5C\u9879\u7C7B\u578B key' }),\n user_key: Type.String({ description: '\u7528\u6237 userKey' }),\n }),\n endpoint,\n });\n count++;\n\n // list_workitem_types \u2014 \u83B7\u53D6\u5DE5\u4F5C\u9879\u7C7B\u578B\u5217\u8868\n registerProjectMcpTool(api, {\n name: 'feishu_project_list_workitem_types',\n mcpToolName: 'list_workitem_types',\n label: 'Feishu Project: \u5DE5\u4F5C\u9879\u7C7B\u578B\u5217\u8868',\n description: '\u83B7\u53D6\u7A7A\u95F4\u4E0B\u7684\u6240\u6709\u5DE5\u4F5C\u9879\u7C7B\u578B\u5217\u8868\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n }),\n endpoint,\n });\n count++;\n\n // search_project_info \u2014 \u67E5\u8BE2\u7A7A\u95F4\u4FE1\u606F\n registerProjectMcpTool(api, {\n name: 'feishu_project_search_project_info',\n mcpToolName: 'search_project_info',\n label: 'Feishu Project: \u67E5\u8BE2\u7A7A\u95F4',\n description: '\u67E5\u8BE2\u98DE\u4E66\u9879\u76EE\u7A7A\u95F4\u57FA\u7840\u4FE1\u606F\u3002',\n schema: Type.Object({\n project_key: Type.String({\n description: '\u7A7A\u95F4 projectKey\u3001simpleName \u6216\u7A7A\u95F4\u540D\u79F0',\n }),\n }),\n endpoint,\n });\n count++;\n\n // search_user_info \u2014 \u67E5\u8BE2\u7528\u6237\u4FE1\u606F\n registerProjectMcpTool(api, {\n name: 'feishu_project_search_user_info',\n mcpToolName: 'search_user_info',\n label: 'Feishu Project: \u67E5\u8BE2\u7528\u6237',\n description: '\u6279\u91CF\u67E5\u8BE2\u7528\u6237\u57FA\u7840\u4FE1\u606F\uFF0C\u6700\u591A 20 \u4E2A\u3002',\n schema: Type.Object({\n user_keys: Type.Array(\n Type.String({ description: 'userKey\u3001Email \u6216\u540D\u5B57' }),\n ),\n project_key: Type.Optional(\n Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n ),\n }),\n endpoint,\n });\n count++;\n\n // list_workitem_comments \u2014 \u67E5\u8BE2\u8BC4\u8BBA\u5217\u8868\n registerProjectMcpTool(api, {\n name: 'feishu_project_list_workitem_comments',\n mcpToolName: 'list_workitem_comments',\n label: 'Feishu Project: \u8BC4\u8BBA\u5217\u8868',\n description: '\u67E5\u8BE2\u5DE5\u4F5C\u9879\u8BC4\u8BBA\u5217\u8868\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n work_item_id: Type.String({ description: '\u5DE5\u4F5C\u9879 ID \u6216\u540D\u79F0' }),\n page_num: Type.Optional(Type.Number({ description: '\u9875\u7801\uFF0C\u9ED8\u8BA4 1' })),\n start_time: Type.Optional(Type.Number({ description: '\u5F00\u59CB\u65F6\u95F4\uFF0CUnix \u6BEB\u79D2\u65F6\u95F4\u6233' })),\n end_time: Type.Optional(Type.Number({ description: '\u7ED3\u675F\u65F6\u95F4\uFF0CUnix \u6BEB\u79D2\u65F6\u95F4\u6233' })),\n }),\n endpoint,\n });\n count++;\n\n // search_view_by_title \u2014 \u641C\u7D22\u89C6\u56FE\n registerProjectMcpTool(api, {\n name: 'feishu_project_search_view_by_title',\n mcpToolName: 'search_view_by_title',\n label: 'Feishu Project: \u641C\u7D22\u89C6\u56FE',\n description: '\u901A\u8FC7\u89C6\u56FE\u540D\u79F0\u6A21\u7CCA\u67E5\u8BE2\u89C6\u56FE ID\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n view_scope: Type.String({\n description: '\u5DE5\u4F5C\u9879\u7C7B\u578B\uFF1A\u9700\u6C42\u4E3A storyView\uFF0C\u7F3A\u9677\u4E3A issueView\uFF0C\u7248\u672C\u4E3A version\uFF0C\u81EA\u5B9A\u4E49\u7C7B\u578B\u4E3A\u5BF9\u5E94 key',\n }),\n key_word: Type.String({ description: '\u89C6\u56FE\u540D\u79F0\u5173\u952E\u5B57' }),\n }),\n endpoint,\n });\n count++;\n\n // get_view_detail \u2014 \u83B7\u53D6\u89C6\u56FE\u8BE6\u60C5\n registerProjectMcpTool(api, {\n name: 'feishu_project_get_view_detail',\n mcpToolName: 'get_view_detail',\n label: 'Feishu Project: \u89C6\u56FE\u8BE6\u60C5',\n description: '\u83B7\u53D6\u6307\u5B9A\u89C6\u56FE\u7684\u5DE5\u4F5C\u9879\u5217\u8868\u3002',\n schema: Type.Object({\n view_id: Type.String({ description: '\u89C6\u56FE ID' }),\n project_key: Type.Optional(Type.String({ description: '\u7A7A\u95F4 projectKey' })),\n fields: Type.Optional(\n Type.Array(Type.String({ description: '\u8981\u67E5\u8BE2\u7684 field_key \u6216 field_name' })),\n ),\n page_num: Type.Optional(Type.Number({ description: '\u5206\u9875\u9875\u7801' })),\n }),\n endpoint,\n });\n count++;\n\n // get_workitem_man_hour_records \u2014 \u5DE5\u65F6\u8BB0\u5F55\n registerProjectMcpTool(api, {\n name: 'feishu_project_get_workitem_man_hour_records',\n mcpToolName: 'get_workitem_man_hour_records',\n label: 'Feishu Project: \u5DE5\u65F6\u8BB0\u5F55',\n description: '\u83B7\u53D6\u5DE5\u4F5C\u9879\u7684\u5DE5\u65F6\u767B\u8BB0\u8BB0\u5F55\u5217\u8868\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n work_item_type_key: Type.String({ description: '\u5DE5\u4F5C\u9879\u7C7B\u578B key' }),\n work_item_id: Type.Number({ description: '\u5DE5\u4F5C\u9879\u5B9E\u4F8B ID' }),\n page_num: Type.Optional(Type.Number({ description: '\u5206\u9875\u9875\u7801\uFF0C\u6BCF\u9875\u9ED8\u8BA4 20' })),\n }),\n endpoint,\n });\n count++;\n\n // get_workitem_op_record \u2014 \u64CD\u4F5C\u8BB0\u5F55\n registerProjectMcpTool(api, {\n name: 'feishu_project_get_workitem_op_record',\n mcpToolName: 'get_workitem_op_record',\n label: 'Feishu Project: \u64CD\u4F5C\u8BB0\u5F55',\n description: '\u83B7\u53D6\u6307\u5B9A\u7A7A\u95F4\u4E0B\u4E00\u4E2A\u5DE5\u4F5C\u9879\u5B9E\u4F8B\u7684\u64CD\u4F5C\u8BB0\u5F55\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n work_item_id: Type.Number({ description: '\u5DE5\u4F5C\u9879 ID' }),\n start: Type.Optional(Type.Number({ description: '\u5F00\u59CB\u65F6\u95F4\uFF0C\u6BEB\u79D2\u7EA7\u65F6\u95F4\u6233' })),\n end: Type.Optional(Type.Number({ description: '\u7ED3\u675F\u65F6\u95F4\uFF0C\u6BEB\u79D2\u7EA7\u65F6\u95F4\u6233\uFF0C\u4E0E start \u914D\u5408\u6700\u957F 7 \u5929' })),\n operation_type: Type.Optional(\n Type.Array(Type.String({ description: '\u64CD\u4F5C\u7C7B\u578B\uFF1Amodify/create/delete/terminate/restore/complete/rollback/add/remove' })),\n ),\n start_from: Type.Optional(Type.String({ description: '\u5206\u9875\u53C2\u6570\uFF0C\u4F7F\u7528\u4E0A\u6B21\u8FD4\u56DE\u7684 start_from' })),\n }),\n endpoint,\n });\n count++;\n\n // list_schedule \u2014 \u6392\u671F\u67E5\u8BE2\n registerProjectMcpTool(api, {\n name: 'feishu_project_list_schedule',\n mcpToolName: 'list_schedule',\n label: 'Feishu Project: \u6392\u671F\u67E5\u8BE2',\n description: '\u6309\u7A7A\u95F4\u548C\u7528\u6237\u67E5\u8BE2\u6307\u5B9A\u65F6\u95F4\u8303\u56F4\u5185\u7684\u6392\u671F\u660E\u7EC6\uFF0C\u7528\u4E8E\u4EBA\u529B\u8D1F\u8377\u4E0E\u6392\u671F\u5206\u6790\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey\u3001\u540D\u79F0\u6216 simple_name' }),\n user_keys: Type.Array(\n Type.String({ description: '\u7528\u6237\u540D\u79F0\u3001\u90AE\u7BB1\u6216 userkey\uFF0C\u6700\u591A 20 \u4E2A' }),\n ),\n start_time: Type.String({ description: '\u5F00\u59CB\u65F6\u95F4\uFF0C\u683C\u5F0F 2006-01-01' }),\n end_time: Type.String({ description: '\u7ED3\u675F\u65F6\u95F4\uFF0C\u683C\u5F0F 2006-01-01\uFF0C\u6700\u5927\u4E0D\u8D85\u8FC7 3 \u4E2A\u6708' }),\n work_item_type_keys: Type.Optional(\n Type.Array(Type.String({ description: '\u5DE5\u4F5C\u9879\u7C7B\u578B key\uFF0C\u4F20 _all \u67E5\u8BE2\u6240\u6709\u7C7B\u578B' })),\n ),\n }),\n endpoint,\n });\n count++;\n\n // list_related_workitems \u2014 \u5173\u8054\u5DE5\u4F5C\u9879\n registerProjectMcpTool(api, {\n name: 'feishu_project_list_related_workitems',\n mcpToolName: 'list_related_workitems',\n label: 'Feishu Project: \u5173\u8054\u5DE5\u4F5C\u9879',\n description: '\u67E5\u8BE2\u67D0\u4E2A\u5173\u8054\u5DE5\u4F5C\u9879\u5B57\u6BB5\u6240\u5173\u8054\u7684\u5DE5\u4F5C\u9879\u5B9E\u4F8B\u7B80\u8981\u4FE1\u606F\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n work_item_type_key: Type.String({ description: '\u6E90\u5DE5\u4F5C\u9879\u7C7B\u578B' }),\n work_item_id: Type.Number({ description: '\u6E90\u5DE5\u4F5C\u9879\u5B9E\u4F8B ID' }),\n relation_work_item_type_key: Type.String({ description: '\u5173\u8054\u7684\u76EE\u6807\u5DE5\u4F5C\u9879\u7C7B\u578B' }),\n relation_key: Type.String({ description: '\u5173\u8054\u5173\u7CFB key \u6216\u5BF9\u63A5\u6807\u8BC6' }),\n relation_type: Type.Optional(Type.Number({ description: '\u5173\u8054\u6807\u8BC6\u65B9\u5F0F\uFF1A0=\u5B57\u6BB5ID\uFF0C1=\u5BF9\u63A5\u6807\u8BC6\u3002\u9ED8\u8BA4 0' })),\n page_num: Type.Optional(Type.Number({ description: '\u9875\u7801\uFF0C\u4ECE 1 \u5F00\u59CB' })),\n page_size: Type.Optional(Type.Number({ description: '\u6BCF\u9875\u6570\u91CF\uFF0C\u6700\u5927 50' })),\n }),\n endpoint,\n });\n count++;\n\n // list_workitem_relations \u2014 \u7A7A\u95F4\u5173\u8054\u5173\u7CFB\n registerProjectMcpTool(api, {\n name: 'feishu_project_list_workitem_relations',\n mcpToolName: 'list_workitem_relations',\n label: 'Feishu Project: \u5173\u8054\u5173\u7CFB\u5217\u8868',\n description: '\u67E5\u8BE2\u67D0\u4E2A\u7A7A\u95F4\u4E0B\u7684\u6240\u6709\u5DE5\u4F5C\u9879\u5173\u8054\u5173\u7CFB\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n }),\n endpoint,\n });\n count++;\n\n // list_team_members \u2014 \u56E2\u961F\u6210\u5458\n registerProjectMcpTool(api, {\n name: 'feishu_project_list_team_members',\n mcpToolName: 'list_team_members',\n label: 'Feishu Project: \u56E2\u961F\u6210\u5458',\n description: '\u67E5\u8BE2\u56E2\u961F\u4FE1\u606F\u548C\u6210\u5458\u5217\u8868\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n team_id: Type.String({ description: '\u56E2\u961F ID' }),\n page_token: Type.Optional(Type.String({ description: '\u5206\u9875 token\uFF0C\u9996\u9875\u4E0D\u4F20' })),\n }),\n endpoint,\n });\n count++;\n\n // list_charts \u2014 \u5EA6\u91CF\u56FE\u8868\n registerProjectMcpTool(api, {\n name: 'feishu_project_list_charts',\n mcpToolName: 'list_charts',\n label: 'Feishu Project: \u5EA6\u91CF\u56FE\u8868',\n description: '\u67E5\u8BE2\u6307\u5B9A\u7A7A\u95F4\u89C6\u56FE\u4E0B\u7684\u6240\u6709\u5EA6\u91CF\u56FE\u8868\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n view_id: Type.String({ description: '\u89C6\u56FE ID' }),\n page_num: Type.Optional(Type.Number({ description: '\u9875\u7801\uFF0C\u9ED8\u8BA4 1' })),\n page_size: Type.Optional(Type.Number({ description: '\u6BCF\u9875\u6761\u6570\uFF0C\u9ED8\u8BA4 50\uFF0C\u6700\u5927 200' })),\n }),\n endpoint,\n });\n count++;\n\n // create_fixed_view \u2014 \u521B\u5EFA\u56FA\u5B9A\u89C6\u56FE\n registerProjectMcpTool(api, {\n name: 'feishu_project_create_fixed_view',\n mcpToolName: 'create_fixed_view',\n label: 'Feishu Project: \u521B\u5EFA\u56FA\u5B9A\u89C6\u56FE',\n description: '\u5728\u6307\u5B9A\u7A7A\u95F4\u548C\u5DE5\u4F5C\u9879\u7C7B\u578B\u4E0B\u65B0\u589E\u4E00\u4E2A\u56FA\u5B9A\u89C6\u56FE\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n name: Type.String({ description: '\u56FA\u5B9A\u89C6\u56FE\u540D\u79F0' }),\n work_item_type_key: Type.String({ description: '\u5DE5\u4F5C\u9879\u7C7B\u578B key' }),\n work_item_id_list: Type.Array(\n Type.Number({ description: '\u5DE5\u4F5C\u9879 ID' }),\n { description: '\u9700\u8981\u6DFB\u52A0\u5165\u89C6\u56FE\u7684\u5DE5\u4F5C\u9879 ID \u5217\u8868\uFF0C\u4E0A\u9650 200 \u4E2A' },\n ),\n cooperation_mode: Type.Optional(\n Type.Number({ description: '\u534F\u4F5C\u6A21\u5F0F\uFF1A1=\u6307\u5B9A\u4EBA\u5458/\u56E2\u961F, 2=\u5168\u90E8\u7BA1\u7406\u5458, 3=\u5168\u90E8\u6210\u5458\u3002\u9ED8\u8BA4 1' }),\n ),\n }),\n endpoint,\n });\n count++;\n\n // update_fixed_view \u2014 \u66F4\u65B0\u56FA\u5B9A\u89C6\u56FE\n registerProjectMcpTool(api, {\n name: 'feishu_project_update_fixed_view',\n mcpToolName: 'update_fixed_view',\n label: 'Feishu Project: \u66F4\u65B0\u56FA\u5B9A\u89C6\u56FE',\n description: '\u66F4\u65B0\u56FA\u5B9A\u89C6\u56FE\u7684\u5DE5\u4F5C\u9879\u5217\u8868\uFF08\u65B0\u589E\u6216\u5220\u9664\uFF0C\u4E0D\u80FD\u540C\u65F6\u64CD\u4F5C\uFF09\u3002',\n schema: Type.Object({\n project_key: Type.String({ description: '\u7A7A\u95F4 projectKey' }),\n view_id: Type.String({ description: '\u56FA\u5B9A\u89C6\u56FE ID' }),\n work_item_type_key: Type.String({ description: '\u5DE5\u4F5C\u9879\u7C7B\u578B key' }),\n add_work_item_ids: Type.Optional(\n Type.Array(Type.Number(), { description: '\u9700\u8981\u6DFB\u52A0\u7684\u5DE5\u4F5C\u9879 ID \u5217\u8868\uFF0C\u4E0A\u9650 200' }),\n ),\n remove_work_item_ids: Type.Optional(\n Type.Array(Type.Number(), { description: '\u9700\u8981\u5220\u9664\u7684\u5DE5\u4F5C\u9879 ID \u5217\u8868\uFF0C\u4E0A\u9650 200' }),\n ),\n }),\n endpoint,\n });\n count++;\n\n log.info(`registered ${count} project MCP tools with endpoint=${endpoint}`);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { createToolContext, formatToolResult } from "../helpers";
|
|
2
|
+
import { handleInvokeErrorWithAutoAuth } from "../oapi/helpers";
|
|
3
|
+
import { getUserAgent } from "../../core/version";
|
|
4
|
+
import fs from "node:fs";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
function isRecord(v) {
|
|
7
|
+
return typeof v === "object" && v !== null;
|
|
8
|
+
}
|
|
9
|
+
function extractMcpUrlFromConfig(cfg) {
|
|
10
|
+
if (!isRecord(cfg)) return void 0;
|
|
11
|
+
const channels = cfg.channels;
|
|
12
|
+
if (!isRecord(channels)) return void 0;
|
|
13
|
+
const feishu = channels.feishu;
|
|
14
|
+
if (!isRecord(feishu)) return void 0;
|
|
15
|
+
const url = feishu.mcpEndpoint;
|
|
16
|
+
const legacyUrl = feishu.mcp_url;
|
|
17
|
+
const chosen = typeof url === "string" ? url : typeof legacyUrl === "string" ? legacyUrl : void 0;
|
|
18
|
+
if (typeof chosen !== "string") return void 0;
|
|
19
|
+
const trimmed = chosen.trim();
|
|
20
|
+
return trimmed ? trimmed : void 0;
|
|
21
|
+
}
|
|
22
|
+
function unwrapJsonRpcResult(v) {
|
|
23
|
+
if (!isRecord(v)) return v;
|
|
24
|
+
const hasJsonRpc = typeof v.jsonrpc === "string";
|
|
25
|
+
const hasId = "id" in v;
|
|
26
|
+
const hasResult = "result" in v;
|
|
27
|
+
const hasError = "error" in v;
|
|
28
|
+
if (hasJsonRpc && (hasResult || hasError)) {
|
|
29
|
+
if (hasError) {
|
|
30
|
+
const err = v.error;
|
|
31
|
+
if (isRecord(err) && typeof err.message === "string") {
|
|
32
|
+
throw new Error(err.message);
|
|
33
|
+
}
|
|
34
|
+
throw new Error("MCP \u8FD4\u56DE error\uFF0C\u4F46\u65E0\u6CD5\u89E3\u6790 message");
|
|
35
|
+
}
|
|
36
|
+
return unwrapJsonRpcResult(v.result);
|
|
37
|
+
}
|
|
38
|
+
if (!hasJsonRpc && !hasId && hasResult && !hasError) {
|
|
39
|
+
return unwrapJsonRpcResult(v.result);
|
|
40
|
+
}
|
|
41
|
+
return v;
|
|
42
|
+
}
|
|
43
|
+
let mcpEndpointOverride;
|
|
44
|
+
function setMcpEndpointOverride(endpoint) {
|
|
45
|
+
mcpEndpointOverride = endpoint;
|
|
46
|
+
}
|
|
47
|
+
function readMcpUrlFromOpenclawJson() {
|
|
48
|
+
try {
|
|
49
|
+
const p = path.join(process.cwd(), ".openclaw", "openclaw.json");
|
|
50
|
+
if (!fs.existsSync(p)) return void 0;
|
|
51
|
+
const raw = fs.readFileSync(p, "utf8");
|
|
52
|
+
const cfg = JSON.parse(raw);
|
|
53
|
+
return extractMcpUrlFromConfig(cfg);
|
|
54
|
+
} catch {
|
|
55
|
+
return void 0;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function getMcpEndpoint() {
|
|
59
|
+
return mcpEndpointOverride || readMcpUrlFromOpenclawJson() || process.env.FEISHU_MCP_ENDPOINT?.trim() || "https://mcp.feishu.cn/mcp";
|
|
60
|
+
}
|
|
61
|
+
function buildAuthHeader() {
|
|
62
|
+
const token = process.env.FEISHU_MCP_BEARER_TOKEN?.trim() || process.env.FEISHU_MCP_TOKEN?.trim();
|
|
63
|
+
if (!token) return void 0;
|
|
64
|
+
return token.toLowerCase().startsWith("bearer ") ? token : `Bearer ${token}`;
|
|
65
|
+
}
|
|
66
|
+
async function callMcpTool(name, args, toolCallId, uat) {
|
|
67
|
+
const endpoint = getMcpEndpoint();
|
|
68
|
+
const auth = buildAuthHeader();
|
|
69
|
+
const body = {
|
|
70
|
+
jsonrpc: "2.0",
|
|
71
|
+
id: toolCallId,
|
|
72
|
+
method: "tools/call",
|
|
73
|
+
params: {
|
|
74
|
+
name,
|
|
75
|
+
arguments: args
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const headers = {
|
|
79
|
+
"Content-Type": "application/json",
|
|
80
|
+
"X-Lark-MCP-UAT": uat,
|
|
81
|
+
"X-Lark-MCP-Allowed-Tools": name,
|
|
82
|
+
"User-Agent": getUserAgent()
|
|
83
|
+
};
|
|
84
|
+
if (auth) headers.authorization = auth;
|
|
85
|
+
const res = await fetch(endpoint, {
|
|
86
|
+
method: "POST",
|
|
87
|
+
headers,
|
|
88
|
+
body: JSON.stringify(body)
|
|
89
|
+
});
|
|
90
|
+
const text = await res.text();
|
|
91
|
+
if (!res.ok) {
|
|
92
|
+
throw new Error(`MCP HTTP ${res.status} ${res.statusText}: ${text.slice(0, 4e3)}`);
|
|
93
|
+
}
|
|
94
|
+
let data;
|
|
95
|
+
try {
|
|
96
|
+
data = JSON.parse(text);
|
|
97
|
+
} catch {
|
|
98
|
+
throw new Error(`MCP \u8FD4\u56DE\u975E JSON\uFF1A${text.slice(0, 4e3)}`);
|
|
99
|
+
}
|
|
100
|
+
if ("error" in data) {
|
|
101
|
+
throw new Error(`MCP error ${data.error.code}: ${data.error.message}`);
|
|
102
|
+
}
|
|
103
|
+
return unwrapJsonRpcResult(data.result);
|
|
104
|
+
}
|
|
105
|
+
function registerMcpTool(api, config) {
|
|
106
|
+
const { toolClient, log } = createToolContext(api, config.name);
|
|
107
|
+
api.registerTool(
|
|
108
|
+
{
|
|
109
|
+
name: config.name,
|
|
110
|
+
label: config.label,
|
|
111
|
+
description: config.description,
|
|
112
|
+
parameters: config.schema,
|
|
113
|
+
async execute(toolCallId, params) {
|
|
114
|
+
const p = params;
|
|
115
|
+
try {
|
|
116
|
+
log.debug?.(`Calling ${config.mcpToolName} (toolCallId: ${toolCallId})`);
|
|
117
|
+
const startTime = Date.now();
|
|
118
|
+
config.validate?.(p);
|
|
119
|
+
const client = toolClient();
|
|
120
|
+
const result = await client.invoke(
|
|
121
|
+
config.toolActionKey,
|
|
122
|
+
async (_sdk, _opts, uat) => {
|
|
123
|
+
if (!uat) {
|
|
124
|
+
throw new Error("UAT not available");
|
|
125
|
+
}
|
|
126
|
+
return callMcpTool(config.mcpToolName, p, toolCallId, uat);
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
as: "user"
|
|
130
|
+
}
|
|
131
|
+
);
|
|
132
|
+
const duration = Date.now() - startTime;
|
|
133
|
+
log.debug?.(`${config.mcpToolName} succeeded in ${duration}ms`);
|
|
134
|
+
if (isRecord(result) && Array.isArray(result.content)) {
|
|
135
|
+
const mcpContent = result.content;
|
|
136
|
+
let details = result;
|
|
137
|
+
if (mcpContent.length === 1 && mcpContent[0]?.type === "text") {
|
|
138
|
+
try {
|
|
139
|
+
details = JSON.parse(mcpContent[0].text);
|
|
140
|
+
} catch {
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
content: mcpContent.map((c) => ({
|
|
145
|
+
type: "text",
|
|
146
|
+
text: c.text
|
|
147
|
+
})),
|
|
148
|
+
details
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
return formatToolResult(result);
|
|
152
|
+
} catch (err) {
|
|
153
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
154
|
+
log.error(`${config.mcpToolName} failed: ${errMsg}`);
|
|
155
|
+
return handleInvokeErrorWithAutoAuth(err, api.config);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
{ name: config.name }
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
export {
|
|
163
|
+
callMcpTool,
|
|
164
|
+
extractMcpUrlFromConfig,
|
|
165
|
+
isRecord,
|
|
166
|
+
registerMcpTool,
|
|
167
|
+
setMcpEndpointOverride,
|
|
168
|
+
unwrapJsonRpcResult
|
|
169
|
+
};
|
|
170
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/tools/mcp/shared.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n *\n * MCP \u5DE5\u5177\u7684\u5171\u4EAB\u4EE3\u7801\uFF08\u6240\u6709\u4E1A\u52A1\u57DF\u5171\u4EAB\uFF09\n * \u5305\u542B\uFF1AMCP \u5BA2\u6237\u7AEF\u3001\u7C7B\u578B\u5B9A\u4E49\u3001\u901A\u7528\u8F85\u52A9\u51FD\u6570\n */\n\nimport type { OpenClawPluginApi } from 'openclaw/plugin-sdk';\nimport type { TSchema } from '@sinclair/typebox';\nimport { createToolContext, formatToolResult } from '../helpers';\nimport { handleInvokeErrorWithAutoAuth } from '../oapi/helpers';\nimport { getUserAgent } from '../../core/version';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n// ---------------------------------------------------------------------------\n// \u7C7B\u578B\u5B9A\u4E49\n// ---------------------------------------------------------------------------\n\nexport interface McpRpcSuccess {\n jsonrpc: '2.0';\n id: number | string;\n result: unknown;\n}\n\nexport interface McpRpcError {\n jsonrpc: '2.0';\n id: number | string | null;\n error: { code: number; message: string; data?: unknown };\n}\n\nexport type McpRpcResponse = McpRpcSuccess | McpRpcError;\n\nimport type { ToolActionKey } from '../../core/scope-manager';\n\nexport interface McpToolConfig<T = unknown> {\n name: string;\n mcpToolName: string;\n toolActionKey: ToolActionKey; // \u65B0\u589E\uFF1A\u5DE5\u5177\u52A8\u4F5C\u952E\n label: string;\n description: string;\n schema: TSchema;\n validate?: (params: T) => void;\n}\n\n// ---------------------------------------------------------------------------\n// \u8F85\u52A9\u51FD\u6570\n// ---------------------------------------------------------------------------\n\nexport function isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null;\n}\n\n/**\n * \u4ECE\u914D\u7F6E\u5BF9\u8C61\u4E2D\u63D0\u53D6 MCP endpoint URL\n */\nexport function extractMcpUrlFromConfig(cfg: unknown): string | undefined {\n if (!isRecord(cfg)) return undefined;\n const channels = cfg.channels;\n if (!isRecord(channels)) return undefined;\n const feishu = channels.feishu;\n if (!isRecord(feishu)) return undefined;\n const url = feishu.mcpEndpoint;\n const legacyUrl = feishu.mcp_url;\n const chosen = typeof url === 'string' ? url : typeof legacyUrl === 'string' ? legacyUrl : undefined;\n if (typeof chosen !== 'string') return undefined;\n const trimmed = chosen.trim();\n return trimmed ? trimmed : undefined;\n}\n\n/**\n * \u90E8\u5206 MCP \u7F51\u5173/\u4EE3\u7406\u4F1A\u5728 result \u5185\u518D\u6B21\u5305\u4E00\u5C42 JSON-RPC envelope\u3002\n * \u8FD9\u91CC\u505A\u4E00\u6B21\u9012\u5F52\u89E3\u5305\uFF0C\u786E\u4FDD\u5DE5\u5177\u6700\u7EC8\u8FD4\u56DE\u7684\u662F\u7EAF result JSON\uFF08\u4E0D\u5305\u542B jsonrpc/id\uFF09\u3002\n */\nexport function unwrapJsonRpcResult(v: unknown): unknown {\n if (!isRecord(v)) return v;\n\n const hasJsonRpc = typeof v.jsonrpc === 'string';\n const hasId = 'id' in v;\n const hasResult = 'result' in v;\n const hasError = 'error' in v;\n\n if (hasJsonRpc && (hasResult || hasError)) {\n if (hasError) {\n const err = v.error;\n if (isRecord(err) && typeof err.message === 'string') {\n throw new Error(err.message);\n }\n throw new Error('MCP \u8FD4\u56DE error\uFF0C\u4F46\u65E0\u6CD5\u89E3\u6790 message');\n }\n return unwrapJsonRpcResult(v.result);\n }\n\n // \u67D0\u4E9B\u5B9E\u73B0\u53EF\u80FD\u53EA\u5305\u4E86 { result: ... } \u800C\u6CA1\u6709 jsonrpc \u5B57\u6BB5\n if (!hasJsonRpc && !hasId && hasResult && !hasError) {\n return unwrapJsonRpcResult(v.result);\n }\n\n return v;\n}\n\n// ---------------------------------------------------------------------------\n// MCP \u914D\u7F6E\u7BA1\u7406\n// ---------------------------------------------------------------------------\n\nlet mcpEndpointOverride: string | undefined;\n\nexport function setMcpEndpointOverride(endpoint: string | undefined) {\n mcpEndpointOverride = endpoint;\n}\n\nfunction readMcpUrlFromOpenclawJson(): string | undefined {\n // \u4F18\u5148\u8BFB\u53D6\u5DE5\u4F5C\u76EE\u5F55\u4E0B\u7684 `.openclaw/openclaw.json`\n // \u7EA6\u5B9A\uFF1Achannels.feishu.mcpEndpoint\uFF08\u517C\u5BB9\u65E7\u5B57\u6BB5 mcp_url\uFF09\n try {\n const p = path.join(process.cwd(), '.openclaw', 'openclaw.json');\n if (!fs.existsSync(p)) return undefined;\n\n const raw = fs.readFileSync(p, 'utf8');\n const cfg = JSON.parse(raw) as unknown;\n return extractMcpUrlFromConfig(cfg);\n } catch {\n // \u914D\u7F6E\u7F3A\u5931/JSON \u89E3\u6790\u5931\u8D25\u7B49\u60C5\u51B5\uFF0C\u5FFD\u7565\u5E76\u56DE\u9000\u5230\u9ED8\u8BA4\u903B\u8F91\n return undefined;\n }\n}\n\nfunction getMcpEndpoint(): string {\n // \u4F18\u5148\u7EA7\uFF1A\u8FD0\u884C\u65F6\u8986\u76D6 > \u914D\u7F6E\u6587\u4EF6 > \u73AF\u5883\u53D8\u91CF > \u9ED8\u8BA4\u503C\n return (\n mcpEndpointOverride ||\n readMcpUrlFromOpenclawJson() ||\n process.env.FEISHU_MCP_ENDPOINT?.trim() ||\n 'https://mcp.feishu.cn/mcp'\n );\n}\n\nfunction buildAuthHeader(): string | undefined {\n // \u5141\u8BB8\u901A\u8FC7\u73AF\u5883\u53D8\u91CF\u6CE8\u5165\u9274\u6743\uFF08\u82E5\u670D\u52A1\u7AEF\u8981\u6C42\uFF09\n const token = process.env.FEISHU_MCP_BEARER_TOKEN?.trim() || process.env.FEISHU_MCP_TOKEN?.trim();\n\n if (!token) return undefined;\n return token.toLowerCase().startsWith('bearer ') ? token : `Bearer ${token}`;\n}\n\n// ---------------------------------------------------------------------------\n// MCP JSON-RPC \u5BA2\u6237\u7AEF\n// ---------------------------------------------------------------------------\n\n/**\n * \u8C03\u7528 MCP \u5DE5\u5177\n * @param name MCP \u5DE5\u5177\u540D\u79F0\n * @param args \u5DE5\u5177\u53C2\u6570\n * @param toolCallId \u5DE5\u5177\u8C03\u7528 ID\n * @param uat \u7528\u6237\u8BBF\u95EE\u4EE4\u724C(\u7531 invoke \u6743\u9650\u68C0\u67E5\u540E\u4F20\u5165)\n */\nexport async function callMcpTool(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n uat: string,\n): Promise<unknown> {\n const endpoint = getMcpEndpoint();\n const auth = buildAuthHeader();\n\n const body = {\n jsonrpc: '2.0',\n id: toolCallId,\n method: 'tools/call',\n params: {\n name,\n arguments: args,\n },\n };\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Lark-MCP-UAT': uat,\n 'X-Lark-MCP-Allowed-Tools': name,\n 'User-Agent': getUserAgent(),\n };\n if (auth) headers.authorization = auth;\n\n const res = await fetch(endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n });\n\n const text = await res.text();\n if (!res.ok) {\n throw new Error(`MCP HTTP ${res.status} ${res.statusText}: ${text.slice(0, 4000)}`);\n }\n\n let data: McpRpcResponse;\n try {\n data = JSON.parse(text) as McpRpcResponse;\n } catch {\n throw new Error(`MCP \u8FD4\u56DE\u975E JSON\uFF1A${text.slice(0, 4000)}`);\n }\n\n if ('error' in data) {\n throw new Error(`MCP error ${data.error.code}: ${data.error.message}`);\n }\n\n return unwrapJsonRpcResult(data.result);\n}\n\n// ---------------------------------------------------------------------------\n// Scope \u7BA1\u7406\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// \u901A\u7528\u5DE5\u5177\u6CE8\u518C\u51FD\u6570\n// ---------------------------------------------------------------------------\n\n/**\n * \u6CE8\u518C MCP \u5DE5\u5177\u7684\u901A\u7528\u51FD\u6570 (\u4F7F\u7528 invoke \u673A\u5236\u8FDB\u884C\u6743\u9650\u68C0\u67E5)\n */\nexport function registerMcpTool<T extends Record<string, unknown>>(\n api: OpenClawPluginApi,\n config: McpToolConfig<T>,\n): void {\n const { toolClient, log } = createToolContext(api, config.name);\n\n api.registerTool(\n {\n name: config.name,\n label: config.label,\n description: config.description,\n parameters: config.schema,\n async execute(toolCallId, params) {\n const p = params as T;\n try {\n log.debug?.(`Calling ${config.mcpToolName} (toolCallId: ${toolCallId})`);\n const startTime = Date.now();\n\n // \u6267\u884C\u53C2\u6570\u9A8C\u8BC1\n config.validate?.(p);\n\n const client = toolClient();\n\n // \u901A\u8FC7 invoke \u8FDB\u884C\u6743\u9650\u68C0\u67E5\u5E76\u8C03\u7528 MCP\n // \u4E25\u683C\u6A21\u5F0F\uFF1A\u5FC5\u987B\u62E5\u6709 toolActionKey \u6240\u9700\u7684\u6240\u6709 scope\n const result = await client.invoke(\n config.toolActionKey,\n async (_sdk, _opts, uat) => {\n // \u6743\u9650\u68C0\u67E5\u5DF2\u901A\u8FC7\uFF0C\u76F4\u63A5\u4F7F\u7528 invoke \u4F20\u5165\u7684 UAT\n if (!uat) {\n throw new Error('UAT not available');\n }\n return callMcpTool(config.mcpToolName, p, toolCallId, uat);\n },\n {\n as: 'user',\n },\n );\n\n const duration = Date.now() - startTime;\n log.debug?.(`${config.mcpToolName} succeeded in ${duration}ms`);\n\n // MCP tools/call \u8FD4\u56DE\u503C\u5DF2\u7ECF\u662F { content: [{ type, text }] } \u683C\u5F0F\uFF0C\n // \u76F4\u63A5\u900F\u4F20 content\uFF0C\u907F\u514D\u88AB formatToolResult \u518D\u5305\u4E00\u5C42\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (isRecord(result) && Array.isArray((result as any).content)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mcpContent = (result as any).content as Array<{\n type: string;\n text: string;\n }>;\n let details: unknown = result;\n if (mcpContent.length === 1 && mcpContent[0]?.type === 'text') {\n try {\n details = JSON.parse(mcpContent[0].text);\n } catch {\n // text \u4E0D\u662F JSON\uFF0C\u4FDD\u7559\u539F\u59CB result\n }\n }\n return {\n content: mcpContent.map((c) => ({\n type: 'text' as const,\n text: c.text,\n })),\n details,\n };\n }\n return formatToolResult(result);\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n log.error(`${config.mcpToolName} failed: ${errMsg}`);\n return handleInvokeErrorWithAutoAuth(err, api.config);\n }\n },\n },\n { name: config.name },\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { json, createToolContext, assertLarkOk, handleInvokeErrorWithAutoAuth } from "../helpers";
|
|
3
|
+
const FeishuBitableAppTableFieldSchema = Type.Union([
|
|
4
|
+
// CREATE (P1)
|
|
5
|
+
Type.Object({
|
|
6
|
+
action: Type.Literal("create"),
|
|
7
|
+
app_token: Type.String({ description: "\u591A\u7EF4\u8868\u683C token" }),
|
|
8
|
+
table_id: Type.String({ description: "\u6570\u636E\u8868 ID" }),
|
|
9
|
+
field_name: Type.String({ description: "\u5B57\u6BB5\u540D\u79F0" }),
|
|
10
|
+
type: Type.Number({
|
|
11
|
+
description: "\u5B57\u6BB5\u7C7B\u578B\uFF081=\u6587\u672C\uFF0C2=\u6570\u5B57\uFF0C3=\u5355\u9009\uFF0C4=\u591A\u9009\uFF0C5=\u65E5\u671F\uFF0C7=\u590D\u9009\u6846\uFF0C11=\u4EBA\u5458\uFF0C13=\u7535\u8BDD\uFF0C15=\u8D85\u94FE\u63A5\uFF0C17=\u9644\u4EF6\uFF0C1001=\u521B\u5EFA\u65F6\u95F4\uFF0C1002=\u4FEE\u6539\u65F6\u95F4\u7B49\uFF09"
|
|
12
|
+
}),
|
|
13
|
+
property: Type.Optional(
|
|
14
|
+
Type.Any({
|
|
15
|
+
description: "\u5B57\u6BB5\u5C5E\u6027\u914D\u7F6E\uFF08\u6839\u636E\u7C7B\u578B\u800C\u5B9A\uFF0C\u4F8B\u5982\u5355\u9009/\u591A\u9009\u9700\u8981options\uFF0C\u6570\u5B57\u9700\u8981formatter\u7B49\uFF09\u3002\u26A0\uFE0F \u91CD\u8981\uFF1A\u8D85\u94FE\u63A5\u5B57\u6BB5\uFF08type=15\uFF09\u5FC5\u987B\u5B8C\u5168\u7701\u7565\u6B64\u53C2\u6570\uFF0C\u4F20\u7A7A\u5BF9\u8C61 {} \u4E5F\u4F1A\u62A5\u9519\uFF08URLFieldPropertyError\uFF09\u3002"
|
|
16
|
+
})
|
|
17
|
+
)
|
|
18
|
+
}),
|
|
19
|
+
// LIST (P1)
|
|
20
|
+
Type.Object({
|
|
21
|
+
action: Type.Literal("list"),
|
|
22
|
+
app_token: Type.String({ description: "\u591A\u7EF4\u8868\u683C token" }),
|
|
23
|
+
table_id: Type.String({ description: "\u6570\u636E\u8868 ID" }),
|
|
24
|
+
view_id: Type.Optional(Type.String({ description: "\u89C6\u56FE ID\uFF08\u53EF\u9009\uFF09" })),
|
|
25
|
+
page_size: Type.Optional(Type.Number({ description: "\u6BCF\u9875\u6570\u91CF\uFF0C\u9ED8\u8BA4 50\uFF0C\u6700\u5927 100" })),
|
|
26
|
+
page_token: Type.Optional(Type.String({ description: "\u5206\u9875\u6807\u8BB0" }))
|
|
27
|
+
}),
|
|
28
|
+
// UPDATE (P1)
|
|
29
|
+
Type.Object({
|
|
30
|
+
action: Type.Literal("update"),
|
|
31
|
+
app_token: Type.String({ description: "\u591A\u7EF4\u8868\u683C token" }),
|
|
32
|
+
table_id: Type.String({ description: "\u6570\u636E\u8868 ID" }),
|
|
33
|
+
field_id: Type.String({ description: "\u5B57\u6BB5 ID" }),
|
|
34
|
+
field_name: Type.Optional(Type.String({ description: "\u5B57\u6BB5\u540D\uFF08\u53EF\u9009\uFF0C\u4E0D\u4F20\u5219\u4E0D\u4FEE\u6539\uFF09" })),
|
|
35
|
+
type: Type.Optional(
|
|
36
|
+
Type.Number({
|
|
37
|
+
description: "\u5B57\u6BB5\u7C7B\u578B\uFF08\u53EF\u9009\uFF0C\u4E0D\u4F20\u5219\u81EA\u52A8\u67E5\u8BE2\uFF09\uFF1A1=\u6587\u672C, 2=\u6570\u5B57, 3=\u5355\u9009, 4=\u591A\u9009, 5=\u65E5\u671F, 7=\u590D\u9009\u6846, 11=\u4EBA\u5458, 13=\u7535\u8BDD, 15=\u8D85\u94FE\u63A5, 17=\u9644\u4EF6\u7B49"
|
|
38
|
+
})
|
|
39
|
+
),
|
|
40
|
+
property: Type.Optional(Type.Any({ description: "\u5B57\u6BB5\u5C5E\u6027\u914D\u7F6E\uFF08\u53EF\u9009\uFF0C\u4E0D\u4F20\u5219\u81EA\u52A8\u67E5\u8BE2\uFF09" }))
|
|
41
|
+
}),
|
|
42
|
+
// DELETE (P1)
|
|
43
|
+
Type.Object({
|
|
44
|
+
action: Type.Literal("delete"),
|
|
45
|
+
app_token: Type.String({ description: "\u591A\u7EF4\u8868\u683C token" }),
|
|
46
|
+
table_id: Type.String({ description: "\u6570\u636E\u8868 ID" }),
|
|
47
|
+
field_id: Type.String({ description: "\u5B57\u6BB5 ID" })
|
|
48
|
+
})
|
|
49
|
+
]);
|
|
50
|
+
function registerFeishuBitableAppTableFieldTool(api) {
|
|
51
|
+
if (!api.config) return;
|
|
52
|
+
const cfg = api.config;
|
|
53
|
+
const { toolClient, log } = createToolContext(api, "feishu_bitable_app_table_field");
|
|
54
|
+
api.registerTool(
|
|
55
|
+
{
|
|
56
|
+
name: "feishu_bitable_app_table_field",
|
|
57
|
+
label: "Feishu Bitable Fields",
|
|
58
|
+
description: "\u3010\u4EE5\u7528\u6237\u8EAB\u4EFD\u3011\u98DE\u4E66\u591A\u7EF4\u8868\u683C\u5B57\u6BB5\uFF08\u5217\uFF09\u7BA1\u7406\u5DE5\u5177\u3002\u5F53\u7528\u6237\u8981\u6C42\u521B\u5EFA/\u67E5\u8BE2/\u66F4\u65B0/\u5220\u9664\u5B57\u6BB5\u3001\u8C03\u6574\u8868\u7ED3\u6784\u65F6\u4F7F\u7528\u3002Actions: create\uFF08\u521B\u5EFA\u5B57\u6BB5\uFF09, list\uFF08\u5217\u51FA\u6240\u6709\u5B57\u6BB5\uFF09, update\uFF08\u66F4\u65B0\u5B57\u6BB5\uFF0C\u652F\u6301\u53EA\u4F20 field_name \u6539\u540D\uFF09, delete\uFF08\u5220\u9664\u5B57\u6BB5\uFF09\u3002",
|
|
59
|
+
parameters: FeishuBitableAppTableFieldSchema,
|
|
60
|
+
async execute(_toolCallId, params) {
|
|
61
|
+
const p = params;
|
|
62
|
+
try {
|
|
63
|
+
const client = toolClient();
|
|
64
|
+
switch (p.action) {
|
|
65
|
+
// -----------------------------------------------------------------
|
|
66
|
+
// CREATE
|
|
67
|
+
// -----------------------------------------------------------------
|
|
68
|
+
case "create": {
|
|
69
|
+
log.info(
|
|
70
|
+
`create: app_token=${p.app_token}, table_id=${p.table_id}, field_name=${p.field_name}, type=${p.type}`
|
|
71
|
+
);
|
|
72
|
+
let propertyToSend = p.property;
|
|
73
|
+
if ((p.type === 15 || p.type === 7) && p.property !== void 0) {
|
|
74
|
+
const fieldTypeName = p.type === 15 ? "URL" : "Checkbox";
|
|
75
|
+
log.warn(
|
|
76
|
+
`create: ${fieldTypeName} field (type=${p.type}) detected with property parameter. Removing property to avoid API error. ${fieldTypeName} fields must omit the property parameter entirely.`
|
|
77
|
+
);
|
|
78
|
+
propertyToSend = void 0;
|
|
79
|
+
}
|
|
80
|
+
const res = await client.invoke(
|
|
81
|
+
"feishu_bitable_app_table_field.create",
|
|
82
|
+
(sdk, opts) => sdk.bitable.appTableField.create(
|
|
83
|
+
{
|
|
84
|
+
path: {
|
|
85
|
+
app_token: p.app_token,
|
|
86
|
+
table_id: p.table_id
|
|
87
|
+
},
|
|
88
|
+
data: {
|
|
89
|
+
field_name: p.field_name,
|
|
90
|
+
type: p.type,
|
|
91
|
+
property: propertyToSend
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
opts
|
|
95
|
+
),
|
|
96
|
+
{ as: "user" }
|
|
97
|
+
);
|
|
98
|
+
assertLarkOk(res);
|
|
99
|
+
const data = res.data;
|
|
100
|
+
log.info(`create: created field ${data?.field?.field_id ?? "unknown"}`);
|
|
101
|
+
return json({
|
|
102
|
+
field: data?.field ?? res.data
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
// -----------------------------------------------------------------
|
|
106
|
+
// LIST
|
|
107
|
+
// -----------------------------------------------------------------
|
|
108
|
+
case "list": {
|
|
109
|
+
log.info(`list: app_token=${p.app_token}, table_id=${p.table_id}, view_id=${p.view_id ?? "none"}`);
|
|
110
|
+
const res = await client.invoke(
|
|
111
|
+
"feishu_bitable_app_table_field.list",
|
|
112
|
+
(sdk, opts) => sdk.bitable.appTableField.list(
|
|
113
|
+
{
|
|
114
|
+
path: {
|
|
115
|
+
app_token: p.app_token,
|
|
116
|
+
table_id: p.table_id
|
|
117
|
+
},
|
|
118
|
+
params: {
|
|
119
|
+
view_id: p.view_id,
|
|
120
|
+
page_size: p.page_size,
|
|
121
|
+
page_token: p.page_token
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
opts
|
|
125
|
+
),
|
|
126
|
+
{ as: "user" }
|
|
127
|
+
);
|
|
128
|
+
assertLarkOk(res);
|
|
129
|
+
const data = res.data;
|
|
130
|
+
log.info(`list: returned ${data?.items?.length ?? 0} fields`);
|
|
131
|
+
return json({
|
|
132
|
+
fields: data?.items,
|
|
133
|
+
has_more: data?.has_more ?? false,
|
|
134
|
+
page_token: data?.page_token
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
// -----------------------------------------------------------------
|
|
138
|
+
// UPDATE
|
|
139
|
+
// -----------------------------------------------------------------
|
|
140
|
+
case "update": {
|
|
141
|
+
log.info(`update: app_token=${p.app_token}, table_id=${p.table_id}, field_id=${p.field_id}`);
|
|
142
|
+
let finalFieldName = p.field_name;
|
|
143
|
+
let finalType = p.type;
|
|
144
|
+
let finalProperty = p.property;
|
|
145
|
+
if (!finalType || !finalFieldName) {
|
|
146
|
+
log.info(`update: missing type or field_name, auto-querying field info`);
|
|
147
|
+
const listRes = await client.invoke(
|
|
148
|
+
"feishu_bitable_app_table_field.update",
|
|
149
|
+
(sdk, opts) => sdk.bitable.appTableField.list(
|
|
150
|
+
{
|
|
151
|
+
path: {
|
|
152
|
+
app_token: p.app_token,
|
|
153
|
+
table_id: p.table_id
|
|
154
|
+
},
|
|
155
|
+
params: {
|
|
156
|
+
page_size: 500
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
opts
|
|
160
|
+
),
|
|
161
|
+
{ as: "user" }
|
|
162
|
+
);
|
|
163
|
+
assertLarkOk(listRes);
|
|
164
|
+
const listData = listRes.data;
|
|
165
|
+
const currentField = listData?.items?.find((f) => f.field_id === p.field_id);
|
|
166
|
+
if (!currentField) {
|
|
167
|
+
return json({
|
|
168
|
+
error: `field ${p.field_id} does not exist`,
|
|
169
|
+
hint: "Please verify field_id is correct. Use list action to view all fields."
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
finalFieldName = p.field_name || currentField.field_name;
|
|
173
|
+
finalType = p.type ?? currentField.type;
|
|
174
|
+
finalProperty = p.property !== void 0 ? p.property : currentField.property;
|
|
175
|
+
log.info(`update: auto-filled type=${finalType}, field_name=${finalFieldName}`);
|
|
176
|
+
}
|
|
177
|
+
const updateData = {
|
|
178
|
+
field_name: finalFieldName,
|
|
179
|
+
type: finalType
|
|
180
|
+
};
|
|
181
|
+
if (finalProperty !== void 0) {
|
|
182
|
+
updateData.property = finalProperty;
|
|
183
|
+
}
|
|
184
|
+
const res = await client.invoke(
|
|
185
|
+
"feishu_bitable_app_table_field.update",
|
|
186
|
+
(sdk, opts) => sdk.bitable.appTableField.update(
|
|
187
|
+
{
|
|
188
|
+
path: {
|
|
189
|
+
app_token: p.app_token,
|
|
190
|
+
table_id: p.table_id,
|
|
191
|
+
field_id: p.field_id
|
|
192
|
+
},
|
|
193
|
+
data: updateData
|
|
194
|
+
},
|
|
195
|
+
opts
|
|
196
|
+
),
|
|
197
|
+
{ as: "user" }
|
|
198
|
+
);
|
|
199
|
+
assertLarkOk(res);
|
|
200
|
+
log.info(`update: updated field ${p.field_id}`);
|
|
201
|
+
const updateData2 = res.data;
|
|
202
|
+
return json({
|
|
203
|
+
field: updateData2?.field ?? res.data
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
// -----------------------------------------------------------------
|
|
207
|
+
// DELETE
|
|
208
|
+
// -----------------------------------------------------------------
|
|
209
|
+
case "delete": {
|
|
210
|
+
log.info(`delete: app_token=${p.app_token}, table_id=${p.table_id}, field_id=${p.field_id}`);
|
|
211
|
+
const res = await client.invoke(
|
|
212
|
+
"feishu_bitable_app_table_field.delete",
|
|
213
|
+
(sdk, opts) => sdk.bitable.appTableField.delete(
|
|
214
|
+
{
|
|
215
|
+
path: {
|
|
216
|
+
app_token: p.app_token,
|
|
217
|
+
table_id: p.table_id,
|
|
218
|
+
field_id: p.field_id
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
opts
|
|
222
|
+
),
|
|
223
|
+
{ as: "user" }
|
|
224
|
+
);
|
|
225
|
+
assertLarkOk(res);
|
|
226
|
+
log.info(`delete: deleted field ${p.field_id}`);
|
|
227
|
+
return json({
|
|
228
|
+
success: true
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
} catch (err) {
|
|
233
|
+
return await handleInvokeErrorWithAutoAuth(err, cfg);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
{ name: "feishu_bitable_app_table_field" }
|
|
238
|
+
);
|
|
239
|
+
api.logger.info?.("feishu_bitable_app_table_field: Registered feishu_bitable_app_table_field tool");
|
|
240
|
+
}
|
|
241
|
+
export {
|
|
242
|
+
registerFeishuBitableAppTableFieldTool
|
|
243
|
+
};
|
|
244
|
+
//# sourceMappingURL=app-table-field.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/tools/oapi/bitable/app-table-field.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n *\n * feishu_bitable_app_table_field tool -- Manage Feishu Bitable fields (columns).\n *\n * P1 Actions: create, list, update, delete\n *\n * Uses the Feishu Bitable v1 API:\n * - create: POST /open-apis/bitable/v1/apps/:app_token/tables/:table_id/fields\n * - list: GET /open-apis/bitable/v1/apps/:app_token/tables/:table_id/fields\n * - update: PUT /open-apis/bitable/v1/apps/:app_token/tables/:table_id/fields/:field_id\n * - delete: DELETE /open-apis/bitable/v1/apps/:app_token/tables/:table_id/fields/:field_id\n */\n\nimport type { OpenClawPluginApi } from 'openclaw/plugin-sdk';\nimport { Type } from '@sinclair/typebox';\n\nimport { json, createToolContext, assertLarkOk, handleInvokeErrorWithAutoAuth } from '../helpers';\nimport type { PaginatedData, FieldData } from '../sdk-types';\n\n// ---------------------------------------------------------------------------\n// Schema\n// ---------------------------------------------------------------------------\n\nconst FeishuBitableAppTableFieldSchema = Type.Union([\n // CREATE (P1)\n Type.Object({\n action: Type.Literal('create'),\n app_token: Type.String({ description: '\u591A\u7EF4\u8868\u683C token' }),\n table_id: Type.String({ description: '\u6570\u636E\u8868 ID' }),\n field_name: Type.String({ description: '\u5B57\u6BB5\u540D\u79F0' }),\n type: Type.Number({\n description:\n '\u5B57\u6BB5\u7C7B\u578B\uFF081=\u6587\u672C\uFF0C2=\u6570\u5B57\uFF0C3=\u5355\u9009\uFF0C4=\u591A\u9009\uFF0C5=\u65E5\u671F\uFF0C7=\u590D\u9009\u6846\uFF0C11=\u4EBA\u5458\uFF0C13=\u7535\u8BDD\uFF0C15=\u8D85\u94FE\u63A5\uFF0C17=\u9644\u4EF6\uFF0C1001=\u521B\u5EFA\u65F6\u95F4\uFF0C1002=\u4FEE\u6539\u65F6\u95F4\u7B49\uFF09',\n }),\n property: Type.Optional(\n Type.Any({\n description:\n '\u5B57\u6BB5\u5C5E\u6027\u914D\u7F6E\uFF08\u6839\u636E\u7C7B\u578B\u800C\u5B9A\uFF0C\u4F8B\u5982\u5355\u9009/\u591A\u9009\u9700\u8981options\uFF0C\u6570\u5B57\u9700\u8981formatter\u7B49\uFF09\u3002' +\n '\u26A0\uFE0F \u91CD\u8981\uFF1A\u8D85\u94FE\u63A5\u5B57\u6BB5\uFF08type=15\uFF09\u5FC5\u987B\u5B8C\u5168\u7701\u7565\u6B64\u53C2\u6570\uFF0C\u4F20\u7A7A\u5BF9\u8C61 {} \u4E5F\u4F1A\u62A5\u9519\uFF08URLFieldPropertyError\uFF09\u3002',\n }),\n ),\n }),\n\n // LIST (P1)\n Type.Object({\n action: Type.Literal('list'),\n app_token: Type.String({ description: '\u591A\u7EF4\u8868\u683C token' }),\n table_id: Type.String({ description: '\u6570\u636E\u8868 ID' }),\n view_id: Type.Optional(Type.String({ description: '\u89C6\u56FE ID\uFF08\u53EF\u9009\uFF09' })),\n page_size: Type.Optional(Type.Number({ description: '\u6BCF\u9875\u6570\u91CF\uFF0C\u9ED8\u8BA4 50\uFF0C\u6700\u5927 100' })),\n page_token: Type.Optional(Type.String({ description: '\u5206\u9875\u6807\u8BB0' })),\n }),\n\n // UPDATE (P1)\n Type.Object({\n action: Type.Literal('update'),\n app_token: Type.String({ description: '\u591A\u7EF4\u8868\u683C token' }),\n table_id: Type.String({ description: '\u6570\u636E\u8868 ID' }),\n field_id: Type.String({ description: '\u5B57\u6BB5 ID' }),\n field_name: Type.Optional(Type.String({ description: '\u5B57\u6BB5\u540D\uFF08\u53EF\u9009\uFF0C\u4E0D\u4F20\u5219\u4E0D\u4FEE\u6539\uFF09' })),\n type: Type.Optional(\n Type.Number({\n description:\n '\u5B57\u6BB5\u7C7B\u578B\uFF08\u53EF\u9009\uFF0C\u4E0D\u4F20\u5219\u81EA\u52A8\u67E5\u8BE2\uFF09\uFF1A1=\u6587\u672C, 2=\u6570\u5B57, 3=\u5355\u9009, 4=\u591A\u9009, 5=\u65E5\u671F, 7=\u590D\u9009\u6846, 11=\u4EBA\u5458, 13=\u7535\u8BDD, 15=\u8D85\u94FE\u63A5, 17=\u9644\u4EF6\u7B49',\n }),\n ),\n property: Type.Optional(Type.Any({ description: '\u5B57\u6BB5\u5C5E\u6027\u914D\u7F6E\uFF08\u53EF\u9009\uFF0C\u4E0D\u4F20\u5219\u81EA\u52A8\u67E5\u8BE2\uFF09' })),\n }),\n\n // DELETE (P1)\n Type.Object({\n action: Type.Literal('delete'),\n app_token: Type.String({ description: '\u591A\u7EF4\u8868\u683C token' }),\n table_id: Type.String({ description: '\u6570\u636E\u8868 ID' }),\n field_id: Type.String({ description: '\u5B57\u6BB5 ID' }),\n }),\n]);\n\n// ---------------------------------------------------------------------------\n// Params type\n// ---------------------------------------------------------------------------\n\ntype FeishuBitableAppTableFieldParams =\n | {\n action: 'create';\n app_token: string;\n table_id: string;\n field_name: string;\n type: number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n property?: any;\n }\n | {\n action: 'list';\n app_token: string;\n table_id: string;\n view_id?: string;\n page_size?: number;\n page_token?: string;\n }\n | {\n action: 'update';\n app_token: string;\n table_id: string;\n field_id: string;\n field_name?: string;\n type?: number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n property?: any;\n }\n | {\n action: 'delete';\n app_token: string;\n table_id: string;\n field_id: string;\n };\n\n// ---------------------------------------------------------------------------\n// Registration\n// ---------------------------------------------------------------------------\n\nexport function registerFeishuBitableAppTableFieldTool(api: OpenClawPluginApi) {\n if (!api.config) return;\n\n const cfg = api.config;\n\n const { toolClient, log } = createToolContext(api, 'feishu_bitable_app_table_field');\n\n api.registerTool(\n {\n name: 'feishu_bitable_app_table_field',\n label: 'Feishu Bitable Fields',\n description:\n '\u3010\u4EE5\u7528\u6237\u8EAB\u4EFD\u3011\u98DE\u4E66\u591A\u7EF4\u8868\u683C\u5B57\u6BB5\uFF08\u5217\uFF09\u7BA1\u7406\u5DE5\u5177\u3002\u5F53\u7528\u6237\u8981\u6C42\u521B\u5EFA/\u67E5\u8BE2/\u66F4\u65B0/\u5220\u9664\u5B57\u6BB5\u3001\u8C03\u6574\u8868\u7ED3\u6784\u65F6\u4F7F\u7528\u3002Actions: create\uFF08\u521B\u5EFA\u5B57\u6BB5\uFF09, list\uFF08\u5217\u51FA\u6240\u6709\u5B57\u6BB5\uFF09, update\uFF08\u66F4\u65B0\u5B57\u6BB5\uFF0C\u652F\u6301\u53EA\u4F20 field_name \u6539\u540D\uFF09, delete\uFF08\u5220\u9664\u5B57\u6BB5\uFF09\u3002',\n parameters: FeishuBitableAppTableFieldSchema,\n async execute(_toolCallId, params) {\n const p = params as FeishuBitableAppTableFieldParams;\n\n try {\n const client = toolClient();\n\n switch (p.action) {\n // -----------------------------------------------------------------\n // CREATE\n // -----------------------------------------------------------------\n case 'create': {\n log.info(\n `create: app_token=${p.app_token}, table_id=${p.table_id}, field_name=${p.field_name}, type=${p.type}`,\n );\n\n // \u7279\u6B8A\u5904\u7406\uFF1A\u8D85\u94FE\u63A5\u5B57\u6BB5\uFF08type=15\uFF09\u548C\u590D\u9009\u6846\u5B57\u6BB5\uFF08type=7\uFF09\u4E0D\u80FD\u4F20 property\uFF0C\u5373\u4F7F\u662F\u7A7A\u5BF9\u8C61\u4E5F\u4F1A\u62A5\u9519\n let propertyToSend = p.property;\n if ((p.type === 15 || p.type === 7) && p.property !== undefined) {\n const fieldTypeName = p.type === 15 ? 'URL' : 'Checkbox';\n log.warn(\n `create: ${fieldTypeName} field (type=${p.type}) detected with property parameter. ` +\n `Removing property to avoid API error. ` +\n `${fieldTypeName} fields must omit the property parameter entirely.`,\n );\n propertyToSend = undefined;\n }\n\n const res = await client.invoke(\n 'feishu_bitable_app_table_field.create',\n (sdk, opts) =>\n sdk.bitable.appTableField.create(\n {\n path: {\n app_token: p.app_token,\n table_id: p.table_id,\n },\n data: {\n field_name: p.field_name,\n type: p.type,\n property: propertyToSend,\n },\n },\n opts,\n ),\n { as: 'user' },\n );\n assertLarkOk(res);\n\n const data = res.data as FieldData | undefined;\n\n log.info(`create: created field ${data?.field?.field_id ?? 'unknown'}`);\n\n return json({\n field: data?.field ?? res.data,\n });\n }\n\n // -----------------------------------------------------------------\n // LIST\n // -----------------------------------------------------------------\n case 'list': {\n log.info(`list: app_token=${p.app_token}, table_id=${p.table_id}, view_id=${p.view_id ?? 'none'}`);\n\n const res = await client.invoke(\n 'feishu_bitable_app_table_field.list',\n (sdk, opts) =>\n sdk.bitable.appTableField.list(\n {\n path: {\n app_token: p.app_token,\n table_id: p.table_id,\n },\n params: {\n view_id: p.view_id,\n page_size: p.page_size,\n page_token: p.page_token,\n },\n },\n opts,\n ),\n { as: 'user' },\n );\n assertLarkOk(res);\n\n const data = res.data as PaginatedData | undefined;\n\n log.info(`list: returned ${data?.items?.length ?? 0} fields`);\n\n return json({\n fields: data?.items,\n has_more: data?.has_more ?? false,\n page_token: data?.page_token,\n });\n }\n\n // -----------------------------------------------------------------\n // UPDATE\n // -----------------------------------------------------------------\n case 'update': {\n log.info(`update: app_token=${p.app_token}, table_id=${p.table_id}, field_id=${p.field_id}`);\n\n // \u5982\u679C\u7F3A\u5C11 type \u6216 field_name\uFF0C\u81EA\u52A8\u67E5\u8BE2\u5F53\u524D\u5B57\u6BB5\u4FE1\u606F\n let finalFieldName = p.field_name;\n let finalType = p.type;\n let finalProperty = p.property;\n\n if (!finalType || !finalFieldName) {\n log.info(`update: missing type or field_name, auto-querying field info`);\n\n const listRes = await client.invoke(\n 'feishu_bitable_app_table_field.update',\n (sdk, opts) =>\n sdk.bitable.appTableField.list(\n {\n path: {\n app_token: p.app_token,\n table_id: p.table_id,\n },\n params: {\n page_size: 500,\n },\n },\n opts,\n ),\n { as: 'user' },\n );\n assertLarkOk(listRes);\n\n \n const listData = listRes.data as\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | PaginatedData<{ field_id?: string; field_name?: string; type?: number; property?: any }>\n | undefined;\n const currentField = listData?.items?.find((f) => f.field_id === p.field_id);\n\n if (!currentField) {\n return json({\n error: `field ${p.field_id} does not exist`,\n hint: 'Please verify field_id is correct. Use list action to view all fields.',\n });\n }\n\n // \u5408\u5E76\uFF1A\u7528\u6237\u4F20\u7684\u4F18\u5148\uFF0C\u5426\u5219\u7528\u67E5\u8BE2\u5230\u7684\n finalFieldName = p.field_name || currentField.field_name;\n finalType = p.type ?? currentField.type;\n finalProperty = p.property !== undefined ? p.property : currentField.property;\n\n log.info(`update: auto-filled type=${finalType}, field_name=${finalFieldName}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const updateData: any = {\n field_name: finalFieldName,\n type: finalType,\n };\n if (finalProperty !== undefined) {\n updateData.property = finalProperty;\n }\n\n const res = await client.invoke(\n 'feishu_bitable_app_table_field.update',\n (sdk, opts) =>\n sdk.bitable.appTableField.update(\n {\n path: {\n app_token: p.app_token,\n table_id: p.table_id,\n field_id: p.field_id,\n },\n data: updateData,\n },\n opts,\n ),\n { as: 'user' },\n );\n assertLarkOk(res);\n\n log.info(`update: updated field ${p.field_id}`);\n\n const updateData2 = res.data as FieldData | undefined;\n\n return json({\n field: updateData2?.field ?? res.data,\n });\n }\n\n // -----------------------------------------------------------------\n // DELETE\n // -----------------------------------------------------------------\n case 'delete': {\n log.info(`delete: app_token=${p.app_token}, table_id=${p.table_id}, field_id=${p.field_id}`);\n\n const res = await client.invoke(\n 'feishu_bitable_app_table_field.delete',\n (sdk, opts) =>\n sdk.bitable.appTableField.delete(\n {\n path: {\n app_token: p.app_token,\n table_id: p.table_id,\n field_id: p.field_id,\n },\n },\n opts,\n ),\n { as: 'user' },\n );\n assertLarkOk(res);\n\n log.info(`delete: deleted field ${p.field_id}`);\n\n return json({\n success: true,\n });\n }\n }\n } catch (err) {\n return await handleInvokeErrorWithAutoAuth(err, cfg);\n }\n },\n },\n { name: 'feishu_bitable_app_table_field' },\n );\n\n api.logger.info?.('feishu_bitable_app_table_field: Registered feishu_bitable_app_table_field tool');\n}\n"],
|
|
5
|
+
"mappings": "AAgBA,SAAS,YAAY;AAErB,SAAS,MAAM,mBAAmB,cAAc,qCAAqC;AAOrF,MAAM,mCAAmC,KAAK,MAAM;AAAA;AAAA,EAElD,KAAK,OAAO;AAAA,IACV,QAAQ,KAAK,QAAQ,QAAQ;AAAA,IAC7B,WAAW,KAAK,OAAO,EAAE,aAAa,iCAAa,CAAC;AAAA,IACpD,UAAU,KAAK,OAAO,EAAE,aAAa,wBAAS,CAAC;AAAA,IAC/C,YAAY,KAAK,OAAO,EAAE,aAAa,2BAAO,CAAC;AAAA,IAC/C,MAAM,KAAK,OAAO;AAAA,MAChB,aACE;AAAA,IACJ,CAAC;AAAA,IACD,UAAU,KAAK;AAAA,MACb,KAAK,IAAI;AAAA,QACP,aACE;AAAA,MAEJ,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAAA;AAAA,EAGD,KAAK,OAAO;AAAA,IACV,QAAQ,KAAK,QAAQ,MAAM;AAAA,IAC3B,WAAW,KAAK,OAAO,EAAE,aAAa,iCAAa,CAAC;AAAA,IACpD,UAAU,KAAK,OAAO,EAAE,aAAa,wBAAS,CAAC;AAAA,IAC/C,SAAS,KAAK,SAAS,KAAK,OAAO,EAAE,aAAa,0CAAY,CAAC,CAAC;AAAA,IAChE,WAAW,KAAK,SAAS,KAAK,OAAO,EAAE,aAAa,sEAAoB,CAAC,CAAC;AAAA,IAC1E,YAAY,KAAK,SAAS,KAAK,OAAO,EAAE,aAAa,2BAAO,CAAC,CAAC;AAAA,EAChE,CAAC;AAAA;AAAA,EAGD,KAAK,OAAO;AAAA,IACV,QAAQ,KAAK,QAAQ,QAAQ;AAAA,IAC7B,WAAW,KAAK,OAAO,EAAE,aAAa,iCAAa,CAAC;AAAA,IACpD,UAAU,KAAK,OAAO,EAAE,aAAa,wBAAS,CAAC;AAAA,IAC/C,UAAU,KAAK,OAAO,EAAE,aAAa,kBAAQ,CAAC;AAAA,IAC9C,YAAY,KAAK,SAAS,KAAK,OAAO,EAAE,aAAa,uFAAiB,CAAC,CAAC;AAAA,IACxE,MAAM,KAAK;AAAA,MACT,KAAK,OAAO;AAAA,QACV,aACE;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,IACA,UAAU,KAAK,SAAS,KAAK,IAAI,EAAE,aAAa,+GAAqB,CAAC,CAAC;AAAA,EACzE,CAAC;AAAA;AAAA,EAGD,KAAK,OAAO;AAAA,IACV,QAAQ,KAAK,QAAQ,QAAQ;AAAA,IAC7B,WAAW,KAAK,OAAO,EAAE,aAAa,iCAAa,CAAC;AAAA,IACpD,UAAU,KAAK,OAAO,EAAE,aAAa,wBAAS,CAAC;AAAA,IAC/C,UAAU,KAAK,OAAO,EAAE,aAAa,kBAAQ,CAAC;AAAA,EAChD,CAAC;AACH,CAAC;AA6CM,SAAS,uCAAuC,KAAwB;AAC7E,MAAI,CAAC,IAAI,OAAQ;AAEjB,QAAM,MAAM,IAAI;AAEhB,QAAM,EAAE,YAAY,IAAI,IAAI,kBAAkB,KAAK,gCAAgC;AAEnF,MAAI;AAAA,IACF;AAAA,MACE,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACE;AAAA,MACF,YAAY;AAAA,MACZ,MAAM,QAAQ,aAAa,QAAQ;AACjC,cAAM,IAAI;AAEV,YAAI;AACF,gBAAM,SAAS,WAAW;AAE1B,kBAAQ,EAAE,QAAQ;AAAA;AAAA;AAAA;AAAA,YAIhB,KAAK,UAAU;AACb,kBAAI;AAAA,gBACF,qBAAqB,EAAE,SAAS,cAAc,EAAE,QAAQ,gBAAgB,EAAE,UAAU,UAAU,EAAE,IAAI;AAAA,cACtG;AAGA,kBAAI,iBAAiB,EAAE;AACvB,mBAAK,EAAE,SAAS,MAAM,EAAE,SAAS,MAAM,EAAE,aAAa,QAAW;AAC/D,sBAAM,gBAAgB,EAAE,SAAS,KAAK,QAAQ;AAC9C,oBAAI;AAAA,kBACF,WAAW,aAAa,gBAAgB,EAAE,IAAI,6EAEzC,aAAa;AAAA,gBACpB;AACA,iCAAiB;AAAA,cACnB;AAEA,oBAAM,MAAM,MAAM,OAAO;AAAA,gBACvB;AAAA,gBACA,CAAC,KAAK,SACJ,IAAI,QAAQ,cAAc;AAAA,kBACxB;AAAA,oBACE,MAAM;AAAA,sBACJ,WAAW,EAAE;AAAA,sBACb,UAAU,EAAE;AAAA,oBACd;AAAA,oBACA,MAAM;AAAA,sBACJ,YAAY,EAAE;AAAA,sBACd,MAAM,EAAE;AAAA,sBACR,UAAU;AAAA,oBACZ;AAAA,kBACF;AAAA,kBACA;AAAA,gBACF;AAAA,gBACF,EAAE,IAAI,OAAO;AAAA,cACf;AACA,2BAAa,GAAG;AAEhB,oBAAM,OAAO,IAAI;AAEjB,kBAAI,KAAK,yBAAyB,MAAM,OAAO,YAAY,SAAS,EAAE;AAEtE,qBAAO,KAAK;AAAA,gBACV,OAAO,MAAM,SAAS,IAAI;AAAA,cAC5B,CAAC;AAAA,YACH;AAAA;AAAA;AAAA;AAAA,YAKA,KAAK,QAAQ;AACX,kBAAI,KAAK,mBAAmB,EAAE,SAAS,cAAc,EAAE,QAAQ,aAAa,EAAE,WAAW,MAAM,EAAE;AAEjG,oBAAM,MAAM,MAAM,OAAO;AAAA,gBACvB;AAAA,gBACA,CAAC,KAAK,SACJ,IAAI,QAAQ,cAAc;AAAA,kBACxB;AAAA,oBACE,MAAM;AAAA,sBACJ,WAAW,EAAE;AAAA,sBACb,UAAU,EAAE;AAAA,oBACd;AAAA,oBACA,QAAQ;AAAA,sBACN,SAAS,EAAE;AAAA,sBACX,WAAW,EAAE;AAAA,sBACb,YAAY,EAAE;AAAA,oBAChB;AAAA,kBACF;AAAA,kBACA;AAAA,gBACF;AAAA,gBACF,EAAE,IAAI,OAAO;AAAA,cACf;AACA,2BAAa,GAAG;AAEhB,oBAAM,OAAO,IAAI;AAEjB,kBAAI,KAAK,kBAAkB,MAAM,OAAO,UAAU,CAAC,SAAS;AAE5D,qBAAO,KAAK;AAAA,gBACV,QAAQ,MAAM;AAAA,gBACd,UAAU,MAAM,YAAY;AAAA,gBAC5B,YAAY,MAAM;AAAA,cACpB,CAAC;AAAA,YACH;AAAA;AAAA;AAAA;AAAA,YAKA,KAAK,UAAU;AACb,kBAAI,KAAK,qBAAqB,EAAE,SAAS,cAAc,EAAE,QAAQ,cAAc,EAAE,QAAQ,EAAE;AAG3F,kBAAI,iBAAiB,EAAE;AACvB,kBAAI,YAAY,EAAE;AAClB,kBAAI,gBAAgB,EAAE;AAEtB,kBAAI,CAAC,aAAa,CAAC,gBAAgB;AACjC,oBAAI,KAAK,8DAA8D;AAEvE,sBAAM,UAAU,MAAM,OAAO;AAAA,kBAC3B;AAAA,kBACA,CAAC,KAAK,SACJ,IAAI,QAAQ,cAAc;AAAA,oBACxB;AAAA,sBACE,MAAM;AAAA,wBACJ,WAAW,EAAE;AAAA,wBACb,UAAU,EAAE;AAAA,sBACd;AAAA,sBACA,QAAQ;AAAA,wBACN,WAAW;AAAA,sBACb;AAAA,oBACF;AAAA,oBACA;AAAA,kBACF;AAAA,kBACF,EAAE,IAAI,OAAO;AAAA,gBACf;AACA,6BAAa,OAAO;AAGpB,sBAAM,WAAW,QAAQ;AAIzB,sBAAM,eAAe,UAAU,OAAO,KAAK,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ;AAE3E,oBAAI,CAAC,cAAc;AACjB,yBAAO,KAAK;AAAA,oBACV,OAAO,SAAS,EAAE,QAAQ;AAAA,oBAC1B,MAAM;AAAA,kBACR,CAAC;AAAA,gBACH;AAGA,iCAAiB,EAAE,cAAc,aAAa;AAC9C,4BAAY,EAAE,QAAQ,aAAa;AACnC,gCAAgB,EAAE,aAAa,SAAY,EAAE,WAAW,aAAa;AAErE,oBAAI,KAAK,4BAA4B,SAAS,gBAAgB,cAAc,EAAE;AAAA,cAChF;AAGA,oBAAM,aAAkB;AAAA,gBACtB,YAAY;AAAA,gBACZ,MAAM;AAAA,cACR;AACA,kBAAI,kBAAkB,QAAW;AAC/B,2BAAW,WAAW;AAAA,cACxB;AAEA,oBAAM,MAAM,MAAM,OAAO;AAAA,gBACvB;AAAA,gBACA,CAAC,KAAK,SACJ,IAAI,QAAQ,cAAc;AAAA,kBACxB;AAAA,oBACE,MAAM;AAAA,sBACJ,WAAW,EAAE;AAAA,sBACb,UAAU,EAAE;AAAA,sBACZ,UAAU,EAAE;AAAA,oBACd;AAAA,oBACA,MAAM;AAAA,kBACR;AAAA,kBACA;AAAA,gBACF;AAAA,gBACF,EAAE,IAAI,OAAO;AAAA,cACf;AACA,2BAAa,GAAG;AAEhB,kBAAI,KAAK,yBAAyB,EAAE,QAAQ,EAAE;AAE9C,oBAAM,cAAc,IAAI;AAExB,qBAAO,KAAK;AAAA,gBACV,OAAO,aAAa,SAAS,IAAI;AAAA,cACnC,CAAC;AAAA,YACH;AAAA;AAAA;AAAA;AAAA,YAKA,KAAK,UAAU;AACb,kBAAI,KAAK,qBAAqB,EAAE,SAAS,cAAc,EAAE,QAAQ,cAAc,EAAE,QAAQ,EAAE;AAE3F,oBAAM,MAAM,MAAM,OAAO;AAAA,gBACvB;AAAA,gBACA,CAAC,KAAK,SACJ,IAAI,QAAQ,cAAc;AAAA,kBACxB;AAAA,oBACE,MAAM;AAAA,sBACJ,WAAW,EAAE;AAAA,sBACb,UAAU,EAAE;AAAA,sBACZ,UAAU,EAAE;AAAA,oBACd;AAAA,kBACF;AAAA,kBACA;AAAA,gBACF;AAAA,gBACF,EAAE,IAAI,OAAO;AAAA,cACf;AACA,2BAAa,GAAG;AAEhB,kBAAI,KAAK,yBAAyB,EAAE,QAAQ,EAAE;AAE9C,qBAAO,KAAK;AAAA,gBACV,SAAS;AAAA,cACX,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF,SAAS,KAAK;AACZ,iBAAO,MAAM,8BAA8B,KAAK,GAAG;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAAA,IACA,EAAE,MAAM,iCAAiC;AAAA,EAC3C;AAEA,MAAI,OAAO,OAAO,gFAAgF;AACpG;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|