botmux 2.47.0 → 2.47.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +10 -5
- package/README.md +10 -5
- package/dist/adapters/adopt-route.d.ts +63 -0
- package/dist/adapters/adopt-route.d.ts.map +1 -0
- package/dist/adapters/adopt-route.js +195 -0
- package/dist/adapters/adopt-route.js.map +1 -0
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +11 -0
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.d.ts +11 -0
- package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js +17 -1
- package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +36 -9
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/coco.d.ts.map +1 -1
- package/dist/adapters/cli/coco.js +26 -1
- package/dist/adapters/cli/coco.js.map +1 -1
- package/dist/adapters/cli/codex-app.d.ts +4 -0
- package/dist/adapters/cli/codex-app.d.ts.map +1 -0
- package/dist/adapters/cli/codex-app.js +72 -0
- package/dist/adapters/cli/codex-app.js.map +1 -0
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +6 -1
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/cursor.d.ts.map +1 -1
- package/dist/adapters/cli/cursor.js +58 -12
- package/dist/adapters/cli/cursor.js.map +1 -1
- package/dist/adapters/cli/gemini.d.ts.map +1 -1
- package/dist/adapters/cli/gemini.js +5 -1
- package/dist/adapters/cli/gemini.js.map +1 -1
- package/dist/adapters/cli/hermes.d.ts +4 -0
- package/dist/adapters/cli/hermes.d.ts.map +1 -0
- package/dist/adapters/cli/hermes.js +40 -0
- package/dist/adapters/cli/hermes.js.map +1 -0
- package/dist/adapters/cli/mira.d.ts +4 -0
- package/dist/adapters/cli/mira.d.ts.map +1 -0
- package/dist/adapters/cli/mira.js +67 -0
- package/dist/adapters/cli/mira.js.map +1 -0
- package/dist/adapters/cli/mtr.d.ts +5 -0
- package/dist/adapters/cli/mtr.d.ts.map +1 -0
- package/dist/adapters/cli/mtr.js +62 -0
- package/dist/adapters/cli/mtr.js.map +1 -0
- package/dist/adapters/cli/opencode.d.ts.map +1 -1
- package/dist/adapters/cli/opencode.js +19 -1
- package/dist/adapters/cli/opencode.js.map +1 -1
- package/dist/adapters/cli/registry.d.ts +5 -1
- package/dist/adapters/cli/registry.d.ts.map +1 -1
- package/dist/adapters/cli/registry.js +22 -2
- package/dist/adapters/cli/registry.js.map +1 -1
- package/dist/adapters/cli/shared-hints.d.ts +1 -1
- package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
- package/dist/adapters/cli/shared-hints.js +2 -1
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +35 -2
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/adapters/hook-command.d.ts +18 -0
- package/dist/adapters/hook-command.d.ts.map +1 -0
- package/dist/adapters/hook-command.js +38 -0
- package/dist/adapters/hook-command.js.map +1 -0
- package/dist/adapters/hook-installer.d.ts +14 -0
- package/dist/adapters/hook-installer.d.ts.map +1 -0
- package/dist/adapters/hook-installer.js +192 -0
- package/dist/adapters/hook-installer.js.map +1 -0
- package/dist/bot-registry.d.ts +59 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +67 -0
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/bots-list-output.d.ts +8 -0
- package/dist/cli/bots-list-output.d.ts.map +1 -1
- package/dist/cli/bots-list-output.js +9 -0
- package/dist/cli/bots-list-output.js.map +1 -1
- package/dist/cli.d.ts +15 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +603 -106
- package/dist/cli.js.map +1 -1
- package/dist/codex-app-runner.d.ts +3 -0
- package/dist/codex-app-runner.d.ts.map +1 -0
- package/dist/codex-app-runner.js +512 -0
- package/dist/codex-app-runner.js.map +1 -0
- package/dist/config.d.ts +11 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +17 -4
- package/dist/config.js.map +1 -1
- package/dist/core/ask-api.d.ts +47 -0
- package/dist/core/ask-api.d.ts.map +1 -0
- package/dist/core/ask-api.js +139 -0
- package/dist/core/ask-api.js.map +1 -0
- package/dist/core/ask-args.d.ts +53 -0
- package/dist/core/ask-args.d.ts.map +1 -0
- package/dist/core/ask-args.js +122 -0
- package/dist/core/ask-args.js.map +1 -0
- package/dist/core/ask-broker.d.ts +98 -0
- package/dist/core/ask-broker.d.ts.map +1 -0
- package/dist/core/ask-broker.js +329 -0
- package/dist/core/ask-broker.js.map +1 -0
- package/dist/core/ask-hook/claude-code.d.ts +50 -0
- package/dist/core/ask-hook/claude-code.d.ts.map +1 -0
- package/dist/core/ask-hook/claude-code.js +145 -0
- package/dist/core/ask-hook/claude-code.js.map +1 -0
- package/dist/core/ask-hook/codex.d.ts +43 -0
- package/dist/core/ask-hook/codex.d.ts.map +1 -0
- package/dist/core/ask-hook/codex.js +69 -0
- package/dist/core/ask-hook/codex.js.map +1 -0
- package/dist/core/ask-hook/opencode.d.ts +41 -0
- package/dist/core/ask-hook/opencode.d.ts.map +1 -0
- package/dist/core/ask-hook/opencode.js +108 -0
- package/dist/core/ask-hook/opencode.js.map +1 -0
- package/dist/core/ask-hook/registry.d.ts +3 -0
- package/dist/core/ask-hook/registry.d.ts.map +1 -0
- package/dist/core/ask-hook/registry.js +12 -0
- package/dist/core/ask-hook/registry.js.map +1 -0
- package/dist/core/ask-hook/types.d.ts +26 -0
- package/dist/core/ask-hook/types.d.ts.map +1 -0
- package/dist/core/ask-hook/types.js +2 -0
- package/dist/core/ask-hook/types.js.map +1 -0
- package/dist/core/ask-types.d.ts +146 -0
- package/dist/core/ask-types.d.ts.map +1 -0
- package/dist/core/ask-types.js +18 -0
- package/dist/core/ask-types.js.map +1 -0
- package/dist/core/command-handler.d.ts +20 -0
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +774 -311
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts +2 -0
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +222 -2
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/role-resolver.d.ts +17 -1
- package/dist/core/role-resolver.d.ts.map +1 -1
- package/dist/core/role-resolver.js +64 -10
- package/dist/core/role-resolver.js.map +1 -1
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +19 -5
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +37 -20
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/trigger-session.d.ts +9 -0
- package/dist/core/trigger-session.d.ts.map +1 -0
- package/dist/core/trigger-session.js +158 -0
- package/dist/core/trigger-session.js.map +1 -0
- package/dist/core/types.d.ts +5 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +141 -0
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +543 -24
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +213 -58
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/auth.d.ts +6 -1
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +9 -1
- package/dist/dashboard/auth.js.map +1 -1
- package/dist/dashboard/connector-api.d.ts +3 -0
- package/dist/dashboard/connector-api.d.ts.map +1 -0
- package/dist/dashboard/connector-api.js +351 -0
- package/dist/dashboard/connector-api.js.map +1 -0
- package/dist/dashboard/federated-group-core.d.ts +54 -0
- package/dist/dashboard/federated-group-core.d.ts.map +1 -0
- package/dist/dashboard/federated-group-core.js +165 -0
- package/dist/dashboard/federated-group-core.js.map +1 -0
- package/dist/dashboard/federation-api.d.ts +42 -0
- package/dist/dashboard/federation-api.d.ts.map +1 -0
- package/dist/dashboard/federation-api.js +408 -0
- package/dist/dashboard/federation-api.js.map +1 -0
- package/dist/dashboard/federation-spoke-api.d.ts +76 -0
- package/dist/dashboard/federation-spoke-api.d.ts.map +1 -0
- package/dist/dashboard/federation-spoke-api.js +618 -0
- package/dist/dashboard/federation-spoke-api.js.map +1 -0
- package/dist/dashboard/team-group.d.ts +18 -0
- package/dist/dashboard/team-group.d.ts.map +1 -0
- package/dist/dashboard/team-group.js +7 -0
- package/dist/dashboard/team-group.js.map +1 -0
- package/dist/dashboard/trigger-api.d.ts +13 -0
- package/dist/dashboard/trigger-api.d.ts.map +1 -0
- package/dist/dashboard/trigger-api.js +77 -0
- package/dist/dashboard/trigger-api.js.map +1 -0
- package/dist/dashboard/web/app.js +8 -0
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js +205 -21
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/connectors.d.ts +2 -0
- package/dist/dashboard/web/connectors.d.ts.map +1 -0
- package/dist/dashboard/web/connectors.js +187 -0
- package/dist/dashboard/web/connectors.js.map +1 -0
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +43 -5
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +4 -0
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/team-federation.d.ts +3 -0
- package/dist/dashboard/web/team-federation.d.ts.map +1 -0
- package/dist/dashboard/web/team-federation.js +487 -0
- package/dist/dashboard/web/team-federation.js.map +1 -0
- package/dist/dashboard/web/workflows.js +3 -3
- package/dist/dashboard/web/workflows.js.map +1 -1
- package/dist/dashboard/webhook-routes.d.ts +19 -0
- package/dist/dashboard/webhook-routes.d.ts.map +1 -0
- package/dist/dashboard/webhook-routes.js +321 -0
- package/dist/dashboard/webhook-routes.js.map +1 -0
- package/dist/dashboard/workflow-api.d.ts +8 -1
- package/dist/dashboard/workflow-api.d.ts.map +1 -1
- package/dist/dashboard/workflow-api.js +19 -4
- package/dist/dashboard/workflow-api.js.map +1 -1
- package/dist/dashboard-web/app.js +539 -375
- package/dist/dashboard-web/index.html +3 -1
- package/dist/dashboard-web/style.css +22 -0
- package/dist/dashboard.js +199 -2
- package/dist/dashboard.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +104 -11
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +104 -11
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/ask-card.d.ts +55 -0
- package/dist/im/lark/ask-card.d.ts.map +1 -0
- package/dist/im/lark/ask-card.js +328 -0
- package/dist/im/lark/ask-card.js.map +1 -0
- package/dist/im/lark/card-builder.d.ts +108 -3
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +480 -50
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +241 -18
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +83 -0
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +286 -70
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +29 -4
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/grant-command.d.ts +2 -1
- package/dist/im/lark/grant-command.d.ts.map +1 -1
- package/dist/im/lark/grant-command.js +3 -2
- package/dist/im/lark/grant-command.js.map +1 -1
- package/dist/im/lark/identity-cache.d.ts.map +1 -1
- package/dist/im/lark/identity-cache.js +3 -3
- package/dist/im/lark/identity-cache.js.map +1 -1
- package/dist/im/lark/md-card.d.ts +20 -2
- package/dist/im/lark/md-card.d.ts.map +1 -1
- package/dist/im/lark/md-card.js +49 -17
- package/dist/im/lark/md-card.js.map +1 -1
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +87 -31
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/im/lark/workflow-card-handler.d.ts +2 -2
- package/dist/im/lark/workflow-card-handler.d.ts.map +1 -1
- package/dist/im/lark/workflow-card-handler.js +12 -1
- package/dist/im/lark/workflow-card-handler.js.map +1 -1
- package/dist/im/lark/workflow-progress-card.d.ts.map +1 -1
- package/dist/im/lark/workflow-progress-card.js +53 -0
- package/dist/im/lark/workflow-progress-card.js.map +1 -1
- package/dist/mira-output.d.ts +3 -0
- package/dist/mira-output.d.ts.map +1 -0
- package/dist/mira-output.js +136 -0
- package/dist/mira-output.js.map +1 -0
- package/dist/mira-runner.d.ts +3 -0
- package/dist/mira-runner.d.ts.map +1 -0
- package/dist/mira-runner.js +534 -0
- package/dist/mira-runner.js.map +1 -0
- package/dist/services/bot-owner-store.d.ts +28 -0
- package/dist/services/bot-owner-store.d.ts.map +1 -0
- package/dist/services/bot-owner-store.js +82 -0
- package/dist/services/bot-owner-store.js.map +1 -0
- package/dist/services/bot-profile-store.d.ts +16 -0
- package/dist/services/bot-profile-store.d.ts.map +1 -0
- package/dist/services/bot-profile-store.js +98 -0
- package/dist/services/bot-profile-store.js.map +1 -0
- package/dist/services/brand-store.d.ts +15 -0
- package/dist/services/brand-store.d.ts.map +1 -0
- package/dist/services/brand-store.js +47 -0
- package/dist/services/brand-store.js.map +1 -0
- package/dist/services/card-prefs-store.d.ts +20 -0
- package/dist/services/card-prefs-store.d.ts.map +1 -0
- package/dist/services/card-prefs-store.js +82 -0
- package/dist/services/card-prefs-store.js.map +1 -0
- package/dist/services/codex-bridge-queue.d.ts +1 -0
- package/dist/services/codex-bridge-queue.d.ts.map +1 -1
- package/dist/services/codex-bridge-queue.js +23 -0
- package/dist/services/codex-bridge-queue.js.map +1 -1
- package/dist/services/codex-transcript.d.ts +1 -0
- package/dist/services/codex-transcript.d.ts.map +1 -1
- package/dist/services/codex-transcript.js.map +1 -1
- package/dist/services/connector-store.d.ts +58 -0
- package/dist/services/connector-store.d.ts.map +1 -0
- package/dist/services/connector-store.js +79 -0
- package/dist/services/connector-store.js.map +1 -0
- package/dist/services/deployment-identity.d.ts +22 -0
- package/dist/services/deployment-identity.d.ts.map +1 -0
- package/dist/services/deployment-identity.js +67 -0
- package/dist/services/deployment-identity.js.map +1 -0
- package/dist/services/federation-membership-store.d.ts +23 -0
- package/dist/services/federation-membership-store.d.ts.map +1 -0
- package/dist/services/federation-membership-store.js +66 -0
- package/dist/services/federation-membership-store.js.map +1 -0
- package/dist/services/federation-roster.d.ts +54 -0
- package/dist/services/federation-roster.d.ts.map +1 -0
- package/dist/services/federation-roster.js +51 -0
- package/dist/services/federation-roster.js.map +1 -0
- package/dist/services/federation-store.d.ts +76 -0
- package/dist/services/federation-store.d.ts.map +1 -0
- package/dist/services/federation-store.js +133 -0
- package/dist/services/federation-store.js.map +1 -0
- package/dist/services/grant-store.d.ts +12 -2
- package/dist/services/grant-store.d.ts.map +1 -1
- package/dist/services/grant-store.js +51 -4
- package/dist/services/grant-store.js.map +1 -1
- package/dist/services/group-creator.d.ts +10 -0
- package/dist/services/group-creator.d.ts.map +1 -1
- package/dist/services/group-creator.js +26 -1
- package/dist/services/group-creator.js.map +1 -1
- package/dist/services/groups-store.d.ts +30 -0
- package/dist/services/groups-store.d.ts.map +1 -1
- package/dist/services/groups-store.js +85 -12
- package/dist/services/groups-store.js.map +1 -1
- package/dist/services/hermes-transcript.d.ts +7 -0
- package/dist/services/hermes-transcript.d.ts.map +1 -0
- package/dist/services/hermes-transcript.js +117 -0
- package/dist/services/hermes-transcript.js.map +1 -0
- package/dist/services/invite-store.d.ts +28 -0
- package/dist/services/invite-store.d.ts.map +1 -0
- package/dist/services/invite-store.js +85 -0
- package/dist/services/invite-store.js.map +1 -0
- package/dist/services/pairing-store.d.ts +47 -0
- package/dist/services/pairing-store.d.ts.map +1 -0
- package/dist/services/pairing-store.js +132 -0
- package/dist/services/pairing-store.js.map +1 -0
- package/dist/services/project-scanner.d.ts +10 -0
- package/dist/services/project-scanner.d.ts.map +1 -1
- package/dist/services/project-scanner.js +11 -0
- package/dist/services/project-scanner.js.map +1 -1
- package/dist/services/relay-picker.d.ts +22 -0
- package/dist/services/relay-picker.d.ts.map +1 -0
- package/dist/services/relay-picker.js +62 -0
- package/dist/services/relay-picker.js.map +1 -0
- package/dist/services/send-policy.d.ts +55 -0
- package/dist/services/send-policy.d.ts.map +1 -0
- package/dist/services/send-policy.js +47 -0
- package/dist/services/send-policy.js.map +1 -0
- package/dist/services/session-store.js +1 -1
- package/dist/services/session-store.js.map +1 -1
- package/dist/services/team-roster.d.ts +38 -0
- package/dist/services/team-roster.d.ts.map +1 -0
- package/dist/services/team-roster.js +82 -0
- package/dist/services/team-roster.js.map +1 -0
- package/dist/services/team-store.d.ts +54 -0
- package/dist/services/team-store.d.ts.map +1 -0
- package/dist/services/team-store.js +156 -0
- package/dist/services/team-store.js.map +1 -0
- package/dist/services/trigger-log-store.d.ts +46 -0
- package/dist/services/trigger-log-store.d.ts.map +1 -0
- package/dist/services/trigger-log-store.js +132 -0
- package/dist/services/trigger-log-store.js.map +1 -0
- package/dist/services/trigger-types.d.ts +57 -0
- package/dist/services/trigger-types.d.ts.map +1 -0
- package/dist/services/trigger-types.js +28 -0
- package/dist/services/trigger-types.js.map +1 -0
- package/dist/services/webhook-key.d.ts +16 -0
- package/dist/services/webhook-key.d.ts.map +1 -0
- package/dist/services/webhook-key.js +123 -0
- package/dist/services/webhook-key.js.map +1 -0
- package/dist/services/webhook-lifecycle-extractors.d.ts +15 -0
- package/dist/services/webhook-lifecycle-extractors.d.ts.map +1 -0
- package/dist/services/webhook-lifecycle-extractors.js +59 -0
- package/dist/services/webhook-lifecycle-extractors.js.map +1 -0
- package/dist/services/webhook-lifecycle-store.d.ts +45 -0
- package/dist/services/webhook-lifecycle-store.d.ts.map +1 -0
- package/dist/services/webhook-lifecycle-store.js +159 -0
- package/dist/services/webhook-lifecycle-store.js.map +1 -0
- package/dist/setup/bot-config-editor.d.ts +8 -1
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +20 -2
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/ensure-tmux.d.ts +0 -22
- package/dist/setup/ensure-tmux.d.ts.map +1 -1
- package/dist/setup/ensure-tmux.js +25 -1
- package/dist/setup/ensure-tmux.js.map +1 -1
- package/dist/setup/verify-permissions.d.ts.map +1 -1
- package/dist/setup/verify-permissions.js +15 -1
- package/dist/setup/verify-permissions.js.map +1 -1
- package/dist/skills/definitions.d.ts +2 -0
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +178 -12
- package/dist/skills/definitions.js.map +1 -1
- package/dist/skills/installer.d.ts +34 -0
- package/dist/skills/installer.d.ts.map +1 -1
- package/dist/skills/installer.js +119 -2
- package/dist/skills/installer.js.map +1 -1
- package/dist/types.d.ts +25 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/bot-routing.d.ts +50 -0
- package/dist/utils/bot-routing.d.ts.map +1 -1
- package/dist/utils/bot-routing.js +83 -0
- package/dist/utils/bot-routing.js.map +1 -1
- package/dist/utils/daemon-discovery.d.ts +11 -0
- package/dist/utils/daemon-discovery.d.ts.map +1 -0
- package/dist/utils/daemon-discovery.js +59 -0
- package/dist/utils/daemon-discovery.js.map +1 -0
- package/dist/utils/user-token.d.ts.map +1 -1
- package/dist/utils/user-token.js +0 -2
- package/dist/utils/user-token.js.map +1 -1
- package/dist/worker.js +198 -27
- package/dist/worker.js.map +1 -1
- package/dist/workflows/attempt-resume.d.ts.map +1 -1
- package/dist/workflows/attempt-resume.js +2 -2
- package/dist/workflows/attempt-resume.js.map +1 -1
- package/dist/workflows/definition.d.ts +412 -9
- package/dist/workflows/definition.d.ts.map +1 -1
- package/dist/workflows/definition.js +238 -3
- package/dist/workflows/definition.js.map +1 -1
- package/dist/workflows/events/payloads.d.ts +114 -11
- package/dist/workflows/events/payloads.d.ts.map +1 -1
- package/dist/workflows/events/payloads.js +46 -0
- package/dist/workflows/events/payloads.js.map +1 -1
- package/dist/workflows/events/replay.d.ts +21 -0
- package/dist/workflows/events/replay.d.ts.map +1 -1
- package/dist/workflows/events/replay.js +103 -0
- package/dist/workflows/events/replay.js.map +1 -1
- package/dist/workflows/events/schema.d.ts +1301 -606
- package/dist/workflows/events/schema.d.ts.map +1 -1
- package/dist/workflows/events/schema.js +37 -1
- package/dist/workflows/events/schema.js.map +1 -1
- package/dist/workflows/events/types.d.ts +5 -1
- package/dist/workflows/events/types.d.ts.map +1 -1
- package/dist/workflows/loader.d.ts +14 -0
- package/dist/workflows/loader.d.ts.map +1 -1
- package/dist/workflows/loader.js +27 -0
- package/dist/workflows/loader.js.map +1 -1
- package/dist/workflows/loop.js +58 -0
- package/dist/workflows/loop.js.map +1 -1
- package/dist/workflows/ops-projection.d.ts +58 -0
- package/dist/workflows/ops-projection.d.ts.map +1 -1
- package/dist/workflows/ops-projection.js +74 -0
- package/dist/workflows/ops-projection.js.map +1 -1
- package/dist/workflows/orchestrator.d.ts +65 -1
- package/dist/workflows/orchestrator.d.ts.map +1 -1
- package/dist/workflows/orchestrator.js +486 -74
- package/dist/workflows/orchestrator.js.map +1 -1
- package/dist/workflows/output-binding.d.ts +8 -1
- package/dist/workflows/output-binding.d.ts.map +1 -1
- package/dist/workflows/output-binding.js +75 -11
- package/dist/workflows/output-binding.js.map +1 -1
- package/dist/workflows/runtime.d.ts +1 -1
- package/dist/workflows/runtime.d.ts.map +1 -1
- package/dist/workflows/runtime.js +39 -4
- package/dist/workflows/runtime.js.map +1 -1
- package/dist/workflows/trigger-from-envelope.d.ts +13 -0
- package/dist/workflows/trigger-from-envelope.d.ts.map +1 -0
- package/dist/workflows/trigger-from-envelope.js +67 -0
- package/dist/workflows/trigger-from-envelope.js.map +1 -0
- package/dist/workflows/wait.d.ts +23 -2
- package/dist/workflows/wait.d.ts.map +1 -1
- package/dist/workflows/wait.js +39 -17
- package/dist/workflows/wait.js.map +1 -1
- package/package.json +1 -1
- package/dist/services/feishu-task-client.d.ts +0 -28
- package/dist/services/feishu-task-client.d.ts.map +0 -1
- package/dist/services/feishu-task-client.js +0 -123
- package/dist/services/feishu-task-client.js.map +0 -1
- package/dist/services/task-store.d.ts +0 -37
- package/dist/services/task-store.d.ts.map +0 -1
- package/dist/services/task-store.js +0 -115
- package/dist/services/task-store.js.map +0 -1
|
@@ -0,0 +1,329 @@
|
|
|
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 { randomUUID } from 'node:crypto';
|
|
11
|
+
import { logger } from '../utils/logger.js';
|
|
12
|
+
const pending = new Map();
|
|
13
|
+
let dispatcher = null;
|
|
14
|
+
/** Window during which a settled ask is still queryable so race-losers get a
|
|
15
|
+
* precise `already_settled` outcome (and the card click handler can show
|
|
16
|
+
* "已被 X 答了" instead of a generic "已失效"). After this window expires,
|
|
17
|
+
* late clicks fall through to `stale` like any forgotten id. */
|
|
18
|
+
const SETTLED_RETENTION_MS = 60_000;
|
|
19
|
+
/** Wire the IM-side dispatcher. Called once during daemon bootstrap from
|
|
20
|
+
* daemon.ts after im/lark/ask-card.ts is constructed. */
|
|
21
|
+
export function setCardDispatcher(d) {
|
|
22
|
+
dispatcher = d;
|
|
23
|
+
}
|
|
24
|
+
/** Register a new pending ask. Returns a Promise that settles when:
|
|
25
|
+
* - a valid click arrives (`kind:'answered'`)
|
|
26
|
+
* - the deadline elapses (`kind:'timedOut'`)
|
|
27
|
+
* - the broker invalidates the ask (`kind:'invalidated'`)
|
|
28
|
+
*
|
|
29
|
+
* Side effects:
|
|
30
|
+
* - generates askId + nonce
|
|
31
|
+
* - starts the deadline timer
|
|
32
|
+
* - dispatches the card; if the card send fails, the ask is immediately
|
|
33
|
+
* invalidated and the Promise settles with `kind:'invalidated'`.
|
|
34
|
+
*
|
|
35
|
+
* Throws synchronously only if no dispatcher has been wired — that's a
|
|
36
|
+
* daemon-misconfiguration bug, not a runtime ask failure.
|
|
37
|
+
*/
|
|
38
|
+
export function registerAsk(input) {
|
|
39
|
+
if (!dispatcher) {
|
|
40
|
+
throw new Error('ask-broker: cardDispatcher not wired — daemon bootstrap bug');
|
|
41
|
+
}
|
|
42
|
+
const askId = randomUUID();
|
|
43
|
+
const nonce = randomUUID().slice(0, 8);
|
|
44
|
+
const createdAt = Date.now();
|
|
45
|
+
const deadlineAt = createdAt + input.timeoutMs;
|
|
46
|
+
return new Promise((resolve) => {
|
|
47
|
+
const timeoutHandle = setTimeout(() => {
|
|
48
|
+
settle(askId, {
|
|
49
|
+
kind: 'timedOut',
|
|
50
|
+
selected: null,
|
|
51
|
+
by: null,
|
|
52
|
+
comment: null,
|
|
53
|
+
timedOut: true,
|
|
54
|
+
});
|
|
55
|
+
}, input.timeoutMs);
|
|
56
|
+
// Don't keep the event loop alive just because an ask is pending.
|
|
57
|
+
timeoutHandle.unref?.();
|
|
58
|
+
// 为每个问题初始化空的勾选集合
|
|
59
|
+
const selections = new Map();
|
|
60
|
+
for (let i = 0; i < input.questions.length; i++) {
|
|
61
|
+
selections.set(i, new Set());
|
|
62
|
+
}
|
|
63
|
+
const ask = {
|
|
64
|
+
askId,
|
|
65
|
+
nonce,
|
|
66
|
+
larkAppId: input.larkAppId,
|
|
67
|
+
chatId: input.chatId,
|
|
68
|
+
rootMessageId: input.rootMessageId,
|
|
69
|
+
sessionId: input.sessionId,
|
|
70
|
+
approvers: input.approvers,
|
|
71
|
+
questions: input.questions,
|
|
72
|
+
createdAt,
|
|
73
|
+
deadlineAt,
|
|
74
|
+
settled: false,
|
|
75
|
+
resolve,
|
|
76
|
+
timeoutHandle,
|
|
77
|
+
selections,
|
|
78
|
+
};
|
|
79
|
+
pending.set(askId, ask);
|
|
80
|
+
// Card dispatch is async — store the messageId once it lands.
|
|
81
|
+
void dispatcher
|
|
82
|
+
.send(snapshot(ask))
|
|
83
|
+
.then(({ messageId }) => {
|
|
84
|
+
const cur = pending.get(askId);
|
|
85
|
+
if (cur && !cur.settled)
|
|
86
|
+
cur.cardMessageId = messageId;
|
|
87
|
+
})
|
|
88
|
+
.catch((err) => {
|
|
89
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
90
|
+
logger.warn?.(`ask-broker: ${askId} card dispatch failed: ${msg}`);
|
|
91
|
+
settle(askId, {
|
|
92
|
+
kind: 'invalidated',
|
|
93
|
+
reason: `card dispatch failed: ${msg}`,
|
|
94
|
+
selected: null,
|
|
95
|
+
by: null,
|
|
96
|
+
comment: null,
|
|
97
|
+
timedOut: false,
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 勾选/取消勾选某问题的某个选项(累积模式,不 settle)。
|
|
104
|
+
*
|
|
105
|
+
* 校验同 `tryResolveAsk`:askId 存在 / nonce 匹配 / 未 settle / 已授权 /
|
|
106
|
+
* questionIndex 合法 / key 在该问题的 options 中。
|
|
107
|
+
*
|
|
108
|
+
* 对于单选问题(multiSelect:false),翻转时 Set 内只保留该 key(相当于"换选")。
|
|
109
|
+
* 对于多选问题(multiSelect:true),翻转规则:已在 Set 中则移除,否则添加。
|
|
110
|
+
*
|
|
111
|
+
* 成功返回 `'toggled'`;非法返回对应 AskClickOutcome。
|
|
112
|
+
*/
|
|
113
|
+
export function toggleAsk(args) {
|
|
114
|
+
gcSettled();
|
|
115
|
+
const ask = pending.get(args.askId);
|
|
116
|
+
if (!ask)
|
|
117
|
+
return 'stale';
|
|
118
|
+
if (ask.nonce !== args.nonce)
|
|
119
|
+
return 'stale';
|
|
120
|
+
if (ask.settled)
|
|
121
|
+
return 'already_settled';
|
|
122
|
+
if (!ask.approvers.has(args.by))
|
|
123
|
+
return 'unauthorized';
|
|
124
|
+
const question = ask.questions[args.questionIndex];
|
|
125
|
+
if (!question)
|
|
126
|
+
return 'stale';
|
|
127
|
+
if (!question.options.some((o) => o.key === args.key))
|
|
128
|
+
return 'stale';
|
|
129
|
+
const sel = ask.selections.get(args.questionIndex);
|
|
130
|
+
if (question.multiSelect) {
|
|
131
|
+
// 多选:有则删、无则加
|
|
132
|
+
if (sel.has(args.key)) {
|
|
133
|
+
sel.delete(args.key);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
sel.add(args.key);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
// 单选:清空后只保留该 key(等价于"换选",再次 toggle 同一 key 也保留)
|
|
141
|
+
sel.clear();
|
|
142
|
+
sel.add(args.key);
|
|
143
|
+
}
|
|
144
|
+
return 'toggled';
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* 提交答案并 settle。
|
|
148
|
+
*
|
|
149
|
+
* `selections` 显式传入时直接使用(按钮单选 / 一次性表单提交场景);
|
|
150
|
+
* 否则使用 `toggleAsk` 累积的勾选状态。
|
|
151
|
+
*
|
|
152
|
+
* 对于 `multiSelect:false` 的问题,要求恰好 1 个选中,否则返回 `'stale'`。
|
|
153
|
+
* 校验通过则 settle 并返回 `'accepted'`;非法返回对应 AskClickOutcome。
|
|
154
|
+
*/
|
|
155
|
+
export function submitAsk(args) {
|
|
156
|
+
gcSettled();
|
|
157
|
+
const ask = pending.get(args.askId);
|
|
158
|
+
if (!ask)
|
|
159
|
+
return 'stale';
|
|
160
|
+
if (ask.nonce !== args.nonce)
|
|
161
|
+
return 'stale';
|
|
162
|
+
if (ask.settled)
|
|
163
|
+
return 'already_settled';
|
|
164
|
+
if (!ask.approvers.has(args.by))
|
|
165
|
+
return 'unauthorized';
|
|
166
|
+
// 构建最终答案数组(按问题顺序)
|
|
167
|
+
let answers;
|
|
168
|
+
if (args.selections !== undefined) {
|
|
169
|
+
// 显式传入:逐问校验单选约束 + key 合法性
|
|
170
|
+
answers = args.selections;
|
|
171
|
+
for (let i = 0; i < ask.questions.length; i++) {
|
|
172
|
+
const q = ask.questions[i];
|
|
173
|
+
const sel = answers[i] ?? [];
|
|
174
|
+
if (!q.multiSelect && sel.length !== 1)
|
|
175
|
+
return 'stale';
|
|
176
|
+
// 校验每个选中的 key 必须在该问题的 options 中
|
|
177
|
+
for (const key of sel) {
|
|
178
|
+
if (!q.options.some((o) => o.key === key))
|
|
179
|
+
return 'stale';
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
// 使用累积的勾选状态
|
|
185
|
+
const built = [];
|
|
186
|
+
for (let i = 0; i < ask.questions.length; i++) {
|
|
187
|
+
const q = ask.questions[i];
|
|
188
|
+
const sel = ask.selections.get(i);
|
|
189
|
+
if (!q.multiSelect && sel.size !== 1)
|
|
190
|
+
return 'stale';
|
|
191
|
+
built.push([...sel]);
|
|
192
|
+
}
|
|
193
|
+
answers = built;
|
|
194
|
+
}
|
|
195
|
+
settle(args.askId, {
|
|
196
|
+
kind: 'answered',
|
|
197
|
+
answers,
|
|
198
|
+
by: args.by,
|
|
199
|
+
comment: null,
|
|
200
|
+
timedOut: false,
|
|
201
|
+
});
|
|
202
|
+
return 'accepted';
|
|
203
|
+
}
|
|
204
|
+
/** Resolve attempt from a card-button click. Returns one of the §10 outcomes;
|
|
205
|
+
* caller (card click handler) maps to user-facing toast.
|
|
206
|
+
*
|
|
207
|
+
* v0.1.8 起退化为单问单选的便捷封装:等价于
|
|
208
|
+
* `submitAsk({..., selections:[[selected]]})`.
|
|
209
|
+
* 使 `botmux ask buttons` 与其已有测试零回归。
|
|
210
|
+
*
|
|
211
|
+
* All four "no-op" outcomes (`unauthorized`/`stale`/`already_settled`) leave
|
|
212
|
+
* the broker state unchanged so the original CLI Promise keeps waiting for
|
|
213
|
+
* the real winner or the deadline. */
|
|
214
|
+
export function tryResolveAsk(args) {
|
|
215
|
+
return submitAsk({
|
|
216
|
+
askId: args.askId,
|
|
217
|
+
nonce: args.nonce,
|
|
218
|
+
by: args.by,
|
|
219
|
+
selections: [[args.selected]],
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
/** Invalidate every pending ask. Intended for daemon shutdown / restart paths
|
|
223
|
+
* so CLI subprocesses unblock with `kind:'invalidated'` instead of waiting
|
|
224
|
+
* forever on a dead daemon. Returns the number of asks actually settled
|
|
225
|
+
* (settled-but-retained entries from the race window are skipped). */
|
|
226
|
+
export function invalidateAll(reason) {
|
|
227
|
+
const ids = [...pending.entries()]
|
|
228
|
+
.filter(([, ask]) => !ask.settled)
|
|
229
|
+
.map(([id]) => id);
|
|
230
|
+
for (const id of ids) {
|
|
231
|
+
settle(id, {
|
|
232
|
+
kind: 'invalidated',
|
|
233
|
+
reason,
|
|
234
|
+
selected: null,
|
|
235
|
+
by: null,
|
|
236
|
+
comment: null,
|
|
237
|
+
timedOut: false,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
if (ids.length > 0) {
|
|
241
|
+
logger.info?.(`ask-broker: invalidated ${ids.length} pending ask(s): ${reason}`);
|
|
242
|
+
}
|
|
243
|
+
return ids.length;
|
|
244
|
+
}
|
|
245
|
+
/** Internal — settle an ask exactly once and notify the dispatcher's onSettle
|
|
246
|
+
* hook (best-effort, never blocks broker state transitions). The settled
|
|
247
|
+
* entry stays in the map for `SETTLED_RETENTION_MS` so late race-losers get
|
|
248
|
+
* a precise `already_settled` outcome; `gcSettled` reaps it afterward. */
|
|
249
|
+
function settle(askId, result) {
|
|
250
|
+
const ask = pending.get(askId);
|
|
251
|
+
if (!ask || ask.settled)
|
|
252
|
+
return;
|
|
253
|
+
ask.settled = true;
|
|
254
|
+
ask.settledAt = Date.now();
|
|
255
|
+
clearTimeout(ask.timeoutHandle);
|
|
256
|
+
// Reap older settled entries opportunistically — keeps the map bounded
|
|
257
|
+
// without paying for a dedicated GC timer.
|
|
258
|
+
gcSettled();
|
|
259
|
+
try {
|
|
260
|
+
ask.resolve(result);
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
logger.warn?.(`ask-broker: ${askId} resolve threw: ${err instanceof Error ? err.message : String(err)}`);
|
|
264
|
+
}
|
|
265
|
+
if (dispatcher?.onSettle) {
|
|
266
|
+
try {
|
|
267
|
+
void Promise.resolve(dispatcher.onSettle(snapshot(ask), result)).catch((err) => {
|
|
268
|
+
logger.warn?.(`ask-broker: ${askId} onSettle failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
catch (err) {
|
|
272
|
+
logger.warn?.(`ask-broker: ${askId} onSettle threw: ${err instanceof Error ? err.message : String(err)}`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/** Strip broker-internal fields before handing a snapshot to the IM-side
|
|
277
|
+
* dispatcher. Keeps the dispatcher contract narrow. */
|
|
278
|
+
function snapshot(ask) {
|
|
279
|
+
const { resolve: _r, timeoutHandle: _t, settledAt: _sat, selections: _sel, ...rest } = ask;
|
|
280
|
+
return {
|
|
281
|
+
...rest,
|
|
282
|
+
selections: ask.questions.map((_, i) => [...(ask.selections.get(i) ?? new Set())]),
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
/** Drop settled entries that have aged past the retention window. Cheap O(n)
|
|
286
|
+
* walk — n is tiny in practice (≤ a few dozen pending+recent asks). */
|
|
287
|
+
function gcSettled() {
|
|
288
|
+
const cutoff = Date.now() - SETTLED_RETENTION_MS;
|
|
289
|
+
for (const [id, ask] of pending) {
|
|
290
|
+
if (ask.settled && ask.settledAt !== undefined && ask.settledAt < cutoff) {
|
|
291
|
+
pending.delete(id);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// ---- diagnostics for tests ---------------------------------------------------
|
|
296
|
+
/** Count of asks still awaiting a click / timeout — excludes settled entries
|
|
297
|
+
* retained within the race-loser feedback window. For tests and metrics only. */
|
|
298
|
+
export function _pendingCount() {
|
|
299
|
+
let n = 0;
|
|
300
|
+
for (const ask of pending.values())
|
|
301
|
+
if (!ask.settled)
|
|
302
|
+
n++;
|
|
303
|
+
return n;
|
|
304
|
+
}
|
|
305
|
+
/** Read a pending ask by id. Returns a snapshot; mutating it has no effect on
|
|
306
|
+
* broker state. Used by the card handler to PATCH toggle state. */
|
|
307
|
+
export function getAskSnapshot(askId) {
|
|
308
|
+
const a = pending.get(askId);
|
|
309
|
+
return a ? snapshot(a) : undefined;
|
|
310
|
+
}
|
|
311
|
+
/** Read a pending ask by id — for tests only. Returns a snapshot; mutating it
|
|
312
|
+
* has no effect on broker state. */
|
|
313
|
+
export function _getPending(askId) {
|
|
314
|
+
return getAskSnapshot(askId);
|
|
315
|
+
}
|
|
316
|
+
/** 返回当前 pending map 中所有 askId 列表(含 settled 但仍在 retention 内的条目)。
|
|
317
|
+
* 仅供测试使用。 */
|
|
318
|
+
export function _allAskIds() {
|
|
319
|
+
return [...pending.keys()];
|
|
320
|
+
}
|
|
321
|
+
/** Reset broker state — for tests only. Does NOT resolve outstanding promises,
|
|
322
|
+
* so tests must not call this while real CLI processes might be waiting. */
|
|
323
|
+
export function _resetForTest() {
|
|
324
|
+
for (const ask of pending.values())
|
|
325
|
+
clearTimeout(ask.timeoutHandle);
|
|
326
|
+
pending.clear();
|
|
327
|
+
dispatcher = null;
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=ask-broker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-broker.js","sourceRoot":"","sources":["../../src/core/ask-broker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code hook adapter。
|
|
3
|
+
*
|
|
4
|
+
* Claude Code 通过 PreToolUse hook 发起 AskUserQuestion,
|
|
5
|
+
* payload 形状:
|
|
6
|
+
* {
|
|
7
|
+
* hook_event_name: 'PreToolUse',
|
|
8
|
+
* tool_name: 'AskUserQuestion',
|
|
9
|
+
* tool_input: {
|
|
10
|
+
* questions: [
|
|
11
|
+
* {
|
|
12
|
+
* question: '问题文本',
|
|
13
|
+
* multiSelect: boolean,
|
|
14
|
+
* options: [{ label: '选项文本' }, ...]
|
|
15
|
+
* }
|
|
16
|
+
* ]
|
|
17
|
+
* }
|
|
18
|
+
* }
|
|
19
|
+
*
|
|
20
|
+
* Claude Code 期望的 answer directive(hookSpecificOutput)形状:
|
|
21
|
+
* {
|
|
22
|
+
* hookSpecificOutput: {
|
|
23
|
+
* hookEventName: 'PreToolUse',
|
|
24
|
+
* permissionDecision: 'allow',
|
|
25
|
+
* updatedInput: {
|
|
26
|
+
* questions: <原始 questions 数组>,
|
|
27
|
+
* answers: {
|
|
28
|
+
* '问题文本': '选项label1, 选项label2',
|
|
29
|
+
* ...
|
|
30
|
+
* }
|
|
31
|
+
* }
|
|
32
|
+
* }
|
|
33
|
+
* }
|
|
34
|
+
*
|
|
35
|
+
* passthrough(放行)directive 形状:
|
|
36
|
+
* {
|
|
37
|
+
* hookSpecificOutput: {
|
|
38
|
+
* hookEventName: 'PreToolUse',
|
|
39
|
+
* permissionDecision: 'allow',
|
|
40
|
+
* updatedInput: { questions: [...], answers: {} }
|
|
41
|
+
* }
|
|
42
|
+
* }
|
|
43
|
+
*
|
|
44
|
+
* 参考来源:x-desktop-app/src/island/main/bridge/adapters/ClaudeAdapter.ts
|
|
45
|
+
* x-desktop-app/src/island/main/bridge/BridgeServer.ts buildClaudeAnswerDirective
|
|
46
|
+
*/
|
|
47
|
+
import type { HookAskAdapter } from './types.js';
|
|
48
|
+
declare const claudeCodeAdapter: HookAskAdapter;
|
|
49
|
+
export default claudeCodeAdapter;
|
|
50
|
+
//# sourceMappingURL=claude-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/core/ask-hook/claude-code.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,YAAY,CAAC;AAc5D,QAAA,MAAM,iBAAiB,EAAE,cA2DxB,CAAC;AAmCF,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code hook adapter。
|
|
3
|
+
*
|
|
4
|
+
* Claude Code 通过 PreToolUse hook 发起 AskUserQuestion,
|
|
5
|
+
* payload 形状:
|
|
6
|
+
* {
|
|
7
|
+
* hook_event_name: 'PreToolUse',
|
|
8
|
+
* tool_name: 'AskUserQuestion',
|
|
9
|
+
* tool_input: {
|
|
10
|
+
* questions: [
|
|
11
|
+
* {
|
|
12
|
+
* question: '问题文本',
|
|
13
|
+
* multiSelect: boolean,
|
|
14
|
+
* options: [{ label: '选项文本' }, ...]
|
|
15
|
+
* }
|
|
16
|
+
* ]
|
|
17
|
+
* }
|
|
18
|
+
* }
|
|
19
|
+
*
|
|
20
|
+
* Claude Code 期望的 answer directive(hookSpecificOutput)形状:
|
|
21
|
+
* {
|
|
22
|
+
* hookSpecificOutput: {
|
|
23
|
+
* hookEventName: 'PreToolUse',
|
|
24
|
+
* permissionDecision: 'allow',
|
|
25
|
+
* updatedInput: {
|
|
26
|
+
* questions: <原始 questions 数组>,
|
|
27
|
+
* answers: {
|
|
28
|
+
* '问题文本': '选项label1, 选项label2',
|
|
29
|
+
* ...
|
|
30
|
+
* }
|
|
31
|
+
* }
|
|
32
|
+
* }
|
|
33
|
+
* }
|
|
34
|
+
*
|
|
35
|
+
* passthrough(放行)directive 形状:
|
|
36
|
+
* {
|
|
37
|
+
* hookSpecificOutput: {
|
|
38
|
+
* hookEventName: 'PreToolUse',
|
|
39
|
+
* permissionDecision: 'allow',
|
|
40
|
+
* updatedInput: { questions: [...], answers: {} }
|
|
41
|
+
* }
|
|
42
|
+
* }
|
|
43
|
+
*
|
|
44
|
+
* 参考来源:x-desktop-app/src/island/main/bridge/adapters/ClaudeAdapter.ts
|
|
45
|
+
* x-desktop-app/src/island/main/bridge/BridgeServer.ts buildClaudeAnswerDirective
|
|
46
|
+
*/
|
|
47
|
+
/** 从 payload 中提取原始 questions 数组(用于写回 updatedInput.questions)。 */
|
|
48
|
+
function extractRawQuestions(payload) {
|
|
49
|
+
if (!payload || typeof payload !== 'object')
|
|
50
|
+
return [];
|
|
51
|
+
const p = payload;
|
|
52
|
+
const toolInput = p.tool_input;
|
|
53
|
+
if (!toolInput || typeof toolInput !== 'object')
|
|
54
|
+
return [];
|
|
55
|
+
const ti = toolInput;
|
|
56
|
+
const qs = ti.questions;
|
|
57
|
+
if (!Array.isArray(qs))
|
|
58
|
+
return [];
|
|
59
|
+
return qs;
|
|
60
|
+
}
|
|
61
|
+
const claudeCodeAdapter = {
|
|
62
|
+
parseQuestions(payload) {
|
|
63
|
+
if (!payload || typeof payload !== 'object')
|
|
64
|
+
return null;
|
|
65
|
+
const p = payload;
|
|
66
|
+
// 处理 PreToolUse + AskUserQuestion。PermissionRequest 保留为迁移期兼容。
|
|
67
|
+
if (p.hook_event_name !== 'PreToolUse' && p.hook_event_name !== 'PermissionRequest')
|
|
68
|
+
return null;
|
|
69
|
+
if (p.tool_name !== 'AskUserQuestion')
|
|
70
|
+
return null;
|
|
71
|
+
const rawQuestions = extractRawQuestions(payload);
|
|
72
|
+
if (rawQuestions.length === 0)
|
|
73
|
+
return null;
|
|
74
|
+
const questions = rawQuestions.map((q) => {
|
|
75
|
+
const qText = typeof q.question === 'string' ? q.question : String(q.question ?? '');
|
|
76
|
+
const multiSelect = !!q.multiSelect;
|
|
77
|
+
const rawOpts = Array.isArray(q.options) ? q.options : [];
|
|
78
|
+
const options = rawOpts.map((opt) => {
|
|
79
|
+
const label = typeof opt.label === 'string' ? opt.label : String(opt.label ?? '');
|
|
80
|
+
// option 无独立 key 时,用 label 作为 key
|
|
81
|
+
const key = typeof opt.key === 'string' && opt.key.length > 0 ? opt.key : label;
|
|
82
|
+
return { key, label };
|
|
83
|
+
});
|
|
84
|
+
return { prompt: qText, options, multiSelect };
|
|
85
|
+
});
|
|
86
|
+
return { questions, raw: payload };
|
|
87
|
+
},
|
|
88
|
+
formatAnswer(answersByQuestion, parsed) {
|
|
89
|
+
const rawPayload = parsed.raw;
|
|
90
|
+
const rawQuestions = extractRawQuestions(rawPayload);
|
|
91
|
+
const eventName = hookEventName(rawPayload);
|
|
92
|
+
// Claude updatedInput.answers: { 问题文本: 'label1, label2' };缺席的 question 不写 key。
|
|
93
|
+
const answers = {};
|
|
94
|
+
parsed.questions.forEach((q, i) => {
|
|
95
|
+
const selectedKeys = answersByQuestion[i];
|
|
96
|
+
if (!selectedKeys || selectedKeys.length === 0)
|
|
97
|
+
return;
|
|
98
|
+
// 把 key 映射回 label(用于人类可读的 answers 值)
|
|
99
|
+
const labels = selectedKeys.map((k) => {
|
|
100
|
+
const opt = q.options.find((o) => o.key === k);
|
|
101
|
+
return opt ? opt.label : k;
|
|
102
|
+
});
|
|
103
|
+
answers[q.prompt] = labels.join(', ');
|
|
104
|
+
});
|
|
105
|
+
const directive = buildAllowDirective(eventName, rawQuestions, answers);
|
|
106
|
+
return JSON.stringify(directive);
|
|
107
|
+
},
|
|
108
|
+
passthrough(_payload) {
|
|
109
|
+
// 真放行:空 stdout(+ exit 0)。Claude Code 无 hook decision 时工具照常执行,
|
|
110
|
+
// AskUserQuestion 在终端原生提问。
|
|
111
|
+
// 绝不能输出 allow + updatedInput:那会用空 answers 顶替 tool input,把这次提问
|
|
112
|
+
// 错误地"答空"掉(非 botmux 会话 / daemon 不可达时尤其有害)。
|
|
113
|
+
return '';
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
function hookEventName(payload) {
|
|
117
|
+
if (payload && typeof payload === 'object') {
|
|
118
|
+
const eventName = payload.hook_event_name;
|
|
119
|
+
if (eventName === 'PermissionRequest')
|
|
120
|
+
return 'PermissionRequest';
|
|
121
|
+
}
|
|
122
|
+
return 'PreToolUse';
|
|
123
|
+
}
|
|
124
|
+
function buildAllowDirective(eventName, questions, answers) {
|
|
125
|
+
if (eventName === 'PermissionRequest') {
|
|
126
|
+
return {
|
|
127
|
+
hookSpecificOutput: {
|
|
128
|
+
hookEventName: 'PermissionRequest',
|
|
129
|
+
decision: {
|
|
130
|
+
behavior: 'allow',
|
|
131
|
+
updatedInput: { questions, answers },
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
hookSpecificOutput: {
|
|
138
|
+
hookEventName: 'PreToolUse',
|
|
139
|
+
permissionDecision: 'allow',
|
|
140
|
+
updatedInput: { questions, answers },
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
export default claudeCodeAdapter;
|
|
145
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/core/ask-hook/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex hook adapter。
|
|
3
|
+
*
|
|
4
|
+
* Codex 通过 PermissionRequest hook 发起权限请求,payload 形状:
|
|
5
|
+
* {
|
|
6
|
+
* hook_event_name: 'PermissionRequest',
|
|
7
|
+
* tool_name: '<工具名>',
|
|
8
|
+
* tool_input: { description?: string, command?: string, ... },
|
|
9
|
+
* session_id: '<id>',
|
|
10
|
+
* ...
|
|
11
|
+
* }
|
|
12
|
+
*
|
|
13
|
+
* 与 Claude Code 不同,Codex **没有**结构化的 AskUserQuestion hook 事件——
|
|
14
|
+
* Codex 把问题藏在 Stop 事件的 last_assistant_message 文本里,
|
|
15
|
+
* 而非通过 PermissionRequest 以结构化方式发起。
|
|
16
|
+
* 因此 parseQuestions 对任意 Codex hook payload 均返回 null。
|
|
17
|
+
*
|
|
18
|
+
* Codex 期望的 permission directive(hookSpecificOutput)形状:
|
|
19
|
+
* {
|
|
20
|
+
* hookSpecificOutput: {
|
|
21
|
+
* hookEventName: 'PermissionRequest',
|
|
22
|
+
* decision: { behavior: 'allow' | 'deny', message?: string }
|
|
23
|
+
* }
|
|
24
|
+
* }
|
|
25
|
+
*
|
|
26
|
+
* passthrough(放行)directive 形状(behavior='allow'):
|
|
27
|
+
* {
|
|
28
|
+
* hookSpecificOutput: {
|
|
29
|
+
* hookEventName: 'PermissionRequest',
|
|
30
|
+
* decision: { behavior: 'allow' }
|
|
31
|
+
* }
|
|
32
|
+
* }
|
|
33
|
+
*
|
|
34
|
+
* // TODO(dogfood): 验证 codex directive 形状(parseQuestions 总返回 null,
|
|
35
|
+
* // formatAnswer 在当前版本不会被调用,但 passthrough 在 PermissionRequest 场景会被用到)
|
|
36
|
+
*
|
|
37
|
+
* 参考来源:x-desktop-app/src/island/main/bridge/adapters/CodexAdapter.ts
|
|
38
|
+
* x-desktop-app/src/island/main/bridge/BridgeServer.ts codex 分支
|
|
39
|
+
*/
|
|
40
|
+
import type { HookAskAdapter } from './types.js';
|
|
41
|
+
declare const codexAdapter: HookAskAdapter;
|
|
42
|
+
export default codexAdapter;
|
|
43
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/core/ask-hook/codex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,YAAY,CAAC;AAE5D,QAAA,MAAM,YAAY,EAAE,cA6BnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex hook adapter。
|
|
3
|
+
*
|
|
4
|
+
* Codex 通过 PermissionRequest hook 发起权限请求,payload 形状:
|
|
5
|
+
* {
|
|
6
|
+
* hook_event_name: 'PermissionRequest',
|
|
7
|
+
* tool_name: '<工具名>',
|
|
8
|
+
* tool_input: { description?: string, command?: string, ... },
|
|
9
|
+
* session_id: '<id>',
|
|
10
|
+
* ...
|
|
11
|
+
* }
|
|
12
|
+
*
|
|
13
|
+
* 与 Claude Code 不同,Codex **没有**结构化的 AskUserQuestion hook 事件——
|
|
14
|
+
* Codex 把问题藏在 Stop 事件的 last_assistant_message 文本里,
|
|
15
|
+
* 而非通过 PermissionRequest 以结构化方式发起。
|
|
16
|
+
* 因此 parseQuestions 对任意 Codex hook payload 均返回 null。
|
|
17
|
+
*
|
|
18
|
+
* Codex 期望的 permission directive(hookSpecificOutput)形状:
|
|
19
|
+
* {
|
|
20
|
+
* hookSpecificOutput: {
|
|
21
|
+
* hookEventName: 'PermissionRequest',
|
|
22
|
+
* decision: { behavior: 'allow' | 'deny', message?: string }
|
|
23
|
+
* }
|
|
24
|
+
* }
|
|
25
|
+
*
|
|
26
|
+
* passthrough(放行)directive 形状(behavior='allow'):
|
|
27
|
+
* {
|
|
28
|
+
* hookSpecificOutput: {
|
|
29
|
+
* hookEventName: 'PermissionRequest',
|
|
30
|
+
* decision: { behavior: 'allow' }
|
|
31
|
+
* }
|
|
32
|
+
* }
|
|
33
|
+
*
|
|
34
|
+
* // TODO(dogfood): 验证 codex directive 形状(parseQuestions 总返回 null,
|
|
35
|
+
* // formatAnswer 在当前版本不会被调用,但 passthrough 在 PermissionRequest 场景会被用到)
|
|
36
|
+
*
|
|
37
|
+
* 参考来源:x-desktop-app/src/island/main/bridge/adapters/CodexAdapter.ts
|
|
38
|
+
* x-desktop-app/src/island/main/bridge/BridgeServer.ts codex 分支
|
|
39
|
+
*/
|
|
40
|
+
const codexAdapter = {
|
|
41
|
+
parseQuestions(_payload) {
|
|
42
|
+
// Codex 没有结构化 AskUserQuestion hook 事件,始终返回 null。
|
|
43
|
+
// Codex 的"提问"藏在 Stop 事件的 last_assistant_message 纯文本里,
|
|
44
|
+
// 不通过 PermissionRequest hook 以结构化方式触达 hooks-cli。
|
|
45
|
+
return null;
|
|
46
|
+
},
|
|
47
|
+
formatAnswer(answersByQuestion, parsed) {
|
|
48
|
+
// 由于 parseQuestions 总返回 null,此方法在正常流程中不会被调用。
|
|
49
|
+
// 保留实现以满足接口约定:使用 allow + 空 decision 形状。
|
|
50
|
+
// TODO(dogfood): 验证 codex directive 形状
|
|
51
|
+
void answersByQuestion;
|
|
52
|
+
void parsed;
|
|
53
|
+
const directive = {
|
|
54
|
+
hookSpecificOutput: {
|
|
55
|
+
hookEventName: 'PermissionRequest',
|
|
56
|
+
decision: { behavior: 'allow' },
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
return JSON.stringify(directive);
|
|
60
|
+
},
|
|
61
|
+
passthrough(_payload) {
|
|
62
|
+
// 真放行:空 stdout(+ exit 0),不做任何 decision,让 Codex 走默认行为。
|
|
63
|
+
// 不输出 allow——那是替用户自动批准,并非"放行不干预"。
|
|
64
|
+
// (Codex 当前未接 hook,此分支仅为将来接入时的安全默认。)
|
|
65
|
+
return '';
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
export default codexAdapter;
|
|
69
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/core/ask-hook/codex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAIH,MAAM,YAAY,GAAmB;IACnC,cAAc,CAAC,QAAiB;QAC9B,iDAAiD;QACjD,sDAAsD;QACtD,iDAAiD;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY,CAAC,iBAAuD,EAAE,MAAiB;QACrF,6CAA6C;QAC7C,wCAAwC;QACxC,uCAAuC;QACvC,KAAK,iBAAiB,CAAC;QACvB,KAAK,MAAM,CAAC;QACZ,MAAM,SAAS,GAAG;YAChB,kBAAkB,EAAE;gBAClB,aAAa,EAAE,mBAAmB;gBAClC,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;aAChC;SACF,CAAC;QACF,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAED,WAAW,CAAC,QAAiB;QAC3B,sDAAsD;QACtD,kCAAkC;QAClC,qCAAqC;QACrC,OAAO,EAAE,CAAC;IACZ,CAAC;CACF,CAAC;AAEF,eAAe,YAAY,CAAC"}
|