@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,395 @@
|
|
|
1
|
+
import { Check, CircleAlert, Copy, Package } from 'lucide-solid'
|
|
2
|
+
import {
|
|
3
|
+
createMemo,
|
|
4
|
+
createSignal,
|
|
5
|
+
For,
|
|
6
|
+
Match,
|
|
7
|
+
Show,
|
|
8
|
+
splitProps,
|
|
9
|
+
Switch,
|
|
10
|
+
type ComponentProps,
|
|
11
|
+
} from 'solid-js'
|
|
12
|
+
import { writeClipboardText } from '#lib/clipboard'
|
|
13
|
+
import { cn } from '#lib/utils'
|
|
14
|
+
import { Button } from '../../ui/button'
|
|
15
|
+
import { CodeBlock } from '../../ui/code-block'
|
|
16
|
+
import { TraceLine } from '../../ui/trace'
|
|
17
|
+
import {
|
|
18
|
+
boundLines,
|
|
19
|
+
dedentLines,
|
|
20
|
+
describeFrameGroup,
|
|
21
|
+
frameLocation,
|
|
22
|
+
groupStackEntries,
|
|
23
|
+
parseStackTrace,
|
|
24
|
+
type ParseStackTraceOptions,
|
|
25
|
+
type StackBlock,
|
|
26
|
+
type StackFrame,
|
|
27
|
+
} from './parse-stack-trace'
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* StackTrace.
|
|
31
|
+
*
|
|
32
|
+
* A failed call and the frames it failed through. Put it in the body of the
|
|
33
|
+
* `TraceLine` for the call that failed, or under a failing test; reach for
|
|
34
|
+
* `CodeBlock` when the text is not a trace, and for `Terminal` when it is the
|
|
35
|
+
* live output of a command rather than one error.
|
|
36
|
+
*
|
|
37
|
+
* ## The reader's code first
|
|
38
|
+
*
|
|
39
|
+
* A trace is mostly someone else's frames. Runs of dependency and runtime frames
|
|
40
|
+
* (`node_modules`, `site-packages`, `.cargo/registry`, `node:` internals, Rust's
|
|
41
|
+
* `std`) fold into one disclosure line that says what it holds, and a lone
|
|
42
|
+
* dependency frame is dimmed rather than folded. When *none* of the frames is the
|
|
43
|
+
* reader's, nothing folds: hiding the whole trace behind a button helps nobody.
|
|
44
|
+
* Whose code a frame is comes from its path; a host that knows the project layout
|
|
45
|
+
* passes `classify`.
|
|
46
|
+
*
|
|
47
|
+
* ## It never hides a line
|
|
48
|
+
*
|
|
49
|
+
* Every line of `text` is on screen in order — as a frame, as a header, or as
|
|
50
|
+
* muted text — and a trace in a format this does not know is shown whole in a
|
|
51
|
+
* `CodeBlock`, which also copies it. Copy writes `text` exactly as given, not a
|
|
52
|
+
* reformatted version of what was parsed.
|
|
53
|
+
*
|
|
54
|
+
* ## Opening a frame is the host's decision
|
|
55
|
+
*
|
|
56
|
+
* A frame is a button only when `onOpenFrame` is supplied, and only when the
|
|
57
|
+
* frame names a file; without it frames are plain text, because a control that
|
|
58
|
+
* does nothing is a tab stop with no purpose. The component never builds a path
|
|
59
|
+
* or tries to open one — the trace is untrusted text, and what a path in it means
|
|
60
|
+
* on this machine is the host's call.
|
|
61
|
+
*
|
|
62
|
+
* Text is text throughout: frames, messages and source lines are rendered as text
|
|
63
|
+
* nodes, long unbroken tokens wrap rather than widening the column, and what is
|
|
64
|
+
* drawn is bounded with the omission stated every time: a text line or a header
|
|
65
|
+
* message beyond 10 000 characters, a frame's printed lines beyond 40 lines or
|
|
66
|
+
* 10 000 characters, and the frames of a folded group, which are built only while
|
|
67
|
+
* it is open and then `maxBlocks` at a time. Copy and `onOpenFrame` still get all of
|
|
68
|
+
* it.
|
|
69
|
+
*/
|
|
70
|
+
export type StackTraceProps = Omit<ComponentProps<'div'>, 'children'> & {
|
|
71
|
+
/** The trace exactly as the runtime printed it. */
|
|
72
|
+
text: string
|
|
73
|
+
/** Make frames that name a file open it. Omit to render them as plain text. */
|
|
74
|
+
onOpenFrame?: (frame: StackFrame) => void
|
|
75
|
+
classify?: ParseStackTraceOptions['classify']
|
|
76
|
+
/** Fold runs of dependency and runtime frames. Default true. */
|
|
77
|
+
collapseDependencies?: boolean
|
|
78
|
+
/** Start folded groups open. */
|
|
79
|
+
defaultDependenciesOpen?: boolean
|
|
80
|
+
/** Blocks (frames, groups, text) shown before "show more". Default 200. */
|
|
81
|
+
maxBlocks?: number
|
|
82
|
+
copyLabel?: string
|
|
83
|
+
copiedLabel?: string
|
|
84
|
+
/** Called after each copy attempt with whether the clipboard accepted it. */
|
|
85
|
+
onCopy?: (ok: boolean) => void
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export const STACK_TRACE_MAX_BLOCKS = 200
|
|
89
|
+
const TEXT_DISPLAY_LIMIT = 10_000
|
|
90
|
+
/** What a frame's own printed lines (a Python source line, a locals dump) may show. */
|
|
91
|
+
const DETAIL_LINE_LIMIT = 40
|
|
92
|
+
const DETAIL_CHAR_LIMIT = 10_000
|
|
93
|
+
|
|
94
|
+
const rowClass =
|
|
95
|
+
'flex min-w-0 flex-wrap items-baseline gap-x-2 rounded-md px-1.5 py-0.5 text-start text-xs outline-none'
|
|
96
|
+
const interactiveClass =
|
|
97
|
+
'w-full cursor-pointer transition-colors ease-out hover:bg-muted/60 focus-visible:ring-3 focus-visible:ring-primary-subtle focus-visible:border-ring'
|
|
98
|
+
|
|
99
|
+
function omissionNote(lines: number, chars: number): string {
|
|
100
|
+
return lines > 0
|
|
101
|
+
? `… ${lines.toLocaleString()} more ${lines === 1 ? 'line' : 'lines'} (${chars.toLocaleString()} characters) not shown`
|
|
102
|
+
: `… ${chars.toLocaleString()} more characters not shown`
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** A frame's printed lines, bounded so one frame cannot be the whole page. */
|
|
106
|
+
function FrameDetail(props: { lines: readonly string[] }) {
|
|
107
|
+
const bounded = createMemo(() => boundLines(props.lines, DETAIL_LINE_LIMIT, DETAIL_CHAR_LIMIT))
|
|
108
|
+
return (
|
|
109
|
+
<>
|
|
110
|
+
<pre class="m-0 ms-1.5 px-1.5 font-code text-code whitespace-pre-wrap text-muted-foreground [overflow-wrap:anywhere]">
|
|
111
|
+
{dedentLines(bounded().lines).join('\n')}
|
|
112
|
+
</pre>
|
|
113
|
+
<Show when={bounded().omittedLines > 0 || bounded().omittedChars > 0}>
|
|
114
|
+
<p class="m-0 ms-1.5 px-1.5 text-xs text-muted-foreground italic">
|
|
115
|
+
{omissionNote(bounded().omittedLines, bounded().omittedChars)}
|
|
116
|
+
{' (copy has all of it)'}
|
|
117
|
+
</p>
|
|
118
|
+
</Show>
|
|
119
|
+
</>
|
|
120
|
+
)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Header text, cut to the display limit with what was cut stated. */
|
|
124
|
+
function ClippedText(props: { text: string; class?: string }) {
|
|
125
|
+
const clipped = () => props.text.length > TEXT_DISPLAY_LIMIT
|
|
126
|
+
return (
|
|
127
|
+
<>
|
|
128
|
+
<span class={props.class}>
|
|
129
|
+
{clipped() ? props.text.slice(0, TEXT_DISPLAY_LIMIT) : props.text}
|
|
130
|
+
</span>
|
|
131
|
+
<Show when={clipped()}>
|
|
132
|
+
<span class="block text-xs text-muted-foreground italic">
|
|
133
|
+
… {(props.text.length - TEXT_DISPLAY_LIMIT).toLocaleString()} more characters not shown
|
|
134
|
+
(copy has all of it)
|
|
135
|
+
</span>
|
|
136
|
+
</Show>
|
|
137
|
+
</>
|
|
138
|
+
)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* A folded run of dependency or runtime frames. Its rows are built only while it
|
|
143
|
+
* is open and then a page at a time, so a run of ten thousand frames costs the
|
|
144
|
+
* same as one of a few hundred until the reader asks for more.
|
|
145
|
+
*/
|
|
146
|
+
function FrameGroup(props: {
|
|
147
|
+
frames: readonly StackFrame[]
|
|
148
|
+
defaultOpen?: boolean
|
|
149
|
+
pageSize: number
|
|
150
|
+
onOpen?: (frame: StackFrame) => void
|
|
151
|
+
}) {
|
|
152
|
+
const [open, setOpen] = createSignal(props.defaultOpen === true)
|
|
153
|
+
const [limit, setLimit] = createSignal<number | undefined>()
|
|
154
|
+
const title = createMemo(() => describeFrameGroup(props.frames))
|
|
155
|
+
const shown = createMemo(() => props.frames.slice(0, limit() ?? props.pageSize))
|
|
156
|
+
const hidden = () => props.frames.length - shown().length
|
|
157
|
+
return (
|
|
158
|
+
<TraceLine icon={<Package />} title={title()} open={open()} onOpenChange={setOpen}>
|
|
159
|
+
<Show when={open()}>
|
|
160
|
+
<ol role="list" aria-label={title()} class="m-0 flex min-w-0 list-none flex-col gap-px p-0">
|
|
161
|
+
<For each={shown()}>{(frame) => <FrameRow frame={frame} onOpen={props.onOpen} />}</For>
|
|
162
|
+
</ol>
|
|
163
|
+
<Show when={hidden() > 0}>
|
|
164
|
+
<ShowMore
|
|
165
|
+
hidden={hidden()}
|
|
166
|
+
pageSize={props.pageSize}
|
|
167
|
+
onClick={() => setLimit(shown().length + props.pageSize)}
|
|
168
|
+
/>
|
|
169
|
+
</Show>
|
|
170
|
+
</Show>
|
|
171
|
+
</TraceLine>
|
|
172
|
+
)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function ShowMore(props: { hidden: number; pageSize: number; onClick: () => void }) {
|
|
176
|
+
return (
|
|
177
|
+
<div class="ps-1.5">
|
|
178
|
+
<Button variant="ghost" size="2xs" onClick={props.onClick}>
|
|
179
|
+
Show {Math.min(props.hidden, props.pageSize).toLocaleString()} more (
|
|
180
|
+
{props.hidden.toLocaleString()} hidden)
|
|
181
|
+
</Button>
|
|
182
|
+
</div>
|
|
183
|
+
)
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function FrameRow(props: { frame: StackFrame; onOpen?: (frame: StackFrame) => void }) {
|
|
187
|
+
const location = () => frameLocation(props.frame)
|
|
188
|
+
const first = () => props.frame.kind === 'first-party'
|
|
189
|
+
const content = () => (
|
|
190
|
+
<>
|
|
191
|
+
<span
|
|
192
|
+
class={cn('font-code text-code', {
|
|
193
|
+
'text-foreground': first(),
|
|
194
|
+
'text-muted-foreground': !first(),
|
|
195
|
+
})}
|
|
196
|
+
>
|
|
197
|
+
{props.frame.async ? 'async ' : ''}
|
|
198
|
+
{props.frame.function ?? '(anonymous)'}
|
|
199
|
+
</span>
|
|
200
|
+
<Show when={location()}>
|
|
201
|
+
<span class="min-w-0 font-code text-code text-muted-foreground [overflow-wrap:anywhere]">
|
|
202
|
+
{location()}
|
|
203
|
+
</span>
|
|
204
|
+
</Show>
|
|
205
|
+
{/* The dimming is a colour; the kind is also spoken. */}
|
|
206
|
+
<Show when={!first()}>
|
|
207
|
+
<span class="sr-only">
|
|
208
|
+
{props.frame.kind === 'dependency' ? 'in a dependency' : 'in the runtime'}
|
|
209
|
+
</span>
|
|
210
|
+
</Show>
|
|
211
|
+
</>
|
|
212
|
+
)
|
|
213
|
+
return (
|
|
214
|
+
<li data-slot="stack-frame" data-kind={props.frame.kind} class="min-w-0">
|
|
215
|
+
<Show
|
|
216
|
+
when={props.onOpen !== undefined && props.frame.file !== undefined}
|
|
217
|
+
fallback={<div class={rowClass}>{content()}</div>}
|
|
218
|
+
>
|
|
219
|
+
<button
|
|
220
|
+
type="button"
|
|
221
|
+
aria-label={`Open ${props.frame.function ?? 'frame'} at ${location()}`}
|
|
222
|
+
class={cn(rowClass, interactiveClass)}
|
|
223
|
+
onClick={() => props.onOpen?.(props.frame)}
|
|
224
|
+
>
|
|
225
|
+
{content()}
|
|
226
|
+
</button>
|
|
227
|
+
</Show>
|
|
228
|
+
<Show when={props.frame.detail && props.frame.detail.length > 0}>
|
|
229
|
+
<FrameDetail lines={props.frame.detail!} />
|
|
230
|
+
</Show>
|
|
231
|
+
</li>
|
|
232
|
+
)
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function TextRow(props: { text: string }) {
|
|
236
|
+
const clipped = () => props.text.length > TEXT_DISPLAY_LIMIT
|
|
237
|
+
return (
|
|
238
|
+
<li class="min-w-0 px-1.5 py-0.5 font-code text-code whitespace-pre-wrap text-muted-foreground [overflow-wrap:anywhere]">
|
|
239
|
+
{clipped() ? props.text.slice(0, TEXT_DISPLAY_LIMIT) : props.text}
|
|
240
|
+
<Show when={clipped()}>
|
|
241
|
+
<span class="block font-sans text-xs italic">
|
|
242
|
+
… {(props.text.length - TEXT_DISPLAY_LIMIT).toLocaleString()} more characters not shown
|
|
243
|
+
</span>
|
|
244
|
+
</Show>
|
|
245
|
+
</li>
|
|
246
|
+
)
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export function StackTrace(props: StackTraceProps) {
|
|
250
|
+
const [local, rest] = splitProps(props, [
|
|
251
|
+
'text',
|
|
252
|
+
'onOpenFrame',
|
|
253
|
+
'classify',
|
|
254
|
+
'collapseDependencies',
|
|
255
|
+
'defaultDependenciesOpen',
|
|
256
|
+
'maxBlocks',
|
|
257
|
+
'copyLabel',
|
|
258
|
+
'copiedLabel',
|
|
259
|
+
'onCopy',
|
|
260
|
+
'class',
|
|
261
|
+
])
|
|
262
|
+
|
|
263
|
+
const parsed = createMemo(() => parseStackTrace(local.text, { classify: local.classify }))
|
|
264
|
+
const blocks = createMemo<readonly StackBlock[]>(() =>
|
|
265
|
+
groupStackEntries(parsed().entries, local.collapseDependencies !== false).filter(
|
|
266
|
+
// A blank line between paragraphs of a trace carries nothing to draw.
|
|
267
|
+
(block) => block.type !== 'text' || block.text.trim() !== ''
|
|
268
|
+
)
|
|
269
|
+
)
|
|
270
|
+
const pageSize = () => Math.max(1, Math.floor(local.maxBlocks ?? STACK_TRACE_MAX_BLOCKS))
|
|
271
|
+
const [limit, setLimit] = createSignal<number | undefined>()
|
|
272
|
+
const shown = createMemo(() => blocks().slice(0, limit() ?? pageSize()))
|
|
273
|
+
const hidden = () => blocks().length - shown().length
|
|
274
|
+
|
|
275
|
+
const [copied, setCopied] = createSignal(false)
|
|
276
|
+
const [copyFailed, setCopyFailed] = createSignal(false)
|
|
277
|
+
const copy = async () => {
|
|
278
|
+
let ok = true
|
|
279
|
+
try {
|
|
280
|
+
await writeClipboardText(local.text)
|
|
281
|
+
} catch {
|
|
282
|
+
ok = false
|
|
283
|
+
}
|
|
284
|
+
setCopied(ok)
|
|
285
|
+
setCopyFailed(!ok)
|
|
286
|
+
local.onCopy?.(ok)
|
|
287
|
+
if (ok) setTimeout(() => setCopied(false), 1500)
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return (
|
|
291
|
+
<div
|
|
292
|
+
data-slot="stack-trace"
|
|
293
|
+
data-format={parsed().format}
|
|
294
|
+
class={cn('flex min-w-0 flex-col gap-1', local.class)}
|
|
295
|
+
{...rest}
|
|
296
|
+
>
|
|
297
|
+
<Show
|
|
298
|
+
when={parsed().format !== 'unknown'}
|
|
299
|
+
fallback={
|
|
300
|
+
// Nothing recognised: the whole text, in the block that copies it.
|
|
301
|
+
<CodeBlock size="sm" title="Error output" code={local.text} complete wrap />
|
|
302
|
+
}
|
|
303
|
+
>
|
|
304
|
+
<div class="group/stack flex items-start gap-2">
|
|
305
|
+
<CircleAlert aria-hidden="true" class="mt-0.5 size-4 shrink-0 text-destructive" />
|
|
306
|
+
<div class="min-w-0 flex-1 text-sm">
|
|
307
|
+
<Show
|
|
308
|
+
when={parsed().header}
|
|
309
|
+
fallback={<span class="text-muted-foreground">Stack trace</span>}
|
|
310
|
+
>
|
|
311
|
+
{(header) => (
|
|
312
|
+
<>
|
|
313
|
+
<p class="m-0 whitespace-pre-wrap [overflow-wrap:anywhere]">
|
|
314
|
+
<Show when={header().type}>
|
|
315
|
+
<ClippedText class="font-semibold text-destructive" text={header().type!} />
|
|
316
|
+
<Show when={header().message !== ''}>
|
|
317
|
+
<span class="text-muted-foreground">: </span>
|
|
318
|
+
</Show>
|
|
319
|
+
</Show>
|
|
320
|
+
<ClippedText class="text-foreground" text={header().message} />
|
|
321
|
+
</p>
|
|
322
|
+
<Show when={header().location}>
|
|
323
|
+
<p class="m-0 font-code text-code text-muted-foreground [overflow-wrap:anywhere]">
|
|
324
|
+
<ClippedText text={header().location!} />
|
|
325
|
+
</p>
|
|
326
|
+
</Show>
|
|
327
|
+
</>
|
|
328
|
+
)}
|
|
329
|
+
</Show>
|
|
330
|
+
</div>
|
|
331
|
+
<div class="flex items-center gap-1 opacity-0 transition-opacity group-focus-within/stack:opacity-100 group-hover/stack:opacity-100 [@media(hover:none)]:opacity-100">
|
|
332
|
+
<Button
|
|
333
|
+
variant="ghost"
|
|
334
|
+
size="icon-2xs"
|
|
335
|
+
aria-label={
|
|
336
|
+
copied() ? (local.copiedLabel ?? 'Copied') : (local.copyLabel ?? 'Copy stack trace')
|
|
337
|
+
}
|
|
338
|
+
title={copyFailed() ? 'Copying is unavailable in this context' : undefined}
|
|
339
|
+
onClick={() => void copy()}
|
|
340
|
+
>
|
|
341
|
+
<Show when={copied()} fallback={<Copy aria-hidden="true" />}>
|
|
342
|
+
<Check aria-hidden="true" />
|
|
343
|
+
</Show>
|
|
344
|
+
</Button>
|
|
345
|
+
</div>
|
|
346
|
+
</div>
|
|
347
|
+
|
|
348
|
+
<ol
|
|
349
|
+
role="list"
|
|
350
|
+
aria-label="Stack frames"
|
|
351
|
+
class="m-0 ms-2 flex min-w-0 list-none flex-col gap-px border-s border-border p-0 ps-2"
|
|
352
|
+
>
|
|
353
|
+
<For each={shown()}>
|
|
354
|
+
{(block) => (
|
|
355
|
+
<Switch>
|
|
356
|
+
<Match when={block.type === 'frame' && block}>
|
|
357
|
+
{(entry) => (
|
|
358
|
+
<FrameRow
|
|
359
|
+
frame={(entry() as Extract<StackBlock, { type: 'frame' }>).frame}
|
|
360
|
+
onOpen={local.onOpenFrame}
|
|
361
|
+
/>
|
|
362
|
+
)}
|
|
363
|
+
</Match>
|
|
364
|
+
<Match when={block.type === 'text' && block}>
|
|
365
|
+
{(entry) => (
|
|
366
|
+
<TextRow text={(entry() as Extract<StackBlock, { type: 'text' }>).text} />
|
|
367
|
+
)}
|
|
368
|
+
</Match>
|
|
369
|
+
<Match when={block.type === 'group' && block}>
|
|
370
|
+
{(entry) => (
|
|
371
|
+
<FrameGroup
|
|
372
|
+
frames={(entry() as Extract<StackBlock, { type: 'group' }>).frames}
|
|
373
|
+
defaultOpen={local.defaultDependenciesOpen}
|
|
374
|
+
pageSize={pageSize()}
|
|
375
|
+
onOpen={local.onOpenFrame}
|
|
376
|
+
/>
|
|
377
|
+
)}
|
|
378
|
+
</Match>
|
|
379
|
+
</Switch>
|
|
380
|
+
)}
|
|
381
|
+
</For>
|
|
382
|
+
</ol>
|
|
383
|
+
<Show when={hidden() > 0}>
|
|
384
|
+
<div class="ms-2">
|
|
385
|
+
<ShowMore
|
|
386
|
+
hidden={hidden()}
|
|
387
|
+
pageSize={pageSize()}
|
|
388
|
+
onClick={() => setLimit(shown().length + pageSize())}
|
|
389
|
+
/>
|
|
390
|
+
</div>
|
|
391
|
+
</Show>
|
|
392
|
+
</Show>
|
|
393
|
+
</div>
|
|
394
|
+
)
|
|
395
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { stepCountLabel, Subagent, type SubagentProps } from './subagent'
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { Bot } from 'lucide-solid'
|
|
2
|
+
import { children as resolveChildren, Show, splitProps, type JSX } from 'solid-js'
|
|
3
|
+
import { CodeBlock } from '../../ui/code-block'
|
|
4
|
+
import { ScrollArea } from '../../ui/scroll-area'
|
|
5
|
+
import {
|
|
6
|
+
Trace,
|
|
7
|
+
TraceDetail,
|
|
8
|
+
TraceLine,
|
|
9
|
+
type TraceLineProps,
|
|
10
|
+
type TraceStatus,
|
|
11
|
+
} from '../../ui/trace'
|
|
12
|
+
import { formatDuration } from '../reasoning'
|
|
13
|
+
|
|
14
|
+
// A function child runs once, when the content mounts (see `deferred` in `tool.tsx`).
|
|
15
|
+
const deferred = (render: () => JSX.Element) => render as unknown as JSX.Element
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Subagent.
|
|
19
|
+
*
|
|
20
|
+
* Another agent the main one handed work to, as a `TraceLine`: its name, the task
|
|
21
|
+
* it was given, its status, and — folded away — everything it did. The body is a
|
|
22
|
+
* nested `Trace`, so a subagent's tool calls, reasoning and own subagents are the
|
|
23
|
+
* same lines as the parent's, one level in; nothing about "a run inside a run"
|
|
24
|
+
* needs a new visual. Reach for `Tool` when the call has an input and an output
|
|
25
|
+
* and no steps of its own, and for `Task` when the items are a statement of work
|
|
26
|
+
* rather than a record of what ran.
|
|
27
|
+
*
|
|
28
|
+
* ## The collapsed line is the summary
|
|
29
|
+
*
|
|
30
|
+
* Folded, the line carries what a reader scanning the turn needs: the name, the
|
|
31
|
+
* task, the status, and — in the trailing text — the model, the number of steps
|
|
32
|
+
* and how long it took. Each of those appears only when known: `model` and
|
|
33
|
+
* `duration` are the host's, and the step count is the number of lines passed as
|
|
34
|
+
* `children` unless the host knows better (`stepCount`, for a run whose earlier
|
|
35
|
+
* steps are not loaded). No count is shown for a run with no steps.
|
|
36
|
+
*
|
|
37
|
+
* ## Result and failure
|
|
38
|
+
*
|
|
39
|
+
* `result` is a slot for the answer the subagent returned — usually prose or a
|
|
40
|
+
* `CodeBlock` — below its steps, labelled "Result". `errorText` is a failure as
|
|
41
|
+
* text. Neither is invented: a subagent that finished without a result shows
|
|
42
|
+
* none, and one with no steps, result or error yet is a plain line (there is
|
|
43
|
+
* nothing to open; the line becomes a disclosure when its first step arrives).
|
|
44
|
+
*
|
|
45
|
+
* A `Subagent` is a line: place it inside a `Trace`, and its `children` are
|
|
46
|
+
* `TraceLine`s.
|
|
47
|
+
*/
|
|
48
|
+
export type SubagentProps = Omit<
|
|
49
|
+
TraceLineProps,
|
|
50
|
+
'title' | 'description' | 'href' | 'onSelect' | 'selectHaspopup' | 'meta'
|
|
51
|
+
> & {
|
|
52
|
+
/** The subagent's name. Rendered as text. */
|
|
53
|
+
name: string
|
|
54
|
+
/** The task it was given, on the line. */
|
|
55
|
+
task?: JSX.Element
|
|
56
|
+
status?: TraceStatus
|
|
57
|
+
/** A model label, e.g. `sonnet-5`. Rendered as text. */
|
|
58
|
+
model?: string
|
|
59
|
+
/** Seconds the run took, if the host measured it. */
|
|
60
|
+
duration?: number
|
|
61
|
+
/** Overrides the count taken from `children`. */
|
|
62
|
+
stepCount?: number
|
|
63
|
+
/** What the subagent returned. */
|
|
64
|
+
result?: JSX.Element
|
|
65
|
+
errorText?: string
|
|
66
|
+
/** Trailing text appended after the derived summary. */
|
|
67
|
+
meta?: JSX.Element
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** `3 steps`, `1 step`. */
|
|
71
|
+
export function stepCountLabel(count: number): string {
|
|
72
|
+
return `${count} ${count === 1 ? 'step' : 'steps'}`
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function Subagent(props: SubagentProps) {
|
|
76
|
+
const [local, rest] = splitProps(props, [
|
|
77
|
+
'name',
|
|
78
|
+
'task',
|
|
79
|
+
'status',
|
|
80
|
+
'model',
|
|
81
|
+
'duration',
|
|
82
|
+
'stepCount',
|
|
83
|
+
'result',
|
|
84
|
+
'errorText',
|
|
85
|
+
'icon',
|
|
86
|
+
'meta',
|
|
87
|
+
'children',
|
|
88
|
+
])
|
|
89
|
+
// Resolved once: the steps are created once and keep their own state (an open
|
|
90
|
+
// tool call, a scrolled output) while the run is folded and unfolded.
|
|
91
|
+
const steps = resolveChildren(() => local.children)
|
|
92
|
+
const count = () => local.stepCount ?? steps.toArray().length
|
|
93
|
+
const hasError = () => local.errorText !== undefined && local.errorText !== ''
|
|
94
|
+
const hasResult = () => local.result !== undefined && local.result !== null
|
|
95
|
+
const hasDetail = () => steps.toArray().length > 0 || hasResult() || hasError()
|
|
96
|
+
|
|
97
|
+
const summary = () => {
|
|
98
|
+
const parts = [
|
|
99
|
+
local.model,
|
|
100
|
+
count() > 0 ? stepCountLabel(count()) : undefined,
|
|
101
|
+
formatDuration(local.duration),
|
|
102
|
+
].filter((part): part is string => part !== undefined && part !== '')
|
|
103
|
+
return parts.length > 0 ? parts.join(' · ') : undefined
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// A model label is host text and may be long; it must not widen the line.
|
|
107
|
+
const meta = () =>
|
|
108
|
+
summary() || local.meta ? (
|
|
109
|
+
<>
|
|
110
|
+
<Show when={summary()}>
|
|
111
|
+
<span class="inline-block max-w-72 truncate align-bottom">{summary()}</span>
|
|
112
|
+
</Show>
|
|
113
|
+
{local.meta}
|
|
114
|
+
</>
|
|
115
|
+
) : undefined
|
|
116
|
+
|
|
117
|
+
const detail = () => (
|
|
118
|
+
<TraceDetail class="flex flex-col gap-2">
|
|
119
|
+
<Show when={steps.toArray().length > 0}>
|
|
120
|
+
<Trace size="sm" aria-label={`${local.name} steps`}>
|
|
121
|
+
{steps()}
|
|
122
|
+
</Trace>
|
|
123
|
+
</Show>
|
|
124
|
+
<Show when={hasError()}>
|
|
125
|
+
<CodeBlock
|
|
126
|
+
size="sm"
|
|
127
|
+
title="Error"
|
|
128
|
+
language="error"
|
|
129
|
+
code={local.errorText ?? ''}
|
|
130
|
+
lineMarks={{ 1: 'error' }}
|
|
131
|
+
complete
|
|
132
|
+
maxHeight="12rem"
|
|
133
|
+
wrap
|
|
134
|
+
/>
|
|
135
|
+
</Show>
|
|
136
|
+
<Show when={hasResult()}>
|
|
137
|
+
<div class="flex min-w-0 flex-col gap-1">
|
|
138
|
+
<p class="m-0 font-medium text-foreground">Result</p>
|
|
139
|
+
<ScrollArea role="region" aria-label={`${local.name} result`} class="max-h-72">
|
|
140
|
+
{local.result}
|
|
141
|
+
</ScrollArea>
|
|
142
|
+
</div>
|
|
143
|
+
</Show>
|
|
144
|
+
</TraceDetail>
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
return (
|
|
148
|
+
<TraceLine
|
|
149
|
+
icon={local.icon ?? <Bot />}
|
|
150
|
+
title={local.name}
|
|
151
|
+
description={local.task}
|
|
152
|
+
status={local.status}
|
|
153
|
+
meta={meta()}
|
|
154
|
+
{...rest}
|
|
155
|
+
>
|
|
156
|
+
{hasDetail() ? deferred(detail) : undefined}
|
|
157
|
+
</TraceLine>
|
|
158
|
+
)
|
|
159
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Suggestion, Suggestions, type SuggestionProps, type SuggestionsProps } from './suggestion'
|