@aceshooting/lyra-ui 29.0.2 → 29.1.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/CHANGELOG.md +37 -0
- package/README.md +19 -26
- package/design-tokens.json +1 -1
- package/dist/cli/migrate-wa.mjs +2 -0
- package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts +5 -3
- package/dist/components/agent-tools/activity-feed/activity-feed.class.js +4 -3
- package/dist/components/agent-tools/activity-feed/activity-feed.styles.js +1 -1
- package/dist/components/agent-tools/agent-trace/agent-trace.class.d.ts +21 -5
- package/dist/components/agent-tools/agent-trace/agent-trace.class.js +14 -11
- package/dist/components/agent-tools/agent-trace/agent-trace.styles.js +1 -1
- package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +2 -2
- package/dist/components/agent-tools/eval-dataset/eval-dataset.class.d.ts +34 -7
- package/dist/components/agent-tools/eval-dataset/eval-dataset.class.js +25 -11
- package/dist/components/agent-tools/eval-result/eval-result-source.js +1 -0
- package/dist/components/agent-tools/eval-result/eval-result.class.d.ts +31 -11
- package/dist/components/agent-tools/eval-result/eval-result.class.js +29 -15
- package/dist/components/agent-tools/eval-result/eval-result.styles.js +1 -1
- package/dist/components/agent-tools/eval-result/eval-run-result.d.ts +10 -0
- package/dist/components/agent-tools/span-waterfall/span-waterfall.class.d.ts +26 -5
- package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +16 -6
- package/dist/components/agent-tools/span-waterfall/span-waterfall.d.ts +1 -1
- package/dist/components/agent-tools/span-waterfall/span-waterfall.js +1 -1
- package/dist/components/agent-tools/span-waterfall/span-waterfall.styles.js +1 -1
- package/dist/components/agent-tools/task-list/task-list.class.d.ts +29 -6
- package/dist/components/agent-tools/task-list/task-list.class.js +13 -7
- package/dist/components/agent-tools/task-list/task-list.d.ts +1 -1
- package/dist/components/agent-tools/task-list/task-list.js +1 -1
- package/dist/components/agent-tools/task-list/task-list.styles.js +1 -1
- package/dist/components/agent-tools/terminal/terminal.class.d.ts +9 -5
- package/dist/components/agent-tools/terminal/terminal.class.js +8 -8
- package/dist/components/agent-tools/test-results/test-results.class.d.ts +16 -4
- package/dist/components/agent-tools/test-results/test-results.class.js +15 -6
- package/dist/components/agent-tools/test-results/test-results.d.ts +1 -0
- package/dist/components/agent-tools/test-results/test-results.js +1 -1
- package/dist/components/agent-tools/test-results/test-results.styles.js +1 -1
- package/dist/components/agent-tools/tool-timeline/tool-timeline.class.d.ts +7 -4
- package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +2 -1
- package/dist/components/agent-tools/trace-tree/span-projection.js +1 -0
- package/dist/components/agent-tools/trace-tree/span-shared.d.ts +29 -0
- package/dist/components/agent-tools/trace-tree/span-shared.js +1 -0
- package/dist/components/agent-tools/trace-tree/span.d.ts +5 -35
- package/dist/components/agent-tools/trace-tree/span.js +1 -1
- package/dist/components/agent-tools/trace-tree/trace-tree.class.d.ts +27 -5
- package/dist/components/agent-tools/trace-tree/trace-tree.class.js +19 -9
- package/dist/components/agent-tools/trace-tree/trace-tree.d.ts +1 -1
- package/dist/components/agent-tools/trace-tree/trace-tree.js +1 -1
- package/dist/components/agent-tools/trace-tree/trace-tree.styles.js +1 -1
- package/dist/components/charts/chart/bar-chart.class.d.ts +5 -1
- package/dist/components/charts/chart/box-plot.class.d.ts +2 -2
- package/dist/components/charts/chart/box-plot.class.js +3 -3
- package/dist/components/charts/chart/bubble-chart.class.d.ts +5 -1
- package/dist/components/charts/chart/chart-prepared-data.d.ts +9 -0
- package/dist/components/charts/chart/chart-prepared-data.js +1 -0
- package/dist/components/charts/chart/chart-spatial-data.js +2 -0
- package/dist/components/charts/chart/chart-sync.js +1 -1
- package/dist/components/charts/chart/chart-table-sampling.js +1 -1
- package/dist/components/charts/chart/chart.class.d.ts +56 -6
- package/dist/components/charts/chart/chart.class.js +18 -8
- package/dist/components/charts/chart/chart.styles.js +1 -1
- package/dist/components/charts/chart/doughnut-chart.class.d.ts +5 -1
- package/dist/components/charts/chart/histogram-buckets.d.ts +1 -1
- package/dist/components/charts/chart/histogram-buckets.js +1 -1
- package/dist/components/charts/chart/histogram.class.d.ts +19 -4
- package/dist/components/charts/chart/histogram.class.js +1 -1
- package/dist/components/charts/chart/line-chart.class.d.ts +5 -1
- package/dist/components/charts/chart/lite-chart.class.d.ts +51 -11
- package/dist/components/charts/chart/lite-chart.class.js +33 -27
- package/dist/components/charts/chart/lite-chart.styles.js +1 -1
- package/dist/components/charts/chart/pie-chart.class.d.ts +5 -1
- package/dist/components/charts/chart/polar-area-chart.class.d.ts +5 -1
- package/dist/components/charts/chart/radar-chart.class.d.ts +5 -1
- package/dist/components/charts/chart/scatter-chart.class.d.ts +5 -1
- package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts +6 -3
- package/dist/components/conversation/agent-workspace/agent-workspace.class.js +6 -5
- package/dist/components/conversation/agent-workspace/agent-workspace.styles.js +1 -1
- package/dist/components/conversation/chat-viewport/chat-viewport.class.d.ts +8 -0
- package/dist/components/conversation/chat-viewport/chat-viewport.class.js +1 -1
- package/dist/components/conversation/code-block/code-block-base.class.d.ts +5 -3
- package/dist/components/conversation/code-block/code-block-base.class.js +1 -1
- package/dist/components/conversation/code-block/code-block-core.class.d.ts +4 -1
- package/dist/components/conversation/code-block/code-block-core.class.js +1 -1
- package/dist/components/conversation/code-block/code-block-shared.d.ts +6 -4
- package/dist/components/conversation/code-block/code-block-shared.js +3 -2
- package/dist/components/conversation/code-block/code-block.class.d.ts +11 -4
- package/dist/components/conversation/code-block/code-block.class.js +1 -1
- package/dist/components/conversation/code-block/code-block.d.ts +1 -1
- package/dist/components/conversation/code-block/code-block.styles.js +1 -1
- package/dist/components/conversation/code-block/shiki-types.d.ts +2 -0
- package/dist/components/conversation/code-block/shiki-types.js +1 -1
- package/dist/components/conversation/markdown/markdown-base.class.d.ts +6 -4
- package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
- package/dist/components/conversation/markdown/markdown-code-header.d.ts +2 -2
- package/dist/components/conversation/markdown/markdown-code-header.js +1 -1
- package/dist/components/conversation/markdown/markdown-core.class.d.ts +8 -3
- package/dist/components/conversation/markdown/markdown-progressive.js +2 -2
- package/dist/components/conversation/markdown/markdown-shared.d.ts +5 -10
- package/dist/components/conversation/markdown/markdown-shared.js +5 -5
- package/dist/components/conversation/markdown/markdown-streaming-tail.js +1 -1
- package/dist/components/conversation/markdown/markdown.class.d.ts +17 -10
- package/dist/components/conversation/markdown/markdown.class.js +1 -1
- package/dist/components/conversation/markdown/markdown.styles.js +1 -1
- package/dist/components/conversation/model-select/model-select.class.d.ts +4 -3
- package/dist/components/conversation/model-select/model-select.class.js +3 -2
- package/dist/components/conversation/model-select/model-select.styles.js +1 -1
- package/dist/components/conversation/model-settings-panel/model-settings-panel.class.d.ts +2 -1
- package/dist/components/conversation/model-settings-panel/model-settings-panel.class.js +2 -1
- package/dist/components/conversation/model-settings-panel/model-settings-panel.styles.js +1 -1
- package/dist/components/conversation/prompt-input/prompt-input.class.d.ts +3 -2
- package/dist/components/conversation/prompt-input/prompt-input.class.js +2 -1
- package/dist/components/conversation/prompt-input/prompt-input.styles.js +1 -1
- package/dist/components/conversation/prompt-queue/prompt-queue.class.d.ts +10 -2
- package/dist/components/conversation/prompt-queue/prompt-queue.class.js +15 -6
- package/dist/components/conversation/prompt-queue/prompt-queue.styles.js +1 -1
- package/dist/components/conversation/realtime-session/realtime-session.class.d.ts +3 -1
- package/dist/components/conversation/realtime-session/realtime-session.class.js +2 -1
- package/dist/components/conversation/realtime-session/realtime-session.styles.js +1 -1
- package/dist/components/conversation/streaming-text/markdown-detection.d.ts +2 -0
- package/dist/components/conversation/streaming-text/markdown-detection.js +4 -1
- package/dist/components/conversation/streaming-text/streaming-text-base.class.d.ts +6 -2
- package/dist/components/conversation/streaming-text/streaming-text-base.class.js +3 -3
- package/dist/components/conversation/streaming-text/streaming-text-core.class.js +1 -1
- package/dist/components/conversation/streaming-text/streaming-text.class.js +1 -0
- package/dist/components/conversation/thread-list/thread-list.class.d.ts +34 -4
- package/dist/components/conversation/thread-list/thread-list.class.js +22 -15
- package/dist/components/conversation/thread-list/thread-list.d.ts +1 -1
- package/dist/components/conversation/thread-list/thread-list.js +1 -1
- package/dist/components/conversation/thread-list/thread-list.styles.js +1 -1
- package/dist/components/conversation/transcript-feed/transcript-feed.class.d.ts +6 -2
- package/dist/components/conversation/transcript-feed/transcript-feed.class.js +3 -2
- package/dist/components/conversation/transcript-feed/transcript-feed.styles.js +1 -1
- package/dist/components/conversation/voice-picker/voice-picker.class.d.ts +3 -2
- package/dist/components/conversation/voice-picker/voice-picker.class.js +3 -2
- package/dist/components/conversation/voice-picker/voice-picker.styles.js +1 -1
- package/dist/components/data/calendar/calendar.class.d.ts +5 -2
- package/dist/components/data/calendar/calendar.class.js +1 -1
- package/dist/components/data/data-grid/data-grid-processing.js +2 -2
- package/dist/components/data/data-grid/data-grid.class.d.ts +22 -8
- package/dist/components/data/data-grid/data-grid.class.js +20 -19
- package/dist/components/data/data-grid/data-grid.styles.js +1 -1
- package/dist/components/data/document-library/document-library.class.d.ts +31 -4
- package/dist/components/data/document-library/document-library.class.js +25 -12
- package/dist/components/data/document-library/document-library.styles.js +1 -1
- package/dist/components/data/file-tree/file-tree.class.d.ts +30 -6
- package/dist/components/data/file-tree/file-tree.class.js +4 -3
- package/dist/components/data/file-tree/file-tree.d.ts +1 -0
- package/dist/components/data/file-tree/file-tree.js +1 -1
- package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +31 -6
- package/dist/components/data/flow-canvas/flow-canvas.class.js +40 -19
- package/dist/components/data/flow-canvas/flow-canvas.styles.js +1 -1
- package/dist/components/data/flow-canvas/flow-model.js +1 -1
- package/dist/components/data/flow-canvas/flow-source.js +1 -0
- package/dist/components/data/flow-canvas/flow-types.d.ts +4 -2
- package/dist/components/data/flow-canvas/flow-viewport-index.js +1 -0
- package/dist/components/data/flow-minimap/flow-minimap.class.d.ts +9 -3
- package/dist/components/data/flow-minimap/flow-minimap.class.js +11 -2
- package/dist/components/data/flow-minimap/flow-minimap.styles.js +1 -1
- package/dist/components/data/funnel/funnel.class.d.ts +7 -3
- package/dist/components/data/funnel/funnel.class.js +2 -2
- package/dist/components/data/heatmap/calendar-grid.d.ts +1 -1
- package/dist/components/data/heatmap/calendar-grid.js +1 -1
- package/dist/components/data/heatmap/heatmap-grid-navigation.js +1 -1
- package/dist/components/data/heatmap/heatmap-limits.d.ts +1 -1
- package/dist/components/data/heatmap/heatmap-matrix-source-controller.js +1 -0
- package/dist/components/data/heatmap/heatmap-matrix-source.d.ts +5 -0
- package/dist/components/data/heatmap/heatmap-matrix-source.js +1 -0
- package/dist/components/data/heatmap/heatmap-scale.d.ts +0 -16
- package/dist/components/data/heatmap/heatmap-scale.js +1 -1
- package/dist/components/data/heatmap/heatmap.class.d.ts +40 -11
- package/dist/components/data/heatmap/heatmap.class.js +26 -6
- package/dist/components/data/heatmap/heatmap.styles.js +1 -1
- package/dist/components/data/pagination/pagination.class.js +1 -1
- package/dist/components/data/sequence-strip/sequence-strip-item.d.ts +17 -0
- package/dist/components/data/sequence-strip/sequence-strip-source-controller.js +1 -0
- package/dist/components/data/sequence-strip/sequence-strip-source.d.ts +5 -0
- package/dist/components/data/sequence-strip/sequence-strip-source.js +1 -0
- package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +24 -19
- package/dist/components/data/sequence-strip/sequence-strip.class.js +23 -4
- package/dist/components/data/sequence-strip/sequence-strip.styles.js +1 -1
- package/dist/components/data/sparkline/sparkline.class.d.ts +17 -4
- package/dist/components/data/sparkline/sparkline.class.js +3 -3
- package/dist/components/data/sparkline/sparkline.styles.js +1 -1
- package/dist/components/data/table/table.class.d.ts +14 -10
- package/dist/components/data/table/table.class.js +17 -16
- package/dist/components/data/timeline/timeline.class.d.ts +5 -2
- package/dist/components/data/timeline/timeline.class.js +1 -1
- package/dist/components/data/tree/tree-item.class.js +1 -1
- package/dist/components/data/tree/tree-owner-controller.js +1 -1
- package/dist/components/data/tree/tree.class.d.ts +28 -6
- package/dist/components/data/tree/tree.class.js +3 -3
- package/dist/components/data/tree/tree.d.ts +1 -0
- package/dist/components/data/tree/tree.js +1 -1
- package/dist/components/data/word-cloud/word-cloud.class.d.ts +17 -7
- package/dist/components/data/word-cloud/word-cloud.class.js +6 -4
- package/dist/components/data/word-cloud/word-cloud.styles.js +1 -1
- package/dist/components/forms/catalog-picker-base.d.ts +1 -1
- package/dist/components/forms/catalog-picker-base.js +6 -6
- package/dist/components/forms/catalog-picker-base.styles.js +1 -1
- package/dist/components/forms/combobox/combobox.class.d.ts +7 -3
- package/dist/components/forms/combobox/combobox.class.js +1 -1
- package/dist/components/forms/combobox/option.class.d.ts +4 -2
- package/dist/components/forms/combobox/option.class.js +2 -2
- package/dist/components/forms/country-picker/country-picker.class.d.ts +3 -1
- package/dist/components/forms/country-picker/country-picker.class.js +1 -1
- package/dist/components/forms/currency-picker/currency-picker.class.d.ts +2 -0
- package/dist/components/forms/currency-picker/currency-picker.class.js +1 -1
- package/dist/components/forms/currency-picker/currency-presentation.js +1 -1
- package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +6 -2
- package/dist/components/forms/emoji-picker/emoji-picker.class.js +3 -2
- package/dist/components/forms/emoji-picker/emoji-picker.styles.js +1 -1
- package/dist/components/forms/locale-picker/locale-picker.class.d.ts +8 -2
- package/dist/components/forms/locale-picker/locale-picker.class.js +5 -4
- package/dist/components/forms/locale-picker/locale-picker.styles.js +1 -1
- package/dist/components/forms/select/select.class.d.ts +11 -3
- package/dist/components/forms/select/select.class.js +4 -4
- package/dist/components/forms/time-zone-picker/time-zone-picker.class.d.ts +2 -0
- package/dist/components/forms/time-zone-picker/time-zone-picker.class.js +1 -1
- package/dist/components/forms/token-input/token-input.class.d.ts +6 -1
- package/dist/components/forms/token-input/token-input.class.js +15 -13
- package/dist/components/forms/unit-picker/unit-picker.class.d.ts +2 -0
- package/dist/components/forms/unit-picker/unit-picker.class.js +1 -1
- package/dist/components/layout/app-rail/app-rail.class.d.ts +1 -1
- package/dist/components/layout/app-rail/app-rail.class.js +1 -1
- package/dist/components/layout/command-palette/command-palette.class.d.ts +5 -2
- package/dist/components/layout/command-palette/command-palette.class.js +2 -1
- package/dist/components/layout/command-palette/command-palette.styles.js +1 -1
- package/dist/components/layout/menu/menu-item.class.d.ts +2 -2
- package/dist/components/layout/menu/menu-item.class.js +2 -2
- package/dist/components/layout/menu/menu.class.d.ts +1 -1
- package/dist/components/layout/menu/menu.class.js +1 -1
- package/dist/components/layout/menubar/menubar.class.d.ts +1 -1
- package/dist/components/layout/menubar/menubar.class.js +1 -1
- package/dist/components/layout/reorder-list/reorder-item.class.d.ts +2 -2
- package/dist/components/layout/reorder-list/reorder-item.class.js +2 -2
- package/dist/components/layout/reorder-list/reorder-list.class.d.ts +1 -1
- package/dist/components/layout/reorder-list/reorder-list.class.js +1 -1
- package/dist/components/layout/virtual-list/virtual-list.class.d.ts +13 -9
- package/dist/components/layout/virtual-list/virtual-list.class.js +21 -17
- package/dist/components/media/av-player/av-cue-index.js +1 -0
- package/dist/components/media/av-player/av-cue-source.d.ts +13 -0
- package/dist/components/media/av-player/av-cue-source.js +1 -0
- package/dist/components/media/av-player/av-metadata.d.ts +2 -2
- package/dist/components/media/av-player/av-metadata.js +1 -1
- package/dist/components/media/av-player/av-player-cue-source-controller.js +1 -0
- package/dist/components/media/av-player/av-player.class.d.ts +34 -12
- package/dist/components/media/av-player/av-player.class.js +15 -10
- package/dist/components/media/flag/flag.class.js +1 -1
- package/dist/components/media/flag/language-map.js +1 -1
- package/dist/components/media/lightbox/lightbox-source.js +1 -0
- package/dist/components/media/lightbox/lightbox-types.d.ts +15 -0
- package/dist/components/media/lightbox/lightbox.class.d.ts +22 -21
- package/dist/components/media/lightbox/lightbox.class.js +6 -4
- package/dist/components/media/lightbox/lightbox.styles.js +1 -1
- package/dist/components/media/map/map-geojson-diff.d.ts +6 -6
- package/dist/components/media/map/map-geojson-diff.js +1 -1
- package/dist/components/media/map/map-loader.d.ts +5 -1
- package/dist/components/media/map/map.class.d.ts +24 -6
- package/dist/components/media/map/map.class.js +2 -2
- package/dist/components/media/map/map.styles.js +1 -1
- package/dist/components/media/video-playlist/video-playlist.class.d.ts +2 -1
- package/dist/components/media/video-playlist/video-playlist.class.js +1 -1
- package/dist/components/overlays/chip/chip.class.d.ts +1 -1
- package/dist/components/overlays/chip/chip.class.js +1 -1
- package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.d.ts +30 -8
- package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js +22 -8
- package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js +1 -1
- package/dist/components/retrieval/graph/graph-canvas.js +1 -1
- package/dist/components/retrieval/graph/graph-source-composition.js +1 -0
- package/dist/components/retrieval/graph/graph-source-controller.js +1 -0
- package/dist/components/retrieval/graph/graph-spatial-controller.js +2 -2
- package/dist/components/retrieval/graph/graph-spatial-model.js +1 -0
- package/dist/components/retrieval/graph/graph-spatial.js +1 -1
- package/dist/components/retrieval/graph/graph.class.d.ts +31 -6
- package/dist/components/retrieval/graph/graph.class.js +26 -5
- package/dist/components/retrieval/graph/graph.d.ts +1 -1
- package/dist/components/retrieval/graph/graph.js +1 -1
- package/dist/components/retrieval/graph/graph.styles.js +1 -1
- package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.d.ts +33 -4
- package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js +27 -17
- package/dist/components/retrieval/ingestion-queue/ingestion-queue.d.ts +1 -1
- package/dist/components/retrieval/ingestion-queue/ingestion-queue.js +1 -1
- package/dist/components/retrieval/ingestion-queue/ingestion-queue.styles.js +1 -1
- package/dist/components/retrieval/knowledge-base/knowledge-base.class.d.ts +27 -4
- package/dist/components/retrieval/knowledge-base/knowledge-base.class.js +29 -14
- package/dist/components/retrieval/knowledge-base/knowledge-base.styles.js +1 -1
- package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.d.ts +17 -3
- package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js +15 -10
- package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.js +1 -1
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +24 -5
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +17 -10
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.d.ts +1 -1
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.js +1 -1
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.styles.js +1 -1
- package/dist/components/retrieval/mind-map/mind-map-layout.js +1 -1
- package/dist/components/retrieval/mind-map/mind-map-model.js +1 -0
- package/dist/components/retrieval/mind-map/mind-map.class.d.ts +27 -4
- package/dist/components/retrieval/mind-map/mind-map.class.js +11 -7
- package/dist/components/retrieval/mind-map/mind-map.d.ts +1 -0
- package/dist/components/retrieval/mind-map/mind-map.js +1 -1
- package/dist/components/retrieval/mind-map/mind-map.styles.js +1 -1
- package/dist/components/retrieval/neighbor-list/neighbor-list.class.d.ts +24 -2
- package/dist/components/retrieval/neighbor-list/neighbor-list.class.js +17 -3
- package/dist/components/retrieval/neighbor-list/neighbor-list.d.ts +1 -1
- package/dist/components/retrieval/neighbor-list/neighbor-list.js +1 -1
- package/dist/components/retrieval/neighbor-list/neighbor-list.styles.js +1 -1
- package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.d.ts +8 -4
- package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.js +11 -7
- package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.styles.js +1 -1
- package/dist/components/retrieval/retrieval-compare/retrieval-compare.class.d.ts +12 -6
- package/dist/components/retrieval/retrieval-compare/retrieval-compare.class.js +30 -17
- package/dist/components/retrieval/retrieval-compare/retrieval-compare.styles.js +1 -1
- package/dist/components/retrieval/retrieval-results/retrieval-results-model.js +1 -0
- package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts +46 -5
- package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +31 -9
- package/dist/components/retrieval/retrieval-results/retrieval-results.d.ts +1 -1
- package/dist/components/retrieval/retrieval-results/retrieval-results.js +1 -1
- package/dist/components/retrieval/retrieval-results/retrieval-results.styles.js +1 -1
- package/dist/components/utility/diff-view/diff-view.class.d.ts +16 -8
- package/dist/components/utility/diff-view/diff-view.class.js +3 -2
- package/dist/components/utility/diff-view/diff-view.styles.js +1 -1
- package/dist/components/utility/json-viewer/json-viewer.class.d.ts +31 -3
- package/dist/components/utility/json-viewer/json-viewer.class.js +13 -4
- package/dist/components/utility/json-viewer/json-viewer.d.ts +1 -0
- package/dist/components/utility/json-viewer/json-viewer.js +1 -1
- package/dist/components/utility/json-viewer/json-viewer.styles.js +1 -1
- package/dist/components/utility/mention-popover/mention-popover.class.d.ts +6 -4
- package/dist/components/utility/mention-popover/mention-popover.class.js +6 -5
- package/dist/components/viewers/csv-viewer/csv-viewer.class.d.ts +34 -7
- package/dist/components/viewers/csv-viewer/csv-viewer.class.js +9 -7
- package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts +28 -4
- package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js +12 -11
- package/dist/components/viewers/geojson-view/geojson-viewer.class.d.ts +3 -1
- package/dist/components/viewers/geojson-view/geojson-viewer.class.js +17 -16
- package/dist/components/viewers/geojson-view/geojson-viewer.d.ts +1 -1
- package/dist/components/viewers/geojson-view/geojson-viewer.js +1 -1
- package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.d.ts +31 -5
- package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js +11 -8
- package/dist/components/viewers/table-viewer-shared.js +19 -3
- package/dist/components/viewers/viewer-search-limits.js +1 -1
- package/dist/components/viewers/xml-viewer/xml-viewer.class.d.ts +35 -3
- package/dist/components/viewers/xml-viewer/xml-viewer.class.js +20 -5
- package/dist/components/viewers/xml-viewer/xml-viewer.d.ts +1 -1
- package/dist/components/viewers/xml-viewer/xml-viewer.js +1 -1
- package/dist/components/viewers/xml-viewer/xml-viewer.styles.js +1 -1
- package/dist/countries.js +1 -1
- package/dist/data-sources.d.ts +34 -0
- package/dist/data-sources.js +1 -0
- package/dist/events.d.ts +51 -7
- package/dist/framework-types.d.ts +1 -1
- package/dist/internal/accessibility-visibility.d.ts +4 -2
- package/dist/internal/accessibility-visibility.js +1 -1
- package/dist/internal/accessible-text-controller.js +1 -1
- package/dist/internal/anchor-target.js +2 -2
- package/dist/internal/catalog-picker.d.ts +1 -7
- package/dist/internal/catalog-picker.js +1 -1
- package/dist/internal/collection-snapshot.js +1 -1
- package/dist/internal/default-strings/agent-tools.generated.js +1 -1
- package/dist/internal/default-strings/charts.generated.js +1 -1
- package/dist/internal/default-strings/conversation.generated.js +1 -1
- package/dist/internal/default-strings/data.generated.js +1 -1
- package/dist/internal/default-strings/forms.generated.js +1 -1
- package/dist/internal/default-strings/layout.generated.js +1 -1
- package/dist/internal/default-strings/media.generated.js +1 -1
- package/dist/internal/default-strings/retrieval.generated.js +1 -1
- package/dist/internal/default-strings/shared.generated.js +1 -1
- package/dist/internal/default-strings/utility.generated.js +1 -1
- package/dist/internal/delimited-data.js +1 -1
- package/dist/internal/fixed-containing-block.js +1 -1
- package/dist/internal/flow-scene-envelope.js +1 -0
- package/dist/internal/graph-scene-controller.js +1 -0
- package/dist/internal/hierarchy-source-controller.js +1 -0
- package/dist/internal/hierarchy-source-view.js +29 -0
- package/dist/internal/hierarchy-source-view.styles.js +1 -0
- package/dist/internal/inherited-attribute-hub.d.ts +6 -0
- package/dist/internal/inherited-attribute-hub.js +1 -1
- package/dist/internal/intl-cache.js +1 -1
- package/dist/internal/keyed-index.js +1 -0
- package/dist/internal/localization-types.d.ts +1 -1
- package/dist/internal/localization.js +2 -2
- package/dist/internal/lyra-element.d.ts +2 -2
- package/dist/internal/lyra-element.js +3 -2
- package/dist/internal/native-modal-context.js +1 -1
- package/dist/internal/option-selection.js +1 -1
- package/dist/internal/package-metadata.js +1 -1
- package/dist/internal/positioner.js +1 -1
- package/dist/internal/resource-loader.d.ts +2 -0
- package/dist/internal/resource-loader.js +1 -1
- package/dist/internal/scoped-definitions.generated.js +1 -1
- package/dist/internal/search-haystack.js +1 -0
- package/dist/internal/selection-catalog.d.ts +5 -0
- package/dist/internal/selection-catalog.js +1 -1
- package/dist/internal/shiki-language-sources.js +1 -0
- package/dist/internal/source-page-controller.js +1 -0
- package/dist/internal/source-page-scope.js +1 -0
- package/dist/internal/source-request-controller.js +1 -0
- package/dist/internal/source-window-controller.js +1 -0
- package/dist/internal/spatial-source-controller.js +1 -0
- package/dist/internal/text-quote.d.ts +2 -6
- package/dist/internal/text-quote.js +1 -1
- package/dist/internal/theme-watcher.js +1 -1
- package/dist/internal/virtual-list-composition.js +1 -0
- package/dist/lyra.d.ts +1 -1
- package/dist/lyra.js +1 -1
- package/dist/testing/interaction-drivers.js +1 -1
- package/dist/testing/lyra-tag-event-map.js +1 -1
- package/dist/units.js +1 -1
- package/dist/utilities/data-preparation.d.ts +56 -0
- package/dist/utilities/data-preparation.js +1 -0
- package/dist/utilities/data-spatial.d.ts +26 -0
- package/dist/utilities/data-spatial.js +1 -0
- package/dist/utilities/index.d.ts +1 -1
- package/dist/utilities/index.js +1 -1
- package/llms/components/lr-activity-feed.md +7 -2
- package/llms/components/lr-agent-trace.md +49 -9
- package/llms/components/lr-agent-workspace.md +15 -8
- package/llms/components/lr-av-player.md +180 -10
- package/llms/components/lr-bar-chart.md +1 -1
- package/llms/components/lr-box-plot.md +8 -0
- package/llms/components/lr-bubble-chart.md +1 -1
- package/llms/components/lr-calendar.md +26 -3
- package/llms/components/lr-chart.md +310 -23
- package/llms/components/lr-chat-viewport.md +6 -0
- package/llms/components/lr-code-block-core.md +12 -7
- package/llms/components/lr-code-block.md +23 -9
- package/llms/components/lr-combobox.md +27 -15
- package/llms/components/lr-command-palette.md +16 -3
- package/llms/components/lr-country-picker.md +23 -6
- package/llms/components/lr-csv-viewer.md +95 -12
- package/llms/components/lr-currency-picker.md +23 -3
- package/llms/components/lr-data-grid.md +24 -6
- package/llms/components/lr-dataset-viewer.md +92 -11
- package/llms/components/lr-dialog.md +1 -1
- package/llms/components/lr-diff-view.md +19 -6
- package/llms/components/lr-document-library.md +60 -5
- package/llms/components/lr-doughnut-chart.md +1 -1
- package/llms/components/lr-embedding-explorer.md +89 -9
- package/llms/components/lr-emoji-picker.md +7 -2
- package/llms/components/lr-eval-dataset.md +56 -7
- package/llms/components/lr-eval-result.md +89 -4
- package/llms/components/lr-export-button.md +1 -1
- package/llms/components/lr-file-tree.md +60 -6
- package/llms/components/lr-flag.md +5 -2
- package/llms/components/lr-flow-canvas.md +152 -14
- package/llms/components/lr-flow-minimap.md +32 -4
- package/llms/components/lr-funnel.md +14 -0
- package/llms/components/lr-geojson-viewer.md +27 -10
- package/llms/components/lr-graph.md +43 -7
- package/llms/components/lr-heatmap.md +161 -5
- package/llms/components/lr-histogram.md +55 -9
- package/llms/components/lr-ingestion-queue.md +54 -3
- package/llms/components/lr-json-viewer.md +87 -7
- package/llms/components/lr-knowledge-base-admin.md +60 -4
- package/llms/components/lr-knowledge-base.md +121 -9
- package/llms/components/lr-knowledge-graph-explorer.md +106 -11
- package/llms/components/lr-lightbox.md +42 -6
- package/llms/components/lr-line-chart.md +28 -5
- package/llms/components/lr-lite-chart.md +96 -31
- package/llms/components/lr-locale-picker.md +6 -4
- package/llms/components/lr-map.md +67 -8
- package/llms/components/lr-markdown-core.md +10 -5
- package/llms/components/lr-markdown.md +23 -6
- package/llms/components/lr-mention-popover.md +11 -6
- package/llms/components/lr-mind-map.md +91 -10
- package/llms/components/lr-model-select.md +8 -4
- package/llms/components/lr-model-settings-panel.md +10 -2
- package/llms/components/lr-navigation-menu.md +1 -1
- package/llms/components/lr-neighbor-list.md +69 -2
- package/llms/components/lr-pie-chart.md +1 -1
- package/llms/components/lr-polar-area-chart.md +1 -1
- package/llms/components/lr-prompt-input.md +9 -2
- package/llms/components/lr-prompt-queue.md +11 -3
- package/llms/components/lr-radar-chart.md +1 -1
- package/llms/components/lr-rag-eval-dashboard.md +9 -2
- package/llms/components/lr-realtime-session.md +6 -2
- package/llms/components/lr-reorder-list.md +4 -0
- package/llms/components/lr-retrieval-compare.md +9 -4
- package/llms/components/lr-retrieval-results.md +104 -6
- package/llms/components/lr-scatter-chart.md +1 -1
- package/llms/components/lr-select.md +20 -10
- package/llms/components/lr-sequence-strip.md +92 -2
- package/llms/components/lr-span-waterfall.md +78 -8
- package/llms/components/lr-sparkline.md +42 -11
- package/llms/components/lr-spreadsheet-viewer.md +109 -14
- package/llms/components/lr-streaming-text-core.md +4 -2
- package/llms/components/lr-streaming-text.md +5 -1
- package/llms/components/lr-table.md +96 -115
- package/llms/components/lr-task-list.md +93 -9
- package/llms/components/lr-terminal.md +9 -0
- package/llms/components/lr-test-results.md +77 -3
- package/llms/components/lr-thread-list.md +86 -1
- package/llms/components/lr-time-zone-picker.md +8 -3
- package/llms/components/lr-timeline.md +5 -0
- package/llms/components/lr-token-input.md +7 -2
- package/llms/components/lr-tool-timeline.md +13 -4
- package/llms/components/lr-trace-tree.md +96 -10
- package/llms/components/lr-transcript-feed.md +9 -2
- package/llms/components/lr-tree.md +87 -15
- package/llms/components/lr-unit-picker.md +8 -3
- package/llms/components/lr-video-playlist.md +2 -0
- package/llms/components/lr-virtual-list.md +17 -8
- package/llms/components/lr-voice-picker.md +8 -3
- package/llms/components/lr-word-cloud.md +128 -12
- package/llms/components/lr-xml-viewer.md +106 -9
- package/llms/index.md +1 -1
- package/llms/peers.md +1 -1
- package/llms/shared/events-and-types.md +725 -264
- package/llms/shared/forms-and-accessibility.md +3 -17
- package/llms/shared/imports-and-registration.md +3 -17
- package/llms/shared/localization-and-rtl.md +0 -2
- package/llms/shared/styles-and-tokens.md +27 -36
- package/llms/shared/testing-and-utilities.md +4 -5
- package/llms/shared.md +770 -349
- package/llms.txt +1 -2
- package/locales.json +139 -139
- package/package.json +13 -4
- package/registrations.json +1 -1
- package/skills/compose-lyra-interfaces/SKILL.md +6 -8
- package/skills/lyra-ui/SKILL.md +20 -51
- package/skills/lyra-ui/commands/review.md +16 -33
- package/skills/lyra-ui/commands/update.md +6 -5
- package/skills/lyra-ui/online-api.md +15 -0
- package/skills/lyra-ui/reporting.md +2 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{html,nothing}from"lit";import{property,state,query}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{nextId}from"../../../internal/a11y.js";import{srOnly}from"../../../internal/a11y.js";import{styles}from"./test-results.styles.js";import{testResultDetailSlotName}from"./test-results-slots.js";import{testResultDetailSlotName as testResultDetailSlotName2}from"./test-results-slots.js";import{agentActionButtonStyles}from"../agent-action-button.styles.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{formatShortDuration}from"../../../internal/duration.js";import{AnnouncementSinkController}from"../../../internal/announcer.js";import{overallSemanticLabel,overallSemanticRole}from"../semantic-owner.js";import{LYRA_DEFAULT_accessibleLabelSeparator,LYRA_DEFAULT_statusSkipped,LYRA_DEFAULT_testResultsCollapseTest,LYRA_DEFAULT_testResultsCompleteAnnounce,LYRA_DEFAULT_testResultsExpandTest,LYRA_DEFAULT_testResultsFailed,LYRA_DEFAULT_testResultsFilterLabel,LYRA_DEFAULT_testResultsLabel,LYRA_DEFAULT_testResultsLimit,LYRA_DEFAULT_testResultsPassed,LYRA_DEFAULT_testResultsRunning,LYRA_DEFAULT_testResultsSkipped}from"../../../internal/default-strings/agent-tools.generated.js";import{LYRA_DEFAULT_collapse,LYRA_DEFAULT_copy,LYRA_DEFAULT_date,LYRA_DEFAULT_details,LYRA_DEFAULT_durationMilliseconds,LYRA_DEFAULT_durationSeconds,LYRA_DEFAULT_expand,LYRA_DEFAULT_loading,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_noData,LYRA_DEFAULT_noMatches,LYRA_DEFAULT_open,LYRA_DEFAULT_search,LYRA_DEFAULT_select,LYRA_DEFAULT_statusError,LYRA_DEFAULT_statusRunning,LYRA_DEFAULT_statusSuccess}from"../../../internal/default-strings/shared.generated.js";const STATUSES=["passed","failed","skipped","running"],MAX_RENDERED_TESTS=1e3;function normalizeTestStatus(value){switch(value){case"passed":case"failed":case"skipped":case"running":return value;case"error":case"timedOut":case"broken":return"failed";default:return"skipped"}}const STATUS_COUNT_KEY={passed:"testResultsPassed",failed:"testResultsFailed",skipped:"testResultsSkipped",running:"testResultsRunning"},STATUS_LABEL_KEY={passed:"statusSuccess",failed:"statusError",skipped:"statusSkipped",running:"statusRunning"},STATUS_GLYPH={passed:"✓",failed:"×",skipped:"–"};class LyraTestResults extends LyraElement{constructor(){super(...arguments),this.suites=[],this.statusFilter=[],this.runId=null,this.runState="idle",this.withoutAutoExpandFailures=!1,this.manualExpanded=new Map,this.normalizedSuitesCache=[],this.projectedSuitesCache=[],this.completeStatusCounts={passed:0,failed:0,skipped:0,running:0},this.normalizedTestKeys=new Set,this.detailSlotNames=new Set,this.detailSlotsDirty=!0,this.projectionTruncated=!1,this.announcements=new AnnouncementSinkController(this,{eager:["polite"]}),this.limitAnnouncementInitialized=!1,this.previouslyTruncated=!1,this.idPrefix=nextId("test-results"),this.pendingCompletionAnnouncement=null}static{this.defaultStrings={...super.defaultStrings,accessibleLabelSeparator:LYRA_DEFAULT_accessibleLabelSeparator,collapse:LYRA_DEFAULT_collapse,copy:LYRA_DEFAULT_copy,date:LYRA_DEFAULT_date,details:LYRA_DEFAULT_details,durationMilliseconds:LYRA_DEFAULT_durationMilliseconds,durationSeconds:LYRA_DEFAULT_durationSeconds,expand:LYRA_DEFAULT_expand,loading:LYRA_DEFAULT_loading,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,noData:LYRA_DEFAULT_noData,noMatches:LYRA_DEFAULT_noMatches,open:LYRA_DEFAULT_open,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select,statusError:LYRA_DEFAULT_statusError,statusRunning:LYRA_DEFAULT_statusRunning,statusSkipped:LYRA_DEFAULT_statusSkipped,statusSuccess:LYRA_DEFAULT_statusSuccess,testResultsCollapseTest:LYRA_DEFAULT_testResultsCollapseTest,testResultsCompleteAnnounce:LYRA_DEFAULT_testResultsCompleteAnnounce,testResultsExpandTest:LYRA_DEFAULT_testResultsExpandTest,testResultsFailed:LYRA_DEFAULT_testResultsFailed,testResultsFilterLabel:LYRA_DEFAULT_testResultsFilterLabel,testResultsLabel:LYRA_DEFAULT_testResultsLabel,testResultsLimit:LYRA_DEFAULT_testResultsLimit,testResultsPassed:LYRA_DEFAULT_testResultsPassed,testResultsRunning:LYRA_DEFAULT_testResultsRunning,testResultsSkipped:LYRA_DEFAULT_testResultsSkipped}}static{this.collectionSupport=collectionSupport}static{this.ownedCollectionProperties=Object.freeze(["suites","statusFilter"])}static{this.identityCollectionProperties=Object.freeze(["suites"])}static{this.styles=[LyraElement.styles,styles,srOnly,agentActionButtonStyles]}static{this.immutableEventDetails=Object.freeze(["lr-filter-change"])}connectedCallback(){super.connectedCallback(),this.limitAnnouncementInitialized=this.hasUpdated,this.previouslyTruncated=this.projectionTruncated}adoptedCallback(){super.adoptedCallback(),this.announcements.adopted()}willUpdate(changed){if(super.willUpdate(changed),changed.has("suites")){this.rebuildNormalizedSuites();const pruned=new Map([...this.manualExpanded].filter(([key])=>this.normalizedTestKeys.has(key)));pruned.size!==this.manualExpanded.size&&(this.manualExpanded=pruned)}if((changed.has("suites")||changed.has("statusFilter"))&&this.rebuildProjection(),this.detailSlotsDirty&&(this.rebuildDetailSlotNames(),this.detailSlotsDirty=!1),changed.has("runState")||changed.has("runId")){const previousState=changed.has("runState")?changed.get("runState"):this.runState,previousRunId=changed.has("runId")?changed.get("runId"):this.runId;if(previousState==="running"&&this.runState==="complete"&&this.runId!==null&&previousRunId===this.runId){const number=getNumberFormat(this.effectiveLocale);this.pendingCompletionAnnouncement=this.localize("testResultsCompleteAnnounce",void 0,{passed:number.format(this.countOf("passed")),failed:number.format(this.countOf("failed")),skipped:number.format(this.countOf("skipped"))})}}}rebuildNormalizedSuites(){const normalizedSuites=[],suiteIds=new Set,normalizedTestKeys=new Set,counts={passed:0,failed:0,skipped:0,running:0};for(const suite of Array.isArray(this.suites)?this.suites:[]){if(!suite||typeof suite.id!="string"||suite.id.trim().length===0||suiteIds.has(suite.id))continue;suiteIds.add(suite.id);const testIds=new Set,tests=[];for(const test of Array.isArray(suite.tests)?suite.tests:[]){if(!test||typeof test.id!="string"||test.id.trim().length===0||testIds.has(test.id))continue;testIds.add(test.id);const status=normalizeTestStatus(test.status),normalized={id:test.id,name:typeof test.name=="string"?test.name:"",status,...typeof test.durationMs=="number"?{durationMs:test.durationMs}:{},...typeof test.message=="string"?{message:test.message}:{}};tests.push(normalized),normalizedTestKeys.add(this.testKey(suite.id,normalized.id)),counts[status]++}tests.length>0&&normalizedSuites.push({id:suite.id,name:typeof suite.name=="string"?suite.name:"",tests})}this.normalizedSuitesCache=normalizedSuites,this.normalizedTestKeys=normalizedTestKeys,this.completeStatusCounts=counts}rebuildProjection(){const filteredStatuses=new Set(this.statusFilter),candidates=this.normalizedSuitesCache.flatMap(suite=>suite.tests.filter(test=>filteredStatuses.size===0||filteredStatuses.has(test.status)).map(test=>({suiteId:suite.id,test}))),chosenKeys=new Set,reserve=predicate=>{for(const{suiteId,test}of candidates){if(chosenKeys.size>=MAX_RENDERED_TESTS)break;predicate(suiteId,test)&&chosenKeys.add(this.testKey(suiteId,test.id))}};reserve((suiteId,test)=>this.manualExpanded.get(this.testKey(suiteId,test.id))===!0),reserve((_suiteId,test)=>test.status==="failed"),reserve(()=>!0),this.projectedSuitesCache=this.normalizedSuitesCache.map(suite=>({...suite,tests:suite.tests.filter(test=>chosenKeys.has(this.testKey(suite.id,test.id)))})).filter(suite=>suite.tests.length>0),this.projectionTruncated=chosenKeys.size<candidates.length}updated(changed){if(super.updated(changed),this.pendingCompletionAnnouncement!==null){const text=this.pendingCompletionAnnouncement;this.pendingCompletionAnnouncement=null,this.liveRegion?.announce(text,{force:!0})}this.limitAnnouncementInitialized&&this.projectionTruncated&&!this.previouslyTruncated&&this.announcements.announcePolite(this.localize("testResultsLimit",void 0,{count:getNumberFormat(this.effectiveLocale).format(MAX_RENDERED_TESTS)})),this.limitAnnouncementInitialized=!0,this.previouslyTruncated=this.projectionTruncated}countOf(status){return this.completeStatusCounts[status]}computeStatusCounts(){return this.completeStatusCounts}testKey(suiteId,testId){return JSON.stringify([suiteId,testId])}scopedDetailSlot(suiteId,testId){return testResultDetailSlotName(suiteId,testId)}rebuildDetailSlotNames(){this.detailSlotNames=new Set([...this.children].map(child=>child.getAttribute("slot")).filter(name=>name!==null))}hasDetail(suiteId,testId){return this.detailSlotNames.has(this.scopedDetailSlot(suiteId,testId))}isExpanded(suiteId,test){const manual=this.manualExpanded.get(this.testKey(suiteId,test.id));return manual!==void 0?manual:!this.withoutAutoExpandFailures&&test.status==="failed"}toggleFilter(status){const next=this.statusFilter.includes(status)?this.statusFilter.filter(s=>s!==status):[...this.statusFilter,status];this.statusFilter=next,this.emit("lr-filter-change",{statuses:next})}toggleExpanded(suiteId,test){const expanded=!this.isExpanded(suiteId,test);if(this.emit("lr-toggle-request",{suiteId,testId:test.id,expanded},{cancelable:!0}).defaultPrevented)return;const next=new Map(this.manualExpanded);next.set(this.testKey(suiteId,test.id),expanded),this.manualExpanded=next,this.emit("lr-toggle",{suiteId,testId:test.id,expanded})}onDetailSlotChange(){this.detailSlotsDirty=!0,this.requestUpdate()}renderSummary(statusCounts){return html`
|
|
1
|
+
import{__decorate}from"tslib";import{SourcePageController}from"../../../internal/source-page-controller.js";import{finiteInteger}from"../../../internal/numbers.js";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{html,nothing}from"lit";import{property,state,query}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{nextId}from"../../../internal/a11y.js";import{srOnly}from"../../../internal/a11y.js";import{styles}from"./test-results.styles.js";import{testResultDetailSlotName}from"./test-results-slots.js";import{testResultDetailSlotName as testResultDetailSlotName2}from"./test-results-slots.js";import{agentActionButtonStyles}from"../agent-action-button.styles.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{formatShortDuration}from"../../../internal/duration.js";import{AnnouncementSinkController}from"../../../internal/announcer.js";import{overallSemanticLabel,overallSemanticRole}from"../semantic-owner.js";import{LYRA_DEFAULT_accessibleLabelSeparator,LYRA_DEFAULT_statusSkipped,LYRA_DEFAULT_testResultsCollapseTest,LYRA_DEFAULT_testResultsCompleteAnnounce,LYRA_DEFAULT_testResultsExpandTest,LYRA_DEFAULT_testResultsFailed,LYRA_DEFAULT_testResultsFilterLabel,LYRA_DEFAULT_testResultsInputTooLarge,LYRA_DEFAULT_testResultsLabel,LYRA_DEFAULT_testResultsLimit,LYRA_DEFAULT_testResultsPassed,LYRA_DEFAULT_testResultsRunning,LYRA_DEFAULT_testResultsSkipped}from"../../../internal/default-strings/agent-tools.generated.js";import{LYRA_DEFAULT_collapse,LYRA_DEFAULT_copy,LYRA_DEFAULT_date,LYRA_DEFAULT_details,LYRA_DEFAULT_durationMilliseconds,LYRA_DEFAULT_durationSeconds,LYRA_DEFAULT_expand,LYRA_DEFAULT_loading,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_noData,LYRA_DEFAULT_noMatches,LYRA_DEFAULT_open,LYRA_DEFAULT_retry,LYRA_DEFAULT_search,LYRA_DEFAULT_select,LYRA_DEFAULT_statusError,LYRA_DEFAULT_statusRunning,LYRA_DEFAULT_statusSuccess,LYRA_DEFAULT_tableLoadFailed}from"../../../internal/default-strings/shared.generated.js";function sourceField(value,name){if(!value||typeof value!="object")throw new TypeError("Invalid result");const descriptor=Object.getOwnPropertyDescriptor(value,name);if(descriptor&&!("value"in descriptor))throw new TypeError("Invalid result field");return descriptor?.value}function checkRowText(suiteId,suiteName,test){if(suiteId.length+suiteName.length+test.id.length+test.name.length+(test.message?.length??0)>65536)throw new RangeError("Result text limit")}const STATUSES=["passed","failed","skipped","running"],MAX_RENDERED_TESTS=1e3;function normalizeTestStatus(value){switch(value){case"passed":case"failed":case"skipped":case"running":return value;case"error":case"timedOut":case"broken":return"failed";default:return"skipped"}}const STATUS_COUNT_KEY={passed:"testResultsPassed",failed:"testResultsFailed",skipped:"testResultsSkipped",running:"testResultsRunning"},STATUS_LABEL_KEY={passed:"statusSuccess",failed:"statusError",skipped:"statusSkipped",running:"statusRunning"},STATUS_GLYPH={passed:"✓",failed:"×",skipped:"–"};class LyraTestResults extends LyraElement{constructor(){super(...arguments),this.suites=[],this.sourceEpoch=0,this.sourceSyncing=!1,this.sourceExpanded=new Map,this.sourceVersion=0,this.sourcePages=new SourcePageController(this,{normalizeRecord:(record,isCurrent)=>this.normalizeSourceRecord(record,isCurrent),normalizeSummary:value=>{const counts=Object.fromEntries(["total",...STATUSES].map(key=>{const count=sourceField(value,key);if(typeof count!="number"||!Number.isSafeInteger(count)||count<0)throw new TypeError("Invalid summary");return[key,count]})),sum=STATUSES.reduce((total,status)=>total+counts[status],0);if(!Number.isSafeInteger(sum)||sum!==counts.total)throw new TypeError("Inconsistent summary");return Object.freeze(counts)},validateMetadata:(result,query2)=>{const summary=result.summary;if(result.total!==(query2.statuses.length?query2.statuses.reduce((sum,status)=>sum+summary[status],0):summary.total))throw new TypeError("Inconsistent total");const counts={passed:0,failed:0,skipped:0,running:0};for(const row of result.rows){const status=row.value.test.status;if(query2.statuses.length&&!query2.statuses.includes(status))throw new TypeError("Unexpected status");if(++counts[status]>summary[status])throw new TypeError("Inconsistent status count")}},onChange:()=>{this.sourceVersion++}}),this.sourcePage=0,this.sourcePageSize=100,this.statusFilter=[],this.runId=null,this.runState="idle",this.withoutAutoExpandFailures=!1,this.manualExpanded=new Map,this.legacyGeneration=0,this.legacyNeedsNormalization=!1,this.legacyIntentScheduled=!1,this.legacyPending=!1,this.legacyError=!1,this.legacyDone=Promise.resolve(),this.legacyRows=[],this.normalizedSuitesCache=[],this.projectedSuitesCache=[],this.completeStatusCounts={passed:0,failed:0,skipped:0,running:0},this.detailSlotNames=new Set,this.detailSlotsDirty=!0,this.projectionTruncated=!1,this.announcements=new AnnouncementSinkController(this,{eager:["polite"]}),this.limitAnnouncementInitialized=!1,this.statusAnnouncementInitialized=!1,this.previousStatusAnnouncement="",this.previouslyTruncated=!1,this.idPrefix=nextId("test-results")}static{this.defaultStrings={...super.defaultStrings,accessibleLabelSeparator:LYRA_DEFAULT_accessibleLabelSeparator,collapse:LYRA_DEFAULT_collapse,copy:LYRA_DEFAULT_copy,date:LYRA_DEFAULT_date,details:LYRA_DEFAULT_details,durationMilliseconds:LYRA_DEFAULT_durationMilliseconds,durationSeconds:LYRA_DEFAULT_durationSeconds,expand:LYRA_DEFAULT_expand,loading:LYRA_DEFAULT_loading,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,noData:LYRA_DEFAULT_noData,noMatches:LYRA_DEFAULT_noMatches,open:LYRA_DEFAULT_open,retry:LYRA_DEFAULT_retry,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select,statusError:LYRA_DEFAULT_statusError,statusRunning:LYRA_DEFAULT_statusRunning,statusSkipped:LYRA_DEFAULT_statusSkipped,statusSuccess:LYRA_DEFAULT_statusSuccess,tableLoadFailed:LYRA_DEFAULT_tableLoadFailed,testResultsCollapseTest:LYRA_DEFAULT_testResultsCollapseTest,testResultsCompleteAnnounce:LYRA_DEFAULT_testResultsCompleteAnnounce,testResultsExpandTest:LYRA_DEFAULT_testResultsExpandTest,testResultsFailed:LYRA_DEFAULT_testResultsFailed,testResultsFilterLabel:LYRA_DEFAULT_testResultsFilterLabel,testResultsInputTooLarge:LYRA_DEFAULT_testResultsInputTooLarge,testResultsLabel:LYRA_DEFAULT_testResultsLabel,testResultsLimit:LYRA_DEFAULT_testResultsLimit,testResultsPassed:LYRA_DEFAULT_testResultsPassed,testResultsRunning:LYRA_DEFAULT_testResultsRunning,testResultsSkipped:LYRA_DEFAULT_testResultsSkipped}}static{this.collectionSupport=collectionSupport}static{this.ownedCollectionProperties=Object.freeze(["suites","statusFilter"])}static{this.identityCollectionProperties=Object.freeze(["suites"])}static{this.styles=[LyraElement.styles,styles,srOnly,agentActionButtonStyles]}static{this.immutableEventDetails=Object.freeze(["lr-filter-change"])}get dataSource(){return this._dataSource}set dataSource(value){const old=this._dataSource;this._dataSource=value,this.sourceEpoch++,this.pendingCompletionRun=void 0,this.requestUpdate("dataSource",old)}get sourceTotal(){return this.sourceMode?this.sourcePages.state.result?.total??null:null}get sourceMode(){return this.dataSource!==void 0}normalizeSourceRecord(record,isCurrent){const field=(input,key)=>{if(!isCurrent())throw new Error("Obsolete source result");const value=sourceField(input,key);if(!isCurrent())throw new Error("Obsolete source result");return value},text=value=>{if(typeof value!="string")throw new TypeError("Invalid text");return value},suiteId=text(field(record.value,"suiteId")),suiteName=text(field(record.value,"suiteName")),raw=field(record.value,"test"),id=text(field(raw,"id")),name=text(field(raw,"name")),messageValue=field(raw,"message"),duration=field(raw,"durationMs"),test=Object.freeze({id,name,status:normalizeTestStatus(field(raw,"status")),...messageValue===void 0?{}:{message:text(messageValue)},...typeof duration=="number"?{durationMs:duration}:{}});if(checkRowText(suiteId,suiteName,test),!suiteId.trim()||!id.trim()||record.key!==this.testKey(suiteId,id))throw new TypeError("Invalid result identity");return{key:record.key,order:record.order,value:Object.freeze({suiteId,suiteName,test})}}syncSource(){if(!(!this.sourcePages||this.sourceSyncing)){this.sourceSyncing=!0;try{if(!this.sourceMode){this.sourceInputs&&this.sourcePages.bind(void 0),this.sourceInputs=void 0,this.sourceSize=void 0,this.sourceFilter=void 0;return}const source=this.dataSource,statuses=[...new Set(this.statusFilter)];if(statuses.some(status=>!STATUSES.includes(status)))throw new TypeError("Invalid filter");const filter=JSON.stringify(statuses),size=finiteInteger(this.sourcePageSize,100,1,500);let page=finiteInteger(this.sourcePage,0,0,Math.floor(Number.MAX_SAFE_INTEGER/size));(this.sourceSize!==void 0&&this.sourceSize!==size||this.sourceFilter!==void 0&&this.sourceFilter!==filter)&&(page=0,this.sourcePage=0),this.sourceSize=size,this.sourceFilter=filter;const epoch=this.sourceEpoch,revision=source.revision;if(this.dataSource!==source||this.sourceEpoch!==epoch)return;const inputs=[source,revision,this.sourceEpoch,this.effectiveLocale,size,filter,page];if(this.sourceInputs&&inputs.every((value,index)=>value===this.sourceInputs[index]))return;this.cancelLegacy(),this.sourceInputs=inputs,this.sourceExpanded.clear(),this.sourcePages.bind({source,revision,epoch:this.sourceEpoch,locale:this.effectiveLocale}),this.sourcePages.request(Object.freeze({statuses:Object.freeze(statuses)}),page,size)}catch{this.sourcePages.bind(void 0),this.sourceInputs=void 0,this.sourceExpanded.clear()}finally{this.sourceSyncing=!1}}}requestUpdate(...args){args[0]==="suites"&&this.legacyGeneration!==void 0&&(this.cancelLegacy(),this.legacyNeedsNormalization=!0,this.legacyIntentScheduled||(this.legacyIntentScheduled=!0,queueMicrotask(()=>{this.legacyIntentScheduled=!1,this.legacyNeedsNormalization&&!this.sourceMode&&this.isConnected&&this.requestUpdate("legacyNeedsNormalization")}))),(args[0]==="runState"&&this.runState!=="complete"||args[0]==="runId")&&(this.pendingCompletionRun=void 0),args[0]===void 0&&(this.sourceEpoch=(this.sourceEpoch??0)+1),(args[0]===void 0||["dataSource","sourcePage","sourcePageSize","statusFilter"].includes(String(args[0])))&&this.syncSource(),super.requestUpdate(...args)}connectedCallback(){super.connectedCallback(),this.hasUpdated&&!this.sourceMode&&this.rebuildNormalizedSuites(),this.limitAnnouncementInitialized=this.hasUpdated,this.previouslyTruncated=this.projectionTruncated}adoptedCallback(){this.cancelLegacy(),this.pendingCompletionRun=void 0,this.statusAnnouncementInitialized=!1,this.previousStatusAnnouncement="",super.adoptedCallback(),this.announcements.adopted(),this.sourcePages.adopted(),this.sourceInputs=void 0,this.syncSource(),!this.sourceMode&&this.isConnected&&this.rebuildNormalizedSuites()}willUpdate(changed){if(super.willUpdate(changed),this.syncSource(),this.sourceMode&&this.sourcePages.state.result&&this.sourcePage!==this.sourcePages.state.page&&(this.sourceSyncing=!0,this.sourcePage=this.sourcePages.state.page,this.sourceSyncing=!1,this.sourceInputs=this.sourceInputs?[...this.sourceInputs.slice(0,-1),this.sourcePage]:void 0),!this.sourceMode&&(changed.has("suites")||changed.has("dataSource")||this.legacyNeedsNormalization)&&this.rebuildNormalizedSuites(),!this.sourceMode&&(changed.has("suites")||changed.has("statusFilter"))&&this.rebuildProjection(),this.detailSlotsDirty&&(this.rebuildDetailSlotNames(),this.detailSlotsDirty=!1),changed.has("runState")||changed.has("runId")){const previousState=changed.has("runState")?changed.get("runState"):this.runState,previousRunId=changed.has("runId")?changed.get("runId"):this.runId;previousState==="running"&&this.runState==="complete"&&this.runId!==null&&previousRunId===this.runId&&(this.pendingCompletionRun={id:this.runId,source:this.dataSource})}}cancelLegacy(){this.legacyGeneration++,this.legacyTimer!==void 0&&this.ownerDocument.defaultView?.clearTimeout(this.legacyTimer),this.legacyTimer=void 0,this.settleLegacy?.(),this.settleLegacy=void 0,this.legacyPending=!1}rebuildNormalizedSuites(){this.legacyNeedsNormalization=!1,this.cancelLegacy();const generation=this.legacyGeneration,owner=this.ownerDocument,current=()=>generation===this.legacyGeneration&&this.ownerDocument===owner&&!this.sourceMode&&(!owner||this.isConnected),input=this.suites;this.legacyPending=!0,this.legacyError=!1,this.normalizedSuitesCache=[],this.projectedSuitesCache=[],this.legacyRows=[],this.legacyDone=new Promise(resolve=>{this.settleLegacy=resolve});const rows=[],suites=[],keys=new Set,suiteIds=new Set,counts={passed:0,failed:0,skipped:0,running:0},host=this;function*normalize(){for(const suite of Array.isArray(input)?input:[]){if(yield,!current())return;if(!suite)continue;const suiteId=suite.id;if(!current())return;if(typeof suiteId!="string")continue;if(suiteId.length>65536)throw new RangeError("Result text limit");if(!suiteId.trim()||suiteIds.has(suiteId))continue;const rawSuiteName=suite.name;if(!current())return;const suiteName=typeof rawSuiteName=="string"?rawSuiteName:"";if(suiteId.length+suiteName.length>65536)throw new RangeError("Result text limit");suiteIds.add(suiteId);const testIds=new Set,tests=[],inputTests=suite.tests;if(!current())return;for(const test of Array.isArray(inputTests)?inputTests:[]){if(yield,!current())return;if(!test)continue;const id=test.id;if(!current())return;if(typeof id!="string")continue;if(id.length>65536)throw new RangeError("Result text limit");if(!id.trim()||testIds.has(id))continue;const status=normalizeTestStatus(test.status);if(!current())return;const name=test.name;if(!current())return;const message=test.message;if(!current())return;const durationMs=test.durationMs;if(!current())return;const normalized={id,name:typeof name=="string"?name:"",status,...typeof message=="string"?{message}:{},...typeof durationMs=="number"?{durationMs}:{}};checkRowText(suiteId,suiteName,normalized),testIds.add(id),tests.push(normalized);const key=host.testKey(suiteId,id);keys.add(key),counts[status]++,rows.push({suiteId,suiteName,test:normalized,key,order:rows.length})}tests.length&&suites.push({id:suiteId,name:suiteName,tests})}}const iterator=normalize(),step=()=>{if(current())try{for(let position=0;position<500;position++){const next=iterator.next();if(!current())return;if(next.done){this.normalizedSuitesCache=suites,this.legacyRows=rows,this.completeStatusCounts=counts,this.legacyPending=!1;for(const key of this.manualExpanded.keys())keys.has(key)||this.manualExpanded.delete(key);this.rebuildProjection(),this.settleLegacy?.(),this.settleLegacy=void 0,this.requestUpdate("legacyPending");return}}this.legacyTimer=owner?.defaultView?.setTimeout(step,0)}catch{if(!current())return;this.legacyPending=!1,this.legacyError=!0,this.settleLegacy?.(),this.settleLegacy=void 0,this.requestUpdate("legacyError")}};step()}async getUpdateComplete(){let result=await super.getUpdateComplete();for(;!this.sourceMode&&(this.legacyPending||this.legacyNeedsNormalization)&&this.isConnected;)await this.legacyDone,result=await super.getUpdateComplete();return result}disconnectedCallback(){this.cancelLegacy(),this.pendingCompletionRun=void 0,this.statusAnnouncementInitialized=!1,this.previousStatusAnnouncement="",this.sourceInputs=void 0,this.sourceExpanded.clear(),super.disconnectedCallback()}rebuildProjection(){const statuses=new Set(this.statusFilter),eligible=row=>!statuses.size||statuses.has(row.test.status),chosen=new Map;for(const priority of[0,1,2])for(const row of this.legacyRows){if(chosen.size>=MAX_RENDERED_TESTS)break;eligible(row)&&(priority===2||(priority===0?this.manualExpanded.get(row.key)===!0:row.test.status==="failed"))&&chosen.set(row.key,row)}const selected=[...chosen.values()].sort((a,b)=>a.order-b.order),suites=[];for(const row of selected){let suite=suites[suites.length-1];(!suite||suite.id!==row.suiteId)&&(suite={id:row.suiteId,name:row.suiteName,tests:[]},suites.push(suite)),suite.tests.push(row.test)}this.projectedSuitesCache=suites;const total=STATUSES.reduce((sum,status)=>sum+(!statuses.size||statuses.has(status)?this.completeStatusCounts[status]:0),0);this.projectionTruncated=chosen.size<total}updated(changed){super.updated(changed);const status=this.sourceMode?this.sourcePages.state.pending?this.localize("loading"):this.sourcePages.state.result?"":this.localize("tableLoadFailed"):this.legacyError?this.localize("testResultsInputTooLarge"):this.legacyPending?this.localize("loading"):"";this.statusAnnouncementInitialized&&status&&status!==this.previousStatusAnnouncement&&this.announcements.announcePolite(status),this.statusAnnouncementInitialized=!0,this.previousStatusAnnouncement=status;const completion=this.pendingCompletionRun;completion&&(this.runState!=="complete"||completion.id!==this.runId||completion.source!==this.dataSource)&&(this.pendingCompletionRun=void 0);const counts=this.sourceMode?this.sourcePages.state.result?.summary:!this.legacyPending&&!this.legacyError?this.completeStatusCounts:void 0;if(completion&&this.pendingCompletionRun===completion&&counts){const owner=this.ownerDocument,epoch=this.sourceEpoch,generation=this.legacyGeneration,result=this.sourcePages.state.result,current=()=>this.pendingCompletionRun===completion&&this.isConnected&&this.ownerDocument===owner&&this.runState==="complete"&&this.runId===completion.id&&this.dataSource===completion.source&&this.sourceEpoch===epoch&&this.legacyGeneration===generation&&this.sourcePages.state.result===result,number=getNumberFormat(this.effectiveLocale);if(current()){const text=this.localize("testResultsCompleteAnnounce",void 0,{passed:number.format(counts.passed),failed:number.format(counts.failed),skipped:number.format(counts.skipped)});current()&&(this.pendingCompletionRun=void 0,this.liveRegion?.announce(text,{force:!0}))}}!this.sourceMode&&this.limitAnnouncementInitialized&&this.projectionTruncated&&!this.previouslyTruncated&&this.announcements.announcePolite(this.localize("testResultsLimit",void 0,{count:getNumberFormat(this.effectiveLocale).format(MAX_RENDERED_TESTS)})),this.limitAnnouncementInitialized=!0,this.previouslyTruncated=this.projectionTruncated}computeStatusCounts(){return this.completeStatusCounts}testKey(suiteId,testId){return JSON.stringify([suiteId,testId])}scopedDetailSlot(suiteId,testId){return testResultDetailSlotName(suiteId,testId)}rebuildDetailSlotNames(){this.detailSlotNames=new Set([...this.children??[]].map(child=>child.getAttribute("slot")).filter(name=>name!==null))}hasDetail(suiteId,testId){return this.detailSlotNames.has(this.scopedDetailSlot(suiteId,testId))}isExpanded(suiteId,test){const manual=(this.sourceMode?this.sourceExpanded:this.manualExpanded).get(this.testKey(suiteId,test.id));return manual!==void 0?manual:!this.withoutAutoExpandFailures&&test.status==="failed"}toggleFilter(status){const next=this.statusFilter.includes(status)?this.statusFilter.filter(s=>s!==status):[...this.statusFilter,status];this.statusFilter=next,this.emit("lr-filter-change",{statuses:next})}toggleExpanded(suiteId,test,current){if(!current())return;const expanded=!this.isExpanded(suiteId,test);if(this.emit("lr-toggle-request",{suiteId,testId:test.id,expanded},{cancelable:!0}).defaultPrevented||!current())return;const next=new Map(this.sourceMode?this.sourceExpanded:this.manualExpanded);next.set(this.testKey(suiteId,test.id),expanded),this.sourceMode?(this.sourceExpanded=next,this.sourceVersion++):this.manualExpanded=next,this.emit("lr-toggle",{suiteId,testId:test.id,expanded})}onDetailSlotChange(){this.detailSlotsDirty=!0,this.requestUpdate("detailSlotsDirty")}renderSummary(statusCounts){return html`
|
|
2
2
|
<div part="summary">
|
|
3
3
|
${STATUSES.map(status=>{const count=statusCounts[status],formattedCount=getNumberFormat(this.effectiveLocale).format(count);return html`<span part="count" data-status=${status}
|
|
4
4
|
>${this.localize(STATUS_COUNT_KEY[status],void 0,{count:formattedCount})}</span
|
|
@@ -18,7 +18,7 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
|
|
|
18
18
|
</button>
|
|
19
19
|
`})}
|
|
20
20
|
</div>
|
|
21
|
-
`}renderTest(suiteId,suiteName,test,suiteIndex,testIndex){const expanded=this.isExpanded(suiteId,test),scopedSlot=this.scopedDetailSlot(suiteId,test.id),canExpand=test.status==="failed"||this.hasDetail(suiteId,test.id),domKey=`${suiteIndex}-${testIndex}`,failureId=`${this.idPrefix}-${domKey}-failure`,statusId=`${this.idPrefix}-${domKey}-status`,toggleName=this.localize(expanded?"testResultsCollapseTest":"testResultsExpandTest",void 0,{name:[suiteName,test.name].join(this.localize("accessibleLabelSeparator"))});return html`
|
|
21
|
+
`}renderTest(suiteId,suiteName,test,suiteIndex,testIndex){const state2=this.sourcePages.state,generation=this.legacyGeneration,source=this.dataSource,owner=this.ownerDocument,current=()=>this.isConnected&&this.ownerDocument===owner&&this.dataSource===source&&(this.sourceMode?this.sourcePages.state===state2&&!!state2.result:generation===this.legacyGeneration&&!this.legacyPending&&!this.legacyError),expanded=this.isExpanded(suiteId,test),scopedSlot=this.scopedDetailSlot(suiteId,test.id),canExpand=test.status==="failed"||this.hasDetail(suiteId,test.id),domKey=`${suiteIndex}-${testIndex}`,failureId=`${this.idPrefix}-${domKey}-failure`,statusId=`${this.idPrefix}-${domKey}-status`,toggleName=this.localize(expanded?"testResultsCollapseTest":"testResultsExpandTest",void 0,{name:[suiteName,test.name].join(this.localize("accessibleLabelSeparator"))});return html`
|
|
22
22
|
<div part="test" role="listitem" data-status=${test.status}>
|
|
23
23
|
<span part="test-status" id=${statusId} data-status=${test.status}>
|
|
24
24
|
${test.status==="running"?html`<span aria-hidden="true"><lr-spinner></lr-spinner></span>`:html`<span aria-hidden="true">${STATUS_GLYPH[test.status]}</span>`}
|
|
@@ -28,7 +28,7 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
|
|
|
28
28
|
part="test-name"
|
|
29
29
|
type="button"
|
|
30
30
|
aria-describedby=${statusId}
|
|
31
|
-
@click=${()=>this.emit("lr-test-select",{suiteId,testId:test.id})}
|
|
31
|
+
@click=${()=>{current()&&this.emit("lr-test-select",{suiteId,testId:test.id})}}
|
|
32
32
|
>
|
|
33
33
|
${test.name}
|
|
34
34
|
</button>
|
|
@@ -42,7 +42,7 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
|
|
|
42
42
|
aria-expanded=${expanded?"true":"false"}
|
|
43
43
|
aria-controls=${failureId}
|
|
44
44
|
aria-label=${toggleName}
|
|
45
|
-
@click=${()=>this.toggleExpanded(suiteId,test)}
|
|
45
|
+
@click=${()=>this.toggleExpanded(suiteId,test,current)}
|
|
46
46
|
>
|
|
47
47
|
${expanded?this.localize("collapse"):this.localize("expand")}
|
|
48
48
|
</button>`:nothing}
|
|
@@ -58,7 +58,16 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
|
|
|
58
58
|
>${repeat(visibleTests,({test})=>test.id,({test,testIndex})=>this.renderTest(suite.id,suite.name,test,suiteIndex,testIndex))}</div
|
|
59
59
|
>
|
|
60
60
|
</div>
|
|
61
|
-
`}
|
|
61
|
+
`}renderSource(){const state2=this.sourcePages.state,source=this.dataSource,result=state2.result,failed=!state2.pending&&!result,rows=result?.rows??[],label=overallSemanticLabel(this,this.localize("testResultsLabel"));return html`<div part="base" role=${overallSemanticRole(this,"group")??nothing} aria-label=${label??nothing} aria-busy=${state2.pending?"true":"false"}>
|
|
62
|
+
${result?this.renderSummary(result.summary):html`<p part="source-status">${this.localize(failed?"tableLoadFailed":"loading")}</p>`}
|
|
63
|
+
${failed?html`<button part="source-retry" type="button" @click=${()=>{this.isConnected&&this.dataSource===source&&this.sourcePages.state===state2&&(this.sourceInputs=void 0,this.syncSource(),this.sourceVersion++)}}>${this.localize("retry")}</button>`:nothing}
|
|
64
|
+
${rows.map((record,index)=>html`${index===0||rows[index-1].value.suiteId!==record.value.suiteId?html`<div part="suite-header">${record.value.suiteName}</div>`:nothing}
|
|
65
|
+
<div role="list">${this.renderTest(record.value.suiteId,record.value.suiteName,record.value.test,index,0)}</div>`)}
|
|
66
|
+
${result&&!rows.length?html`<lr-empty part="empty" heading=${this.localize(result.summary.total?"noMatches":"noData")}></lr-empty>`:nothing}
|
|
67
|
+
<lr-pagination part="source-pagination" format="compact" with-edges .page=${finiteInteger(this.sourcePage,0,0,Number.MAX_SAFE_INTEGER-1)+1}
|
|
68
|
+
.pageSize=${finiteInteger(this.sourcePageSize,100,1,500)} .total=${this.sourceTotal??-1} .disabled=${!result}
|
|
69
|
+
.strings=${this.strings} @lr-page-change=${event=>{event.stopPropagation(),this.sourcePages.state===state2&&result&&(this.sourcePage=event.detail.page-1)}} @lr-before-page-change=${event=>event.stopPropagation()} @lr-activate=${event=>event.stopPropagation()}></lr-pagination>
|
|
70
|
+
</div><lr-live-region mode="polite"></lr-live-region>`}render(){if(this.sourceMode)return this.renderSource();if(this.legacyPending||this.legacyError)return html`<div part=${this.legacyError?"input-error":"source-status"} aria-busy=${this.legacyPending?"true":"false"}>${this.localize(this.legacyError?"testResultsInputTooLarge":"loading")}</div><lr-live-region mode="polite"></lr-live-region>`;const ariaLabel=overallSemanticLabel(this,this.localize("testResultsLabel")),visibleSuites=this.projectedSuitesCache.filter(suite=>suite.tests.some(test=>this.statusFilter.length===0||this.statusFilter.includes(test.status)));return html`
|
|
62
71
|
${this.normalizedSuitesCache.length===0?html`<lr-empty part="empty" heading=${this.localize("noData")}></lr-empty>`:html`
|
|
63
72
|
<div
|
|
64
73
|
part="base"
|
|
@@ -71,4 +80,4 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
|
|
|
71
80
|
</div>
|
|
72
81
|
`}
|
|
73
82
|
<lr-live-region mode="polite"></lr-live-region>
|
|
74
|
-
`}}__decorate([property({attribute:!1})],LyraTestResults.prototype,"suites",void 0),__decorate([property({attribute:!1})],LyraTestResults.prototype,"statusFilter",void 0),__decorate([property({attribute:"run-id"})],LyraTestResults.prototype,"runId",void 0),__decorate([property({attribute:"run-state",reflect:!0})],LyraTestResults.prototype,"runState",void 0),__decorate([property({type:Boolean,attribute:"without-auto-expand-failures"})],LyraTestResults.prototype,"withoutAutoExpandFailures",void 0),__decorate([state()],LyraTestResults.prototype,"manualExpanded",void 0),__decorate([query("lr-live-region")],LyraTestResults.prototype,"liveRegion",void 0);export{LyraTestResults,testResultDetailSlotName2 as testResultDetailSlotName};
|
|
83
|
+
`}}__decorate([property({attribute:!1})],LyraTestResults.prototype,"suites",void 0),__decorate([state()],LyraTestResults.prototype,"sourceVersion",void 0),__decorate([property({attribute:!1})],LyraTestResults.prototype,"dataSource",null),__decorate([property({type:Number,attribute:"source-page"})],LyraTestResults.prototype,"sourcePage",void 0),__decorate([property({type:Number,attribute:"source-page-size"})],LyraTestResults.prototype,"sourcePageSize",void 0),__decorate([property({attribute:!1})],LyraTestResults.prototype,"statusFilter",void 0),__decorate([property({attribute:"run-id"})],LyraTestResults.prototype,"runId",void 0),__decorate([property({attribute:"run-state",reflect:!0})],LyraTestResults.prototype,"runState",void 0),__decorate([property({type:Boolean,attribute:"without-auto-expand-failures"})],LyraTestResults.prototype,"withoutAutoExpandFailures",void 0),__decorate([state()],LyraTestResults.prototype,"manualExpanded",void 0),__decorate([query("lr-live-region")],LyraTestResults.prototype,"liveRegion",void 0);export{LyraTestResults,testResultDetailSlotName2 as testResultDetailSlotName};
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
+
import'../../data/pagination/pagination.js';
|
|
1
2
|
/** @deprecated Import @aceshooting/lyra-ui/components/lr-test-results.js to register this component. */
|
|
2
3
|
export*from'./test-results.class.js';import'../../overlays/empty/empty.js';import'../../overlays/spinner/spinner.js';import'../../utility/live-region/live-region.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export*from"./test-results.class.js";import"../../overlays/empty/empty.js";import"../../overlays/spinner/spinner.js";import"../../utility/live-region/live-region.js";import{LyraTestResults}from"./test-results.class.js";import{defineElement}from"../../../internal/prefix.js";defineElement("test-results",LyraTestResults);
|
|
1
|
+
import"../../data/pagination/pagination.js";export*from"./test-results.class.js";import"../../overlays/empty/empty.js";import"../../overlays/spinner/spinner.js";import"../../utility/live-region/live-region.js";import{LyraTestResults}from"./test-results.class.js";import{defineElement}from"../../../internal/prefix.js";defineElement("test-results",LyraTestResults);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{focusRing}from"../../../internal/interactive-control.styles.js";import{css}from"lit";const styles=css` :host { display: block; } [part='summary'] { display: flex; flex-wrap: wrap; gap: var(--lr-space-s); padding-block-end: var(--lr-space-s); } [part='count'] { font-size: var(--lr-font-size-sm); font-weight: var(--lr-font-weight-medium); } [part='count'][data-status='passed'] { color: var(--lr-test-results-passed-color, var(--lr-color-success)); } [part='count'][data-status='failed'] { color: var(--lr-test-results-failed-color, var(--lr-color-danger)); } [part='count'][data-status='skipped'] { color: var(--lr-test-results-skipped-color, var(--lr-color-text-quiet)); } [part='count'][data-status='running'] { color: var(--lr-test-results-running-color, var(--lr-color-brand)); } [part='filter'] { display: flex; flex-wrap: wrap; gap: var(--lr-space-xs); padding-block-end: var(--lr-space-s); } [part='filter-toggle'] { font-size: var(--lr-font-size-xs); --_lr-agent-action-hover-base: var(--lr-color-brand-quiet); --_lr-agent-action-selected-fill: var(--lr-test-results-filter-active-bg, var(--lr-color-brand-quiet)); --_lr-agent-action-selected-border: var(--lr-test-results-filter-active-border, var(--lr-color-brand)); --_lr-agent-action-selected-color: var(--lr-test-results-filter-active-color, var(--lr-color-brand)); } [part='test-name']:focus-visible { ${focusRing} } [part='test-name']:hover { background: var(--lr-color-brand-quiet); } [part='test-name']:active { background: color-mix(in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active)); } [part='suite'] + [part='suite'] { margin-block-start: var(--lr-space-s); } [part='suite-header'] { font-weight: var(--lr-font-weight-semibold); padding-block: var(--lr-space-xs); overflow-wrap: anywhere; } [part='test'] { display: flex; flex-wrap: wrap; align-items: baseline; column-gap: var(--lr-space-xs); border-block-start: var(--lr-border-width-thin) solid var(--lr-color-border-subtle); padding-block: var(--lr-space-xs); } [part='test-status'] { display: inline-flex; align-items: center; gap: var(--lr-space-2xs); flex: 0 0 auto; font-size: var(--lr-font-size-xs); } [part='test-status'] lr-spinner { --lr-spinner-size: var(--lr-test-results-spinner-size, var(--lr-size-1em)); } [part='test-status'][data-status='passed'] { color: var(--lr-test-results-passed-color, var(--lr-color-success)); } [part='test-status'][data-status='failed'] { color: var(--lr-test-results-failed-color, var(--lr-color-danger)); } [part='test-status'][data-status='skipped'] { color: var(--lr-test-results-skipped-color, var(--lr-color-text-quiet)); } [part='test-status'][data-status='running'] { color: var(--lr-test-results-running-color, var(--lr-color-brand)); } [part='test-name'] { flex: 1 1 auto; min-inline-size: 0; max-inline-size: 100%; overflow-wrap: anywhere; background: none; border: none; font: inherit; color: var(--lr-color-text); cursor: pointer; text-align: start; padding: 0; transition: background-color var(--lr-transition-fast), color var(--lr-transition-fast); } [part='test-duration'] { flex: 0 0 auto; color: var(--lr-color-text-quiet); font-size: var(--lr-font-size-xs); overflow-wrap: anywhere; } [part='test-expand-toggle'] { flex: 0 0 auto; font-size: var(--lr-font-size-xs); --_lr-agent-action-hover-base: var(--lr-color-brand-quiet); --_lr-agent-action-padding-inline: var(--lr-space-xs); } [part='failure'] { flex-basis: 100%; margin-block-start: var(--lr-space-xs); } [part='failure'][hidden] { display: none; } [part='failure-message'] { unicode-bidi: plaintext; font-family: var(--lr-font-mono); font-size: var(--lr-font-size-sm); white-space: pre-wrap; overflow-wrap: anywhere; color: var(--lr-test-results-failed-color, var(--lr-color-danger)); } [part='limit'] { margin-block: var(--lr-space-s) 0; color: var(--lr-color-text-quiet); font-size: var(--lr-font-size-sm); } `;export{styles};
|
|
1
|
+
import{focusRing}from"../../../internal/interactive-control.styles.js";import{css}from"lit";const styles=css` :host { display: block; } [part='summary'] { display: flex; flex-wrap: wrap; gap: var(--lr-space-s); padding-block-end: var(--lr-space-s); } [part='count'] { font-size: var(--lr-font-size-sm); font-weight: var(--lr-font-weight-medium); } [part='count'][data-status='passed'] { color: var(--lr-test-results-passed-color, var(--lr-color-success)); } [part='count'][data-status='failed'] { color: var(--lr-test-results-failed-color, var(--lr-color-danger)); } [part='count'][data-status='skipped'] { color: var(--lr-test-results-skipped-color, var(--lr-color-text-quiet)); } [part='count'][data-status='running'] { color: var(--lr-test-results-running-color, var(--lr-color-brand)); } [part='filter'] { display: flex; flex-wrap: wrap; gap: var(--lr-space-xs); padding-block-end: var(--lr-space-s); } [part='filter-toggle'] { font-size: var(--lr-font-size-xs); --_lr-agent-action-hover-base: var(--lr-color-brand-quiet); --_lr-agent-action-selected-fill: var(--lr-test-results-filter-active-bg, var(--lr-color-brand-quiet)); --_lr-agent-action-selected-border: var(--lr-test-results-filter-active-border, var(--lr-color-brand)); --_lr-agent-action-selected-color: var(--lr-test-results-filter-active-color, var(--lr-color-brand)); } [part='test-name']:focus-visible { ${focusRing} } [part='test-name']:hover { background: var(--lr-color-brand-quiet); } [part='test-name']:active { background: color-mix(in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active)); } [part='suite'] + [part='suite'] { margin-block-start: var(--lr-space-s); } [part='suite-header'] { font-weight: var(--lr-font-weight-semibold); padding-block: var(--lr-space-xs); overflow-wrap: anywhere; } [part='test'] { display: flex; flex-wrap: wrap; align-items: baseline; column-gap: var(--lr-space-xs); border-block-start: var(--lr-border-width-thin) solid var(--lr-color-border-subtle); padding-block: var(--lr-space-xs); } [part='test-status'] { display: inline-flex; align-items: center; gap: var(--lr-space-2xs); flex: 0 0 auto; font-size: var(--lr-font-size-xs); } [part='test-status'] lr-spinner { --lr-spinner-size: var(--lr-test-results-spinner-size, var(--lr-size-1em)); } [part='test-status'][data-status='passed'] { color: var(--lr-test-results-passed-color, var(--lr-color-success)); } [part='test-status'][data-status='failed'] { color: var(--lr-test-results-failed-color, var(--lr-color-danger)); } [part='test-status'][data-status='skipped'] { color: var(--lr-test-results-skipped-color, var(--lr-color-text-quiet)); } [part='test-status'][data-status='running'] { color: var(--lr-test-results-running-color, var(--lr-color-brand)); } [part='test-name'] { flex: 1 1 auto; min-inline-size: 0; max-inline-size: 100%; overflow-wrap: anywhere; background: none; border: none; font: inherit; color: var(--lr-color-text); cursor: pointer; text-align: start; padding: 0; transition: background-color var(--lr-transition-fast), color var(--lr-transition-fast); } [part='test-duration'] { flex: 0 0 auto; color: var(--lr-color-text-quiet); font-size: var(--lr-font-size-xs); overflow-wrap: anywhere; } [part='test-expand-toggle'] { flex: 0 0 auto; font-size: var(--lr-font-size-xs); --_lr-agent-action-hover-base: var(--lr-color-brand-quiet); --_lr-agent-action-padding-inline: var(--lr-space-xs); } [part='failure'] { flex-basis: 100%; margin-block-start: var(--lr-space-xs); } [part='failure'][hidden] { display: none; } [part='failure-message'] { unicode-bidi: plaintext; font-family: var(--lr-font-mono); font-size: var(--lr-font-size-sm); white-space: pre-wrap; overflow-wrap: anywhere; color: var(--lr-test-results-failed-color, var(--lr-color-danger)); } [part='source-status'], [part='input-error'] { overflow-wrap: anywhere; color: var(--lr-color-text-quiet); } [part='source-retry'] { min-inline-size: var(--lr-icon-button-size); min-block-size: var(--lr-icon-button-size); border: var(--lr-border-width-thin) solid var(--lr-color-border); border-radius: var(--lr-radius); background: var(--lr-color-surface); color: var(--lr-color-text); font: inherit; padding: var(--lr-space-xs) var(--lr-space-s); cursor: pointer; transition: var(--lr-transition-interactive); } [part='source-retry']:hover { background: color-mix(in oklab, var(--lr-color-surface), var(--lr-color-mix-partner) var(--lr-color-mix-hover)); } [part='source-retry']:active { background: color-mix(in oklab, var(--lr-color-surface), var(--lr-color-mix-partner) var(--lr-color-mix-active)); } [part='source-retry']:focus-visible { ${focusRing} } [part='source-pagination'] { display: block; margin-block-start: var(--lr-space-m); } [part='limit'] { margin-block: var(--lr-space-s) 0; color: var(--lr-color-text-quiet); font-size: var(--lr-font-size-sm); } `;export{styles};
|
|
@@ -62,7 +62,7 @@ export type ToolTimelineApprovalPending=ApprovalAction|null;export interface Lyr
|
|
|
62
62
|
* every timed entry, keeping its position relative to any other untimed entries stable (input
|
|
63
63
|
* order is preserved among ties) — a still-pending call with no timestamp yet naturally lands at
|
|
64
64
|
* the end without needing to be pre-sorted by the host.
|
|
65
|
-
*
|
|
65
|
+
* The newest 10,000 source entries are admitted; rendering keeps the newest 500 unique entries before sorting, reserving open and reviewed entries. Duplicate `(sourceKey,id)`
|
|
66
66
|
* identities use a deterministic first-wins policy. Entries already open or under approval
|
|
67
67
|
* review are reserved inside that budget when new history would otherwise push them past the
|
|
68
68
|
* ceiling, and a localized notice exposes truncation instead of silently hiding it. Foreign
|
|
@@ -162,15 +162,18 @@ export type ToolTimelineApprovalPending=ApprovalAction|null;export interface Lyr
|
|
|
162
162
|
export declare class LyraToolTimeline extends LyraElement<LyraToolTimelineEventMap>{private emitToolApprovalDecideRequest;protected static collectionSupport:import("../../../internal/lyra-element.js").LyraCollectionSupport;protected static readonly ownedCollectionProperties:readonly string[];
|
|
163
163
|
/** Provider tool payloads can be opaque objects. Preserve row identity at the array boundary,
|
|
164
164
|
* then admit only one descriptor-safe canonical record for every rendering path. */
|
|
165
|
-
protected static readonly identityCollectionProperties:readonly string[];static styles:import("lit").CSSResultGroup[];
|
|
166
|
-
/** The
|
|
165
|
+
protected static readonly identityCollectionProperties:readonly string[];protected static readonly appendOrderedCollectionProperties:readonly string[];static styles:import("lit").CSSResultGroup[];
|
|
166
|
+
/** The newest 10,000 calls are retained by identity, avoiding the shared 50,000-value deep-copy
|
|
167
|
+
* budget for opaque arguments/results. The newest 500 unique calls render, with open/review
|
|
168
|
+
* reservations. Replace the collection to publish source-record changes.
|
|
169
|
+
* The calls to render, in any order — see the class doc's ordering note. Entries with empty
|
|
167
170
|
* invocation ids are omitted; duplicate `(sourceKey, id)` identities normalize first-wins. */
|
|
168
171
|
entries:readonly ToolTimelineEntry[];
|
|
169
172
|
/** Forwarded to the shared approval dialog's own `readonly` — withholds editing an entry's
|
|
170
173
|
* arguments before approving it. */
|
|
171
174
|
approvalReadonly:boolean;
|
|
172
175
|
/** Overrides the default `hour:minute` rendering of every entry's `startedAt`. */
|
|
173
|
-
formatTimestamp?:(date:Date)=>string;private reviewingEntryKey?;private approvalPending;private openedEntryIds;private projectedEntriesCache;private sortedEntriesCache;private projectionTruncated;private redactionCache;private readonly announcements;private limitAnnouncementInitialized;private previouslyTruncated;connectedCallback():void;adoptedCallback():void;
|
|
176
|
+
formatTimestamp?:(date:Date)=>string;private reviewingEntryKey?;private approvalPending;private openedEntryIds;private projectedEntriesCache;private sortedEntriesCache;private projectionTruncated;private canonicalSource?;private readonly canonicalModels;private canonicalByKey;private inputPreviouslyTruncated;private canonicalEntries;private inputLimitText;private redactionCache;private readonly announcements;private limitAnnouncementInitialized;private previouslyTruncated;connectedCallback():void;adoptedCallback():void;
|
|
174
177
|
/** The approval/denial action held after a listener vetoes `lr-tool-approval-decide-request`, or `null`
|
|
175
178
|
* otherwise. Read-only: call `finalizePendingApproval()` after persisting the controlled entry,
|
|
176
179
|
* or `revertPendingApproval()` to release the same dialog and draft for another attempt. */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{formatTimeOfDay,getNumberFormat}from"../../../internal/intl-cache.js";import{finiteCount}from"../../../internal/numbers.js";import{eyeOffIcon}from"../../../internal/icons.js";import{srOnly}from"../../../internal/a11y.js";import{styles}from"./tool-timeline.styles.js";import{overallSemanticLabel}from"../semantic-owner.js";import{AnnouncementSinkController}from"../../../internal/announcer.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import{TOOL_CALL_STATUSES}from"../tool-status.js";import{EMPTY_REDACTION_PATHS,projectedRedactionFields,redactToolDetail}from"../tool-redaction.js";import{LYRA_DEFAULT_confirmApproved,LYRA_DEFAULT_confirmDenied,LYRA_DEFAULT_toolTimelineDetailsFor,LYRA_DEFAULT_toolTimelineLimit}from"../../../internal/default-strings/agent-tools.generated.js";import{LYRA_DEFAULT_envListValueHidden,LYRA_DEFAULT_noData,LYRA_DEFAULT_retry}from"../../../internal/default-strings/shared.generated.js";let resultViewRegistration,approvalDialogRegistration;const MAX_RENDERED_ENTRIES=500,TOOL_STATUSES=new Set(TOOL_CALL_STATUSES);function descriptorValue(value,property2){return getOwnDataDescriptor(value,property2)}function projectToolTimelineEntry(value){try{if(value===null||typeof value!="object"||Array.isArray(value))return;const idDescriptor=descriptorValue(value,"id"),nameDescriptor=descriptorValue(value,"name"),displayNameDescriptor=descriptorValue(value,"displayName"),argsDescriptor=descriptorValue(value,"args"),statusDescriptor=descriptorValue(value,"status"),resultDescriptor=descriptorValue(value,"result"),errorDescriptor=descriptorValue(value,"error"),sourceKeyDescriptor=descriptorValue(value,"sourceKey"),iconDescriptor=descriptorValue(value,"icon"),startedAtDescriptor=descriptorValue(value,"startedAt"),endedAtDescriptor=descriptorValue(value,"endedAt"),retryCountDescriptor=descriptorValue(value,"retryCount"),redactedFieldsDescriptor=descriptorValue(value,"redactedFields"),needsApprovalDescriptor=descriptorValue(value,"needsApproval"),approvedDescriptor=descriptorValue(value,"approved");if([idDescriptor,nameDescriptor,displayNameDescriptor,argsDescriptor,statusDescriptor,resultDescriptor,errorDescriptor,sourceKeyDescriptor,iconDescriptor,startedAtDescriptor,endedAtDescriptor,retryCountDescriptor,redactedFieldsDescriptor,needsApprovalDescriptor,approvedDescriptor].some(descriptor=>descriptor===UNSAFE_OWN_DATA_DESCRIPTOR))return;const valueOf=descriptor=>{if(!(descriptor===MISSING_OWN_DATA_DESCRIPTOR||descriptor===UNSAFE_OWN_DATA_DESCRIPTOR))return descriptor.value},id=valueOf(idDescriptor);if(typeof id!="string"||id.trim().length===0)return;const redactedFieldsValue=valueOf(redactedFieldsDescriptor),redactedFields=redactedFieldsValue===void 0?EMPTY_REDACTION_PATHS:projectedRedactionFields(redactedFieldsValue);if(redactedFields===void 0)return;const name=valueOf(nameDescriptor),displayName=valueOf(displayNameDescriptor),status=valueOf(statusDescriptor),result=valueOf(resultDescriptor),error=valueOf(errorDescriptor),sourceKey=valueOf(sourceKeyDescriptor),icon=valueOf(iconDescriptor),startedAt=valueOf(startedAtDescriptor),endedAt=valueOf(endedAtDescriptor),retryCount=valueOf(retryCountDescriptor),needsApproval=valueOf(needsApprovalDescriptor),approved=valueOf(approvedDescriptor);return Object.freeze({source:value,id,name:typeof name=="string"?name:"",...typeof displayName=="string"?{displayName}:{},args:valueOf(argsDescriptor),status:TOOL_STATUSES.has(status)?status:"pending",...result===void 0?{}:{result},...typeof error=="string"?{error}:{},...typeof sourceKey=="string"?{sourceKey}:{},...typeof icon=="string"?{icon}:{},...typeof startedAt=="number"?{startedAt}:{},...typeof endedAt=="number"?{endedAt}:{},...typeof retryCount=="number"?{retryCount}:{},redactedFields,...typeof needsApproval=="boolean"?{needsApproval}:{},...typeof approved=="boolean"?{approved}:{}})}catch{return}}function entrySourceKey(entry){return entry.sourceKey?.trim()?entry.sourceKey:void 0}function entryIdentity(entry){return JSON.stringify([entrySourceKey(entry)??null,entry.id])}function entryCorrelation(entry){const sourceKey=entrySourceKey(entry);return sourceKey===void 0?{invocationId:entry.id}:{invocationId:entry.id,sourceKey}}class LyraToolTimeline extends LyraElement{constructor(){super(...arguments),this.entries=[],this.approvalReadonly=!1,this.approvalPending=null,this.openedEntryIds=new Set,this.projectedEntriesCache=[],this.sortedEntriesCache=[],this.projectionTruncated=!1,this.redactionCache=new WeakMap,this.announcements=new AnnouncementSinkController(this,{eager:["polite"]}),this.limitAnnouncementInitialized=!1,this.previouslyTruncated=!1,this.decisionDispatching=!1,this.onDialogApprove=event=>{if(!this.decisionDispatching){this.decisionDispatching=!0;try{event.stopPropagation();const entry=this.reviewingEntry;if(entry===void 0)return;const key=entryIdentity(entry);if(this.emitToolApprovalDecideRequest({...entryCorrelation(entry),approved:!0,args:event.detail.args}).defaultPrevented&&this.entryStillNeedsApproval(key)){this.approvalPending="approve",event.preventDefault();return}this.approvalPending=null,this.reviewingEntryKey=void 0}finally{this.decisionDispatching=!1}}},this.onDialogDeny=event=>{if(!this.decisionDispatching){this.decisionDispatching=!0;try{event.stopPropagation();const entry=this.reviewingEntry;if(entry===void 0)return;const key=entryIdentity(entry);if(this.emitToolApprovalDecideRequest({...entryCorrelation(entry),approved:!1}).defaultPrevented&&this.entryStillNeedsApproval(key)){this.approvalPending="deny",event.preventDefault();return}this.approvalPending=null,this.reviewingEntryKey=void 0}finally{this.decisionDispatching=!1}}},this.onDialogClose=event=>{event.stopPropagation(),this.approvalPending=null,this.reviewingEntryKey=void 0}}static{this.defaultStrings={...super.defaultStrings,confirmApproved:LYRA_DEFAULT_confirmApproved,confirmDenied:LYRA_DEFAULT_confirmDenied,envListValueHidden:LYRA_DEFAULT_envListValueHidden,noData:LYRA_DEFAULT_noData,retry:LYRA_DEFAULT_retry,toolTimelineDetailsFor:LYRA_DEFAULT_toolTimelineDetailsFor,toolTimelineLimit:LYRA_DEFAULT_toolTimelineLimit}}emitToolApprovalDecideRequest(detail){return this.emit("lr-tool-approval-decide-request",Object.freeze(detail),{cancelable:!0})}static{this.collectionSupport=collectionSupport}static{this.ownedCollectionProperties=Object.freeze(["entries"])}static{this.identityCollectionProperties=Object.freeze(["entries"])}static{this.styles=[LyraElement.styles,styles,srOnly]}connectedCallback(){super.connectedCallback(),this.limitAnnouncementInitialized=this.hasUpdated,this.previouslyTruncated=this.projectionTruncated}adoptedCallback(){super.adoptedCallback(),this.announcements.adopted()}get pendingApproval(){return this.approvalPending}willUpdate(changed){if(super.willUpdate(changed),this.openedEntryIds.size>0&&(resultViewRegistration??=import("../tool-result-view/tool-result-view.js").catch(()=>resultViewRegistration=void 0)),!changed.has("entries"))return;this.rebuildProjection();const projected=this.projectedEntriesCache;projected.some(entry=>entry.needsApproval)&&(approvalDialogRegistration??=import("../tool-approval-dialog/tool-approval-dialog.js").catch(()=>approvalDialogRegistration=void 0));const identities=new Set(projected.map(entryIdentity));if(this.reviewingEntryKey!==void 0){const still=projected.find(entry=>entryIdentity(entry)===this.reviewingEntryKey);(!still||!(still.needsApproval&&still.approved===void 0))&&(this.reviewingEntryKey=void 0,this.approvalPending=null)}const opened=new Set([...this.openedEntryIds].filter(key=>identities.has(key)));opened.size!==this.openedEntryIds.size&&(this.openedEntryIds=opened)}updated(changed){super.updated(changed),this.limitAnnouncementInitialized&&this.projectionTruncated&&!this.previouslyTruncated&&this.announcements.announcePolite(this.localize("toolTimelineLimit",void 0,{count:getNumberFormat(this.effectiveLocale).format(MAX_RENDERED_ENTRIES)})),this.limitAnnouncementInitialized=!0,this.previouslyTruncated=this.projectionTruncated}rebuildProjection(){const entries=Array.isArray(this.entries)?this.entries:[],projected=[],projectedIndex=new Map,reservedKeys=new Set(this.openedEntryIds);this.reviewingEntryKey!==void 0&&reservedKeys.add(this.reviewingEntryKey);const displacedReserved=new Map,seen=new Set;for(const sourceEntry of entries){const entry=projectToolTimelineEntry(sourceEntry);if(!entry)continue;const key=entryIdentity(entry);seen.has(key)||(seen.add(key),projected.length<MAX_RENDERED_ENTRIES?(projectedIndex.set(key,projected.length),projected.push(entry)):reservedKeys.has(key)&&displacedReserved.set(key,entry))}for(const[key,entry]of displacedReserved){if(projectedIndex.has(key))continue;let replacement=projected.length-1;for(;replacement>=0&&reservedKeys.has(entryIdentity(projected[replacement]));)replacement--;if(replacement<0)break;projectedIndex.delete(entryIdentity(projected[replacement])),projected[replacement]=entry,projectedIndex.set(key,replacement)}this.projectedEntriesCache=projected,this.projectionTruncated=seen.size>projected.length,this.sortedEntriesCache=projected.map((entry,index)=>({entry,index})).sort((a,b)=>{const ak=Number.isFinite(a.entry.startedAt)?a.entry.startedAt:Number.POSITIVE_INFINITY,bk=Number.isFinite(b.entry.startedAt)?b.entry.startedAt:Number.POSITIVE_INFINITY;return ak!==bk?ak-bk:a.index-b.index}).map(({entry})=>entry)}get sortedEntries(){return this.sortedEntriesCache}get reviewingEntry(){return this.reviewingEntryKey===void 0?void 0:this.projectedEntriesCache.find(entry=>entryIdentity(entry)===this.reviewingEntryKey)}durationFor(entry){if(entry.startedAt==null||entry.endedAt==null)return;const diff=entry.endedAt-entry.startedAt;return Number.isFinite(diff)?diff:void 0}normalizedDate(ms){if(ms==null||!Number.isFinite(ms))return;const date=new Date(ms);return Number.isNaN(date.getTime())?void 0:date}onChipSelect(entry,event){if(event.stopPropagation(),entry.needsApproval&&entry.approved===void 0){this.reviewingEntryKey=entryIdentity(entry);return}this.emit("lr-tool-activate",entryCorrelation(entry))}entryStillNeedsApproval(key){const entries=Array.isArray(this.entries)?this.entries:[];for(const sourceEntry of entries){const projected=projectToolTimelineEntry(sourceEntry);if(projected!==void 0&&entryIdentity(projected)===key)return projected.needsApproval===!0&&projected.approved===void 0}return!1}finalizePendingApproval(){this.approvalPending!==null&&(this.approvalPending=null,this.reviewingEntryKey=void 0)}revertPendingApproval(){this.approvalPending!==null&&(this.approvalPending=null)}onDetailsToggle(entry,event){event.stopPropagation();const key=entryIdentity(entry),next=new Set(this.openedEntryIds);event.detail.expanded?next.add(key):next.delete(key),this.openedEntryIds=next}stopOwnedEvent(event){event.stopPropagation()}onRenderError(entry,event){event.stopPropagation(),this.emit("lr-tool-render-error",{...entryCorrelation(entry),...event.detail})}redactedEntry(entry,placeholder){const redacted=redactToolDetail({args:entry.args,result:entry.result,error:entry.error},entry.redactedFields,placeholder,this.redactionCache.get(entry));return this.redactionCache.set(entry,redacted),redacted}openedDetailsTemplate(entry,placeholder){const redacted=this.redactedEntry(entry,placeholder);return html`
|
|
1
|
+
import{__decorate}from"tslib";import{collectionSupport,publicCollectionTruncation}from"../../../internal/collection-snapshot.js";import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{formatTimeOfDay,getNumberFormat}from"../../../internal/intl-cache.js";import{finiteCount}from"../../../internal/numbers.js";import{eyeOffIcon}from"../../../internal/icons.js";import{srOnly}from"../../../internal/a11y.js";import{styles}from"./tool-timeline.styles.js";import{overallSemanticLabel}from"../semantic-owner.js";import{AnnouncementSinkController}from"../../../internal/announcer.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import{TOOL_CALL_STATUSES}from"../tool-status.js";import{EMPTY_REDACTION_PATHS,projectedRedactionFields,redactToolDetail}from"../tool-redaction.js";import{LYRA_DEFAULT_confirmApproved,LYRA_DEFAULT_confirmDenied,LYRA_DEFAULT_toolTimelineDetailsFor,LYRA_DEFAULT_toolTimelineInputLimit,LYRA_DEFAULT_toolTimelineLimit}from"../../../internal/default-strings/agent-tools.generated.js";import{LYRA_DEFAULT_envListValueHidden,LYRA_DEFAULT_noData,LYRA_DEFAULT_retry}from"../../../internal/default-strings/shared.generated.js";let resultViewRegistration,approvalDialogRegistration;const MAX_RENDERED_ENTRIES=500,TOOL_STATUSES=new Set(TOOL_CALL_STATUSES),ENTRY_FIELDS=["id","name","displayName","args","status","result","error","sourceKey","icon","startedAt","endedAt","retryCount","redactedFields","needsApproval","approved"],projections=new WeakMap;function projectToolTimelineEntry(value){try{if(value===null||typeof value!="object"||Array.isArray(value))return;const values=[];for(const field of ENTRY_FIELDS){const descriptor=getOwnDataDescriptor(value,field);if(descriptor===UNSAFE_OWN_DATA_DESCRIPTOR)return;values.push(descriptor===MISSING_OWN_DATA_DESCRIPTOR?void 0:descriptor.value)}const previous=projections.get(value);if(previous&&previous.values.every((field,index)=>Object.is(field,values[index])))return previous.entry;const entry=buildToolTimelineEntry(value,values);return projections.set(value,{values,entry}),entry}catch{return}}function buildToolTimelineEntry(source,values){const[id,name,displayName,args,status,result,error,sourceKey,icon,startedAt,endedAt,retryCount,redactedFieldsValue,needsApproval,approved]=values;if(typeof id!="string"||id.trim().length===0)return;const redactedFields=redactedFieldsValue===void 0?EMPTY_REDACTION_PATHS:projectedRedactionFields(redactedFieldsValue);if(redactedFields!==void 0)return Object.freeze({source,id,name:typeof name=="string"?name:"",...typeof displayName=="string"?{displayName}:{},args,status:TOOL_STATUSES.has(status)?status:"pending",...result===void 0?{}:{result},...typeof error=="string"?{error}:{},...typeof sourceKey=="string"?{sourceKey}:{},...typeof icon=="string"?{icon}:{},...typeof startedAt=="number"?{startedAt}:{},...typeof endedAt=="number"?{endedAt}:{},...typeof retryCount=="number"?{retryCount}:{},redactedFields,...typeof needsApproval=="boolean"?{needsApproval}:{},...typeof approved=="boolean"?{approved}:{}})}function entrySourceKey(entry){return entry.sourceKey?.trim()?entry.sourceKey:void 0}const entryIdentities=new WeakMap;function entryIdentity(entry){let key=entryIdentities.get(entry);return key===void 0&&(key=JSON.stringify([entrySourceKey(entry)??null,entry.id]),entryIdentities.set(entry,key)),key}function entryCorrelation(entry){const sourceKey=entrySourceKey(entry);return sourceKey===void 0?{invocationId:entry.id}:{invocationId:entry.id,sourceKey}}class LyraToolTimeline extends LyraElement{constructor(){super(...arguments),this.entries=[],this.approvalReadonly=!1,this.approvalPending=null,this.openedEntryIds=new Set,this.projectedEntriesCache=[],this.sortedEntriesCache=[],this.projectionTruncated=!1,this.canonicalModels=new WeakMap,this.canonicalByKey=new Map,this.inputPreviouslyTruncated=!1,this.redactionCache=new WeakMap,this.announcements=new AnnouncementSinkController(this,{eager:["polite"]}),this.limitAnnouncementInitialized=!1,this.previouslyTruncated=!1,this.decisionDispatching=!1,this.onDialogApprove=event=>{if(!this.decisionDispatching){this.decisionDispatching=!0;try{event.stopPropagation();const entry=this.reviewingEntry;if(entry===void 0)return;const key=entryIdentity(entry);if(this.emitToolApprovalDecideRequest({...entryCorrelation(entry),approved:!0,args:event.detail.args}).defaultPrevented&&this.entryStillNeedsApproval(key)){this.approvalPending="approve",event.preventDefault();return}this.approvalPending=null,this.reviewingEntryKey=void 0}finally{this.decisionDispatching=!1}}},this.onDialogDeny=event=>{if(!this.decisionDispatching){this.decisionDispatching=!0;try{event.stopPropagation();const entry=this.reviewingEntry;if(entry===void 0)return;const key=entryIdentity(entry);if(this.emitToolApprovalDecideRequest({...entryCorrelation(entry),approved:!1}).defaultPrevented&&this.entryStillNeedsApproval(key)){this.approvalPending="deny",event.preventDefault();return}this.approvalPending=null,this.reviewingEntryKey=void 0}finally{this.decisionDispatching=!1}}},this.onDialogClose=event=>{event.stopPropagation(),this.approvalPending=null,this.reviewingEntryKey=void 0}}static{this.defaultStrings={...super.defaultStrings,confirmApproved:LYRA_DEFAULT_confirmApproved,confirmDenied:LYRA_DEFAULT_confirmDenied,envListValueHidden:LYRA_DEFAULT_envListValueHidden,noData:LYRA_DEFAULT_noData,retry:LYRA_DEFAULT_retry,toolTimelineDetailsFor:LYRA_DEFAULT_toolTimelineDetailsFor,toolTimelineInputLimit:LYRA_DEFAULT_toolTimelineInputLimit,toolTimelineLimit:LYRA_DEFAULT_toolTimelineLimit}}emitToolApprovalDecideRequest(detail){return this.emit("lr-tool-approval-decide-request",Object.freeze(detail),{cancelable:!0})}static{this.collectionSupport=collectionSupport}static{this.ownedCollectionProperties=Object.freeze(["entries"])}static{this.identityCollectionProperties=Object.freeze(["entries"])}static{this.appendOrderedCollectionProperties=Object.freeze(["entries"])}static{this.styles=[LyraElement.styles,styles,srOnly]}canonicalEntries(){if(this.canonicalSource!==this.entries){this.canonicalSource=this.entries;const cached=this.canonicalModels.get(this.entries);if(cached)return this.canonicalByKey=cached;this.canonicalByKey=new Map;for(const value of this.entries){const entry=projectToolTimelineEntry(value);if(!entry)continue;const key=entryIdentity(entry);this.canonicalByKey.has(key)||this.canonicalByKey.set(key,entry)}this.canonicalModels.set(this.entries,this.canonicalByKey)}return this.canonicalByKey}inputLimitText(){const truncation=publicCollectionTruncation(this,"entries"),number=getNumberFormat(this.effectiveLocale);return truncation?this.localize("toolTimelineInputLimit",void 0,{count:number.format(truncation.retained),total:number.format(truncation.source)}):""}connectedCallback(){super.connectedCallback(),this.limitAnnouncementInitialized=this.hasUpdated,this.previouslyTruncated=this.projectionTruncated}adoptedCallback(){super.adoptedCallback(),this.announcements.adopted()}get pendingApproval(){return this.approvalPending}willUpdate(changed){if(super.willUpdate(changed),this.openedEntryIds.size>0&&(resultViewRegistration??=import("../tool-result-view/tool-result-view.js").catch(()=>resultViewRegistration=void 0)),!changed.has("entries"))return;this.rebuildProjection();const projected=this.projectedEntriesCache;projected.some(entry=>entry.needsApproval)&&(approvalDialogRegistration??=import("../tool-approval-dialog/tool-approval-dialog.js").catch(()=>approvalDialogRegistration=void 0));const identities=new Set(projected.map(entryIdentity));if(this.reviewingEntryKey!==void 0){const still=projected.find(entry=>entryIdentity(entry)===this.reviewingEntryKey);(!still||!(still.needsApproval&&still.approved===void 0))&&(this.reviewingEntryKey=void 0,this.approvalPending=null)}const opened=new Set([...this.openedEntryIds].filter(key=>identities.has(key)));opened.size!==this.openedEntryIds.size&&(this.openedEntryIds=opened)}updated(changed){super.updated(changed),this.limitAnnouncementInitialized&&this.projectionTruncated&&!this.previouslyTruncated&&this.announcements.announcePolite(this.localize("toolTimelineLimit",void 0,{count:getNumberFormat(this.effectiveLocale).format(MAX_RENDERED_ENTRIES)}));const inputTruncated=publicCollectionTruncation(this,"entries")!==void 0;this.limitAnnouncementInitialized&&inputTruncated&&!this.inputPreviouslyTruncated&&this.announcements.announcePolite(this.inputLimitText()),this.inputPreviouslyTruncated=inputTruncated,this.limitAnnouncementInitialized=!0,this.previouslyTruncated=this.projectionTruncated}rebuildProjection(){const canonical=this.canonicalEntries(),projected=[...canonical.values()].slice(-MAX_RENDERED_ENTRIES),projectedIndex=new Map(projected.map((entry,index)=>[entryIdentity(entry),index])),reservedKeys=new Set(this.openedEntryIds);this.reviewingEntryKey!==void 0&&reservedKeys.add(this.reviewingEntryKey);const displacedReserved=new Map;for(const key of reservedKeys){const entry=canonical.get(key);entry&&!projectedIndex.has(key)&&displacedReserved.set(key,entry)}for(const[key,entry]of displacedReserved){if(projectedIndex.has(key))continue;let replacement=0;for(;replacement<projected.length&&reservedKeys.has(entryIdentity(projected[replacement]));)replacement++;if(replacement===projected.length)break;projectedIndex.delete(entryIdentity(projected[replacement])),projected[replacement]=entry,projectedIndex.set(key,replacement)}this.projectedEntriesCache=projected,this.projectionTruncated=canonical.size>projected.length,this.sortedEntriesCache=projected.map((entry,index)=>({entry,index})).sort((a,b)=>{const ak=Number.isFinite(a.entry.startedAt)?a.entry.startedAt:Number.POSITIVE_INFINITY,bk=Number.isFinite(b.entry.startedAt)?b.entry.startedAt:Number.POSITIVE_INFINITY;return ak!==bk?ak-bk:a.index-b.index}).map(({entry})=>entry)}get sortedEntries(){return this.sortedEntriesCache}get reviewingEntry(){return this.reviewingEntryKey===void 0?void 0:this.projectedEntriesCache.find(entry=>entryIdentity(entry)===this.reviewingEntryKey)}durationFor(entry){if(entry.startedAt==null||entry.endedAt==null)return;const diff=entry.endedAt-entry.startedAt;return Number.isFinite(diff)?diff:void 0}normalizedDate(ms){if(ms==null||!Number.isFinite(ms))return;const date=new Date(ms);return Number.isNaN(date.getTime())?void 0:date}onChipSelect(entry,event){if(event.stopPropagation(),entry.needsApproval&&entry.approved===void 0){this.reviewingEntryKey=entryIdentity(entry);return}this.emit("lr-tool-activate",entryCorrelation(entry))}entryStillNeedsApproval(key){const entry=this.canonicalEntries().get(key);return entry?.needsApproval===!0&&entry.approved===void 0}finalizePendingApproval(){this.approvalPending!==null&&(this.approvalPending=null,this.reviewingEntryKey=void 0)}revertPendingApproval(){this.approvalPending!==null&&(this.approvalPending=null)}onDetailsToggle(entry,event){event.stopPropagation();const key=entryIdentity(entry),next=new Set(this.openedEntryIds);event.detail.expanded?next.add(key):next.delete(key),this.openedEntryIds=next}stopOwnedEvent(event){event.stopPropagation()}onRenderError(entry,event){event.stopPropagation(),this.emit("lr-tool-render-error",{...entryCorrelation(entry),...event.detail})}redactedEntry(entry,placeholder){const redacted=redactToolDetail({args:entry.args,result:entry.result,error:entry.error},entry.redactedFields,placeholder,this.redactionCache.get(entry));return this.redactionCache.set(entry,redacted),redacted}openedDetailsTemplate(entry,placeholder){const redacted=this.redactedEntry(entry,placeholder);return html`
|
|
2
2
|
<lr-tool-result-view
|
|
3
3
|
part="entry-result"
|
|
4
4
|
tool-name=${entry.name}
|
|
@@ -59,6 +59,7 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
|
|
|
59
59
|
${entries.length===0?html`<lr-empty part="empty" heading=${this.localize("noData")}></lr-empty>`:html`<ol part="base" role="list" aria-label=${overallSemanticLabel(this)??nothing}>
|
|
60
60
|
${repeat(entries,entryIdentity,entry=>this.entryTemplate(entry,placeholder))}
|
|
61
61
|
</ol>`}
|
|
62
|
+
${publicCollectionTruncation(this,"entries")?html`<p part="limit" role="note">${this.inputLimitText()}</p>`:nothing}
|
|
62
63
|
${this.projectionTruncated?html`<p part="limit" role="note">${this.localize("toolTimelineLimit",void 0,{count:getNumberFormat(this.effectiveLocale).format(MAX_RENDERED_ENTRIES)})}</p>`:nothing}
|
|
63
64
|
<lr-tool-approval-dialog
|
|
64
65
|
part="approval-dialog"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import{finiteCount,finiteRange}from"../../../internal/numbers.js";import{MAX_RENDERED_LYRA_SPANS,normalizeLyraSpanKind,normalizeLyraSpanStatus}from"./span-shared.js";const SPAN_PROPERTIES=["id","parentId","name","kind","startMs","endMs","status","tokensIn","tokensOut","costText","detail"],normalizedSpanCache=new WeakMap;function descriptorValue(value,property){return getOwnDataDescriptor(value,property)}function projectLyraSpan(value){try{if(value===null||typeof value!="object"||Array.isArray(value))return;const descriptors=new Map;for(const property of SPAN_PROPERTIES){const descriptor2=descriptorValue(value,property);if(descriptor2===UNSAFE_OWN_DATA_DESCRIPTOR)return;descriptors.set(property,descriptor2)}const descriptor=property=>{const valueDescriptor=descriptors.get(property);if(!(valueDescriptor===void 0||valueDescriptor===MISSING_OWN_DATA_DESCRIPTOR||valueDescriptor===UNSAFE_OWN_DATA_DESCRIPTOR))return valueDescriptor.value},id=descriptor("id"),start=descriptor("startMs"),end=descriptor("endMs");if(typeof id!="string"||id.trim().length===0||typeof start!="number"||!Number.isFinite(start)||end!=null&&(typeof end!="number"||!Number.isFinite(end)))return;const startMs=finiteRange(start,0,0,Number.MAX_SAFE_INTEGER),endMs=end==null?void 0:finiteRange(end,startMs,startMs,Number.MAX_SAFE_INTEGER),parentId=descriptor("parentId"),name=descriptor("name"),kind=descriptor("kind"),status=descriptor("status"),tokensIn=descriptor("tokensIn"),tokensOut=descriptor("tokensOut"),costText=descriptor("costText"),detail=descriptor("detail"),span={id,name:typeof name=="string"?name:"",kind:normalizeLyraSpanKind(kind),startMs,status:normalizeLyraSpanStatus(status),...endMs===void 0?{}:{endMs},...typeof parentId=="string"&&parentId.length>0?{parentId}:{},...typeof tokensIn=="number"?{tokensIn}:{},...typeof tokensOut=="number"?{tokensOut}:{},...typeof costText=="string"?{costText}:{},...typeof detail=="string"?{detail}:{}};return Object.freeze(span),Object.freeze({source:value,span})}catch{return}}function canonicalLyraSpans(values){let cacheable=!1;try{cacheable=Object.isFrozen(values)}catch{return[]}if(cacheable){const cached=normalizedSpanCache.get(values);if(cached)return cached}const canonical=[],seenIds=new Set;try{for(const value of values){const projected=projectLyraSpan(value);!projected||seenIds.has(projected.span.id)||(seenIds.add(projected.span.id),canonical.push(projected))}}catch{return[]}const result=Object.freeze(canonical);return cacheable&&normalizedSpanCache.set(values,result),result}function protectedSpanProjection(spans,sourceCount,extentEndMs){const backing=new Map(spans.map(span=>[span.id,span])),byId=Object.freeze({get size(){return backing.size},get:key=>backing.get(key),has:key=>backing.has(key),entries:()=>backing.entries(),keys:()=>backing.keys(),values:()=>backing.values(),[Symbol.iterator]:()=>backing[Symbol.iterator](),forEach(callback,thisArg){backing.forEach((value,key)=>callback.call(thisArg,value,key,byId))}});return Object.freeze({spans:Object.freeze(spans),byId,truncated:spans.length<sourceCount,extentEndMs})}const spanModels=new WeakMap;function projectLyraSpans(values,activeSpanId=null,limit=MAX_RENDERED_LYRA_SPANS){const canonical=canonicalLyraSpans(Array.isArray(values)?values:[]);let model=spanModels.get(canonical);if(!model){const spans2=canonical.map(({span})=>span),byId=new Map(spans2.map(span=>[span.id,span]));let extentEndMs=0;for(const span of spans2)extentEndMs=Math.max(extentEndMs,span.endMs??span.startMs,span.startMs);model={spans:spans2,byId,extentEndMs,projections:new Map},spanModels.set(canonical,model)}const count=Math.max(1,Math.min(5e3,finiteCount(limit,MAX_RENDERED_LYRA_SPANS)));let base=model.projections.get(count);if(!base){const spans2=model.spans.slice(0,count);base=protectedSpanProjection(spans2,model.spans.length,model.extentEndMs),model.projections.clear(),model.projections.set(count,base)}if(model.reservation?.active===activeSpanId&&model.reservation.limit===count)return model.reservation.projection;const chosenIds=new Set;let current=activeSpanId?model.byId.get(activeSpanId):void 0,contained=!0;for(;current&&chosenIds.size<count&&!chosenIds.has(current.id);)chosenIds.add(current.id),contained&&=base.byId.has(current.id),current=current.parentId?model.byId.get(current.parentId):void 0;if(contained)return base;for(const span of model.spans){if(chosenIds.size>=count)break;chosenIds.add(span.id)}const spans=model.spans.filter(span=>chosenIds.has(span.id)),projection=protectedSpanProjection(spans,model.spans.length,model.extentEndMs);return model.reservation={active:activeSpanId,limit:count,projection},projection}export{projectLyraSpans};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type{LyraToolStatus}from'../../../internal/shared-unions.js';export type LyraSpanKind='agent'|'llm'|'tool'|'retriever'|'embedding'|'other';
|
|
2
|
+
/** The shared tool lifecycle plus `incomplete` for an interrupted span and neutral `unknown` for
|
|
3
|
+
* an explicitly unrecognized provider status. */
|
|
4
|
+
export type LyraSpanStatus=LyraToolStatus|'incomplete'|'unknown';
|
|
5
|
+
/** Normalizes foreign provider data before it reaches closed span-kind maps. */
|
|
6
|
+
export declare function normalizeLyraSpanKind(value:unknown):LyraSpanKind;
|
|
7
|
+
/** Normalizes foreign provider data before it reaches closed span-status maps. */
|
|
8
|
+
export declare function normalizeLyraSpanStatus(value:unknown):LyraSpanStatus;
|
|
9
|
+
/**
|
|
10
|
+
* One span in an agent/LLM trace. The same flat `LyraSpan[]` array powers
|
|
11
|
+
* both `<lr-trace-tree>` (hierarchy projection, via `parentId`) and
|
|
12
|
+
* `<lr-span-waterfall>` (timeline projection, via `startMs`/`endMs`) — two
|
|
13
|
+
* views of one trace, never two separate data shapes.
|
|
14
|
+
*/
|
|
15
|
+
export interface LyraSpan{
|
|
16
|
+
/** Nonblank stable identity. Surrounding whitespace in a nonblank ID is preserved. */
|
|
17
|
+
id:string;
|
|
18
|
+
/** A span whose `parentId` is missing or doesn't resolve to another span in the same array renders as a root — never dropped. */
|
|
19
|
+
parentId?:string;name:string;kind:LyraSpanKind;
|
|
20
|
+
/** Milliseconds relative to the trace start (not a wall-clock timestamp). */
|
|
21
|
+
startMs:number;
|
|
22
|
+
/** Milliseconds relative to the trace start. Absent while the span is still running. */
|
|
23
|
+
endMs?:number;
|
|
24
|
+
/** Tool-lifecycle status plus `incomplete`; unrecognized provider values become neutral `unknown`, while absent values become `pending`. */
|
|
25
|
+
status:LyraSpanStatus;tokensIn?:number;tokensOut?:number;
|
|
26
|
+
/** Preformatted by the host (e.g. `"$0.0012"`) — rendered verbatim, never parsed or summed. */
|
|
27
|
+
costText?:string;
|
|
28
|
+
/** Secondary text rendered under/after the span's name. */
|
|
29
|
+
detail?:string;}export declare const MAX_RENDERED_LYRA_SPANS=500;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function normalizeLyraSpanKind(value){switch(value){case"agent":case"llm":case"tool":case"retriever":case"embedding":case"other":return value;default:return"other"}}function normalizeLyraSpanStatus(value){switch(value){case"pending":case"running":case"success":case"error":case"denied":case"incomplete":case"unknown":return value;default:return value==null?"pending":"unknown"}}const MAX_RENDERED_LYRA_SPANS=500;export{MAX_RENDERED_LYRA_SPANS,normalizeLyraSpanKind,normalizeLyraSpanStatus};
|
|
@@ -1,32 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
/** The shared tool lifecycle plus `incomplete` for an interrupted span and neutral `unknown` for
|
|
3
|
-
* an explicitly unrecognized provider status. */
|
|
4
|
-
export type LyraSpanStatus=LyraToolStatus|'incomplete'|'unknown';
|
|
5
|
-
/** Normalizes foreign provider data before it reaches closed span-kind maps. */
|
|
6
|
-
export declare function normalizeLyraSpanKind(value:unknown):LyraSpanKind;
|
|
7
|
-
/** Normalizes foreign provider data before it reaches closed span-status maps. */
|
|
8
|
-
export declare function normalizeLyraSpanStatus(value:unknown):LyraSpanStatus;
|
|
9
|
-
/**
|
|
10
|
-
* One span in an agent/LLM trace. The same flat `LyraSpan[]` array powers
|
|
11
|
-
* both `<lr-trace-tree>` (hierarchy projection, via `parentId`) and
|
|
12
|
-
* `<lr-span-waterfall>` (timeline projection, via `startMs`/`endMs`) — two
|
|
13
|
-
* views of one trace, never two separate data shapes.
|
|
14
|
-
*/
|
|
15
|
-
export interface LyraSpan{
|
|
16
|
-
/** Nonblank stable identity. Surrounding whitespace in a nonblank ID is preserved. */
|
|
17
|
-
id:string;
|
|
18
|
-
/** A span whose `parentId` is missing or doesn't resolve to another span in the same array renders as a root — never dropped. */
|
|
19
|
-
parentId?:string;name:string;kind:LyraSpanKind;
|
|
20
|
-
/** Milliseconds relative to the trace start (not a wall-clock timestamp). */
|
|
21
|
-
startMs:number;
|
|
22
|
-
/** Milliseconds relative to the trace start. Absent while the span is still running. */
|
|
23
|
-
endMs?:number;
|
|
24
|
-
/** Tool-lifecycle status plus `incomplete`; unrecognized provider values become neutral `unknown`, while absent values become `pending`. */
|
|
25
|
-
status:LyraSpanStatus;tokensIn?:number;tokensOut?:number;
|
|
26
|
-
/** Preformatted by the host (e.g. `"$0.0012"`) — rendered verbatim, never parsed or summed. */
|
|
27
|
-
costText?:string;
|
|
28
|
-
/** Secondary text rendered under/after the span's name. */
|
|
29
|
-
detail?:string;}export declare const MAX_RENDERED_LYRA_SPANS=500;export interface LyraSpanProjection{spans:LyraSpan[];byId:Map<string,LyraSpan>;truncated:boolean;
|
|
1
|
+
import{type LyraSpan}from'./span-shared.js';export{MAX_RENDERED_LYRA_SPANS,normalizeLyraSpanKind,normalizeLyraSpanStatus}from'./span-shared.js';export type{LyraSpan,LyraSpanKind,LyraSpanStatus}from'./span-shared.js';export interface LyraSpanProjection{spans:LyraSpan[];byId:Map<string,LyraSpan>;truncated:boolean;
|
|
30
2
|
/**
|
|
31
3
|
* The greatest trace-relative end across every span in the source array, measured BEFORE the
|
|
32
4
|
* `MAX_RENDERED_LYRA_SPANS` cap drops anything — never below `0`. A maximum, not the last
|
|
@@ -40,9 +12,7 @@ detail?:string;}export declare const MAX_RENDERED_LYRA_SPANS=500;export interfac
|
|
|
40
12
|
* a resource bound; rescaling the AXIS underneath them is a misreport.
|
|
41
13
|
*/
|
|
42
14
|
extentEndMs:number;}
|
|
43
|
-
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
|
|
47
|
-
* positions in input order. */
|
|
48
|
-
export declare function normalizeLyraSpans(values:readonly unknown[],activeSpanId?:string|null):LyraSpanProjection;
|
|
15
|
+
/** Runtime-safe projection with independent mutable result containers. The default is 500 rows;
|
|
16
|
+
* an optional limit permits 1..5000. A resolved active span and its nearest ancestors reserve
|
|
17
|
+
* positions before ordinary input-order rows. Invalid records and later duplicate ids are omitted. */
|
|
18
|
+
export declare function normalizeLyraSpans(values:readonly unknown[],activeSpanId?:string|null,limit?:number):LyraSpanProjection;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{projectLyraSpans}from"./span-projection.js";import{MAX_RENDERED_LYRA_SPANS}from"./span-shared.js";import{MAX_RENDERED_LYRA_SPANS as MAX_RENDERED_LYRA_SPANS2,normalizeLyraSpanKind,normalizeLyraSpanStatus}from"./span-shared.js";function normalizeLyraSpans(values,activeSpanId=null,limit=MAX_RENDERED_LYRA_SPANS){const projection=projectLyraSpans(values,activeSpanId,limit);return{...projection,spans:[...projection.spans],byId:new Map(projection.byId)}}export{MAX_RENDERED_LYRA_SPANS2 as MAX_RENDERED_LYRA_SPANS,normalizeLyraSpanKind,normalizeLyraSpanStatus,normalizeLyraSpans};
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import{type TemplateResult,type PropertyValues}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';import{type LyraSpan}from'./span.js';
|
|
1
|
+
import{type TemplateResult,type PropertyValues}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';import{type LyraSpan}from'./span.js';import type{LyraHierarchySource,LyraHierarchyQuery,LyraTraceSourceSummary}from'../../../data-sources.js';export type{LyraSpan}from'./span.js';
|
|
2
|
+
/** Immutable provider preorder with the complete trace timing extent. */
|
|
3
|
+
export type TraceTreeSource=LyraHierarchySource<LyraSpan,LyraHierarchyQuery,LyraTraceSourceSummary>;export interface LyraTraceTreeEventMap{'lr-span-select':CustomEvent<{spanId:string;}>;'lr-span-toggle':CustomEvent<{spanId:string;expanded:boolean;}>;}
|
|
2
4
|
/**
|
|
3
5
|
* `<lr-trace-tree>` — a collapsible span hierarchy for one agent/LLM trace
|
|
4
6
|
* (Langfuse/LangSmith run-tree style): kind icon, name, status, an inline
|
|
@@ -8,9 +10,18 @@ import{type TemplateResult,type PropertyValues}from'lit';import{LyraElement}from
|
|
|
8
10
|
* Public collection properties take bounded, clone-owned readonly snapshots. Create a new
|
|
9
11
|
* collection and reassign it after changes; mutating the assigned array does not update the view.
|
|
10
12
|
*
|
|
11
|
-
* Duration bars always scale to the whole trace, including spans the
|
|
13
|
+
* Duration bars always scale to the whole trace, including spans the configured row ceiling drops, so a
|
|
12
14
|
* truncated tail never stretches the surviving bars across their tracks.
|
|
13
15
|
*
|
|
16
|
+
* Provider mode uses treeSource's full preorder and global summary. Topology comes from provider
|
|
17
|
+
* row metadata, never parentId. expandAll/collapseAll are legacy-only; providers own expansion.
|
|
18
|
+
*
|
|
19
|
+
* @csspart source-list - Bounded provider virtual viewport.
|
|
20
|
+
* @csspart source-row - Provider tree item and focus owner.
|
|
21
|
+
* @csspart source-label - Provider row content.
|
|
22
|
+
* @csspart source-toggle - Provider expand/collapse or retry control.
|
|
23
|
+
* @csspart source-status - Localized provider loading, count or empty state.
|
|
24
|
+
* @csspart source-error - Localized provider failure.
|
|
14
25
|
* @customElement lr-trace-tree
|
|
15
26
|
* @event lr-span-select - `detail: { spanId }` — a row was activated (click, Enter, Space).
|
|
16
27
|
* @event lr-span-toggle - `detail: { spanId, expanded }` — a row was expanded or collapsed.
|
|
@@ -29,7 +40,7 @@ import{type TemplateResult,type PropertyValues}from'lit';import{LyraElement}from
|
|
|
29
40
|
* @csspart bar-track - The duration bar's background track.
|
|
30
41
|
* @csspart bar - The duration bar's filled portion.
|
|
31
42
|
* @csspart empty - The empty-state message shown when `spans` is empty.
|
|
32
|
-
* @csspart limit - Localized notice shown when the
|
|
43
|
+
* @csspart limit - Localized notice shown when the source admission or configured projection ceiling is reached.
|
|
33
44
|
* @csspart live-region - The internal status-announcement live region.
|
|
34
45
|
* @cssprop [--lr-trace-tree-row-active-bg=var(--lr-color-brand-quiet)] - Background of the active
|
|
35
46
|
* (`activeSpanId`) row, and the base its hover/press mixes from. Shadow Parts forbids an attribute selector after `::part()`, so the active
|
|
@@ -60,10 +71,18 @@ import{type TemplateResult,type PropertyValues}from'lit';import{LyraElement}from
|
|
|
60
71
|
*/
|
|
61
72
|
export declare class LyraTraceTree extends LyraElement<LyraTraceTreeEventMap>{protected static collectionSupport:import("../../../internal/lyra-element.js").LyraCollectionSupport;protected static readonly ownedCollectionProperties:readonly string[];
|
|
62
73
|
/** Span records carry opaque provider metadata, so they are kept by identity, not deep-cloned. */
|
|
63
|
-
protected static readonly identityCollectionProperties:readonly string[];static styles:import("lit").CSSResultGroup[];
|
|
74
|
+
protected static readonly identityCollectionProperties:readonly string[];static styles:import("lit").CSSResultGroup[];private _treeSource;private sourceVersion;private sourcePaintVersion;private sourceWrapper?;private readonly sourceSummaries;private sourceAnnouncement?;private sourceReveal?;private wasSource;private readonly sourceControl;
|
|
75
|
+
/** Immutable provider preorder; defined sources win over spans, even when invalid.
|
|
76
|
+
* Four 100-row pages and one focused row are retained; at most 301 rows mount.
|
|
77
|
+
* Provider metadata owns topology and selection, and summary owns the complete timing extent.
|
|
78
|
+
* Reassign or requestUpdate() after changing revision. Unset restores legacy spans.
|
|
79
|
+
* @default undefined */
|
|
80
|
+
get treeSource():TraceTreeSource|undefined;set treeSource(value:TraceTreeSource|undefined);
|
|
81
|
+
/** Reveal and focus a full-source key; false when absent, disabled or superseded. */
|
|
82
|
+
revealSourceKey(key:string):Promise<boolean>;private syncSource;private wrapSource;private normalizeSourceSpan;requestUpdate(name?:PropertyKey,oldValue?:unknown):void;disconnectedCallback():void;private sourceSummary;private updateSourceEffects;private sourceSpanLabel;private renderSourceSpan;
|
|
64
83
|
/**
|
|
65
84
|
* Flat span array. Hierarchy is derived from `parentId`; siblings order by `startMs`.
|
|
66
|
-
* At most
|
|
85
|
+
* At most maxNodes unique spans with finite timestamps are rendered (default 500). A resolved `activeSpanId` and
|
|
67
86
|
* its nearest ancestor path reserve positions before ordinary input-order rows, so a controlled
|
|
68
87
|
* selection remains current and revealable across the ceiling. Malformed parent cycles are
|
|
69
88
|
* broken into roots so hostile trace data cannot recurse indefinitely. Foreign runtime
|
|
@@ -72,6 +91,9 @@ protected static readonly identityCollectionProperties:readonly string[];static
|
|
|
72
91
|
* marks a span that ended without a result.
|
|
73
92
|
*/
|
|
74
93
|
spans:readonly LyraSpan[];
|
|
94
|
+
/** Maximum projected rows, from 1 to 5000. Invalid or unset values use 500.
|
|
95
|
+
* Source admission retains the first 10000 outer entries without cloning opaque metadata. */
|
|
96
|
+
maxNodes:number;private get effectiveMaxNodes();
|
|
75
97
|
/** Span kinds left out of the tree. A span whose parent is hidden becomes a root, and the bars keep
|
|
76
98
|
* scaling to the whole trace. */
|
|
77
99
|
hiddenKinds:readonly LyraSpan['kind'][];
|