@kitn.ai/ui 0.25.2 → 0.26.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 +2 -2
- package/dist/components/attachment-types.d.ts +46 -1
- package/dist/components/attachments.d.ts +31 -0
- package/dist/components/audio-visualizer/fit-scale.d.ts +50 -0
- package/dist/components/audio-visualizer/index.d.ts +15 -1
- package/dist/components/audio-visualizer/variant-bar.d.ts +24 -1
- package/dist/components/chat-thread.d.ts +3 -41
- package/dist/components/code-block.d.ts +22 -0
- package/dist/components/conversation-item.d.ts +54 -1
- package/dist/components/conversation-list.d.ts +65 -0
- package/dist/components/form.d.ts +42 -0
- package/dist/components/message.d.ts +7 -0
- package/dist/components/toast.d.ts +2 -1
- package/dist/components/voice-input.d.ts +8 -0
- package/dist/components/voice-output.d.ts +12 -1
- package/dist/components/workspace-shell.d.ts +87 -0
- package/dist/{create-tween-B5Y4Im8G.js → create-tween-BFT6c-Y8.js} +1 -1
- package/dist/{create-tween-4z1XYLkR.js → create-tween-CJNlzoaO.js} +1 -1
- package/dist/{create-tween-CUzOlaMS.js → create-tween-CQED4T0g.js} +1 -1
- package/dist/custom-elements.json +2931 -2572
- package/dist/diagnostics/hook.d.ts +81 -0
- package/dist/diagnostics/index.d.ts +7 -0
- package/dist/diagnostics/report-request.d.ts +61 -0
- package/dist/diagnostics.d.ts +5 -0
- package/dist/diagnostics.js +209 -0
- package/dist/elements/agent-card.js +1 -1
- package/dist/elements/artifact.js +1 -1
- package/dist/elements/attachments.js +1 -1
- package/dist/elements/audio-visualizer.js +1 -1
- package/dist/elements/autoloader.js +1 -1
- package/dist/elements/avatar.js +1 -1
- package/dist/elements/badge.js +1 -1
- package/dist/elements/button.js +1 -1
- package/dist/elements/card.js +1 -1
- package/dist/elements/cards.js +1 -1
- package/dist/elements/chain-of-thought.js +1 -1
- package/dist/elements/chat-scope-picker.js +1 -1
- package/dist/elements/chat-workspace.js +1 -1
- package/dist/elements/chat.js +1 -1
- package/dist/elements/checkpoint.js +1 -1
- package/dist/elements/choice.js +1 -1
- package/dist/elements/chunks/{Icon-b5A8hlHs.js → Icon--Y8vsFal.js} +1 -1
- package/dist/elements/chunks/action-icons-D9u3OzYW.js +1 -0
- package/dist/elements/chunks/arrow-left-CVh1TeN7.js +1 -0
- package/dist/elements/chunks/{artifact-BSuPYFHY.js → artifact-BkYcfIlZ.js} +1 -1
- package/dist/elements/chunks/attachments-DwfNlubq.js +1 -0
- package/dist/elements/chunks/audio-visualizer-D7lB6mvR.js +1 -0
- package/dist/elements/chunks/{badge-TIMiJFKc.js → badge-Q0-Cmwzz.js} +1 -1
- package/dist/elements/chunks/{button-B9okqG73.js → button-flUbeufF.js} +1 -1
- package/dist/elements/chunks/{card-renderer-CSoTL_e1.js → card-renderer-3Dyl-FpN.js} +1 -1
- package/dist/elements/chunks/check-B5kBPKeo.js +1 -0
- package/dist/elements/chunks/chevron-down-DZ1GS39h.js +1 -0
- package/dist/elements/chunks/chevron-right-CvP7OUd2.js +1 -0
- package/dist/elements/chunks/{choice-card-CGMc3kek.js → choice-card-D4QUIOWZ.js} +1 -1
- package/dist/elements/chunks/circle-CDf9g6MQ.js +1 -0
- package/dist/elements/chunks/circle-check-CA47Nqbz.js +1 -0
- package/dist/elements/chunks/{circle-x-mhH7pOK2.js → circle-x-CJ_HVbC8.js} +1 -1
- package/dist/elements/chunks/code-block-BdLiTitd.js +1 -0
- package/dist/elements/chunks/collapsible-BzbXpPzr.js +1 -0
- package/dist/elements/chunks/{composer-CZZmtYOT.js → composer-Byve-n8K.js} +2 -2
- package/dist/elements/chunks/{confirm-card-BWjf2-xo.js → confirm-card-B0flE3MN.js} +1 -1
- package/dist/elements/chunks/context-VLIL3sJ-.js +1 -0
- package/dist/elements/chunks/controllable-DTwTIlwp.js +1 -0
- package/dist/elements/chunks/conversation-item-BDztezOG.js +1 -0
- package/dist/elements/chunks/copy-Nf-kqxXH.js +1 -0
- package/dist/elements/chunks/{create-tween-CUrM6D_o.js → create-tween-c4Z8TDYz.js} +2 -2
- package/dist/elements/chunks/default-input-C2iLFq0b.js +1 -0
- package/dist/elements/chunks/define-wjHR1MkU.js +1 -0
- package/dist/elements/chunks/disclosure-CcNbyLy0.js +1 -0
- package/dist/elements/chunks/{download-DnCyWFJE.js → download-C4V7tBdb.js} +1 -1
- package/dist/elements/chunks/dropdown-BgWTthUx.js +1 -0
- package/dist/elements/chunks/{ellipsis-CVxqfsDZ.js → ellipsis-7gU33mL2.js} +1 -1
- package/dist/elements/chunks/embed-D3KewsIJ.js +1 -0
- package/dist/elements/chunks/{external-link-DG2sRdQL.js → external-link-CSOEsNlx.js} +1 -1
- package/dist/elements/chunks/{file-text-D0J9F6M7.js → file-text-D1G8khle.js} +1 -1
- package/dist/elements/chunks/{file-tree-yGWNK0Js.js → file-tree-zvB2i7P9.js} +1 -1
- package/dist/elements/chunks/{folder-NV1pi_ud.js → folder-WW2LGLid.js} +1 -1
- package/dist/elements/chunks/form-CQirdC4W.js +1 -0
- package/dist/elements/chunks/hover-card-CJJkfHTK.js +1 -0
- package/dist/elements/chunks/icon-Cfgmf4fa.js +1 -0
- package/dist/elements/chunks/{info-C8r5Q6cc.js → info-DX3YMOt6.js} +1 -1
- package/dist/elements/chunks/input-BtW9U6Sq.js +1 -0
- package/dist/elements/chunks/{kbd-OGJDUT-O.js → kbd-LGXwuT_V.js} +1 -1
- package/dist/elements/chunks/{link-BdsfLB7b.js → link-2My69BqT.js} +1 -1
- package/dist/elements/chunks/{link-preview-Cf5KOP-i.js → link-preview-OQ9IEq0f.js} +1 -1
- package/dist/elements/chunks/{loader-B5QzK_8_.js → loader-iOxc_Tu-.js} +1 -1
- package/dist/elements/chunks/{markdown-DbozyYqa.js → markdown-DgBFaGAz.js} +1 -1
- package/dist/elements/chunks/{message-DtXKPqiR.js → message-VMZohrXx.js} +1 -1
- package/dist/elements/chunks/message-circle-CpXMM-_n.js +1 -0
- package/dist/elements/chunks/message-square-DxcWtETQ.js +1 -0
- package/dist/elements/chunks/message-tZmV2A3p.js +1 -0
- package/dist/elements/chunks/{minimize-2-SegJ_oku.js → minimize-2-DPIUKTrT.js} +1 -1
- package/dist/elements/chunks/{model-switcher-D7JrFFHp.js → model-switcher-DsT8tFB0.js} +1 -1
- package/dist/elements/chunks/{overlay-CV7z2YuX.js → overlay-DuiwdXjm.js} +1 -1
- package/dist/elements/chunks/{paperclip-Bg0ITU3b.js → paperclip-CRZVp4z_.js} +1 -1
- package/dist/elements/chunks/{progress-bar-D1_rzt6N.js → progress-bar-DNy66e_E.js} +1 -1
- package/dist/elements/chunks/{prompt-suggestion-D5Sm8xF1.js → prompt-suggestion-Bn64Nl7L.js} +1 -1
- package/dist/elements/chunks/reasoning-Emn9N4-T.js +1 -0
- package/dist/elements/chunks/{resizable-Dpzjlvp4.js → resizable-D181b4fM.js} +1 -1
- package/dist/elements/chunks/{rotate-cw-DzVDJOA1.js → rotate-cw-CPWe37D9.js} +1 -1
- package/dist/elements/chunks/{scroll-area-93A1bbeG.js → scroll-area-ClZkZxIk.js} +1 -1
- package/dist/elements/chunks/scroll-button-DPE-t3x_.js +1 -0
- package/dist/elements/chunks/{separator-DH2r_ZSZ.js → separator-CeJHQqLW.js} +1 -1
- package/dist/elements/chunks/{settings-BFMOd6yB.js → settings-CqaHgJF9.js} +1 -1
- package/dist/elements/chunks/{settings-group-B3VZKIcz.js → settings-group-CjqjLCOn.js} +1 -1
- package/dist/elements/chunks/share-CyfnNEqp.js +1 -0
- package/dist/elements/chunks/{skeleton-N8BuWYmf.js → skeleton-D8akBnKS.js} +1 -1
- package/dist/elements/chunks/slots-DaNjX0rc.js +1 -0
- package/dist/elements/chunks/{source-w9V0NnBn.js → source-UWCvmVak.js} +1 -1
- package/dist/elements/chunks/{star-DHvACxtm.js → star-DoHFAikQ.js} +1 -1
- package/dist/elements/chunks/store-Cjq0qwYN.js +1 -0
- package/dist/elements/chunks/{tasks-card-lPxoodlA.js → tasks-card-CmZ5xh6v.js} +1 -1
- package/dist/elements/chunks/{text-shimmer-BY_rI3s5.js → text-shimmer-DYn09zrz.js} +1 -1
- package/dist/elements/chunks/textarea-skiGHURM.js +1 -0
- package/dist/elements/chunks/{thumbs-up-DQe0hvkZ.js → thumbs-up-DX2Ijk3H.js} +1 -1
- package/dist/elements/chunks/{toast-store-VUZZBhzH.js → toast-store-CFnQpThX.js} +1 -1
- package/dist/elements/chunks/{tool-C1YtxwPu.js → tool-DKQ2D1DP.js} +1 -1
- package/dist/elements/chunks/{tooltip-BqwnFWhn.js → tooltip-B0G99y8w.js} +1 -1
- package/dist/elements/chunks/{triangle-alert-B6or7F5u.js → triangle-alert-F9cyUEyy.js} +1 -1
- package/dist/elements/chunks/{use-card-resolution-DJg32jGH.js → use-card-resolution-DoA2f_EU.js} +1 -1
- package/dist/elements/chunks/{variant-aurora-QXTZPyST.js → variant-aurora-qt6Zct8M.js} +2 -2
- package/dist/elements/chunks/variant-custom-tJp22_BQ.js +1 -0
- package/dist/{variant-wave-BwzrHD1s.js → elements/chunks/variant-wave-CaQ5ti39.js} +2 -2
- package/dist/elements/chunks/x-B6UnOiLw.js +1 -0
- package/dist/elements/coachmark.js +1 -1
- package/dist/elements/code-block.js +1 -1
- package/dist/elements/command.js +1 -1
- package/dist/elements/compare.js +1 -1
- package/dist/elements/composer.js +1 -1
- package/dist/elements/confirm-card.js +1 -1
- package/dist/elements/context-meter.js +1 -1
- package/dist/elements/conversation-item.d.ts +1 -0
- package/dist/elements/conversation-item.js +1 -0
- package/dist/elements/conversation-list.js +1 -1
- package/dist/elements/default-input.d.ts +3 -3
- package/dist/elements/define.d.ts +27 -0
- package/dist/elements/diagnostic-events.d.ts +74 -0
- package/dist/elements/dialog.js +1 -1
- package/dist/elements/dock.d.ts +1 -0
- package/dist/elements/dock.js +149 -0
- package/dist/elements/dropdown.d.ts +1 -0
- package/dist/elements/dropdown.js +1 -0
- package/dist/elements/editable-label.js +1 -1
- package/dist/elements/element-diagnostics.d.ts +81 -0
- package/dist/elements/embed.js +1 -1
- package/dist/elements/empty.js +1 -1
- package/dist/elements/feedback-bar.js +1 -1
- package/dist/elements/file-tree.js +1 -1
- package/dist/elements/file-upload.js +1 -1
- package/dist/elements/form.js +1 -1
- package/dist/elements/hover-card.js +1 -1
- package/dist/elements/icon.js +1 -1
- package/dist/elements/image.js +1 -1
- package/dist/elements/input.js +1 -1
- package/dist/elements/kbd.js +1 -1
- package/dist/elements/link-preview.js +1 -1
- package/dist/elements/loader.js +1 -1
- package/dist/elements/markdown.js +1 -1
- package/dist/elements/menu.js +1 -1
- package/dist/elements/message-skills.js +1 -1
- package/dist/elements/message.js +1 -1
- package/dist/elements/model-switcher.js +1 -1
- package/dist/elements/nav.js +1 -1
- package/dist/elements/notice.js +1 -1
- package/dist/elements/pane-group.js +1 -1
- package/dist/elements/pane.js +1 -1
- package/dist/elements/popover.js +1 -1
- package/dist/elements/progress-bar.js +1 -1
- package/dist/elements/prompt-dock.js +1 -1
- package/dist/elements/prompt-input.js +1 -1
- package/dist/elements/prompt-suggestions.js +1 -1
- package/dist/elements/reasoning.js +1 -1
- package/dist/elements/register.d.ts +2 -0
- package/dist/elements/remote.js +1 -1
- package/dist/elements/resizable.js +1 -1
- package/dist/elements/response-stream.js +3 -3
- package/dist/elements/screen.js +1 -1
- package/dist/elements/scroll-area.js +1 -1
- package/dist/elements/scroll-button.js +1 -1
- package/dist/elements/search.js +1 -1
- package/dist/elements/segmented.js +1 -1
- package/dist/elements/separator.js +1 -1
- package/dist/elements/setting-item.js +1 -1
- package/dist/elements/settings-group.js +1 -1
- package/dist/elements/skeleton.js +1 -1
- package/dist/elements/slots.d.ts +35 -3
- package/dist/elements/source.js +1 -1
- package/dist/elements/status.js +1 -1
- package/dist/elements/switch.js +1 -1
- package/dist/elements/tabs.js +1 -1
- package/dist/elements/tasks.js +1 -1
- package/dist/elements/text-shimmer.js +1 -1
- package/dist/elements/thinking-bar.js +1 -1
- package/dist/elements/thread.js +1 -1
- package/dist/elements/toast.js +1 -1
- package/dist/elements/tool.js +1 -1
- package/dist/elements/tooltip.js +1 -1
- package/dist/elements/voice-input.js +1 -1
- package/dist/elements/voice-output.js +1 -1
- package/dist/elements.d.ts +232 -148
- package/dist/index.d.ts +2 -0
- package/dist/index.js +5456 -4931
- package/dist/index.server.js +4142 -3669
- package/dist/kai-provider.es.js +40 -40
- package/dist/kai.es.js +1 -1
- package/dist/llms/llms-full.txt +184 -69
- package/dist/llms/llms.txt +3 -3
- package/dist/mcp.es.js +2669 -546
- package/dist/primitives/use-resize-observer.d.ts +23 -0
- package/dist/primitives/use-speech-recognition.d.ts +8 -0
- package/dist/primitives/use-text-stream.d.ts +5 -0
- package/dist/react/index.d.ts +115 -266
- package/dist/react.js +247 -221
- package/dist/register-impl-DpE7icIb.js +293 -0
- package/dist/schemas/index.d.ts +1 -1
- package/dist/schemas/tool-defs.d.ts +35 -0
- package/dist/schemas.js +403 -310
- package/dist/{solid-BMuDmFo_.js → solid-BtdqNZI7.js} +8435 -7394
- package/dist/{solid-CGYNdLRR.js → solid-CnavwBye.js} +5987 -5035
- package/dist/solid.d.ts +5 -0
- package/dist/solid.js +210 -203
- package/dist/solid.server.js +210 -203
- package/dist/state/index.d.ts +4 -0
- package/dist/state/persistence.d.ts +51 -0
- package/dist/state/stream.d.ts +50 -0
- package/dist/state/threads.d.ts +71 -0
- package/dist/state.js +269 -169
- package/dist/types.d.ts +4 -2
- package/dist/ui/dock.d.ts +109 -0
- package/dist/ui/hover-card.d.ts +44 -0
- package/dist/{variant-aurora-DwSOfraQ.js → variant-aurora-B8II3-I1.js} +27 -27
- package/dist/{variant-aurora-wKvAQ5wp.js → variant-aurora-CMNWOSJR.js} +28 -28
- package/dist/{variant-aurora-XEkPT0_z.js → variant-aurora-CcuDMWwQ.js} +2 -2
- package/dist/{variant-custom-eFIg2XWQ.js → variant-custom-BdvYC7af.js} +40 -40
- package/dist/{variant-custom-BhS9wIpU.js → variant-custom-C714mqKl.js} +65 -65
- package/dist/variant-custom-L16JLLZy.js +1 -0
- package/dist/{elements/chunks/variant-wave-DDCwhLas.js → variant-wave-2S4La2Ka.js} +2 -2
- package/dist/{variant-wave-CbVsmgwT.js → variant-wave-D7ruiA1W.js} +25 -25
- package/dist/{variant-wave-CUWGx9Bn.js → variant-wave-ecwykeyL.js} +21 -21
- package/dist/wire/chunk.d.ts +47 -0
- package/dist/wire/diagnostics.d.ts +575 -0
- package/dist/wire/encode-probe.d.ts +70 -0
- package/dist/wire/encode.d.ts +24 -0
- package/dist/wire/index.d.ts +2 -0
- package/dist/wire/sse.d.ts +10 -2
- package/dist/wire.js +917 -480
- package/frameworks/react/index.tsx +132 -93
- package/llms-full.txt +184 -69
- package/llms.txt +3 -3
- package/package.json +26 -6
- package/src/agent-tooling/archetypes.ts +41 -9
- package/src/agent-tooling/catalog/README.md +676 -0
- package/src/agent-tooling/catalog/catalog-types.ts +231 -0
- package/src/agent-tooling/catalog/fabrications.ts +96 -0
- package/src/agent-tooling/catalog/invariants.ts +284 -0
- package/src/agent-tooling/catalog/labs-titles.ts +114 -0
- package/src/agent-tooling/catalog/scenarios.ts +87 -0
- package/src/agent-tooling/catalog/surfaces.ts +275 -0
- package/src/agent-tooling/integrations/anthropic.ts +7 -1
- package/src/agent-tooling/integrations/cloudflare.ts +43 -2
- package/src/agent-tooling/integrations/langgraph.ts +7 -1
- package/src/agent-tooling/integrations/mastra.ts +7 -1
- package/src/agent-tooling/integrations/mock.ts +92 -17
- package/src/agent-tooling/integrations/ollama.ts +7 -1
- package/src/agent-tooling/integrations/openai.ts +7 -1
- package/src/agent-tooling/integrations/openrouter.ts +7 -1
- package/src/agent-tooling/integrations/pi.ts +56 -1
- package/src/agent-tooling/integrations/vercel-ai-sdk.ts +7 -1
- package/src/agent-tooling/mcp/css-raw.d.ts +12 -0
- package/src/agent-tooling/mcp/manifest.ts +100 -1
- package/src/agent-tooling/mcp/server.ts +61 -5
- package/src/agent-tooling/mcp/tools/reference.ts +440 -4
- package/src/agent-tooling/mcp/tools/scaffold.ts +1834 -307
- package/src/agent-tooling/mcp/tools/theme.ts +146 -30
- package/src/agent-tooling/mcp/validate-args.ts +141 -0
- package/src/agent-tooling/registry.ts +19 -7
- package/src/agent-tooling/route-emit.ts +26 -2
- package/src/components/attachment-types.ts +47 -1
- package/src/components/attachments.tsx +169 -22
- package/src/components/audio-visualizer/fit-scale.ts +112 -0
- package/src/components/audio-visualizer/index.tsx +80 -3
- package/src/components/audio-visualizer/variant-aurora.tsx +10 -4
- package/src/components/audio-visualizer/variant-bar.tsx +38 -6
- package/src/components/audio-visualizer/variant-custom.tsx +8 -2
- package/src/components/audio-visualizer/variant-grid.tsx +16 -11
- package/src/components/audio-visualizer/variant-radial.tsx +15 -10
- package/src/components/audio-visualizer/variant-wave.tsx +7 -2
- package/src/components/chat-container.tsx +4 -1
- package/src/components/chat-thread.tsx +36 -7
- package/src/components/code-block.tsx +79 -3
- package/src/components/composer.tsx +8 -1
- package/src/components/conversation-item.tsx +114 -4
- package/src/components/conversation-list.tsx +212 -12
- package/src/components/embed.tsx +4 -0
- package/src/components/form.tsx +41 -14
- package/src/components/message.tsx +75 -5
- package/src/components/response-stream.tsx +13 -7
- package/src/components/screen.tsx +5 -0
- package/src/components/scroll-button.tsx +7 -0
- package/src/components/toast.tsx +11 -5
- package/src/components/voice-input.tsx +35 -3
- package/src/components/voice-output.tsx +46 -6
- package/src/components/workspace-shell.tsx +285 -0
- package/src/diagnostics/hook.ts +352 -0
- package/src/diagnostics/index.ts +82 -0
- package/src/diagnostics/report-request.ts +296 -0
- package/src/elements/attachments.tsx +6 -7
- package/src/elements/audio-visualizer.tsx +48 -4
- package/src/elements/chat-workspace.tsx +159 -287
- package/src/elements/chat.tsx +12 -9
- package/src/elements/code-block.tsx +19 -1
- package/src/elements/command.tsx +4 -1
- package/src/elements/compiled.css +1 -1
- package/src/elements/conversation-item.tsx +80 -0
- package/src/elements/conversation-list.tsx +60 -11
- package/src/elements/default-input.tsx +5 -5
- package/src/elements/define.tsx +168 -8
- package/src/elements/diagnostic-events.ts +114 -0
- package/src/elements/dialog.tsx +47 -0
- package/src/elements/disclosure.ts +34 -12
- package/src/elements/dock.tsx +204 -0
- package/src/elements/dropdown.tsx +123 -0
- package/src/elements/element-diagnostics.ts +392 -0
- package/src/elements/element-manifest.json +12 -0
- package/src/elements/element-meta.json +672 -439
- package/src/elements/element-nonscalar.json +170 -0
- package/src/elements/element-types.d.ts +232 -148
- package/src/elements/menu.tsx +13 -0
- package/src/elements/prompt-dock.tsx +2 -1
- package/src/elements/prompt-input.tsx +8 -8
- package/src/elements/register-impl.ts +46 -0
- package/src/elements/register.ts +28 -0
- package/src/elements/resizable.tsx +52 -25
- package/src/elements/scroll-button.tsx +5 -0
- package/src/elements/slots.ts +107 -12
- package/src/elements/styles.css +30 -6
- package/src/elements/thinking-bar.tsx +16 -7
- package/src/elements/toast.tsx +3 -0
- package/src/elements/tool.tsx +26 -5
- package/src/elements/voice-input.tsx +11 -2
- package/src/elements/voice-output.tsx +16 -3
- package/src/index.ts +2 -0
- package/src/primitives/use-resize-observer.ts +33 -0
- package/src/primitives/use-speech-recognition.ts +12 -1
- package/src/primitives/use-stick-to-bottom.ts +34 -2
- package/src/primitives/use-text-stream.ts +33 -2
- package/src/remote/provider-runtime.ts +6 -3
- package/src/schemas/index.ts +1 -0
- package/src/schemas/tool-defs.ts +297 -6
- package/src/solid.ts +5 -0
- package/src/state/index.ts +12 -0
- package/src/state/persistence.ts +180 -0
- package/src/state/stream.ts +71 -4
- package/src/state/threads.ts +142 -0
- package/src/types.ts +4 -2
- package/src/ui/dialog.tsx +6 -0
- package/src/ui/dock.tsx +445 -0
- package/src/ui/dropdown.tsx +67 -23
- package/src/ui/hover-card.tsx +156 -6
- package/src/ui/input.tsx +29 -10
- package/src/ui/resizable.tsx +11 -0
- package/src/wire/chunk.ts +47 -0
- package/src/wire/consume.ts +185 -26
- package/src/wire/diagnostics.ts +727 -0
- package/src/wire/encode-probe.ts +214 -0
- package/src/wire/encode.ts +267 -14
- package/src/wire/formats/anthropic.ts +8 -1
- package/src/wire/formats/openai.ts +5 -0
- package/src/wire/index.ts +22 -0
- package/src/wire/read.ts +250 -6
- package/src/wire/sse.ts +16 -3
- package/dist/elements/chunks/action-icons-DW9muWrY.js +0 -1
- package/dist/elements/chunks/arrow-left-iJVnQmxA.js +0 -1
- package/dist/elements/chunks/attachments-CL6TaqIb.js +0 -1
- package/dist/elements/chunks/audio-visualizer-BuUqQmaO.js +0 -1
- package/dist/elements/chunks/chat-thread-DxoKaStk.js +0 -1
- package/dist/elements/chunks/check-MdLzbxrm.js +0 -1
- package/dist/elements/chunks/chevron-down-MK7IzDqe.js +0 -1
- package/dist/elements/chunks/chevron-right-C5jXhmtV.js +0 -1
- package/dist/elements/chunks/circle-BG7VkPep.js +0 -1
- package/dist/elements/chunks/circle-check-GqvO2UBs.js +0 -1
- package/dist/elements/chunks/code-block-ClhQO9RW.js +0 -1
- package/dist/elements/chunks/collapsible-DBcBkFPh.js +0 -1
- package/dist/elements/chunks/context-hKjNqiyQ.js +0 -1
- package/dist/elements/chunks/conversation-list-CsGJjSKG.js +0 -1
- package/dist/elements/chunks/default-input-B1Mem5wu.js +0 -1
- package/dist/elements/chunks/define-B_tXMYRm.js +0 -1
- package/dist/elements/chunks/disclosure-DAoYOKew.js +0 -1
- package/dist/elements/chunks/dropdown-CmNna5lT.js +0 -1
- package/dist/elements/chunks/embed-CjAD2jSi.js +0 -1
- package/dist/elements/chunks/form-Cp8Y00Wn.js +0 -1
- package/dist/elements/chunks/hover-card-6KtXpLwT.js +0 -1
- package/dist/elements/chunks/icon-97R8SR2p.js +0 -1
- package/dist/elements/chunks/input-DrseEjhp.js +0 -1
- package/dist/elements/chunks/message-CE4k-qaj.js +0 -1
- package/dist/elements/chunks/message-square-C9ovmtOo.js +0 -1
- package/dist/elements/chunks/reasoning-BrxQfpfI.js +0 -1
- package/dist/elements/chunks/scroll-button-CrTo7wm4.js +0 -1
- package/dist/elements/chunks/share-DgNbkJKY.js +0 -1
- package/dist/elements/chunks/slots-CIw9RlAe.js +0 -1
- package/dist/elements/chunks/store-HIPGhNz9.js +0 -1
- package/dist/elements/chunks/textarea-DPfuhswM.js +0 -1
- package/dist/elements/chunks/variant-custom-D5ZlmziF.js +0 -1
- package/dist/elements/chunks/video-Bb86fVYI.js +0 -1
- package/dist/elements/chunks/x-BOhjBeOd.js +0 -1
- package/dist/primitives/card-validate-generator.testlib.d.ts +0 -20
- package/dist/register-impl-DGmGzrEM.js +0 -145
- package/dist/variant-custom-MkTNTycd.js +0 -1
- package/src/primitives/card-validate-generator.testlib.ts +0 -38
package/src/wire/consume.ts
CHANGED
|
@@ -18,6 +18,14 @@ import {
|
|
|
18
18
|
type StopReason,
|
|
19
19
|
} from './chunk';
|
|
20
20
|
import type { RawOrigin } from '../components/tool-types';
|
|
21
|
+
import {
|
|
22
|
+
emitWireDiagnostic,
|
|
23
|
+
nextStreamId,
|
|
24
|
+
wireCorrelation,
|
|
25
|
+
wireDiagnosticsActive,
|
|
26
|
+
withPayload,
|
|
27
|
+
type WireCorrelation,
|
|
28
|
+
} from './diagnostics';
|
|
21
29
|
|
|
22
30
|
// ── Tool-call accumulator ────────────────────────────────────────────────────
|
|
23
31
|
|
|
@@ -245,13 +253,75 @@ export function createToolCallAccumulator(sink: AssistantStreamSink, opts: Consu
|
|
|
245
253
|
/** A sink that writes nowhere but into a `MessagePart[]`, using the kit's own
|
|
246
254
|
* builders. Teed alongside the real sink so `ModelTurn.parts` cannot drift from
|
|
247
255
|
* what the message actually received. */
|
|
248
|
-
function createPartsRecorder(): AssistantStreamSink & {
|
|
256
|
+
function createPartsRecorder(correlation: WireCorrelation): AssistantStreamSink & {
|
|
257
|
+
parts(): MessagePart[];
|
|
258
|
+
/** How many DISTINCT parts each variant produced, keyed by variant name.
|
|
259
|
+
*
|
|
260
|
+
* Counted from the sink method that was called plus the fact that the parts
|
|
261
|
+
* array GREW, NOT by discriminating a `MessagePart` -- which is what keeps
|
|
262
|
+
* this out of scope for `lint:silent-drops`: there is no new switch over
|
|
263
|
+
* `MessagePart.type` in `wire/` to go stale when a seventh variant lands.
|
|
264
|
+
*
|
|
265
|
+
* Parts, not writes: five text deltas merge into ONE text part and report
|
|
266
|
+
* `{ text: 1 }`. A consumer renders these as "N parts", so a write count
|
|
267
|
+
* would lie there. Per-delta granularity is not lost -- one `wire.part`
|
|
268
|
+
* event is still emitted per write, carrying that delta's own `chars`. */
|
|
269
|
+
partCounts(): Record<string, number>;
|
|
270
|
+
} {
|
|
249
271
|
let parts: MessagePart[] = [];
|
|
272
|
+
const counts: Record<string, number> = {};
|
|
273
|
+
|
|
274
|
+
/** Count the part if this write created one, then report the write. `chars` is
|
|
275
|
+
* the delta LENGTH and is passed only for the text-bearing variants; the
|
|
276
|
+
* delta itself never travels.
|
|
277
|
+
*
|
|
278
|
+
* A write either APPENDS a part or MERGES into one that already exists, and
|
|
279
|
+
* the array length is what separates them -- uniform across all four methods
|
|
280
|
+
* and needing no knowledge of any variant's shape. The growth amount is used
|
|
281
|
+
* rather than a flat +1 so a builder that ever appends two stays honest.
|
|
282
|
+
*
|
|
283
|
+
* `index` is the position in `parts` this write landed on, found by comparing
|
|
284
|
+
* references before and after. The builders return a new array with a new
|
|
285
|
+
* object for the item they changed, so the first slot that differs IS the
|
|
286
|
+
* part that moved. Computed only when someone is listening. */
|
|
287
|
+
const record = (
|
|
288
|
+
variant: string,
|
|
289
|
+
before: MessagePart[],
|
|
290
|
+
chars?: number,
|
|
291
|
+
/** Built ONLY when the payload switch is on -- a thunk, so with it off
|
|
292
|
+
* nothing here is read or copied. */
|
|
293
|
+
payload?: () => { delta?: string; patch?: unknown; source?: unknown },
|
|
294
|
+
) => {
|
|
295
|
+
if (parts.length > before.length) {
|
|
296
|
+
counts[variant] = (counts[variant] ?? 0) + (parts.length - before.length);
|
|
297
|
+
}
|
|
298
|
+
if (!wireDiagnosticsActive()) return;
|
|
299
|
+
let index = parts.length - 1;
|
|
300
|
+
for (let i = 0; i < parts.length; i++) {
|
|
301
|
+
if (before[i] !== parts[i]) {
|
|
302
|
+
index = i;
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
emitWireDiagnostic({
|
|
307
|
+
type: 'wire.part',
|
|
308
|
+
t: Date.now(),
|
|
309
|
+
...correlation,
|
|
310
|
+
variant,
|
|
311
|
+
index,
|
|
312
|
+
...(chars !== undefined ? { chars } : {}),
|
|
313
|
+
...(payload ? withPayload(payload) : {}),
|
|
314
|
+
});
|
|
315
|
+
};
|
|
316
|
+
|
|
250
317
|
return {
|
|
251
318
|
appendText(delta) {
|
|
319
|
+
const before = parts;
|
|
252
320
|
parts = appendTextPart(parts, delta);
|
|
321
|
+
record('text', before, delta.length, () => ({ delta }));
|
|
253
322
|
},
|
|
254
323
|
appendReasoning(delta, opts) {
|
|
324
|
+
const before = parts;
|
|
255
325
|
// `streamId` is DROPPED here on purpose. It namespaces block indices for a
|
|
256
326
|
// sink that outlives one stream; this recorder starts a fresh array per
|
|
257
327
|
// call, so within `ModelTurn.parts` there is nothing to disambiguate. Worse,
|
|
@@ -260,14 +330,22 @@ function createPartsRecorder(): AssistantStreamSink & { parts(): MessagePart[] }
|
|
|
260
330
|
// adapter guarantees (same chunks in, same parts out, whatever the byte
|
|
261
331
|
// boundaries). The host's own sink still receives it.
|
|
262
332
|
parts = appendReasoningPart(parts, delta, { ...opts, streamId: undefined });
|
|
333
|
+
record('reasoning', before, delta.length, () => ({ delta }));
|
|
263
334
|
},
|
|
264
335
|
upsertTool(toolCallId, patch) {
|
|
336
|
+
const before = parts;
|
|
265
337
|
parts = upsertToolPart(parts, toolCallId, patch);
|
|
338
|
+
// The patch is where the tool's arguments and its output live, so the
|
|
339
|
+
// whole thing is payload and none of it is metadata.
|
|
340
|
+
record('tool', before, undefined, () => ({ patch }));
|
|
266
341
|
},
|
|
267
342
|
addSource(source) {
|
|
343
|
+
const before = parts;
|
|
268
344
|
parts = [...parts, { type: 'source', source }];
|
|
345
|
+
record('source', before, undefined, () => ({ source }));
|
|
269
346
|
},
|
|
270
347
|
parts: () => parts,
|
|
348
|
+
partCounts: () => counts,
|
|
271
349
|
};
|
|
272
350
|
}
|
|
273
351
|
|
|
@@ -296,19 +374,6 @@ function teeSink(a: AssistantStreamSink, b: AssistantStreamSink): AssistantStrea
|
|
|
296
374
|
|
|
297
375
|
// ── The main loop ────────────────────────────────────────────────────────────
|
|
298
376
|
|
|
299
|
-
/** One id per `consumeModelStream` call, i.e. per provider response stream.
|
|
300
|
-
*
|
|
301
|
-
* It namespaces reasoning block indices. Anthropic restarts content-block
|
|
302
|
-
* indices at 0 on every message, and a tool loop reads several messages into ONE
|
|
303
|
-
* assistant turn, so without this round 2's block 0 merges into round 1's part
|
|
304
|
-
* and overwrites its verbatim `raw`. See `appendReasoningPart`.
|
|
305
|
-
*
|
|
306
|
-
* A monotonic counter, not a UUID: this never leaves the process, is compared
|
|
307
|
-
* only for equality against parts built in the same process, and a counter keeps
|
|
308
|
-
* the value short and reproducible in test output. */
|
|
309
|
-
let streamSeq = 0;
|
|
310
|
-
const nextStreamId = (): string => `wire-${++streamSeq}`;
|
|
311
|
-
|
|
312
377
|
/**
|
|
313
378
|
* Read one turn's worth of `ModelStreamChunk`s and drive `sink` with them.
|
|
314
379
|
*
|
|
@@ -326,8 +391,16 @@ export async function consumeModelStream(
|
|
|
326
391
|
opts: ConsumeOptions = {},
|
|
327
392
|
): Promise<ModelTurn> {
|
|
328
393
|
const label = opts.reasoningLabel ?? 'Thinking';
|
|
329
|
-
|
|
330
|
-
|
|
394
|
+
// `readModelStream` assigns the id one level up, because it opens the format
|
|
395
|
+
// and counts frames before this function runs and every event from one read
|
|
396
|
+
// has to carry the same id. A direct caller still gets a fresh one per call.
|
|
397
|
+
const streamId = opts.streamId ?? nextStreamId();
|
|
398
|
+
// `traceId`/`label` ride along unchanged from the caller. `readModelStream`
|
|
399
|
+
// built the same object one level up and passes the parts of it through
|
|
400
|
+
// `opts`, so a read and its consume report one identical correlation.
|
|
401
|
+
const correlation = wireCorrelation(streamId, opts);
|
|
402
|
+
const startedAt = Date.now();
|
|
403
|
+
const recorder = createPartsRecorder(correlation);
|
|
331
404
|
const out = teeSink(sink, recorder);
|
|
332
405
|
const tools = createToolCallAccumulator(out, opts);
|
|
333
406
|
|
|
@@ -408,21 +481,107 @@ export async function consumeModelStream(
|
|
|
408
481
|
// forward the status now; this is the second, independent guard, and it also
|
|
409
482
|
// covers a truncated body, a non-streaming completion returned by mistake, and
|
|
410
483
|
// an HTML proxy page.
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
484
|
+
//
|
|
485
|
+
// AND ITS SIBLING: a turn whose frames PARSED but produced no part.
|
|
486
|
+
//
|
|
487
|
+
// The guard judges on parts produced rather than on raw chunk count, which is
|
|
488
|
+
// what makes it hold once a format reads a field that content-less frames also
|
|
489
|
+
// carry (`model`, `finishReason`, `usage`). Judged on chunks alone, surfacing
|
|
490
|
+
// `model` would have taken this whole guard quiet: frames yielding nothing but
|
|
491
|
+
// an id would push `chunkCount` above zero and the turn would go back to
|
|
492
|
+
// resolving empty and saying so nowhere.
|
|
493
|
+
//
|
|
494
|
+
// The split reports which of the two happened, because they have different
|
|
495
|
+
// fixes: zero chunks means nothing parsed as a frame at all, while chunks with
|
|
496
|
+
// no parts means the frames parsed and carried nothing THIS reader reads --
|
|
497
|
+
// the wrong-dialect case, and the one this option makes common.
|
|
498
|
+
// ORDER IS LOAD-BEARING: settle runs FIRST, because settle PRODUCES PARTS.
|
|
499
|
+
//
|
|
500
|
+
// A tool call that never held both an id and a non-empty name is announced
|
|
501
|
+
// only inside `settle`, so a parts map read before it is not final. Judged
|
|
502
|
+
// there, a turn whose only content is such a call looked empty, and the
|
|
503
|
+
// damage went both ways: the guard's own prose was fed back in as
|
|
504
|
+
// `streamError` and REPLACED the call's accurate "arrived with no function
|
|
505
|
+
// name" diagnosis, while `wire.close` reported an emptiness code beside a
|
|
506
|
+
// produced part. Both reads now happen after settle, so the parts map, the
|
|
507
|
+
// error code and the tool's own error agree by construction.
|
|
508
|
+
//
|
|
509
|
+
// `settle` still receives only a GENUINE in-band stream error, exactly as it
|
|
510
|
+
// did before the guard was widened -- an emptiness diagnosis must never flow
|
|
511
|
+
// into it. `stopReason` is recomputed below because the guard can set the
|
|
512
|
+
// error that makes it 'error'; settle only branches on 'length', which the
|
|
513
|
+
// guard cannot produce, so the pre-guard value is the right one to pass.
|
|
514
|
+
const settleStopReason = normalizeStopReason(finishReason) ?? (error ? 'error' : undefined);
|
|
515
|
+
const toolCalls = tools.settle(settleStopReason, error?.message);
|
|
516
|
+
|
|
517
|
+
const partsTotal = Object.values(recorder.partCounts()).reduce((a, b) => a + b, 0);
|
|
518
|
+
if (!error && partsTotal === 0) {
|
|
519
|
+
error =
|
|
520
|
+
chunkCount === 0
|
|
521
|
+
? {
|
|
522
|
+
code: 'empty-stream',
|
|
523
|
+
message:
|
|
524
|
+
'The model stream produced no chunks. The response was 200 but nothing in its body parsed ' +
|
|
525
|
+
'as a stream frame — check the endpoint really sent Content-Type: text/event-stream and that ' +
|
|
526
|
+
'the request set stream: true. A route that forwards a provider error without its status ' +
|
|
527
|
+
'lands here: the body is a JSON error, not SSE.',
|
|
528
|
+
}
|
|
529
|
+
: {
|
|
530
|
+
code: 'empty-turn',
|
|
531
|
+
message:
|
|
532
|
+
`The stream completed and ${chunkCount} chunk(s) were parsed, but none carried content ` +
|
|
533
|
+
'this reader reads, so no message part was produced. If the endpoint streams a different ' +
|
|
534
|
+
'dialect (or carries its payload in a field this format does not read), switch to the ' +
|
|
535
|
+
'matching reader. A model that returned no content at all also lands here.',
|
|
536
|
+
};
|
|
420
537
|
}
|
|
421
538
|
|
|
422
539
|
// REWORK 3. `finishReason` is reported verbatim; `stopReason` is what the
|
|
423
540
|
// adapter itself branches on, so no OpenAI literal leaks into adapter logic.
|
|
541
|
+
//
|
|
542
|
+
// Recomputed after the guard: an emptiness error is still an error, and a turn
|
|
543
|
+
// that reports one must report `stopReason: 'error'` beside it as it always
|
|
544
|
+
// has. Identical to `settleStopReason` whenever the guard stayed silent.
|
|
424
545
|
const stopReason = normalizeStopReason(finishReason) ?? (error ? 'error' : undefined);
|
|
425
|
-
|
|
546
|
+
|
|
547
|
+
if (wireDiagnosticsActive()) {
|
|
548
|
+
// `_frames` is supplied by `readModelStream` only. A direct caller had no
|
|
549
|
+
// frames, so the field is absent rather than zero -- a consumer must be able
|
|
550
|
+
// to tell "not reported" from "none arrived".
|
|
551
|
+
const frames = (opts as { _frames?: () => number })._frames?.();
|
|
552
|
+
emitWireDiagnostic({
|
|
553
|
+
type: 'wire.close',
|
|
554
|
+
t: Date.now(),
|
|
555
|
+
...correlation,
|
|
556
|
+
...(frames !== undefined ? { frames } : {}),
|
|
557
|
+
chunks: chunkCount,
|
|
558
|
+
parts: recorder.partCounts(),
|
|
559
|
+
finishReason,
|
|
560
|
+
...(stopReason ? { stopReason } : {}),
|
|
561
|
+
// The CODE only. A provider's error message can echo request content back,
|
|
562
|
+
// which is why it stays on `ModelTurn.error` and never on the event.
|
|
563
|
+
...(error?.code !== undefined ? { errorCode: error.code } : {}),
|
|
564
|
+
...(usage ? { usage } : {}),
|
|
565
|
+
ms: Date.now() - startedAt,
|
|
566
|
+
// The assembled turn: everything the sink was driven with, in one place,
|
|
567
|
+
// which is what a panel renders when someone asks "what did it actually
|
|
568
|
+
// say" -- plus the in-band error's own message.
|
|
569
|
+
//
|
|
570
|
+
// ALL THREE TERMINAL EVENTS TREAT PROVIDER MESSAGE TEXT IDENTICALLY:
|
|
571
|
+
// `wire.close`, `wire.failed` and `wire.interrupted` each keep it out of
|
|
572
|
+
// the metadata (where only `errorCode` travels, because a message can
|
|
573
|
+
// echo request content back) and each publish it under `payload`, which
|
|
574
|
+
// is the switch that accepts exactly that. A developer who armed payload
|
|
575
|
+
// is most often chasing the in-band error that explains an empty turn.
|
|
576
|
+
...withPayload(() => ({
|
|
577
|
+
text,
|
|
578
|
+
reasoning,
|
|
579
|
+
toolCalls,
|
|
580
|
+
sources,
|
|
581
|
+
...(error?.message !== undefined ? { message: error.message } : {}),
|
|
582
|
+
})),
|
|
583
|
+
});
|
|
584
|
+
}
|
|
426
585
|
|
|
427
586
|
return {
|
|
428
587
|
parts: recorder.parts(),
|