@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,443 @@
|
|
|
1
|
+
import { cn } from "../../../lib/utils.js";
|
|
2
|
+
import { CodeBlock, InlineCode } from "../code-block/code-block.js";
|
|
3
|
+
import { parseMessageText } from "./parse-message-text.js";
|
|
4
|
+
import { createComponent, effect, insert, memo, mergeProps, setAttribute, spread, template } from "solid-js/web";
|
|
5
|
+
import { For, Index, Match, Show, Switch, createMemo, splitProps } from "solid-js";
|
|
6
|
+
//#region src/components/ui/message/message.tsx
|
|
7
|
+
var _tmpl$ = /*#__PURE__*/ template(`<article data-slot=message>`);
|
|
8
|
+
var _tmpl$2 = /*#__PURE__*/ template(`<span class=tabular-nums>`);
|
|
9
|
+
var _tmpl$3 = /*#__PURE__*/ template(`<header data-slot=message-header><span class="font-medium text-foreground">`);
|
|
10
|
+
var _tmpl$4 = /*#__PURE__*/ template(`<div data-slot=message-content>`);
|
|
11
|
+
var _tmpl$5 = /*#__PURE__*/ template(`<div data-slot=message-actions>`);
|
|
12
|
+
var _tmpl$6 = /*#__PURE__*/ template(`<footer data-slot=message-footer>`);
|
|
13
|
+
var _tmpl$7 = /*#__PURE__*/ template(`<span class=streaming-caret aria-hidden=true>`);
|
|
14
|
+
var _tmpl$8 = /*#__PURE__*/ template(`<div data-slot=message-text>`);
|
|
15
|
+
var _tmpl$9 = /*#__PURE__*/ template(`<p role=heading class="font-semibold text-foreground [overflow-wrap:anywhere]">`);
|
|
16
|
+
var _tmpl$0 = /*#__PURE__*/ template(`<ol class="m-0 ms-5 flex list-decimal flex-col gap-1 p-0 marker:text-muted-foreground">`);
|
|
17
|
+
var _tmpl$1 = /*#__PURE__*/ template(`<ul class="m-0 ms-5 flex list-disc flex-col gap-1 p-0 marker:text-muted-foreground">`);
|
|
18
|
+
var _tmpl$10 = /*#__PURE__*/ template(`<li class=[overflow-wrap:anywhere]>`);
|
|
19
|
+
var _tmpl$11 = /*#__PURE__*/ template(`<blockquote class="m-0 border-s-2 border-border ps-3 whitespace-pre-wrap text-muted-foreground [overflow-wrap:anywhere]">`);
|
|
20
|
+
var _tmpl$12 = /*#__PURE__*/ template(`<p class="m-0 whitespace-pre-wrap [overflow-wrap:anywhere]">`);
|
|
21
|
+
var _tmpl$13 = /*#__PURE__*/ template(`<strong class=font-semibold>`);
|
|
22
|
+
var _tmpl$14 = /*#__PURE__*/ template(`<em>`);
|
|
23
|
+
var _tmpl$15 = /*#__PURE__*/ template(`<a target=_blank rel="noreferrer noopener"class="text-primary underline underline-offset-2 hover:no-underline">`);
|
|
24
|
+
function Message(props) {
|
|
25
|
+
const [local, rest] = splitProps(props, [
|
|
26
|
+
"class",
|
|
27
|
+
"role",
|
|
28
|
+
"label",
|
|
29
|
+
"streaming",
|
|
30
|
+
"anchorId",
|
|
31
|
+
"children"
|
|
32
|
+
]);
|
|
33
|
+
return (() => {
|
|
34
|
+
var _el$ = _tmpl$();
|
|
35
|
+
spread(_el$, mergeProps({
|
|
36
|
+
get ["data-role"]() {
|
|
37
|
+
return local.role;
|
|
38
|
+
},
|
|
39
|
+
get ["data-anchor-id"]() {
|
|
40
|
+
return local.anchorId;
|
|
41
|
+
},
|
|
42
|
+
get ["aria-label"]() {
|
|
43
|
+
return local.label;
|
|
44
|
+
},
|
|
45
|
+
get ["aria-busy"]() {
|
|
46
|
+
return local.streaming || void 0;
|
|
47
|
+
},
|
|
48
|
+
get ["class"]() {
|
|
49
|
+
return cn("group/message mx-auto flex w-full max-w-3xl min-w-0 flex-col gap-2 py-2", "[content-visibility:auto] [contain-intrinsic-size:auto_6rem]", {
|
|
50
|
+
"items-end ps-[clamp(0rem,12%,4rem)]": local.role === "user",
|
|
51
|
+
"items-stretch": local.role !== "user"
|
|
52
|
+
}, local.class);
|
|
53
|
+
}
|
|
54
|
+
}, rest), false, true);
|
|
55
|
+
insert(_el$, () => local.children);
|
|
56
|
+
return _el$;
|
|
57
|
+
})();
|
|
58
|
+
}
|
|
59
|
+
/** The speaker's mark and name, for the turns that draw one. */
|
|
60
|
+
function MessageHeader(props) {
|
|
61
|
+
const [local, rest] = splitProps(props, [
|
|
62
|
+
"class",
|
|
63
|
+
"avatar",
|
|
64
|
+
"time",
|
|
65
|
+
"children"
|
|
66
|
+
]);
|
|
67
|
+
return (() => {
|
|
68
|
+
var _el$2 = _tmpl$3(), _el$3 = _el$2.firstChild;
|
|
69
|
+
spread(_el$2, mergeProps({ get ["class"]() {
|
|
70
|
+
return cn("flex items-center gap-2 text-xs text-muted-foreground", local.class);
|
|
71
|
+
} }, rest), false, true);
|
|
72
|
+
insert(_el$2, createComponent(Show, {
|
|
73
|
+
get when() {
|
|
74
|
+
return local.avatar;
|
|
75
|
+
},
|
|
76
|
+
get children() {
|
|
77
|
+
return local.avatar;
|
|
78
|
+
}
|
|
79
|
+
}), _el$3);
|
|
80
|
+
insert(_el$3, () => local.children);
|
|
81
|
+
insert(_el$2, createComponent(Show, {
|
|
82
|
+
get when() {
|
|
83
|
+
return local.time;
|
|
84
|
+
},
|
|
85
|
+
get children() {
|
|
86
|
+
var _el$4 = _tmpl$2();
|
|
87
|
+
insert(_el$4, () => local.time);
|
|
88
|
+
return _el$4;
|
|
89
|
+
}
|
|
90
|
+
}), null);
|
|
91
|
+
return _el$2;
|
|
92
|
+
})();
|
|
93
|
+
}
|
|
94
|
+
/** The turn's parts, stacked. Gap is the rhythm between prose, activity and code. */
|
|
95
|
+
function MessageContent(props) {
|
|
96
|
+
const [local, rest] = splitProps(props, ["class", "children"]);
|
|
97
|
+
return (() => {
|
|
98
|
+
var _el$5 = _tmpl$4();
|
|
99
|
+
spread(_el$5, mergeProps({ get ["class"]() {
|
|
100
|
+
return cn("flex w-full max-w-3xl min-w-0 flex-col gap-3 font-content text-content", local.class);
|
|
101
|
+
} }, rest), false, true);
|
|
102
|
+
insert(_el$5, () => local.children);
|
|
103
|
+
return _el$5;
|
|
104
|
+
})();
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Actions that belong to the turn (copy, retry). Hidden until the turn is hovered
|
|
108
|
+
* or focused so the column is not a wall of buttons, but never `display: none`:
|
|
109
|
+
* a control that only exists under the pointer cannot be reached by keyboard,
|
|
110
|
+
* and on a touch screen there is no hover, so coarse pointers always see them.
|
|
111
|
+
*/
|
|
112
|
+
function MessageActions(props) {
|
|
113
|
+
const [local, rest] = splitProps(props, ["class", "children"]);
|
|
114
|
+
return (() => {
|
|
115
|
+
var _el$6 = _tmpl$5();
|
|
116
|
+
spread(_el$6, mergeProps({ get ["class"]() {
|
|
117
|
+
return cn("flex items-center gap-1 opacity-0 transition-opacity ease-out group-focus-within/message:opacity-100 group-hover/message:opacity-100 [@media(hover:none)]:opacity-100", local.class);
|
|
118
|
+
} }, rest), false, true);
|
|
119
|
+
insert(_el$6, () => local.children);
|
|
120
|
+
return _el$6;
|
|
121
|
+
})();
|
|
122
|
+
}
|
|
123
|
+
function MessageFooter(props) {
|
|
124
|
+
const [local, rest] = splitProps(props, ["class", "children"]);
|
|
125
|
+
return (() => {
|
|
126
|
+
var _el$7 = _tmpl$6();
|
|
127
|
+
spread(_el$7, mergeProps({ get ["class"]() {
|
|
128
|
+
return cn("flex min-w-0 items-center gap-2 text-xs text-muted-foreground", local.class);
|
|
129
|
+
} }, rest), false, true);
|
|
130
|
+
insert(_el$7, () => local.children);
|
|
131
|
+
return _el$7;
|
|
132
|
+
})();
|
|
133
|
+
}
|
|
134
|
+
function sameBlock(a, b) {
|
|
135
|
+
return a !== void 0 && a.kind === b.kind && a.raw === b.raw && (a.kind !== "code" || b.kind === "code" && a.complete === b.complete);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Text, read safely.
|
|
139
|
+
*
|
|
140
|
+
* Renders `parseMessageText`'s blocks as elements: nothing is interpreted as
|
|
141
|
+
* HTML and a link only becomes an anchor when its scheme is http, https or
|
|
142
|
+
* mailto. Blocks are kept by *position* and reuse their previous parsed object
|
|
143
|
+
* when unchanged, so a streaming turn updates the block that is growing and
|
|
144
|
+
* leaves every earlier paragraph and code block — and any selection or focus
|
|
145
|
+
* inside them — untouched.
|
|
146
|
+
*/
|
|
147
|
+
function MessageText(props) {
|
|
148
|
+
const [local, rest] = splitProps(props, [
|
|
149
|
+
"class",
|
|
150
|
+
"text",
|
|
151
|
+
"streaming",
|
|
152
|
+
"codeBlockProps",
|
|
153
|
+
"citations"
|
|
154
|
+
]);
|
|
155
|
+
let previous = [];
|
|
156
|
+
let previousCount = 0;
|
|
157
|
+
const citationCount = () => local.citations?.count ?? 0;
|
|
158
|
+
const blocks = createMemo(() => {
|
|
159
|
+
const count = citationCount();
|
|
160
|
+
if (count !== previousCount) previous = [];
|
|
161
|
+
previousCount = count;
|
|
162
|
+
const merged = parseMessageText(local.text, {
|
|
163
|
+
streaming: local.streaming,
|
|
164
|
+
citations: count || void 0
|
|
165
|
+
}).map((block, index) => sameBlock(previous[index], block) ? previous[index] : block);
|
|
166
|
+
previous = merged;
|
|
167
|
+
return merged;
|
|
168
|
+
});
|
|
169
|
+
const codeIndexes = createMemo(() => {
|
|
170
|
+
let next = 0;
|
|
171
|
+
return blocks().map((block) => block.kind === "code" ? next++ : -1);
|
|
172
|
+
});
|
|
173
|
+
const lastIsProse = () => {
|
|
174
|
+
const last = blocks().at(-1);
|
|
175
|
+
return last !== void 0 && last.kind !== "code";
|
|
176
|
+
};
|
|
177
|
+
return (() => {
|
|
178
|
+
var _el$8 = _tmpl$8();
|
|
179
|
+
spread(_el$8, mergeProps({ get ["class"]() {
|
|
180
|
+
return cn("flex min-w-0 flex-col gap-3", local.class);
|
|
181
|
+
} }, rest), false, true);
|
|
182
|
+
insert(_el$8, createComponent(Index, {
|
|
183
|
+
get each() {
|
|
184
|
+
return blocks();
|
|
185
|
+
},
|
|
186
|
+
children: (block, index) => createComponent(BlockView, {
|
|
187
|
+
get block() {
|
|
188
|
+
return block();
|
|
189
|
+
},
|
|
190
|
+
get codeProps() {
|
|
191
|
+
return local.codeBlockProps;
|
|
192
|
+
},
|
|
193
|
+
codeIndex: () => codeIndexes()[index] ?? 0,
|
|
194
|
+
get citations() {
|
|
195
|
+
return local.citations;
|
|
196
|
+
}
|
|
197
|
+
})
|
|
198
|
+
}), null);
|
|
199
|
+
insert(_el$8, createComponent(Show, {
|
|
200
|
+
get when() {
|
|
201
|
+
return memo(() => !!local.streaming)() && lastIsProse();
|
|
202
|
+
},
|
|
203
|
+
get children() {
|
|
204
|
+
return _tmpl$7();
|
|
205
|
+
}
|
|
206
|
+
}), null);
|
|
207
|
+
return _el$8;
|
|
208
|
+
})();
|
|
209
|
+
}
|
|
210
|
+
function BlockView(props) {
|
|
211
|
+
return createComponent(Switch, { get children() {
|
|
212
|
+
return [
|
|
213
|
+
createComponent(Match, {
|
|
214
|
+
get when() {
|
|
215
|
+
return memo(() => props.block.kind === "code")() && props.block;
|
|
216
|
+
},
|
|
217
|
+
children: (block) => {
|
|
218
|
+
const code = () => block();
|
|
219
|
+
const chosen = () => {
|
|
220
|
+
const choice = props.codeProps;
|
|
221
|
+
return typeof choice === "function" ? choice({
|
|
222
|
+
index: props.codeIndex(),
|
|
223
|
+
language: code().language,
|
|
224
|
+
code: code().code,
|
|
225
|
+
complete: code().complete
|
|
226
|
+
}) : choice;
|
|
227
|
+
};
|
|
228
|
+
return createComponent(CodeBlock, mergeProps({
|
|
229
|
+
get code() {
|
|
230
|
+
return code().code;
|
|
231
|
+
},
|
|
232
|
+
get language() {
|
|
233
|
+
return code().language;
|
|
234
|
+
},
|
|
235
|
+
get complete() {
|
|
236
|
+
return code().complete;
|
|
237
|
+
}
|
|
238
|
+
}, chosen));
|
|
239
|
+
}
|
|
240
|
+
}),
|
|
241
|
+
createComponent(Match, {
|
|
242
|
+
get when() {
|
|
243
|
+
return memo(() => props.block.kind === "heading")() && props.block;
|
|
244
|
+
},
|
|
245
|
+
children: (block) => {
|
|
246
|
+
const heading = () => block();
|
|
247
|
+
return (() => {
|
|
248
|
+
var _el$0 = _tmpl$9();
|
|
249
|
+
insert(_el$0, createComponent(Inline, {
|
|
250
|
+
get nodes() {
|
|
251
|
+
return heading().inline;
|
|
252
|
+
},
|
|
253
|
+
get citations() {
|
|
254
|
+
return props.citations;
|
|
255
|
+
}
|
|
256
|
+
}));
|
|
257
|
+
effect(() => setAttribute(_el$0, "aria-level", heading().level + 2));
|
|
258
|
+
return _el$0;
|
|
259
|
+
})();
|
|
260
|
+
}
|
|
261
|
+
}),
|
|
262
|
+
createComponent(Match, {
|
|
263
|
+
get when() {
|
|
264
|
+
return memo(() => props.block.kind === "list")() && props.block;
|
|
265
|
+
},
|
|
266
|
+
children: (block) => {
|
|
267
|
+
const list = () => block();
|
|
268
|
+
return createComponent(Show, {
|
|
269
|
+
get when() {
|
|
270
|
+
return list().ordered;
|
|
271
|
+
},
|
|
272
|
+
get fallback() {
|
|
273
|
+
return (() => {
|
|
274
|
+
var _el$10 = _tmpl$1();
|
|
275
|
+
insert(_el$10, createComponent(For, {
|
|
276
|
+
get each() {
|
|
277
|
+
return list().items;
|
|
278
|
+
},
|
|
279
|
+
children: (item) => (() => {
|
|
280
|
+
var _el$11 = _tmpl$10();
|
|
281
|
+
insert(_el$11, createComponent(Inline, {
|
|
282
|
+
nodes: item,
|
|
283
|
+
get citations() {
|
|
284
|
+
return props.citations;
|
|
285
|
+
}
|
|
286
|
+
}));
|
|
287
|
+
return _el$11;
|
|
288
|
+
})()
|
|
289
|
+
}));
|
|
290
|
+
return _el$10;
|
|
291
|
+
})();
|
|
292
|
+
},
|
|
293
|
+
get children() {
|
|
294
|
+
var _el$1 = _tmpl$0();
|
|
295
|
+
insert(_el$1, createComponent(For, {
|
|
296
|
+
get each() {
|
|
297
|
+
return list().items;
|
|
298
|
+
},
|
|
299
|
+
children: (item) => (() => {
|
|
300
|
+
var _el$12 = _tmpl$10();
|
|
301
|
+
insert(_el$12, createComponent(Inline, {
|
|
302
|
+
nodes: item,
|
|
303
|
+
get citations() {
|
|
304
|
+
return props.citations;
|
|
305
|
+
}
|
|
306
|
+
}));
|
|
307
|
+
return _el$12;
|
|
308
|
+
})()
|
|
309
|
+
}));
|
|
310
|
+
effect(() => setAttribute(_el$1, "start", list().start));
|
|
311
|
+
return _el$1;
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
}),
|
|
316
|
+
createComponent(Match, {
|
|
317
|
+
get when() {
|
|
318
|
+
return memo(() => props.block.kind === "quote")() && props.block;
|
|
319
|
+
},
|
|
320
|
+
children: (block) => {
|
|
321
|
+
const quote = () => block();
|
|
322
|
+
return (() => {
|
|
323
|
+
var _el$13 = _tmpl$11();
|
|
324
|
+
insert(_el$13, createComponent(Inline, {
|
|
325
|
+
get nodes() {
|
|
326
|
+
return quote().inline;
|
|
327
|
+
},
|
|
328
|
+
get citations() {
|
|
329
|
+
return props.citations;
|
|
330
|
+
}
|
|
331
|
+
}));
|
|
332
|
+
return _el$13;
|
|
333
|
+
})();
|
|
334
|
+
}
|
|
335
|
+
}),
|
|
336
|
+
createComponent(Match, {
|
|
337
|
+
get when() {
|
|
338
|
+
return memo(() => props.block.kind === "paragraph")() && props.block;
|
|
339
|
+
},
|
|
340
|
+
children: (block) => {
|
|
341
|
+
const paragraph = () => block();
|
|
342
|
+
return (() => {
|
|
343
|
+
var _el$14 = _tmpl$12();
|
|
344
|
+
insert(_el$14, createComponent(Inline, {
|
|
345
|
+
get nodes() {
|
|
346
|
+
return paragraph().inline;
|
|
347
|
+
},
|
|
348
|
+
get citations() {
|
|
349
|
+
return props.citations;
|
|
350
|
+
}
|
|
351
|
+
}));
|
|
352
|
+
return _el$14;
|
|
353
|
+
})();
|
|
354
|
+
}
|
|
355
|
+
})
|
|
356
|
+
];
|
|
357
|
+
} });
|
|
358
|
+
}
|
|
359
|
+
function Inline(props) {
|
|
360
|
+
return createComponent(For, {
|
|
361
|
+
get each() {
|
|
362
|
+
return props.nodes;
|
|
363
|
+
},
|
|
364
|
+
children: (node) => createComponent(Switch, { get children() {
|
|
365
|
+
return [
|
|
366
|
+
createComponent(Match, {
|
|
367
|
+
get when() {
|
|
368
|
+
return node.kind === "text" && node;
|
|
369
|
+
},
|
|
370
|
+
children: (text) => text().text
|
|
371
|
+
}),
|
|
372
|
+
createComponent(Match, {
|
|
373
|
+
get when() {
|
|
374
|
+
return node.kind === "code" && node;
|
|
375
|
+
},
|
|
376
|
+
children: (code) => createComponent(InlineCode, { get children() {
|
|
377
|
+
return code().text;
|
|
378
|
+
} })
|
|
379
|
+
}),
|
|
380
|
+
createComponent(Match, {
|
|
381
|
+
get when() {
|
|
382
|
+
return node.kind === "strong" && node;
|
|
383
|
+
},
|
|
384
|
+
children: (strong) => (() => {
|
|
385
|
+
var _el$15 = _tmpl$13();
|
|
386
|
+
insert(_el$15, createComponent(Inline, {
|
|
387
|
+
get nodes() {
|
|
388
|
+
return strong().children;
|
|
389
|
+
},
|
|
390
|
+
get citations() {
|
|
391
|
+
return props.citations;
|
|
392
|
+
}
|
|
393
|
+
}));
|
|
394
|
+
return _el$15;
|
|
395
|
+
})()
|
|
396
|
+
}),
|
|
397
|
+
createComponent(Match, {
|
|
398
|
+
get when() {
|
|
399
|
+
return node.kind === "em" && node;
|
|
400
|
+
},
|
|
401
|
+
children: (em) => (() => {
|
|
402
|
+
var _el$16 = _tmpl$14();
|
|
403
|
+
insert(_el$16, createComponent(Inline, {
|
|
404
|
+
get nodes() {
|
|
405
|
+
return em().children;
|
|
406
|
+
},
|
|
407
|
+
get citations() {
|
|
408
|
+
return props.citations;
|
|
409
|
+
}
|
|
410
|
+
}));
|
|
411
|
+
return _el$16;
|
|
412
|
+
})()
|
|
413
|
+
}),
|
|
414
|
+
createComponent(Match, {
|
|
415
|
+
get when() {
|
|
416
|
+
return node.kind === "link" && node;
|
|
417
|
+
},
|
|
418
|
+
children: (link) => (() => {
|
|
419
|
+
var _el$17 = _tmpl$15();
|
|
420
|
+
insert(_el$17, createComponent(Inline, { get nodes() {
|
|
421
|
+
return link().children;
|
|
422
|
+
} }));
|
|
423
|
+
effect(() => setAttribute(_el$17, "href", link().href));
|
|
424
|
+
return _el$17;
|
|
425
|
+
})()
|
|
426
|
+
}),
|
|
427
|
+
createComponent(Match, {
|
|
428
|
+
get when() {
|
|
429
|
+
return node.kind === "cite" && node;
|
|
430
|
+
},
|
|
431
|
+
children: (cite) => {
|
|
432
|
+
const marker = () => cite();
|
|
433
|
+
return memo(() => memo(() => !!props.citations)() ? props.citations.render(marker().numbers) : marker().raw);
|
|
434
|
+
}
|
|
435
|
+
})
|
|
436
|
+
];
|
|
437
|
+
} })
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
//#endregion
|
|
441
|
+
export { Message, MessageActions, MessageContent, MessageFooter, MessageHeader, MessageText };
|
|
442
|
+
|
|
443
|
+
//# sourceMappingURL=message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.js","names":["createMemo","For","Index","Match","Show","splitProps","Switch","ComponentProps","JSX","cn","CodeBlock","InlineCode","CodeBlockProps","parseMessageText","MessageBlock","MessageInline","MessageRole","MessageProps","Omit","role","label","streaming","anchorId","Message","props","local","rest","_el$","_tmpl$","_$spread","_$mergeProps","data-role","data-anchor-id","aria-label","aria-busy","undefined","class","_$insert","children","MessageHeader","avatar","Element","time","_el$2","_tmpl$3","_el$3","firstChild","_$createComponent","when","_el$4","_tmpl$2","MessageContent","_el$5","_tmpl$4","MessageActions","_el$6","_tmpl$5","MessageFooter","_el$7","_tmpl$6","MessageCodeBlockProps","Pick","MessageCodeBlockInfo","Readonly","index","language","code","complete","MessageCitations","count","render","numbers","MessageTextProps","text","codeBlockProps","block","citations","sameBlock","a","b","kind","raw","MessageText","previous","previousCount","citationCount","blocks","next","merged","map","codeIndexes","lastIsProse","last","at","_el$8","_tmpl$8","each","BlockView","codeProps","codeIndex","_$memo","_tmpl$7","Extract","chosen","choice","heading","_el$0","_tmpl$9","Inline","nodes","inline","_$effect","_$setAttribute","level","list","ordered","fallback","_el$10","_tmpl$1","items","item","_el$11","_tmpl$10","_el$1","_tmpl$0","_el$12","start","quote","_el$13","_tmpl$11","paragraph","_el$14","_tmpl$12","node","strong","_el$15","_tmpl$13","em","_el$16","_tmpl$14","link","_el$17","_tmpl$15","href","cite","marker","_$mergeProps","_$createComponent","_$memo","_$setAttribute"],"sources":["../../../../src/components/ui/message/message.tsx"],"sourcesContent":["import {\n createMemo,\n For,\n Index,\n Match,\n Show,\n splitProps,\n Switch,\n type ComponentProps,\n type JSX,\n} from 'solid-js'\nimport { cn } from '#lib/utils'\nimport { CodeBlock, InlineCode, type CodeBlockProps } from '../code-block'\nimport { parseMessageText, type MessageBlock, type MessageInline } from './parse-message-text'\n\n/**\n * Message.\n *\n * One turn. The two speakers are laid out differently on purpose, and that is\n * the whole design:\n *\n * - **The person's turn is a bubble on the trailing edge** — short, bounded, and\n * easy to find when scrolling back through a long session.\n * - **The assistant's turn is the page.** It has no surface, spans the reading\n * column, and holds everything the agent did *for that request* — activity\n * (a `Trace`), prose, code, a pending decision — in one place, so a turn\n * reads as an answer with its working underneath it rather than as a chain of\n * unrelated cards.\n *\n * `label` is the turn's accessible name (\"You\", \"Assistant\"): the avatar and\n * name are not drawn for every turn, because a transcript that repeats a speaker\n * on every line is one nobody reads, but the name must still be announced.\n * `streaming` sets `aria-busy`, which tells assistive technology to wait for the\n * turn to settle before reading it instead of announcing every token.\n *\n * `anchorId` is the stable identity `MessageScroller` uses to keep the reader's\n * place when older turns are inserted above it.\n */\nexport type MessageRole = 'user' | 'assistant' | 'system'\n\nexport type MessageProps = Omit<ComponentProps<'article'>, 'role'> & {\n role: MessageRole\n /** The turn's accessible name. */\n label: string\n streaming?: boolean\n anchorId?: string\n}\n\nexport function Message(props: MessageProps) {\n const [local, rest] = splitProps(props, [\n 'class',\n 'role',\n 'label',\n 'streaming',\n 'anchorId',\n 'children',\n ])\n return (\n <article\n data-slot=\"message\"\n data-role={local.role}\n data-anchor-id={local.anchorId}\n aria-label={local.label}\n aria-busy={local.streaming || undefined}\n class={cn(\n 'group/message mx-auto flex w-full max-w-3xl min-w-0 flex-col gap-2 py-2',\n // The engine may skip layout for turns far off screen; the intrinsic size\n // keeps the scrollbar honest while it does.\n '[content-visibility:auto] [contain-intrinsic-size:auto_6rem]',\n {\n 'items-end ps-[clamp(0rem,12%,4rem)]': local.role === 'user',\n 'items-stretch': local.role !== 'user',\n },\n local.class\n )}\n {...rest}\n >\n {local.children}\n </article>\n )\n}\n\n/** The speaker's mark and name, for the turns that draw one. */\nexport function MessageHeader(\n props: ComponentProps<'header'> & { avatar?: JSX.Element; time?: JSX.Element }\n) {\n const [local, rest] = splitProps(props, ['class', 'avatar', 'time', 'children'])\n return (\n <header\n data-slot=\"message-header\"\n class={cn('flex items-center gap-2 text-xs text-muted-foreground', local.class)}\n {...rest}\n >\n <Show when={local.avatar}>{local.avatar}</Show>\n <span class=\"font-medium text-foreground\">{local.children}</span>\n <Show when={local.time}>\n <span class=\"tabular-nums\">{local.time}</span>\n </Show>\n </header>\n )\n}\n\n/** The turn's parts, stacked. Gap is the rhythm between prose, activity and code. */\nexport function MessageContent(props: ComponentProps<'div'>) {\n const [local, rest] = splitProps(props, ['class', 'children'])\n return (\n <div\n data-slot=\"message-content\"\n class={cn(\n 'flex w-full max-w-3xl min-w-0 flex-col gap-3 font-content text-content',\n local.class\n )}\n {...rest}\n >\n {local.children}\n </div>\n )\n}\n\n/**\n * Actions that belong to the turn (copy, retry). Hidden until the turn is hovered\n * or focused so the column is not a wall of buttons, but never `display: none`:\n * a control that only exists under the pointer cannot be reached by keyboard,\n * and on a touch screen there is no hover, so coarse pointers always see them.\n */\nexport function MessageActions(props: ComponentProps<'div'>) {\n const [local, rest] = splitProps(props, ['class', 'children'])\n return (\n <div\n data-slot=\"message-actions\"\n class={cn(\n 'flex items-center gap-1 opacity-0 transition-opacity ease-out group-focus-within/message:opacity-100 group-hover/message:opacity-100 [@media(hover:none)]:opacity-100',\n local.class\n )}\n {...rest}\n >\n {local.children}\n </div>\n )\n}\n\nexport function MessageFooter(props: ComponentProps<'footer'>) {\n const [local, rest] = splitProps(props, ['class', 'children'])\n return (\n <footer\n data-slot=\"message-footer\"\n class={cn('flex min-w-0 items-center gap-2 text-xs text-muted-foreground', local.class)}\n {...rest}\n >\n {local.children}\n </footer>\n )\n}\n\n/** The props of a fenced block the host may set. */\nexport type MessageCodeBlockProps = Pick<\n CodeBlockProps,\n 'loadHighlight' | 'maxHeight' | 'wrap' | 'showLineNumbers' | 'lineMarks' | 'lineLimit'\n>\n\n/** What the host is told about a fenced block when it chooses that block's props. */\nexport type MessageCodeBlockInfo = Readonly<{\n /** Position among the text's fenced blocks, from 0. */\n index: number\n language: string | undefined\n code: string\n complete: boolean\n}>\n\n/**\n * How `MessageText` draws citation markers. `count` is how many sources the host\n * has; a `[^n]` marker is a citation only when every `n` is within it. `render`\n * receives the 1-based source numbers and draws the marker, so the host decides\n * what a number means (`messageCitations` in the inline-citation composite does\n * this for a `Source` list).\n */\nexport type MessageCitations = Readonly<{\n count: number\n render: (numbers: readonly number[]) => JSX.Element\n}>\n\nexport type MessageTextProps = Omit<ComponentProps<'div'>, 'children'> & {\n text: string\n /** True while text may still arrive: a trailing open fence renders as partial code. */\n streaming?: boolean\n /**\n * Forwarded to each fenced block, e.g. to supply a lazy highlighter. A function\n * chooses per block, which is how line marks reach a block: marks belong to the\n * host's knowledge of the code (a diff, a failing line), never to the text.\n */\n codeBlockProps?: MessageCodeBlockProps | ((block: MessageCodeBlockInfo) => MessageCodeBlockProps)\n /** Without it, `[^1]` stays the literal text it was written as. */\n citations?: MessageCitations\n}\n\nfunction sameBlock(a: MessageBlock | undefined, b: MessageBlock): boolean {\n return (\n a !== undefined &&\n a.kind === b.kind &&\n a.raw === b.raw &&\n (a.kind !== 'code' || (b.kind === 'code' && a.complete === b.complete))\n )\n}\n\n/**\n * Text, read safely.\n *\n * Renders `parseMessageText`'s blocks as elements: nothing is interpreted as\n * HTML and a link only becomes an anchor when its scheme is http, https or\n * mailto. Blocks are kept by *position* and reuse their previous parsed object\n * when unchanged, so a streaming turn updates the block that is growing and\n * leaves every earlier paragraph and code block — and any selection or focus\n * inside them — untouched.\n */\nexport function MessageText(props: MessageTextProps) {\n const [local, rest] = splitProps(props, [\n 'class',\n 'text',\n 'streaming',\n 'codeBlockProps',\n 'citations',\n ])\n let previous: readonly MessageBlock[] = []\n let previousCount = 0\n // Only the number of sources reaches the parser, so a new `render` function\n // does not reparse the text, and a changed count does.\n const citationCount = () => local.citations?.count ?? 0\n const blocks = createMemo(() => {\n const count = citationCount()\n if (count !== previousCount) previous = []\n previousCount = count\n const next = parseMessageText(local.text, {\n streaming: local.streaming,\n citations: count || undefined,\n })\n const merged = next.map((block, index) =>\n sameBlock(previous[index], block) ? previous[index]! : block\n )\n previous = merged\n return merged\n })\n // The nth fenced block, so a host can address it. Blocks keep their positions\n // while text streams in after them, so an index stays attached to its block.\n const codeIndexes = createMemo(() => {\n let next = 0\n return blocks().map((block) => (block.kind === 'code' ? next++ : -1))\n })\n const lastIsProse = () => {\n const last = blocks().at(-1)\n return last !== undefined && last.kind !== 'code'\n }\n return (\n <div data-slot=\"message-text\" class={cn('flex min-w-0 flex-col gap-3', local.class)} {...rest}>\n <Index each={blocks()}>\n {(block, index) => (\n <BlockView\n block={block()}\n codeProps={local.codeBlockProps}\n codeIndex={() => codeIndexes()[index] ?? 0}\n citations={local.citations}\n />\n )}\n </Index>\n <Show when={local.streaming && lastIsProse()}>\n <span class=\"streaming-caret\" aria-hidden=\"true\" />\n </Show>\n </div>\n )\n}\n\nfunction BlockView(props: {\n block: MessageBlock\n codeProps?: MessageTextProps['codeBlockProps']\n codeIndex: () => number\n citations?: MessageCitations\n}) {\n return (\n <Switch>\n <Match when={props.block.kind === 'code' && props.block}>\n {(block) => {\n const code = () => block() as Extract<MessageBlock, { kind: 'code' }>\n const chosen = () => {\n const choice = props.codeProps\n return typeof choice === 'function'\n ? choice({\n index: props.codeIndex(),\n language: code().language,\n code: code().code,\n complete: code().complete,\n })\n : choice\n }\n return (\n <CodeBlock\n code={code().code}\n language={code().language}\n complete={code().complete}\n {...chosen()}\n />\n )\n }}\n </Match>\n <Match when={props.block.kind === 'heading' && props.block}>\n {(block) => {\n const heading = () => block() as Extract<MessageBlock, { kind: 'heading' }>\n return (\n <p\n role=\"heading\"\n aria-level={heading().level + 2}\n class=\"font-semibold text-foreground [overflow-wrap:anywhere]\"\n >\n <Inline nodes={heading().inline} citations={props.citations} />\n </p>\n )\n }}\n </Match>\n <Match when={props.block.kind === 'list' && props.block}>\n {(block) => {\n const list = () => block() as Extract<MessageBlock, { kind: 'list' }>\n return (\n <Show\n when={list().ordered}\n fallback={\n <ul class=\"m-0 ms-5 flex list-disc flex-col gap-1 p-0 marker:text-muted-foreground\">\n <For each={list().items}>\n {(item) => (\n <li class=\"[overflow-wrap:anywhere]\">\n <Inline nodes={item} citations={props.citations} />\n </li>\n )}\n </For>\n </ul>\n }\n >\n <ol\n start={list().start}\n class=\"m-0 ms-5 flex list-decimal flex-col gap-1 p-0 marker:text-muted-foreground\"\n >\n <For each={list().items}>\n {(item) => (\n <li class=\"[overflow-wrap:anywhere]\">\n <Inline nodes={item} citations={props.citations} />\n </li>\n )}\n </For>\n </ol>\n </Show>\n )\n }}\n </Match>\n <Match when={props.block.kind === 'quote' && props.block}>\n {(block) => {\n const quote = () => block() as Extract<MessageBlock, { kind: 'quote' }>\n return (\n <blockquote class=\"m-0 border-s-2 border-border ps-3 whitespace-pre-wrap text-muted-foreground [overflow-wrap:anywhere]\">\n <Inline nodes={quote().inline} citations={props.citations} />\n </blockquote>\n )\n }}\n </Match>\n <Match when={props.block.kind === 'paragraph' && props.block}>\n {(block) => {\n const paragraph = () => block() as Extract<MessageBlock, { kind: 'paragraph' }>\n return (\n <p class=\"m-0 whitespace-pre-wrap [overflow-wrap:anywhere]\">\n <Inline nodes={paragraph().inline} citations={props.citations} />\n </p>\n )\n }}\n </Match>\n </Switch>\n )\n}\n\nfunction Inline(props: { nodes: readonly MessageInline[]; citations?: MessageCitations }) {\n return (\n <For each={props.nodes}>\n {(node) => (\n <Switch>\n <Match when={node.kind === 'text' && node}>\n {(text) => (text() as { text: string }).text}\n </Match>\n <Match when={node.kind === 'code' && node}>\n {(code) => <InlineCode>{(code() as { text: string }).text}</InlineCode>}\n </Match>\n <Match when={node.kind === 'strong' && node}>\n {(strong) => (\n <strong class=\"font-semibold\">\n <Inline\n nodes={(strong() as { children: readonly MessageInline[] }).children}\n citations={props.citations}\n />\n </strong>\n )}\n </Match>\n <Match when={node.kind === 'em' && node}>\n {(em) => (\n <em>\n <Inline\n nodes={(em() as { children: readonly MessageInline[] }).children}\n citations={props.citations}\n />\n </em>\n )}\n </Match>\n <Match when={node.kind === 'link' && node}>\n {(link) => (\n <a\n href={(link() as { href: string }).href}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n class=\"text-primary underline underline-offset-2 hover:no-underline\"\n >\n <Inline nodes={(link() as { children: readonly MessageInline[] }).children} />\n </a>\n )}\n </Match>\n <Match when={node.kind === 'cite' && node}>\n {(cite) => {\n const marker = () => cite() as { numbers: readonly number[]; raw: string }\n // The parser read this as a citation only while the host had sources;\n // if they have gone since, the marker is the text it was written as.\n // Match invokes this callback untracked; JSX keeps renderer and\n // same-count source replacements reactive without replacing the block.\n return (\n <>{props.citations ? props.citations.render(marker().numbers) : marker().raw}</>\n )\n }}\n </Match>\n </Switch>\n )}\n </For>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAgDA,SAAgBuB,QAAQC,OAAqB;CAC3C,MAAM,CAACC,OAAOC,QAAQrB,WAAWmB,OAAO;EACtC;EACA;EACA;EACA;EACA;EACA;CAAU,CACX;CACD,cAAA;EAAA,IAAAG,OAAAC,OAAA;EAAAC,OAAAF,MAAAG,WAAA;GAAA,KAAA,eAAA;IAAA,OAGeL,MAAMN;GAAI;GAAA,KAAA,oBAAA;IAAA,OACLM,MAAMH;GAAQ;GAAA,KAAA,gBAAA;IAAA,OAClBG,MAAML;GAAK;GAAA,KAAA,eAAA;IAAA,OACZK,MAAMJ,aAAac,KAAAA;GAAS;GAAA,KAAA,WAAA;IAAA,OAChC1B,GACL,2EAGA,gEACA;KACE,uCAAuCgB,MAAMN,SAAS;KACtD,iBAAiBM,MAAMN,SAAS;IAClC,GACAM,MAAMW,KACR;GAAC;EAAA,GACGV,IAAI,GAAA,OAAA,IAAA;EAAAW,OAAAV,YAEPF,MAAMa,QAAQ;EAAA,OAAAX;CAAA,EAAA,CAAA;AAGrB;;AAGA,SAAgBY,cACdf,OACA;CACA,MAAM,CAACC,OAAOC,QAAQrB,WAAWmB,OAAO;EAAC;EAAS;EAAU;EAAQ;CAAU,CAAC;CAC/E,cAAA;EAAA,IAAAmB,QAAAC,QAAA,GAAAC,QAAAF,MAAAG;EAAAjB,OAAAc,OAAAb,WAAA,EAAA,KAAA,WAAA;GAAA,OAGWrB,GAAG,yDAAyDgB,MAAMW,KAAK;EAAC,EAAA,GAC3EV,IAAI,GAAA,OAAA,IAAA;EAAAW,OAAAM,OAAAI,gBAEP3C,MAAI;GAAA,IAAC4C,OAAI;IAAA,OAAEvB,MAAMe;GAAM;GAAA,IAAAF,WAAA;IAAA,OAAGb,MAAMe;GAAM;EAAA,CAAA,GAAAK,KAAA;EAAAR,OAAAQ,aACIpB,MAAMa,QAAQ;EAAAD,OAAAM,OAAAI,gBACxD3C,MAAI;GAAA,IAAC4C,OAAI;IAAA,OAAEvB,MAAMiB;GAAI;GAAA,IAAAJ,WAAA;IAAA,IAAAW,QAAAC,QAAA;IAAAb,OAAAY,aACQxB,MAAMiB,IAAI;IAAA,OAAAO;GAAA;EAAA,CAAA,GAAA,IAAA;EAAA,OAAAN;CAAA,EAAA,CAAA;AAI9C;;AAGA,SAAgBQ,eAAe3B,OAA8B;CAC3D,MAAM,CAACC,OAAOC,QAAQrB,WAAWmB,OAAO,CAAC,SAAS,UAAU,CAAC;CAC7D,cAAA;EAAA,IAAA4B,QAAAC,QAAA;EAAAxB,OAAAuB,OAAAtB,WAAA,EAAA,KAAA,WAAA;GAAA,OAGWrB,GACL,0EACAgB,MAAMW,KACR;EAAC,EAAA,GACGV,IAAI,GAAA,OAAA,IAAA;EAAAW,OAAAe,aAEP3B,MAAMa,QAAQ;EAAA,OAAAc;CAAA,EAAA,CAAA;AAGrB;;;;;;;AAQA,SAAgBE,eAAe9B,OAA8B;CAC3D,MAAM,CAACC,OAAOC,QAAQrB,WAAWmB,OAAO,CAAC,SAAS,UAAU,CAAC;CAC7D,cAAA;EAAA,IAAA+B,QAAAC,QAAA;EAAA3B,OAAA0B,OAAAzB,WAAA,EAAA,KAAA,WAAA;GAAA,OAGWrB,GACL,yKACAgB,MAAMW,KACR;EAAC,EAAA,GACGV,IAAI,GAAA,OAAA,IAAA;EAAAW,OAAAkB,aAEP9B,MAAMa,QAAQ;EAAA,OAAAiB;CAAA,EAAA,CAAA;AAGrB;AAEA,SAAgBE,cAAcjC,OAAiC;CAC7D,MAAM,CAACC,OAAOC,QAAQrB,WAAWmB,OAAO,CAAC,SAAS,UAAU,CAAC;CAC7D,cAAA;EAAA,IAAAkC,QAAAC,QAAA;EAAA9B,OAAA6B,OAAA5B,WAAA,EAAA,KAAA,WAAA;GAAA,OAGWrB,GAAG,iEAAiEgB,MAAMW,KAAK;EAAC,EAAA,GACnFV,IAAI,GAAA,OAAA,IAAA;EAAAW,OAAAqB,aAEPjC,MAAMa,QAAQ;EAAA,OAAAoB;CAAA,EAAA,CAAA;AAGrB;AA2CA,SAASmB,UAAUC,GAA6BC,GAA0B;CACxE,OACED,MAAM3C,KAAAA,KACN2C,EAAEE,SAASD,EAAEC,QACbF,EAAEG,QAAQF,EAAEE,QACXH,EAAEE,SAAS,UAAWD,EAAEC,SAAS,UAAUF,EAAEX,aAAaY,EAAEZ;AAEjE;;;;;;;;;;;AAYA,SAAgBe,YAAY1D,OAAyB;CACnD,MAAM,CAACC,OAAOC,QAAQrB,WAAWmB,OAAO;EACtC;EACA;EACA;EACA;EACA;CAAW,CACZ;CACD,IAAI2D,WAAoC,CAAA;CACxC,IAAIC,gBAAgB;CAGpB,MAAMC,sBAAsB5D,MAAMmD,WAAWP,SAAS;CACtD,MAAMiB,SAAStF,iBAAiB;EAC9B,MAAMqE,QAAQgB,cAAc;EAC5B,IAAIhB,UAAUe,eAAeD,WAAW,CAAA;EACxCC,gBAAgBf;EAKhB,MAAMmB,SAJO3E,iBAAiBY,MAAMgD,MAAM;GACxCpD,WAAWI,MAAMJ;GACjBuD,WAAWP,SAASlC,KAAAA;EACtB,CACeoD,CAAAA,CAAKE,KAAKd,OAAOX,UAC9Ba,UAAUM,SAASnB,QAAQW,KAAK,IAAIQ,SAASnB,SAAUW,KACzD;EACAQ,WAAWK;EACX,OAAOA;CACT,CAAC;CAGD,MAAME,cAAc1F,iBAAiB;EACnC,IAAIuF,OAAO;EACX,OAAOD,OAAO,CAAC,CAACG,KAAKd,UAAWA,MAAMK,SAAS,SAASO,SAAS,EAAG;CACtE,CAAC;CACD,MAAMI,oBAAoB;EACxB,MAAMC,OAAON,OAAO,CAAC,CAACO,GAAG,EAAE;EAC3B,OAAOD,SAASzD,KAAAA,KAAayD,KAAKZ,SAAS;CAC7C;CACA,cAAA;EAAA,IAAAc,QAAAC,QAAA;EAAAlE,OAAAiE,OAAAhE,WAAA,EAAA,KAAA,WAAA;GAAA,OACuCrB,GAAG,+BAA+BgB,MAAMW,KAAK;EAAC,EAAA,GAAMV,IAAI,GAAA,OAAA,IAAA;EAAAW,OAAAyD,OAAA/C,gBAC1F7C,OAAK;GAAA,IAAC8F,OAAI;IAAA,OAAEV,OAAO;GAAC;GAAAhD,WACjBqC,OAAOX,UAAKjB,gBACXkD,WAAS;IAAA,IACRtB,QAAK;KAAA,OAAEA,MAAM;IAAC;IAAA,IACduB,YAAS;KAAA,OAAEzE,MAAMiD;IAAc;IAC/ByB,iBAAiBT,YAAY,CAAC,CAAC1B,UAAU;IAAC,IAC1CY,YAAS;KAAA,OAAEnD,MAAMmD;IAAS;GAAA,CAAA;EAE7B,CAAA,GAAA,IAAA;EAAAvC,OAAAyD,OAAA/C,gBAEF3C,MAAI;GAAA,IAAC4C,OAAI;IAAA,OAAEoD,WAAA,CAAA,CAAA3E,MAAMJ,SAAS,CAAA,CAAA,KAAIsE,YAAY;GAAC;GAAA,IAAArD,WAAA;IAAA,OAAA+D,QAAA;GAAA;EAAA,CAAA,GAAA,IAAA;EAAA,OAAAP;CAAA,EAAA,CAAA;AAKlD;AAEA,SAASG,UAAUzE,OAKhB;CACD,OAAAuB,gBACGzC,QAAM,EAAA,IAAAgC,WAAA;EAAA,OAAA;GAAAS,gBACJ5C,OAAK;IAAA,IAAC6C,OAAI;KAAA,OAAEoD,WAAA5E,MAAMmD,MAAMK,SAAS,MAAM,CAAA,CAAA,KAAIxD,MAAMmD;IAAK;IAAArC,WACnDqC,UAAU;KACV,MAAMT,aAAaS,MAAM;KACzB,MAAM4B,eAAe;MACnB,MAAMC,SAAShF,MAAM0E;MACrB,OAAO,OAAOM,WAAW,aACrBA,OAAO;OACLxC,OAAOxC,MAAM2E,UAAU;OACvBlC,UAAUC,KAAK,CAAC,CAACD;OACjBC,MAAMA,KAAK,CAAC,CAACA;OACbC,UAAUD,KAAK,CAAC,CAACC;MACnB,CAAC,IACDqC;KACN;KACA,OAAAzD,gBACGrC,WAASoB,WAAA;MAAA,IACRoC,OAAI;OAAA,OAAEA,KAAK,CAAC,CAACA;MAAI;MAAA,IACjBD,WAAQ;OAAA,OAAEC,KAAK,CAAC,CAACD;MAAQ;MAAA,IACzBE,WAAQ;OAAA,OAAED,KAAK,CAAC,CAACC;MAAQ;KAAA,GACrBoC,MAAM,CAAA;IAGhB;GAAC,CAAA;GAAAxD,gBAEF5C,OAAK;IAAA,IAAC6C,OAAI;KAAA,OAAEoD,WAAA5E,MAAMmD,MAAMK,SAAS,SAAS,CAAA,CAAA,KAAIxD,MAAMmD;IAAK;IAAArC,WACtDqC,UAAU;KACV,MAAM8B,gBAAgB9B,MAAM;KAC5B,cAAA;MAAA,IAAA+B,QAAAC,QAAA;MAAAtE,OAAAqE,OAAA3D,gBAMK6D,QAAM;OAAA,IAACC,QAAK;QAAA,OAAEJ,QAAQ,CAAC,CAACK;OAAM;OAAA,IAAElC,YAAS;QAAA,OAAEpD,MAAMoD;OAAS;MAAA,CAAA,CAAA;MAAAmC,aAAAC,aAAAN,OAAA,cAH/CD,QAAQ,CAAC,CAACQ,QAAQ,CAAC,CAAA;MAAA,OAAAP;KAAA,EAAA,CAAA;IAMrC;GAAC,CAAA;GAAA3D,gBAEF5C,OAAK;IAAA,IAAC6C,OAAI;KAAA,OAAEoD,WAAA5E,MAAMmD,MAAMK,SAAS,MAAM,CAAA,CAAA,KAAIxD,MAAMmD;IAAK;IAAArC,WACnDqC,UAAU;KACV,MAAMuC,aAAavC,MAAM;KACzB,OAAA5B,gBACG3C,MAAI;MAAA,IACH4C,OAAI;OAAA,OAAEkE,KAAK,CAAC,CAACC;MAAO;MAAA,IACpBC,WAAQ;OAAA,cAAA;QAAA,IAAAC,SAAAC,QAAA;QAAAjF,OAAAgF,QAAAtE,gBAEH9C,KAAG;SAAA,IAAC+F,OAAI;UAAA,OAAEkB,KAAK,CAAC,CAACK;SAAK;SAAAjF,WACnBkF,gBAAI;UAAA,IAAAC,SAAAC,SAAA;UAAArF,OAAAoF,QAAA1E,gBAED6D,QAAM;WAACC,OAAOW;WAAI,IAAE5C,YAAS;YAAA,OAAEpD,MAAMoD;WAAS;UAAA,CAAA,CAAA;UAAA,OAAA6C;SAAA,EAAA,CAAA;QAElD,CAAA,CAAA;QAAA,OAAAJ;OAAA,EAAA,CAAA;MAAA;MAAA,IAAA/E,WAAA;OAAA,IAAAqF,QAAAC,QAAA;OAAAvF,OAAAsF,OAAA5E,gBASJ9C,KAAG;QAAA,IAAC+F,OAAI;SAAA,OAAEkB,KAAK,CAAC,CAACK;QAAK;QAAAjF,WACnBkF,gBAAI;SAAA,IAAAK,SAAAH,SAAA;SAAArF,OAAAwF,QAAA9E,gBAED6D,QAAM;UAACC,OAAOW;UAAI,IAAE5C,YAAS;WAAA,OAAEpD,MAAMoD;UAAS;SAAA,CAAA,CAAA;SAAA,OAAAiD;QAAA,EAAA,CAAA;OAElD,CAAA,CAAA;OAAAd,aAAAC,aAAAW,OAAA,SARIT,KAAK,CAAC,CAACY,KAAK,CAAA;OAAA,OAAAH;MAAA;KAAA,CAAA;IAa3B;GAAC,CAAA;GAAA5E,gBAEF5C,OAAK;IAAA,IAAC6C,OAAI;KAAA,OAAEoD,WAAA5E,MAAMmD,MAAMK,SAAS,OAAO,CAAA,CAAA,KAAIxD,MAAMmD;IAAK;IAAArC,WACpDqC,UAAU;KACV,MAAMoD,cAAcpD,MAAM;KAC1B,cAAA;MAAA,IAAAqD,SAAAC,SAAA;MAAA5F,OAAA2F,QAAAjF,gBAEK6D,QAAM;OAAA,IAACC,QAAK;QAAA,OAAEkB,MAAM,CAAC,CAACjB;OAAM;OAAA,IAAElC,YAAS;QAAA,OAAEpD,MAAMoD;OAAS;MAAA,CAAA,CAAA;MAAA,OAAAoD;KAAA,EAAA,CAAA;IAG/D;GAAC,CAAA;GAAAjF,gBAEF5C,OAAK;IAAA,IAAC6C,OAAI;KAAA,OAAEoD,WAAA5E,MAAMmD,MAAMK,SAAS,WAAW,CAAA,CAAA,KAAIxD,MAAMmD;IAAK;IAAArC,WACxDqC,UAAU;KACV,MAAMuD,kBAAkBvD,MAAM;KAC9B,cAAA;MAAA,IAAAwD,SAAAC,SAAA;MAAA/F,OAAA8F,QAAApF,gBAEK6D,QAAM;OAAA,IAACC,QAAK;QAAA,OAAEqB,UAAU,CAAC,CAACpB;OAAM;OAAA,IAAElC,YAAS;QAAA,OAAEpD,MAAMoD;OAAS;MAAA,CAAA,CAAA;MAAA,OAAAuD;KAAA,EAAA,CAAA;IAGnE;GAAC,CAAA;EAAA;CAAA,EAAA,CAAA;AAIT;AAEA,SAASvB,OAAOpF,OAA0E;CACxF,OAAAuB,gBACG9C,KAAG;EAAA,IAAC+F,OAAI;GAAA,OAAExE,MAAMqF;EAAK;EAAAvE,WAClB+F,SAAItF,gBACHzC,QAAM,EAAA,IAAAgC,WAAA;GAAA,OAAA;IAAAS,gBACJ5C,OAAK;KAAA,IAAC6C,OAAI;MAAA,OAAEqF,KAAKrD,SAAS,UAAUqD;KAAI;KAAA/F,WACrCmC,SAAUA,KAAK,CAAC,CAAsBA;IAAI,CAAA;IAAA1B,gBAE7C5C,OAAK;KAAA,IAAC6C,OAAI;MAAA,OAAEqF,KAAKrD,SAAS,UAAUqD;KAAI;KAAA/F,WACrC4B,SAAInB,gBAAMpC,YAAU,EAAA,IAAA2B,WAAA;MAAA,OAAG4B,KAAK,CAAC,CAAsBO;KAAI,EAAA,CAAA;IAAc,CAAA;IAAA1B,gBAExE5C,OAAK;KAAA,IAAC6C,OAAI;MAAA,OAAEqF,KAAKrD,SAAS,YAAYqD;KAAI;KAAA/F,WACvCgG,kBAAM;MAAA,IAAAC,SAAAC,SAAA;MAAAnG,OAAAkG,QAAAxF,gBAEH6D,QAAM;OAAA,IACLC,QAAK;QAAA,OAAGyB,OAAO,CAAC,CAA4ChG;OAAQ;OAAA,IACpEsC,YAAS;QAAA,OAAEpD,MAAMoD;OAAS;MAAA,CAAA,CAAA;MAAA,OAAA2D;KAAA,EAAA,CAAA;IAG/B,CAAA;IAAAxF,gBAEF5C,OAAK;KAAA,IAAC6C,OAAI;MAAA,OAAEqF,KAAKrD,SAAS,QAAQqD;KAAI;KAAA/F,WACnCmG,cAAE;MAAA,IAAAC,SAAAC,SAAA;MAAAtG,OAAAqG,QAAA3F,gBAEC6D,QAAM;OAAA,IACLC,QAAK;QAAA,OAAG4B,GAAG,CAAC,CAA4CnG;OAAQ;OAAA,IAChEsC,YAAS;QAAA,OAAEpD,MAAMoD;OAAS;MAAA,CAAA,CAAA;MAAA,OAAA8D;KAAA,EAAA,CAAA;IAG/B,CAAA;IAAA3F,gBAEF5C,OAAK;KAAA,IAAC6C,OAAI;MAAA,OAAEqF,KAAKrD,SAAS,UAAUqD;KAAI;KAAA/F,WACrCsG,gBAAI;MAAA,IAAAC,SAAAC,SAAA;MAAAzG,OAAAwG,QAAA9F,gBAOD6D,QAAM,EAAA,IAACC,QAAK;OAAA,OAAG+B,KAAK,CAAC,CAA4CtG;MAAQ,EAAA,CAAA,CAAA;MAAAyE,aAAAC,aAAA6B,QAAA,QALnED,KAAK,CAAC,CAAsBG,IAAI,CAAA;MAAA,OAAAF;KAAA,EAAA,CAAA;IAO1C,CAAA;IAAA9F,gBAEF5C,OAAK;KAAA,IAAC6C,OAAI;MAAA,OAAEqF,KAAKrD,SAAS,UAAUqD;KAAI;KAAA/F,WACrC0G,SAAS;MACT,MAAMC,eAAeD,KAAK;MAK1B,OAAA5C,WACKA,WAAA,CAAA,CAAA5E,MAAMoD,SAAS,CAAA,CAAA,IAAGpD,MAAMoD,UAAUN,OAAO2E,OAAO,CAAC,CAAC1E,OAAO,IAAI0E,OAAO,CAAC,CAAChE,GAAG;KAEhF;IAAC,CAAA;GAAA;EAAA,EAAA,CAAA;CAGN,CAAA;AAGP"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A small, safe reading of model and user text.
|
|
3
|
+
*
|
|
4
|
+
* Assistant output is untrusted: it can contain anything a model, a tool result
|
|
5
|
+
* or a pasted web page put there. This parser therefore produces *data* —
|
|
6
|
+
* blocks and inline spans — and the renderer turns that data into text nodes and
|
|
7
|
+
* a fixed set of elements. There is no HTML pass, no `innerHTML`, and no
|
|
8
|
+
* attribute built from the text other than a link `href` that has passed
|
|
9
|
+
* `safeHref`.
|
|
10
|
+
*
|
|
11
|
+
* It reads a deliberately small subset of Markdown: fenced code, headings,
|
|
12
|
+
* flat lists, block quotes, paragraphs, and inline code, bold, italic and links.
|
|
13
|
+
* Anything it does not recognise stays as paragraph text with its line breaks
|
|
14
|
+
* (the paragraph renders `white-space: pre-wrap`), so unsupported syntax
|
|
15
|
+
* degrades to readable source instead of vanishing.
|
|
16
|
+
*
|
|
17
|
+
* A citation marker, `[^1]` or `[^1,2]`, is read only when the caller says how
|
|
18
|
+
* many sources it has (`citations`) and every number names one of them. A marker
|
|
19
|
+
* the host cannot resolve stays literal text: it is never a citation by shape
|
|
20
|
+
* alone, and `arr[1]` or a footnote the model invented is not one either.
|
|
21
|
+
*
|
|
22
|
+
* Streaming is a first-class input. `streaming: true` means the text may end
|
|
23
|
+
* mid-construct, so an unterminated fence is a *partial* code block — shown as
|
|
24
|
+
* code from its first line, flagged incomplete — and an unterminated inline
|
|
25
|
+
* span stays literal until its closing delimiter arrives. Once streaming stops,
|
|
26
|
+
* an unterminated fence is just a code block that ends at the end of the text.
|
|
27
|
+
*/
|
|
28
|
+
export type MessageInline = Readonly<{
|
|
29
|
+
kind: 'text';
|
|
30
|
+
text: string;
|
|
31
|
+
}> | Readonly<{
|
|
32
|
+
kind: 'code';
|
|
33
|
+
text: string;
|
|
34
|
+
}> | Readonly<{
|
|
35
|
+
kind: 'strong';
|
|
36
|
+
children: readonly MessageInline[];
|
|
37
|
+
}> | Readonly<{
|
|
38
|
+
kind: 'em';
|
|
39
|
+
children: readonly MessageInline[];
|
|
40
|
+
}> | Readonly<{
|
|
41
|
+
kind: 'link';
|
|
42
|
+
href: string;
|
|
43
|
+
children: readonly MessageInline[];
|
|
44
|
+
}>
|
|
45
|
+
/** A resolved citation marker: 1-based source numbers, each within `citations`. */
|
|
46
|
+
| Readonly<{
|
|
47
|
+
kind: 'cite';
|
|
48
|
+
numbers: readonly number[];
|
|
49
|
+
raw: string;
|
|
50
|
+
}>;
|
|
51
|
+
export type MessageBlock = Readonly<{
|
|
52
|
+
kind: 'paragraph';
|
|
53
|
+
inline: readonly MessageInline[];
|
|
54
|
+
raw: string;
|
|
55
|
+
}> | Readonly<{
|
|
56
|
+
kind: 'heading';
|
|
57
|
+
level: 1 | 2 | 3 | 4;
|
|
58
|
+
inline: readonly MessageInline[];
|
|
59
|
+
raw: string;
|
|
60
|
+
}> | Readonly<{
|
|
61
|
+
kind: 'list';
|
|
62
|
+
ordered: boolean;
|
|
63
|
+
start: number;
|
|
64
|
+
items: readonly (readonly MessageInline[])[];
|
|
65
|
+
raw: string;
|
|
66
|
+
}> | Readonly<{
|
|
67
|
+
kind: 'quote';
|
|
68
|
+
inline: readonly MessageInline[];
|
|
69
|
+
raw: string;
|
|
70
|
+
}> | Readonly<{
|
|
71
|
+
kind: 'code';
|
|
72
|
+
language: string | undefined;
|
|
73
|
+
code: string;
|
|
74
|
+
/** False while the fence is still open and the text may still grow. */
|
|
75
|
+
complete: boolean;
|
|
76
|
+
raw: string;
|
|
77
|
+
}>;
|
|
78
|
+
/** Only these schemes become links; everything else is shown as its text. */
|
|
79
|
+
export declare function safeHref(value: string): string | undefined;
|
|
80
|
+
export type ParseInlineOptions = {
|
|
81
|
+
/** How many sources the host has. Without it no marker is a citation. */
|
|
82
|
+
citations?: number;
|
|
83
|
+
/** Inside a link label, where a citation (itself a button) must not nest. */
|
|
84
|
+
inLink?: boolean;
|
|
85
|
+
};
|
|
86
|
+
/** Inline spans. Delimiters must close on the same block, or they stay literal. */
|
|
87
|
+
export declare function parseInline(text: string, depth?: number, options?: ParseInlineOptions): readonly MessageInline[];
|
|
88
|
+
/** Parse text into blocks. Pure, total, and linear in the length of `text`. */
|
|
89
|
+
export declare function parseMessageText(text: string, options?: {
|
|
90
|
+
streaming?: boolean;
|
|
91
|
+
citations?: number;
|
|
92
|
+
}): readonly MessageBlock[];
|
|
93
|
+
//# sourceMappingURL=parse-message-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-message-text.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/message/parse-message-text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,MAAM,MAAM,aAAa,GACrB,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GACxC,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GACxC,QAAQ,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAA;CAAE,CAAC,GAChE,QAAQ,CAAC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAA;CAAE,CAAC,GAC5D,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAA;CAAE,CAAC;AAC9E,mFAAmF;GACjF,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAEvE,MAAM,MAAM,YAAY,GACpB,QAAQ,CAAC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,GAC9E,QAAQ,CAAC;IACP,IAAI,EAAE,SAAS,CAAA;IACf,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACpB,MAAM,EAAE,SAAS,aAAa,EAAE,CAAA;IAChC,GAAG,EAAE,MAAM,CAAA;CACZ,CAAC,GACF,QAAQ,CAAC;IACP,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,SAAS,CAAC,SAAS,aAAa,EAAE,CAAC,EAAE,CAAA;IAC5C,GAAG,EAAE,MAAM,CAAA;CACZ,CAAC,GACF,QAAQ,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,GAC1E,QAAQ,CAAC;IACP,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,uEAAuE;IACvE,QAAQ,EAAE,OAAO,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;CACZ,CAAC,CAAA;AAsEN,6EAA6E;AAC7E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAc1D;AAQD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAYD,mFAAmF;AACnF,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,KAAK,SAAI,EACT,OAAO,GAAE,kBAAuB,GAC/B,SAAS,aAAa,EAAE,CAqG1B;AAsDD,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACxD,SAAS,YAAY,EAAE,CAmHzB"}
|