@kitn.ai/ui 0.27.0 → 0.29.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 +10 -2
- package/dist/{Icon-BnFKqqtY.js → Icon-DObhsRtm.js} +1 -1
- package/dist/{action-icons-CBskfBMz.js → action-icons-CcgNN2oT.js} +1 -1
- package/dist/agent-tooling/construct/public.d.ts +15 -0
- package/dist/agent-tooling/construct/schema.d.ts +111 -0
- package/dist/arrow-down-CjRU3JgV.js +1 -0
- package/dist/arrow-left-Bnpb1UEW.js +1 -0
- package/dist/{artifact-CvXEm1lS.js → artifact-Bwt7OgcR.js} +1 -1
- package/dist/{attachments-C43ZegEq.js → attachments-Qr4kg-2b.js} +1 -1
- package/dist/{audio-visualizer-B-79y1Tj.js → audio-visualizer-DToYdfSc.js} +1 -1
- package/dist/{badge-BpUbq8c0.js → badge-CdEu_jn2.js} +1 -1
- package/dist/{bell-sn17Ip9v.js → bell-DQAAOpDz.js} +1 -1
- package/dist/{button-BH6rN0U-.js → button-DkuOnGLy.js} +1 -1
- package/dist/{card-renderer-Cb1gQmth.js → card-renderer-Jx70m6_l.js} +1 -1
- package/dist/{card-routing-DifQgS7n.js → card-routing-0YidER_3.js} +1 -1
- package/dist/check-njkVdZu2.js +1 -0
- package/dist/{checkbox-Dc9Yov_B.js → checkbox-D7iRB3nL.js} +1 -1
- package/dist/{checkbox-group-B1kDLLYk.js → checkbox-group-B2_rpoPM.js} +1 -1
- package/dist/chevron-down-B72s6PXR.js +1 -0
- package/dist/chevron-right-BatuHzUm.js +1 -0
- package/dist/{choice-card-BT3c1S8g.js → choice-card-m0BYqqOK.js} +1 -1
- package/dist/circle-check-B62pODB3.js +1 -0
- package/dist/{circle-x-wobWkoSx.js → circle-x-BPG0iPst.js} +1 -1
- package/dist/circle-zx0ByzY9.js +1 -0
- package/dist/code-block-ClMLKb7C.js +1 -0
- package/dist/{collapsible-CPJbf6FM.js → collapsible-B4DlWicL.js} +1 -1
- package/dist/components/chat-thread.d.ts +89 -1
- package/dist/components/conversation-item.d.ts +16 -0
- package/dist/components/conversation-panel.d.ts +29 -0
- package/dist/components/home-panel.d.ts +34 -0
- package/dist/components/widget-tab-bar.d.ts +16 -0
- package/dist/{composer-CjngLzal.js → composer-sQ0HcvyG.js} +3 -3
- package/dist/{confirm-card-DCx_A4bU.js → confirm-card-rQWDQsnC.js} +1 -1
- package/dist/construct-cli.es.js +185 -17
- package/dist/construct.d.ts +5 -0
- package/dist/construct.js +327 -0
- package/dist/{context-BY8V-Nlp.js → context-0kg4ZX1J.js} +1 -1
- package/dist/controllable-CnGpMF6r.js +1 -0
- package/dist/conversation-item-BxwQLaFJ.js +1 -0
- package/dist/conversation-list-BCfGN1JU.js +1 -0
- package/dist/{copy-B6DO4PqB.js → copy-n9u9rqpi.js} +1 -1
- package/dist/core-C8fzo39E.js +1 -12
- package/dist/{create-tween-CnMHviKB.js → create-tween-C-q-JCM-.js} +1 -1
- package/dist/{create-tween-D1aiGZZh.js → create-tween-CRrJXxBd.js} +1 -1
- package/dist/{create-tween-BPzaefTp.js → create-tween-DZ3RRDHD.js} +1 -1
- package/dist/{create-tween-DUSQUKpr.js → create-tween-uPkArjIG.js} +1 -1
- package/dist/custom-elements.json +51 -2
- package/dist/{default-input-CucQEOqH.js → default-input-CaMrJkgH.js} +1 -1
- package/dist/define-By-uL588.js +1 -0
- package/dist/define.js +2 -2
- package/dist/define.server.js +2 -2
- package/dist/{disclosure-CbLtajUQ.js → disclosure-WUImBbDv.js} +1 -1
- package/dist/{dropdown-BwhViJFd.js → dropdown-wZVeJOMd.js} +1 -1
- 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-workspace.js +1 -1
- package/dist/elements/chat.js +1 -1
- package/dist/elements/checkbox-group.js +1 -1
- package/dist/elements/checkbox.js +1 -1
- package/dist/elements/checkpoint.js +1 -1
- package/dist/elements/choice.js +1 -1
- 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.js +1 -1
- package/dist/elements/conversation-list.js +1 -1
- package/dist/elements/dialog.js +1 -1
- package/dist/elements/dock.js +3 -3
- package/dist/elements/dropdown.js +1 -1
- package/dist/elements/editable-label.js +1 -1
- 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-grid.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/radio-group.js +1 -1
- package/dist/elements/reasoning.js +1 -1
- package/dist/elements/remote.js +1 -1
- package/dist/elements/resizable.js +1 -1
- package/dist/elements/response-stream.js +1 -1
- 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/select.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/slider.js +1 -1
- 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 +20 -4
- package/dist/{ellipsis-DFr4Vqr3.js → ellipsis-CbOpJnU3.js} +1 -1
- package/dist/{embed-5s_vU4J0.js → embed-CrfjkbUG.js} +1 -1
- package/dist/engine-javascript-C1x7zo1_.js +1 -141
- package/dist/{external-link-u9d85ORQ.js → external-link-ByXAwBBQ.js} +1 -1
- package/dist/{file-text-CX7_x42o.js → file-text-DMib2qwt.js} +1 -1
- package/dist/{file-tree-D3kBjXI5.js → file-tree-CJqM2aP7.js} +1 -1
- package/dist/{folder-V-YdIL8f.js → folder-_BAb929C.js} +1 -1
- package/dist/{form-BRNUMCN2.js → form-DSZgZQZk.js} +1 -1
- package/dist/{hover-card-DaeiYrTA.js → hover-card-BQbul9eq.js} +1 -1
- package/dist/{icon-BpixdZNq.js → icon-CdcfRhYI.js} +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +2842 -2703
- package/dist/index.server.js +2820 -2681
- package/dist/{info-8mFsIjS3.js → info-DsFjGuI_.js} +1 -1
- package/dist/{input-d1Yuu-hz.js → input-DKbmkMos.js} +1 -1
- package/dist/kai.es.js +1 -1
- package/dist/{kbd-961zMPFB.js → kbd-PvdGhX4s.js} +1 -1
- package/dist/{link-preview-DIIbV2Sd.js → link-preview-DbM1866N.js} +1 -1
- package/dist/{link-DlZZBGaR.js → link-zF8PzWfF.js} +1 -1
- package/dist/{loader-YQszHFaW.js → loader-BM4CEz4G.js} +1 -1
- package/dist/{markdown-CVk1MPsj.js → markdown-LMvmAyBk.js} +7 -7
- package/dist/mcp.es.js +79 -5
- package/dist/{message-CwKVEdZg.js → message-BSsgvHvf.js} +1 -1
- package/dist/{message-DS8lzHc1.js → message-BYZECyek.js} +1 -1
- package/dist/message-circle-DruwObfX.js +1 -0
- package/dist/message-square-BG6q6mlm.js +1 -0
- package/dist/{minimize-2-UEZmP2QT.js → minimize-2-BQRoBV1V.js} +1 -1
- package/dist/{model-switcher-Kk1jEQ5t.js → model-switcher-CMpCOYcB.js} +1 -1
- package/dist/{overlay-C1od6LOz.js → overlay-Cb-MkyDa.js} +1 -1
- package/dist/{panel-right-ryET0yyn.js → panel-right-i8warFxT.js} +1 -1
- package/dist/{paperclip-BDNoZFJP.js → paperclip-ByY3UVO6.js} +1 -1
- package/dist/play-BvKKq3fX.js +1 -0
- package/dist/primitives/conversation-store.d.ts +54 -0
- package/dist/{progress-bar-BvYX0aoy.js → progress-bar-jVAHvMUf.js} +1 -1
- package/dist/{prompt-suggestion-BRFu2lcu.js → prompt-suggestion-CD-qtNgC.js} +1 -1
- package/dist/{radio-DcL23cNJ.js → radio-BsoBMhkF.js} +1 -1
- package/dist/react/index.d.ts +393 -0
- package/dist/react.js +20 -20
- package/dist/{reasoning-Cackq4Rh.js → reasoning-4kBPtlTx.js} +1 -1
- package/dist/register-impl-B1hLkrI8.js +424 -0
- package/dist/{resizable-Cp9HUYih.js → resizable-uPmY9VY-.js} +1 -1
- package/dist/{rotate-ccw-0DLRDHH5.js → rotate-ccw-B2xn93py.js} +1 -1
- package/dist/{rotate-cw-DOB9IGcU.js → rotate-cw-CMVLoCyH.js} +1 -1
- package/dist/{scroll-area-emVmWP4K.js → scroll-area-BqLUo8ZZ.js} +1 -1
- package/dist/{scroll-button-CeP_gv1x.js → scroll-button-DslXiJyL.js} +1 -1
- package/dist/{select-CWmu00tS.js → select-2cLRtPGT.js} +1 -1
- package/dist/{separator-CE6vly6z.js → separator-BWQtNJcM.js} +1 -1
- package/dist/{settings-CE-78SvZ.js → settings-BBR63jLg.js} +1 -1
- package/dist/{settings-group-ZFWNxFQR.js → settings-group-B2ciy-Iw.js} +1 -1
- package/dist/{skeleton-BebdP4mf.js → skeleton-CkHI-HgC.js} +1 -1
- package/dist/{slider-BAKRYUlz.js → slider-DDR9U-i0.js} +1 -1
- package/dist/{solid-BE5ui6sy.js → solid-BzCFdL25.js} +7720 -7058
- package/dist/{solid-DFhsce3O.js → solid-DruVOXnf.js} +5864 -5283
- package/dist/solid.d.ts +6 -2
- package/dist/solid.js +217 -210
- package/dist/solid.server.js +217 -210
- package/dist/{source-B0FlguSx.js → source-GEnFF528.js} +1 -1
- package/dist/{star-CBMZvLuN.js → star-CilHq8GP.js} +1 -1
- package/dist/store-Ciyk6eZG.js +1 -0
- package/dist/{switch-CViARZCy.js → switch-KkeQIbuH.js} +1 -1
- package/dist/{tasks-card-MjCcOhR_.js → tasks-card-BrN4bggJ.js} +1 -1
- package/dist/{text-shimmer-DKlwRF2G.js → text-shimmer-Dcj1MHuq.js} +1 -1
- package/dist/{textarea-3ay2Me2-.js → textarea-Dpvbngbg.js} +1 -1
- package/dist/theme.tokens.css +28 -0
- package/dist/{thumbs-up-DQcu2HMO.js → thumbs-up-CsT9Wzb9.js} +1 -1
- package/dist/{toast-store-C6yKOhbk.js → toast-store-tgK6MuMv.js} +1 -1
- package/dist/{tool-BCYNlfKy.js → tool-DzUjIBT8.js} +1 -1
- package/dist/{tooltip-05zI4hjs.js → tooltip-Bkkg_4t0.js} +1 -1
- package/dist/{trash-2-BR1RxGky.js → trash-2-jBKxjGGQ.js} +1 -1
- package/dist/{triangle-alert-DHohDOCy.js → triangle-alert-DlQ68ppf.js} +1 -1
- package/dist/types.d.ts +48 -3
- package/dist/ui/dock.d.ts +29 -0
- package/dist/{upload-BbGW6A_u.js → upload-TcAHXv9W.js} +1 -1
- package/dist/{url-scheme-policy-DHpoTJwB.js → url-scheme-policy-DR5DgvkM.js} +1 -1
- package/dist/{use-card-resolution-CJW4grFa.js → use-card-resolution-DaZqAdWf.js} +1 -1
- package/dist/{variant-aurora-xiMPty8f.js → variant-aurora-BhLuYxJR.js} +1 -1
- package/dist/{variant-aurora-BUOVgPOB.js → variant-aurora-CNmfHhcx.js} +2 -2
- package/dist/{variant-aurora-CUsUJvFI.js → variant-aurora-D6GsdTPA.js} +2 -2
- package/dist/{variant-aurora-CW2i4bfr.js → variant-aurora-DbW_OWL2.js} +1 -1
- package/dist/{variant-custom-D91HjAKz.js → variant-custom-BRvaNHSi.js} +1 -1
- package/dist/{variant-custom-BQtOnmeO.js → variant-custom-BvYHR62b.js} +1 -1
- package/dist/{variant-custom-CAnzzppW.js → variant-custom-DMTrEO5w.js} +2 -2
- package/dist/{variant-custom-CAm9L-E5.js → variant-custom-DV2x254s.js} +2 -2
- package/dist/{variant-wave-Ca1Ls4_y.js → variant-wave-BNMGrDfj.js} +2 -2
- package/dist/{variant-wave-uY5crU_K.js → variant-wave-BpDd8t3Z.js} +1 -1
- package/dist/{variant-wave-CxX39DKd.js → variant-wave-CyBueXj9.js} +2 -2
- package/dist/{variant-wave-DYyzIIZv.js → variant-wave-sp-qwsdI.js} +1 -1
- package/dist/x-Z5UntkIJ.js +1 -0
- package/frameworks/react/index.tsx +14 -4
- package/llms-full.txt +7 -2
- package/package.json +16 -16
- package/src/elements/element-meta.json +49 -6
- package/theme.css +28 -0
- package/bin/route.test.js +0 -58
- package/dist/arrow-down-Br0qtpsz.js +0 -1
- package/dist/arrow-left-Dj7xgE12.js +0 -1
- package/dist/check-DPeeMUYx.js +0 -1
- package/dist/chevron-down-CHSWk7ZT.js +0 -1
- package/dist/chevron-right-B7l_fMgx.js +0 -1
- package/dist/circle-Bb0yOpqM.js +0 -1
- package/dist/circle-check-BGZpCiz7.js +0 -1
- package/dist/code-block-CUQ5mtv0.js +0 -1
- package/dist/controllable-D43BKmtX.js +0 -1
- package/dist/conversation-list-D4lLU_yS.js +0 -1
- package/dist/define-CGGX-7Vg.js +0 -1
- package/dist/message-circle-Xf8Q-vZp.js +0 -1
- package/dist/message-square-Cxnwgkns.js +0 -1
- package/dist/play-OFIvYXUQ.js +0 -1
- package/dist/register-impl-C7rENvPK.js +0 -424
- package/dist/store-7eoadydQ.js +0 -1
- package/dist/x-C5m1JFgi.js +0 -1
- package/src/agent-tooling/archetypes.ts +0 -205
- package/src/agent-tooling/catalog/README.md +0 -676
- package/src/agent-tooling/catalog/catalog-types.ts +0 -231
- package/src/agent-tooling/catalog/fabrications.ts +0 -96
- package/src/agent-tooling/catalog/invariants.ts +0 -284
- package/src/agent-tooling/catalog/labs-titles.ts +0 -114
- package/src/agent-tooling/catalog/scenarios.ts +0 -87
- package/src/agent-tooling/catalog/surfaces.ts +0 -347
- package/src/agent-tooling/construct/cli-entry.ts +0 -8
- package/src/agent-tooling/construct/cli.ts +0 -131
- package/src/agent-tooling/construct/codegen.ts +0 -1353
- package/src/agent-tooling/construct/construct.v1.schema.json +0 -250
- package/src/agent-tooling/construct/dev.ts +0 -148
- package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +0 -7
- package/src/agent-tooling/construct/fixtures/ops-console.construct.json +0 -44
- package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +0 -23
- package/src/agent-tooling/construct/schema.ts +0 -371
- package/src/agent-tooling/integrations/anthropic.ts +0 -442
- package/src/agent-tooling/integrations/cloudflare.ts +0 -218
- package/src/agent-tooling/integrations/langgraph.ts +0 -133
- package/src/agent-tooling/integrations/mastra.ts +0 -182
- package/src/agent-tooling/integrations/mock.ts +0 -148
- package/src/agent-tooling/integrations/ollama.ts +0 -97
- package/src/agent-tooling/integrations/openai.ts +0 -95
- package/src/agent-tooling/integrations/openrouter.ts +0 -82
- package/src/agent-tooling/integrations/pi.ts +0 -176
- package/src/agent-tooling/integrations/pydantic-ai.ts +0 -108
- package/src/agent-tooling/integrations/vercel-ai-sdk.ts +0 -398
- package/src/agent-tooling/mcp/css-raw.d.ts +0 -12
- package/src/agent-tooling/mcp/manifest.ts +0 -422
- package/src/agent-tooling/mcp/server.ts +0 -116
- package/src/agent-tooling/mcp/stdio.ts +0 -18
- package/src/agent-tooling/mcp/tools/construct.ts +0 -130
- package/src/agent-tooling/mcp/tools/debug.ts +0 -621
- package/src/agent-tooling/mcp/tools/reference.ts +0 -980
- package/src/agent-tooling/mcp/tools/scaffold.ts +0 -6708
- package/src/agent-tooling/mcp/tools/theme.ts +0 -456
- package/src/agent-tooling/mcp/tools/types.ts +0 -14
- package/src/agent-tooling/mcp/validate-args.ts +0 -141
- package/src/agent-tooling/recipes/composed-thread.ts +0 -714
- package/src/agent-tooling/recipes/index.ts +0 -22
- package/src/agent-tooling/recipes/types.ts +0 -32
- package/src/agent-tooling/registry.ts +0 -132
- package/src/agent-tooling/route-emit.ts +0 -305
- package/src/agent-tooling/types.ts +0 -390
- package/src/components/artifact-card.tsx +0 -120
- package/src/components/artifact.tsx +0 -914
- package/src/components/attachment-types.ts +0 -66
- package/src/components/attachments.tsx +0 -536
- package/src/components/audio-visualizer/audio-visualizer.voice-fixture.ts +0 -257
- package/src/components/audio-visualizer/aurora.glsl.ts +0 -330
- package/src/components/audio-visualizer/fit-scale.ts +0 -112
- package/src/components/audio-visualizer/index.tsx +0 -528
- package/src/components/audio-visualizer/labs/lab-choreography.ts +0 -187
- package/src/components/audio-visualizer/labs/lab-shaders.ts +0 -363
- package/src/components/audio-visualizer/labs/lab-visualizer.tsx +0 -102
- package/src/components/audio-visualizer/shader-canvas.tsx +0 -876
- package/src/components/audio-visualizer/sizes.ts +0 -54
- package/src/components/audio-visualizer/variant-aurora.tsx +0 -305
- package/src/components/audio-visualizer/variant-bar.tsx +0 -175
- package/src/components/audio-visualizer/variant-custom.tsx +0 -344
- package/src/components/audio-visualizer/variant-grid.tsx +0 -175
- package/src/components/audio-visualizer/variant-radial.tsx +0 -163
- package/src/components/audio-visualizer/variant-wave.tsx +0 -130
- package/src/components/audio-visualizer/wave.glsl.ts +0 -130
- package/src/components/card-fallback.tsx +0 -60
- package/src/components/card-renderer.tsx +0 -220
- package/src/components/card.tsx +0 -212
- package/src/components/chain-of-thought.tsx +0 -348
- package/src/components/chat-container.tsx +0 -89
- package/src/components/chat-scope-picker.tsx +0 -57
- package/src/components/chat-thread.tsx +0 -518
- package/src/components/checkpoint.tsx +0 -88
- package/src/components/choice-card.tsx +0 -743
- package/src/components/coachmark.tsx +0 -249
- package/src/components/code-block.tsx +0 -181
- package/src/components/composer-dom.ts +0 -159
- package/src/components/composer-highlight.ts +0 -242
- package/src/components/composer-history.ts +0 -82
- package/src/components/composer.tsx +0 -1075
- package/src/components/confirm-card.tsx +0 -402
- package/src/components/context.tsx +0 -377
- package/src/components/conversation-item.tsx +0 -218
- package/src/components/conversation-list.tsx +0 -429
- package/src/components/dismissed-stub.tsx +0 -80
- package/src/components/embed.tsx +0 -200
- package/src/components/empty.tsx +0 -177
- package/src/components/feedback-bar.tsx +0 -166
- package/src/components/file-tree.tsx +0 -530
- package/src/components/file-upload.tsx +0 -167
- package/src/components/form-widgets.tsx +0 -525
- package/src/components/form.tsx +0 -1296
- package/src/components/image.tsx +0 -65
- package/src/components/link-preview.tsx +0 -195
- package/src/components/loader.tsx +0 -367
- package/src/components/markdown.tsx +0 -162
- package/src/components/message-skills.tsx +0 -40
- package/src/components/message.tsx +0 -765
- package/src/components/model-switcher.tsx +0 -132
- package/src/components/prompt-input.tsx +0 -188
- package/src/components/prompt-suggestion.tsx +0 -150
- package/src/components/reasoning.tsx +0 -293
- package/src/components/response-compare-types.ts +0 -152
- package/src/components/response-compare.tsx +0 -455
- package/src/components/response-stream.tsx +0 -109
- package/src/components/screen.tsx +0 -181
- package/src/components/scroll-button.tsx +0 -93
- package/src/components/source.tsx +0 -192
- package/src/components/tasks-card.tsx +0 -801
- package/src/components/text-shimmer.tsx +0 -37
- package/src/components/thinking-bar.tsx +0 -50
- package/src/components/thread.tsx +0 -228
- package/src/components/toast.tsx +0 -503
- package/src/components/tool-classify.ts +0 -26
- package/src/components/tool-types.ts +0 -49
- package/src/components/tool.tsx +0 -190
- package/src/components/use-card-resolution.ts +0 -44
- package/src/components/voice-input.tsx +0 -222
- package/src/components/voice-output.tsx +0 -242
- package/src/components/workspace-shell.tsx +0 -285
- package/src/diagnostics/hook.ts +0 -352
- package/src/diagnostics/index.ts +0 -82
- package/src/diagnostics/report-request.ts +0 -296
- package/src/elements/agent-card.tsx +0 -67
- package/src/elements/artifact.tsx +0 -194
- package/src/elements/attachments.tsx +0 -140
- package/src/elements/audio-visualizer.tsx +0 -227
- package/src/elements/autoloader.ts +0 -89
- package/src/elements/avatar.tsx +0 -33
- package/src/elements/badge.tsx +0 -32
- package/src/elements/button.tsx +0 -149
- package/src/elements/card.tsx +0 -133
- package/src/elements/cards.tsx +0 -266
- package/src/elements/chain-of-thought.tsx +0 -141
- package/src/elements/chat-scope-picker.tsx +0 -65
- package/src/elements/chat-types.ts +0 -102
- package/src/elements/chat-workspace.tsx +0 -188
- package/src/elements/chat.tsx +0 -212
- package/src/elements/checkbox-group.tsx +0 -164
- package/src/elements/checkbox.tsx +0 -134
- package/src/elements/checkpoint.tsx +0 -47
- package/src/elements/choice.tsx +0 -100
- package/src/elements/coachmark.tsx +0 -90
- package/src/elements/code-block.tsx +0 -60
- package/src/elements/command.tsx +0 -197
- package/src/elements/compare.tsx +0 -111
- package/src/elements/compiled.css +0 -2
- package/src/elements/composer.tsx +0 -162
- package/src/elements/confirm-card.tsx +0 -76
- package/src/elements/context-meter.tsx +0 -107
- package/src/elements/conversation-item.tsx +0 -120
- package/src/elements/conversation-list.tsx +0 -203
- package/src/elements/css.ts +0 -5
- package/src/elements/default-input.tsx +0 -392
- package/src/elements/define-entry.ts +0 -12
- package/src/elements/define.tsx +0 -563
- package/src/elements/diagnostic-events.ts +0 -114
- package/src/elements/dialog.tsx +0 -145
- package/src/elements/disclosure.ts +0 -95
- package/src/elements/dock.tsx +0 -215
- package/src/elements/dropdown.tsx +0 -123
- package/src/elements/editable-label.tsx +0 -140
- package/src/elements/element-data-types.ts +0 -152
- package/src/elements/element-diagnostics.ts +0 -392
- package/src/elements/element-manifest.json +0 -354
- package/src/elements/element-nonscalar.json +0 -185
- package/src/elements/element-types.d.ts +0 -4337
- package/src/elements/embed.tsx +0 -35
- package/src/elements/empty.tsx +0 -29
- package/src/elements/feedback-bar.tsx +0 -66
- package/src/elements/file-tree.tsx +0 -62
- package/src/elements/file-upload.tsx +0 -44
- package/src/elements/form.tsx +0 -94
- package/src/elements/hover-card.tsx +0 -80
- package/src/elements/icon.tsx +0 -41
- package/src/elements/image.tsx +0 -32
- package/src/elements/input.tsx +0 -492
- package/src/elements/kbd.tsx +0 -45
- package/src/elements/link-preview.tsx +0 -34
- package/src/elements/loader.tsx +0 -25
- package/src/elements/markdown.tsx +0 -38
- package/src/elements/menu.tsx +0 -241
- package/src/elements/message-skills.tsx +0 -83
- package/src/elements/message.tsx +0 -361
- package/src/elements/model-switcher.tsx +0 -121
- package/src/elements/nav.tsx +0 -87
- package/src/elements/notice.tsx +0 -53
- package/src/elements/pane-grid.tsx +0 -111
- package/src/elements/pane-group.tsx +0 -119
- package/src/elements/pane.tsx +0 -129
- package/src/elements/popover.tsx +0 -81
- package/src/elements/progress-bar.tsx +0 -39
- package/src/elements/prompt-dock.tsx +0 -82
- package/src/elements/prompt-input.tsx +0 -240
- package/src/elements/prompt-suggestions.tsx +0 -113
- package/src/elements/radio-group.tsx +0 -129
- package/src/elements/reasoning.tsx +0 -71
- package/src/elements/register-impl.ts +0 -148
- package/src/elements/register.ts +0 -76
- package/src/elements/remote.tsx +0 -225
- package/src/elements/resizable.globals.d.ts +0 -36
- package/src/elements/resizable.tsx +0 -704
- package/src/elements/response-stream.tsx +0 -40
- package/src/elements/screen.tsx +0 -90
- package/src/elements/scroll-area.tsx +0 -33
- package/src/elements/scroll-button.tsx +0 -179
- package/src/elements/search.tsx +0 -185
- package/src/elements/segmented.tsx +0 -129
- package/src/elements/select.tsx +0 -165
- package/src/elements/separator.tsx +0 -36
- package/src/elements/setting-item.tsx +0 -50
- package/src/elements/settings-group.tsx +0 -37
- package/src/elements/skeleton.tsx +0 -45
- package/src/elements/slider.tsx +0 -171
- package/src/elements/slot-text.ts +0 -73
- package/src/elements/slots.ts +0 -787
- package/src/elements/source.tsx +0 -126
- package/src/elements/status.tsx +0 -42
- package/src/elements/styles.css +0 -328
- package/src/elements/switch.tsx +0 -118
- package/src/elements/tabs.tsx +0 -95
- package/src/elements/tasks.tsx +0 -103
- package/src/elements/text-shimmer.tsx +0 -28
- package/src/elements/thinking-bar.tsx +0 -43
- package/src/elements/thread.tsx +0 -139
- package/src/elements/toast.tsx +0 -106
- package/src/elements/tool.tsx +0 -78
- package/src/elements/tooltip.tsx +0 -85
- package/src/elements/validate-messages.ts +0 -76
- package/src/elements/voice-input.tsx +0 -100
- package/src/elements/voice-output.tsx +0 -82
- package/src/index.ts +0 -428
- package/src/primitives/audio-bands.ts +0 -174
- package/src/primitives/card-component-types.ts +0 -63
- package/src/primitives/card-contract.ts +0 -80
- package/src/primitives/card-data-types.ts +0 -361
- package/src/primitives/card-host.tsx +0 -37
- package/src/primitives/card-recovery.ts +0 -160
- package/src/primitives/card-registry.tsx +0 -78
- package/src/primitives/card-resolution.ts +0 -36
- package/src/primitives/card-routing.ts +0 -85
- package/src/primitives/card-schemas/artifact.schema.json +0 -92
- package/src/primitives/card-schemas/card-envelope.schema.json +0 -14
- package/src/primitives/card-schemas/card-event.schema.json +0 -12
- package/src/primitives/card-schemas/choice.schema.json +0 -75
- package/src/primitives/card-schemas/confirm.schema.json +0 -65
- package/src/primitives/card-schemas/embed.schema.json +0 -63
- package/src/primitives/card-schemas/form.result.schema.json +0 -7
- package/src/primitives/card-schemas/form.schema.json +0 -53
- package/src/primitives/card-schemas/link.schema.json +0 -54
- package/src/primitives/card-schemas/tasks.result.schema.json +0 -16
- package/src/primitives/card-schemas/tasks.schema.json +0 -83
- package/src/primitives/card-tags.ts +0 -61
- package/src/primitives/card-validate-cards.ts +0 -255
- package/src/primitives/card-validate-schemas.ts +0 -58
- package/src/primitives/card-validate.ts +0 -131
- package/src/primitives/chat-config.tsx +0 -103
- package/src/primitives/composer-model.ts +0 -49
- package/src/primitives/composer-triggers.ts +0 -35
- package/src/primitives/controllable.ts +0 -21
- package/src/primitives/create-kai-chat.ts +0 -66
- package/src/primitives/create-tween.ts +0 -266
- package/src/primitives/embed-providers.ts +0 -254
- package/src/primitives/field-mask.ts +0 -256
- package/src/primitives/field-semantics.ts +0 -115
- package/src/primitives/highlighter.ts +0 -157
- package/src/primitives/input-mask.ts +0 -853
- package/src/primitives/link-preview.ts +0 -87
- package/src/primitives/message-feedback.ts +0 -124
- package/src/primitives/pdf-preview.ts +0 -121
- package/src/primitives/toast-store.ts +0 -338
- package/src/primitives/url-scheme-policy.ts +0 -70
- package/src/primitives/use-audio-analysis.ts +0 -340
- package/src/primitives/use-auto-resize.ts +0 -31
- package/src/primitives/use-resize-observer.ts +0 -45
- package/src/primitives/use-sequencer.ts +0 -72
- package/src/primitives/use-speech-recognition.ts +0 -146
- package/src/primitives/use-stick-to-bottom.ts +0 -75
- package/src/primitives/use-text-stream.ts +0 -143
- package/src/primitives/use-voice-recorder.ts +0 -62
- package/src/primitives/visualizer-sequences.ts +0 -350
- package/src/remote/host-embed.ts +0 -345
- package/src/remote/index.ts +0 -2
- package/src/remote/origin.ts +0 -30
- package/src/remote/provider-runtime.ts +0 -262
- package/src/remote/provider.ts +0 -2
- package/src/remote/validate.ts +0 -22
- package/src/remote/version.ts +0 -12
- package/src/remote/wire.ts +0 -48
- package/src/schemas/from-tool-call.ts +0 -151
- package/src/schemas/index.ts +0 -341
- package/src/schemas/provider-subsets.ts +0 -538
- package/src/schemas/registry.ts +0 -355
- package/src/schemas/tool-defs.ts +0 -793
- package/src/solid.ts +0 -165
- package/src/state/index.ts +0 -44
- package/src/state/messages.ts +0 -53
- package/src/state/mock.ts +0 -297
- package/src/state/parts.ts +0 -295
- package/src/state/persistence.ts +0 -180
- package/src/state/stream.ts +0 -246
- package/src/state/suggestions.ts +0 -9
- package/src/state/threads.ts +0 -142
- package/src/test-utils/fake-clock.ts +0 -88
- package/src/types.ts +0 -53
- package/src/ui/action-icons.ts +0 -53
- package/src/ui/agent-card.tsx +0 -218
- package/src/ui/avatar.tsx +0 -23
- package/src/ui/badge.tsx +0 -21
- package/src/ui/button.tsx +0 -49
- package/src/ui/card.tsx +0 -245
- package/src/ui/checkbox-group.tsx +0 -153
- package/src/ui/checkbox.tsx +0 -63
- package/src/ui/collapsible.tsx +0 -163
- package/src/ui/command.tsx +0 -103
- package/src/ui/dialog.tsx +0 -223
- package/src/ui/dock.tsx +0 -584
- package/src/ui/dropdown.tsx +0 -636
- package/src/ui/editable-label.tsx +0 -112
- package/src/ui/hover-card.tsx +0 -345
- package/src/ui/icon.tsx +0 -167
- package/src/ui/input.tsx +0 -391
- package/src/ui/kbd.tsx +0 -118
- package/src/ui/nav.tsx +0 -282
- package/src/ui/notice.tsx +0 -84
- package/src/ui/overlay.tsx +0 -277
- package/src/ui/pane-grid.tsx +0 -117
- package/src/ui/pane-group.tsx +0 -291
- package/src/ui/pane.tsx +0 -193
- package/src/ui/popover.tsx +0 -106
- package/src/ui/progress-bar.tsx +0 -83
- package/src/ui/prompt-dock.tsx +0 -145
- package/src/ui/radio.tsx +0 -150
- package/src/ui/resizable.tsx +0 -693
- package/src/ui/scroll-area.tsx +0 -26
- package/src/ui/segmented.tsx +0 -109
- package/src/ui/select.tsx +0 -168
- package/src/ui/separator.tsx +0 -10
- package/src/ui/settings-group.tsx +0 -67
- package/src/ui/skeleton.tsx +0 -73
- package/src/ui/slider.tsx +0 -178
- package/src/ui/status.tsx +0 -48
- package/src/ui/switch.tsx +0 -119
- package/src/ui/tabs.tsx +0 -168
- package/src/ui/textarea.tsx +0 -21
- package/src/ui/tooltip.tsx +0 -118
- package/src/utils/cn.ts +0 -30
- package/src/wire/chunk.ts +0 -248
- package/src/wire/consume.ts +0 -599
- package/src/wire/diagnostics.ts +0 -727
- package/src/wire/encode-probe.ts +0 -214
- package/src/wire/encode.ts +0 -947
- package/src/wire/files.ts +0 -342
- package/src/wire/formats/anthropic.ts +0 -274
- package/src/wire/formats/openai.ts +0 -228
- package/src/wire/index.ts +0 -95
- package/src/wire/media-types.ts +0 -344
- package/src/wire/read.ts +0 -396
- package/src/wire/sink-helpers.ts +0 -50
- package/src/wire/sse.ts +0 -153
package/dist/construct-cli.es.js
CHANGED
|
@@ -57,6 +57,21 @@ const ConstructSchema = z.object({
|
|
|
57
57
|
theme: z.object({
|
|
58
58
|
/** Any CSS color; becomes --kai-color-primary on the host. */
|
|
59
59
|
accent: z.string().optional(),
|
|
60
|
+
/** Any CSS color; becomes --kai-color-unread on the host (owner
|
|
61
|
+
* ruling, 2026-08-26 — the unread-indicator round). Same treatment
|
|
62
|
+
* as `accent` in every way that matters for safety: construct-
|
|
63
|
+
* authored/untrusted text, carried to the emitted facade via
|
|
64
|
+
* `ctx.element.style.setProperty('--kai-color-unread',
|
|
65
|
+
* JSON.stringify(...))` — never string-interpolated into CSS
|
|
66
|
+
* text — so it can never break out into a new declaration or rule
|
|
67
|
+
* (see emitElement's doc on why `accent` uses setProperty at all).
|
|
68
|
+
* Unlike `accent`, this has no paired -foreground to compute: the
|
|
69
|
+
* three surfaces that read --color-unread (the conversation-list
|
|
70
|
+
* row dot, the header toggle's badge, Dock's own closed-launcher
|
|
71
|
+
* badge) are all small filled dots with no text sitting ON them, so
|
|
72
|
+
* there is nothing to contrast-pair — the value is set and used
|
|
73
|
+
* as-is. */
|
|
74
|
+
unreadColor: z.string().optional(),
|
|
60
75
|
mode: z.enum(["light", "dark", "system"]).default("system")
|
|
61
76
|
}).strict().optional(),
|
|
62
77
|
/** Construct-wide header chrome, valid on every layout (not layout-scoped
|
|
@@ -90,6 +105,30 @@ const ConstructSchema = z.object({
|
|
|
90
105
|
description: z.string().min(1).optional(),
|
|
91
106
|
icon: z.string().min(1).optional()
|
|
92
107
|
}).strict().optional(),
|
|
108
|
+
/** Home screen (spec 2026-08-27, H-1..H-5): Intercom-style landing view behind
|
|
109
|
+
* a Home/Messages tab bar. PRESENCE of `home` enables the tab chrome (H-4) —
|
|
110
|
+
* no `enabled` boolean, like `header`/`empty`. Every sub-key optional;
|
|
111
|
+
* `home: {}` still means "tabs on, defaults". Never requires another
|
|
112
|
+
* capability (H-3): the recent card simply renders nothing without
|
|
113
|
+
* `capabilities.conversations` (the CLI warns — see cli.ts). All strings are
|
|
114
|
+
* construct-authored/untrusted: JSON.stringify'd at every emit site; hrefs
|
|
115
|
+
* and URL-shaped icons through isSafeUrl in superRefine below. */
|
|
116
|
+
home: z.object({
|
|
117
|
+
greeting: z.object({ title: z.string().min(1).optional(), subtitle: z.string().min(1).optional() }).strict().optional(),
|
|
118
|
+
recentConversation: z.literal(true).optional(),
|
|
119
|
+
newConversation: z.object({ label: z.string().min(1).optional() }).strict().optional(),
|
|
120
|
+
links: z.array(
|
|
121
|
+
z.object({
|
|
122
|
+
label: z.string().min(1),
|
|
123
|
+
href: z.string().min(1).optional(),
|
|
124
|
+
description: z.string().min(1).optional(),
|
|
125
|
+
/** renderIcon name (e.g. 'book-open') or a safe URL — the icon NAME
|
|
126
|
+
* list is renderIcon's own vocabulary, never restated here; unknown
|
|
127
|
+
* names warn loudly at DEV runtime. */
|
|
128
|
+
icon: z.string().min(1).optional()
|
|
129
|
+
}).strict()
|
|
130
|
+
).optional()
|
|
131
|
+
}).strict().optional(),
|
|
93
132
|
// Capability vocabulary, widened one field at a time by later tasks.
|
|
94
133
|
capabilities: z.object({
|
|
95
134
|
/** Starter prompts shown on the empty thread; clicking one sends it.
|
|
@@ -143,7 +182,18 @@ const ConstructSchema = z.object({
|
|
|
143
182
|
* Meaningless when `reasoning` is `'compact'` (no expandable
|
|
144
183
|
* content exists) or `'off'` (nothing renders); rejected on both,
|
|
145
184
|
* loudly, below. */
|
|
146
|
-
reasoningOpen: z.boolean().optional()
|
|
185
|
+
reasoningOpen: z.boolean().optional(),
|
|
186
|
+
/** Turns on the prior-conversations list (C-1..C-9 of the
|
|
187
|
+
* conversations design). `true` only — there is no `false` form,
|
|
188
|
+
* matching this schema's other presence-only capability flags.
|
|
189
|
+
* Requires `capabilities.history.persistence` to be `local` or
|
|
190
|
+
* `endpoint` (superRefine below, loud): a conversation list with
|
|
191
|
+
* nowhere to persist conversations is not a coherent construct.
|
|
192
|
+
* WHAT persists (this field, plus history) stays construct
|
|
193
|
+
* vocabulary; HOW it persists (the ConversationStore adapter,
|
|
194
|
+
* localStorage vs. a fetch endpoint) is codegen's call, never
|
|
195
|
+
* vocabulary here (C-3 — no transport-layer vocabulary). */
|
|
196
|
+
conversations: z.literal(true).optional()
|
|
147
197
|
}).strict().optional(),
|
|
148
198
|
/** Named generative-UI card definitions the model can emit as tool calls,
|
|
149
199
|
* rendered in the thread. Top-level (not a capability): a card is
|
|
@@ -253,6 +303,30 @@ const ConstructSchema = z.object({
|
|
|
253
303
|
});
|
|
254
304
|
}
|
|
255
305
|
const history = construct.capabilities?.history;
|
|
306
|
+
if (construct.capabilities?.conversations && (!history || history.persistence === "none")) {
|
|
307
|
+
ctx.addIssue({
|
|
308
|
+
code: z.ZodIssueCode.custom,
|
|
309
|
+
path: ["capabilities", "conversations"],
|
|
310
|
+
message: '"conversations" requires capabilities.history.persistence to be "local" or "endpoint" — a conversation list needs somewhere to persist conversations'
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
const URL_SHAPED = /^[a-zA-Z][a-zA-Z0-9+.-]*:|^\/\//;
|
|
314
|
+
for (const [i, link] of (construct.home?.links ?? []).entries()) {
|
|
315
|
+
if (link.href && !isSafeUrl(link.href)) {
|
|
316
|
+
ctx.addIssue({
|
|
317
|
+
code: z.ZodIssueCode.custom,
|
|
318
|
+
path: ["home", "links", i, "href"],
|
|
319
|
+
message: "href must be an http(s)/mailto or relative URL — no javascript:/data: schemes"
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
if (link.icon && URL_SHAPED.test(link.icon) && !isSafeUrl(link.icon)) {
|
|
323
|
+
ctx.addIssue({
|
|
324
|
+
code: z.ZodIssueCode.custom,
|
|
325
|
+
path: ["home", "links", i, "icon"],
|
|
326
|
+
message: "icon must be a kit icon name or an http(s)/relative URL — no javascript:/data: schemes"
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
}
|
|
256
330
|
if (!history) return;
|
|
257
331
|
if (history.persistence === "endpoint" && !history.url) {
|
|
258
332
|
ctx.addIssue({
|
|
@@ -564,11 +638,26 @@ function emitIndexHtml(c) {
|
|
|
564
638
|
}
|
|
565
639
|
function emitElement(c) {
|
|
566
640
|
const accent = c.theme?.accent;
|
|
567
|
-
|
|
641
|
+
const unreadColor = c.theme?.unreadColor;
|
|
642
|
+
if (!accent && !unreadColor) {
|
|
568
643
|
const facade2 = "() => <App />";
|
|
569
644
|
return `import { defineWebComponent } from '@kitn.ai/ui/define';
|
|
570
645
|
import { App } from './App';
|
|
571
646
|
|
|
647
|
+
// The one facade. Interior stays pure Solid (no nested element registrations);
|
|
648
|
+
// the kit CSS is injected into the shadow root by defineWebComponent itself.
|
|
649
|
+
defineWebComponent('${c.name}', { theme: '${themeMode(c)}' as 'light' | 'dark' | 'auto' }, ${facade2});
|
|
650
|
+
`;
|
|
651
|
+
}
|
|
652
|
+
const unreadColorSetProperty = unreadColor ? `
|
|
653
|
+
ctx.element.style.setProperty('--kai-color-unread', ${JSON.stringify(unreadColor)});` : "";
|
|
654
|
+
if (!accent) {
|
|
655
|
+
const facade2 = `(_props, ctx) => {${unreadColorSetProperty}
|
|
656
|
+
return <App />;
|
|
657
|
+
}`;
|
|
658
|
+
return `import { defineWebComponent } from '@kitn.ai/ui/define';
|
|
659
|
+
import { App } from './App';
|
|
660
|
+
|
|
572
661
|
// The one facade. Interior stays pure Solid (no nested element registrations);
|
|
573
662
|
// the kit CSS is injected into the shadow root by defineWebComponent itself.
|
|
574
663
|
defineWebComponent('${c.name}', { theme: '${themeMode(c)}' as 'light' | 'dark' | 'auto' }, ${facade2});
|
|
@@ -589,7 +678,7 @@ defineWebComponent('${c.name}', { theme: '${themeMode(c)}' as 'light' | 'dark' |
|
|
|
589
678
|
:host { --kai-color-primary-foreground: contrast-color(var(--kai-color-primary)); }
|
|
590
679
|
}`;
|
|
591
680
|
const facade = `(_props, ctx) => {
|
|
592
|
-
ctx.element.style.setProperty('--kai-color-primary', ${JSON.stringify(accent)})
|
|
681
|
+
ctx.element.style.setProperty('--kai-color-primary', ${JSON.stringify(accent)});${unreadColorSetProperty}
|
|
593
682
|
return (
|
|
594
683
|
<>
|
|
595
684
|
<style>{${JSON.stringify(styleText)}}</style>
|
|
@@ -607,10 +696,11 @@ defineWebComponent('${c.name}', { theme: '${themeMode(c)}' as 'light' | 'dark' |
|
|
|
607
696
|
}
|
|
608
697
|
function emitApp(c) {
|
|
609
698
|
if (c.layout === "custom") return emitCustomApp(c);
|
|
610
|
-
return `${emitSolidJsImport(c)}import { ChatThread, createKaiChat${emitLayoutImport(c)}${emitCardComponentImport(c)}${emitEmptyComponentImport(c)}${emitHeaderCloseImport(c)} } from '@kitn.ai/ui/solid';
|
|
611
|
-
import type { AttachmentData${emitHistoryTypeImport(c)} } from '@kitn.ai/ui/solid';
|
|
699
|
+
return `${emitSolidJsImport(c)}${emitConversationsSignalsImport(c)}import { ChatThread, createKaiChat${emitLayoutImport(c)}${emitCardComponentImport(c)}${emitEmptyComponentImport(c)}${emitHeaderCloseImport(c)} } from '@kitn.ai/ui/solid';
|
|
700
|
+
import type { AttachmentData${emitHistoryTypeImport(c)}${emitConversationsResetTypeImport(c)} } from '@kitn.ai/ui/solid';
|
|
612
701
|
${emitProviderImports(c)}
|
|
613
702
|
${emitCardsImport(c)}
|
|
703
|
+
${emitConversationsImport(c)}
|
|
614
704
|
|
|
615
705
|
${emitProviderSetup(c)}
|
|
616
706
|
${emitHistorySetup(c)}
|
|
@@ -679,9 +769,26 @@ ${emitHistorySetup(c)}
|
|
|
679
769
|
// emitDockCloseVar/emitHeaderEndContentProp's docs. No header means no
|
|
680
770
|
// row for it to sit in, so that case is untouched and Dock's own built-in
|
|
681
771
|
// mobile X keeps covering it.
|
|
772
|
+
// - conversations (Task 5): gated via ChatThread's own \`conversations\`/
|
|
773
|
+
// \`store\` props (kit-owned end to end — the prior-conversations list,
|
|
774
|
+
// list/load/save, autosave on every \`chat.messages()\` change). Requires
|
|
775
|
+
// capabilities.history persistence \`local\` or \`endpoint\` (schema
|
|
776
|
+
// superRefine, C-4) and SUBSUMES this file's hand-rolled history effect
|
|
777
|
+
// when on — see emitHistorySetup's own doc for the persistence-ownership
|
|
778
|
+
// decision: the store prop is the ONLY persistence mechanism emitted,
|
|
779
|
+
// never both. ChatThread never mutates \`messages\` itself, so
|
|
780
|
+
// \`onConversationLoad\` is ALSO wired here (\`chat.setMessages(() =>
|
|
781
|
+
// messages)\`) — without it, select/new/mount-restore all update
|
|
782
|
+
// ChatThread's own internal view/list state while the rendered thread
|
|
783
|
+
// never changes (see emitConversationsProps's own doc for the Task 6
|
|
784
|
+
// live-browser bug this fixes).
|
|
785
|
+
// - conversations + widget (owner follow-up): closing the widget while its
|
|
786
|
+
// list view is open must not leave it there for the next open — see
|
|
787
|
+
// widgetHasConversationsChrome/emitDockOnOpenChangeProp's docs. Wired only
|
|
788
|
+
// for \`widget\`, the one layout with something that closes/reopens at all.
|
|
682
789
|
export function App() {
|
|
683
|
-
${emitDockCloseVar(c, " ")} return (
|
|
684
|
-
${emitLayoutOpen(c)}${emitSlots(c.slots, " ")} <ChatThread messages={chat.messages()} loading={chat.loading()} placeholder="Ask anything" onSubmit={submit} webSearch={false} voice={false}${emitHeaderProp(c)}${emitHeaderEndContentProp(c)}${emitAttachProps(c)}${emitStartersProp(c)}${emitReasoningProp(c)}${emitReasoningOpenProp(c)}${emitEmptyContentProp(c)}${emitCardTypesProp(c)} />
|
|
790
|
+
${emitDockCloseVar(c, " ")}${emitChatControllerVar(c, " ")}${emitConversationsSignalsVar(c, " ")} return (
|
|
791
|
+
${emitLayoutOpen(c)}${emitSlots(c.slots, " ")} <ChatThread messages={chat.messages()} loading={chat.loading()} placeholder="Ask anything" onSubmit={submit} webSearch={false} voice={false}${emitHeaderProp(c)}${emitHeaderEndContentProp(c)}${emitAttachProps(c)}${emitStartersProp(c)}${emitReasoningProp(c)}${emitReasoningOpenProp(c)}${emitEmptyContentProp(c)}${emitCardTypesProp(c)}${emitHomeProp(c)}${emitConversationsProps(c)}${emitChatControllerRefProp(c)}${emitChatThreadUnreadProps(c)} />
|
|
685
792
|
${emitLayoutClose(c)} );
|
|
686
793
|
}
|
|
687
794
|
`;
|
|
@@ -703,8 +810,8 @@ ${emitHistorySetup(c)}
|
|
|
703
810
|
// layout: custom — minimal chrome, no ChatThread/Dock/PaneGroup. The bare
|
|
704
811
|
// spine (Thread + PromptInput) plus the declared slots, positioned by hand so
|
|
705
812
|
// YOU own the surrounding DOM. Capabilities beyond the spine (starters,
|
|
706
|
-
// attachments, reasoning display-mode, reasoningOpen, header.title, empty
|
|
707
|
-
// are NOT wired here in v1 — this file is the eject artifact; add them the
|
|
813
|
+
// attachments, reasoning display-mode, reasoningOpen, header.title, empty,
|
|
814
|
+
// conversations) are NOT wired here in v1 — this file is the eject artifact; add them the
|
|
708
815
|
// way ChatThread composes them (components/chat-thread.tsx in the kit's own
|
|
709
816
|
// source) if this construct needs them on a custom layout.
|
|
710
817
|
export function App() {
|
|
@@ -757,6 +864,40 @@ function emitEmptyComponentImport(c) {
|
|
|
757
864
|
function widgetHasHeaderClose(c) {
|
|
758
865
|
return c.layout === "widget" && !!c.header?.title;
|
|
759
866
|
}
|
|
867
|
+
function widgetHasConversationsChrome(c) {
|
|
868
|
+
return c.layout === "widget" && (!!c.capabilities?.conversations || !!c.home);
|
|
869
|
+
}
|
|
870
|
+
function emitChatControllerVar(c, indent) {
|
|
871
|
+
return widgetHasConversationsChrome(c) ? `${indent}let chatController: ChatThreadController | undefined;
|
|
872
|
+
` : "";
|
|
873
|
+
}
|
|
874
|
+
function emitChatControllerRefProp(c) {
|
|
875
|
+
return widgetHasConversationsChrome(c) ? " controllerRef={(api) => (chatController = api)}" : "";
|
|
876
|
+
}
|
|
877
|
+
function emitDockOnOpenChangeProp(c) {
|
|
878
|
+
return widgetHasConversationsChrome(c) ? " onOpenChange={(open) => { setDockOpen(open); if (!open) chatController?.closeConversationsList(); }}" : "";
|
|
879
|
+
}
|
|
880
|
+
function emitConversationsResetTypeImport(c) {
|
|
881
|
+
return widgetHasConversationsChrome(c) ? ", ChatThreadController" : "";
|
|
882
|
+
}
|
|
883
|
+
function emitConversationsSignalsImport(c) {
|
|
884
|
+
return widgetHasConversationsChrome(c) ? `import { createSignal } from 'solid-js';
|
|
885
|
+
` : "";
|
|
886
|
+
}
|
|
887
|
+
function emitConversationsSignalsVar(c, indent) {
|
|
888
|
+
if (!widgetHasConversationsChrome(c)) return "";
|
|
889
|
+
const w = c.layout === "widget" ? c.widget : void 0;
|
|
890
|
+
const defaultOpen = w?.defaultOpen === true ? "true" : "false";
|
|
891
|
+
return `${indent}const [dockOpen, setDockOpen] = createSignal(${defaultOpen});
|
|
892
|
+
${indent}const [anyUnread, setAnyUnread] = createSignal(false);
|
|
893
|
+
`;
|
|
894
|
+
}
|
|
895
|
+
function emitChatThreadUnreadProps(c) {
|
|
896
|
+
return widgetHasConversationsChrome(c) ? " hostOpen={dockOpen()} onUnreadChange={setAnyUnread}" : "";
|
|
897
|
+
}
|
|
898
|
+
function emitDockUnreadProp(c) {
|
|
899
|
+
return widgetHasConversationsChrome(c) ? " unread={anyUnread()}" : "";
|
|
900
|
+
}
|
|
760
901
|
function emitDockCloseVar(c, indent) {
|
|
761
902
|
return widgetHasHeaderClose(c) ? `${indent}let dockClose: (() => void) | undefined;
|
|
762
903
|
` : "";
|
|
@@ -792,15 +933,30 @@ function emitReasoningProp(c) {
|
|
|
792
933
|
function emitReasoningOpenProp(c) {
|
|
793
934
|
return c.capabilities?.reasoningOpen === true ? " reasoningOpen={true}" : "";
|
|
794
935
|
}
|
|
936
|
+
function emitHomeProp(c) {
|
|
937
|
+
if (!c.home) return "";
|
|
938
|
+
return ` home={${JSON.stringify(c.home)}}`;
|
|
939
|
+
}
|
|
940
|
+
function emitConversationsProps(c) {
|
|
941
|
+
if (!c.capabilities?.conversations) return "";
|
|
942
|
+
const history = c.capabilities.history;
|
|
943
|
+
const storeCall = history?.persistence === "endpoint" ? `fetchStore(${JSON.stringify(history.url)}${c.userId ? `, ${JSON.stringify(c.userId)}` : ""})` : `localStorageStore('${c.name}'${c.userId ? `, ${JSON.stringify(c.userId)}` : ""})`;
|
|
944
|
+
return ` conversations={true} store={${storeCall}} onConversationLoad={(messages) => chat.setMessages(() => messages)}`;
|
|
945
|
+
}
|
|
946
|
+
function emitConversationsImport(c) {
|
|
947
|
+
if (!c.capabilities?.conversations) return "";
|
|
948
|
+
const name = c.capabilities.history?.persistence === "endpoint" ? "fetchStore" : "localStorageStore";
|
|
949
|
+
return `import { ${name} } from '@kitn.ai/ui/solid';`;
|
|
950
|
+
}
|
|
795
951
|
function emitSolidJsImport(c) {
|
|
796
952
|
const history = c.capabilities?.history;
|
|
797
|
-
if (!history || history.persistence === "none") return "";
|
|
953
|
+
if (!history || history.persistence === "none" || c.layout !== "custom" && c.capabilities?.conversations) return "";
|
|
798
954
|
return `import { createEffect } from 'solid-js';
|
|
799
955
|
`;
|
|
800
956
|
}
|
|
801
957
|
function emitHistoryTypeImport(c) {
|
|
802
958
|
const history = c.capabilities?.history;
|
|
803
|
-
if (!history || history.persistence === "none") return "";
|
|
959
|
+
if (!history || history.persistence === "none" || c.layout !== "custom" && c.capabilities?.conversations) return "";
|
|
804
960
|
return ", ChatMessage";
|
|
805
961
|
}
|
|
806
962
|
function emitUserIdHeaderEntry(c) {
|
|
@@ -809,6 +965,7 @@ function emitUserIdHeaderEntry(c) {
|
|
|
809
965
|
function emitHistorySetup(c) {
|
|
810
966
|
const history = c.capabilities?.history;
|
|
811
967
|
if (!history || history.persistence === "none") return "";
|
|
968
|
+
if (c.layout !== "custom" && c.capabilities?.conversations) return "";
|
|
812
969
|
if (history.persistence === "local") {
|
|
813
970
|
const key = JSON.stringify(c.userId ? `kai:${c.name}:${c.userId}:thread` : `kai:${c.name}:thread`);
|
|
814
971
|
return `
|
|
@@ -947,7 +1104,7 @@ async function submit(detail: { value: string; attachments: AttachmentData[] })
|
|
|
947
1104
|
function emitLayoutImport(c) {
|
|
948
1105
|
switch (c.layout) {
|
|
949
1106
|
case "widget":
|
|
950
|
-
return ",
|
|
1107
|
+
return `, Dock${hasLauncherIcon(c) ? ", DockLauncherImage" : ""}`;
|
|
951
1108
|
case "split":
|
|
952
1109
|
return ", WorkspaceShell";
|
|
953
1110
|
case "fullscreen":
|
|
@@ -966,10 +1123,13 @@ function emitDockPosition(c) {
|
|
|
966
1123
|
const w = c.layout === "widget" ? c.widget : void 0;
|
|
967
1124
|
return w?.position ? ` position="${w.position}"` : "";
|
|
968
1125
|
}
|
|
1126
|
+
function hasLauncherIcon(c) {
|
|
1127
|
+
return c.layout === "widget" && !!c.widget?.launcherIcon;
|
|
1128
|
+
}
|
|
969
1129
|
function emitDockLauncher(c) {
|
|
970
1130
|
const w = c.layout === "widget" ? c.widget : void 0;
|
|
971
1131
|
if (!w?.launcherIcon) return "";
|
|
972
|
-
return ` launcher={<
|
|
1132
|
+
return ` launcher={<DockLauncherImage src={${JSON.stringify(w.launcherIcon)}} />}`;
|
|
973
1133
|
}
|
|
974
1134
|
function emitDockDefaultOpen(c) {
|
|
975
1135
|
const w = c.layout === "widget" ? c.widget : void 0;
|
|
@@ -978,7 +1138,7 @@ function emitDockDefaultOpen(c) {
|
|
|
978
1138
|
function emitLayoutOpen(c) {
|
|
979
1139
|
switch (c.layout) {
|
|
980
1140
|
case "widget":
|
|
981
|
-
return ` <Dock label="${c.name}"${emitDockPosition(c)}${emitDockLauncher(c)}${emitDockDefaultOpen(c)}${emitDockHideClose(c)}${emitDockControllerRef(c)}>
|
|
1141
|
+
return ` <Dock label="${c.name}"${emitDockPosition(c)}${emitDockLauncher(c)}${emitDockDefaultOpen(c)}${emitDockHideClose(c)}${emitDockControllerRef(c)}${emitDockOnOpenChangeProp(c)}${emitDockUnreadProp(c)}>
|
|
982
1142
|
`;
|
|
983
1143
|
case "fullscreen":
|
|
984
1144
|
return ` <div style={{ height: '100dvh', display: 'flex', 'flex-direction': 'column' }}>
|
|
@@ -1051,13 +1211,19 @@ function writeProject(files, dir) {
|
|
|
1051
1211
|
return overwritten;
|
|
1052
1212
|
}
|
|
1053
1213
|
const defaultIo = { log: (s) => console.log(s), error: (s) => console.error(s) };
|
|
1054
|
-
const USAGE = `usage: kai <command
|
|
1214
|
+
const USAGE = `usage: npx @kitn.ai/ui <command> (or \`kai <command>\` once @kitn.ai/ui is installed)
|
|
1055
1215
|
|
|
1056
1216
|
kai validate <construct.json> check a construct, print problems with paths
|
|
1057
1217
|
kai eject <construct.json> <outDir> write the generated Solid project (it's yours)
|
|
1058
|
-
kai dev <construct.json> live preview with reload-on-edit
|
|
1059
|
-
kai compile <construct.json> [outDir] one self-registering .js
|
|
1218
|
+
kai dev <construct.json> live preview with reload-on-edit
|
|
1219
|
+
kai compile <construct.json> [outDir] one self-registering .js
|
|
1060
1220
|
`;
|
|
1221
|
+
function homeRecentConversationWarning(construct) {
|
|
1222
|
+
if (construct.home?.recentConversation && !construct.capabilities?.conversations) {
|
|
1223
|
+
return "warning: home.recentConversation is set but capabilities.conversations is not — the recent-conversation card will render nothing without it.";
|
|
1224
|
+
}
|
|
1225
|
+
return null;
|
|
1226
|
+
}
|
|
1061
1227
|
function loadConstruct(path, io) {
|
|
1062
1228
|
const abs = resolve(path);
|
|
1063
1229
|
let raw;
|
|
@@ -1095,6 +1261,8 @@ async function runCli(argv, io = defaultIo) {
|
|
|
1095
1261
|
const construct = loadConstruct(rest[0] ?? "", io);
|
|
1096
1262
|
if (!construct) return 1;
|
|
1097
1263
|
io.log(`valid construct: <${construct.name}> (layout: ${construct.layout}, provider: ${construct.provider.mode})`);
|
|
1264
|
+
const warning = homeRecentConversationWarning(construct);
|
|
1265
|
+
if (warning) io.log(warning);
|
|
1098
1266
|
return 0;
|
|
1099
1267
|
}
|
|
1100
1268
|
case "eject": {
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// GENERATED by scripts/emit-subpath-dts.mjs — do not edit.
|
|
2
|
+
// Sibling declarations for dist/construct.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 './agent-tooling/construct/public.js';
|