{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "inferencesh",
  "homepage": "https://ui.inference.sh",
  "items": [
    {
      "name": "agent",
      "type": "registry:block",
      "title": "Agent Chat",
      "description": "Full-featured AI agent chat with state management, tools, and widgets.",
      "dependencies": [
        "@inferencesh/sdk"
      ],
      "registryDependencies": [
        "button",
        "https://ui.inference.sh/r/chat.json",
        "https://ui.inference.sh/r/tools.json",
        "https://ui.inference.sh/r/widgets.json"
      ],
      "files": [
        {
          "path": "registry/blocks/agent/agent.tsx",
          "type": "registry:component",
          "target": "components/infsh/agent/agent.tsx"
        }
      ]
    },
    {
      "name": "chat",
      "type": "registry:block",
      "title": "Chat UI Primitives",
      "description": "Virtualized chat with measured markdown. Auto-scroll, message strategies, typing indicators.",
      "dependencies": [
        "@inferencesh/sdk"
      ],
      "registryDependencies": [
        "button",
        "collapsible",
        "scroll-area",
        "textarea",
        "tooltip",
        "spinner",
        "command",
        "popover",
        "https://ui.inference.sh/r/pretext-md.json",
        "https://ui.inference.sh/r/virtualize.json"
      ],
      "files": [
        {
          "path": "registry/blocks/chat/components/chat-container.tsx",
          "type": "registry:component",
          "target": "components/infsh/agent/chat-container.tsx"
        },
        {
          "path": "registry/blocks/chat/components/chat-input.tsx",
          "type": "registry:component",
          "target": "components/infsh/agent/chat-input.tsx"
        },
        {
          "path": "registry/blocks/chat/components/chat-messages.tsx",
          "type": "registry:component",
          "target": "components/infsh/agent/chat-messages.tsx"
        },
        {
          "path": "registry/blocks/chat/components/virtualized-chat-messages.tsx",
          "type": "registry:component",
          "target": "components/infsh/agent/virtualized-chat-messages.tsx"
        },
        {
          "path": "registry/blocks/chat/components/message.tsx",
          "type": "registry:component",
          "target": "components/infsh/agent/message.tsx"
        },
        {
          "path": "registry/blocks/chat/components/message-bubble.tsx",
          "type": "registry:component",
          "target": "components/infsh/agent/message-bubble.tsx"
        },
        {
          "path": "registry/blocks/chat/components/message-content.tsx",
          "type": "registry:component",
          "target": "components/infsh/agent/message-content.tsx"
        },
        {
          "path": "registry/blocks/chat/components/message-reasoning.tsx",
          "type": "registry:component",
          "target": "components/infsh/agent/message-reasoning.tsx"
        },
        {
          "path": "registry/blocks/chat/components/message-status-indicator.tsx",
          "type": "registry:component",
          "target": "components/infsh/agent/message-status-indicator.tsx"
        },
        {
          "path": "registry/blocks/chat/components/file-upload.tsx",
          "type": "registry:component",
          "target": "components/infsh/agent/file-upload.tsx"
        },
        {
          "path": "components/ui/collapsible-section.tsx",
          "type": "registry:lib",
          "target": "components/ui/collapsible-section.tsx"
        },
        {
          "path": "lib/message-strategy.ts",
          "type": "registry:lib",
          "target": "lib/message-strategy.ts"
        },
        {
          "path": "registry/blocks/chat/lib/use-auto-scroll.ts",
          "type": "registry:hook",
          "target": "hooks/use-auto-scroll.ts"
        },
        {
          "path": "hooks/use-shrinkwrap.ts",
          "type": "registry:hook",
          "target": "hooks/use-shrinkwrap.ts"
        },
        {
          "path": "hooks/use-chat-width.ts",
          "type": "registry:hook",
          "target": "hooks/use-chat-width.ts"
        }
      ]
    },
    {
      "name": "tools",
      "type": "registry:block",
      "title": "Tool Invocation UI",
      "description": "Displays tool lifecycle: pending, in-progress, approval, and results.",
      "registryDependencies": [
        "badge",
        "button",
        "card",
        "collapsible",
        "spinner",
        "https://ui.inference.sh/r/pretext-md.json",
        "https://ui.inference.sh/r/widgets.json",
        "https://ui.inference.sh/r/task.json"
      ],
      "files": [
        {
          "path": "registry/blocks/tools/tool-invocation.tsx",
          "type": "registry:component",
          "target": "components/infsh/agent/tool-invocation.tsx"
        },
        {
          "path": "registry/blocks/tools/tool-invocations.tsx",
          "type": "registry:component",
          "target": "components/infsh/agent/tool-invocations.tsx"
        },
        {
          "path": "registry/blocks/tools/integration-requirement-card.tsx",
          "type": "registry:component",
          "target": "components/infsh/agent/integration-requirement-card.tsx"
        }
      ]
    },
    {
      "name": "task",
      "type": "registry:block",
      "title": "Task",
      "description": "Real-time task display with streaming support, status indicators, and logs viewer.",
      "dependencies": [
        "@inferencesh/sdk"
      ],
      "registryDependencies": [
        "button",
        "card",
        "label",
        "tooltip",
        "spinner",
        "https://ui.inference.sh/r/pretext-md.json"
      ],
      "files": [
        {
          "path": "registry/blocks/task/task-output.tsx",
          "type": "registry:component",
          "target": "components/infsh/task/task-output.tsx"
        },
        {
          "path": "registry/blocks/task/task-output-wrapper.tsx",
          "type": "registry:component",
          "target": "components/infsh/task/task-output-wrapper.tsx"
        },
        {
          "path": "registry/blocks/task/task-status.tsx",
          "type": "registry:component",
          "target": "components/infsh/task/task-status.tsx"
        },
        {
          "path": "registry/blocks/task/task-logs.tsx",
          "type": "registry:component",
          "target": "components/infsh/task/task-logs.tsx"
        },
        {
          "path": "registry/blocks/task/output-fields.tsx",
          "type": "registry:component",
          "target": "components/infsh/task/output-fields.tsx"
        },
        {
          "path": "registry/blocks/task/file-preview.tsx",
          "type": "registry:component",
          "target": "components/infsh/task/file-preview.tsx"
        },
        {
          "path": "registry/blocks/task/time-since.tsx",
          "type": "registry:component",
          "target": "components/infsh/task/time-since.tsx"
        },
        {
          "path": "registry/blocks/task/use-task.ts",
          "type": "registry:hook",
          "target": "hooks/use-task.ts"
        },
        {
          "path": "registry/blocks/task/index.ts",
          "type": "registry:lib",
          "target": "components/infsh/task/index.ts"
        }
      ]
    },
    {
      "name": "widgets",
      "type": "registry:block",
      "title": "Widget Renderer",
      "description": "Renders declarative UI nodes (forms, buttons, cards) from agent tool outputs.",
      "registryDependencies": [
        "badge",
        "button",
        "card",
        "checkbox",
        "input",
        "label",
        "select",
        "textarea",
        "https://ui.inference.sh/r/pretext-md.json"
      ],
      "files": [
        {
          "path": "registry/blocks/widgets/widget-renderer.tsx",
          "type": "registry:component",
          "target": "components/infsh/agent/widget-renderer.tsx"
        },
        {
          "path": "registry/blocks/widgets/types.ts",
          "type": "registry:lib",
          "target": "components/infsh/agent/widget-types.ts"
        }
      ]
    },
    {
      "name": "pretext-md",
      "type": "registry:block",
      "title": "pretext-md",
      "description": "Measured markdown renderer powered by pretext. DOM-free text measurement, plugin architecture, virtualizable.",
      "dependencies": [
        "@chenglou/pretext",
        "unified",
        "remark-parse",
        "remark-gfm"
      ],
      "registryDependencies": [
        "https://ui.inference.sh/r/code-block.json",
        "https://ui.inference.sh/r/youtube-embed.json",
        "https://ui.inference.sh/r/zoomable-image.json"
      ],
      "files": [
        {
          "path": "lib/pretext-md/core/types.ts",
          "type": "registry:lib",
          "target": "lib/pretext-md/core/types.ts"
        },
        {
          "path": "lib/pretext-md/core/parser.ts",
          "type": "registry:lib",
          "target": "lib/pretext-md/core/parser.ts"
        },
        {
          "path": "lib/pretext-md/core/inline-layout.ts",
          "type": "registry:lib",
          "target": "lib/pretext-md/core/inline-layout.ts"
        },
        {
          "path": "lib/pretext-md/core/block-layout.ts",
          "type": "registry:lib",
          "target": "lib/pretext-md/core/block-layout.ts"
        },
        {
          "path": "lib/pretext-md/core/shrinkwrap.ts",
          "type": "registry:lib",
          "target": "lib/pretext-md/core/shrinkwrap.ts"
        },
        {
          "path": "lib/pretext-md/core/index.ts",
          "type": "registry:lib",
          "target": "lib/pretext-md/core/index.ts"
        },
        {
          "path": "lib/pretext-md/react/context.tsx",
          "type": "registry:lib",
          "target": "lib/pretext-md/react/context.tsx"
        },
        {
          "path": "lib/pretext-md/react/renderer.tsx",
          "type": "registry:lib",
          "target": "lib/pretext-md/react/renderer.tsx"
        },
        {
          "path": "lib/pretext-md/react/plugins.tsx",
          "type": "registry:lib",
          "target": "lib/pretext-md/react/plugins.tsx"
        },
        {
          "path": "lib/pretext-md/react/index.ts",
          "type": "registry:lib",
          "target": "lib/pretext-md/react/index.ts"
        }
      ]
    },
    {
      "name": "virtualize",
      "type": "registry:block",
      "title": "Virtualize",
      "description": "Typed virtualization with measurement strategies, incremental caching, and scroll correction.",
      "files": [
        {
          "path": "lib/virtualize/types.ts",
          "type": "registry:lib",
          "target": "lib/virtualize/types.ts"
        },
        {
          "path": "lib/virtualize/measure.ts",
          "type": "registry:lib",
          "target": "lib/virtualize/measure.ts"
        },
        {
          "path": "lib/virtualize/use-virtualized-list.ts",
          "type": "registry:lib",
          "target": "lib/virtualize/use-virtualized-list.ts"
        },
        {
          "path": "lib/virtualize/index.ts",
          "type": "registry:lib",
          "target": "lib/virtualize/index.ts"
        },
        {
          "path": "hooks/use-virtualize.ts",
          "type": "registry:hook",
          "target": "hooks/use-virtualize.ts"
        }
      ]
    },
    {
      "name": "markdown",
      "type": "registry:block",
      "title": "Markdown Renderer (legacy)",
      "description": "react-markdown based renderer. Consider using pretext-md instead.",
      "dependencies": [
        "react-markdown",
        "remark-gfm"
      ],
      "registryDependencies": [
        "https://ui.inference.sh/r/code-block.json",
        "https://ui.inference.sh/r/youtube-embed.json",
        "https://ui.inference.sh/r/zoomable-image.json"
      ],
      "files": [
        {
          "path": "registry/blocks/markdown/markdown-renderer.tsx",
          "type": "registry:component"
        },
        {
          "path": "registry/blocks/markdown/lib/helpers.ts",
          "type": "registry:lib",
          "target": "lib/markdown-helpers.ts"
        }
      ]
    },
    {
      "name": "code-block",
      "type": "registry:block",
      "title": "Code Block",
      "description": "Syntax-highlighted code block with line numbers and copy button.",
      "files": [
        {
          "path": "registry/blocks/code-block/code-block.tsx",
          "type": "registry:component",
          "target": "components/infsh/code-block/code-block.tsx"
        },
        {
          "path": "registry/blocks/code-block/index.ts",
          "type": "registry:lib",
          "target": "components/infsh/code-block/index.ts"
        },
        {
          "path": "registry/blocks/code-block/lib/types.ts",
          "type": "registry:lib",
          "target": "components/infsh/code-block/types.ts"
        },
        {
          "path": "registry/blocks/code-block/lib/languages.ts",
          "type": "registry:lib",
          "target": "components/infsh/code-block/languages.ts"
        },
        {
          "path": "registry/blocks/code-block/lib/tokenizer.ts",
          "type": "registry:lib",
          "target": "components/infsh/code-block/tokenizer.ts"
        },
        {
          "path": "registry/blocks/code-block/lib/styles.ts",
          "type": "registry:lib",
          "target": "components/infsh/code-block/styles.ts"
        },
        {
          "path": "registry/blocks/code-block/lib/utils.ts",
          "type": "registry:lib",
          "target": "components/infsh/code-block/utils.ts"
        }
      ]
    },
    {
      "name": "youtube-embed",
      "type": "registry:block",
      "title": "YouTube Embed",
      "description": "Responsive YouTube video embed with loading state.",
      "files": [
        {
          "path": "registry/blocks/youtube-embed/youtube-embed.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "zoomable-image",
      "type": "registry:block",
      "title": "Zoomable Image",
      "description": "Click-to-zoom image component with medium.com-style lightbox.",
      "dependencies": [
        "react-medium-image-zoom"
      ],
      "files": [
        {
          "path": "registry/blocks/zoomable-image/zoomable-image.tsx",
          "type": "registry:component"
        },
        {
          "path": "registry/blocks/zoomable-image/zoomable-image.css",
          "type": "registry:style"
        }
      ]
    },
    {
      "name": "steps",
      "type": "registry:block",
      "title": "Steps",
      "description": "Numbered step component with connecting line for sequential instructions.",
      "files": [
        {
          "path": "registry/blocks/steps/steps.tsx",
          "type": "registry:component"
        },
        {
          "path": "registry/blocks/steps/index.ts",
          "type": "registry:lib",
          "target": "lib/steps.ts"
        }
      ]
    },
    {
      "name": "sidebar-light",
      "type": "registry:block",
      "title": "Sidebar Light",
      "description": "Lightweight sidebar navigation with nested items and active state.",
      "files": [
        {
          "path": "registry/blocks/sidebar-light/sidebar-light.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "table-of-contents",
      "type": "registry:block",
      "title": "Table of Contents",
      "description": "Auto-scrolling table of contents with intersection observer for active section.",
      "files": [
        {
          "path": "registry/blocks/table-of-contents/table-of-contents.tsx",
          "type": "registry:component"
        }
      ]
    }
  ]
}
