@adea-ai/ui 0.140.0 → 0.142.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/dist/components/composites/appearance-editor/appearance-editor.js +2 -2
- package/dist/components/composites/appearance-editor/appearance-editor.js.map +1 -1
- package/dist/components/composites/catalog-browser/catalog-browser-group.js +1 -1
- package/dist/components/composites/chain-of-thought/chain-of-thought.d.ts +56 -0
- package/dist/components/composites/chain-of-thought/chain-of-thought.d.ts.map +1 -0
- package/dist/components/composites/chain-of-thought/chain-of-thought.js +117 -0
- package/dist/components/composites/chain-of-thought/chain-of-thought.js.map +1 -0
- package/dist/components/composites/chain-of-thought/index.d.ts +2 -0
- package/dist/components/composites/chain-of-thought/index.d.ts.map +1 -0
- package/dist/components/composites/chain-of-thought/index.js +2 -0
- package/dist/components/composites/chat/chat.d.ts +67 -0
- package/dist/components/composites/chat/chat.d.ts.map +1 -0
- package/dist/components/composites/chat/chat.js +179 -0
- package/dist/components/composites/chat/chat.js.map +1 -0
- package/dist/components/composites/chat/index.d.ts +2 -0
- package/dist/components/composites/chat/index.d.ts.map +1 -0
- package/dist/components/composites/chat/index.js +2 -0
- package/dist/components/composites/checkpoint/checkpoint-model.d.ts +34 -0
- package/dist/components/composites/checkpoint/checkpoint-model.d.ts.map +1 -0
- package/dist/components/composites/checkpoint/checkpoint-model.js +48 -0
- package/dist/components/composites/checkpoint/checkpoint-model.js.map +1 -0
- package/dist/components/composites/checkpoint/checkpoint.d.ts +48 -0
- package/dist/components/composites/checkpoint/checkpoint.d.ts.map +1 -0
- package/dist/components/composites/checkpoint/checkpoint.js +160 -0
- package/dist/components/composites/checkpoint/checkpoint.js.map +1 -0
- package/dist/components/composites/checkpoint/index.d.ts +3 -0
- package/dist/components/composites/checkpoint/index.d.ts.map +1 -0
- package/dist/components/composites/checkpoint/index.js +3 -0
- package/dist/components/composites/confirmation/confirmation-model.d.ts +45 -0
- package/dist/components/composites/confirmation/confirmation-model.d.ts.map +1 -0
- package/dist/components/composites/confirmation/confirmation-model.js +51 -0
- package/dist/components/composites/confirmation/confirmation-model.js.map +1 -0
- package/dist/components/composites/confirmation/confirmation.d.ts +72 -0
- package/dist/components/composites/confirmation/confirmation.d.ts.map +1 -0
- package/dist/components/composites/confirmation/confirmation.js +300 -0
- package/dist/components/composites/confirmation/confirmation.js.map +1 -0
- package/dist/components/composites/confirmation/index.d.ts +3 -0
- package/dist/components/composites/confirmation/index.d.ts.map +1 -0
- package/dist/components/composites/confirmation/index.js +3 -0
- package/dist/components/composites/context/context-model.d.ts +69 -0
- package/dist/components/composites/context/context-model.d.ts.map +1 -0
- package/dist/components/composites/context/context-model.js +122 -0
- package/dist/components/composites/context/context-model.js.map +1 -0
- package/dist/components/composites/context/context.d.ts +38 -0
- package/dist/components/composites/context/context.d.ts.map +1 -0
- package/dist/components/composites/context/context.js +234 -0
- package/dist/components/composites/context/context.js.map +1 -0
- package/dist/components/composites/context/index.d.ts +3 -0
- package/dist/components/composites/context/index.d.ts.map +1 -0
- package/dist/components/composites/context/index.js +3 -0
- package/dist/components/composites/file-tree/build-file-tree.d.ts +138 -0
- package/dist/components/composites/file-tree/build-file-tree.d.ts.map +1 -0
- package/dist/components/composites/file-tree/build-file-tree.js +325 -0
- package/dist/components/composites/file-tree/build-file-tree.js.map +1 -0
- package/dist/components/composites/file-tree/file-tree.d.ts +74 -0
- package/dist/components/composites/file-tree/file-tree.d.ts.map +1 -0
- package/dist/components/composites/file-tree/file-tree.js +389 -0
- package/dist/components/composites/file-tree/file-tree.js.map +1 -0
- package/dist/components/composites/file-tree/index.d.ts +3 -0
- package/dist/components/composites/file-tree/index.d.ts.map +1 -0
- package/dist/components/composites/file-tree/index.js +3 -0
- package/dist/components/composites/inline-citation/citation.d.ts +37 -0
- package/dist/components/composites/inline-citation/citation.d.ts.map +1 -0
- package/dist/components/composites/inline-citation/citation.js +52 -0
- package/dist/components/composites/inline-citation/citation.js.map +1 -0
- package/dist/components/composites/inline-citation/index.d.ts +3 -0
- package/dist/components/composites/inline-citation/index.d.ts.map +1 -0
- package/dist/components/composites/inline-citation/index.js +3 -0
- package/dist/components/composites/inline-citation/inline-citation.d.ts +64 -0
- package/dist/components/composites/inline-citation/inline-citation.d.ts.map +1 -0
- package/dist/components/composites/inline-citation/inline-citation.js +272 -0
- package/dist/components/composites/inline-citation/inline-citation.js.map +1 -0
- package/dist/components/composites/message-scroller/index.d.ts +3 -0
- package/dist/components/composites/message-scroller/index.d.ts.map +1 -0
- package/dist/components/composites/message-scroller/index.js +3 -0
- package/dist/components/composites/message-scroller/message-scroller.d.ts +55 -0
- package/dist/components/composites/message-scroller/message-scroller.d.ts.map +1 -0
- package/dist/components/composites/message-scroller/message-scroller.js +201 -0
- package/dist/components/composites/message-scroller/message-scroller.js.map +1 -0
- package/dist/components/composites/message-scroller/scroll-anchor.d.ts +66 -0
- package/dist/components/composites/message-scroller/scroll-anchor.d.ts.map +1 -0
- package/dist/components/composites/message-scroller/scroll-anchor.js +122 -0
- package/dist/components/composites/message-scroller/scroll-anchor.js.map +1 -0
- package/dist/components/composites/model-selector/index.d.ts +3 -0
- package/dist/components/composites/model-selector/index.d.ts.map +1 -0
- package/dist/components/composites/model-selector/index.js +3 -0
- package/dist/components/composites/model-selector/model-selector.d.ts +55 -0
- package/dist/components/composites/model-selector/model-selector.d.ts.map +1 -0
- package/dist/components/composites/model-selector/model-selector.js +490 -0
- package/dist/components/composites/model-selector/model-selector.js.map +1 -0
- package/dist/components/composites/model-selector/models.d.ts +51 -0
- package/dist/components/composites/model-selector/models.d.ts.map +1 -0
- package/dist/components/composites/model-selector/models.js +71 -0
- package/dist/components/composites/model-selector/models.js.map +1 -0
- package/dist/components/composites/plan/index.d.ts +2 -0
- package/dist/components/composites/plan/index.d.ts.map +1 -0
- package/dist/components/composites/plan/index.js +2 -0
- package/dist/components/composites/plan/plan.d.ts +61 -0
- package/dist/components/composites/plan/plan.d.ts.map +1 -0
- package/dist/components/composites/plan/plan.js +130 -0
- package/dist/components/composites/plan/plan.js.map +1 -0
- package/dist/components/composites/queue/index.d.ts +2 -0
- package/dist/components/composites/queue/index.d.ts.map +1 -0
- package/dist/components/composites/queue/index.js +2 -0
- package/dist/components/composites/queue/queue.d.ts +77 -0
- package/dist/components/composites/queue/queue.d.ts.map +1 -0
- package/dist/components/composites/queue/queue.js +271 -0
- package/dist/components/composites/queue/queue.js.map +1 -0
- package/dist/components/composites/reasoning/index.d.ts +2 -0
- package/dist/components/composites/reasoning/index.d.ts.map +1 -0
- package/dist/components/composites/reasoning/index.js +2 -0
- package/dist/components/composites/reasoning/reasoning.d.ts +62 -0
- package/dist/components/composites/reasoning/reasoning.d.ts.map +1 -0
- package/dist/components/composites/reasoning/reasoning.js +156 -0
- package/dist/components/composites/reasoning/reasoning.js.map +1 -0
- package/dist/components/composites/sources/index.d.ts +3 -0
- package/dist/components/composites/sources/index.d.ts.map +1 -0
- package/dist/components/composites/sources/index.js +3 -0
- package/dist/components/composites/sources/source.d.ts +46 -0
- package/dist/components/composites/sources/source.d.ts.map +1 -0
- package/dist/components/composites/sources/source.js +74 -0
- package/dist/components/composites/sources/source.js.map +1 -0
- package/dist/components/composites/sources/sources.d.ts +45 -0
- package/dist/components/composites/sources/sources.d.ts.map +1 -0
- package/dist/components/composites/sources/sources.js +175 -0
- package/dist/components/composites/sources/sources.js.map +1 -0
- package/dist/components/composites/stack-trace/index.d.ts +3 -0
- package/dist/components/composites/stack-trace/index.d.ts.map +1 -0
- package/dist/components/composites/stack-trace/index.js +3 -0
- package/dist/components/composites/stack-trace/parse-stack-trace.d.ts +118 -0
- package/dist/components/composites/stack-trace/parse-stack-trace.d.ts.map +1 -0
- package/dist/components/composites/stack-trace/parse-stack-trace.js +376 -0
- package/dist/components/composites/stack-trace/parse-stack-trace.js.map +1 -0
- package/dist/components/composites/stack-trace/stack-trace.d.ts +63 -0
- package/dist/components/composites/stack-trace/stack-trace.d.ts.map +1 -0
- package/dist/components/composites/stack-trace/stack-trace.js +491 -0
- package/dist/components/composites/stack-trace/stack-trace.js.map +1 -0
- package/dist/components/composites/subagent/index.d.ts +2 -0
- package/dist/components/composites/subagent/index.d.ts.map +1 -0
- package/dist/components/composites/subagent/index.js +2 -0
- package/dist/components/composites/subagent/subagent.d.ts +55 -0
- package/dist/components/composites/subagent/subagent.d.ts.map +1 -0
- package/dist/components/composites/subagent/subagent.js +138 -0
- package/dist/components/composites/subagent/subagent.js.map +1 -0
- package/dist/components/composites/suggestion/index.d.ts +2 -0
- package/dist/components/composites/suggestion/index.d.ts.map +1 -0
- package/dist/components/composites/suggestion/index.js +2 -0
- package/dist/components/composites/suggestion/suggestion.d.ts +37 -0
- package/dist/components/composites/suggestion/suggestion.d.ts.map +1 -0
- package/dist/components/composites/suggestion/suggestion.js +100 -0
- package/dist/components/composites/suggestion/suggestion.js.map +1 -0
- package/dist/components/composites/task/index.d.ts +2 -0
- package/dist/components/composites/task/index.d.ts.map +1 -0
- package/dist/components/composites/task/index.js +2 -0
- package/dist/components/composites/task/task.d.ts +96 -0
- package/dist/components/composites/task/task.d.ts.map +1 -0
- package/dist/components/composites/task/task.js +311 -0
- package/dist/components/composites/task/task.js.map +1 -0
- package/dist/components/composites/terminal/ansi.d.ts +101 -0
- package/dist/components/composites/terminal/ansi.d.ts.map +1 -0
- package/dist/components/composites/terminal/ansi.js +544 -0
- package/dist/components/composites/terminal/ansi.js.map +1 -0
- package/dist/components/composites/terminal/index.d.ts +4 -0
- package/dist/components/composites/terminal/index.d.ts.map +1 -0
- package/dist/components/composites/terminal/index.js +4 -0
- package/dist/components/composites/terminal/terminal-model.d.ts +63 -0
- package/dist/components/composites/terminal/terminal-model.d.ts.map +1 -0
- package/dist/components/composites/terminal/terminal-model.js +69 -0
- package/dist/components/composites/terminal/terminal-model.js.map +1 -0
- package/dist/components/composites/terminal/terminal.d.ts +88 -0
- package/dist/components/composites/terminal/terminal.d.ts.map +1 -0
- package/dist/components/composites/terminal/terminal.js +500 -0
- package/dist/components/composites/terminal/terminal.js.map +1 -0
- package/dist/components/composites/test-results/index.d.ts +3 -0
- package/dist/components/composites/test-results/index.d.ts.map +1 -0
- package/dist/components/composites/test-results/index.js +3 -0
- package/dist/components/composites/test-results/test-results-model.d.ts +154 -0
- package/dist/components/composites/test-results/test-results-model.d.ts.map +1 -0
- package/dist/components/composites/test-results/test-results-model.js +252 -0
- package/dist/components/composites/test-results/test-results-model.js.map +1 -0
- package/dist/components/composites/test-results/test-results.d.ts +60 -0
- package/dist/components/composites/test-results/test-results.d.ts.map +1 -0
- package/dist/components/composites/test-results/test-results.js +631 -0
- package/dist/components/composites/test-results/test-results.js.map +1 -0
- package/dist/components/composites/tool/format-tool-value.d.ts +37 -0
- package/dist/components/composites/tool/format-tool-value.d.ts.map +1 -0
- package/dist/components/composites/tool/format-tool-value.js +135 -0
- package/dist/components/composites/tool/format-tool-value.js.map +1 -0
- package/dist/components/composites/tool/index.d.ts +3 -0
- package/dist/components/composites/tool/index.d.ts.map +1 -0
- package/dist/components/composites/tool/index.js +3 -0
- package/dist/components/composites/tool/tool.d.ts +69 -0
- package/dist/components/composites/tool/tool.d.ts.map +1 -0
- package/dist/components/composites/tool/tool.js +214 -0
- package/dist/components/composites/tool/tool.js.map +1 -0
- package/dist/components/composites/update-dialog/update-dialog.js +1 -1
- package/dist/components/conversation/conversation-surface.d.ts +7 -0
- package/dist/components/conversation/conversation-surface.d.ts.map +1 -1
- package/dist/components/conversation/conversation-surface.js +2 -0
- package/dist/components/conversation/conversation-surface.js.map +1 -1
- package/dist/components/conversation/scroll-follow-core.d.ts +24 -0
- package/dist/components/conversation/scroll-follow-core.d.ts.map +1 -1
- package/dist/components/conversation/scroll-follow-core.js +23 -1
- package/dist/components/conversation/scroll-follow-core.js.map +1 -1
- package/dist/components/conversation/scroll-follow.d.ts +3 -0
- package/dist/components/conversation/scroll-follow.d.ts.map +1 -1
- package/dist/components/conversation/scroll-follow.js +80 -1
- package/dist/components/conversation/scroll-follow.js.map +1 -1
- package/dist/components/ui/attachment/attachment.d.ts +58 -0
- package/dist/components/ui/attachment/attachment.d.ts.map +1 -0
- package/dist/components/ui/attachment/attachment.js +279 -0
- package/dist/components/ui/attachment/attachment.js.map +1 -0
- package/dist/components/ui/attachment/index.d.ts +2 -0
- package/dist/components/ui/attachment/index.d.ts.map +1 -0
- package/dist/components/ui/attachment/index.js +2 -0
- package/dist/components/ui/badge/badge.d.ts +1 -1
- package/dist/components/ui/bubble/bubble.d.ts +33 -0
- package/dist/components/ui/bubble/bubble.d.ts.map +1 -0
- package/dist/components/ui/bubble/bubble.js +95 -0
- package/dist/components/ui/bubble/bubble.js.map +1 -0
- package/dist/components/ui/bubble/index.d.ts +2 -0
- package/dist/components/ui/bubble/index.d.ts.map +1 -0
- package/dist/components/ui/bubble/index.js +2 -0
- package/dist/components/ui/button/button.d.ts +1 -1
- package/dist/components/ui/code-block/code-block.d.ts +56 -3
- package/dist/components/ui/code-block/code-block.d.ts.map +1 -1
- package/dist/components/ui/code-block/code-block.js +231 -50
- package/dist/components/ui/code-block/code-block.js.map +1 -1
- package/dist/components/ui/code-block/index.d.ts +1 -1
- package/dist/components/ui/code-block/index.d.ts.map +1 -1
- package/dist/components/ui/code-block/index.js +2 -2
- package/dist/components/ui/field/number-field.d.ts +21 -4
- package/dist/components/ui/field/number-field.d.ts.map +1 -1
- package/dist/components/ui/field/number-field.js +22 -11
- package/dist/components/ui/field/number-field.js.map +1 -1
- package/dist/components/ui/marker/index.d.ts +2 -0
- package/dist/components/ui/marker/index.d.ts.map +1 -0
- package/dist/components/ui/marker/index.js +2 -0
- package/dist/components/ui/marker/marker.d.ts +35 -0
- package/dist/components/ui/marker/marker.d.ts.map +1 -0
- package/dist/components/ui/marker/marker.js +123 -0
- package/dist/components/ui/marker/marker.js.map +1 -0
- package/dist/components/ui/message/cite-ranges.d.ts +42 -0
- package/dist/components/ui/message/cite-ranges.d.ts.map +1 -0
- package/dist/components/ui/message/cite-ranges.js +105 -0
- package/dist/components/ui/message/cite-ranges.js.map +1 -0
- package/dist/components/ui/message/index.d.ts +4 -0
- package/dist/components/ui/message/index.d.ts.map +1 -0
- package/dist/components/ui/message/index.js +4 -0
- package/dist/components/ui/message/message.d.ts +95 -0
- package/dist/components/ui/message/message.d.ts.map +1 -0
- package/dist/components/ui/message/message.js +443 -0
- package/dist/components/ui/message/message.js.map +1 -0
- package/dist/components/ui/message/parse-message-text.d.ts +93 -0
- package/dist/components/ui/message/parse-message-text.d.ts.map +1 -0
- package/dist/components/ui/message/parse-message-text.js +365 -0
- package/dist/components/ui/message/parse-message-text.js.map +1 -0
- package/dist/components/ui/questionnaire/index.d.ts +2 -0
- package/dist/components/ui/questionnaire/index.d.ts.map +1 -0
- package/dist/components/ui/questionnaire/index.js +2 -0
- package/dist/components/ui/questionnaire/questionnaire.d.ts +83 -0
- package/dist/components/ui/questionnaire/questionnaire.d.ts.map +1 -0
- package/dist/components/ui/questionnaire/questionnaire.js +470 -0
- package/dist/components/ui/questionnaire/questionnaire.js.map +1 -0
- package/dist/components/ui/status-chip/status-chip.d.ts +1 -1
- package/dist/components/ui/switch/switch.js +11 -11
- package/dist/components/ui/switch/switch.js.map +1 -1
- package/dist/components/ui/trace/index.d.ts +2 -0
- package/dist/components/ui/trace/index.d.ts.map +1 -0
- package/dist/components/ui/trace/index.js +2 -0
- package/dist/components/ui/trace/trace.d.ts +72 -0
- package/dist/components/ui/trace/trace.d.ts.map +1 -0
- package/dist/components/ui/trace/trace.js +340 -0
- package/dist/components/ui/trace/trace.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -5
- package/dist/r/attachment.json +25 -0
- package/dist/r/bubble.json +22 -0
- package/dist/r/chain-of-thought.json +26 -0
- package/dist/r/chat.json +24 -0
- package/dist/r/checkpoint.json +35 -0
- package/dist/r/confirmation.json +34 -0
- package/dist/r/context.json +33 -0
- package/dist/r/file-tree.json +32 -0
- package/dist/r/inline-citation.json +35 -0
- package/dist/r/marker.json +22 -0
- package/dist/r/message-scroller.json +31 -0
- package/dist/r/message.json +33 -0
- package/dist/r/model-selector.json +34 -0
- package/dist/r/plan.json +26 -0
- package/dist/r/questionnaire.json +28 -0
- package/dist/r/queue.json +26 -0
- package/dist/r/reasoning.json +26 -0
- package/dist/r/registry.json +811 -52
- package/dist/r/sources.json +32 -0
- package/dist/r/src/components/composites/chain-of-thought/chain-of-thought.tsx +141 -0
- package/dist/r/src/components/composites/chain-of-thought/index.ts +11 -0
- package/dist/r/src/components/composites/chat/chat.tsx +190 -0
- package/dist/r/src/components/composites/chat/index.ts +11 -0
- package/dist/r/src/components/composites/checkpoint/checkpoint-model.ts +71 -0
- package/dist/r/src/components/composites/checkpoint/checkpoint.tsx +214 -0
- package/dist/r/src/components/composites/checkpoint/index.ts +8 -0
- package/dist/r/src/components/composites/confirmation/confirmation-model.ts +83 -0
- package/dist/r/src/components/composites/confirmation/confirmation.tsx +311 -0
- package/dist/r/src/components/composites/confirmation/index.ts +9 -0
- package/dist/r/src/components/composites/context/context-model.ts +168 -0
- package/dist/r/src/components/composites/context/context.tsx +187 -0
- package/dist/r/src/components/composites/context/index.ts +18 -0
- package/dist/r/src/components/composites/file-tree/build-file-tree.ts +456 -0
- package/dist/r/src/components/composites/file-tree/file-tree.tsx +405 -0
- package/dist/r/src/components/composites/file-tree/index.ts +25 -0
- package/dist/r/src/components/composites/inline-citation/citation.ts +78 -0
- package/dist/r/src/components/composites/inline-citation/index.ts +9 -0
- package/dist/r/src/components/composites/inline-citation/inline-citation.tsx +285 -0
- package/dist/r/src/components/composites/message-scroller/index.ts +2 -0
- package/dist/r/src/components/composites/message-scroller/message-scroller.tsx +301 -0
- package/dist/r/src/components/composites/message-scroller/scroll-anchor.ts +170 -0
- package/dist/r/src/components/composites/model-selector/index.ts +14 -0
- package/dist/r/src/components/composites/model-selector/model-selector.tsx +420 -0
- package/dist/r/src/components/composites/model-selector/models.ts +103 -0
- package/dist/r/src/components/composites/plan/index.ts +1 -0
- package/dist/r/src/components/composites/plan/plan.tsx +155 -0
- package/dist/r/src/components/composites/queue/index.ts +10 -0
- package/dist/r/src/components/composites/queue/queue.tsx +264 -0
- package/dist/r/src/components/composites/reasoning/index.ts +1 -0
- package/dist/r/src/components/composites/reasoning/reasoning.tsx +176 -0
- package/dist/r/src/components/composites/sources/index.ts +11 -0
- package/dist/r/src/components/composites/sources/source.ts +116 -0
- package/dist/r/src/components/composites/sources/sources.tsx +163 -0
- package/dist/r/src/components/composites/stack-trace/index.ts +19 -0
- package/dist/r/src/components/composites/stack-trace/parse-stack-trace.ts +507 -0
- package/dist/r/src/components/composites/stack-trace/stack-trace.tsx +395 -0
- package/dist/r/src/components/composites/subagent/index.ts +1 -0
- package/dist/r/src/components/composites/subagent/subagent.tsx +159 -0
- package/dist/r/src/components/composites/suggestion/index.ts +1 -0
- package/dist/r/src/components/composites/suggestion/suggestion.tsx +140 -0
- package/dist/r/src/components/composites/task/index.ts +14 -0
- package/dist/r/src/components/composites/task/task.tsx +317 -0
- package/dist/r/src/components/composites/terminal/ansi.ts +674 -0
- package/dist/r/src/components/composites/terminal/index.ts +20 -0
- package/dist/r/src/components/composites/terminal/terminal-model.ts +111 -0
- package/dist/r/src/components/composites/terminal/terminal.tsx +574 -0
- package/dist/r/src/components/composites/test-results/index.ts +20 -0
- package/dist/r/src/components/composites/test-results/test-results-model.ts +368 -0
- package/dist/r/src/components/composites/test-results/test-results.tsx +586 -0
- package/dist/r/src/components/composites/tool/format-tool-value.ts +221 -0
- package/dist/r/src/components/composites/tool/index.ts +2 -0
- package/dist/r/src/components/composites/tool/tool.tsx +228 -0
- package/dist/r/src/components/conversation/conversation-surface.tsx +9 -0
- package/dist/r/src/components/conversation/scroll-follow-core.ts +31 -0
- package/dist/r/src/components/conversation/scroll-follow.ts +92 -0
- package/dist/r/src/components/ui/attachment/attachment.tsx +282 -0
- package/dist/r/src/components/ui/attachment/index.ts +10 -0
- package/dist/r/src/components/ui/bubble/bubble.tsx +86 -0
- package/dist/r/src/components/ui/bubble/index.ts +1 -0
- package/dist/r/src/components/ui/code-block/code-block.tsx +256 -26
- package/dist/r/src/components/ui/code-block/index.ts +9 -1
- package/dist/r/src/components/ui/field/number-field.tsx +51 -14
- package/dist/r/src/components/ui/marker/index.ts +1 -0
- package/dist/r/src/components/ui/marker/marker.tsx +90 -0
- package/dist/r/src/components/ui/message/cite-ranges.ts +144 -0
- package/dist/r/src/components/ui/message/index.ts +23 -0
- package/dist/r/src/components/ui/message/message.tsx +434 -0
- package/dist/r/src/components/ui/message/parse-message-text.ts +450 -0
- package/dist/r/src/components/ui/questionnaire/index.ts +10 -0
- package/dist/r/src/components/ui/questionnaire/questionnaire.tsx +446 -0
- package/dist/r/src/components/ui/trace/index.ts +9 -0
- package/dist/r/src/components/ui/trace/trace.tsx +334 -0
- package/dist/r/src/styles/base.css +34 -0
- package/dist/r/stack-trace.json +32 -0
- package/dist/r/subagent.json +27 -0
- package/dist/r/suggestion.json +24 -0
- package/dist/r/task.json +28 -0
- package/dist/r/terminal.json +35 -0
- package/dist/r/test-results.json +33 -0
- package/dist/r/tool.json +31 -0
- package/dist/r/trace.json +25 -0
- package/package.json +6 -3
- package/registry.json +811 -52
- package/src/components/composites/chain-of-thought/chain-of-thought.tsx +141 -0
- package/src/components/composites/chain-of-thought/index.ts +11 -0
- package/src/components/composites/chat/chat.tsx +190 -0
- package/src/components/composites/chat/index.ts +11 -0
- package/src/components/composites/checkpoint/checkpoint-model.ts +71 -0
- package/src/components/composites/checkpoint/checkpoint.tsx +214 -0
- package/src/components/composites/checkpoint/index.ts +8 -0
- package/src/components/composites/confirmation/confirmation-model.ts +83 -0
- package/src/components/composites/confirmation/confirmation.tsx +311 -0
- package/src/components/composites/confirmation/index.ts +9 -0
- package/src/components/composites/context/context-model.ts +168 -0
- package/src/components/composites/context/context.tsx +187 -0
- package/src/components/composites/context/index.ts +18 -0
- package/src/components/composites/file-tree/build-file-tree.ts +456 -0
- package/src/components/composites/file-tree/file-tree.tsx +405 -0
- package/src/components/composites/file-tree/index.ts +25 -0
- package/src/components/composites/inline-citation/citation.ts +78 -0
- package/src/components/composites/inline-citation/index.ts +9 -0
- package/src/components/composites/inline-citation/inline-citation.tsx +285 -0
- package/src/components/composites/message-scroller/index.ts +2 -0
- package/src/components/composites/message-scroller/message-scroller.tsx +301 -0
- package/src/components/composites/message-scroller/scroll-anchor.ts +170 -0
- package/src/components/composites/model-selector/index.ts +14 -0
- package/src/components/composites/model-selector/model-selector.tsx +420 -0
- package/src/components/composites/model-selector/models.ts +103 -0
- package/src/components/composites/plan/index.ts +1 -0
- package/src/components/composites/plan/plan.tsx +155 -0
- package/src/components/composites/queue/index.ts +10 -0
- package/src/components/composites/queue/queue.tsx +264 -0
- package/src/components/composites/reasoning/index.ts +1 -0
- package/src/components/composites/reasoning/reasoning.tsx +176 -0
- package/src/components/composites/sources/index.ts +11 -0
- package/src/components/composites/sources/source.ts +116 -0
- package/src/components/composites/sources/sources.tsx +163 -0
- package/src/components/composites/stack-trace/index.ts +19 -0
- package/src/components/composites/stack-trace/parse-stack-trace.ts +507 -0
- package/src/components/composites/stack-trace/stack-trace.tsx +395 -0
- package/src/components/composites/subagent/index.ts +1 -0
- package/src/components/composites/subagent/subagent.tsx +159 -0
- package/src/components/composites/suggestion/index.ts +1 -0
- package/src/components/composites/suggestion/suggestion.tsx +140 -0
- package/src/components/composites/task/index.ts +14 -0
- package/src/components/composites/task/task.tsx +317 -0
- package/src/components/composites/terminal/ansi.ts +674 -0
- package/src/components/composites/terminal/index.ts +20 -0
- package/src/components/composites/terminal/terminal-model.ts +111 -0
- package/src/components/composites/terminal/terminal.tsx +574 -0
- package/src/components/composites/test-results/index.ts +20 -0
- package/src/components/composites/test-results/test-results-model.ts +368 -0
- package/src/components/composites/test-results/test-results.tsx +586 -0
- package/src/components/composites/tool/format-tool-value.ts +221 -0
- package/src/components/composites/tool/index.ts +2 -0
- package/src/components/composites/tool/tool.tsx +228 -0
- package/src/components/conversation/conversation-surface.tsx +9 -0
- package/src/components/conversation/scroll-follow-core.ts +31 -0
- package/src/components/conversation/scroll-follow.ts +92 -0
- package/src/components/ui/attachment/attachment.tsx +282 -0
- package/src/components/ui/attachment/index.ts +10 -0
- package/src/components/ui/bubble/bubble.tsx +86 -0
- package/src/components/ui/bubble/index.ts +1 -0
- package/src/components/ui/code-block/code-block.tsx +256 -26
- package/src/components/ui/code-block/index.ts +9 -1
- package/src/components/ui/field/number-field.tsx +51 -14
- package/src/components/ui/marker/index.ts +1 -0
- package/src/components/ui/marker/marker.tsx +90 -0
- package/src/components/ui/message/cite-ranges.ts +144 -0
- package/src/components/ui/message/index.ts +23 -0
- package/src/components/ui/message/message.tsx +434 -0
- package/src/components/ui/message/parse-message-text.ts +450 -0
- package/src/components/ui/questionnaire/index.ts +10 -0
- package/src/components/ui/questionnaire/questionnaire.tsx +446 -0
- package/src/components/ui/trace/index.ts +9 -0
- package/src/components/ui/trace/trace.tsx +334 -0
- package/src/index.ts +26 -0
- package/src/styles/base.css +34 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export { TestResults, TEST_RESULTS_LIST_LIMIT, type TestResultsProps } from './test-results'
|
|
2
|
+
export {
|
|
3
|
+
describeCount,
|
|
4
|
+
firstFailureKey,
|
|
5
|
+
formatDuration as formatTestDuration,
|
|
6
|
+
listedCounts,
|
|
7
|
+
reconcileCounts,
|
|
8
|
+
suiteKey,
|
|
9
|
+
suiteState,
|
|
10
|
+
testKey,
|
|
11
|
+
type CountLine,
|
|
12
|
+
type ListedCounts,
|
|
13
|
+
type RunCounts,
|
|
14
|
+
type SuiteState,
|
|
15
|
+
type TestCase,
|
|
16
|
+
type TestCaseStatus,
|
|
17
|
+
type TestOutcome,
|
|
18
|
+
type TestSuite,
|
|
19
|
+
type TestSummary,
|
|
20
|
+
} from './test-results-model'
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The test run's pure rules: what the listed tests add up to, how that compares
|
|
3
|
+
* with the counts the host reported, and how a duration is said.
|
|
4
|
+
*
|
|
5
|
+
* The one rule that shapes everything here is that a count is a claim. There are
|
|
6
|
+
* two honest sources for one — the host's own tally (`summary`), and the tests it
|
|
7
|
+
* chose to list — and they are allowed to disagree: a host may list only the
|
|
8
|
+
* failures, a runner may count tests it did not stream, a suite may have been cut
|
|
9
|
+
* short. So nothing is silently recomputed. A supplied count is shown as given; if
|
|
10
|
+
* the tests listed do not add up to it, the listed number is shown beside it; and
|
|
11
|
+
* when no summary was supplied, the counts that are shown are labelled as coming
|
|
12
|
+
* from the tests listed, not presented as the run's totals.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export type TestOutcome = 'passed' | 'failed' | 'skipped'
|
|
16
|
+
/** `running` and `pending` are states of a test that has no outcome yet; they are not counted. */
|
|
17
|
+
export type TestCaseStatus = TestOutcome | 'running' | 'pending'
|
|
18
|
+
|
|
19
|
+
export type TestCase = Readonly<{
|
|
20
|
+
/** Stable identity for keyed rendering. Defaults to the position. */
|
|
21
|
+
id?: string
|
|
22
|
+
name: string
|
|
23
|
+
/** Absent means the host did not say; the test is listed and nothing is claimed. */
|
|
24
|
+
status?: TestCaseStatus
|
|
25
|
+
durationMs?: number
|
|
26
|
+
/** The failure message, as text. */
|
|
27
|
+
message?: string
|
|
28
|
+
/** A stack trace for `StackTrace` to read. */
|
|
29
|
+
stack?: string
|
|
30
|
+
/** A unified diff of expected against actual for `DiffBlock`. */
|
|
31
|
+
diff?: string
|
|
32
|
+
}>
|
|
33
|
+
|
|
34
|
+
export type TestSuite = Readonly<{
|
|
35
|
+
id?: string
|
|
36
|
+
name: string
|
|
37
|
+
/** The file the suite lives in, shown as text. */
|
|
38
|
+
file?: string
|
|
39
|
+
durationMs?: number
|
|
40
|
+
tests?: readonly TestCase[]
|
|
41
|
+
suites?: readonly TestSuite[]
|
|
42
|
+
}>
|
|
43
|
+
|
|
44
|
+
/** The host's own tally. Every field is optional; only supplied ones are shown. */
|
|
45
|
+
export type TestSummary = Readonly<{
|
|
46
|
+
passed?: number
|
|
47
|
+
failed?: number
|
|
48
|
+
skipped?: number
|
|
49
|
+
total?: number
|
|
50
|
+
durationMs?: number
|
|
51
|
+
}>
|
|
52
|
+
|
|
53
|
+
export type ListedCounts = Readonly<{
|
|
54
|
+
passed: number
|
|
55
|
+
failed: number
|
|
56
|
+
skipped: number
|
|
57
|
+
running: number
|
|
58
|
+
pending: number
|
|
59
|
+
/** Tests listed with no status. */
|
|
60
|
+
unknown: number
|
|
61
|
+
/** Every test listed, whatever its status. */
|
|
62
|
+
total: number
|
|
63
|
+
}>
|
|
64
|
+
|
|
65
|
+
const empty: ListedCounts = {
|
|
66
|
+
passed: 0,
|
|
67
|
+
failed: 0,
|
|
68
|
+
skipped: 0,
|
|
69
|
+
running: 0,
|
|
70
|
+
pending: 0,
|
|
71
|
+
unknown: 0,
|
|
72
|
+
total: 0,
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const KNOWN_STATUSES: ReadonlySet<string> = new Set([
|
|
76
|
+
'passed',
|
|
77
|
+
'failed',
|
|
78
|
+
'skipped',
|
|
79
|
+
'running',
|
|
80
|
+
'pending',
|
|
81
|
+
])
|
|
82
|
+
|
|
83
|
+
/** Count the tests in a list of suites, at any depth. Iterative: suites come from a host. */
|
|
84
|
+
export function listedCounts(suites: readonly TestSuite[]): ListedCounts {
|
|
85
|
+
const counts = { ...empty }
|
|
86
|
+
const stack = [...suites]
|
|
87
|
+
while (stack.length > 0) {
|
|
88
|
+
const suite = stack.pop()!
|
|
89
|
+
for (const test of suite.tests ?? []) {
|
|
90
|
+
counts.total += 1
|
|
91
|
+
// A status the host invented is as good as none.
|
|
92
|
+
if (test.status !== undefined && KNOWN_STATUSES.has(test.status)) counts[test.status] += 1
|
|
93
|
+
else counts.unknown += 1
|
|
94
|
+
}
|
|
95
|
+
for (const child of suite.suites ?? []) stack.push(child)
|
|
96
|
+
}
|
|
97
|
+
return counts
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export type CountLine = Readonly<{
|
|
101
|
+
outcome: TestOutcome
|
|
102
|
+
/** The number to show: the host's if it gave one, otherwise the listed one. */
|
|
103
|
+
count: number
|
|
104
|
+
/** How many tests of this outcome are listed. */
|
|
105
|
+
listed: number
|
|
106
|
+
/** The host gave a count and the list does not agree with it. */
|
|
107
|
+
differs: boolean
|
|
108
|
+
}>
|
|
109
|
+
|
|
110
|
+
export type RunCounts = Readonly<{
|
|
111
|
+
/** Whose numbers these are. `listed` must be labelled as such. */
|
|
112
|
+
basis: 'reported' | 'listed'
|
|
113
|
+
lines: readonly CountLine[]
|
|
114
|
+
/** The host's total, when supplied. */
|
|
115
|
+
reportedTotal?: number
|
|
116
|
+
/** The reported total, when the host gave one and the list disagrees. */
|
|
117
|
+
totalNote?: Readonly<{ reported: number; listed: number }>
|
|
118
|
+
}>
|
|
119
|
+
|
|
120
|
+
function validCount(value: unknown): value is number {
|
|
121
|
+
return typeof value === 'number' && Number.isInteger(value) && value >= 0
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const OUTCOMES: readonly TestOutcome[] = ['failed', 'passed', 'skipped']
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Decide which numbers to show.
|
|
128
|
+
*
|
|
129
|
+
* With a summary: exactly the counts it supplied, as given. `differs` is set
|
|
130
|
+
* when tests are listed at all and the listed number for that outcome is not the
|
|
131
|
+
* supplied one — a host that lists only failures will see "40 passed (0 listed)",
|
|
132
|
+
* which is true and tells the reader the list is partial. Without a summary: the
|
|
133
|
+
* outcomes that occur among the listed tests, with `basis: 'listed'`.
|
|
134
|
+
*/
|
|
135
|
+
export function reconcileCounts(summary: TestSummary | undefined, listed: ListedCounts): RunCounts {
|
|
136
|
+
const supplied = OUTCOMES.filter((outcome) => validCount(summary?.[outcome]))
|
|
137
|
+
const hasTotal = validCount(summary?.total)
|
|
138
|
+
|
|
139
|
+
if (summary && (supplied.length > 0 || hasTotal)) {
|
|
140
|
+
const lines: CountLine[] = supplied.map((outcome) => {
|
|
141
|
+
const count = summary[outcome] as number
|
|
142
|
+
return {
|
|
143
|
+
outcome,
|
|
144
|
+
count,
|
|
145
|
+
listed: listed[outcome],
|
|
146
|
+
differs: listed.total > 0 && listed[outcome] !== count,
|
|
147
|
+
}
|
|
148
|
+
})
|
|
149
|
+
const totalNote =
|
|
150
|
+
hasTotal && listed.total > 0 && summary.total !== listed.total
|
|
151
|
+
? { reported: summary.total as number, listed: listed.total }
|
|
152
|
+
: undefined
|
|
153
|
+
return {
|
|
154
|
+
basis: 'reported',
|
|
155
|
+
lines,
|
|
156
|
+
...(hasTotal && { reportedTotal: summary.total as number }),
|
|
157
|
+
...(totalNote && { totalNote }),
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const lines: CountLine[] = OUTCOMES.filter((outcome) => listed[outcome] > 0).map((outcome) => ({
|
|
162
|
+
outcome,
|
|
163
|
+
count: listed[outcome],
|
|
164
|
+
listed: listed[outcome],
|
|
165
|
+
differs: false,
|
|
166
|
+
}))
|
|
167
|
+
return { basis: 'listed', lines }
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** The words for one count: "38 passed", or "40 passed (38 listed)" when the list disagrees. */
|
|
171
|
+
export function describeCount(line: CountLine): string {
|
|
172
|
+
const base = `${line.count.toLocaleString()} ${line.outcome}`
|
|
173
|
+
return line.differs ? `${base} (${line.listed.toLocaleString()} listed)` : base
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const plural = (n: number, one: string) => (n === 1 ? one : `${one}s`)
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* A duration. `short` is for a meta column ("120 ms", "3.4 s"); `long` is for a
|
|
180
|
+
* sentence ("120 milliseconds", "3.4 seconds", "2 minutes 5 seconds"). Anything
|
|
181
|
+
* that is not a finite non-negative number has no duration, so none is drawn.
|
|
182
|
+
*/
|
|
183
|
+
export function formatDuration(ms: unknown, style: 'short' | 'long' = 'short'): string | undefined {
|
|
184
|
+
if (typeof ms !== 'number' || !Number.isFinite(ms) || ms < 0) return undefined
|
|
185
|
+
if (ms > 0 && ms < 1) return style === 'short' ? '<1 ms' : 'less than 1 millisecond'
|
|
186
|
+
if (ms < 1000) {
|
|
187
|
+
const whole = Math.round(ms)
|
|
188
|
+
return style === 'short' ? `${whole} ms` : `${whole} ${plural(whole, 'millisecond')}`
|
|
189
|
+
}
|
|
190
|
+
if (ms < 60_000) {
|
|
191
|
+
const seconds = ms < 10_000 ? Math.round(ms / 100) / 10 : Math.round(ms / 1000)
|
|
192
|
+
const text = Number.isInteger(seconds) ? String(seconds) : seconds.toFixed(1)
|
|
193
|
+
return style === 'short' ? `${text} s` : `${text} ${seconds === 1 ? 'second' : 'seconds'}`
|
|
194
|
+
}
|
|
195
|
+
const totalSeconds = Math.round(ms / 1000)
|
|
196
|
+
const minutes = Math.floor(totalSeconds / 60)
|
|
197
|
+
const seconds = totalSeconds % 60
|
|
198
|
+
if (style === 'short') return seconds === 0 ? `${minutes} min` : `${minutes} min ${seconds} s`
|
|
199
|
+
const m = `${minutes.toLocaleString()} ${plural(minutes, 'minute')}`
|
|
200
|
+
return seconds === 0 ? m : `${m} ${seconds} ${plural(seconds, 'second')}`
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export type SuiteState = 'failed' | 'passed' | 'running' | undefined
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* What a suite can say about itself from the tests listed in it. Any listed
|
|
207
|
+
* failure makes it `failed`; a listed test still running makes it `running`;
|
|
208
|
+
* `passed` needs at least one passed test and every listed test to be passed or
|
|
209
|
+
* skipped. Anything else — no tests, a test with no status — is silence.
|
|
210
|
+
*/
|
|
211
|
+
export function suiteState(counts: ListedCounts): SuiteState {
|
|
212
|
+
if (counts.failed > 0) return 'failed'
|
|
213
|
+
if (counts.running > 0) return 'running'
|
|
214
|
+
if (counts.passed > 0 && counts.pending === 0 && counts.unknown === 0) return 'passed'
|
|
215
|
+
return undefined
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/** A suite's key among its siblings: its id if it has one, otherwise its position. */
|
|
219
|
+
export function suiteKey(parent: string, suite: TestSuite, index: number): string {
|
|
220
|
+
return `${parent}/${suite.id ?? `s${index}`}`
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export function testKey(parent: string, test: TestCase, index: number): string {
|
|
224
|
+
return `${parent}:${test.id ?? `t${index}`}`
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/** Distinguish repeated ids without tying a row to the object instance it renders. */
|
|
228
|
+
export function repeatedKey(key: string, occurrence: number): string {
|
|
229
|
+
return JSON.stringify([key, occurrence])
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* A row's identity among its siblings only: the host id verbatim, or its
|
|
234
|
+
* position when it has none. The leading letter keeps the two apart, so an id
|
|
235
|
+
* that looks like a position never collides with one. A row's place in the tree
|
|
236
|
+
* is the list of these keys from the root, never one string that nests its
|
|
237
|
+
* parent's, so a key stays as long as its own id however deep the row sits.
|
|
238
|
+
*/
|
|
239
|
+
export function siblingKey(item: Readonly<{ id?: string }>, index: number): string {
|
|
240
|
+
return item.id === undefined ? `p${index}` : `i${item.id}`
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
export type BoundedEntry<T> = Readonly<{
|
|
244
|
+
key: string
|
|
245
|
+
item: T
|
|
246
|
+
index: number
|
|
247
|
+
}>
|
|
248
|
+
|
|
249
|
+
/** Build keyed rows only for the currently visible prefix of a bounded list. */
|
|
250
|
+
export function boundedEntries<T>(
|
|
251
|
+
items: readonly T[],
|
|
252
|
+
visibleCount: number,
|
|
253
|
+
itemKey: (item: T, index: number) => string
|
|
254
|
+
): Readonly<{
|
|
255
|
+
entries: readonly BoundedEntry<T>[]
|
|
256
|
+
byKey: ReadonlyMap<string, BoundedEntry<T>>
|
|
257
|
+
}> {
|
|
258
|
+
const entries: BoundedEntry<T>[] = []
|
|
259
|
+
const byKey = new Map<string, BoundedEntry<T>>()
|
|
260
|
+
const occurrences = new Map<string, number>()
|
|
261
|
+
const count = Math.max(0, Math.min(items.length, Math.floor(visibleCount)))
|
|
262
|
+
|
|
263
|
+
for (let index = 0; index < count; index += 1) {
|
|
264
|
+
const item = items[index]!
|
|
265
|
+
const base = itemKey(item, index)
|
|
266
|
+
const occurrence = occurrences.get(base) ?? 0
|
|
267
|
+
occurrences.set(base, occurrence + 1)
|
|
268
|
+
const entry = { key: repeatedKey(base, occurrence), item, index }
|
|
269
|
+
entries.push(entry)
|
|
270
|
+
byKey.set(entry.key, entry)
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
return { entries, byKey }
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/** The key of the first failing test in reading order. */
|
|
277
|
+
export function firstFailureKey(suites: readonly TestSuite[]): string | undefined {
|
|
278
|
+
type Frame = { suites: readonly TestSuite[]; parent: string; index: number }
|
|
279
|
+
const stack: Frame[] = [{ suites, parent: '', index: 0 }]
|
|
280
|
+
while (stack.length > 0) {
|
|
281
|
+
const frame = stack[stack.length - 1]!
|
|
282
|
+
const suite = frame.suites[frame.index]
|
|
283
|
+
if (!suite) {
|
|
284
|
+
stack.pop()
|
|
285
|
+
continue
|
|
286
|
+
}
|
|
287
|
+
frame.index += 1
|
|
288
|
+
const key = suiteKey(frame.parent, suite, frame.index - 1)
|
|
289
|
+
for (let i = 0; i < (suite.tests?.length ?? 0); i += 1) {
|
|
290
|
+
if (suite.tests![i]!.status === 'failed') return testKey(key, suite.tests![i]!, i)
|
|
291
|
+
}
|
|
292
|
+
if (suite.suites?.length) stack.push({ suites: suite.suites, parent: key, index: 0 })
|
|
293
|
+
}
|
|
294
|
+
return undefined
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
export type FirstFailureRenderPath = Readonly<{
|
|
298
|
+
/**
|
|
299
|
+
* The rendering key of each suite from the root through the suite containing
|
|
300
|
+
* the failure, one entry per level. A key is unique among its siblings, so
|
|
301
|
+
* a suite is on the path when its entry at its own depth is its key and its
|
|
302
|
+
* parent was on the path.
|
|
303
|
+
*/
|
|
304
|
+
suites: readonly string[]
|
|
305
|
+
/** The failed test's rendering key among the tests of the last suite on the path. */
|
|
306
|
+
test: string
|
|
307
|
+
}>
|
|
308
|
+
|
|
309
|
+
/** True when both describe the same failure at the same place in the tree. */
|
|
310
|
+
export function sameFailure(
|
|
311
|
+
left: FirstFailureRenderPath | undefined,
|
|
312
|
+
right: FirstFailureRenderPath | undefined
|
|
313
|
+
): boolean {
|
|
314
|
+
if (left === right) return true
|
|
315
|
+
if (!left || !right) return false
|
|
316
|
+
if (left.test !== right.test || left.suites.length !== right.suites.length) return false
|
|
317
|
+
for (let index = 0; index < left.suites.length; index += 1)
|
|
318
|
+
if (left.suites[index] !== right.suites[index]) return false
|
|
319
|
+
return true
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* The first failure's unique rendering keys, including its ancestor suites. The
|
|
324
|
+
* work is linear in the suites visited and the path it returns is linear in the
|
|
325
|
+
* depth, so a long chain of nested suites costs no more than a wide list.
|
|
326
|
+
*/
|
|
327
|
+
export function firstFailureRenderPath(
|
|
328
|
+
suites: readonly TestSuite[]
|
|
329
|
+
): FirstFailureRenderPath | undefined {
|
|
330
|
+
type Frame = {
|
|
331
|
+
suites: readonly TestSuite[]
|
|
332
|
+
index: number
|
|
333
|
+
occurrences: Map<string, number>
|
|
334
|
+
/** The rendering key of the suite these are the children of; absent at the root. */
|
|
335
|
+
key?: string
|
|
336
|
+
}
|
|
337
|
+
const stack: Frame[] = [{ suites, index: 0, occurrences: new Map() }]
|
|
338
|
+
while (stack.length > 0) {
|
|
339
|
+
const frame = stack[stack.length - 1]!
|
|
340
|
+
const suite = frame.suites[frame.index]
|
|
341
|
+
if (!suite) {
|
|
342
|
+
stack.pop()
|
|
343
|
+
continue
|
|
344
|
+
}
|
|
345
|
+
frame.index += 1
|
|
346
|
+
const base = siblingKey(suite, frame.index - 1)
|
|
347
|
+
const occurrence = frame.occurrences.get(base) ?? 0
|
|
348
|
+
frame.occurrences.set(base, occurrence + 1)
|
|
349
|
+
const key = repeatedKey(base, occurrence)
|
|
350
|
+
const tests = suite.tests ?? []
|
|
351
|
+
const testOccurrences = new Map<string, number>()
|
|
352
|
+
for (let i = 0; i < tests.length; i += 1) {
|
|
353
|
+
const testBase = siblingKey(tests[i]!, i)
|
|
354
|
+
const testOccurrence = testOccurrences.get(testBase) ?? 0
|
|
355
|
+
testOccurrences.set(testBase, testOccurrence + 1)
|
|
356
|
+
if (tests[i]!.status === 'failed') {
|
|
357
|
+
const path: string[] = []
|
|
358
|
+
for (let depth = 1; depth < stack.length; depth += 1) path.push(stack[depth]!.key!)
|
|
359
|
+
path.push(key)
|
|
360
|
+
return { suites: path, test: repeatedKey(testBase, testOccurrence) }
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
if (suite.suites?.length) {
|
|
364
|
+
stack.push({ suites: suite.suites, index: 0, occurrences: new Map(), key })
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
return undefined
|
|
368
|
+
}
|