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,149 +0,0 @@
|
|
|
1
|
-
import{a as xt,b as st,c as rt}from"./chunk-JTSE5VP6.js";import{c as G}from"./chunk-7SZRL6FY.js";var _=G(xt(),1);function ot(e,n,d){e.setAttribute("data-run-id",n),e.setAttribute("data-node-id",d.id);let l=d.webTerminal;if(l?.status==="live"&&l.webPort&&l.webPort>0){bt(e,l.webPort);return}if(d.hasPtyLog){yt(e,n,d.id,l?.status==="closed");return}Lt(e,l?.status==="live"?"\u7EC8\u7AEF\u6B63\u5728\u542F\u52A8\uFF0C\u7A0D\u540E\u5237\u65B0":"\u6682\u65E0\u7EC8\u7AEF\u8BB0\u5F55")}function bt(e,n){let d=Tt(n);e.innerHTML=`<div class="v3-terminal-panel">
|
|
2
|
-
<div class="v3-terminal-head">
|
|
3
|
-
<span class="v3-terminal-dot live"></span>
|
|
4
|
-
<span>\u5B9E\u65F6\u7EC8\u7AEF\uFF08\u53EA\u8BFB\uFF09</span>
|
|
5
|
-
<span class="muted">:${n}</span>
|
|
6
|
-
<a class="btn-link" href="${W(d)}" target="_blank" rel="noopener">\u65B0\u7A97\u53E3\u6253\u5F00</a>
|
|
7
|
-
</div>
|
|
8
|
-
<iframe class="wf-terminal-frame v3-terminal-frame" src="${W(d)}" title="v3 live terminal" loading="lazy"></iframe>
|
|
9
|
-
</div>`}function yt(e,n,d,l){let b=`/api/v3/runs/${encodeURIComponent(n)}/nodes/${encodeURIComponent(d)}/pty-log`,c=Mt(b,`${n} / ${d}`);e.innerHTML=`<div class="v3-terminal-panel">
|
|
10
|
-
<div class="v3-terminal-head">
|
|
11
|
-
<span class="v3-terminal-dot ${l?"closed":"replay"}"></span>
|
|
12
|
-
<span>${l?"\u7EC8\u7AEF\u56DE\u653E":"\u7EC8\u7AEF\u8BB0\u5F55"}</span>
|
|
13
|
-
<span class="muted">PTY log</span>
|
|
14
|
-
<a class="btn-link" href="${W(b)}" target="_blank" rel="noopener">\u4E0B\u8F7D/\u6253\u5F00\u539F\u59CB\u65E5\u5FD7</a>
|
|
15
|
-
</div>
|
|
16
|
-
<iframe class="wf-terminal-frame v3-terminal-frame" srcdoc="${W(c)}" title="v3 terminal replay" loading="lazy"></iframe>
|
|
17
|
-
</div>`}function Lt(e,n){e.innerHTML=`<div class="v3-terminal-empty muted">${Y(n)}</div>`}function Tt(e){return`http://${window.location.hostname||"127.0.0.1"}:${e}/`}function Mt(e,n){let d=JSON.stringify(e);return`<!doctype html>
|
|
18
|
-
<html>
|
|
19
|
-
<head>
|
|
20
|
-
<meta charset="utf-8">
|
|
21
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@xterm/xterm@5.5.0/css/xterm.css">
|
|
22
|
-
<style>
|
|
23
|
-
html,body{margin:0;height:100%;background:#0d1117;color:#c9d1d9;font:12px ui-monospace,SFMono-Regular,Menlo,monospace}
|
|
24
|
-
#bar{height:31px;display:flex;align-items:center;gap:10px;padding:0 10px;background:#161b22;border-bottom:1px solid #30363d;box-sizing:border-box}
|
|
25
|
-
#status{margin-left:auto;color:#8b949e;white-space:nowrap}
|
|
26
|
-
#term{height:calc(100% - 31px);padding:4px;box-sizing:border-box;overflow:auto}
|
|
27
|
-
a{color:#58a6ff;text-decoration:none}
|
|
28
|
-
</style>
|
|
29
|
-
</head>
|
|
30
|
-
<body>
|
|
31
|
-
<div id="bar"><span>${Y(n)}</span><span id="status">loading...</span></div>
|
|
32
|
-
<div id="term"></div>
|
|
33
|
-
<script src="https://cdn.jsdelivr.net/npm/@xterm/xterm@5.5.0/lib/xterm.js"><\/script>
|
|
34
|
-
<script src="https://cdn.jsdelivr.net/npm/@xterm/addon-fit@0.10.0/lib/addon-fit.js"><\/script>
|
|
35
|
-
<script>
|
|
36
|
-
(function(){
|
|
37
|
-
var endpoint=${d};
|
|
38
|
-
// v3 ephemeral workers spawn their PTY at DEFAULT_RENDER_COLS (=160, see
|
|
39
|
-
// worker.ts) and never adopt, so the captured stream's TUI / box-drawing
|
|
40
|
-
// is exactly 160 cols wide. Fitting it into a narrower (or oddly-measured)
|
|
41
|
-
// grid re-wraps those fixed-width lines into a stair-stepped mess and
|
|
42
|
-
// wastes the panel. So we render at the capture width and let FitAddon
|
|
43
|
-
// only size the ROW count to the iframe height (cols pinned back to 160).
|
|
44
|
-
var COLS=160;
|
|
45
|
-
var status=document.getElementById('status');
|
|
46
|
-
var termEl=document.getElementById('term');
|
|
47
|
-
if(!window.Terminal){status.textContent='xterm.js failed to load';return;}
|
|
48
|
-
var term=new Terminal({
|
|
49
|
-
cols:COLS,
|
|
50
|
-
convertEol:false,
|
|
51
|
-
scrollback:100000,
|
|
52
|
-
fontSize:13,
|
|
53
|
-
disableStdin:true,
|
|
54
|
-
theme:{background:'#0d1117',foreground:'#c9d1d9',cursor:'#c9d1d9'}
|
|
55
|
-
});
|
|
56
|
-
var fit=null;
|
|
57
|
-
if(window.FitAddon){fit=new window.FitAddon.FitAddon();term.loadAddon(fit);}
|
|
58
|
-
term.open(termEl);
|
|
59
|
-
function doFit(){
|
|
60
|
-
try{if(fit)fit.fit()}catch(_){}
|
|
61
|
-
if(term.cols!==COLS)term.resize(COLS,term.rows||24);
|
|
62
|
-
}
|
|
63
|
-
doFit(); window.addEventListener('resize',doFit);
|
|
64
|
-
fetch(endpoint,{credentials:'include'}).then(function(res){
|
|
65
|
-
if(!res.ok){
|
|
66
|
-
if(res.status===401){status.textContent='\u9700\u8981\u767B\u5F55 dashboard \u540E\u67E5\u770B\u56DE\u653E';}
|
|
67
|
-
else if(res.status===404){status.textContent='\u6CA1\u6709 PTY \u65E5\u5FD7';}
|
|
68
|
-
else{status.textContent='\u52A0\u8F7D\u5931\u8D25 HTTP '+res.status;}
|
|
69
|
-
return null;
|
|
70
|
-
}
|
|
71
|
-
var total=Number(res.headers.get('x-botmux-log-bytes')||0);
|
|
72
|
-
var served=Number(res.headers.get('x-botmux-served-bytes')||0);
|
|
73
|
-
var truncated=res.headers.get('x-botmux-truncated')==='1';
|
|
74
|
-
status.textContent=truncated
|
|
75
|
-
? 'showing tail '+formatBytes(served)+' / '+formatBytes(total)
|
|
76
|
-
: 'loaded '+formatBytes(total);
|
|
77
|
-
return res.arrayBuffer();
|
|
78
|
-
}).then(function(buf){
|
|
79
|
-
if(!buf)return;
|
|
80
|
-
term.write(new TextDecoder().decode(buf));
|
|
81
|
-
setTimeout(doFit,0);
|
|
82
|
-
}).catch(function(err){
|
|
83
|
-
status.textContent='\u52A0\u8F7D\u5931\u8D25: '+(err&&err.message?err.message:String(err));
|
|
84
|
-
});
|
|
85
|
-
function formatBytes(n){
|
|
86
|
-
if(!Number.isFinite(n)||n<=0)return '0 B';
|
|
87
|
-
var u=['B','KiB','MiB','GiB'];var i=0;
|
|
88
|
-
while(n>=1024&&i<u.length-1){n/=1024;i++;}
|
|
89
|
-
return (i===0?String(n):n.toFixed(1))+' '+u[i];
|
|
90
|
-
}
|
|
91
|
-
})();
|
|
92
|
-
<\/script>
|
|
93
|
-
</body>
|
|
94
|
-
</html>`}function Y(e){return e.replace(/[&<>"']/g,n=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[n])}function W(e){return Y(e).replace(/`/g,"`")}function it(e,n){let d=n?`?${n}`:"";return`#/legacy-workflow/${encodeURIComponent(e)}${d}`}var ct=2e3;function at(e){return e==="succeeded"||e==="failed"}var D={pending:"\u5F85\u673A",gateWaiting:"\u7B49\u5BA1\u6279",running:"\u8FD0\u884C\u4E2D",done:"\u5B8C\u6210",skipped:"\u5DF2\u8DF3\u8FC7",cancelled:"\u5DF2\u53D6\u6D88",blocked:"\u53D7\u963B",superseded:"\u5DF2\u5237\u65B0",failed:"\u5931\u8D25"},kt={exit:"\u2713 \u901A\u8FC7",continue:"\u21BB \u7EE7\u7EED\u8FD4\u5DE5",exhausted:"\u26D4 \u8F6E\u6570\u8017\u5C3D"};function h(e){return e.replace(/[&<>"']/g,n=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[n])}function Nt(e){let n=e.webTerminal;return`${n?.status??"-"}|${n?.webPort??"-"}|${e.hasPtyLog?"1":"0"}`}function Z(e=location.hash){let n=e.match(/^#\/workflows\/([^?#]+)/);return n?decodeURIComponent(n[1]):null}function ut(e){let n=Z();return n?Ht(e,n):Rt(e)}function Rt(e){let n=e.querySelector("#v3-tbody"),d=e.querySelector("#v3-empty"),l=null,b=!1;async function c(){if(!(b||document.hidden))try{let H=await fetch("/api/v3/runs");if(b)return;let R=H.ok?await H.json():{runs:[]};if(b)return;let M=R.runs??[];d.hidden=M.length>0,n.innerHTML=M.map(S=>`<tr>
|
|
95
|
-
<td><a class="v3r-runid" href="#/workflows/${encodeURIComponent(S.runId)}">${h(S.runId)}</a></td>
|
|
96
|
-
<td><span class="v3r-pill rs-${h(S.runStatus)}">${h(S.runStatus)}</span></td>
|
|
97
|
-
<td>${S.nodeCount}</td>
|
|
98
|
-
</tr>`).join("")}catch{}}function T(){b||c().then(()=>{b||(l=window.setTimeout(T,ct))})}return T(),()=>{b=!0,l!==null&&window.clearTimeout(l)}}var O=168,K=48,z=70,lt=226,dt=30,q=26,St=8;function X(e){return e.isLoop?z:K}function Ht(e,n){let d=e.querySelector("#v3-graph"),l=e.querySelector("#v3-node-panel"),b=e.querySelector("#v3-runstatus"),c=null,T=!1,H=!1,R=null,M=null,S=null,I=null,A=null,B=!1;function pt(t){R=t,A=null,B=!1,M&&Q(M),U()}function mt(t){A=t,B=!0,U()}function ft(t){if(B&&A){let a=t.find($=>$.id===A);if(a)return a}let s=t.filter(a=>a.status==="running");return s[s.length-1]??t[t.length-1]??null}function vt(t,s,a){let f=new Map,k=v=>{if(f.has(v))return f.get(v);f.set(v,0);let p=t.find(N=>N.id===v)?.depends.filter(N=>t.some(V=>V.id===N))??[],g=p.length?1+Math.max(...p.map(k)):0;return f.set(v,g),g},i=new Map,r=new Map,u=0;for(let v of t){let p=k(v.id),g=i.get(p)??0;i.set(p,g+1),u=Math.max(u,g),r.set(v.id,{x:6+p*138,y:6+g*42})}let x=12+(f.size?Math.max(...f.values())*138+104:0),E=12+u*42+30,C=[];for(let v of t){let p=r.get(v.id);for(let g of v.depends){let N=r.get(g);if(!N)continue;let V=N.x+104,j=N.y+30/2,F=p.x,et=p.y+30/2,nt=(V+F)/2,wt=s.get(v.id)?.status==="running"?" live":"";C.push(`<path class="v3r-edge${wt}" d="M${V},${j} C${nt},${j} ${nt},${et} ${F},${et}" marker-end="url(#v3arrow-mini)"/>`)}}let P=t.map(v=>{let p=r.get(v.id),g=s.get(v.id),N=g?.status??"pending",V=g?"":" ghost",j=g&&g.id===a?" sel":"",F=g?` data-sel="${h(g.id)}"`:"";return`<g class="v3r-node v3r-mini st-${N}${j}${V}"${F}${g?' style="cursor:pointer"':""}>
|
|
99
|
-
<rect class="v3r-box" x="${p.x}" y="${p.y}" width="104" height="30" rx="8"/>
|
|
100
|
-
<circle class="v3r-mini-dot" cx="${p.x+13}" cy="${p.y+30/2}" r="3.4"/>
|
|
101
|
-
<text class="v3r-nid" x="${p.x+24}" y="${p.y+30/2+4}">${h(J(v.id,12))}</text>
|
|
102
|
-
</g>`});return`<svg class="v3r-mini-svg" width="${x}" height="${E}" viewBox="0 0 ${x} ${E}">
|
|
103
|
-
<defs><marker id="v3arrow-mini" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
|
|
104
|
-
<path d="M0,0 L10,5 L0,10 z" fill="var(--faint, #8b98aa)"/></marker></defs>
|
|
105
|
-
${C.join("")}${P.join("")}
|
|
106
|
-
</svg>`}function gt(t,s){let a=t.loopState;if(!a)return'<p class="muted">loop \u672A\u5F00\u59CB</p>';let $=a.maxIterations,m=$!==void 0?$+a.granted:void 0,L=new Map(a.decisions.map(r=>[r.iteration,r.decision])),y=(M?.nodes??[]).filter(r=>r.loop?.loopId===t.id),w=new Map;for(let r of y){let u=r.loop.iteration;(w.get(u)??w.set(u,[]).get(u)).push(r)}let f=[...w.entries()].sort((r,u)=>r[0]-u[0]).map(([r,u])=>{let x=L.get(r),E=r===a.iteration,C=$!==void 0&&r>$,P=x?`<span class="v3r-verdict vd-${x}">${kt[x]}</span>`:E&&t.status==="running"?'<span class="v3r-verdict vd-live">\u25B6 \u8FDB\u884C\u4E2D</span>':"",v=new Map(u.map(p=>[p.loop.bodyNodeId,p]));return`<div class="v3r-round${E?" cur":""}${x?` vd-${x}`:""}">
|
|
107
|
-
<div class="v3r-round-head">
|
|
108
|
-
<span class="rn">R${r}</span>
|
|
109
|
-
${C?'<span class="v3r-granted-tag">\u2795 \u8FFD\u52A0\u8F6E</span>':""}
|
|
110
|
-
${P}
|
|
111
|
-
</div>
|
|
112
|
-
${vt(a.bodyTemplate,v,s)}
|
|
113
|
-
</div>`}).join(""),k=`<div class="v3r-loop-meter">
|
|
114
|
-
<span class="num">\u7B2C <b>${a.iteration}</b>${m!==void 0?` / <b>${m}</b>`:""} \u8F6E</span>
|
|
115
|
-
${a.granted>0?`<span class="v3r-granted-tag">\u542B\u4EBA\u5DE5\u8FFD\u52A0 +${a.granted}</span>`:""}
|
|
116
|
-
${a.lastDecision==="exit"?'<span class="v3r-verdict vd-exit">\u2713 \u5DF2\u6536\u655B</span>':""}
|
|
117
|
-
</div>`,i=t.status==="blocked"?`<div class="v3r-cta">\u26A0 \u8F6E\u6570\u8017\u5C3D\uFF0C\u7B49\u4EBA\u8FFD\u52A0 \u2014 \u98DE\u4E66\u5361\u7247\u70B9\u300C\u2795 \u8FFD\u52A0 1 \u8F6E\u300D\uFF0C\u6216 <code>botmux workflow grant ${h(n)}</code></div>`:"";return`<div class="v3r-loop-sec">${k}<div class="v3r-rounds">${f}</div>${i}</div>`}function U(){let t=M?.nodes.find(w=>w.id===R)??null;if(!t){l.innerHTML='<p class="muted">\u70B9\u4E00\u4E2A\u8282\u70B9\u770B\u8BE6\u60C5\u4E0E\u7EC8\u7AEF</p>',S=null,I=null;return}S!==t.id&&(l.innerHTML=`
|
|
118
|
-
<div id="v3-node-meta"></div>
|
|
119
|
-
<div id="v3-inst-strip"></div>
|
|
120
|
-
<div id="v3-term-slot" class="v3r-term-slot"></div>`,S=t.id,I=null);let s=t,a=null;if(t.isLoop){let w=(M?.nodes??[]).filter(k=>k.loop?.loopId===t.id),f=ft(w);s=f,a=f?.id??null,A=a}let $=`<div class="v3r-panel-head">
|
|
121
|
-
${t.isLoop?'<span class="v3r-loop-mark">\u27F3</span>':""}
|
|
122
|
-
<span class="v3r-nodeid">${h(t.id)}</span>
|
|
123
|
-
<span class="v3r-pill st-${t.status}"><i class="dot"></i>${D[t.status]}</span>
|
|
124
|
-
</div>`,m=t.errorClass?`<p class="v3r-err">\u539F\u56E0\uFF1A${h(t.errorClass)}${t.errorCode?` (${h(t.errorCode)})`:""}${t.status==="blocked"&&!t.isLoop?" \u2014 \u98DE\u4E66\u5361\u7247\u6216 <code>botmux workflow retry</code> \u53EF\u91CD\u8BD5":""}</p>`:"";l.querySelector("#v3-node-meta").innerHTML=`
|
|
125
|
-
${$}
|
|
126
|
-
${t.goal?`<p class="v3r-goal">${h(t.goal)}</p>`:""}
|
|
127
|
-
${t.depends.length?`<p class="v3r-deps">\u4F9D\u8D56 ${t.depends.map(w=>`<span class="v3r-dep">${h(w)}</span>`).join("")}</p>`:""}
|
|
128
|
-
${m}${t.isLoop?gt(t,a):""}`,l.querySelector("#v3-inst-strip").innerHTML=t.isLoop&&s?`<div class="v3r-inst-strip">
|
|
129
|
-
<span class="lbl">\u5B9E\u4F8B\u7EC8\u7AEF</span>
|
|
130
|
-
<span class="v3r-nodeid sm">${h(s.id)}</span>
|
|
131
|
-
<span class="v3r-pill st-${s.status}"><i class="dot"></i>${D[s.status]}</span>
|
|
132
|
-
<span class="muted">\u7B2C ${s.loop.iteration} \u8F6E \xB7 ${h(s.loop.bodyNodeId)}${B?"":" \xB7 \u81EA\u52A8\u8DDF\u968F"}</span>
|
|
133
|
-
</div>`:"";for(let w of l.querySelectorAll("#v3-node-meta [data-sel]"))w.addEventListener("click",f=>{f.stopPropagation(),mt(w.getAttribute("data-sel"))});let L=l.querySelector("#v3-term-slot");if(!s){L.innerHTML="",I=null;return}let y=`${s.id}|${Nt(s)}`;y!==I&&(ot(L,n,s),I=y)}function ht(t,s,a,$){let m=t.loopState,L=m?.maxIterations,y=m&&L!==void 0?L+m.granted:void 0,w=m?`${D[t.status]} \xB7 \u7B2C${m.iteration}${y!==void 0?`/${y}`:""}\u8F6E`:`${D[t.status]} \xB7 loop`,f="";if(m&&y!==void 0&&y<=St){let k=a+z-13;for(let i=1;i<=y;i++){let r=s+14+(i-1)*15,u=i<m.iteration?"v3r-dot done":i===m.iteration?`v3r-dot cur${t.status==="running"?" live":""}`:"v3r-dot todo",x=L!==void 0&&i>L?" grant":"";f+=`<circle class="${u}${x}" cx="${r}" cy="${k}" r="3.6"/>`}m.lastDecision==="exit"?f+=`<text class="v3r-dots-verdict ok" x="${s+14+y*15+4}" y="${k+4}">\u2713</text>`:m.lastDecision==="exhausted"&&t.status==="blocked"&&(f+=`<text class="v3r-dots-verdict warn" x="${s+14+y*15+4}" y="${k+4}">\u26A0</text>`)}return`<g class="v3r-node v3r-loopnode st-${t.status}${$?" sel":""}" data-node="${h(t.id)}">
|
|
134
|
-
<rect class="v3r-cap" x="${s-4}" y="${a-4}" width="${O+8}" height="${z+8}" rx="14"/>
|
|
135
|
-
<rect class="v3r-box" x="${s}" y="${a}" width="${O}" height="${z}" rx="10"/>
|
|
136
|
-
<text class="v3r-spin" x="${s+14}" y="${a+21}">\u27F3</text>
|
|
137
|
-
<text class="v3r-nid" x="${s+30}" y="${a+21}">${h(J(t.id,16))}</text>
|
|
138
|
-
<text class="v3r-nstatus" x="${s+14}" y="${a+39}">${h(w)}</text>
|
|
139
|
-
${f}
|
|
140
|
-
</g>`}function Q(t){let s=t.nodes.filter(i=>!i.loop),a=Et(s),$=new Map;for(let i of s){let r=a.get(i.id)??0;($.get(r)??$.set(r,[]).get(r)).push(i)}let m=new Map,L=0;for(let[i,r]of $){let u=q;for(let x of r)m.set(x.id,{x:q+i*lt,y:u}),u+=X(x)+dt;L=Math.max(L,u-dt+q)}let y=q*2+($.size===0?0:Math.max(...$.keys())*lt+O),w=new Map(s.map(i=>[i.id,i])),f=[];for(let i of s){let r=m.get(i.id);if(r)for(let u of i.depends){let x=m.get(u),E=w.get(u);if(!x||!E)continue;let C=x.x+O,P=x.y+X(E)/2,v=r.x,p=r.y+X(i)/2,g=(C+v)/2,N=i.status==="running"?" live":"";f.push(`<path class="v3r-edge${N}" d="M${C},${P} C${g},${P} ${g},${p} ${v},${p}" marker-end="url(#v3arrow)"/>`)}}let k=s.map(i=>{let r=m.get(i.id),u=i.id===R;return i.isLoop?ht(i,r.x,r.y,u):`<g class="v3r-node st-${i.status}${u?" sel":""}" data-node="${h(i.id)}">
|
|
141
|
-
<rect class="v3r-box" x="${r.x}" y="${r.y}" width="${O}" height="${K}" rx="10"/>
|
|
142
|
-
<rect class="v3r-bar" x="${r.x}" y="${r.y+8}" width="3" height="${K-16}" rx="1.5"/>
|
|
143
|
-
<text class="v3r-nid" x="${r.x+14}" y="${r.y+20}">${h(J(i.id,18))}</text>
|
|
144
|
-
<text class="v3r-nstatus" x="${r.x+14}" y="${r.y+37}">${D[i.status]}</text>
|
|
145
|
-
</g>`});d.innerHTML=`<svg width="${y}" height="${L}" viewBox="0 0 ${y} ${L}" style="display:block">
|
|
146
|
-
<defs><marker id="v3arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
147
|
-
<path d="M0,0 L10,5 L0,10 z" fill="var(--faint, #8b98aa)"/></marker></defs>
|
|
148
|
-
${f.join("")}${k.join("")}
|
|
149
|
-
</svg>`;for(let i of d.querySelectorAll("[data-node]"))i.addEventListener("click",()=>pt(i.getAttribute("data-node")))}async function $t(){if(!(T||document.hidden))try{let t=await fetch(`/api/v3/runs/${encodeURIComponent(n)}`);if(T)return;if(!t.ok){if(t.status===404&&!H){H=!0;try{let a=await fetch(`/api/workflows/runs/${encodeURIComponent(n)}/snapshot`);if(T)return;if(a.ok){window.location.replace(it(n,location.hash.split("?")[1]));return}}catch{}}T||(b.textContent=t.status===404?"not found":`HTTP ${t.status}`);return}let s=await t.json();if(T)return;if(M=s,b.textContent=s.runStatus,b.className=`v3r-pill rs-${s.runStatus}`,R===null&&s.nodes.length&&(R=s.nodes[0].id),Q(s),U(),at(s.runStatus)){c!==null&&window.clearTimeout(c),c=null;return}}catch{}}function tt(){T||$t().then(()=>{!T&&!at(M?.runStatus)&&(c=window.setTimeout(tt,ct))})}return tt(),()=>{T=!0,c!==null&&window.clearTimeout(c)}}function Et(e){let n=new Map(e.map(c=>[c.id,c])),d=new Map,l=new Set;function b(c){if(d.has(c))return d.get(c);if(l.has(c))return 0;l.add(c);let H=(n.get(c)?.depends??[]).filter(M=>n.has(M)),R=H.length?1+Math.max(...H.map(b)):0;return l.delete(c),d.set(c,R),R}for(let c of e)b(c.id);return d}function J(e,n){return e.length>n?e.slice(0,n-1)+"\u2026":e}var o=G(rt(),1);function Ct(){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)("div",{className:"page-head",children:[(0,o.jsx)("h1",{children:"\u5DE5\u4F5C\u6D41"}),(0,o.jsx)("p",{className:"muted",children:"LLM \u7F16\u6392\u7684 workflow \u8FD0\u884C \u2014 DAG \u56FE + \u6BCF\u8282\u70B9\u7EC8\u7AEF"})]}),(0,o.jsxs)("table",{className:"data-table",children:[(0,o.jsx)("thead",{children:(0,o.jsxs)("tr",{children:[(0,o.jsx)("th",{children:"Run"}),(0,o.jsx)("th",{children:"\u72B6\u6001"}),(0,o.jsx)("th",{children:"\u8282\u70B9\u6570"})]})}),(0,o.jsx)("tbody",{id:"v3-tbody"})]}),(0,o.jsxs)("div",{id:"v3-empty",className:"muted",hidden:!0,style:{padding:"1rem"},children:["\u6682\u65E0\u5DE5\u4F5C\u6D41\u8FD0\u884C\uFF08\u7528 ",(0,o.jsx)("code",{children:"/workflow new"})," \u53D1\u8D77\u4E00\u4E2A\uFF09"]})]})}function Pt(e){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)("div",{className:"page-head",children:[(0,o.jsx)("a",{href:"#/workflows",className:"btn-link",children:"\u2190 \u5DE5\u4F5C\u6D41"}),(0,o.jsx)("h1",{className:"v3r-title",children:e.runId}),(0,o.jsx)("span",{id:"v3-runstatus",className:"v3r-pill"})]}),(0,o.jsxs)("div",{className:"v3r-wrap",children:[(0,o.jsxs)("div",{className:"v3r-graph-card",children:[(0,o.jsx)("div",{id:"v3-graph",className:"v3r-graph"}),(0,o.jsxs)("div",{className:"v3r-legend",children:[(0,o.jsx)("span",{className:"lg st-pending",children:"\u5F85\u673A"}),(0,o.jsx)("span",{className:"lg st-running",children:"\u8FD0\u884C\u4E2D"}),(0,o.jsx)("span",{className:"lg st-gateWaiting",children:"\u7B49\u5BA1\u6279"}),(0,o.jsx)("span",{className:"lg st-done",children:"\u5B8C\u6210"}),(0,o.jsx)("span",{className:"lg st-skipped",children:"\u5DF2\u8DF3\u8FC7"}),(0,o.jsx)("span",{className:"lg st-cancelled",children:"\u5DF2\u53D6\u6D88"}),(0,o.jsx)("span",{className:"lg st-blocked",children:"\u53D7\u963B"}),(0,o.jsx)("span",{className:"lg st-failed",children:"\u5931\u8D25"}),(0,o.jsx)("span",{className:"lg lg-loop",children:"\u27F3 \u5FAA\u73AF\u5BB9\u5668"})]})]}),(0,o.jsx)("div",{id:"v3-node-panel",className:"v3r-panel",children:(0,o.jsx)("p",{className:"muted",children:"\u70B9\u4E00\u4E2A\u8282\u70B9\u770B\u8BE6\u60C5\u4E0E\u7EC8\u7AEF"})})]})]})}function Vt(){let e=(0,_.useRef)(null),n=Z();return(0,_.useEffect)(()=>{if(e.current)return ut(e.current)},[]),(0,o.jsx)("section",{className:"page",ref:e,children:n?(0,o.jsx)(Pt,{runId:n}):(0,o.jsx)(Ct,{})})}function Wt(e){return st(e,(0,o.jsx)(Vt,{}))}export{Wt as renderV3RunsPage};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as z,b as I,c as M}from"./chunk-JTSE5VP6.js";import{c as y}from"./chunk-7SZRL6FY.js";var s=y(z(),1);var e=y(M(),1);function W(t){let a=Date.parse(t);if(!a)return t||"-";let r=Math.max(0,Math.floor((Date.now()-a)/1e3));if(r<60)return`${r}s ago`;let n=Math.floor(r/60);if(n<60)return`${n}m ago`;let o=Math.floor(n/60);return o<24?`${o}h ago`:`${Math.floor(o/24)}d ago`}function j(t){return t.chatId?.trim()||"__local__"}function D(t,a){if(t==="__local__")return"\u672A\u7ED1\u5B9A\u7FA4 / \u672C\u5730\u767D\u677F";let r=a.get(t);return r&&r!==t?`${r} (${t})`:t}function H(t,a){let r=new Map;for(let n of t){let o=j(n),c=r.get(o)??[];c.push(n),r.set(o,c)}return[...r.entries()].map(([n,o])=>({chatId:n,label:D(n,a),rows:[...o].sort((c,u)=>u.updatedAt.localeCompare(c.updatedAt))})).sort((n,o)=>n.label.localeCompare(o.label))}function _(t){return{display:"block",textDecoration:"none",color:"inherit",border:`1px solid ${t?"rgba(14,165,233,.75)":"var(--border)"}`,borderRadius:14,padding:"13px 14px",margin:"10px 0 10px 18px",background:t?"linear-gradient(135deg, rgba(14,165,233,.16), rgba(59,130,246,.08))":"var(--surface-raised)",boxShadow:t?"0 10px 24px rgba(14,165,233,.13)":"0 4px 14px rgba(15,23,42,.04)"}}function L(){return decodeURIComponent((location.hash.match(/^#\/whiteboards\/([^/]+)/)?.[1]??"").trim())}async function B(t,a){let r=await fetch(`/api/whiteboards/${encodeURIComponent(t)}`),n=await r.json().catch(()=>({}));if(r.ok)return{id:t,content:String(n.content??""),row:a.find(o=>o.id===t)}}async function F(t){let a=new Map;if(!t?.ok)return a;let r=await t.json().catch(()=>({})),n=Array.isArray(r.chats)?r.chats:[];for(let o of n)o.chatId&&a.set(String(o.chatId),String(o.name||o.chatId));return a}function U(t){let a=t.row;return(0,e.jsxs)("a",{className:`wb-item${t.active?" active":""}`,"data-whiteboard-id":a.id,href:`#/whiteboards/${encodeURIComponent(a.id)}`,style:_(t.active),onClick:r=>{r.preventDefault(),t.onSelect(a.id)},children:[(0,e.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"flex-start",justifyContent:"space-between"},children:[(0,e.jsxs)("div",{style:{minWidth:0},children:[(0,e.jsx)("strong",{style:{display:"block",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:a.title||a.id}),(0,e.jsx)("span",{style:{display:"inline-block",marginTop:4,fontSize:11,color:"var(--muted)",fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace"},children:a.id})]}),(0,e.jsx)("span",{style:{fontSize:11,border:"1px solid var(--border)",borderRadius:999,padding:"2px 7px",color:"var(--muted)",whiteSpace:"nowrap"},children:a.scope})]}),(0,e.jsxs)("div",{style:{marginTop:9,display:"flex",gap:8,alignItems:"center",color:"var(--muted)",fontSize:12},children:[(0,e.jsx)("span",{children:W(a.updatedAt)}),(0,e.jsx)("span",{children:"\xB7"}),(0,e.jsxs)("span",{children:["log ",a.logCount]})]})]})}function f(t){return(0,e.jsxs)("div",{style:{border:"1px solid var(--border)",borderRadius:12,padding:"10px 12px",background:"var(--surface-raised)",minWidth:0},children:[(0,e.jsx)("div",{style:{fontSize:11,color:"var(--muted)",marginBottom:5},children:t.label}),(0,e.jsx)("div",{style:{fontSize:13,wordBreak:"break-all"},children:t.value||"-"})]})}function O(t){let a=t.selected;if(!a)return(0,e.jsx)("p",{className:"empty",children:"\u9009\u62E9\u5DE6\u4FA7\u767D\u677F\u67E5\u770B meta \u548C board.md\u3002"});let r=a.row,n=r?.chatId?D(r.chatId,t.groupNames):"\u672A\u7ED1\u5B9A\u7FA4 / \u672C\u5730\u767D\u677F";return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",gap:16,alignItems:"flex-start",marginBottom:16},children:[(0,e.jsxs)("div",{style:{minWidth:0},children:[(0,e.jsx)("p",{className:"eyebrow",style:{margin:"0 0 6px"},children:"WHITEBOARD"}),(0,e.jsx)("h2",{style:{margin:0,fontSize:22,lineHeight:1.25},children:r?.title||a.id}),(0,e.jsx)("div",{style:{marginTop:8,color:"var(--muted)",fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",fontSize:12},children:a.id})]}),(0,e.jsx)("button",{type:"button",className:"danger","data-delete-whiteboard":!0,onClick:t.onDelete,children:"\u5220\u9664\u767D\u677F"})]}),(0,e.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"repeat(2,minmax(0,1fr))",gap:10,marginBottom:18},children:[(0,e.jsx)(f,{label:"\u6240\u5C5E\u7FA4",value:n}),(0,e.jsx)(f,{label:"\u8303\u56F4",value:r?.scope??"-"}),(0,e.jsx)(f,{label:"\u6700\u8FD1\u66F4\u65B0",value:r?.updatedAt?W(r.updatedAt):"-"}),(0,e.jsx)(f,{label:"\u6765\u6E90\u76EE\u5F55",value:r?.workingDir??"-"})]}),(0,e.jsxs)("details",{style:{marginBottom:18,color:"var(--muted)"},children:[(0,e.jsx)("summary",{style:{cursor:"pointer"},children:"\u7BA1\u7406\u4FE1\u606F / \u6587\u4EF6\u8DEF\u5F84"}),(0,e.jsx)("code",{style:{display:"block",marginTop:8,whiteSpace:"pre-wrap",wordBreak:"break-all"},children:r?.path??""})]}),(0,e.jsxs)("section",{style:{border:"1px solid var(--border)",borderRadius:14,background:"var(--surface-raised)",overflow:"hidden"},children:[(0,e.jsxs)("div",{style:{padding:"12px 14px",borderBottom:"1px solid var(--border)",display:"flex",justifyContent:"space-between",alignItems:"center"},children:[(0,e.jsx)("strong",{children:"\u5F53\u524D\u72B6\u6001 board.md"}),(0,e.jsx)("span",{style:{color:"var(--muted)",fontSize:12},children:"read / update"})]}),(0,e.jsx)("pre",{style:{whiteSpace:"pre-wrap",maxHeight:"70vh",overflow:"auto",margin:0,padding:16,lineHeight:1.65,background:"transparent"},children:a.content||"\uFF08\u6682\u65E0\u5185\u5BB9\uFF09"})]})]})}function q(t){let a=t.selected.row?.title||t.selected.id;return(0,e.jsx)("div",{className:"wb-delete-backdrop","data-delete-modal":!0,style:{position:"fixed",inset:0,background:"rgba(0,0,0,.48)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:1e4,padding:20},onClick:r=>{r.target===r.currentTarget&&t.onCancel()},children:(0,e.jsxs)("div",{role:"dialog","aria-modal":"true","aria-labelledby":"wb-delete-title",style:{width:"min(520px,92vw)",background:"var(--surface)",color:"var(--fg)",border:"1px solid var(--border)",borderRadius:16,boxShadow:"0 18px 60px rgba(0,0,0,.35)",padding:"22px 24px"},children:[(0,e.jsxs)("div",{style:{display:"flex",gap:14,alignItems:"flex-start"},children:[(0,e.jsx)("div",{"aria-hidden":"true",style:{width:36,height:36,borderRadius:"50%",display:"grid",placeItems:"center",background:"rgba(220,38,38,.14)",color:"#dc2626",fontWeight:800},children:"!"}),(0,e.jsxs)("div",{style:{minWidth:0,flex:1},children:[(0,e.jsx)("h3",{id:"wb-delete-title",style:{margin:"0 0 8px",fontSize:18},children:"\u5220\u9664\u767D\u677F\uFF1F"}),(0,e.jsxs)("p",{style:{margin:0,color:"var(--muted)",lineHeight:1.6},children:["\u5C06\u5220\u9664 ",(0,e.jsx)("strong",{children:a}),"\uFF08",(0,e.jsx)("code",{children:t.selected.id}),"\uFF09\u7684 board\u3001log\u3001meta\uFF0C\u5E76\u6E05\u7406\u9ED8\u8BA4\u7ED1\u5B9A\u548C\u4F1A\u8BDD\u5F15\u7528\u3002\u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D\u3002"]})]})]}),(0,e.jsxs)("div",{className:"actions",style:{display:"flex",justifyContent:"flex-end",gap:10,marginTop:22},children:[(0,e.jsx)("button",{type:"button","data-delete-cancel":!0,onClick:t.onCancel,disabled:t.deleting,children:"\u53D6\u6D88"}),(0,e.jsx)("button",{type:"button",className:"danger","data-delete-confirm":!0,onClick:t.onConfirm,disabled:t.deleting,children:t.deleting?"\u5220\u9664\u4E2D...":"\u786E\u8BA4\u5220\u9664"})]})]})})}function K(){let t=(0,s.useRef)(!1),a=(0,s.useRef)(0),[r,n]=(0,s.useState)(!1),[o,c]=(0,s.useState)([]),[u,T]=(0,s.useState)(()=>new Map),[g,b]=(0,s.useState)(),[$,v]=(0,s.useState)(!0),[x,S]=(0,s.useState)(null),[p,h]=(0,s.useState)(null),[P,R]=(0,s.useState)(!1),N=(0,s.useMemo)(()=>H(o,u),[o,u]);(0,s.useEffect)(()=>{t.current=!0;let i=L();async function l(){v(!0);try{let[d,w]=await Promise.all([fetch("/api/whiteboards"),fetch("/api/groups").catch(()=>null)]),m=await d.json().catch(()=>({}));if(!d.ok)throw new Error(m?.error??`HTTP ${d.status}`);let G=await F(w),k=Array.isArray(m.whiteboards)?m.whiteboards:[],C;if(i&&(C=await B(i,k)),!t.current)return;n(m.enabled===!0),c(k),T(G),b(C),S(null)}catch(d){t.current&&S(d instanceof Error?d.message:String(d))}finally{t.current&&v(!1)}}return l(),()=>{t.current=!1,a.current+=1}},[]);async function A(i){let l=a.current+1;a.current=l;let d=await B(i,o);!t.current||a.current!==l||!d||(b(d),window.history.replaceState(null,"",`#/whiteboards/${encodeURIComponent(i)}`))}async function E(){if(p){R(!0);try{let i=await fetch(`/api/whiteboards/${encodeURIComponent(p.id)}`,{method:"DELETE"}),l=await i.json().catch(()=>({}));if(!i.ok||l.ok===!1)throw new Error(l?.error??`HTTP ${i.status}`);if(!t.current)return;c(d=>d.filter(w=>w.id!==p.id)),g?.id===p.id&&(b(void 0),window.history.replaceState(null,"","#/whiteboards")),h(null)}catch(i){t.current&&window.alert(`\u5220\u9664\u5931\u8D25\uFF1A${i instanceof Error?i.message:String(i)}`)}finally{t.current&&R(!1)}}}return x?(0,e.jsx)("section",{className:"page",children:(0,e.jsxs)("p",{className:"hint-warn",children:["\u52A0\u8F7D\u767D\u677F\u5931\u8D25\uFF1A",x]})}):$?(0,e.jsx)("div",{"data-whiteboards-host":!0,children:(0,e.jsx)("p",{className:"empty",children:"Loading whiteboards..."})}):(0,e.jsxs)("section",{className:"page",children:[(0,e.jsxs)("div",{className:"page-heading",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:"Whiteboards"}),(0,e.jsx)("h1",{children:"\u672C\u5730\u767D\u677F"}),(0,e.jsx)("p",{children:"\u6309\u7FA4\u5171\u4EAB\u7684\u672C\u5730\u6700\u65B0\u72B6\u6001\u767D\u677F\u3002\u5F00\u5173\u5173\u95ED\u65F6\u4EC5\u53EA\u8BFB\u5C55\u793A\u5386\u53F2\u767D\u677F\uFF0C\u4E0D\u6CE8\u5165 prompt\u3001\u4E0D\u5141\u8BB8 agent CLI \u8BFB\u5199\u3002"})]}),(0,e.jsx)("span",{className:`pill ${r?"ok":"warn"}`,children:r?"Enabled":"Disabled"})]}),r?null:(0,e.jsx)("p",{className:"hint-warn",children:"\u767D\u677F\u80FD\u529B\u5F53\u524D\u5173\u95ED\uFF1A\u4E0D\u4F1A\u81EA\u52A8\u521B\u5EFA/\u7ED1\u5B9A\u767D\u677F\uFF0C\u4E5F\u4E0D\u4F1A\u6CE8\u5165\u5230 agent prompt\u3002\u5386\u53F2\u767D\u677F\u4EC5\u5728 dashboard \u4E2D\u53EA\u8BFB\u53EF\u89C1\uFF0C\u53EF\u5728\u6B64\u6E05\u7406\u3002"}),(0,e.jsxs)("div",{className:"wb-split",style:{display:"grid",gridTemplateColumns:"minmax(300px,400px) minmax(0,1fr)",gap:18,alignItems:"start"},children:[(0,e.jsxs)("article",{className:"bd-card settings-card",style:{padding:18},children:[(0,e.jsx)("h3",{className:"bd-section-title",style:{marginBottom:12},children:"\u7FA4\u7EC4 / \u767D\u677F"}),N.length===0?(0,e.jsx)("p",{className:"empty",children:"\u6682\u65E0\u767D\u677F\u3002\u6253\u5F00\u80FD\u529B\u540E\uFF0C\u6BCF\u4E2A\u7FA4\u9996\u6B21\u9700\u8981\u767D\u677F\u65F6\u624D\u4F1A\u521B\u5EFA\u9ED8\u8BA4\u767D\u677F\u3002"}):N.map(i=>(0,e.jsxs)("details",{className:"wb-group",open:!0,style:{marginBottom:14},children:[(0,e.jsxs)("summary",{style:{cursor:"pointer",fontWeight:700,margin:"12px 0 8px",display:"flex",justifyContent:"space-between",gap:8,alignItems:"center"},children:[(0,e.jsx)("span",{style:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:i.label}),(0,e.jsx)("small",{style:{border:"1px solid var(--border)",borderRadius:999,padding:"1px 7px",color:"var(--muted)"},children:i.rows.length})]}),i.rows.map(l=>(0,e.jsx)(U,{row:l,active:g?.id===l.id,onSelect:d=>{A(d)}},l.id))]},i.chatId))]}),(0,e.jsx)("article",{className:"bd-card settings-card",id:"whiteboard-detail",style:{padding:"20px 22px"},children:(0,e.jsx)(O,{selected:g,groupNames:u,onDelete:()=>{g&&h(g)}})})]}),p?(0,e.jsx)(q,{selected:p,deleting:P,onCancel:()=>h(null),onConfirm:()=>{E()}}):null]})}function Q(t){return I(t,(0,e.jsx)(K,{}))}export{Q as renderWhiteboardsPage};
|
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
import{o as i}from"./chunk-3UJYRR2Q.js";import"./chunk-7SZRL6FY.js";function Rt(){let t=[["",i("workflow.filter.nonTerminal")],["all",i("workflow.filter.all")],["pending",C("pending")],["running",C("running")],["waiting",C("waiting")],["succeeded",C("succeeded")],["failed",C("failed")],["cancelled",C("cancelled")]];return`
|
|
2
|
-
<nav class="wf-subnav">
|
|
3
|
-
<a href="#/legacy-workflow" class="active" data-i18n="workflow.subnav.runs">${r(i("workflow.subnav.runs"))}</a>
|
|
4
|
-
<a href="#/workflows" data-i18n="workflow.subnav.v3">${r(i("workflow.subnav.v3"))}</a>
|
|
5
|
-
</nav>
|
|
6
|
-
<form id="wf-filters" class="filters">
|
|
7
|
-
<input type="search" name="q" placeholder="${r(i("workflow.searchPlaceholder"))}" />
|
|
8
|
-
<select name="status">
|
|
9
|
-
${t.map(([e,n])=>`<option value="${r(e)}">${r(n)}</option>`).join("")}
|
|
10
|
-
</select>
|
|
11
|
-
<span id="wf-last-load" class="muted"></span>
|
|
12
|
-
</form>
|
|
13
|
-
<table>
|
|
14
|
-
<thead><tr>
|
|
15
|
-
<th>${r(i("workflow.table.run"))}</th><th>${r(i("workflow.table.workflow"))}</th><th>${r(i("workflow.table.status"))}</th>
|
|
16
|
-
<th>${r(i("workflow.table.lastSeq"))}</th><th>${r(i("workflow.table.dangling"))}</th><th>${r(i("workflow.table.updated"))}</th>
|
|
17
|
-
<th>${r(i("workflow.table.chatApp"))}</th>
|
|
18
|
-
</tr></thead>
|
|
19
|
-
<tbody id="wf-tbody"></tbody>
|
|
20
|
-
</table>
|
|
21
|
-
`}var Ct=5e3,Ht=2e3,B=new Set(["succeeded","failed","cancelled"]);function r(t){return t.replace(/[&<>"']/g,e=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[e])}function qt(t){let e=new Date(t),a=Date.now()-t;return a<6e4?i("time.secondsAgo",{value:Math.max(1,Math.floor(a/1e3))}):a<36e5?i("time.minutesAgo",{value:Math.floor(a/6e4)}):a<864e5?i("time.hoursAgo",{value:Math.floor(a/36e5)}):e.toISOString().slice(0,19).replace("T"," ")}function M(t){return`<span class="${B.has(t)?"wf-status terminal":"wf-status live"} wf-status-${r(t)}">${r(C(t))}</span>`}function C(t){let e=`workflow.status.${t}`,n=i(e);return n===e?t:n}function Te(t){let e=location.hash.match(/^#\/legacy-workflow\/([^?#]+)(?:\?([^#]*))?$/);if(e){let n=new URLSearchParams(e[2]??"");return Ot(t,decodeURIComponent(e[1]),{focusAttemptId:n.get("attempt")??void 0})}return Pt(t)}function Pt(t){t.innerHTML=Rt();let e=t.querySelector("#wf-tbody"),n=t.querySelector("#wf-filters"),a=t.querySelector("#wf-last-load"),o=[],s=null,d=!1,c=null,f=!1;function h($){let I=(new FormData(n).get("q")??"").trim().toLowerCase();return I?$.filter(g=>g.runId.toLowerCase().includes(I)||g.workflowId.toLowerCase().includes(I)||(g.chatId??"").toLowerCase().includes(I)):$}function v(){let $=h(o);if($.length===0){e.innerHTML=`<tr><td colspan="7" class="empty">${c?r(i("workflow.list.failedLoad",{error:c})):o.length===0?r(i("workflow.list.noRuns")):r(i("workflow.list.noFilterMatch"))}</td></tr>`;return}e.innerHTML=$.map(m=>{let I=`${m.dEf}/${m.dAct}/${m.dWait}`,g=m.dEf+m.dAct+m.dWait>0?"wf-dangling has":"wf-dangling none",b=[];m.chatId&&b.push(r(m.chatId)),m.larkAppId&&b.push(`<span class="muted">${r(m.larkAppId)}</span>`);let O=b.length>0?b.join("<br/>"):"\u2014",L=xt(m);return`<tr data-runid="${r(m.runId)}">
|
|
22
|
-
<td><a href="#/legacy-workflow/${encodeURIComponent(m.runId)}"><code>${r(m.runId)}</code></a></td>
|
|
23
|
-
<td>${r(m.workflowId)}</td>
|
|
24
|
-
<td>${M(m.status)}${m.failedNodeId?` <span class="muted">(${r(m.failedNodeId)})</span>`:""}${L}</td>
|
|
25
|
-
<td>${m.lastSeq}</td>
|
|
26
|
-
<td class="${g}">${I}</td>
|
|
27
|
-
<td title="${r(new Date(m.updatedAt).toISOString())}">${qt(m.updatedAt)}</td>
|
|
28
|
-
<td>${O}</td>
|
|
29
|
-
</tr>`}).join("")}function k(){c?(a.textContent=i("workflow.list.error",{error:c}),a.classList.add("error")):(a.textContent=i("workflow.list.loaded",{count:o.length,time:new Date().toLocaleTimeString()}),a.classList.remove("error"))}async function u(){if(!(f||d)&&!document.hidden){d=!0;try{let $=n.elements.namedItem("status")?.value??"",m=new URLSearchParams;$==="all"?m.set("all","1"):$&&m.set("status",$);let I="/api/workflows/runs"+(m.toString()?`?${m}`:""),g=await fetch(I);g.ok?(o=(await g.json()).runs??[],c=null):(c=`HTTP ${g.status}`,o=[])}catch($){c=$?.message??String($),o=[]}finally{d=!1,f||(v(),k())}}}function y(){s!==null&&window.clearTimeout(s),s=window.setTimeout(async()=>{await u(),f||y()},Ct)}function P(){document.hidden||u()}return n.addEventListener("input",()=>{v()}),n.addEventListener("change",$=>{$.target.getAttribute("name")==="status"&&u()}),document.addEventListener("visibilitychange",P),u().then(()=>{f||y()}),()=>{f=!0,s!==null&&window.clearTimeout(s),document.removeEventListener("visibilitychange",P)}}function Ot(t,e,n={}){t.innerHTML=`
|
|
30
|
-
<div class="wf-detail-head">
|
|
31
|
-
<a class="btn-link" href="#/legacy-workflow">${r(i("workflow.detail.back"))}</a>
|
|
32
|
-
<div>
|
|
33
|
-
<h2><code>${r(e)}</code></h2>
|
|
34
|
-
<div id="wf-detail-subtitle" class="muted">${r(i("workflow.detail.loading"))}</div>
|
|
35
|
-
</div>
|
|
36
|
-
<button id="wf-cancel-run" type="button" class="contrast" hidden>${r(i("workflow.detail.cancel"))}</button>
|
|
37
|
-
<span id="wf-detail-refresh" class="muted"></span>
|
|
38
|
-
</div>
|
|
39
|
-
<section id="wf-detail-error" class="hint-warn" hidden></section>
|
|
40
|
-
<section id="wf-cancel-status" class="hint-ok" hidden></section>
|
|
41
|
-
<section id="wf-summary" class="wf-summary-grid"></section>
|
|
42
|
-
<section id="wf-dangling-panel"></section>
|
|
43
|
-
<section class="wf-panel">
|
|
44
|
-
<div class="wf-panel-title">
|
|
45
|
-
<h3>${r(i("workflow.detail.parallel"))}</h3>
|
|
46
|
-
<span id="wf-parallel-meta" class="muted"></span>
|
|
47
|
-
</div>
|
|
48
|
-
<div id="wf-parallel-view"></div>
|
|
49
|
-
</section>
|
|
50
|
-
<section class="wf-panel">
|
|
51
|
-
<div class="wf-panel-title">
|
|
52
|
-
<h3>${r(i("workflow.detail.nodes"))}</h3>
|
|
53
|
-
</div>
|
|
54
|
-
<div class="wf-table-scroll">
|
|
55
|
-
<table>
|
|
56
|
-
<thead><tr>
|
|
57
|
-
<th>${r(i("workflow.detail.node"))}</th><th>${r(i("workflow.detail.nodeStatus"))}</th><th>${r(i("workflow.detail.activity"))}</th><th>${r(i("workflow.detail.activityStatus"))}</th>
|
|
58
|
-
<th>${r(i("workflow.detail.attempts"))}</th><th>${r(i("workflow.detail.current"))}</th><th>${r(i("workflow.detail.detail"))}</th>
|
|
59
|
-
</tr></thead>
|
|
60
|
-
<tbody id="wf-node-tbody"></tbody>
|
|
61
|
-
</table>
|
|
62
|
-
</div>
|
|
63
|
-
</section>
|
|
64
|
-
<section class="wf-panel">
|
|
65
|
-
<div class="wf-panel-title">
|
|
66
|
-
<h3>${r(i("workflow.detail.nodeIO"))}</h3>
|
|
67
|
-
</div>
|
|
68
|
-
<div id="wf-io-list" class="wf-io-list"></div>
|
|
69
|
-
</section>
|
|
70
|
-
<section class="wf-panel">
|
|
71
|
-
<div class="wf-panel-title">
|
|
72
|
-
<h3>${r(i("workflow.detail.timeline"))}</h3>
|
|
73
|
-
<button id="wf-load-older" type="button" hidden>${r(i("workflow.detail.loadOlder"))}</button>
|
|
74
|
-
</div>
|
|
75
|
-
<div class="wf-table-scroll wf-timeline-scroll">
|
|
76
|
-
<table>
|
|
77
|
-
<thead><tr>
|
|
78
|
-
<th>${r(i("workflow.detail.seq"))}</th><th>${r(i("workflow.detail.event"))}</th><th>${r(i("workflow.detail.actor"))}</th><th>${r(i("workflow.detail.node"))}</th><th>${r(i("workflow.detail.activity"))}</th><th>${r(i("workflow.detail.error"))}</th><th>${r(i("workflow.detail.time"))}</th>
|
|
79
|
-
</tr></thead>
|
|
80
|
-
<tbody id="wf-event-tbody"></tbody>
|
|
81
|
-
</table>
|
|
82
|
-
</div>
|
|
83
|
-
<div id="wf-event-meta" class="muted"></div>
|
|
84
|
-
</section>
|
|
85
|
-
`;let a=t.querySelector("#wf-detail-subtitle"),o=t.querySelector("#wf-detail-refresh"),s=t.querySelector("#wf-detail-error"),d=t.querySelector("#wf-cancel-status"),c=t.querySelector("#wf-summary"),f=t.querySelector("#wf-dangling-panel"),h=t.querySelector("#wf-parallel-view"),v=t.querySelector("#wf-parallel-meta"),k=t.querySelector("#wf-node-tbody"),u=t.querySelector("#wf-io-list"),y=t.querySelector(".wf-timeline-scroll"),P=t.querySelector("#wf-event-tbody"),$=t.querySelector("#wf-event-meta"),m=t.querySelector("#wf-cancel-run"),I=t.querySelector("#wf-load-older"),g=null,b=[],O=new Set,L=null,N=null,x=!1,U=0,H=null,j=!1,Z=!1,_=!1,St=new Set,$t=new Map,rt=new Map,F=new Map,K=new Set,V=new Map,q=new Set,D=new Map,bt=new Map,it=0,ot=n.focusAttemptId;function T(l){if(!l){s.hidden=!0,s.textContent="";return}s.hidden=!1,s.textContent=l}function at(l){if(!l){d.hidden=!0,d.textContent="";return}d.hidden=!1,d.textContent=l}async function st(){let l=await fetch(`/api/workflows/runs/${encodeURIComponent(e)}/snapshot`);if(l.status===404)throw new Error(i("workflow.detail.unknownRun"));if(!l.ok)throw new Error(i("workflow.detail.snapshotHttp",{status:l.status}));g=await l.json()}async function J(l){let S=await fetch(`/api/workflows/runs/${encodeURIComponent(e)}/events?${l}`);if(S.status===404)throw new Error(i("workflow.detail.unknownRun"));if(!S.ok)throw new Error(i("workflow.detail.eventsHttp",{status:S.status}));return await S.json()}function z(l,S){let p=l.filter(w=>O.has(w.eventId)?!1:(O.add(w.eventId),!0));p.length!==0&&(b=S==="prepend"?[...p,...b]:[...b,...p],b.sort((w,R)=>W(w.eventId)-W(R.eventId)))}async function It(){await st();let l=await J(new URLSearchParams({tail:"100"}));b=[],O=new Set,z(l.events,"append"),L=l.oldestSeq,N=l.newestSeq,x=l.hasOlder,U=l.totalCount,A()}async function G(){if(!(j||Z||document.hidden)){Z=!0;try{if(await st(),N!==null){let l=await J(new URLSearchParams({afterSeq:String(N),limit:"200"}));z(l.events,"append"),l.newestSeq!==null&&(N=l.newestSeq),L===null&&l.oldestSeq!==null&&(L=l.oldestSeq),U=l.totalCount}else{let l=await J(new URLSearchParams({tail:"1"}));z(l.events,"append"),L=l.oldestSeq,N=l.newestSeq,x=l.hasOlder,U=l.totalCount}T(null),A()}catch(l){T(l?.message??String(l))}finally{Z=!1}}}async function Tt(){if(!(L===null||!x)){I.disabled=!0;try{let l=await J(new URLSearchParams({beforeSeq:String(L),limit:"100"}));z(l.events,"prepend"),l.oldestSeq!==null&&(L=l.oldestSeq),x=l.hasOlder,U=l.totalCount,T(null),A()}catch(l){T(l?.message??String(l))}finally{I.disabled=!1}}}async function At(){if(!g||B.has(g.run.status)||_)return;if(!g.chatBinding?.larkAppId){T(i("workflow.detail.cancelUnavailable",{runId:e}));return}let l=Ut(g),S=i("workflow.detail.cancelConfirm",{runId:e,...l});if(window.confirm(S)){_=!0,m.disabled=!0;try{let p=await fetch(`/api/workflows/runs/${encodeURIComponent(e)}/cancel`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({reason:"cancelled via dashboard"})});if(p.status===401)throw new Error(i("workflow.detail.writeAccessCancel"));let w=await p.json().catch(()=>({}));if(!p.ok||!w.ok)throw new Error(w.hint??w.error??i("workflow.detail.cancelHttp",{status:p.status}));at(w.pending?i("workflow.detail.cancelPending"):null),T(null),await G()}catch(p){T(p?.message??String(p))}finally{_=!1,m.disabled=!1,A()}}}async function Et(l,S){if(!q.has(l)){q.add(l),D.delete(l),A();try{let p=await fetch(`/api/workflows/runs/${encodeURIComponent(e)}/attempts/${encodeURIComponent(S)}/${encodeURIComponent(l)}/resume`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})});if(p.status===401)throw new Error(i("workflow.detail.writeAccessResume"));let w=await p.json().catch(()=>({}));if(!p.ok||!w.ok||!w.resumeId||!w.url)throw new Error(w.hint??w.message??w.error??i("workflow.detail.resumeStartFailed",{status:p.status}));V.set(l,{resumeId:w.resumeId,url:w.url})}catch(p){let w=p?.message??String(p);D.set(l,w)}finally{q.delete(l),A()}}}async function Lt(l,S){if(!q.has(l)){q.add(l),D.delete(l),A();try{let p=await fetch(`/api/workflows/runs/${encodeURIComponent(e)}/attempts/${encodeURIComponent(S)}/${encodeURIComponent(l)}/resume/end`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({reason:"ended_by_dashboard"})});if(p.status===401)throw new Error(i("workflow.detail.writeAccessResume"));let w=await p.json().catch(()=>({}));if(!p.ok||!w.ok)if(w.error==="resume_not_running")V.delete(l);else throw new Error(w.hint??w.message??w.error??i("workflow.detail.resumeEndFailed",{status:p.status}));else V.delete(l)}catch(p){let w=p?.message??String(p);D.set(l,w)}finally{q.delete(l),A()}}}async function Mt(l,S){if(!K.has(l)){K.add(l),F.delete(l),A();try{let p=rt.get(l)?.trim()||void 0,w=await fetch(`/api/workflows/runs/${encodeURIComponent(e)}/${S}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({comment:p})});if(w.status===401)throw new Error(i("workflow.detail.writeAccessApproval"));let R=await w.json().catch(()=>({}));if(!w.ok||!R.ok)throw new Error(R.hint??R.message??R.error??i("workflow.detail.actionHttp",{action:S,status:w.status}));let et=S==="approve"?i("workflow.detail.approved"):i("workflow.detail.rejected");F.set(l,{kind:"ok",text:R.alreadyTerminal?i("workflow.detail.alreadyTerminal",{label:et}):R.pending?i("workflow.detail.workflowContinue",{label:et}):i("workflow.detail.workflowRefreshing",{label:et})}),T(null),await G()}catch(p){let w=p?.message??String(p);F.set(l,{kind:"error",text:w}),T(w)}finally{K.delete(l),A()}}}function A(){if(!g)return;it=y.scrollTop;let l=g.run;B.has(l.status)&&at(null),a.innerHTML=`${r(l.workflowId??"?")} \xB7 ${M(l.status)} \xB7 lastSeq ${g.lastSeq}`,o.textContent=i("workflow.detail.refreshed",{time:new Date().toLocaleTimeString()}),m.hidden=B.has(l.status),m.disabled=_||!g.chatBinding?.larkAppId,m.textContent=g.chatBinding?.larkAppId?i("workflow.detail.cancel"):i("workflow.detail.cliCancelOnly"),m.title=g.chatBinding?.larkAppId?i("workflow.detail.cancelTitle"):i("workflow.detail.cliCancelTitle",{runId:e}),Nt(c,g),jt(f,g),Dt(h,v,g,b),Vt(k,g),Jt(u,g,St,$t,{comments:rt,statuses:F,resolving:K,onResolve:Mt},{sessions:V,pending:q,errors:D,onStart:Et,onEnd:Lt},ot,bt)&&(ot=void 0),he(P,b),y.scrollTop=it,I.hidden=!x,$.textContent=i("workflow.detail.eventsLoaded",{loaded:b.length,total:U})}function tt(){if(H!==null&&window.clearTimeout(H),g&&B.has(g.run.status)){H=null;return}H=window.setTimeout(async()=>{await G(),j||tt()},Ht)}function lt(){document.hidden||G().then(()=>{!j&&H===null&&tt()})}return I.addEventListener("click",()=>{Tt()}),m.addEventListener("click",()=>{At()}),document.addEventListener("visibilitychange",lt),It().then(()=>{T(null),j||tt()}).catch(l=>{T(l?.message??String(l)),a.textContent=i("workflow.detail.loadFailed")}),()=>{j=!0,H!==null&&window.clearTimeout(H),document.removeEventListener("visibilitychange",lt)}}function Nt(t,e){let n=e.run,a=[[i("workflow.summary.workflow"),r(n.workflowId??"?")],[i("workflow.summary.status"),M(n.status)],[i("workflow.summary.lastSeq"),String(e.lastSeq)],[i("workflow.summary.updated"),r(new Date(e.updatedAt).toLocaleString())],[i("workflow.summary.revision"),r(Y(n.revisionId))],[i("workflow.summary.initiator"),r(n.initiator??"-")]];n.failedNodeId&&a.push([i("workflow.summary.failedNode"),r(n.failedNodeId)]),n.cancelOriginEventId&&a.push([i("workflow.summary.cancelOrigin"),r(n.cancelOriginEventId)]),e.chatBinding&&(a.push([i("workflow.summary.chat"),`<code>${r(e.chatBinding.chatId)}</code>`]),a.push([i("workflow.summary.app"),`<code>${r(e.chatBinding.larkAppId)}</code>`])),t.innerHTML=a.map(([o,s])=>`<div class="wf-summary-item"><span>${o}</span><strong>${s}</strong></div>`).join("")}function xt(t){if(!t.errorCode)return"";let e=t.errorMessage?` \u2014 ${be(t.errorMessage,96)}`:"";return`<div class="wf-run-error">
|
|
86
|
-
<span class="muted error">${r(t.errorCode)}</span>${r(e)}
|
|
87
|
-
</div>`}function Ut(t){let e=t.dangling;return{total:new Set([...e.activities,...e.effectAttempted,...e.waits,...e.cancels]).size,effects:e.effectAttempted.length,activities:e.activities.length,waits:e.waits.length,cancels:e.cancels.length}}function jt(t,e){let n=e.dangling,a=[[i("workflow.dangling.activities"),n.activities],[i("workflow.dangling.effects"),n.effectAttempted],[i("workflow.dangling.waits"),n.waits],[i("workflow.dangling.cancels"),n.cancels]],o=new Set(a.flatMap(([,s])=>s)).size;if(t.className=o>0?"wf-panel wf-dangling-panel has":"wf-panel wf-dangling-panel",o===0){t.innerHTML=`<div class="wf-panel-title"><h3>${r(i("workflow.detail.dangling"))}</h3></div><div class="muted">${r(i("workflow.detail.noDangling"))}</div>`;return}t.innerHTML=`<div class="wf-panel-title"><h3>${r(i("workflow.detail.dangling"))}</h3><span class="wf-dangling has">${o}</span></div>
|
|
88
|
-
<div class="wf-dangling-grid">
|
|
89
|
-
${a.map(([s,d])=>`<div><strong>${s}</strong>${d.length===0?`<div class="muted">${r(i("workflow.detail.none"))}</div>`:`<ul>${d.map(c=>`<li><code>${r(c)}</code></li>`).join("")}</ul>`}</div>`).join("")}
|
|
90
|
-
</div>`}function Dt(t,e,n,a){let o=Bt(a,n);if(o.length===0){e.textContent="",t.innerHTML=`<div class="empty">${r(i("workflow.detail.noParallelData"))}</div>`;return}let s=Date.now(),d=Math.min(...o.map(u=>u.startedAt)),c=Math.max(...o.map(u=>u.endedAt??s),d+1e3),f=Math.max(1,c-d),h=_t(o,s),v=o.filter(u=>!u.endedAt&&(u.status==="running"||u.status==="effectAttempting")).length;e.textContent=i("workflow.detail.parallelMeta",{count:o.length,max:h,running:v});let k=o.sort((u,y)=>u.startedAt-y.startedAt||u.activityId.localeCompare(y.activityId)).map(u=>Wt(u,d,f,s)).join("");t.innerHTML=`<div class="wf-parallel-axis">
|
|
91
|
-
<span title="${r(new Date(d).toISOString())}">${r(X(d))}</span>
|
|
92
|
-
<span title="${r(new Date(c).toISOString())}">${r(X(c))}</span>
|
|
93
|
-
</div>
|
|
94
|
-
<div class="wf-parallel-list">${k}</div>`}function Bt(t,e){let n=new Map,a=new Map(e.activities.map(o=>[o.activityId,o.ownerNodeId]));for(let o of[...t].sort((s,d)=>W(s.eventId)-W(d.eventId))){let s=$e(o);if(!s)continue;let d=typeof s.activityId=="string"?s.activityId:void 0,c=typeof s.attemptId=="string"?s.attemptId:void 0;if(!d||!c)continue;let f=n.get(c);if(o.type==="attemptCreated"){let h=typeof s.attemptNumber=="number"?s.attemptNumber:void 0;f={nodeId:typeof s.nodeId=="string"?s.nodeId:a.get(d),activityId:d,attemptId:c,attemptNumber:h,status:"pending",startedAt:o.timestamp},n.set(c,f);continue}f||(f={nodeId:a.get(d),activityId:d,attemptId:c,status:"pending",startedAt:o.timestamp},n.set(c,f)),o.type==="activityRunning"?(f.status="running",f.runningAt=o.timestamp):o.type==="effectAttempted"?f.status="effectAttempting":o.type==="activityWaiting"||o.type==="waitCreated"?f.status="waiting":Ft(o.type)&&(f.status=Kt(o.type),f.endedAt=o.timestamp,f.endType=o.type)}return[...n.values()]}function Wt(t,e,n,a){let o=t.endedAt??a,s=ut((t.startedAt-e)/n*100,0,100),d=ut((Math.max(o,t.startedAt+1)-t.startedAt)/n*100,.7,100-s),c=t.nodeId??t.activityId,f=t.attemptNumber!==void 0?`#${t.attemptNumber}`:Y(t.attemptId),h=[`${c} ${t.status}`,`${new Date(t.startedAt).toISOString()} \u2192 ${t.endedAt?new Date(t.endedAt).toISOString():i("workflow.detail.parallelNow")}`,t.endType?`end: ${t.endType}`:void 0].filter(Boolean).join(`
|
|
95
|
-
`);return`<div class="wf-parallel-row">
|
|
96
|
-
<div class="wf-parallel-label">
|
|
97
|
-
<code>${r(c)}</code>
|
|
98
|
-
<span class="muted">${r(t.activityId)} \xB7 ${r(f)}</span>
|
|
99
|
-
</div>
|
|
100
|
-
<div class="wf-parallel-track">
|
|
101
|
-
<div class="wf-parallel-bar wf-parallel-${r(t.status)}" style="left:${s.toFixed(3)}%;width:${d.toFixed(3)}%;" title="${r(h)}">
|
|
102
|
-
<span>${r(C(t.status))}</span>
|
|
103
|
-
</div>
|
|
104
|
-
</div>
|
|
105
|
-
</div>`}function _t(t,e){let n=[];for(let s of t)n.push({time:s.startedAt,delta:1}),n.push({time:s.endedAt??e,delta:-1});n.sort((s,d)=>s.time-d.time||d.delta-s.delta);let a=0,o=0;for(let s of n)a+=s.delta,o=Math.max(o,a);return o}function Ft(t){return t==="activitySucceeded"||t==="activityFailed"||t==="activityTimedOut"||t==="activityCanceled"}function Kt(t){return t==="activitySucceeded"?"succeeded":t==="activityCanceled"?"cancelled":t==="activityTimedOut"?"timedOut":"failed"}function Vt(t,e){let n=new Map(e.activities.map(s=>[s.activityId,s])),a=new Set,o=[];for(let s of e.nodes){let d=(s.activityId?n.get(s.activityId):void 0)??e.activities.find(c=>c.ownerNodeId===s.nodeId);d&&a.add(d.activityId),o.push(dt(s,d))}for(let s of e.activities)a.has(s.activityId)||o.push(dt(void 0,s));t.innerHTML=o.length>0?o.join(""):`<tr><td colspan="7" class="empty">${r(i("workflow.detail.noNodes"))}</td></tr>`}function dt(t,e){let n=e?.attempts[e.attempts.length-1];return`<tr>
|
|
106
|
-
<td>${t?`<code>${r(t.nodeId)}</code>`:'<span class="muted">-</span>'}</td>
|
|
107
|
-
<td>${t?M(t.status):'<span class="muted">-</span>'}</td>
|
|
108
|
-
<td>${e?`<code>${r(e.activityId)}</code>`:'<span class="muted">-</span>'}</td>
|
|
109
|
-
<td>${e?M(e.status):'<span class="muted">-</span>'}</td>
|
|
110
|
-
<td>${e?.attempts.length??0}</td>
|
|
111
|
-
<td>${n?`<code>${r(n.attemptId)}</code>`:'<span class="muted">-</span>'}</td>
|
|
112
|
-
<td>${n?ye(n):`<span class="muted">${r(i("workflow.detail.idle"))}</span>`}</td>
|
|
113
|
-
</tr>`}function Jt(t,e,n,a,o,s,d,c){fe(t,n,a),le(t,o.comments);let f=!!(d&&e.attemptIO?.[d]?.terminal);f&&d&&n.add(nt(d,i("workflow.detail.liveTerminal")));let h=zt(e),v=new Set;if(c){for(let u of h){v.add(u.key);let y=c.get(u.key);y||(y=Gt(u.key),c.set(u.key,y),t.appendChild(y.article)),Qt(y,u,n,o,s,d)}for(let[u,y]of Array.from(c))v.has(u)||(y.article.remove(),c.delete(u));if(h.length===0){if(!t.querySelector(".wf-io-empty-placeholder")){let u=document.createElement("div");u.className="empty wf-io-empty-placeholder",u.textContent=i("workflow.detail.noNodeIO"),t.appendChild(u)}}else t.querySelector(".wf-io-empty-placeholder")?.remove()}else{let u=[];for(let y of h)u.push(ee(y,n,o,s,d));t.innerHTML=u.length>0?u.join(""):`<div class="empty">${r(i("workflow.detail.noNodeIO"))}</div>`}me(t,a);let k=ue(t,d);return we(t,n),pe(t,a),ce(t,o),kt(t,s),k&&f}function zt(t){let e=new Map(t.activities.map(o=>[o.activityId,o])),n=new Set,a=[];for(let o of t.nodes){let s=(o.activityId?e.get(o.activityId):void 0)??t.activities.find(d=>d.ownerNodeId===o.nodeId);if(!s){a.push({key:`node:${o.nodeId}`,node:o});continue}n.add(s.activityId),a.push({key:`activity:${s.activityId}`,node:o,activity:s,io:t.attemptIO?.[Q(s)?.attemptId??""]})}for(let o of t.activities)n.has(o.activityId)||a.push({key:`activity:${o.activityId}`,activity:o,io:t.attemptIO?.[Q(o)?.attemptId??""]});return a}function Gt(t){let e=document.createElement("article");e.className="wf-io-card",e.dataset.wfCardKey=t;let n=document.createElement("div");n.className="wf-io-card-head";let a=document.createElement("div");a.className="wf-io-terminal-slot";let o=document.createElement("div");return o.className="wf-io-grid",e.appendChild(n),e.appendChild(a),e.appendChild(o),{article:e,head:n,terminalSlot:a,grid:o,currentTerminalUrl:null}}function Qt(t,e,n,a,o,s){let d=Q(e.activity),c=e.node?.nodeId??e.activity?.ownerNodeId??e.activity?.activityId??"unknown",f=!!(d&&d.attemptId===s);t.article.classList.toggle("is-focused",f),d?t.article.dataset.wfAttemptCard=d.attemptId:delete t.article.dataset.wfAttemptCard;let h=ht(d,a);t.head.innerHTML=`
|
|
114
|
-
<header>
|
|
115
|
-
<div>
|
|
116
|
-
<strong><code>${r(c)}</code></strong>
|
|
117
|
-
<span class="muted">${e.activity?r(e.activity.activityId):r(i("workflow.detail.notDispatched"))}</span>
|
|
118
|
-
</div>
|
|
119
|
-
<div>${e.node?M(e.node.status):""} ${e.activity?M(e.activity.status):""}</div>
|
|
120
|
-
</header>
|
|
121
|
-
<div class="wf-io-meta">
|
|
122
|
-
${d?`${r(i("workflow.detail.attempt"))} <code>${r(d.attemptId)}</code>`:r(i("workflow.detail.noAttempt"))}
|
|
123
|
-
</div>
|
|
124
|
-
${h}
|
|
125
|
-
`;let v=ft(d,e.activity,e.io?.terminal,o),k=v?.url??null;if(k!==t.currentTerminalUrl)v===null?t.terminalSlot.innerHTML="":t.terminalSlot.innerHTML=wt(e.key,d,e.activity,e.io?.terminal,v,n,o),t.currentTerminalUrl=k;else if(v!==null&&e.io?.terminal){let y=t.terminalSlot.querySelector("details.wf-terminal-block > summary");if(y){let P=mt(v.kind);y.innerHTML=`${r(P)} ${yt(d,e.io.terminal)}`}d&&de(t.terminalSlot,d,e.activity,e.io.terminal,v,o)}let u=d?.attemptId??e.activity?.activityId??e.node?.nodeId??"unknown";t.grid.innerHTML=`
|
|
126
|
-
${E(u,i("workflow.detail.authoredInput"),e.io?.input,n)}
|
|
127
|
-
${E(u,i("workflow.detail.resolvedInput"),e.io?.resolvedInput,n)}
|
|
128
|
-
${E(u,i("workflow.detail.output"),e.io?.output,n)}
|
|
129
|
-
${E(u,i("workflow.detail.executionLog"),e.io?.log,n)}
|
|
130
|
-
${e.io?.waitPrompt?E(u,i("workflow.detail.waitPrompt"),e.io.waitPrompt,n):""}
|
|
131
|
-
`}function ft(t,e,n,a){if(!n||n.error)return null;if(ne(t,n))return{kind:"live",url:ie(n)};if(!t||!e||!re(t,n))return null;let o=ae();if(!o)return null;let s=a?.sessions.get(t.attemptId);return s?{kind:"resume",url:s.url,resumeId:s.resumeId,downloadUrl:ct(o,e.activityId,t.attemptId)}:{kind:"replay",url:oe(o,e.activityId,t.attemptId,!!n.hasPtyLog),downloadUrl:ct(o,e.activityId,t.attemptId)}}function wt(t,e,n,a,o,s,d){if(!a)return"";let c=mt(o.kind),f=nt(t,c),h=yt(e,a),v=Xt(o.kind),k=o.kind==="replay"||o.kind==="resume"?`<a class="btn-link" href="${r(o.downloadUrl)}" download>${r(i("workflow.detail.downloadFullLog"))}</a>`:"",u=e?gt(e,n,a,o,d):"",y=e?vt(e.attemptId,d):"";return`<details class="wf-io-block wf-terminal-block" data-io-key="${r(f)}"${s.has(f)?" open":""}>
|
|
132
|
-
<summary>${r(c)} ${h}</summary>
|
|
133
|
-
<div class="wf-terminal-actions">
|
|
134
|
-
<a class="btn-link" href="${r(o.url)}" target="_blank" rel="noreferrer">${r(v)}</a>
|
|
135
|
-
${k}
|
|
136
|
-
${u}
|
|
137
|
-
</div>
|
|
138
|
-
${y}
|
|
139
|
-
<iframe class="wf-terminal-frame" src="${r(o.url)}" title="${r(c)}" loading="lazy"></iframe>
|
|
140
|
-
</details>`}function mt(t){return t==="live"?i("workflow.detail.liveTerminal"):t==="resume"?i("workflow.detail.terminalResume"):i("workflow.detail.terminalReplay")}function Xt(t){return t==="live"?i("workflow.detail.openTerminalNewTab"):t==="resume"?i("workflow.detail.openResumeNewTab"):i("workflow.detail.openReplayNewTab")}var pt=new Set(["antigravity","codex-app","cursor","mira"]),Yt=new Set(["aiden","coco","claude-code","seed","relay","codex","mtr","hermes","pi","mir"]);function Zt(t){return!!t&&(Yt.has(t)||pt.has(t))}function te(t){return!!t&&pt.has(t)}function gt(t,e,n,a,o){if(!o||a.kind==="live"||!e)return"";let s=a.kind==="resume",d=o.pending.has(t.attemptId),c=`data-wf-resume-attempt="${r(t.attemptId)}" data-wf-resume-activity="${r(e.activityId)}"`;return s?`<button type="button" class="btn-link" data-wf-resume-button="1" data-wf-resume-action="end" ${c}${d?" disabled":""}>${r(d?i("workflow.detail.resumeEnding"):i("workflow.detail.endResumeSession"))}</button>`:Zt(n.cliId)?te(n.cliId)&&!n.cliSessionId?`<button type="button" class="btn-link" data-wf-resume-button="1" disabled title="${r(i("workflow.detail.resumeMissingCliSession"))}">${r(i("workflow.detail.resumeSession"))}</button>`:`<button type="button" class="btn-link" data-wf-resume-button="1" data-wf-resume-action="start" ${c}${d?" disabled":""}>${r(d?i("workflow.detail.resumeStarting"):i("workflow.detail.resumeSession"))}</button>`:`<button type="button" class="btn-link" data-wf-resume-button="1" disabled title="${r(i("workflow.detail.resumeUnsupportedCli",{cliId:n.cliId??"?"}))}">${r(i("workflow.detail.resumeSession"))}</button>`}function vt(t,e){if(!e)return"";let n=e.errors.get(t);return n?`<div class="hint-warn wf-resume-status" data-wf-resume-status="${r(t)}">${r(n)}</div>`:""}function ee(t,e,n,a,o){let s=Q(t.activity),d=t.node?.nodeId??t.activity?.ownerNodeId??t.activity?.activityId??"unknown",c=s?.attemptId??t.activity?.activityId??t.node?.nodeId??"unknown",f=ht(s,n),h=s?.attemptId===o?" is-focused":"",v=s?` data-wf-attempt-card="${r(s.attemptId)}"`:"",k=ft(s,t.activity,t.io?.terminal,a),u=k?wt(c,s,t.activity,t.io?.terminal,k,e,a):"";return`<article class="wf-io-card${h}" data-wf-card-key="${r(t.key)}"${v}>
|
|
141
|
-
<div class="wf-io-card-head">
|
|
142
|
-
<header>
|
|
143
|
-
<div>
|
|
144
|
-
<strong><code>${r(d)}</code></strong>
|
|
145
|
-
<span class="muted">${t.activity?r(t.activity.activityId):r(i("workflow.detail.notDispatched"))}</span>
|
|
146
|
-
</div>
|
|
147
|
-
<div>${t.node?M(t.node.status):""} ${t.activity?M(t.activity.status):""}</div>
|
|
148
|
-
</header>
|
|
149
|
-
<div class="wf-io-meta">
|
|
150
|
-
${s?`${r(i("workflow.detail.attempt"))} <code>${r(s.attemptId)}</code>`:r(i("workflow.detail.noAttempt"))}
|
|
151
|
-
</div>
|
|
152
|
-
${f}
|
|
153
|
-
</div>
|
|
154
|
-
<div class="wf-io-terminal-slot">${u}</div>
|
|
155
|
-
<div class="wf-io-grid">
|
|
156
|
-
${E(c,i("workflow.detail.authoredInput"),t.io?.input,e)}
|
|
157
|
-
${E(c,i("workflow.detail.resolvedInput"),t.io?.resolvedInput,e)}
|
|
158
|
-
${E(c,i("workflow.detail.output"),t.io?.output,e)}
|
|
159
|
-
${E(c,i("workflow.detail.executionLog"),t.io?.log,e)}
|
|
160
|
-
${t.io?.waitPrompt?E(c,i("workflow.detail.waitPrompt"),t.io.waitPrompt,e):""}
|
|
161
|
-
</div>
|
|
162
|
-
</article>`}function Q(t){return t?.attempts[t.attempts.length-1]}function yt(t,e){let n=[];return e.error?n.push(i("workflow.detail.error")):n.push(e.status==="live"?i("workflow.detail.terminalLive"):i("workflow.detail.terminalClosedShort")),t?.status&&n.push(t.status),e.webPort>0&&n.push(`:${e.webPort}`),`<span class="muted">${r(n.join(" \xB7 "))}</span>`}function ne(t,e){return e.status==="live"&&e.webPort>0&&(t?.status==="pending"||t?.status==="running"||t?.status==="effectAttempting")}function re(t,e){return t.status==="succeeded"||t.status==="failed"||t.status==="cancelled"||t.status==="timedOut"?!!(e.sessionId||e.startedAt):!1}function ie(t){return`http://${window.location.hostname||"127.0.0.1"}:${t.webPort}`}function oe(t,e,n,a){let o=new URLSearchParams({runId:t,activityId:e,attemptId:n});return a&&o.set("hasPtyLog","1"),`/assets/terminal-replay.html?${o.toString()}`}function ct(t,e,n){return`/api/workflows/runs/${encodeURIComponent(t)}/attempts/${encodeURIComponent(e)}/${encodeURIComponent(n)}/terminal-log/raw?download=1`}function ae(){let t=window.location.hash.match(/^#\/legacy-workflow\/([^/?#]+)/);if(!t)return null;try{return decodeURIComponent(t[1])}catch{return null}}function ht(t,e){if(!se(t))return"";let n=t.attemptId,a=e.comments.get(n)??"",o=e.resolving.has(n),s=e.statuses.get(n),d=s?.kind==="error"?"hint-warn":"hint-ok";return`<div class="wf-approval-box" data-wf-approval="${r(n)}">
|
|
163
|
-
<label>
|
|
164
|
-
<span>${r(i("workflow.detail.approvalComment"))}</span>
|
|
165
|
-
<textarea class="wf-approval-comment" data-wf-approval-comment="${r(n)}" rows="2" placeholder="${r(i("workflow.detail.optionalComment"))}"${o?" disabled":""}>${r(a)}</textarea>
|
|
166
|
-
</label>
|
|
167
|
-
<div class="wf-approval-actions">
|
|
168
|
-
<button type="button" class="primary" data-wf-approval-action="approve" data-wf-attempt-id="${r(n)}"${o?" disabled":""}>${r(i("workflow.detail.approve"))}</button>
|
|
169
|
-
<button type="button" data-wf-approval-action="reject" data-wf-attempt-id="${r(n)}"${o?" disabled":""}>${r(i("workflow.detail.reject"))}</button>
|
|
170
|
-
${o?`<span class="muted">${r(i("workflow.detail.submitting"))}</span>`:""}
|
|
171
|
-
</div>
|
|
172
|
-
${s?`<div class="${d} wf-approval-status">${r(s.text)}</div>`:""}
|
|
173
|
-
</div>`}function se(t){return!!t&&t.status==="waiting"&&t.wait?.waitKind==="human-gate"&&!t.wait.resolution}function le(t,e){t.querySelectorAll("textarea[data-wf-approval-comment]").forEach(n=>{let a=n.dataset.wfApprovalComment;a&&e.set(a,n.value)})}function kt(t,e){t.querySelectorAll("button[data-wf-resume-action][data-wf-resume-attempt][data-wf-resume-activity]").forEach(n=>{n.dataset.wfResumeBound!=="1"&&(n.dataset.wfResumeBound="1",n.addEventListener("click",()=>{let a=n.dataset.wfResumeAttempt,o=n.dataset.wfResumeActivity,s=n.dataset.wfResumeAction;!a||!o||(s==="start"?e.onStart(a,o):s==="end"&&e.onEnd(a,o))}))})}function de(t,e,n,a,o,s){let d=t.querySelector(".wf-terminal-actions");if(!d)return;let c=d.querySelector('button[data-wf-resume-button="1"]'),f=gt(e,n,a,o,s);c?c.outerHTML=f:f&&d.insertAdjacentHTML("beforeend",f);let h=t.querySelector("details.wf-terminal-block");if(h){let v=h.querySelector(".wf-resume-status"),k=vt(e.attemptId,s);v?v.outerHTML=k:k&&d.insertAdjacentHTML("afterend",k)}kt(t,s)}function ce(t,e){t.querySelectorAll("textarea[data-wf-approval-comment]").forEach(n=>{let a=n.dataset.wfApprovalComment;a&&n.addEventListener("input",()=>{e.comments.set(a,n.value)})}),t.querySelectorAll("button[data-wf-approval-action][data-wf-attempt-id]").forEach(n=>{n.addEventListener("click",()=>{let a=n.dataset.wfAttemptId,o=n.dataset.wfApprovalAction;!a||o!=="approve"&&o!=="reject"||e.onResolve(a,o)})})}function E(t,e,n,a){let o=nt(t,e);return`<details class="wf-io-block" data-io-key="${r(o)}"${a.has(o)?" open":""}>
|
|
174
|
-
<summary>${r(e)} ${ge(n)}</summary>
|
|
175
|
-
${ve(n)}
|
|
176
|
-
</details>`}function nt(t,e){return`${t}:${e}`}function ue(t,e){if(!e)return!1;for(let n of t.querySelectorAll("[data-wf-attempt-card]"))if(n.dataset.wfAttemptCard===e)return n.scrollIntoView({block:"center"}),!0;return!1}function fe(t,e,n){t.querySelectorAll("details.wf-io-block[data-io-key]").forEach(a=>{let o=a.dataset.ioKey;if(!o)return;a.open?e.add(o):e.delete(o);let s=a.querySelector(".wf-io-pre");s&&n.set(o,s.scrollTop)})}function we(t,e){t.querySelectorAll("details.wf-io-block[data-io-key]").forEach(n=>{n.dataset.ioToggleBound!=="1"&&(n.dataset.ioToggleBound="1",n.addEventListener("toggle",()=>{let a=n.dataset.ioKey;a&&(n.open?e.add(a):e.delete(a))}))})}function me(t,e){t.querySelectorAll("details.wf-io-block[data-io-key]").forEach(n=>{let a=n.dataset.ioKey;if(!a)return;let o=e.get(a);if(o===void 0)return;let s=n.querySelector(".wf-io-pre");s&&(s.scrollTop=o)})}function pe(t,e){t.querySelectorAll("details.wf-io-block[data-io-key]").forEach(n=>{let a=n.dataset.ioKey;if(!a)return;let o=n.querySelector(".wf-io-pre");o&&o.dataset.ioScrollBound!=="1"&&(o.dataset.ioScrollBound="1",o.addEventListener("scroll",()=>{e.set(a,o.scrollTop)}))})}function ge(t){if(!t)return`<span class="muted">${r(i("workflow.detail.empty"))}</span>`;let e=[];return t.outputBytes!==void 0&&e.push(`${t.outputBytes}B`),t.truncated&&e.push(i("workflow.detail.truncated")),t.error&&e.push(i("workflow.detail.error")),t.outputHash&&e.push(Y(t.outputHash)),e.length?`<span class="muted">${r(e.join(" \xB7 "))}</span>`:""}function ve(t){if(!t)return`<div class="muted wf-io-empty">${r(i("workflow.detail.noData"))}</div>`;let e=t.value!==void 0?JSON.stringify(t.value,null,2):t.text??"",n=t.error?`<div class="muted error">${r(t.error)}</div>`:"";return e?`${n}<pre class="wf-io-pre">${r(e)}</pre>`:`${n}<div class="muted wf-io-empty">${r(i("workflow.detail.noPreview"))}</div>`}function ye(t){let e=[];if(t.effectAttempted&&e.push(`${r(i("workflow.detail.effect"))} ${r(t.effectAttempted.provider)}`),t.wait){let n=t.wait.resolution?`${t.wait.resolution.kind}${t.wait.resolution.resolution?":"+t.wait.resolution.resolution:""}`:i("workflow.detail.open");e.push(`${r(i("workflow.detail.wait"))} ${r(t.wait.waitKind)} ${r(n)}`),t.wait.deadlineAt!==void 0&&e.push(`${r(i("workflow.detail.deadline"))} ${r(X(t.wait.deadlineAt))}`)}if(t.error){let n=`${t.error.errorCode}${t.error.errorClass?` \xB7 ${t.error.errorClass}`:""}`;e.push(`<span class="muted error">${r(n)}</span>`),t.error.errorMessage&&e.push(`<span class="error wf-error-msg">${r(t.error.errorMessage)}</span>`)}return t.output&&e.push(`${r(i("workflow.detail.output"))} ${r(Y(t.output.outputHash))}`),t.runningMs!==void 0&&e.push(`${t.runningMs}ms`),e.length>0?e.join("<br/>"):'<span class="muted">-</span>'}function he(t,e){t.innerHTML=e.length>0?e.map(ke).join(""):`<tr><td colspan="7" class="empty">${r(i("workflow.detail.noEvents"))}</td></tr>`}function ke(t){let e=Se(t.payload);return`<tr>
|
|
177
|
-
<td>${W(t.eventId)}</td>
|
|
178
|
-
<td><code>${r(t.type)}</code></td>
|
|
179
|
-
<td>${r(t.actor)}</td>
|
|
180
|
-
<td>${e.nodeId?`<code>${r(e.nodeId)}</code>`:"-"}</td>
|
|
181
|
-
<td>${e.activityId?`<code>${r(e.activityId)}</code>`:"-"}</td>
|
|
182
|
-
<td>${e.errorCode?`<span class="muted error">${r(e.errorCode)}</span>`:"-"}</td>
|
|
183
|
-
<td title="${r(new Date(t.timestamp).toISOString())}">${r(X(t.timestamp))}</td>
|
|
184
|
-
</tr>`}function W(t){let e=t.lastIndexOf("-");if(e<0)return 0;let n=Number(t.slice(e+1));return Number.isFinite(n)?n:0}function Se(t){if(!t||typeof t!="object"||"ref"in t)return{};let e=t,n={};typeof e.nodeId=="string"&&(n.nodeId=e.nodeId),typeof e.activityId=="string"&&(n.activityId=e.activityId),typeof e.failedNodeId=="string"&&(n.nodeId=e.failedNodeId);let a=e.error;return a&&typeof a=="object"&&"errorCode"in a&&(n.errorCode=String(a.errorCode)),n}function $e(t){return!t.payload||typeof t.payload!="object"||"ref"in t.payload?null:t.payload}function ut(t,e,n){return Math.min(n,Math.max(e,t))}function Y(t){return t?t.length>18?t.slice(0,10)+"..."+t.slice(-6):t:"-"}function be(t,e){return t.length>e?t.slice(0,e-1)+"\u2026":t}function X(t){return new Date(t).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}export{Te as renderWorkflowsPage};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 173.2 300" width="173.2" height="300" preserveAspectRatio="none">
|
|
2
|
-
<!--
|
|
3
|
-
ZZZ heatmap-pattern: pointy-top hex grid, side=100, fundamental tile = (s√3, 3s).
|
|
4
|
-
Tile size 173.2×300 is a perfect lattice repeat unit — CSS background-image: repeat
|
|
5
|
-
will line up with no seams. Drawn hexes at (0,0), (86.6,150) and the 4 corner copies
|
|
6
|
-
so partials wrap correctly across the tile boundary.
|
|
7
|
-
-->
|
|
8
|
-
<rect width="173.2" height="300" fill="#0d0e1f"/>
|
|
9
|
-
<g fill="none" stroke="#c5f541" stroke-width="2" opacity="0.16" stroke-linejoin="round">
|
|
10
|
-
<polygon points="86.6,50 173.2,100 173.2,200 86.6,250 0,200 0,100"/>
|
|
11
|
-
<polygon points="0,-100 86.6,-50 86.6,50 0,100 -86.6,50 -86.6,-50"/>
|
|
12
|
-
<polygon points="173.2,-100 259.8,-50 259.8,50 173.2,100 86.6,50 86.6,-50"/>
|
|
13
|
-
<polygon points="0,200 86.6,250 86.6,350 0,400 -86.6,350 -86.6,250"/>
|
|
14
|
-
<polygon points="173.2,200 259.8,250 259.8,350 173.2,400 86.6,350 86.6,250"/>
|
|
15
|
-
</g>
|
|
16
|
-
<g fill="#ffd93d" opacity="0.4">
|
|
17
|
-
<circle cx="0" cy="100" r="2.4"/>
|
|
18
|
-
<circle cx="173.2" cy="100" r="2.4"/>
|
|
19
|
-
<circle cx="86.6" cy="250" r="2.4"/>
|
|
20
|
-
<circle cx="0" cy="-100" r="2.4"/>
|
|
21
|
-
<circle cx="173.2" cy="-100" r="2.4"/>
|
|
22
|
-
<circle cx="0" cy="400" r="2.4"/>
|
|
23
|
-
<circle cx="173.2" cy="400" r="2.4"/>
|
|
24
|
-
</g>
|
|
25
|
-
</svg>
|