botmux 2.47.0 → 2.47.2
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 +34 -17
- 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 +29 -0
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +787 -312
- 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 +224 -60
- 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 +29 -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 +233 -51
- 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,55 @@
|
|
|
1
|
+
import type { AskCardDispatcher, AskResult, PendingAsk } from '../../core/ask-types.js';
|
|
2
|
+
import { replyMessage, sendMessage, updateMessage } from './client.js';
|
|
3
|
+
/** 旧单选即答动作(保留兼容旧卡片回调;Task 5 新增 ask_submit 路径)。 */
|
|
4
|
+
export declare const ASK_SELECT_ACTION = "ask_select";
|
|
5
|
+
/** 新多问 Submit 动作(form 内提交按钮携带此 action)。 */
|
|
6
|
+
export declare const ASK_SUBMIT_ACTION = "ask_submit";
|
|
7
|
+
/** 累积勾选动作。飞书会 silent-drop form + select_static,所以 v0.1.8 用按钮态。 */
|
|
8
|
+
export declare const ASK_TOGGLE_ACTION = "ask_toggle";
|
|
9
|
+
export interface AskCardActionData {
|
|
10
|
+
operator?: {
|
|
11
|
+
open_id?: string;
|
|
12
|
+
};
|
|
13
|
+
action?: {
|
|
14
|
+
value?: Record<string, unknown>;
|
|
15
|
+
form_value?: Record<string, unknown>;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export interface AskCardDispatcherDeps {
|
|
19
|
+
sendMessage?: typeof sendMessage;
|
|
20
|
+
replyMessage?: typeof replyMessage;
|
|
21
|
+
updateMessage?: typeof updateMessage;
|
|
22
|
+
}
|
|
23
|
+
export declare function createLarkAskCardDispatcher(deps?: AskCardDispatcherDeps): AskCardDispatcher;
|
|
24
|
+
export declare function isAskCardAction(action?: string): boolean;
|
|
25
|
+
export declare function handleAskCardAction(data: AskCardActionData): Promise<{
|
|
26
|
+
toast: {
|
|
27
|
+
type: string;
|
|
28
|
+
content: string;
|
|
29
|
+
};
|
|
30
|
+
} | Record<string, unknown> | undefined>;
|
|
31
|
+
/**
|
|
32
|
+
* 构建 ask 卡片 JSON 字符串。
|
|
33
|
+
*
|
|
34
|
+
* 未 settle 时:
|
|
35
|
+
* - 单问单选:每个选项一个按钮,点击即 settle(旧 ask_select 语义)
|
|
36
|
+
* - 多问或多选:每个选项一个按钮用于累积勾选,最后用 Submit settle
|
|
37
|
+
*
|
|
38
|
+
* 注意:飞书服务端会 silent-drop `form` 内的 select_static / multi_select_static,
|
|
39
|
+
* 所以这里只使用稳定的 `action` + `button` 结构。
|
|
40
|
+
*
|
|
41
|
+
* 已 settle 时:渲染状态摘要,展示每问的选中标签(answered),或超时/失效信息。
|
|
42
|
+
*/
|
|
43
|
+
export declare function buildAskCard(ask: PendingAsk, result?: AskResult): string;
|
|
44
|
+
/**
|
|
45
|
+
* 防御式解析 Lark form_value,将每个 q<i> 字段的编码选项解析为选中 key 数组。
|
|
46
|
+
*
|
|
47
|
+
* 字段值可能为:
|
|
48
|
+
* - string[](multi_select_static 多选)
|
|
49
|
+
* - string(select_static 单选,或 comma/semicolon 分隔的字符串)
|
|
50
|
+
*
|
|
51
|
+
* 每个编码值格式为 `<questionIndex>::<key>`,只收集 prefix 匹配的条目并剥去前缀。
|
|
52
|
+
* 导出供单元测试直接调用。
|
|
53
|
+
*/
|
|
54
|
+
export declare function parseFormSelections(formValue: Record<string, unknown>, questionCount: number): string[][];
|
|
55
|
+
//# sourceMappingURL=ask-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-card.d.ts","sourceRoot":"","sources":["../../../src/im/lark/ask-card.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EAEjB,SAAS,EACT,UAAU,EACX,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEvE,kDAAkD;AAClD,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAE9C,2CAA2C;AAC3C,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAE9C,kEAAkE;AAClE,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAI9C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACtC,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,OAAO,WAAW,CAAC;IACjC,YAAY,CAAC,EAAE,OAAO,YAAY,CAAC;IACnC,aAAa,CAAC,EAAE,OAAO,aAAa,CAAC;CACtC;AAED,wBAAgB,2BAA2B,CACzC,IAAI,GAAE,qBAA0B,GAC/B,iBAAiB,CAgCnB;AAED,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC;IAAE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CA2C7F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CA+FxE;AAiBD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,aAAa,EAAE,MAAM,GACpB,MAAM,EAAE,EAAE,CAsBZ"}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import { getAskSnapshot, submitAsk, toggleAsk, tryResolveAsk } from '../../core/ask-broker.js';
|
|
2
|
+
import { logger } from '../../utils/logger.js';
|
|
3
|
+
import { replyMessage, sendMessage, updateMessage } from './client.js';
|
|
4
|
+
/** 旧单选即答动作(保留兼容旧卡片回调;Task 5 新增 ask_submit 路径)。 */
|
|
5
|
+
export const ASK_SELECT_ACTION = 'ask_select';
|
|
6
|
+
/** 新多问 Submit 动作(form 内提交按钮携带此 action)。 */
|
|
7
|
+
export const ASK_SUBMIT_ACTION = 'ask_submit';
|
|
8
|
+
/** 累积勾选动作。飞书会 silent-drop form + select_static,所以 v0.1.8 用按钮态。 */
|
|
9
|
+
export const ASK_TOGGLE_ACTION = 'ask_toggle';
|
|
10
|
+
const MAX_BUTTONS_PER_ACTION_ROW = 4;
|
|
11
|
+
export function createLarkAskCardDispatcher(deps = {}) {
|
|
12
|
+
const send = deps.sendMessage ?? sendMessage;
|
|
13
|
+
const reply = deps.replyMessage ?? replyMessage;
|
|
14
|
+
const update = deps.updateMessage ?? updateMessage;
|
|
15
|
+
return {
|
|
16
|
+
async send(ask) {
|
|
17
|
+
const cardJson = buildAskCard(ask);
|
|
18
|
+
// botmux 把 chat-scope session 的 routing anchor 也叫 rootMessageId,
|
|
19
|
+
// 但在 chat-scope 下它实际是 chat_id (oc_...) 而非 message_id (om_...).
|
|
20
|
+
// 飞书 /messages/{id}/reply 只接受 om_ — 用 oc_ 会 400 invalid message_id.
|
|
21
|
+
// 所以这里要按前缀判断是否真的能 reply.
|
|
22
|
+
const canReplyToRoot = typeof ask.rootMessageId === 'string' && ask.rootMessageId.startsWith('om_');
|
|
23
|
+
const messageId = canReplyToRoot
|
|
24
|
+
? await reply(ask.larkAppId, ask.rootMessageId, cardJson, 'interactive', true)
|
|
25
|
+
: await send(ask.larkAppId, ask.chatId, cardJson, 'interactive');
|
|
26
|
+
return { messageId };
|
|
27
|
+
},
|
|
28
|
+
async onSettle(ask, result) {
|
|
29
|
+
if (!ask.cardMessageId)
|
|
30
|
+
return;
|
|
31
|
+
try {
|
|
32
|
+
await update(ask.larkAppId, ask.cardMessageId, buildAskCard(ask, result));
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
logger.warn(`[ask:${ask.askId}] failed to patch settled card: ${err instanceof Error ? err.message : String(err)}`);
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export function isAskCardAction(action) {
|
|
41
|
+
return action === ASK_SELECT_ACTION || action === ASK_SUBMIT_ACTION || action === ASK_TOGGLE_ACTION;
|
|
42
|
+
}
|
|
43
|
+
export async function handleAskCardAction(data) {
|
|
44
|
+
const value = data.action?.value;
|
|
45
|
+
const action = asString(value?.action);
|
|
46
|
+
if (!isAskCardAction(action))
|
|
47
|
+
return undefined;
|
|
48
|
+
const askId = asString(value?.ask_id);
|
|
49
|
+
const nonce = asString(value?.nonce);
|
|
50
|
+
const by = data.operator?.open_id;
|
|
51
|
+
if (!askId || !nonce || !by) {
|
|
52
|
+
return staleToast();
|
|
53
|
+
}
|
|
54
|
+
// 旧单选即答路径:按钮直接携带 key,调用 tryResolveAsk(单问单选便捷封装)
|
|
55
|
+
if (action === ASK_SELECT_ACTION) {
|
|
56
|
+
const selected = asString(value?.key);
|
|
57
|
+
if (!selected)
|
|
58
|
+
return staleToast();
|
|
59
|
+
return toastForOutcome(tryResolveAsk({ askId, nonce, selected, by }));
|
|
60
|
+
}
|
|
61
|
+
if (action === ASK_TOGGLE_ACTION) {
|
|
62
|
+
const questionIndex = asNumber(value?.question_index);
|
|
63
|
+
const key = asString(value?.key);
|
|
64
|
+
if (!Number.isInteger(questionIndex) || !key)
|
|
65
|
+
return staleToast();
|
|
66
|
+
const outcome = toggleAsk({ askId, nonce, questionIndex, key, by });
|
|
67
|
+
if (outcome !== 'toggled')
|
|
68
|
+
return toastForOutcome(outcome);
|
|
69
|
+
const updated = getAskSnapshot(askId);
|
|
70
|
+
if (!updated)
|
|
71
|
+
return staleToast();
|
|
72
|
+
return JSON.parse(buildAskCard(updated));
|
|
73
|
+
}
|
|
74
|
+
// 新 Submit 路径:优先从按钮累积态提交;兼容旧 form_value 回调。
|
|
75
|
+
if (action === ASK_SUBMIT_ACTION) {
|
|
76
|
+
const formValue = data.action?.form_value ?? {};
|
|
77
|
+
if (Object.keys(formValue).length > 0) {
|
|
78
|
+
// 推断问题数量:找最大 qN 的 N+1
|
|
79
|
+
const questionCount = guessQuestionCount(formValue);
|
|
80
|
+
const selections = parseFormSelections(formValue, questionCount);
|
|
81
|
+
return toastForOutcome(submitAsk({ askId, nonce, by, selections }));
|
|
82
|
+
}
|
|
83
|
+
return toastForOutcome(submitAsk({ askId, nonce, by }));
|
|
84
|
+
}
|
|
85
|
+
return staleToast();
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 构建 ask 卡片 JSON 字符串。
|
|
89
|
+
*
|
|
90
|
+
* 未 settle 时:
|
|
91
|
+
* - 单问单选:每个选项一个按钮,点击即 settle(旧 ask_select 语义)
|
|
92
|
+
* - 多问或多选:每个选项一个按钮用于累积勾选,最后用 Submit settle
|
|
93
|
+
*
|
|
94
|
+
* 注意:飞书服务端会 silent-drop `form` 内的 select_static / multi_select_static,
|
|
95
|
+
* 所以这里只使用稳定的 `action` + `button` 结构。
|
|
96
|
+
*
|
|
97
|
+
* 已 settle 时:渲染状态摘要,展示每问的选中标签(answered),或超时/失效信息。
|
|
98
|
+
*/
|
|
99
|
+
export function buildAskCard(ask, result) {
|
|
100
|
+
const deadline = new Date(ask.deadlineAt).toLocaleString('zh-CN');
|
|
101
|
+
const status = result ? settleStatus(result, ask) : undefined;
|
|
102
|
+
// 截止时间 + 可答复人 字段行(settled 与 unsettled 均展示)
|
|
103
|
+
const metaDiv = {
|
|
104
|
+
tag: 'div',
|
|
105
|
+
fields: [
|
|
106
|
+
{ is_short: true, text: { tag: 'lark_md', content: `**截止**\n${escapeMd(deadline)}` } },
|
|
107
|
+
{ is_short: true, text: { tag: 'lark_md', content: `**可答复**\n${escapeMd(approverSummary(ask))}` } },
|
|
108
|
+
],
|
|
109
|
+
};
|
|
110
|
+
const elements = [metaDiv];
|
|
111
|
+
if (status) {
|
|
112
|
+
// 已 settle:展示状态摘要,无可交互组件
|
|
113
|
+
elements.push({ tag: 'hr' });
|
|
114
|
+
elements.push({
|
|
115
|
+
tag: 'div',
|
|
116
|
+
text: { tag: 'lark_md', content: status },
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
// 未 settle:只用 action/buttons,避免 form+select 被飞书服务端静默丢弃。
|
|
121
|
+
elements.push({ tag: 'hr' });
|
|
122
|
+
const requiresSubmit = ask.questions.length > 1 || ask.questions.some((q) => q.multiSelect);
|
|
123
|
+
const selections = ask.selections ?? ask.questions.map(() => []);
|
|
124
|
+
for (let i = 0; i < ask.questions.length; i++) {
|
|
125
|
+
const q = ask.questions[i];
|
|
126
|
+
// 问题标题
|
|
127
|
+
elements.push({
|
|
128
|
+
tag: 'div',
|
|
129
|
+
text: {
|
|
130
|
+
tag: 'lark_md',
|
|
131
|
+
content: `**问题 ${i + 1}**\n${escapeMd(truncate(q.prompt, 512))}`,
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
const selected = new Set(selections[i] ?? []);
|
|
135
|
+
const optionButtons = q.options.map((opt) => ({
|
|
136
|
+
tag: 'button',
|
|
137
|
+
text: {
|
|
138
|
+
tag: 'plain_text',
|
|
139
|
+
content: requiresSubmit ? optionLabel(q.multiSelect, selected.has(opt.key), opt.label) : opt.label,
|
|
140
|
+
},
|
|
141
|
+
type: selected.has(opt.key) ? 'primary' : 'default',
|
|
142
|
+
value: requiresSubmit
|
|
143
|
+
? {
|
|
144
|
+
action: ASK_TOGGLE_ACTION,
|
|
145
|
+
ask_id: ask.askId,
|
|
146
|
+
nonce: ask.nonce,
|
|
147
|
+
question_index: String(i),
|
|
148
|
+
key: opt.key,
|
|
149
|
+
}
|
|
150
|
+
: {
|
|
151
|
+
action: ASK_SELECT_ACTION,
|
|
152
|
+
ask_id: ask.askId,
|
|
153
|
+
nonce: ask.nonce,
|
|
154
|
+
key: opt.key,
|
|
155
|
+
},
|
|
156
|
+
}));
|
|
157
|
+
appendActionRows(elements, optionButtons);
|
|
158
|
+
}
|
|
159
|
+
if (requiresSubmit) {
|
|
160
|
+
elements.push({ tag: 'hr' });
|
|
161
|
+
elements.push({
|
|
162
|
+
tag: 'action',
|
|
163
|
+
actions: [
|
|
164
|
+
{
|
|
165
|
+
tag: 'button',
|
|
166
|
+
text: { tag: 'plain_text', content: '提交' },
|
|
167
|
+
type: 'primary',
|
|
168
|
+
value: {
|
|
169
|
+
action: ASK_SUBMIT_ACTION,
|
|
170
|
+
ask_id: ask.askId,
|
|
171
|
+
nonce: ask.nonce,
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
],
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return JSON.stringify({
|
|
179
|
+
config: { wide_screen_mode: true },
|
|
180
|
+
header: {
|
|
181
|
+
template: result ? templateForResult(result) : 'blue',
|
|
182
|
+
title: { tag: 'plain_text', content: result ? 'botmux ask 已结束' : 'botmux ask' },
|
|
183
|
+
},
|
|
184
|
+
elements,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* 从 form_value 中推断问题数量(取最大 qN 索引 + 1,最少 1)。
|
|
189
|
+
*/
|
|
190
|
+
function guessQuestionCount(formValue) {
|
|
191
|
+
let max = -1;
|
|
192
|
+
for (const key of Object.keys(formValue)) {
|
|
193
|
+
const m = key.match(/^q(\d+)$/);
|
|
194
|
+
if (m) {
|
|
195
|
+
const idx = parseInt(m[1], 10);
|
|
196
|
+
if (idx > max)
|
|
197
|
+
max = idx;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return max >= 0 ? max + 1 : 1;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* 防御式解析 Lark form_value,将每个 q<i> 字段的编码选项解析为选中 key 数组。
|
|
204
|
+
*
|
|
205
|
+
* 字段值可能为:
|
|
206
|
+
* - string[](multi_select_static 多选)
|
|
207
|
+
* - string(select_static 单选,或 comma/semicolon 分隔的字符串)
|
|
208
|
+
*
|
|
209
|
+
* 每个编码值格式为 `<questionIndex>::<key>`,只收集 prefix 匹配的条目并剥去前缀。
|
|
210
|
+
* 导出供单元测试直接调用。
|
|
211
|
+
*/
|
|
212
|
+
export function parseFormSelections(formValue, questionCount) {
|
|
213
|
+
const result = [];
|
|
214
|
+
for (let i = 0; i < questionCount; i++) {
|
|
215
|
+
const raw = formValue[`q${i}`];
|
|
216
|
+
// 规范化为字符串数组
|
|
217
|
+
let tokens;
|
|
218
|
+
if (Array.isArray(raw)) {
|
|
219
|
+
tokens = raw.filter((v) => typeof v === 'string');
|
|
220
|
+
}
|
|
221
|
+
else if (typeof raw === 'string') {
|
|
222
|
+
// 逗号或分号分隔的备用格式
|
|
223
|
+
tokens = raw.split(/[,;]/).map((s) => s.trim()).filter(Boolean);
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
tokens = [];
|
|
227
|
+
}
|
|
228
|
+
// 筛选出 prefix 匹配 `i::` 的 token,剥去前缀取 key
|
|
229
|
+
const prefix = `${i}::`;
|
|
230
|
+
const keys = tokens
|
|
231
|
+
.filter((t) => t.startsWith(prefix))
|
|
232
|
+
.map((t) => t.slice(prefix.length));
|
|
233
|
+
result.push(keys);
|
|
234
|
+
}
|
|
235
|
+
return result;
|
|
236
|
+
}
|
|
237
|
+
function toastForOutcome(outcome) {
|
|
238
|
+
switch (outcome) {
|
|
239
|
+
case 'accepted':
|
|
240
|
+
return undefined;
|
|
241
|
+
case 'unauthorized':
|
|
242
|
+
return { toast: { type: 'warning', content: '你没有权限回答这个 ask' } };
|
|
243
|
+
case 'already_settled':
|
|
244
|
+
return { toast: { type: 'info', content: '这个 ask 已经被回答或结束' } };
|
|
245
|
+
case 'stale':
|
|
246
|
+
return staleToast();
|
|
247
|
+
case 'toggled':
|
|
248
|
+
// 累积勾选,不弹 toast
|
|
249
|
+
return undefined;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
function staleToast() {
|
|
253
|
+
return { toast: { type: 'warning', content: '⚠️ 此 ask 已失效' } };
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* 生成已结束状态的摘要文本。
|
|
257
|
+
*
|
|
258
|
+
* answered:遍历每个问题,把选中的 key 映射为 label 并渲染。
|
|
259
|
+
* timedOut / invalidated:展示对应说明。
|
|
260
|
+
*/
|
|
261
|
+
function settleStatus(result, ask) {
|
|
262
|
+
if (result.kind === 'answered') {
|
|
263
|
+
// 每问一行:问题N:<选中标签>
|
|
264
|
+
const lines = result.answers.map((keys, i) => {
|
|
265
|
+
const q = ask.questions[i];
|
|
266
|
+
if (!q)
|
|
267
|
+
return `问题${i + 1}:(无法解析)`;
|
|
268
|
+
const labels = keys.map((key) => q.options.find((o) => o.key === key)?.label ?? key);
|
|
269
|
+
return `问题${i + 1}:${labels.join(', ')}`;
|
|
270
|
+
});
|
|
271
|
+
const summary = lines.join('\n');
|
|
272
|
+
return `**已选择**\n${escapeMd(summary)}\n操作人:${escapeMd(short(result.by, 28))}`;
|
|
273
|
+
}
|
|
274
|
+
if (result.kind === 'timedOut') {
|
|
275
|
+
return '**超时未答**';
|
|
276
|
+
}
|
|
277
|
+
return `**已失效**\n${escapeMd(result.reason)}`;
|
|
278
|
+
}
|
|
279
|
+
function templateForResult(result) {
|
|
280
|
+
switch (result.kind) {
|
|
281
|
+
case 'answered': return 'green';
|
|
282
|
+
case 'timedOut': return 'orange';
|
|
283
|
+
case 'invalidated': return 'grey';
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
function approverSummary(ask) {
|
|
287
|
+
if (ask.approvers.size === 0)
|
|
288
|
+
return '无可用答复人';
|
|
289
|
+
const values = [...ask.approvers].map((id) => short(id, 18));
|
|
290
|
+
if (values.length <= 3)
|
|
291
|
+
return values.join(', ');
|
|
292
|
+
return `${values.slice(0, 3).join(', ')} +${values.length - 3}`;
|
|
293
|
+
}
|
|
294
|
+
function asString(value) {
|
|
295
|
+
return typeof value === 'string' ? value : undefined;
|
|
296
|
+
}
|
|
297
|
+
function asNumber(value) {
|
|
298
|
+
if (typeof value === 'number')
|
|
299
|
+
return value;
|
|
300
|
+
if (typeof value === 'string' && value.trim() !== '')
|
|
301
|
+
return Number(value);
|
|
302
|
+
return Number.NaN;
|
|
303
|
+
}
|
|
304
|
+
function optionLabel(multiSelect, selected, label) {
|
|
305
|
+
if (multiSelect)
|
|
306
|
+
return `${selected ? '☑' : '☐'} ${label}`;
|
|
307
|
+
return `${selected ? '◉' : '○'} ${label}`;
|
|
308
|
+
}
|
|
309
|
+
function appendActionRows(elements, actions) {
|
|
310
|
+
for (let i = 0; i < actions.length; i += MAX_BUTTONS_PER_ACTION_ROW) {
|
|
311
|
+
elements.push({
|
|
312
|
+
tag: 'action',
|
|
313
|
+
actions: actions.slice(i, i + MAX_BUTTONS_PER_ACTION_ROW),
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
function truncate(s, maxChars) {
|
|
318
|
+
if (s.length <= maxChars)
|
|
319
|
+
return s || '(空)';
|
|
320
|
+
return `${s.slice(0, maxChars)}\n\n…(已截断)`;
|
|
321
|
+
}
|
|
322
|
+
function escapeMd(s) {
|
|
323
|
+
return s.replace(/[*_~`\[\]\\]/g, (c) => `\\${c}`);
|
|
324
|
+
}
|
|
325
|
+
function short(s, n) {
|
|
326
|
+
return s.length > n ? `${s.slice(0, n)}…` : s;
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=ask-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-card.js","sourceRoot":"","sources":["../../../src/im/lark/ask-card.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,8 +27,39 @@ export declare function buildSessionCard(sessionId: string, rootId: string, term
|
|
|
27
27
|
* Lark bridge so future replies route back into this topic.
|
|
28
28
|
*/
|
|
29
29
|
export declare function buildSessionClosedCard(sessionId: string, rootId: string, title: string, cliId?: CliId, workingDir?: string, cliResumeCommand?: string | null, locale?: Locale): string;
|
|
30
|
-
/**
|
|
31
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Build a frozen-snapshot card to PATCH onto the source-chat streaming card
|
|
32
|
+
* after `/relay` moves the session elsewhere.
|
|
33
|
+
*
|
|
34
|
+
* Why this exists: a live streaming card carries action buttons (close /
|
|
35
|
+
* toggle display / get write link). Those buttons identify their session by
|
|
36
|
+
* `session_id` in the value payload, so clicking them after relay still
|
|
37
|
+
* reaches the now-relocated session — closing it, toggling its display
|
|
38
|
+
* mode, etc. — but the visible feedback all lands on the NEW card in the
|
|
39
|
+
* target chat, not this one. The source-chat card then looks like a "live
|
|
40
|
+
* console" while actually being a footgun. PATCH it to an inert snapshot
|
|
41
|
+
* so the user sees clearly it's historical.
|
|
42
|
+
*
|
|
43
|
+
* Last-frame rendering:
|
|
44
|
+
* - imageKey present (session was in 'screenshot' / expanded mode at
|
|
45
|
+
* relay time) → embed the same img element the live card had.
|
|
46
|
+
* img_key is a Lark server resource independent of the card it lived
|
|
47
|
+
* on, so the PATCHed card can still reference it.
|
|
48
|
+
* - imageKey absent (hidden / collapsed mode) → render nothing extra.
|
|
49
|
+
* The header + body notice already convey the state; raw tmux pane
|
|
50
|
+
* text as a code-block is too long and noisy (王皓 caught this in
|
|
51
|
+
* testing).
|
|
52
|
+
*
|
|
53
|
+
* No action buttons are rendered in either case.
|
|
54
|
+
*/
|
|
55
|
+
export declare function buildRelayedFrozenCard(title: string, cliId?: CliId, imageKey?: string, locale?: Locale): string;
|
|
56
|
+
/**
|
|
57
|
+
* Truncate content to fit within `maxBytes`, keeping the tail (most recent
|
|
58
|
+
* output). Defaults to {@link MAX_CONTENT_BYTES}; callers that wrap the content
|
|
59
|
+
* in additional card JSON (e.g. the private snapshot's code fence) pass a
|
|
60
|
+
* tighter budget so the whole card stays under Feishu's ~109 KB hard limit.
|
|
61
|
+
*/
|
|
62
|
+
export declare function truncateContent(content: string, locale?: Locale, maxBytes?: number): string;
|
|
32
63
|
/**
|
|
33
64
|
* Build a Feishu streaming card that shows live terminal output + controls.
|
|
34
65
|
* This card is PATCHed in-place as the CLI works.
|
|
@@ -40,7 +71,25 @@ export declare function truncateContent(content: string, locale?: Locale): strin
|
|
|
40
71
|
* Quick-action buttons (Esc, ^C, Tab, Space, Enter, ←↑↓→, ½屏 ↑/↓) appear
|
|
41
72
|
* whenever displayMode !== 'hidden'.
|
|
42
73
|
*/
|
|
43
|
-
export declare function buildStreamingCard(sessionId: string, rootId: string, terminalUrl: string, title: string, screenContent: string, status: StreamStatus, cliId?: CliId, displayMode?: DisplayMode, cardNonce?: string, imageKey?: string, adoptMode?: boolean, showTakeover?: boolean, locale?: Locale, usageLimit?: CliUsageLimitState): string;
|
|
74
|
+
export declare function buildStreamingCard(sessionId: string, rootId: string, terminalUrl: string, title: string, screenContent: string, status: StreamStatus, cliId?: CliId, displayMode?: DisplayMode, cardNonce?: string, imageKey?: string, adoptMode?: boolean, showTakeover?: boolean, locale?: Locale, usageLimit?: CliUsageLimitState, writableTerminalUrl?: string): string;
|
|
75
|
+
/**
|
|
76
|
+
* Build a static "private snapshot" card for `/card` in private mode — sent via
|
|
77
|
+
* the ephemeral API to one user at a time. Unlike {@link buildStreamingCard} it
|
|
78
|
+
* is **never PATCH-updated** (ephemeral cards can't be), so it carries only a
|
|
79
|
+
* one-shot snapshot of the terminal screenshot plus three buttons:
|
|
80
|
+
* • read-only "open terminal" link (a plain URL button — no callback);
|
|
81
|
+
* • "get write link", whose callback DMs the writable link to the clicker;
|
|
82
|
+
* • "close session", whose callback kills the session and (in private mode)
|
|
83
|
+
* sends the "closed" card ephemeral to the owner audience too — so the
|
|
84
|
+
* session title / CLI name / workingDir on it don't leak to the group.
|
|
85
|
+
* The last two have callbacks but neither patches THIS card (one DMs, the other
|
|
86
|
+
* sends a fresh card), so both work fine on an ephemeral card. Both are
|
|
87
|
+
* `canOperate`-gated in the handler — talk-only viewers who tap them are denied.
|
|
88
|
+
* The patch-driven controls (toggle/refresh/export/term keys) and the inline
|
|
89
|
+
* writable link are still omitted: those need to update this card, which
|
|
90
|
+
* ephemeral cards can't do.
|
|
91
|
+
*/
|
|
92
|
+
export declare function buildPrivateSnapshotCard(terminalUrl: string, title: string, status: StreamStatus, cliId: CliId | undefined, imageKey: string | undefined, screenContent: string, sessionId: string, rootId: string, locale?: Locale, usageLimit?: CliUsageLimitState): string;
|
|
44
93
|
/**
|
|
45
94
|
* Build a Feishu interactive card with a dropdown selector for projects.
|
|
46
95
|
* Returns a JSON string suitable for msg_type: 'interactive'.
|
|
@@ -80,5 +129,61 @@ export declare function buildTuiPromptProcessingCard(selectedText: string, local
|
|
|
80
129
|
* Build a resolved TUI prompt card — shows which option was selected.
|
|
81
130
|
*/
|
|
82
131
|
export declare function buildTuiPromptResolvedCard(selectedText: string, locale?: Locale): string;
|
|
132
|
+
export interface RelayPickerEntry {
|
|
133
|
+
sessionId: string;
|
|
134
|
+
/** Short human label for the source chat — chat name if resolvable, else chatId. */
|
|
135
|
+
chatLabel: string;
|
|
136
|
+
/** First-turn title or current-turn topic — already truncated by the caller. */
|
|
137
|
+
title: string;
|
|
138
|
+
/** Absolute working dir, displayed verbatim. */
|
|
139
|
+
workingDir?: string;
|
|
140
|
+
/** CLI identifier, used to render a friendly name. */
|
|
141
|
+
cliId?: CliId;
|
|
142
|
+
/** Last activity timestamp, used to render a relative duration. */
|
|
143
|
+
lastMessageAt?: number;
|
|
144
|
+
/** Source chat's conversational topology. Drives the type tag in the
|
|
145
|
+
* picker. Caller supplies based on getChatNameAndMode lookup + the
|
|
146
|
+
* session's own chatType for the p2p case. */
|
|
147
|
+
chatMode?: 'group' | 'topic' | 'p2p';
|
|
148
|
+
}
|
|
149
|
+
export interface RelayPickerState {
|
|
150
|
+
/** Currently selected sessionId, if any (drives the highlight + confirm button). */
|
|
151
|
+
selectedSessionId?: string;
|
|
152
|
+
/** Case-insensitive substring filter applied to title / chatLabel / workingDir. */
|
|
153
|
+
searchQuery?: string;
|
|
154
|
+
/** 0-indexed page within the filtered list. Clamped to valid range at render time. */
|
|
155
|
+
page?: number;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Card listing the operator's relayable sessions, paginated 5 per page with
|
|
159
|
+
* a search box at the top and a confirm button at the bottom. Layout:
|
|
160
|
+
*
|
|
161
|
+
* ┌──────────────────────────────────────┐
|
|
162
|
+
* │ 📋 选择要接力的会话 │ header
|
|
163
|
+
* ├──────────────────────────────────────┤
|
|
164
|
+
* │ 🔍 [______________] [搜索] │ form: input + submit button
|
|
165
|
+
* ├──────────────────────────────────────┤
|
|
166
|
+
* │ [interactive_container 1] │ current page (≤5 cards),
|
|
167
|
+
* │ [interactive_container 2] │ each clickable for selection
|
|
168
|
+
* │ ... │
|
|
169
|
+
* ├──────────────────────────────────────┤
|
|
170
|
+
* │ [← 上一页] 1 / 4 [下一页 →] │ paginator row
|
|
171
|
+
* ├──────────────────────────────────────┤
|
|
172
|
+
* │ [确认接力到本群] │ primary button (only when
|
|
173
|
+
* │ │ a selected session is on
|
|
174
|
+
* │ │ the current filtered set)
|
|
175
|
+
* └──────────────────────────────────────┘
|
|
176
|
+
*
|
|
177
|
+
* State (search / page / selected) is propagated entirely via the value
|
|
178
|
+
* objects on each button and container — Lark cards are stateless, so any
|
|
179
|
+
* server-side re-render must reconstruct from what the click sent us.
|
|
180
|
+
* That's why every interactive value here carries `search`, `page`,
|
|
181
|
+
* `target_chat_id`, `root_id`.
|
|
182
|
+
*
|
|
183
|
+
* Note: typing into the search box without clicking 搜索 does NOT update
|
|
184
|
+
* the in-callback state — container/paginator clicks use whatever search
|
|
185
|
+
* was applied at card-render time. To apply a new filter, click 搜索.
|
|
186
|
+
*/
|
|
187
|
+
export declare function buildRelayPickerCard(entries: RelayPickerEntry[], targetChatId: string, targetRootMessageId: string, invokerOpenId: string, locale?: Locale, state?: RelayPickerState): string;
|
|
83
188
|
export declare function buildAdoptSelectCard(sessions: AdoptableSession[], rootMessageId?: string, locale?: Locale): string;
|
|
84
189
|
//# sourceMappingURL=card-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-builder.d.ts","sourceRoot":"","sources":["../../../src/im/lark/card-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAK,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"card-builder.d.ts","sourceRoot":"","sources":["../../../src/im/lark/card-builder.ts"],"names":[],"mappings":"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"}
|