@kitn.ai/ui 0.20.1 → 0.21.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 +44 -45
- package/dist/components/artifact-card.d.ts +51 -0
- package/dist/components/artifact.d.ts +1 -1
- package/dist/components/attachments.d.ts +2 -2
- package/dist/components/audio-visualizer/index.d.ts +3 -3
- package/dist/components/audio-visualizer/labs/lab-choreography.d.ts +59 -0
- package/dist/components/audio-visualizer/labs/lab-shaders.d.ts +22 -0
- package/dist/components/audio-visualizer/labs/lab-visualizer.d.ts +18 -0
- package/dist/components/audio-visualizer/variant-aurora.d.ts +2 -2
- package/dist/components/audio-visualizer/variant-bar.d.ts +2 -2
- package/dist/components/audio-visualizer/variant-custom.d.ts +2 -2
- package/dist/components/audio-visualizer/variant-grid.d.ts +1 -1
- package/dist/components/audio-visualizer/variant-radial.d.ts +1 -1
- package/dist/components/audio-visualizer/variant-wave.d.ts +1 -1
- package/dist/components/card-fallback.d.ts +12 -2
- package/dist/components/card-renderer.d.ts +63 -2
- package/dist/components/chat-container.d.ts +3 -0
- package/dist/components/chat-scope-picker.d.ts +2 -2
- package/dist/components/chat-thread.d.ts +68 -18
- package/dist/components/choice-card.d.ts +3 -28
- package/dist/components/composer-dom.d.ts +1 -1
- package/dist/components/composer-highlight.d.ts +1 -1
- package/dist/components/composer-history.d.ts +1 -1
- package/dist/components/composer.d.ts +1 -1
- package/dist/components/confirm-card.d.ts +3 -18
- package/dist/components/context.d.ts +8 -4
- package/dist/components/conversation-item.d.ts +1 -1
- package/dist/components/conversation-list.d.ts +4 -3
- package/dist/components/embed.d.ts +3 -3
- package/dist/components/file-tree.d.ts +11 -22
- package/dist/components/form-widgets.d.ts +1 -1
- package/dist/components/form.d.ts +3 -44
- package/dist/components/link-preview.d.ts +3 -3
- package/dist/components/loader.d.ts +30 -48
- package/dist/components/message-skills.d.ts +4 -0
- package/dist/components/message.d.ts +84 -21
- package/dist/components/model-switcher.d.ts +2 -2
- package/dist/components/prompt-input.d.ts +2 -2
- package/dist/components/response-compare-types.d.ts +11 -2
- package/dist/components/response-compare.d.ts +3 -3
- package/dist/components/source.d.ts +12 -3
- package/dist/components/tasks-card.d.ts +3 -31
- package/dist/components/thread.d.ts +17 -5
- package/dist/components/toast.d.ts +2 -2
- package/dist/components/tool-classify.d.ts +8 -0
- package/dist/components/tool-types.d.ts +29 -1
- package/dist/components/tool.d.ts +3 -3
- package/dist/components/use-card-resolution.d.ts +1 -1
- package/dist/create-tween-D3Y5qiij.js +338 -0
- package/dist/create-tween-DGKY1FDY.js +341 -0
- package/dist/create-tween-paho5Rh-.js +7 -0
- package/dist/custom-elements.json +1681 -454
- 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/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-types.d.ts +70 -10
- 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-Tj58ES_d.js → Icon-C-2LvGDG.js} +1 -1
- package/dist/elements/chunks/{action-icons-ns1Fnedj.js → action-icons-CaYoImEk.js} +1 -1
- package/dist/elements/chunks/arrow-left-Bb46H7w9.js +1 -0
- package/dist/elements/chunks/artifact-BBIscOxJ.js +1 -0
- package/dist/elements/chunks/{attachments-mCB5F1Fq.js → attachments-BB56zoji.js} +1 -1
- package/dist/elements/chunks/audio-visualizer-BxOx4THz.js +1 -0
- package/dist/elements/chunks/{badge-B4Zuajl2.js → badge-SxLSZ19R.js} +1 -1
- package/dist/elements/chunks/{button-ZWNif3--.js → button-CmkUkz6c.js} +1 -1
- package/dist/elements/chunks/card-renderer-Db4ffkWv.js +1 -0
- package/dist/elements/chunks/card-tags-D8lZ-C_U.js +1 -0
- package/dist/elements/chunks/chat-thread-B3Ks-cKr.js +1 -0
- package/dist/elements/chunks/check-C8desc_h.js +1 -0
- package/dist/elements/chunks/chevron-down-DKtc2HNB.js +1 -0
- package/dist/elements/chunks/chevron-right-Dw4GPhwL.js +1 -0
- package/dist/elements/chunks/choice-card-Q9cYYDyM.js +1 -0
- package/dist/elements/chunks/circle-BeokBsvB.js +1 -0
- package/dist/elements/chunks/circle-check-wJSqt859.js +1 -0
- package/dist/elements/chunks/{circle-x-B7faJFlY.js → circle-x-D0MEfxOM.js} +1 -1
- package/dist/elements/chunks/code-block-C8VzAraE.js +1 -0
- package/dist/elements/chunks/{collapsible-DM1Ckd4e.js → collapsible-Cvj61obE.js} +1 -1
- package/dist/elements/chunks/{composer-BguS0QL_.js → composer-D86ztyL0.js} +2 -2
- package/dist/elements/chunks/confirm-card-BdyDAGLw.js +1 -0
- package/dist/elements/chunks/context-WHDl-xSx.js +1 -0
- package/dist/elements/chunks/conversation-list-CdR14_Y4.js +1 -0
- package/dist/elements/chunks/create-tween-C_A_B638.js +7 -0
- package/dist/elements/chunks/{default-input-Cqqilg9t.js → default-input-CSZqUM81.js} +1 -1
- package/dist/elements/chunks/define-BzPnNsXg.js +1 -0
- package/dist/elements/chunks/{disclosure-CIZ5c8nO.js → disclosure-DVKsoc1F.js} +1 -1
- package/dist/elements/chunks/{download-Dsbg3ste.js → download-BjA54IMJ.js} +1 -1
- package/dist/elements/chunks/{dropdown-BDd1-Zgi.js → dropdown-BjVVHWXH.js} +1 -1
- package/dist/elements/chunks/{ellipsis-Dw6qrss-.js → ellipsis-BNedmqfi.js} +1 -1
- package/dist/elements/chunks/embed-DQsl4XEq.js +1 -0
- package/dist/elements/chunks/{external-link-Vt74zAoL.js → external-link-Di-dw2CU.js} +1 -1
- package/dist/elements/chunks/{file-text-CZrZF6_v.js → file-text-B3sAODCV.js} +1 -1
- package/dist/elements/chunks/{file-tree-DF4okKyo.js → file-tree-Dgto-bMn.js} +1 -1
- package/dist/elements/chunks/{folder-glP5rha4.js → folder-D6rMadFV.js} +1 -1
- package/dist/elements/chunks/form-CILxvhQ7.js +1 -0
- package/dist/elements/chunks/hover-card-BtiF4XiU.js +1 -0
- package/dist/elements/chunks/{icon-BLb8beoi.js → icon-DKkmze3y.js} +1 -1
- package/dist/elements/chunks/{info-CIsv92JK.js → info-CWRjZkuy.js} +1 -1
- package/dist/elements/chunks/{input-Dds1kFyt.js → input--QJBK6BA.js} +1 -1
- package/dist/elements/chunks/{kbd-De_xbgi9.js → kbd-C3zuKh8R.js} +1 -1
- package/dist/elements/chunks/{link-i4r_k7z4.js → link-BL5JA7Q0.js} +1 -1
- package/dist/elements/chunks/link-preview-CU37bbXh.js +1 -0
- package/dist/elements/chunks/{loader-BmQH4s3V.js → loader-XmpyxyRH.js} +1 -1
- package/dist/elements/chunks/{markdown-Zi21WhUz.js → markdown-3Gv5UZ_o.js} +1 -1
- package/dist/elements/chunks/message-CnBA2OUt.js +1 -0
- package/dist/elements/chunks/message-X5NZbq-W.js +1 -0
- package/dist/elements/chunks/message-square-CnpAm_P0.js +1 -0
- package/dist/elements/chunks/{minimize-2--ifeCGrl.js → minimize-2-DwyrUTcM.js} +1 -1
- package/dist/elements/chunks/{model-switcher-B94YAKsM.js → model-switcher-CclaJEHt.js} +1 -1
- package/dist/elements/chunks/{overlay-kD8dwRv_.js → overlay-Cepd-KcS.js} +1 -1
- package/dist/elements/chunks/{paperclip-q21dYOSK.js → paperclip-CdwKjrlu.js} +1 -1
- package/dist/elements/chunks/{progress-bar-BrAIIaaJ.js → progress-bar-DMVXBD3b.js} +1 -1
- package/dist/elements/chunks/{prompt-suggestion-Bjn2K-fR.js → prompt-suggestion-Di_WZE_5.js} +1 -1
- package/dist/elements/chunks/reasoning-D0jMch5u.js +1 -0
- package/dist/elements/chunks/{resizable-Dp4JExql.js → resizable-1znbL1Gv.js} +1 -1
- package/dist/elements/chunks/{rotate-cw-CFWWkpj2.js → rotate-cw-DVhhgx8n.js} +1 -1
- package/dist/elements/chunks/{scroll-area-Bb0kHH1j.js → scroll-area-Bs4bFS1P.js} +1 -1
- package/dist/elements/chunks/scroll-button-Bet5NLc4.js +1 -0
- package/dist/elements/chunks/{separator-9kRgr1X9.js → separator-C5Gh8qGC.js} +1 -1
- package/dist/elements/chunks/{settings-B8lmec4D.js → settings-5vmEFg0K.js} +1 -1
- package/dist/elements/chunks/{settings-group-I0hEuXiN.js → settings-group-BWLB38kz.js} +1 -1
- package/dist/elements/chunks/{share-C3lTiYGt.js → share-BZ3G_DaB.js} +1 -1
- package/dist/elements/chunks/skeleton-DafPJQTp.js +1 -0
- package/dist/elements/chunks/slots-CIw9RlAe.js +1 -0
- package/dist/elements/chunks/source-D_qj_6uJ.js +1 -0
- package/dist/elements/chunks/{star-CSJtGxgv.js → star-Cuv7j2IE.js} +1 -1
- package/dist/elements/chunks/{store-CHyW95TP.js → store-C1StPHfW.js} +1 -1
- package/dist/elements/chunks/tasks-card-EyoBZfpA.js +1 -0
- package/dist/elements/chunks/{text-shimmer-Cn9TmNpI.js → text-shimmer-D9gRSh34.js} +1 -1
- package/dist/elements/chunks/textarea-DuhtHfcm.js +1 -0
- package/dist/elements/chunks/{thumbs-up-PNVVThEF.js → thumbs-up-B9hwv43w.js} +1 -1
- package/dist/elements/chunks/{toast-store-DKbQn3Wn.js → toast-store-Bm3DUEDe.js} +1 -1
- package/dist/elements/chunks/{tool-DjTRpIpl.js → tool-CDtW7L0z.js} +1 -1
- package/dist/elements/chunks/tooltip-eB226mGK.js +1 -0
- package/dist/elements/chunks/{triangle-alert-DsHTHCPm.js → triangle-alert-C1SNzTqK.js} +1 -1
- package/dist/elements/chunks/use-card-resolution-YZh2MvI5.js +1 -0
- package/dist/elements/chunks/{variant-aurora-Dc4nQUia.js → variant-aurora-Cj1F7D0l.js} +2 -2
- package/dist/elements/chunks/{variant-custom-y_3kVQhS.js → variant-custom-T9gpt7QE.js} +1 -1
- package/dist/elements/chunks/{variant-wave-D5OR1-9Z.js → variant-wave-CxU9z-TE.js} +2 -2
- package/dist/elements/chunks/{video-B7vmenoC.js → video-CK4R7Rus.js} +1 -1
- package/dist/elements/chunks/x-D1qx0aLd.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-list.js +1 -1
- package/dist/elements/default-input.d.ts +7 -7
- package/dist/elements/define.d.ts +1 -0
- package/dist/elements/dialog.js +1 -1
- package/dist/elements/disclosure.d.ts +1 -1
- package/dist/elements/editable-label.js +1 -1
- package/dist/elements/element-data-types.d.ts +107 -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 +8 -6
- package/dist/elements/remote.js +1 -1
- package/dist/elements/resizable.js +1 -1
- package/dist/elements/response-stream.js +2 -2
- 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 +16 -0
- 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/validate-messages.d.ts +25 -0
- package/dist/elements/voice-input.js +1 -1
- package/dist/elements/voice-output.js +1 -1
- package/dist/elements.d.ts +2725 -214
- package/dist/index.d.ts +163 -125
- package/dist/index.js +6336 -5802
- package/dist/index.server.d.ts +5 -0
- package/dist/index.server.js +5446 -4937
- package/dist/kai-provider.es.d.ts +5 -0
- package/dist/kai-provider.es.js +79 -77
- package/dist/kai.es.d.ts +5 -0
- package/dist/kai.es.js +1 -1
- package/dist/llms/llms-full.txt +762 -148
- package/dist/llms/llms.txt +57 -5
- package/dist/mcp.es.js +4010 -770
- package/dist/primitives/card-component-types.d.ts +11 -0
- package/dist/primitives/card-data-types.d.ts +196 -0
- package/dist/primitives/card-host.d.ts +1 -1
- package/dist/primitives/card-recovery.d.ts +3 -3
- package/dist/primitives/card-registry.d.ts +4 -14
- package/dist/primitives/card-resolution.d.ts +1 -1
- package/dist/primitives/card-routing.d.ts +1 -1
- package/dist/primitives/card-tags.d.ts +11 -0
- package/dist/primitives/card-validate-cards.d.ts +57 -0
- package/dist/primitives/card-validate-generator.testlib.d.ts +20 -0
- package/dist/primitives/card-validate-schemas.d.ts +17 -0
- package/dist/primitives/card-validate.d.ts +24 -0
- package/dist/primitives/create-kai-chat.d.ts +3 -3
- package/dist/primitives/embed-providers.d.ts +1 -1
- package/dist/primitives/link-preview.d.ts +1 -1
- package/dist/primitives/message-feedback.d.ts +2 -2
- package/dist/primitives/toast-store.d.ts +1 -1
- package/dist/react/index.d.ts +717 -299
- package/dist/react/use-kai-chat.d.ts +8 -4
- package/dist/react.d.ts +5 -0
- package/dist/react.js +417 -316
- package/dist/register-impl-bzrZ44ft.js +145 -0
- package/dist/remote/host-embed.d.ts +1 -1
- package/dist/remote/index.d.ts +2 -2
- package/dist/remote/provider-runtime.d.ts +2 -2
- package/dist/remote/provider.d.ts +2 -2
- package/dist/remote/validate.d.ts +1 -1
- package/dist/remote/wire.d.ts +1 -1
- package/dist/schemas/artifact.schema.json +92 -0
- package/dist/schemas/embed.schema.json +0 -2
- package/dist/schemas/from-tool-call.d.ts +48 -0
- package/dist/schemas/index.d.ts +48 -0
- package/dist/schemas/link.schema.json +0 -2
- package/dist/schemas/provider-subsets.d.ts +136 -0
- package/dist/schemas/registry.d.ts +140 -0
- package/dist/schemas/tool-defs.d.ts +121 -0
- package/dist/schemas.d.ts +5 -0
- package/dist/schemas.js +717 -0
- package/dist/solid-BCJUQqwS.js +22750 -0
- package/dist/solid-BdENBcEq.js +20108 -0
- package/dist/solid.d.ts +66 -0
- package/dist/solid.js +261 -0
- package/dist/solid.server.d.ts +5 -0
- package/dist/solid.server.js +261 -0
- package/dist/state/index.d.ts +14 -4
- package/dist/state/messages.d.ts +8 -3
- package/dist/state/mock.d.ts +46 -0
- package/dist/state/parts.d.ts +85 -0
- package/dist/state/stream.d.ts +15 -9
- package/dist/state.d.ts +5 -0
- package/dist/state.js +253 -84
- package/dist/ui/action-icons.d.ts +1 -1
- package/dist/ui/collapsible.d.ts +11 -6
- package/dist/ui/dropdown.d.ts +47 -42
- package/dist/ui/pane-group.d.ts +1 -1
- package/dist/variant-aurora-1wMcXRUS.js +381 -0
- package/dist/variant-aurora-BKHHiOgL.js +391 -0
- package/dist/{variant-aurora-DVtGqVH6.js → variant-aurora-DOb_o4pC.js} +1 -1
- package/dist/{variant-custom-Dif-IV4u.js → variant-custom-CJGB0Kbw.js} +1 -1
- package/dist/variant-custom-Co0CkXJF.js +200 -0
- package/dist/variant-custom-DWSSgmd2.js +170 -0
- package/dist/variant-wave-C3-45cL6.js +218 -0
- package/dist/{variant-wave-DbfNdvSi.js → variant-wave-CEODq-9q.js} +1 -1
- package/dist/variant-wave-jdXBnCUZ.js +208 -0
- package/dist/wire/chunk.d.ts +171 -0
- package/dist/wire/consume.d.ts +26 -0
- package/dist/wire/encode.d.ts +148 -0
- package/dist/wire/formats/anthropic.d.ts +2 -0
- package/dist/wire/formats/openai.d.ts +5 -0
- package/dist/wire/index.d.ts +14 -0
- package/dist/wire/read.d.ts +26 -0
- package/dist/wire/sink-helpers.d.ts +21 -0
- package/dist/wire/sse.d.ts +33 -0
- package/dist/wire.d.ts +5 -53
- package/dist/wire.js +898 -0
- package/frameworks/react/index.tsx +183 -154
- package/frameworks/react/runtime.tsx +21 -1
- package/frameworks/react/use-kai-chat.tsx +11 -1
- package/llms-full.txt +762 -148
- package/llms.txt +57 -5
- package/package.json +61 -8
- package/src/agent-tooling/archetypes.ts +96 -0
- package/src/agent-tooling/integrations/anthropic.ts +412 -0
- package/src/agent-tooling/integrations/cloudflare.ts +136 -52
- package/src/agent-tooling/integrations/langgraph.ts +67 -13
- package/src/agent-tooling/integrations/mastra.ts +120 -12
- package/src/agent-tooling/integrations/mock.ts +43 -8
- package/src/agent-tooling/integrations/ollama.ts +61 -24
- package/src/agent-tooling/integrations/openai.ts +87 -0
- package/src/agent-tooling/integrations/openrouter.ts +56 -8
- package/src/agent-tooling/integrations/pi.ts +79 -23
- package/src/agent-tooling/integrations/pydantic-ai.ts +24 -2
- package/src/agent-tooling/integrations/vercel-ai-sdk.ts +84 -13
- package/src/agent-tooling/mcp/manifest.ts +206 -25
- package/src/agent-tooling/mcp/tools/debug.ts +13 -7
- package/src/agent-tooling/mcp/tools/reference.ts +285 -6
- package/src/agent-tooling/mcp/tools/scaffold.ts +3345 -675
- package/src/agent-tooling/registry.ts +17 -0
- package/src/agent-tooling/types.ts +229 -1
- package/src/components/artifact-card.tsx +120 -0
- package/src/components/audio-visualizer/index.tsx +9 -0
- package/src/components/audio-visualizer/labs/lab-choreography.ts +187 -0
- package/src/components/audio-visualizer/labs/lab-shaders.ts +363 -0
- package/src/components/audio-visualizer/labs/lab-visualizer.tsx +102 -0
- package/src/components/audio-visualizer/shader-canvas.tsx +31 -1
- package/src/components/card-fallback.tsx +42 -10
- package/src/components/card-renderer.tsx +146 -9
- package/src/components/chat-container.tsx +4 -0
- package/src/components/chat-thread.tsx +118 -51
- package/src/components/choice-card.tsx +17 -29
- package/src/components/composer.tsx +12 -2
- package/src/components/confirm-card.tsx +24 -20
- package/src/components/context.tsx +12 -4
- package/src/components/conversation-list.tsx +18 -2
- package/src/components/file-tree.tsx +11 -22
- package/src/components/file-upload.tsx +14 -8
- package/src/components/form.tsx +14 -47
- package/src/components/loader.tsx +39 -12
- package/src/components/message-skills.tsx +4 -0
- package/src/components/message.tsx +294 -46
- package/src/components/reasoning.tsx +92 -5
- package/src/components/response-compare-types.ts +25 -0
- package/src/components/response-compare.tsx +4 -9
- package/src/components/source.tsx +50 -24
- package/src/components/tasks-card.tsx +10 -33
- package/src/components/thread.tsx +84 -42
- package/src/components/toast.tsx +11 -5
- package/src/components/tool-classify.ts +26 -0
- package/src/components/tool-types.ts +31 -1
- package/src/elements/agent-card.tsx +11 -11
- package/src/elements/artifact.tsx +15 -7
- package/src/elements/attachments.tsx +6 -4
- package/src/elements/avatar.tsx +1 -1
- package/src/elements/button.tsx +3 -3
- package/src/elements/card.tsx +2 -2
- package/src/elements/cards.tsx +109 -14
- package/src/elements/chain-of-thought.tsx +14 -10
- package/src/elements/chat-scope-picker.tsx +9 -7
- package/src/elements/chat-types.ts +59 -6
- package/src/elements/chat-workspace.tsx +50 -9
- package/src/elements/chat.tsx +64 -3
- package/src/elements/choice.tsx +8 -8
- package/src/elements/coachmark.tsx +1 -1
- package/src/elements/command.tsx +8 -23
- package/src/elements/compare.tsx +7 -6
- package/src/elements/compiled.css +1 -1
- package/src/elements/composer.tsx +8 -8
- package/src/elements/confirm-card.tsx +9 -9
- package/src/elements/context-meter.tsx +4 -18
- package/src/elements/conversation-list.tsx +14 -9
- package/src/elements/default-input.tsx +3 -3
- package/src/elements/define.tsx +178 -43
- package/src/elements/editable-label.tsx +17 -2
- package/src/elements/element-data-types.ts +112 -0
- package/src/elements/element-meta.json +1596 -304
- package/src/elements/element-types.d.ts +2636 -211
- package/src/elements/feedback-bar.tsx +1 -1
- package/src/elements/file-tree.tsx +1 -1
- package/src/elements/file-upload.tsx +1 -1
- package/src/elements/form.tsx +14 -6
- package/src/elements/input.tsx +1 -1
- package/src/elements/kbd.tsx +1 -1
- package/src/elements/menu.tsx +10 -29
- package/src/elements/message-skills.tsx +7 -9
- package/src/elements/message.tsx +200 -32
- package/src/elements/model-switcher.tsx +5 -3
- package/src/elements/pane.tsx +1 -1
- package/src/elements/prompt-dock.tsx +8 -8
- package/src/elements/prompt-input.tsx +10 -10
- package/src/elements/prompt-suggestions.tsx +7 -4
- package/src/elements/reasoning.tsx +1 -1
- package/src/elements/register.ts +9 -0
- package/src/elements/resizable.globals.d.ts +36 -0
- package/src/elements/resizable.tsx +24 -13
- package/src/elements/response-stream.tsx +1 -1
- package/src/elements/scroll-button.tsx +1 -1
- package/src/elements/search.tsx +6 -1
- package/src/elements/segmented.tsx +5 -11
- package/src/elements/separator.tsx +1 -1
- package/src/elements/slots.ts +57 -24
- package/src/elements/source.tsx +21 -22
- package/src/elements/switch.tsx +3 -3
- package/src/elements/tasks.tsx +5 -4
- package/src/elements/thread.tsx +36 -4
- package/src/elements/toast.tsx +3 -2
- package/src/elements/tool.tsx +1 -1
- package/src/elements/validate-messages.ts +76 -0
- package/src/elements/voice-input.tsx +7 -7
- package/src/elements/voice-output.tsx +4 -4
- package/src/index.ts +141 -6
- package/src/primitives/card-component-types.ts +63 -0
- package/src/primitives/card-data-types.ts +312 -0
- package/src/primitives/card-recovery.ts +13 -2
- package/src/primitives/card-registry.tsx +34 -23
- package/src/primitives/card-schemas/artifact.schema.json +92 -0
- package/src/primitives/card-schemas/embed.schema.json +0 -2
- package/src/primitives/card-schemas/link.schema.json +0 -2
- package/src/primitives/card-tags.ts +61 -0
- package/src/primitives/card-validate-cards.ts +255 -0
- package/src/primitives/card-validate-generator.testlib.ts +38 -0
- package/src/primitives/card-validate-schemas.ts +58 -0
- package/src/primitives/card-validate.ts +48 -20
- package/src/primitives/create-tween.ts +54 -2
- package/src/primitives/message-feedback.ts +3 -2
- package/src/primitives/use-audio-analysis.ts +20 -1
- package/src/primitives/use-sequencer.ts +20 -1
- package/src/schemas/from-tool-call.ts +151 -0
- package/src/schemas/index.ts +340 -0
- package/src/schemas/provider-subsets.ts +538 -0
- package/src/schemas/registry.ts +355 -0
- package/src/schemas/tool-defs.ts +492 -0
- package/src/solid.ts +150 -0
- package/src/state/index.ts +27 -1
- package/src/state/messages.ts +21 -4
- package/src/state/mock.ts +211 -0
- package/src/state/parts.ts +295 -0
- package/src/state/stream.ts +56 -58
- package/src/ui/collapsible.tsx +17 -5
- package/src/ui/dropdown.tsx +46 -12
- package/src/ui/overlay.tsx +10 -4
- package/src/wire/chunk.ts +201 -0
- package/src/wire/consume.ts +440 -0
- package/src/wire/encode.ts +474 -0
- package/src/wire/formats/anthropic.ts +267 -0
- package/src/wire/formats/openai.ts +187 -0
- package/src/wire/index.ts +52 -0
- package/src/wire/read.ts +152 -0
- package/src/wire/sink-helpers.ts +50 -0
- package/src/wire/sse.ts +140 -0
- package/dist/create-tween-hvpmSuwW.js +0 -7
- package/dist/elements/chunks/arrow-left-DQocUFvy.js +0 -1
- package/dist/elements/chunks/audio-visualizer-BqNy7dfm.js +0 -1
- package/dist/elements/chunks/card-BkHbp4BA.js +0 -1
- package/dist/elements/chunks/chat-thread-CkRN6pZ7.js +0 -1
- package/dist/elements/chunks/check-B9-gn6SS.js +0 -1
- package/dist/elements/chunks/chevron-down-BNsxc2hk.js +0 -1
- package/dist/elements/chunks/chevron-right-Hv00StBO.js +0 -1
- package/dist/elements/chunks/circle-0e3KJTDr.js +0 -1
- package/dist/elements/chunks/circle-check-BNAS0JEy.js +0 -1
- package/dist/elements/chunks/code-block-BFUHn6Va.js +0 -1
- package/dist/elements/chunks/context-Cb7k4F-v.js +0 -1
- package/dist/elements/chunks/conversation-list-CvoAkWhN.js +0 -1
- package/dist/elements/chunks/create-tween-oVvAIG8r.js +0 -7
- package/dist/elements/chunks/define-D1din7Ld.js +0 -1
- package/dist/elements/chunks/hover-card-Cmm6Q53m.js +0 -1
- package/dist/elements/chunks/message-BqyXDN3-.js +0 -1
- package/dist/elements/chunks/message-feedback-Djr3z6Yb.js +0 -1
- package/dist/elements/chunks/message-square-vFAgbDaX.js +0 -1
- package/dist/elements/chunks/reasoning-DTpCGtnY.js +0 -1
- package/dist/elements/chunks/scroll-button-B0cH5fXf.js +0 -1
- package/dist/elements/chunks/skeleton-DSXW5Yya.js +0 -1
- package/dist/elements/chunks/slots--V19HwUb.js +0 -1
- package/dist/elements/chunks/textarea-CUwqAX0G.js +0 -1
- package/dist/elements/chunks/tooltip-CgBZCVKp.js +0 -1
- package/dist/elements/chunks/use-card-resolution-BSu_XHjH.js +0 -1
- package/dist/elements/chunks/x-GRUeeQFT.js +0 -1
- package/dist/host-embed.d.ts +0 -33
- package/dist/kai-provider.d.ts +0 -2
- package/dist/origin.d.ts +0 -5
- package/dist/provider-runtime.d.ts +0 -27
- package/dist/register-impl-DQyejdfb.js +0 -145
- package/dist/validate.d.ts +0 -4
- package/dist/version.d.ts +0 -4
- package/src/components/component-meta.json +0 -4550
- package/src/elements/card-media.jpg +0 -0
- package/src/elements/resizable.d.ts +0 -27
- package/src/elements/video-poster.jpg +0 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { RawOrigin, ToolPart } from '../components/tool-types.js';
|
|
2
|
+
import { MessagePart, MessageSource } from '../elements/chat-types.js';
|
|
3
|
+
import { ReasoningOpts } from '../state/parts.js';
|
|
4
|
+
/** One fragment of a tool call. */
|
|
5
|
+
export interface ModelToolCallDelta {
|
|
6
|
+
/**
|
|
7
|
+
* The ONLY thing correlating fragments, and its NAMESPACE IS FORMAT-DEFINED.
|
|
8
|
+
* `openaiChatFormat` uses the position in `delta.tool_calls`;
|
|
9
|
+
* `anthropicMessagesFormat` uses the content-block index. Both are correct and
|
|
10
|
+
* both are stable within one stream, but they are not the same number, so a
|
|
11
|
+
* third-party format must pick one and stay consistent with itself.
|
|
12
|
+
*/
|
|
13
|
+
index: number;
|
|
14
|
+
id?: string;
|
|
15
|
+
/** Usually whole on the first fragment; a few providers split it. */
|
|
16
|
+
name?: string;
|
|
17
|
+
/** A FRAGMENT of the JSON arguments string, not valid JSON on its own. */
|
|
18
|
+
arguments?: string;
|
|
19
|
+
/** A result the PROVIDER executed (Anthropic web_search_tool_result, an OpenAI
|
|
20
|
+
* built-in). Completes the panel with no host work. */
|
|
21
|
+
output?: Record<string, unknown>;
|
|
22
|
+
/** A provider-executed tool that failed. */
|
|
23
|
+
outputError?: string;
|
|
24
|
+
}
|
|
25
|
+
/** Field names are deliberately provider-neutral. OpenAI says prompt/completion,
|
|
26
|
+
* Anthropic says input/output; input/output is the one that reads correctly for
|
|
27
|
+
* both. */
|
|
28
|
+
export interface ModelUsage {
|
|
29
|
+
inputTokens?: number;
|
|
30
|
+
outputTokens?: number;
|
|
31
|
+
totalTokens?: number;
|
|
32
|
+
/** Non-zero proves the model reasoned even when no reasoning text streamed. */
|
|
33
|
+
reasoningTokens?: number;
|
|
34
|
+
cachedInputTokens?: number;
|
|
35
|
+
costUsd?: number;
|
|
36
|
+
}
|
|
37
|
+
export interface ModelStreamChunk {
|
|
38
|
+
text?: string;
|
|
39
|
+
/**
|
|
40
|
+
* Reasoning delta. `''` is MEANINGFUL, not a no-op: a redacted block has no
|
|
41
|
+
* readable text but still carries a payload that must round-trip, and a format
|
|
42
|
+
* uses an empty delta to OPEN a reasoning part at the right position in the
|
|
43
|
+
* stream so block order survives into `parts`.
|
|
44
|
+
*/
|
|
45
|
+
reasoning?: string;
|
|
46
|
+
/** The provider's BLOCK index. Keeps parallel reasoning blocks distinct.
|
|
47
|
+
* Omitted means block 0, the single-block case every provider degrades to. */
|
|
48
|
+
reasoningIndex?: number;
|
|
49
|
+
/**
|
|
50
|
+
* The UNTRANSLATED provider payload for this reasoning block. Valid on a chunk
|
|
51
|
+
* with NO reasoning text at all, which is the whole point: Anthropic returns
|
|
52
|
+
* 400 if a `thinking` block is modified, reordered or RECONSTRUCTED, so an
|
|
53
|
+
* encoder has to echo the original block rather than rebuild one from `text`
|
|
54
|
+
* plus `signature`.
|
|
55
|
+
*/
|
|
56
|
+
reasoningRaw?: RawOrigin;
|
|
57
|
+
/** Informational. `reasoningRaw` is the round-trip channel, not this. */
|
|
58
|
+
reasoningSignature?: string;
|
|
59
|
+
toolCalls?: ModelToolCallDelta[];
|
|
60
|
+
/** Citations the model produced. A run of consecutive `source` parts renders
|
|
61
|
+
* as one citation row (`part="citations"`), outside the message bubble. */
|
|
62
|
+
sources?: MessageSource[];
|
|
63
|
+
/** Provider VERBATIM: 'stop' | 'tool_calls' | 'end_turn' | 'max_tokens' | ...
|
|
64
|
+
* Normalizing in place would destroy information consumers branch on. */
|
|
65
|
+
finishReason?: string | null;
|
|
66
|
+
usage?: ModelUsage;
|
|
67
|
+
/** An in-band provider error (the HTTP response was already 200). */
|
|
68
|
+
error?: {
|
|
69
|
+
code?: string | number;
|
|
70
|
+
message: string;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/** One vocabulary across formats, for code that has to BRANCH. `finishReason`
|
|
74
|
+
* stays beside it, verbatim, for code that has to REPORT. */
|
|
75
|
+
export type StopReason = 'stop' | 'length' | 'tool-calls' | 'content-filter' | 'error' | 'other';
|
|
76
|
+
/** Unknown reasons degrade to 'other' rather than throwing: providers add stop
|
|
77
|
+
* reasons without warning and a new one must not take a turn down. */
|
|
78
|
+
export declare function normalizeStopReason(finishReason: string | null | undefined): StopReason | undefined;
|
|
79
|
+
/**
|
|
80
|
+
* The subset of the kit's `AssistantStream` the adapter drives. Declared
|
|
81
|
+
* STRUCTURALLY so the adapter has no runtime dependency on a stream
|
|
82
|
+
* implementation and can be tested against a recorder. The kit's real
|
|
83
|
+
* `AssistantStream` satisfies it as-is: same method names, same arities, and its
|
|
84
|
+
* `AssistantStream` returns are assignable to `unknown`.
|
|
85
|
+
*
|
|
86
|
+
* `addSource` is optional so a hand-rolled three-method sink still compiles.
|
|
87
|
+
*/
|
|
88
|
+
export interface AssistantStreamSink {
|
|
89
|
+
appendText(delta: string): unknown;
|
|
90
|
+
appendReasoning(delta: string, opts?: ReasoningOpts): unknown;
|
|
91
|
+
/** Create-or-merge. There is no separate "announce" call: handing a patch for
|
|
92
|
+
* an unknown `toolCallId` creates the ToolPart, and every later patch merges. */
|
|
93
|
+
upsertTool(toolCallId: string, patch: Partial<ToolPart>): unknown;
|
|
94
|
+
addSource?(source: MessageSource): unknown;
|
|
95
|
+
}
|
|
96
|
+
/** One tool call reassembled out of the stream's fragments. */
|
|
97
|
+
export interface ModelToolCall {
|
|
98
|
+
/** The delta index that correlated this call's fragments. */
|
|
99
|
+
index: number;
|
|
100
|
+
/** Provider call id (synthesised as `call_<index>` if the provider omits it). */
|
|
101
|
+
id: string;
|
|
102
|
+
name: string;
|
|
103
|
+
/** The RAW accumulated argument fragments. Echo THIS back on the next turn,
|
|
104
|
+
* not a re-stringified parse. */
|
|
105
|
+
argumentsText: string;
|
|
106
|
+
/** Parsed arguments: present only when `argumentsText` was a valid JSON object. */
|
|
107
|
+
input?: Record<string, unknown>;
|
|
108
|
+
/** Present only for a call the PROVIDER executed. */
|
|
109
|
+
output?: Record<string, unknown>;
|
|
110
|
+
/** True when the provider ran the tool and returned its result in-stream. The
|
|
111
|
+
* host must NOT execute these. */
|
|
112
|
+
providerExecuted?: boolean;
|
|
113
|
+
/** Why this call is unusable (malformed or truncated args, missing name). */
|
|
114
|
+
error?: string;
|
|
115
|
+
}
|
|
116
|
+
/** Everything one assistant turn produced. */
|
|
117
|
+
export interface ModelTurn {
|
|
118
|
+
/** The turn as ORDERED MESSAGE PARTS, built with the kit's own part builders,
|
|
119
|
+
* so it is exactly what the sink was driven with. Covers this turn only. */
|
|
120
|
+
parts: MessagePart[];
|
|
121
|
+
/** Flat concatenation of the text deltas. The provider wire format is a flat
|
|
122
|
+
* string, so this is kept for encoders. Not the content model. */
|
|
123
|
+
text: string;
|
|
124
|
+
/** Flat concatenation of the reasoning deltas, for the same reason. */
|
|
125
|
+
reasoning: string;
|
|
126
|
+
toolCalls: ModelToolCall[];
|
|
127
|
+
sources: MessageSource[];
|
|
128
|
+
/** The provider's own word for why it stopped. Never normalized. */
|
|
129
|
+
finishReason: string | null;
|
|
130
|
+
/** The same fact in one vocabulary. Branch on this. */
|
|
131
|
+
stopReason?: StopReason;
|
|
132
|
+
error?: {
|
|
133
|
+
code?: string | number;
|
|
134
|
+
message: string;
|
|
135
|
+
};
|
|
136
|
+
usage?: ModelUsage;
|
|
137
|
+
/** How many chunks carried a NON-EMPTY reasoning delta. Zero with a non-zero
|
|
138
|
+
* `usage.reasoningTokens` means the provider hid the thinking text. */
|
|
139
|
+
reasoningChunks: number;
|
|
140
|
+
chunks: number;
|
|
141
|
+
}
|
|
142
|
+
export interface ConsumeOptions {
|
|
143
|
+
/** Label for the reasoning disclosure. Defaults to 'Thinking'. */
|
|
144
|
+
reasoningLabel?: string;
|
|
145
|
+
/** Fires once per tool call the moment its arguments parse cleanly. This is
|
|
146
|
+
* the hook a host's tool loop waits on. There is deliberately no
|
|
147
|
+
* per-fragment callback: `ToolPart.rawInput` is written on every fragment,
|
|
148
|
+
* so the streaming text is already on the part. */
|
|
149
|
+
onToolCallReady?: (call: ModelToolCall) => void;
|
|
150
|
+
}
|
|
151
|
+
/** Per-stream state for one format. */
|
|
152
|
+
export interface WireFormatReader {
|
|
153
|
+
/**
|
|
154
|
+
* Map one decoded frame onto zero or more neutral chunks. Returns an ARRAY
|
|
155
|
+
* because the mapping is not one-to-one: an Anthropic `message_start` yields
|
|
156
|
+
* usage, a `content_block_start` for `tool_use` yields an id-plus-name delta,
|
|
157
|
+
* a `ping` yields nothing.
|
|
158
|
+
*
|
|
159
|
+
* MUST NOT throw on an unrecognized frame. Return `[]` instead: providers add
|
|
160
|
+
* event types without warning.
|
|
161
|
+
*/
|
|
162
|
+
push(frame: unknown): ModelStreamChunk[];
|
|
163
|
+
}
|
|
164
|
+
/** A pluggable wire format. Values, not a flag, so a third party can add one
|
|
165
|
+
* without a PR to this repo. */
|
|
166
|
+
export interface WireFormat {
|
|
167
|
+
readonly id: string;
|
|
168
|
+
/** Called once per stream so a format can hold per-stream state. Two calls
|
|
169
|
+
* must share NOTHING. */
|
|
170
|
+
open(): WireFormatReader;
|
|
171
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { AssistantStreamSink, ConsumeOptions, ModelStreamChunk, ModelToolCall, ModelToolCallDelta, ModelTurn, StopReason } from './chunk.js';
|
|
2
|
+
/**
|
|
3
|
+
* Correlate tool-call fragments by `index` and drive the ToolPart lifecycle.
|
|
4
|
+
* THE HARD PART: `id`, `name` and each slice of `arguments` arrive across
|
|
5
|
+
* arbitrarily many chunks in provider-dependent order.
|
|
6
|
+
*
|
|
7
|
+
* A ToolPart is pushed (`input-streaming`) the first time a call has BOTH an id
|
|
8
|
+
* and a non-empty name: announcing earlier would create a panel whose `type` is
|
|
9
|
+
* the empty string. Everything before that is buffered and flushed at announce.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createToolCallAccumulator(sink: AssistantStreamSink, opts?: ConsumeOptions): {
|
|
12
|
+
apply: (raw: ModelToolCallDelta) => void;
|
|
13
|
+
settle: (stopReason: StopReason | undefined, streamError?: string) => ModelToolCall[];
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Read one turn's worth of `ModelStreamChunk`s and drive `sink` with them.
|
|
17
|
+
*
|
|
18
|
+
* The sink is expected to be the kit's `AssistantStream`, which produces a NEW
|
|
19
|
+
* message object (and a new `parts` array) on every real mutation: that is what
|
|
20
|
+
* makes `<kai-thread>` re-render. This adapter calls the sink once per delta and
|
|
21
|
+
* never batches; batching is a host concern.
|
|
22
|
+
*
|
|
23
|
+
* This is also the escape hatch for a consumer who already has neutral chunks
|
|
24
|
+
* from somewhere else and does not need a WireFormat at all.
|
|
25
|
+
*/
|
|
26
|
+
export declare function consumeModelStream(chunks: AsyncIterable<ModelStreamChunk>, sink: AssistantStreamSink, opts?: ConsumeOptions): Promise<ModelTurn>;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { ChatMessage } from '../elements/chat-types.js';
|
|
2
|
+
export interface OpenAIToolCall {
|
|
3
|
+
id: string;
|
|
4
|
+
type: 'function';
|
|
5
|
+
function: {
|
|
6
|
+
name: string;
|
|
7
|
+
arguments: string;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
/** One `reasoning_details` entry. Provider-owned open shape, kept as a record
|
|
11
|
+
* for the same reason `AnthropicContentBlock` is: an opaque entry has to pass
|
|
12
|
+
* through UNTOUCHED, and a closed type would be a list of the fields we happen
|
|
13
|
+
* to have seen. */
|
|
14
|
+
export type OpenAIReasoningDetail = Record<string, unknown>;
|
|
15
|
+
export interface OpenAIWireMessage {
|
|
16
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
17
|
+
content: string | null;
|
|
18
|
+
tool_calls?: OpenAIToolCall[];
|
|
19
|
+
tool_call_id?: string;
|
|
20
|
+
name?: string;
|
|
21
|
+
/** Only ever present when `toOpenAIMessages` was asked for it. See
|
|
22
|
+
* `OpenAIEncodeOptions.reasoning`. */
|
|
23
|
+
reasoning_details?: OpenAIReasoningDetail[];
|
|
24
|
+
}
|
|
25
|
+
export interface OpenAIEncodeOptions {
|
|
26
|
+
/**
|
|
27
|
+
* Whether to send the assistant's own reasoning back with the thread.
|
|
28
|
+
*
|
|
29
|
+
* DEFAULT `'omit'`, and that default is a measurement, not caution. Omitting
|
|
30
|
+
* reasoning is accepted by every configuration tested -- five live omission
|
|
31
|
+
* trials plus 28 recorded live requests per configuration across the spike's
|
|
32
|
+
* conformance sweep, zero 400s -- so the path that ships today demonstrably
|
|
33
|
+
* works, while including reasoning cost about 25% more prompt tokens per round
|
|
34
|
+
* when measured (665 -> 834 on a two-round loop). A library does not get to
|
|
35
|
+
* raise every consumer's bill and add a new provider-validation surface as a
|
|
36
|
+
* side effect of a bug fix.
|
|
37
|
+
*
|
|
38
|
+
* `'include'` is for a multi-round TOOL loop, which is where OpenRouter says it
|
|
39
|
+
* pays: "when you post tool results, including the original reasoning ensures
|
|
40
|
+
* the model can continue its reasoning from where it left off". Measured
|
|
41
|
+
* accepted (HTTP 200) for a signed Anthropic block and for an OpenAI encrypted
|
|
42
|
+
* block, over the OpenAI-compatible wire.
|
|
43
|
+
*
|
|
44
|
+
* The Anthropic wire has no such knob because it has no such choice: a filtered
|
|
45
|
+
* or rebuilt thinking block there is a hard 400.
|
|
46
|
+
*/
|
|
47
|
+
reasoning?: 'omit' | 'include';
|
|
48
|
+
}
|
|
49
|
+
/** Anthropic content blocks are an open, provider-owned union. Keeping them as
|
|
50
|
+
* records is what lets a verbatim `thinking` payload pass through UNTOUCHED,
|
|
51
|
+
* which is the entire point of this encoder. */
|
|
52
|
+
export type AnthropicContentBlock = Record<string, unknown>;
|
|
53
|
+
export interface AnthropicWireMessage {
|
|
54
|
+
role: 'user' | 'assistant';
|
|
55
|
+
content: AnthropicContentBlock[];
|
|
56
|
+
}
|
|
57
|
+
/** A message cannot be encoded without losing something the provider will reject.
|
|
58
|
+
* Thrown at encode time, on purpose: a throw here beats a 400 at request time,
|
|
59
|
+
* because here you still know which message and which part caused it. */
|
|
60
|
+
export declare class WireEncodeError extends Error {
|
|
61
|
+
readonly messageId: string;
|
|
62
|
+
readonly partIndex: number;
|
|
63
|
+
constructor(message: string, messageId: string, partIndex: number);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* ChatMessage[] to an OpenAI chat-completions `messages` array.
|
|
67
|
+
*
|
|
68
|
+
* ONE ChatMessage CAN BECOME SEVERAL WIRE MESSAGES. The kit streams a whole
|
|
69
|
+
* assistant turn into a single message, so text, a tool call and the model's
|
|
70
|
+
* answer to that call all live in one `parts` array. The OpenAI wire has no such
|
|
71
|
+
* shape: a `role:'tool'` result must sit between the assistant message that
|
|
72
|
+
* announced the call and whatever the model said afterwards. So the turn is
|
|
73
|
+
* SPLIT at each tool boundary, into
|
|
74
|
+
*
|
|
75
|
+
* assistant(pre-tool text + tool_calls) -> tool(result)... -> assistant(answer)
|
|
76
|
+
*
|
|
77
|
+
* Flattening instead would put the model's answer BEFORE the result it was based
|
|
78
|
+
* on. No endpoint rejects that, which is exactly why it is worth spelling out:
|
|
79
|
+
* it quietly degrades every later round of a tool loop.
|
|
80
|
+
*
|
|
81
|
+
* Consecutive tool parts stay in ONE assistant message, because parallel calls
|
|
82
|
+
* are announced together and their results follow together.
|
|
83
|
+
*
|
|
84
|
+
* A turn that encodes to nothing is SKIPPED, never sent as `{ content: null }`
|
|
85
|
+
* with no `tool_calls`: OpenAI treats `content` as required unless `tool_calls`
|
|
86
|
+
* is present, and strict-compatible endpoints reject it.
|
|
87
|
+
*
|
|
88
|
+
* REASONING IS OPT-IN, and off by default. OpenRouter's OpenAI-compatible
|
|
89
|
+
* endpoint does have a channel on the way back in -- `reasoning_details` on the
|
|
90
|
+
* assistant message -- and `{ reasoning: 'include' }` uses it, one entry per
|
|
91
|
+
* reasoning part, in part order, reassembled by `reasoningDetailOf` rather than
|
|
92
|
+
* echoed out of `part.raw`. Read that function for which blocks make it and why.
|
|
93
|
+
* The default omits, because omitting is measured-accepted everywhere and costs
|
|
94
|
+
* about 25% fewer prompt tokens per round; see `OpenAIEncodeOptions.reasoning`.
|
|
95
|
+
*
|
|
96
|
+
* Reasoning alone still encodes to NOTHING. A block is content the model already
|
|
97
|
+
* produced, not a reason to send a turn, so a message carrying reasoning and no
|
|
98
|
+
* text and no settled tool is skipped exactly as before, rather than becoming
|
|
99
|
+
* `{ content: null }` with no `tool_calls`.
|
|
100
|
+
*
|
|
101
|
+
* `card`, `source` and `file` parts are never encoded; they are kit-side. File
|
|
102
|
+
* attachments are a documented v1 limitation, which is why a user turn carrying
|
|
103
|
+
* only an attachment encodes to nothing and is skipped.
|
|
104
|
+
*/
|
|
105
|
+
export declare function toOpenAIMessages(messages: ChatMessage[], options?: OpenAIEncodeOptions): OpenAIWireMessage[];
|
|
106
|
+
/**
|
|
107
|
+
* ChatMessage[] to an Anthropic Messages `messages` array. THE ROUND-TRIP
|
|
108
|
+
* ENCODER.
|
|
109
|
+
*
|
|
110
|
+
* A reasoning block is emitted as `part.raw.payload` verbatim and is NEVER
|
|
111
|
+
* rebuilt from `text` plus `signature`: Anthropic returns 400 if a thinking
|
|
112
|
+
* block in the most recent assistant message is modified, reordered, filtered or
|
|
113
|
+
* reconstructed. A reasoning part with no `raw`, or with a `raw` captured from
|
|
114
|
+
* some other format, therefore THROWS rather than silently producing a request
|
|
115
|
+
* that will fail.
|
|
116
|
+
*
|
|
117
|
+
* Block order follows part order, which follows stream order, with no filtering,
|
|
118
|
+
* because the API validates order too. An empty-text reasoning part (an omitted
|
|
119
|
+
* or redacted block) is still emitted: the docs require sending back every block
|
|
120
|
+
* "including any blocks with empty thinking fields".
|
|
121
|
+
*
|
|
122
|
+
* ONE ChatMessage CAN BECOME SEVERAL WIRE MESSAGES, for the same reason as
|
|
123
|
+
* `toOpenAIMessages`: the kit streams a whole assistant turn into one message, so
|
|
124
|
+
* the tool call and the model's answer to it share a `parts` array, but Anthropic
|
|
125
|
+
* carries the result in a SEPARATE user message that has to sit between them. So
|
|
126
|
+
* the turn is SPLIT at each tool boundary, into
|
|
127
|
+
*
|
|
128
|
+
* assistant(pre-tool blocks + tool_use) -> user(tool_result)... -> assistant(answer)
|
|
129
|
+
*
|
|
130
|
+
* Flattening instead puts the model's answer BEFORE the result it was based on,
|
|
131
|
+
* and strands every later round's thinking block in the first assistant message.
|
|
132
|
+
* Consecutive tool parts stay in ONE assistant message, because parallel calls are
|
|
133
|
+
* announced together and their results come back together.
|
|
134
|
+
*
|
|
135
|
+
* Adjacent user messages are MERGED. The API combines consecutive same-role turns
|
|
136
|
+
* itself rather than rejecting them, so this is not what stands between you and a
|
|
137
|
+
* 400; it is emitted anyway because the tool-result turn and a following user turn
|
|
138
|
+
* are one turn, several OpenAI-compatible Anthropic proxies do enforce strict
|
|
139
|
+
* alternation, and the merged form is what the models are trained on. Ordering is
|
|
140
|
+
* safe by construction: `results` is only non-empty when `blocks` is, so a
|
|
141
|
+
* tool_result message always follows its assistant message and can never be
|
|
142
|
+
* appended after a plain user turn.
|
|
143
|
+
*
|
|
144
|
+
* Asymmetry worth knowing: `tool_use.input` is a parsed OBJECT on this wire, not
|
|
145
|
+
* a string, so it uses `input` and not `rawInput`. Only thinking blocks carry a
|
|
146
|
+
* verbatim requirement.
|
|
147
|
+
*/
|
|
148
|
+
export declare function toAnthropicMessages(messages: ChatMessage[]): AnthropicWireMessage[];
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { WireFormat } from '../chunk.js';
|
|
2
|
+
/** Stateless: every frame is self-describing, so `open()` returns a reader with
|
|
3
|
+
* no closure state. The interface still calls it per stream, which is what lets
|
|
4
|
+
* the stateful Anthropic format use the same seam. */
|
|
5
|
+
export declare const openaiChatFormat: WireFormat;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { readModelStream, readOpenAIStream, readAnthropicStream, WireError } from './read.js';
|
|
2
|
+
export type { StreamSource, ReadOptions } from './read.js';
|
|
3
|
+
export { consumeModelStream, createToolCallAccumulator } from './consume.js';
|
|
4
|
+
export { applyToolOutput, applyToolFailure, bufferText } from './sink-helpers.js';
|
|
5
|
+
export { toOpenAIMessages, toAnthropicMessages, WireEncodeError } from './encode.js';
|
|
6
|
+
export type { AnthropicContentBlock, AnthropicWireMessage, OpenAIEncodeOptions, OpenAIReasoningDetail, OpenAIToolCall, OpenAIWireMessage, } from './encode.js';
|
|
7
|
+
export { openaiChatFormat } from './formats/openai.js';
|
|
8
|
+
export { anthropicMessagesFormat } from './formats/anthropic.js';
|
|
9
|
+
export { sseDataFrames, sseJson, readableToAsyncIterable } from './sse.js';
|
|
10
|
+
export type { ByteSource } from './sse.js';
|
|
11
|
+
export { normalizeStopReason } from './chunk.js';
|
|
12
|
+
export type { AssistantStreamSink, ConsumeOptions, ModelStreamChunk, ModelToolCall, ModelToolCallDelta, ModelTurn, ModelUsage, StopReason, WireFormat, WireFormatReader, } from './chunk.js';
|
|
13
|
+
export type { ChatMessage, MessagePart, MessageSource, RawOrigin } from '../elements/chat-types.js';
|
|
14
|
+
export type { ToolPart } from '../components/tool-types.js';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { AssistantStreamSink, ConsumeOptions, ModelTurn, WireFormat } from './chunk.js';
|
|
2
|
+
export type StreamSource = Response | ReadableStream<Uint8Array> | AsyncIterable<Uint8Array | string>;
|
|
3
|
+
export interface ReadOptions extends ConsumeOptions {
|
|
4
|
+
format: WireFormat;
|
|
5
|
+
}
|
|
6
|
+
/** A non-ok HTTP response from the model endpoint, with the provider's own error
|
|
7
|
+
* body attached when there is one. Thrown before a single chunk is read, so a
|
|
8
|
+
* caller can distinguish "the request failed" from "the stream carried an
|
|
9
|
+
* error", which is `ModelTurn.error`. */
|
|
10
|
+
export declare class WireError extends Error {
|
|
11
|
+
readonly status: number;
|
|
12
|
+
readonly statusText: string;
|
|
13
|
+
/** The response body parsed as JSON, or undefined when it was not JSON (an
|
|
14
|
+
* HTML error page from a proxy, most often). */
|
|
15
|
+
readonly body: unknown;
|
|
16
|
+
/** The raw response body, always. */
|
|
17
|
+
readonly bodyText: string;
|
|
18
|
+
constructor(status: number, statusText: string, bodyText: string, body: unknown);
|
|
19
|
+
}
|
|
20
|
+
/** Read one turn off the wire in `opts.format` and drive `sink` with it. */
|
|
21
|
+
export declare function readModelStream(source: StreamSource, sink: AssistantStreamSink, opts: ReadOptions): Promise<ModelTurn>;
|
|
22
|
+
/** OpenAI chat-completions SSE. Also what all nine catalog integrations except
|
|
23
|
+
* `mock` re-frame to server-side, so this is the common path. */
|
|
24
|
+
export declare function readOpenAIStream(source: StreamSource, sink: AssistantStreamSink, opts?: ConsumeOptions): Promise<ModelTurn>;
|
|
25
|
+
/** Anthropic Messages SSE. */
|
|
26
|
+
export declare function readAnthropicStream(source: StreamSource, sink: AssistantStreamSink, opts?: ConsumeOptions): Promise<ModelTurn>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { AssistantStreamSink } from './chunk.js';
|
|
2
|
+
/** Mark a tool call's panel done with the result the host computed. */
|
|
3
|
+
export declare function applyToolOutput(sink: AssistantStreamSink, toolCallId: string, output: Record<string, unknown>): void;
|
|
4
|
+
/** Mark a tool call's panel failed. */
|
|
5
|
+
export declare function applyToolFailure(sink: AssistantStreamSink, toolCallId: string, message: string): void;
|
|
6
|
+
/**
|
|
7
|
+
* A sink wrapper that swallows text instead of appending it, and hands the
|
|
8
|
+
* buffered text back at the end.
|
|
9
|
+
*
|
|
10
|
+
* Needed for STRUCTURED OUTPUTS: when `response_format` is a JSON schema the
|
|
11
|
+
* assistant's whole message is raw JSON, so streaming it into `<kai-thread>`
|
|
12
|
+
* shows the user a wall of braces. Buffer, parse, then `appendText` the human
|
|
13
|
+
* part, which behaves as a SET because nothing text-shaped ever reached the
|
|
14
|
+
* message (the kit has no replace-the-text operation; `appendTextPart` only ever
|
|
15
|
+
* extends or opens a text part).
|
|
16
|
+
*
|
|
17
|
+
* Reasoning, tools and sources pass straight through. Only text is held back.
|
|
18
|
+
*/
|
|
19
|
+
export declare function bufferText(sink: AssistantStreamSink): AssistantStreamSink & {
|
|
20
|
+
buffered(): string;
|
|
21
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type ByteSource = AsyncIterable<Uint8Array | string> | ReadableStream<Uint8Array>;
|
|
2
|
+
/** Adapt a WHATWG ReadableStream to an async iterable. Never rely on
|
|
3
|
+
* `for await (... of res.body)`: Safari still lacks async iteration on it.
|
|
4
|
+
*
|
|
5
|
+
* On EARLY EXIT the underlying stream is CANCELLED, not just unlocked.
|
|
6
|
+
* `releaseLock()` alone hands the reader back while the body stays open, which
|
|
7
|
+
* leaks the socket. The adapter stops reading mid-stream on a real and
|
|
8
|
+
* not-rare path (an in-band provider error after a 200), and every consumer
|
|
9
|
+
* `break`/`throw` inside `for await` lands here too, so this is where the
|
|
10
|
+
* connection has to be closed.
|
|
11
|
+
*
|
|
12
|
+
* What must NOT land here is normal completion. `drained` is only honest if
|
|
13
|
+
* every layer above reads to EOF rather than returning on a sentinel — see
|
|
14
|
+
* `sseJson` and `[DONE]`. */
|
|
15
|
+
export declare function readableToAsyncIterable(stream: ReadableStream<Uint8Array>): AsyncGenerator<Uint8Array>;
|
|
16
|
+
/** Yield the payload of each SSE `data:` frame. `[DONE]` is yielded as-is; the
|
|
17
|
+
* caller decides to stop. */
|
|
18
|
+
export declare function sseDataFrames(source: ByteSource): AsyncGenerator<string>;
|
|
19
|
+
/** Decode an SSE byte stream into JSON payloads, stopping at `[DONE]` and
|
|
20
|
+
* skipping frames that are not JSON. A provider that emits a stray non-JSON
|
|
21
|
+
* line should not take the turn down.
|
|
22
|
+
*
|
|
23
|
+
* `[DONE]` stops the YIELDING, not the READING. Returning at the sentinel
|
|
24
|
+
* unwinds the generator chain while the reader has not yet seen `done: true`,
|
|
25
|
+
* so `readableToAsyncIterable` treats normal completion as an early exit and
|
|
26
|
+
* CANCELS the body — and since every OpenAI-format stream ends in `[DONE]`,
|
|
27
|
+
* that aborts the response on the normal path, one `net::ERR_ABORTED` per
|
|
28
|
+
* turn. Reading on to EOF instead lets the producer's own close end the
|
|
29
|
+
* iteration, which is the only thing that makes `drained` mean what it says.
|
|
30
|
+
* In practice that costs exactly one more `read()`: a server that has sent
|
|
31
|
+
* `[DONE]` has finished the response body. Frames after the sentinel are
|
|
32
|
+
* dropped, so what a caller sees is unchanged. */
|
|
33
|
+
export declare function sseJson<T>(source: ByteSource): AsyncGenerator<T>;
|
package/dist/wire.d.ts
CHANGED
|
@@ -1,53 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
version: string;
|
|
7
|
-
/** Per-bridge instance nonce (host-minted, echoed on every up-frame). */
|
|
8
|
-
nonce: string;
|
|
9
|
-
message: M;
|
|
10
|
-
}
|
|
11
|
-
export type DownMessage = {
|
|
12
|
-
dir: 'down';
|
|
13
|
-
kind: 'hello';
|
|
14
|
-
supportedVersions: string[];
|
|
15
|
-
} | {
|
|
16
|
-
dir: 'down';
|
|
17
|
-
kind: 'render';
|
|
18
|
-
envelope: CardEnvelope;
|
|
19
|
-
} | {
|
|
20
|
-
dir: 'down';
|
|
21
|
-
kind: 'context';
|
|
22
|
-
context: CardContext;
|
|
23
|
-
} | {
|
|
24
|
-
dir: 'down';
|
|
25
|
-
kind: 'teardown';
|
|
26
|
-
};
|
|
27
|
-
export type UpMessage = {
|
|
28
|
-
dir: 'up';
|
|
29
|
-
kind: 'ready';
|
|
30
|
-
acceptedVersion: string;
|
|
31
|
-
capabilities?: {
|
|
32
|
-
types?: string[];
|
|
33
|
-
};
|
|
34
|
-
} | {
|
|
35
|
-
dir: 'up';
|
|
36
|
-
kind: 'event';
|
|
37
|
-
event: CardEvent;
|
|
38
|
-
} | {
|
|
39
|
-
dir: 'up';
|
|
40
|
-
kind: 'focus-edge';
|
|
41
|
-
edge: 'start' | 'end';
|
|
42
|
-
} | {
|
|
43
|
-
dir: 'up';
|
|
44
|
-
kind: 'fault';
|
|
45
|
-
code: WireFaultCode;
|
|
46
|
-
message: string;
|
|
47
|
-
};
|
|
48
|
-
export type WireFaultCode = 'version-unsupported' | 'bad-frame' | 'render-failed' | 'origin-rejected';
|
|
49
|
-
export type WireMessage = DownMessage | UpMessage;
|
|
50
|
-
export declare function createPacker(version: string, nonce: string): <M extends WireMessage>(message: M) => WireFrame<M>;
|
|
51
|
-
/** Structural + direction guard. Host calls with 'up', runtime with 'down'.
|
|
52
|
-
* STRUCTURAL only — nonce/version equality + schema validation happen after. */
|
|
53
|
-
export declare function isCardWireFrame(data: unknown, expectedDir: 'up' | 'down'): data is WireFrame;
|
|
1
|
+
// GENERATED by scripts/emit-subpath-dts.mjs — do not edit.
|
|
2
|
+
// Sibling declarations for dist/wire.js, so that RELATIVE imports
|
|
3
|
+
// of this bundle (which bypass package.json "exports") still resolve to types.
|
|
4
|
+
// Without this, tsc resolves the path to the .js and reports TS7016.
|
|
5
|
+
export * from './wire/index.js';
|