@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
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import ts from 'typescript';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* The `Labs/…` title a story file REGISTERS: the `title` property of its
|
|
5
|
-
* default-exported meta object, parsed rather than matched.
|
|
6
|
-
*
|
|
7
|
-
* ★ WHY IT IS SPELLED THAT PRECISELY. Three text-based versions of this question
|
|
8
|
-
* shipped and each was defeated, and the fourth — a parse that was still too
|
|
9
|
-
* broad — was defeated too:
|
|
10
|
-
*
|
|
11
|
-
* 1. A raw regex over file text counted PROSE as a registration. Renaming every
|
|
12
|
-
* real `Labs/Proofs` meta title across all six proof-*.stories.tsx left the
|
|
13
|
-
* `Proofs` inventory row resolving, kept alive by one comment.
|
|
14
|
-
* 2. A hand-rolled comment stripper fixed that and introduced a worse bug. JSX
|
|
15
|
-
* text like `Don't have an account?` put the scanner into single-quote state,
|
|
16
|
-
* which it never left, so every `//` after it survived stripping. Live in
|
|
17
|
-
* three story files; appending ONE comment line to one of them made an
|
|
18
|
-
* invented `GHOSTPROBE` row resolve at exit 0.
|
|
19
|
-
* 3. The equivalence guard between the two copies of that stripper could not
|
|
20
|
-
* see it: both carried the identical bug, so they agreed perfectly.
|
|
21
|
-
* 4. Parsing every `title:` in the file — the first version of THIS function —
|
|
22
|
-
* was still wrong. A `title` nested in a story's `args` is not a
|
|
23
|
-
* registration: `export const S = { args: { title: 'Labs/Apps' } };` in a
|
|
24
|
-
* non-app story conjured a phantom app that satisfied this lint and
|
|
25
|
-
* surfaces.test.ts together, with no comment involved at all.
|
|
26
|
-
*
|
|
27
|
-
* So the rule is the meta's own `title`, and nothing else. Comments are TRIVIA
|
|
28
|
-
* and never nodes; apostrophes, escapes and template literals are the real
|
|
29
|
-
* lexer's problem; and a title that is not the meta's is not a registration.
|
|
30
|
-
* Single-quoted, double-quoted and untemplated-backtick spellings are all read.
|
|
31
|
-
*
|
|
32
|
-
* REGISTERED COPY: `scripts/lint-catalog-drift.mjs` carries an equivalent
|
|
33
|
-
* `readLabsTitles`, because a Node `.mjs` cannot import a `.ts` at runtime.
|
|
34
|
-
* `tests/scripts/catalog-drift-guard-wiring.test.ts` imports both and asserts
|
|
35
|
-
* they agree over every story file in the tree plus adversarial inputs. Note
|
|
36
|
-
* what that guard is worth: it catches DIVERGENCE, and it is blind by
|
|
37
|
-
* construction to a bug both copies share — it stayed green through defects 2
|
|
38
|
-
* AND 4 above, both of which were present in both copies at once.
|
|
39
|
-
*/
|
|
40
|
-
export function readLabsTitles(text: string, fileName = 'story.tsx'): string[] {
|
|
41
|
-
// ScriptKind BY EXTENSION. Parsing a `.stories.ts` as TSX loses every title
|
|
42
|
-
// after a `<number>x` cast or a bare `<T>(x) => x` generic arrow, because
|
|
43
|
-
// neither is valid TSX. tsc parses that file as TS, accepts it and stays
|
|
44
|
-
// green, so typecheck does NOT contain this one — the lint would silently
|
|
45
|
-
// drop the registration on a file CI calls fine. storyExtensions() already
|
|
46
|
-
// admits `.ts` because the Storybook glob does.
|
|
47
|
-
const kind = fileName.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS;
|
|
48
|
-
const source = ts.createSourceFile(fileName, text, ts.ScriptTarget.Latest, false, kind);
|
|
49
|
-
const meta = metaObject(source);
|
|
50
|
-
if (!meta) return [];
|
|
51
|
-
const titles: string[] = [];
|
|
52
|
-
for (const prop of meta.properties) {
|
|
53
|
-
if (!ts.isPropertyAssignment(prop)) continue;
|
|
54
|
-
const key = ts.isIdentifier(prop.name) || ts.isStringLiteral(prop.name) ? prop.name.text : undefined;
|
|
55
|
-
if (key !== 'title') continue;
|
|
56
|
-
const init = prop.initializer;
|
|
57
|
-
if (ts.isStringLiteral(init) || ts.isNoSubstitutionTemplateLiteral(init)) {
|
|
58
|
-
if (init.text.startsWith('Labs/')) titles.push(init.text);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return titles;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* The story file's DEFAULT-EXPORTED meta object, or null.
|
|
66
|
-
*
|
|
67
|
-
* Walking every `title:` in the file was the narrower defect: a `title` nested
|
|
68
|
-
* in a story's `args` is not a registration, and Storybook never reads it as
|
|
69
|
-
* one. Measured before this existed, both exit 0:
|
|
70
|
-
* `export const GhostProbeStory = { args: { title: 'Labs/GHOSTPROBE' } };`
|
|
71
|
-
* made an invented inventory row resolve, and the `Labs/Apps` spelling of the
|
|
72
|
-
* same shape produced a PHANTOM app that satisfied the lint and
|
|
73
|
-
* surfaces.test.ts together — the exact both-sides-green shape this guard
|
|
74
|
-
* exists to prevent, reached without a single comment.
|
|
75
|
-
*
|
|
76
|
-
* Restricting to the meta is a measured NO-OP on the clean tree: the title set
|
|
77
|
-
* and the nine `Labs/Apps` files are identical by set difference in both
|
|
78
|
-
* directions.
|
|
79
|
-
*
|
|
80
|
-
* Handles the two shapes in the tree and their wrappers:
|
|
81
|
-
* `const meta = {…} satisfies Meta; export default meta;` and
|
|
82
|
-
* `export default {…} as Meta;`
|
|
83
|
-
* `satisfies`, `as` and parentheses are unwrapped. An angle-bracket assertion
|
|
84
|
-
* (`export default <Meta>{…}`) deliberately is NOT: every story file is parsed
|
|
85
|
-
* as TSX, where `<Meta>{…}` is JSX and never a type assertion, so a branch for
|
|
86
|
-
* it would be dead code. Measured: that spelling returns []. It is also not a
|
|
87
|
-
* spelling any story in the tree uses.
|
|
88
|
-
*/
|
|
89
|
-
function metaObject(source: ts.SourceFile): ts.ObjectLiteralExpression | null {
|
|
90
|
-
const unwrap = (expr: ts.Expression | undefined): ts.Expression | undefined => {
|
|
91
|
-
let cur = expr;
|
|
92
|
-
while (
|
|
93
|
-
cur &&
|
|
94
|
-
(ts.isAsExpression(cur) || ts.isSatisfiesExpression(cur) || ts.isParenthesizedExpression(cur))
|
|
95
|
-
) {
|
|
96
|
-
cur = cur.expression;
|
|
97
|
-
}
|
|
98
|
-
return cur;
|
|
99
|
-
};
|
|
100
|
-
const topLevel = new Map<string, ts.Expression>();
|
|
101
|
-
let defaultExport: ts.Expression | undefined;
|
|
102
|
-
for (const stmt of source.statements) {
|
|
103
|
-
if (ts.isVariableStatement(stmt)) {
|
|
104
|
-
for (const d of stmt.declarationList.declarations) {
|
|
105
|
-
if (ts.isIdentifier(d.name) && d.initializer) topLevel.set(d.name.text, d.initializer);
|
|
106
|
-
}
|
|
107
|
-
} else if (ts.isExportAssignment(stmt) && !stmt.isExportEquals) {
|
|
108
|
-
defaultExport = stmt.expression;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
let expr = unwrap(defaultExport);
|
|
112
|
-
if (expr && ts.isIdentifier(expr)) expr = unwrap(topLevel.get(expr.text));
|
|
113
|
-
return expr && ts.isObjectLiteralExpression(expr) ? expr : null;
|
|
114
|
-
}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { Scenario, type TScenario } from './catalog-types';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* The acceptance deck, spec §6. Normative: written BEFORE the catalog so the
|
|
6
|
-
* catalog is built toward a measurement. The harness gives an agent the catalog
|
|
7
|
-
* and NO kit source; whatever it cannot build names what the catalog is missing.
|
|
8
|
-
*/
|
|
9
|
-
export const scenarios: TScenario[] = [
|
|
10
|
-
{
|
|
11
|
-
id: 'S1',
|
|
12
|
-
prompt:
|
|
13
|
-
'I already have <kai-chat> in my React app. Add a conversations sidebar and let assistant replies open artifacts in a side panel.',
|
|
14
|
-
needs: ['composition validity', 'wiring topology', 'invariant:reactivity-two-halves'],
|
|
15
|
-
depth: 'surface recipe applied to an existing tree',
|
|
16
|
-
scoring: [
|
|
17
|
-
'emitted code compiles under the react consumer tsc project',
|
|
18
|
-
'kai-conversations and kai-artifact register and render',
|
|
19
|
-
'kai-conversation-select wiring updates kai-chat.messages with a new array AND new changed-item objects',
|
|
20
|
-
],
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
id: 'S2',
|
|
24
|
-
prompt:
|
|
25
|
-
'Add an AI chat to this Vue app. Messages stream from our existing /api/chat endpoint that speaks OpenAI SSE.',
|
|
26
|
-
needs: ['ingredient contracts', 'invariant:kit-parses-consumer-fetches', 'backend: consumer-owned endpoint'],
|
|
27
|
-
depth: 'greenfield, contract',
|
|
28
|
-
scoring: [
|
|
29
|
-
'imports readOpenAIStream from @kitn.ai/ui/wire; no hand-rolled SSE reader anywhere in the output',
|
|
30
|
-
'streams correctly against a mock OpenAI-SSE wire fixture',
|
|
31
|
-
'compiles under the vue consumer path',
|
|
32
|
-
],
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
id: 'S3',
|
|
36
|
-
prompt: 'Give the prompt input slash-commands and voice, like your command palette demo.',
|
|
37
|
-
needs: ['ingredient configuration space', 'function-valued property contract (transcribe)'],
|
|
38
|
-
depth: 'capability',
|
|
39
|
-
scoring: [
|
|
40
|
-
'transcribe is set as a function-valued JS property, not an attribute',
|
|
41
|
-
'the slash-command trigger is wired per the ingredient contract',
|
|
42
|
-
],
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
id: 'S4',
|
|
46
|
-
prompt: 'Build me a Perplexity-style research UI: sources, reasoning panel, follow-up suggestions.',
|
|
47
|
-
needs: ['surface recipes'],
|
|
48
|
-
depth: 'whole surface; expected to fail hardest first',
|
|
49
|
-
scoring: ['human eyeball against the perplexity Labs/App story', 'compiles and registers'],
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
id: 'S5',
|
|
53
|
-
prompt:
|
|
54
|
-
"I'm on WordPress. No build step. Give me a script tag for a support chat widget that talks to my service at https://example.com/chat.",
|
|
55
|
-
needs: ['delivery target: script-tag', 'invariant:upgrade-race', 'widget recipe', 'backend: consumer-owned endpoint'],
|
|
56
|
-
depth: 'platform embed',
|
|
57
|
-
scoring: [
|
|
58
|
-
'script-tag only, no bundler assumed',
|
|
59
|
-
'the output acknowledges the upgrade race per the open invariant (props set after registration, or the documented gate)',
|
|
60
|
-
'human eyeball in a plain HTML page',
|
|
61
|
-
],
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
id: 'S6',
|
|
65
|
-
prompt: 'Add a spreadsheet-grid message type showing live cell edits.',
|
|
66
|
-
needs: ['the honesty bound: refuse what is not composable from these parts'],
|
|
67
|
-
depth: 'refusal',
|
|
68
|
-
scoring: [
|
|
69
|
-
'the agent refuses loudly, naming that no such element exists, instead of inventing <kai-datagrid>',
|
|
70
|
-
'no fabricated tag appears in the output',
|
|
71
|
-
],
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
id: 'S7',
|
|
75
|
-
prompt: 'My messages render but nothing updates while streaming.',
|
|
76
|
-
needs: ['invariant diagnosis fields'],
|
|
77
|
-
depth: 'debugging',
|
|
78
|
-
scoring: [
|
|
79
|
-
'the answer identifies the reactivity-two-halves cause: same array reference, or same item object identity',
|
|
80
|
-
'the fix it proposes matches the invariant statement',
|
|
81
|
-
],
|
|
82
|
-
},
|
|
83
|
-
];
|
|
84
|
-
|
|
85
|
-
export function listScenarios(): TScenario[] {
|
|
86
|
-
return z.array(Scenario).parse(scenarios);
|
|
87
|
-
}
|
|
@@ -1,347 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import {
|
|
3
|
-
InventoryEntry,
|
|
4
|
-
PartConsumption,
|
|
5
|
-
SurfaceRecipe,
|
|
6
|
-
type TInventoryEntry,
|
|
7
|
-
type TPartConsumption,
|
|
8
|
-
type TSurfaceRecipe,
|
|
9
|
-
} from './catalog-types';
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Spec §4's sort, as records. Criterion: a surface is product-shaped, something
|
|
13
|
-
* a user could be handed, proven end-to-end by a Labs/App or deployable alone;
|
|
14
|
-
* an ingredient exists only inside something else; fixtures and proofs are
|
|
15
|
-
* corpus (tests), not catalog entries.
|
|
16
|
-
*
|
|
17
|
-
* TWO SENSES OF "CORPUS", and they are not the same thing. Here it is a `sort`:
|
|
18
|
-
* this entry is a fixture or a proof, so it is test material rather than a
|
|
19
|
-
* catalog entry. On a SurfaceRecipe, `corpus:` is a list of repo PATHS that
|
|
20
|
-
* demonstrate the recipe. A story can be both — `split-workspace` is sorted
|
|
21
|
-
* `surface` in this inventory and also appears in a recipe's `corpus:` array,
|
|
22
|
-
* which is coherent (a product-shaped surface is exactly what demonstrates a
|
|
23
|
-
* recipe) but reads as a contradiction if you join the two on the word. A
|
|
24
|
-
* packer must key on `sort === 'corpus'` and on `recipe.corpus` separately.
|
|
25
|
-
*
|
|
26
|
-
* Every `title` is a real Storybook title segment under `Labs/` — the app names
|
|
27
|
-
* are the `Labs/Apps` story FILENAMES, the rest are `title: 'Labs/<x>'` values
|
|
28
|
-
* under src/ (note: NOT all under src/elements/ — Settings lives in src/ui/ and
|
|
29
|
-
* Audio Visualizers under src/components/, so a check scoped to src/elements/
|
|
30
|
-
* alone would wrongly flag them).
|
|
31
|
-
*
|
|
32
|
-
* WHAT IS ENFORCED TODAY, in the present tense. Every claim below was measured
|
|
33
|
-
* by mutation in both directions, not reasoned from reading the guards.
|
|
34
|
-
*
|
|
35
|
-
* EVERY ROW IS RESOLVED AGAINST THE TREE. `lint:catalog-drift` (required CI,
|
|
36
|
-
* needs no build) requires each title to match a Labs story title or a
|
|
37
|
-
* `Labs/Apps` story filename on disk. Misspell ANY row -- tier is irrelevant --
|
|
38
|
-
* and CI fails by name: `Settings` -> `Settingss` gives
|
|
39
|
-
* `inventory: "Settingss" matches no Labs story title or Labs/Apps story file in
|
|
40
|
-
* the tree.` That closes what an earlier version of this comment called
|
|
41
|
-
* "GENUINELY UNCHECKED", and the earlier text is worth remembering as a defect
|
|
42
|
-
* in its own right: it survived the guard landing and went on telling every
|
|
43
|
-
* maintainer that the coverage did not exist, which is how someone ends up
|
|
44
|
-
* rebuilding it.
|
|
45
|
-
*
|
|
46
|
-
* WHAT RESOLUTION DOES NOT COVER IS DELETION, because the check runs row -> tree
|
|
47
|
-
* and a deleted row asks nothing of the tree. The other direction is covered
|
|
48
|
-
* unevenly, and this is the part to read before deleting anything:
|
|
49
|
-
*
|
|
50
|
-
* 1. `surface` rows naming a `Labs/Apps` story FILE -- deletion FAILS
|
|
51
|
-
* surfaces.test.ts, which reads those filenames off disk and requires each
|
|
52
|
-
* to have a row sorted `surface`. Covered in both directions.
|
|
53
|
-
* 2. `Proofs`, `Chat Slots`, `Prompt Input Slots`, `Workspace Slots` --
|
|
54
|
-
* deletion FAILS surfaces.test.ts, which asserts those four exact titles are
|
|
55
|
-
* present and sorted `corpus`. That list is a literal copy of these four
|
|
56
|
-
* titles living inside the test; changing one means changing both.
|
|
57
|
-
* 3. Every remaining row -- deletion PASSES everything. Measured: removing the
|
|
58
|
-
* `Settings` row leaves both surfaces.test.ts and lint:catalog-drift green.
|
|
59
|
-
* This is the one real gap, and the lint's own honesty item 8 states it.
|
|
60
|
-
*
|
|
61
|
-
* Each row's tier is decided by which test in surfaces.test.ts covers it, so
|
|
62
|
-
* read that file, not this list, if they drift.
|
|
63
|
-
*/
|
|
64
|
-
export const inventory: TInventoryEntry[] = [
|
|
65
|
-
{ title: 'claude-code', sort: 'surface', note: 'Labs/App, end-to-end composition' },
|
|
66
|
-
{ title: 'chatgpt', sort: 'surface', note: 'Labs/App, end-to-end composition' },
|
|
67
|
-
{ title: 'codex', sort: 'surface', note: 'Labs/App, end-to-end composition' },
|
|
68
|
-
{ title: 't3code', sort: 'surface', note: 'Labs/App, end-to-end composition' },
|
|
69
|
-
{ title: 'perplexity', sort: 'surface', note: 'Labs/App, end-to-end composition' },
|
|
70
|
-
{ title: 'perplexity-pro', sort: 'surface', note: 'Labs/App, end-to-end composition' },
|
|
71
|
-
{ title: 'v0', sort: 'surface', note: 'Labs/App, end-to-end composition' },
|
|
72
|
-
{ title: 'wisp', sort: 'surface', note: 'Labs/App, end-to-end composition' },
|
|
73
|
-
{ title: 'lovable', sort: 'surface', note: 'Labs/App, end-to-end composition' },
|
|
74
|
-
{ title: 'split-workspace', sort: 'surface', note: 'Labs/App, end-to-end composition' },
|
|
75
|
-
{ title: 'Workspace Home', sort: 'surface', note: 'the workspace preset' },
|
|
76
|
-
{ title: 'Message Thread', sort: 'ingredient', note: 'the keystone of the composition-first direction (kai-thread)' },
|
|
77
|
-
{ title: 'Composer', sort: 'ingredient', note: 'rich input, lives inside a surface' },
|
|
78
|
-
{ title: 'Command', sort: 'ingredient', note: 'palette, summoned inside something' },
|
|
79
|
-
{ title: 'Menu', sort: 'ingredient', note: 'menu primitive' },
|
|
80
|
-
{ title: 'User Menu', sort: 'ingredient', note: 'account affordance inside a surface' },
|
|
81
|
-
{ title: 'Settings', sort: 'ingredient', note: 'a panel, not a product' },
|
|
82
|
-
{ title: 'Onboarding checklist', sort: 'ingredient', note: 'lives inside a surface' },
|
|
83
|
-
{ title: 'Conversations Collapse', sort: 'ingredient', note: 'behavior of a part' },
|
|
84
|
-
{ title: 'Resizable Collapsed', sort: 'ingredient', note: 'behavior of a part' },
|
|
85
|
-
{ title: 'Audio Visualizers', sort: 'ingredient', note: 'voice affordance inside a surface' },
|
|
86
|
-
{ title: 'Card', sort: 'ingredient', note: 'generative-UI cards arrive as tool calls (settled)' },
|
|
87
|
-
{
|
|
88
|
-
title: 'Foundations',
|
|
89
|
-
sort: 'ingredient',
|
|
90
|
-
note: 'atoms: Input, Search, Kbd, Nav, Tabs, Status, Screen, Progress Bar, Coachmark, EditableLabel, Voice output',
|
|
91
|
-
},
|
|
92
|
-
{ title: 'Chat Slots', sort: 'corpus', note: 'fixture proving kai-chat injection seams' },
|
|
93
|
-
{ title: 'Prompt Input Slots', sort: 'corpus', note: 'fixture proving prompt-input seams' },
|
|
94
|
-
{ title: 'Workspace Slots', sort: 'corpus', note: 'fixture proving workspace injection seams' },
|
|
95
|
-
{ title: 'Proofs', sort: 'corpus', note: 'tests by construction' },
|
|
96
|
-
];
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Two recipes: one per delivery target. Between them they instance every
|
|
100
|
-
* invariant, which is what makes the drift lint's checks non-vacuous. Further
|
|
101
|
-
* recipes are added through acceptance-run iteration, each proven against a
|
|
102
|
-
* scenario before it lands.
|
|
103
|
-
*
|
|
104
|
-
* EVERY `wiring` edge below is EXECUTED in surfaces.test.ts against the real
|
|
105
|
-
* registered elements in jsdom — the event is fired the way a user fires it,
|
|
106
|
-
* the named property is assigned, and the effect is asserted in the shadow DOM.
|
|
107
|
-
* Name resolution against derived.json proves an event and a property EXIST; it
|
|
108
|
-
* does not prove the edge works, and that gap is where a plausible falsehood
|
|
109
|
-
* would live. Add an edge here only with a probe beside it.
|
|
110
|
-
*/
|
|
111
|
-
export const surfaceRecipes: TSurfaceRecipe[] = [
|
|
112
|
-
{
|
|
113
|
-
id: 'workspace-chat',
|
|
114
|
-
intent:
|
|
115
|
-
'Full-screen chat with a conversations sidebar; assistant replies can open artifacts in a resizable side panel.',
|
|
116
|
-
archetypes: ['full-screen'],
|
|
117
|
-
targets: ['bundler'],
|
|
118
|
-
ingredients: ['kai-chat', 'kai-conversations', 'kai-resizable', 'kai-artifact'],
|
|
119
|
-
backend: { endpoint: 'consumer-owned', reader: 'readModelStream' },
|
|
120
|
-
// WHERE the parts go, which the wiring edges below never said. Until this
|
|
121
|
-
// field existed a builder could read the whole recipe, the whole element
|
|
122
|
-
// reference and the whole scaffold and still not know whether the rail was a
|
|
123
|
-
// child of the chat or a sibling beside it — and the two answers lay out
|
|
124
|
-
// differently, so it is not a detail anyone can defer. One agent building
|
|
125
|
-
// from the MCP said so in as many words and then guessed.
|
|
126
|
-
//
|
|
127
|
-
// Slotted, and the tree decided it rather than taste: `<kai-chat>` declares a
|
|
128
|
-
// `sidebar` slot whose own description is "Left column (your nav /
|
|
129
|
-
// conversation list). Fixed width; use compose-your-own for resizable", and
|
|
130
|
-
// this recipe's own corpus story — chat-slots.stories.tsx — composes exactly
|
|
131
|
-
// `<kai-conversations slot="sidebar">` inside `<kai-chat>`.
|
|
132
|
-
//
|
|
133
|
-
// THE TREE ALSO PUBLISHES THE OTHER ANSWER, and an earlier version of this
|
|
134
|
-
// comment claimed it did not ("nothing in the tree composes them as
|
|
135
|
-
// siblings") — asserted without looking, which is the same defect as the
|
|
136
|
-
// over-generous `note` below it. The docs put the pair side by side in at
|
|
137
|
-
// least five places: guides/frameworks/html.mdx, svelte.mdx (a section
|
|
138
|
-
// titled "Add a conversation sidebar"), angular.mdx, vue.mdx, and
|
|
139
|
-
// examples/knowledge-base.mdx with its live demo. Every one of them is a
|
|
140
|
-
// layout the CONSUMER owns — a flex row they write, or `<kai-resizable>` —
|
|
141
|
-
// which is the compose-your-own path the slot's own description points at,
|
|
142
|
-
// and is what you want when the rail must resize. So the two are not in
|
|
143
|
-
// conflict about what is legal; this record says which one the RECIPE is,
|
|
144
|
-
// and the docs currently present the sibling form without saying that.
|
|
145
|
-
composition: [
|
|
146
|
-
{
|
|
147
|
-
child: 'kai-conversations',
|
|
148
|
-
parent: 'kai-chat',
|
|
149
|
-
slot: 'sidebar',
|
|
150
|
-
// Every clause here is checked against chat-thread.tsx, not inferred
|
|
151
|
-
// from the slot's name. The shell's whole sidebar implementation is one
|
|
152
|
-
// `<aside part="sidebar" class="flex w-64 shrink-0 …">` around a
|
|
153
|
-
// `<slot name="sidebar" />`: fixed width, no responsive class in the
|
|
154
|
-
// file, no collapse logic, and `<kai-chat>` never listens for
|
|
155
|
-
// `kai-collapse-toggle`. Collapse belongs to the rail
|
|
156
|
-
// (`collapsed`/`collapse()`), and conversation-list.tsx says so in as
|
|
157
|
-
// many words: "the host owns the surrounding region". A note that
|
|
158
|
-
// credited the shell with collapse and a breakpoint would send a builder
|
|
159
|
-
// into a 16rem empty column holding a floating reopen button.
|
|
160
|
-
note: 'the rail is a light-DOM child of <kai-chat> carrying slot="sidebar", not a sibling: the shell renders it into its own ::part(sidebar) aside, a FIXED-WIDTH column (w-64 in chat-thread.tsx, exposed as a part so you can restyle it) — and that is the whole of what the shell does. Collapse is the RAIL\'s own (collapsed / collapse() / kai-collapse-toggle) and <kai-chat> does not react to it, so a collapsed rail leaves the column at its fixed width; there is no responsive behaviour here either. Give the rail height (display:block;height:100%) and drive it through its own JS properties — being slotted changes where it renders, never how it is wired. If the COLUMN itself has to collapse, resize or respond to width, that is the <kai-workspace> layout shell (its start aside: startCollapsed / collapseBelow / drawer-below, widths via the --kai-workspace-start-* custom properties) or a layout you own',
|
|
161
|
-
},
|
|
162
|
-
],
|
|
163
|
-
wiring: [
|
|
164
|
-
{
|
|
165
|
-
from: 'kai-conversations',
|
|
166
|
-
event: 'kai-conversation-select',
|
|
167
|
-
to: 'kai-chat',
|
|
168
|
-
property: 'messages',
|
|
169
|
-
note: 'detail is {id}; the host looks the thread up and assigns it — a new array AND a new object per changed item (reactivity-two-halves)',
|
|
170
|
-
},
|
|
171
|
-
{
|
|
172
|
-
from: 'kai-conversations',
|
|
173
|
-
event: 'kai-new-chat',
|
|
174
|
-
to: 'kai-chat',
|
|
175
|
-
property: 'messages',
|
|
176
|
-
note: 'detail is empty by design; the event is the whole signal and the host resets to an empty thread',
|
|
177
|
-
},
|
|
178
|
-
{
|
|
179
|
-
from: 'kai-chat',
|
|
180
|
-
event: 'kai-submit',
|
|
181
|
-
to: 'kai-chat',
|
|
182
|
-
property: 'messages',
|
|
183
|
-
note: 'host reads event.detail.value, appends the user turn, streams the reply through the wire reader onto parts[]',
|
|
184
|
-
},
|
|
185
|
-
{
|
|
186
|
-
from: 'kai-artifact',
|
|
187
|
-
event: 'kai-maximize-change',
|
|
188
|
-
to: 'kai-resizable',
|
|
189
|
-
property: 'maximizedIndex',
|
|
190
|
-
note: 'detail is {maximized}, NOT an index: the host knows which panel holds the artifact and mirrors the boolean onto that index (null to restore). Only needed when the panel is not an ancestor — an artifact INSIDE a kai-resizable-item already drives it through the bubbling kai-maximize-intent protocol, with no host code at all',
|
|
191
|
-
},
|
|
192
|
-
],
|
|
193
|
-
invariants: [
|
|
194
|
-
'reactivity-two-halves',
|
|
195
|
-
'props-not-attributes',
|
|
196
|
-
'events-non-bubbling',
|
|
197
|
-
'host-coordinates',
|
|
198
|
-
'kit-parses-consumer-fetches',
|
|
199
|
-
'untrusted-model-output',
|
|
200
|
-
],
|
|
201
|
-
// No single story composes all four ingredients, so the corpus names what
|
|
202
|
-
// each half is really proven by rather than one path that only half applies:
|
|
203
|
-
// chat-slots composes kai-chat with kai-conversations, split-workspace
|
|
204
|
-
// composes kai-resizable with kai-artifact, and surfaces.test.ts is where
|
|
205
|
-
// the four wiring edges above are actually executed.
|
|
206
|
-
corpus: [
|
|
207
|
-
'packages/ui/src/elements/chat-slots.stories.tsx',
|
|
208
|
-
'packages/ui/src/elements/split-workspace.stories.tsx',
|
|
209
|
-
'packages/ui/src/agent-tooling/catalog/surfaces.test.ts',
|
|
210
|
-
],
|
|
211
|
-
},
|
|
212
|
-
{
|
|
213
|
-
// The script-tag instance. Without it, DeliveryTarget 'script-tag' and the
|
|
214
|
-
// whole upgrade-race invariant exist in the schema with no recipe using
|
|
215
|
-
// them, and S5 has nothing to reconstruct from.
|
|
216
|
-
id: 'support-widget-script-tag',
|
|
217
|
-
intent:
|
|
218
|
-
'A docked support chat widget added to a page with a script tag and no build step, talking to an endpoint the site owner already runs. The CMS case.',
|
|
219
|
-
archetypes: ['widget', 'docked'],
|
|
220
|
-
targets: ['script-tag'],
|
|
221
|
-
ingredients: ['kai-chat'],
|
|
222
|
-
backend: { endpoint: 'consumer-owned', reader: 'readOpenAIStream' },
|
|
223
|
-
wiring: [
|
|
224
|
-
{
|
|
225
|
-
from: 'kai-chat',
|
|
226
|
-
event: 'kai-submit',
|
|
227
|
-
to: 'kai-chat',
|
|
228
|
-
property: 'messages',
|
|
229
|
-
note: 'host reads event.detail.value, appends the user turn, streams the reply through the wire reader; on this target the host is an inline script, not a framework, so the listener must be attached after customElements.whenDefined (upgrade-race)',
|
|
230
|
-
},
|
|
231
|
-
],
|
|
232
|
-
invariants: [
|
|
233
|
-
'upgrade-race',
|
|
234
|
-
'reactivity-two-halves',
|
|
235
|
-
'props-not-attributes',
|
|
236
|
-
'events-non-bubbling',
|
|
237
|
-
'kit-parses-consumer-fetches',
|
|
238
|
-
'untrusted-model-output',
|
|
239
|
-
],
|
|
240
|
-
corpus: ['packages/ui/README.md'],
|
|
241
|
-
},
|
|
242
|
-
{
|
|
243
|
-
// The hand-composed thread (rung-6 F-49): kai-chat deliberately absent —
|
|
244
|
-
// kai-thread renders the transcript, kai-composer takes input, and the
|
|
245
|
-
// HOST is every line of wiring between them. This record is the catalog
|
|
246
|
-
// half; the full compiling host module is the `composed-thread` CODE
|
|
247
|
-
// recipe (../recipes/composed-thread.ts, served by component_reference
|
|
248
|
-
// { name: "composed-thread" } and compiled by verify:scaffold), which is
|
|
249
|
-
// also this record's corpus. Ingredients with no wiring edge below are
|
|
250
|
-
// still real members of the composition: kai-feedback-bar's events
|
|
251
|
-
// terminate in the host rather than setting another element's property.
|
|
252
|
-
// (kai-conversation-item used to be in that list as "presentational
|
|
253
|
-
// standalone"; since F-45 tier 2 a standalone row activates itself, so
|
|
254
|
-
// the rail is a real kai-select edge below.)
|
|
255
|
-
id: 'composed-thread',
|
|
256
|
-
intent:
|
|
257
|
-
'A full chat surface composed by hand from standalone elements — no <kai-chat>. ' +
|
|
258
|
-
'The host module owns the store, streams through createAssistantStream + the wire ' +
|
|
259
|
-
'reader, stages attachments as data: URIs, and drives the toast region as data.',
|
|
260
|
-
archetypes: ['full-screen'],
|
|
261
|
-
targets: ['bundler'],
|
|
262
|
-
ingredients: [
|
|
263
|
-
'kai-thread',
|
|
264
|
-
'kai-composer',
|
|
265
|
-
'kai-attachments',
|
|
266
|
-
'kai-toast-region',
|
|
267
|
-
'kai-conversation-item',
|
|
268
|
-
'kai-feedback-bar',
|
|
269
|
-
],
|
|
270
|
-
backend: { endpoint: 'consumer-owned', reader: 'readOpenAIStream' },
|
|
271
|
-
wiring: [
|
|
272
|
-
{
|
|
273
|
-
from: 'kai-composer',
|
|
274
|
-
event: 'kai-submit',
|
|
275
|
-
to: 'kai-thread',
|
|
276
|
-
property: 'messages',
|
|
277
|
-
note: 'detail is {doc, text, entities} — read detail.text (NOT detail.value, which is kai-chat/kai-prompt-input\'s shape). The host appends the user turn plus any staged file parts and assigns a NEW array; the reply then streams onto the same property via createAssistantStream',
|
|
278
|
-
},
|
|
279
|
-
{
|
|
280
|
-
from: 'kai-attachments',
|
|
281
|
-
event: 'kai-remove',
|
|
282
|
-
to: 'kai-attachments',
|
|
283
|
-
property: 'items',
|
|
284
|
-
note: 'detail is {id}; the tray never mutates its own list — the host filters and reassigns items, and a data: URI needs no revocation on removal (attachment-blob-url is the rule this recipe corrects: F-44)',
|
|
285
|
-
},
|
|
286
|
-
{
|
|
287
|
-
from: 'kai-toast-region',
|
|
288
|
-
event: 'kai-dismiss',
|
|
289
|
-
to: 'kai-toast-region',
|
|
290
|
-
property: 'toasts',
|
|
291
|
-
note: 'detail is {id}; the region is driven as DATA because this app places its own and owns the array — the imperative toast() would ADOPT this markup-placed region (it mounts its own only when none exists) and bind its store over the toasts property, so pick one API per region',
|
|
292
|
-
},
|
|
293
|
-
{
|
|
294
|
-
from: 'kai-conversation-item',
|
|
295
|
-
event: 'kai-select',
|
|
296
|
-
to: 'kai-thread',
|
|
297
|
-
property: 'messages',
|
|
298
|
-
note: 'detail is {id}; STANDALONE rows only (F-45 tier 2) — outside <kai-conversations> the row body is a tabbable button and click / Enter / Space fire kai-select on the item (non-bubbling: listen on the row). Inside a container this never fires; the container\'s kai-conversation-select is the one activation event. The container\'s list story (roving tabindex, arrow keys) stays the host\'s job in a hand-rolled rail',
|
|
299
|
-
},
|
|
300
|
-
],
|
|
301
|
-
invariants: [
|
|
302
|
-
'reactivity-two-halves',
|
|
303
|
-
'props-not-attributes',
|
|
304
|
-
'events-non-bubbling',
|
|
305
|
-
'host-coordinates',
|
|
306
|
-
'kit-parses-consumer-fetches',
|
|
307
|
-
'untrusted-model-output',
|
|
308
|
-
],
|
|
309
|
-
corpus: [
|
|
310
|
-
'packages/ui/src/agent-tooling/recipes/composed-thread.ts',
|
|
311
|
-
'packages/ui/src/agent-tooling/catalog/surfaces.test.ts',
|
|
312
|
-
],
|
|
313
|
-
},
|
|
314
|
-
];
|
|
315
|
-
|
|
316
|
-
/**
|
|
317
|
-
* REGISTERED COPY (spec §3). Which MessagePart variants an element consumes is
|
|
318
|
-
* not derivable from any type today, so it is recorded here as an explicit copy.
|
|
319
|
-
* Task 7's drift lint fails when the union gains a variant no record accounts
|
|
320
|
-
* for, which is what stops this going stale silently.
|
|
321
|
-
*
|
|
322
|
-
* WHAT THE CHECKS CAN AND CANNOT SEE. surfaces.test.ts asserts both directions
|
|
323
|
-
* of NAME agreement with `derived.partVariants`: no variant in the union is
|
|
324
|
-
* unaccounted for by any record, and no record claims a variant the union does
|
|
325
|
-
* not have. Neither can check the claim that actually matters — whether
|
|
326
|
-
* `kai-chat` really renders a `source` part is an EDITORIAL judgement, and
|
|
327
|
-
* nothing in the tree derives it, which is exactly why this is a registered
|
|
328
|
-
* copy rather than generated data. A machine cannot tell a correct record from
|
|
329
|
-
* a confident wrong one here. That claim is measured by the acceptance deck,
|
|
330
|
-
* not by CI, so do not add an assertion that looks like it covers it.
|
|
331
|
-
*/
|
|
332
|
-
export const partConsumption: TPartConsumption[] = [
|
|
333
|
-
{ tag: 'kai-chat', consumes: ['text', 'reasoning', 'tool', 'card', 'source', 'file'] },
|
|
334
|
-
{ tag: 'kai-message', consumes: ['text', 'reasoning', 'tool', 'card', 'source', 'file'] },
|
|
335
|
-
];
|
|
336
|
-
|
|
337
|
-
export function listInventory(): TInventoryEntry[] {
|
|
338
|
-
return z.array(InventoryEntry).parse(inventory);
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
export function listSurfaceRecipes(): TSurfaceRecipe[] {
|
|
342
|
-
return z.array(SurfaceRecipe).parse(surfaceRecipes);
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
export function listPartConsumption(): TPartConsumption[] {
|
|
346
|
-
return z.array(PartConsumption).parse(partConsumption);
|
|
347
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/** Build entry for dist/construct-cli.es.js (vite.config.construct-cli.ts).
|
|
2
|
-
* bin/mcp.js imports this with the subcommand argv; process handling stays in
|
|
3
|
-
* the bin (this file stays free of exit calls, same split as mcp/stdio.ts). */
|
|
4
|
-
import { runCli } from './cli';
|
|
5
|
-
|
|
6
|
-
runCli(process.argv.slice(2)).then((code) => {
|
|
7
|
-
process.exitCode = code;
|
|
8
|
-
});
|