@contraagent/ui 0.0.0-stage → 0.2.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.md +137 -2
- package/custom-elements.json +7286 -0
- package/dist/adapters/check-rows.d.ts +20 -0
- package/dist/adapters/check-rows.d.ts.map +1 -0
- package/dist/adapters/check-rows.js +77 -0
- package/dist/adapters/check-rows.js.map +1 -0
- package/dist/adapters/filters.d.ts +29 -0
- package/dist/adapters/filters.d.ts.map +1 -0
- package/dist/adapters/filters.js +74 -0
- package/dist/adapters/filters.js.map +1 -0
- package/dist/adapters/graph/compound.d.ts +93 -0
- package/dist/adapters/graph/compound.d.ts.map +1 -0
- package/dist/adapters/graph/compound.js +322 -0
- package/dist/adapters/graph/compound.js.map +1 -0
- package/dist/adapters/graph/flow-index.d.ts +54 -0
- package/dist/adapters/graph/flow-index.d.ts.map +1 -0
- package/dist/adapters/graph/flow-index.js +129 -0
- package/dist/adapters/graph/flow-index.js.map +1 -0
- package/dist/adapters/graph/highlight.d.ts +14 -0
- package/dist/adapters/graph/highlight.d.ts.map +1 -0
- package/dist/adapters/graph/highlight.js +33 -0
- package/dist/adapters/graph/highlight.js.map +1 -0
- package/dist/adapters/graph/input.d.ts +50 -0
- package/dist/adapters/graph/input.d.ts.map +1 -0
- package/dist/adapters/graph/input.js +201 -0
- package/dist/adapters/graph/input.js.map +1 -0
- package/dist/adapters/graph/layer.d.ts +33 -0
- package/dist/adapters/graph/layer.d.ts.map +1 -0
- package/dist/adapters/graph/layer.js +94 -0
- package/dist/adapters/graph/layer.js.map +1 -0
- package/dist/adapters/graph/matrix.d.ts +62 -0
- package/dist/adapters/graph/matrix.d.ts.map +1 -0
- package/dist/adapters/graph/matrix.js +96 -0
- package/dist/adapters/graph/matrix.js.map +1 -0
- package/dist/adapters/graph/project.d.ts +49 -0
- package/dist/adapters/graph/project.d.ts.map +1 -0
- package/dist/adapters/graph/project.js +319 -0
- package/dist/adapters/graph/project.js.map +1 -0
- package/dist/adapters/graph/selection.d.ts +31 -0
- package/dist/adapters/graph/selection.d.ts.map +1 -0
- package/dist/adapters/graph/selection.js +48 -0
- package/dist/adapters/graph/selection.js.map +1 -0
- package/dist/adapters/graph/states.d.ts +6 -0
- package/dist/adapters/graph/states.d.ts.map +1 -0
- package/dist/adapters/graph/states.js +5 -0
- package/dist/adapters/graph/states.js.map +1 -0
- package/dist/adapters/graph/types.d.ts +141 -0
- package/dist/adapters/graph/types.d.ts.map +1 -0
- package/dist/adapters/graph/types.js +3 -0
- package/dist/adapters/graph/types.js.map +1 -0
- package/dist/adapters/graph/words.d.ts +48 -0
- package/dist/adapters/graph/words.d.ts.map +1 -0
- package/dist/adapters/graph/words.js +128 -0
- package/dist/adapters/graph/words.js.map +1 -0
- package/dist/adapters/index.d.ts +18 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +23 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/journal-columns.d.ts +21 -0
- package/dist/adapters/journal-columns.d.ts.map +1 -0
- package/dist/adapters/journal-columns.js +179 -0
- package/dist/adapters/journal-columns.js.map +1 -0
- package/dist/adapters/kpi-tiles.d.ts +47 -0
- package/dist/adapters/kpi-tiles.d.ts.map +1 -0
- package/dist/adapters/kpi-tiles.js +173 -0
- package/dist/adapters/kpi-tiles.js.map +1 -0
- package/dist/adapters/lanes.d.ts +31 -0
- package/dist/adapters/lanes.d.ts.map +1 -0
- package/dist/adapters/lanes.js +75 -0
- package/dist/adapters/lanes.js.map +1 -0
- package/dist/adapters/model-shares.d.ts +27 -0
- package/dist/adapters/model-shares.d.ts.map +1 -0
- package/dist/adapters/model-shares.js +52 -0
- package/dist/adapters/model-shares.js.map +1 -0
- package/dist/adapters/panel-body.d.ts +34 -0
- package/dist/adapters/panel-body.d.ts.map +1 -0
- package/dist/adapters/panel-body.js +90 -0
- package/dist/adapters/panel-body.js.map +1 -0
- package/dist/adapters/preflight.d.ts +12 -0
- package/dist/adapters/preflight.d.ts.map +1 -0
- package/dist/adapters/preflight.js +15 -0
- package/dist/adapters/preflight.js.map +1 -0
- package/dist/adapters/task-columns.d.ts +19 -0
- package/dist/adapters/task-columns.d.ts.map +1 -0
- package/dist/adapters/task-columns.js +107 -0
- package/dist/adapters/task-columns.js.map +1 -0
- package/dist/adapters/transcript/index.d.ts +6 -0
- package/dist/adapters/transcript/index.d.ts.map +1 -0
- package/dist/adapters/transcript/index.js +8 -0
- package/dist/adapters/transcript/index.js.map +1 -0
- package/dist/adapters/transcript/model.d.ts +42 -0
- package/dist/adapters/transcript/model.d.ts.map +1 -0
- package/dist/adapters/transcript/model.js +128 -0
- package/dist/adapters/transcript/model.js.map +1 -0
- package/dist/adapters/transcript/rounds.d.ts +15 -0
- package/dist/adapters/transcript/rounds.d.ts.map +1 -0
- package/dist/adapters/transcript/rounds.js +74 -0
- package/dist/adapters/transcript/rounds.js.map +1 -0
- package/dist/adapters/transcript/sections.d.ts +18 -0
- package/dist/adapters/transcript/sections.d.ts.map +1 -0
- package/dist/adapters/transcript/sections.js +69 -0
- package/dist/adapters/transcript/sections.js.map +1 -0
- package/dist/adapters/transcript/web.d.ts +12 -0
- package/dist/adapters/transcript/web.d.ts.map +1 -0
- package/dist/adapters/transcript/web.js +39 -0
- package/dist/adapters/transcript/web.js.map +1 -0
- package/dist/adapters/transcript/who.d.ts +15 -0
- package/dist/adapters/transcript/who.d.ts.map +1 -0
- package/dist/adapters/transcript/who.js +42 -0
- package/dist/adapters/transcript/who.js.map +1 -0
- package/dist/adapters/trends.d.ts +11 -0
- package/dist/adapters/trends.d.ts.map +1 -0
- package/dist/adapters/trends.js +316 -0
- package/dist/adapters/trends.js.map +1 -0
- package/dist/contraagent-ui.js +1028 -0
- package/dist/controllers/locale.d.ts +25 -0
- package/dist/controllers/locale.d.ts.map +1 -0
- package/dist/controllers/locale.js +33 -0
- package/dist/controllers/locale.js.map +1 -0
- package/dist/controllers/shortcuts.d.ts +29 -0
- package/dist/controllers/shortcuts.d.ts.map +1 -0
- package/dist/controllers/shortcuts.js +51 -0
- package/dist/controllers/shortcuts.js.map +1 -0
- package/dist/controllers/stream.d.ts +41 -0
- package/dist/controllers/stream.d.ts.map +1 -0
- package/dist/controllers/stream.js +90 -0
- package/dist/controllers/stream.js.map +1 -0
- package/dist/controllers/task-detail.d.ts +22 -0
- package/dist/controllers/task-detail.d.ts.map +1 -0
- package/dist/controllers/task-detail.js +50 -0
- package/dist/controllers/task-detail.js.map +1 -0
- package/dist/controllers/theme.d.ts +32 -0
- package/dist/controllers/theme.d.ts.map +1 -0
- package/dist/controllers/theme.js +56 -0
- package/dist/controllers/theme.js.map +1 -0
- package/dist/core/events.d.ts +107 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +5 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/i18n.d.ts +21 -0
- package/dist/core/i18n.d.ts.map +1 -0
- package/dist/core/i18n.js +71 -0
- package/dist/core/i18n.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/memory.d.ts +51 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +174 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/scroll.d.ts +21 -0
- package/dist/core/scroll.d.ts.map +1 -0
- package/dist/core/scroll.js +74 -0
- package/dist/core/scroll.js.map +1 -0
- package/dist/core/view-route.d.ts +62 -0
- package/dist/core/view-route.d.ts.map +1 -0
- package/dist/core/view-route.js +143 -0
- package/dist/core/view-route.js.map +1 -0
- package/dist/core/view-router.d.ts +27 -0
- package/dist/core/view-router.d.ts.map +1 -0
- package/dist/core/view-router.js +57 -0
- package/dist/core/view-router.js.map +1 -0
- package/dist/define/all.d.ts +13 -0
- package/dist/define/all.d.ts.map +1 -0
- package/dist/define/all.js +14 -0
- package/dist/define/all.js.map +1 -0
- package/dist/define/contracts.d.ts +2 -0
- package/dist/define/contracts.d.ts.map +1 -0
- package/dist/define/contracts.js +3 -0
- package/dist/define/contracts.js.map +1 -0
- package/dist/define/definitions.d.ts +3 -0
- package/dist/define/definitions.d.ts.map +1 -0
- package/dist/define/definitions.js +4 -0
- package/dist/define/definitions.js.map +1 -0
- package/dist/define/journal-table.d.ts +2 -0
- package/dist/define/journal-table.d.ts.map +1 -0
- package/dist/define/journal-table.js +3 -0
- package/dist/define/journal-table.js.map +1 -0
- package/dist/define/kpis.d.ts +2 -0
- package/dist/define/kpis.d.ts.map +1 -0
- package/dist/define/kpis.js +3 -0
- package/dist/define/kpis.js.map +1 -0
- package/dist/define/monitor.d.ts +2 -0
- package/dist/define/monitor.d.ts.map +1 -0
- package/dist/define/monitor.js +3 -0
- package/dist/define/monitor.js.map +1 -0
- package/dist/define/overview.d.ts +2 -0
- package/dist/define/overview.d.ts.map +1 -0
- package/dist/define/overview.js +3 -0
- package/dist/define/overview.js.map +1 -0
- package/dist/define/pipeline-graph.d.ts +2 -0
- package/dist/define/pipeline-graph.d.ts.map +1 -0
- package/dist/define/pipeline-graph.js +3 -0
- package/dist/define/pipeline-graph.js.map +1 -0
- package/dist/define/procs.d.ts +3 -0
- package/dist/define/procs.d.ts.map +1 -0
- package/dist/define/procs.js +4 -0
- package/dist/define/procs.js.map +1 -0
- package/dist/define/task-table.d.ts +2 -0
- package/dist/define/task-table.d.ts.map +1 -0
- package/dist/define/task-table.js +3 -0
- package/dist/define/task-table.js.map +1 -0
- package/dist/define/task-view.d.ts +2 -0
- package/dist/define/task-view.d.ts.map +1 -0
- package/dist/define/task-view.js +3 -0
- package/dist/define/task-view.js.map +1 -0
- package/dist/define/timeline.d.ts +2 -0
- package/dist/define/timeline.d.ts.map +1 -0
- package/dist/define/timeline.js +3 -0
- package/dist/define/timeline.js.map +1 -0
- package/dist/define/transcript.d.ts +2 -0
- package/dist/define/transcript.d.ts.map +1 -0
- package/dist/define/transcript.js +3 -0
- package/dist/define/transcript.js.map +1 -0
- package/dist/elements/lists/ca-contracts.d.ts +46 -0
- package/dist/elements/lists/ca-contracts.d.ts.map +1 -0
- package/dist/elements/lists/ca-contracts.js +199 -0
- package/dist/elements/lists/ca-contracts.js.map +1 -0
- package/dist/elements/lists/ca-definitions.d.ts +41 -0
- package/dist/elements/lists/ca-definitions.d.ts.map +1 -0
- package/dist/elements/lists/ca-definitions.js +182 -0
- package/dist/elements/lists/ca-definitions.js.map +1 -0
- package/dist/elements/lists/ca-journal-table.d.ts +37 -0
- package/dist/elements/lists/ca-journal-table.d.ts.map +1 -0
- package/dist/elements/lists/ca-journal-table.js +170 -0
- package/dist/elements/lists/ca-journal-table.js.map +1 -0
- package/dist/elements/lists/ca-panel-body.d.ts +42 -0
- package/dist/elements/lists/ca-panel-body.d.ts.map +1 -0
- package/dist/elements/lists/ca-panel-body.js +210 -0
- package/dist/elements/lists/ca-panel-body.js.map +1 -0
- package/dist/elements/lists/ca-panel-view.d.ts +21 -0
- package/dist/elements/lists/ca-panel-view.d.ts.map +1 -0
- package/dist/elements/lists/ca-panel-view.js +59 -0
- package/dist/elements/lists/ca-panel-view.js.map +1 -0
- package/dist/elements/lists/ca-proc-tree.d.ts +16 -0
- package/dist/elements/lists/ca-proc-tree.d.ts.map +1 -0
- package/dist/elements/lists/ca-proc-tree.js +63 -0
- package/dist/elements/lists/ca-proc-tree.js.map +1 -0
- package/dist/elements/lists/ca-procs-view.d.ts +27 -0
- package/dist/elements/lists/ca-procs-view.d.ts.map +1 -0
- package/dist/elements/lists/ca-procs-view.js +91 -0
- package/dist/elements/lists/ca-procs-view.js.map +1 -0
- package/dist/elements/lists/ca-task-table.d.ts +33 -0
- package/dist/elements/lists/ca-task-table.d.ts.map +1 -0
- package/dist/elements/lists/ca-task-table.js +115 -0
- package/dist/elements/lists/ca-task-table.js.map +1 -0
- package/dist/elements/lists/index.d.ts +9 -0
- package/dist/elements/lists/index.d.ts.map +1 -0
- package/dist/elements/lists/index.js +9 -0
- package/dist/elements/lists/index.js.map +1 -0
- package/dist/elements/overview/ca-kpis.d.ts +32 -0
- package/dist/elements/overview/ca-kpis.d.ts.map +1 -0
- package/dist/elements/overview/ca-kpis.js +62 -0
- package/dist/elements/overview/ca-kpis.js.map +1 -0
- package/dist/elements/overview/ca-model-usage.d.ts +25 -0
- package/dist/elements/overview/ca-model-usage.d.ts.map +1 -0
- package/dist/elements/overview/ca-model-usage.js +118 -0
- package/dist/elements/overview/ca-model-usage.js.map +1 -0
- package/dist/elements/overview/ca-overview.d.ts +67 -0
- package/dist/elements/overview/ca-overview.d.ts.map +1 -0
- package/dist/elements/overview/ca-overview.js +463 -0
- package/dist/elements/overview/ca-overview.js.map +1 -0
- package/dist/elements/overview/ca-pipeline-graph.d.ts +211 -0
- package/dist/elements/overview/ca-pipeline-graph.d.ts.map +1 -0
- package/dist/elements/overview/ca-pipeline-graph.js +616 -0
- package/dist/elements/overview/ca-pipeline-graph.js.map +1 -0
- package/dist/elements/overview/ca-quota.d.ts +42 -0
- package/dist/elements/overview/ca-quota.d.ts.map +1 -0
- package/dist/elements/overview/ca-quota.js +179 -0
- package/dist/elements/overview/ca-quota.js.map +1 -0
- package/dist/elements/overview/ca-run-driver.d.ts +33 -0
- package/dist/elements/overview/ca-run-driver.d.ts.map +1 -0
- package/dist/elements/overview/ca-run-driver.js +146 -0
- package/dist/elements/overview/ca-run-driver.js.map +1 -0
- package/dist/elements/overview/ca-services.d.ts +25 -0
- package/dist/elements/overview/ca-services.d.ts.map +1 -0
- package/dist/elements/overview/ca-services.js +77 -0
- package/dist/elements/overview/ca-services.js.map +1 -0
- package/dist/elements/overview/ca-spend-breakdown.d.ts +24 -0
- package/dist/elements/overview/ca-spend-breakdown.d.ts.map +1 -0
- package/dist/elements/overview/ca-spend-breakdown.js +108 -0
- package/dist/elements/overview/ca-spend-breakdown.js.map +1 -0
- package/dist/elements/overview/ca-timeline.d.ts +28 -0
- package/dist/elements/overview/ca-timeline.d.ts.map +1 -0
- package/dist/elements/overview/ca-timeline.js +72 -0
- package/dist/elements/overview/ca-timeline.js.map +1 -0
- package/dist/elements/overview/ca-workers.d.ts +23 -0
- package/dist/elements/overview/ca-workers.d.ts.map +1 -0
- package/dist/elements/overview/ca-workers.js +86 -0
- package/dist/elements/overview/ca-workers.js.map +1 -0
- package/dist/elements/overview/index.d.ts +11 -0
- package/dist/elements/overview/index.d.ts.map +1 -0
- package/dist/elements/overview/index.js +11 -0
- package/dist/elements/overview/index.js.map +1 -0
- package/dist/elements/overview/pipeline-graph/actions.d.ts +16 -0
- package/dist/elements/overview/pipeline-graph/actions.d.ts.map +1 -0
- package/dist/elements/overview/pipeline-graph/actions.js +42 -0
- package/dist/elements/overview/pipeline-graph/actions.js.map +1 -0
- package/dist/elements/overview/pipeline-graph/crumbs.d.ts +15 -0
- package/dist/elements/overview/pipeline-graph/crumbs.d.ts.map +1 -0
- package/dist/elements/overview/pipeline-graph/crumbs.js +70 -0
- package/dist/elements/overview/pipeline-graph/crumbs.js.map +1 -0
- package/dist/elements/overview/pipeline-graph/host.d.ts +24 -0
- package/dist/elements/overview/pipeline-graph/host.d.ts.map +1 -0
- package/dist/elements/overview/pipeline-graph/host.js +2 -0
- package/dist/elements/overview/pipeline-graph/host.js.map +1 -0
- package/dist/elements/overview/pipeline-graph/inspector.d.ts +5 -0
- package/dist/elements/overview/pipeline-graph/inspector.d.ts.map +1 -0
- package/dist/elements/overview/pipeline-graph/inspector.js +100 -0
- package/dist/elements/overview/pipeline-graph/inspector.js.map +1 -0
- package/dist/elements/overview/pipeline-graph/outline.d.ts +53 -0
- package/dist/elements/overview/pipeline-graph/outline.d.ts.map +1 -0
- package/dist/elements/overview/pipeline-graph/outline.js +111 -0
- package/dist/elements/overview/pipeline-graph/outline.js.map +1 -0
- package/dist/elements/overview/pipeline-graph/strings.d.ts +11 -0
- package/dist/elements/overview/pipeline-graph/strings.d.ts.map +1 -0
- package/dist/elements/overview/pipeline-graph/strings.js +49 -0
- package/dist/elements/overview/pipeline-graph/strings.js.map +1 -0
- package/dist/elements/overview/pipeline-graph/styles.d.ts +4 -0
- package/dist/elements/overview/pipeline-graph/styles.d.ts.map +1 -0
- package/dist/elements/overview/pipeline-graph/styles.js +96 -0
- package/dist/elements/overview/pipeline-graph/styles.js.map +1 -0
- package/dist/elements/shared/ca-definition.d.ts +26 -0
- package/dist/elements/shared/ca-definition.d.ts.map +1 -0
- package/dist/elements/shared/ca-definition.js +202 -0
- package/dist/elements/shared/ca-definition.js.map +1 -0
- package/dist/elements/shared/contract-parts.d.ts +35 -0
- package/dist/elements/shared/contract-parts.d.ts.map +1 -0
- package/dist/elements/shared/contract-parts.js +167 -0
- package/dist/elements/shared/contract-parts.js.map +1 -0
- package/dist/elements/shared/file-card.d.ts +17 -0
- package/dist/elements/shared/file-card.d.ts.map +1 -0
- package/dist/elements/shared/file-card.js +37 -0
- package/dist/elements/shared/file-card.js.map +1 -0
- package/dist/elements/shared/prompt-text.d.ts +5 -0
- package/dist/elements/shared/prompt-text.d.ts.map +1 -0
- package/dist/elements/shared/prompt-text.js +13 -0
- package/dist/elements/shared/prompt-text.js.map +1 -0
- package/dist/elements/shared/task-chip.d.ts +10 -0
- package/dist/elements/shared/task-chip.d.ts.map +1 -0
- package/dist/elements/shared/task-chip.js +19 -0
- package/dist/elements/shared/task-chip.js.map +1 -0
- package/dist/elements/shell/ca-clock.d.ts +13 -0
- package/dist/elements/shell/ca-clock.d.ts.map +1 -0
- package/dist/elements/shell/ca-clock.js +30 -0
- package/dist/elements/shell/ca-clock.js.map +1 -0
- package/dist/elements/shell/ca-hosts.d.ts +21 -0
- package/dist/elements/shell/ca-hosts.d.ts.map +1 -0
- package/dist/elements/shell/ca-hosts.js +97 -0
- package/dist/elements/shell/ca-hosts.js.map +1 -0
- package/dist/elements/shell/ca-monitor.d.ts +182 -0
- package/dist/elements/shell/ca-monitor.d.ts.map +1 -0
- package/dist/elements/shell/ca-monitor.js +549 -0
- package/dist/elements/shell/ca-monitor.js.map +1 -0
- package/dist/elements/shell/ca-run-picker.d.ts +71 -0
- package/dist/elements/shell/ca-run-picker.d.ts.map +1 -0
- package/dist/elements/shell/ca-run-picker.js +313 -0
- package/dist/elements/shell/ca-run-picker.js.map +1 -0
- package/dist/elements/shell/ca-theme-switch.d.ts +36 -0
- package/dist/elements/shell/ca-theme-switch.d.ts.map +1 -0
- package/dist/elements/shell/ca-theme-switch.js +186 -0
- package/dist/elements/shell/ca-theme-switch.js.map +1 -0
- package/dist/elements/shell/ca-toasts.d.ts +23 -0
- package/dist/elements/shell/ca-toasts.d.ts.map +1 -0
- package/dist/elements/shell/ca-toasts.js +88 -0
- package/dist/elements/shell/ca-toasts.js.map +1 -0
- package/dist/elements/shell/header.d.ts +13 -0
- package/dist/elements/shell/header.d.ts.map +1 -0
- package/dist/elements/shell/header.js +38 -0
- package/dist/elements/shell/header.js.map +1 -0
- package/dist/elements/shell/styles.d.ts +2 -0
- package/dist/elements/shell/styles.d.ts.map +1 -0
- package/dist/elements/shell/styles.js +72 -0
- package/dist/elements/shell/styles.js.map +1 -0
- package/dist/elements/shell/tabs.d.ts +32 -0
- package/dist/elements/shell/tabs.d.ts.map +1 -0
- package/dist/elements/shell/tabs.js +125 -0
- package/dist/elements/shell/tabs.js.map +1 -0
- package/dist/elements/shell/views.d.ts +27 -0
- package/dist/elements/shell/views.d.ts.map +1 -0
- package/dist/elements/shell/views.js +55 -0
- package/dist/elements/shell/views.js.map +1 -0
- package/dist/elements/task/ca-task-view.d.ts +55 -0
- package/dist/elements/task/ca-task-view.d.ts.map +1 -0
- package/dist/elements/task/ca-task-view.js +199 -0
- package/dist/elements/task/ca-task-view.js.map +1 -0
- package/dist/elements/task/ca-transcript.d.ts +74 -0
- package/dist/elements/task/ca-transcript.d.ts.map +1 -0
- package/dist/elements/task/ca-transcript.js +241 -0
- package/dist/elements/task/ca-transcript.js.map +1 -0
- package/dist/elements/task/context.d.ts +57 -0
- package/dist/elements/task/context.d.ts.map +1 -0
- package/dist/elements/task/context.js +61 -0
- package/dist/elements/task/context.js.map +1 -0
- package/dist/elements/task/header.d.ts +9 -0
- package/dist/elements/task/header.d.ts.map +1 -0
- package/dist/elements/task/header.js +291 -0
- package/dist/elements/task/header.js.map +1 -0
- package/dist/elements/task/index.d.ts +3 -0
- package/dist/elements/task/index.d.ts.map +1 -0
- package/dist/elements/task/index.js +3 -0
- package/dist/elements/task/index.js.map +1 -0
- package/dist/elements/task/inputs.d.ts +28 -0
- package/dist/elements/task/inputs.d.ts.map +1 -0
- package/dist/elements/task/inputs.js +27 -0
- package/dist/elements/task/inputs.js.map +1 -0
- package/dist/elements/task/panes/definition.d.ts +5 -0
- package/dist/elements/task/panes/definition.d.ts.map +1 -0
- package/dist/elements/task/panes/definition.js +5 -0
- package/dist/elements/task/panes/definition.js.map +1 -0
- package/dist/elements/task/panes/io.d.ts +8 -0
- package/dist/elements/task/panes/io.d.ts.map +1 -0
- package/dist/elements/task/panes/io.js +184 -0
- package/dist/elements/task/panes/io.js.map +1 -0
- package/dist/elements/task/panes/transcript.d.ts +5 -0
- package/dist/elements/task/panes/transcript.d.ts.map +1 -0
- package/dist/elements/task/panes/transcript.js +29 -0
- package/dist/elements/task/panes/transcript.js.map +1 -0
- package/dist/elements/task/styles.d.ts +2 -0
- package/dist/elements/task/styles.d.ts.map +1 -0
- package/dist/elements/task/styles.js +66 -0
- package/dist/elements/task/styles.js.map +1 -0
- package/dist/elements/trends/ca-trends.d.ts +55 -0
- package/dist/elements/trends/ca-trends.d.ts.map +1 -0
- package/dist/elements/trends/ca-trends.js +213 -0
- package/dist/elements/trends/ca-trends.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/tone.d.ts +29 -0
- package/dist/lib/tone.d.ts.map +1 -0
- package/dist/lib/tone.js +97 -0
- package/dist/lib/tone.js.map +1 -0
- package/dist/lib/trends.d.ts +15 -0
- package/dist/lib/trends.d.ts.map +1 -0
- package/dist/lib/trends.js +36 -0
- package/dist/lib/trends.js.map +1 -0
- package/dist/locales/codes.d.ts +14 -0
- package/dist/locales/codes.d.ts.map +1 -0
- package/dist/locales/codes.js +21 -0
- package/dist/locales/codes.js.map +1 -0
- package/dist/locales/ja.d.ts +785 -0
- package/dist/locales/ja.d.ts.map +1 -0
- package/dist/locales/ja.js +791 -0
- package/dist/locales/ja.js.map +1 -0
- package/dist/words/api-error.d.ts +4 -0
- package/dist/words/api-error.d.ts.map +1 -0
- package/dist/words/api-error.js +13 -0
- package/dist/words/api-error.js.map +1 -0
- package/dist/words/attempts.d.ts +17 -0
- package/dist/words/attempts.d.ts.map +1 -0
- package/dist/words/attempts.js +26 -0
- package/dist/words/attempts.js.map +1 -0
- package/dist/words/causes.d.ts +33 -0
- package/dist/words/causes.d.ts.map +1 -0
- package/dist/words/causes.js +58 -0
- package/dist/words/causes.js.map +1 -0
- package/dist/words/changes.d.ts +9 -0
- package/dist/words/changes.d.ts.map +1 -0
- package/dist/words/changes.js +23 -0
- package/dist/words/changes.js.map +1 -0
- package/dist/words/claims.d.ts +9 -0
- package/dist/words/claims.d.ts.map +1 -0
- package/dist/words/claims.js +12 -0
- package/dist/words/claims.js.map +1 -0
- package/dist/words/context.d.ts +18 -0
- package/dist/words/context.d.ts.map +1 -0
- package/dist/words/context.js +39 -0
- package/dist/words/context.js.map +1 -0
- package/dist/words/contract.d.ts +25 -0
- package/dist/words/contract.d.ts.map +1 -0
- package/dist/words/contract.js +52 -0
- package/dist/words/contract.js.map +1 -0
- package/dist/words/credential.d.ts +5 -0
- package/dist/words/credential.d.ts.map +1 -0
- package/dist/words/credential.js +7 -0
- package/dist/words/credential.js.map +1 -0
- package/dist/words/executor.d.ts +12 -0
- package/dist/words/executor.d.ts.map +1 -0
- package/dist/words/executor.js +20 -0
- package/dist/words/executor.js.map +1 -0
- package/dist/words/export.d.ts +8 -0
- package/dist/words/export.d.ts.map +1 -0
- package/dist/words/export.js +17 -0
- package/dist/words/export.js.map +1 -0
- package/dist/words/format.d.ts +36 -0
- package/dist/words/format.d.ts.map +1 -0
- package/dist/words/format.js +109 -0
- package/dist/words/format.js.map +1 -0
- package/dist/words/hops.d.ts +12 -0
- package/dist/words/hops.d.ts.map +1 -0
- package/dist/words/hops.js +27 -0
- package/dist/words/hops.js.map +1 -0
- package/dist/words/hosts.d.ts +18 -0
- package/dist/words/hosts.d.ts.map +1 -0
- package/dist/words/hosts.js +22 -0
- package/dist/words/hosts.js.map +1 -0
- package/dist/words/index.d.ts +28 -0
- package/dist/words/index.d.ts.map +1 -0
- package/dist/words/index.js +32 -0
- package/dist/words/index.js.map +1 -0
- package/dist/words/models.d.ts +10 -0
- package/dist/words/models.d.ts.map +1 -0
- package/dist/words/models.js +45 -0
- package/dist/words/models.js.map +1 -0
- package/dist/words/outcome.d.ts +14 -0
- package/dist/words/outcome.d.ts.map +1 -0
- package/dist/words/outcome.js +58 -0
- package/dist/words/outcome.js.map +1 -0
- package/dist/words/panels.d.ts +17 -0
- package/dist/words/panels.d.ts.map +1 -0
- package/dist/words/panels.js +63 -0
- package/dist/words/panels.js.map +1 -0
- package/dist/words/passes.d.ts +11 -0
- package/dist/words/passes.d.ts.map +1 -0
- package/dist/words/passes.js +13 -0
- package/dist/words/passes.js.map +1 -0
- package/dist/words/preflight.d.ts +28 -0
- package/dist/words/preflight.d.ts.map +1 -0
- package/dist/words/preflight.js +30 -0
- package/dist/words/preflight.js.map +1 -0
- package/dist/words/priority.d.ts +5 -0
- package/dist/words/priority.d.ts.map +1 -0
- package/dist/words/priority.js +7 -0
- package/dist/words/priority.js.map +1 -0
- package/dist/words/prompt.d.ts +10 -0
- package/dist/words/prompt.d.ts.map +1 -0
- package/dist/words/prompt.js +17 -0
- package/dist/words/prompt.js.map +1 -0
- package/dist/words/quota.d.ts +35 -0
- package/dist/words/quota.d.ts.map +1 -0
- package/dist/words/quota.js +102 -0
- package/dist/words/quota.js.map +1 -0
- package/dist/words/rests.d.ts +26 -0
- package/dist/words/rests.d.ts.map +1 -0
- package/dist/words/rests.js +77 -0
- package/dist/words/rests.js.map +1 -0
- package/dist/words/rounds.d.ts +14 -0
- package/dist/words/rounds.d.ts.map +1 -0
- package/dist/words/rounds.js +60 -0
- package/dist/words/rounds.js.map +1 -0
- package/dist/words/row-extras.d.ts +7 -0
- package/dist/words/row-extras.d.ts.map +1 -0
- package/dist/words/row-extras.js +26 -0
- package/dist/words/row-extras.js.map +1 -0
- package/dist/words/run-line.d.ts +40 -0
- package/dist/words/run-line.d.ts.map +1 -0
- package/dist/words/run-line.js +66 -0
- package/dist/words/run-line.js.map +1 -0
- package/dist/words/services.d.ts +16 -0
- package/dist/words/services.d.ts.map +1 -0
- package/dist/words/services.js +45 -0
- package/dist/words/services.js.map +1 -0
- package/dist/words/stop.d.ts +6 -0
- package/dist/words/stop.d.ts.map +1 -0
- package/dist/words/stop.js +69 -0
- package/dist/words/stop.js.map +1 -0
- package/dist/words/table.d.ts +4 -0
- package/dist/words/table.d.ts.map +1 -0
- package/dist/words/table.js +8 -0
- package/dist/words/table.js.map +1 -0
- package/dist/words/task-definition.d.ts +23 -0
- package/dist/words/task-definition.d.ts.map +1 -0
- package/dist/words/task-definition.js +27 -0
- package/dist/words/task-definition.js.map +1 -0
- package/dist/words/time-box.d.ts +8 -0
- package/dist/words/time-box.d.ts.map +1 -0
- package/dist/words/time-box.js +12 -0
- package/dist/words/time-box.js.map +1 -0
- package/dist/words/trends.d.ts +86 -0
- package/dist/words/trends.d.ts.map +1 -0
- package/dist/words/trends.js +104 -0
- package/dist/words/trends.js.map +1 -0
- package/docs/embed.md +121 -0
- package/docs/events.md +38 -0
- package/docs/examples/embed.html +31 -0
- package/docs/examples/journal.ts +32 -0
- package/docs/examples/live-transcript.ts +22 -0
- package/docs/examples/vite/index.html +30 -0
- package/docs/examples/vite/main.ts +23 -0
- package/docs/languages.md +48 -0
- package/docs/live-data.md +17 -0
- package/docs/theming.md +21 -0
- package/docs/tsconfig.json +14 -0
- package/package.json +131 -4
- package/src/adapters/check-rows.ts +81 -0
- package/src/adapters/filters.ts +76 -0
- package/src/adapters/graph/compound.ts +359 -0
- package/src/adapters/graph/flow-index.ts +154 -0
- package/src/adapters/graph/highlight.ts +40 -0
- package/src/adapters/graph/input.ts +236 -0
- package/src/adapters/graph/layer.ts +92 -0
- package/src/adapters/graph/matrix.ts +133 -0
- package/src/adapters/graph/plans.fixture.ts +194 -0
- package/src/adapters/graph/project.ts +358 -0
- package/src/adapters/graph/selection.ts +54 -0
- package/src/adapters/graph/states.ts +10 -0
- package/src/adapters/graph/types.ts +148 -0
- package/src/adapters/graph/words.ts +146 -0
- package/src/adapters/index.ts +22 -0
- package/src/adapters/journal-columns.ts +200 -0
- package/src/adapters/kpi-tiles.ts +211 -0
- package/src/adapters/lanes.ts +98 -0
- package/src/adapters/model-shares.ts +62 -0
- package/src/adapters/panel-body.ts +112 -0
- package/src/adapters/preflight.ts +27 -0
- package/src/adapters/task-columns.ts +120 -0
- package/src/adapters/transcript/index.ts +14 -0
- package/src/adapters/transcript/model.ts +156 -0
- package/src/adapters/transcript/rounds.ts +86 -0
- package/src/adapters/transcript/sections.ts +82 -0
- package/src/adapters/transcript/web.ts +40 -0
- package/src/adapters/transcript/who.ts +53 -0
- package/src/adapters/trends.ts +337 -0
- package/src/controllers/locale.ts +47 -0
- package/src/controllers/shortcuts.ts +69 -0
- package/src/controllers/stream.ts +103 -0
- package/src/controllers/task-detail.ts +54 -0
- package/src/controllers/theme.ts +73 -0
- package/src/core/events.ts +120 -0
- package/src/core/i18n.ts +76 -0
- package/src/core/index.ts +6 -0
- package/src/core/memory.ts +177 -0
- package/src/core/scroll.ts +73 -0
- package/src/core/view-route.ts +177 -0
- package/src/core/view-router.ts +66 -0
- package/src/define/all.ts +13 -0
- package/src/define/contracts.ts +2 -0
- package/src/define/definitions.ts +3 -0
- package/src/define/journal-table.ts +2 -0
- package/src/define/kpis.ts +2 -0
- package/src/define/monitor.ts +2 -0
- package/src/define/overview.ts +2 -0
- package/src/define/pipeline-graph.ts +2 -0
- package/src/define/procs.ts +3 -0
- package/src/define/task-table.ts +2 -0
- package/src/define/task-view.ts +2 -0
- package/src/define/timeline.ts +2 -0
- package/src/define/transcript.ts +2 -0
- package/src/elements/lists/ca-contracts.ts +204 -0
- package/src/elements/lists/ca-definitions.ts +170 -0
- package/src/elements/lists/ca-journal-table.ts +141 -0
- package/src/elements/lists/ca-panel-body.ts +200 -0
- package/src/elements/lists/ca-panel-view.ts +50 -0
- package/src/elements/lists/ca-proc-tree.ts +57 -0
- package/src/elements/lists/ca-procs-view.ts +89 -0
- package/src/elements/lists/ca-task-table.ts +94 -0
- package/src/elements/lists/index.ts +8 -0
- package/src/elements/overview/ca-kpis.ts +51 -0
- package/src/elements/overview/ca-model-usage.ts +113 -0
- package/src/elements/overview/ca-overview.ts +499 -0
- package/src/elements/overview/ca-pipeline-graph.ts +617 -0
- package/src/elements/overview/ca-quota.ts +164 -0
- package/src/elements/overview/ca-run-driver.ts +140 -0
- package/src/elements/overview/ca-services.ts +66 -0
- package/src/elements/overview/ca-spend-breakdown.ts +107 -0
- package/src/elements/overview/ca-timeline.ts +57 -0
- package/src/elements/overview/ca-workers.ts +82 -0
- package/src/elements/overview/index.ts +10 -0
- package/src/elements/overview/pipeline-graph/actions.ts +45 -0
- package/src/elements/overview/pipeline-graph/crumbs.ts +75 -0
- package/src/elements/overview/pipeline-graph/host.ts +26 -0
- package/src/elements/overview/pipeline-graph/inspector.ts +104 -0
- package/src/elements/overview/pipeline-graph/outline.ts +150 -0
- package/src/elements/overview/pipeline-graph/strings.ts +53 -0
- package/src/elements/overview/pipeline-graph/styles.ts +97 -0
- package/src/elements/shared/ca-definition.ts +206 -0
- package/src/elements/shared/contract-parts.ts +174 -0
- package/src/elements/shared/file-card.ts +49 -0
- package/src/elements/shared/prompt-text.ts +13 -0
- package/src/elements/shared/task-chip.ts +18 -0
- package/src/elements/shell/ca-clock.ts +27 -0
- package/src/elements/shell/ca-hosts.ts +93 -0
- package/src/elements/shell/ca-monitor.ts +528 -0
- package/src/elements/shell/ca-run-picker.ts +284 -0
- package/src/elements/shell/ca-theme-switch.ts +170 -0
- package/src/elements/shell/ca-toasts.ts +100 -0
- package/src/elements/shell/header.ts +45 -0
- package/src/elements/shell/styles.ts +72 -0
- package/src/elements/shell/tabs.ts +143 -0
- package/src/elements/shell/views.ts +67 -0
- package/src/elements/task/ca-task-view.ts +157 -0
- package/src/elements/task/ca-transcript.ts +214 -0
- package/src/elements/task/context.ts +105 -0
- package/src/elements/task/header.ts +296 -0
- package/src/elements/task/index.ts +2 -0
- package/src/elements/task/inputs.ts +46 -0
- package/src/elements/task/panes/definition.ts +7 -0
- package/src/elements/task/panes/io.ts +190 -0
- package/src/elements/task/panes/transcript.ts +29 -0
- package/src/elements/task/styles.ts +66 -0
- package/src/elements/trends/ca-trends.ts +204 -0
- package/src/index.ts +23 -0
- package/src/lib/tone.ts +109 -0
- package/src/lib/trends.ts +44 -0
- package/src/locales/codes.ts +23 -0
- package/src/locales/ja.ts +795 -0
- package/src/words/api-error.ts +17 -0
- package/src/words/attempts.ts +28 -0
- package/src/words/causes.ts +67 -0
- package/src/words/changes.ts +29 -0
- package/src/words/claims.ts +16 -0
- package/src/words/context.ts +47 -0
- package/src/words/contract.ts +63 -0
- package/src/words/credential.ts +8 -0
- package/src/words/executor.ts +22 -0
- package/src/words/export.ts +22 -0
- package/src/words/format.ts +107 -0
- package/src/words/hops.ts +30 -0
- package/src/words/hosts.ts +37 -0
- package/src/words/index.ts +31 -0
- package/src/words/models.ts +50 -0
- package/src/words/outcome.ts +61 -0
- package/src/words/panels.ts +71 -0
- package/src/words/passes.ts +18 -0
- package/src/words/preflight.ts +53 -0
- package/src/words/priority.ts +8 -0
- package/src/words/prompt.ts +20 -0
- package/src/words/quota.ts +108 -0
- package/src/words/rests.ts +96 -0
- package/src/words/rounds.ts +56 -0
- package/src/words/row-extras.ts +24 -0
- package/src/words/run-line.ts +77 -0
- package/src/words/services.ts +57 -0
- package/src/words/stop.ts +65 -0
- package/src/words/table.ts +10 -0
- package/src/words/task-definition.ts +37 -0
- package/src/words/time-box.ts +21 -0
- package/src/words/trends.ts +118 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// The transcript pane of `ca-task-view` when the task has no transcript; a task
|
|
2
|
+
// with one shows `ca-transcript` there.
|
|
3
|
+
import { msg } from '@lit/localize';
|
|
4
|
+
import { html, nothing, type TemplateResult } from 'lit';
|
|
5
|
+
import { facts, kindUnit } from '../../../words/format.js';
|
|
6
|
+
import { notInExport, outcomeLabel, taskStatusLabel } from '../../../words/index.js';
|
|
7
|
+
import { taskChip } from '../../shared/task-chip.js';
|
|
8
|
+
import { culprit, hadSession, stateOf, type TaskContext } from '../context.js';
|
|
9
|
+
|
|
10
|
+
/** Why there is no transcript: the task's state, or a transcript that was not saved. */
|
|
11
|
+
export function noTranscript(c: TaskContext): TemplateResult {
|
|
12
|
+
const d = c.detail;
|
|
13
|
+
const state = stateOf(c);
|
|
14
|
+
if (state === 'not_started') {
|
|
15
|
+
// The cause is in the verdict above; here, the state and the earlier task to open.
|
|
16
|
+
const up = culprit(c);
|
|
17
|
+
return html`<div class="blank notrans"><span class="ic" aria-hidden="true">⊘</span><b>${facts(msg('No transcript'), outcomeLabel(state))}</b>
|
|
18
|
+
${up ? html`<span>${msg(html`Earlier task ${taskChip(c.host, kindUnit(up), up)}`)}</span>` : nothing}</div>`;
|
|
19
|
+
}
|
|
20
|
+
if (c.exported && hadSession(d)) {
|
|
21
|
+
return html`<div class="blank notrans"><span class="ic" aria-hidden="true">✦</span><b>${facts(msg('No transcript'), notInExport())}</b></div>`;
|
|
22
|
+
}
|
|
23
|
+
if (hadSession(d)) {
|
|
24
|
+
return html`<div class="blank notrans"><span class="ic" aria-hidden="true">✦</span><b>${facts(msg('No transcript'), msg('not saved (keep_transcripts = false)'))}</b></div>`;
|
|
25
|
+
}
|
|
26
|
+
// A deferred task never ran, though the run goes on: "not run", as the tasks list says.
|
|
27
|
+
const deferred = state === 'waiting' && !!c.plan?.nodes.find((n) => n.key === d.key)?.deferred;
|
|
28
|
+
return html`<div class="blank notrans"><span class="ic" aria-hidden="true">✦</span><b>${facts(msg('No transcript'), deferred ? taskStatusLabel(state, false) : outcomeLabel(state))}</b></div>`;
|
|
29
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// The styles of `ca-task-view`: its header, its view tabs and its panes.
|
|
2
|
+
import { css } from 'lit';
|
|
3
|
+
|
|
4
|
+
export const taskViewStyles = css`
|
|
5
|
+
:host { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; position: relative; container-type: inline-size; }
|
|
6
|
+
.taskmeta { flex: none; background: linear-gradient(180deg, var(--panel2), var(--panel)); border: 1px solid var(--line);
|
|
7
|
+
border-radius: 14px; padding: 10px 12px; margin-bottom: 8px; color: var(--text-2); }
|
|
8
|
+
.tm-head { display: flex; gap: 12px; align-items: center; }
|
|
9
|
+
.tm-av { width: 36px; height: 36px; border-radius: 11px; display: grid; place-items: center; font-size: 16px; flex: none;
|
|
10
|
+
background: var(--agent-bg); color: var(--agent); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--agent) 35%, transparent); }
|
|
11
|
+
.tm-av.py { background: var(--raise); color: var(--text-muted); box-shadow: none; }
|
|
12
|
+
.tm-name { font-size: 15px; font-weight: 600; color: var(--text); display: flex; gap: 8px; align-items: center; }
|
|
13
|
+
.verdict { font-size: 12.5px; color: var(--text); margin-top: 2px; }
|
|
14
|
+
.verdict[data-tone='failed'], .verdict[data-tone='attention'] { color: var(--tone); }
|
|
15
|
+
.verdict[data-tone='muted'] { color: var(--text-muted); }
|
|
16
|
+
.whos { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 6px; }
|
|
17
|
+
.runchips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
|
|
18
|
+
.spend { display: flex; flex-wrap: wrap; gap: 4px 14px; margin-top: 6px; font-size: 12px; color: var(--text-muted); font-variant-numeric: tabular-nums; }
|
|
19
|
+
.spend b { color: var(--text); font-weight: 600; }
|
|
20
|
+
.spend.quota { flex-direction: column; gap: 0; }
|
|
21
|
+
.usage-wrap { overflow-x: auto; margin: 4px 0 12px; }
|
|
22
|
+
/* sized to its content (a full-width table spreads a few numbers far apart); the wrap scrolls when it is wider */
|
|
23
|
+
.usage { width: auto; border-collapse: collapse; font-size: 12px; font-variant-numeric: tabular-nums; }
|
|
24
|
+
.usage th { text-align: right; font-weight: 600; color: var(--text-muted); font-size: 10.5px; white-space: nowrap;
|
|
25
|
+
padding: 6px 14px; border-bottom: 1px solid var(--line2); vertical-align: bottom; }
|
|
26
|
+
.usage td { text-align: right; padding: 8px 14px; border-bottom: 1px solid var(--line); white-space: nowrap; vertical-align: baseline; }
|
|
27
|
+
.usage th:first-child, .usage td:first-child { padding-left: 4px; }
|
|
28
|
+
.usage td.l.jmono { font-size: 12px; }
|
|
29
|
+
/* the subscription readings wrap at a narrow width rather than push the table past the edge */
|
|
30
|
+
.usage td.l:not(:first-child):not(.jmono) { white-space: normal; min-width: 12ch; }
|
|
31
|
+
.usage th.l, .usage td.l { text-align: left; }
|
|
32
|
+
.usage tr.hop td { padding-top: 4px; padding-bottom: 4px; color: var(--text-muted); }
|
|
33
|
+
.usage tr.hop td:first-child { padding-left: 28px; }
|
|
34
|
+
.runchip { font-size: 11px; padding: 2px 9px; border-radius: 999px; border: 1px solid var(--line2); color: var(--text-2); }
|
|
35
|
+
.runchip.ok > [aria-hidden] { color: var(--status-done); font-weight: 700; }
|
|
36
|
+
.runchip.part { border-color: color-mix(in srgb, var(--status-attention) 45%, transparent); background: var(--status-attention-bg); }
|
|
37
|
+
.runchip.part > [aria-hidden] { color: var(--status-attention); font-weight: 700; }
|
|
38
|
+
.runchip.bad { border-color: color-mix(in srgb, var(--status-failed) 45%, transparent); color: var(--status-failed); background: var(--status-failed-bg); }
|
|
39
|
+
.io-fold { margin-top: 6px; }
|
|
40
|
+
.io-fold > summary, .launch > summary { cursor: pointer; color: var(--text-muted); }
|
|
41
|
+
.searches { margin: 4px 0 0; padding-left: 22px; }
|
|
42
|
+
.unread { color: var(--status-attention); margin-top: 4px; }
|
|
43
|
+
.qlink { background: none; border: 0; padding: 0; color: var(--accent); cursor: pointer; text-align: left; font: inherit; }
|
|
44
|
+
.qlink:hover { text-decoration: underline; }
|
|
45
|
+
|
|
46
|
+
.tviews { flex: none; display: flex; flex-wrap: wrap; gap: 4px; margin: 2px 0 8px; border-bottom: 1px solid var(--line); }
|
|
47
|
+
@container (max-width: 480px) {
|
|
48
|
+
.tviews { gap: 0; }
|
|
49
|
+
.tview { padding: 6px 10px; }
|
|
50
|
+
}
|
|
51
|
+
.tview { background: none; border: 0; border-bottom: 2px solid transparent; color: var(--text-muted); padding: 6px 14px; cursor: pointer; }
|
|
52
|
+
.tview:hover { color: var(--text-2); }
|
|
53
|
+
.tview.sel { color: var(--text); border-bottom-color: var(--accent); }
|
|
54
|
+
.tview .badge { margin-left: 6px; font-size: 10px; padding: 0 6px; border-radius: 999px; background: var(--raise); color: var(--text-2); }
|
|
55
|
+
|
|
56
|
+
/* A positioned box: what is placed in it (a screen reader's text) scrolls with it, not past the view's end. */
|
|
57
|
+
.pane { flex: 1 1 auto; min-height: 0; overflow: auto; position: relative; }
|
|
58
|
+
.upstream { margin-bottom: 12px; }
|
|
59
|
+
.up-hd { display: flex; align-items: center; gap: 10px; margin: 2px 0 6px; }
|
|
60
|
+
.down { display: flex; flex-wrap: wrap; gap: 8px; }
|
|
61
|
+
.notrans { flex: 1 1 auto; border: 1px solid var(--line); border-radius: 14px; }
|
|
62
|
+
details.upstream > summary { cursor: pointer; list-style: none; }
|
|
63
|
+
details.upstream > summary::-webkit-details-marker { display: none; }
|
|
64
|
+
.params td { vertical-align: top; }
|
|
65
|
+
.from { color: var(--text-muted); white-space: nowrap; }
|
|
66
|
+
`;
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import type { JsonObject, PanelInfo, TrendsView } from '@contraagent/api';
|
|
2
|
+
import { RovingFocusController } from '@contraagent/elements';
|
|
3
|
+
import '@contraagent/elements/segmented/define';
|
|
4
|
+
import { base } from '@contraagent/elements/styles';
|
|
5
|
+
import { localized, msg } from '@lit/localize';
|
|
6
|
+
import { LitElement, css, html, nothing } from 'lit';
|
|
7
|
+
import { customElement, property } from 'lit/decorators.js';
|
|
8
|
+
import { repeat } from 'lit/directives/repeat.js';
|
|
9
|
+
import { emit } from '../../core/events.js';
|
|
10
|
+
import { getLocale } from '../../core/i18n.js';
|
|
11
|
+
import { TREND_DAYS } from '../../core/view-route.js';
|
|
12
|
+
import { trendSections } from '../../adapters/trends.js';
|
|
13
|
+
import { daysBefore, trendsTabs } from '../../lib/trends.js';
|
|
14
|
+
import {
|
|
15
|
+
allGroups,
|
|
16
|
+
customPeriod,
|
|
17
|
+
exportedPeriod,
|
|
18
|
+
fromLabel,
|
|
19
|
+
groupLabel,
|
|
20
|
+
lastDays,
|
|
21
|
+
noRunsInPeriod,
|
|
22
|
+
periodLabel,
|
|
23
|
+
toLabel,
|
|
24
|
+
trendsFirstTab,
|
|
25
|
+
trendWords,
|
|
26
|
+
trendsTitle,
|
|
27
|
+
zoneLabel,
|
|
28
|
+
} from '../../words/trends.js';
|
|
29
|
+
import '../lists/ca-panel-body.js';
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The trends: what the runs of a period add up to (`/api/trends`), section by section:
|
|
33
|
+
* the totals, the cost of each day, each kind and each model, the subscription usage,
|
|
34
|
+
* the attempts not done, the tool calls denied, the tasks not run, when runs start, and
|
|
35
|
+
* the runs; then the pipeline's own trend panels. Above them, the period (the last 7,
|
|
36
|
+
* 14 or 30 days, or two dates), its time zone and a run group; an export's period is
|
|
37
|
+
* fixed and named instead. When a trend panel names a `tab`, the page has tabs: the
|
|
38
|
+
* first holds the trends and the trend panels of no `tab`, each other one the panels of
|
|
39
|
+
* its `tab`.
|
|
40
|
+
*
|
|
41
|
+
* @fires ca-navigate - `{days, from, to, tz, group}`: another period, time zone or run group; `{trendsTab}`: another tab
|
|
42
|
+
*/
|
|
43
|
+
@customElement('ca-trends')
|
|
44
|
+
@localized()
|
|
45
|
+
export class CaTrends extends LitElement {
|
|
46
|
+
static override styles = [
|
|
47
|
+
base,
|
|
48
|
+
css`
|
|
49
|
+
:host { display: block; }
|
|
50
|
+
.controls { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 16px; margin-bottom: 14px; }
|
|
51
|
+
.controls label { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--text-muted); }
|
|
52
|
+
input, select { background: var(--well); border: 1px solid var(--line); color: var(--text); border-radius: 8px; font: inherit; font-size: 12px; padding: 4px 8px; }
|
|
53
|
+
input:focus-visible, select:focus-visible { outline: var(--focus-width) solid var(--focus); outline-offset: 1px; }
|
|
54
|
+
.period { font-size: 12px; color: var(--text-2); }
|
|
55
|
+
.loading { font-size: 12px; color: var(--text-muted); }
|
|
56
|
+
.err { font-size: 12px; color: var(--status-failed); }
|
|
57
|
+
/* wide sections span the page; the narrow ones pair up and fill each other's gaps */
|
|
58
|
+
.wide { margin-bottom: 14px; }
|
|
59
|
+
.pairs { columns: 2 440px; column-gap: 14px; margin-bottom: 14px; }
|
|
60
|
+
.pairs > .panel { break-inside: avoid; margin-bottom: 14px; }
|
|
61
|
+
.panel { display: block; }
|
|
62
|
+
.tabs { display: flex; flex-wrap: wrap; gap: 2px; border-bottom: 1px solid var(--line); margin-bottom: 14px; }
|
|
63
|
+
.tab { background: none; border: none; border-bottom: 2px solid transparent; margin-bottom: -1px; padding: 8px 14px 9px;
|
|
64
|
+
color: var(--text-muted); font: inherit; font-weight: 500; cursor: pointer; white-space: nowrap; }
|
|
65
|
+
.tab:hover { color: var(--text-2); }
|
|
66
|
+
.tab[aria-selected='true'] { color: var(--text); font-weight: 600; border-bottom-color: var(--accent); }
|
|
67
|
+
.tab:focus-visible { outline: var(--focus-width) solid var(--focus); outline-offset: -2px; }
|
|
68
|
+
`,
|
|
69
|
+
];
|
|
70
|
+
|
|
71
|
+
@property({ attribute: false }) view: TrendsView | null = null;
|
|
72
|
+
/** The period: the last `days` days (0: `from` to `to`). */
|
|
73
|
+
@property({ type: Number }) days = 14;
|
|
74
|
+
@property() from = '';
|
|
75
|
+
@property() to = '';
|
|
76
|
+
/** The time zone the days are counted in. */
|
|
77
|
+
@property() tz = '';
|
|
78
|
+
/** Only the runs of this run group ('': every run). */
|
|
79
|
+
@property() group = '';
|
|
80
|
+
/** The run groups there are to choose from. */
|
|
81
|
+
@property({ attribute: false }) groups: readonly string[] = [];
|
|
82
|
+
/** The pipeline's trend panels (`Panel(scope="trends")`). */
|
|
83
|
+
@property({ attribute: false }) panels: readonly PanelInfo[] = [];
|
|
84
|
+
/** An export: its period is the one it holds. */
|
|
85
|
+
@property({ type: Boolean }) exported = false;
|
|
86
|
+
/** The open tab: a trend panel's `tab` ('': the first, the trends). */
|
|
87
|
+
@property() tab = '';
|
|
88
|
+
|
|
89
|
+
/** One tab stop for the tabs; the arrow keys, Home and End move between them. */
|
|
90
|
+
private readonly tabFocus = new RovingFocusController(this, {
|
|
91
|
+
items: () => [...this.renderRoot.querySelectorAll<HTMLElement>('[role="tab"]')],
|
|
92
|
+
layout: 'horizontal',
|
|
93
|
+
wrap: true,
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
private go(patch: { days?: number; from?: string; to?: string; tz?: string; group?: string }): void {
|
|
97
|
+
emit(this, 'ca-navigate', patch);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
override render() {
|
|
101
|
+
const v = this.view;
|
|
102
|
+
const trendPanels = this.panels.filter((p) => p.scope === 'trends');
|
|
103
|
+
const tabs = trendsTabs(trendPanels);
|
|
104
|
+
const open = tabs.includes(this.tab) ? this.tab : '';
|
|
105
|
+
const shown = trendPanels.filter((p) => (p.tab ?? '') === open);
|
|
106
|
+
const body = open ? this.trendPanels(shown, v?.panels ?? {}, false) : this.trends(shown);
|
|
107
|
+
return html`<h2 class="sr">${trendsTitle()}</h2>
|
|
108
|
+
${this.controls()}
|
|
109
|
+
${v?.error ? html`<p class="err" role="alert">${msg('No answer from the monitor')} | ${v.error.message}</p>` : nothing}
|
|
110
|
+
${tabs.length > 1
|
|
111
|
+
? html`${this.tabList(tabs, open)}<div role="tabpanel" id="trends-tabpanel" aria-labelledby=${`trends-tab-${tabs.indexOf(open)}`}>${body}</div>`
|
|
112
|
+
: body}`;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** The tabs: the trends first, then one per trend panels' `tab`. */
|
|
116
|
+
private tabList(tabs: readonly string[], open: string) {
|
|
117
|
+
return html`<div class="tabs" role="tablist" aria-label=${trendsTitle()}>
|
|
118
|
+
${tabs.map(
|
|
119
|
+
(t, i) => html`<button type="button" role="tab" class="tab" id=${`trends-tab-${i}`} aria-selected=${t === open ? 'true' : 'false'}
|
|
120
|
+
aria-controls="trends-tabpanel" @click=${() => t !== open && emit(this, 'ca-navigate', { trendsTab: t })}>${t || trendsFirstTab()}</button>`,
|
|
121
|
+
)}
|
|
122
|
+
</div>`;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
override updated(): void {
|
|
126
|
+
// The tab stop is on the open tab.
|
|
127
|
+
const tabs = trendsTabs(this.panels);
|
|
128
|
+
this.tabFocus.set(Math.max(0, tabs.indexOf(this.tab)));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** The trends of the period, section by section, then the trend panels of no `tab`. */
|
|
132
|
+
private trends(panels: readonly PanelInfo[]) {
|
|
133
|
+
const v = this.view;
|
|
134
|
+
const data = v?.data ?? null;
|
|
135
|
+
const sections = data ? trendSections(data, getLocale()) : [];
|
|
136
|
+
const wide = sections.filter((s) => s.wide);
|
|
137
|
+
const narrow = sections.filter((s) => !s.wide);
|
|
138
|
+
const order = ['totals', 'cost-by-day', 'kinds', 'python-kinds', 'models', 'usage'];
|
|
139
|
+
const first = wide.filter((s) => order.includes(s.id));
|
|
140
|
+
const last = wide.filter((s) => !order.includes(s.id));
|
|
141
|
+
const card = (body: unknown, id: string) => html`<section class="panel" data-section=${id}><ca-panel-body .body=${body}></ca-panel-body></section>`;
|
|
142
|
+
return html`${!data && v?.loading ? html`<p class="loading">${msg('Loading…')}</p>` : nothing}
|
|
143
|
+
${data && !sections.length ? html`<div class="blank small"><span>${noRunsInPeriod()}</span></div>` : nothing}
|
|
144
|
+
${repeat(first, (s) => s.id, (s) => html`<div class="wide">${card(s.body, s.id)}</div>`)}
|
|
145
|
+
${narrow.length ? html`<div class="pairs">${repeat(narrow, (s) => s.id, (s) => card(s.body, s.id))}</div>` : nothing}
|
|
146
|
+
${repeat(last, (s) => s.id, (s) => html`<div class="wide">${card(s.body, s.id)}</div>`)}
|
|
147
|
+
${this.trendPanels(panels, v?.panels ?? {}, true)}`;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** The period, its time zone and the run group: links of the page's address. */
|
|
151
|
+
private controls() {
|
|
152
|
+
const data = this.view?.data;
|
|
153
|
+
const period = data ? html`<span class="period">${periodLabel(data.period.from, data.period.to, data.period.tz)}</span>` : nothing;
|
|
154
|
+
if (this.exported) return html`<div class="controls"><span class="meta">${exportedPeriod()}</span>${period}</div>`;
|
|
155
|
+
const choice = this.days ? String(this.days) : 'dates';
|
|
156
|
+
const today = data?.period.to || new Date().toISOString().slice(0, 10);
|
|
157
|
+
const zones = [...new Set([this.tz, Intl.DateTimeFormat().resolvedOptions().timeZone, 'UTC'].filter(Boolean))];
|
|
158
|
+
return html`<div class="controls">
|
|
159
|
+
<cae-segmented label=${msg('Period')} .value=${choice}
|
|
160
|
+
.options=${[...TREND_DAYS.map((n) => ({ value: String(n), label: lastDays(n) })), { value: 'dates', label: customPeriod() }]}
|
|
161
|
+
@cae-change=${(e: CustomEvent<{ value: string }>) =>
|
|
162
|
+
e.detail.value === 'dates'
|
|
163
|
+
? this.go({ days: 0, from: this.from || daysBefore(today, (this.days || 14) - 1), to: this.to || today })
|
|
164
|
+
: this.go({ days: Number(e.detail.value), from: '', to: '' })}></cae-segmented>
|
|
165
|
+
${this.days === 0
|
|
166
|
+
? html`<label>${fromLabel()} <input type="date" .value=${this.from} max=${this.to || nothing}
|
|
167
|
+
@change=${(e: Event) => this.go({ days: 0, from: (e.target as HTMLInputElement).value, to: this.to })} /></label>
|
|
168
|
+
<label>${toLabel()} <input type="date" .value=${this.to} min=${this.from || nothing}
|
|
169
|
+
@change=${(e: Event) => this.go({ days: 0, from: this.from, to: (e.target as HTMLInputElement).value })} /></label>`
|
|
170
|
+
: nothing}
|
|
171
|
+
<label>${zoneLabel()}
|
|
172
|
+
<select @change=${(e: Event) => this.go({ tz: (e.target as HTMLSelectElement).value })}>
|
|
173
|
+
${zones.map((z) => html`<option value=${z} ?selected=${z === (this.tz || zones[0])}>${z}</option>`)}
|
|
174
|
+
</select></label>
|
|
175
|
+
${this.groups.length > 1
|
|
176
|
+
? html`<label>${groupLabel()}
|
|
177
|
+
<select @change=${(e: Event) => this.go({ group: (e.target as HTMLSelectElement).value })}>
|
|
178
|
+
<option value="" ?selected=${!this.group}>${allGroups()}</option>
|
|
179
|
+
${this.groups.map((g) => html`<option value=${g} ?selected=${g === this.group}>${g}</option>`)}
|
|
180
|
+
</select></label>`
|
|
181
|
+
: nothing}
|
|
182
|
+
${period}
|
|
183
|
+
${this.view?.loading && data ? html`<span class="loading" aria-live="polite">${msg('Loading…')}</span>` : nothing}
|
|
184
|
+
</div>`;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** The pipeline's own trend panels, under their titles (`heading`: under the heading of them all). */
|
|
188
|
+
private trendPanels(shown: readonly PanelInfo[], bodies: Readonly<Record<string, JsonObject>>, heading: boolean) {
|
|
189
|
+
if (!shown.length) return nothing;
|
|
190
|
+
return html`${heading ? html`<h3 class="sect-h">${trendWords().trendPanels}</h3>` : nothing}
|
|
191
|
+
${shown.map(
|
|
192
|
+
(p) => html`<section class="panel wide" data-panel=${p.name}>
|
|
193
|
+
<h3>${p.icon} ${p.title || p.name}${p.description ? html`<span class="r">${p.description}</span>` : nothing}</h3>
|
|
194
|
+
${bodies[p.name] ? html`<ca-panel-body .body=${bodies[p.name]}></ca-panel-body>` : html`<p class="loading">${msg('Loading…')}</p>`}
|
|
195
|
+
</section>`,
|
|
196
|
+
)}`;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
declare global {
|
|
201
|
+
interface HTMLElementTagNameMap {
|
|
202
|
+
'ca-trends': CaTrends;
|
|
203
|
+
}
|
|
204
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// @contraagent/ui: the monitor's web components. Importing this module
|
|
2
|
+
// registers every element (define/all.ts); `ca-monitor` is the whole monitor.
|
|
3
|
+
// One view alone is a subpath (`@contraagent/ui/transcript`, define/). Nothing
|
|
4
|
+
// else happens at import: the page sets up the languages (`configureLocales`)
|
|
5
|
+
// and the themes (`adoptThemes`, `@contraagent/elements/themes`), or
|
|
6
|
+
// `<ca-monitor>` does when it connects. The generic parts the elements are
|
|
7
|
+
// built from (styles, themes, primitives, `cae-*` elements) are
|
|
8
|
+
// `@contraagent/elements`.
|
|
9
|
+
import './define/all.js';
|
|
10
|
+
|
|
11
|
+
export * from './core/index.js';
|
|
12
|
+
export * from './words/format.js';
|
|
13
|
+
export * from './adapters/index.js';
|
|
14
|
+
|
|
15
|
+
export * from './elements/shared/ca-definition.js';
|
|
16
|
+
export * from './elements/shell/ca-monitor.js';
|
|
17
|
+
export * from './elements/shell/ca-clock.js';
|
|
18
|
+
export * from './elements/shell/ca-run-picker.js';
|
|
19
|
+
export * from './elements/shell/ca-hosts.js';
|
|
20
|
+
export * from './elements/shell/ca-toasts.js';
|
|
21
|
+
export * from './elements/overview/index.js';
|
|
22
|
+
export * from './elements/lists/index.js';
|
|
23
|
+
export * from './elements/task/index.js';
|
package/src/lib/tone.ts
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// Which status colour (`Tone`, from @contraagent/elements) run data takes. A
|
|
2
|
+
// colour means a status, and only where that status applies: totals and
|
|
3
|
+
// measures stay neutral, a count of a problem takes the problem's colour only
|
|
4
|
+
// when it is above 0, and a whole is never coloured by its worst part (a run's
|
|
5
|
+
// dot is the exception: it is the run's own status). An element shows its tone
|
|
6
|
+
// as `data-tone` (none for neutral); the rules are in the elements' styles.
|
|
7
|
+
import type { ContractStatus, Outcome, RunActivity, Stop } from '@contraagent/api';
|
|
8
|
+
import { markOf, type Mark, type Tone } from '@contraagent/elements';
|
|
9
|
+
|
|
10
|
+
export type { Tone };
|
|
11
|
+
|
|
12
|
+
/** The tone of a count of a problem: the problem's tone above 0, neutral at 0 (a 0 is not good news to colour). */
|
|
13
|
+
export function problemTone(n: number, tone: Exclude<Tone, 'neutral'>): Tone {
|
|
14
|
+
return n > 0 ? tone : 'neutral';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* A run's own status: running; attention when its host stopped reporting (a hub);
|
|
19
|
+
* then how it ended: failed (a task failed), attention (tasks not started, or
|
|
20
|
+
* partly done), done; neutral before it has tasks.
|
|
21
|
+
*/
|
|
22
|
+
export function runTone(activity: RunActivity, tasks: { total: number; failed: number; not_started: number; partial?: number } | undefined): Tone {
|
|
23
|
+
if (activity === 'running') return 'running';
|
|
24
|
+
if (activity === 'unresponsive') return 'attention';
|
|
25
|
+
if (!tasks?.total) return 'neutral';
|
|
26
|
+
if (tasks.failed) return 'failed';
|
|
27
|
+
if (tasks.not_started || tasks.partial) return 'attention';
|
|
28
|
+
return 'done';
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The tone of each stop. A `Record` over the generated `Stop` type: a stop the
|
|
33
|
+
* schema adds fails type-checking here until it has a tone.
|
|
34
|
+
*/
|
|
35
|
+
const STOP_TONE: Readonly<Record<Stop, Tone>> = {
|
|
36
|
+
completed: 'done',
|
|
37
|
+
partial: 'attention',
|
|
38
|
+
invalid_input: 'attention',
|
|
39
|
+
skipped: 'muted',
|
|
40
|
+
timeout: 'failed',
|
|
41
|
+
max_turns: 'failed',
|
|
42
|
+
budget: 'failed',
|
|
43
|
+
context_budget: 'failed',
|
|
44
|
+
stalled: 'failed',
|
|
45
|
+
auth_failed: 'failed',
|
|
46
|
+
api_error: 'failed',
|
|
47
|
+
rate_limited: 'failed',
|
|
48
|
+
refused: 'failed',
|
|
49
|
+
aborted: 'failed',
|
|
50
|
+
denied: 'failed',
|
|
51
|
+
error: 'failed',
|
|
52
|
+
no_output: 'failed',
|
|
53
|
+
launch_failed: 'failed',
|
|
54
|
+
invalid_output: 'failed',
|
|
55
|
+
credential_mismatch: 'failed',
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/** Every stop contraagent writes (`JournalRow.stop`), in schema order. */
|
|
59
|
+
export const ALL_STOPS = Object.keys(STOP_TONE) as readonly Stop[];
|
|
60
|
+
|
|
61
|
+
/** Whether a journal row's `stop` is one contraagent writes (a domain may write its own). */
|
|
62
|
+
export const isStop = (stop: string | null | undefined): stop is Stop => stop != null && Object.hasOwn(STOP_TONE, stop);
|
|
63
|
+
|
|
64
|
+
/** How one attempt ended (a journal row's `stop`), as a tone: a stop it does not know is a failure. */
|
|
65
|
+
export function stopTone(stop: string | null | undefined): Tone {
|
|
66
|
+
return isStop(stop) ? STOP_TONE[stop] : 'failed';
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** What happened to a task, as a tone. */
|
|
70
|
+
export function outcomeTone(o: Outcome): Tone {
|
|
71
|
+
switch (o) {
|
|
72
|
+
case 'done':
|
|
73
|
+
case 'recovered':
|
|
74
|
+
return 'done';
|
|
75
|
+
case 'failed':
|
|
76
|
+
return 'failed';
|
|
77
|
+
case 'partial':
|
|
78
|
+
case 'not_started':
|
|
79
|
+
return 'attention';
|
|
80
|
+
case 'running':
|
|
81
|
+
return 'running';
|
|
82
|
+
case 'waiting':
|
|
83
|
+
case 'skipped':
|
|
84
|
+
return 'muted';
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** A checked file's status, as a tone; neutral without one. */
|
|
89
|
+
export function contractTone(s: ContractStatus | null | undefined): Tone {
|
|
90
|
+
switch (s) {
|
|
91
|
+
case 'valid':
|
|
92
|
+
return 'done';
|
|
93
|
+
case 'invalid':
|
|
94
|
+
case 'failed':
|
|
95
|
+
return 'failed';
|
|
96
|
+
case 'refused':
|
|
97
|
+
return 'attention';
|
|
98
|
+
case 'running':
|
|
99
|
+
return 'running';
|
|
100
|
+
case 'pending':
|
|
101
|
+
return 'muted';
|
|
102
|
+
case null:
|
|
103
|
+
case undefined:
|
|
104
|
+
return 'neutral';
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** The mark of a task's outcome: a waiting task is ◌ too, though muted. */
|
|
109
|
+
export const outcomeMark = (o: Outcome): Mark | null => (o === 'waiting' ? 'pending' : markOf(outcomeTone(o)));
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// The trends page's request, from where the monitor is (its view route).
|
|
2
|
+
import type { PanelInfo, RunSummary, TrendsQuery } from '@contraagent/api';
|
|
3
|
+
import type { ViewRoute } from '../core/view-route.js';
|
|
4
|
+
|
|
5
|
+
/** The browser's time zone (an IANA name), `UTC` when it names none. */
|
|
6
|
+
export const browserZone = (): string => Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';
|
|
7
|
+
|
|
8
|
+
/** Today in time zone `tz`, YYYY-MM-DD. */
|
|
9
|
+
export function todayIn(tz: string, now: Date = new Date()): string {
|
|
10
|
+
try {
|
|
11
|
+
return new Intl.DateTimeFormat('en-CA', { timeZone: tz, year: 'numeric', month: '2-digit', day: '2-digit' }).format(now);
|
|
12
|
+
} catch {
|
|
13
|
+
return now.toISOString().slice(0, 10);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** The calendar day `n` days before `day` (YYYY-MM-DD). */
|
|
18
|
+
export function daysBefore(day: string, n: number): string {
|
|
19
|
+
const d = new Date(`${day}T00:00:00Z`);
|
|
20
|
+
d.setUTCDate(d.getUTCDate() - n);
|
|
21
|
+
return d.toISOString().slice(0, 10);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** What `/api/trends` is asked for on the trends page: the view route's period, time zone and run group. */
|
|
25
|
+
export function trendsQuery(r: Pick<ViewRoute, 'days' | 'from' | 'to' | 'tz' | 'group'>, now: Date = new Date()): TrendsQuery {
|
|
26
|
+
const tz = r.tz || browserZone();
|
|
27
|
+
const period =
|
|
28
|
+
r.days === 0 && r.from && r.to
|
|
29
|
+
? { from: r.from, to: r.to }
|
|
30
|
+
: (() => {
|
|
31
|
+
const to = todayIn(tz, now);
|
|
32
|
+
return { from: daysBefore(to, Math.max(1, r.days) - 1), to };
|
|
33
|
+
})();
|
|
34
|
+
return { ...period, tz, ...(r.group ? { run_group: r.group } : {}) };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** The run groups of the runs, each once, in the order the runs list them. */
|
|
38
|
+
export const runGroups = (runs: readonly RunSummary[]): string[] => [...new Set(runs.map((r) => r.run_group).filter((g): g is string => !!g))];
|
|
39
|
+
|
|
40
|
+
/** The tabs of the trends page: '' (the trends, with the trends panels of no `tab`), then each panel's `tab` once, in the order the first of its panels comes; only '' when no panel names one. */
|
|
41
|
+
export const trendsTabs = (panels: readonly PanelInfo[]): string[] => [
|
|
42
|
+
'',
|
|
43
|
+
...new Set(panels.filter((p) => p.scope === 'trends' && p.tab).map((p) => p.tab!)),
|
|
44
|
+
];
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Do not modify this file by hand!
|
|
2
|
+
// Re-generate this file by running lit-localize.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The locale code that templates in this source code are written in.
|
|
6
|
+
*/
|
|
7
|
+
export const sourceLocale = `en`;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The other locale codes that this application is localized into. Sorted
|
|
11
|
+
* lexicographically.
|
|
12
|
+
*/
|
|
13
|
+
export const targetLocales = [
|
|
14
|
+
`ja`,
|
|
15
|
+
] as const;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* All valid project locale codes. Sorted lexicographically.
|
|
19
|
+
*/
|
|
20
|
+
export const allLocales = [
|
|
21
|
+
`en`,
|
|
22
|
+
`ja`,
|
|
23
|
+
] as const;
|