@adea-ai/ui 0.139.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,311 @@
|
|
|
1
|
+
import { cn } from "../../../lib/utils.js";
|
|
2
|
+
import { Button } from "../../ui/button/button.js";
|
|
3
|
+
import { Attachment, AttachmentList } from "../../ui/attachment/attachment.js";
|
|
4
|
+
import { ScrollArea } from "../../ui/scroll-area/scroll-area.js";
|
|
5
|
+
import { TraceLine } from "../../ui/trace/trace.js";
|
|
6
|
+
import { className, createComponent, effect, insert, memo, mergeProps, setAttribute, spread, template } from "solid-js/web";
|
|
7
|
+
import { Check, CircleAlert, CircleDashed, CircleSlash, ListChecks, LoaderCircle } from "lucide-solid";
|
|
8
|
+
import { For, Index, Show, createMemo, createSignal, splitProps } from "solid-js";
|
|
9
|
+
//#region src/components/composites/task/task.tsx
|
|
10
|
+
var _tmpl$ = /*#__PURE__*/ template(`<span aria-hidden=true data-slot=task-item-mark>`);
|
|
11
|
+
var _tmpl$2 = /*#__PURE__*/ template(`<span class="size-1 rounded-full bg-muted-foreground/60">`);
|
|
12
|
+
var _tmpl$3 = /*#__PURE__*/ template(`<li class="flex items-center">`);
|
|
13
|
+
var _tmpl$4 = /*#__PURE__*/ template(`<li data-slot=task-item><div class="flex min-w-0 flex-1 flex-col gap-1"><p>`);
|
|
14
|
+
var _tmpl$5 = /*#__PURE__*/ template(`<span class=sr-only> `);
|
|
15
|
+
var _tmpl$6 = /*#__PURE__*/ template(`<p class="m-0 line-clamp-3 text-xs [overflow-wrap:anywhere] text-muted-foreground/80">`);
|
|
16
|
+
var _tmpl$7 = /*#__PURE__*/ template(`<li class="min-w-0 max-w-full">`);
|
|
17
|
+
var _tmpl$8 = /*#__PURE__*/ template(`<ul role=list class="m-0 flex list-none flex-col gap-0.5 p-0">`);
|
|
18
|
+
var deferred = (render) => render;
|
|
19
|
+
/** The words spoken for each item status. */
|
|
20
|
+
var TASK_ITEM_STATUS_LABELS = {
|
|
21
|
+
complete: "Completed",
|
|
22
|
+
active: "In progress",
|
|
23
|
+
pending: "Pending",
|
|
24
|
+
failed: "Failed",
|
|
25
|
+
skipped: "Skipped"
|
|
26
|
+
};
|
|
27
|
+
/** Visible files per item before the rest go behind a toggle. */
|
|
28
|
+
var VISIBLE_FILES = 6;
|
|
29
|
+
/** Characters of item text kept; the rest of a pasted wall is not a todo. */
|
|
30
|
+
var MAX_TEXT = 1e3;
|
|
31
|
+
function bound(text, max) {
|
|
32
|
+
return text.length > max ? `${text.slice(0, max)}…` : text;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* How many items are done, or nothing at all when no item carries a status.
|
|
36
|
+
* Items without a status count toward the total: the host did not say they were
|
|
37
|
+
* finished, so they are not.
|
|
38
|
+
*/
|
|
39
|
+
function taskProgress(items) {
|
|
40
|
+
if (!items.some((item) => item.status !== void 0)) return void 0;
|
|
41
|
+
return {
|
|
42
|
+
done: items.filter((item) => item.status === "complete").length,
|
|
43
|
+
total: items.length
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** `2 of 4 done`, in words. */
|
|
47
|
+
function taskProgressLabel(progress) {
|
|
48
|
+
return `${progress.done} of ${progress.total} done`;
|
|
49
|
+
}
|
|
50
|
+
function ItemMark(props) {
|
|
51
|
+
return (() => {
|
|
52
|
+
var _el$ = _tmpl$();
|
|
53
|
+
insert(_el$, createComponent(Show, {
|
|
54
|
+
get when() {
|
|
55
|
+
return props.status;
|
|
56
|
+
},
|
|
57
|
+
get fallback() {
|
|
58
|
+
return _tmpl$2();
|
|
59
|
+
},
|
|
60
|
+
children: (status) => [
|
|
61
|
+
createComponent(Show, {
|
|
62
|
+
get when() {
|
|
63
|
+
return status() === "complete";
|
|
64
|
+
},
|
|
65
|
+
get children() {
|
|
66
|
+
return createComponent(Check, {});
|
|
67
|
+
}
|
|
68
|
+
}),
|
|
69
|
+
createComponent(Show, {
|
|
70
|
+
get when() {
|
|
71
|
+
return status() === "active";
|
|
72
|
+
},
|
|
73
|
+
get children() {
|
|
74
|
+
return createComponent(LoaderCircle, { "class": "motion-safe:animate-spin" });
|
|
75
|
+
}
|
|
76
|
+
}),
|
|
77
|
+
createComponent(Show, {
|
|
78
|
+
get when() {
|
|
79
|
+
return status() === "pending";
|
|
80
|
+
},
|
|
81
|
+
get children() {
|
|
82
|
+
return createComponent(CircleDashed, {});
|
|
83
|
+
}
|
|
84
|
+
}),
|
|
85
|
+
createComponent(Show, {
|
|
86
|
+
get when() {
|
|
87
|
+
return status() === "failed";
|
|
88
|
+
},
|
|
89
|
+
get children() {
|
|
90
|
+
return createComponent(CircleAlert, {});
|
|
91
|
+
}
|
|
92
|
+
}),
|
|
93
|
+
createComponent(Show, {
|
|
94
|
+
get when() {
|
|
95
|
+
return status() === "skipped";
|
|
96
|
+
},
|
|
97
|
+
get children() {
|
|
98
|
+
return createComponent(CircleSlash, {});
|
|
99
|
+
}
|
|
100
|
+
})
|
|
101
|
+
]
|
|
102
|
+
}));
|
|
103
|
+
effect(() => className(_el$, cn("mt-0.5 grid size-4 shrink-0 place-items-center [&_svg]:size-3.5", {
|
|
104
|
+
"text-muted-foreground": props.status !== "active" && props.status !== "failed",
|
|
105
|
+
"text-info": props.status === "active",
|
|
106
|
+
"text-destructive": props.status === "failed"
|
|
107
|
+
})));
|
|
108
|
+
return _el$;
|
|
109
|
+
})();
|
|
110
|
+
}
|
|
111
|
+
function TaskItemRow(props) {
|
|
112
|
+
const [local, rest] = splitProps(props, [
|
|
113
|
+
"class",
|
|
114
|
+
"text",
|
|
115
|
+
"description",
|
|
116
|
+
"status",
|
|
117
|
+
"files",
|
|
118
|
+
"statusLabel"
|
|
119
|
+
]);
|
|
120
|
+
const [showAllFiles, setShowAllFiles] = createSignal(false);
|
|
121
|
+
const files = () => local.files ?? [];
|
|
122
|
+
const shownFiles = () => showAllFiles() ? files() : files().slice(0, VISIBLE_FILES);
|
|
123
|
+
const hiddenFiles = () => files().length - VISIBLE_FILES;
|
|
124
|
+
const text = () => bound(local.text, MAX_TEXT);
|
|
125
|
+
return (() => {
|
|
126
|
+
var _el$3 = _tmpl$4(), _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild;
|
|
127
|
+
spread(_el$3, mergeProps({
|
|
128
|
+
get ["data-status"]() {
|
|
129
|
+
return local.status;
|
|
130
|
+
},
|
|
131
|
+
get ["class"]() {
|
|
132
|
+
return cn("flex min-w-0 gap-2 rounded-md px-1.5 py-0.5", local.class);
|
|
133
|
+
}
|
|
134
|
+
}, rest), false, true);
|
|
135
|
+
insert(_el$3, createComponent(ItemMark, { get status() {
|
|
136
|
+
return local.status;
|
|
137
|
+
} }), _el$4);
|
|
138
|
+
insert(_el$5, text, null);
|
|
139
|
+
insert(_el$5, createComponent(Show, {
|
|
140
|
+
get when() {
|
|
141
|
+
return local.status;
|
|
142
|
+
},
|
|
143
|
+
children: (status) => (() => {
|
|
144
|
+
var _el$7 = _tmpl$5();
|
|
145
|
+
_el$7.firstChild;
|
|
146
|
+
insert(_el$7, () => local.statusLabel ?? TASK_ITEM_STATUS_LABELS[status()], null);
|
|
147
|
+
return _el$7;
|
|
148
|
+
})()
|
|
149
|
+
}), null);
|
|
150
|
+
insert(_el$4, createComponent(Show, {
|
|
151
|
+
get when() {
|
|
152
|
+
return local.description;
|
|
153
|
+
},
|
|
154
|
+
children: (description) => (() => {
|
|
155
|
+
var _el$9 = _tmpl$6();
|
|
156
|
+
insert(_el$9, () => bound(description(), MAX_TEXT));
|
|
157
|
+
return _el$9;
|
|
158
|
+
})()
|
|
159
|
+
}), null);
|
|
160
|
+
insert(_el$4, createComponent(Show, {
|
|
161
|
+
get when() {
|
|
162
|
+
return files().length > 0;
|
|
163
|
+
},
|
|
164
|
+
get children() {
|
|
165
|
+
return createComponent(AttachmentList, {
|
|
166
|
+
"aria-label": "Files",
|
|
167
|
+
"class": "gap-1",
|
|
168
|
+
get children() {
|
|
169
|
+
return [createComponent(For, {
|
|
170
|
+
get each() {
|
|
171
|
+
return shownFiles();
|
|
172
|
+
},
|
|
173
|
+
children: (file) => (() => {
|
|
174
|
+
var _el$0 = _tmpl$7();
|
|
175
|
+
insert(_el$0, createComponent(Attachment, {
|
|
176
|
+
variant: "chip",
|
|
177
|
+
get name() {
|
|
178
|
+
return file.name;
|
|
179
|
+
},
|
|
180
|
+
get kind() {
|
|
181
|
+
return file.kind;
|
|
182
|
+
},
|
|
183
|
+
get size() {
|
|
184
|
+
return file.size;
|
|
185
|
+
}
|
|
186
|
+
}));
|
|
187
|
+
return _el$0;
|
|
188
|
+
})()
|
|
189
|
+
}), createComponent(Show, {
|
|
190
|
+
get when() {
|
|
191
|
+
return hiddenFiles() > 0;
|
|
192
|
+
},
|
|
193
|
+
get children() {
|
|
194
|
+
var _el$6 = _tmpl$3();
|
|
195
|
+
insert(_el$6, createComponent(Button, {
|
|
196
|
+
type: "button",
|
|
197
|
+
variant: "ghost",
|
|
198
|
+
size: "2xs",
|
|
199
|
+
get ["aria-expanded"]() {
|
|
200
|
+
return showAllFiles();
|
|
201
|
+
},
|
|
202
|
+
onClick: () => setShowAllFiles((value) => !value),
|
|
203
|
+
get children() {
|
|
204
|
+
return memo(() => !!showAllFiles())() ? "Show fewer files" : `Show ${hiddenFiles()} more files`;
|
|
205
|
+
}
|
|
206
|
+
}));
|
|
207
|
+
return _el$6;
|
|
208
|
+
}
|
|
209
|
+
})];
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}), null);
|
|
214
|
+
effect((_p$) => {
|
|
215
|
+
var _v$ = text(), _v$2 = cn("m-0 line-clamp-3 text-sm [overflow-wrap:anywhere] whitespace-pre-wrap text-foreground", {
|
|
216
|
+
"text-muted-foreground": local.status === "complete" || local.status === "skipped",
|
|
217
|
+
"text-destructive": local.status === "failed"
|
|
218
|
+
});
|
|
219
|
+
_v$ !== _p$.e && setAttribute(_el$5, "title", _p$.e = _v$);
|
|
220
|
+
_v$2 !== _p$.t && className(_el$5, _p$.t = _v$2);
|
|
221
|
+
return _p$;
|
|
222
|
+
}, {
|
|
223
|
+
e: void 0,
|
|
224
|
+
t: void 0
|
|
225
|
+
});
|
|
226
|
+
return _el$3;
|
|
227
|
+
})();
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* The items, bounded. Two hundred todo items must scroll inside their line and
|
|
231
|
+
* not push the answer out of view; the region is keyboard-focusable and named,
|
|
232
|
+
* which is what makes the overflow reachable without a pointer.
|
|
233
|
+
*/
|
|
234
|
+
function TaskItemList(props) {
|
|
235
|
+
const [local, rest] = splitProps(props, [
|
|
236
|
+
"class",
|
|
237
|
+
"label",
|
|
238
|
+
"children"
|
|
239
|
+
]);
|
|
240
|
+
return createComponent(ScrollArea, mergeProps({
|
|
241
|
+
role: "region",
|
|
242
|
+
get ["aria-label"]() {
|
|
243
|
+
return local.label;
|
|
244
|
+
},
|
|
245
|
+
get ["class"]() {
|
|
246
|
+
return cn("max-h-72", local.class);
|
|
247
|
+
}
|
|
248
|
+
}, rest, { get children() {
|
|
249
|
+
var _el$1 = _tmpl$8();
|
|
250
|
+
insert(_el$1, () => local.children);
|
|
251
|
+
return _el$1;
|
|
252
|
+
} }));
|
|
253
|
+
}
|
|
254
|
+
function Task(props) {
|
|
255
|
+
const [local, rest] = splitProps(props, [
|
|
256
|
+
"items",
|
|
257
|
+
"itemsLabel",
|
|
258
|
+
"icon",
|
|
259
|
+
"meta",
|
|
260
|
+
"title"
|
|
261
|
+
]);
|
|
262
|
+
const progress = createMemo(() => taskProgress(local.items));
|
|
263
|
+
const derivedMeta = () => {
|
|
264
|
+
const value = progress();
|
|
265
|
+
return value ? taskProgressLabel(value) : void 0;
|
|
266
|
+
};
|
|
267
|
+
const label = () => local.itemsLabel ?? (typeof local.title === "string" ? `${local.title} items` : "Task items");
|
|
268
|
+
const list = () => createComponent(TaskItemList, {
|
|
269
|
+
get label() {
|
|
270
|
+
return label();
|
|
271
|
+
},
|
|
272
|
+
get children() {
|
|
273
|
+
return createComponent(Index, {
|
|
274
|
+
get each() {
|
|
275
|
+
return local.items;
|
|
276
|
+
},
|
|
277
|
+
children: (item) => createComponent(TaskItemRow, {
|
|
278
|
+
get text() {
|
|
279
|
+
return item().text;
|
|
280
|
+
},
|
|
281
|
+
get description() {
|
|
282
|
+
return item().description;
|
|
283
|
+
},
|
|
284
|
+
get status() {
|
|
285
|
+
return item().status;
|
|
286
|
+
},
|
|
287
|
+
get files() {
|
|
288
|
+
return item().files;
|
|
289
|
+
}
|
|
290
|
+
})
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
return createComponent(TraceLine, mergeProps({
|
|
295
|
+
get icon() {
|
|
296
|
+
return local.icon ?? createComponent(ListChecks, {});
|
|
297
|
+
},
|
|
298
|
+
get title() {
|
|
299
|
+
return local.title;
|
|
300
|
+
},
|
|
301
|
+
get meta() {
|
|
302
|
+
return local.meta ?? derivedMeta();
|
|
303
|
+
}
|
|
304
|
+
}, rest, { get children() {
|
|
305
|
+
return memo(() => local.items.length > 0)() ? deferred(list) : void 0;
|
|
306
|
+
} }));
|
|
307
|
+
}
|
|
308
|
+
//#endregion
|
|
309
|
+
export { TASK_ITEM_STATUS_LABELS, Task, TaskItemList, TaskItemRow, taskProgress, taskProgressLabel };
|
|
310
|
+
|
|
311
|
+
//# sourceMappingURL=task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.js","names":["Check","CircleAlert","CircleDashed","CircleSlash","ListChecks","LoaderCircle","createMemo","createSignal","For","Index","Show","splitProps","ComponentProps","JSX","cn","Attachment","AttachmentList","AttachmentKind","Button","ScrollArea","TraceLine","TraceLineProps","deferred","render","Element","TaskItemStatus","TaskFile","Readonly","name","kind","size","TaskItem","id","text","description","status","files","TASK_ITEM_STATUS_LABELS","Record","complete","active","pending","failed","skipped","VISIBLE_FILES","MAX_TEXT","bound","max","length","slice","taskProgress","items","Pick","done","total","some","item","undefined","filter","taskProgressLabel","progress","ItemMark","props","_el$","_tmpl$","_$insert","_$createComponent","when","fallback","_tmpl$2","children","_$effect","_$className","TaskItemRowProps","Omit","statusLabel","TaskItemRow","local","rest","showAllFiles","setShowAllFiles","shownFiles","hiddenFiles","_el$3","_tmpl$4","_el$4","firstChild","_el$5","_$spread","_$mergeProps","data-status","class","_el$7","_tmpl$5","_el$8","_el$9","_tmpl$6","each","file","_el$0","_tmpl$7","variant","_el$6","_tmpl$3","type","aria-expanded","onClick","value","_$memo","_p$","_v$","_v$2","e","_$setAttribute","t","TaskItemListProps","label","TaskItemList","role","aria-label","_el$1","_tmpl$8","TaskProps","itemsLabel","Task","derivedMeta","title","list","icon","meta","_$createComponent","_$className","_$mergeProps","_$memo","_$setAttribute"],"sources":["../../../../src/components/composites/task/task.tsx"],"sourcesContent":["import {\n Check,\n CircleAlert,\n CircleDashed,\n CircleSlash,\n ListChecks,\n LoaderCircle,\n} from 'lucide-solid'\nimport {\n createMemo,\n createSignal,\n For,\n Index,\n Show,\n splitProps,\n type ComponentProps,\n type JSX,\n} from 'solid-js'\nimport { cn } from '#lib/utils'\nimport { Attachment, AttachmentList, type AttachmentKind } from '../../ui/attachment'\nimport { Button } from '../../ui/button'\nimport { ScrollArea } from '../../ui/scroll-area'\nimport { TraceLine, type TraceLineProps } from '../../ui/trace'\n\n// A function child runs once, when the content mounts (see `deferred` in `tool.tsx`).\nconst deferred = (render: () => JSX.Element) => render as unknown as JSX.Element\n\n/**\n * Task.\n *\n * One piece of work the agent is doing, as a `TraceLine` that opens onto its\n * items: a title, then a list in which each item is a sentence, optionally a\n * status, and optionally the files it touched. Reach for `Plan` when the list is\n * a proposal the person approves, for `Queue` when it is the agent's running\n * todo list, and for a `Trace` of tool calls when the items are things that\n * *ran* — a Task item is a statement about work, not a record of a call.\n *\n * ## Items wrap; lines do not\n *\n * A `TraceLine` truncates its title to one row, which is right for \"Read\n * src/app.tsx\" and wrong for \"Backfill locale from profile.language, falling\n * back to en\". Items are therefore their own rows with the same mark and colour\n * vocabulary as a Trace line but wrapping text, clamped to three lines so a\n * pasted paragraph cannot take the column. `TaskItemRow` and `TaskItemList` are\n * exported because `Plan` and `Queue` are built from them.\n *\n * ## Status is a claim\n *\n * An item shows a mark and speaks a word only when the host supplied `status`.\n * The \"2 of 4 done\" in the header is derived from those statuses and appears\n * only if at least one item has one; items without a status are counted in the\n * total and not in \"done\" (see `taskProgress`). A task with no items is a plain\n * line: there is nothing to open, and an empty disclosure is a control that\n * does nothing.\n *\n * ## Files are untrusted metadata\n *\n * File chips are `Attachment` chips with no handlers, so they are text: a name\n * is never a link or a path. Past six, the rest sit behind one toggle button\n * whose label changes in place, so keyboard focus survives opening and closing\n * it.\n */\nexport type TaskItemStatus = 'complete' | 'active' | 'pending' | 'failed' | 'skipped'\n\nexport type TaskFile = Readonly<{\n name: string\n kind?: AttachmentKind\n /** Bytes. */\n size?: number\n}>\n\nexport type TaskItem = Readonly<{\n /** Only needed for the host's own bookkeeping; rows are kept by position. */\n id?: string\n text: string\n description?: string\n status?: TaskItemStatus\n files?: readonly TaskFile[]\n}>\n\n/** The words spoken for each item status. */\nexport const TASK_ITEM_STATUS_LABELS: Readonly<Record<TaskItemStatus, string>> = {\n complete: 'Completed',\n active: 'In progress',\n pending: 'Pending',\n failed: 'Failed',\n skipped: 'Skipped',\n}\n\n/** Visible files per item before the rest go behind a toggle. */\nconst VISIBLE_FILES = 6\n/** Characters of item text kept; the rest of a pasted wall is not a todo. */\nconst MAX_TEXT = 1_000\n\nfunction bound(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max)}…` : text\n}\n\n/**\n * How many items are done, or nothing at all when no item carries a status.\n * Items without a status count toward the total: the host did not say they were\n * finished, so they are not.\n */\nexport function taskProgress(\n items: readonly Pick<TaskItem, 'status'>[]\n): Readonly<{ done: number; total: number }> | undefined {\n if (!items.some((item) => item.status !== undefined)) return undefined\n return {\n done: items.filter((item) => item.status === 'complete').length,\n total: items.length,\n }\n}\n\n/** `2 of 4 done`, in words. */\nexport function taskProgressLabel(progress: { done: number; total: number }): string {\n return `${progress.done} of ${progress.total} done`\n}\n\nfunction ItemMark(props: { status?: TaskItemStatus }) {\n return (\n <span\n aria-hidden=\"true\"\n data-slot=\"task-item-mark\"\n class={cn('mt-0.5 grid size-4 shrink-0 place-items-center [&_svg]:size-3.5', {\n 'text-muted-foreground': props.status !== 'active' && props.status !== 'failed',\n 'text-info': props.status === 'active',\n 'text-destructive': props.status === 'failed',\n })}\n >\n <Show\n when={props.status}\n fallback={<span class=\"size-1 rounded-full bg-muted-foreground/60\" />}\n >\n {(status) => (\n <>\n <Show when={status() === 'complete'}>\n <Check />\n </Show>\n <Show when={status() === 'active'}>\n <LoaderCircle class=\"motion-safe:animate-spin\" />\n </Show>\n <Show when={status() === 'pending'}>\n <CircleDashed />\n </Show>\n <Show when={status() === 'failed'}>\n <CircleAlert />\n </Show>\n <Show when={status() === 'skipped'}>\n <CircleSlash />\n </Show>\n </>\n )}\n </Show>\n </span>\n )\n}\n\nexport type TaskItemRowProps = Omit<ComponentProps<'li'>, 'children'> & {\n text: string\n description?: string\n status?: TaskItemStatus\n files?: readonly TaskFile[]\n /** Spoken in place of the default status word. */\n statusLabel?: string\n}\n\nexport function TaskItemRow(props: TaskItemRowProps) {\n const [local, rest] = splitProps(props, [\n 'class',\n 'text',\n 'description',\n 'status',\n 'files',\n 'statusLabel',\n ])\n const [showAllFiles, setShowAllFiles] = createSignal(false)\n const files = () => local.files ?? []\n const shownFiles = () => (showAllFiles() ? files() : files().slice(0, VISIBLE_FILES))\n const hiddenFiles = () => files().length - VISIBLE_FILES\n const text = () => bound(local.text, MAX_TEXT)\n\n return (\n <li\n data-slot=\"task-item\"\n data-status={local.status}\n class={cn('flex min-w-0 gap-2 rounded-md px-1.5 py-0.5', local.class)}\n {...rest}\n >\n <ItemMark status={local.status} />\n <div class=\"flex min-w-0 flex-1 flex-col gap-1\">\n <p\n title={text()}\n class={cn(\n 'm-0 line-clamp-3 text-sm [overflow-wrap:anywhere] whitespace-pre-wrap text-foreground',\n {\n 'text-muted-foreground': local.status === 'complete' || local.status === 'skipped',\n 'text-destructive': local.status === 'failed',\n }\n )}\n >\n {text()}\n <Show when={local.status}>\n {(status) => (\n <span class=\"sr-only\"> {local.statusLabel ?? TASK_ITEM_STATUS_LABELS[status()]}</span>\n )}\n </Show>\n </p>\n <Show when={local.description}>\n {(description) => (\n <p class=\"m-0 line-clamp-3 text-xs [overflow-wrap:anywhere] text-muted-foreground/80\">\n {bound(description(), MAX_TEXT)}\n </p>\n )}\n </Show>\n <Show when={files().length > 0}>\n <AttachmentList aria-label=\"Files\" class=\"gap-1\">\n <For each={shownFiles()}>\n {(file) => (\n <li class=\"min-w-0 max-w-full\">\n <Attachment variant=\"chip\" name={file.name} kind={file.kind} size={file.size} />\n </li>\n )}\n </For>\n <Show when={hiddenFiles() > 0}>\n <li class=\"flex items-center\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"2xs\"\n aria-expanded={showAllFiles()}\n onClick={() => setShowAllFiles((value) => !value)}\n >\n {showAllFiles() ? 'Show fewer files' : `Show ${hiddenFiles()} more files`}\n </Button>\n </li>\n </Show>\n </AttachmentList>\n </Show>\n </div>\n </li>\n )\n}\n\nexport type TaskItemListProps = Omit<ComponentProps<'div'>, 'children'> & {\n /** The list's accessible name. A scrolling region without one is an unlabelled tab stop. */\n label: string\n children?: JSX.Element\n}\n\n/**\n * The items, bounded. Two hundred todo items must scroll inside their line and\n * not push the answer out of view; the region is keyboard-focusable and named,\n * which is what makes the overflow reachable without a pointer.\n */\nexport function TaskItemList(props: TaskItemListProps) {\n const [local, rest] = splitProps(props, ['class', 'label', 'children'])\n return (\n <ScrollArea\n role=\"region\"\n aria-label={local.label}\n class={cn('max-h-72', local.class)}\n {...rest}\n >\n <ul role=\"list\" class=\"m-0 flex list-none flex-col gap-0.5 p-0\">\n {local.children}\n </ul>\n </ScrollArea>\n )\n}\n\nexport type TaskProps = Omit<\n TraceLineProps,\n 'description' | 'href' | 'onSelect' | 'selectHaspopup' | 'children'\n> & {\n items: readonly TaskItem[]\n /** The item list's accessible name. Defaults to the title when it is a string. */\n itemsLabel?: string\n}\n\nexport function Task(props: TaskProps) {\n const [local, rest] = splitProps(props, ['items', 'itemsLabel', 'icon', 'meta', 'title'])\n const progress = createMemo(() => taskProgress(local.items))\n const derivedMeta = () => {\n const value = progress()\n return value ? taskProgressLabel(value) : undefined\n }\n const label = () =>\n local.itemsLabel ?? (typeof local.title === 'string' ? `${local.title} items` : 'Task items')\n\n // A function child is only run when the content mounts, so a collapsed task\n // with hundreds of items renders none of them.\n const list = () => (\n <TaskItemList label={label()}>\n <Index each={local.items}>\n {(item) => (\n <TaskItemRow\n text={item().text}\n description={item().description}\n status={item().status}\n files={item().files}\n />\n )}\n </Index>\n </TaskItemList>\n )\n\n return (\n <TraceLine\n icon={local.icon ?? <ListChecks />}\n title={local.title}\n meta={local.meta ?? derivedMeta()}\n {...rest}\n >\n {local.items.length > 0 ? deferred(list) : undefined}\n </TraceLine>\n )\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A terminal's text, read safely.
|
|
3
|
+
*
|
|
4
|
+
* Command output is untrusted bytes, not text: it carries colour for the human
|
|
5
|
+
* who ran the command, cursor control for a screen that is not here, and — from
|
|
6
|
+
* a hostile program — sequences that ask a terminal emulator to rewrite its
|
|
7
|
+
* title, write to the clipboard (OSC 52) or hide what it printed. This parser
|
|
8
|
+
* accepts exactly the part a transcript can honour and drops the rest:
|
|
9
|
+
*
|
|
10
|
+
* - **Kept:** printable text, `\n`, `\r` (the cursor returns to column 0 and
|
|
11
|
+
* later text overwrites, which is how a progress bar redraws itself), `\b`
|
|
12
|
+
* (the cursor steps back one column), tab, `ESC[…K` (erase in line, which
|
|
13
|
+
* progress bars pair with `\r`), and SGR `ESC[…m` for the sixteen theme
|
|
14
|
+
* colours, bold, dim, italic, underline, strike-through and reverse video.
|
|
15
|
+
* - **Mapped:** 256-colour and truecolour SGR become the nearest of the sixteen,
|
|
16
|
+
* so the output keeps the theme's palette and its contrast guarantees instead
|
|
17
|
+
* of a program's idea of "dark blue" on a light terminal.
|
|
18
|
+
* - **Dropped, never echoed:** every other CSI (cursor movement, scrolling,
|
|
19
|
+
* private modes), OSC, DCS/SOS/PM/APC strings, charset designations, the 8-bit
|
|
20
|
+
* C1 forms of all of these, every other control character, and the Unicode
|
|
21
|
+
* bidirectional overrides that make text read differently from how it is
|
|
22
|
+
* stored. A malformed or truncated sequence is dropped with its payload, so a
|
|
23
|
+
* half-received `ESC[3` never shows up as the text "3".
|
|
24
|
+
*
|
|
25
|
+
* Nothing here produces markup. The result is plain strings with a style object,
|
|
26
|
+
* and the renderer decides what a style looks like.
|
|
27
|
+
*
|
|
28
|
+
* ## Why a stateful parser
|
|
29
|
+
*
|
|
30
|
+
* Output arrives in chunks that split anywhere — inside an escape sequence, in
|
|
31
|
+
* the middle of a line. `createAnsiParser` keeps the half-read sequence, the
|
|
32
|
+
* current style and the line being written between `write` calls, so a chunk
|
|
33
|
+
* boundary changes nothing about the result. Finished lines are immutable and
|
|
34
|
+
* never touched again, which is what lets a renderer keep their DOM while the
|
|
35
|
+
* last line keeps growing. `parseAnsi` is the same thing run once.
|
|
36
|
+
*/
|
|
37
|
+
/** An index into the sixteen-colour palette: 0–7 normal, 8–15 bright. */
|
|
38
|
+
export type AnsiColor = number;
|
|
39
|
+
export type AnsiStyle = Readonly<{
|
|
40
|
+
fg?: AnsiColor;
|
|
41
|
+
bg?: AnsiColor;
|
|
42
|
+
bold?: true;
|
|
43
|
+
dim?: true;
|
|
44
|
+
italic?: true;
|
|
45
|
+
underline?: true;
|
|
46
|
+
strike?: true;
|
|
47
|
+
inverse?: true;
|
|
48
|
+
}>;
|
|
49
|
+
export type AnsiSegment = Readonly<{
|
|
50
|
+
text: string;
|
|
51
|
+
style: AnsiStyle;
|
|
52
|
+
}>;
|
|
53
|
+
export type AnsiLine = Readonly<{
|
|
54
|
+
segments: readonly AnsiSegment[];
|
|
55
|
+
/** Characters past `maxLineLength` that were not kept. Zero for most lines. */
|
|
56
|
+
truncated: number;
|
|
57
|
+
}>;
|
|
58
|
+
export type AnsiParserOptions = {
|
|
59
|
+
/** Characters kept per line; the rest are counted in `truncated`. Default 10 000. */
|
|
60
|
+
maxLineLength?: number;
|
|
61
|
+
/**
|
|
62
|
+
* Finished lines kept. The oldest are discarded (and counted in `droppedLines`)
|
|
63
|
+
* past this, so a command that prints for an hour cannot grow the parser
|
|
64
|
+
* without bound. Default 200 000.
|
|
65
|
+
*/
|
|
66
|
+
retainLines?: number;
|
|
67
|
+
};
|
|
68
|
+
export type AnsiParser = {
|
|
69
|
+
/** Feed the next chunk. Chunks may split anywhere, including inside an escape. */
|
|
70
|
+
write(chunk: string): void;
|
|
71
|
+
/** Finished lines, oldest first. The array is mutated in place as lines arrive. */
|
|
72
|
+
readonly lines: readonly AnsiLine[];
|
|
73
|
+
/** The line still being written, or `undefined` while it is empty. */
|
|
74
|
+
openLine(): AnsiLine | undefined;
|
|
75
|
+
/** Finished lines discarded because of `retainLines`. */
|
|
76
|
+
readonly droppedLines: number;
|
|
77
|
+
};
|
|
78
|
+
export declare const ANSI_MAX_LINE_LENGTH = 10000;
|
|
79
|
+
export declare const ANSI_RETAIN_LINES = 200000;
|
|
80
|
+
/** Whether a style paints nothing, so the renderer can emit a bare text node. */
|
|
81
|
+
export declare function isPlainStyle(style: AnsiStyle): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* The colours a style actually paints. Reverse video swaps them; a swapped side
|
|
84
|
+
* with no colour of its own resolves to the terminal's default foreground or
|
|
85
|
+
* background (`'default-fg'`, `'default-bg'`), which are themselves theme tokens.
|
|
86
|
+
*/
|
|
87
|
+
export type ResolvedColors = Readonly<{
|
|
88
|
+
fg: AnsiColor | 'default-bg' | undefined;
|
|
89
|
+
bg: AnsiColor | 'default-fg' | undefined;
|
|
90
|
+
}>;
|
|
91
|
+
export declare function resolveColors(style: AnsiStyle): ResolvedColors;
|
|
92
|
+
/** The palette index (0–15) nearest to an RGB colour. Channels are clamped to 0–255. */
|
|
93
|
+
export declare function nearestAnsiColor(r: number, g: number, b: number): AnsiColor;
|
|
94
|
+
/** Map a 256-colour index to the sixteen. Out-of-range indices give `undefined`. */
|
|
95
|
+
export declare function ansi256ToColor(index: number): AnsiColor | undefined;
|
|
96
|
+
export declare function createAnsiParser(options?: AnsiParserOptions): AnsiParser;
|
|
97
|
+
/** Parse a whole output at once: finished lines plus the open one, if any. */
|
|
98
|
+
export declare function parseAnsi(text: string, options?: AnsiParserOptions): AnsiLine[];
|
|
99
|
+
/** A line's text with styling removed, for tests and for accessible names. */
|
|
100
|
+
export declare function ansiLineText(line: AnsiLine): string;
|
|
101
|
+
//# sourceMappingURL=ansi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ansi.d.ts","sourceRoot":"","sources":["../../../../src/components/composites/terminal/ansi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,yEAAyE;AACzE,MAAM,MAAM,SAAS,GAAG,MAAM,CAAA;AAE9B,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC;IAC/B,EAAE,CAAC,EAAE,SAAS,CAAA;IACd,EAAE,CAAC,EAAE,SAAS,CAAA;IACd,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,GAAG,CAAC,EAAE,IAAI,CAAA;IACV,MAAM,CAAC,EAAE,IAAI,CAAA;IACb,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,MAAM,CAAC,EAAE,IAAI,CAAA;IACb,OAAO,CAAC,EAAE,IAAI,CAAA;CACf,CAAC,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC,CAAA;AAEtE,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC;IAC9B,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAA;IAChC,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAA;CAClB,CAAC,CAAA;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,qFAAqF;IACrF,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,kFAAkF;IAClF,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,mFAAmF;IACnF,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAA;IACnC,sEAAsE;IACtE,QAAQ,IAAI,QAAQ,GAAG,SAAS,CAAA;IAChC,yDAAyD;IACzD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED,eAAO,MAAM,oBAAoB,QAAS,CAAA;AAC1C,eAAO,MAAM,iBAAiB,SAAU,CAAA;AAmDxC,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAWtD;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC,EAAE,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,CAAA;IACxC,EAAE,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,CAAA;CACzC,CAAC,CAAA;AAEF,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,cAAc,CAG9D;AA0BD,wFAAwF;AACxF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAsB3E;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAanE;AA2RD,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,iBAAsB,GAAG,UAAU,CAwJ5E;AAED,8EAA8E;AAC9E,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,QAAQ,EAAE,CAK/E;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAEnD"}
|