@elabs-ai/components-ai 4.2.0 → 5.1.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/README.md +1 -1
- package/dist/{_audio-player-media-chrome-T3XVXWRZ.js → _audio-player-media-chrome.js} +1 -1
- package/dist/_code-block-theme.js +12 -0
- package/dist/_code-block-theme.js.map +1 -0
- package/dist/{_flow-boundary-SHNWLQG5.js → _flow-boundary.js} +1 -1
- package/dist/_flow-boundary.js.map +1 -0
- package/dist/_flow-lazy.js +8 -0
- package/dist/_flow-lazy.js.map +1 -0
- package/dist/_lazy-boundary-conformance.js +2 -0
- package/dist/_lazy-boundary-conformance.js.map +1 -0
- package/dist/_lazy-cjk.js +13 -0
- package/dist/_lazy-cjk.js.map +1 -0
- package/dist/_lazy-engine-boundary.js +9 -0
- package/dist/_lazy-engine-boundary.js.map +1 -0
- package/dist/_lazy-math.js +13 -0
- package/dist/_lazy-math.js.map +1 -0
- package/dist/_lazy-mermaid.js +12 -0
- package/dist/_lazy-mermaid.js.map +1 -0
- package/dist/_mermaid-error-panel.js +9 -0
- package/dist/_mermaid-error-panel.js.map +1 -0
- package/dist/{_persona-rive-JEG44YHX.js → _persona-rive.js} +19 -24
- package/dist/_persona-rive.js.map +1 -0
- package/dist/_streamdown-i18n.js +21 -0
- package/dist/_streamdown-i18n.js.map +1 -0
- package/dist/_streamdown-safety.js +10 -0
- package/dist/_streamdown-safety.js.map +1 -0
- package/dist/_theme-scope-store.js +13 -0
- package/dist/_theme-scope-store.js.map +1 -0
- package/dist/a2ui/a2ui-surface.js +17 -0
- package/dist/a2ui/a2ui-surface.js.map +1 -0
- package/dist/a2ui/core/catalog.generated.js +10 -0
- package/dist/a2ui/core/catalog.generated.js.map +1 -0
- package/dist/a2ui/core/complete-json.js +10 -0
- package/dist/a2ui/core/complete-json.js.map +1 -0
- package/dist/a2ui/core/index.js +37 -0
- package/dist/a2ui/core/index.js.map +1 -0
- package/dist/a2ui/core/schema.js +11 -0
- package/dist/a2ui/core/schema.js.map +1 -0
- package/dist/a2ui/core/spec.js +10 -0
- package/dist/a2ui/core/spec.js.map +1 -0
- package/dist/a2ui/core/validate.js +16 -0
- package/dist/a2ui/core/validate.js.map +1 -0
- package/dist/a2ui/index.js +54 -0
- package/dist/a2ui/index.js.map +1 -0
- package/dist/a2ui/ui-catalog.js +18 -0
- package/dist/a2ui/ui-catalog.js.map +1 -0
- package/dist/agent-event.js +10 -0
- package/dist/agent-event.js.map +1 -0
- package/dist/agent-timeline.js +11 -0
- package/dist/agent-timeline.js.map +1 -0
- package/dist/agent.js +25 -0
- package/dist/agent.js.map +1 -0
- package/dist/artifact.js +23 -0
- package/dist/artifact.js.map +1 -0
- package/dist/asset-preview.js +22 -0
- package/dist/asset-preview.js.map +1 -0
- package/dist/attachments.js +33 -0
- package/dist/attachments.js.map +1 -0
- package/dist/audio-player.js +30 -0
- package/dist/audio-player.js.map +1 -0
- package/dist/audio-visualizer.js +9 -0
- package/dist/audio-visualizer.js.map +1 -0
- package/dist/canvas.js +10 -0
- package/dist/canvas.js.map +1 -0
- package/dist/chain-of-thought.js +22 -0
- package/dist/chain-of-thought.js.map +1 -0
- package/dist/chat-greeting.js +8 -0
- package/dist/chat-greeting.js.map +1 -0
- package/dist/chat-shell.js +9 -0
- package/dist/chat-shell.js.map +1 -0
- package/dist/checkpoint.js +13 -0
- package/dist/checkpoint.js.map +1 -0
- package/dist/chunk-2XOIG5TG.js +72 -0
- package/dist/chunk-2XOIG5TG.js.map +1 -0
- package/dist/chunk-34CQ2VHM.js +172 -0
- package/dist/chunk-34CQ2VHM.js.map +1 -0
- package/dist/chunk-3TDHPXZZ.js +60 -0
- package/dist/chunk-3TDHPXZZ.js.map +1 -0
- package/dist/chunk-3XNPMDZY.js +478 -0
- package/dist/chunk-3XNPMDZY.js.map +1 -0
- package/dist/chunk-3YPT3V7L.js +56 -0
- package/dist/chunk-3YPT3V7L.js.map +1 -0
- package/dist/chunk-475UEU2Q.js +87 -0
- package/dist/chunk-475UEU2Q.js.map +1 -0
- package/dist/chunk-4CBTII2I.js +95 -0
- package/dist/chunk-4CBTII2I.js.map +1 -0
- package/dist/chunk-4XRNIZMG.js +22 -0
- package/dist/chunk-4XRNIZMG.js.map +1 -0
- package/dist/chunk-5NNWUKK5.js +2 -0
- package/dist/chunk-5NNWUKK5.js.map +1 -0
- package/dist/chunk-5UOMU27Z.js +164 -0
- package/dist/chunk-5UOMU27Z.js.map +1 -0
- package/dist/chunk-5VGYZ62I.js +264 -0
- package/dist/chunk-5VGYZ62I.js.map +1 -0
- package/dist/chunk-6IQPH2OS.js +21 -0
- package/dist/chunk-6IQPH2OS.js.map +1 -0
- package/dist/chunk-6PB2MXCI.js +482 -0
- package/dist/chunk-6PB2MXCI.js.map +1 -0
- package/dist/chunk-7FD5CZEU.js +215 -0
- package/dist/chunk-7FD5CZEU.js.map +1 -0
- package/dist/chunk-7RL6KZDF.js +266 -0
- package/dist/chunk-7RL6KZDF.js.map +1 -0
- package/dist/chunk-ADOYAGGK.js +482 -0
- package/dist/chunk-ADOYAGGK.js.map +1 -0
- package/dist/chunk-BA3AEMOU.js +21 -0
- package/dist/chunk-BA3AEMOU.js.map +1 -0
- package/dist/chunk-BBHFOYML.js +336 -0
- package/dist/chunk-BBHFOYML.js.map +1 -0
- package/dist/chunk-BHUVISIY.js +221 -0
- package/dist/chunk-BHUVISIY.js.map +1 -0
- package/dist/chunk-BM2LWERA.js +100 -0
- package/dist/chunk-BM2LWERA.js.map +1 -0
- package/dist/chunk-CMOYXNPJ.js +211 -0
- package/dist/chunk-CMOYXNPJ.js.map +1 -0
- package/dist/chunk-CZP3RHC4.js +74 -0
- package/dist/chunk-CZP3RHC4.js.map +1 -0
- package/dist/chunk-DDG5JHQT.js +112 -0
- package/dist/chunk-DDG5JHQT.js.map +1 -0
- package/dist/chunk-DJODXO7I.js +38 -0
- package/dist/chunk-DJODXO7I.js.map +1 -0
- package/dist/chunk-DWJDJLPU.js +192 -0
- package/dist/chunk-DWJDJLPU.js.map +1 -0
- package/dist/chunk-DZW6LM22.js +45 -0
- package/dist/chunk-DZW6LM22.js.map +1 -0
- package/dist/chunk-ELGCZLZF.js +305 -0
- package/dist/chunk-ELGCZLZF.js.map +1 -0
- package/dist/chunk-EV3U6ZZB.js +209 -0
- package/dist/chunk-EV3U6ZZB.js.map +1 -0
- package/dist/chunk-EY7LVUKQ.js +87 -0
- package/dist/chunk-EY7LVUKQ.js.map +1 -0
- package/dist/chunk-F4C74F7M.js +230 -0
- package/dist/chunk-F4C74F7M.js.map +1 -0
- package/dist/chunk-FERYDFZA.js +108 -0
- package/dist/chunk-FERYDFZA.js.map +1 -0
- package/dist/chunk-FUIYG2DS.js +166 -0
- package/dist/chunk-FUIYG2DS.js.map +1 -0
- package/dist/chunk-GA7M34KU.js +236 -0
- package/dist/chunk-GA7M34KU.js.map +1 -0
- package/dist/chunk-GKYZT3LA.js +136 -0
- package/dist/chunk-GKYZT3LA.js.map +1 -0
- package/dist/chunk-H42LRUQ4.js +102 -0
- package/dist/chunk-H42LRUQ4.js.map +1 -0
- package/dist/chunk-HVXM2G5F.js +222 -0
- package/dist/chunk-HVXM2G5F.js.map +1 -0
- package/dist/chunk-I4RDAGVY.js +53 -0
- package/dist/chunk-I4RDAGVY.js.map +1 -0
- package/dist/chunk-IQJG4IDX.js +208 -0
- package/dist/chunk-IQJG4IDX.js.map +1 -0
- package/dist/chunk-IX2PXG4Y.js +144 -0
- package/dist/chunk-IX2PXG4Y.js.map +1 -0
- package/dist/chunk-IXICSOOP.js +287 -0
- package/dist/chunk-IXICSOOP.js.map +1 -0
- package/dist/chunk-JY5HSN4D.js +84 -0
- package/dist/chunk-JY5HSN4D.js.map +1 -0
- package/dist/chunk-L4SU3QJV.js +174 -0
- package/dist/chunk-L4SU3QJV.js.map +1 -0
- package/dist/chunk-LMNSBOBG.js +19 -0
- package/dist/chunk-LMNSBOBG.js.map +1 -0
- package/dist/chunk-MBI7D6IL.js +42 -0
- package/dist/chunk-MBI7D6IL.js.map +1 -0
- package/dist/chunk-MLFMYCPH.js +192 -0
- package/dist/chunk-MLFMYCPH.js.map +1 -0
- package/dist/chunk-MOK66734.js +33 -0
- package/dist/chunk-MOK66734.js.map +1 -0
- package/dist/chunk-MXTAWPYM.js +196 -0
- package/dist/chunk-MXTAWPYM.js.map +1 -0
- package/dist/chunk-NCL2UZKI.js +96 -0
- package/dist/chunk-NCL2UZKI.js.map +1 -0
- package/dist/chunk-NET4YLRY.js +107 -0
- package/dist/chunk-NET4YLRY.js.map +1 -0
- package/dist/chunk-NIG67CFM.js +329 -0
- package/dist/chunk-NIG67CFM.js.map +1 -0
- package/dist/chunk-NMVNNO3L.js +10 -0
- package/dist/chunk-NMVNNO3L.js.map +1 -0
- package/dist/chunk-NP7VID4K.js +2 -0
- package/dist/chunk-NP7VID4K.js.map +1 -0
- package/dist/chunk-NPUCMAG2.js +382 -0
- package/dist/chunk-NPUCMAG2.js.map +1 -0
- package/dist/chunk-NSCLRHES.js +102 -0
- package/dist/chunk-NSCLRHES.js.map +1 -0
- package/dist/chunk-OEUXHVFW.js +86 -0
- package/dist/chunk-OEUXHVFW.js.map +1 -0
- package/dist/chunk-ONBHFIMZ.js +137 -0
- package/dist/chunk-ONBHFIMZ.js.map +1 -0
- package/dist/chunk-OPH2HHL2.js +228 -0
- package/dist/chunk-OPH2HHL2.js.map +1 -0
- package/dist/chunk-OQERHIQP.js +287 -0
- package/dist/chunk-OQERHIQP.js.map +1 -0
- package/dist/chunk-P6YJAZFG.js +103 -0
- package/dist/chunk-P6YJAZFG.js.map +1 -0
- package/dist/chunk-PG7ERDOD.js +65 -0
- package/dist/chunk-PG7ERDOD.js.map +1 -0
- package/dist/chunk-PIB5JBMA.js +90 -0
- package/dist/chunk-PIB5JBMA.js.map +1 -0
- package/dist/chunk-PQ5BPIWQ.js +22 -0
- package/dist/chunk-PQ5BPIWQ.js.map +1 -0
- package/dist/chunk-PQBF6ZIQ.js +55 -0
- package/dist/chunk-PQBF6ZIQ.js.map +1 -0
- package/dist/chunk-PTWCTSZL.js +173 -0
- package/dist/chunk-PTWCTSZL.js.map +1 -0
- package/dist/chunk-QJUNPVOS.js +101 -0
- package/dist/chunk-QJUNPVOS.js.map +1 -0
- package/dist/chunk-QOBSEGCG.js +996 -0
- package/dist/chunk-QOBSEGCG.js.map +1 -0
- package/dist/chunk-QUDZOTRV.js +43 -0
- package/dist/chunk-QUDZOTRV.js.map +1 -0
- package/dist/chunk-RB7G65JC.js +213 -0
- package/dist/chunk-RB7G65JC.js.map +1 -0
- package/dist/chunk-RPHAOR7P.js +45 -0
- package/dist/chunk-RPHAOR7P.js.map +1 -0
- package/dist/chunk-RTCSH2AN.js +331 -0
- package/dist/chunk-RTCSH2AN.js.map +1 -0
- package/dist/chunk-S3ISPW3A.js +28 -0
- package/dist/chunk-S3ISPW3A.js.map +1 -0
- package/dist/chunk-SEVN656N.js +36 -0
- package/dist/chunk-SEVN656N.js.map +1 -0
- package/dist/chunk-SKVG672B.js +64 -0
- package/dist/chunk-SKVG672B.js.map +1 -0
- package/dist/chunk-SSGJ6MEM.js +1076 -0
- package/dist/chunk-SSGJ6MEM.js.map +1 -0
- package/dist/chunk-SSKZ2AED.js +118 -0
- package/dist/chunk-SSKZ2AED.js.map +1 -0
- package/dist/chunk-T56JFGXI.js +561 -0
- package/dist/chunk-T56JFGXI.js.map +1 -0
- package/dist/chunk-TCB6O74A.js +137 -0
- package/dist/chunk-TCB6O74A.js.map +1 -0
- package/dist/chunk-TTEYPO6X.js +57 -0
- package/dist/chunk-TTEYPO6X.js.map +1 -0
- package/dist/chunk-TWPHAJNM.js +462 -0
- package/dist/chunk-TWPHAJNM.js.map +1 -0
- package/dist/chunk-TXJJLP4O.js +336 -0
- package/dist/chunk-TXJJLP4O.js.map +1 -0
- package/dist/chunk-TZ6TB7VM.js +245 -0
- package/dist/chunk-TZ6TB7VM.js.map +1 -0
- package/dist/chunk-UBLKJJ7K.js +278 -0
- package/dist/chunk-UBLKJJ7K.js.map +1 -0
- package/dist/chunk-UCJ6IUFS.js +52 -0
- package/dist/chunk-UCJ6IUFS.js.map +1 -0
- package/dist/chunk-UCKFJ3QF.js +197 -0
- package/dist/chunk-UCKFJ3QF.js.map +1 -0
- package/dist/chunk-UPXSLILN.js +20 -0
- package/dist/chunk-UPXSLILN.js.map +1 -0
- package/dist/chunk-V4DORGWJ.js +92 -0
- package/dist/chunk-V4DORGWJ.js.map +1 -0
- package/dist/chunk-V6E5DYZD.js +80 -0
- package/dist/chunk-V6E5DYZD.js.map +1 -0
- package/dist/chunk-VLLYKF3P.js +96 -0
- package/dist/chunk-VLLYKF3P.js.map +1 -0
- package/dist/chunk-VLNBTOH6.js +43 -0
- package/dist/chunk-VLNBTOH6.js.map +1 -0
- package/dist/chunk-WMDSMSPL.js +303 -0
- package/dist/chunk-WMDSMSPL.js.map +1 -0
- package/dist/chunk-WU5BLGTF.js +149 -0
- package/dist/chunk-WU5BLGTF.js.map +1 -0
- package/dist/chunk-WYTZVSGK.js +245 -0
- package/dist/chunk-WYTZVSGK.js.map +1 -0
- package/dist/chunk-X47QMM6K.js +187 -0
- package/dist/chunk-X47QMM6K.js.map +1 -0
- package/dist/chunk-YHUSW7D2.js +40 -0
- package/dist/chunk-YHUSW7D2.js.map +1 -0
- package/dist/chunk-YSKD7UXX.js +126 -0
- package/dist/chunk-YSKD7UXX.js.map +1 -0
- package/dist/chunk-YYRDGWOU.js +72 -0
- package/dist/chunk-YYRDGWOU.js.map +1 -0
- package/dist/chunk-ZIGZMWM7.js +19 -0
- package/dist/chunk-ZIGZMWM7.js.map +1 -0
- package/dist/chunk-ZKRTUKNP.js +40 -0
- package/dist/chunk-ZKRTUKNP.js.map +1 -0
- package/dist/code-block.js +38 -0
- package/dist/code-block.js.map +1 -0
- package/dist/commit.js +51 -0
- package/dist/commit.js.map +1 -0
- package/dist/composer.js +15 -0
- package/dist/composer.js.map +1 -0
- package/dist/confirmation.js +53 -0
- package/dist/confirmation.js.map +1 -0
- package/dist/connection.js +8 -0
- package/dist/connection.js.map +1 -0
- package/dist/context-panel.js +25 -0
- package/dist/context-panel.js.map +1 -0
- package/dist/controls.js +10 -0
- package/dist/controls.js.map +1 -0
- package/dist/conversation.js +19 -0
- package/dist/conversation.js.map +1 -0
- package/dist/diff-view.js +15 -0
- package/dist/diff-view.js.map +1 -0
- package/dist/edge.js +10 -0
- package/dist/edge.js.map +1 -0
- package/dist/environment-variables.js +29 -0
- package/dist/environment-variables.js.map +1 -0
- package/dist/file-tree.js +23 -0
- package/dist/file-tree.js.map +1 -0
- package/dist/gallery.js +9 -0
- package/dist/gallery.js.map +1 -0
- package/dist/grouped-parts.js +21 -0
- package/dist/grouped-parts.js.map +1 -0
- package/dist/image.js +9 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +366 -98
- package/dist/index.js +672 -13577
- package/dist/index.js.map +1 -1
- package/dist/inline-citation.js +39 -0
- package/dist/inline-citation.js.map +1 -0
- package/dist/jsx-preview.js +17 -0
- package/dist/jsx-preview.js.map +1 -0
- package/dist/markdown-view.js +17 -0
- package/dist/markdown-view.js.map +1 -0
- package/dist/message-compare.js +12 -0
- package/dist/message-compare.js.map +1 -0
- package/dist/message-edit.js +19 -0
- package/dist/message-edit.js.map +1 -0
- package/dist/message-feedback.js +11 -0
- package/dist/message-feedback.js.map +1 -0
- package/dist/message-form-spec.js +38 -0
- package/dist/message-form-spec.js.map +1 -0
- package/dist/message-form.js +26 -0
- package/dist/message-form.js.map +1 -0
- package/dist/message-table-spec.js +26 -0
- package/dist/message-table-spec.js.map +1 -0
- package/dist/message-table.js +12 -0
- package/dist/message-table.js.map +1 -0
- package/dist/message.js +51 -0
- package/dist/message.js.map +1 -0
- package/dist/mic-selector.js +27 -0
- package/dist/mic-selector.js.map +1 -0
- package/dist/model-provider-logo.js +13 -0
- package/dist/model-provider-logo.js.map +1 -0
- package/dist/motion-config.js +9 -0
- package/dist/motion-config.js.map +1 -0
- package/dist/node.js +22 -0
- package/dist/node.js.map +1 -0
- package/dist/open-in-chat.js +31 -0
- package/dist/open-in-chat.js.map +1 -0
- package/dist/package-info.js +25 -0
- package/dist/package-info.js.map +1 -0
- package/dist/panel.js +10 -0
- package/dist/panel.js.map +1 -0
- package/dist/part-groups.js +18 -0
- package/dist/part-groups.js.map +1 -0
- package/dist/permission-mode-select.js +9 -0
- package/dist/permission-mode-select.js.map +1 -0
- package/dist/persona-sources.js +8 -0
- package/dist/persona-sources.js.map +1 -0
- package/dist/persona.js +14 -0
- package/dist/persona.js.map +1 -0
- package/dist/plan.js +32 -0
- package/dist/plan.js.map +1 -0
- package/dist/prompt-input-effort.js +9 -0
- package/dist/prompt-input-effort.js.map +1 -0
- package/dist/prompt-input-mode.js +10 -0
- package/dist/prompt-input-mode.js.map +1 -0
- package/dist/prompt-input-slash.js +12 -0
- package/dist/prompt-input-slash.js.map +1 -0
- package/dist/prompt-input.js +89 -0
- package/dist/prompt-input.js.map +1 -0
- package/dist/queue.js +37 -0
- package/dist/queue.js.map +1 -0
- package/dist/reasoning.js +23 -0
- package/dist/reasoning.js.map +1 -0
- package/dist/sandbox.js +28 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/schema-display.js +33 -0
- package/dist/schema-display.js.map +1 -0
- package/dist/selection-toolbar.js +11 -0
- package/dist/selection-toolbar.js.map +1 -0
- package/dist/session-header.js +9 -0
- package/dist/session-header.js.map +1 -0
- package/dist/session-status-bar.js +9 -0
- package/dist/session-status-bar.js.map +1 -0
- package/dist/shimmer.js +9 -0
- package/dist/shimmer.js.map +1 -0
- package/dist/snippet.js +17 -0
- package/dist/snippet.js.map +1 -0
- package/dist/sources.js +17 -0
- package/dist/sources.js.map +1 -0
- package/dist/speech-input.js +9 -0
- package/dist/speech-input.js.map +1 -0
- package/dist/stack-trace.js +27 -0
- package/dist/stack-trace.js.map +1 -0
- package/dist/suggestion.js +16 -0
- package/dist/suggestion.js.map +1 -0
- package/dist/task.js +18 -0
- package/dist/task.js.map +1 -0
- package/dist/test-results.js +43 -0
- package/dist/test-results.js.map +1 -0
- package/dist/token-usage.js +27 -0
- package/dist/token-usage.js.map +1 -0
- package/dist/tool-result-card.js +9 -0
- package/dist/tool-result-card.js.map +1 -0
- package/dist/tool.js +27 -0
- package/dist/tool.js.map +1 -0
- package/dist/toolbar.js +10 -0
- package/dist/toolbar.js.map +1 -0
- package/dist/transcription.js +11 -0
- package/dist/transcription.js.map +1 -0
- package/dist/turn-status.js +9 -0
- package/dist/turn-status.js.map +1 -0
- package/dist/use-audio-level.js +9 -0
- package/dist/use-audio-level.js.map +1 -0
- package/dist/voice-selector.js +47 -0
- package/dist/voice-selector.js.map +1 -0
- package/dist/web-preview.js +19 -0
- package/dist/web-preview.js.map +1 -0
- package/package.json +11 -9
- package/schemas/a2ui-surface.v1.schema.json +5434 -0
- package/src/_chat-shell-rail.tsx +3 -1
- package/src/_flow-boundary.tsx +2 -2
- package/src/_persona-rive.tsx +27 -41
- package/src/a2ui/a2ui-surface.stories.tsx +662 -0
- package/src/a2ui/a2ui-surface.test.tsx +201 -0
- package/src/a2ui/a2ui-surface.tsx +354 -0
- package/src/a2ui/catalog.source.json +772 -0
- package/src/a2ui/core/a2ui-core.test.ts +178 -0
- package/src/a2ui/core/catalog.generated.ts +1019 -0
- package/src/a2ui/core/complete-json.ts +81 -0
- package/src/a2ui/core/index.ts +10 -0
- package/src/a2ui/core/schema.ts +111 -0
- package/src/a2ui/core/spec.ts +148 -0
- package/src/a2ui/core/validate.ts +266 -0
- package/src/a2ui/index.ts +7 -0
- package/src/a2ui/ui-catalog.tsx +225 -0
- package/src/a2ui/wave1-chart-spec.test.ts +87 -0
- package/src/a2ui/wave2-chart-spec.test.ts +108 -0
- package/src/agentic-workspace.stories.tsx +6 -45
- package/src/chat-shell.test.tsx +40 -10
- package/src/chat-shell.tsx +90 -44
- package/src/chat.stories.tsx +47 -42
- package/src/composer.stories.tsx +4 -5
- package/src/composer.test.tsx +45 -0
- package/src/composer.tsx +104 -21
- package/src/context-panel.stories.tsx +1 -1
- package/src/context-panel.tsx +1 -1
- package/src/conversation.stories.tsx +1 -0
- package/src/conversation.test.tsx +16 -0
- package/src/conversation.tsx +16 -2
- package/src/diff-view.stories.tsx +79 -0
- package/src/diff-view.tsx +3 -2
- package/src/file-tree.tsx +24 -17
- package/src/gallery.stories.tsx +42 -0
- package/src/gallery.tsx +2 -2
- package/src/grouped-parts.stories.tsx +23 -0
- package/src/grouped-parts.tsx +1 -1
- package/src/index.ts +1 -0
- package/src/message-compare.stories.tsx +40 -0
- package/src/message-compare.tsx +2 -1
- package/src/message-form.tsx +1 -1
- package/src/message-table.stories.tsx +24 -0
- package/src/message-table.tsx +1 -1
- package/src/package-info.tsx +12 -9
- package/src/reasoning.stories.tsx +27 -0
- package/src/reasoning.tsx +1 -1
- package/src/session-header.stories.tsx +35 -1
- package/src/session-header.tsx +1 -1
- package/src/sources.stories.tsx +30 -0
- package/src/sources.tsx +4 -1
- package/src/templates-ai-assistant.stories.tsx +151 -87
- package/src/tool.stories.tsx +39 -0
- package/src/tool.tsx +3 -3
- package/src/toolbar.tsx +0 -10
- package/dist/_flow-boundary-SHNWLQG5.js.map +0 -1
- package/dist/_persona-rive-JEG44YHX.js.map +0 -1
- /package/dist/{_audio-player-media-chrome-T3XVXWRZ.js.map → _audio-player-media-chrome.js.map} +0 -0
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/voice-selector.tsx
|
|
4
|
+
import { useControllableState } from "@radix-ui/react-use-controllable-state";
|
|
5
|
+
import { Button } from "@elabs-ai/components-ui";
|
|
6
|
+
import {
|
|
7
|
+
Command,
|
|
8
|
+
CommandDialog,
|
|
9
|
+
CommandEmpty,
|
|
10
|
+
CommandGroup,
|
|
11
|
+
CommandInput,
|
|
12
|
+
CommandItem,
|
|
13
|
+
CommandList,
|
|
14
|
+
CommandSeparator,
|
|
15
|
+
CommandShortcut
|
|
16
|
+
} from "@elabs-ai/components-ui";
|
|
17
|
+
import { Dialog, DialogContent, DialogTitle, DialogTrigger } from "@elabs-ai/components-ui";
|
|
18
|
+
import { Spinner } from "@elabs-ai/components-ui";
|
|
19
|
+
import { cn } from "@elabs-ai/components-ui/lib/cn";
|
|
20
|
+
import { useLocale } from "@elabs-ai/components-ui";
|
|
21
|
+
import {
|
|
22
|
+
CircleSmallIcon,
|
|
23
|
+
MarsIcon,
|
|
24
|
+
MarsStrokeIcon,
|
|
25
|
+
NonBinaryIcon,
|
|
26
|
+
PauseIcon,
|
|
27
|
+
PlayIcon,
|
|
28
|
+
TransgenderIcon,
|
|
29
|
+
VenusAndMarsIcon,
|
|
30
|
+
VenusIcon
|
|
31
|
+
} from "lucide-react";
|
|
32
|
+
import { createContext, useCallback, useContext, useMemo } from "react";
|
|
33
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
34
|
+
var VoiceSelectorContext = createContext(null);
|
|
35
|
+
var useVoiceSelector = () => {
|
|
36
|
+
const context = useContext(VoiceSelectorContext);
|
|
37
|
+
if (!context) {
|
|
38
|
+
throw new Error("VoiceSelector components must be used within VoiceSelector");
|
|
39
|
+
}
|
|
40
|
+
return context;
|
|
41
|
+
};
|
|
42
|
+
var VoiceSelector = ({
|
|
43
|
+
value: valueProp,
|
|
44
|
+
defaultValue,
|
|
45
|
+
onValueChange,
|
|
46
|
+
open: openProp,
|
|
47
|
+
defaultOpen = false,
|
|
48
|
+
onOpenChange,
|
|
49
|
+
children,
|
|
50
|
+
...props
|
|
51
|
+
}) => {
|
|
52
|
+
const [value, setValue] = useControllableState({
|
|
53
|
+
defaultProp: defaultValue,
|
|
54
|
+
onChange: onValueChange,
|
|
55
|
+
prop: valueProp
|
|
56
|
+
});
|
|
57
|
+
const [open, setOpen] = useControllableState({
|
|
58
|
+
defaultProp: defaultOpen,
|
|
59
|
+
onChange: onOpenChange,
|
|
60
|
+
prop: openProp
|
|
61
|
+
});
|
|
62
|
+
const voiceSelectorContext = useMemo(
|
|
63
|
+
() => ({ open, setOpen, setValue, value }),
|
|
64
|
+
[value, setValue, open, setOpen]
|
|
65
|
+
);
|
|
66
|
+
return /* @__PURE__ */ jsx(VoiceSelectorContext.Provider, { value: voiceSelectorContext, children: /* @__PURE__ */ jsx(Dialog, { onOpenChange: setOpen, open, ...props, children }) });
|
|
67
|
+
};
|
|
68
|
+
var VoiceSelectorTrigger = (props) => /* @__PURE__ */ jsx(DialogTrigger, { ...props });
|
|
69
|
+
var VoiceSelectorContent = ({
|
|
70
|
+
className,
|
|
71
|
+
children,
|
|
72
|
+
title = "Voice Selector",
|
|
73
|
+
...props
|
|
74
|
+
}) => /* @__PURE__ */ jsxs(DialogContent, { "aria-describedby": void 0, className: cn("p-0", className), ...props, children: [
|
|
75
|
+
/* @__PURE__ */ jsx(DialogTitle, { className: "sr-only", children: title }),
|
|
76
|
+
/* @__PURE__ */ jsx(Command, { className: "**:data-[slot=command-input-wrapper]:h-auto", children })
|
|
77
|
+
] });
|
|
78
|
+
var VoiceSelectorDialog = (props) => /* @__PURE__ */ jsx(CommandDialog, { ...props });
|
|
79
|
+
var VoiceSelectorInput = ({ className, ...props }) => /* @__PURE__ */ jsx(CommandInput, { className: cn("h-auto py-3.5", className), ...props });
|
|
80
|
+
var VoiceSelectorList = (props) => /* @__PURE__ */ jsx(CommandList, { ...props });
|
|
81
|
+
var VoiceSelectorEmpty = (props) => /* @__PURE__ */ jsx(CommandEmpty, { ...props });
|
|
82
|
+
var VoiceSelectorGroup = (props) => /* @__PURE__ */ jsx(CommandGroup, { ...props });
|
|
83
|
+
var VoiceSelectorItem = ({ className, ...props }) => /* @__PURE__ */ jsx(CommandItem, { className: cn("px-4 py-2", className), ...props });
|
|
84
|
+
var VoiceSelectorShortcut = (props) => /* @__PURE__ */ jsx(CommandShortcut, { ...props });
|
|
85
|
+
var VoiceSelectorSeparator = (props) => /* @__PURE__ */ jsx(CommandSeparator, { ...props });
|
|
86
|
+
var VoiceSelectorGender = ({
|
|
87
|
+
className,
|
|
88
|
+
value,
|
|
89
|
+
children,
|
|
90
|
+
...props
|
|
91
|
+
}) => {
|
|
92
|
+
let icon = null;
|
|
93
|
+
switch (value) {
|
|
94
|
+
case "male": {
|
|
95
|
+
icon = /* @__PURE__ */ jsx(MarsIcon, { className: "size-4" });
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
case "female": {
|
|
99
|
+
icon = /* @__PURE__ */ jsx(VenusIcon, { className: "size-4" });
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
case "transgender": {
|
|
103
|
+
icon = /* @__PURE__ */ jsx(TransgenderIcon, { className: "size-4" });
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
case "androgyne": {
|
|
107
|
+
icon = /* @__PURE__ */ jsx(MarsStrokeIcon, { className: "size-4" });
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
case "non-binary": {
|
|
111
|
+
icon = /* @__PURE__ */ jsx(NonBinaryIcon, { className: "size-4" });
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
case "intersex": {
|
|
115
|
+
icon = /* @__PURE__ */ jsx(VenusAndMarsIcon, { className: "size-4" });
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
default: {
|
|
119
|
+
icon = /* @__PURE__ */ jsx(CircleSmallIcon, { className: "size-4" });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return /* @__PURE__ */ jsx("span", { className: cn("text-muted-foreground text-meta", className), ...props, children: children ?? icon });
|
|
123
|
+
};
|
|
124
|
+
var VoiceSelectorAccent = ({
|
|
125
|
+
className,
|
|
126
|
+
value,
|
|
127
|
+
children,
|
|
128
|
+
...props
|
|
129
|
+
}) => {
|
|
130
|
+
let emoji = null;
|
|
131
|
+
switch (value) {
|
|
132
|
+
case "american": {
|
|
133
|
+
emoji = "\u{1F1FA}\u{1F1F8}";
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
case "british": {
|
|
137
|
+
emoji = "\u{1F1EC}\u{1F1E7}";
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
case "australian": {
|
|
141
|
+
emoji = "\u{1F1E6}\u{1F1FA}";
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
case "canadian": {
|
|
145
|
+
emoji = "\u{1F1E8}\u{1F1E6}";
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
case "irish": {
|
|
149
|
+
emoji = "\u{1F1EE}\u{1F1EA}";
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
case "scottish": {
|
|
153
|
+
emoji = "\u{1F3F4}\u{E0067}\u{E0062}\u{E0073}\u{E0063}\u{E0074}\u{E007F}";
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
case "indian": {
|
|
157
|
+
emoji = "\u{1F1EE}\u{1F1F3}";
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
case "south-african": {
|
|
161
|
+
emoji = "\u{1F1FF}\u{1F1E6}";
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
case "new-zealand": {
|
|
165
|
+
emoji = "\u{1F1F3}\u{1F1FF}";
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
case "spanish": {
|
|
169
|
+
emoji = "\u{1F1EA}\u{1F1F8}";
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
case "french": {
|
|
173
|
+
emoji = "\u{1F1EB}\u{1F1F7}";
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
case "german": {
|
|
177
|
+
emoji = "\u{1F1E9}\u{1F1EA}";
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
case "italian": {
|
|
181
|
+
emoji = "\u{1F1EE}\u{1F1F9}";
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
case "portuguese": {
|
|
185
|
+
emoji = "\u{1F1F5}\u{1F1F9}";
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
case "brazilian": {
|
|
189
|
+
emoji = "\u{1F1E7}\u{1F1F7}";
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
case "mexican": {
|
|
193
|
+
emoji = "\u{1F1F2}\u{1F1FD}";
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
case "argentinian": {
|
|
197
|
+
emoji = "\u{1F1E6}\u{1F1F7}";
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
case "japanese": {
|
|
201
|
+
emoji = "\u{1F1EF}\u{1F1F5}";
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
case "chinese": {
|
|
205
|
+
emoji = "\u{1F1E8}\u{1F1F3}";
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
case "korean": {
|
|
209
|
+
emoji = "\u{1F1F0}\u{1F1F7}";
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
case "russian": {
|
|
213
|
+
emoji = "\u{1F1F7}\u{1F1FA}";
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
case "arabic": {
|
|
217
|
+
emoji = "\u{1F1F8}\u{1F1E6}";
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
case "dutch": {
|
|
221
|
+
emoji = "\u{1F1F3}\u{1F1F1}";
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
case "swedish": {
|
|
225
|
+
emoji = "\u{1F1F8}\u{1F1EA}";
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
case "norwegian": {
|
|
229
|
+
emoji = "\u{1F1F3}\u{1F1F4}";
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
case "danish": {
|
|
233
|
+
emoji = "\u{1F1E9}\u{1F1F0}";
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
case "finnish": {
|
|
237
|
+
emoji = "\u{1F1EB}\u{1F1EE}";
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
case "polish": {
|
|
241
|
+
emoji = "\u{1F1F5}\u{1F1F1}";
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
244
|
+
case "turkish": {
|
|
245
|
+
emoji = "\u{1F1F9}\u{1F1F7}";
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
case "greek": {
|
|
249
|
+
emoji = "\u{1F1EC}\u{1F1F7}";
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
default: {
|
|
253
|
+
emoji = null;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return /* @__PURE__ */ jsx("span", { className: cn("text-muted-foreground text-meta", className), ...props, children: children ?? emoji });
|
|
257
|
+
};
|
|
258
|
+
var VoiceSelectorAge = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { className: cn("text-muted-foreground text-meta tabular-nums", className), ...props });
|
|
259
|
+
var VoiceSelectorName = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { className: cn("flex-1 truncate text-start font-medium", className), ...props });
|
|
260
|
+
var VoiceSelectorDescription = ({
|
|
261
|
+
className,
|
|
262
|
+
...props
|
|
263
|
+
}) => /* @__PURE__ */ jsx("span", { className: cn("text-muted-foreground text-meta", className), ...props });
|
|
264
|
+
var VoiceSelectorAttributes = ({
|
|
265
|
+
className,
|
|
266
|
+
children,
|
|
267
|
+
...props
|
|
268
|
+
}) => /* @__PURE__ */ jsx("div", { className: cn("flex items-center text-meta", className), ...props, children });
|
|
269
|
+
var VoiceSelectorBullet = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: cn("select-none text-border", className), ...props, children: "\u2022" });
|
|
270
|
+
var VoiceSelectorPreview = ({
|
|
271
|
+
className,
|
|
272
|
+
playing,
|
|
273
|
+
loading,
|
|
274
|
+
onPlay,
|
|
275
|
+
onClick,
|
|
276
|
+
...props
|
|
277
|
+
}) => {
|
|
278
|
+
const { t } = useLocale();
|
|
279
|
+
const handleClick = useCallback(
|
|
280
|
+
(event) => {
|
|
281
|
+
event.stopPropagation();
|
|
282
|
+
onClick?.(event);
|
|
283
|
+
onPlay?.();
|
|
284
|
+
},
|
|
285
|
+
[onClick, onPlay]
|
|
286
|
+
);
|
|
287
|
+
let icon = /* @__PURE__ */ jsx(PlayIcon, { className: "size-3" });
|
|
288
|
+
if (loading) {
|
|
289
|
+
icon = /* @__PURE__ */ jsx(Spinner, { className: "size-3" });
|
|
290
|
+
} else if (playing) {
|
|
291
|
+
icon = /* @__PURE__ */ jsx(PauseIcon, { className: "size-3" });
|
|
292
|
+
}
|
|
293
|
+
return /* @__PURE__ */ jsx(
|
|
294
|
+
Button,
|
|
295
|
+
{
|
|
296
|
+
"aria-label": playing ? t("ai.voiceSelector.pausePreview") : t("ai.voiceSelector.playPreview"),
|
|
297
|
+
className: cn("size-6", className),
|
|
298
|
+
disabled: loading,
|
|
299
|
+
onClick: handleClick,
|
|
300
|
+
size: "icon-sm",
|
|
301
|
+
type: "button",
|
|
302
|
+
variant: "outline",
|
|
303
|
+
...props,
|
|
304
|
+
children: icon
|
|
305
|
+
}
|
|
306
|
+
);
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
export {
|
|
310
|
+
useVoiceSelector,
|
|
311
|
+
VoiceSelector,
|
|
312
|
+
VoiceSelectorTrigger,
|
|
313
|
+
VoiceSelectorContent,
|
|
314
|
+
VoiceSelectorDialog,
|
|
315
|
+
VoiceSelectorInput,
|
|
316
|
+
VoiceSelectorList,
|
|
317
|
+
VoiceSelectorEmpty,
|
|
318
|
+
VoiceSelectorGroup,
|
|
319
|
+
VoiceSelectorItem,
|
|
320
|
+
VoiceSelectorShortcut,
|
|
321
|
+
VoiceSelectorSeparator,
|
|
322
|
+
VoiceSelectorGender,
|
|
323
|
+
VoiceSelectorAccent,
|
|
324
|
+
VoiceSelectorAge,
|
|
325
|
+
VoiceSelectorName,
|
|
326
|
+
VoiceSelectorDescription,
|
|
327
|
+
VoiceSelectorAttributes,
|
|
328
|
+
VoiceSelectorBullet,
|
|
329
|
+
VoiceSelectorPreview
|
|
330
|
+
};
|
|
331
|
+
//# sourceMappingURL=chunk-RTCSH2AN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/voice-selector.tsx"],"sourcesContent":["\"use client\";\n\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { Button } from \"@elabs-ai/components-ui\";\nimport {\n Command,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n CommandShortcut,\n} from \"@elabs-ai/components-ui\";\nimport { Dialog, DialogContent, DialogTitle, DialogTrigger } from \"@elabs-ai/components-ui\";\nimport { Spinner } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport {\n CircleSmallIcon,\n MarsIcon,\n MarsStrokeIcon,\n NonBinaryIcon,\n PauseIcon,\n PlayIcon,\n TransgenderIcon,\n VenusAndMarsIcon,\n VenusIcon,\n} from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { createContext, useCallback, useContext, useMemo } from \"react\";\n\ninterface VoiceSelectorContextValue {\n value: string | undefined;\n setValue: (value: string | undefined) => void;\n open: boolean;\n setOpen: (open: boolean) => void;\n}\n\nconst VoiceSelectorContext = createContext<VoiceSelectorContextValue | null>(null);\n\nexport const useVoiceSelector = () => {\n const context = useContext(VoiceSelectorContext);\n if (!context) {\n throw new Error(\"VoiceSelector components must be used within VoiceSelector\");\n }\n return context;\n};\n\nexport type VoiceSelectorProps = ComponentProps<typeof Dialog> & {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string | undefined) => void;\n};\n\nexport const VoiceSelector = ({\n value: valueProp,\n defaultValue,\n onValueChange,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n children,\n ...props\n}: VoiceSelectorProps) => {\n const [value, setValue] = useControllableState({\n defaultProp: defaultValue,\n onChange: onValueChange,\n prop: valueProp,\n });\n\n const [open, setOpen] = useControllableState({\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n prop: openProp,\n });\n\n const voiceSelectorContext = useMemo(\n () => ({ open, setOpen, setValue, value }),\n [value, setValue, open, setOpen],\n );\n\n return (\n <VoiceSelectorContext.Provider value={voiceSelectorContext}>\n <Dialog onOpenChange={setOpen} open={open} {...props}>\n {children}\n </Dialog>\n </VoiceSelectorContext.Provider>\n );\n};\n\nexport type VoiceSelectorTriggerProps = ComponentProps<typeof DialogTrigger>;\n\nexport const VoiceSelectorTrigger = (props: VoiceSelectorTriggerProps) => (\n <DialogTrigger {...props} />\n);\n\nexport type VoiceSelectorContentProps = ComponentProps<typeof DialogContent> & {\n title?: ReactNode;\n};\n\nexport const VoiceSelectorContent = ({\n className,\n children,\n title = \"Voice Selector\",\n ...props\n}: VoiceSelectorContentProps) => (\n <DialogContent aria-describedby={undefined} className={cn(\"p-0\", className)} {...props}>\n <DialogTitle className=\"sr-only\">{title}</DialogTitle>\n <Command className=\"**:data-[slot=command-input-wrapper]:h-auto\">{children}</Command>\n </DialogContent>\n);\n\nexport type VoiceSelectorDialogProps = ComponentProps<typeof CommandDialog>;\n\nexport const VoiceSelectorDialog = (props: VoiceSelectorDialogProps) => (\n <CommandDialog {...props} />\n);\n\nexport type VoiceSelectorInputProps = ComponentProps<typeof CommandInput>;\n\nexport const VoiceSelectorInput = ({ className, ...props }: VoiceSelectorInputProps) => (\n <CommandInput className={cn(\"h-auto py-3.5\", className)} {...props} />\n);\n\nexport type VoiceSelectorListProps = ComponentProps<typeof CommandList>;\n\nexport const VoiceSelectorList = (props: VoiceSelectorListProps) => <CommandList {...props} />;\n\nexport type VoiceSelectorEmptyProps = ComponentProps<typeof CommandEmpty>;\n\nexport const VoiceSelectorEmpty = (props: VoiceSelectorEmptyProps) => <CommandEmpty {...props} />;\n\nexport type VoiceSelectorGroupProps = ComponentProps<typeof CommandGroup>;\n\nexport const VoiceSelectorGroup = (props: VoiceSelectorGroupProps) => <CommandGroup {...props} />;\n\nexport type VoiceSelectorItemProps = ComponentProps<typeof CommandItem>;\n\nexport const VoiceSelectorItem = ({ className, ...props }: VoiceSelectorItemProps) => (\n <CommandItem className={cn(\"px-4 py-2\", className)} {...props} />\n);\n\nexport type VoiceSelectorShortcutProps = ComponentProps<typeof CommandShortcut>;\n\nexport const VoiceSelectorShortcut = (props: VoiceSelectorShortcutProps) => (\n <CommandShortcut {...props} />\n);\n\nexport type VoiceSelectorSeparatorProps = ComponentProps<typeof CommandSeparator>;\n\nexport const VoiceSelectorSeparator = (props: VoiceSelectorSeparatorProps) => (\n <CommandSeparator {...props} />\n);\n\nexport type VoiceSelectorGenderProps = ComponentProps<\"span\"> & {\n value?: \"male\" | \"female\" | \"transgender\" | \"androgyne\" | \"non-binary\" | \"intersex\";\n};\n\nexport const VoiceSelectorGender = ({\n className,\n value,\n children,\n ...props\n}: VoiceSelectorGenderProps) => {\n let icon: ReactNode | null = null;\n\n switch (value) {\n case \"male\": {\n icon = <MarsIcon className=\"size-4\" />;\n break;\n }\n case \"female\": {\n icon = <VenusIcon className=\"size-4\" />;\n break;\n }\n case \"transgender\": {\n icon = <TransgenderIcon className=\"size-4\" />;\n break;\n }\n case \"androgyne\": {\n icon = <MarsStrokeIcon className=\"size-4\" />;\n break;\n }\n case \"non-binary\": {\n icon = <NonBinaryIcon className=\"size-4\" />;\n break;\n }\n case \"intersex\": {\n icon = <VenusAndMarsIcon className=\"size-4\" />;\n break;\n }\n default: {\n icon = <CircleSmallIcon className=\"size-4\" />;\n }\n }\n\n return (\n <span className={cn(\"text-muted-foreground text-meta\", className)} {...props}>\n {children ?? icon}\n </span>\n );\n};\n\nexport type VoiceSelectorAccentProps = ComponentProps<\"span\"> & {\n value?:\n | \"american\"\n | \"british\"\n | \"australian\"\n | \"canadian\"\n | \"irish\"\n | \"scottish\"\n | \"indian\"\n | \"south-african\"\n | \"new-zealand\"\n | \"spanish\"\n | \"french\"\n | \"german\"\n | \"italian\"\n | \"portuguese\"\n | \"brazilian\"\n | \"mexican\"\n | \"argentinian\"\n | \"japanese\"\n | \"chinese\"\n | \"korean\"\n | \"russian\"\n | \"arabic\"\n | \"dutch\"\n | \"swedish\"\n | \"norwegian\"\n | \"danish\"\n | \"finnish\"\n | \"polish\"\n | \"turkish\"\n | \"greek\"\n | string;\n};\n\nexport const VoiceSelectorAccent = ({\n className,\n value,\n children,\n ...props\n}: VoiceSelectorAccentProps) => {\n let emoji: string | null = null;\n\n switch (value) {\n case \"american\": {\n emoji = \"🇺🇸\";\n break;\n }\n case \"british\": {\n emoji = \"🇬🇧\";\n break;\n }\n case \"australian\": {\n emoji = \"🇦🇺\";\n break;\n }\n case \"canadian\": {\n emoji = \"🇨🇦\";\n break;\n }\n case \"irish\": {\n emoji = \"🇮🇪\";\n break;\n }\n case \"scottish\": {\n emoji = \"🏴\";\n break;\n }\n case \"indian\": {\n emoji = \"🇮🇳\";\n break;\n }\n case \"south-african\": {\n emoji = \"🇿🇦\";\n break;\n }\n case \"new-zealand\": {\n emoji = \"🇳🇿\";\n break;\n }\n case \"spanish\": {\n emoji = \"🇪🇸\";\n break;\n }\n case \"french\": {\n emoji = \"🇫🇷\";\n break;\n }\n case \"german\": {\n emoji = \"🇩🇪\";\n break;\n }\n case \"italian\": {\n emoji = \"🇮🇹\";\n break;\n }\n case \"portuguese\": {\n emoji = \"🇵🇹\";\n break;\n }\n case \"brazilian\": {\n emoji = \"🇧🇷\";\n break;\n }\n case \"mexican\": {\n emoji = \"🇲🇽\";\n break;\n }\n case \"argentinian\": {\n emoji = \"🇦🇷\";\n break;\n }\n case \"japanese\": {\n emoji = \"🇯🇵\";\n break;\n }\n case \"chinese\": {\n emoji = \"🇨🇳\";\n break;\n }\n case \"korean\": {\n emoji = \"🇰🇷\";\n break;\n }\n case \"russian\": {\n emoji = \"🇷🇺\";\n break;\n }\n case \"arabic\": {\n emoji = \"🇸🇦\";\n break;\n }\n case \"dutch\": {\n emoji = \"🇳🇱\";\n break;\n }\n case \"swedish\": {\n emoji = \"🇸🇪\";\n break;\n }\n case \"norwegian\": {\n emoji = \"🇳🇴\";\n break;\n }\n case \"danish\": {\n emoji = \"🇩🇰\";\n break;\n }\n case \"finnish\": {\n emoji = \"🇫🇮\";\n break;\n }\n case \"polish\": {\n emoji = \"🇵🇱\";\n break;\n }\n case \"turkish\": {\n emoji = \"🇹🇷\";\n break;\n }\n case \"greek\": {\n emoji = \"🇬🇷\";\n break;\n }\n default: {\n emoji = null;\n }\n }\n\n return (\n <span className={cn(\"text-muted-foreground text-meta\", className)} {...props}>\n {children ?? emoji}\n </span>\n );\n};\n\nexport type VoiceSelectorAgeProps = ComponentProps<\"span\">;\n\nexport const VoiceSelectorAge = ({ className, ...props }: VoiceSelectorAgeProps) => (\n <span className={cn(\"text-muted-foreground text-meta tabular-nums\", className)} {...props} />\n);\n\nexport type VoiceSelectorNameProps = ComponentProps<\"span\">;\n\nexport const VoiceSelectorName = ({ className, ...props }: VoiceSelectorNameProps) => (\n <span className={cn(\"flex-1 truncate text-start font-medium\", className)} {...props} />\n);\n\nexport type VoiceSelectorDescriptionProps = ComponentProps<\"span\">;\n\nexport const VoiceSelectorDescription = ({\n className,\n ...props\n}: VoiceSelectorDescriptionProps) => (\n <span className={cn(\"text-muted-foreground text-meta\", className)} {...props} />\n);\n\nexport type VoiceSelectorAttributesProps = ComponentProps<\"div\">;\n\nexport const VoiceSelectorAttributes = ({\n className,\n children,\n ...props\n}: VoiceSelectorAttributesProps) => (\n <div className={cn(\"flex items-center text-meta\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type VoiceSelectorBulletProps = ComponentProps<\"span\">;\n\nexport const VoiceSelectorBullet = ({ className, ...props }: VoiceSelectorBulletProps) => (\n <span aria-hidden=\"true\" className={cn(\"select-none text-border\", className)} {...props}>\n •\n </span>\n);\n\nexport type VoiceSelectorPreviewProps = Omit<ComponentProps<\"button\">, \"children\"> & {\n playing?: boolean;\n loading?: boolean;\n onPlay?: () => void;\n};\n\nexport const VoiceSelectorPreview = ({\n className,\n playing,\n loading,\n onPlay,\n onClick,\n ...props\n}: VoiceSelectorPreviewProps) => {\n const { t } = useLocale();\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n onClick?.(event);\n onPlay?.();\n },\n [onClick, onPlay],\n );\n\n let icon = <PlayIcon className=\"size-3\" />;\n\n if (loading) {\n icon = <Spinner className=\"size-3\" />;\n } else if (playing) {\n icon = <PauseIcon className=\"size-3\" />;\n }\n\n return (\n <Button\n aria-label={playing ? t(\"ai.voiceSelector.pausePreview\") : t(\"ai.voiceSelector.playPreview\")}\n className={cn(\"size-6\", className)}\n disabled={loading}\n onClick={handleClick}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"outline\"\n {...props}\n >\n {icon}\n </Button>\n );\n};\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/_lazy-engine-boundary.tsx
|
|
4
|
+
import { Component } from "react";
|
|
5
|
+
var LazyEngineBoundary = class extends Component {
|
|
6
|
+
state = { error: null };
|
|
7
|
+
static getDerivedStateFromError(error) {
|
|
8
|
+
return { error: { value: error } };
|
|
9
|
+
}
|
|
10
|
+
componentDidCatch(error, info) {
|
|
11
|
+
console.error(
|
|
12
|
+
"[@elabs-ai/components-ai] a lazy engine failed to load:",
|
|
13
|
+
error,
|
|
14
|
+
info.componentStack
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
render() {
|
|
18
|
+
if (this.state.error) {
|
|
19
|
+
return this.props.renderMissing(this.state.error.value);
|
|
20
|
+
}
|
|
21
|
+
return this.props.children;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export {
|
|
26
|
+
LazyEngineBoundary
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=chunk-S3ISPW3A.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/_lazy-engine-boundary.tsx"],"sourcesContent":["\"use client\";\n\nimport { Component, type ErrorInfo, type ReactNode } from \"react\";\n\nexport interface LazyEngineBoundaryProps {\n children: ReactNode;\n /**\n * Called once a wrapped `lazy()` import rejects (an optional peer that is\n * not installed, or any other load-time failure). Return what to render in\n * its place — the boundary owns no default visual, since the right\n * stand-in differs by surface (an orb placeholder for `Persona`, `null`\n * for an `AudioPlayer` sub-control).\n */\n renderMissing: (error: unknown) => ReactNode;\n}\n\ninterface LazyEngineBoundaryState {\n // Wrapped in an object so `{ value: undefined }` (a boundary that caught\n // an error whose value happens to be `undefined`) is distinguishable from\n // \"nothing caught yet\" (`error: null`).\n error: { value: unknown } | null;\n}\n\n/**\n * Catches a `React.lazy()` load failure — an optional peer dependency that is\n * not installed (issue #33), or any other dynamic-import rejection — and\n * renders a caller-supplied fallback instead of unmounting the tree.\n *\n * `Suspense` alone does not do this: it only covers the PENDING state. A\n * REJECTED lazy import throws during render, and with no boundary above it\n * that throw propagates to the nearest ancestor boundary React DOES find —\n * by default, the whole app. This is the one place in `@elabs-ai/components-ai`\n * that needs a real render-phase error boundary; Mermaid and the interactive\n * terminal fail via an awaited promise instead (Streamdown's `errorComponent`\n * and a `.catch()` on the mount effect, respectively), which don't need one.\n */\nexport class LazyEngineBoundary extends Component<\n LazyEngineBoundaryProps,\n LazyEngineBoundaryState\n> {\n override state: LazyEngineBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: unknown): LazyEngineBoundaryState {\n return { error: { value: error } };\n }\n\n override componentDidCatch(error: unknown, info: ErrorInfo): void {\n console.error(\n \"[@elabs-ai/components-ai] a lazy engine failed to load:\",\n error,\n info.componentStack,\n );\n }\n\n override render(): ReactNode {\n if (this.state.error) {\n return this.props.renderMissing(this.state.error.value);\n }\n return this.props.children;\n }\n}\n"],"mappings":";;;AAEA,SAAS,iBAAiD;AAkCnD,IAAM,qBAAN,cAAiC,UAGtC;AAAA,EACS,QAAiC,EAAE,OAAO,KAAK;AAAA,EAExD,OAAO,yBAAyB,OAAyC;AACvE,WAAO,EAAE,OAAO,EAAE,OAAO,MAAM,EAAE;AAAA,EACnC;AAAA,EAES,kBAAkB,OAAgB,MAAuB;AAChE,YAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EAES,SAAoB;AAC3B,QAAI,KAAK,MAAM,OAAO;AACpB,aAAO,KAAK,MAAM,cAAc,KAAK,MAAM,MAAM,KAAK;AAAA,IACxD;AACA,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;","names":[]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/_mermaid-error-panel.tsx
|
|
4
|
+
import { Button, StatePanel, isModuleNotFoundMessage, useLocale } from "@elabs-ai/components-ui";
|
|
5
|
+
import { EyeOffIcon } from "lucide-react";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
function MermaidErrorPanel({ error, retry }) {
|
|
8
|
+
const { t } = useLocale();
|
|
9
|
+
if (isModuleNotFoundMessage(error)) {
|
|
10
|
+
const feature = t("ai.mermaid.feature");
|
|
11
|
+
return /* @__PURE__ */ jsx("div", { className: "my-4", role: "status", "aria-live": "polite", children: /* @__PURE__ */ jsx(
|
|
12
|
+
StatePanel,
|
|
13
|
+
{
|
|
14
|
+
kind: "empty",
|
|
15
|
+
className: "border-solid",
|
|
16
|
+
icon: /* @__PURE__ */ jsx(EyeOffIcon, { "aria-hidden": "true" }),
|
|
17
|
+
title: t("ai.error.engineMissing", { feature }),
|
|
18
|
+
description: t("ai.error.engineMissingBody", { feature, packages: "mermaid" })
|
|
19
|
+
}
|
|
20
|
+
) });
|
|
21
|
+
}
|
|
22
|
+
return /* @__PURE__ */ jsx("div", { className: "my-4", children: /* @__PURE__ */ jsx(
|
|
23
|
+
StatePanel,
|
|
24
|
+
{
|
|
25
|
+
kind: "error",
|
|
26
|
+
title: t("ai.mermaid.renderError"),
|
|
27
|
+
description: error,
|
|
28
|
+
actions: /* @__PURE__ */ jsx(Button, { size: "sm", variant: "outline", onClick: retry, children: t("ai.error.retry") })
|
|
29
|
+
}
|
|
30
|
+
) });
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export {
|
|
34
|
+
MermaidErrorPanel
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=chunk-SEVN656N.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/_mermaid-error-panel.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * The `errorComponent` Streamdown renders in place of a Mermaid diagram that\n * failed (issue #33). Streamdown hands back the render failure as a plain\n * STRING (`MermaidErrorComponentProps.error`, already reduced from whatever\n * was thrown), so this distinguishes two different failures by matching that\n * string rather than the original error object:\n *\n * - **The optional `mermaid` peer is not installed.** This is a CAPABILITY\n * GAP, not something wrong with the diagram or the app — the same class as\n * `@elabs-ai/components-viewer`'s `parser-missing`\n * (@.claude/rules/viewer-components.md \"A capability gap is not a\n * failure\"). Renders the neutral `StatePanel kind=\"empty\"`, naming the\n * package to install, announced `role=\"status\"`, with no retry action\n * (re-installing a dependency does not happen by clicking a button in the\n * page).\n * - **Anything else is a genuine render/syntax failure** — a real error, so\n * it gets `StatePanel kind=\"error\"` (`role=\"alert\"`, set internally by\n * `StatePanel`) wired to Streamdown's own `retry()`, which increments the\n * render attempt and re-runs the diagram.\n */\nimport { Button, StatePanel, isModuleNotFoundMessage, useLocale } from \"@elabs-ai/components-ui\";\nimport { EyeOffIcon } from \"lucide-react\";\n\nexport interface MermaidErrorPanelProps {\n chart: string;\n error: string;\n retry: () => void;\n}\n\nexport function MermaidErrorPanel({ error, retry }: MermaidErrorPanelProps) {\n const { t } = useLocale();\n\n if (isModuleNotFoundMessage(error)) {\n const feature = t(\"ai.mermaid.feature\");\n return (\n <div className=\"my-4\" role=\"status\" aria-live=\"polite\">\n <StatePanel\n kind=\"empty\"\n // A dashed edge invites a drop; this panel accepts nothing. Solid —\n // mirrors `@elabs-ai/components-viewer`'s `FileViewerError`.\n className=\"border-solid\"\n icon={<EyeOffIcon aria-hidden=\"true\" />}\n title={t(\"ai.error.engineMissing\", { feature })}\n description={t(\"ai.error.engineMissingBody\", { feature, packages: \"mermaid\" })}\n />\n </div>\n );\n }\n\n return (\n <div className=\"my-4\">\n <StatePanel\n kind=\"error\"\n title={t(\"ai.mermaid.renderError\")}\n description={error}\n actions={\n <Button size=\"sm\" variant=\"outline\" onClick={retry}>\n {t(\"ai.error.retry\")}\n </Button>\n }\n />\n </div>\n );\n}\n"],"mappings":";;;AAsBA,SAAS,QAAQ,YAAY,yBAAyB,iBAAiB;AACvE,SAAS,kBAAkB;AAoBX;AAZT,SAAS,kBAAkB,EAAE,OAAO,MAAM,GAA2B;AAC1E,QAAM,EAAE,EAAE,IAAI,UAAU;AAExB,MAAI,wBAAwB,KAAK,GAAG;AAClC,UAAM,UAAU,EAAE,oBAAoB;AACtC,WACE,oBAAC,SAAI,WAAU,QAAO,MAAK,UAAS,aAAU,UAC5C;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QAGL,WAAU;AAAA,QACV,MAAM,oBAAC,cAAW,eAAY,QAAO;AAAA,QACrC,OAAO,EAAE,0BAA0B,EAAE,QAAQ,CAAC;AAAA,QAC9C,aAAa,EAAE,8BAA8B,EAAE,SAAS,UAAU,UAAU,CAAC;AAAA;AAAA,IAC/E,GACF;AAAA,EAEJ;AAEA,SACE,oBAAC,SAAI,WAAU,QACb;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,OAAO,EAAE,wBAAwB;AAAA,MACjC,aAAa;AAAA,MACb,SACE,oBAAC,UAAO,MAAK,MAAK,SAAQ,WAAU,SAAS,OAC1C,YAAE,gBAAgB,GACrB;AAAA;AAAA,EAEJ,GACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/a2ui/core/complete-json.ts
|
|
4
|
+
function completeJson(text) {
|
|
5
|
+
const stack = [];
|
|
6
|
+
let inString = false;
|
|
7
|
+
let escaped = false;
|
|
8
|
+
let lastGood = 0;
|
|
9
|
+
let lastNonWs = "";
|
|
10
|
+
for (let i = 0; i < text.length; i++) {
|
|
11
|
+
const ch = text[i];
|
|
12
|
+
if (inString) {
|
|
13
|
+
if (escaped) escaped = false;
|
|
14
|
+
else if (ch === "\\") escaped = true;
|
|
15
|
+
else if (ch === '"') {
|
|
16
|
+
inString = false;
|
|
17
|
+
lastNonWs = ch;
|
|
18
|
+
lastGood = i + 1;
|
|
19
|
+
}
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (ch === '"') {
|
|
23
|
+
inString = true;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (ch === "{" || ch === "[") stack.push(ch === "{" ? "}" : "]");
|
|
27
|
+
else if (ch === "}" || ch === "]") stack.pop();
|
|
28
|
+
if (!/\s/.test(ch)) {
|
|
29
|
+
lastNonWs = ch;
|
|
30
|
+
lastGood = i + 1;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
let out = text;
|
|
34
|
+
if (inString) {
|
|
35
|
+
const top = stack[stack.length - 1];
|
|
36
|
+
if (top === "}" && (lastNonWs === "{" || lastNonWs === ",")) out = text.slice(0, lastGood);
|
|
37
|
+
else out = escaped ? `${text.slice(0, -1)}"` : `${text}"`;
|
|
38
|
+
lastNonWs = out.trimEnd().slice(-1);
|
|
39
|
+
}
|
|
40
|
+
out = out.trimEnd();
|
|
41
|
+
if (lastNonWs === ",") out = out.slice(0, -1);
|
|
42
|
+
else if (lastNonWs === ":") out = `${out}null`;
|
|
43
|
+
else if (lastNonWs === '"' && stack[stack.length - 1] === "}") {
|
|
44
|
+
const m = /(?:^|[{,])\s*"(?:[^"\\]|\\.)*"$/.exec(out);
|
|
45
|
+
if (m) out = out.slice(0, m.index + (out[m.index] === "{" || out[m.index] === "," ? 1 : 0));
|
|
46
|
+
}
|
|
47
|
+
out = out.replace(/,\s*$/, "");
|
|
48
|
+
return out + stack.reverse().join("");
|
|
49
|
+
}
|
|
50
|
+
function parseSurfaceJson(text, partial = false) {
|
|
51
|
+
const trimmed = text.trim();
|
|
52
|
+
if (!trimmed) return null;
|
|
53
|
+
try {
|
|
54
|
+
return JSON.parse(partial ? completeJson(trimmed) : trimmed);
|
|
55
|
+
} catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export {
|
|
61
|
+
completeJson,
|
|
62
|
+
parseSurfaceJson
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=chunk-SKVG672B.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/a2ui/core/complete-json.ts"],"sourcesContent":["/**\n * complete-json.ts — close a PARTIAL JSON document so a streaming surface can be\n * parsed and drawn before the model has finished (the A2UI counterpart of\n * `JSXPreview`'s `completeJsxTag`).\n *\n * Strategy: one linear scan tracking the bracket stack, string state and escape\n * state; then (1) close an open string, (2) drop a dangling `,` or supply `null`\n * for a dangling `\"key\":`, (3) close every open bracket in reverse. The result is\n * always syntactically valid JSON for any prefix of a valid document that has\n * passed its first `{`. Semantic gaps (a half-typed prop value, a node without\n * its `type` yet) are the validator's business — the renderer prunes what does\n * not validate while streaming and keeps the last good tree.\n */\nexport function completeJson(text: string): string {\n const stack: string[] = [];\n let inString = false;\n let escaped = false;\n // Index just after the last STRUCTURALLY complete token, so a half-typed key\n // (`{\"ty`) can be cut rather than closed into `{\"ty\":null}`.\n let lastGood = 0;\n let lastNonWs = \"\";\n\n for (let i = 0; i < text.length; i++) {\n const ch = text[i] as string;\n if (inString) {\n if (escaped) escaped = false;\n else if (ch === \"\\\\\") escaped = true;\n else if (ch === '\"') {\n inString = false;\n lastNonWs = ch;\n lastGood = i + 1;\n }\n continue;\n }\n if (ch === '\"') {\n inString = true;\n continue;\n }\n if (ch === \"{\" || ch === \"[\") stack.push(ch === \"{\" ? \"}\" : \"]\");\n else if (ch === \"}\" || ch === \"]\") stack.pop();\n if (!/\\s/.test(ch)) {\n lastNonWs = ch;\n lastGood = i + 1;\n }\n }\n\n let out = text;\n if (inString) {\n // Inside a value string → close it. Inside a KEY (the string follows `{` or\n // `,` inside an object) → cut it: a key without a value is not renderable.\n const top = stack[stack.length - 1];\n if (top === \"}\" && (lastNonWs === \"{\" || lastNonWs === \",\")) out = text.slice(0, lastGood);\n else out = escaped ? `${text.slice(0, -1)}\"` : `${text}\"`;\n lastNonWs = out.trimEnd().slice(-1);\n }\n out = out.trimEnd();\n if (lastNonWs === \",\") out = out.slice(0, -1);\n else if (lastNonWs === \":\") out = `${out}null`;\n // A `\"key\"` with no colon yet (`{\"type\"`) is also unfinished — cut it.\n else if (lastNonWs === '\"' && stack[stack.length - 1] === \"}\") {\n const m = /(?:^|[{,])\\s*\"(?:[^\"\\\\]|\\\\.)*\"$/.exec(out);\n if (m) out = out.slice(0, m.index + (out[m.index] === \"{\" || out[m.index] === \",\" ? 1 : 0));\n }\n out = out.replace(/,\\s*$/, \"\");\n return out + stack.reverse().join(\"\");\n}\n\n/**\n * Parse `text`, completing it first when `partial`. Returns `null` (never throws)\n * when even the completed text is not JSON — the caller treats that as \"no tree\n * yet\".\n */\nexport function parseSurfaceJson(text: string, partial = false): unknown | null {\n const trimmed = text.trim();\n if (!trimmed) return null;\n try {\n return JSON.parse(partial ? completeJson(trimmed) : trimmed);\n } catch {\n return null;\n }\n}\n"],"mappings":";;;AAaO,SAAS,aAAa,MAAsB;AACjD,QAAM,QAAkB,CAAC;AACzB,MAAI,WAAW;AACf,MAAI,UAAU;AAGd,MAAI,WAAW;AACf,MAAI,YAAY;AAEhB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,KAAK,KAAK,CAAC;AACjB,QAAI,UAAU;AACZ,UAAI,QAAS,WAAU;AAAA,eACd,OAAO,KAAM,WAAU;AAAA,eACvB,OAAO,KAAK;AACnB,mBAAW;AACX,oBAAY;AACZ,mBAAW,IAAI;AAAA,MACjB;AACA;AAAA,IACF;AACA,QAAI,OAAO,KAAK;AACd,iBAAW;AACX;AAAA,IACF;AACA,QAAI,OAAO,OAAO,OAAO,IAAK,OAAM,KAAK,OAAO,MAAM,MAAM,GAAG;AAAA,aACtD,OAAO,OAAO,OAAO,IAAK,OAAM,IAAI;AAC7C,QAAI,CAAC,KAAK,KAAK,EAAE,GAAG;AAClB,kBAAY;AACZ,iBAAW,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,MAAI,MAAM;AACV,MAAI,UAAU;AAGZ,UAAM,MAAM,MAAM,MAAM,SAAS,CAAC;AAClC,QAAI,QAAQ,QAAQ,cAAc,OAAO,cAAc,KAAM,OAAM,KAAK,MAAM,GAAG,QAAQ;AAAA,QACpF,OAAM,UAAU,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,MAAM,GAAG,IAAI;AACtD,gBAAY,IAAI,QAAQ,EAAE,MAAM,EAAE;AAAA,EACpC;AACA,QAAM,IAAI,QAAQ;AAClB,MAAI,cAAc,IAAK,OAAM,IAAI,MAAM,GAAG,EAAE;AAAA,WACnC,cAAc,IAAK,OAAM,GAAG,GAAG;AAAA,WAE/B,cAAc,OAAO,MAAM,MAAM,SAAS,CAAC,MAAM,KAAK;AAC7D,UAAM,IAAI,kCAAkC,KAAK,GAAG;AACpD,QAAI,EAAG,OAAM,IAAI,MAAM,GAAG,EAAE,SAAS,IAAI,EAAE,KAAK,MAAM,OAAO,IAAI,EAAE,KAAK,MAAM,MAAM,IAAI,EAAE;AAAA,EAC5F;AACA,QAAM,IAAI,QAAQ,SAAS,EAAE;AAC7B,SAAO,MAAM,MAAM,QAAQ,EAAE,KAAK,EAAE;AACtC;AAOO,SAAS,iBAAiB,MAAc,UAAU,OAAuB;AAC9E,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI;AACF,WAAO,KAAK,MAAM,UAAU,aAAa,OAAO,IAAI,OAAO;AAAA,EAC7D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
|