{"_id":"@booga/vchat","_rev":"5-792d0c4c82d0c65852432352ab983997","name":"@booga/vchat","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"@booga/vchat","version":"0.1.0","author":{"name":"bvasilenko"},"license":"MIT","_id":"@booga/vchat@0.1.0","maintainers":[{"name":"dreaktor","email":"me@dreaktor.com"}],"dist":{"shasum":"a1eeb58729631d0d963e79900975476d8c862495","tarball":"https://registry.npmjs.org/@booga/vchat/-/vchat-0.1.0.tgz","fileCount":10,"integrity":"sha512-EusB90GnjiD1TBxqbWUnxmNRzbNcfMZIrRfYUKX32fjttaCsUR/P8YbnQULaIyIxwwba9dBW14CFXcxw9tey/g==","signatures":[{"sig":"MEYCIQDJwykg2Y+PkwWaEHh7MGM3NNo+FrRq3s1ikjAIUcFvHAIhAIdKW4d1pB4ikAFhWVw1RwGl20HjakkVhNb9GKmxoGrH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143591},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"2096bdf1a9399f0e50edc841c77c14fb0f333499","scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest run --coverage","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"dreaktor","email":"me@dreaktor.com"},"_npmVersion":"10.9.3","description":"Chat UI over any OpenAI-compatible endpoint. Provider abstraction, streaming deltas, tool-call dispatch, accessible components.","directories":{},"sideEffects":false,"_nodeVersion":"22.19.0","dependencies":{"zod":"^3.0.0","@booga/vui":"^0.1.0","@booga/vforms":"^0.1.0","@booga/vhooks":"^0.1.0","zod-to-json-schema":"^3.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","jsdom":"^25.0.0","react":"^18.0.0","eslint":"^9.0.0","vitest":"^3.0.0","globals":"^15.0.0","react-dom":"^18.0.0","@eslint/js":"^9.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/react":"^18.3.0","@types/react-dom":"^18.3.0","typescript-eslint":"^8.0.0","@vitejs/plugin-react":"^4.0.0","@testing-library/react":"^16.0.0","@testing-library/jest-dom":"^6.0.0","@vitest/coverage-istanbul":"^3.0.0","@testing-library/user-event":"^14.0.0"},"peerDependencies":{"react":"^18.0.0","react-dom":"^18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/vchat_0.1.0_1779045572259_0.293628027954","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@booga/vchat","version":"0.2.0","author":{"name":"bvasilenko"},"license":"MIT","_id":"@booga/vchat@0.2.0","maintainers":[{"name":"dreaktor","email":"me@dreaktor.com"}],"dist":{"shasum":"87bed9c9916cec7d8e18a5a6a9c549529b71a7e8","tarball":"https://registry.npmjs.org/@booga/vchat/-/vchat-0.2.0.tgz","fileCount":10,"integrity":"sha512-upEvQkuLE2C1LkiiTncFftKJGoqehlp2MOm3Ujad19ha/ctN3Q/woBAK0HPzTdKqGkWQfbOQnbs8b6cThlIVUw==","signatures":[{"sig":"MEQCICDo3BcdmasND+Hc9BSUk0XoouRhQHTZB/6nl1OaZhO3AiB+j+BYMzzyzKp5kuIhRG6g/sslHkERm7131OU1M2Q3/Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143923},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"1e0b5b9dde25ca0d88ad0d9f78bed402cce69571","scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest run --coverage","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"dreaktor","email":"me@dreaktor.com"},"_npmVersion":"10.9.3","description":"Chat UI over any OpenAI-compatible endpoint. Provider abstraction, streaming deltas, tool-call dispatch, accessible components.","directories":{},"sideEffects":false,"_nodeVersion":"22.19.0","dependencies":{"zod":"^3.0.0","@booga/vui":"^0.2.0","@booga/vforms":"^0.2.0","@booga/vhooks":"^0.1.0","zod-to-json-schema":"^3.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","jsdom":"^25.0.0","react":"^18.0.0","eslint":"^9.0.0","vitest":"^3.0.0","globals":"^15.0.0","react-dom":"^18.0.0","@eslint/js":"^9.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/react":"^18.3.0","@types/react-dom":"^18.3.0","typescript-eslint":"^8.0.0","@vitejs/plugin-react":"^4.0.0","@testing-library/react":"^16.0.0","@testing-library/jest-dom":"^6.0.0","@vitest/coverage-istanbul":"^3.0.0","@testing-library/user-event":"^14.0.0"},"peerDependencies":{"react":"^18.0.0","react-dom":"^18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/vchat_0.2.0_1779054075635_0.7966768974929164","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@booga/vchat","version":"0.2.1","author":{"name":"bvasilenko"},"license":"MIT","_id":"@booga/vchat@0.2.1","maintainers":[{"name":"dreaktor","email":"me@dreaktor.com"}],"dist":{"shasum":"63c099e48c613bc0902a3cc5de54d9e5d71b9228","tarball":"https://registry.npmjs.org/@booga/vchat/-/vchat-0.2.1.tgz","fileCount":10,"integrity":"sha512-6NRTzNC+wr5n91D6CBrdY7LgE/jvNDy6piUk6tq6BCtTfUTOb/7uTOGQkTAqlOVcoljrDMLl85p/+GWSIYfTaQ==","signatures":[{"sig":"MEYCIQDPPQByLyUC8HHYkRd+EkmIFZQbHRcoSCnDKQ1olQm2DwIhAJISTxdo59ClfU/stEuMrSYc+Gi4mZr7tMsigCZHE51j","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":150035},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"bfa7036174006c8534e77116891d137e8d3e9f31","scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest run --coverage","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"dreaktor","email":"me@dreaktor.com"},"_npmVersion":"10.9.3","description":"Chat UI over any OpenAI-compatible endpoint. Provider abstraction, streaming deltas, tool-call dispatch, accessible components.","directories":{},"sideEffects":false,"_nodeVersion":"22.19.0","dependencies":{"zod":"^3.0.0","clsx":"^2.0.0","@booga/vui":"^0.2.0","@booga/vforms":"^0.2.0","@booga/vhooks":"^0.1.0","tailwind-merge":"^2.0.0","zod-to-json-schema":"^3.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","jsdom":"^25.0.0","react":"^18.0.0","eslint":"^9.0.0","vitest":"^3.0.0","globals":"^15.0.0","react-dom":"^18.0.0","@eslint/js":"^9.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/react":"^18.3.0","@types/react-dom":"^18.3.0","typescript-eslint":"^8.0.0","@vitejs/plugin-react":"^4.0.0","@testing-library/react":"^16.0.0","@testing-library/jest-dom":"^6.0.0","@vitest/coverage-istanbul":"^3.0.0","@testing-library/user-event":"^14.0.0"},"peerDependencies":{"react":"^18.0.0","react-dom":"^18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/vchat_0.2.1_1779101888915_0.21532415416356887","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@booga/vchat","version":"0.2.2","author":{"name":"bvasilenko"},"license":"MIT","_id":"@booga/vchat@0.2.2","maintainers":[{"name":"dreaktor","email":"me@dreaktor.com"}],"dist":{"shasum":"2ce4ca412223351f81f7a377face962e53523977","tarball":"https://registry.npmjs.org/@booga/vchat/-/vchat-0.2.2.tgz","fileCount":10,"integrity":"sha512-fJfwBj29wBQV8tHAw1ArPEeqDP+KGMiuwP0QVOk+X8BnyGvbC2vxkj6XzEKEXfX0p3dN0nQH0Xe6EEC4MEehiw==","signatures":[{"sig":"MEYCIQDZDAz7hzt3TAg5PAW22/F00de6N3QwrWDeEm3nCL5GMAIhAPET2No4Czvwc9NkD6Nm2Id2wmgO/iWnSUr5c42H9H+j","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":151370},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"bd8a3b7ab2db23d05b72ecda51b63aba9389c511","scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest run --coverage","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"dreaktor","email":"me@dreaktor.com"},"_npmVersion":"10.9.3","description":"Chat UI over any OpenAI-compatible endpoint. Provider abstraction, streaming deltas, tool-call dispatch, accessible components.","directories":{},"sideEffects":false,"_nodeVersion":"22.19.0","dependencies":{"zod":"^3.0.0","clsx":"^2.0.0","@booga/vui":"^0.2.0","@booga/vforms":"^0.2.0","@booga/vhooks":"^0.1.0","tailwind-merge":"^2.0.0","zod-to-json-schema":"^3.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","jsdom":"^25.0.0","react":"^18.0.0","eslint":"^9.0.0","vitest":"^3.0.0","globals":"^15.0.0","react-dom":"^18.0.0","@eslint/js":"^9.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/react":"^18.3.0","@types/react-dom":"^18.3.0","typescript-eslint":"^8.0.0","@vitejs/plugin-react":"^4.0.0","@testing-library/react":"^16.0.0","@testing-library/jest-dom":"^6.0.0","@vitest/coverage-istanbul":"^3.0.0","@testing-library/user-event":"^14.0.0"},"peerDependencies":{"react":"^18.0.0","react-dom":"^18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/vchat_0.2.2_1779102544373_0.14545693715266417","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@booga/vchat","version":"0.3.0","description":"Chat UI over any OpenAI-compatible endpoint. Provider abstraction, streaming deltas, tool-call dispatch, accessible components.","type":"module","sideEffects":false,"main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"tsup --watch","build":"tsup && npm run build:css","typecheck":"tsc --noEmit","lint":"eslint .","test":"vitest run --coverage","test:watch":"vitest","build:css":"tailwindcss -i ./styles-entry.css -c ./tailwind.config.js -o ./dist/styles.css --minify"},"dependencies":{"@booga/vforms":"^0.3.0","@booga/vhooks":"^0.1.0","@booga/vui":"^0.3.0","zod":"^3.0.0","zod-to-json-schema":"^3.0.0","clsx":"^2.0.0","tailwind-merge":"^2.0.0"},"peerDependencies":{"react":"^18.0.0","react-dom":"^18.0.0"},"devDependencies":{"@eslint/js":"^9.0.0","@testing-library/jest-dom":"^6.0.0","@testing-library/react":"^16.0.0","@testing-library/user-event":"^14.0.0","@types/node":"^20.0.0","@types/react":"^18.3.0","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.0.0","@vitest/coverage-istanbul":"^3.0.0","eslint":"^9.0.0","globals":"^15.0.0","jsdom":"^25.0.0","react":"^18.0.0","react-dom":"^18.0.0","tsup":"^8.0.0","typescript":"^5.0.0","typescript-eslint":"^8.0.0","vitest":"^3.0.0","tailwindcss":"^3.4.0","@booga/vtheme":"^0.2.1"},"publishConfig":{"access":"public"},"license":"MIT","author":{"name":"bvasilenko"},"_id":"@booga/vchat@0.3.0","gitHead":"ef7a2b81d9369859f0515bf01e2710ec6cb06497","_nodeVersion":"22.19.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-cAFq3Yw+EeocH4SNvNfdexOfODasnJ96w/B9kmyIQwBnaPW4nAjWz0BHEXGpKJxyrFunX5Sx8C8mvfveUY1xhA==","shasum":"db470ef9e7e3580dbf1f2bf0545937265e90c6f7","tarball":"https://registry.npmjs.org/@booga/vchat/-/vchat-0.3.0.tgz","fileCount":11,"unpackedSize":169287,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCyQ0sIv9Yr7Ep7F8HqEA0fmwDJPx9fh3M+1sa4cIP1yAIgT98IOpWziLpPHo/N94baha14KqfeFKnu/vWtpHuScpg="}]},"_npmUser":{"name":"dreaktor","email":"me@dreaktor.com"},"directories":{},"maintainers":[{"name":"dreaktor","email":"me@dreaktor.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/vchat_0.3.0_1779108768751_0.9949975035176262"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-17T19:19:32.174Z","modified":"2026-05-18T12:52:49.014Z","0.1.0":"2026-05-17T19:19:32.409Z","0.2.0":"2026-05-17T21:41:15.802Z","0.2.1":"2026-05-18T10:58:09.054Z","0.2.2":"2026-05-18T11:09:04.553Z","0.3.0":"2026-05-18T12:52:48.875Z"},"author":{"name":"bvasilenko"},"license":"MIT","description":"Chat UI over any OpenAI-compatible endpoint. Provider abstraction, streaming deltas, tool-call dispatch, accessible components.","maintainers":[{"name":"dreaktor","email":"me@dreaktor.com"}],"readme":"# vChat\n\nChat UI layer. Provider-agnostic: plug in any OpenAI-compatible endpoint. Streaming deltas render in-place. Tool calls dispatch, validate with Zod, feed results back. Accessible by default — aria-live, role=log, labelled inputs.\n\n## Install\n\n```sh\nbun add @booga/vchat\n```\n\n## Usage\n\n```tsx\nimport { Chat, OpenAICompatibleProvider } from \"@booga/vchat\";\n\nconst provider = new OpenAICompatibleProvider({\n  baseUrl: \"https://api.openai.com/v1\",\n  apiKey: process.env.OPENAI_KEY,\n  model: \"gpt-4o\",\n});\n\nexport default function App() {\n  return <Chat provider={provider} system=\"You are helpful.\" />;\n}\n```\n\n## Composable parts\n\n```tsx\nimport { useChat, ChatMessages, ChatInput, ModelSelector } from \"@booga/vchat\";\n\nconst { messages, send, abort, status } = useChat({ provider, tools, system });\n```\n\n## Tool calls\n\n```tsx\nimport { z } from \"zod\";\nimport type { Tool } from \"@booga/vchat\";\n\nconst weatherTool: Tool = {\n  name: \"get_weather\",\n  description: \"Current temperature for a location.\",\n  schema: z.object({ location: z.string() }),\n  execute: async ({ location }) => fetchWeather(location),\n};\n\n<Chat provider={provider} tools={[weatherTool]} />\n```\n\n## Persistence\n\n```tsx\n<Chat provider={provider} persist persistId=\"my-chat\" />\n```\n\nHistory stored in `localStorage`, restored on mount.\n\n## Provider interface\n\n```ts\ninterface Provider {\n  chatStream(request: ChatRequest): AsyncIterable<ChatDelta>;\n}\n```\n\nImplement this interface to connect any backend — OpenAI-compatible, Ollama, local proxy, mock.\n\n## Code of conduct\n\nContributor Covenant 2.1 — https://www.contributor-covenant.org/version/2/1/code_of_conduct/\n\n## License\n\nMIT © 2026 bvasilenko\n","readmeFilename":"README.md"}