botmux 2.107.0 → 2.108.0
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 +17 -14
- package/README.md +19 -14
- package/dist/adapters/backend/sandbox.d.ts +3 -1
- package/dist/adapters/backend/sandbox.d.ts.map +1 -1
- package/dist/adapters/backend/sandbox.js +19 -3
- package/dist/adapters/backend/sandbox.js.map +1 -1
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +16 -1
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.d.ts +24 -15
- package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js +75 -43
- package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
- package/dist/adapters/cli/genius.d.ts.map +1 -1
- package/dist/adapters/cli/genius.js +9 -15
- package/dist/adapters/cli/genius.js.map +1 -1
- package/dist/adapters/cli/grok.d.ts +73 -0
- package/dist/adapters/cli/grok.d.ts.map +1 -0
- package/dist/adapters/cli/grok.js +298 -0
- package/dist/adapters/cli/grok.js.map +1 -0
- package/dist/adapters/cli/oh-my-pi.d.ts.map +1 -1
- package/dist/adapters/cli/oh-my-pi.js +133 -12
- package/dist/adapters/cli/oh-my-pi.js.map +1 -1
- package/dist/adapters/cli/registry.d.ts +2 -1
- package/dist/adapters/cli/registry.d.ts.map +1 -1
- package/dist/adapters/cli/registry.js +3 -1
- package/dist/adapters/cli/registry.js.map +1 -1
- package/dist/adapters/cli/shared-hints.d.ts +8 -4
- package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
- package/dist/adapters/cli/shared-hints.js +8 -4
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +18 -16
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/adapters/hook-installer.d.ts +5 -4
- package/dist/adapters/hook-installer.d.ts.map +1 -1
- package/dist/adapters/hook-installer.js +42 -0
- package/dist/adapters/hook-installer.js.map +1 -1
- package/dist/cli/send-dispatch.d.ts +21 -0
- package/dist/cli/send-dispatch.d.ts.map +1 -1
- package/dist/cli/send-dispatch.js +159 -0
- package/dist/cli/send-dispatch.js.map +1 -1
- package/dist/cli/session-list-liveness.d.ts +22 -0
- package/dist/cli/session-list-liveness.d.ts.map +1 -0
- package/dist/cli/session-list-liveness.js +22 -0
- package/dist/cli/session-list-liveness.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +182 -33
- package/dist/cli.js.map +1 -1
- package/dist/core/ask-types.d.ts +4 -0
- package/dist/core/ask-types.d.ts.map +1 -1
- package/dist/core/ask-types.js +10 -0
- package/dist/core/ask-types.js.map +1 -1
- package/dist/core/cost-calculator.d.ts.map +1 -1
- package/dist/core/cost-calculator.js +35 -13
- package/dist/core/cost-calculator.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +89 -16
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/dashboard-rows.d.ts.map +1 -1
- package/dist/core/dashboard-rows.js +6 -2
- package/dist/core/dashboard-rows.js.map +1 -1
- package/dist/core/dashboard-url.d.ts +6 -5
- package/dist/core/dashboard-url.d.ts.map +1 -1
- package/dist/core/dashboard-url.js +11 -8
- package/dist/core/dashboard-url.js.map +1 -1
- package/dist/core/maintenance.d.ts +11 -8
- package/dist/core/maintenance.d.ts.map +1 -1
- package/dist/core/maintenance.js +45 -20
- package/dist/core/maintenance.js.map +1 -1
- package/dist/core/per-bot-env.d.ts.map +1 -1
- package/dist/core/per-bot-env.js +4 -0
- package/dist/core/per-bot-env.js.map +1 -1
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +4 -0
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/skills/cli-admin-command.d.ts.map +1 -1
- package/dist/core/skills/cli-admin-command.js +8 -2
- package/dist/core/skills/cli-admin-command.js.map +1 -1
- package/dist/core/skills/im-command.d.ts.map +1 -1
- package/dist/core/skills/im-command.js +3 -1
- package/dist/core/skills/im-command.js.map +1 -1
- package/dist/core/skills/sources.d.ts +33 -1
- package/dist/core/skills/sources.d.ts.map +1 -1
- package/dist/core/skills/sources.js +97 -0
- package/dist/core/skills/sources.js.map +1 -1
- package/dist/core/skills/types.d.ts +8 -0
- package/dist/core/skills/types.d.ts.map +1 -1
- package/dist/core/terminal-url.d.ts.map +1 -1
- package/dist/core/terminal-url.js +12 -2
- package/dist/core/terminal-url.js.map +1 -1
- package/dist/core/terminal-write-auth.d.ts +34 -0
- package/dist/core/terminal-write-auth.d.ts.map +1 -0
- package/dist/core/terminal-write-auth.js +76 -0
- package/dist/core/terminal-write-auth.js.map +1 -0
- package/dist/core/tmux-recovery.d.ts +11 -0
- package/dist/core/tmux-recovery.d.ts.map +1 -0
- package/dist/core/tmux-recovery.js +19 -0
- package/dist/core/tmux-recovery.js.map +1 -0
- package/dist/core/types.d.ts +10 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/update-check.d.ts +2 -2
- package/dist/core/update-check.js +2 -2
- package/dist/core/worker-pool.d.ts +3 -0
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +70 -3
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +15 -8
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/auth.d.ts +1 -1
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +7 -2
- package/dist/dashboard/auth.js.map +1 -1
- package/dist/dashboard/bot-payload.d.ts +3 -0
- package/dist/dashboard/bot-payload.d.ts.map +1 -1
- package/dist/dashboard/bot-payload.js +3 -0
- package/dist/dashboard/bot-payload.js.map +1 -1
- package/dist/dashboard/connector-api.d.ts.map +1 -1
- package/dist/dashboard/connector-api.js +39 -13
- package/dist/dashboard/connector-api.js.map +1 -1
- package/dist/dashboard/history-senders.d.ts +37 -0
- package/dist/dashboard/history-senders.d.ts.map +1 -0
- package/dist/dashboard/history-senders.js +60 -0
- package/dist/dashboard/history-senders.js.map +1 -0
- package/dist/dashboard/roles-batch.d.ts +31 -0
- package/dist/dashboard/roles-batch.d.ts.map +1 -0
- package/dist/dashboard/roles-batch.js +87 -0
- package/dist/dashboard/roles-batch.js.map +1 -0
- package/dist/dashboard/settings-card-model.d.ts +4 -2
- package/dist/dashboard/settings-card-model.d.ts.map +1 -1
- package/dist/dashboard/settings-card-model.js +13 -5
- package/dist/dashboard/settings-card-model.js.map +1 -1
- package/dist/dashboard/settings-write-applier.d.ts +4 -1
- package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
- package/dist/dashboard/settings-write-applier.js +6 -1
- package/dist/dashboard/settings-write-applier.js.map +1 -1
- package/dist/dashboard/skill-install-request.d.ts +4 -0
- package/dist/dashboard/skill-install-request.d.ts.map +1 -1
- package/dist/dashboard/skill-install-request.js +11 -1
- package/dist/dashboard/skill-install-request.js.map +1 -1
- package/dist/dashboard/trigger-api.d.ts +9 -1
- package/dist/dashboard/trigger-api.d.ts.map +1 -1
- package/dist/dashboard/trigger-api.js +48 -10
- package/dist/dashboard/trigger-api.js.map +1 -1
- package/dist/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +286 -271
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.d.ts +26 -0
- package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.js +1408 -12
- package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts +91 -4
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js +43 -2141
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/bot-onboarding.d.ts +6 -1
- package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/web/bot-onboarding.js +261 -306
- package/dist/dashboard/web/bot-onboarding.js.map +1 -1
- package/dist/dashboard/web/connectors-page.d.ts +4 -0
- package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
- package/dist/dashboard/web/connectors-page.js +228 -48
- package/dist/dashboard/web/connectors-page.js.map +1 -1
- package/dist/dashboard/web/dashboard-api.d.ts +9 -0
- package/dist/dashboard/web/dashboard-api.d.ts.map +1 -0
- package/dist/dashboard/web/dashboard-api.js +18 -0
- package/dist/dashboard/web/dashboard-api.js.map +1 -0
- package/dist/dashboard/web/dashboard-components.d.ts +92 -0
- package/dist/dashboard/web/dashboard-components.d.ts.map +1 -0
- package/dist/dashboard/web/dashboard-components.js +250 -0
- package/dist/dashboard/web/dashboard-components.js.map +1 -0
- package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -1
- package/dist/dashboard/web/dashboard-routes.js +30 -183
- package/dist/dashboard/web/dashboard-routes.js.map +1 -1
- package/dist/dashboard/web/floating-scrollbars.d.ts +2 -0
- package/dist/dashboard/web/floating-scrollbars.d.ts.map +1 -0
- package/dist/dashboard/web/floating-scrollbars.js +264 -0
- package/dist/dashboard/web/floating-scrollbars.js.map +1 -0
- package/dist/dashboard/web/groups-api.d.ts +36 -0
- package/dist/dashboard/web/groups-api.d.ts.map +1 -0
- package/dist/dashboard/web/groups-api.js +44 -0
- package/dist/dashboard/web/groups-api.js.map +1 -0
- package/dist/dashboard/web/groups-page.d.ts.map +1 -1
- package/dist/dashboard/web/groups-page.js +746 -15
- package/dist/dashboard/web/groups-page.js.map +1 -1
- package/dist/dashboard/web/groups.d.ts +51 -18
- package/dist/dashboard/web/groups.d.ts.map +1 -1
- package/dist/dashboard/web/groups.js +145 -1096
- package/dist/dashboard/web/groups.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +545 -255
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/insights-page.d.ts.map +1 -1
- package/dist/dashboard/web/insights-page.js +1047 -14
- package/dist/dashboard/web/insights-page.js.map +1 -1
- package/dist/dashboard/web/insights.d.ts +177 -7
- package/dist/dashboard/web/insights.d.ts.map +1 -1
- package/dist/dashboard/web/insights.js +187 -1926
- package/dist/dashboard/web/insights.js.map +1 -1
- package/dist/dashboard/web/legacy-workflow-page.d.ts +3 -0
- package/dist/dashboard/web/legacy-workflow-page.d.ts.map +1 -0
- package/dist/dashboard/web/legacy-workflow-page.js +717 -0
- package/dist/dashboard/web/legacy-workflow-page.js.map +1 -0
- package/dist/dashboard/web/monitor-room.d.ts.map +1 -1
- package/dist/dashboard/web/monitor-room.js +10 -8
- package/dist/dashboard/web/monitor-room.js.map +1 -1
- package/dist/dashboard/web/monitoring-page.d.ts.map +1 -1
- package/dist/dashboard/web/monitoring-page.js +188 -14
- package/dist/dashboard/web/monitoring-page.js.map +1 -1
- package/dist/dashboard/web/office-page.d.ts.map +1 -1
- package/dist/dashboard/web/office-page.js +11 -23
- package/dist/dashboard/web/office-page.js.map +1 -1
- package/dist/dashboard/web/overview-page.d.ts.map +1 -1
- package/dist/dashboard/web/overview-page.js +141 -147
- package/dist/dashboard/web/overview-page.js.map +1 -1
- package/dist/dashboard/web/overview.d.ts +0 -1
- package/dist/dashboard/web/overview.d.ts.map +1 -1
- package/dist/dashboard/web/overview.js +3 -275
- package/dist/dashboard/web/overview.js.map +1 -1
- package/dist/dashboard/web/preferences.d.ts +1 -6
- package/dist/dashboard/web/preferences.d.ts.map +1 -1
- package/dist/dashboard/web/preferences.js +0 -21
- package/dist/dashboard/web/preferences.js.map +1 -1
- package/dist/dashboard/web/role-batch.d.ts +9 -0
- package/dist/dashboard/web/role-batch.d.ts.map +1 -0
- package/dist/dashboard/web/role-batch.js +42 -0
- package/dist/dashboard/web/role-batch.js.map +1 -0
- package/dist/dashboard/web/roles-page.d.ts.map +1 -1
- package/dist/dashboard/web/roles-page.js +538 -13
- package/dist/dashboard/web/roles-page.js.map +1 -1
- package/dist/dashboard/web/roles.d.ts +98 -1
- package/dist/dashboard/web/roles.d.ts.map +1 -1
- package/dist/dashboard/web/roles.js +117 -903
- package/dist/dashboard/web/roles.js.map +1 -1
- package/dist/dashboard/web/schedules-page.d.ts.map +1 -1
- package/dist/dashboard/web/schedules-page.js +82 -24
- package/dist/dashboard/web/schedules-page.js.map +1 -1
- package/dist/dashboard/web/sessions-kanban.d.ts +67 -0
- package/dist/dashboard/web/sessions-kanban.d.ts.map +1 -0
- package/dist/dashboard/web/sessions-kanban.js +481 -0
- package/dist/dashboard/web/sessions-kanban.js.map +1 -0
- package/dist/dashboard/web/sessions-page.d.ts +4 -0
- package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-page.js +1633 -18
- package/dist/dashboard/web/sessions-page.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts +45 -4
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +53 -2535
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/settings-page.d.ts +0 -2
- package/dist/dashboard/web/settings-page.d.ts.map +1 -1
- package/dist/dashboard/web/settings-page.js +127 -117
- package/dist/dashboard/web/settings-page.js.map +1 -1
- package/dist/dashboard/web/skills-page.d.ts +10 -1
- package/dist/dashboard/web/skills-page.d.ts.map +1 -1
- package/dist/dashboard/web/skills-page.js +235 -93
- package/dist/dashboard/web/skills-page.js.map +1 -1
- package/dist/dashboard/web/team-federation-page.d.ts.map +1 -1
- package/dist/dashboard/web/team-federation-page.js +446 -28
- package/dist/dashboard/web/team-federation-page.js.map +1 -1
- package/dist/dashboard/web/team-federation.d.ts +91 -2
- package/dist/dashboard/web/team-federation.d.ts.map +1 -1
- package/dist/dashboard/web/team-federation.js +87 -474
- package/dist/dashboard/web/team-federation.js.map +1 -1
- package/dist/dashboard/web/theme-menu.d.ts +1 -0
- package/dist/dashboard/web/theme-menu.d.ts.map +1 -1
- package/dist/dashboard/web/theme-menu.js +79 -20
- package/dist/dashboard/web/theme-menu.js.map +1 -1
- package/dist/dashboard/web/ui.d.ts +1 -2
- package/dist/dashboard/web/ui.d.ts.map +1 -1
- package/dist/dashboard/web/ui.js +8 -20
- package/dist/dashboard/web/ui.js.map +1 -1
- package/dist/dashboard/web/v3-api.d.ts +16 -0
- package/dist/dashboard/web/v3-api.d.ts.map +1 -0
- package/dist/dashboard/web/v3-api.js +21 -0
- package/dist/dashboard/web/v3-api.js.map +1 -0
- package/dist/dashboard/web/v3-components.d.ts +2 -0
- package/dist/dashboard/web/v3-components.d.ts.map +1 -0
- package/dist/dashboard/web/v3-components.js +290 -0
- package/dist/dashboard/web/v3-components.js.map +1 -0
- package/dist/dashboard/web/v3-model.d.ts +80 -0
- package/dist/dashboard/web/v3-model.d.ts.map +1 -0
- package/dist/dashboard/web/v3-model.js +240 -0
- package/dist/dashboard/web/v3-model.js.map +1 -0
- package/dist/dashboard/web/v3-page.d.ts.map +1 -1
- package/dist/dashboard/web/v3-page.js +2 -22
- package/dist/dashboard/web/v3-page.js.map +1 -1
- package/dist/dashboard/web/v3-terminal.d.ts +14 -0
- package/dist/dashboard/web/v3-terminal.d.ts.map +1 -1
- package/dist/dashboard/web/v3-terminal.js +31 -19
- package/dist/dashboard/web/v3-terminal.js.map +1 -1
- package/dist/dashboard/web/webhook-logs-page.d.ts +16 -0
- package/dist/dashboard/web/webhook-logs-page.d.ts.map +1 -0
- package/dist/dashboard/web/webhook-logs-page.js +195 -0
- package/dist/dashboard/web/webhook-logs-page.js.map +1 -0
- package/dist/dashboard/web/whiteboards-page.d.ts.map +1 -1
- package/dist/dashboard/web/whiteboards-page.js +18 -23
- package/dist/dashboard/web/whiteboards-page.js.map +1 -1
- package/dist/dashboard/web/workflow-version-switch.d.ts +8 -0
- package/dist/dashboard/web/workflow-version-switch.d.ts.map +1 -0
- package/dist/dashboard/web/workflow-version-switch.js +9 -0
- package/dist/dashboard/web/workflow-version-switch.js.map +1 -0
- package/dist/dashboard/web/workflows.d.ts +272 -1
- package/dist/dashboard/web/workflows.d.ts.map +1 -1
- package/dist/dashboard/web/workflows.js +211 -1397
- package/dist/dashboard/web/workflows.js.map +1 -1
- package/dist/dashboard/webhook-routes.d.ts.map +1 -1
- package/dist/dashboard/webhook-routes.js +92 -39
- package/dist/dashboard/webhook-routes.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -65
- package/dist/dashboard-web/brand-logo.png +0 -0
- package/dist/dashboard-web/chunks/bot-defaults-page-HSQ6HR3R.js +1 -0
- package/dist/dashboard-web/chunks/chunk-6TPODDDC.js +1 -0
- package/dist/dashboard-web/chunks/chunk-73EJP2MO.js +1 -0
- package/dist/dashboard-web/chunks/chunk-BRTZFELS.js +1 -0
- package/dist/dashboard-web/chunks/chunk-EVK77ASG.js +1 -0
- package/dist/dashboard-web/chunks/chunk-R3FXBFQH.js +1 -0
- package/dist/dashboard-web/chunks/chunk-VRLL7SNU.js +1 -0
- package/dist/dashboard-web/chunks/chunk-XCPSHD3G.js +37 -0
- package/dist/dashboard-web/chunks/chunk-XJ7BGPJH.js +1 -0
- package/dist/dashboard-web/chunks/chunk-YVRWYGXR.js +1 -0
- package/dist/dashboard-web/chunks/chunk-ZJING6FY.js +66 -0
- package/dist/dashboard-web/chunks/connectors-page-ODUA5UCW.js +1 -0
- package/dist/dashboard-web/chunks/groups-page-OYX5M6NK.js +8 -0
- package/dist/dashboard-web/chunks/insights-page-YCQO6OCR.js +22 -0
- package/dist/dashboard-web/chunks/legacy-workflow-page-XJAUNONP.js +2 -0
- package/dist/dashboard-web/chunks/{monitor-room-RFX4HPS5.js → monitor-room-WTZNYAFV.js} +17 -15
- package/dist/dashboard-web/chunks/monitoring-page-R6LJUK7G.js +2 -0
- package/dist/dashboard-web/chunks/office-page-4OXK3GNR.js +1 -0
- package/dist/dashboard-web/chunks/overview-page-4MVEJY6U.js +1 -0
- package/dist/dashboard-web/chunks/roles-page-NQDW27VV.js +1 -0
- package/dist/dashboard-web/chunks/schedules-page-JRNKYHOX.js +1 -0
- package/dist/dashboard-web/chunks/sessions-page-LF7UVI7B.js +3 -0
- package/dist/dashboard-web/chunks/settings-page-WGW7KQQS.js +2 -0
- package/dist/dashboard-web/chunks/skills-page-AMD4XP3T.js +3 -0
- package/dist/dashboard-web/chunks/team-federation-page-SYG3K4GG.js +1 -0
- package/dist/dashboard-web/chunks/v3-page-6NFFWNUK.js +94 -0
- package/dist/dashboard-web/chunks/whiteboards-page-FBRUK2AS.js +1 -0
- package/dist/dashboard-web/favicon.png +0 -0
- package/dist/dashboard-web/index.html +5 -69
- package/dist/dashboard-web/style.css +18835 -7211
- package/dist/dashboard.js +150 -32
- package/dist/dashboard.js.map +1 -1
- package/dist/global-config.d.ts +2 -2
- package/dist/global-config.d.ts.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +3 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +3 -0
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +7 -5
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +10 -7
- 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 +25 -1
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +84 -0
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/platform/binding.d.ts +9 -0
- package/dist/platform/binding.d.ts.map +1 -1
- package/dist/platform/binding.js +14 -0
- package/dist/platform/binding.js.map +1 -1
- package/dist/platform/tunnel-client.d.ts.map +1 -1
- package/dist/platform/tunnel-client.js +9 -0
- package/dist/platform/tunnel-client.js.map +1 -1
- package/dist/services/bot-config-store.d.ts +1 -1
- package/dist/services/bot-config-store.d.ts.map +1 -1
- package/dist/services/bot-config-store.js +11 -5
- package/dist/services/bot-config-store.js.map +1 -1
- package/dist/services/file-bridge-path.d.ts +8 -0
- package/dist/services/file-bridge-path.d.ts.map +1 -0
- package/dist/services/file-bridge-path.js +75 -0
- package/dist/services/file-bridge-path.js.map +1 -0
- package/dist/services/grok-paths.d.ts +27 -0
- package/dist/services/grok-paths.d.ts.map +1 -0
- package/dist/services/grok-paths.js +106 -0
- package/dist/services/grok-paths.js.map +1 -0
- package/dist/services/grok-transcript.d.ts +67 -0
- package/dist/services/grok-transcript.d.ts.map +1 -0
- package/dist/services/grok-transcript.js +630 -0
- package/dist/services/grok-transcript.js.map +1 -0
- package/dist/services/hermes-session-filter.d.ts +28 -0
- package/dist/services/hermes-session-filter.d.ts.map +1 -0
- package/dist/services/hermes-session-filter.js +53 -0
- package/dist/services/hermes-session-filter.js.map +1 -0
- package/dist/services/hermes-transcript.d.ts +3 -0
- package/dist/services/hermes-transcript.d.ts.map +1 -1
- package/dist/services/hermes-transcript.js +20 -2
- package/dist/services/hermes-transcript.js.map +1 -1
- package/dist/services/resumable-session-discovery.d.ts +3 -0
- package/dist/services/resumable-session-discovery.d.ts.map +1 -1
- package/dist/services/resumable-session-discovery.js +6 -1
- package/dist/services/resumable-session-discovery.js.map +1 -1
- package/dist/services/skill-registry-store.d.ts +9 -0
- package/dist/services/skill-registry-store.d.ts.map +1 -1
- package/dist/services/skill-registry-store.js +304 -1
- package/dist/services/skill-registry-store.js.map +1 -1
- package/dist/services/structured-bridge-clis.d.ts +29 -0
- package/dist/services/structured-bridge-clis.d.ts.map +1 -0
- package/dist/services/structured-bridge-clis.js +76 -0
- package/dist/services/structured-bridge-clis.js.map +1 -0
- package/dist/services/trigger-log-store.d.ts +59 -0
- package/dist/services/trigger-log-store.d.ts.map +1 -1
- package/dist/services/trigger-log-store.js +81 -10
- package/dist/services/trigger-log-store.js.map +1 -1
- package/dist/services/usage-ledger.d.ts +4 -1
- package/dist/services/usage-ledger.d.ts.map +1 -1
- package/dist/services/usage-ledger.js +48 -10
- package/dist/services/usage-ledger.js.map +1 -1
- package/dist/services/webhook-audit.d.ts +10 -0
- package/dist/services/webhook-audit.d.ts.map +1 -0
- package/dist/services/webhook-audit.js +116 -0
- package/dist/services/webhook-audit.js.map +1 -0
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +2 -0
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/ensure-tmux.d.ts +26 -12
- package/dist/setup/ensure-tmux.d.ts.map +1 -1
- package/dist/setup/ensure-tmux.js +85 -18
- package/dist/setup/ensure-tmux.js.map +1 -1
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +14 -1
- package/dist/skills/definitions.js.map +1 -1
- package/dist/skills/injection-mode.d.ts +16 -0
- package/dist/skills/injection-mode.d.ts.map +1 -1
- package/dist/skills/injection-mode.js +25 -0
- package/dist/skills/injection-mode.js.map +1 -1
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/global-install.d.ts +22 -0
- package/dist/utils/global-install.d.ts.map +1 -0
- package/dist/utils/global-install.js +106 -0
- package/dist/utils/global-install.js.map +1 -0
- package/dist/utils/install-diagnostics.d.ts +1 -1
- package/dist/utils/install-diagnostics.d.ts.map +1 -1
- package/dist/utils/install-diagnostics.js +6 -4
- package/dist/utils/install-diagnostics.js.map +1 -1
- package/dist/utils/install-info.d.ts +2 -0
- package/dist/utils/install-info.d.ts.map +1 -1
- package/dist/utils/install-info.js +10 -4
- package/dist/utils/install-info.js.map +1 -1
- package/dist/worker.js +293 -172
- package/dist/worker.js.map +1 -1
- package/dist/workflows/events/payloads.d.ts +10 -10
- package/dist/workflows/events/schema.d.ts +28 -28
- package/package.json +8 -7
- package/dist/dashboard/web/connectors.d.ts +0 -2
- package/dist/dashboard/web/connectors.d.ts.map +0 -1
- package/dist/dashboard/web/connectors.js +0 -2
- package/dist/dashboard/web/connectors.js.map +0 -1
- package/dist/dashboard/web/office.d.ts +0 -2
- package/dist/dashboard/web/office.d.ts.map +0 -1
- package/dist/dashboard/web/office.js +0 -2
- package/dist/dashboard/web/office.js.map +0 -1
- package/dist/dashboard/web/schedules.d.ts +0 -2
- package/dist/dashboard/web/schedules.d.ts.map +0 -1
- package/dist/dashboard/web/schedules.js +0 -2
- package/dist/dashboard/web/schedules.js.map +0 -1
- package/dist/dashboard/web/settings.d.ts +0 -2
- package/dist/dashboard/web/settings.d.ts.map +0 -1
- package/dist/dashboard/web/settings.js +0 -2
- package/dist/dashboard/web/settings.js.map +0 -1
- package/dist/dashboard/web/skills.d.ts +0 -2
- package/dist/dashboard/web/skills.d.ts.map +0 -1
- package/dist/dashboard/web/skills.js +0 -2
- package/dist/dashboard/web/skills.js.map +0 -1
- package/dist/dashboard/web/skin-intro.d.ts +0 -4
- package/dist/dashboard/web/skin-intro.d.ts.map +0 -1
- package/dist/dashboard/web/skin-intro.js +0 -49
- package/dist/dashboard/web/skin-intro.js.map +0 -1
- package/dist/dashboard/web/v3.d.ts +0 -3
- package/dist/dashboard/web/v3.d.ts.map +0 -1
- package/dist/dashboard/web/v3.js +0 -539
- package/dist/dashboard/web/v3.js.map +0 -1
- package/dist/dashboard/web/whiteboards.d.ts +0 -2
- package/dist/dashboard/web/whiteboards.d.ts.map +0 -1
- package/dist/dashboard/web/whiteboards.js +0 -2
- package/dist/dashboard/web/whiteboards.js.map +0 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-OCIHPGEU.js +0 -438
- package/dist/dashboard-web/chunks/chunk-3N2PPQVD.js +0 -1
- package/dist/dashboard-web/chunks/chunk-3UJYRR2Q.js +0 -37
- package/dist/dashboard-web/chunks/chunk-5E3MJJL4.js +0 -1
- package/dist/dashboard-web/chunks/chunk-7SZRL6FY.js +0 -1
- package/dist/dashboard-web/chunks/chunk-JTSE5VP6.js +0 -54
- package/dist/dashboard-web/chunks/chunk-LXIK7OUJ.js +0 -1
- package/dist/dashboard-web/chunks/chunk-PE6W3C2C.js +0 -1
- package/dist/dashboard-web/chunks/chunk-QW54DWU3.js +0 -325
- package/dist/dashboard-web/chunks/connectors-IGETYWCP.js +0 -1
- package/dist/dashboard-web/chunks/groups-page-MYBS4ZYJ.js +0 -207
- package/dist/dashboard-web/chunks/insights-page-UPA32V2S.js +0 -309
- package/dist/dashboard-web/chunks/monitoring-page-7T3BESZ2.js +0 -1
- package/dist/dashboard-web/chunks/office-page-6DXYOG55.js +0 -1
- package/dist/dashboard-web/chunks/overview-page-LJSBCQW4.js +0 -1
- package/dist/dashboard-web/chunks/roles-page-ESURTVQH.js +0 -98
- package/dist/dashboard-web/chunks/schedules-LML2ISOT.js +0 -1
- package/dist/dashboard-web/chunks/sessions-YB73XOTU.js +0 -1
- package/dist/dashboard-web/chunks/sessions-page-MCO5QR7Z.js +0 -1
- package/dist/dashboard-web/chunks/settings-page-OSDKNVS3.js +0 -2
- package/dist/dashboard-web/chunks/skills-page-PXBZJ6P6.js +0 -2
- package/dist/dashboard-web/chunks/team-federation-page-TTPVHFPX.js +0 -10
- package/dist/dashboard-web/chunks/v3-page-FVPUL665.js +0 -149
- package/dist/dashboard-web/chunks/whiteboards-page-HLCTYSSV.js +0 -1
- package/dist/dashboard-web/chunks/workflows-FCPM4S4D.js +0 -184
- package/dist/dashboard-web/skins/bluearchive-hero.webp +0 -0
- package/dist/dashboard-web/skins/dragonball-goku.webp +0 -0
- package/dist/dashboard-web/skins/dragonball-wukong.webp +0 -0
- package/dist/dashboard-web/skins/genshin-breeze.webp +0 -0
- package/dist/dashboard-web/skins/ikun-hero.webp +0 -0
- package/dist/dashboard-web/skins/prts-priestess.webp +0 -0
- package/dist/dashboard-web/skins/zzz-hero.webp +0 -0
- package/dist/dashboard-web/skins/zzz-pattern.svg +0 -25
|
@@ -1,23 +1,30 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
3
|
+
import { DropdownMenu } from './dashboard-components.js';
|
|
4
|
+
import { t } from './ui.js';
|
|
5
|
+
export const OPEN_BOT_ONBOARDING_EVENT = 'botmux:open-bot-onboarding';
|
|
6
|
+
const DEFAULT_CLI_OPTION = { id: 'claude-code', label: 'Claude' };
|
|
7
|
+
const DEFAULT_TTADK_MODEL = 'glm-5.1';
|
|
8
|
+
function defaultCliOptionsState() {
|
|
9
|
+
return {
|
|
10
|
+
options: [DEFAULT_CLI_OPTION],
|
|
11
|
+
ttadkModelDefault: DEFAULT_TTADK_MODEL,
|
|
12
|
+
ttadkModelSuggestions: [],
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function defaultFormState() {
|
|
16
|
+
return {
|
|
17
|
+
cliId: DEFAULT_CLI_OPTION.id,
|
|
18
|
+
dirMode: 'fixed',
|
|
19
|
+
workingDir: '~',
|
|
20
|
+
model: '',
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function caughtErrorText(error) {
|
|
24
|
+
return error instanceof Error ? error.message : String(error);
|
|
12
25
|
}
|
|
13
|
-
function
|
|
14
|
-
|
|
15
|
-
return dialog;
|
|
16
|
-
dialog = document.createElement('dialog');
|
|
17
|
-
dialog.className = 'onboarding-dialog';
|
|
18
|
-
document.body.appendChild(dialog);
|
|
19
|
-
dialog.addEventListener('close', stopPolling);
|
|
20
|
-
return dialog;
|
|
26
|
+
function shouldStopPolling(job) {
|
|
27
|
+
return job.status === 'completed' || job.status === 'failed' || job.status === 'needs_owner';
|
|
21
28
|
}
|
|
22
29
|
function statusText(job) {
|
|
23
30
|
if (job.status === 'waiting_for_scan')
|
|
@@ -36,315 +43,263 @@ function statusText(job) {
|
|
|
36
43
|
if (job.status === 'completed')
|
|
37
44
|
return t('botOnboarding.completed');
|
|
38
45
|
if (job.status === 'failed')
|
|
39
|
-
return `${t('botOnboarding.failed')}: ${
|
|
46
|
+
return `${t('botOnboarding.failed')}: ${job.message ?? job.error ?? 'unknown'}`;
|
|
40
47
|
return t('botOnboarding.starting');
|
|
41
48
|
}
|
|
42
|
-
/** 完成页 / 待填 owner 页的权限摘要 / 手动兜底步骤. */
|
|
43
|
-
function permissionBlock(job) {
|
|
44
|
-
if ((job.status !== 'completed' && job.status !== 'needs_owner') || !job.permission)
|
|
45
|
-
return '';
|
|
46
|
-
const p = job.permission;
|
|
47
|
-
if (p.ok) {
|
|
48
|
-
const parts = [t('botOnboarding.permissionOk', { count: p.scopeCount ?? 0 })];
|
|
49
|
-
if (p.skippedScopeCount && p.skippedScopeCount > 0) {
|
|
50
|
-
parts.push(t('botOnboarding.permissionSkipped', { count: p.skippedScopeCount }));
|
|
51
|
-
}
|
|
52
|
-
if (p.versionId)
|
|
53
|
-
parts.push(t('botOnboarding.permissionVersion', { version: escapeHtml(p.versionId) }));
|
|
54
|
-
let html = `<p class="hint-ok">✅ ${parts.join(' ')}</p>`;
|
|
55
|
-
if (p.scopeWarning)
|
|
56
|
-
html += `<p class="hint-warn">⚠️ ${escapeHtml(p.scopeWarning)}</p>`;
|
|
57
|
-
return html;
|
|
58
|
-
}
|
|
59
|
-
// 自动配置失败 → 手动步骤深链
|
|
60
|
-
const steps = (job.remainingSteps ?? [])
|
|
61
|
-
.map(s => `<li><a href="${escapeHtml(s.url)}" target="_blank" rel="noopener">${escapeHtml(s.title)}</a></li>`)
|
|
62
|
-
.join('');
|
|
63
|
-
return `<p class="hint-warn">⚠️ ${t('botOnboarding.permissionManual')}${p.message ? `(${escapeHtml(p.message)})` : ''}</p>`
|
|
64
|
-
+ (steps ? `<ol class="onboarding-steps">${steps}</ol>` : '');
|
|
65
|
-
}
|
|
66
|
-
/** needs_owner:扫码人身份验证不了, 让用户手动填 owner (带内联报错). */
|
|
67
|
-
function ownerBlock(job, ownerError) {
|
|
68
|
-
if (job.status !== 'needs_owner')
|
|
69
|
-
return '';
|
|
70
|
-
const errorHtml = ownerError ? `<p class="form-error">${escapeHtml(ownerError)}</p>` : '';
|
|
71
|
-
return `<form id="ob-owner-form" class="onboarding-form">
|
|
72
|
-
<label class="onboarding-field">
|
|
73
|
-
<span>${t('botOnboarding.ownerLabel')}</span>
|
|
74
|
-
<input id="ob-owner" type="text" placeholder="${t('botOnboarding.ownerPlaceholder')}" autocomplete="off" spellcheck="false">
|
|
75
|
-
</label>
|
|
76
|
-
<p class="hint-warn">${t('botOnboarding.ownerHint')}</p>
|
|
77
|
-
${errorHtml}
|
|
78
|
-
<menu class="onboarding-actions">
|
|
79
|
-
<button type="submit" class="primary">${t('botOnboarding.ownerSubmit')}</button>
|
|
80
|
-
</menu>
|
|
81
|
-
</form>`;
|
|
82
|
-
}
|
|
83
|
-
function renderJob(job, ownerError) {
|
|
84
|
-
const d = ensureDialog();
|
|
85
|
-
// 第 1 个二维码: 扫码建应用
|
|
86
|
-
const appQr = job.status === 'waiting_for_scan' && job.qrDataUrl
|
|
87
|
-
? `<div class="qr-card">
|
|
88
|
-
<img class="qr-image" src="${job.qrDataUrl}" alt="${t('botOnboarding.qrAlt')}">
|
|
89
|
-
${job.qrUrl ? `<a class="onboarding-link" href="${escapeHtml(job.qrUrl)}" target="_blank" rel="noopener">${t('botOnboarding.openLink')}</a>` : ''}
|
|
90
|
-
</div>`
|
|
91
|
-
: '';
|
|
92
|
-
// 第 2 个二维码: 扫码登录开放平台 (自动配权限用; 它是 payload, 没有可点链接)
|
|
93
|
-
const platformQr = job.status === 'waiting_for_platform_scan' && job.platformQrDataUrl
|
|
94
|
-
? `<div class="qr-card">
|
|
95
|
-
<img class="qr-image" src="${job.platformQrDataUrl}" alt="${t('botOnboarding.platformQrAlt')}">
|
|
96
|
-
</div>`
|
|
97
|
-
: '';
|
|
98
|
-
const metaLine = job.appId
|
|
99
|
-
? `<p><b>App ID:</b> <code>${escapeHtml(job.appId)}</code>`
|
|
100
|
-
+ (job.cliId ? ` | <b>CLI:</b> <code>${escapeHtml(job.cliId)}</code>` : '')
|
|
101
|
-
+ (job.workingDir ? ` | <b>${t('botOnboarding.metaDir')}:</b> <code>${escapeHtml(job.workingDir)}</code>` : '')
|
|
102
|
-
+ `</p>`
|
|
103
|
-
: '';
|
|
104
|
-
// 落盘完成后:新 bot 已自动上线(start-bot 成功)→ 「无需重启」;否则回退到重启提示。
|
|
105
|
-
const restartHint = job.status === 'completed'
|
|
106
|
-
? (job.liveStarted
|
|
107
|
-
? `<p class="hint-ok">${t('botOnboarding.liveOk')}</p>`
|
|
108
|
-
: `<p class="hint-ok">${t('botOnboarding.restartHint')}</p>`)
|
|
109
|
-
: '';
|
|
110
|
-
d.innerHTML = `<article>
|
|
111
|
-
<header>
|
|
112
|
-
<h3>${t('botOnboarding.title')}</h3>
|
|
113
|
-
<p>${t('botOnboarding.intro')}</p>
|
|
114
|
-
</header>
|
|
115
|
-
<p class="onboarding-status status-${job.status}">${statusText(job)}</p>
|
|
116
|
-
${appQr}
|
|
117
|
-
${platformQr}
|
|
118
|
-
${metaLine}
|
|
119
|
-
${permissionBlock(job)}
|
|
120
|
-
${ownerBlock(job, ownerError)}
|
|
121
|
-
${restartHint}
|
|
122
|
-
<form method="dialog"><button>${t('botOnboarding.close')}</button></form>
|
|
123
|
-
</article>`;
|
|
124
|
-
// needs_owner:把提交挂上去 (走 /owner 端点, 通过校验后转 completed)。
|
|
125
|
-
if (job.status === 'needs_owner') {
|
|
126
|
-
const ownerForm = d.querySelector('#ob-owner-form');
|
|
127
|
-
ownerForm?.addEventListener('submit', ev => {
|
|
128
|
-
ev.preventDefault();
|
|
129
|
-
const owner = d.querySelector('#ob-owner')?.value ?? '';
|
|
130
|
-
void submitOwner(job, owner);
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
async function submitOwner(job, ownerRaw) {
|
|
135
|
-
if (!ownerRaw.trim()) {
|
|
136
|
-
renderJob(job, t('botOnboarding.ownerEmpty'));
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
try {
|
|
140
|
-
const res = await fetch(`/api/bot-onboarding/${encodeURIComponent(job.id)}/owner`, {
|
|
141
|
-
method: 'POST',
|
|
142
|
-
headers: { 'content-type': 'application/json' },
|
|
143
|
-
body: JSON.stringify({ owner: ownerRaw.trim() }),
|
|
144
|
-
});
|
|
145
|
-
const body = await res.json();
|
|
146
|
-
if (!res.ok) {
|
|
147
|
-
// 校验失败 (格式 / 不可用): 留在 needs_owner 内联报错, 不丢已填值的语义。
|
|
148
|
-
renderJob(job, body?.message ?? body?.error ?? t('botOnboarding.ownerInvalid'));
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
if (body?.job)
|
|
152
|
-
renderJob(body.job);
|
|
153
|
-
}
|
|
154
|
-
catch (err) {
|
|
155
|
-
renderJob(job, err instanceof Error ? err.message : String(err));
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
49
|
async function fetchCliOptions() {
|
|
159
50
|
try {
|
|
160
51
|
const res = await fetch('/api/cli-options');
|
|
161
52
|
const body = await res.json();
|
|
162
53
|
if (res.ok && Array.isArray(body?.options)) {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
return
|
|
54
|
+
const ttadkModelDefault = typeof body.ttadkModelDefault === 'string' && body.ttadkModelDefault.trim()
|
|
55
|
+
? body.ttadkModelDefault.trim()
|
|
56
|
+
: DEFAULT_TTADK_MODEL;
|
|
57
|
+
const ttadkModelSuggestions = Array.isArray(body.ttadkModelSuggestions)
|
|
58
|
+
? body.ttadkModelSuggestions.filter((item) => typeof item === 'string')
|
|
59
|
+
: [];
|
|
60
|
+
return {
|
|
61
|
+
options: body.options,
|
|
62
|
+
ttadkModelDefault,
|
|
63
|
+
ttadkModelSuggestions,
|
|
64
|
+
};
|
|
170
65
|
}
|
|
171
66
|
}
|
|
172
67
|
catch { /* fall through to default */ }
|
|
173
|
-
return
|
|
68
|
+
return defaultCliOptionsState();
|
|
174
69
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
* 仅在切换到「之前不是同类」时回填默认值, 不覆盖用户已手填的内容。
|
|
181
|
-
*/
|
|
182
|
-
function syncModelFieldForCli(opts) {
|
|
183
|
-
const d = dialog;
|
|
184
|
-
if (!d)
|
|
185
|
-
return;
|
|
186
|
-
const cli = d.querySelector('#ob-cli');
|
|
187
|
-
const model = d.querySelector('#ob-model');
|
|
188
|
-
const list = d.querySelector('#ob-model-suggestions');
|
|
189
|
-
if (!cli || !model)
|
|
190
|
-
return;
|
|
191
|
-
const opt = opts.find(o => o.id === cli.value);
|
|
192
|
-
const isTtadk = opt?.gateway === 'ttadk';
|
|
193
|
-
const acceptsModel = isTtadk && opt?.acceptsModel !== false;
|
|
70
|
+
function syncModelForCli(form, cliId, cliState) {
|
|
71
|
+
const option = cliState.options.find(item => item.id === cliId);
|
|
72
|
+
const isTtadk = option?.gateway === 'ttadk';
|
|
73
|
+
const acceptsModel = isTtadk && option?.acceptsModel !== false;
|
|
74
|
+
let model = form.model;
|
|
194
75
|
if (isTtadk && !acceptsModel) {
|
|
195
|
-
|
|
196
|
-
model.value = '';
|
|
197
|
-
model.disabled = true;
|
|
198
|
-
model.placeholder = t('botOnboarding.modelTtadkCocoPlaceholder');
|
|
199
|
-
return;
|
|
76
|
+
model = '';
|
|
200
77
|
}
|
|
201
|
-
model.
|
|
202
|
-
|
|
203
|
-
if (list)
|
|
204
|
-
list.innerHTML = ttadkModelSuggestions.map(m => `<option value="${escapeHtml(m)}"></option>`).join('');
|
|
205
|
-
model.placeholder = t('botOnboarding.modelTtadkPlaceholder').replace('{model}', ttadkModelDefault);
|
|
206
|
-
// 切到 ttadk 且用户没手填 → 回填默认模型, 让「不写 wrapper、开箱即用」成立.
|
|
207
|
-
if (!model.value.trim())
|
|
208
|
-
model.value = ttadkModelDefault;
|
|
78
|
+
else if (acceptsModel && !model.trim()) {
|
|
79
|
+
model = cliState.ttadkModelDefault;
|
|
209
80
|
}
|
|
210
|
-
else {
|
|
211
|
-
|
|
212
|
-
list.innerHTML = '';
|
|
213
|
-
model.placeholder = t('botOnboarding.modelPlaceholder');
|
|
214
|
-
// 从 ttadk 切回普通 CLI: 清掉之前回填的 ttadk 默认模型, 避免误带.
|
|
215
|
-
if (model.value.trim() === ttadkModelDefault)
|
|
216
|
-
model.value = '';
|
|
81
|
+
else if (!acceptsModel && model.trim() === cliState.ttadkModelDefault) {
|
|
82
|
+
model = '';
|
|
217
83
|
}
|
|
84
|
+
return { ...form, cliId, model };
|
|
218
85
|
}
|
|
219
|
-
function
|
|
220
|
-
const
|
|
221
|
-
|
|
222
|
-
.
|
|
223
|
-
|
|
224
|
-
const errorHtml = errorMsg ? `<p class="form-error">${escapeHtml(errorMsg)}</p>` : '';
|
|
225
|
-
d.innerHTML = `<article>
|
|
226
|
-
<header>
|
|
227
|
-
<h3>${t('botOnboarding.title')}</h3>
|
|
228
|
-
<p>${t('botOnboarding.intro')}</p>
|
|
229
|
-
</header>
|
|
230
|
-
<form id="onboarding-form" class="onboarding-form">
|
|
231
|
-
<label class="onboarding-field">
|
|
232
|
-
<span>${t('botOnboarding.cliLabel')}</span>
|
|
233
|
-
<select id="ob-cli">${optionHtml}</select>
|
|
234
|
-
</label>
|
|
235
|
-
<label class="onboarding-field">
|
|
236
|
-
<span>${t('botOnboarding.dirModeLabel')}</span>
|
|
237
|
-
<select id="ob-dir-mode">
|
|
238
|
-
<option value="fixed">${t('botOnboarding.dirModeFixed')}</option>
|
|
239
|
-
<option value="card">${t('botOnboarding.dirModeCard')}</option>
|
|
240
|
-
</select>
|
|
241
|
-
</label>
|
|
242
|
-
<label class="onboarding-field">
|
|
243
|
-
<span id="ob-dir-label">${t('botOnboarding.dirLabelFixed')}</span>
|
|
244
|
-
<input id="ob-dir" type="text" value="~" placeholder="${t('botOnboarding.dirPlaceholderFixed')}" autocomplete="off" spellcheck="false">
|
|
245
|
-
</label>
|
|
246
|
-
<label class="onboarding-field">
|
|
247
|
-
<span>${t('botOnboarding.modelLabel')}</span>
|
|
248
|
-
<input id="ob-model" type="text" list="ob-model-suggestions" placeholder="${t('botOnboarding.modelPlaceholder')}" autocomplete="off" spellcheck="false">
|
|
249
|
-
<datalist id="ob-model-suggestions"></datalist>
|
|
250
|
-
</label>
|
|
251
|
-
${errorHtml}
|
|
252
|
-
<menu class="onboarding-actions">
|
|
253
|
-
<button type="button" id="ob-cancel">${t('botOnboarding.cancel')}</button>
|
|
254
|
-
<button type="submit" class="primary">${t('botOnboarding.startScan')}</button>
|
|
255
|
-
</menu>
|
|
256
|
-
</form>
|
|
257
|
-
</article>`;
|
|
258
|
-
const form = d.querySelector('#onboarding-form');
|
|
259
|
-
const cancel = d.querySelector('#ob-cancel');
|
|
260
|
-
cancel?.addEventListener('click', () => d.close());
|
|
261
|
-
// ttadk 网关项: 选中时把模型框默认成 ttadk 默认模型 + 挂候选 (CoCo 禁用).
|
|
262
|
-
const cliSelect = d.querySelector('#ob-cli');
|
|
263
|
-
cliSelect?.addEventListener('change', () => syncModelFieldForCli(options));
|
|
264
|
-
syncModelFieldForCli(options);
|
|
265
|
-
// 目录模式切换时同步目录框的标签/占位文案(fixed=固定默认目录 / card=扫描根)。
|
|
266
|
-
const dirModeSelect = d.querySelector('#ob-dir-mode');
|
|
267
|
-
const syncDirField = () => {
|
|
268
|
-
const mode = dirModeSelect?.value === 'card' ? 'card' : 'fixed';
|
|
269
|
-
const label = d.querySelector('#ob-dir-label');
|
|
270
|
-
const dirInput = d.querySelector('#ob-dir');
|
|
271
|
-
if (label)
|
|
272
|
-
label.textContent = mode === 'card' ? t('botOnboarding.dirLabelCard') : t('botOnboarding.dirLabelFixed');
|
|
273
|
-
if (dirInput)
|
|
274
|
-
dirInput.placeholder = mode === 'card' ? t('botOnboarding.dirPlaceholderCard') : t('botOnboarding.dirPlaceholderFixed');
|
|
275
|
-
};
|
|
276
|
-
dirModeSelect?.addEventListener('change', syncDirField);
|
|
277
|
-
form?.addEventListener('submit', ev => {
|
|
278
|
-
ev.preventDefault();
|
|
279
|
-
const cliId = d.querySelector('#ob-cli')?.value ?? '';
|
|
280
|
-
const workingDir = d.querySelector('#ob-dir')?.value ?? '';
|
|
281
|
-
const dirMode = d.querySelector('#ob-dir-mode')?.value === 'card' ? 'card' : 'fixed';
|
|
282
|
-
const model = d.querySelector('#ob-model')?.value ?? '';
|
|
283
|
-
void startOnboarding({ cliId, workingDir, dirMode, model }, options);
|
|
284
|
-
});
|
|
86
|
+
function normalizeFormForOptions(form, cliState) {
|
|
87
|
+
const cliId = cliState.options.some(item => item.id === form.cliId)
|
|
88
|
+
? form.cliId
|
|
89
|
+
: cliState.options[0]?.id ?? DEFAULT_CLI_OPTION.id;
|
|
90
|
+
return syncModelForCli(form, cliId, cliState);
|
|
285
91
|
}
|
|
286
|
-
async function
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
}),
|
|
299
|
-
});
|
|
300
|
-
const body = await res.json();
|
|
301
|
-
// 校验类错误 (目录不存在 / CLI 非法): 回到表单内联报错, 不丢用户已填的值.
|
|
302
|
-
if (res.status === 400) {
|
|
303
|
-
renderForm(options, body?.message ?? body?.error ?? 'invalid_input');
|
|
304
|
-
return;
|
|
92
|
+
export async function openBotOnboarding() {
|
|
93
|
+
window.dispatchEvent(new Event(OPEN_BOT_ONBOARDING_EVENT));
|
|
94
|
+
}
|
|
95
|
+
function PermissionSummary(props) {
|
|
96
|
+
const { job } = props;
|
|
97
|
+
if ((job.status !== 'completed' && job.status !== 'needs_owner') || !job.permission)
|
|
98
|
+
return null;
|
|
99
|
+
const permission = job.permission;
|
|
100
|
+
if (permission.ok) {
|
|
101
|
+
const parts = [t('botOnboarding.permissionOk', { count: permission.scopeCount ?? 0 })];
|
|
102
|
+
if (permission.skippedScopeCount && permission.skippedScopeCount > 0) {
|
|
103
|
+
parts.push(t('botOnboarding.permissionSkipped', { count: permission.skippedScopeCount }));
|
|
305
104
|
}
|
|
306
|
-
if (
|
|
105
|
+
if (permission.versionId)
|
|
106
|
+
parts.push(t('botOnboarding.permissionVersion', { version: permission.versionId }));
|
|
107
|
+
return (_jsxs(_Fragment, { children: [_jsx("p", { className: "hint-ok", children: parts.join(' ') }), permission.scopeWarning ? _jsx("p", { className: "hint-warn", children: permission.scopeWarning }) : null] }));
|
|
108
|
+
}
|
|
109
|
+
const steps = job.remainingSteps ?? [];
|
|
110
|
+
return (_jsxs(_Fragment, { children: [_jsxs("p", { className: "hint-warn", children: [t('botOnboarding.permissionManual'), permission.message ? `(${permission.message})` : ''] }), steps.length ? (_jsx("ol", { className: "onboarding-steps", children: steps.map(step => (_jsx("li", { children: _jsx("a", { href: step.url, target: "_blank", rel: "noopener", children: step.title }) }, `${step.title}:${step.url}`))) })) : null] }));
|
|
111
|
+
}
|
|
112
|
+
function OnboardingMeta(props) {
|
|
113
|
+
const { job } = props;
|
|
114
|
+
if (!job.appId)
|
|
115
|
+
return null;
|
|
116
|
+
return (_jsxs("p", { className: "onboarding-meta", children: [_jsx("b", { children: "App ID:" }), " ", _jsx("code", { children: job.appId }), job.cliId ? _jsxs(_Fragment, { children: [_jsx("span", { children: " / " }), _jsx("b", { children: "CLI:" }), " ", _jsx("code", { children: job.cliId })] }) : null, job.workingDir ? _jsxs(_Fragment, { children: [_jsx("span", { children: " / " }), _jsxs("b", { children: [t('botOnboarding.metaDir'), ":"] }), " ", _jsx("code", { children: job.workingDir })] }) : null] }));
|
|
117
|
+
}
|
|
118
|
+
function QrCard(props) {
|
|
119
|
+
return (_jsxs("div", { className: "qr-card", children: [_jsx("img", { className: "qr-image", src: props.dataUrl, alt: props.alt }), props.link ? (_jsx("a", { className: "onboarding-link", href: props.link, target: "_blank", rel: "noopener", children: t('botOnboarding.openLink') })) : null] }));
|
|
120
|
+
}
|
|
121
|
+
function onboardingOptionLabel(options, value) {
|
|
122
|
+
return options.find(option => option.value === value)?.label ?? value;
|
|
123
|
+
}
|
|
124
|
+
function OnboardingJobView(props) {
|
|
125
|
+
const { job, ownerError } = props.view;
|
|
126
|
+
return (_jsxs(_Fragment, { children: [_jsx("p", { className: `onboarding-status status-${job.status}`, children: statusText(job) }), job.status === 'waiting_for_scan' && job.qrDataUrl ? (_jsx(QrCard, { dataUrl: job.qrDataUrl, alt: t('botOnboarding.qrAlt'), link: job.qrUrl })) : null, job.status === 'waiting_for_platform_scan' && job.platformQrDataUrl ? (_jsx(QrCard, { dataUrl: job.platformQrDataUrl, alt: t('botOnboarding.platformQrAlt') })) : null, _jsx(OnboardingMeta, { job: job }), _jsx(PermissionSummary, { job: job }), job.status === 'needs_owner' ? (_jsxs("form", { className: "onboarding-form", id: "ob-owner-form", onSubmit: event => {
|
|
127
|
+
event.preventDefault();
|
|
128
|
+
props.onSubmitOwner(job, props.ownerInput);
|
|
129
|
+
}, children: [_jsxs("label", { className: "onboarding-field", children: [_jsx("span", { children: t('botOnboarding.ownerLabel') }), _jsx("input", { id: "ob-owner", type: "text", placeholder: t('botOnboarding.ownerPlaceholder'), autoComplete: "off", spellCheck: false, value: props.ownerInput, onChange: event => props.onOwnerInputChange(event.currentTarget.value) })] }), _jsx("p", { className: "hint-warn", children: t('botOnboarding.ownerHint') }), ownerError ? _jsx("p", { className: "form-error", children: ownerError }) : null, _jsxs("div", { className: "actions onboarding-actions", children: [_jsx("button", { type: "button", onClick: props.onClose, children: t('botOnboarding.close') }), _jsx("button", { type: "submit", className: "primary onboarding-submit", children: t('botOnboarding.ownerSubmit') })] })] })) : null, job.status === 'completed' ? (_jsx("p", { className: "hint-ok", children: job.liveStarted ? t('botOnboarding.liveOk') : t('botOnboarding.restartHint') })) : null, job.status !== 'needs_owner' ? _jsx("div", { className: "actions onboarding-actions", children: _jsx("button", { type: "button", onClick: props.onClose, children: t('botOnboarding.close') }) }) : null] }));
|
|
130
|
+
}
|
|
131
|
+
function OnboardingForm(props) {
|
|
132
|
+
const selectedCli = props.cliState.options.find(option => option.id === props.form.cliId);
|
|
133
|
+
const acceptsModel = selectedCli?.gateway === 'ttadk' && selectedCli.acceptsModel !== false;
|
|
134
|
+
const modelDisabled = selectedCli?.gateway === 'ttadk' && selectedCli.acceptsModel === false;
|
|
135
|
+
const modelPlaceholder = modelDisabled
|
|
136
|
+
? t('botOnboarding.modelTtadkCocoPlaceholder')
|
|
137
|
+
: acceptsModel
|
|
138
|
+
? t('botOnboarding.modelTtadkPlaceholder').replace('{model}', props.cliState.ttadkModelDefault)
|
|
139
|
+
: t('botOnboarding.modelPlaceholder');
|
|
140
|
+
const dirLabel = props.form.dirMode === 'card' ? t('botOnboarding.dirLabelCard') : t('botOnboarding.dirLabelFixed');
|
|
141
|
+
const dirPlaceholder = props.form.dirMode === 'card'
|
|
142
|
+
? t('botOnboarding.dirPlaceholderCard')
|
|
143
|
+
: t('botOnboarding.dirPlaceholderFixed');
|
|
144
|
+
const cliOptions = props.cliState.options.map(option => ({
|
|
145
|
+
value: option.id,
|
|
146
|
+
label: `${option.label}(${option.id})`,
|
|
147
|
+
}));
|
|
148
|
+
const dirModeOptions = [
|
|
149
|
+
{ value: 'fixed', label: t('botOnboarding.dirModeFixed') },
|
|
150
|
+
{ value: 'card', label: t('botOnboarding.dirModeCard') },
|
|
151
|
+
];
|
|
152
|
+
return (_jsxs("form", { id: "onboarding-form", className: "onboarding-form", onSubmit: props.onSubmit, children: [_jsxs("div", { className: "onboarding-field", children: [_jsx("span", { children: t('botOnboarding.cliLabel') }), _jsx(DropdownMenu, { id: "ob-cli", className: "onboarding-menu", ariaLabel: t('botOnboarding.cliLabel'), label: onboardingOptionLabel(cliOptions, props.form.cliId), value: props.form.cliId, options: cliOptions, onChange: cliId => {
|
|
153
|
+
props.onFormChange(syncModelForCli(props.form, cliId, props.cliState));
|
|
154
|
+
} })] }), _jsxs("div", { className: "onboarding-field", children: [_jsx("span", { children: t('botOnboarding.dirModeLabel') }), _jsx(DropdownMenu, { id: "ob-dir-mode", className: "onboarding-menu", ariaLabel: t('botOnboarding.dirModeLabel'), label: onboardingOptionLabel(dirModeOptions, props.form.dirMode), value: props.form.dirMode, options: dirModeOptions, onChange: dirMode => props.onFormChange({ ...props.form, dirMode }) })] }), _jsxs("label", { className: "onboarding-field", children: [_jsx("span", { children: dirLabel }), _jsx("input", { id: "ob-dir", type: "text", value: props.form.workingDir, placeholder: dirPlaceholder, autoComplete: "off", spellCheck: false, onChange: event => props.onFormChange({ ...props.form, workingDir: event.currentTarget.value }) })] }), _jsxs("label", { className: "onboarding-field", children: [_jsx("span", { children: t('botOnboarding.modelLabel') }), _jsx("input", { id: "ob-model", type: "text", list: acceptsModel ? 'ob-model-suggestions' : undefined, placeholder: modelPlaceholder, autoComplete: "off", spellCheck: false, disabled: modelDisabled, value: props.form.model, onChange: event => props.onFormChange({ ...props.form, model: event.currentTarget.value }) }), acceptsModel ? (_jsx("datalist", { id: "ob-model-suggestions", children: props.cliState.ttadkModelSuggestions.map(model => _jsx("option", { value: model }, model)) })) : null] }), props.error ? _jsx("p", { className: "form-error", children: props.error }) : null, _jsxs("div", { className: "actions onboarding-actions", children: [_jsx("button", { type: "button", id: "ob-cancel", disabled: props.submitting, onClick: props.onClose, children: t('botOnboarding.cancel') }), _jsx("button", { type: "submit", className: "primary onboarding-submit", disabled: props.submitting, children: props.submitting ? t('botOnboarding.starting') : t('botOnboarding.startScan') })] })] }));
|
|
155
|
+
}
|
|
156
|
+
export function BotOnboardingDialog(props) {
|
|
157
|
+
const dialogRef = useRef(null);
|
|
158
|
+
const pollTimerRef = useRef(null);
|
|
159
|
+
const loadSeqRef = useRef(0);
|
|
160
|
+
const [cliState, setCliState] = useState(() => defaultCliOptionsState());
|
|
161
|
+
const [form, setForm] = useState(() => defaultFormState());
|
|
162
|
+
const [view, setView] = useState({ kind: 'form' });
|
|
163
|
+
const [submitting, setSubmitting] = useState(false);
|
|
164
|
+
const [ownerInput, setOwnerInput] = useState('');
|
|
165
|
+
const stopPolling = useCallback(() => {
|
|
166
|
+
if (pollTimerRef.current !== null) {
|
|
167
|
+
window.clearInterval(pollTimerRef.current);
|
|
168
|
+
pollTimerRef.current = null;
|
|
169
|
+
}
|
|
170
|
+
}, []);
|
|
171
|
+
const close = useCallback(() => {
|
|
172
|
+
stopPolling();
|
|
173
|
+
props.onClose();
|
|
174
|
+
}, [props, stopPolling]);
|
|
175
|
+
const applyJob = useCallback((job) => {
|
|
176
|
+
setView({ kind: 'job', job });
|
|
177
|
+
if (job.status === 'needs_owner')
|
|
178
|
+
setOwnerInput('');
|
|
179
|
+
if (shouldStopPolling(job))
|
|
180
|
+
stopPolling();
|
|
181
|
+
}, [stopPolling]);
|
|
182
|
+
const pollJob = useCallback(async (id) => {
|
|
183
|
+
const res = await fetch(`/api/bot-onboarding/${encodeURIComponent(id)}`);
|
|
184
|
+
const body = await res.json();
|
|
185
|
+
if (!res.ok || !body?.job)
|
|
307
186
|
throw new Error(body?.error ?? `http_${res.status}`);
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
187
|
+
applyJob(body.job);
|
|
188
|
+
}, [applyJob]);
|
|
189
|
+
const startPolling = useCallback((id) => {
|
|
190
|
+
stopPolling();
|
|
191
|
+
pollTimerRef.current = window.setInterval(() => {
|
|
192
|
+
void pollJob(id).catch(error => {
|
|
311
193
|
stopPolling();
|
|
312
|
-
|
|
194
|
+
setView({ kind: 'job', job: { id, status: 'failed', message: caughtErrorText(error) } });
|
|
313
195
|
});
|
|
314
196
|
}, 1200);
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
renderJob({ id: '', status: 'failed', message: err instanceof Error ? err.message : String(err) });
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
async function pollJob(id) {
|
|
321
|
-
const res = await fetch(`/api/bot-onboarding/${encodeURIComponent(id)}`);
|
|
322
|
-
const body = await res.json();
|
|
323
|
-
if (!res.ok || !body?.job)
|
|
324
|
-
throw new Error(body?.error ?? `http_${res.status}`);
|
|
325
|
-
renderJob(body.job);
|
|
326
|
-
// needs_owner 也停轮询:它是等用户操作的状态, 继续轮询会周期性重渲染、清掉用户
|
|
327
|
-
// 正在输入的 owner。后续由 owner 提交流程驱动渲染。
|
|
328
|
-
if (body.job.status === 'completed' || body.job.status === 'failed' || body.job.status === 'needs_owner') {
|
|
197
|
+
}, [pollJob, stopPolling]);
|
|
198
|
+
const resetToForm = useCallback(() => {
|
|
329
199
|
stopPolling();
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
200
|
+
const seq = loadSeqRef.current + 1;
|
|
201
|
+
loadSeqRef.current = seq;
|
|
202
|
+
const initialCliState = defaultCliOptionsState();
|
|
203
|
+
setCliState(initialCliState);
|
|
204
|
+
setForm(defaultFormState());
|
|
205
|
+
setView({ kind: 'form' });
|
|
206
|
+
setSubmitting(false);
|
|
207
|
+
setOwnerInput('');
|
|
208
|
+
void fetchCliOptions().then(next => {
|
|
209
|
+
if (loadSeqRef.current !== seq)
|
|
210
|
+
return;
|
|
211
|
+
setCliState(next);
|
|
212
|
+
setForm(current => normalizeFormForOptions(current, next));
|
|
213
|
+
});
|
|
214
|
+
}, [stopPolling]);
|
|
215
|
+
useEffect(() => {
|
|
216
|
+
if (props.open) {
|
|
217
|
+
resetToForm();
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
stopPolling();
|
|
221
|
+
loadSeqRef.current += 1;
|
|
222
|
+
}, [props.open, resetToForm, stopPolling]);
|
|
223
|
+
useEffect(() => {
|
|
224
|
+
const dialog = dialogRef.current;
|
|
225
|
+
if (!dialog)
|
|
226
|
+
return;
|
|
227
|
+
if (props.open && !dialog.open) {
|
|
228
|
+
try {
|
|
229
|
+
dialog.showModal();
|
|
230
|
+
}
|
|
231
|
+
catch { /* already opening/unsupported */ }
|
|
232
|
+
}
|
|
233
|
+
else if (!props.open && dialog.open) {
|
|
234
|
+
dialog.close();
|
|
235
|
+
}
|
|
236
|
+
}, [props.open]);
|
|
237
|
+
useEffect(() => () => stopPolling(), [stopPolling]);
|
|
238
|
+
const submitForm = useCallback(async (event) => {
|
|
239
|
+
event.preventDefault();
|
|
240
|
+
stopPolling();
|
|
241
|
+
setSubmitting(true);
|
|
242
|
+
setView({ kind: 'job', job: { id: '', status: 'starting' } });
|
|
243
|
+
try {
|
|
244
|
+
const res = await fetch('/api/bot-onboarding/start', {
|
|
245
|
+
method: 'POST',
|
|
246
|
+
headers: { 'content-type': 'application/json' },
|
|
247
|
+
body: JSON.stringify({
|
|
248
|
+
cliId: form.cliId,
|
|
249
|
+
workingDir: form.workingDir.trim(),
|
|
250
|
+
dirMode: form.dirMode,
|
|
251
|
+
model: form.model.trim() || undefined,
|
|
252
|
+
}),
|
|
253
|
+
});
|
|
254
|
+
const body = await res.json();
|
|
255
|
+
if (res.status === 400) {
|
|
256
|
+
setView({ kind: 'form', error: body?.message ?? body?.error ?? 'invalid_input' });
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
if (!res.ok || !body?.job?.id)
|
|
260
|
+
throw new Error(body?.error ?? `http_${res.status}`);
|
|
261
|
+
const job = body.job;
|
|
262
|
+
applyJob(job);
|
|
263
|
+
if (!shouldStopPolling(job))
|
|
264
|
+
startPolling(job.id);
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
setView({ kind: 'job', job: { id: '', status: 'failed', message: caughtErrorText(error) } });
|
|
268
|
+
}
|
|
269
|
+
finally {
|
|
270
|
+
setSubmitting(false);
|
|
271
|
+
}
|
|
272
|
+
}, [applyJob, form, startPolling, stopPolling]);
|
|
273
|
+
const submitOwner = useCallback(async (job, ownerRaw) => {
|
|
274
|
+
if (!ownerRaw.trim()) {
|
|
275
|
+
setView({ kind: 'job', job, ownerError: t('botOnboarding.ownerEmpty') });
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
try {
|
|
279
|
+
const res = await fetch(`/api/bot-onboarding/${encodeURIComponent(job.id)}/owner`, {
|
|
280
|
+
method: 'POST',
|
|
281
|
+
headers: { 'content-type': 'application/json' },
|
|
282
|
+
body: JSON.stringify({ owner: ownerRaw.trim() }),
|
|
283
|
+
});
|
|
284
|
+
const body = await res.json();
|
|
285
|
+
if (!res.ok) {
|
|
286
|
+
setView({ kind: 'job', job, ownerError: body?.message ?? body?.error ?? t('botOnboarding.ownerInvalid') });
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
if (body?.job)
|
|
290
|
+
applyJob(body.job);
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
setView({ kind: 'job', job, ownerError: caughtErrorText(error) });
|
|
294
|
+
}
|
|
295
|
+
}, [applyJob]);
|
|
296
|
+
const body = useMemo(() => {
|
|
297
|
+
if (view.kind === 'form') {
|
|
298
|
+
return (_jsx(OnboardingForm, { cliState: cliState, form: form, error: view.error, submitting: submitting, onFormChange: setForm, onSubmit: submitForm, onClose: close }));
|
|
299
|
+
}
|
|
300
|
+
return (_jsx(OnboardingJobView, { view: view, ownerInput: ownerInput, onOwnerInputChange: setOwnerInput, onSubmitOwner: submitOwner, onClose: close }));
|
|
301
|
+
}, [cliState, close, form, ownerInput, submitForm, submitOwner, submitting, view]);
|
|
302
|
+
return (_jsx("dialog", { className: "onboarding-dialog", ref: dialogRef, onClose: close, onClick: event => { if (event.target === event.currentTarget)
|
|
303
|
+
close(); }, children: _jsxs("article", { className: "onboarding-card", children: [_jsxs("header", { className: "onboarding-header", children: [_jsx("h3", { children: t('botOnboarding.title') }), _jsx("p", { children: t('botOnboarding.intro') })] }), body] }) }));
|
|
349
304
|
}
|
|
350
305
|
//# sourceMappingURL=bot-onboarding.js.map
|