botmux 2.47.0 → 2.47.1
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/README.en.md +10 -5
- package/README.md +10 -5
- package/dist/adapters/adopt-route.d.ts +63 -0
- package/dist/adapters/adopt-route.d.ts.map +1 -0
- package/dist/adapters/adopt-route.js +195 -0
- package/dist/adapters/adopt-route.js.map +1 -0
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +11 -0
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.d.ts +11 -0
- package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js +17 -1
- package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +36 -9
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/coco.d.ts.map +1 -1
- package/dist/adapters/cli/coco.js +26 -1
- package/dist/adapters/cli/coco.js.map +1 -1
- package/dist/adapters/cli/codex-app.d.ts +4 -0
- package/dist/adapters/cli/codex-app.d.ts.map +1 -0
- package/dist/adapters/cli/codex-app.js +72 -0
- package/dist/adapters/cli/codex-app.js.map +1 -0
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +6 -1
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/cursor.d.ts.map +1 -1
- package/dist/adapters/cli/cursor.js +58 -12
- package/dist/adapters/cli/cursor.js.map +1 -1
- package/dist/adapters/cli/gemini.d.ts.map +1 -1
- package/dist/adapters/cli/gemini.js +5 -1
- package/dist/adapters/cli/gemini.js.map +1 -1
- package/dist/adapters/cli/hermes.d.ts +4 -0
- package/dist/adapters/cli/hermes.d.ts.map +1 -0
- package/dist/adapters/cli/hermes.js +40 -0
- package/dist/adapters/cli/hermes.js.map +1 -0
- package/dist/adapters/cli/mira.d.ts +4 -0
- package/dist/adapters/cli/mira.d.ts.map +1 -0
- package/dist/adapters/cli/mira.js +67 -0
- package/dist/adapters/cli/mira.js.map +1 -0
- package/dist/adapters/cli/mtr.d.ts +5 -0
- package/dist/adapters/cli/mtr.d.ts.map +1 -0
- package/dist/adapters/cli/mtr.js +62 -0
- package/dist/adapters/cli/mtr.js.map +1 -0
- package/dist/adapters/cli/opencode.d.ts.map +1 -1
- package/dist/adapters/cli/opencode.js +19 -1
- package/dist/adapters/cli/opencode.js.map +1 -1
- package/dist/adapters/cli/registry.d.ts +5 -1
- package/dist/adapters/cli/registry.d.ts.map +1 -1
- package/dist/adapters/cli/registry.js +22 -2
- package/dist/adapters/cli/registry.js.map +1 -1
- package/dist/adapters/cli/shared-hints.d.ts +1 -1
- package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
- package/dist/adapters/cli/shared-hints.js +2 -1
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +35 -2
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/adapters/hook-command.d.ts +18 -0
- package/dist/adapters/hook-command.d.ts.map +1 -0
- package/dist/adapters/hook-command.js +38 -0
- package/dist/adapters/hook-command.js.map +1 -0
- package/dist/adapters/hook-installer.d.ts +14 -0
- package/dist/adapters/hook-installer.d.ts.map +1 -0
- package/dist/adapters/hook-installer.js +192 -0
- package/dist/adapters/hook-installer.js.map +1 -0
- package/dist/bot-registry.d.ts +59 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +67 -0
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/bots-list-output.d.ts +8 -0
- package/dist/cli/bots-list-output.d.ts.map +1 -1
- package/dist/cli/bots-list-output.js +9 -0
- package/dist/cli/bots-list-output.js.map +1 -1
- package/dist/cli.d.ts +15 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +603 -106
- package/dist/cli.js.map +1 -1
- package/dist/codex-app-runner.d.ts +3 -0
- package/dist/codex-app-runner.d.ts.map +1 -0
- package/dist/codex-app-runner.js +512 -0
- package/dist/codex-app-runner.js.map +1 -0
- package/dist/config.d.ts +11 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +17 -4
- package/dist/config.js.map +1 -1
- package/dist/core/ask-api.d.ts +47 -0
- package/dist/core/ask-api.d.ts.map +1 -0
- package/dist/core/ask-api.js +139 -0
- package/dist/core/ask-api.js.map +1 -0
- package/dist/core/ask-args.d.ts +53 -0
- package/dist/core/ask-args.d.ts.map +1 -0
- package/dist/core/ask-args.js +122 -0
- package/dist/core/ask-args.js.map +1 -0
- package/dist/core/ask-broker.d.ts +98 -0
- package/dist/core/ask-broker.d.ts.map +1 -0
- package/dist/core/ask-broker.js +329 -0
- package/dist/core/ask-broker.js.map +1 -0
- package/dist/core/ask-hook/claude-code.d.ts +50 -0
- package/dist/core/ask-hook/claude-code.d.ts.map +1 -0
- package/dist/core/ask-hook/claude-code.js +145 -0
- package/dist/core/ask-hook/claude-code.js.map +1 -0
- package/dist/core/ask-hook/codex.d.ts +43 -0
- package/dist/core/ask-hook/codex.d.ts.map +1 -0
- package/dist/core/ask-hook/codex.js +69 -0
- package/dist/core/ask-hook/codex.js.map +1 -0
- package/dist/core/ask-hook/opencode.d.ts +41 -0
- package/dist/core/ask-hook/opencode.d.ts.map +1 -0
- package/dist/core/ask-hook/opencode.js +108 -0
- package/dist/core/ask-hook/opencode.js.map +1 -0
- package/dist/core/ask-hook/registry.d.ts +3 -0
- package/dist/core/ask-hook/registry.d.ts.map +1 -0
- package/dist/core/ask-hook/registry.js +12 -0
- package/dist/core/ask-hook/registry.js.map +1 -0
- package/dist/core/ask-hook/types.d.ts +26 -0
- package/dist/core/ask-hook/types.d.ts.map +1 -0
- package/dist/core/ask-hook/types.js +2 -0
- package/dist/core/ask-hook/types.js.map +1 -0
- package/dist/core/ask-types.d.ts +146 -0
- package/dist/core/ask-types.d.ts.map +1 -0
- package/dist/core/ask-types.js +18 -0
- package/dist/core/ask-types.js.map +1 -0
- package/dist/core/command-handler.d.ts +20 -0
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +774 -311
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts +2 -0
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +222 -2
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/role-resolver.d.ts +17 -1
- package/dist/core/role-resolver.d.ts.map +1 -1
- package/dist/core/role-resolver.js +64 -10
- package/dist/core/role-resolver.js.map +1 -1
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +19 -5
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +37 -20
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/trigger-session.d.ts +9 -0
- package/dist/core/trigger-session.d.ts.map +1 -0
- package/dist/core/trigger-session.js +158 -0
- package/dist/core/trigger-session.js.map +1 -0
- package/dist/core/types.d.ts +5 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +141 -0
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +543 -24
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +213 -58
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/auth.d.ts +6 -1
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +9 -1
- package/dist/dashboard/auth.js.map +1 -1
- package/dist/dashboard/connector-api.d.ts +3 -0
- package/dist/dashboard/connector-api.d.ts.map +1 -0
- package/dist/dashboard/connector-api.js +351 -0
- package/dist/dashboard/connector-api.js.map +1 -0
- package/dist/dashboard/federated-group-core.d.ts +54 -0
- package/dist/dashboard/federated-group-core.d.ts.map +1 -0
- package/dist/dashboard/federated-group-core.js +165 -0
- package/dist/dashboard/federated-group-core.js.map +1 -0
- package/dist/dashboard/federation-api.d.ts +42 -0
- package/dist/dashboard/federation-api.d.ts.map +1 -0
- package/dist/dashboard/federation-api.js +408 -0
- package/dist/dashboard/federation-api.js.map +1 -0
- package/dist/dashboard/federation-spoke-api.d.ts +76 -0
- package/dist/dashboard/federation-spoke-api.d.ts.map +1 -0
- package/dist/dashboard/federation-spoke-api.js +618 -0
- package/dist/dashboard/federation-spoke-api.js.map +1 -0
- package/dist/dashboard/team-group.d.ts +18 -0
- package/dist/dashboard/team-group.d.ts.map +1 -0
- package/dist/dashboard/team-group.js +7 -0
- package/dist/dashboard/team-group.js.map +1 -0
- package/dist/dashboard/trigger-api.d.ts +13 -0
- package/dist/dashboard/trigger-api.d.ts.map +1 -0
- package/dist/dashboard/trigger-api.js +77 -0
- package/dist/dashboard/trigger-api.js.map +1 -0
- package/dist/dashboard/web/app.js +8 -0
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js +205 -21
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/connectors.d.ts +2 -0
- package/dist/dashboard/web/connectors.d.ts.map +1 -0
- package/dist/dashboard/web/connectors.js +187 -0
- package/dist/dashboard/web/connectors.js.map +1 -0
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +43 -5
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +4 -0
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/team-federation.d.ts +3 -0
- package/dist/dashboard/web/team-federation.d.ts.map +1 -0
- package/dist/dashboard/web/team-federation.js +487 -0
- package/dist/dashboard/web/team-federation.js.map +1 -0
- package/dist/dashboard/web/workflows.js +3 -3
- package/dist/dashboard/web/workflows.js.map +1 -1
- package/dist/dashboard/webhook-routes.d.ts +19 -0
- package/dist/dashboard/webhook-routes.d.ts.map +1 -0
- package/dist/dashboard/webhook-routes.js +321 -0
- package/dist/dashboard/webhook-routes.js.map +1 -0
- package/dist/dashboard/workflow-api.d.ts +8 -1
- package/dist/dashboard/workflow-api.d.ts.map +1 -1
- package/dist/dashboard/workflow-api.js +19 -4
- package/dist/dashboard/workflow-api.js.map +1 -1
- package/dist/dashboard-web/app.js +539 -375
- package/dist/dashboard-web/index.html +3 -1
- package/dist/dashboard-web/style.css +22 -0
- package/dist/dashboard.js +199 -2
- package/dist/dashboard.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +104 -11
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +104 -11
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/ask-card.d.ts +55 -0
- package/dist/im/lark/ask-card.d.ts.map +1 -0
- package/dist/im/lark/ask-card.js +328 -0
- package/dist/im/lark/ask-card.js.map +1 -0
- package/dist/im/lark/card-builder.d.ts +108 -3
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +480 -50
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +241 -18
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +83 -0
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +286 -70
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +29 -4
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/grant-command.d.ts +2 -1
- package/dist/im/lark/grant-command.d.ts.map +1 -1
- package/dist/im/lark/grant-command.js +3 -2
- package/dist/im/lark/grant-command.js.map +1 -1
- package/dist/im/lark/identity-cache.d.ts.map +1 -1
- package/dist/im/lark/identity-cache.js +3 -3
- package/dist/im/lark/identity-cache.js.map +1 -1
- package/dist/im/lark/md-card.d.ts +20 -2
- package/dist/im/lark/md-card.d.ts.map +1 -1
- package/dist/im/lark/md-card.js +49 -17
- package/dist/im/lark/md-card.js.map +1 -1
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +87 -31
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/im/lark/workflow-card-handler.d.ts +2 -2
- package/dist/im/lark/workflow-card-handler.d.ts.map +1 -1
- package/dist/im/lark/workflow-card-handler.js +12 -1
- package/dist/im/lark/workflow-card-handler.js.map +1 -1
- package/dist/im/lark/workflow-progress-card.d.ts.map +1 -1
- package/dist/im/lark/workflow-progress-card.js +53 -0
- package/dist/im/lark/workflow-progress-card.js.map +1 -1
- package/dist/mira-output.d.ts +3 -0
- package/dist/mira-output.d.ts.map +1 -0
- package/dist/mira-output.js +136 -0
- package/dist/mira-output.js.map +1 -0
- package/dist/mira-runner.d.ts +3 -0
- package/dist/mira-runner.d.ts.map +1 -0
- package/dist/mira-runner.js +534 -0
- package/dist/mira-runner.js.map +1 -0
- package/dist/services/bot-owner-store.d.ts +28 -0
- package/dist/services/bot-owner-store.d.ts.map +1 -0
- package/dist/services/bot-owner-store.js +82 -0
- package/dist/services/bot-owner-store.js.map +1 -0
- package/dist/services/bot-profile-store.d.ts +16 -0
- package/dist/services/bot-profile-store.d.ts.map +1 -0
- package/dist/services/bot-profile-store.js +98 -0
- package/dist/services/bot-profile-store.js.map +1 -0
- package/dist/services/brand-store.d.ts +15 -0
- package/dist/services/brand-store.d.ts.map +1 -0
- package/dist/services/brand-store.js +47 -0
- package/dist/services/brand-store.js.map +1 -0
- package/dist/services/card-prefs-store.d.ts +20 -0
- package/dist/services/card-prefs-store.d.ts.map +1 -0
- package/dist/services/card-prefs-store.js +82 -0
- package/dist/services/card-prefs-store.js.map +1 -0
- package/dist/services/codex-bridge-queue.d.ts +1 -0
- package/dist/services/codex-bridge-queue.d.ts.map +1 -1
- package/dist/services/codex-bridge-queue.js +23 -0
- package/dist/services/codex-bridge-queue.js.map +1 -1
- package/dist/services/codex-transcript.d.ts +1 -0
- package/dist/services/codex-transcript.d.ts.map +1 -1
- package/dist/services/codex-transcript.js.map +1 -1
- package/dist/services/connector-store.d.ts +58 -0
- package/dist/services/connector-store.d.ts.map +1 -0
- package/dist/services/connector-store.js +79 -0
- package/dist/services/connector-store.js.map +1 -0
- package/dist/services/deployment-identity.d.ts +22 -0
- package/dist/services/deployment-identity.d.ts.map +1 -0
- package/dist/services/deployment-identity.js +67 -0
- package/dist/services/deployment-identity.js.map +1 -0
- package/dist/services/federation-membership-store.d.ts +23 -0
- package/dist/services/federation-membership-store.d.ts.map +1 -0
- package/dist/services/federation-membership-store.js +66 -0
- package/dist/services/federation-membership-store.js.map +1 -0
- package/dist/services/federation-roster.d.ts +54 -0
- package/dist/services/federation-roster.d.ts.map +1 -0
- package/dist/services/federation-roster.js +51 -0
- package/dist/services/federation-roster.js.map +1 -0
- package/dist/services/federation-store.d.ts +76 -0
- package/dist/services/federation-store.d.ts.map +1 -0
- package/dist/services/federation-store.js +133 -0
- package/dist/services/federation-store.js.map +1 -0
- package/dist/services/grant-store.d.ts +12 -2
- package/dist/services/grant-store.d.ts.map +1 -1
- package/dist/services/grant-store.js +51 -4
- package/dist/services/grant-store.js.map +1 -1
- package/dist/services/group-creator.d.ts +10 -0
- package/dist/services/group-creator.d.ts.map +1 -1
- package/dist/services/group-creator.js +26 -1
- package/dist/services/group-creator.js.map +1 -1
- package/dist/services/groups-store.d.ts +30 -0
- package/dist/services/groups-store.d.ts.map +1 -1
- package/dist/services/groups-store.js +85 -12
- package/dist/services/groups-store.js.map +1 -1
- package/dist/services/hermes-transcript.d.ts +7 -0
- package/dist/services/hermes-transcript.d.ts.map +1 -0
- package/dist/services/hermes-transcript.js +117 -0
- package/dist/services/hermes-transcript.js.map +1 -0
- package/dist/services/invite-store.d.ts +28 -0
- package/dist/services/invite-store.d.ts.map +1 -0
- package/dist/services/invite-store.js +85 -0
- package/dist/services/invite-store.js.map +1 -0
- package/dist/services/pairing-store.d.ts +47 -0
- package/dist/services/pairing-store.d.ts.map +1 -0
- package/dist/services/pairing-store.js +132 -0
- package/dist/services/pairing-store.js.map +1 -0
- package/dist/services/project-scanner.d.ts +10 -0
- package/dist/services/project-scanner.d.ts.map +1 -1
- package/dist/services/project-scanner.js +11 -0
- package/dist/services/project-scanner.js.map +1 -1
- package/dist/services/relay-picker.d.ts +22 -0
- package/dist/services/relay-picker.d.ts.map +1 -0
- package/dist/services/relay-picker.js +62 -0
- package/dist/services/relay-picker.js.map +1 -0
- package/dist/services/send-policy.d.ts +55 -0
- package/dist/services/send-policy.d.ts.map +1 -0
- package/dist/services/send-policy.js +47 -0
- package/dist/services/send-policy.js.map +1 -0
- package/dist/services/session-store.js +1 -1
- package/dist/services/session-store.js.map +1 -1
- package/dist/services/team-roster.d.ts +38 -0
- package/dist/services/team-roster.d.ts.map +1 -0
- package/dist/services/team-roster.js +82 -0
- package/dist/services/team-roster.js.map +1 -0
- package/dist/services/team-store.d.ts +54 -0
- package/dist/services/team-store.d.ts.map +1 -0
- package/dist/services/team-store.js +156 -0
- package/dist/services/team-store.js.map +1 -0
- package/dist/services/trigger-log-store.d.ts +46 -0
- package/dist/services/trigger-log-store.d.ts.map +1 -0
- package/dist/services/trigger-log-store.js +132 -0
- package/dist/services/trigger-log-store.js.map +1 -0
- package/dist/services/trigger-types.d.ts +57 -0
- package/dist/services/trigger-types.d.ts.map +1 -0
- package/dist/services/trigger-types.js +28 -0
- package/dist/services/trigger-types.js.map +1 -0
- package/dist/services/webhook-key.d.ts +16 -0
- package/dist/services/webhook-key.d.ts.map +1 -0
- package/dist/services/webhook-key.js +123 -0
- package/dist/services/webhook-key.js.map +1 -0
- package/dist/services/webhook-lifecycle-extractors.d.ts +15 -0
- package/dist/services/webhook-lifecycle-extractors.d.ts.map +1 -0
- package/dist/services/webhook-lifecycle-extractors.js +59 -0
- package/dist/services/webhook-lifecycle-extractors.js.map +1 -0
- package/dist/services/webhook-lifecycle-store.d.ts +45 -0
- package/dist/services/webhook-lifecycle-store.d.ts.map +1 -0
- package/dist/services/webhook-lifecycle-store.js +159 -0
- package/dist/services/webhook-lifecycle-store.js.map +1 -0
- package/dist/setup/bot-config-editor.d.ts +8 -1
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +20 -2
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/ensure-tmux.d.ts +0 -22
- package/dist/setup/ensure-tmux.d.ts.map +1 -1
- package/dist/setup/ensure-tmux.js +25 -1
- package/dist/setup/ensure-tmux.js.map +1 -1
- package/dist/setup/verify-permissions.d.ts.map +1 -1
- package/dist/setup/verify-permissions.js +15 -1
- package/dist/setup/verify-permissions.js.map +1 -1
- package/dist/skills/definitions.d.ts +2 -0
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +178 -12
- package/dist/skills/definitions.js.map +1 -1
- package/dist/skills/installer.d.ts +34 -0
- package/dist/skills/installer.d.ts.map +1 -1
- package/dist/skills/installer.js +119 -2
- package/dist/skills/installer.js.map +1 -1
- package/dist/types.d.ts +25 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/bot-routing.d.ts +50 -0
- package/dist/utils/bot-routing.d.ts.map +1 -1
- package/dist/utils/bot-routing.js +83 -0
- package/dist/utils/bot-routing.js.map +1 -1
- package/dist/utils/daemon-discovery.d.ts +11 -0
- package/dist/utils/daemon-discovery.d.ts.map +1 -0
- package/dist/utils/daemon-discovery.js +59 -0
- package/dist/utils/daemon-discovery.js.map +1 -0
- package/dist/utils/user-token.d.ts.map +1 -1
- package/dist/utils/user-token.js +0 -2
- package/dist/utils/user-token.js.map +1 -1
- package/dist/worker.js +198 -27
- package/dist/worker.js.map +1 -1
- package/dist/workflows/attempt-resume.d.ts.map +1 -1
- package/dist/workflows/attempt-resume.js +2 -2
- package/dist/workflows/attempt-resume.js.map +1 -1
- package/dist/workflows/definition.d.ts +412 -9
- package/dist/workflows/definition.d.ts.map +1 -1
- package/dist/workflows/definition.js +238 -3
- package/dist/workflows/definition.js.map +1 -1
- package/dist/workflows/events/payloads.d.ts +114 -11
- package/dist/workflows/events/payloads.d.ts.map +1 -1
- package/dist/workflows/events/payloads.js +46 -0
- package/dist/workflows/events/payloads.js.map +1 -1
- package/dist/workflows/events/replay.d.ts +21 -0
- package/dist/workflows/events/replay.d.ts.map +1 -1
- package/dist/workflows/events/replay.js +103 -0
- package/dist/workflows/events/replay.js.map +1 -1
- package/dist/workflows/events/schema.d.ts +1301 -606
- package/dist/workflows/events/schema.d.ts.map +1 -1
- package/dist/workflows/events/schema.js +37 -1
- package/dist/workflows/events/schema.js.map +1 -1
- package/dist/workflows/events/types.d.ts +5 -1
- package/dist/workflows/events/types.d.ts.map +1 -1
- package/dist/workflows/loader.d.ts +14 -0
- package/dist/workflows/loader.d.ts.map +1 -1
- package/dist/workflows/loader.js +27 -0
- package/dist/workflows/loader.js.map +1 -1
- package/dist/workflows/loop.js +58 -0
- package/dist/workflows/loop.js.map +1 -1
- package/dist/workflows/ops-projection.d.ts +58 -0
- package/dist/workflows/ops-projection.d.ts.map +1 -1
- package/dist/workflows/ops-projection.js +74 -0
- package/dist/workflows/ops-projection.js.map +1 -1
- package/dist/workflows/orchestrator.d.ts +65 -1
- package/dist/workflows/orchestrator.d.ts.map +1 -1
- package/dist/workflows/orchestrator.js +486 -74
- package/dist/workflows/orchestrator.js.map +1 -1
- package/dist/workflows/output-binding.d.ts +8 -1
- package/dist/workflows/output-binding.d.ts.map +1 -1
- package/dist/workflows/output-binding.js +75 -11
- package/dist/workflows/output-binding.js.map +1 -1
- package/dist/workflows/runtime.d.ts +1 -1
- package/dist/workflows/runtime.d.ts.map +1 -1
- package/dist/workflows/runtime.js +39 -4
- package/dist/workflows/runtime.js.map +1 -1
- package/dist/workflows/trigger-from-envelope.d.ts +13 -0
- package/dist/workflows/trigger-from-envelope.d.ts.map +1 -0
- package/dist/workflows/trigger-from-envelope.js +67 -0
- package/dist/workflows/trigger-from-envelope.js.map +1 -0
- package/dist/workflows/wait.d.ts +23 -2
- package/dist/workflows/wait.d.ts.map +1 -1
- package/dist/workflows/wait.js +39 -17
- package/dist/workflows/wait.js.map +1 -1
- package/package.json +1 -1
- package/dist/services/feishu-task-client.d.ts +0 -28
- package/dist/services/feishu-task-client.d.ts.map +0 -1
- package/dist/services/feishu-task-client.js +0 -123
- package/dist/services/feishu-task-client.js.map +0 -1
- package/dist/services/task-store.d.ts +0 -37
- package/dist/services/task-store.d.ts.map +0 -1
- package/dist/services/task-store.js +0 -115
- package/dist/services/task-store.js.map +0 -1
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Federation store (HUB side): which remote deployments have joined each team,
|
|
3
|
+
* and the bots they last advertised. The hub aggregates these with its own local
|
|
4
|
+
* roster so every member sees a shared cross-deployment roster.
|
|
5
|
+
*
|
|
6
|
+
* A deployment registers once via an invite (→ teamId) and is issued a long-lived
|
|
7
|
+
* `syncToken` (high-entropy, never logged) used for subsequent sync/roster pulls.
|
|
8
|
+
*
|
|
9
|
+
* Storage: `{dataDir}/federations.json`, atomic writes. Single dashboard writer
|
|
10
|
+
* (same assumption as invite-store): register/sync are read-modify-write.
|
|
11
|
+
*/
|
|
12
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, renameSync } from 'node:fs';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { randomBytes, randomUUID } from 'node:crypto';
|
|
15
|
+
function filePath(dataDir) {
|
|
16
|
+
return join(dataDir, 'federations.json');
|
|
17
|
+
}
|
|
18
|
+
function readFile(dataDir) {
|
|
19
|
+
const fp = filePath(dataDir);
|
|
20
|
+
if (!existsSync(fp))
|
|
21
|
+
return { version: 1, teams: {} };
|
|
22
|
+
try {
|
|
23
|
+
const parsed = JSON.parse(readFileSync(fp, 'utf-8'));
|
|
24
|
+
if (parsed && typeof parsed.teams === 'object' && parsed.teams)
|
|
25
|
+
return { version: 1, teams: parsed.teams };
|
|
26
|
+
}
|
|
27
|
+
catch { /* corrupt — fall through */ }
|
|
28
|
+
return { version: 1, teams: {} };
|
|
29
|
+
}
|
|
30
|
+
function writeFileAtomic(dataDir, data) {
|
|
31
|
+
if (!existsSync(dataDir))
|
|
32
|
+
mkdirSync(dataDir, { recursive: true });
|
|
33
|
+
const fp = filePath(dataDir);
|
|
34
|
+
const tmp = `${fp}.${process.pid}.${randomUUID()}.tmp`;
|
|
35
|
+
writeFileSync(tmp, JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
36
|
+
renameSync(tmp, fp);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Register a NEW remote deployment under a team and issue a fresh syncToken.
|
|
40
|
+
*
|
|
41
|
+
* NOT idempotent on purpose: `deploymentId` is public (it appears in the roster),
|
|
42
|
+
* so re-registering an existing id must NOT hand back its long-lived syncToken —
|
|
43
|
+
* otherwise anyone with an invite could claim another deployment's token by
|
|
44
|
+
* guessing its id. A duplicate returns `{ created: false }` with NO token; the
|
|
45
|
+
* caller surfaces `deployment_already_joined`. Ongoing bot refresh is via
|
|
46
|
+
* `syncDeployment` (syncToken), not this. Re-binding/rotation is a future
|
|
47
|
+
* explicit reset proving the old syncToken.
|
|
48
|
+
*/
|
|
49
|
+
export function registerDeployment(dataDir, teamId, input, now = Date.now()) {
|
|
50
|
+
const data = readFile(dataDir);
|
|
51
|
+
const list = data.teams[teamId] ?? (data.teams[teamId] = []);
|
|
52
|
+
if (list.some(d => d.deploymentId === input.deploymentId))
|
|
53
|
+
return { syncToken: '', created: false };
|
|
54
|
+
const syncToken = randomBytes(24).toString('base64url');
|
|
55
|
+
list.push({ deploymentId: input.deploymentId, name: input.name, syncToken, bots: input.bots, joinedAt: now, lastSeenAt: now, ownerUnionId: input.ownerUnionId, ownerName: input.ownerName, callbackUrl: input.callbackUrl, delegationToken: input.delegationToken });
|
|
56
|
+
writeFileAtomic(dataDir, data);
|
|
57
|
+
return { syncToken, created: true };
|
|
58
|
+
}
|
|
59
|
+
/** Resolve a syncToken to its {teamId, deployment}, or null. */
|
|
60
|
+
export function getDeploymentByToken(dataDir, syncToken) {
|
|
61
|
+
if (!syncToken)
|
|
62
|
+
return null;
|
|
63
|
+
const data = readFile(dataDir);
|
|
64
|
+
for (const [teamId, list] of Object.entries(data.teams)) {
|
|
65
|
+
const deployment = list.find(d => d.syncToken === syncToken);
|
|
66
|
+
if (deployment)
|
|
67
|
+
return { teamId, deployment };
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
/** Refresh a deployment's advertised bots + heartbeat, by syncToken. Returns true if found. */
|
|
72
|
+
export function syncDeployment(dataDir, syncToken, bots, owner, now = Date.now()) {
|
|
73
|
+
const data = readFile(dataDir);
|
|
74
|
+
for (const list of Object.values(data.teams)) {
|
|
75
|
+
const deployment = list.find(d => d.syncToken === syncToken);
|
|
76
|
+
if (deployment) {
|
|
77
|
+
deployment.bots = bots;
|
|
78
|
+
deployment.lastSeenAt = now;
|
|
79
|
+
// Owner + name can change after join (e.g. binding adopts the owner's
|
|
80
|
+
// Feishu name) — keep them fresh on sync, only overwriting when sent.
|
|
81
|
+
if (owner?.ownerUnionId !== undefined)
|
|
82
|
+
deployment.ownerUnionId = owner.ownerUnionId;
|
|
83
|
+
if (owner?.ownerName !== undefined)
|
|
84
|
+
deployment.ownerName = owner.ownerName;
|
|
85
|
+
if (owner?.name)
|
|
86
|
+
deployment.name = owner.name; // non-empty only → roster grouping follows the owner's Feishu name
|
|
87
|
+
writeFileAtomic(dataDir, data);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
/** Member deployments of a team (empty if none). */
|
|
94
|
+
export function listFederatedDeployments(dataDir, teamId) {
|
|
95
|
+
return readFile(dataDir).teams[teamId] ?? [];
|
|
96
|
+
}
|
|
97
|
+
/** Remove a deployment from a team (leave/kick). Returns true if removed. */
|
|
98
|
+
export function removeDeployment(dataDir, teamId, deploymentId) {
|
|
99
|
+
const data = readFile(dataDir);
|
|
100
|
+
const list = data.teams[teamId];
|
|
101
|
+
if (!list)
|
|
102
|
+
return false;
|
|
103
|
+
const before = list.length;
|
|
104
|
+
data.teams[teamId] = list.filter(d => d.deploymentId !== deploymentId);
|
|
105
|
+
if (data.teams[teamId].length === before)
|
|
106
|
+
return false;
|
|
107
|
+
writeFileAtomic(dataDir, data);
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
/** Remove the deployment owning a syncToken (spoke-initiated leave/revoke). Returns true if removed. */
|
|
111
|
+
export function removeDeploymentByToken(dataDir, syncToken) {
|
|
112
|
+
if (!syncToken)
|
|
113
|
+
return false;
|
|
114
|
+
const data = readFile(dataDir);
|
|
115
|
+
for (const list of Object.values(data.teams)) {
|
|
116
|
+
const idx = list.findIndex(d => d.syncToken === syncToken);
|
|
117
|
+
if (idx >= 0) {
|
|
118
|
+
list.splice(idx, 1);
|
|
119
|
+
writeFileAtomic(dataDir, data);
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
/** Drop all federation records for a team (e.g. when the team is deleted). */
|
|
126
|
+
export function removeTeamFederation(dataDir, teamId) {
|
|
127
|
+
const data = readFile(dataDir);
|
|
128
|
+
if (data.teams[teamId]) {
|
|
129
|
+
delete data.teams[teamId];
|
|
130
|
+
writeFileAtomic(dataDir, data);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=federation-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"federation-store.js","sourceRoot":"","sources":["../../src/services/federation-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA0CtD,SAAS,QAAQ,CAAC,OAAe;IAC/B,OAAO,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe;IAC/B,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC7B,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QACrD,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK;YAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IAC7G,CAAC;IAAC,MAAM,CAAC,CAAC,4BAA4B,CAAC,CAAC;IACxC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,IAAe;IACvD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,GAAG,EAAE,IAAI,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,MAAM,CAAC;IACvD,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAClE,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACtB,CAAC;AAYD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,MAAc,EAAE,KAAoB,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;IAChH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7D,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACpG,MAAM,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACxD,IAAI,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;IACrQ,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/B,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,oBAAoB,CAAC,OAAe,EAAE,SAAiB;IACrE,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QAC7D,IAAI,UAAU;YAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAChD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,SAAiB,EAAE,IAAoB,EAAE,KAAoE,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;IACrL,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QAC7D,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC;YACvB,UAAU,CAAC,UAAU,GAAG,GAAG,CAAC;YAC5B,sEAAsE;YACtE,sEAAsE;YACtE,IAAI,KAAK,EAAE,YAAY,KAAK,SAAS;gBAAE,UAAU,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;YACpF,IAAI,KAAK,EAAE,SAAS,KAAK,SAAS;gBAAE,UAAU,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;YAC3E,IAAI,KAAK,EAAE,IAAI;gBAAE,UAAU,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,mEAAmE;YAClH,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,wBAAwB,CAAC,OAAe,EAAE,MAAc;IACtE,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAC/C,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,MAAc,EAAE,YAAoB;IACpF,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,YAAY,CAAC,CAAC;IACvE,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACvD,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,SAAiB;IACxE,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QAC3D,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;IACrF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB,CAAC,OAAe,EAAE,MAAc;IAClE,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
|
|
@@ -6,6 +6,14 @@ export declare function addChatGrant(larkAppId: string, chatId: string, openId:
|
|
|
6
6
|
ok: true;
|
|
7
7
|
created: boolean;
|
|
8
8
|
} | Fail>;
|
|
9
|
+
/**
|
|
10
|
+
* 全局对话授权:把 open_id 加入 globalGrants(被授权在任意群与本 bot 对话的名单,人/bot 通用)。
|
|
11
|
+
* talk-only —— 只进 canTalk / bot 路由闸,绝不写 allowedUsers、不授 canOperate(与 addChatGrant 同源)。
|
|
12
|
+
*/
|
|
13
|
+
export declare function addGlobalGrant(larkAppId: string, openId: string): Promise<{
|
|
14
|
+
ok: true;
|
|
15
|
+
created: boolean;
|
|
16
|
+
} | Fail>;
|
|
9
17
|
/**
|
|
10
18
|
* 整群 talk 授权:把 chatId 加入 allowedChatGroups("talk-open 的 chat_id 列表")。
|
|
11
19
|
* 命中后该 chat 任何成员都过 canTalk(见 event-dispatcher.canTalk),不授 canOperate。
|
|
@@ -20,8 +28,9 @@ export declare function removeAllowedChatGroup(larkAppId: string, chatId: string
|
|
|
20
28
|
removed: boolean;
|
|
21
29
|
} | Fail>;
|
|
22
30
|
/**
|
|
23
|
-
* 原子彻底撤销:同一 RMW 内删 chatGrants[chatId]
|
|
24
|
-
*
|
|
31
|
+
* 原子彻底撤销:同一 RMW 内删 chatGrants[chatId]、全局 allowedUsers(email 反查)与
|
|
32
|
+
* globalGrants(全局对话授权)。三重防开放守卫只约束 allowedUsers 这一支(operate/owner 安全),
|
|
33
|
+
* chatGrants / globalGrants 是 talk-only,删空不会让 bot 对所有人开放 operate,无需守卫:
|
|
25
34
|
* #2 禁止撤销当前 owner 本人(否则 owner 身份会漂移到别人)。
|
|
26
35
|
* R2#3 移除后运行时 resolvedAllowedUsers 不能变空(catch 未解析 email 导致 resolved 空)。
|
|
27
36
|
* R3#3 在 RMW 锁内按最新磁盘 entry 再判一次(catch 并发写把 allowlist 删空)。
|
|
@@ -31,6 +40,7 @@ export declare function revokeGrant(larkAppId: string, chatId: string, openId: s
|
|
|
31
40
|
removed: {
|
|
32
41
|
chat: boolean;
|
|
33
42
|
global: boolean;
|
|
43
|
+
globalTalk: boolean;
|
|
34
44
|
};
|
|
35
45
|
} | Fail>;
|
|
36
46
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grant-store.d.ts","sourceRoot":"","sources":["../../src/services/grant-store.ts"],"names":[],"mappings":"AAQA,KAAK,IAAI,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAiB1C,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAChD,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CAkBhD;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAChC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CAehD;AAED,oDAAoD;AACpD,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAChC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CAkBhD;AAED
|
|
1
|
+
{"version":3,"file":"grant-store.d.ts","sourceRoot":"","sources":["../../src/services/grant-store.ts"],"names":[],"mappings":"AAQA,KAAK,IAAI,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAiB1C,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAChD,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CAkBhD;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAChC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CAehD;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAChC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CAehD;AAED,oDAAoD;AACpD,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAChC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CAkBhD;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAChD,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,GAAG,IAAI,CAAC,CA+DhG"}
|
|
@@ -46,6 +46,34 @@ export async function addChatGrant(larkAppId, chatId, openId) {
|
|
|
46
46
|
}
|
|
47
47
|
return { ok: true, created: r.result.created };
|
|
48
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* 全局对话授权:把 open_id 加入 globalGrants(被授权在任意群与本 bot 对话的名单,人/bot 通用)。
|
|
51
|
+
* talk-only —— 只进 canTalk / bot 路由闸,绝不写 allowedUsers、不授 canOperate(与 addChatGrant 同源)。
|
|
52
|
+
*/
|
|
53
|
+
export async function addGlobalGrant(larkAppId, openId) {
|
|
54
|
+
let bot;
|
|
55
|
+
try {
|
|
56
|
+
bot = getBot(larkAppId);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return { ok: false, reason: 'bot_not_registered' };
|
|
60
|
+
}
|
|
61
|
+
const r = await rmwBotEntry(larkAppId, (entry) => {
|
|
62
|
+
const cur = Array.isArray(entry.globalGrants) ? entry.globalGrants : [];
|
|
63
|
+
const created = !cur.includes(openId);
|
|
64
|
+
if (created)
|
|
65
|
+
cur.push(openId);
|
|
66
|
+
entry.globalGrants = cur;
|
|
67
|
+
return { write: created, result: { created } };
|
|
68
|
+
});
|
|
69
|
+
if (!r.ok)
|
|
70
|
+
return r;
|
|
71
|
+
if (r.result.created) {
|
|
72
|
+
bot.config.globalGrants = [...(bot.config.globalGrants ?? []), openId];
|
|
73
|
+
logger.info(`[grant:${larkAppId}] +global ${openId}`);
|
|
74
|
+
}
|
|
75
|
+
return { ok: true, created: r.result.created };
|
|
76
|
+
}
|
|
49
77
|
/**
|
|
50
78
|
* 整群 talk 授权:把 chatId 加入 allowedChatGroups("talk-open 的 chat_id 列表")。
|
|
51
79
|
* 命中后该 chat 任何成员都过 canTalk(见 event-dispatcher.canTalk),不授 canOperate。
|
|
@@ -106,8 +134,9 @@ export async function removeAllowedChatGroup(larkAppId, chatId) {
|
|
|
106
134
|
return { ok: true, removed: r.result.removed };
|
|
107
135
|
}
|
|
108
136
|
/**
|
|
109
|
-
* 原子彻底撤销:同一 RMW 内删 chatGrants[chatId]
|
|
110
|
-
*
|
|
137
|
+
* 原子彻底撤销:同一 RMW 内删 chatGrants[chatId]、全局 allowedUsers(email 反查)与
|
|
138
|
+
* globalGrants(全局对话授权)。三重防开放守卫只约束 allowedUsers 这一支(operate/owner 安全),
|
|
139
|
+
* chatGrants / globalGrants 是 talk-only,删空不会让 bot 对所有人开放 operate,无需守卫:
|
|
111
140
|
* #2 禁止撤销当前 owner 本人(否则 owner 身份会漂移到别人)。
|
|
112
141
|
* R2#3 移除后运行时 resolvedAllowedUsers 不能变空(catch 未解析 email 导致 resolved 空)。
|
|
113
142
|
* R3#3 在 RMW 锁内按最新磁盘 entry 再判一次(catch 并发写把 allowlist 删空)。
|
|
@@ -135,7 +164,7 @@ export async function revokeGrant(larkAppId, chatId, openId) {
|
|
|
135
164
|
if (willRemoveGlobal && rawList.filter(u => u !== rawEntry).length === 0) {
|
|
136
165
|
return { write: false, result: { guard: 'would_open_bot' } };
|
|
137
166
|
}
|
|
138
|
-
let chat = false, global = false;
|
|
167
|
+
let chat = false, global = false, globalTalk = false;
|
|
139
168
|
const map = (entry.chatGrants && typeof entry.chatGrants === 'object') ? entry.chatGrants : {};
|
|
140
169
|
if (Array.isArray(map[chatId]) && map[chatId].includes(openId)) {
|
|
141
170
|
map[chatId] = map[chatId].filter((u) => u !== openId);
|
|
@@ -148,7 +177,18 @@ export async function revokeGrant(larkAppId, chatId, openId) {
|
|
|
148
177
|
entry.allowedUsers = rawList.filter((u) => u !== rawEntry);
|
|
149
178
|
global = true;
|
|
150
179
|
}
|
|
151
|
-
|
|
180
|
+
// 全局对话授权(talk-only):从 globalGrants 移除 open_id。与 allowedUsers 无关,
|
|
181
|
+
// 因此不受 would_open_bot 守卫约束(清空它只是收回对话权,不会让 bot 对所有人开放 operate)。
|
|
182
|
+
const gg = Array.isArray(entry.globalGrants) ? entry.globalGrants : [];
|
|
183
|
+
if (gg.includes(openId)) {
|
|
184
|
+
const next = gg.filter((u) => u !== openId);
|
|
185
|
+
if (next.length > 0)
|
|
186
|
+
entry.globalGrants = next;
|
|
187
|
+
else
|
|
188
|
+
delete entry.globalGrants;
|
|
189
|
+
globalTalk = true;
|
|
190
|
+
}
|
|
191
|
+
return { write: chat || global || globalTalk, result: { chat, global, globalTalk } };
|
|
152
192
|
});
|
|
153
193
|
if (!r.ok)
|
|
154
194
|
return r;
|
|
@@ -167,6 +207,13 @@ export async function revokeGrant(larkAppId, chatId, openId) {
|
|
|
167
207
|
}
|
|
168
208
|
bot.resolvedAllowedUsers = bot.resolvedAllowedUsers.filter(u => u !== openId);
|
|
169
209
|
}
|
|
210
|
+
if (r.result.globalTalk) {
|
|
211
|
+
const next = (bot.config.globalGrants ?? []).filter(u => u !== openId);
|
|
212
|
+
if (next.length > 0)
|
|
213
|
+
bot.config.globalGrants = next;
|
|
214
|
+
else
|
|
215
|
+
delete bot.config.globalGrants;
|
|
216
|
+
}
|
|
170
217
|
logger.info(`[grant:${larkAppId}] revoke chat=${chatId} ${openId} removed=${JSON.stringify(r.result)}`);
|
|
171
218
|
return { ok: true, removed: r.result };
|
|
172
219
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grant-store.js","sourceRoot":"","sources":["../../src/services/grant-store.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"grant-store.js","sourceRoot":"","sources":["../../src/services/grant-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,10 @@ export interface CreateGroupOpts {
|
|
|
5
5
|
larkAppIds: string[];
|
|
6
6
|
name?: string;
|
|
7
7
|
userOpenIds?: string[];
|
|
8
|
+
/** Users to add by union_id (tenant-stable) — used to pull bot OWNERS into a
|
|
9
|
+
* federated group regardless of which bot they paired through (open_id is
|
|
10
|
+
* app-scoped, union_id is not). Added after the chat is created. */
|
|
11
|
+
ownerUnionIds?: string[];
|
|
8
12
|
transferOwnerTo?: string;
|
|
9
13
|
notifyOwnerOpenId?: string;
|
|
10
14
|
/** Optional working directory to bind the newly created chat to oncall for
|
|
@@ -18,10 +22,16 @@ export interface CreateGroupResult {
|
|
|
18
22
|
creator: string;
|
|
19
23
|
invalidBotIds: string[];
|
|
20
24
|
invalidUserIds: string[];
|
|
25
|
+
/** Owner union_ids Lark could not add to the chat (best-effort). */
|
|
26
|
+
invalidOwnerUnionIds: string[];
|
|
21
27
|
ownerTransferredTo: string | null;
|
|
22
28
|
transferError: string | null;
|
|
23
29
|
notifyMessageId: string | null;
|
|
24
30
|
notifyError: string | null;
|
|
31
|
+
/** Shareable join link (others can click to *join*). null when the Lark
|
|
32
|
+
* link API failed — caller falls back to the member-only applink URL. */
|
|
33
|
+
shareLink: string | null;
|
|
34
|
+
shareLinkError: string | null;
|
|
25
35
|
oncallBindings: {
|
|
26
36
|
larkAppId: string;
|
|
27
37
|
ok: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-creator.d.ts","sourceRoot":"","sources":["../../src/services/group-creator.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB;wEACoE;IACpE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;2DAEuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACzF;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"group-creator.d.ts","sourceRoot":"","sources":["../../src/services/group-creator.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB;wEACoE;IACpE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;yEAEqE;IACrE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;2DAEuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,oEAAoE;IACpE,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;8EAC0E;IAC1E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACzF;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoH3F"}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* `notifyOwnerOpenId` MUST be in `creatorLarkAppId`'s app scope. Enforcing
|
|
18
18
|
* this is the decision layer's job — the service trusts its inputs.
|
|
19
19
|
*/
|
|
20
|
-
import { createChat, transferChatOwner, getChatOwner } from './groups-store.js';
|
|
20
|
+
import { createChat, transferChatOwner, getChatOwner, getChatShareLink, addUsersToChatByUnionId } from './groups-store.js';
|
|
21
21
|
import { sendMessage } from '../im/lark/client.js';
|
|
22
22
|
import { bindOncall } from './oncall-store.js';
|
|
23
23
|
export async function createGroupWithBots(opts) {
|
|
@@ -30,6 +30,28 @@ export async function createGroupWithBots(opts) {
|
|
|
30
30
|
botIds: otherBots,
|
|
31
31
|
userIds: opts.userOpenIds ?? [],
|
|
32
32
|
});
|
|
33
|
+
// Fetch the shareable join link BEFORE transferring ownership: the creator bot
|
|
34
|
+
// is the chat owner right after createChat, so it can always read the link. If
|
|
35
|
+
// we did this after transfer and the tenant restricts "share group" to
|
|
36
|
+
// owner/admin, the (now demoted) bot would get a permission error. Best-effort:
|
|
37
|
+
// on failure the caller falls back to the member-only applink URL.
|
|
38
|
+
let shareLink = null;
|
|
39
|
+
let shareLinkError = null;
|
|
40
|
+
{
|
|
41
|
+
const sl = await getChatShareLink(opts.creatorLarkAppId, r.chatId);
|
|
42
|
+
if (sl.ok)
|
|
43
|
+
shareLink = sl.shareLink;
|
|
44
|
+
else
|
|
45
|
+
shareLinkError = sl.error;
|
|
46
|
+
}
|
|
47
|
+
// Pull bot owners into the chat by union_id (tenant-stable; the creator bot
|
|
48
|
+
// adds them). Best-effort — failures surface as invalidOwnerUnionIds, the chat
|
|
49
|
+
// still exists. The creator's own owner (if any) is harmless to re-add.
|
|
50
|
+
let invalidOwnerUnionIds = [];
|
|
51
|
+
if (opts.ownerUnionIds && opts.ownerUnionIds.length > 0) {
|
|
52
|
+
const ar = await addUsersToChatByUnionId(opts.creatorLarkAppId, r.chatId, opts.ownerUnionIds);
|
|
53
|
+
invalidOwnerUnionIds = ar.invalidUserIds;
|
|
54
|
+
}
|
|
33
55
|
let ownerTransferredTo = null;
|
|
34
56
|
let transferError = null;
|
|
35
57
|
if (opts.transferOwnerTo) {
|
|
@@ -103,10 +125,13 @@ export async function createGroupWithBots(opts) {
|
|
|
103
125
|
creator: opts.creatorLarkAppId,
|
|
104
126
|
invalidBotIds: r.invalidBotIds,
|
|
105
127
|
invalidUserIds: r.invalidUserIds,
|
|
128
|
+
invalidOwnerUnionIds,
|
|
106
129
|
ownerTransferredTo,
|
|
107
130
|
transferError,
|
|
108
131
|
notifyMessageId,
|
|
109
132
|
notifyError,
|
|
133
|
+
shareLink,
|
|
134
|
+
shareLinkError,
|
|
110
135
|
oncallBindings,
|
|
111
136
|
};
|
|
112
137
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-creator.js","sourceRoot":"","sources":["../../src/services/group-creator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"group-creator.js","sourceRoot":"","sources":["../../src/services/group-creator.ts"],"names":[],"mappings":"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"}
|
|
@@ -70,6 +70,25 @@ export declare function transferChatOwner(ownerLarkAppId: string, chatId: string
|
|
|
70
70
|
* callers treat undefined as "unknown" and keep the original error.
|
|
71
71
|
*/
|
|
72
72
|
export declare function getChatOwner(larkAppId: string, chatId: string): Promise<string | undefined>;
|
|
73
|
+
/**
|
|
74
|
+
* Get a shareable join link for a chat — the link others can click to *join*
|
|
75
|
+
* the group, unlike the applink:// "open chat" URL which only works for members
|
|
76
|
+
* who are already in the chat.
|
|
77
|
+
*
|
|
78
|
+
* Calls POST /open-apis/im/v1/chats/:chat_id/link. Accepted scope is any of
|
|
79
|
+
* im:chat / im:chat:read / im:chat:readonly (the bot already holds im:chat:read,
|
|
80
|
+
* verified at startup). `validity_period` is week | year | permanently.
|
|
81
|
+
*
|
|
82
|
+
* Not supported for p2p / secret / team chats — those return a non-zero code,
|
|
83
|
+
* which we surface as an error so the caller can fall back to the applink.
|
|
84
|
+
*/
|
|
85
|
+
export declare function getChatShareLink(larkAppId: string, chatId: string, validityPeriod?: 'week' | 'year' | 'permanently'): Promise<{
|
|
86
|
+
ok: true;
|
|
87
|
+
shareLink: string;
|
|
88
|
+
} | {
|
|
89
|
+
ok: false;
|
|
90
|
+
error: string;
|
|
91
|
+
}>;
|
|
73
92
|
/**
|
|
74
93
|
* Disband (delete) a chat. The Lark API only succeeds when the calling bot is
|
|
75
94
|
* the chat's current owner, OR is the creator AND the app holds
|
|
@@ -106,4 +125,15 @@ export declare function addBotToChat(proxyLarkAppId: string, chatId: string, tar
|
|
|
106
125
|
ok: boolean;
|
|
107
126
|
error?: string;
|
|
108
127
|
}[]>;
|
|
128
|
+
/**
|
|
129
|
+
* Add USERS to an existing chat by **union_id** (tenant-stable, NOT app-scoped
|
|
130
|
+
* like open_id). Used to pull bot owners into a federated group regardless of
|
|
131
|
+
* which bot they paired through. Returns the union_ids Lark could not add.
|
|
132
|
+
* Best-effort: total failure reports all ids invalid.
|
|
133
|
+
*
|
|
134
|
+
* Uses /open-apis/im/v1/chats/:chat_id/members with member_id_type=union_id.
|
|
135
|
+
*/
|
|
136
|
+
export declare function addUsersToChatByUnionId(proxyLarkAppId: string, chatId: string, unionIds: string[]): Promise<{
|
|
137
|
+
invalidUserIds: string[];
|
|
138
|
+
}>;
|
|
109
139
|
//# sourceMappingURL=groups-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"groups-store.d.ts","sourceRoot":"","sources":["../../src/services/groups-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"groups-store.d.ts","sourceRoot":"","sources":["../../src/services/groups-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
* proxy selection happens at the route layer.
|
|
11
11
|
*/
|
|
12
12
|
import { getBotClient } from '../bot-registry.js';
|
|
13
|
+
import { larkGet } from '../im/lark/client.js';
|
|
14
|
+
import { logger } from '../utils/logger.js';
|
|
13
15
|
/**
|
|
14
16
|
* List chats the given bot is a member of, draining pagination internally.
|
|
15
17
|
* Uses /open-apis/im/v1/chats.
|
|
@@ -19,12 +21,10 @@ export async function listChats(larkAppId) {
|
|
|
19
21
|
const out = [];
|
|
20
22
|
let pageToken;
|
|
21
23
|
do {
|
|
22
|
-
const res = await client
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
...(pageToken ? { page_token: pageToken } : {}),
|
|
27
|
-
},
|
|
24
|
+
const res = await larkGet(client, '/open-apis/im/v1/chats', {
|
|
25
|
+
page_size: 100,
|
|
26
|
+
user_id_type: 'open_id',
|
|
27
|
+
...(pageToken ? { page_token: pageToken } : {}),
|
|
28
28
|
});
|
|
29
29
|
if (res.code !== 0 && res.code !== undefined) {
|
|
30
30
|
throw new Error(`Failed to list chats: ${res.msg} (code: ${res.code})`);
|
|
@@ -53,9 +53,7 @@ export async function listChats(larkAppId) {
|
|
|
53
53
|
export async function isInChat(larkAppId, chatId) {
|
|
54
54
|
const client = getBotClient(larkAppId);
|
|
55
55
|
try {
|
|
56
|
-
const res = await client
|
|
57
|
-
path: { chat_id: chatId },
|
|
58
|
-
});
|
|
56
|
+
const res = await larkGet(client, `/open-apis/im/v1/chats/${encodeURIComponent(chatId)}/members/is_in_chat`);
|
|
59
57
|
if (res.code !== 0 && res.code !== undefined)
|
|
60
58
|
return false;
|
|
61
59
|
return !!res.data?.is_in_chat;
|
|
@@ -145,9 +143,8 @@ export async function transferChatOwner(ownerLarkAppId, chatId, newOwnerOpenId)
|
|
|
145
143
|
export async function getChatOwner(larkAppId, chatId) {
|
|
146
144
|
const client = getBotClient(larkAppId);
|
|
147
145
|
try {
|
|
148
|
-
const res = await client
|
|
149
|
-
|
|
150
|
-
params: { user_id_type: 'open_id' },
|
|
146
|
+
const res = await larkGet(client, `/open-apis/im/v1/chats/${encodeURIComponent(chatId)}`, {
|
|
147
|
+
user_id_type: 'open_id',
|
|
151
148
|
});
|
|
152
149
|
if (res.code !== 0 && res.code !== undefined)
|
|
153
150
|
return undefined;
|
|
@@ -158,6 +155,41 @@ export async function getChatOwner(larkAppId, chatId) {
|
|
|
158
155
|
return undefined;
|
|
159
156
|
}
|
|
160
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* Get a shareable join link for a chat — the link others can click to *join*
|
|
160
|
+
* the group, unlike the applink:// "open chat" URL which only works for members
|
|
161
|
+
* who are already in the chat.
|
|
162
|
+
*
|
|
163
|
+
* Calls POST /open-apis/im/v1/chats/:chat_id/link. Accepted scope is any of
|
|
164
|
+
* im:chat / im:chat:read / im:chat:readonly (the bot already holds im:chat:read,
|
|
165
|
+
* verified at startup). `validity_period` is week | year | permanently.
|
|
166
|
+
*
|
|
167
|
+
* Not supported for p2p / secret / team chats — those return a non-zero code,
|
|
168
|
+
* which we surface as an error so the caller can fall back to the applink.
|
|
169
|
+
*/
|
|
170
|
+
export async function getChatShareLink(larkAppId, chatId, validityPeriod = 'permanently') {
|
|
171
|
+
try {
|
|
172
|
+
// getBotClient stays inside the try: this fetch is best-effort and must
|
|
173
|
+
// never turn a successful group creation into a hard failure, so even a
|
|
174
|
+
// bad/unconfigured larkAppId resolves to {ok:false}, not a thrown error.
|
|
175
|
+
const client = getBotClient(larkAppId);
|
|
176
|
+
const res = await client.im.v1.chat.link({
|
|
177
|
+
path: { chat_id: chatId },
|
|
178
|
+
data: { validity_period: validityPeriod },
|
|
179
|
+
});
|
|
180
|
+
if (res.code !== 0 && res.code !== undefined) {
|
|
181
|
+
return { ok: false, error: `${res.msg ?? 'unknown'} (code: ${res.code})` };
|
|
182
|
+
}
|
|
183
|
+
const shareLink = res.data?.share_link;
|
|
184
|
+
if (typeof shareLink !== 'string' || shareLink.length === 0) {
|
|
185
|
+
return { ok: false, error: 'empty share_link in response' };
|
|
186
|
+
}
|
|
187
|
+
return { ok: true, shareLink };
|
|
188
|
+
}
|
|
189
|
+
catch (e) {
|
|
190
|
+
return { ok: false, error: e?.message ?? String(e) };
|
|
191
|
+
}
|
|
192
|
+
}
|
|
161
193
|
/**
|
|
162
194
|
* Disband (delete) a chat. The Lark API only succeeds when the calling bot is
|
|
163
195
|
* the chat's current owner, OR is the creator AND the app holds
|
|
@@ -236,4 +268,45 @@ export async function addBotToChat(proxyLarkAppId, chatId, targetLarkAppIds) {
|
|
|
236
268
|
}
|
|
237
269
|
return out;
|
|
238
270
|
}
|
|
271
|
+
/**
|
|
272
|
+
* Add USERS to an existing chat by **union_id** (tenant-stable, NOT app-scoped
|
|
273
|
+
* like open_id). Used to pull bot owners into a federated group regardless of
|
|
274
|
+
* which bot they paired through. Returns the union_ids Lark could not add.
|
|
275
|
+
* Best-effort: total failure reports all ids invalid.
|
|
276
|
+
*
|
|
277
|
+
* Uses /open-apis/im/v1/chats/:chat_id/members with member_id_type=union_id.
|
|
278
|
+
*/
|
|
279
|
+
export async function addUsersToChatByUnionId(proxyLarkAppId, chatId, unionIds) {
|
|
280
|
+
const ids = Array.from(new Set(unionIds.filter(Boolean)));
|
|
281
|
+
if (ids.length === 0)
|
|
282
|
+
return { invalidUserIds: [] };
|
|
283
|
+
const client = getBotClient(proxyLarkAppId);
|
|
284
|
+
// Add ONE id per call: Lark fails the WHOLE batch (HTTP 400, code 232024) if any
|
|
285
|
+
// single union_id is outside the bot's app visibility scope — that would drop
|
|
286
|
+
// valid owners too. Per-id calls isolate the out-of-scope ones so the rest land.
|
|
287
|
+
const invalidUserIds = [];
|
|
288
|
+
for (const id of ids) {
|
|
289
|
+
try {
|
|
290
|
+
const res = await client.im.v1.chatMembers.create({
|
|
291
|
+
path: { chat_id: chatId },
|
|
292
|
+
params: { member_id_type: 'union_id' },
|
|
293
|
+
data: { id_list: [id] },
|
|
294
|
+
});
|
|
295
|
+
if (res.code !== 0 && res.code !== undefined) {
|
|
296
|
+
logger.warn(`[groups] addUsersByUnionId rejected: code=${res.code} msg=${res.msg} (proxy=${proxyLarkAppId})`);
|
|
297
|
+
invalidUserIds.push(id);
|
|
298
|
+
}
|
|
299
|
+
else if ((res.data?.invalid_id_list ?? []).length) {
|
|
300
|
+
invalidUserIds.push(id);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
catch (e) {
|
|
304
|
+
// code 232024 = user not in app's visibility scope / no collaboration perm.
|
|
305
|
+
const code = e?.response?.data?.code ?? e?.code;
|
|
306
|
+
logger.warn(`[groups] addUsersByUnionId threw: code=${code} ${e?.message ?? e} (proxy=${proxyLarkAppId})`);
|
|
307
|
+
invalidUserIds.push(id);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return { invalidUserIds };
|
|
311
|
+
}
|
|
239
312
|
//# sourceMappingURL=groups-store.js.map
|