{ "$schema": "https://ui.shadcn.com/schema/registry.json", "name": "flow-state-ui", "homepage": "https://flow-state.dev/ui", "items": [ { "name": "conversation", "title": "Conversation", "type": "registry:component", "description": "Container for message threads with auto-scroll and session binding.", "dependencies": ["use-stick-to-bottom", "lucide-react"], "registryDependencies": ["button"], "files": [{ "type": "registry:component", "path": "registry/components/conversation.tsx", "target": "components/flow-state/conversation.tsx" }], "categories": ["ai", "chat"] }, { "name": "message", "title": "Message", "type": "registry:component", "description": "Individual message display with streaming markdown support.", "dependencies": ["@flow-state-dev/core", "streamdown", "@streamdown/cjk", "@streamdown/code", "@streamdown/math", "@streamdown/mermaid", "lucide-react"], "registryDependencies": ["button", "button-group", "tooltip"], "files": [{ "type": "registry:component", "path": "registry/components/message.tsx", "target": "components/flow-state/message.tsx" }], "categories": ["ai", "chat"] }, { "name": "reasoning", "title": "Reasoning", "type": "registry:component", "description": "Expandable reasoning/thinking display with streaming awareness.", "dependencies": ["@flow-state-dev/core", "@radix-ui/react-use-controllable-state", "lucide-react", "streamdown", "@streamdown/cjk", "@streamdown/code", "@streamdown/math", "@streamdown/mermaid"], "registryDependencies": ["collapsible", "shimmer"], "files": [{ "type": "registry:component", "path": "registry/components/reasoning.tsx", "target": "components/flow-state/reasoning.tsx" }], "categories": ["ai"] }, { "name": "tool", "title": "Tool", "type": "registry:component", "description": "Rich tool invocation display with args, result, status, and Claude-Code-style grouping for consecutive calls.", "dependencies": ["@flow-state-dev/core", "lucide-react"], "registryDependencies": ["collapsible", "badge", "code-block"], "files": [ { "type": "registry:component", "path": "registry/components/tool.tsx", "target": "components/flow-state/tool.tsx" }, { "type": "registry:lib", "path": "registry/components/tool-grouping.ts", "target": "components/flow-state/tool-grouping.ts" } ], "categories": ["ai", "tools"] }, { "name": "code-block", "title": "Code Block", "type": "registry:component", "description": "Syntax-highlighted code with copy action and dual-theme support.", "dependencies": ["shiki", "lucide-react"], "registryDependencies": ["button", "select"], "files": [{ "type": "registry:component", "path": "registry/components/code-block.tsx", "target": "components/flow-state/code-block.tsx" }], "categories": ["ai", "code"] }, { "name": "prompt-input", "title": "Prompt Input", "type": "registry:component", "description": "Smart input with auto-resize, file upload, and submit handling.", "dependencies": ["lucide-react", "nanoid"], "registryDependencies": ["button", "command", "dropdown-menu", "hover-card", "input-group", "select", "spinner", "tooltip"], "files": [{ "type": "registry:component", "path": "registry/components/prompt-input.tsx", "target": "components/flow-state/prompt-input.tsx" }], "categories": ["ai", "chat"] }, { "name": "sources", "title": "Sources", "type": "registry:component", "description": "Citation and source display with collapsible list and favicons.", "dependencies": ["@flow-state-dev/core", "lucide-react"], "registryDependencies": ["collapsible"], "files": [{ "type": "registry:component", "path": "registry/components/sources.tsx", "target": "components/flow-state/sources.tsx" }], "categories": ["ai"] }, { "name": "suggestion", "title": "Suggestion", "type": "registry:component", "description": "Horizontal scrollable suggestion pills.", "dependencies": [], "registryDependencies": ["scroll-area"], "files": [{ "type": "registry:component", "path": "registry/components/suggestion.tsx", "target": "components/flow-state/suggestion.tsx" }], "categories": ["ai", "chat"] }, { "name": "shimmer", "title": "Shimmer", "type": "registry:component", "description": "Animated text shimmer for streaming/loading states.", "dependencies": ["motion"], "registryDependencies": [], "files": [{ "type": "registry:component", "path": "registry/components/shimmer.tsx", "target": "components/flow-state/shimmer.tsx" }], "categories": ["ai"] }, { "name": "status", "title": "Status", "type": "registry:component", "description": "Status message display with shimmer animation for in-progress states.", "dependencies": ["@flow-state-dev/core"], "registryDependencies": ["shimmer"], "files": [{ "type": "registry:component", "path": "registry/components/status.tsx", "target": "components/flow-state/status.tsx" }], "categories": ["ai", "framework"] }, { "name": "error", "title": "Error", "type": "registry:component", "description": "Error and step-error display with recoverable/fatal distinction.", "dependencies": ["@flow-state-dev/core", "lucide-react"], "registryDependencies": [], "files": [{ "type": "registry:component", "path": "registry/components/error.tsx", "target": "components/flow-state/error.tsx" }], "categories": ["ai", "framework"] }, { "name": "task-plan", "title": "Task Plan", "type": "registry:component", "description": "Section-grouped renderer for any TaskCollection. Subscribes to task-change and task-board-meta component items emitted by the unified Plan/Task substrate.", "dependencies": ["@flow-state-dev/core", "lucide-react"], "registryDependencies": [], "files": [ { "type": "registry:component", "path": "registry/components/task-plan.tsx", "target": "components/flow-state/task-plan.tsx" }, { "type": "registry:lib", "path": "registry/components/task-plan-state.ts", "target": "components/flow-state/task-plan-state.ts" } ], "categories": ["ai", "patterns"] }, { "name": "audit-annotation", "title": "Audit Annotation", "type": "registry:component", "description": "Renders response-auditor findings as a compact card with severity indicators, per-analyzer scores, and evidence. Fed by the audit-annotation component item the responseAuditor pattern emits.", "dependencies": ["@flow-state-dev/core", "lucide-react"], "registryDependencies": [], "files": [{ "type": "registry:component", "path": "registry/components/audit-annotation.tsx", "target": "components/flow-state/audit-annotation.tsx" }], "categories": ["ai", "framework"] }, { "name": "model-badge", "title": "Model Badge", "type": "registry:component", "description": "Small pill showing the model that actually answered (ModelIdentity). Hover reveals the requested string and gateway; renders nothing when the field is absent.", "dependencies": ["@flow-state-dev/core"], "registryDependencies": [], "files": [{ "type": "registry:component", "path": "registry/components/model-badge.tsx", "target": "components/flow-state/model-badge.tsx" }], "categories": ["ai", "framework"] }, { "name": "approval", "title": "Approval", "type": "registry:component", "description": "Human-in-the-loop approval card for suspension items. Green Approve / red Reject while pending; collapses to a receipt once resolved. Logic comes from the useApproval hook in @flow-state-dev/react.", "dependencies": ["@flow-state-dev/core", "@flow-state-dev/react", "lucide-react"], "registryDependencies": ["session-items-context"], "files": [{ "type": "registry:component", "path": "registry/components/approval.tsx", "target": "components/flow-state/approval.tsx" }], "categories": ["ai", "framework"] }, { "name": "chat-assistant", "title": "Chat Assistant Renderers", "type": "registry:component", "description": "Pre-wired RendererRegistry mapping all Flow State item types to their default components.", "dependencies": ["@flow-state-dev/react"], "registryDependencies": ["message", "reasoning", "tool", "status", "error", "approval", "audit-annotation"], "files": [{ "type": "registry:component", "path": "registry/components/chat-assistant.tsx", "target": "components/flow-state/chat-assistant.tsx" }], "categories": ["ai", "framework"] }, { "name": "streaming-indicator", "title": "Streaming Indicator", "type": "registry:component", "description": "Thinking indicator shown while streaming before assistant content arrives.", "dependencies": ["lucide-react"], "registryDependencies": ["shimmer"], "files": [{ "type": "registry:component", "path": "registry/components/streaming-indicator.tsx", "target": "components/flow-state/streaming-indicator.tsx" }], "categories": ["ai", "chat"] }, { "name": "request-group", "title": "Request Group", "type": "registry:component", "description": "Groups items by request ID with streaming indicator, source display, and collapsible tool-call summaries for consecutive calls.", "dependencies": ["@flow-state-dev/core", "@flow-state-dev/react"], "registryDependencies": ["sources", "streaming-indicator", "tool"], "files": [{ "type": "registry:component", "path": "registry/components/request-group.tsx", "target": "components/flow-state/request-group.tsx" }], "categories": ["ai", "chat"] }, { "name": "session-items-context", "title": "Session Items Context", "type": "registry:component", "description": "React context for passing session items to nested components like plan task correlation.", "dependencies": ["@flow-state-dev/core"], "registryDependencies": [], "files": [{ "type": "registry:component", "path": "registry/components/session-items-context.tsx", "target": "components/flow-state/session-items-context.tsx" }], "categories": ["ai", "framework"] }, { "name": "artifact", "title": "Artifact", "type": "registry:component", "description": "Composable artifact viewer shell with header, actions, and content areas.", "dependencies": ["lucide-react"], "registryDependencies": ["button", "tooltip"], "files": [{ "type": "registry:component", "path": "registry/components/artifact.tsx", "target": "components/flow-state/artifact.tsx" }], "categories": ["ai", "framework"] }, { "name": "file-tree", "title": "File Tree", "type": "registry:component", "description": "Tree-structured file and folder display with expand/collapse and selection.", "dependencies": ["lucide-react"], "registryDependencies": ["collapsible"], "files": [{ "type": "registry:component", "path": "registry/components/file-tree.tsx", "target": "components/flow-state/file-tree.tsx" }], "categories": ["ai", "code"] }, { "name": "jsx-preview", "title": "JSX Preview", "type": "registry:component", "description": "Live JSX/TSX renderer with streaming support and error fallback.", "dependencies": ["react-jsx-parser", "lucide-react"], "registryDependencies": [], "files": [{ "type": "registry:component", "path": "registry/components/jsx-preview.tsx", "target": "components/flow-state/jsx-preview.tsx" }], "categories": ["ai", "code"] }, { "name": "sandbox", "title": "Sandbox", "type": "registry:component", "description": "Source/preview tab wrapper for JSX artifacts using JSXPreview and CodeBlock.", "dependencies": ["lucide-react"], "registryDependencies": ["jsx-preview", "code-block"], "files": [{ "type": "registry:component", "path": "registry/components/sandbox.tsx", "target": "components/flow-state/sandbox.tsx" }], "categories": ["ai", "code"] }, { "name": "info-card", "title": "Info Card", "type": "registry:component", "description": "Generative-UI info card: title, optional image, fact rows. Pairs with the emitInfoCard tool from @flow-state-dev/ui/generative.", "dependencies": ["@flow-state-dev/core"], "registryDependencies": [], "files": [{ "type": "registry:component", "path": "registry/components/generative/info-card.tsx", "target": "components/flow-state/generative/info-card.tsx" }], "categories": ["ai", "generative"] }, { "name": "link-card", "title": "Link Card", "type": "registry:component", "description": "Generative-UI link card: rich preview for an external URL. Pairs with the emitLinkCard tool from @flow-state-dev/ui/generative.", "dependencies": ["@flow-state-dev/core"], "registryDependencies": [], "files": [{ "type": "registry:component", "path": "registry/components/generative/link-card.tsx", "target": "components/flow-state/generative/link-card.tsx" }], "categories": ["ai", "generative"] } ] }