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,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers for the daemon's `POST /api/asks` IPC route.
|
|
3
|
+
*
|
|
4
|
+
* Kept separate from daemon.ts so the body-validator and the approver
|
|
5
|
+
* fallback chain (§6) are unit-testable without spinning up an HTTP server,
|
|
6
|
+
* registering bots, or mounting a full session map.
|
|
7
|
+
*/
|
|
8
|
+
import type { AskQuestion } from './ask-types.js';
|
|
9
|
+
export interface AskApiBody {
|
|
10
|
+
sessionId: string;
|
|
11
|
+
chatId: string;
|
|
12
|
+
larkAppId: string;
|
|
13
|
+
rootMessageId: string | null;
|
|
14
|
+
/** v0.1.8:替换旧的 options/prompt,支持多问多选。 */
|
|
15
|
+
questions: AskQuestion[];
|
|
16
|
+
/** Already in milliseconds. CLI side converts from `--timeout` seconds. */
|
|
17
|
+
timeoutMs: number;
|
|
18
|
+
/** Empty array → use the §6 fallback chain. */
|
|
19
|
+
approvers: string[];
|
|
20
|
+
}
|
|
21
|
+
export type AskApiBodyError = 'bad_body' | 'bad_sessionId' | 'bad_chatId' | 'bad_larkAppId' | 'bad_rootMessageId' | 'bad_prompt' | 'bad_timeoutMs' | 'bad_options' | 'bad_option_shape' | 'bad_option_key' | 'bad_option_label' | 'duplicate_option_key' | 'bad_questions' | 'bad_question_shape' | 'bad_multiSelect';
|
|
22
|
+
/** Validate the request body. Returns either the parsed body or an error code
|
|
23
|
+
* ready to be sent back as `{ ok: false, error }` with HTTP 400.
|
|
24
|
+
*
|
|
25
|
+
* v0.1.8:
|
|
26
|
+
* - 优先识别 `questions[]` 新格式(多问多选)。
|
|
27
|
+
* - 兼容旧的 `options[]` + `prompt` 格式,归一化为单问单选的 questions[]。
|
|
28
|
+
* - 两者都没有则返回 `bad_options`。 */
|
|
29
|
+
export declare function parseAskBody(raw: unknown): AskApiBody | {
|
|
30
|
+
error: AskApiBodyError;
|
|
31
|
+
};
|
|
32
|
+
/** Resolve the approver allowlist per §6 fallback chain:
|
|
33
|
+
* 1. explicit `--approver` list from CLI args (non-empty wins outright)
|
|
34
|
+
* 2. session.ownerOpenId ∩ bot.allowedUsers (single-owner topic chats)
|
|
35
|
+
* 3. bot.allowedUsers (shared chats / no owner / owner not in allow)
|
|
36
|
+
*
|
|
37
|
+
* Pure function: caller injects the lookups. The daemon wires
|
|
38
|
+
* `getBotAllowedUsers = (id) => getBot(id).resolvedAllowedUsers` and
|
|
39
|
+
* `getSessionOwner` = scan over activeSessions; tests pass stub funcs. */
|
|
40
|
+
export declare function resolveAskApprovers(args: {
|
|
41
|
+
larkAppId: string;
|
|
42
|
+
sessionId: string;
|
|
43
|
+
explicit: ReadonlyArray<string>;
|
|
44
|
+
getBotAllowedUsers: (larkAppId: string) => ReadonlyArray<string>;
|
|
45
|
+
getSessionOwner: (sessionId: string) => string | undefined;
|
|
46
|
+
}): Set<string>;
|
|
47
|
+
//# sourceMappingURL=ask-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-api.d.ts","sourceRoot":"","sources":["../../src/core/ask-api.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,yCAAyC;IACzC,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,eAAe,GACvB,UAAU,GACV,eAAe,GACf,YAAY,GACZ,eAAe,GACf,mBAAmB,GACnB,YAAY,GACZ,eAAe,GACf,aAAa,GACb,kBAAkB,GAClB,gBAAgB,GAChB,kBAAkB,GAClB,sBAAsB,GACtB,eAAe,GACf,oBAAoB,GACpB,iBAAiB,CAAC;AAkCtB;;;;;;gCAMgC;AAChC,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,GAAG;IAAE,KAAK,EAAE,eAAe,CAAA;CAAE,CA4DlF;AAED;;;;;;;2EAO2E;AAC3E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAChC,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,aAAa,CAAC,MAAM,CAAC,CAAC;IACjE,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAC5D,GAAG,GAAG,CAAC,MAAM,CAAC,CAQd"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers for the daemon's `POST /api/asks` IPC route.
|
|
3
|
+
*
|
|
4
|
+
* Kept separate from daemon.ts so the body-validator and the approver
|
|
5
|
+
* fallback chain (§6) are unit-testable without spinning up an HTTP server,
|
|
6
|
+
* registering bots, or mounting a full session map.
|
|
7
|
+
*/
|
|
8
|
+
/** 校验单个 option 对象,返回解析后的 AskOption 或错误码。 */
|
|
9
|
+
function parseOption(o) {
|
|
10
|
+
if (!o || typeof o !== 'object')
|
|
11
|
+
return 'bad_option_shape';
|
|
12
|
+
const oo = o;
|
|
13
|
+
if (typeof oo.key !== 'string' || !oo.key.trim())
|
|
14
|
+
return 'bad_option_key';
|
|
15
|
+
if (typeof oo.label !== 'string')
|
|
16
|
+
return 'bad_option_label';
|
|
17
|
+
return { key: oo.key, label: oo.label };
|
|
18
|
+
}
|
|
19
|
+
/** 校验 questions[] 数组,返回解析后的 AskQuestion[] 或错误码。 */
|
|
20
|
+
function parseQuestions(arr) {
|
|
21
|
+
const result = [];
|
|
22
|
+
for (const q of arr) {
|
|
23
|
+
if (!q || typeof q !== 'object' || Array.isArray(q))
|
|
24
|
+
return 'bad_question_shape';
|
|
25
|
+
const qq = q;
|
|
26
|
+
if (typeof qq.prompt !== 'string' || !qq.prompt.trim())
|
|
27
|
+
return 'bad_question_shape';
|
|
28
|
+
if (typeof qq.multiSelect !== 'boolean')
|
|
29
|
+
return 'bad_multiSelect';
|
|
30
|
+
if (!Array.isArray(qq.options) || qq.options.length < 2)
|
|
31
|
+
return 'bad_options';
|
|
32
|
+
const opts = [];
|
|
33
|
+
const seen = new Set();
|
|
34
|
+
for (const o of qq.options) {
|
|
35
|
+
const parsed = parseOption(o);
|
|
36
|
+
if (typeof parsed === 'string')
|
|
37
|
+
return parsed;
|
|
38
|
+
if (seen.has(parsed.key))
|
|
39
|
+
return 'duplicate_option_key';
|
|
40
|
+
seen.add(parsed.key);
|
|
41
|
+
opts.push(parsed);
|
|
42
|
+
}
|
|
43
|
+
result.push({ prompt: qq.prompt, multiSelect: qq.multiSelect, options: opts });
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
/** Validate the request body. Returns either the parsed body or an error code
|
|
48
|
+
* ready to be sent back as `{ ok: false, error }` with HTTP 400.
|
|
49
|
+
*
|
|
50
|
+
* v0.1.8:
|
|
51
|
+
* - 优先识别 `questions[]` 新格式(多问多选)。
|
|
52
|
+
* - 兼容旧的 `options[]` + `prompt` 格式,归一化为单问单选的 questions[]。
|
|
53
|
+
* - 两者都没有则返回 `bad_options`。 */
|
|
54
|
+
export function parseAskBody(raw) {
|
|
55
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
56
|
+
return { error: 'bad_body' };
|
|
57
|
+
const r = raw;
|
|
58
|
+
if (typeof r.sessionId !== 'string' || !r.sessionId.trim())
|
|
59
|
+
return { error: 'bad_sessionId' };
|
|
60
|
+
if (typeof r.chatId !== 'string' || !r.chatId.trim())
|
|
61
|
+
return { error: 'bad_chatId' };
|
|
62
|
+
if (typeof r.larkAppId !== 'string' || !r.larkAppId.trim())
|
|
63
|
+
return { error: 'bad_larkAppId' };
|
|
64
|
+
if (r.rootMessageId !== null && typeof r.rootMessageId !== 'string') {
|
|
65
|
+
return { error: 'bad_rootMessageId' };
|
|
66
|
+
}
|
|
67
|
+
if (typeof r.timeoutMs !== 'number' ||
|
|
68
|
+
!Number.isFinite(r.timeoutMs) ||
|
|
69
|
+
r.timeoutMs < 1000) {
|
|
70
|
+
return { error: 'bad_timeoutMs' };
|
|
71
|
+
}
|
|
72
|
+
const approvers = Array.isArray(r.approvers)
|
|
73
|
+
? r.approvers.filter((s) => typeof s === 'string' && s.trim().length > 0)
|
|
74
|
+
: [];
|
|
75
|
+
let questions;
|
|
76
|
+
if (Array.isArray(r.questions)) {
|
|
77
|
+
// 新格式:questions[] 多问多选
|
|
78
|
+
if (r.questions.length === 0)
|
|
79
|
+
return { error: 'bad_questions' };
|
|
80
|
+
const parsed = parseQuestions(r.questions);
|
|
81
|
+
if (typeof parsed === 'string')
|
|
82
|
+
return { error: parsed };
|
|
83
|
+
questions = parsed;
|
|
84
|
+
}
|
|
85
|
+
else if (Array.isArray(r.options) && typeof r.prompt === 'string' && r.prompt.trim()) {
|
|
86
|
+
// 旧格式兼容:options[] + prompt → 归一化为单问单选
|
|
87
|
+
if (r.options.length < 2)
|
|
88
|
+
return { error: 'bad_options' };
|
|
89
|
+
const opts = [];
|
|
90
|
+
const seen = new Set();
|
|
91
|
+
for (const o of r.options) {
|
|
92
|
+
const parsed = parseOption(o);
|
|
93
|
+
if (typeof parsed === 'string')
|
|
94
|
+
return { error: parsed };
|
|
95
|
+
if (seen.has(parsed.key))
|
|
96
|
+
return { error: 'duplicate_option_key' };
|
|
97
|
+
seen.add(parsed.key);
|
|
98
|
+
opts.push(parsed);
|
|
99
|
+
}
|
|
100
|
+
questions = [{ prompt: r.prompt, multiSelect: false, options: opts }];
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
// 旧格式:仅有 prompt 校验(无 options 或 options 不合法)
|
|
104
|
+
if (typeof r.prompt !== 'string' || !r.prompt.trim())
|
|
105
|
+
return { error: 'bad_prompt' };
|
|
106
|
+
if (!Array.isArray(r.options) || r.options.length < 2)
|
|
107
|
+
return { error: 'bad_options' };
|
|
108
|
+
// 走到这里说明 options 是数组但长度不足,上面已处理,此处不可达
|
|
109
|
+
return { error: 'bad_options' };
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
sessionId: r.sessionId,
|
|
113
|
+
chatId: r.chatId,
|
|
114
|
+
larkAppId: r.larkAppId,
|
|
115
|
+
rootMessageId: r.rootMessageId,
|
|
116
|
+
questions,
|
|
117
|
+
timeoutMs: r.timeoutMs,
|
|
118
|
+
approvers,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/** Resolve the approver allowlist per §6 fallback chain:
|
|
122
|
+
* 1. explicit `--approver` list from CLI args (non-empty wins outright)
|
|
123
|
+
* 2. session.ownerOpenId ∩ bot.allowedUsers (single-owner topic chats)
|
|
124
|
+
* 3. bot.allowedUsers (shared chats / no owner / owner not in allow)
|
|
125
|
+
*
|
|
126
|
+
* Pure function: caller injects the lookups. The daemon wires
|
|
127
|
+
* `getBotAllowedUsers = (id) => getBot(id).resolvedAllowedUsers` and
|
|
128
|
+
* `getSessionOwner` = scan over activeSessions; tests pass stub funcs. */
|
|
129
|
+
export function resolveAskApprovers(args) {
|
|
130
|
+
const explicit = args.explicit.filter((s) => s.trim().length > 0);
|
|
131
|
+
if (explicit.length > 0)
|
|
132
|
+
return new Set(explicit);
|
|
133
|
+
const allow = args.getBotAllowedUsers(args.larkAppId);
|
|
134
|
+
const owner = args.getSessionOwner(args.sessionId);
|
|
135
|
+
if (owner && allow.includes(owner))
|
|
136
|
+
return new Set([owner]);
|
|
137
|
+
return new Set(allow);
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=ask-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-api.js","sourceRoot":"","sources":["../../src/core/ask-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers for `botmux ask` argument parsing.
|
|
3
|
+
*
|
|
4
|
+
* Kept in its own file (no I/O, no env reads) so the CSV / timeout / approver
|
|
5
|
+
* parsing can be unit-tested without spinning up a daemon. The actual CLI
|
|
6
|
+
* dispatch (`cmdAsk`) lives in cli.ts and calls these helpers.
|
|
7
|
+
*/
|
|
8
|
+
import type { AskOption } from './ask-types.js';
|
|
9
|
+
export declare class AskArgsError extends Error {
|
|
10
|
+
readonly code: 'options_missing' | 'options_too_few' | 'options_empty_key' | 'options_duplicate_key' | 'timeout_out_of_range' | 'timeout_not_number';
|
|
11
|
+
constructor(code: 'options_missing' | 'options_too_few' | 'options_empty_key' | 'options_duplicate_key' | 'timeout_out_of_range' | 'timeout_not_number', message: string);
|
|
12
|
+
}
|
|
13
|
+
/** Parse `--options` CSV. Each item is either `key` (key==label) or `key=label`.
|
|
14
|
+
*
|
|
15
|
+
* Rules:
|
|
16
|
+
* - Trims whitespace around each item and around `key=label` halves.
|
|
17
|
+
* - Drops empty items (trailing commas / `"a,,b"`); does not count them.
|
|
18
|
+
* - Requires ≥ 2 distinct keys after parsing.
|
|
19
|
+
* - Empty `key` (e.g. `"=label"`) is rejected.
|
|
20
|
+
* - Duplicate keys are rejected — let the caller surface a clear error rather
|
|
21
|
+
* than silently de-duping (which would change observable button count).
|
|
22
|
+
* - The first `=` splits key/label; subsequent `=` are part of the label, so
|
|
23
|
+
* `"go=继续=右"` → key=`go`, label=`继续=右`. */
|
|
24
|
+
export declare function parseAskOptions(raw: string | undefined): AskOption[];
|
|
25
|
+
/** Parse `--timeout <seconds>` → milliseconds. Bounds match §7:
|
|
26
|
+
* - lower bound: 10s (sub-10s asks are almost always a bug)
|
|
27
|
+
* - upper bound: 3600s (1h — past that, recovery should kick in v0.1.8)
|
|
28
|
+
* - default: 300s (caller passes `undefined` to use it) */
|
|
29
|
+
export declare function parseAskTimeoutSeconds(raw: string | undefined, defaults?: {
|
|
30
|
+
default: number;
|
|
31
|
+
min: number;
|
|
32
|
+
max: number;
|
|
33
|
+
}): number;
|
|
34
|
+
/** Resolve the `(sub, rest)` pair for `botmux ask`'s top-level dispatch.
|
|
35
|
+
*
|
|
36
|
+
* Input: positional args *after* the `ask` token. So for the user typing
|
|
37
|
+
* `botmux ask buttons --options yes,no "prompt"` we get
|
|
38
|
+
* `['buttons', '--options', 'yes,no', 'prompt']`; for the bare alias
|
|
39
|
+
* `botmux ask --options yes,no "prompt"` we get
|
|
40
|
+
* `['--options', 'yes,no', 'prompt']`.
|
|
41
|
+
*
|
|
42
|
+
* The first positional starting with `--` means the user skipped the
|
|
43
|
+
* subcommand and went straight to flags — that's the bare-alias path; we
|
|
44
|
+
* return `sub=''` and let `cmdAsk` apply its v0.1.7 `buttons` default.
|
|
45
|
+
* Otherwise the first positional is the subcommand. */
|
|
46
|
+
export declare function normalizeAskDispatch(tail: ReadonlyArray<string>): {
|
|
47
|
+
sub: string;
|
|
48
|
+
rest: string[];
|
|
49
|
+
};
|
|
50
|
+
/** Required env vars on the CLI side (§5). Returns the first missing one so
|
|
51
|
+
* the caller can produce a single, specific error message. */
|
|
52
|
+
export declare function findMissingAskEnv(env: NodeJS.ProcessEnv): string | null;
|
|
53
|
+
//# sourceMappingURL=ask-args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-args.d.ts","sourceRoot":"","sources":["../../src/core/ask-args.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,qBAAa,YAAa,SAAQ,KAAK;aAEnB,IAAI,EAChB,iBAAiB,GACjB,iBAAiB,GACjB,mBAAmB,GACnB,uBAAuB,GACvB,sBAAsB,GACtB,oBAAoB;gBANR,IAAI,EAChB,iBAAiB,GACjB,iBAAiB,GACjB,mBAAmB,GACnB,uBAAuB,GACvB,sBAAsB,GACtB,oBAAoB,EACxB,OAAO,EAAE,MAAM;CAKlB;AAED;;;;;;;;;;+CAU+C;AAC/C,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,EAAE,CA8CpE;AAED;;;6DAG6D;AAC7D,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,QAAQ,GAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAIpD,GACA,MAAM,CAkBR;AAED;;;;;;;;;;;wDAWwD;AACxD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAC1B;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAMjC;AAED;+DAC+D;AAC/D,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB,MAAM,GAAG,IAAI,CAWf"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers for `botmux ask` argument parsing.
|
|
3
|
+
*
|
|
4
|
+
* Kept in its own file (no I/O, no env reads) so the CSV / timeout / approver
|
|
5
|
+
* parsing can be unit-tested without spinning up a daemon. The actual CLI
|
|
6
|
+
* dispatch (`cmdAsk`) lives in cli.ts and calls these helpers.
|
|
7
|
+
*/
|
|
8
|
+
export class AskArgsError extends Error {
|
|
9
|
+
code;
|
|
10
|
+
constructor(code, message) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.name = 'AskArgsError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/** Parse `--options` CSV. Each item is either `key` (key==label) or `key=label`.
|
|
17
|
+
*
|
|
18
|
+
* Rules:
|
|
19
|
+
* - Trims whitespace around each item and around `key=label` halves.
|
|
20
|
+
* - Drops empty items (trailing commas / `"a,,b"`); does not count them.
|
|
21
|
+
* - Requires ≥ 2 distinct keys after parsing.
|
|
22
|
+
* - Empty `key` (e.g. `"=label"`) is rejected.
|
|
23
|
+
* - Duplicate keys are rejected — let the caller surface a clear error rather
|
|
24
|
+
* than silently de-duping (which would change observable button count).
|
|
25
|
+
* - The first `=` splits key/label; subsequent `=` are part of the label, so
|
|
26
|
+
* `"go=继续=右"` → key=`go`, label=`继续=右`. */
|
|
27
|
+
export function parseAskOptions(raw) {
|
|
28
|
+
if (raw === undefined || raw.trim() === '') {
|
|
29
|
+
throw new AskArgsError('options_missing', '缺少 --options(需要 ≥ 2 项,例如 --options "yes,no" 或 --options "yes=继续,no=回滚")');
|
|
30
|
+
}
|
|
31
|
+
const items = raw
|
|
32
|
+
.split(',')
|
|
33
|
+
.map((s) => s.trim())
|
|
34
|
+
.filter((s) => s.length > 0);
|
|
35
|
+
const out = [];
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
for (const item of items) {
|
|
38
|
+
const eq = item.indexOf('=');
|
|
39
|
+
let key;
|
|
40
|
+
let label;
|
|
41
|
+
if (eq < 0) {
|
|
42
|
+
key = item;
|
|
43
|
+
label = item;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
key = item.slice(0, eq).trim();
|
|
47
|
+
label = item.slice(eq + 1).trim();
|
|
48
|
+
if (label === '')
|
|
49
|
+
label = key; // `"yes="` → label falls back to key
|
|
50
|
+
}
|
|
51
|
+
if (key === '') {
|
|
52
|
+
throw new AskArgsError('options_empty_key', `--options 项的 key 不能为空("${item}")`);
|
|
53
|
+
}
|
|
54
|
+
if (seen.has(key)) {
|
|
55
|
+
throw new AskArgsError('options_duplicate_key', `--options 出现重复 key: ${key}`);
|
|
56
|
+
}
|
|
57
|
+
seen.add(key);
|
|
58
|
+
out.push({ key, label });
|
|
59
|
+
}
|
|
60
|
+
if (out.length < 2) {
|
|
61
|
+
throw new AskArgsError('options_too_few', `--options 至少需要 2 项,收到 ${out.length}`);
|
|
62
|
+
}
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
/** Parse `--timeout <seconds>` → milliseconds. Bounds match §7:
|
|
66
|
+
* - lower bound: 10s (sub-10s asks are almost always a bug)
|
|
67
|
+
* - upper bound: 3600s (1h — past that, recovery should kick in v0.1.8)
|
|
68
|
+
* - default: 300s (caller passes `undefined` to use it) */
|
|
69
|
+
export function parseAskTimeoutSeconds(raw, defaults = {
|
|
70
|
+
default: 300,
|
|
71
|
+
min: 10,
|
|
72
|
+
max: 3600,
|
|
73
|
+
}) {
|
|
74
|
+
if (raw === undefined)
|
|
75
|
+
return defaults.default * 1000;
|
|
76
|
+
const trimmed = raw.trim();
|
|
77
|
+
if (trimmed === '')
|
|
78
|
+
return defaults.default * 1000;
|
|
79
|
+
const n = Number(trimmed);
|
|
80
|
+
if (!Number.isFinite(n) || !Number.isInteger(n)) {
|
|
81
|
+
throw new AskArgsError('timeout_not_number', `--timeout 必须是整数秒数,收到 "${raw}"`);
|
|
82
|
+
}
|
|
83
|
+
if (n < defaults.min || n > defaults.max) {
|
|
84
|
+
throw new AskArgsError('timeout_out_of_range', `--timeout 范围 [${defaults.min}, ${defaults.max}] 秒,收到 ${n}`);
|
|
85
|
+
}
|
|
86
|
+
return n * 1000;
|
|
87
|
+
}
|
|
88
|
+
/** Resolve the `(sub, rest)` pair for `botmux ask`'s top-level dispatch.
|
|
89
|
+
*
|
|
90
|
+
* Input: positional args *after* the `ask` token. So for the user typing
|
|
91
|
+
* `botmux ask buttons --options yes,no "prompt"` we get
|
|
92
|
+
* `['buttons', '--options', 'yes,no', 'prompt']`; for the bare alias
|
|
93
|
+
* `botmux ask --options yes,no "prompt"` we get
|
|
94
|
+
* `['--options', 'yes,no', 'prompt']`.
|
|
95
|
+
*
|
|
96
|
+
* The first positional starting with `--` means the user skipped the
|
|
97
|
+
* subcommand and went straight to flags — that's the bare-alias path; we
|
|
98
|
+
* return `sub=''` and let `cmdAsk` apply its v0.1.7 `buttons` default.
|
|
99
|
+
* Otherwise the first positional is the subcommand. */
|
|
100
|
+
export function normalizeAskDispatch(tail) {
|
|
101
|
+
const next = tail[0] ?? '';
|
|
102
|
+
if (next.startsWith('--')) {
|
|
103
|
+
return { sub: '', rest: tail.slice(0) };
|
|
104
|
+
}
|
|
105
|
+
return { sub: next, rest: tail.slice(1) };
|
|
106
|
+
}
|
|
107
|
+
/** Required env vars on the CLI side (§5). Returns the first missing one so
|
|
108
|
+
* the caller can produce a single, specific error message. */
|
|
109
|
+
export function findMissingAskEnv(env) {
|
|
110
|
+
const required = [
|
|
111
|
+
'BOTMUX_SESSION_ID',
|
|
112
|
+
'BOTMUX_CHAT_ID',
|
|
113
|
+
'BOTMUX_LARK_APP_ID',
|
|
114
|
+
'BOTMUX_ROOT_MESSAGE_ID',
|
|
115
|
+
];
|
|
116
|
+
for (const k of required) {
|
|
117
|
+
if (!env[k] || !env[k].trim())
|
|
118
|
+
return k;
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=ask-args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-args.js","sourceRoot":"","sources":["../../src/core/ask-args.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory broker for `botmux ask` (v0.1.8).
|
|
3
|
+
*
|
|
4
|
+
* Holds the pending-ask registry, runs the deadline timers, and arbitrates
|
|
5
|
+
* click resolution. IM-agnostic: the im/lark side wires a dispatcher via
|
|
6
|
+
* `setCardDispatcher` so the broker doesn't import Lark types.
|
|
7
|
+
*
|
|
8
|
+
* §3 / §6 / §7 / §8 of /tmp/botmux-ask.md.
|
|
9
|
+
*/
|
|
10
|
+
import type { AskCardDispatcher, AskClickOutcome, AskResult, CreateAskInput, PendingAsk } from './ask-types.js';
|
|
11
|
+
/** Wire the IM-side dispatcher. Called once during daemon bootstrap from
|
|
12
|
+
* daemon.ts after im/lark/ask-card.ts is constructed. */
|
|
13
|
+
export declare function setCardDispatcher(d: AskCardDispatcher): void;
|
|
14
|
+
/** Register a new pending ask. Returns a Promise that settles when:
|
|
15
|
+
* - a valid click arrives (`kind:'answered'`)
|
|
16
|
+
* - the deadline elapses (`kind:'timedOut'`)
|
|
17
|
+
* - the broker invalidates the ask (`kind:'invalidated'`)
|
|
18
|
+
*
|
|
19
|
+
* Side effects:
|
|
20
|
+
* - generates askId + nonce
|
|
21
|
+
* - starts the deadline timer
|
|
22
|
+
* - dispatches the card; if the card send fails, the ask is immediately
|
|
23
|
+
* invalidated and the Promise settles with `kind:'invalidated'`.
|
|
24
|
+
*
|
|
25
|
+
* Throws synchronously only if no dispatcher has been wired — that's a
|
|
26
|
+
* daemon-misconfiguration bug, not a runtime ask failure.
|
|
27
|
+
*/
|
|
28
|
+
export declare function registerAsk(input: CreateAskInput): Promise<AskResult>;
|
|
29
|
+
/**
|
|
30
|
+
* 勾选/取消勾选某问题的某个选项(累积模式,不 settle)。
|
|
31
|
+
*
|
|
32
|
+
* 校验同 `tryResolveAsk`:askId 存在 / nonce 匹配 / 未 settle / 已授权 /
|
|
33
|
+
* questionIndex 合法 / key 在该问题的 options 中。
|
|
34
|
+
*
|
|
35
|
+
* 对于单选问题(multiSelect:false),翻转时 Set 内只保留该 key(相当于"换选")。
|
|
36
|
+
* 对于多选问题(multiSelect:true),翻转规则:已在 Set 中则移除,否则添加。
|
|
37
|
+
*
|
|
38
|
+
* 成功返回 `'toggled'`;非法返回对应 AskClickOutcome。
|
|
39
|
+
*/
|
|
40
|
+
export declare function toggleAsk(args: {
|
|
41
|
+
askId: string;
|
|
42
|
+
nonce: string;
|
|
43
|
+
questionIndex: number;
|
|
44
|
+
key: string;
|
|
45
|
+
by: string;
|
|
46
|
+
}): AskClickOutcome;
|
|
47
|
+
/**
|
|
48
|
+
* 提交答案并 settle。
|
|
49
|
+
*
|
|
50
|
+
* `selections` 显式传入时直接使用(按钮单选 / 一次性表单提交场景);
|
|
51
|
+
* 否则使用 `toggleAsk` 累积的勾选状态。
|
|
52
|
+
*
|
|
53
|
+
* 对于 `multiSelect:false` 的问题,要求恰好 1 个选中,否则返回 `'stale'`。
|
|
54
|
+
* 校验通过则 settle 并返回 `'accepted'`;非法返回对应 AskClickOutcome。
|
|
55
|
+
*/
|
|
56
|
+
export declare function submitAsk(args: {
|
|
57
|
+
askId: string;
|
|
58
|
+
nonce: string;
|
|
59
|
+
by: string;
|
|
60
|
+
selections?: ReadonlyArray<ReadonlyArray<string>>;
|
|
61
|
+
}): AskClickOutcome;
|
|
62
|
+
/** Resolve attempt from a card-button click. Returns one of the §10 outcomes;
|
|
63
|
+
* caller (card click handler) maps to user-facing toast.
|
|
64
|
+
*
|
|
65
|
+
* v0.1.8 起退化为单问单选的便捷封装:等价于
|
|
66
|
+
* `submitAsk({..., selections:[[selected]]})`.
|
|
67
|
+
* 使 `botmux ask buttons` 与其已有测试零回归。
|
|
68
|
+
*
|
|
69
|
+
* All four "no-op" outcomes (`unauthorized`/`stale`/`already_settled`) leave
|
|
70
|
+
* the broker state unchanged so the original CLI Promise keeps waiting for
|
|
71
|
+
* the real winner or the deadline. */
|
|
72
|
+
export declare function tryResolveAsk(args: {
|
|
73
|
+
askId: string;
|
|
74
|
+
nonce: string;
|
|
75
|
+
selected: string;
|
|
76
|
+
by: string;
|
|
77
|
+
}): AskClickOutcome;
|
|
78
|
+
/** Invalidate every pending ask. Intended for daemon shutdown / restart paths
|
|
79
|
+
* so CLI subprocesses unblock with `kind:'invalidated'` instead of waiting
|
|
80
|
+
* forever on a dead daemon. Returns the number of asks actually settled
|
|
81
|
+
* (settled-but-retained entries from the race window are skipped). */
|
|
82
|
+
export declare function invalidateAll(reason: string): number;
|
|
83
|
+
/** Count of asks still awaiting a click / timeout — excludes settled entries
|
|
84
|
+
* retained within the race-loser feedback window. For tests and metrics only. */
|
|
85
|
+
export declare function _pendingCount(): number;
|
|
86
|
+
/** Read a pending ask by id. Returns a snapshot; mutating it has no effect on
|
|
87
|
+
* broker state. Used by the card handler to PATCH toggle state. */
|
|
88
|
+
export declare function getAskSnapshot(askId: string): PendingAsk | undefined;
|
|
89
|
+
/** Read a pending ask by id — for tests only. Returns a snapshot; mutating it
|
|
90
|
+
* has no effect on broker state. */
|
|
91
|
+
export declare function _getPending(askId: string): PendingAsk | undefined;
|
|
92
|
+
/** 返回当前 pending map 中所有 askId 列表(含 settled 但仍在 retention 内的条目)。
|
|
93
|
+
* 仅供测试使用。 */
|
|
94
|
+
export declare function _allAskIds(): string[];
|
|
95
|
+
/** Reset broker state — for tests only. Does NOT resolve outstanding promises,
|
|
96
|
+
* so tests must not call this while real CLI processes might be waiting. */
|
|
97
|
+
export declare function _resetForTest(): void;
|
|
98
|
+
//# sourceMappingURL=ask-broker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-broker.d.ts","sourceRoot":"","sources":["../../src/core/ask-broker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,cAAc,EACd,UAAU,EACX,MAAM,gBAAgB,CAAC;AAwBxB;0DAC0D;AAC1D,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAE5D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAmErE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,eAAe,CA4BlB;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;CACnD,GAAG,eAAe,CA2ClB;AAED;;;;;;;;;uCASuC;AACvC,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,eAAe,CAOlB;AAED;;;uEAGuE;AACvE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAkBpD;AA8DD;kFACkF;AAClF,wBAAgB,aAAa,IAAI,MAAM,CAItC;AAED;oEACoE;AACpE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAGpE;AAED;qCACqC;AACrC,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAEjE;AAED;cACc;AACd,wBAAgB,UAAU,IAAI,MAAM,EAAE,CAErC;AAED;6EAC6E;AAC7E,wBAAgB,aAAa,IAAI,IAAI,CAIpC"}
|