@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,164 @@
|
|
|
1
|
+
import { runAccounts, type AccountUsage, type CredentialRest, type JournalRow, type QuotaCap, type QuotaReading } from '@contraagent/api';
|
|
2
|
+
import { localized, msg, str } from '@lit/localize';
|
|
3
|
+
import { LitElement, css, html, nothing } from 'lit';
|
|
4
|
+
import { customElement, property } from 'lit/decorators.js';
|
|
5
|
+
import { ClockController } from '@contraagent/elements';
|
|
6
|
+
import { localTime } from '../../words/format.js';
|
|
7
|
+
import { capLabel, capsLine, credentialLabel, restFacts, restSpan } from '../../words/index.js';
|
|
8
|
+
import { accountLabel, pct, quotaStatusLabel, resetsIn } from '../../words/quota.js';
|
|
9
|
+
import { pill } from '@contraagent/elements/primitives';
|
|
10
|
+
import { base } from '@contraagent/elements/styles';
|
|
11
|
+
|
|
12
|
+
type Window = 'five_hour' | 'seven_day';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Subscription usage over the run, per account (credential): for the weekly and
|
|
16
|
+
* the 5-hour window, the account's first reading and its last, and when each
|
|
17
|
+
* window resets. Readings come at session starts and are account-wide. The
|
|
18
|
+
* accounts are the run's (`journal`), or given (`accounts`: a hub's, over every
|
|
19
|
+
* run of every host, `Hosts.quota`). With the run's quota caps and rests
|
|
20
|
+
* (`caps`, `rests`, `rule`: `Plan.quota_caps`, `.rests`, `.quota_rule`), each
|
|
21
|
+
* window shows its cap, and each account whether it is paused and its rests.
|
|
22
|
+
*/
|
|
23
|
+
@customElement('ca-quota')
|
|
24
|
+
@localized()
|
|
25
|
+
export class CaQuota extends LitElement {
|
|
26
|
+
static override styles = [
|
|
27
|
+
base,
|
|
28
|
+
css`
|
|
29
|
+
:host { display: block; container-type: inline-size; }
|
|
30
|
+
/* the bar keeps a width of its own, and ends near its figures on a wide card */
|
|
31
|
+
.rows { display: grid; grid-template-columns: max-content minmax(70px, 420px) max-content max-content; justify-content: start; gap: 10px 14px; align-items: center; }
|
|
32
|
+
.name { font-size: 12px; color: var(--text-2); white-space: nowrap; }
|
|
33
|
+
.bar { position: relative; height: 12px; border-radius: 4px; background: var(--track); overflow: hidden; }
|
|
34
|
+
.bar i { position: absolute; top: 0; bottom: 0; }
|
|
35
|
+
/* usage measures, it does not judge: neutral, attention from 80% (the number says it too) */
|
|
36
|
+
.bar .before { left: 0; background: var(--meter); opacity: 0.45; }
|
|
37
|
+
.bar .during { background: var(--meter); }
|
|
38
|
+
.bar.hot .during, .bar.full .during, .bar.hot .before, .bar.full .before { background: var(--status-attention); }
|
|
39
|
+
/* the cap: a line across the bar where the account is paused */
|
|
40
|
+
.bar .cap { width: 2px; margin-left: -1px; background: var(--text); opacity: 0.7; }
|
|
41
|
+
.val.hot b, .val.full b { color: var(--status-attention); }
|
|
42
|
+
.val { font-family: var(--mono); font-size: 12px; font-variant-numeric: tabular-nums; white-space: nowrap; }
|
|
43
|
+
.val b { color: var(--text); }
|
|
44
|
+
.val .lim { color: var(--text-muted); }
|
|
45
|
+
.reset { font-size: 11.5px; color: var(--text-muted); white-space: nowrap; }
|
|
46
|
+
/* a narrow card: the reset time goes under its bar */
|
|
47
|
+
@container (max-width: 460px) {
|
|
48
|
+
.rows { grid-template-columns: max-content minmax(70px, 1fr) max-content; row-gap: 2px; }
|
|
49
|
+
.reset { grid-column: 2 / -1; margin-bottom: 6px; }
|
|
50
|
+
}
|
|
51
|
+
.status { margin-top: 8px; }
|
|
52
|
+
.acct { padding: 10px 0; border-top: 1px solid var(--line); }
|
|
53
|
+
.acct:first-child { border-top: 0; padding-top: 0; }
|
|
54
|
+
.acct-h { display: flex; align-items: baseline; flex-wrap: wrap; gap: 8px; margin-bottom: 8px; font-size: 12px; }
|
|
55
|
+
.acct-h i { font-style: normal; color: var(--text-muted); font-size: 11px; }
|
|
56
|
+
.acct-h b { font-family: var(--mono); color: var(--text); font-weight: 600; }
|
|
57
|
+
.rests { margin: 8px 0 0; padding: 0; list-style: none; font-size: 11.5px; color: var(--text-2); }
|
|
58
|
+
.rests li { padding: 2px 0; }
|
|
59
|
+
.rule { margin-bottom: 10px; font-size: 12px; color: var(--text-2); }
|
|
60
|
+
.rule code { font-family: var(--mono); color: var(--text); }
|
|
61
|
+
`,
|
|
62
|
+
];
|
|
63
|
+
|
|
64
|
+
@property({ attribute: false }) journal: JournalRow[] = [];
|
|
65
|
+
/** Each account's first and last reading, highest weekly use first; null: from `journal`. */
|
|
66
|
+
@property({ attribute: false }) accounts: readonly AccountUsage[] | null = null;
|
|
67
|
+
/** The run's quota caps, by credential (`Plan.quota_caps`). */
|
|
68
|
+
@property({ attribute: false }) caps: readonly QuotaCap[] = [];
|
|
69
|
+
/** Each rest of a credential in the run, in start order (`Plan.rests`). */
|
|
70
|
+
@property({ attribute: false }) rests: readonly CredentialRest[] = [];
|
|
71
|
+
/** The run's quota rule, `module.qualname` (`Plan.quota_rule`); '' for none. */
|
|
72
|
+
@property() rule = '';
|
|
73
|
+
/** The run is live: a rest with no reset time (a rule's) stands only while it is. */
|
|
74
|
+
@property({ type: Boolean }) live = false;
|
|
75
|
+
|
|
76
|
+
constructor() {
|
|
77
|
+
super();
|
|
78
|
+
new ClockController(this); // "resets in" counts down
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
private row(w: Window, name: string, first: QuotaReading, last: QuotaReading, cap: number | null | undefined) {
|
|
82
|
+
const a = first[`${w}_pct`];
|
|
83
|
+
const b = last[`${w}_pct`];
|
|
84
|
+
if (a == null && b == null) return nothing;
|
|
85
|
+
const from = Math.max(0, Math.min(100, a ?? b ?? 0));
|
|
86
|
+
const to = Math.max(from, Math.min(100, b ?? from));
|
|
87
|
+
const resets = last[`${w}_resets_at`];
|
|
88
|
+
const cls = to >= 100 || (cap != null && to >= cap) ? 'full' : to >= 80 ? 'hot' : '';
|
|
89
|
+
const limit = cap != null ? capLabel(cap) : '';
|
|
90
|
+
return html`<span class="name">${name}</span>
|
|
91
|
+
<span class="bar ${cls}" title=${limit ? `${pct(a)} → ${pct(b)} | ${limit}` : `${pct(a)} → ${pct(b)}`}>
|
|
92
|
+
<i class="before" style="width:${from}%"></i>
|
|
93
|
+
<i class="during" style="left:${from}%;width:${to - from}%"></i>
|
|
94
|
+
${cap != null ? html`<i class="cap" style="left:${Math.min(100, cap)}%" aria-hidden="true"></i>` : nothing}
|
|
95
|
+
</span>
|
|
96
|
+
<span class="val ${cls}">${pct(a)} → <b>${pct(b)}</b>${limit ? html` <span class="lim">| ${limit}</span>` : nothing}</span>
|
|
97
|
+
<span class="reset" title=${resets ? localTime(resets, true) : ''}>${resetsIn(resets)}</span>`;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* An account's pill while it is paused: `paused until 10/14 14:30`; nothing otherwise. A rest
|
|
102
|
+
* stands until it ended, until its window reset, and (a rule's, with no reset) while the run is live.
|
|
103
|
+
*/
|
|
104
|
+
private paused(rests: readonly CredentialRest[]) {
|
|
105
|
+
const at = Date.now();
|
|
106
|
+
const now = rests.find((r) => !r.ended && (r.until ? Date.parse(r.until) > at : this.live));
|
|
107
|
+
if (!now) return nothing;
|
|
108
|
+
const text = now.until ? msg(str`paused until ${localTime(now.until, true)}`) : msg('paused');
|
|
109
|
+
return pill({ text, tone: 'attention', title: restFacts(now) });
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
override render() {
|
|
113
|
+
const accounts = this.accounts ?? runAccounts(this.journal);
|
|
114
|
+
if (!accounts.length && !this.rests.length) return nothing;
|
|
115
|
+
const caps = new Map(this.caps.map((c) => [c.credential, c]));
|
|
116
|
+
return html`${this.rule
|
|
117
|
+
? html`<div class="rule" title="quota_rule">${msg('Usage rule')} <code>${this.rule}</code></div>`
|
|
118
|
+
: nothing}${accounts.map((a) => {
|
|
119
|
+
const status = quotaStatusLabel(a.last.status, a.last.status_window);
|
|
120
|
+
const cap = caps.get(a.credential);
|
|
121
|
+
const rests = this.rests.filter((r) => r.credential === a.credential && (!r.account || !a.account || r.account === a.account));
|
|
122
|
+
// One identity on two accounts (`default` on two coding agents, a replaced token): each named.
|
|
123
|
+
const twice = !!a.account && accounts.some((o) => o !== a && o.credential === a.credential);
|
|
124
|
+
return html`<div class="acct">
|
|
125
|
+
<div class="acct-h"><i>${msg('Identity')}</i><b>${credentialLabel(a.credential) || '—'}</b>${twice
|
|
126
|
+
? html`<i title=${msg(str`Account: ${a.account ?? ''}`)}>${accountLabel(a.account ?? '')}</i>`
|
|
127
|
+
: nothing}${status
|
|
128
|
+
? pill({ text: status, tone: 'attention', title: a.last.status, mark: null })
|
|
129
|
+
: nothing}${this.paused(rests)}${cap ? html`<i title="max_five_hour_pct, max_seven_day_pct">${capsLine(cap)}</i>` : nothing}</div>
|
|
130
|
+
<div class="rows">
|
|
131
|
+
${this.row('seven_day', msg('Weekly usage'), a.first, a.last, cap?.seven_day_pct)}
|
|
132
|
+
${this.row('five_hour', msg('5-hour usage'), a.first, a.last, cap?.five_hour_pct)}
|
|
133
|
+
</div>
|
|
134
|
+
${this.restList(rests)}
|
|
135
|
+
</div>`;
|
|
136
|
+
})}${this.unread(accounts, caps)}`;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
private restList(rests: readonly CredentialRest[]) {
|
|
140
|
+
return rests.length ? html`<ul class="rests" title="rests.jsonl">${rests.map((r) => html`<li>${restSpan(r)}</li>`)}</ul>` : nothing;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** The accounts paused in the run with no reading in its journal (their reading came from an earlier run). */
|
|
144
|
+
private unread(accounts: readonly AccountUsage[], caps: ReadonlyMap<string, QuotaCap>) {
|
|
145
|
+
const shown = new Set(accounts.map((a) => a.credential));
|
|
146
|
+
const others = [...new Set(this.rests.map((r) => r.credential))].filter((c) => !shown.has(c));
|
|
147
|
+
return others.map((credential) => {
|
|
148
|
+
const rests = this.rests.filter((r) => r.credential === credential);
|
|
149
|
+
const cap = caps.get(credential);
|
|
150
|
+
return html`<div class="acct">
|
|
151
|
+
<div class="acct-h"><i>${msg('Identity')}</i><b>${credentialLabel(credential)}</b>${this.paused(rests)}${cap
|
|
152
|
+
? html`<i title="max_five_hour_pct, max_seven_day_pct">${capsLine(cap)}</i>`
|
|
153
|
+
: nothing}</div>
|
|
154
|
+
${this.restList(rests)}
|
|
155
|
+
</div>`;
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
declare global {
|
|
161
|
+
interface HTMLElementTagNameMap {
|
|
162
|
+
'ca-quota': CaQuota;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { elapsedS, result, runActivity, type HostSummary, type Plan, type Procs, type RunSummary } from '@contraagent/api';
|
|
2
|
+
import { localized, msg, str } from '@lit/localize';
|
|
3
|
+
import { LitElement, css, html, nothing } from 'lit';
|
|
4
|
+
import { customElement, property } from 'lit/decorators.js';
|
|
5
|
+
import { starts } from '@contraagent/elements';
|
|
6
|
+
import { facts, fmtDur, localTime, sentence } from '../../words/format.js';
|
|
7
|
+
import { hostFact, lastReport, noReportLabel } from '../../words/hosts.js';
|
|
8
|
+
import { preflightLabel, preflightStoppedCause, preflightStoppedTitle, preflightTip } from '../../words/preflight.js';
|
|
9
|
+
import { preflightRows } from '../../adapters/preflight.js';
|
|
10
|
+
import { toneAttr, type Tone } from '@contraagent/elements';
|
|
11
|
+
import { base, factStyles } from '@contraagent/elements/styles';
|
|
12
|
+
import '@contraagent/elements/count/define';
|
|
13
|
+
|
|
14
|
+
/** The mark of how a run ended (■ for a run with no tasks). */
|
|
15
|
+
const MARK: Record<Tone, string> = { failed: '✕', attention: '◌', done: '✓', running: '', muted: '■', neutral: '■' };
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The run's own process: running (pid, run group, how many tasks at once,
|
|
19
|
+
* command line), or not running, and then how it finished: with errors, or with
|
|
20
|
+
* tasks not done (from `plan`). On a hub, a run whose host stopped reporting
|
|
21
|
+
* (`summary.unresponsive`) is neither: no report from its host, since `host.last_seen`.
|
|
22
|
+
* Under it, the models the run's preflight found available, replaced or not
|
|
23
|
+
* available (`plan.preflight`); a run its preflight ended names the kinds that did it.
|
|
24
|
+
*/
|
|
25
|
+
@customElement('ca-run-driver')
|
|
26
|
+
@localized()
|
|
27
|
+
export class CaRunDriver extends LitElement {
|
|
28
|
+
static override styles = [
|
|
29
|
+
base,
|
|
30
|
+
factStyles,
|
|
31
|
+
css`
|
|
32
|
+
:host { display: block; }
|
|
33
|
+
.drv { display: flex; gap: 14px; align-items: flex-start; }
|
|
34
|
+
.drv-ic { width: 42px; height: 42px; border-radius: 12px; flex: none; display: grid; place-items: center; font-size: 16px;
|
|
35
|
+
background: var(--raise); color: var(--text-muted); }
|
|
36
|
+
.drv.on .drv-ic { background: var(--status-running-bg); box-shadow: 0 0 0 1px color-mix(in srgb, var(--status-running) 35%, transparent), 0 0 22px var(--status-running-bg); }
|
|
37
|
+
/* how a run ended: the mark's shape and the title's words carry it; the colour only where a status applies */
|
|
38
|
+
.drv-ic[data-tone] { color: var(--tone); font-weight: 700; }
|
|
39
|
+
.drv-ic[data-tone='failed'], .drv-ic[data-tone='attention'] { background: var(--tone-bg); }
|
|
40
|
+
.drv.on .drv-ic .spin { width: 18px; height: 18px; }
|
|
41
|
+
.drv-t { font-size: 15px; font-weight: 600; }
|
|
42
|
+
.drv-up { font-family: var(--mono); font-size: 12px; color: var(--status-running); margin-left: 6px; font-weight: 400; }
|
|
43
|
+
.drv-cmd { margin-top: 8px; }
|
|
44
|
+
.drv-cmd summary { cursor: pointer; font-size: 11px; color: var(--text-muted); }
|
|
45
|
+
.pf { margin-top: 10px; font-size: 12px; }
|
|
46
|
+
.pf-h { color: var(--text-muted); font-size: 11px; margin-bottom: 4px; }
|
|
47
|
+
/* a label, then its fact: one row each, the facts in one column */
|
|
48
|
+
.pf-rows { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 3px 12px; margin: 0; }
|
|
49
|
+
.pf-rows dt { color: var(--text-muted); }
|
|
50
|
+
.pf-rows dt[data-tone] { color: var(--tone); }
|
|
51
|
+
.pf-rows dd { margin: 0; color: var(--text-2); overflow-wrap: anywhere; }
|
|
52
|
+
.drv-cmd code { display: block; margin-top: 4px; white-space: pre-wrap; word-break: break-all; color: var(--text-2); max-height: 120px; overflow: auto; }
|
|
53
|
+
`,
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
@property({ attribute: false }) procs: Procs | null = null;
|
|
57
|
+
@property({ attribute: false }) summary: RunSummary | undefined;
|
|
58
|
+
@property({ attribute: false }) plan: Plan = { nodes: [], groups: [] };
|
|
59
|
+
/** The run's host (a hub): when it last reported. */
|
|
60
|
+
@property({ attribute: false }) host: HostSummary | undefined;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* How a run that is not running ended, as its title: everything scheduled ran
|
|
64
|
+
* (finished), with or without failed or not-started tasks, or some tasks never got their turn (stopped).
|
|
65
|
+
*/
|
|
66
|
+
private stateTitle(): [text: string, tone: Tone] {
|
|
67
|
+
if (this.plan.preflight?.stopped?.length) return [preflightStoppedTitle(), 'failed'];
|
|
68
|
+
if (!this.plan.nodes.length) return [msg('Not running'), 'neutral'];
|
|
69
|
+
const r = result(this.plan);
|
|
70
|
+
if (r.failed) return [r.failed === 1 ? msg('Finished with 1 task failed') : msg(str`Finished with ${r.failed} tasks failed`), 'failed'];
|
|
71
|
+
if (r.left) return [r.left === 1 ? msg('Finished with 1 task not done') : msg(str`Finished with ${r.left} tasks not done`), 'attention'];
|
|
72
|
+
if (r.notStarted) return [r.notStarted === 1 ? msg('Finished with 1 task not started') : msg(str`Finished with ${r.notStarted} tasks not started`), 'attention'];
|
|
73
|
+
return [msg('Finished'), 'done'];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
override render() {
|
|
77
|
+
const p = this.procs;
|
|
78
|
+
const r = this.summary;
|
|
79
|
+
if (!p?.alive) {
|
|
80
|
+
// Its host stopped reporting (a hub): not known to run, not known to have ended.
|
|
81
|
+
const quiet = runActivity(r) === 'unresponsive';
|
|
82
|
+
const [title, tone]: [string, Tone] = quiet ? [sentence(noReportLabel()), 'attention'] : this.stateTitle();
|
|
83
|
+
const took = quiet ? null : elapsedS(r);
|
|
84
|
+
return html`<div class="drv off">
|
|
85
|
+
<div class="drv-ic" data-tone=${toneAttr(tone)} aria-hidden="true">${MARK[tone]}</div>
|
|
86
|
+
<div>
|
|
87
|
+
<div class="drv-t tone-text" data-tone=${tone === 'done' ? nothing : toneAttr(tone)}>${title}</div>
|
|
88
|
+
<div class="meta">${facts(
|
|
89
|
+
this.plan.preflight?.stopped?.length ? preflightStoppedCause(this.plan.preflight.stopped) : '',
|
|
90
|
+
quiet ? lastReport(this.host) : '',
|
|
91
|
+
!r?.last_ts ? msg('No activity') : quiet ? msg(str`Last activity ${localTime(r.last_ts, true)}`) : msg(str`Ended ${localTime(r.last_ts, true)}`),
|
|
92
|
+
took == null ? '' : msg(str`Took ${fmtDur(took)}`),
|
|
93
|
+
r?.run_group ? msg(str`Run group ${r.run_group}`) : '',
|
|
94
|
+
quiet ? hostFact(r?.host_id ?? '') : '',
|
|
95
|
+
)}</div>
|
|
96
|
+
${this.preflight()}
|
|
97
|
+
</div>
|
|
98
|
+
</div>`;
|
|
99
|
+
}
|
|
100
|
+
const started = Date.parse(p.started_at);
|
|
101
|
+
const since = starts.at(`drv:${p.pid ?? ''}`, Number.isNaN(started) ? 1 : (Date.now() - started) / 1000);
|
|
102
|
+
const rows: [string, string | number][] = [
|
|
103
|
+
[msg('PID'), p.pid ?? '—'],
|
|
104
|
+
[msg('Run group'), p.run_group],
|
|
105
|
+
[msg('Running at once (limit)'), p.max_workers || '—'],
|
|
106
|
+
[msg('Started'), localTime(p.started_at, true)],
|
|
107
|
+
];
|
|
108
|
+
return html`<div class="drv on">
|
|
109
|
+
<div class="drv-ic"><span class="spin"></span></div>
|
|
110
|
+
<div style="min-width:0">
|
|
111
|
+
<div class="drv-t">${msg('Running')} <cae-elapsed class="drv-up" .since=${since}></cae-elapsed></div>
|
|
112
|
+
<div class="drv-facts">${rows.map(([k, v]) => html`<span><i>${k}</i>${v}</span>`)}</div>
|
|
113
|
+
${this.preflight()}
|
|
114
|
+
<details class="drv-cmd"><summary>${msg('Command line')}</summary><code>${p.argv.join(' ')}</code></details>
|
|
115
|
+
</div>
|
|
116
|
+
</div>`;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** The preflight's rows under their label; nothing for a run with no preflight. */
|
|
120
|
+
private preflight() {
|
|
121
|
+
const pf = this.plan.preflight;
|
|
122
|
+
const rows = preflightRows(pf);
|
|
123
|
+
if (!pf || !rows.length) return nothing;
|
|
124
|
+
return html`<div class="pf">
|
|
125
|
+
<div class="pf-h" title=${preflightTip(pf.policy)}>${preflightLabel()}</div>
|
|
126
|
+
<dl class="pf-rows">
|
|
127
|
+
${rows.map(
|
|
128
|
+
(r) => html`<dt data-tone=${toneAttr(r.tone)} title=${r.tip || nothing}>${r.label}</dt><dd class="jmono">${r.text}</dd>`,
|
|
129
|
+
)}
|
|
130
|
+
</dl>
|
|
131
|
+
</div>`;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
declare global {
|
|
136
|
+
interface HTMLElementTagNameMap {
|
|
137
|
+
'ca-run-driver': CaRunDriver;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { PlanNode, ServiceSpan } from '@contraagent/api';
|
|
2
|
+
import { localized, msg } from '@lit/localize';
|
|
3
|
+
import { LitElement, css, html, nothing } from 'lit';
|
|
4
|
+
import { customElement, property } from 'lit/decorators.js';
|
|
5
|
+
import { statusWord } from '@contraagent/elements/primitives';
|
|
6
|
+
import { base } from '@contraagent/elements/styles';
|
|
7
|
+
import type { Tone } from '@contraagent/elements';
|
|
8
|
+
import { kindUnit } from '../../words/format.js';
|
|
9
|
+
import { serviceFacts, serviceState, serviceStateLabel, type ServiceState } from '../../words/services.js';
|
|
10
|
+
import { taskChip } from '../shared/task-chip.js';
|
|
11
|
+
|
|
12
|
+
const TONE: Record<ServiceState, Tone> = { running: 'running', stopped: 'done', failed: 'failed', unknown: 'muted' };
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The run's services (`Plan.services`): each start of the long-lived helper a claim
|
|
16
|
+
* name stands for, one per row, with its state, its claim name, its address, when it
|
|
17
|
+
* started and stopped and why, and the task whose claim started it.
|
|
18
|
+
*
|
|
19
|
+
* @fires ca-open-task - the task chip of the task that started a service was clicked
|
|
20
|
+
*/
|
|
21
|
+
@customElement('ca-services')
|
|
22
|
+
@localized()
|
|
23
|
+
export class CaServices extends LitElement {
|
|
24
|
+
static override styles = [
|
|
25
|
+
base,
|
|
26
|
+
css`
|
|
27
|
+
:host { display: block; }
|
|
28
|
+
ul { margin: 0; padding: 0; list-style: none; display: grid; gap: 8px; }
|
|
29
|
+
li { display: grid; grid-template-columns: max-content 1fr; column-gap: 10px; row-gap: 2px; align-items: baseline; font-size: 12px; }
|
|
30
|
+
.name { font-family: var(--mono); color: var(--text); overflow-wrap: anywhere; }
|
|
31
|
+
.addr { font-family: var(--mono); color: var(--text-2); overflow-wrap: anywhere; }
|
|
32
|
+
.facts { grid-column: 2; color: var(--text-2); overflow-wrap: anywhere; }
|
|
33
|
+
.by { grid-column: 2; }
|
|
34
|
+
`,
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
/** Each start of a service, in start order (`Plan.services`). */
|
|
38
|
+
@property({ attribute: false }) services: readonly ServiceSpan[] = [];
|
|
39
|
+
/** The run's tasks (`Plan.nodes`): the task that started a service is named by its kind and unit. */
|
|
40
|
+
@property({ attribute: false }) nodes: readonly PlanNode[] = [];
|
|
41
|
+
/** Whether the run still runs: a service with no stop recorded is running only then. */
|
|
42
|
+
@property({ type: Boolean }) live = false;
|
|
43
|
+
|
|
44
|
+
override render() {
|
|
45
|
+
if (!this.services.length) return html`<div class="meta">${msg('No services')}</div>`;
|
|
46
|
+
const byKey = new Map(this.nodes.map((n) => [n.key, n]));
|
|
47
|
+
return html`<ul>
|
|
48
|
+
${this.services.map((s) => {
|
|
49
|
+
const state = serviceState(s, this.live);
|
|
50
|
+
const node = s.key ? byKey.get(s.key) : undefined;
|
|
51
|
+
return html`<li>
|
|
52
|
+
${statusWord({ text: serviceStateLabel(state), tone: TONE[state] })}
|
|
53
|
+
<div><span class="name" title="services.jsonl">${s.name}</span>${s.address ? html` <span class="addr">${s.address}</span>` : nothing}</div>
|
|
54
|
+
<div class="facts">${serviceFacts(s)}</div>
|
|
55
|
+
${s.key ? html`<div class="by">${taskChip(this, node ? kindUnit(node) : s.key, node ?? { key: s.key })}</div>` : nothing}
|
|
56
|
+
</li>`;
|
|
57
|
+
})}
|
|
58
|
+
</ul>`;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
declare global {
|
|
63
|
+
interface HTMLElementTagNameMap {
|
|
64
|
+
'ca-services': CaServices;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { spendByKind, spendByTask, spendOf, totalTokens, type JournalRow, type Spend } from '@contraagent/api';
|
|
2
|
+
import { localized, msg, str } from '@lit/localize';
|
|
3
|
+
import { LitElement, css, html, nothing } from 'lit';
|
|
4
|
+
import { customElement, property } from 'lit/decorators.js';
|
|
5
|
+
import { repeat } from 'lit/directives/repeat.js';
|
|
6
|
+
import { emit } from '../../core/events.js';
|
|
7
|
+
import { facts, kindUnit, tokenCount, usd } from '../../words/format.js';
|
|
8
|
+
import { base } from '@contraagent/elements/styles';
|
|
9
|
+
import { legend, legendStyles } from '@contraagent/elements/primitives';
|
|
10
|
+
|
|
11
|
+
type Part = 'input' | 'cache_read' | 'cache_creation' | 'output';
|
|
12
|
+
const PARTS: readonly Part[] = ['input', 'cache_read', 'cache_creation', 'output'];
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Where a run's tokens and cost went: per kind, a bar of its tokens (input,
|
|
16
|
+
* cache read, cache write, output) with its cost and share of the run's cost,
|
|
17
|
+
* most expensive first; then the most expensive tasks.
|
|
18
|
+
*
|
|
19
|
+
* @fires ca-open-task - `{key}`: one of the most expensive tasks was clicked
|
|
20
|
+
*/
|
|
21
|
+
@customElement('ca-spend-breakdown')
|
|
22
|
+
@localized()
|
|
23
|
+
export class CaSpendBreakdown extends LitElement {
|
|
24
|
+
static override styles = [
|
|
25
|
+
base,
|
|
26
|
+
legendStyles,
|
|
27
|
+
css`
|
|
28
|
+
:host { display: block; }
|
|
29
|
+
/* the bar's track is bounded, so its figures stay beside it on a wide card */
|
|
30
|
+
.kinds { display: grid; grid-template-columns: minmax(70px, max-content) minmax(0, 420px) max-content max-content; justify-content: start; gap: 8px 14px; align-items: center; }
|
|
31
|
+
.kind { font-family: var(--mono); font-size: 12px; color: var(--text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
32
|
+
.bar { display: flex; height: 12px; border-radius: 4px; overflow: hidden; background: var(--track); }
|
|
33
|
+
.bar i { display: block; height: 100%; }
|
|
34
|
+
.num { font-variant-numeric: tabular-nums; text-align: right; font-size: 12px; white-space: nowrap; }
|
|
35
|
+
.share { color: var(--text-muted); min-width: 3.5em; }
|
|
36
|
+
.seg-input { background: var(--tok-input); }
|
|
37
|
+
.seg-cache_read { background: var(--tok-cache-read); }
|
|
38
|
+
.seg-cache_creation { background: var(--tok-cache-write); }
|
|
39
|
+
.seg-output { background: var(--tok-output); }
|
|
40
|
+
.legend { margin-top: 10px; }
|
|
41
|
+
h4 { margin: 16px 0 6px; font-size: 12px; color: var(--text-2); font-weight: 600; }
|
|
42
|
+
.top { display: grid; grid-template-columns: minmax(0, max-content) 64px 64px max-content; column-gap: 20px; row-gap: 4px; align-items: baseline; }
|
|
43
|
+
.top a { font-family: var(--mono); font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
44
|
+
`,
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
@property({ attribute: false }) journal: JournalRow[] = [];
|
|
48
|
+
/** How many of the most expensive tasks to list. */
|
|
49
|
+
@property({ type: Number }) top = 5;
|
|
50
|
+
|
|
51
|
+
private partLabel(p: Part): string {
|
|
52
|
+
switch (p) {
|
|
53
|
+
case 'input':
|
|
54
|
+
return msg('input');
|
|
55
|
+
case 'cache_read':
|
|
56
|
+
return msg('cache read');
|
|
57
|
+
case 'cache_creation':
|
|
58
|
+
return msg('cache write');
|
|
59
|
+
case 'output':
|
|
60
|
+
return msg('output');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
private bar(s: Spend, max: number) {
|
|
65
|
+
const total = totalTokens(s);
|
|
66
|
+
const width = max ? (100 * total) / max : 0;
|
|
67
|
+
const tip = facts(...PARTS.map((p) => `${this.partLabel(p)} ${tokenCount(s[p])}`));
|
|
68
|
+
return html`<div class="bar" title=${tip} style="width:${Math.max(width, 0.5).toFixed(2)}%">
|
|
69
|
+
${PARTS.map((p) => (s[p] && total ? html`<i class="seg-${p}" style="width:${((100 * s[p]) / total).toFixed(2)}%"></i>` : nothing))}
|
|
70
|
+
</div>`;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
override render() {
|
|
74
|
+
if (!spendOf(this.journal)) return html`<div class="meta">${msg('No tokens reported')}</div>`;
|
|
75
|
+
const kinds = spendByKind(this.journal);
|
|
76
|
+
const max = Math.max(1, ...kinds.map((k) => totalTokens(k.spend)));
|
|
77
|
+
const tasks = spendByTask(this.journal).slice(0, this.top);
|
|
78
|
+
return html`<div class="kinds">
|
|
79
|
+
${repeat(
|
|
80
|
+
kinds,
|
|
81
|
+
(k) => k.id,
|
|
82
|
+
(k) => html`<span class="kind" title=${k.id}>${k.id}</span>${this.bar(k.spend, max)}
|
|
83
|
+
<span class="num">${facts(tokenCount(totalTokens(k.spend)), usd(k.spend.cost))}</span>
|
|
84
|
+
<span class="num share">${k.share !== null ? `${Math.round(k.share * 100)}%` : ''}</span>`,
|
|
85
|
+
)}
|
|
86
|
+
</div>
|
|
87
|
+
${legend(PARTS.map((p) => ({ label: this.partLabel(p), cls: `seg-${p}` })))}
|
|
88
|
+
<h4>${msg('Most expensive tasks')}</h4>
|
|
89
|
+
<div class="top">
|
|
90
|
+
${tasks.map(
|
|
91
|
+
(t) => html`<a class="lnk" href="#" title=${t.id} @click=${(e: Event) => {
|
|
92
|
+
e.preventDefault();
|
|
93
|
+
emit(this, 'ca-open-task', { key: t.id });
|
|
94
|
+
}}>${kindUnit(t)}</a>
|
|
95
|
+
<span class="num">${tokenCount(totalTokens(t.spend))}</span>
|
|
96
|
+
<span class="num">${usd(t.spend.cost)}</span>
|
|
97
|
+
<span class="num share">${t.share !== null ? msg(str`${Math.round(t.share * 100)}%`) : ''}</span>`,
|
|
98
|
+
)}
|
|
99
|
+
</div>`;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
declare global {
|
|
104
|
+
interface HTMLElementTagNameMap {
|
|
105
|
+
'ca-spend-breakdown': CaSpendBreakdown;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { deriveRun, liveActivities, type JournalRow, type Plan, type Procs } from '@contraagent/api';
|
|
2
|
+
import { localized, msg, str } from '@lit/localize';
|
|
3
|
+
import { LitElement, css, html } from 'lit';
|
|
4
|
+
import { customElement, property } from 'lit/decorators.js';
|
|
5
|
+
import { keyed } from 'lit/directives/keyed.js';
|
|
6
|
+
import { starts } from '@contraagent/elements';
|
|
7
|
+
import { base } from '@contraagent/elements/styles';
|
|
8
|
+
import '@contraagent/elements/lanes/define';
|
|
9
|
+
import type { LanesStrings } from '@contraagent/elements/lanes';
|
|
10
|
+
import { laneStyles, lanesFromJournal } from '../../adapters/lanes.js';
|
|
11
|
+
import { getLocale } from '../../core/i18n.js';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Every finished attempt as a bar as long as it took, on its kind's lane, the
|
|
15
|
+
* running ones growing until now (the last six hours of the run), as
|
|
16
|
+
* `<cae-lanes>` (`lanesFromJournal`).
|
|
17
|
+
*/
|
|
18
|
+
@customElement('ca-timeline')
|
|
19
|
+
@localized()
|
|
20
|
+
export class CaTimeline extends LitElement {
|
|
21
|
+
static override styles = [base, css`:host { display: block; }`];
|
|
22
|
+
|
|
23
|
+
@property({ attribute: false }) journal: JournalRow[] = [];
|
|
24
|
+
/** The run's plan: with the journal, why a task did not start, as the tasks list says it. Optional. */
|
|
25
|
+
@property({ attribute: false }) plan: Plan | null = null;
|
|
26
|
+
@property({ attribute: false }) procs: Procs | null = null;
|
|
27
|
+
/** The run is live: its running tasks are drawn, growing every second. */
|
|
28
|
+
@property({ type: Boolean }) live = false;
|
|
29
|
+
/** The run drawn; the bars grow in when a run is first drawn, not on every update. */
|
|
30
|
+
@property() run = '';
|
|
31
|
+
|
|
32
|
+
override render() {
|
|
33
|
+
const now = Date.now();
|
|
34
|
+
const live = this.live
|
|
35
|
+
? liveActivities(this.procs).map((a) => ({ kind: a.kind, cls: a.cls, t0: starts.at(a.id, a.ageS, now) }))
|
|
36
|
+
: [];
|
|
37
|
+
const tl = lanesFromJournal(this.journal, live, deriveRun(this.journal, this.plan).outcomes, this.run);
|
|
38
|
+
if (!tl)
|
|
39
|
+
return html`<div class="blank" style="padding:28px"><span class="ic" aria-hidden="true">⏱</span>${this.live
|
|
40
|
+
? msg('No finished attempts yet')
|
|
41
|
+
: msg('No finished attempts')}</div>`;
|
|
42
|
+
const strings: Partial<LanesStrings> = {
|
|
43
|
+
omitted: (n) => (n === 1 ? msg('1 older attempt not shown') : msg(str`${n} older attempts not shown`)),
|
|
44
|
+
};
|
|
45
|
+
return keyed(
|
|
46
|
+
this.run,
|
|
47
|
+
html`<cae-lanes .lanes=${tl.lanes} .barStyles=${laneStyles()} .omitted=${tl.omitted} ?live=${this.live}
|
|
48
|
+
locale=${getLocale()} .strings=${strings}></cae-lanes>`,
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
declare global {
|
|
54
|
+
interface HTMLElementTagNameMap {
|
|
55
|
+
'ca-timeline': CaTimeline;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { liveActivities, type Procs } from '@contraagent/api';
|
|
2
|
+
import { localized, msg } from '@lit/localize';
|
|
3
|
+
import { LitElement, css, html } from 'lit';
|
|
4
|
+
import { customElement, property } from 'lit/decorators.js';
|
|
5
|
+
import { repeat } from 'lit/directives/repeat.js';
|
|
6
|
+
import { emit } from '../../core/events.js';
|
|
7
|
+
import { starts } from '@contraagent/elements';
|
|
8
|
+
import { base } from '@contraagent/elements/styles';
|
|
9
|
+
import '@contraagent/elements/count/define';
|
|
10
|
+
import { executorIcon } from '../../words/executor.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* What runs now: one card per running task (an agent session opens its
|
|
14
|
+
* transcript), the rest idle, up to the number of tasks the run runs at once
|
|
15
|
+
* (`max_concurrent`). Sends `ca-open-task`.
|
|
16
|
+
*
|
|
17
|
+
* @fires ca-open-task - `{key}`: a running agent launch was clicked
|
|
18
|
+
*/
|
|
19
|
+
@customElement('ca-workers')
|
|
20
|
+
@localized()
|
|
21
|
+
export class CaWorkers extends LitElement {
|
|
22
|
+
static override styles = [
|
|
23
|
+
base,
|
|
24
|
+
css`
|
|
25
|
+
:host { display: block; container-type: inline-size; }
|
|
26
|
+
.wks { display: grid; grid-template-columns: repeat(var(--n, 3), minmax(0, 1fr)); gap: 10px; }
|
|
27
|
+
@container (max-width: 860px) { .wks { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
|
|
28
|
+
@container (max-width: 360px) { .wks { grid-template-columns: minmax(0, 1fr); } }
|
|
29
|
+
.wk { border-radius: 11px; padding: 10px 12px; border: 1px solid var(--line); background: color-mix(in srgb, var(--text) 2.5%, transparent); min-width: 0;
|
|
30
|
+
position: relative; overflow: hidden; display: block; width: 100%; color: inherit; text-align: start; }
|
|
31
|
+
.wk > .meta { display: block; }
|
|
32
|
+
.wk.py, .wk.llm { border-color: var(--line2); }
|
|
33
|
+
.wk.llm { box-shadow: inset 3px 0 0 -1px color-mix(in srgb, var(--agent) 60%, transparent); cursor: pointer; }
|
|
34
|
+
.wk.llm:hover { border-color: var(--accent); }
|
|
35
|
+
.wk.idle { opacity: 0.45; border-style: dashed; }
|
|
36
|
+
.wk-top { display: flex; align-items: center; gap: 8px; min-width: 0; }
|
|
37
|
+
.wk-top b { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
38
|
+
.wk-ic { width: 24px; height: 24px; border-radius: 7px; flex: none; display: grid; place-items: center; background: var(--raise); font-size: 12px; }
|
|
39
|
+
.wk.llm .wk-ic { color: var(--agent); }
|
|
40
|
+
.wk.py .wk-ic { color: var(--text-muted); }
|
|
41
|
+
.wk-el { margin-left: auto; font-family: var(--mono); font-size: 11.5px; color: var(--status-running); }
|
|
42
|
+
.wk-bar { position: absolute; left: 0; right: 0; bottom: 0; height: 2px; overflow: hidden; }
|
|
43
|
+
.wk-bar i { position: absolute; top: 0; bottom: 0; width: 30%; background: linear-gradient(90deg, transparent, var(--status-running), transparent);
|
|
44
|
+
animation: scan 1.8s linear infinite; }
|
|
45
|
+
`,
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
@property({ attribute: false }) procs: Procs | null = null;
|
|
49
|
+
/** The run is live; when not, every slot is idle. */
|
|
50
|
+
@property({ type: Boolean }) live = false;
|
|
51
|
+
|
|
52
|
+
override render() {
|
|
53
|
+
const work = this.live ? liveActivities(this.procs) : [];
|
|
54
|
+
const max = Math.max(this.procs?.max_workers || 1, work.length);
|
|
55
|
+
const free = Array.from({ length: max - work.length }, (_, i) => i);
|
|
56
|
+
return html`<div class="wks" style="--n:${Math.min(max, 6)}">
|
|
57
|
+
${repeat(
|
|
58
|
+
work,
|
|
59
|
+
(a) => a.id,
|
|
60
|
+
(a) => {
|
|
61
|
+
const body = html`<span class="wk-top">${executorIcon(a.cls !== 'llm', a.cls === 'llm' ? msg('Agent task') : msg('Python task'), 'wk-ic')}<b>${a.kind}</b>
|
|
62
|
+
<cae-elapsed class="wk-el" .since=${starts.at(a.id, a.ageS)}></cae-elapsed></span>
|
|
63
|
+
<span class="meta">${a.detail}</span>
|
|
64
|
+
<span class="wk-bar"><i></i></span>`;
|
|
65
|
+
// A slot with a task opens it: a button.
|
|
66
|
+
return a.key
|
|
67
|
+
? html`<button type="button" class="wk ${a.cls}" @click=${() => emit(this, 'ca-open-task', { key: a.key })}>${body}</button>`
|
|
68
|
+
: html`<div class="wk ${a.cls}">${body}</div>`;
|
|
69
|
+
},
|
|
70
|
+
)}
|
|
71
|
+
${free.map(
|
|
72
|
+
() => html`<div class="wk idle"><div class="wk-top"><b>${msg('Idle')}</b></div></div>`,
|
|
73
|
+
)}
|
|
74
|
+
</div>`;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
declare global {
|
|
79
|
+
interface HTMLElementTagNameMap {
|
|
80
|
+
'ca-workers': CaWorkers;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './ca-overview.js';
|
|
2
|
+
export * from './ca-run-driver.js';
|
|
3
|
+
export * from './ca-workers.js';
|
|
4
|
+
export * from './ca-pipeline-graph.js';
|
|
5
|
+
export * from './ca-kpis.js';
|
|
6
|
+
export * from './ca-timeline.js';
|
|
7
|
+
export * from './ca-spend-breakdown.js';
|
|
8
|
+
export * from './ca-model-usage.js';
|
|
9
|
+
export * from './ca-quota.js';
|
|
10
|
+
export * from './ca-services.js';
|