@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,103 @@
|
|
|
1
|
+
import { boundText } from '../sources/source'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* An effort level a model supports: just its id (`'high'`), or an id with the
|
|
5
|
+
* words to show. A bare id is labelled by capitalising it, which is right for
|
|
6
|
+
* `low` / `medium` / `high` and wrong for anything else — pass a label then.
|
|
7
|
+
*/
|
|
8
|
+
export type ModelEffort = string | Readonly<{ id: string; label?: string; description?: string }>
|
|
9
|
+
|
|
10
|
+
export type EffortOption = Readonly<{ id: string; label: string; description?: string }>
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* A model the person may pick. `efforts` lists the effort levels *this* model
|
|
14
|
+
* advertises; a model without it has no effort control, because showing one would
|
|
15
|
+
* claim the model can be told how hard to think. `disabledReason` is the host's
|
|
16
|
+
* authority speaking (plan, quota, region): the model stays in the list, disabled,
|
|
17
|
+
* with the reason beside it.
|
|
18
|
+
*/
|
|
19
|
+
export type ModelOption = Readonly<{
|
|
20
|
+
/** Unique within the list. */
|
|
21
|
+
id: string
|
|
22
|
+
label: string
|
|
23
|
+
provider: string
|
|
24
|
+
description?: string
|
|
25
|
+
disabledReason?: string
|
|
26
|
+
efforts?: readonly ModelEffort[]
|
|
27
|
+
}>
|
|
28
|
+
|
|
29
|
+
const LABEL_LIMIT = 60
|
|
30
|
+
const DESCRIPTION_LIMIT = 160
|
|
31
|
+
|
|
32
|
+
function titleCase(id: string): string {
|
|
33
|
+
const clean = boundText(id, LABEL_LIMIT)
|
|
34
|
+
return clean.charAt(0).toUpperCase() + clean.slice(1)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Efforts as options: blanks dropped, duplicate ids kept once (first wins), text bounded. */
|
|
38
|
+
export function normalizeEfforts(efforts: readonly ModelEffort[] | undefined): EffortOption[] {
|
|
39
|
+
const seen = new Set<string>()
|
|
40
|
+
const out: EffortOption[] = []
|
|
41
|
+
for (const effort of efforts ?? []) {
|
|
42
|
+
const id = typeof effort === 'string' ? effort : effort.id
|
|
43
|
+
if (id.trim() === '' || seen.has(id)) continue
|
|
44
|
+
seen.add(id)
|
|
45
|
+
if (typeof effort === 'string') {
|
|
46
|
+
out.push({ id, label: titleCase(id) })
|
|
47
|
+
} else {
|
|
48
|
+
out.push({
|
|
49
|
+
id,
|
|
50
|
+
label: (effort.label ? boundText(effort.label, LABEL_LIMIT) : '') || titleCase(id),
|
|
51
|
+
description: effort.description
|
|
52
|
+
? boundText(effort.description, DESCRIPTION_LIMIT)
|
|
53
|
+
: undefined,
|
|
54
|
+
})
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return out
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function findModel(
|
|
61
|
+
models: readonly ModelOption[],
|
|
62
|
+
id: string | undefined
|
|
63
|
+
): ModelOption | undefined {
|
|
64
|
+
return id === undefined ? undefined : models.find((model) => model.id === id)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** The selected effort, only if the selected model actually offers it. */
|
|
68
|
+
export function resolveEffort(
|
|
69
|
+
model: ModelOption | undefined,
|
|
70
|
+
effort: string | undefined
|
|
71
|
+
): EffortOption | undefined {
|
|
72
|
+
if (!model || effort === undefined) return undefined
|
|
73
|
+
return normalizeEfforts(model.efforts).find((option) => option.id === effort)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export type ModelGroup = Readonly<{ provider: string; models: readonly ModelOption[] }>
|
|
77
|
+
|
|
78
|
+
/** Group by provider, in the order providers first appear, so the host controls ranking. */
|
|
79
|
+
export function groupModels(models: readonly ModelOption[]): ModelGroup[] {
|
|
80
|
+
const groups = new Map<string, ModelOption[]>()
|
|
81
|
+
for (const model of models) {
|
|
82
|
+
const provider = boundText(model.provider, LABEL_LIMIT) || 'Other'
|
|
83
|
+
const bucket = groups.get(provider)
|
|
84
|
+
if (bucket) bucket.push(model)
|
|
85
|
+
else groups.set(provider, [model])
|
|
86
|
+
}
|
|
87
|
+
return [...groups].map(([provider, list]) => ({ provider, models: list }))
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Past this many models the list gets a search box; a short list is quicker to read. */
|
|
91
|
+
export const MODEL_SEARCH_THRESHOLD = 7
|
|
92
|
+
|
|
93
|
+
export function needsSearch(count: number, threshold = MODEL_SEARCH_THRESHOLD): boolean {
|
|
94
|
+
return count > threshold
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* What the search matches against: everything a person might type to find a model
|
|
99
|
+
* — its name, its provider, its id, and its description.
|
|
100
|
+
*/
|
|
101
|
+
export function modelSearchValue(model: ModelOption): string {
|
|
102
|
+
return [model.label, model.provider, model.id, model.description ?? ''].join(' ')
|
|
103
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Plan, type PlanProps, type PlanStep, type PlanStepStatus } from './plan'
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { ListTodo } from 'lucide-solid'
|
|
2
|
+
import { createMemo, Index, Show, splitProps, type JSX } from 'solid-js'
|
|
3
|
+
import { Progress } from '../../ui/progress'
|
|
4
|
+
import { TraceDetail, TraceLine, type TraceLineProps } from '../../ui/trace'
|
|
5
|
+
import {
|
|
6
|
+
TaskItemList,
|
|
7
|
+
TaskItemRow,
|
|
8
|
+
taskProgress,
|
|
9
|
+
taskProgressLabel,
|
|
10
|
+
type TaskItemStatus,
|
|
11
|
+
} from '../task'
|
|
12
|
+
|
|
13
|
+
// A function child runs once, when the content mounts (see `deferred` in `tool.tsx`).
|
|
14
|
+
const deferred = (render: () => JSX.Element) => render as unknown as JSX.Element
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Plan.
|
|
18
|
+
*
|
|
19
|
+
* What the agent intends to do, as a `TraceLine` that opens onto the steps: a
|
|
20
|
+
* title, an optional description, the steps with their status, how far along
|
|
21
|
+
* they are, and — when the host supplies them — the actions the reader can take
|
|
22
|
+
* (approve, edit, run). Reach for `Task` when the list is a unit of work that is
|
|
23
|
+
* already under way and not a proposal, for `Queue` when it is the agent's
|
|
24
|
+
* running todo list, and for `ChainOfThought` when the steps describe how an
|
|
25
|
+
* answer was reached rather than what will be done.
|
|
26
|
+
*
|
|
27
|
+
* ## It opens by default
|
|
28
|
+
*
|
|
29
|
+
* Unlike a tool call, the plan is the thing being decided or followed, so it
|
|
30
|
+
* starts open (`defaultOpen={false}` folds it). A plan with no steps, no
|
|
31
|
+
* description and no actions is a plain line.
|
|
32
|
+
*
|
|
33
|
+
* ## Progress is derived, in words
|
|
34
|
+
*
|
|
35
|
+
* "2 of 5 steps done" and the bar come from the steps' own `status` and appear
|
|
36
|
+
* only when at least one step has one; a step with no status counts toward the
|
|
37
|
+
* total and not toward "done" (the host did not say it was finished). The bar is
|
|
38
|
+
* the shared `Progress`, which publishes the same phrase to assistive
|
|
39
|
+
* technology, so the number is never only a length.
|
|
40
|
+
*
|
|
41
|
+
* ## Streaming
|
|
42
|
+
*
|
|
43
|
+
* While `streaming` the plan is still being written, so its length is not known
|
|
44
|
+
* and no progress is claimed: the title shimmers, the line says "Drafting", and
|
|
45
|
+
* a caret trails the last step. Finished steps keep their DOM while the last one
|
|
46
|
+
* grows (rows are kept by position).
|
|
47
|
+
*
|
|
48
|
+
* ## The host owns authority
|
|
49
|
+
*
|
|
50
|
+
* `actions` is a slot. The plan neither enables nor disables what is in it, and
|
|
51
|
+
* with no `actions` there are no controls — a plan the reader may not approve
|
|
52
|
+
* simply has no Approve button.
|
|
53
|
+
*
|
|
54
|
+
* A `Plan` is a line: place it inside a `Trace`.
|
|
55
|
+
*/
|
|
56
|
+
export type PlanStepStatus = TaskItemStatus
|
|
57
|
+
|
|
58
|
+
export type PlanStep = Readonly<{
|
|
59
|
+
id?: string
|
|
60
|
+
label: string
|
|
61
|
+
description?: string
|
|
62
|
+
status?: PlanStepStatus
|
|
63
|
+
}>
|
|
64
|
+
|
|
65
|
+
export type PlanProps = Omit<
|
|
66
|
+
TraceLineProps,
|
|
67
|
+
'description' | 'href' | 'onSelect' | 'selectHaspopup' | 'children' | 'status' | 'statusLabel'
|
|
68
|
+
> & {
|
|
69
|
+
steps: readonly PlanStep[]
|
|
70
|
+
/** What the plan is for, above the steps. */
|
|
71
|
+
description?: JSX.Element
|
|
72
|
+
/** True while the plan is still being generated. */
|
|
73
|
+
streaming?: boolean
|
|
74
|
+
/** Controls for the reader: approve, edit, run. Absent means there are none. */
|
|
75
|
+
actions?: JSX.Element
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function Plan(props: PlanProps) {
|
|
79
|
+
const [local, rest] = splitProps(props, [
|
|
80
|
+
'steps',
|
|
81
|
+
'description',
|
|
82
|
+
'streaming',
|
|
83
|
+
'actions',
|
|
84
|
+
'icon',
|
|
85
|
+
'meta',
|
|
86
|
+
'defaultOpen',
|
|
87
|
+
])
|
|
88
|
+
const progress = createMemo(() => (local.streaming ? undefined : taskProgress(local.steps)))
|
|
89
|
+
const meta = () => {
|
|
90
|
+
if (local.meta !== undefined) return local.meta
|
|
91
|
+
if (local.streaming) return 'Drafting'
|
|
92
|
+
const value = progress()
|
|
93
|
+
return value ? taskProgressLabel(value) : undefined
|
|
94
|
+
}
|
|
95
|
+
const hasDetail = () =>
|
|
96
|
+
local.steps.length > 0 ||
|
|
97
|
+
local.description !== undefined ||
|
|
98
|
+
local.actions !== undefined ||
|
|
99
|
+
local.streaming === true
|
|
100
|
+
|
|
101
|
+
const detail = () => (
|
|
102
|
+
<TraceDetail class="flex flex-col gap-2">
|
|
103
|
+
<Show when={local.description}>
|
|
104
|
+
<div class="text-sm text-muted-foreground">{local.description}</div>
|
|
105
|
+
</Show>
|
|
106
|
+
<Show when={progress()}>
|
|
107
|
+
{(value) => (
|
|
108
|
+
<Progress
|
|
109
|
+
value={value().done}
|
|
110
|
+
minValue={0}
|
|
111
|
+
maxValue={Math.max(1, value().total)}
|
|
112
|
+
aria-label="Plan progress"
|
|
113
|
+
getValueLabel={({ value: done, max }) =>
|
|
114
|
+
`${done} of ${max} ${max === 1 ? 'step' : 'steps'} done`
|
|
115
|
+
}
|
|
116
|
+
/>
|
|
117
|
+
)}
|
|
118
|
+
</Show>
|
|
119
|
+
<Show when={local.steps.length > 0}>
|
|
120
|
+
<TaskItemList label="Plan steps">
|
|
121
|
+
<Index each={local.steps}>
|
|
122
|
+
{(step) => (
|
|
123
|
+
<TaskItemRow
|
|
124
|
+
text={step().label}
|
|
125
|
+
description={step().description}
|
|
126
|
+
status={step().status}
|
|
127
|
+
/>
|
|
128
|
+
)}
|
|
129
|
+
</Index>
|
|
130
|
+
</TaskItemList>
|
|
131
|
+
</Show>
|
|
132
|
+
<Show when={local.streaming}>
|
|
133
|
+
<span class="streaming-caret" aria-hidden="true" />
|
|
134
|
+
</Show>
|
|
135
|
+
<Show when={local.actions}>
|
|
136
|
+
<div data-slot="plan-actions" class="flex flex-wrap items-center gap-2 pt-1">
|
|
137
|
+
{local.actions}
|
|
138
|
+
</div>
|
|
139
|
+
</Show>
|
|
140
|
+
</TraceDetail>
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
return (
|
|
144
|
+
<TraceLine
|
|
145
|
+
icon={local.icon ?? <ListTodo />}
|
|
146
|
+
status={local.streaming ? 'running' : undefined}
|
|
147
|
+
statusLabel="Generating"
|
|
148
|
+
meta={meta()}
|
|
149
|
+
defaultOpen={local.defaultOpen ?? true}
|
|
150
|
+
{...rest}
|
|
151
|
+
>
|
|
152
|
+
{hasDetail() ? deferred(detail) : undefined}
|
|
153
|
+
</TraceLine>
|
|
154
|
+
)
|
|
155
|
+
}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { CornerDownRight, ListChecks, ListTodo, MessageSquarePlus, X } from 'lucide-solid'
|
|
2
|
+
import {
|
|
3
|
+
createMemo,
|
|
4
|
+
Index,
|
|
5
|
+
onCleanup,
|
|
6
|
+
Show,
|
|
7
|
+
splitProps,
|
|
8
|
+
type ComponentProps,
|
|
9
|
+
type JSX,
|
|
10
|
+
} from 'solid-js'
|
|
11
|
+
import { Button } from '../../ui/button'
|
|
12
|
+
import { Trace, TraceLine } from '../../ui/trace'
|
|
13
|
+
import { TaskItemList, TaskItemRow } from '../task'
|
|
14
|
+
|
|
15
|
+
// A function child runs once, when the content mounts (see `deferred` in `tool.tsx`).
|
|
16
|
+
const deferred = (render: () => JSX.Element) => render as unknown as JSX.Element
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Queue.
|
|
20
|
+
*
|
|
21
|
+
* The agent's todo list, split the way a reader asks about it: what is still to
|
|
22
|
+
* do, and what is already done. Two collapsible sections with their counts,
|
|
23
|
+
* "Pending" open and "Completed" folded — the finished work is the record, the
|
|
24
|
+
* pending work is the question. Reach for `Plan` when the list is a proposal
|
|
25
|
+
* awaiting a decision, for `Task` when it is one piece of work with files
|
|
26
|
+
* attached, and for `QueueFollowUps` (below) when the things waiting are
|
|
27
|
+
* *messages from the person*, not work the agent set itself.
|
|
28
|
+
*
|
|
29
|
+
* ## Sorting is the host's statement, not ours
|
|
30
|
+
*
|
|
31
|
+
* An item is in the Completed section only if its `status` is `complete`.
|
|
32
|
+
* Everything else — `pending`, `active`, or no status at all — is still to do,
|
|
33
|
+
* which is what "not marked done" means; the mark shown matches (an item with
|
|
34
|
+
* no status gets the pending mark, because it is in the Pending section). An
|
|
35
|
+
* empty section is not drawn: "Completed (0)" is noise, and a list with nothing
|
|
36
|
+
* in either section renders nothing, or the `empty` content if the host gave
|
|
37
|
+
* some, rather than a heading over a void.
|
|
38
|
+
*
|
|
39
|
+
* ## Bounded
|
|
40
|
+
*
|
|
41
|
+
* Each section scrolls inside a capped, keyboard-focusable region, and rows are
|
|
42
|
+
* kept by position, so a list of two hundred items does not push the answer out
|
|
43
|
+
* of view and a status change updates a row instead of recreating it. Item text
|
|
44
|
+
* wraps to three lines and is clamped (see `Task`).
|
|
45
|
+
*
|
|
46
|
+
* A `Queue` is a block (its own `Trace`) and can sit between other parts of a
|
|
47
|
+
* turn.
|
|
48
|
+
*/
|
|
49
|
+
export type QueueItemStatus = 'pending' | 'active' | 'complete'
|
|
50
|
+
|
|
51
|
+
export type QueueItem = Readonly<{
|
|
52
|
+
id?: string
|
|
53
|
+
text: string
|
|
54
|
+
description?: string
|
|
55
|
+
status?: QueueItemStatus
|
|
56
|
+
}>
|
|
57
|
+
|
|
58
|
+
/** Split a todo list into the two sections. Order is preserved within each. */
|
|
59
|
+
export function partitionQueue(items: readonly QueueItem[]): Readonly<{
|
|
60
|
+
pending: readonly QueueItem[]
|
|
61
|
+
completed: readonly QueueItem[]
|
|
62
|
+
}> {
|
|
63
|
+
return {
|
|
64
|
+
pending: items.filter((item) => item.status !== 'complete'),
|
|
65
|
+
completed: items.filter((item) => item.status === 'complete'),
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function itemCount(count: number): string {
|
|
70
|
+
return `${count} ${count === 1 ? 'item' : 'items'}`
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** The count, shown as a number and spoken as a phrase. */
|
|
74
|
+
function Count(props: { count: number; noun?: string }) {
|
|
75
|
+
return (
|
|
76
|
+
<>
|
|
77
|
+
<span aria-hidden="true">{props.count}</span>
|
|
78
|
+
<span class="sr-only">{props.noun ?? itemCount(props.count)}</span>
|
|
79
|
+
</>
|
|
80
|
+
)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export type QueueProps = Omit<ComponentProps<typeof Trace>, 'children'> & {
|
|
84
|
+
items: readonly QueueItem[]
|
|
85
|
+
pendingLabel?: string
|
|
86
|
+
completedLabel?: string
|
|
87
|
+
/** Shown when there is nothing in either section. Omit to draw nothing. */
|
|
88
|
+
empty?: JSX.Element
|
|
89
|
+
/** Open the Completed section initially. */
|
|
90
|
+
defaultCompletedOpen?: boolean
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export function Queue(props: QueueProps) {
|
|
94
|
+
const [local, rest] = splitProps(props, [
|
|
95
|
+
'items',
|
|
96
|
+
'pendingLabel',
|
|
97
|
+
'completedLabel',
|
|
98
|
+
'empty',
|
|
99
|
+
'defaultCompletedOpen',
|
|
100
|
+
])
|
|
101
|
+
const sections = createMemo(() => partitionQueue(local.items))
|
|
102
|
+
const pending = () => sections().pending
|
|
103
|
+
const completed = () => sections().completed
|
|
104
|
+
const pendingLabel = () => local.pendingLabel ?? 'Pending'
|
|
105
|
+
const completedLabel = () => local.completedLabel ?? 'Completed'
|
|
106
|
+
|
|
107
|
+
return (
|
|
108
|
+
<Show
|
|
109
|
+
when={local.items.length > 0}
|
|
110
|
+
fallback={
|
|
111
|
+
<Show when={local.empty}>
|
|
112
|
+
<Trace aria-label="Queue" {...rest}>
|
|
113
|
+
<TraceLine title={local.empty} />
|
|
114
|
+
</Trace>
|
|
115
|
+
</Show>
|
|
116
|
+
}
|
|
117
|
+
>
|
|
118
|
+
<Trace aria-label="Queue" {...rest}>
|
|
119
|
+
<Show when={pending().length > 0}>
|
|
120
|
+
<TraceLine
|
|
121
|
+
icon={<ListTodo />}
|
|
122
|
+
title={pendingLabel()}
|
|
123
|
+
meta={<Count count={pending().length} />}
|
|
124
|
+
defaultOpen
|
|
125
|
+
>
|
|
126
|
+
{deferred(() => (
|
|
127
|
+
<TaskItemList label={pendingLabel()}>
|
|
128
|
+
<Index each={pending()}>
|
|
129
|
+
{(item) => (
|
|
130
|
+
<TaskItemRow
|
|
131
|
+
text={item().text}
|
|
132
|
+
description={item().description}
|
|
133
|
+
status={item().status ?? 'pending'}
|
|
134
|
+
/>
|
|
135
|
+
)}
|
|
136
|
+
</Index>
|
|
137
|
+
</TaskItemList>
|
|
138
|
+
))}
|
|
139
|
+
</TraceLine>
|
|
140
|
+
</Show>
|
|
141
|
+
<Show when={completed().length > 0}>
|
|
142
|
+
<TraceLine
|
|
143
|
+
icon={<ListChecks />}
|
|
144
|
+
title={completedLabel()}
|
|
145
|
+
meta={<Count count={completed().length} />}
|
|
146
|
+
defaultOpen={local.defaultCompletedOpen ?? false}
|
|
147
|
+
>
|
|
148
|
+
{deferred(() => (
|
|
149
|
+
<TaskItemList label={completedLabel()}>
|
|
150
|
+
<Index each={completed()}>
|
|
151
|
+
{(item) => (
|
|
152
|
+
<TaskItemRow
|
|
153
|
+
text={item().text}
|
|
154
|
+
description={item().description}
|
|
155
|
+
status="complete"
|
|
156
|
+
/>
|
|
157
|
+
)}
|
|
158
|
+
</Index>
|
|
159
|
+
</TaskItemList>
|
|
160
|
+
))}
|
|
161
|
+
</TraceLine>
|
|
162
|
+
</Show>
|
|
163
|
+
</Trace>
|
|
164
|
+
</Show>
|
|
165
|
+
)
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export type QueueFollowUp = Readonly<{
|
|
169
|
+
id?: string
|
|
170
|
+
text: string
|
|
171
|
+
/** Removes it from the queue. Omit it and the row has no remove control. */
|
|
172
|
+
onRemove?: () => void
|
|
173
|
+
}>
|
|
174
|
+
|
|
175
|
+
const REMOVE_LABEL_CHARS = 60
|
|
176
|
+
|
|
177
|
+
function FollowUpRow(props: { item: QueueFollowUp }) {
|
|
178
|
+
let remove: HTMLButtonElement | undefined
|
|
179
|
+
|
|
180
|
+
// Rows are kept by position, so removing a middle row leaves the focused
|
|
181
|
+
// button where it is (now on the next message). Only the last row is ever
|
|
182
|
+
// disposed under focus; hand focus to the one before it rather than to `body`.
|
|
183
|
+
onCleanup(() => {
|
|
184
|
+
if (!remove || document.activeElement !== remove) return
|
|
185
|
+
const buttons = remove
|
|
186
|
+
.closest('ul')
|
|
187
|
+
?.querySelectorAll<HTMLButtonElement>('button[data-slot="queue-follow-up-remove"]')
|
|
188
|
+
const previous = Array.from(buttons ?? []).filter((button) => button !== remove)
|
|
189
|
+
previous.at(-1)?.focus()
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
const text = () =>
|
|
193
|
+
props.item.text.length > 1_000 ? `${props.item.text.slice(0, 1_000)}…` : props.item.text
|
|
194
|
+
const label = () =>
|
|
195
|
+
props.item.text.length > REMOVE_LABEL_CHARS
|
|
196
|
+
? `${props.item.text.slice(0, REMOVE_LABEL_CHARS)}…`
|
|
197
|
+
: props.item.text
|
|
198
|
+
|
|
199
|
+
return (
|
|
200
|
+
<li data-slot="queue-follow-up" class="flex min-w-0 items-start gap-2 rounded-md px-1.5 py-0.5">
|
|
201
|
+
<CornerDownRight aria-hidden="true" class="mt-0.5 size-3.5 shrink-0 text-muted-foreground" />
|
|
202
|
+
<p
|
|
203
|
+
title={text()}
|
|
204
|
+
class="m-0 line-clamp-3 min-w-0 flex-1 text-sm [overflow-wrap:anywhere] whitespace-pre-wrap text-foreground"
|
|
205
|
+
>
|
|
206
|
+
{text()}
|
|
207
|
+
</p>
|
|
208
|
+
<Show when={props.item.onRemove}>
|
|
209
|
+
{(onRemove) => (
|
|
210
|
+
<Button
|
|
211
|
+
ref={(element) => (remove = element)}
|
|
212
|
+
data-slot="queue-follow-up-remove"
|
|
213
|
+
type="button"
|
|
214
|
+
variant="ghost"
|
|
215
|
+
size="icon-2xs"
|
|
216
|
+
class="shrink-0"
|
|
217
|
+
aria-label={`Remove queued message: ${label()}`}
|
|
218
|
+
onClick={() => onRemove()()}
|
|
219
|
+
>
|
|
220
|
+
<X aria-hidden="true" />
|
|
221
|
+
</Button>
|
|
222
|
+
)}
|
|
223
|
+
</Show>
|
|
224
|
+
</li>
|
|
225
|
+
)
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export type QueueFollowUpsProps = Omit<ComponentProps<typeof Trace>, 'children'> & {
|
|
229
|
+
items: readonly QueueFollowUp[]
|
|
230
|
+
/** The section's title. */
|
|
231
|
+
title?: string
|
|
232
|
+
defaultOpen?: boolean
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Follow-up messages the person sent that have not been delivered yet. They are
|
|
237
|
+
* the person's words, so they are shown as sent (wrapped, clamped to three
|
|
238
|
+
* lines) rather than as work. The remove control exists per message only when
|
|
239
|
+
* that message carries `onRemove`: whether it may still be withdrawn is the
|
|
240
|
+
* runtime's to say, and a message past recall simply has no button. With no
|
|
241
|
+
* messages the component draws nothing.
|
|
242
|
+
*/
|
|
243
|
+
export function QueueFollowUps(props: QueueFollowUpsProps) {
|
|
244
|
+
const [local, rest] = splitProps(props, ['items', 'title', 'defaultOpen'])
|
|
245
|
+
const title = () => local.title ?? 'Queued follow-ups'
|
|
246
|
+
return (
|
|
247
|
+
<Show when={local.items.length > 0}>
|
|
248
|
+
<Trace aria-label={title()} {...rest}>
|
|
249
|
+
<TraceLine
|
|
250
|
+
icon={<MessageSquarePlus />}
|
|
251
|
+
title={title()}
|
|
252
|
+
meta={<Count count={local.items.length} noun={`${local.items.length} waiting`} />}
|
|
253
|
+
defaultOpen={local.defaultOpen ?? true}
|
|
254
|
+
>
|
|
255
|
+
{deferred(() => (
|
|
256
|
+
<TaskItemList label={title()}>
|
|
257
|
+
<Index each={local.items}>{(item) => <FollowUpRow item={item()} />}</Index>
|
|
258
|
+
</TaskItemList>
|
|
259
|
+
))}
|
|
260
|
+
</TraceLine>
|
|
261
|
+
</Trace>
|
|
262
|
+
</Show>
|
|
263
|
+
)
|
|
264
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { formatDuration, Reasoning, reasoningTitle, type ReasoningProps } from './reasoning'
|