{
  "schemaVersion": "1.0.0",
  "readme": "",
  "modules": [
    {
      "kind": "javascript-module",
      "path": "dist/kai.es.js",
      "declarations": [
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-agent-card",
          "name": "KaiAgentCardElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "name",
              "type": {
                "text": "undefined | string"
              },
              "description": "The agent's name — the primary label. Attribute: `name`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "active",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Selected / focused state: highlighted border + surface. Attribute: `active`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "needsAttention",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Raise a prominent \"Needs you\" pill plus a glowing amber edge — the attention-routing signal that pulls focus to this agent. Attribute: `needs-attention`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "status",
              "type": {
                "text": "undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }"
              },
              "description": "Run status — a JS PROPERTY (object), not an attribute. Shape: `{ tone, label?, pulse? }`, where `tone` is one of `working` | `idle` | `done` | `error` | `blocked` (maps to the kit's tool hues), `label` is an optional short string beside the dot, and `pulse` animates the dot. Set it with `el.status = { tone: 'working', label: 'Working', pulse: true }`.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "name",
              "fieldName": "name",
              "type": {
                "text": "undefined | string"
              },
              "description": "The agent's name — the primary label. Attribute: `name`."
            },
            {
              "name": "active",
              "fieldName": "active",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Selected / focused state: highlighted border + surface. Attribute: `active`."
            },
            {
              "name": "needs-attention",
              "fieldName": "needsAttention",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Raise a prominent \"Needs you\" pill plus a glowing amber edge — the attention-routing signal that pulls focus to this agent. Attribute: `needs-attention`."
            }
          ],
          "events": [
            {
              "name": "kai-activate",
              "type": {
                "text": "CustomEvent"
              },
              "description": "The card was activated — clicked, or Enter / Space while focused. Promote this agent back to focus."
            },
            {
              "name": "kai-menu",
              "type": {
                "text": "CustomEvent"
              },
              "description": "The trailing \"...\" kebab was clicked. The consumer opens its own menu; the card only surfaces the affordance (the click does not also activate the card)."
            }
          ],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "status",
              "description": "The leading tone-colored status dot.",
              "recipe": "kai-agent-card::part(status) { width: 0.625rem; height: 0.625rem }"
            },
            {
              "name": "menu",
              "description": "The trailing overflow (\"...\") menu button.",
              "recipe": "kai-agent-card::part(menu) { opacity: 1 }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-artifact",
          "name": "KaiArtifactElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "src",
              "type": {
                "text": "undefined | string"
              },
              "description": "URL the preview iframe frames. Consumer-controlled.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "files",
              "type": {
                "text": "{ path: string; url?: undefined | string; code?: undefined | string; language?: undefined | string; type?: undefined | \"html\" | \"pdf\" | \"image\" | \"other\"; additions?: undefined | number; deletions?: undefined | number; status?: undefined | \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"untracked\" }[]"
              },
              "description": "Files for the Code tab tree + each file's preview `url`. Set as a JS property (array).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "tab",
              "type": {
                "text": "undefined | \"preview\" | \"code\""
              },
              "description": "Controlled active tab: `preview` or `code`. When set, the artifact follows it (re-asserted on change). Leave unset for an uncontrolled tab (see `defaultTab`).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultTab",
              "type": {
                "text": "undefined | \"preview\" | \"code\""
              },
              "description": "Uncontrolled INITIAL tab (used only when `tab` is unset). Default `preview`. Seeds the starting tab; the user can then switch freely without the consumer re-asserting a controlled `tab`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "activeFile",
              "type": {
                "text": "undefined | string"
              },
              "description": "Selected file path — syncs the tree highlight, Code source, and preview.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "sandbox",
              "type": {
                "text": "undefined | string"
              },
              "description": "iframe `sandbox` override. Secure default `allow-scripts allow-forms` (NOT `allow-same-origin`).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "iframeTitle",
              "type": {
                "text": "undefined | string"
              },
              "description": "Accessible title for the preview iframe.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "maximized",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Reflects the artifact's own maximized view-state (usually driven by the protocol).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "expandable",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show the expand-to-fill button (OPT-IN).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "openInTab",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show the open-in-new-tab button (OPT-IN).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "noNav",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Hide back/forward.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "noReload",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Hide reload.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "noHome",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Hide home.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "noPathField",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Hide the address field.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "noTabs",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Hide the Preview|Code toggle.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "standalone",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Standalone chrome: rounded corners + border (else square, borderless in-panel).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "readonlyPath",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show the address but make it read-only (visible, nav-tracking, non-editable).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "displayUrl",
              "type": {
                "text": "undefined | string"
              },
              "description": "Friendly address shown in the path field instead of the real current url (read-only, non-navigable). Use when the framed url is not consumer-facing (e.g. a `data:` blob) so a clean address shows instead of leaking it. Scalar string: set as the `display-url` attribute or the `displayUrl` property.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "back",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Go back in the artifact's own history stack (no-op when there's no prior entry).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "forward",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Go forward in the history stack (no-op when there's no forward entry).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "reload",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Force-reload the current preview url (also re-renders an inline PDF).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "home",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Navigate to the `src` home url (no-op when there's no `src`).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "navigate",
              "parameters": [
                {
                  "name": "url: string"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Push + load a url in the preview — the path-field submit path (fires kai-navigate).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "selectFile",
              "parameters": [
                {
                  "name": "path: string"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Select a file by path: highlights the tree, shows its source, navigates the preview (fires kai-file-select + kai-navigate). Named selectFile to avoid the `activeFile` prop.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "openExternal",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Open the current url in a new browser tab (no-op when there's no concrete url). Named openExternal, NOT openInTab — that's a prop (toolbar button visibility).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "maximize",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Enter the maximized view-state (fires kai-maximize-change{maximized:true}). Named maximize, NOT maximized — that's a prop.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "restore",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Exit the maximized view-state (fires kai-maximize-change{maximized:false}).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "src",
              "fieldName": "src",
              "type": {
                "text": "undefined | string"
              },
              "description": "URL the preview iframe frames. Consumer-controlled."
            },
            {
              "name": "tab",
              "fieldName": "tab",
              "type": {
                "text": "undefined | \"preview\" | \"code\""
              },
              "description": "Controlled active tab: `preview` or `code`. When set, the artifact follows it (re-asserted on change). Leave unset for an uncontrolled tab (see `defaultTab`)."
            },
            {
              "name": "default-tab",
              "fieldName": "defaultTab",
              "type": {
                "text": "undefined | \"preview\" | \"code\""
              },
              "description": "Uncontrolled INITIAL tab (used only when `tab` is unset). Default `preview`. Seeds the starting tab; the user can then switch freely without the consumer re-asserting a controlled `tab`."
            },
            {
              "name": "active-file",
              "fieldName": "activeFile",
              "type": {
                "text": "undefined | string"
              },
              "description": "Selected file path — syncs the tree highlight, Code source, and preview."
            },
            {
              "name": "sandbox",
              "fieldName": "sandbox",
              "type": {
                "text": "undefined | string"
              },
              "description": "iframe `sandbox` override. Secure default `allow-scripts allow-forms` (NOT `allow-same-origin`)."
            },
            {
              "name": "iframe-title",
              "fieldName": "iframeTitle",
              "type": {
                "text": "undefined | string"
              },
              "description": "Accessible title for the preview iframe."
            },
            {
              "name": "maximized",
              "fieldName": "maximized",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Reflects the artifact's own maximized view-state (usually driven by the protocol)."
            },
            {
              "name": "expandable",
              "fieldName": "expandable",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show the expand-to-fill button (OPT-IN)."
            },
            {
              "name": "open-in-tab",
              "fieldName": "openInTab",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show the open-in-new-tab button (OPT-IN)."
            },
            {
              "name": "no-nav",
              "fieldName": "noNav",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Hide back/forward."
            },
            {
              "name": "no-reload",
              "fieldName": "noReload",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Hide reload."
            },
            {
              "name": "no-home",
              "fieldName": "noHome",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Hide home."
            },
            {
              "name": "no-path-field",
              "fieldName": "noPathField",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Hide the address field."
            },
            {
              "name": "no-tabs",
              "fieldName": "noTabs",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Hide the Preview|Code toggle."
            },
            {
              "name": "standalone",
              "fieldName": "standalone",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Standalone chrome: rounded corners + border (else square, borderless in-panel)."
            },
            {
              "name": "readonly-path",
              "fieldName": "readonlyPath",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show the address but make it read-only (visible, nav-tracking, non-editable)."
            },
            {
              "name": "display-url",
              "fieldName": "displayUrl",
              "type": {
                "text": "undefined | string"
              },
              "description": "Friendly address shown in the path field instead of the real current url (read-only, non-navigable). Use when the framed url is not consumer-facing (e.g. a `data:` blob) so a clean address shows instead of leaking it. Scalar string: set as the `display-url` attribute or the `displayUrl` property."
            }
          ],
          "events": [
            {
              "name": "kai-file-select",
              "type": {
                "text": "CustomEvent<{ path: string }>"
              },
              "description": "Fired when a file is selected. `detail.path`."
            },
            {
              "name": "kai-maximize-change",
              "type": {
                "text": "CustomEvent<{ maximized: false | true }>"
              },
              "description": "Artifact's own maximize button toggled (consumer-observable; non-bubbling)."
            },
            {
              "name": "kai-navigate",
              "type": {
                "text": "CustomEvent<{ url: string }>"
              },
              "description": "Fired when the preview navigates. `detail.url` = the new location."
            },
            {
              "name": "kai-tab-change",
              "type": {
                "text": "CustomEvent<{ tab: \"preview\" | \"code\" }>"
              },
              "description": "Fired when the Preview|Code tab changes. `detail.tab`."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-attachments",
          "name": "KaiAttachmentsElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "items",
              "type": {
                "text": "{ id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]"
              },
              "description": "The attachments to render. Set as a JS property (array).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "variant",
              "type": {
                "text": "undefined | \"grid\" | \"inline\" | \"list\""
              },
              "description": "Layout: `grid` = visual tiles, `inline` = icon + label chips, `list` = rows.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "hoverCard",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Wrap each item in a hover card that previews its details.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "removable",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a remove button per item; clicking it fires a `kai-remove` event.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "showMediaType",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Also show the media type beneath the filename (non-grid variants).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "emptyText",
              "type": {
                "text": "undefined | string"
              },
              "description": "Text shown when `items` is empty.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "variant",
              "fieldName": "variant",
              "type": {
                "text": "undefined | \"grid\" | \"inline\" | \"list\""
              },
              "description": "Layout: `grid` = visual tiles, `inline` = icon + label chips, `list` = rows."
            },
            {
              "name": "hover-card",
              "fieldName": "hoverCard",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Wrap each item in a hover card that previews its details."
            },
            {
              "name": "removable",
              "fieldName": "removable",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a remove button per item; clicking it fires a `kai-remove` event."
            },
            {
              "name": "show-media-type",
              "fieldName": "showMediaType",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Also show the media type beneath the filename (non-grid variants)."
            },
            {
              "name": "empty-text",
              "fieldName": "emptyText",
              "type": {
                "text": "undefined | string"
              },
              "description": "Text shown when `items` is empty."
            }
          ],
          "events": [
            {
              "name": "kai-remove",
              "type": {
                "text": "CustomEvent<{ id: string }>"
              },
              "description": "A remove button was clicked."
            }
          ],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "preview",
              "description": "The image shown in an attachment’s hover-card preview. Bounded by default (max ~320×256, aspect preserved) so a large image never blows up the card — raise or lower the cap from outside.",
              "recipe": "kai-attachments::part(preview) { max-width: 32rem; max-height: 24rem }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-avatar",
          "name": "KaiAvatarElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "src",
              "type": {
                "text": "undefined | string"
              },
              "description": "Image URL/data-URI. When absent, the `fallback` initials show instead.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "alt",
              "type": {
                "text": "undefined | string"
              },
              "description": "Alt text for the image. Defaults to `fallback`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "fallback",
              "type": {
                "text": "undefined | string"
              },
              "description": "Short text shown when there's no image — usually initials (e.g. \"JD\", \"AI\").",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\" | \"lg\""
              },
              "description": "Size token: `sm` | `md` (default) | `lg`.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "src",
              "fieldName": "src",
              "type": {
                "text": "undefined | string"
              },
              "description": "Image URL/data-URI. When absent, the `fallback` initials show instead."
            },
            {
              "name": "alt",
              "fieldName": "alt",
              "type": {
                "text": "undefined | string"
              },
              "description": "Alt text for the image. Defaults to `fallback`."
            },
            {
              "name": "fallback",
              "fieldName": "fallback",
              "type": {
                "text": "undefined | string"
              },
              "description": "Short text shown when there's no image — usually initials (e.g. \"JD\", \"AI\")."
            },
            {
              "name": "size",
              "fieldName": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\" | \"lg\""
              },
              "description": "Size token: `sm` | `md` (default) | `lg`."
            }
          ],
          "events": [],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-badge",
          "name": "KaiBadgeElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "variant",
              "type": {
                "text": "undefined | \"default\" | \"count\" | \"citation\""
              },
              "description": "`default` (muted pill) · `count` (compact number badge) · `citation` (filled primary, for inline citation markers). Defaults to `default`.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "variant",
              "fieldName": "variant",
              "type": {
                "text": "undefined | \"default\" | \"count\" | \"citation\""
              },
              "description": "`default` (muted pill) · `count` (compact number badge) · `citation` (filled primary, for inline citation markers). Defaults to `default`."
            }
          ],
          "events": [],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "badge",
              "description": "The badge pill. Restyle its background, color, or shape; the `variant` prop (default/count/citation) sets the defaults.",
              "recipe": "kai-badge::part(badge) { background: var(--color-primary); color: var(--color-primary-foreground) }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-button",
          "name": "KaiButtonElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "variant",
              "type": {
                "text": "undefined | \"default\" | \"subtle\" | \"ghost\" | \"outline\" | \"destructive\""
              },
              "description": "Visual style. `default` (filled), `subtle` (muted text, hover tint — the toolbar icon look), `ghost` (transparent, hover fill), `outline`, or `destructive`. Defaults to `default`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\""
              },
              "description": "Size token. `icon` / `icon-sm` are square (for icon-only buttons); `sm` / `md` / `lg` size text buttons. Defaults to `md`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "icon",
              "type": {
                "text": "undefined | string"
              },
              "description": "Leading icon: a named icon (e.g. `\"mic\"`, `\"plus\"`), an image URL/data-URI, or plain text. Renders before any slotted label.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "iconTrailing",
              "type": {
                "text": "undefined | string"
              },
              "description": "Trailing icon, after the label (e.g. `\"chevron-down\"` for a menu affordance).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Accessible name. REQUIRED for icon-only buttons (no visible text); ignored when you slot visible text, which already names the button.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the button (non-interactive, dimmed).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "full",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Stretch the button to the full width of its container (a block button) — e.g. a card CTA or a stacked action. Attribute: `full`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "align",
              "type": {
                "text": "undefined | \"start\" | \"center\" | \"end\""
              },
              "description": "Justify the button's content: `start`, `center` (default), or `end`. Combine with `full` for a full-width, left-aligned button.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "type",
              "type": {
                "text": "undefined | \"button\" | \"submit\" | \"reset\""
              },
              "description": "Native button `type`. Defaults to `button` (so it never submits a form).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "focus",
              "parameters": [
                {
                  "name": "options?: FocusOptions"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Focus the inner `<button>` (host.focus() would focus the wrapper).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "blur",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Blur the inner `<button>`.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "click",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Programmatically activate the button — runs the same path as a user click and fires kai-click. Forwarding to the inner button means `disabled` is respected automatically.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "variant",
              "fieldName": "variant",
              "type": {
                "text": "undefined | \"default\" | \"subtle\" | \"ghost\" | \"outline\" | \"destructive\""
              },
              "description": "Visual style. `default` (filled), `subtle` (muted text, hover tint — the toolbar icon look), `ghost` (transparent, hover fill), `outline`, or `destructive`. Defaults to `default`."
            },
            {
              "name": "size",
              "fieldName": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\""
              },
              "description": "Size token. `icon` / `icon-sm` are square (for icon-only buttons); `sm` / `md` / `lg` size text buttons. Defaults to `md`."
            },
            {
              "name": "icon",
              "fieldName": "icon",
              "type": {
                "text": "undefined | string"
              },
              "description": "Leading icon: a named icon (e.g. `\"mic\"`, `\"plus\"`), an image URL/data-URI, or plain text. Renders before any slotted label."
            },
            {
              "name": "icon-trailing",
              "fieldName": "iconTrailing",
              "type": {
                "text": "undefined | string"
              },
              "description": "Trailing icon, after the label (e.g. `\"chevron-down\"` for a menu affordance)."
            },
            {
              "name": "label",
              "fieldName": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Accessible name. REQUIRED for icon-only buttons (no visible text); ignored when you slot visible text, which already names the button."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the button (non-interactive, dimmed)."
            },
            {
              "name": "full",
              "fieldName": "full",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Stretch the button to the full width of its container (a block button) — e.g. a card CTA or a stacked action. Attribute: `full`."
            },
            {
              "name": "align",
              "fieldName": "align",
              "type": {
                "text": "undefined | \"start\" | \"center\" | \"end\""
              },
              "description": "Justify the button's content: `start`, `center` (default), or `end`. Combine with `full` for a full-width, left-aligned button."
            },
            {
              "name": "type",
              "fieldName": "type",
              "type": {
                "text": "undefined | \"button\" | \"submit\" | \"reset\""
              },
              "description": "Native button `type`. Defaults to `button` (so it never submits a form)."
            }
          ],
          "events": [
            {
              "name": "kai-click",
              "type": {
                "text": "CustomEvent"
              },
              "description": "The button was activated (pointer or keyboard). Carries no detail. The native `click` also bubbles (composed) for consumers who prefer it."
            }
          ],
          "cssProperties": [],
          "slots": [
            {
              "name": "icon",
              "description": "A custom leading icon (any inline SVG, inherits `currentColor`). Wins over the `icon` prop."
            }
          ],
          "cssParts": [
            {
              "name": "button",
              "description": "The button element. Restyle radius, padding, colors, or weight from outside; the `variant`/`size` props set the defaults.",
              "recipe": "kai-button::part(button) { border-radius: 9999px; font-weight: 600 }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-card",
          "name": "KaiCardElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "appearance",
              "type": {
                "text": "undefined | \"outlined\" | \"filled\" | \"plain\" | \"accent\""
              },
              "description": "Surface treatment: `outlined` (default) | `filled` | `plain` | `accent`. Attribute: `appearance`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "orientation",
              "type": {
                "text": "undefined | \"vertical\" | \"horizontal\" | \"responsive\""
              },
              "description": "`vertical` (default, media on top) | `horizontal` (media at the start) | `responsive` (horizontal when the card's container is wide enough, else vertical — a container query on the card's own width). Attribute: `orientation`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "collapse",
              "type": {
                "text": "undefined | string"
              },
              "description": "The card width below which a `responsive` card collapses to vertical and the footer actions stack. A CSS length; default `28rem`. Attribute: `collapse`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "dense",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Tighter spacing for dense lists. Attribute: `dense`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "dismissible",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a close (×) that hides the card and emits `kai-dismiss`. Attribute: `dismissible`. Off by default.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "href",
              "type": {
                "text": "undefined | string"
              },
              "description": "Render the whole card as a link. Attribute: `href`. Wins over `clickable`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "target",
              "type": {
                "text": "undefined | string"
              },
              "description": "`target` for the `href` anchor. Attribute: `target`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "rel",
              "type": {
                "text": "undefined | string"
              },
              "description": "`rel` for the `href` anchor. Attribute: `rel`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "clickable",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Make the whole card a button (`role=\"button\"`, Enter/Space, hover affordance) that emits `kai-card-click`. Attribute: `clickable`. Ignored when `href` is set.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "appearance",
              "fieldName": "appearance",
              "type": {
                "text": "undefined | \"outlined\" | \"filled\" | \"plain\" | \"accent\""
              },
              "description": "Surface treatment: `outlined` (default) | `filled` | `plain` | `accent`. Attribute: `appearance`."
            },
            {
              "name": "orientation",
              "fieldName": "orientation",
              "type": {
                "text": "undefined | \"vertical\" | \"horizontal\" | \"responsive\""
              },
              "description": "`vertical` (default, media on top) | `horizontal` (media at the start) | `responsive` (horizontal when the card's container is wide enough, else vertical — a container query on the card's own width). Attribute: `orientation`."
            },
            {
              "name": "collapse",
              "fieldName": "collapse",
              "type": {
                "text": "undefined | string"
              },
              "description": "The card width below which a `responsive` card collapses to vertical and the footer actions stack. A CSS length; default `28rem`. Attribute: `collapse`."
            },
            {
              "name": "dense",
              "fieldName": "dense",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Tighter spacing for dense lists. Attribute: `dense`."
            },
            {
              "name": "dismissible",
              "fieldName": "dismissible",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a close (×) that hides the card and emits `kai-dismiss`. Attribute: `dismissible`. Off by default."
            },
            {
              "name": "href",
              "fieldName": "href",
              "type": {
                "text": "undefined | string"
              },
              "description": "Render the whole card as a link. Attribute: `href`. Wins over `clickable`."
            },
            {
              "name": "target",
              "fieldName": "target",
              "type": {
                "text": "undefined | string"
              },
              "description": "`target` for the `href` anchor. Attribute: `target`."
            },
            {
              "name": "rel",
              "fieldName": "rel",
              "type": {
                "text": "undefined | string"
              },
              "description": "`rel` for the `href` anchor. Attribute: `rel`."
            },
            {
              "name": "clickable",
              "fieldName": "clickable",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Make the whole card a button (`role=\"button\"`, Enter/Space, hover affordance) that emits `kai-card-click`. Attribute: `clickable`. Ignored when `href` is set."
            }
          ],
          "events": [
            {
              "name": "kai-card-click",
              "type": {
                "text": "CustomEvent"
              },
              "description": "A `clickable`/`href` card was activated (click, or Enter/Space)."
            },
            {
              "name": "kai-dismiss",
              "type": {
                "text": "CustomEvent"
              },
              "description": "The card was dismissed via its × (it also hides itself)."
            }
          ],
          "cssProperties": [],
          "slots": [
            {
              "name": "media",
              "description": "Full-bleed media (image/video/illustration) at the top (vertical) or start (horizontal). Clipped to the card corners."
            },
            {
              "name": "header",
              "description": "Header content, e.g. a title. Rendered above the body."
            },
            {
              "name": "header-actions",
              "description": "An actions cluster pinned to the end of the header row."
            },
            {
              "name": "footer",
              "description": "Footer content rendered below the body."
            },
            {
              "name": "footer-actions",
              "description": "Action buttons pinned to the end of the footer. Do NOT combine with a clickable/href card (nested interactive)."
            }
          ],
          "cssParts": [
            {
              "name": "card",
              "description": "The card root (a div, or an a when href is set). Restyle its radius, border, or background; set --kai-card-spacing for padding/gaps (the dense prop sets the compact default).",
              "recipe": "kai-card::part(card) { border-radius: 1rem; --kai-card-spacing: 1.5rem }"
            },
            {
              "name": "media",
              "description": "The full-bleed media region. Cap or crop it from outside (e.g. a fixed height with object-fit).",
              "recipe": "kai-card::part(media) { max-height: 12rem }"
            },
            {
              "name": "header",
              "description": "The header row (header content + header-actions). Add a divider or adjust its alignment.",
              "recipe": "kai-card::part(header) { border-bottom: 1px solid var(--color-border) }"
            },
            {
              "name": "body",
              "description": "The default-slot body region.",
              "recipe": "kai-card::part(body) { font-size: 0.9375rem }"
            },
            {
              "name": "footer",
              "description": "The footer row (footer content + footer-actions).",
              "recipe": "kai-card::part(footer) { border-top: 1px solid var(--color-border) }"
            },
            {
              "name": "dismiss",
              "description": "The dismiss (×) button shown when dismissible. Recolor or reposition it from outside.",
              "recipe": "kai-card::part(dismiss) { color: var(--color-muted-foreground) }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-cards",
          "name": "KaiCardsElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "cards",
              "type": {
                "text": "undefined | { type: string; id: string; data: unknown; title?: undefined | string; resolution?: undefined | { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }[]"
              },
              "description": "The stream of card envelopes to render. Set as a JS PROPERTY: `el.cards = [...]`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "types",
              "type": {
                "text": "undefined | Record<string, string>"
              },
              "description": "Optional type→tag overrides/additions (merged over the built-ins). Property: `el.types`. Typed as a plain string map (not the `CardTagMap` alias) so the generated React wrapper inlines it instead of emitting an unresolved named type.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "policy",
              "type": {
                "text": "undefined | { onSubmit?: undefined | (cardId: string, data: unknown) => void; onAction?: undefined | (cardId: string, action: string, payload?: unknown) => void; onSendPrompt?: undefined | (text: string, opts: { mode: \"compose\" | \"send\"; context?: unknown; }) => void; onOpen?: undefined | (url: string, target: \"tab\" | \"artifact\") => void; onState?: undefined | (cardId: string, patch: unknown) => void; onDismiss?: undefined | (cardId: string) => void; onReopen?: undefined | (cardId: string) => void; onError?: undefined | (cardId: string, message: string) => void; maxSendPromptMode?: undefined | \"compose\" | \"send\" }"
              },
              "description": "Optional CardPolicy handling child events. Property: `el.policy`.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "resolve",
              "parameters": [
                {
                  "name": "cardId: string, resolution: CardResolution"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Programmatically resolve a child card by id: set that envelope's `resolution` so the child re-renders into its read-only/resolved view — the imperative twin of the consumer mutating the cards array. No-op for an unknown id.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "dismiss",
              "parameters": [
                {
                  "name": "cardId: string"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Collapse a card to its re-openable stub from the host side — convenience for `resolve(cardId, { kind: 'dismissed' })`.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "getCard",
              "parameters": [
                {
                  "name": "cardId: string"
                }
              ],
              "return": {
                "type": {
                  "text": "HTMLElement | null"
                }
              },
              "description": "Return the live child element node for a card id (or null) so consumers can call that card's own methods (focus/expand/…) without a shadow-DOM query.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            }
          ],
          "events": [
            {
              "name": "kai-card-resolved",
              "type": {
                "text": "CustomEvent<{ cardId: string; resolution: { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }>"
              },
              "description": "A child card transitioned to a resolved/deferred state (an action was chosen, a form/tasks submission landed, or it was dismissed) — re-emitted off the host as a non-bubbling convenience event so a consumer can observe resolution centrally without diffing the cards array. `detail` = `{ cardId, resolution }`. (A `reopen` un-resolves a card and has no `CardResolution`, so it does NOT fire this — observe reopen via the underlying bubbling `kai-card` event.)"
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-chain-of-thought",
          "name": "KaiChainOfThoughtElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "steps",
              "type": {
                "text": "{ label: string; content?: undefined | string; id?: undefined | string }[]"
              },
              "description": "The reasoning steps. Set as a JS property. Compound sub-parts collapse to this one data model (Route 1). Each `{ label, content?, id? }`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "type",
              "type": {
                "text": "undefined | \"single\" | \"multiple\""
              },
              "description": "Open mode: `'multiple'` (default — any number of steps open at once) or `'single'` (at most one open; opening a step closes the others).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "undefined | string | string[]"
              },
              "description": "Controlled open step key(s). When set, it WINS over user interaction (the consumer owns the open set). String in `single` mode, string[] in `multiple` mode. Set as a JS property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultValue",
              "type": {
                "text": "undefined | string | string[]"
              },
              "description": "Uncontrolled INITIAL open step key(s) — seeds which steps render expanded. Ignored once `value` is provided. Set as a JS property.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "expand",
              "parameters": [
                {
                  "name": "index?: number"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Open one step's detail by index, or — with no arg — ALL steps. In `single` mode opening one step closes the others (expand-all keeps the last).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "collapse",
              "parameters": [
                {
                  "name": "index?: number"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Close one step's detail by index, or — with no arg — ALL steps.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "toggle",
              "parameters": [
                {
                  "name": "index?: number"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Flip one step's open state by index.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "type",
              "fieldName": "type",
              "type": {
                "text": "undefined | \"single\" | \"multiple\""
              },
              "description": "Open mode: `'multiple'` (default — any number of steps open at once) or `'single'` (at most one open; opening a step closes the others)."
            }
          ],
          "events": [
            {
              "name": "kai-value-change",
              "type": {
                "text": "CustomEvent<{ value: string | string[] }>"
              },
              "description": "The open set changed — by user click OR an expand()/collapse()/toggle() call. `value` is a string in `single` mode, a string[] in `multiple` mode. (Maps Radix Accordion's onValueChange.)"
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-chat",
          "name": "KaiChatElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "messages",
              "type": {
                "text": "{ id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]"
              },
              "description": "The full message thread to render, newest last. Each entry carries its role, content, and optional reasoning/tools/attachments/actions. Set as a JS property (`el.messages = [...]`).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "undefined | string | ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]"
              },
              "description": "Value of the input. A **string** is controlled (the host owns the text and updates it on `kai-value-change`). A **ComposerDoc** is a one-time seed that pre-populates pills; the user then edits freely. Leave unset for uncontrolled.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "placeholder",
              "type": {
                "text": "undefined | string"
              },
              "description": "Placeholder text shown in the empty input.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "loading",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "When true, shows the loading/streaming state and disables submit (use while awaiting the assistant's reply).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "suggestions",
              "type": {
                "text": "undefined | string[]"
              },
              "description": "Starter prompts shown above the input when the thread is empty. Clicking one follows `suggestionMode`. Set as a JS property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "suggestionMode",
              "type": {
                "text": "undefined | \"submit\" | \"fill\""
              },
              "description": "What clicking a suggestion does: `'submit'` (default) sends it immediately as if typed and submitted; `'fill'` just places it in the input.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "persistSuggestions",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Keep suggestions visible after the conversation starts. By default suggestions are conversation starters and hide once `messages` is non-empty; set this to keep them always shown. Default false.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "proseSize",
              "type": {
                "text": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
              },
              "description": "Body/prose font scale for rendered markdown (`'xs' | 'sm' | 'base' | 'lg'`). Defaults to `'sm'`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "codeTheme",
              "type": {
                "text": "undefined | string"
              },
              "description": "Shiki theme name for syntax-highlighted code blocks (e.g. `'github-dark-dimmed'`).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "codeHighlight",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Enable Shiki syntax highlighting in code blocks. Turn off to render plain `<pre>` blocks (lighter, no highlighter load). Default true.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "chatTitle",
              "type": {
                "text": "undefined | string"
              },
              "description": "Optional header title shown on the left of the header.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "models",
              "type": {
                "text": "undefined | { id: string; name: string; provider?: undefined | string; description?: undefined | string; group?: undefined | string }[]"
              },
              "description": "Optional model list. When set (>1 model) a ModelSwitcher is shown in the header and a `kai-model-change` event fires on selection.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "currentModel",
              "type": {
                "text": "undefined | string"
              },
              "description": "The currently selected model id (pairs with `models`).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "context",
              "type": {
                "text": "undefined | { usedTokens: number; maxTokens: number; inputTokens?: undefined | number; outputTokens?: undefined | number; estimatedCost?: undefined | number }"
              },
              "description": "Optional context-window token usage. When set, a Context token meter is shown in the header.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "scrollButton",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show the scroll-to-bottom button inside the scroll area. Default true.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "headerStart",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Whether the host has `slot=\"header-start\"` content (left of the title) — set by the `<kai-chat>` facade so a custom control forces the header open.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "headerEnd",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Whether the host has `slot=\"header-end\"` content (right of the controls).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "headerFull",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "REPLACE — full custom header in place of the built-in title/model/context bar.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "sidebar",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "INJECT — left sidebar column (e.g. a conversation list / your own nav).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "empty",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "REPLACE — custom zero-state rendered in the message area while the thread is empty (replaces the empty message list only; the composer and its suggestions still render).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "composer",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "REPLACE — full custom composer in place of the built-in prompt input. The projected content wires its own submit (the data-flow boundary).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "composerActions",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "INJECT — accessory row just above the composer (e.g. extra actions).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "footer",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "INJECT — footer row below the composer (disclaimers, token meter, …).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "search",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a Search (Globe) button in the input toolbar; fires a `search` event.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "voice",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a Voice (Mic) button in the input toolbar; fires a `voice` event.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "triggers",
              "type": {
                "text": "undefined | { char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]"
              },
              "description": "Rich entity triggers — each `{ char, kind, items }` opens a caret-anchored menu that inserts an atomic pill (`/` skills, `@` agents/plugins). Set as a JS property; forwarded to the input.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "kindIcons",
              "type": {
                "text": "undefined | Record<string, string>"
              },
              "description": "Default icon per entity kind (kind → image src) for pills/menu items.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "actionsReveal",
              "type": {
                "text": "undefined | \"always\" | \"hover\""
              },
              "description": "Whether each message's action bar is always visible (`'always'`, default) or only revealed on hover of that message row (`'hover'`).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "focus",
              "parameters": [
                {
                  "name": "options?: FocusOptions"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "blur",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "clear",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "send",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "scrollToBottom",
              "parameters": [
                {
                  "name": "behavior?: ScrollBehavior"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "placeholder",
              "fieldName": "placeholder",
              "type": {
                "text": "undefined | string"
              },
              "description": "Placeholder text shown in the empty input."
            },
            {
              "name": "loading",
              "fieldName": "loading",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "When true, shows the loading/streaming state and disables submit (use while awaiting the assistant's reply)."
            },
            {
              "name": "suggestion-mode",
              "fieldName": "suggestionMode",
              "type": {
                "text": "undefined | \"submit\" | \"fill\""
              },
              "description": "What clicking a suggestion does: `'submit'` (default) sends it immediately as if typed and submitted; `'fill'` just places it in the input."
            },
            {
              "name": "persist-suggestions",
              "fieldName": "persistSuggestions",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Keep suggestions visible after the conversation starts. By default suggestions are conversation starters and hide once `messages` is non-empty; set this to keep them always shown. Default false."
            },
            {
              "name": "prose-size",
              "fieldName": "proseSize",
              "type": {
                "text": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
              },
              "description": "Body/prose font scale for rendered markdown (`'xs' | 'sm' | 'base' | 'lg'`). Defaults to `'sm'`."
            },
            {
              "name": "code-theme",
              "fieldName": "codeTheme",
              "type": {
                "text": "undefined | string"
              },
              "description": "Shiki theme name for syntax-highlighted code blocks (e.g. `'github-dark-dimmed'`)."
            },
            {
              "name": "code-highlight",
              "fieldName": "codeHighlight",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Enable Shiki syntax highlighting in code blocks. Turn off to render plain `<pre>` blocks (lighter, no highlighter load). Default true."
            },
            {
              "name": "chat-title",
              "fieldName": "chatTitle",
              "type": {
                "text": "undefined | string"
              },
              "description": "Optional header title shown on the left of the header."
            },
            {
              "name": "current-model",
              "fieldName": "currentModel",
              "type": {
                "text": "undefined | string"
              },
              "description": "The currently selected model id (pairs with `models`)."
            },
            {
              "name": "scroll-button",
              "fieldName": "scrollButton",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show the scroll-to-bottom button inside the scroll area. Default true."
            },
            {
              "name": "header-start",
              "fieldName": "headerStart",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Whether the host has `slot=\"header-start\"` content (left of the title) — set by the `<kai-chat>` facade so a custom control forces the header open."
            },
            {
              "name": "header-end",
              "fieldName": "headerEnd",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Whether the host has `slot=\"header-end\"` content (right of the controls)."
            },
            {
              "name": "header-full",
              "fieldName": "headerFull",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "REPLACE — full custom header in place of the built-in title/model/context bar."
            },
            {
              "name": "sidebar",
              "fieldName": "sidebar",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "INJECT — left sidebar column (e.g. a conversation list / your own nav)."
            },
            {
              "name": "empty",
              "fieldName": "empty",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "REPLACE — custom zero-state rendered in the message area while the thread is empty (replaces the empty message list only; the composer and its suggestions still render)."
            },
            {
              "name": "composer",
              "fieldName": "composer",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "REPLACE — full custom composer in place of the built-in prompt input. The projected content wires its own submit (the data-flow boundary)."
            },
            {
              "name": "composer-actions",
              "fieldName": "composerActions",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "INJECT — accessory row just above the composer (e.g. extra actions)."
            },
            {
              "name": "footer",
              "fieldName": "footer",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "INJECT — footer row below the composer (disclaimers, token meter, …)."
            },
            {
              "name": "search",
              "fieldName": "search",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a Search (Globe) button in the input toolbar; fires a `search` event."
            },
            {
              "name": "voice",
              "fieldName": "voice",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a Voice (Mic) button in the input toolbar; fires a `voice` event."
            },
            {
              "name": "actions-reveal",
              "fieldName": "actionsReveal",
              "type": {
                "text": "undefined | \"always\" | \"hover\""
              },
              "description": "Whether each message's action bar is always visible (`'always'`, default) or only revealed on hover of that message row (`'hover'`)."
            }
          ],
          "events": [
            {
              "name": "kai-attachments-change",
              "type": {
                "text": "CustomEvent<{ attachments: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }>"
              },
              "description": "The staged attachments changed (file added or removed). Carries the full current list so a consumer can react in real time."
            },
            {
              "name": "kai-message-action",
              "type": {
                "text": "CustomEvent<{ messageId: string; action: string; state?: undefined | \"on\" | \"off\" }>"
              },
              "description": "An action button on a message was clicked. `action` is the built-in name or custom id. `state` is present only for the toggleable feedback votes: `'on'` when a like/dislike is set, `'off'` when re-tapped to clear."
            },
            {
              "name": "kai-model-change",
              "type": {
                "text": "CustomEvent<{ modelId: string }>"
              },
              "description": "The header model switcher changed."
            },
            {
              "name": "kai-search",
              "type": {
                "text": "CustomEvent<Record<string, never>>"
              },
              "description": "The Search button was clicked."
            },
            {
              "name": "kai-submit",
              "type": {
                "text": "CustomEvent<{ value: string; attachments: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }>"
              },
              "description": "User submitted a message."
            },
            {
              "name": "kai-suggestion-click",
              "type": {
                "text": "CustomEvent<{ value: string }>"
              },
              "description": "A suggestion chip was clicked (only in `suggestion-mode=\"fill\"`)."
            },
            {
              "name": "kai-value-change",
              "type": {
                "text": "CustomEvent<{ value: string }>"
              },
              "description": "Fired on every input change."
            },
            {
              "name": "kai-voice",
              "type": {
                "text": "CustomEvent<Record<string, never>>"
              },
              "description": "The Mic / voice button was clicked."
            }
          ],
          "cssProperties": [],
          "slots": [
            {
              "name": "header-start",
              "description": "Leading header controls, left of the title."
            },
            {
              "name": "header-end",
              "description": "Trailing header controls."
            },
            {
              "name": "header",
              "description": "Full custom header; replaces the built-in title/model/context bar."
            },
            {
              "name": "sidebar",
              "description": "Left column (your nav / conversation list). Fixed width; use compose-your-own for resizable."
            },
            {
              "name": "empty",
              "description": "Custom zero-state rendered in the message area while the thread is empty. Replaces the empty message list only — the composer and any suggestions still render."
            },
            {
              "name": "composer",
              "description": "Full custom composer; you own submit + loading, drive the thread via messages."
            },
            {
              "name": "composer-actions",
              "description": "Accessory row above the composer."
            },
            {
              "name": "footer",
              "description": "Row below the composer (disclaimers, token meter)."
            }
          ],
          "cssParts": [
            {
              "name": "header-bar",
              "description": "The built-in header bar (the title / model-switcher / context row that hosts the header-start/header-end inject slots). Restyle its height, padding, or gap from outside without replacing the whole header via the `header` slot.",
              "recipe": "kai-chat::part(header-bar) { height: 3.5rem; padding-inline: 1rem; gap: 0.5rem }"
            },
            {
              "name": "header",
              "description": "Full custom header; replaces the built-in title/model/context bar."
            },
            {
              "name": "sidebar",
              "description": "Left column (your nav / conversation list). Fixed width; use compose-your-own for resizable."
            },
            {
              "name": "footer",
              "description": "Row below the composer (disclaimers, token meter)."
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-checkpoint",
          "name": "KaiCheckpointElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Optional text beside the icon.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "tooltip",
              "type": {
                "text": "undefined | string"
              },
              "description": "Tooltip on hover.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "variant",
              "type": {
                "text": "undefined | \"default\" | \"ghost\" | \"outline\""
              },
              "description": "Visual button style.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\""
              },
              "description": "Button size (use an `icon*` size for an icon-only checkpoint).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "label",
              "fieldName": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Optional text beside the icon."
            },
            {
              "name": "tooltip",
              "fieldName": "tooltip",
              "type": {
                "text": "undefined | string"
              },
              "description": "Tooltip on hover."
            },
            {
              "name": "variant",
              "fieldName": "variant",
              "type": {
                "text": "undefined | \"default\" | \"ghost\" | \"outline\""
              },
              "description": "Visual button style."
            },
            {
              "name": "size",
              "fieldName": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\""
              },
              "description": "Button size (use an `icon*` size for an icon-only checkpoint)."
            }
          ],
          "events": [
            {
              "name": "kai-select",
              "type": {
                "text": "CustomEvent"
              },
              "description": "The checkpoint was clicked."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-choice",
          "name": "KaiChoiceElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "data",
              "type": {
                "text": "undefined | Record<string, unknown>"
              },
              "description": "The choice definition (the CardEnvelope.data). Set as a JS PROPERTY: `el.data = { prompt, options:[…], allowOther?, submitLabel? }`. Import `ChoiceCardData` from `@kitn.ai/ui` for the full shape.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "cardId",
              "type": {
                "text": "undefined | string"
              },
              "description": "Stable card id correlating every emitted CardEvent. Attribute: `card-id`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "heading",
              "type": {
                "text": "undefined | string"
              },
              "description": "Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "resolution",
              "type": {
                "text": "undefined | Record<string, unknown>"
              },
              "description": "Set when the user resolved this card; renders the read-only view. Property: `el.resolution = { kind:'action', action:'…' }`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "undefined | string"
              },
              "description": "Controlled selection — the selected option id. When set, the consumer owns the current pick (RadioGroup `value`). Attribute: `value`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultValue",
              "type": {
                "text": "undefined | string"
              },
              "description": "Option id to pre-select on mount (uncontrolled seed). Attribute: `default-value`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the whole radiogroup + Submit (e.g. while the agent is busy). Attribute: `disabled`.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "focus",
              "parameters": [
                {
                  "name": "options?: FocusOptions"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Focus the radiogroup roving tab stop (or the Other input when selected).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "select",
              "parameters": [
                {
                  "name": "optionId: string"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Select an option by id locally — no emit, fires kai-value-change (same as a row click). Lets a consumer pre-highlight or drive selection externally.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "send",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Submit the current selection — emits the `action` verb on kai-card and resolves the card (single-shot). Named `send`, not `submit`, per the shared vocabulary.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "dismiss",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Trigger the dismiss path — emits `dismiss` on kai-card and optimistically collapses the card to its re-openable stub.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "reopen",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Re-open a dismissed card from its stub — emits `reopen` on kai-card.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "card-id",
              "fieldName": "cardId",
              "type": {
                "text": "undefined | string"
              },
              "description": "Stable card id correlating every emitted CardEvent. Attribute: `card-id`."
            },
            {
              "name": "heading",
              "fieldName": "heading",
              "type": {
                "text": "undefined | string"
              },
              "description": "Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`."
            },
            {
              "name": "value",
              "fieldName": "value",
              "type": {
                "text": "undefined | string"
              },
              "description": "Controlled selection — the selected option id. When set, the consumer owns the current pick (RadioGroup `value`). Attribute: `value`."
            },
            {
              "name": "default-value",
              "fieldName": "defaultValue",
              "type": {
                "text": "undefined | string"
              },
              "description": "Option id to pre-select on mount (uncontrolled seed). Attribute: `default-value`."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the whole radiogroup + Submit (e.g. while the agent is busy). Attribute: `disabled`."
            }
          ],
          "events": [
            {
              "name": "kai-value-change",
              "type": {
                "text": "CustomEvent<{ value: string }>"
              },
              "description": "The selection changed BEFORE submit (a row click or the `select()` method). Distinct from the terminal `action` verb on the `kai-card` contract event."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-coachmark",
          "name": "KaiCoachmarkElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages). Set `el.open = true`, or `<kai-coachmark open>`; listen for `kai-open-change`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "headline",
              "type": {
                "text": "undefined | string"
              },
              "description": "The bold title. Named `headline` because `title` collides with the global `HTMLElement.title` attribute (it throws at registration).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "badge",
              "type": {
                "text": "undefined | string"
              },
              "description": "A small badge pill beside the headline (e.g. \"New\").",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "placement",
              "type": {
                "text": "undefined | string"
              },
              "description": "Floating placement relative to the anchor (default `bottom`).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "tone",
              "type": {
                "text": "undefined | \"error\" | \"primary\" | \"info\" | \"success\" | \"warning\""
              },
              "description": "Color tone: `primary` (default, theme accent), `info` (blue), `success` (green), `warning` (amber), or `error` (red) — reusing the kit's tool hues.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "arrow",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Render the arrow that points at the anchor (default `true`). Set `arrow=\"false\"` for a plain bubble with no pointer.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "show",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Open it programmatically (no-op while disabled).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "hide",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Close it programmatically.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "toggle",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Flip the open state (closes while disabled).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "open",
              "fieldName": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages). Set `el.open = true`, or `<kai-coachmark open>`; listen for `kai-open-change`."
            },
            {
              "name": "default-open",
              "fieldName": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed)."
            },
            {
              "name": "headline",
              "fieldName": "headline",
              "type": {
                "text": "undefined | string"
              },
              "description": "The bold title. Named `headline` because `title` collides with the global `HTMLElement.title` attribute (it throws at registration)."
            },
            {
              "name": "badge",
              "fieldName": "badge",
              "type": {
                "text": "undefined | string"
              },
              "description": "A small badge pill beside the headline (e.g. \"New\")."
            },
            {
              "name": "placement",
              "fieldName": "placement",
              "type": {
                "text": "undefined | string"
              },
              "description": "Floating placement relative to the anchor (default `bottom`)."
            },
            {
              "name": "tone",
              "fieldName": "tone",
              "type": {
                "text": "undefined | \"error\" | \"primary\" | \"info\" | \"success\" | \"warning\""
              },
              "description": "Color tone: `primary` (default, theme accent), `info` (blue), `success` (green), `warning` (amber), or `error` (red) — reusing the kit's tool hues."
            },
            {
              "name": "arrow",
              "fieldName": "arrow",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Render the arrow that points at the anchor (default `true`). Set `arrow=\"false\"` for a plain bubble with no pointer."
            }
          ],
          "events": [
            {
              "name": "kai-dismiss",
              "type": {
                "text": "CustomEvent<Record<string, never>>"
              },
              "description": "The × dismiss button was pressed. The consumer records that this hint was seen so it won't show again."
            },
            {
              "name": "kai-open-change",
              "type": {
                "text": "CustomEvent<{ open: false | true }>"
              },
              "description": "The coachmark opened or closed (a method, the ×, or a driven `open`)."
            }
          ],
          "cssProperties": [],
          "slots": [
            {
              "name": "content",
              "description": "The bubble body text shown under the headline."
            }
          ],
          "cssParts": [
            {
              "name": "bubble",
              "description": "The hint bubble panel. Restyle its background, radius, or padding from outside; the default is bg-primary.",
              "recipe": "kai-coachmark::part(bubble) { border-radius: 1rem }"
            },
            {
              "name": "arrow",
              "description": "The arrow pointing at the anchor. Inherits the bubble color; recolor it alongside the bubble.",
              "recipe": "kai-coachmark::part(arrow) { background: var(--color-accent) }"
            },
            {
              "name": "badge",
              "description": "The small badge pill beside the headline (e.g. \"New\").",
              "recipe": "kai-coachmark::part(badge) { text-transform: none }"
            },
            {
              "name": "title",
              "description": "The bold headline text.",
              "recipe": "kai-coachmark::part(title) { font-size: 0.9375rem }"
            },
            {
              "name": "dismiss",
              "description": "The dismiss button. Recolor or reposition it from outside.",
              "recipe": "kai-coachmark::part(dismiss) { color: var(--color-primary-foreground) }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-code-block",
          "name": "KaiCodeBlockElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "code",
              "type": {
                "text": "string"
              },
              "description": "The source code to render.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "language",
              "type": {
                "text": "undefined | string"
              },
              "description": "Language grammar (e.g. `js`, `python`). Defaults to `tsx`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "codeTheme",
              "type": {
                "text": "undefined | string"
              },
              "description": "Shiki theme name.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "codeHighlight",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable syntax highlighting (renders plain text, no Shiki).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "proseSize",
              "type": {
                "text": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
              },
              "description": "Code text sizing.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "code",
              "fieldName": "code",
              "type": {
                "text": "string"
              },
              "description": "The source code to render."
            },
            {
              "name": "language",
              "fieldName": "language",
              "type": {
                "text": "undefined | string"
              },
              "description": "Language grammar (e.g. `js`, `python`). Defaults to `tsx`."
            },
            {
              "name": "code-theme",
              "fieldName": "codeTheme",
              "type": {
                "text": "undefined | string"
              },
              "description": "Shiki theme name."
            },
            {
              "name": "code-highlight",
              "fieldName": "codeHighlight",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable syntax highlighting (renders plain text, no Shiki)."
            },
            {
              "name": "prose-size",
              "fieldName": "proseSize",
              "type": {
                "text": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
              },
              "description": "Code text sizing."
            }
          ],
          "events": [],
          "cssProperties": [
            {
              "name": "--color-code-foreground"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-command",
          "name": "KaiCommandElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "items",
              "type": {
                "text": "undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; shortcut?: undefined | string; group?: undefined | string }[]"
              },
              "description": "Flat list of items. Set as a JS property — not an HTML attribute.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "placeholder",
              "type": {
                "text": "undefined | string"
              },
              "description": "Placeholder text for the search input.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "emptyLabel",
              "type": {
                "text": "undefined | string"
              },
              "description": "Label shown when no items match the current query.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "focus",
              "parameters": [
                {
                  "name": "options?: FocusOptions"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Focus the search combobox input inside the shadow root so the palette is type-ready on demand (Shadow-DOM autofocus is unreliable, so hosts call this after opening the palette).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "blur",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Blur the focused search input.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "clear",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Reset the search query to empty — re-showing all items — and fire `kai-query-change` with `''`. Mirrors the Escape-key behavior.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "placeholder",
              "fieldName": "placeholder",
              "type": {
                "text": "undefined | string"
              },
              "description": "Placeholder text for the search input."
            },
            {
              "name": "empty-label",
              "fieldName": "emptyLabel",
              "type": {
                "text": "undefined | string"
              },
              "description": "Label shown when no items match the current query."
            }
          ],
          "events": [
            {
              "name": "kai-active-change",
              "type": {
                "text": "CustomEvent<{ id: undefined | string }>"
              },
              "description": "Fired when the highlighted/active item changes — via Arrow keys or when filtering re-clamps the active row. `id` is the newly active item's id, or `undefined` when no item is active (e.g. the filtered list is empty). Lets a host preview the active item without committing a selection."
            },
            {
              "name": "kai-query-change",
              "type": {
                "text": "CustomEvent<{ value: string }>"
              },
              "description": "Fired on every keystroke in the search input."
            },
            {
              "name": "kai-select",
              "type": {
                "text": "CustomEvent<{ id: string }>"
              },
              "description": "Fired when the user selects an item (click or Enter)."
            }
          ],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "shortcut",
              "description": "The right-aligned per-row keyboard shortcut, rendered as kai-kbd key caps. Shown only when a row carries a `shortcut`.",
              "recipe": "kai-command::part(shortcut) { opacity: 0.8 }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-compare",
          "name": "KaiCompareElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "data",
              "type": {
                "text": "undefined | Record<string, unknown>"
              },
              "description": "The compare definition (prompt + the two candidates). Set as a JS PROPERTY: `el.data = { prompt, candidates: [A, B], collapse? }`. Import `ResponseCompareData` from `@kitn.ai/ui` for the full shape.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "compareId",
              "type": {
                "text": "undefined | string"
              },
              "description": "Stable id correlating every emitted event. Attribute: `compare-id`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "selection",
              "type": {
                "text": "undefined | Record<string, unknown>"
              },
              "description": "Re-hydrate / control the user's pick. Set as a JS PROPERTY: `el.selection = { chosenId, rejectedIds }`. Renders the collapsed winner.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "layout",
              "type": {
                "text": "undefined | \"auto\" | \"columns\" | \"tabs\""
              },
              "description": "Layout: `'auto'` (default — columns when wide, tabs when narrow, by CONTAINER width) | `'columns'` (side-by-side) | `'tabs'` (pills to switch). Attribute: `layout`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "proseSize",
              "type": {
                "text": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
              },
              "description": "Prose/text size for the rendered candidates. Attribute: `prose-size`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "codeTheme",
              "type": {
                "text": "undefined | string"
              },
              "description": "Shiki theme for code blocks in the candidates. Attribute: `code-theme`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "codeHighlight",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Whether code blocks are syntax-highlighted. Attribute: `code-highlight`.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "select",
              "parameters": [
                {
                  "name": "candidateId: string"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Programmatically commit a pick by candidate id — same path as the \"Pick this\" button: fires kai-compare-select and optimistically collapses (single-shot; inert while streaming or already resolved). `select` does NOT collide with the `selection` prop (distinct identifier).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "focus",
              "parameters": [
                {
                  "name": "options?: FocusOptions"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Focus the current roving tab stop (the focused candidate's \"Pick this\" radio) so a consumer can move keyboard focus into the radiogroup.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "compare-id",
              "fieldName": "compareId",
              "type": {
                "text": "undefined | string"
              },
              "description": "Stable id correlating every emitted event. Attribute: `compare-id`."
            },
            {
              "name": "layout",
              "fieldName": "layout",
              "type": {
                "text": "undefined | \"auto\" | \"columns\" | \"tabs\""
              },
              "description": "Layout: `'auto'` (default — columns when wide, tabs when narrow, by CONTAINER width) | `'columns'` (side-by-side) | `'tabs'` (pills to switch). Attribute: `layout`."
            },
            {
              "name": "prose-size",
              "fieldName": "proseSize",
              "type": {
                "text": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
              },
              "description": "Prose/text size for the rendered candidates. Attribute: `prose-size`."
            },
            {
              "name": "code-theme",
              "fieldName": "codeTheme",
              "type": {
                "text": "undefined | string"
              },
              "description": "Shiki theme for code blocks in the candidates. Attribute: `code-theme`."
            },
            {
              "name": "code-highlight",
              "fieldName": "codeHighlight",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Whether code blocks are syntax-highlighted. Attribute: `code-highlight`."
            }
          ],
          "events": [
            {
              "name": "kai-compare-select",
              "type": {
                "text": "CustomEvent<{ chosenId: string; rejectedIds: string[]; at?: undefined | number }>"
              },
              "description": "The user committed a pick. `detail` = `{ chosenId, rejectedIds, at }`."
            },
            {
              "name": "kai-error",
              "type": {
                "text": "CustomEvent<{ compareId: string; message: string }>"
              },
              "description": "The definition was unusable."
            },
            {
              "name": "kai-ready",
              "type": {
                "text": "CustomEvent<{ compareId: string }>"
              },
              "description": "Both candidates have settled and the pick is live."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-composer",
          "name": "KaiComposerElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "undefined | string | ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]"
              },
              "description": "Controlled value — string or a full ComposerDoc (set as JS property).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "placeholder",
              "type": {
                "text": "undefined | string"
              },
              "description": "Placeholder text shown when the composer is empty.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the composer entirely (non-interactive).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "loading",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a loading/streaming state and block submit.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "maxHeight",
              "type": {
                "text": "undefined | string | number"
              },
              "description": "Maximum height in px before the content scrolls. Default 240.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "submitOnEnter",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Whether pressing Enter (without Shift) submits. Default true.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "triggers",
              "type": {
                "text": "undefined | { char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]"
              },
              "description": "Trigger definitions — set as a JS property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "highlights",
              "type": {
                "text": "undefined | (string | { pattern: string; flags?: undefined | string; class?: undefined | string })[]"
              },
              "description": "Keyword highlight rules — set as a JS property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "kindIcons",
              "type": {
                "text": "undefined | Record<string, string>"
              },
              "description": "Default icon per entity kind (kind → image URL/data-URI) for items without their own `icon`. Overrides the built-in agent/plugin glyphs. JS property.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "focus",
              "parameters": [
                {
                  "name": "options?: FocusOptions"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Focus the editable element. `focus`/`blur` are NOT composed natively, so a host-level focus() can't reach the editable inside the shadow root — this is the only way to focus the composer programmatically.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "blur",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Blur the editable element.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "clear",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Empty the composer to a blank doc (resets the internal value + history baseline; fires kai-value-change).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "send",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Submit the current content programmatically — same path as Enter (fires kai-submit). Named `send`, not `submit`, to match the shared vocabulary and avoid any submit collision.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "insertEntity",
              "parameters": [
                {
                  "name": "entity: EntityRef"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Insert an atomic entity pill (skill/agent/plugin) at the caret without typing a trigger (fires kai-entity-add).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "placeholder",
              "fieldName": "placeholder",
              "type": {
                "text": "undefined | string"
              },
              "description": "Placeholder text shown when the composer is empty."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the composer entirely (non-interactive)."
            },
            {
              "name": "loading",
              "fieldName": "loading",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a loading/streaming state and block submit."
            },
            {
              "name": "max-height",
              "fieldName": "maxHeight",
              "type": {
                "text": "undefined | string | number"
              },
              "description": "Maximum height in px before the content scrolls. Default 240."
            },
            {
              "name": "submit-on-enter",
              "fieldName": "submitOnEnter",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Whether pressing Enter (without Shift) submits. Default true."
            }
          ],
          "events": [
            {
              "name": "kai-blur",
              "type": {
                "text": "CustomEvent<{ originalEvent: FocusEvent }>"
              },
              "description": "The composer lost focus."
            },
            {
              "name": "kai-entity-add",
              "type": {
                "text": "CustomEvent<{ entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } }>"
              },
              "description": "An entity pill was inserted into the composer."
            },
            {
              "name": "kai-entity-remove",
              "type": {
                "text": "CustomEvent<{ entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } }>"
              },
              "description": "An entity pill was deleted from the composer."
            },
            {
              "name": "kai-focus",
              "type": {
                "text": "CustomEvent<{ originalEvent: FocusEvent }>"
              },
              "description": "The composer gained focus. `focus`/`blur` are NOT composed natively, so they don't escape the shadow root — these re-expose them on the host. (For `keydown`/`paste`/`focusin`/`focusout`, listen NATIVELY on `<kai-composer>`: they're composed and already cross the shadow boundary.)"
            },
            {
              "name": "kai-submit",
              "type": {
                "text": "CustomEvent<{ doc: ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]; text: string; entities: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }>"
              },
              "description": "The user submitted the composer (Enter or programmatic submit)."
            },
            {
              "name": "kai-trigger",
              "type": {
                "text": "CustomEvent<{ char: string; query: string; rect: DOMRect }>"
              },
              "description": "A trigger character was detected at the caret (e.g. `/` or `@`)."
            },
            {
              "name": "kai-trigger-close",
              "type": {
                "text": "CustomEvent<Record<string, never>>"
              },
              "description": "The active trigger was dismissed (Escape, space, or outside click)."
            },
            {
              "name": "kai-value-change",
              "type": {
                "text": "CustomEvent<{ doc: ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]; text: string; entities: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }>"
              },
              "description": "The content changed (fires on every input event)."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-confirm",
          "name": "KaiConfirmElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "data",
              "type": {
                "text": "undefined | Record<string, unknown>"
              },
              "description": "The confirm definition (the CardEnvelope.data). Set as a JS PROPERTY: `el.data = { body, tone, actions:[…] }`. Import `ConfirmCardData` from `@kitn.ai/ui` for the full shape.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "cardId",
              "type": {
                "text": "undefined | string"
              },
              "description": "Stable card id correlating every emitted CardEvent. Attribute: `card-id`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "heading",
              "type": {
                "text": "undefined | string"
              },
              "description": "Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "autofocus",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Focus the default action on mount (off by default — no focus-stealing). Attribute: `autofocus`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "resolution",
              "type": {
                "text": "undefined | Record<string, unknown>"
              },
              "description": "Set when the user resolved this card; renders the read-only view. Property: `el.resolution = { kind:'action', action:'…' }`.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "focus",
              "parameters": [
                {
                  "name": "options?: FocusOptions"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Focus the default action button (or the first action if none is default) — the same target `autofocus` focuses on mount, but on demand.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "confirm",
              "parameters": [
                {
                  "name": "actionId?: string"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Activate an action by id — emits the `action` verb on kai-card and resolves the card (single-shot). With no id, invokes the default action.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "dismiss",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Trigger the dismiss path — emits `dismiss` on kai-card and optimistically collapses the card to its re-openable stub.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "reopen",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Re-open a dismissed card from its stub — emits `reopen` on kai-card.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "card-id",
              "fieldName": "cardId",
              "type": {
                "text": "undefined | string"
              },
              "description": "Stable card id correlating every emitted CardEvent. Attribute: `card-id`."
            },
            {
              "name": "heading",
              "fieldName": "heading",
              "type": {
                "text": "undefined | string"
              },
              "description": "Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`."
            },
            {
              "name": "autofocus",
              "fieldName": "autofocus",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Focus the default action on mount (off by default — no focus-stealing). Attribute: `autofocus`."
            }
          ],
          "events": [],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-context",
          "name": "KaiContextElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "context",
              "type": {
                "text": "undefined | { usedTokens: number; maxTokens: number; inputTokens?: undefined | number; outputTokens?: undefined | number; reasoningTokens?: undefined | number; cacheTokens?: undefined | number; estimatedCost?: undefined | number }"
              },
              "description": "Token-usage data. Set as a JS property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "warnThreshold",
              "type": {
                "text": "undefined | number"
              },
              "description": "Fraction (0–1) above which the meter turns yellow. Defaults to `0.7` (70%).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "dangerThreshold",
              "type": {
                "text": "undefined | number"
              },
              "description": "Fraction (0–1) above which the meter turns red. Defaults to `0.9` (90%).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "warn-threshold",
              "fieldName": "warnThreshold",
              "type": {
                "text": "undefined | number"
              },
              "description": "Fraction (0–1) above which the meter turns yellow. Defaults to `0.7` (70%)."
            },
            {
              "name": "danger-threshold",
              "fieldName": "dangerThreshold",
              "type": {
                "text": "undefined | number"
              },
              "description": "Fraction (0–1) above which the meter turns red. Defaults to `0.9` (90%)."
            }
          ],
          "events": [
            {
              "name": "kai-threshold-change",
              "type": {
                "text": "CustomEvent<{ level: \"ok\" | \"warn\" | \"danger\" }>"
              },
              "description": "Fires when the computed severity level changes (ok → warn → danger or back). `detail.level` is `'ok'`, `'warn'`, or `'danger'`."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-conversations",
          "name": "KaiConversationsElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "groups",
              "type": {
                "text": "{ id: string; userId?: undefined | string; teamId?: undefined | string; name: string; sortOrder: number; createdAt: string }[]"
              },
              "description": "Pre-bucketed conversation groups (e.g. \"Today\", \"Yesterday\"), each with its own conversations. Use this when you want to control the grouping/headers yourself; otherwise pass a flat `conversations` array. Set as a JS property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "conversations",
              "type": {
                "text": "{ id: string; title: string; groupId?: undefined | string; scope: { type: \"document\" | \"collection\"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string; trailing?: undefined | string }[]"
              },
              "description": "A flat list of conversation summaries; the component buckets them by recency for you. Ignored when `groups` is provided. Set as a JS property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "activeId",
              "type": {
                "text": "undefined | string"
              },
              "description": "The id of the currently-open conversation, highlighted in the list.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "collapsed",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Controlled collapsed state. Set as a JS property (`el.collapsed = true`) to drive the rail from your app, updating it in response to `kai-collapse-toggle`. Omit for uncontrolled (the element manages it). Collapsed shrinks the rail to a floating reopen button.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultCollapsed",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial collapsed state when uncontrolled (default false). Use the `default-collapsed` attribute to start collapsed in plain HTML.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "focus",
              "parameters": [
                {
                  "name": "options?: FocusOptions"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Focus the built-in search input inside the shadow root.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "clear",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Clear the internal search query (resets the list filter) and fire kai-search with an empty string.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "select",
              "parameters": [
                {
                  "name": "id: string"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Programmatically select a conversation by id — mirror of the kai-conversation-select event (a convenience over driving `activeId`).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "collapse",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Collapse the rail to its floating reopen button (fires `kai-collapse-toggle`).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "expand",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Expand the rail back to the full list (fires `kai-collapse-toggle`).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "toggle",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Toggle the rail collapsed/expanded (fires `kai-collapse-toggle`).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "active-id",
              "fieldName": "activeId",
              "type": {
                "text": "undefined | string"
              },
              "description": "The id of the currently-open conversation, highlighted in the list."
            },
            {
              "name": "collapsed",
              "fieldName": "collapsed",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Controlled collapsed state. Set as a JS property (`el.collapsed = true`) to drive the rail from your app, updating it in response to `kai-collapse-toggle`. Omit for uncontrolled (the element manages it). Collapsed shrinks the rail to a floating reopen button."
            },
            {
              "name": "default-collapsed",
              "fieldName": "defaultCollapsed",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial collapsed state when uncontrolled (default false). Use the `default-collapsed` attribute to start collapsed in plain HTML."
            }
          ],
          "events": [
            {
              "name": "kai-collapse-toggle",
              "type": {
                "text": "CustomEvent<{ collapsed: false | true }>"
              },
              "description": "The rail was collapsed or expanded (via the toggle, the reopen button, or a `collapse()`/`expand()`/`toggle()` call)."
            },
            {
              "name": "kai-conversation-select",
              "type": {
                "text": "CustomEvent<{ id: string }>"
              },
              "description": "A conversation was selected."
            },
            {
              "name": "kai-new-chat",
              "type": {
                "text": "CustomEvent<Record<string, never>>"
              },
              "description": "The \"New chat\" button was clicked."
            },
            {
              "name": "kai-search",
              "type": {
                "text": "CustomEvent<{ query: string }>"
              },
              "description": "The built-in search box query changed (typing, or a programmatic `clear()` which fires it with `''`). Lets a consumer mirror or server-side the filter."
            },
            {
              "name": "kai-toggle-sidebar",
              "type": {
                "text": "CustomEvent<Record<string, never>>"
              },
              "description": "The sidebar toggle was clicked."
            }
          ],
          "cssProperties": [
            {
              "name": "--color-sidebar"
            },
            {
              "name": "--color-scrollbar-thumb"
            }
          ],
          "slots": [
            {
              "name": "header",
              "description": "Full custom title bar; replaces the built-in toggle / \"Chats\" / New-chat row."
            },
            {
              "name": "empty",
              "description": "Custom zero-state shown when there are no conversations; replaces the built-in \"No conversations yet\"."
            },
            {
              "name": "footer",
              "description": "A row below the list — account, settings, or usage."
            }
          ],
          "cssParts": [
            {
              "name": "trailing",
              "description": "The right-aligned trailing text on each conversation row (a count, status, or relative time). Set it per item via the `trailing` field; otherwise a short auto relative time is derived from `updatedAt`. Recolor or resize it from outside.",
              "recipe": "kai-conversations::part(trailing) { color: var(--color-primary); font-variant-numeric: tabular-nums }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-dialog",
          "name": "KaiDialogElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages on Escape/backdrop). Set `el.open = true`, or `<kai-dialog open>`; listen for `kai-open-change`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "show",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Open it programmatically (no-op while disabled).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "hide",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Close it programmatically.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "toggle",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Flip the open state (closes while disabled).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "focus",
              "parameters": [
                {
                  "name": "options?: FocusOptions"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Move focus to the dialog panel (no-op while closed).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "open",
              "fieldName": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages on Escape/backdrop). Set `el.open = true`, or `<kai-dialog open>`; listen for `kai-open-change`."
            },
            {
              "name": "default-open",
              "fieldName": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed)."
            }
          ],
          "events": [
            {
              "name": "kai-open-change",
              "type": {
                "text": "CustomEvent<{ open: false | true }>"
              },
              "description": "The dialog opened or closed (Escape, backdrop click, a driven `open`, or a method)."
            }
          ],
          "cssProperties": [],
          "slots": [
            {
              "name": "header",
              "description": "Optional title region at the top of the panel."
            },
            {
              "name": "footer",
              "description": "Optional actions region at the bottom of the panel."
            }
          ],
          "cssParts": [
            {
              "name": "backdrop",
              "description": "The full-area scrim behind the panel. Restyle its color/blur.",
              "recipe": "kai-dialog::part(backdrop) { background: rgb(0 0 0 / 0.6) }"
            },
            {
              "name": "panel",
              "description": "The centered modal panel. Restyle width, radius, padding.",
              "recipe": "kai-dialog::part(panel) { max-width: 32rem }"
            },
            {
              "name": "body",
              "description": "The scrolling content region (the default slot).",
              "recipe": "kai-dialog::part(body) { padding: 1.25rem }"
            },
            {
              "name": "header",
              "description": "Optional title region at the top of the panel."
            },
            {
              "name": "footer",
              "description": "Optional actions region at the bottom of the panel."
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-editable-label",
          "name": "KaiEditableLabelElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "undefined | string"
              },
              "description": "The label text — settable and reflected to the `value` attribute. Read `el.value` for live state.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "editing",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Controlled edit state. `el.editing = true` opens the field; reflected to the `editing` attribute.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "placeholder",
              "type": {
                "text": "undefined | string"
              },
              "description": "Placeholder shown while editing / when the value is empty.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable entering edit mode.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "edit",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "value",
              "fieldName": "value",
              "type": {
                "text": "undefined | string"
              },
              "description": "The label text — settable and reflected to the `value` attribute. Read `el.value` for live state."
            },
            {
              "name": "editing",
              "fieldName": "editing",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Controlled edit state. `el.editing = true` opens the field; reflected to the `editing` attribute."
            },
            {
              "name": "placeholder",
              "fieldName": "placeholder",
              "type": {
                "text": "undefined | string"
              },
              "description": "Placeholder shown while editing / when the value is empty."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable entering edit mode."
            }
          ],
          "events": [
            {
              "name": "kai-cancel",
              "type": {
                "text": "CustomEvent<Record<string, never>>"
              },
              "description": "Edit was cancelled (Esc); the text is restored."
            },
            {
              "name": "kai-rename",
              "type": {
                "text": "CustomEvent<{ value: string }>"
              },
              "description": "Committed a changed value (Enter / blur)."
            }
          ],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "text",
              "description": "The read-mode label text. Restyle its typography; it swaps to the input on edit.",
              "recipe": "kai-editable-label::part(text) { font-weight: 600 }"
            },
            {
              "name": "input",
              "description": "The edit-mode input (the composed kai-input field).",
              "recipe": "kai-editable-label::part(input) { font: inherit }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-embed",
          "name": "KaiEmbedElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "cardId",
              "type": {
                "text": "undefined | string"
              },
              "description": "Stable card id correlating every emitted event. Set as an attribute or property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "data",
              "type": {
                "text": "undefined | { provider: \"youtube\" | \"vimeo\" | \"generic\"; id?: undefined | string; url?: undefined | string; title?: undefined | string; poster?: undefined | string; start?: undefined | number; aspectRatio?: undefined | \"16:9\" | \"4:3\" | \"1:1\" | \"9:16\" }"
              },
              "description": "The embed payload (provider + id/url + options). Set as a JS **property** (object).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "card-id",
              "fieldName": "cardId",
              "type": {
                "text": "undefined | string"
              },
              "description": "Stable card id correlating every emitted event. Set as an attribute or property."
            }
          ],
          "events": [],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-empty",
          "name": "KaiEmptyElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "emptyTitle",
              "type": {
                "text": "undefined | string"
              },
              "description": "Title text. Attribute: `empty-title` (`title` is a global HTML attribute).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "description",
              "type": {
                "text": "undefined | string"
              },
              "description": "Description text.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "empty-title",
              "fieldName": "emptyTitle",
              "type": {
                "text": "undefined | string"
              },
              "description": "Title text. Attribute: `empty-title` (`title` is a global HTML attribute)."
            },
            {
              "name": "description",
              "fieldName": "description",
              "type": {
                "text": "undefined | string"
              },
              "description": "Description text."
            }
          ],
          "events": [],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-feedback-bar",
          "name": "KaiFeedbackBarElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "barTitle",
              "type": {
                "text": "undefined | string"
              },
              "description": "The banner label (e.g. \"Was this helpful?\"). Attribute: `bar-title` (`title` is avoided — it's a global HTML attribute).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "collectDetail",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "When set, a not-helpful vote opens an optional detail form before the thank-you confirmation. Attribute: `collect-detail`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "categories",
              "type": {
                "text": "undefined | string[]"
              },
              "description": "Optional category chips for the detail form. Set as a JS property (array).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "detailTitle",
              "type": {
                "text": "undefined | string"
              },
              "description": "Heading for the detail form. Attribute: `detail-title`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "detailPlaceholder",
              "type": {
                "text": "undefined | string"
              },
              "description": "Placeholder for the detail comment box. Attribute: `detail-placeholder`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "submitLabel",
              "type": {
                "text": "undefined | string"
              },
              "description": "Submit button label in the detail form. Attribute: `submit-label`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "thanksMessage",
              "type": {
                "text": "undefined | string"
              },
              "description": "Confirmation copy shown after a vote/submit. Attribute: `thanks-message`.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "bar-title",
              "fieldName": "barTitle",
              "type": {
                "text": "undefined | string"
              },
              "description": "The banner label (e.g. \"Was this helpful?\"). Attribute: `bar-title` (`title` is avoided — it's a global HTML attribute)."
            },
            {
              "name": "collect-detail",
              "fieldName": "collectDetail",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "When set, a not-helpful vote opens an optional detail form before the thank-you confirmation. Attribute: `collect-detail`."
            },
            {
              "name": "detail-title",
              "fieldName": "detailTitle",
              "type": {
                "text": "undefined | string"
              },
              "description": "Heading for the detail form. Attribute: `detail-title`."
            },
            {
              "name": "detail-placeholder",
              "fieldName": "detailPlaceholder",
              "type": {
                "text": "undefined | string"
              },
              "description": "Placeholder for the detail comment box. Attribute: `detail-placeholder`."
            },
            {
              "name": "submit-label",
              "fieldName": "submitLabel",
              "type": {
                "text": "undefined | string"
              },
              "description": "Submit button label in the detail form. Attribute: `submit-label`."
            },
            {
              "name": "thanks-message",
              "fieldName": "thanksMessage",
              "type": {
                "text": "undefined | string"
              },
              "description": "Confirmation copy shown after a vote/submit. Attribute: `thanks-message`."
            }
          ],
          "events": [
            {
              "name": "kai-close",
              "type": {
                "text": "CustomEvent"
              },
              "description": "The user dismissed the banner."
            },
            {
              "name": "kai-feedback",
              "type": {
                "text": "CustomEvent<{ value: \"helpful\" | \"not-helpful\" }>"
              },
              "description": "The user rated the response. `value` is `'helpful'` or `'not-helpful'`."
            },
            {
              "name": "kai-feedback-detail",
              "type": {
                "text": "CustomEvent<{ value: \"helpful\" | \"not-helpful\"; category?: undefined | string; comment?: undefined | string }>"
              },
              "description": "The user submitted the optional detail form (`collect-detail`)."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-file-tree",
          "name": "KaiFileTreeElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "files",
              "type": {
                "text": "{ path: string; url?: undefined | string; code?: undefined | string; language?: undefined | string; type?: undefined | \"html\" | \"pdf\" | \"image\" | \"other\"; additions?: undefined | number; deletions?: undefined | number; status?: undefined | \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"untracked\" }[]"
              },
              "description": "The files to render. Set as a JS property (array of `{ path, url?, code?, language?, type?, additions?, deletions?, status? }`).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "activeFile",
              "type": {
                "text": "undefined | string"
              },
              "description": "Selected file path — highlighted in the tree.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultExpanded",
              "type": {
                "text": "undefined | string[]"
              },
              "description": "Folder paths expanded initially. Omit to start with all folders open.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "summary",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a changed-files summary header (file count + summed `+/-` + Collapse-all). Attribute: `summary`. Off by default.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "active-file",
              "fieldName": "activeFile",
              "type": {
                "text": "undefined | string"
              },
              "description": "Selected file path — highlighted in the tree."
            },
            {
              "name": "summary",
              "fieldName": "summary",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a changed-files summary header (file count + summed `+/-` + Collapse-all). Attribute: `summary`. Off by default."
            }
          ],
          "events": [
            {
              "name": "kai-select",
              "type": {
                "text": "CustomEvent<{ path: string }>"
              },
              "description": "Fired when a file is selected. `detail.path` = the file's path."
            }
          ],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "summary",
              "description": "The changed-files summary header (the file count, the summed +additions/-deletions, and the Collapse-all/Expand-all toggle). Rendered only when the `summary` attribute is set; restyle or hide it from outside.",
              "recipe": "kai-file-tree::part(summary) { border-bottom: none; padding-block: 0.5rem }"
            },
            {
              "name": "status",
              "description": "The per-row change-status letter (A/M/D/R/U), shown when a file carries a `status`. Colored with the conventional VCS tool hues; restyle from outside.",
              "recipe": "kai-file-tree::part(status) { font-weight: 700 }"
            },
            {
              "name": "stat-additions",
              "description": "The trailing `+N` additions stat on a file row (success/green tool hue, tabular-nums). Shown only when a file carries `additions`.",
              "recipe": "kai-file-tree::part(stat-additions) { color: var(--color-tool-green) }"
            },
            {
              "name": "stat-deletions",
              "description": "The trailing `-N` deletions stat on a file row (error/red tool hue, tabular-nums). Shown only when a file carries `deletions`.",
              "recipe": "kai-file-tree::part(stat-deletions) { color: var(--color-tool-red) }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-file-upload",
          "name": "KaiFileUploadElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "multiple",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Allow selecting multiple files (default true).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "accept",
              "type": {
                "text": "undefined | string"
              },
              "description": "`accept` attribute for the file picker (e.g. `image/*`).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the dropzone — no clicking, no drag-and-drop.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Default dropzone label (overridable via the default slot).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "multiple",
              "fieldName": "multiple",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Allow selecting multiple files (default true)."
            },
            {
              "name": "accept",
              "fieldName": "accept",
              "type": {
                "text": "undefined | string"
              },
              "description": "`accept` attribute for the file picker (e.g. `image/*`)."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the dropzone — no clicking, no drag-and-drop."
            },
            {
              "name": "label",
              "fieldName": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Default dropzone label (overridable via the default slot)."
            }
          ],
          "events": [
            {
              "name": "kai-files-added",
              "type": {
                "text": "CustomEvent<{ files: File[] }>"
              },
              "description": "Files were picked or dropped."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-form",
          "name": "KaiFormElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "data",
              "type": {
                "text": "undefined | Record<string, unknown>"
              },
              "description": "The form definition — a JSON Schema (`type:'object'`) + `x-kai-*` UI hints (the CardEnvelope.data). Set as a JS PROPERTY: `el.data = { type:'object', properties:{…} }`. Import the `FormDefinition` type from `@kitn.ai/ui` for the full shape (it is self-referential, so the element types it loosely).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "cardId",
              "type": {
                "text": "undefined | string"
              },
              "description": "Stable card id correlating every emitted CardEvent. Attribute: `card-id`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "heading",
              "type": {
                "text": "undefined | string"
              },
              "description": "Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "resolution",
              "type": {
                "text": "undefined | Record<string, unknown>"
              },
              "description": "Set when the user resolved this card; renders the read-only view. Property: `el.resolution = { kind:'submit', data:{…} }`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "values",
              "type": {
                "text": "undefined | Record<string, unknown>"
              },
              "description": "Controlled field values (JS property). When set, it wins over local edits.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultValues",
              "type": {
                "text": "undefined | Record<string, unknown>"
              },
              "description": "Initial values overlaying the schema defaults (uncontrolled seed; JS property).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable all fields + submit. Attribute: `disabled`.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "focus",
              "parameters": [
                {
                  "name": "options?: FocusOptions"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Focus the first control, or the first INVALID control after a failed validation.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "send",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Validate + submit programmatically — focus the first invalid field on failure, else emit the `submit` CardEvent and resolve. Named `send`, not `submit`.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "validate",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Run client-side validation now and return `{ valid, errors? }` WITHOUT submitting.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "reset",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Re-seed the form from each field's `default` and clear errors.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "dismiss",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Trigger the dismiss path (emit `dismiss` + collapse to the re-openable stub).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "reopen",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Re-open a dismissed card from its stub (emit `reopen`).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "card-id",
              "fieldName": "cardId",
              "type": {
                "text": "undefined | string"
              },
              "description": "Stable card id correlating every emitted CardEvent. Attribute: `card-id`."
            },
            {
              "name": "heading",
              "fieldName": "heading",
              "type": {
                "text": "undefined | string"
              },
              "description": "Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable all fields + submit. Attribute: `disabled`."
            }
          ],
          "events": [
            {
              "name": "kai-values-change",
              "type": {
                "text": "CustomEvent<{ values: Record<string, unknown>; valid: false | true }>"
              },
              "description": "The form's values changed on input — current coerced values + validity."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-hover-card",
          "name": "KaiHoverCardElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "openDelay",
              "type": {
                "text": "undefined | number"
              },
              "description": "Delay (ms) before the card opens on hover. Defaults to 0 (focus opens it immediately too).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "closeDelay",
              "type": {
                "text": "undefined | number"
              },
              "description": "Delay (ms) before it closes after the pointer leaves. Defaults to 300.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "placement",
              "type": {
                "text": "undefined | string"
              },
              "description": "Preferred placement: `'top' | 'bottom' | 'left' | 'right'` (+ optional `-start`/`-end`). Defaults to `'bottom'`; flips to stay in view.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute, the element still self-manages on hover). Set `el.open = true`, or `<kai-hover-card open>`; listen for `kai-open-change`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Suppress the hover behavior entirely without unmounting.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "show",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Open it programmatically (no-op while disabled).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "hide",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Close it programmatically.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "toggle",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Flip the open state (closes while disabled).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "open-delay",
              "fieldName": "openDelay",
              "type": {
                "text": "undefined | number"
              },
              "description": "Delay (ms) before the card opens on hover. Defaults to 0 (focus opens it immediately too)."
            },
            {
              "name": "close-delay",
              "fieldName": "closeDelay",
              "type": {
                "text": "undefined | number"
              },
              "description": "Delay (ms) before it closes after the pointer leaves. Defaults to 300."
            },
            {
              "name": "placement",
              "fieldName": "placement",
              "type": {
                "text": "undefined | string"
              },
              "description": "Preferred placement: `'top' | 'bottom' | 'left' | 'right'` (+ optional `-start`/`-end`). Defaults to `'bottom'`; flips to stay in view."
            },
            {
              "name": "open",
              "fieldName": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute, the element still self-manages on hover). Set `el.open = true`, or `<kai-hover-card open>`; listen for `kai-open-change`."
            },
            {
              "name": "default-open",
              "fieldName": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed)."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Suppress the hover behavior entirely without unmounting."
            }
          ],
          "events": [
            {
              "name": "kai-open-change",
              "type": {
                "text": "CustomEvent<{ open: false | true }>"
              },
              "description": "The card opened or closed (by hover/focus, outside-click, or a method)."
            }
          ],
          "cssProperties": [],
          "slots": [
            {
              "name": "card",
              "description": "The rich content shown in the floating hover card."
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-icon",
          "name": "KaiIconElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "name",
              "type": {
                "text": "undefined | string"
              },
              "description": "A curated icon name (e.g. `\"mic\"`, `\"globe\"`), an image URL/data-URI, or plain text.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\" | \"lg\""
              },
              "description": "Size token: `sm` | `md` (default) | `lg`.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "name",
              "fieldName": "name",
              "type": {
                "text": "undefined | string"
              },
              "description": "A curated icon name (e.g. `\"mic\"`, `\"globe\"`), an image URL/data-URI, or plain text."
            },
            {
              "name": "size",
              "fieldName": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\" | \"lg\""
              },
              "description": "Size token: `sm` | `md` (default) | `lg`."
            }
          ],
          "events": [],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "icon",
              "description": "The icon wrapper. Inherits `currentColor` and the `size` prop by default; recolor or resize it from outside.",
              "recipe": "kai-icon::part(icon) { color: var(--color-primary) }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-image",
          "name": "KaiImageElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "base64",
              "type": {
                "text": "undefined | string"
              },
              "description": "Base64-encoded image data (pair with `media-type`).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "bytes",
              "type": {
                "text": "undefined | Uint8Array<ArrayBufferLike>"
              },
              "description": "Raw image bytes (set as a JS property).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "alt",
              "type": {
                "text": "undefined | string"
              },
              "description": "Alt text.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "mediaType",
              "type": {
                "text": "undefined | string"
              },
              "description": "MIME type (default `image/png`).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "base64",
              "fieldName": "base64",
              "type": {
                "text": "undefined | string"
              },
              "description": "Base64-encoded image data (pair with `media-type`)."
            },
            {
              "name": "alt",
              "fieldName": "alt",
              "type": {
                "text": "undefined | string"
              },
              "description": "Alt text."
            },
            {
              "name": "media-type",
              "fieldName": "mediaType",
              "type": {
                "text": "undefined | string"
              },
              "description": "MIME type (default `image/png`)."
            }
          ],
          "events": [],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-input",
          "name": "KaiInputElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "type",
              "type": {
                "text": "undefined | string"
              },
              "description": "Native input type: `text` (default) · `email` · `url` · `search` · `tel` · `password` · `number`. Single-line only.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "undefined | string"
              },
              "description": "Controlled value — settable and reflected to the `value` attribute. `el.value = 'hi'` drives it (no event); typing updates it and fires `kai-input`. Read `el.value` for live state.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "placeholder",
              "type": {
                "text": "undefined | string"
              },
              "description": "Placeholder shown when empty.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Field label, linked to the input.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "hint",
              "type": {
                "text": "undefined | string"
              },
              "description": "Helper text below the control.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "undefined | string"
              },
              "description": "Error text; flips the field invalid (`aria-invalid` + destructive border).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\""
              },
              "description": "Control density: `sm` or `md`. Defaults to `md`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable interaction.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Make the input read-only.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "required",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Mark the input required.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "invalid",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Force the invalid state without an `error` string.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "name",
              "type": {
                "text": "undefined | string"
              },
              "description": "Form-control name.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "autocomplete",
              "type": {
                "text": "undefined | string"
              },
              "description": "Autofill hint forwarded to the inner input (e.g. `email`, `current-password`).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "inputmode",
              "type": {
                "text": "undefined | string"
              },
              "description": "Virtual-keyboard hint forwarded to the inner input (e.g. `numeric`, `email`).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "focus",
              "parameters": [
                {
                  "name": "options?: FocusOptions"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Focus the inner input (the host can't reach into the shadow root).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "select",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Select the inner input's text.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "clear",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Empty the value and fire `kai-change` with `''`.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "type",
              "fieldName": "type",
              "type": {
                "text": "undefined | string"
              },
              "description": "Native input type: `text` (default) · `email` · `url` · `search` · `tel` · `password` · `number`. Single-line only."
            },
            {
              "name": "value",
              "fieldName": "value",
              "type": {
                "text": "undefined | string"
              },
              "description": "Controlled value — settable and reflected to the `value` attribute. `el.value = 'hi'` drives it (no event); typing updates it and fires `kai-input`. Read `el.value` for live state."
            },
            {
              "name": "placeholder",
              "fieldName": "placeholder",
              "type": {
                "text": "undefined | string"
              },
              "description": "Placeholder shown when empty."
            },
            {
              "name": "label",
              "fieldName": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Field label, linked to the input."
            },
            {
              "name": "hint",
              "fieldName": "hint",
              "type": {
                "text": "undefined | string"
              },
              "description": "Helper text below the control."
            },
            {
              "name": "error",
              "fieldName": "error",
              "type": {
                "text": "undefined | string"
              },
              "description": "Error text; flips the field invalid (`aria-invalid` + destructive border)."
            },
            {
              "name": "size",
              "fieldName": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\""
              },
              "description": "Control density: `sm` or `md`. Defaults to `md`."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable interaction."
            },
            {
              "name": "readonly",
              "fieldName": "readonly",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Make the input read-only."
            },
            {
              "name": "required",
              "fieldName": "required",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Mark the input required."
            },
            {
              "name": "invalid",
              "fieldName": "invalid",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Force the invalid state without an `error` string."
            },
            {
              "name": "name",
              "fieldName": "name",
              "type": {
                "text": "undefined | string"
              },
              "description": "Form-control name."
            },
            {
              "name": "autocomplete",
              "fieldName": "autocomplete",
              "type": {
                "text": "undefined | string"
              },
              "description": "Autofill hint forwarded to the inner input (e.g. `email`, `current-password`)."
            },
            {
              "name": "inputmode",
              "fieldName": "inputmode",
              "type": {
                "text": "undefined | string"
              },
              "description": "Virtual-keyboard hint forwarded to the inner input (e.g. `numeric`, `email`)."
            }
          ],
          "events": [
            {
              "name": "kai-change",
              "type": {
                "text": "CustomEvent<{ value: string }>"
              },
              "description": "The value was committed (blur)."
            },
            {
              "name": "kai-input",
              "type": {
                "text": "CustomEvent<{ value: string }>"
              },
              "description": "The value changed per keystroke."
            }
          ],
          "cssProperties": [],
          "slots": [
            {
              "name": "leading",
              "description": "A glyph, prefix, or affix at the start of the field, inside the border."
            },
            {
              "name": "trailing",
              "description": "A button, unit, or affix at the end of the field, inside the border."
            }
          ],
          "cssParts": [
            {
              "name": "field",
              "description": "The bordered control box (the row wrapping any affixes plus the input). Restyle its border, radius, surface, or focus ring.",
              "recipe": "kai-input::part(field) { border-radius: 0.75rem }"
            },
            {
              "name": "input",
              "description": "The inner input element. Restyle its text, padding, or placeholder.",
              "recipe": "kai-input::part(input) { font-variant-numeric: tabular-nums }"
            },
            {
              "name": "label",
              "description": "The field label above the control. Restyle its typography or spacing.",
              "recipe": "kai-input::part(label) { font-weight: 600 }"
            },
            {
              "name": "hint",
              "description": "The hint or error line below the control. Restyle its typography.",
              "recipe": "kai-input::part(hint) { font-style: italic }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-kbd",
          "name": "KaiKbdElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "keys",
              "type": {
                "text": "undefined | string"
              },
              "description": "Shortcut spec — tokens joined by `+` (e.g. `Mod+Shift+K`). Omit it to show default-slot content instead. Display only; the element does not bind keys.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "platform",
              "type": {
                "text": "undefined | \"other\" | \"auto\" | \"mac\""
              },
              "description": "`mac` uses ⌘/⌥, `other` uses Ctrl. `auto` (default) sniffs the OS.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\""
              },
              "description": "Cap size: `sm` or `md`. Defaults to `md`.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "keys",
              "fieldName": "keys",
              "type": {
                "text": "undefined | string"
              },
              "description": "Shortcut spec — tokens joined by `+` (e.g. `Mod+Shift+K`). Omit it to show default-slot content instead. Display only; the element does not bind keys."
            },
            {
              "name": "platform",
              "fieldName": "platform",
              "type": {
                "text": "undefined | \"other\" | \"auto\" | \"mac\""
              },
              "description": "`mac` uses ⌘/⌥, `other` uses Ctrl. `auto` (default) sniffs the OS."
            },
            {
              "name": "size",
              "fieldName": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\""
              },
              "description": "Cap size: `sm` or `md`. Defaults to `md`."
            }
          ],
          "events": [],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "key",
              "description": "Each key cap. Restyle its surface, border, radius, or font.",
              "recipe": "kai-kbd::part(key) { border-radius: 0.375rem }"
            },
            {
              "name": "separator",
              "description": "The gap between key caps. Inject a literal joiner (e.g. a plus sign) from outside.",
              "recipe": "kai-kbd::part(separator)::after { content: \"+\" }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-link-preview",
          "name": "KaiLinkPreviewElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "cardId",
              "type": {
                "text": "undefined | string"
              },
              "description": "Stable card id correlating every emitted event. Set as an attribute or property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "data",
              "type": {
                "text": "undefined | { url: string; title?: undefined | string; description?: undefined | string; image?: undefined | string; imageAlt?: undefined | string; favicon?: undefined | string; domain?: undefined | string; siteName?: undefined | string }"
              },
              "description": "The link payload (OG metadata). Set as a JS **property** (object).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "card-id",
              "fieldName": "cardId",
              "type": {
                "text": "undefined | string"
              },
              "description": "Stable card id correlating every emitted event. Set as an attribute or property."
            }
          ],
          "events": [],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-loader",
          "name": "KaiLoaderElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "variant",
              "type": {
                "text": "undefined | \"circular\" | \"classic\" | \"pulse\" | \"pulse-dot\" | \"dots\" | \"typing\" | \"wave\" | \"bars\" | \"terminal\" | \"text-blink\" | \"text-shimmer\" | \"loading-dots\""
              },
              "description": "The animation style: `'circular' | 'classic' | 'pulse' | 'pulse-dot' | 'dots' | 'typing' | 'wave' | 'bars' | 'terminal' | 'text-blink' | 'text-shimmer' | 'loading-dots'`. Defaults to `'circular'`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\" | \"lg\""
              },
              "description": "Loader size: `'sm' | 'md' | 'lg'`. Defaults to `'md'`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "text",
              "type": {
                "text": "undefined | string"
              },
              "description": "Label for the text-based variants.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "variant",
              "fieldName": "variant",
              "type": {
                "text": "undefined | \"circular\" | \"classic\" | \"pulse\" | \"pulse-dot\" | \"dots\" | \"typing\" | \"wave\" | \"bars\" | \"terminal\" | \"text-blink\" | \"text-shimmer\" | \"loading-dots\""
              },
              "description": "The animation style: `'circular' | 'classic' | 'pulse' | 'pulse-dot' | 'dots' | 'typing' | 'wave' | 'bars' | 'terminal' | 'text-blink' | 'text-shimmer' | 'loading-dots'`. Defaults to `'circular'`."
            },
            {
              "name": "size",
              "fieldName": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\" | \"lg\""
              },
              "description": "Loader size: `'sm' | 'md' | 'lg'`. Defaults to `'md'`."
            },
            {
              "name": "text",
              "fieldName": "text",
              "type": {
                "text": "undefined | string"
              },
              "description": "Label for the text-based variants."
            }
          ],
          "events": [],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-markdown",
          "name": "KaiMarkdownElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "content",
              "type": {
                "text": "string"
              },
              "description": "The markdown source to render.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "proseSize",
              "type": {
                "text": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
              },
              "description": "Text/markdown sizing.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "codeTheme",
              "type": {
                "text": "undefined | string"
              },
              "description": "Shiki theme for fenced code blocks.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "codeHighlight",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable syntax highlighting (no Shiki loads).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "content",
              "fieldName": "content",
              "type": {
                "text": "string"
              },
              "description": "The markdown source to render."
            },
            {
              "name": "prose-size",
              "fieldName": "proseSize",
              "type": {
                "text": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
              },
              "description": "Text/markdown sizing."
            },
            {
              "name": "code-theme",
              "fieldName": "codeTheme",
              "type": {
                "text": "undefined | string"
              },
              "description": "Shiki theme for fenced code blocks."
            },
            {
              "name": "code-highlight",
              "fieldName": "codeHighlight",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable syntax highlighting (no Shiki loads)."
            }
          ],
          "events": [],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-menu",
          "name": "KaiMenuElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "items",
              "type": {
                "text": "undefined | { id?: undefined | string; label?: undefined | string; icon?: undefined | string; shortcut?: undefined | string; checked?: undefined | false | true; radioGroup?: undefined | string; disabled?: undefined | false | true; separator?: undefined | false | true; heading?: undefined | false | true; items?: undefined | Record<string, unknown>[] }[]"
              },
              "description": "Tree of menu items. Set as a JS property — not an HTML attribute.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "placement",
              "type": {
                "text": "undefined | string"
              },
              "description": "Optional placement hint (unused by the underlying Dropdown which always positions bottom-start, kept for future extension).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "triggerIcon",
              "type": {
                "text": "undefined | string"
              },
              "description": "Built-in trigger: leading icon (a named icon like `\"plus\"`, an image URL/data-URI, or text). Use this instead of slotting `slot=\"trigger\"` for the common case — a slotted trigger overrides it.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "triggerLabel",
              "type": {
                "text": "undefined | string"
              },
              "description": "Built-in trigger: a text label (e.g. `\"High\"`).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "triggerIconTrailing",
              "type": {
                "text": "undefined | string"
              },
              "description": "Built-in trigger: a trailing icon (e.g. `\"chevron-down\"` for a select look).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Accessible name for an icon-only trigger (no visible label).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute, the menu still self-manages on click/keyboard). Set `el.open = true`, or `<kai-menu open>`; listen for `kai-open-change`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the trigger — click/keyboard and `show()` no longer open the menu.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "show",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Open it programmatically (no-op while disabled).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "hide",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Close it programmatically.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "toggle",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Flip the open state (closes while disabled).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "placement",
              "fieldName": "placement",
              "type": {
                "text": "undefined | string"
              },
              "description": "Optional placement hint (unused by the underlying Dropdown which always positions bottom-start, kept for future extension)."
            },
            {
              "name": "trigger-icon",
              "fieldName": "triggerIcon",
              "type": {
                "text": "undefined | string"
              },
              "description": "Built-in trigger: leading icon (a named icon like `\"plus\"`, an image URL/data-URI, or text). Use this instead of slotting `slot=\"trigger\"` for the common case — a slotted trigger overrides it."
            },
            {
              "name": "trigger-label",
              "fieldName": "triggerLabel",
              "type": {
                "text": "undefined | string"
              },
              "description": "Built-in trigger: a text label (e.g. `\"High\"`)."
            },
            {
              "name": "trigger-icon-trailing",
              "fieldName": "triggerIconTrailing",
              "type": {
                "text": "undefined | string"
              },
              "description": "Built-in trigger: a trailing icon (e.g. `\"chevron-down\"` for a select look)."
            },
            {
              "name": "label",
              "fieldName": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Accessible name for an icon-only trigger (no visible label)."
            },
            {
              "name": "open",
              "fieldName": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute, the menu still self-manages on click/keyboard). Set `el.open = true`, or `<kai-menu open>`; listen for `kai-open-change`."
            },
            {
              "name": "default-open",
              "fieldName": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed)."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the trigger — click/keyboard and `show()` no longer open the menu."
            }
          ],
          "events": [
            {
              "name": "kai-open-change",
              "type": {
                "text": "CustomEvent<{ open: false | true }>"
              },
              "description": "The menu opened or closed (by click, keyboard, Escape, outside-click, or a method)."
            },
            {
              "name": "kai-select",
              "type": {
                "text": "CustomEvent<{ id: string; checked?: undefined | false | true; radioGroup?: undefined | string }>"
              },
              "description": "Fired when the user selects a leaf item. - Plain items: `{ id }`. - Checkbox items: `{ id, checked }` where `checked` is the NEW state. - Radio items: `{ id, radioGroup }` — the consumer marks `id` as the selected one in `radioGroup` and clears the others."
            }
          ],
          "cssProperties": [],
          "slots": [
            {
              "name": "trigger",
              "description": "Your own trigger element; replaces the built-in button driven by the `trigger-icon` / `trigger-label` props."
            }
          ],
          "cssParts": [
            {
              "name": "shortcut",
              "description": "The right-aligned per-item keyboard shortcut, rendered as kai-kbd key caps. Shown only when an item carries a `shortcut`.",
              "recipe": "kai-menu::part(shortcut) { opacity: 0.8 }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-message",
          "name": "KaiMessageElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "message",
              "type": {
                "text": "undefined | { id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }"
              },
              "description": "The full message object. Set as a JS property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "role",
              "type": {
                "text": "undefined | \"user\" | \"assistant\""
              },
              "description": "Convenience for simple cases when not passing a `message` object.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "content",
              "type": {
                "text": "undefined | string"
              },
              "description": "Convenience content (used when `message` is not set).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "markdown",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Force markdown on/off. Defaults to on for assistant, off for user.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "proseSize",
              "type": {
                "text": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
              },
              "description": "Text/markdown sizing for the message body.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "codeTheme",
              "type": {
                "text": "undefined | string"
              },
              "description": "Shiki theme name used for fenced code blocks in the content.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "codeHighlight",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable syntax highlighting for code blocks (no Shiki loads).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "actionsReveal",
              "type": {
                "text": "undefined | \"always\" | \"hover\""
              },
              "description": "Whether the action bar is always visible (`'always'`, default) or only revealed on hover of the message row (`'hover'`).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "avatarSrc",
              "type": {
                "text": "undefined | string"
              },
              "description": "Convenience avatar image URL (used when `message.avatar` is not set).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "avatarFallback",
              "type": {
                "text": "undefined | string"
              },
              "description": "Convenience avatar fallback text (used when `message.avatar` is not set).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "avatar",
              "type": {
                "text": "undefined | string"
              },
              "description": "Avatar rail mode. `'none'` omits the avatar rail entirely so the body spans the full row (predictable layout when you never show avatars). Any other value keeps the default behaviour: the built-in avatar when one resolves, or your `slot=\"avatar\"` content when projected (which REPLACES the built-in).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "copy",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Copy the message content to the clipboard and show the copied check.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "role",
              "fieldName": "role",
              "type": {
                "text": "undefined | \"user\" | \"assistant\""
              },
              "description": "Convenience for simple cases when not passing a `message` object."
            },
            {
              "name": "content",
              "fieldName": "content",
              "type": {
                "text": "undefined | string"
              },
              "description": "Convenience content (used when `message` is not set)."
            },
            {
              "name": "markdown",
              "fieldName": "markdown",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Force markdown on/off. Defaults to on for assistant, off for user."
            },
            {
              "name": "prose-size",
              "fieldName": "proseSize",
              "type": {
                "text": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
              },
              "description": "Text/markdown sizing for the message body."
            },
            {
              "name": "code-theme",
              "fieldName": "codeTheme",
              "type": {
                "text": "undefined | string"
              },
              "description": "Shiki theme name used for fenced code blocks in the content."
            },
            {
              "name": "code-highlight",
              "fieldName": "codeHighlight",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable syntax highlighting for code blocks (no Shiki loads)."
            },
            {
              "name": "actions-reveal",
              "fieldName": "actionsReveal",
              "type": {
                "text": "undefined | \"always\" | \"hover\""
              },
              "description": "Whether the action bar is always visible (`'always'`, default) or only revealed on hover of the message row (`'hover'`)."
            },
            {
              "name": "avatar-src",
              "fieldName": "avatarSrc",
              "type": {
                "text": "undefined | string"
              },
              "description": "Convenience avatar image URL (used when `message.avatar` is not set)."
            },
            {
              "name": "avatar-fallback",
              "fieldName": "avatarFallback",
              "type": {
                "text": "undefined | string"
              },
              "description": "Convenience avatar fallback text (used when `message.avatar` is not set)."
            },
            {
              "name": "avatar",
              "fieldName": "avatar",
              "type": {
                "text": "undefined | string"
              },
              "description": "Avatar rail mode. `'none'` omits the avatar rail entirely so the body spans the full row (predictable layout when you never show avatars). Any other value keeps the default behaviour: the built-in avatar when one resolves, or your `slot=\"avatar\"` content when projected (which REPLACES the built-in)."
            }
          ],
          "events": [
            {
              "name": "kai-message-action",
              "type": {
                "text": "CustomEvent<{ messageId: string; action: string; state?: undefined | \"on\" | \"off\" }>"
              },
              "description": "An action button was clicked. `action` is the built-in name or custom id. `state` is present only for the toggleable feedback votes: `'on'` when a like/dislike is set, `'off'` when re-tapped to clear."
            }
          ],
          "cssProperties": [],
          "slots": [
            {
              "name": "before-body",
              "description": "A per-message header at the TOP of the body, above reasoning/tools/content — a model-name label, a role + timestamp line."
            },
            {
              "name": "after-body",
              "description": "A row at the BOTTOM of the body, below the action bar — a citation/sources row, a token-cost/latency line."
            },
            {
              "name": "avatar",
              "description": "Replaces the built-in avatar rail with your own node. Use `avatar=\"none\"` to omit the rail and let the body span the full row."
            }
          ],
          "cssParts": [
            {
              "name": "row",
              "description": "The message row wrapper (avatar rail + body column). Restyle its gap or alignment from outside.",
              "recipe": "kai-message::part(row) { gap: 0.75rem }"
            },
            {
              "name": "bubble",
              "description": "The content bubble wrapper. Restyle its background, radius, or padding; for a user message this is the rounded chat bubble.",
              "recipe": "kai-message::part(bubble) { background: var(--color-primary); color: var(--color-primary-foreground) }"
            },
            {
              "name": "content",
              "description": "The rendered message text/markdown region (same node as `bubble`). Target it to tune typography from outside.",
              "recipe": "kai-message::part(content) { font-size: 0.9375rem }"
            },
            {
              "name": "actions",
              "description": "The action-bar row (copy / like / regenerate …). Restyle its spacing or hide it entirely from outside.",
              "recipe": "kai-message::part(actions) { gap: 0.25rem }"
            },
            {
              "name": "avatar",
              "description": "Replaces the built-in avatar rail with your own node. Use `avatar=\"none\"` to omit the rail and let the body span the full row."
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-model-switcher",
          "name": "KaiModelSwitcherElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "models",
              "type": {
                "text": "{ id: string; name: string; provider?: undefined | string; description?: undefined | string; group?: undefined | string }[]"
              },
              "description": "The selectable models. Set as a JS property (array).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "currentModel",
              "type": {
                "text": "undefined | string"
              },
              "description": "The currently-selected model id. Defaults to the first model.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe the dropdown's open state (Shoelace-style: settable + reflected to the `open` attribute, the dropdown still self-manages on click/keyboard). Set `el.open = true`, or `<kai-model-switcher open>`; listen for `kai-open-change`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the trigger — click/keyboard and `show()` no longer open the dropdown.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "show",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Open it programmatically (no-op while disabled).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "hide",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Close it programmatically.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "toggle",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Flip the open state (closes while disabled).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "current-model",
              "fieldName": "currentModel",
              "type": {
                "text": "undefined | string"
              },
              "description": "The currently-selected model id. Defaults to the first model."
            },
            {
              "name": "open",
              "fieldName": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe the dropdown's open state (Shoelace-style: settable + reflected to the `open` attribute, the dropdown still self-manages on click/keyboard). Set `el.open = true`, or `<kai-model-switcher open>`; listen for `kai-open-change`."
            },
            {
              "name": "default-open",
              "fieldName": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed)."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the trigger — click/keyboard and `show()` no longer open the dropdown."
            }
          ],
          "events": [
            {
              "name": "kai-model-change",
              "type": {
                "text": "CustomEvent<{ modelId: string }>"
              },
              "description": "A model was selected."
            },
            {
              "name": "kai-open-change",
              "type": {
                "text": "CustomEvent<{ open: false | true }>"
              },
              "description": "The model dropdown opened or closed (by click, keyboard, Escape, outside-click, or a method)."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-nav",
          "name": "KaiNavElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "items",
              "type": {
                "text": "undefined | { id: string; label?: undefined | string; icon?: undefined | string; badge?: undefined | string; trailing?: undefined | string; disabled?: undefined | false | true; children?: undefined | Record<string, unknown>[]; status?: undefined | { tone: \"error\" | \"primary\" | \"info\" | \"success\" | \"warning\" | \"neutral\"; label?: undefined | string; pulse?: undefined | false | true }; meta?: undefined | string; action?: undefined | { icon: string; label: string }; closable?: undefined | false | true }[]"
              },
              "description": "The nav items. Set as a JS property (array, not an attribute). Each item may carry `children` (a collapsible group), a `status` dot, and trailing `meta` text.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "undefined | string"
              },
              "description": "Active item id (controlled).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultValue",
              "type": {
                "text": "undefined | string"
              },
              "description": "Initial active id when uncontrolled.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultCollapsed",
              "type": {
                "text": "undefined | string[]"
              },
              "description": "Ids of group items collapsed on first render (groups default to expanded). Set as a JS property (array).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "select",
              "parameters": [
                {
                  "name": "id: string"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Activate an item by id (fires kai-nav-select).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "value",
              "fieldName": "value",
              "type": {
                "text": "undefined | string"
              },
              "description": "Active item id (controlled)."
            },
            {
              "name": "default-value",
              "fieldName": "defaultValue",
              "type": {
                "text": "undefined | string"
              },
              "description": "Initial active id when uncontrolled."
            }
          ],
          "events": [
            {
              "name": "kai-nav-item-action",
              "type": {
                "text": "CustomEvent<{ value: string; action?: undefined | { icon: string; label: string } }>"
              },
              "description": "A row's trailing `action` button was activated (not a select). `value` is the item id; `action` echoes the item's `{ icon, label }`."
            },
            {
              "name": "kai-nav-item-close",
              "type": {
                "text": "CustomEvent<{ value: string }>"
              },
              "description": "A `closable` row's trailing close button was activated (not a select). `value` is the item id."
            },
            {
              "name": "kai-nav-select",
              "type": {
                "text": "CustomEvent<{ id: string }>"
              },
              "description": "A nav item was activated."
            }
          ],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "nav",
              "description": "The nav list container. Restyle its gap or padding from outside.",
              "recipe": "kai-nav::part(nav) { gap: 0.25rem }"
            },
            {
              "name": "item",
              "description": "A nav item button (leaf or group parent). The active leaf carries aria-current=\"page\" and a group parent carries aria-expanded; target `::part(item)[aria-current]` for the selected look or `::part(item)[aria-expanded]` for a group row.",
              "recipe": "kai-nav::part(item)[aria-current] { background: var(--color-accent) }"
            },
            {
              "name": "group",
              "description": "The nested child list rendered under an expanded group item. Add a left guide line or tune its indent from outside.",
              "recipe": "kai-nav::part(group) { border-left: 1px solid var(--color-border); margin-left: 1.1rem }"
            },
            {
              "name": "chevron",
              "description": "The disclosure chevron on a group row (rotates when expanded). Recolor or resize it from outside.",
              "recipe": "kai-nav::part(chevron) { opacity: 1; color: var(--color-primary) }"
            },
            {
              "name": "status",
              "description": "The per-item status cluster (a colored dot in the tone hue + an optional label). Shown only when an item carries a `status`; the `pulse` flag animates the dot. Restyle from outside.",
              "recipe": "kai-nav::part(status) { gap: 0.5rem }"
            },
            {
              "name": "meta",
              "description": "The right-aligned muted trailing text on a row (e.g. a relative time). Shown only when an item carries `meta`; restyle from outside.",
              "recipe": "kai-nav::part(meta) { color: var(--color-foreground); font-variant-numeric: tabular-nums }"
            },
            {
              "name": "item-action",
              "description": "The trailing per-item action / close button, a sibling of the item button. Shown only when an item carries `action` or `closable`; reveal it on hover or pin it visible from outside.",
              "recipe": "kai-nav::part(item-action) { opacity: 1 }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-notice",
          "name": "KaiNoticeElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "severity",
              "type": {
                "text": "undefined | \"error\" | \"info\" | \"success\" | \"warning\" | \"neutral\""
              },
              "description": "`neutral` (default) · `info` · `warning` · `error` · `success`. Drives the leading icon's color and the a11y role (`alert` for errors, else `status`).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "icon",
              "type": {
                "text": "undefined | string"
              },
              "description": "Leading icon: omit for the severity default, `\"none\"` to hide it, or a named icon to override.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "dismissible",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a dismiss (×) that hides the notice and emits `kai-dismiss`.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "severity",
              "fieldName": "severity",
              "type": {
                "text": "undefined | \"error\" | \"info\" | \"success\" | \"warning\" | \"neutral\""
              },
              "description": "`neutral` (default) · `info` · `warning` · `error` · `success`. Drives the leading icon's color and the a11y role (`alert` for errors, else `status`)."
            },
            {
              "name": "icon",
              "fieldName": "icon",
              "type": {
                "text": "undefined | string"
              },
              "description": "Leading icon: omit for the severity default, `\"none\"` to hide it, or a named icon to override."
            },
            {
              "name": "dismissible",
              "fieldName": "dismissible",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a dismiss (×) that hides the notice and emits `kai-dismiss`."
            }
          ],
          "events": [
            {
              "name": "kai-dismiss",
              "type": {
                "text": "CustomEvent"
              },
              "description": "The notice was dismissed via its × (it also hides itself)."
            }
          ],
          "cssProperties": [],
          "slots": [
            {
              "name": "action",
              "description": "A trailing action beside the message — a link or button."
            },
            {
              "name": "icon",
              "description": "A custom leading icon (any inline SVG, inherits `currentColor`). Overrides the severity default and the `icon` prop — the same escape hatch as `kai-button`."
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-pane",
          "name": "KaiPaneElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "headline",
              "type": {
                "text": "undefined | string"
              },
              "description": "The pane title (the agent / window name). Named `headline` because `title` collides with the global `HTMLElement.title` attribute (it throws at registration). Attribute: `headline`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "subtitle",
              "type": {
                "text": "undefined | string"
              },
              "description": "A role / label shown under the title (e.g. \"Reviewer\", \"claude-sonnet\"). Attribute: `subtitle`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "maximized",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show the restore glyph instead of maximize, and signal the maximized view-state. Drive it yourself in response to `kai-maximize`. Attribute: `maximized`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "focused",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Highlight the frame with a ring/border to mark the ACTIVE pane. Attribute: `focused`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "showSplit",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a split-pane window control that fires `kai-split`. Off by default. Attribute: `show-split`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "showDock",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a dock-to-side window control that fires `kai-dock`. Off by default. Attribute: `show-dock`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "status",
              "type": {
                "text": "undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }"
              },
              "description": "A tone-colored status dot (+ optional label) in the header. An object `{ tone, label?, pulse? }` set as a JS PROPERTY (not an attribute).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "headline",
              "fieldName": "headline",
              "type": {
                "text": "undefined | string"
              },
              "description": "The pane title (the agent / window name). Named `headline` because `title` collides with the global `HTMLElement.title` attribute (it throws at registration). Attribute: `headline`."
            },
            {
              "name": "subtitle",
              "fieldName": "subtitle",
              "type": {
                "text": "undefined | string"
              },
              "description": "A role / label shown under the title (e.g. \"Reviewer\", \"claude-sonnet\"). Attribute: `subtitle`."
            },
            {
              "name": "maximized",
              "fieldName": "maximized",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show the restore glyph instead of maximize, and signal the maximized view-state. Drive it yourself in response to `kai-maximize`. Attribute: `maximized`."
            },
            {
              "name": "focused",
              "fieldName": "focused",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Highlight the frame with a ring/border to mark the ACTIVE pane. Attribute: `focused`."
            },
            {
              "name": "show-split",
              "fieldName": "showSplit",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a split-pane window control that fires `kai-split`. Off by default. Attribute: `show-split`."
            },
            {
              "name": "show-dock",
              "fieldName": "showDock",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a dock-to-side window control that fires `kai-dock`. Off by default. Attribute: `show-dock`."
            }
          ],
          "events": [
            {
              "name": "kai-close",
              "type": {
                "text": "CustomEvent"
              },
              "description": "The close (×) control was clicked."
            },
            {
              "name": "kai-dock",
              "type": {
                "text": "CustomEvent"
              },
              "description": "The dock control was clicked (only present when `show-dock`)."
            },
            {
              "name": "kai-maximize",
              "type": {
                "text": "CustomEvent<{ maximized: false | true }>"
              },
              "description": "The maximize/restore control was clicked. `detail.maximized` is the intended NEXT state — drive the `maximized` prop yourself from it."
            },
            {
              "name": "kai-split",
              "type": {
                "text": "CustomEvent"
              },
              "description": "The split control was clicked (only present when `show-split`)."
            }
          ],
          "cssProperties": [],
          "slots": [
            {
              "name": "leading",
              "description": "A glyph or avatar at the start of the pane header."
            },
            {
              "name": "actions",
              "description": "Extra header controls, before the built-in window controls."
            },
            {
              "name": "footer",
              "description": "A pinned row below the body (e.g. a composer)."
            }
          ],
          "cssParts": [
            {
              "name": "header",
              "description": "The pane header bar (leading + title/status + actions + window controls).",
              "recipe": "kai-pane::part(header) { padding-inline: 0.75rem }"
            },
            {
              "name": "body",
              "description": "The scrolling body region (the default slot).",
              "recipe": "kai-pane::part(body) { padding: 1rem }"
            },
            {
              "name": "controls",
              "description": "The window-control cluster (maximize/close, and split/dock when enabled).",
              "recipe": "kai-pane::part(controls) { gap: 0.25rem }"
            },
            {
              "name": "footer",
              "description": "A pinned row below the body (e.g. a composer)."
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-pane-group",
          "name": "KaiPaneGroupElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "tabs",
              "type": {
                "text": "undefined | { id: string; name: string; status?: undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }; needsAttention?: undefined | false | true; number?: undefined | number }[]"
              },
              "description": "The tabs to render. An array of `{ id, name, status?, needsAttention?, number? }` set as a JS PROPERTY (not an HTML attribute).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "active",
              "type": {
                "text": "undefined | string"
              },
              "description": "The active tab id (controlled, and reflected to the `active` ATTRIBUTE so `::part`/`[active]` selectors and the per-tab named slot follow it). Set it as the `active` attribute or drive it from `kai-tab-change`; omit for uncontrolled (the first tab).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "focused",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Highlight the frame as the ACTIVE group in a multi-group layout. Attribute: `focused`.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "select",
              "parameters": [
                {
                  "name": "id: string"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Select a tab by id (fires `kai-tab-change`). Ignores unknown ids.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "focus",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Focus the active tab in the strip.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "active",
              "fieldName": "active",
              "type": {
                "text": "undefined | string"
              },
              "description": "The active tab id (controlled, and reflected to the `active` ATTRIBUTE so `::part`/`[active]` selectors and the per-tab named slot follow it). Set it as the `active` attribute or drive it from `kai-tab-change`; omit for uncontrolled (the first tab)."
            },
            {
              "name": "focused",
              "fieldName": "focused",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Highlight the frame as the ACTIVE group in a multi-group layout. Attribute: `focused`."
            }
          ],
          "events": [
            {
              "name": "kai-tab-change",
              "type": {
                "text": "CustomEvent<{ id: string }>"
              },
              "description": "A tab was selected (click, Enter/Space, or arrow-key move). `detail.id` is the tab's id."
            },
            {
              "name": "kai-tab-close",
              "type": {
                "text": "CustomEvent<{ id: string }>"
              },
              "description": "A tab's close (×) was clicked. Drop the tab from `tabs` yourself."
            },
            {
              "name": "kai-tab-menu",
              "type": {
                "text": "CustomEvent<{ id: string }>"
              },
              "description": "A tab's \"…\" overflow was clicked. Open your own menu from `detail.id`."
            }
          ],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "tabs",
              "description": "The tab strip (role=\"tablist\"). Restyle its background, height, padding, or gap from outside.",
              "recipe": "kai-pane-group::part(tabs) { background: var(--color-card); gap: 0.25rem }"
            },
            {
              "name": "tab",
              "description": "A single tab button. The active tab carries `[aria-selected=\"true\"]`; target `::part(tab)[aria-selected=\"true\"]` for the selected look.",
              "recipe": "kai-pane-group::part(tab)[aria-selected=\"true\"] { background: var(--color-accent) }"
            },
            {
              "name": "body",
              "description": "The active tab's content region (the named/default slot host).",
              "recipe": "kai-pane-group::part(body) { padding: 0.75rem }"
            },
            {
              "name": "menu",
              "description": "The per-tab \"…\" overflow button. Reveal it on hover or pin it visible from outside.",
              "recipe": "kai-pane-group::part(menu) { opacity: 1 }"
            },
            {
              "name": "close",
              "description": "The per-tab close (\"×\") button. Recolor, resize, or hide it from outside.",
              "recipe": "kai-pane-group::part(close) { color: var(--color-muted-foreground) }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-popover",
          "name": "KaiPopoverElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "placement",
              "type": {
                "text": "undefined | \"top\" | \"right\" | \"bottom\" | \"left\" | \"top-start\" | \"top-end\" | \"right-start\" | \"right-end\" | \"bottom-start\" | \"bottom-end\" | \"left-start\" | \"left-end\""
              },
              "description": "Floating placement relative to the trigger (floating-ui placement).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "gutter",
              "type": {
                "text": "undefined | number"
              },
              "description": "Gap in px between the trigger and the panel.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute, the element still self-manages on click). Set `el.open = true`, or `<kai-popover open>`; listen for `kai-open-change`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Turn the popover off while keeping the trigger mounted (clicks and `show()` no longer open it).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "show",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Open it programmatically (no-op while disabled).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "hide",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Close it programmatically.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "toggle",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Flip the open state (closes while disabled).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "placement",
              "fieldName": "placement",
              "type": {
                "text": "undefined | \"top\" | \"right\" | \"bottom\" | \"left\" | \"top-start\" | \"top-end\" | \"right-start\" | \"right-end\" | \"bottom-start\" | \"bottom-end\" | \"left-start\" | \"left-end\""
              },
              "description": "Floating placement relative to the trigger (floating-ui placement)."
            },
            {
              "name": "gutter",
              "fieldName": "gutter",
              "type": {
                "text": "undefined | number"
              },
              "description": "Gap in px between the trigger and the panel."
            },
            {
              "name": "open",
              "fieldName": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute, the element still self-manages on click). Set `el.open = true`, or `<kai-popover open>`; listen for `kai-open-change`."
            },
            {
              "name": "default-open",
              "fieldName": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed)."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Turn the popover off while keeping the trigger mounted (clicks and `show()` no longer open it)."
            }
          ],
          "events": [
            {
              "name": "kai-open-change",
              "type": {
                "text": "CustomEvent<{ open: false | true }>"
              },
              "description": "The popover opened or closed (click, Escape, outside-click, or a method)."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-progress-bar",
          "name": "KaiProgressBarElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "undefined | number"
              },
              "description": "Current progress value (0..max). Attribute: `value`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "max",
              "type": {
                "text": "undefined | number"
              },
              "description": "The value `value` runs to (default 100). Attribute: `max`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Optional caption above the track. Attribute: `label`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "tone",
              "type": {
                "text": "undefined | string"
              },
              "description": "Fill color: `primary` (default), `success`, `warning`, `error`, `info`. Attribute: `tone`.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "value",
              "fieldName": "value",
              "type": {
                "text": "undefined | number"
              },
              "description": "Current progress value (0..max). Attribute: `value`."
            },
            {
              "name": "max",
              "fieldName": "max",
              "type": {
                "text": "undefined | number"
              },
              "description": "The value `value` runs to (default 100). Attribute: `max`."
            },
            {
              "name": "label",
              "fieldName": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Optional caption above the track. Attribute: `label`."
            },
            {
              "name": "tone",
              "fieldName": "tone",
              "type": {
                "text": "undefined | string"
              },
              "description": "Fill color: `primary` (default), `success`, `warning`, `error`, `info`. Attribute: `tone`."
            }
          ],
          "events": [],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "track",
              "description": "The progress track (the background bar). Restyle its height, radius, or background from outside.",
              "recipe": "kai-progress-bar::part(track) { height: 0.5rem }"
            },
            {
              "name": "fill",
              "description": "The filled portion; its width follows value/max. Recolor it from outside.",
              "recipe": "kai-progress-bar::part(fill) { background: var(--color-tool-green) }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-prompt-dock",
          "name": "KaiPromptDockElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "frame",
              "type": {
                "text": "undefined | \"none\" | \"inset\" | \"edge\""
              },
              "description": "How the tray frames the input — the SPATIAL inset axis: `inset` (default, the classic recessed frame on every side) | `edge` (top/bottom inset only; the input sits flush left/right so the lips span the full width) | `none` (no inset; the lips attach directly as a plain stack). Attribute: `frame`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "appearance",
              "type": {
                "text": "undefined | \"outlined\" | \"filled\" | \"plain\" | \"soft\""
              },
              "description": "How the tray surface looks — the VISUAL axis, orthogonal to `frame`: `soft` (default, sunken surface + border + radius) | `outlined` (transparent + border + radius) | `filled` (sunken, no border, + radius) | `plain` (bare). Attribute: `appearance`.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "frame",
              "fieldName": "frame",
              "type": {
                "text": "undefined | \"none\" | \"inset\" | \"edge\""
              },
              "description": "How the tray frames the input — the SPATIAL inset axis: `inset` (default, the classic recessed frame on every side) | `edge` (top/bottom inset only; the input sits flush left/right so the lips span the full width) | `none` (no inset; the lips attach directly as a plain stack). Attribute: `frame`."
            },
            {
              "name": "appearance",
              "fieldName": "appearance",
              "type": {
                "text": "undefined | \"outlined\" | \"filled\" | \"plain\" | \"soft\""
              },
              "description": "How the tray surface looks — the VISUAL axis, orthogonal to `frame`: `soft` (default, sunken surface + border + radius) | `outlined` (transparent + border + radius) | `filled` (sunken, no border, + radius) | `plain` (bare). Attribute: `appearance`."
            }
          ],
          "events": [],
          "cssProperties": [],
          "slots": [
            {
              "name": "top",
              "description": "The top lip: a notice or banner above the input. Rendered only when filled."
            },
            {
              "name": "bottom",
              "description": "The bottom lip: a mode or controls row below the input. Rendered only when filled."
            }
          ],
          "cssParts": [
            {
              "name": "tray",
              "description": "The recessed tray that frames the input. The `appearance`/`frame` props set the defaults; the --kai-prompt-dock-* tokens fine-tune surface/border/radius/inset.",
              "recipe": "kai-prompt-dock::part(tray) { --kai-prompt-dock-radius: 1rem }"
            },
            {
              "name": "top",
              "description": "The top lip: a notice or banner above the input. Rendered only when filled."
            },
            {
              "name": "bottom",
              "description": "The bottom lip: a mode or controls row below the input. Rendered only when filled."
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-prompt-input",
          "name": "KaiPromptInputElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "undefined | string | ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]"
              },
              "description": "Value of the input, as a JS property. A **string** is the controlled text mirror (the host owns it and updates on `kai-value-change`). A **ComposerDoc** (array of text/entity segments) is a one-time **seed** that pre-populates pills (skills/agents/plugins); the user then edits freely. Leave unset for uncontrolled behavior. `kai-submit`/`kai-value-change` always emit `value` as the flattened string (back-compat) plus the structured `doc` + `entities`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "placeholder",
              "type": {
                "text": "undefined | string"
              },
              "description": "Placeholder text shown in the empty input.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the input and submit button entirely (non-interactive).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "loading",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show the loading/streaming state and block submit (use while awaiting a reply).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "suggestions",
              "type": {
                "text": "undefined | string[]"
              },
              "description": "Starter prompts shown above the input. Clicking one follows `suggestionMode`. Set as a JS property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "suggestionMode",
              "type": {
                "text": "undefined | \"submit\" | \"fill\""
              },
              "description": "What clicking a suggestion does: `'submit'` (default) sends it immediately as if typed and submitted; `'fill'` just places it in the input.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "search",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a Search (Globe) button in the left toolbar; clicking it fires a `search` event.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "voice",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a Voice (Mic) button in the left toolbar; clicking it fires a `voice` event.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "stoppable",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "When set and `loading` is true, the send button is replaced by a Stop button (square icon, \"Stop\" aria-label). Clicking it fires `kai-stop`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "submit",
              "type": {
                "text": "undefined | \"always\" | \"auto\""
              },
              "description": "Send-button visibility. `'always'` (default) always shows it; `'auto'` shows it only when there's text/attachments (an empty composer hides it — Enter still submits). To hide it entirely (Enter-only), it's pure CSS: `::part(send){display:none}` — no prop needed. Restyle via `::part(send)`. The Stop button (`stoppable` + `loading`) is unaffected.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "attach",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "When `false`, hides the built-in paperclip attach button even though the element otherwise supports attachments. Use this when a `+` menu in `toolbar-start` already exposes \"Add files\", to avoid a duplicate control. Defaults to `true`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "attachments",
              "type": {
                "text": "undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]"
              },
              "description": "Attachments to seed the input with (so a consumer can pre-populate staged files without an upload). Set as a JS property; the element then manages its own attachment state from there (add via the paperclip, remove per chip).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "triggers",
              "type": {
                "text": "undefined | { char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]"
              },
              "description": "Rich entity triggers — each `{ char, kind, items }` opens a caret-anchored menu that inserts an atomic pill. Convention: `/` → skills, `@` → agents (plugins are the grouping/provenance of those items). Set as a JS property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "kindIcons",
              "type": {
                "text": "undefined | Record<string, string>"
              },
              "description": "Default icon per entity kind (kind → image URL/data-URI) for pills/menu items without their own `icon`. Overrides the built-in agent/plugin glyphs. JS property.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "focus",
              "parameters": [
                {
                  "name": "options?: FocusOptions"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Focus the text editor inside the shadow root (not the hidden file input).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "blur",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Blur the focused input control.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "clear",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Clear the text and any staged attachments (fires kai-value-change / kai-attachments-change so a controlled consumer can react).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "send",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Send the current value programmatically — same path as Enter / the send button (fires kai-submit, then clears staged attachments). Named `send`, not `submit`, to avoid colliding with the `submit` prop.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "placeholder",
              "fieldName": "placeholder",
              "type": {
                "text": "undefined | string"
              },
              "description": "Placeholder text shown in the empty input."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the input and submit button entirely (non-interactive)."
            },
            {
              "name": "loading",
              "fieldName": "loading",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show the loading/streaming state and block submit (use while awaiting a reply)."
            },
            {
              "name": "suggestion-mode",
              "fieldName": "suggestionMode",
              "type": {
                "text": "undefined | \"submit\" | \"fill\""
              },
              "description": "What clicking a suggestion does: `'submit'` (default) sends it immediately as if typed and submitted; `'fill'` just places it in the input."
            },
            {
              "name": "search",
              "fieldName": "search",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a Search (Globe) button in the left toolbar; clicking it fires a `search` event."
            },
            {
              "name": "voice",
              "fieldName": "voice",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a Voice (Mic) button in the left toolbar; clicking it fires a `voice` event."
            },
            {
              "name": "stoppable",
              "fieldName": "stoppable",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "When set and `loading` is true, the send button is replaced by a Stop button (square icon, \"Stop\" aria-label). Clicking it fires `kai-stop`."
            },
            {
              "name": "submit",
              "fieldName": "submit",
              "type": {
                "text": "undefined | \"always\" | \"auto\""
              },
              "description": "Send-button visibility. `'always'` (default) always shows it; `'auto'` shows it only when there's text/attachments (an empty composer hides it — Enter still submits). To hide it entirely (Enter-only), it's pure CSS: `::part(send){display:none}` — no prop needed. Restyle via `::part(send)`. The Stop button (`stoppable` + `loading`) is unaffected."
            },
            {
              "name": "attach",
              "fieldName": "attach",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "When `false`, hides the built-in paperclip attach button even though the element otherwise supports attachments. Use this when a `+` menu in `toolbar-start` already exposes \"Add files\", to avoid a duplicate control. Defaults to `true`."
            }
          ],
          "events": [
            {
              "name": "kai-attachments-change",
              "type": {
                "text": "CustomEvent<{ attachments: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }>"
              },
              "description": "The staged attachments changed — a file was added (via the paperclip) or removed (per-chip ×). Carries the full current list so a consumer can react in real time (validate, show upload progress, toggle the send button)."
            },
            {
              "name": "kai-search",
              "type": {
                "text": "CustomEvent<Record<string, never>>"
              },
              "description": "The Search (Globe) toolbar button was clicked."
            },
            {
              "name": "kai-stop",
              "type": {
                "text": "CustomEvent<Record<string, never>>"
              },
              "description": "The Stop button was clicked while `stoppable` and `loading` are both true."
            },
            {
              "name": "kai-submit",
              "type": {
                "text": "CustomEvent<{ value: string; doc: ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]; entities: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[]; attachments: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }>"
              },
              "description": "The user submitted the prompt (Enter or send button). `value` is the flattened text (back-compat); `doc` is the structured document and `entities` the inserted pills (skills/agents) for downstream expansion."
            },
            {
              "name": "kai-suggestion-click",
              "type": {
                "text": "CustomEvent<{ value: string }>"
              },
              "description": "A suggestion was clicked while `suggestion-mode=\"fill\"`."
            },
            {
              "name": "kai-toolbar-action",
              "type": {
                "text": "CustomEvent<{ action: string }>"
              },
              "description": "A custom `<kai-action>` toolbar button was clicked. `action` is the `id` of the `<kai-action>` element that was clicked."
            },
            {
              "name": "kai-value-change",
              "type": {
                "text": "CustomEvent<{ value: string; doc: ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]; entities: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }>"
              },
              "description": "The input changed (fires on every edit). Carries the flattened `value` plus the structured `doc` + `entities`."
            },
            {
              "name": "kai-voice",
              "type": {
                "text": "CustomEvent<Record<string, never>>"
              },
              "description": "The Voice (Mic) toolbar button was clicked."
            }
          ],
          "cssProperties": [],
          "slots": [
            {
              "name": "input-top",
              "description": "Inside the card, above the textarea (e.g. an inline status strip). For content above/below the whole card, use your own layout — that is light DOM you control."
            },
            {
              "name": "toolbar-start",
              "description": "Leading controls in the input toolbar — where a + menu goes."
            },
            {
              "name": "toolbar-end",
              "description": "Trailing controls in the toolbar, before the Send button."
            }
          ],
          "cssParts": [
            {
              "name": "send",
              "description": "The send button. Restyle from outside, or hide it entirely (Enter-only) — hiding is pure CSS, which is why there is no `submit=\"never\"`.",
              "recipe": "kai-prompt-input::part(send) { display: none } /* Enter-only; or restyle: background, border-radius, … */"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-reasoning",
          "name": "KaiReasoningElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "text",
              "type": {
                "text": "string"
              },
              "description": "The reasoning text to display.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Trigger label.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages on trigger click + while streaming). Set `el.open = true`; listen for `kai-open-change`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "streaming",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "While true, auto-expands (and re-collapses when it flips false).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "markdown",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Render `text` as markdown.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Gate the disclosure trigger — programmatic `show()/hide()/toggle()` still work, but the trigger click no longer toggles.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "show",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Open it programmatically (no-op while disabled).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "hide",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Close it programmatically.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "toggle",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Flip the open state (closes while disabled).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "text",
              "fieldName": "text",
              "type": {
                "text": "string"
              },
              "description": "The reasoning text to display."
            },
            {
              "name": "label",
              "fieldName": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Trigger label."
            },
            {
              "name": "open",
              "fieldName": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages on trigger click + while streaming). Set `el.open = true`; listen for `kai-open-change`."
            },
            {
              "name": "default-open",
              "fieldName": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed)."
            },
            {
              "name": "streaming",
              "fieldName": "streaming",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "While true, auto-expands (and re-collapses when it flips false)."
            },
            {
              "name": "markdown",
              "fieldName": "markdown",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Render `text` as markdown."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Gate the disclosure trigger — programmatic `show()/hide()/toggle()` still work, but the trigger click no longer toggles."
            }
          ],
          "events": [
            {
              "name": "kai-open-change",
              "type": {
                "text": "CustomEvent<{ open: false | true }>"
              },
              "description": "The reasoning block expanded or collapsed (via the trigger, streaming auto-open, or a method)."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-remote",
          "name": "KaiRemoteElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "src",
              "type": {
                "text": "undefined | string"
              },
              "description": "The remote card URL. Attribute: `src`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "providerOrigin",
              "type": {
                "text": "undefined | string"
              },
              "description": "Exact provider origin (https: or http://localhost for dev). Attribute: `provider-origin`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "envelope",
              "type": {
                "text": "undefined | Record<string, unknown>"
              },
              "description": "The card envelope to render. JS property only.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "policy",
              "type": {
                "text": "undefined | Record<string, unknown>"
              },
              "description": "Optional routing policy. JS property only.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "src",
              "fieldName": "src",
              "type": {
                "text": "undefined | string"
              },
              "description": "The remote card URL. Attribute: `src`."
            },
            {
              "name": "provider-origin",
              "fieldName": "providerOrigin",
              "type": {
                "text": "undefined | string"
              },
              "description": "Exact provider origin (https: or http://localhost for dev). Attribute: `provider-origin`."
            }
          ],
          "events": [],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-resizable",
          "name": "KaiResizableElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "orientation",
              "type": {
                "text": "undefined | \"vertical\" | \"horizontal\""
              },
              "description": "Layout axis: `horizontal` (row, default) or `vertical` (column).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "maximizedIndex",
              "type": {
                "text": "undefined | null | number"
              },
              "description": "Which item index is maximized (null = none). Declarative source of truth.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "orientation",
              "fieldName": "orientation",
              "type": {
                "text": "undefined | \"vertical\" | \"horizontal\""
              },
              "description": "Layout axis: `horizontal` (row, default) or `vertical` (column)."
            }
          ],
          "events": [
            {
              "name": "kai-change",
              "type": {
                "text": "CustomEvent<{ sizes: number[] }>"
              },
              "description": "Fired on drag-end / keyboard resize / visibility change. `detail.sizes` = panel sizes in percent."
            },
            {
              "name": "kai-maximize-change",
              "type": {
                "text": "CustomEvent<{ maximized: false | true; index: null | number }>"
              },
              "description": "Observe layout maximize state."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-resizable-item",
          "name": "KaiResizableItemElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "size",
              "type": {
                "text": "undefined | string"
              },
              "description": "Initial main-axis size: `\"280px\"` (fixed) or `\"25%\"`/`25` (percent). Omitted → flexible.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "min",
              "type": {
                "text": "undefined | string"
              },
              "description": "Minimum size during resize (px or %).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "max",
              "type": {
                "text": "undefined | string"
              },
              "description": "Maximum size during resize (px or %).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "locked",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Fix this panel's size; adjacent dividers become non-draggable.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "hidden",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Hide this panel; its divider is dropped and the rest reflow.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "collapsed",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Collapse this panel — same layout effect as `hidden` (divider dropped, the rest reflow), but it WORKS as a bare boolean from framework JSX. A plain `<kai-resizable-item collapsed>` in React/Solid/Vue/Svelte collapses the panel at the first render; `hidden` does not, because a JSX boolean sets neither the `hidden` attribute nor the IDL property on a custom element, so the parent never sees it. The facade reflects `collapsed` to a `collapsed` attribute the parent reads. Prefer this over `hidden` for declarative collapse.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "size",
              "fieldName": "size",
              "type": {
                "text": "undefined | string"
              },
              "description": "Initial main-axis size: `\"280px\"` (fixed) or `\"25%\"`/`25` (percent). Omitted → flexible."
            },
            {
              "name": "min",
              "fieldName": "min",
              "type": {
                "text": "undefined | string"
              },
              "description": "Minimum size during resize (px or %)."
            },
            {
              "name": "max",
              "fieldName": "max",
              "type": {
                "text": "undefined | string"
              },
              "description": "Maximum size during resize (px or %)."
            },
            {
              "name": "locked",
              "fieldName": "locked",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Fix this panel's size; adjacent dividers become non-draggable."
            },
            {
              "name": "hidden",
              "fieldName": "hidden",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Hide this panel; its divider is dropped and the rest reflow."
            },
            {
              "name": "collapsed",
              "fieldName": "collapsed",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Collapse this panel — same layout effect as `hidden` (divider dropped, the rest reflow), but it WORKS as a bare boolean from framework JSX. A plain `<kai-resizable-item collapsed>` in React/Solid/Vue/Svelte collapses the panel at the first render; `hidden` does not, because a JSX boolean sets neither the `hidden` attribute nor the IDL property on a custom element, so the parent never sees it. The facade reflects `collapsed` to a `collapsed` attribute the parent reads. Prefer this over `hidden` for declarative collapse."
            }
          ],
          "events": [
            {
              "name": "kai-change",
              "type": {
                "text": "CustomEvent<unknown>"
              },
              "description": ""
            },
            {
              "name": "kai-maximize-change",
              "type": {
                "text": "CustomEvent<unknown>"
              },
              "description": ""
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-response-stream",
          "name": "KaiResponseStreamElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "text",
              "type": {
                "text": "undefined | string | AsyncIterable<string>"
              },
              "description": "Text to stream. A string, or an `AsyncIterable<string>` (set as a JS property — async iterables can't be HTML attributes).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "mode",
              "type": {
                "text": "undefined | \"typewriter\" | \"fade\""
              },
              "description": "Reveal animation.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "speed",
              "type": {
                "text": "undefined | number"
              },
              "description": "Characters/segments per tick.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "as",
              "type": {
                "text": "undefined | string"
              },
              "description": "Element tag to render as.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "mode",
              "fieldName": "mode",
              "type": {
                "text": "undefined | \"typewriter\" | \"fade\""
              },
              "description": "Reveal animation."
            },
            {
              "name": "speed",
              "fieldName": "speed",
              "type": {
                "text": "undefined | number"
              },
              "description": "Characters/segments per tick."
            },
            {
              "name": "as",
              "fieldName": "as",
              "type": {
                "text": "undefined | string"
              },
              "description": "Element tag to render as."
            }
          ],
          "events": [
            {
              "name": "kai-complete",
              "type": {
                "text": "CustomEvent"
              },
              "description": "Streaming finished."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-scope-picker",
          "name": "KaiScopePickerElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "availableAuthors",
              "type": {
                "text": "string[]"
              },
              "description": "Authors to offer as scope filters. Set as a JS property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "availableTags",
              "type": {
                "text": "string[]"
              },
              "description": "Tags to offer as scope filters. Set as a JS property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "currentLabel",
              "type": {
                "text": "undefined | string"
              },
              "description": "The label shown on the trigger for the active scope.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe the dropdown's open state (Shoelace-style: settable + reflected to the `open` attribute, the dropdown still self-manages on click/keyboard). Set `el.open = true`, or `<kai-scope-picker open>`; listen for `kai-open-change`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the trigger — click/keyboard and `show()` no longer open the dropdown.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "show",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Open it programmatically (no-op while disabled).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "hide",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Close it programmatically.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "toggle",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Flip the open state (closes while disabled).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "current-label",
              "fieldName": "currentLabel",
              "type": {
                "text": "undefined | string"
              },
              "description": "The label shown on the trigger for the active scope."
            },
            {
              "name": "open",
              "fieldName": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe the dropdown's open state (Shoelace-style: settable + reflected to the `open` attribute, the dropdown still self-manages on click/keyboard). Set `el.open = true`, or `<kai-scope-picker open>`; listen for `kai-open-change`."
            },
            {
              "name": "default-open",
              "fieldName": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed)."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the trigger — click/keyboard and `show()` no longer open the dropdown."
            }
          ],
          "events": [
            {
              "name": "kai-open-change",
              "type": {
                "text": "CustomEvent<{ open: false | true }>"
              },
              "description": "The scope dropdown opened or closed (by click, keyboard, Escape, outside-click, or a method)."
            },
            {
              "name": "kai-scope-change",
              "type": {
                "text": "CustomEvent<{ filters: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }>"
              },
              "description": "A scope was chosen (`undefined` filters = \"All Content\")."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-screen",
          "name": "KaiScreenElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages). Set `el.open = true`, or `<kai-screen open>`; listen for `kai-open-change`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "headline",
              "type": {
                "text": "undefined | string"
              },
              "description": "Header title text. A projected `title` slot overrides it. (Named `headline` because `title` collides with the global `HTMLElement.title` attribute.)",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "back",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show the back button (default true).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "noInert",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Opt out of marking sibling elements inert/aria-hidden while open (for unusual layouts).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "show",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Open it programmatically (no-op while disabled).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "hide",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Close it programmatically.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "toggle",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Flip the open state (closes while disabled).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "focus",
              "parameters": [
                {
                  "name": "options?: FocusOptions"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Move focus to the screen surface (no-op while closed).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "open",
              "fieldName": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages). Set `el.open = true`, or `<kai-screen open>`; listen for `kai-open-change`."
            },
            {
              "name": "default-open",
              "fieldName": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed)."
            },
            {
              "name": "headline",
              "fieldName": "headline",
              "type": {
                "text": "undefined | string"
              },
              "description": "Header title text. A projected `title` slot overrides it. (Named `headline` because `title` collides with the global `HTMLElement.title` attribute.)"
            },
            {
              "name": "back",
              "fieldName": "back",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show the back button (default true)."
            },
            {
              "name": "no-inert",
              "fieldName": "noInert",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Opt out of marking sibling elements inert/aria-hidden while open (for unusual layouts)."
            }
          ],
          "events": [
            {
              "name": "kai-back",
              "type": {
                "text": "CustomEvent<Record<string, never>>"
              },
              "description": "Back navigation intent: the back button or Escape. The consumer flips their own routing in response (the screen knows nothing about the trigger)."
            },
            {
              "name": "kai-open-change",
              "type": {
                "text": "CustomEvent<{ open: false | true }>"
              },
              "description": "The screen opened or closed (a method, `Escape` close, or driven `open`)."
            }
          ],
          "cssProperties": [],
          "slots": [
            {
              "name": "title",
              "description": "Rich header title; overrides the `headline` prop."
            },
            {
              "name": "actions",
              "description": "Header trailing cluster (e.g. an avatar or overflow menu)."
            }
          ],
          "cssParts": [
            {
              "name": "header",
              "description": "The back-header bar (back button + title + actions). Restyle its height, padding, or border from outside.",
              "recipe": "kai-screen::part(header) { height: 3.25rem; padding-inline: 1rem }"
            },
            {
              "name": "back",
              "description": "The back button. Restyle or hide it from outside; `back=\"false\"` removes it entirely.",
              "recipe": "kai-screen::part(back) { border-radius: 9999px }"
            },
            {
              "name": "body",
              "description": "The full-bleed surface that fills the mount point and scrolls its content. Tune padding or background from outside.",
              "recipe": "kai-screen::part(body) { background: var(--color-card) }"
            },
            {
              "name": "title",
              "description": "Rich header title; overrides the `headline` prop."
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-scroll-area",
          "name": "KaiScrollAreaElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "orientation",
              "type": {
                "text": "undefined | \"vertical\" | \"horizontal\" | \"both\""
              },
              "description": "Which axis scrolls. `vertical` (default) · `horizontal` · `both`. The cross axis is clamped so content can't overflow it.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "orientation",
              "fieldName": "orientation",
              "type": {
                "text": "undefined | \"vertical\" | \"horizontal\" | \"both\""
              },
              "description": "Which axis scrolls. `vertical` (default) · `horizontal` · `both`. The cross axis is clamped so content can't overflow it."
            }
          ],
          "events": [],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "viewport",
              "description": "The scrolling container. Add padding or a max-height from outside; the thin scrollbar follows `--color-scrollbar-thumb`.",
              "recipe": "kai-scroll-area::part(viewport) { padding-right: 0.5rem }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-scroll-button",
          "name": "KaiScrollButtonElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "for",
              "type": {
                "text": "undefined | string"
              },
              "description": "CSS id of the scroll container to control. When omitted the element walks up the DOM (outside its own shadow root) to find the nearest scrollable ancestor. Mirrors the `for` convention of `<label for=\"...\">`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "variant",
              "type": {
                "text": "undefined | \"default\" | \"ghost\" | \"outline\""
              },
              "description": "Button visual variant: `'outline' | 'ghost' | 'default'`. Defaults to `'outline'`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\""
              },
              "description": "Button size token. Defaults to `'icon'` (square).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "for",
              "fieldName": "for",
              "type": {
                "text": "undefined | string"
              },
              "description": "CSS id of the scroll container to control. When omitted the element walks up the DOM (outside its own shadow root) to find the nearest scrollable ancestor. Mirrors the `for` convention of `<label for=\"...\">`."
            },
            {
              "name": "variant",
              "fieldName": "variant",
              "type": {
                "text": "undefined | \"default\" | \"ghost\" | \"outline\""
              },
              "description": "Button visual variant: `'outline' | 'ghost' | 'default'`. Defaults to `'outline'`."
            },
            {
              "name": "size",
              "fieldName": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\""
              },
              "description": "Button size token. Defaults to `'icon'` (square)."
            }
          ],
          "events": [
            {
              "name": "kai-scroll",
              "type": {
                "text": "CustomEvent"
              },
              "description": "Emitted when the user clicks the button and `scrollToBottom()` is called. Carries no detail — consumers use it to know a manual scroll occurred."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-search",
          "name": "KaiSearchElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "undefined | string"
              },
              "description": "Controlled query — settable and reflected to the `value` attribute. Read `el.value` for live state.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "placeholder",
              "type": {
                "text": "undefined | string"
              },
              "description": "Placeholder. Defaults to `Search…`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "icon",
              "type": {
                "text": "undefined | string"
              },
              "description": "Leading icon-NAME string (a curated name, URL, or text), resolved to a glyph the same way `kai-button`'s `icon` is. Defaults to `search`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "debounce",
              "type": {
                "text": "undefined | number"
              },
              "description": "Debounce window for `kai-search`, in ms. Defaults to `200`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "loading",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a spinner in place of the leading icon while results load.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "shortcut",
              "type": {
                "text": "undefined | string"
              },
              "description": "Optional shortcut hint shown (as a `kai-kbd`) while the field is empty, e.g. `Mod+K`. Display only; it does not bind the key.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "focus",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "value",
              "fieldName": "value",
              "type": {
                "text": "undefined | string"
              },
              "description": "Controlled query — settable and reflected to the `value` attribute. Read `el.value` for live state."
            },
            {
              "name": "placeholder",
              "fieldName": "placeholder",
              "type": {
                "text": "undefined | string"
              },
              "description": "Placeholder. Defaults to `Search…`."
            },
            {
              "name": "icon",
              "fieldName": "icon",
              "type": {
                "text": "undefined | string"
              },
              "description": "Leading icon-NAME string (a curated name, URL, or text), resolved to a glyph the same way `kai-button`'s `icon` is. Defaults to `search`."
            },
            {
              "name": "debounce",
              "fieldName": "debounce",
              "type": {
                "text": "undefined | number"
              },
              "description": "Debounce window for `kai-search`, in ms. Defaults to `200`."
            },
            {
              "name": "loading",
              "fieldName": "loading",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show a spinner in place of the leading icon while results load."
            },
            {
              "name": "shortcut",
              "fieldName": "shortcut",
              "type": {
                "text": "undefined | string"
              },
              "description": "Optional shortcut hint shown (as a `kai-kbd`) while the field is empty, e.g. `Mod+K`. Display only; it does not bind the key."
            }
          ],
          "events": [
            {
              "name": "kai-change",
              "type": {
                "text": "CustomEvent<{ value: string }>"
              },
              "description": "The field committed (blur)."
            },
            {
              "name": "kai-search",
              "type": {
                "text": "CustomEvent<{ value: string }>"
              },
              "description": "The query changed (debounced live, and on clear)."
            },
            {
              "name": "kai-submit",
              "type": {
                "text": "CustomEvent<{ value: string }>"
              },
              "description": "Enter was pressed."
            }
          ],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "field",
              "description": "The bordered control box (the row wrapping the search icon, input, and clear button).",
              "recipe": "kai-search::part(field) { border-radius: 9999px }"
            },
            {
              "name": "input",
              "description": "The inner search input element.",
              "recipe": "kai-search::part(input) { font-size: 0.875rem }"
            },
            {
              "name": "clear",
              "description": "The trailing clear (\"x\") button, shown when the field is non-empty.",
              "recipe": "kai-search::part(clear) { opacity: 1 }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-segmented",
          "name": "KaiSegmentedElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "options",
              "type": {
                "text": "{ value: string; label: string; icon?: undefined | string }[]"
              },
              "description": "The selectable segments, left to right. Set as a JS property (array).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "undefined | string"
              },
              "description": "Controlled selected `value` — settable and reflected to the `value` attribute. `el.value = 'preview'` drives it; choosing a segment updates it and fires `kai-change`. Read `el.value` for live state.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\""
              },
              "description": "Control density: `sm` or `md`. Defaults to `md`.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "value",
              "fieldName": "value",
              "type": {
                "text": "undefined | string"
              },
              "description": "Controlled selected `value` — settable and reflected to the `value` attribute. `el.value = 'preview'` drives it; choosing a segment updates it and fires `kai-change`. Read `el.value` for live state."
            },
            {
              "name": "size",
              "fieldName": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\""
              },
              "description": "Control density: `sm` or `md`. Defaults to `md`."
            }
          ],
          "events": [
            {
              "name": "kai-change",
              "type": {
                "text": "CustomEvent<{ value: string }>"
              },
              "description": "A segment was chosen."
            }
          ],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "track",
              "description": "The segmented track (the pill container holding the segments). Restyle its background, radius, or padding.",
              "recipe": "kai-segmented::part(track) { border-radius: 9999px }"
            },
            {
              "name": "segment",
              "description": "Each segment button. Restyle padding, font weight, or the selected look.",
              "recipe": "kai-segmented::part(segment) { font-weight: 600 }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-separator",
          "name": "KaiSeparatorElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "orientation",
              "type": {
                "text": "undefined | \"vertical\" | \"horizontal\""
              },
              "description": "`horizontal` (default, block + full-width) or `vertical` (a rule inside a flex/grid row — it stretches to the row height).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "orientation",
              "fieldName": "orientation",
              "type": {
                "text": "undefined | \"vertical\" | \"horizontal\""
              },
              "description": "`horizontal` (default, block + full-width) or `vertical` (a rule inside a flex/grid row — it stretches to the row height)."
            }
          ],
          "events": [],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "separator",
              "description": "The divider line. Restyle its color, thickness, or inset from outside.",
              "recipe": "kai-separator::part(separator) { background: var(--color-border) }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-setting-item",
          "name": "KaiSettingItemElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Row label (primary text). Attribute: `label`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "description",
              "type": {
                "text": "undefined | string"
              },
              "description": "Optional secondary description under the label. Attribute: `description`.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "label",
              "fieldName": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Row label (primary text). Attribute: `label`."
            },
            {
              "name": "description",
              "fieldName": "description",
              "type": {
                "text": "undefined | string"
              },
              "description": "Optional secondary description under the label. Attribute: `description`."
            }
          ],
          "events": [],
          "cssProperties": [],
          "slots": [
            {
              "name": "control",
              "description": "The row control (a switch, segmented, select, etc.), right-aligned. Omit it for a label-only row."
            }
          ],
          "cssParts": [
            {
              "name": "label",
              "description": "The label + description block on the left of the row. Restyle its typography or spacing.",
              "recipe": "kai-setting-item::part(label) { gap: 0.125rem }"
            },
            {
              "name": "control",
              "description": "The row control (a switch, segmented, select, etc.), right-aligned. Omit it for a label-only row."
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-settings-group",
          "name": "KaiSettingsGroupElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "heading",
              "type": {
                "text": "undefined | string"
              },
              "description": "Small section heading shown above the card. Attribute: `heading`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "description",
              "type": {
                "text": "undefined | string"
              },
              "description": "Optional muted description under the heading. Attribute: `description`.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "heading",
              "fieldName": "heading",
              "type": {
                "text": "undefined | string"
              },
              "description": "Small section heading shown above the card. Attribute: `heading`."
            },
            {
              "name": "description",
              "fieldName": "description",
              "type": {
                "text": "undefined | string"
              },
              "description": "Optional muted description under the heading. Attribute: `description`."
            }
          ],
          "events": [],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "header",
              "description": "The group heading + description block. Restyle its spacing or typography.",
              "recipe": "kai-settings-group::part(header) { margin-bottom: 0.75rem }"
            },
            {
              "name": "body",
              "description": "The bordered card holding the setting rows. Restyle its surface, border, or radius.",
              "recipe": "kai-settings-group::part(body) { border-radius: 1rem }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-skeleton",
          "name": "KaiSkeletonElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "variant",
              "type": {
                "text": "undefined | \"text\" | \"rect\" | \"circle\""
              },
              "description": "`text` (one or more lines), `rect` (a block), or `circle` (round). Defaults to `text`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "width",
              "type": {
                "text": "undefined | string"
              },
              "description": "CSS width (e.g. `'12rem'`, `'60%'`). Defaults to full width (responsive); for `circle` it is the diameter.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "height",
              "type": {
                "text": "undefined | string"
              },
              "description": "CSS height. Defaults per variant (a text line height; circle = width).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "lines",
              "type": {
                "text": "undefined | number"
              },
              "description": "`text` only: number of lines; the last is shorter. Defaults to 1.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "variant",
              "fieldName": "variant",
              "type": {
                "text": "undefined | \"text\" | \"rect\" | \"circle\""
              },
              "description": "`text` (one or more lines), `rect` (a block), or `circle` (round). Defaults to `text`."
            },
            {
              "name": "width",
              "fieldName": "width",
              "type": {
                "text": "undefined | string"
              },
              "description": "CSS width (e.g. `'12rem'`, `'60%'`). Defaults to full width (responsive); for `circle` it is the diameter."
            },
            {
              "name": "height",
              "fieldName": "height",
              "type": {
                "text": "undefined | string"
              },
              "description": "CSS height. Defaults per variant (a text line height; circle = width)."
            },
            {
              "name": "lines",
              "fieldName": "lines",
              "type": {
                "text": "undefined | number"
              },
              "description": "`text` only: number of lines; the last is shorter. Defaults to 1."
            }
          ],
          "events": [],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "skeleton",
              "description": "The shimmer block(s). Recolor or change the opacity from outside; the default is a low-contrast foreground tint that reads in both light and dark.",
              "recipe": "kai-skeleton::part(skeleton) { background: var(--color-primary); opacity: 0.15 }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-skills",
          "name": "KaiSkillsElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "skills",
              "type": {
                "text": "{ id: string; name: string }[]"
              },
              "description": "The active skills to badge. Set as a JS property.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            }
          ],
          "events": [],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-source",
          "name": "KaiSourceElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "href",
              "type": {
                "text": "undefined | string"
              },
              "description": "The URL this citation links to (the domain also seeds the default label/favicon).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Trigger label (defaults to the domain).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "headline",
              "type": {
                "text": "undefined | string"
              },
              "description": "Hover-card headline. Attribute: `headline` (`title` is avoided — it's a global HTML attribute that reflects in a CE constructor and breaks it).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "description",
              "type": {
                "text": "undefined | string"
              },
              "description": "Hover-card body text describing the source.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "showFavicon",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show the source's favicon next to the trigger label.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "href",
              "fieldName": "href",
              "type": {
                "text": "undefined | string"
              },
              "description": "The URL this citation links to (the domain also seeds the default label/favicon)."
            },
            {
              "name": "label",
              "fieldName": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Trigger label (defaults to the domain)."
            },
            {
              "name": "headline",
              "fieldName": "headline",
              "type": {
                "text": "undefined | string"
              },
              "description": "Hover-card headline. Attribute: `headline` (`title` is avoided — it's a global HTML attribute that reflects in a CE constructor and breaks it)."
            },
            {
              "name": "description",
              "fieldName": "description",
              "type": {
                "text": "undefined | string"
              },
              "description": "Hover-card body text describing the source."
            },
            {
              "name": "show-favicon",
              "fieldName": "showFavicon",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show the source's favicon next to the trigger label."
            }
          ],
          "events": [],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-sources",
          "name": "KaiSourcesElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "sources",
              "type": {
                "text": "{ href: string; title?: undefined | string; description?: undefined | string; label?: undefined | string; showFavicon?: undefined | false | true }[]"
              },
              "description": "The sources to render. Set as a JS property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "showFavicon",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show favicons on all items (per-item `showFavicon` overrides).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "numbered",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "When true, each citation chip is labelled with its 1-based index in the merged (prop + declarative-children) list (`[1]`, `[2]`, …) instead of the per-item `label` or domain fallback. HTML attribute: `numbered` (boolean — bare attribute or `numbered=\"true\"`). JS property: `el.numbered = true`.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "show-favicon",
              "fieldName": "showFavicon",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Show favicons on all items (per-item `showFavicon` overrides)."
            },
            {
              "name": "numbered",
              "fieldName": "numbered",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "When true, each citation chip is labelled with its 1-based index in the merged (prop + declarative-children) list (`[1]`, `[2]`, …) instead of the per-item `label` or domain fallback. HTML attribute: `numbered` (boolean — bare attribute or `numbered=\"true\"`). JS property: `el.numbered = true`."
            }
          ],
          "events": [],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-status",
          "name": "KaiStatusElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "status",
              "type": {
                "text": "undefined | \"new\" | \"online\" | \"busy\" | \"away\" | \"offline\""
              },
              "description": "Presence/notification state → color. `new` (default) maps to the blue hue.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "pulse",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Animated ping ring (off by default; respects prefers-reduced-motion).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Accessible name. Without it the dot is decorative.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\""
              },
              "description": "`sm` (default) or `md`.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "status",
              "fieldName": "status",
              "type": {
                "text": "undefined | \"new\" | \"online\" | \"busy\" | \"away\" | \"offline\""
              },
              "description": "Presence/notification state → color. `new` (default) maps to the blue hue."
            },
            {
              "name": "pulse",
              "fieldName": "pulse",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Animated ping ring (off by default; respects prefers-reduced-motion)."
            },
            {
              "name": "label",
              "fieldName": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Accessible name. Without it the dot is decorative."
            },
            {
              "name": "size",
              "fieldName": "size",
              "type": {
                "text": "undefined | \"sm\" | \"md\""
              },
              "description": "`sm` (default) or `md`."
            }
          ],
          "events": [],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "dot",
              "description": "The status dot. Recolor or resize it from outside; the `status` prop sets the default hue.",
              "recipe": "kai-status::part(dot) { background: var(--color-tool-green) }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-suggestions",
          "name": "KaiSuggestionsElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "suggestions",
              "type": {
                "text": "(string | { label: string; value?: undefined | string; icon?: undefined | string })[]"
              },
              "description": "The suggestions. Strings, or `{ label, value }` when the displayed text and the emitted value differ. Set as a JS property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "variant",
              "type": {
                "text": "undefined | \"default\" | \"ghost\" | \"outline\""
              },
              "description": "Chip style: `'outline'` (default), `'ghost'`, or `'default'` (filled).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "size",
              "type": {
                "text": "undefined | \"md\" | \"lg\""
              },
              "description": "Row height for `layout=\"list\"`: `'md'` (default) or `'lg'` for taller rows. Chips are unaffected.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "layout",
              "type": {
                "text": "undefined | \"list\" | \"chips\""
              },
              "description": "Layout: `'chips'` (default) renders a wrapping row of rounded pills; `'list'` renders a vertical, full-width \"Ideas for you\" list — each row is left-aligned with a leading `icon`, a label, and a hover background.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "block",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Full-width left-aligned rows instead of pills.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "highlight",
              "type": {
                "text": "undefined | string"
              },
              "description": "Substring to highlight within each suggestion.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "variant",
              "fieldName": "variant",
              "type": {
                "text": "undefined | \"default\" | \"ghost\" | \"outline\""
              },
              "description": "Chip style: `'outline'` (default), `'ghost'`, or `'default'` (filled)."
            },
            {
              "name": "size",
              "fieldName": "size",
              "type": {
                "text": "undefined | \"md\" | \"lg\""
              },
              "description": "Row height for `layout=\"list\"`: `'md'` (default) or `'lg'` for taller rows. Chips are unaffected."
            },
            {
              "name": "layout",
              "fieldName": "layout",
              "type": {
                "text": "undefined | \"list\" | \"chips\""
              },
              "description": "Layout: `'chips'` (default) renders a wrapping row of rounded pills; `'list'` renders a vertical, full-width \"Ideas for you\" list — each row is left-aligned with a leading `icon`, a label, and a hover background."
            },
            {
              "name": "block",
              "fieldName": "block",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Full-width left-aligned rows instead of pills."
            },
            {
              "name": "highlight",
              "fieldName": "highlight",
              "type": {
                "text": "undefined | string"
              },
              "description": "Substring to highlight within each suggestion."
            }
          ],
          "events": [
            {
              "name": "kai-select",
              "type": {
                "text": "CustomEvent<{ value: string }>"
              },
              "description": "A suggestion was clicked."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-switch",
          "name": "KaiSwitchElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "checked",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Controlled checked state — settable and reflected to the `checked` attribute. `el.checked = true` (or `<kai-switch checked>`) drives it; the toggle UI updates it and fires `kai-change`. Read `el.checked` for live state.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultChecked",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial checked state on mount (uncontrolled seed). Bare attribute (`<kai-switch default-checked>`) turns it on.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable interaction.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Accessible label.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "name",
              "type": {
                "text": "undefined | string"
              },
              "description": "Form-control name (paired with `value`).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "undefined | string"
              },
              "description": "Submitted value when checked (paired with `name`). Defaults to `'on'`.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "toggle",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Flip the switch and fire `kai-change` (no-op while disabled).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "focus",
              "parameters": [
                {
                  "name": "options?: FocusOptions"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Focus the inner `role=\"switch\"` button (the host element can't reach it).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "checked",
              "fieldName": "checked",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Controlled checked state — settable and reflected to the `checked` attribute. `el.checked = true` (or `<kai-switch checked>`) drives it; the toggle UI updates it and fires `kai-change`. Read `el.checked` for live state."
            },
            {
              "name": "default-checked",
              "fieldName": "defaultChecked",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial checked state on mount (uncontrolled seed). Bare attribute (`<kai-switch default-checked>`) turns it on."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable interaction."
            },
            {
              "name": "label",
              "fieldName": "label",
              "type": {
                "text": "undefined | string"
              },
              "description": "Accessible label."
            },
            {
              "name": "name",
              "fieldName": "name",
              "type": {
                "text": "undefined | string"
              },
              "description": "Form-control name (paired with `value`)."
            },
            {
              "name": "value",
              "fieldName": "value",
              "type": {
                "text": "undefined | string"
              },
              "description": "Submitted value when checked (paired with `name`). Defaults to `'on'`."
            }
          ],
          "events": [
            {
              "name": "kai-change",
              "type": {
                "text": "CustomEvent<{ checked: false | true }>"
              },
              "description": "The toggle changed."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-tabs",
          "name": "KaiTabsElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "items",
              "type": {
                "text": "undefined | { id: string; label?: undefined | string; icon?: undefined | string; disabled?: undefined | false | true }[]"
              },
              "description": "Tabs to render. Set as a JS property, not an HTML attribute.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "undefined | string"
              },
              "description": "Controlled selected id. Set as a JS property (or the `value` attribute); drive it from your app in response to `kai-tab-change`. Omit for uncontrolled.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultValue",
              "type": {
                "text": "undefined | string"
              },
              "description": "Initial selected id when uncontrolled (use the `default-value` attribute in plain HTML).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "variant",
              "type": {
                "text": "undefined | \"segmented\" | \"underline\""
              },
              "description": "`segmented` (default, a pill group) or `underline` (an underlined row).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "block",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Stretch the strip to full width, each tab sharing the space equally.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the whole strip.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "select",
              "parameters": [
                {
                  "name": "id: string"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Select a tab by id (fires `kai-tab-change`). Ignores unknown/disabled ids.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "focus",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Focus the active tab (or the first focusable tab).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "value",
              "fieldName": "value",
              "type": {
                "text": "undefined | string"
              },
              "description": "Controlled selected id. Set as a JS property (or the `value` attribute); drive it from your app in response to `kai-tab-change`. Omit for uncontrolled."
            },
            {
              "name": "default-value",
              "fieldName": "defaultValue",
              "type": {
                "text": "undefined | string"
              },
              "description": "Initial selected id when uncontrolled (use the `default-value` attribute in plain HTML)."
            },
            {
              "name": "variant",
              "fieldName": "variant",
              "type": {
                "text": "undefined | \"segmented\" | \"underline\""
              },
              "description": "`segmented` (default, a pill group) or `underline` (an underlined row)."
            },
            {
              "name": "block",
              "fieldName": "block",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Stretch the strip to full width, each tab sharing the space equally."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the whole strip."
            }
          ],
          "events": [
            {
              "name": "kai-tab-change",
              "type": {
                "text": "CustomEvent<{ value: string }>"
              },
              "description": "A tab was selected (click, Enter/Space, or arrow-key move). `value` is the item's id."
            }
          ],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "tablist",
              "description": "The tab strip container (role=\"tablist\"). Restyle its gap, padding, background, or radius from outside; the `variant` prop sets the segmented/underline defaults.",
              "recipe": "kai-tabs::part(tablist) { gap: 0.5rem; background: var(--color-card) }"
            },
            {
              "name": "tab",
              "description": "A single tab button. Restyle from outside; the active tab carries a `[data-active]` attribute, so target `::part(tab)[data-active]` for the selected look.",
              "recipe": "kai-tabs::part(tab)[data-active] { color: var(--color-primary); font-weight: 600 }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-tasks",
          "name": "KaiTasksElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "data",
              "type": {
                "text": "undefined | Record<string, unknown>"
              },
              "description": "The tasks definition (the CardEnvelope.data). Set as a JS PROPERTY: `el.data = { tasks:[…], selectAll, confirmLabel, … }`. Import `TasksCardData` from `@kitn.ai/ui` for the full shape.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "cardId",
              "type": {
                "text": "undefined | string"
              },
              "description": "Stable card id correlating every emitted CardEvent. Attribute: `card-id`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "heading",
              "type": {
                "text": "undefined | string"
              },
              "description": "Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "resolution",
              "type": {
                "text": "undefined | Record<string, unknown>"
              },
              "description": "Set when the user resolved this card; renders the read-only view. Property: `el.resolution = { kind:'submit', data:{ selected:[…] } }`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "undefined | string[]"
              },
              "description": "Controlled selection (task ids; JS property). When set, it wins over local state.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultValue",
              "type": {
                "text": "undefined | string[]"
              },
              "description": "Uncontrolled initial selection (task ids; JS property), overlaying per-task `checked`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Freeze the whole list + Confirm. Attribute: `disabled`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Display-only: rows can't be toggled and show the default cursor (no pointer, hover, or focus affordances). Keeps the look as-is. Attribute: `readonly`.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "select",
              "parameters": [
                {
                  "name": "taskIds?: string[]"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Set the checked task ids (local-only, no emit), respecting disabled/max. With no arg, select all toggleable rows.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "toggle",
              "parameters": [
                {
                  "name": "taskId: string, checked?: boolean"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Toggle one task by id, honoring the max gate (no `checked` = flip).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "send",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Confirm the current selection — emits the `submit` CardEvent + resolves (only when the min/max gate passes). Named `send`, not `submit`.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "focus",
              "parameters": [
                {
                  "name": "options?: FocusOptions"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Focus the task group (select-all checkbox if shown, else the first row).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "dismiss",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Trigger the dismiss path (emit `dismiss` + collapse to the re-openable stub).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "reopen",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Re-open a dismissed card from its stub (emit `reopen`).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "card-id",
              "fieldName": "cardId",
              "type": {
                "text": "undefined | string"
              },
              "description": "Stable card id correlating every emitted CardEvent. Attribute: `card-id`."
            },
            {
              "name": "heading",
              "fieldName": "heading",
              "type": {
                "text": "undefined | string"
              },
              "description": "Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Freeze the whole list + Confirm. Attribute: `disabled`."
            },
            {
              "name": "readonly",
              "fieldName": "readonly",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Display-only: rows can't be toggled and show the default cursor (no pointer, hover, or focus affordances). Keeps the look as-is. Attribute: `readonly`."
            }
          ],
          "events": [
            {
              "name": "kai-value-change",
              "type": {
                "text": "CustomEvent<{ value: string[] }>"
              },
              "description": "The selection changed on a toggle — the selected ids in input order."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-text-shimmer",
          "name": "KaiTextShimmerElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "text",
              "type": {
                "text": "undefined | string"
              },
              "description": "The text to shimmer.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "as",
              "type": {
                "text": "undefined | string"
              },
              "description": "Element tag to render as (default `span`).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "duration",
              "type": {
                "text": "undefined | number"
              },
              "description": "Animation duration in seconds.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "spread",
              "type": {
                "text": "undefined | number"
              },
              "description": "Gradient spread (5–45).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "text",
              "fieldName": "text",
              "type": {
                "text": "undefined | string"
              },
              "description": "The text to shimmer."
            },
            {
              "name": "as",
              "fieldName": "as",
              "type": {
                "text": "undefined | string"
              },
              "description": "Element tag to render as (default `span`)."
            },
            {
              "name": "duration",
              "fieldName": "duration",
              "type": {
                "text": "undefined | number"
              },
              "description": "Animation duration in seconds."
            },
            {
              "name": "spread",
              "fieldName": "spread",
              "type": {
                "text": "undefined | number"
              },
              "description": "Gradient spread (5–45)."
            }
          ],
          "events": [],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-thinking-bar",
          "name": "KaiThinkingBarElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "text",
              "type": {
                "text": "undefined | string"
              },
              "description": "The shimmering label, e.g. \"Thinking…\".",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "stoppable",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "When true, show a \"stop\" affordance that fires a `stop` event.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "stopLabel",
              "type": {
                "text": "undefined | string"
              },
              "description": "Label for the stop affordance.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "text",
              "fieldName": "text",
              "type": {
                "text": "undefined | string"
              },
              "description": "The shimmering label, e.g. \"Thinking…\"."
            },
            {
              "name": "stoppable",
              "fieldName": "stoppable",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "When true, show a \"stop\" affordance that fires a `stop` event."
            },
            {
              "name": "stop-label",
              "fieldName": "stopLabel",
              "type": {
                "text": "undefined | string"
              },
              "description": "Label for the stop affordance."
            }
          ],
          "events": [
            {
              "name": "kai-stop",
              "type": {
                "text": "CustomEvent"
              },
              "description": "The \"stop / answer now\" affordance was clicked."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-toast-region",
          "name": "KaiToastRegionElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "toasts",
              "type": {
                "text": "{ id: string; message: string; variant?: undefined | \"error\" | \"info\" | \"success\" | \"warning\" | \"neutral\"; appearance?: undefined | \"pill\" | \"card\"; inverse?: undefined | false | true; description?: undefined | string; action?: undefined | { label: string; onAction: () => void | false }; duration?: undefined | number; dismissible?: undefined | false | true; target?: undefined | HTMLElement }[]"
              },
              "description": "The toasts to render. Newest is shown on top. Set as a JS property (array); pass a new array reference to update.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "position",
              "type": {
                "text": "undefined | \"top-center\" | \"top-right\" | \"top-left\" | \"bottom-center\" | \"bottom-right\" | \"bottom-left\""
              },
              "description": "Stack anchor: `'top-center'` (default), `'top-right'`, `'bottom-center'`, …",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "max",
              "type": {
                "text": "undefined | number"
              },
              "description": "Max simultaneously-visible toasts; the rest queue. Defaults to `3`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "stack",
              "type": {
                "text": "undefined | \"expanded\" | \"collapsed\""
              },
              "description": "Stacking: 'expanded' (default, full column) | 'collapsed' (Sonner-style pile that expands on hover/focus). Attribute: stack.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "appearance",
              "type": {
                "text": "undefined | \"pill\" | \"card\""
              },
              "description": "Default appearance for this region's toasts: `'pill'` (default, compact) | `'card'` (richer, with a description line). A per-toast `appearance` wins. Attribute: `appearance`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "inverse",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Default high-contrast inverse treatment for this region's toasts. A per-toast `inverse` wins. Off by default. Attribute: `inverse`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "target",
              "type": {
                "text": "undefined | HTMLElement"
              },
              "description": "Container element to anchor this region to (JS property). Set by the store for a scoped region; unset = the global viewport region.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "position",
              "fieldName": "position",
              "type": {
                "text": "undefined | \"top-center\" | \"top-right\" | \"top-left\" | \"bottom-center\" | \"bottom-right\" | \"bottom-left\""
              },
              "description": "Stack anchor: `'top-center'` (default), `'top-right'`, `'bottom-center'`, …"
            },
            {
              "name": "max",
              "fieldName": "max",
              "type": {
                "text": "undefined | number"
              },
              "description": "Max simultaneously-visible toasts; the rest queue. Defaults to `3`."
            },
            {
              "name": "stack",
              "fieldName": "stack",
              "type": {
                "text": "undefined | \"expanded\" | \"collapsed\""
              },
              "description": "Stacking: 'expanded' (default, full column) | 'collapsed' (Sonner-style pile that expands on hover/focus). Attribute: stack."
            },
            {
              "name": "appearance",
              "fieldName": "appearance",
              "type": {
                "text": "undefined | \"pill\" | \"card\""
              },
              "description": "Default appearance for this region's toasts: `'pill'` (default, compact) | `'card'` (richer, with a description line). A per-toast `appearance` wins. Attribute: `appearance`."
            },
            {
              "name": "inverse",
              "fieldName": "inverse",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Default high-contrast inverse treatment for this region's toasts. A per-toast `inverse` wins. Off by default. Attribute: `inverse`."
            }
          ],
          "events": [
            {
              "name": "kai-action",
              "type": {
                "text": "CustomEvent<{ id: string; label: string }>"
              },
              "description": "A toast's action button was pressed."
            },
            {
              "name": "kai-dismiss",
              "type": {
                "text": "CustomEvent<{ id: string; reason: \"action\" | \"timeout\" | \"close\" }>"
              },
              "description": "A toast left the stack. `reason` is `'timeout' | 'close' | 'action'`."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-tool",
          "name": "KaiToolElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "tool",
              "type": {
                "text": "undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }"
              },
              "description": "The tool-call to display. Set as a JS property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages on trigger click). Set `el.open = true`, or `<kai-tool open>`; listen for `kai-open-change`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Gate the disclosure trigger — programmatic `show()/hide()/toggle()` still work, but the trigger click no longer toggles.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "show",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Open it programmatically (no-op while disabled).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "hide",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Close it programmatically.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "toggle",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Flip the open state (closes while disabled).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "open",
              "fieldName": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages on trigger click). Set `el.open = true`, or `<kai-tool open>`; listen for `kai-open-change`."
            },
            {
              "name": "default-open",
              "fieldName": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed)."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Gate the disclosure trigger — programmatic `show()/hide()/toggle()` still work, but the trigger click no longer toggles."
            }
          ],
          "events": [
            {
              "name": "kai-open-change",
              "type": {
                "text": "CustomEvent<{ open: false | true }>"
              },
              "description": "The panel expanded or collapsed (by trigger click or a method)."
            }
          ],
          "cssProperties": [
            {
              "name": "--color-tool-blue"
            },
            {
              "name": "--color-tool-amber"
            },
            {
              "name": "--color-tool-green"
            },
            {
              "name": "--color-tool-red"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-tooltip",
          "name": "KaiTooltipElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "content",
              "type": {
                "text": "undefined | string"
              },
              "description": "The hint text shown on hover/focus of the slotted trigger.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "openDelay",
              "type": {
                "text": "undefined | number"
              },
              "description": "Delay (ms) before the tooltip appears on hover. Defaults to 600. Focus shows it immediately regardless.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "closeDelay",
              "type": {
                "text": "undefined | number"
              },
              "description": "Delay (ms) before it hides after the pointer leaves. Defaults to 0 (hides immediately).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "placement",
              "type": {
                "text": "undefined | string"
              },
              "description": "Preferred placement: `'top' | 'bottom' | 'left' | 'right'` (+ optional `-start`/`-end`). Defaults to `'top'`; flips to stay in view.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute, the element still self-manages on hover/focus). Set `el.open = true`, or `<kai-tooltip open>`; listen for `kai-open-change`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Turn the tooltip off while keeping the trigger mounted (hover/focus and `show()` no longer open it).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "show",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Open it programmatically (no-op while disabled).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "hide",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Close it programmatically.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "toggle",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Flip the open state (closes while disabled).",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "content",
              "fieldName": "content",
              "type": {
                "text": "undefined | string"
              },
              "description": "The hint text shown on hover/focus of the slotted trigger."
            },
            {
              "name": "open-delay",
              "fieldName": "openDelay",
              "type": {
                "text": "undefined | number"
              },
              "description": "Delay (ms) before the tooltip appears on hover. Defaults to 600. Focus shows it immediately regardless."
            },
            {
              "name": "close-delay",
              "fieldName": "closeDelay",
              "type": {
                "text": "undefined | number"
              },
              "description": "Delay (ms) before it hides after the pointer leaves. Defaults to 0 (hides immediately)."
            },
            {
              "name": "placement",
              "fieldName": "placement",
              "type": {
                "text": "undefined | string"
              },
              "description": "Preferred placement: `'top' | 'bottom' | 'left' | 'right'` (+ optional `-start`/`-end`). Defaults to `'top'`; flips to stay in view."
            },
            {
              "name": "open",
              "fieldName": "open",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute, the element still self-manages on hover/focus). Set `el.open = true`, or `<kai-tooltip open>`; listen for `kai-open-change`."
            },
            {
              "name": "default-open",
              "fieldName": "defaultOpen",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial open state on mount (uncontrolled seed)."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Turn the tooltip off while keeping the trigger mounted (hover/focus and `show()` no longer open it)."
            }
          ],
          "events": [
            {
              "name": "kai-open-change",
              "type": {
                "text": "CustomEvent<{ open: false | true }>"
              },
              "description": "The tooltip opened or closed (by hover/focus, outside-click, or a method)."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-voice-input",
          "name": "KaiVoiceInputElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "transcribe",
              "type": {
                "text": "undefined | (audio: Blob) => Promise<string>"
              },
              "description": "Transcriber the host supplies — records audio, returns the text. This is a **function-valued property** (`el.transcribe = async blob => '...'`) because a value-returning callback can't be modelled as a fire-and-forget event.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the mic button (non-interactive).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "recognitionLang",
              "type": {
                "text": "undefined | string"
              },
              "description": "BCP-47 language tag for the native `SpeechRecognition` path (e.g. `en-US`). Attribute: `recognition-lang` (the plain `lang` attribute is reserved by `HTMLElement` and can't be a custom-element property). No effect when `transcribe` is set or the browser lacks SpeechRecognition.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "interim",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Emit live partial transcripts (`kai-transcript-interim`) during native recognition. Attribute: `interim`. No-op on the transcribe/fallback paths.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "start",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Begin recording programmatically (e.g. push-to-talk bound to a global key). Runs the same getUserMedia path as clicking the mic; no-ops if already recording.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "stop",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Stop the in-progress recording, producing the blob (→ kai-audio-captured) and running transcription. Pairs with start() for push-to-talk.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the mic button (non-interactive)."
            },
            {
              "name": "recognition-lang",
              "fieldName": "recognitionLang",
              "type": {
                "text": "undefined | string"
              },
              "description": "BCP-47 language tag for the native `SpeechRecognition` path (e.g. `en-US`). Attribute: `recognition-lang` (the plain `lang` attribute is reserved by `HTMLElement` and can't be a custom-element property). No effect when `transcribe` is set or the browser lacks SpeechRecognition."
            },
            {
              "name": "interim",
              "fieldName": "interim",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Emit live partial transcripts (`kai-transcript-interim`) during native recognition. Attribute: `interim`. No-op on the transcribe/fallback paths."
            }
          ],
          "events": [
            {
              "name": "kai-audio-captured",
              "type": {
                "text": "CustomEvent<{ blob: Blob }>"
              },
              "description": "Raw audio captured (before transcription) — for hosts that prefer to handle transcription themselves instead of via the `transcribe` property. Also the unsupported-fallback signal: no `transcribe`, no SpeechRecognition, so only the blob is produced (no text)."
            },
            {
              "name": "kai-recording-change",
              "type": {
                "text": "CustomEvent<{ recording: false | true }>"
              },
              "description": "Recording started or stopped — lets the host drive its own UI (waveform, push-to-talk indicator) in sync with the mic. Fires on real transitions only (manual click and programmatic start()/stop()), never on mount."
            },
            {
              "name": "kai-transcript-interim",
              "type": {
                "text": "CustomEvent<{ text: string }>"
              },
              "description": "Live partial transcript during native recognition (only when `interim` is set). Fires repeatedly before the final `kai-transcription`."
            },
            {
              "name": "kai-transcription",
              "type": {
                "text": "CustomEvent<{ text: string }>"
              },
              "description": "Final transcript — the `transcribe` property resolved, OR native `SpeechRecognition` produced final text (no `transcribe` set)."
            }
          ],
          "cssProperties": []
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-voice-output",
          "name": "KaiVoiceOutputElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "text",
              "type": {
                "text": "undefined | string"
              },
              "description": "The utterance to read aloud.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "autoplay",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Speak automatically when `text` is set/changed.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "synthesize",
              "type": {
                "text": "undefined | (text: string) => Promise<Blob>"
              },
              "description": "TTS model seam the host supplies — given text, returns an audio `Blob` to play. This is a **function-valued property** (`el.synthesize = async text => blob`); when set, the native `speechSynthesis` path is bypassed. Mirrors `<kai-voice-input>`'s `transcribe`. A value-returning callback can't be modelled as a fire-and-forget event, hence a property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the button (non-interactive).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "speak",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Speak the current `text` (native, or via `synthesize` if set).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "pause",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Pause playback (resumable).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "resume",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Resume paused playback.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "stop",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Stop playback and reset.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "text",
              "fieldName": "text",
              "type": {
                "text": "undefined | string"
              },
              "description": "The utterance to read aloud."
            },
            {
              "name": "autoplay",
              "fieldName": "autoplay",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Speak automatically when `text` is set/changed."
            },
            {
              "name": "disabled",
              "fieldName": "disabled",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Disable the button (non-interactive)."
            }
          ],
          "events": [
            {
              "name": "kai-speaking-change",
              "type": {
                "text": "CustomEvent<{ speaking: false | true }>"
              },
              "description": "Playback started or stopped — drive your own UI in sync. Fires on real transitions only (manual click and programmatic speak()/stop()), never on mount."
            },
            {
              "name": "kai-synthesized",
              "type": {
                "text": "CustomEvent<{ blob: Blob }>"
              },
              "description": "The model path (`synthesize`) resolved audio — the raw `Blob` before playback."
            }
          ],
          "cssProperties": [],
          "cssParts": [
            {
              "name": "button",
              "description": "The speaker/play button. Restyle radius, size, padding, or colors from outside; it is a ghost icon button by default.",
              "recipe": "kai-voice-output::part(button) { border-radius: 9999px; color: var(--color-primary) }"
            }
          ]
        },
        {
          "kind": "class",
          "customElement": true,
          "tagName": "kai-workspace",
          "name": "KaiWorkspaceElement",
          "description": "",
          "members": [
            {
              "kind": "field",
              "name": "groups",
              "type": {
                "text": "{ id: string; userId?: undefined | string; teamId?: undefined | string; name: string; sortOrder: number; createdAt: string }[]"
              },
              "description": "Pre-bucketed conversation groups for the sidebar. Set as a JS property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "conversations",
              "type": {
                "text": "{ id: string; title: string; groupId?: undefined | string; scope: { type: \"document\" | \"collection\"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string; trailing?: undefined | string }[]"
              },
              "description": "Flat conversation list (auto-bucketed if `groups` is empty). Set as a JS property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "activeId",
              "type": {
                "text": "undefined | string"
              },
              "description": "Id of the open conversation, highlighted in the sidebar.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "messages",
              "type": {
                "text": "{ id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]"
              },
              "description": "The active conversation's message thread, newest last. Set as a JS property.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "undefined | string"
              },
              "description": "",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "placeholder",
              "type": {
                "text": "undefined | string"
              },
              "description": "",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "loading",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "suggestions",
              "type": {
                "text": "undefined | string[]"
              },
              "description": "",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "suggestionMode",
              "type": {
                "text": "undefined | \"submit\" | \"fill\""
              },
              "description": "",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "proseSize",
              "type": {
                "text": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
              },
              "description": "",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "codeTheme",
              "type": {
                "text": "undefined | string"
              },
              "description": "",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "codeHighlight",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "chatTitle",
              "type": {
                "text": "undefined | string"
              },
              "description": "",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "models",
              "type": {
                "text": "undefined | { id: string; name: string; provider?: undefined | string; description?: undefined | string; group?: undefined | string }[]"
              },
              "description": "",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "currentModel",
              "type": {
                "text": "undefined | string"
              },
              "description": "",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "context",
              "type": {
                "text": "undefined | { usedTokens: number; maxTokens: number; inputTokens?: undefined | number; outputTokens?: undefined | number; estimatedCost?: undefined | number }"
              },
              "description": "",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "scrollButton",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "search",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "voice",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "triggers",
              "type": {
                "text": "undefined | { char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]"
              },
              "description": "Rich entity triggers (`/` skills, `@` agents/plugins) forwarded to the input.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "kindIcons",
              "type": {
                "text": "undefined | Record<string, string>"
              },
              "description": "Default icon per entity kind (kind → image src) forwarded to the input.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "sidebarWidth",
              "type": {
                "text": "undefined | number"
              },
              "description": "Sidebar default width as a percent of the workspace (default 26).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "sidebarMinWidth",
              "type": {
                "text": "undefined | number"
              },
              "description": "Sidebar min width in px (default 240).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "sidebarMaxWidth",
              "type": {
                "text": "undefined | number"
              },
              "description": "Sidebar max width in px (default 420).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "sidebarCollapsed",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Controlled collapsed state. Set this as a JS property (`el.sidebarCollapsed = true`) to drive the sidebar from your app, updating it in response to the `kai-sidebar-toggle` event. Omit for uncontrolled (the element manages it).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "defaultSidebarCollapsed",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial collapsed state when uncontrolled (default false). Use the `default-sidebar-collapsed` attribute to start collapsed in plain HTML.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "collapseBelow",
              "type": {
                "text": "undefined | number"
              },
              "description": "Auto-collapse the rail when the workspace's own width drops below this many px, and re-expand when it grows back above. Uncontrolled only (it never fights an app-driven `sidebarCollapsed`); omit to disable. Fires `kai-sidebar-toggle`. Attribute: `collapse-below`.",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "compact",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Render Recents as dense single-line rows (a leading dot + title, no count).",
              "privacy": "public"
            },
            {
              "kind": "field",
              "name": "noConversations",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Suppress the built-in ConversationList so the `sidebar-header` slot owns the whole rail flex region (for apps that supply their own rail nav). Default false. Attribute: `no-conversations`.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "toggleSidebar",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Collapse/expand the conversation sidebar and fire `kai-sidebar-toggle`.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "collapseSidebar",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Force the conversation sidebar collapsed (fires `kai-sidebar-toggle`).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "expandSidebar",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Force the conversation sidebar expanded (fires `kai-sidebar-toggle`).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "focus",
              "parameters": [
                {
                  "name": "options?: FocusOptions"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Focus the thread's composer.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "clear",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Clear the thread draft + staged attachments.",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "send",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Submit the current thread draft programmatically (fires `kai-submit`).",
              "privacy": "public"
            },
            {
              "kind": "method",
              "name": "scrollToBottom",
              "parameters": [
                {
                  "name": "behavior?: ScrollBehavior"
                }
              ],
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Scroll the thread to the newest message.",
              "privacy": "public"
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "'light' | 'dark' | 'auto'"
              },
              "description": "Color mode (auto follows prefers-color-scheme)."
            },
            {
              "name": "active-id",
              "fieldName": "activeId",
              "type": {
                "text": "undefined | string"
              },
              "description": "Id of the open conversation, highlighted in the sidebar."
            },
            {
              "name": "value",
              "fieldName": "value",
              "type": {
                "text": "undefined | string"
              },
              "description": ""
            },
            {
              "name": "placeholder",
              "fieldName": "placeholder",
              "type": {
                "text": "undefined | string"
              },
              "description": ""
            },
            {
              "name": "loading",
              "fieldName": "loading",
              "type": {
                "text": "undefined | false | true"
              },
              "description": ""
            },
            {
              "name": "suggestion-mode",
              "fieldName": "suggestionMode",
              "type": {
                "text": "undefined | \"submit\" | \"fill\""
              },
              "description": ""
            },
            {
              "name": "prose-size",
              "fieldName": "proseSize",
              "type": {
                "text": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
              },
              "description": ""
            },
            {
              "name": "code-theme",
              "fieldName": "codeTheme",
              "type": {
                "text": "undefined | string"
              },
              "description": ""
            },
            {
              "name": "code-highlight",
              "fieldName": "codeHighlight",
              "type": {
                "text": "undefined | false | true"
              },
              "description": ""
            },
            {
              "name": "chat-title",
              "fieldName": "chatTitle",
              "type": {
                "text": "undefined | string"
              },
              "description": ""
            },
            {
              "name": "current-model",
              "fieldName": "currentModel",
              "type": {
                "text": "undefined | string"
              },
              "description": ""
            },
            {
              "name": "scroll-button",
              "fieldName": "scrollButton",
              "type": {
                "text": "undefined | false | true"
              },
              "description": ""
            },
            {
              "name": "search",
              "fieldName": "search",
              "type": {
                "text": "undefined | false | true"
              },
              "description": ""
            },
            {
              "name": "voice",
              "fieldName": "voice",
              "type": {
                "text": "undefined | false | true"
              },
              "description": ""
            },
            {
              "name": "sidebar-width",
              "fieldName": "sidebarWidth",
              "type": {
                "text": "undefined | number"
              },
              "description": "Sidebar default width as a percent of the workspace (default 26)."
            },
            {
              "name": "sidebar-min-width",
              "fieldName": "sidebarMinWidth",
              "type": {
                "text": "undefined | number"
              },
              "description": "Sidebar min width in px (default 240)."
            },
            {
              "name": "sidebar-max-width",
              "fieldName": "sidebarMaxWidth",
              "type": {
                "text": "undefined | number"
              },
              "description": "Sidebar max width in px (default 420)."
            },
            {
              "name": "sidebar-collapsed",
              "fieldName": "sidebarCollapsed",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Controlled collapsed state. Set this as a JS property (`el.sidebarCollapsed = true`) to drive the sidebar from your app, updating it in response to the `kai-sidebar-toggle` event. Omit for uncontrolled (the element manages it)."
            },
            {
              "name": "default-sidebar-collapsed",
              "fieldName": "defaultSidebarCollapsed",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Initial collapsed state when uncontrolled (default false). Use the `default-sidebar-collapsed` attribute to start collapsed in plain HTML."
            },
            {
              "name": "collapse-below",
              "fieldName": "collapseBelow",
              "type": {
                "text": "undefined | number"
              },
              "description": "Auto-collapse the rail when the workspace's own width drops below this many px, and re-expand when it grows back above. Uncontrolled only (it never fights an app-driven `sidebarCollapsed`); omit to disable. Fires `kai-sidebar-toggle`. Attribute: `collapse-below`."
            },
            {
              "name": "compact",
              "fieldName": "compact",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Render Recents as dense single-line rows (a leading dot + title, no count)."
            },
            {
              "name": "no-conversations",
              "fieldName": "noConversations",
              "type": {
                "text": "undefined | false | true"
              },
              "description": "Suppress the built-in ConversationList so the `sidebar-header` slot owns the whole rail flex region (for apps that supply their own rail nav). Default false. Attribute: `no-conversations`."
            }
          ],
          "events": [
            {
              "name": "kai-conversation-select",
              "type": {
                "text": "CustomEvent<{ id: string }>"
              },
              "description": "A conversation was selected in the sidebar."
            },
            {
              "name": "kai-message-action",
              "type": {
                "text": "CustomEvent<{ messageId: string; action: string; state?: undefined | \"on\" | \"off\" }>"
              },
              "description": "An action button on a message was clicked. `state` is present only for the toggleable feedback votes: `'on'` when a like/dislike is set, `'off'` when re-tapped to clear."
            },
            {
              "name": "kai-model-change",
              "type": {
                "text": "CustomEvent<{ modelId: string }>"
              },
              "description": "The header model switcher changed."
            },
            {
              "name": "kai-new-chat",
              "type": {
                "text": "CustomEvent<Record<string, never>>"
              },
              "description": "The \"New chat\" button was clicked."
            },
            {
              "name": "kai-search",
              "type": {
                "text": "CustomEvent<Record<string, never>>"
              },
              "description": "The Search button was clicked."
            },
            {
              "name": "kai-sidebar-toggle",
              "type": {
                "text": "CustomEvent<{ collapsed: false | true }>"
              },
              "description": "The sidebar was collapsed or expanded."
            },
            {
              "name": "kai-submit",
              "type": {
                "text": "CustomEvent<{ value: string; attachments: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }>"
              },
              "description": "User submitted a message."
            },
            {
              "name": "kai-suggestion-click",
              "type": {
                "text": "CustomEvent<{ value: string }>"
              },
              "description": "A suggestion chip was clicked (only in `suggestion-mode=\"fill\"`)."
            },
            {
              "name": "kai-value-change",
              "type": {
                "text": "CustomEvent<{ value: string }>"
              },
              "description": "Fired on every input change."
            },
            {
              "name": "kai-voice",
              "type": {
                "text": "CustomEvent<Record<string, never>>"
              },
              "description": "The Mic / voice button was clicked."
            }
          ],
          "cssProperties": [],
          "slots": [
            {
              "name": "sidebar-header",
              "description": "Top of the conversation rail (brand, a kai-tabs strip)."
            },
            {
              "name": "sidebar-footer",
              "description": "Bottom of the rail: an upgrade card, a Design trigger, a user-menu cluster."
            },
            {
              "name": "main-header",
              "description": "Top of the main region (a top-placed banner or a corner action)."
            },
            {
              "name": "main",
              "description": "Replace the built-in chat thread with your own main view (a home or dashboard screen). Omit to keep the thread."
            }
          ],
          "cssParts": [
            {
              "name": "sidebar",
              "description": "The conversation rail. Carries a subtle, theme-aware default background (bg-surface); override its background, border, or width from outside. `sidebar-min-width` sets its min px width and `collapse-below` auto-collapses it under a width.",
              "recipe": "kai-workspace::part(sidebar) { background: var(--color-card); border-right: 1px solid var(--color-border) }"
            }
          ]
        }
      ]
    }
  ]
}
