{"_id":"@bernierllc/admin-agent-chat-ui","_rev":"4-a3aefc9b8dcd3d3a89ee3703dbda2489","name":"@bernierllc/admin-agent-chat-ui","dist-tags":{"latest":"0.1.2"},"versions":{"0.0.1":{"name":"@bernierllc/admin-agent-chat-ui","version":"0.0.1","keywords":["oidc","trusted-publishing","setup"],"_id":"@bernierllc/admin-agent-chat-ui@0.0.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"9f91a08b7d2550781220b464de2e58317c69b344","tarball":"https://registry.npmjs.org/@bernierllc/admin-agent-chat-ui/-/admin-agent-chat-ui-0.0.1.tgz","fileCount":2,"integrity":"sha512-ko47I6HkIseialEsDUy4JnMgTKKOZRe7webQgjGDlwfVWKMjXPKMs5nNhitqFHTVPzbdDwqa3AjL18X7LcfHHw==","signatures":[{"sig":"MEUCIQC8GoPCr6llrfexuAKLTli8mxGK2Qpm6xz/uuZBuv2MQgIgRn5VOFCVs2OBPwX/C9D+vbxf6jU53oIInDk8x0K2PdA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2087},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_npmVersion":"11.12.1","description":"OIDC trusted publishing setup package for @bernierllc/admin-agent-chat-ui","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/admin-agent-chat-ui_0.0.1_1781984262697_0.026485591923015583","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@bernierllc/admin-agent-chat-ui","version":"0.1.0","keywords":["admin","agent","chat","ui","react","components","sse","typescript"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/admin-agent-chat-ui@0.1.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"57c9253df292fb2ffe75dc1608a23e1b3e41f9f3","tarball":"https://registry.npmjs.org/@bernierllc/admin-agent-chat-ui/-/admin-agent-chat-ui-0.1.0.tgz","fileCount":71,"integrity":"sha512-+H8XQPZEoSpO7i4bcT/Vgfj3zhKm0buD+ovuME+qnSOPSE2IOMu1+tyszxEzOi8unVzkZP6/UK9EwfsMHi5J9Q==","signatures":[{"sig":"MEUCICwRdWuYNZ7Et6Z55KkyTXA4X0FxUgdrrVpQ/4pbMd5hAiEA/qk9WcP30mvGLAOFkl9MkTFPUfDOXVEpeXCkF9VfV5c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88174},"main":"dist/index.js","_from":"file:bernierllc-admin-agent-chat-ui-0.1.0.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"echo 'Tests skipped for initial publish'","build":"tsc","clean":"rm -rf dist","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bbd2cab4-9bef-4e3a-9a5d-105c2fae5035"}},"_resolved":"/home/runner/work/tools/tools/packages/ui/admin-agent-chat-ui/bernierllc-admin-agent-chat-ui-0.1.0.tgz","_integrity":"sha512-+H8XQPZEoSpO7i4bcT/Vgfj3zhKm0buD+ovuME+qnSOPSE2IOMu1+tyszxEzOi8unVzkZP6/UK9EwfsMHi5J9Q==","bernierllc":{"runtime":"browser","category":"ui","integration":{"logger":"not-applicable","neverhub":"not-applicable","neveradmin":"optional"}},"_npmVersion":"11.17.0","description":"React chat UI for the admin agent: provider, trigger, panel, message list, tool-result and change-summary cards, and the useAdminAgentChat SSE hook.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"@bernierllc/agent-changeset":"0.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","react":"^18.0.0","eslint":"^8.45.0","ts-jest":"^29.1.0","react-dom":"^18.0.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0","@testing-library/react":"^13.4.0","jest-environment-jsdom":"^29.5.0","@testing-library/jest-dom":"^5.16.0","@typescript-eslint/parser":"^6.0.0","@testing-library/user-event":"^14.4.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"react":">=16.8.0","react-dom":">=16.8.0"},"_npmOperationalInternal":{"tmp":"tmp/admin-agent-chat-ui_0.1.0_1781985992266_0.991464538089267","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@bernierllc/admin-agent-chat-ui","version":"0.1.1","keywords":["admin","agent","chat","ui","react","components","sse","typescript"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/admin-agent-chat-ui@0.1.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"78341b45f59d9951d474dc6d4c3f73d484bad725","tarball":"https://registry.npmjs.org/@bernierllc/admin-agent-chat-ui/-/admin-agent-chat-ui-0.1.1.tgz","fileCount":71,"integrity":"sha512-GEUGYnjhdqABCjIUaUwiLJFX3Ni9TiHhBNInnGC32OHSCPE4p5wLiBwVfKYue9wVwUR3ZEuD7qEOcfsSAooMkA==","signatures":[{"sig":"MEQCIFbuSKraLZWlQ/cSTWcCCYOt3pENFaB2XTIHHCBXk0W+AiAf9xVOkC91pVxz2MvOG/JpYEOH0lL2XTNW7q3AnWij4g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88174},"main":"dist/index.js","_from":"file:bernierllc-admin-agent-chat-ui-0.1.1.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"echo 'Tests skipped for initial publish'","build":"tsc","clean":"rm -rf dist","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bbd2cab4-9bef-4e3a-9a5d-105c2fae5035"}},"_resolved":"/home/runner/work/tools/tools/packages/ui/admin-agent-chat-ui/bernierllc-admin-agent-chat-ui-0.1.1.tgz","_integrity":"sha512-GEUGYnjhdqABCjIUaUwiLJFX3Ni9TiHhBNInnGC32OHSCPE4p5wLiBwVfKYue9wVwUR3ZEuD7qEOcfsSAooMkA==","bernierllc":{"runtime":"browser","category":"ui","integration":{"logger":"not-applicable","neverhub":"not-applicable","neveradmin":"optional"}},"_npmVersion":"12.0.1","description":"React chat UI for the admin agent: provider, trigger, panel, message list, tool-result and change-summary cards, and the useAdminAgentChat SSE hook.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@bernierllc/agent-changeset":"0.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","react":"^18.0.0","eslint":"^8.45.0","ts-jest":"^29.1.0","react-dom":"^18.0.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0","@testing-library/react":"^13.4.0","jest-environment-jsdom":"^29.5.0","@testing-library/jest-dom":"^5.16.0","@typescript-eslint/parser":"^6.0.0","@testing-library/user-event":"^14.4.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"react":">=16.8.0","react-dom":">=16.8.0"},"_npmOperationalInternal":{"tmp":"tmp/admin-agent-chat-ui_0.1.1_1784016123742_0.26076038710501703","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"_id":"@bernierllc/admin-agent-chat-ui@0.1.2","dist":{"shasum":"e91d66932736a13ab4c306555aea0d962f8b091a","tarball":"https://registry.npmjs.org/@bernierllc/admin-agent-chat-ui/-/admin-agent-chat-ui-0.1.2.tgz","fileCount":71,"integrity":"sha512-BRKXvV2lqL+SSGCYrQ5nVHnnzv9l2kqzqKkax56U+uv7V7BfRXxD+voLw+wWfQmdM6gAUDCkXxsfFFIoZpi1Vg==","signatures":[{"sig":"MEYCIQD74hVsekHQKQXcilh+65Am+h58MvjOlQu4TdCgsVZ+5gIhANUFgU+Eb+4gm3mNMX3OmgTJmveitfAKQzV13steXUDO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGW4vzmygCmGQ+Syu3sCqth4XoLZRrjs9qVxeKrkvanyAiEA5XVCEm6aVJlkvrVCsQtK/OjlsCBbrpwaZj0qcX2qmbY="}],"unpackedSize":88175},"main":"dist/index.js","name":"@bernierllc/admin-agent-chat-ui","_from":"file:bernierllc-admin-agent-chat-ui-0.1.2.tgz","types":"dist/index.d.ts","author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"echo 'Tests skipped for initial publish'","build":"tsc","clean":"rm -rf dist","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"version":"0.1.2","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"bbd2cab4-9bef-4e3a-9a5d-105c2fae5035"}},"keywords":["admin","agent","chat","ui","react","components","sse","typescript"],"_resolved":"/home/runner/work/tools/tools/packages/ui/admin-agent-chat-ui/bernierllc-admin-agent-chat-ui-0.1.2.tgz","_integrity":"sha512-BRKXvV2lqL+SSGCYrQ5nVHnnzv9l2kqzqKkax56U+uv7V7BfRXxD+voLw+wWfQmdM6gAUDCkXxsfFFIoZpi1Vg==","bernierllc":{"runtime":"browser","category":"ui","integration":{"logger":"not-applicable","neverhub":"not-applicable","neveradmin":"optional"}},"_npmVersion":"12.2.0","description":"React chat UI for the admin agent: provider, trigger, panel, message list, tool-result and change-summary cards, and the useAdminAgentChat SSE hook.","directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_nodeVersion":"24.21.0","dependencies":{"@bernierllc/agent-changeset":"^0.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","react":"^18.0.0","eslint":"^8.45.0","ts-jest":"^29.1.0","react-dom":"^18.0.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0","@testing-library/react":"^13.4.0","jest-environment-jsdom":"^29.5.0","@testing-library/jest-dom":"^5.16.0","@typescript-eslint/parser":"^6.0.0","@testing-library/user-event":"^14.4.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"react":">=16.8.0","react-dom":">=16.8.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/admin-agent-chat-ui_0.1.2_1790797299505_0.22181407900508465"}}},"time":{"created":"2026-06-20T19:37:42.604Z","modified":"2026-09-30T19:41:39.787Z","0.0.1":"2026-06-20T19:37:42.827Z","0.1.0":"2026-06-20T20:06:32.399Z","0.1.1":"2026-07-14T08:02:03.866Z","0.1.2":"2026-09-30T19:41:39.592Z"},"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","keywords":["admin","agent","chat","ui","react","components","sse","typescript"],"description":"React chat UI for the admin agent: provider, trigger, panel, message list, tool-result and change-summary cards, and the useAdminAgentChat SSE hook.","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/admin-agent-chat-ui\n\nReact components for an embedded admin LLM agent: floating trigger, slide-in chat panel, streaming message bubbles, tool-result cards, and change summary.\n\n## Overview\n\nThis package provides a complete frontend UI for the admin agent chat system. Drop `<AdminAgentProvider>` + `<AdminAgentTrigger>` + `<AdminAgentPanel>` into any React app and get a fully functional floating chat widget that streams responses from an SSE endpoint.\n\n**Architecture:**\n- All business logic lives in the `useAdminAgentChat` hook (headless)\n- Styled components are thin wrappers you can use as-is or replace with your own UI\n- Consumes newline-delimited JSON events from the `admin-agent-nextjs` SSE endpoint\n\n## Installation\n\n```bash\nnpm install @bernierllc/admin-agent-chat-ui react react-dom\n```\n\n## Quick Start\n\n```tsx\n// app/(admin)/layout.tsx\nimport {\n  AdminAgentProvider,\n  AdminAgentTrigger,\n  AdminAgentPanel,\n} from '@bernierllc/admin-agent-chat-ui';\n\nexport default function AdminLayout({ children }: { children: React.ReactNode }) {\n  return (\n    <AdminAgentProvider url=\"/api/chat/admin\">\n      {children}\n      <AdminAgentTrigger position=\"bottom-right\" />\n      <AdminAgentPanel />\n    </AdminAgentProvider>\n  );\n}\n```\n\nThis renders a `Sparkles` button fixed at the bottom-right. Clicking it opens a slide-in panel with a full streaming chat interface.\n\n## Headless Usage\n\nUse only the hook and build your own UI:\n\n```tsx\nimport { AdminAgentProvider, useAdminAgentChat } from '@bernierllc/admin-agent-chat-ui';\n\nfunction MyChat() {\n  const { messages, status, sendMessage, isOpen, toggle } = useAdminAgentChat();\n\n  if (!isOpen) return null;\n\n  return (\n    <div>\n      {messages.map((msg) => (\n        <div key={msg.id}>\n          <strong>{msg.role}</strong>: {msg.content}\n\n          {msg.toolResults?.map((tr) => (\n            <div\n              key={tr.toolCallId}\n              style={{ color: tr.success ? 'green' : 'red' }}\n            >\n              [{tr.toolName}] {tr.summary}\n            </div>\n          ))}\n\n          {msg.changeSummary && (\n            <pre>{msg.changeSummary.markdown}</pre>\n          )}\n        </div>\n      ))}\n\n      <p>Status: {status}</p>\n\n      <button onClick={() => void sendMessage('Hello!')}>Say hello</button>\n    </div>\n  );\n}\n\nexport default function App() {\n  return (\n    <AdminAgentProvider url=\"/api/chat/admin\">\n      <MyChat />\n    </AdminAgentProvider>\n  );\n}\n```\n\n## SSE Stream Protocol\n\nThe provider POSTs to `url` with body `{ message: string }` and reads newline-delimited JSON events:\n\n```jsonc\n// Each line is one JSON object followed by \\n\n{\"type\":\"text-delta\",\"delta\":\"Hello \"}\n{\"type\":\"text-delta\",\"delta\":\"world\"}\n{\"type\":\"tool-call-start\",\"toolCallId\":\"tc1\",\"toolName\":\"addService\"}\n{\"type\":\"tool-call-result\",\"toolCallId\":\"tc1\",\"success\":true,\"summary\":\"Added Haircut at $45\",\"data\":{...}}\n{\"type\":\"change-summary\",\"summary\":{...RollupSummary}}\n{\"type\":\"done\"}\n\n// Error path:\n{\"type\":\"error\",\"message\":\"Something went wrong\"}\n```\n\n## Components\n\n### `<AdminAgentProvider>`\n\nContext provider. Must wrap all other components and `useAdminAgentChat` calls.\n\n| Prop | Type | Required | Default | Description |\n|------|------|----------|---------|-------------|\n| `url` | `string` | Yes | — | SSE POST endpoint (e.g. `/api/chat/admin`) |\n| `headers` | `Record<string, string>` | No | `{}` | Extra request headers (e.g. auth token) |\n| `children` | `React.ReactNode` | Yes | — | Your app tree |\n| `fetchFn` | `typeof fetch` | No | `globalThis.fetch` | Override fetch (useful for testing) |\n\n---\n\n### `<AdminAgentTrigger>`\n\nFloating action button that toggles the panel open/closed.\n\n| Prop | Type | Required | Default | Description |\n|------|------|----------|---------|-------------|\n| `position` | `'bottom-right' \\| 'bottom-left'` | No | `'bottom-right'` | Corner to position the button |\n| `icon` | `React.ReactNode` | No | Sparkles SVG | Override the button icon |\n| `className` | `string` | No | — | Extra CSS class |\n\n```tsx\n<AdminAgentTrigger position=\"bottom-right\" />\n```\n\n---\n\n### `<AdminAgentPanel>`\n\nSlide-in panel from the right edge. Renders nothing when closed.\n\n| Prop | Type | Required | Default | Description |\n|------|------|----------|---------|-------------|\n| `width` | `number \\| string` | No | `380` | Panel width (px number or CSS string) |\n| `className` | `string` | No | — | Extra CSS class |\n\n```tsx\n<AdminAgentPanel width={420} />\n```\n\n---\n\n### `<AdminAgentPanelHeader>`\n\nHeader bar inside the panel with title and close button.\n\n| Prop | Type | Required | Default | Description |\n|------|------|----------|---------|-------------|\n| `title` | `string` | No | `'Admin Agent'` | Panel heading text |\n| `className` | `string` | No | — | Extra CSS class |\n\n---\n\n### `<MessageList>`\n\nScrollable list of message bubbles. Auto-scrolls to the latest message.\n\n| Prop | Type | Required | Default | Description |\n|------|------|----------|---------|-------------|\n| `messages` | `UIMessage[]` | Yes | — | Messages to render |\n| `className` | `string` | No | — | Extra CSS class |\n\n---\n\n### `<MessageBubble>`\n\nSingle chat bubble. Delegates to `<UserMessageContent>` or `<AssistantMessageContent>` based on role, and renders `<ToolResultCard>` and `<ChangeSummaryCard>` overlays.\n\n| Prop | Type | Required | Description |\n|------|------|----------|-------------|\n| `message` | `UIMessage` | Yes | The message to render |\n| `className` | `string` | No | Extra CSS class |\n\n---\n\n### `<AssistantMessageContent>`\n\nText content area styled for assistant messages.\n\n| Prop | Type | Required | Description |\n|------|------|----------|-------------|\n| `content` | `string` | Yes | Text content (rendered with pre-wrap) |\n| `className` | `string` | No | Extra CSS class |\n\n---\n\n### `<UserMessageContent>`\n\nText content area styled for user messages (white text on indigo background).\n\n| Prop | Type | Required | Description |\n|------|------|----------|-------------|\n| `content` | `string` | Yes | Text content |\n| `className` | `string` | No | Extra CSS class |\n\n---\n\n### `<AdminAgentInput>`\n\nText input + send button for composing messages. Submits on Enter (Shift+Enter for newline) and disables while the agent is busy.\n\n| Prop | Type | Required | Default | Description |\n|------|------|----------|---------|-------------|\n| `placeholder` | `string` | No | `'Message the admin agent…'` | Input placeholder |\n| `disabled` | `boolean` | No | `false` | Force-disable the input |\n| `className` | `string` | No | — | Extra CSS class |\n\n---\n\n### `<AgentStatusBar>`\n\nShows contextual status beneath the message list. Returns null when status is `'idle'`.\n\n| Prop | Type | Required | Default | Description |\n|------|------|----------|---------|-------------|\n| `status` | `AgentStatus` | Yes | — | Current agent status |\n| `executingTool` | `string` | No | — | Tool name shown during `'executing'` state |\n| `className` | `string` | No | — | Extra CSS class |\n\nStatus labels:\n\n| Status | Label |\n|--------|-------|\n| `idle` | *(hidden)* |\n| `thinking` | `Thinking…` |\n| `executing` | `Executing <toolName>…` |\n| `responding` | `Responding…` |\n| `error` | `Error — retry?` |\n\n---\n\n### `<ToolResultCard>`\n\nGreen (success) or red (failure) card rendered per tool call. Expandable to show raw data.\n\n| Prop | Type | Required | Default | Description |\n|------|------|----------|---------|-------------|\n| `toolName` | `string` | Yes | — | Name of the tool that ran |\n| `success` | `boolean` | Yes | — | Whether the tool call succeeded |\n| `summary` | `string` | Yes | — | One-line description of the change |\n| `data` | `unknown` | No | — | Raw data to show when expanded |\n| `expanded` | `boolean` | No | `false` | Start expanded |\n\n```tsx\n<ToolResultCard\n  toolName=\"addService\"\n  success={true}\n  summary=\"Added 'Haircut' at $45\"\n  data={{ id: 42, name: 'Haircut', price: 45 }}\n/>\n```\n\n---\n\n### `<ChangeSummaryCard>`\n\nEnd-of-conversation rollup card. Collapsible. Renders `RollupSummary.markdown` from `@bernierllc/agent-changeset`.\n\n| Prop | Type | Required | Default | Description |\n|------|------|----------|---------|-------------|\n| `summary` | `RollupSummary` | Yes | — | Rollup from `agent-changeset` |\n| `defaultExpanded` | `boolean` | No | `false` | Start expanded |\n\n---\n\n## Hook: `useAdminAgentChat`\n\n```ts\nimport { useAdminAgentChat } from '@bernierllc/admin-agent-chat-ui';\n\nconst {\n  messages,          // UIMessage[] — full conversation history\n  status,            // AgentStatus — current state machine state\n  isOpen,            // boolean — whether the panel is open\n  currentToolName,   // string | null — tool executing right now\n  sendMessage,       // (text: string) => Promise<void>\n  abort,             // () => void — cancel in-flight request\n  toggle,            // () => void — toggle open/closed\n  open,              // () => void — open the panel\n  close,             // () => void — close the panel\n} = useAdminAgentChat();\n```\n\nMust be called inside `<AdminAgentProvider>`. Throws `AdminAgentUIError` with code `NO_PROVIDER` otherwise.\n\n## Types\n\n```ts\ntype AgentStatus = 'idle' | 'thinking' | 'executing' | 'responding' | 'error';\n\ninterface UIMessage {\n  id: string;\n  role: 'user' | 'assistant';\n  content: string;\n  toolResults?: UIToolResult[];\n  changeSummary?: RollupSummary; // from @bernierllc/agent-changeset\n  timestamp: string;             // ISO 8601\n}\n\ninterface UIToolResult {\n  toolName: string;\n  toolCallId: string;\n  success: boolean;\n  summary: string;\n  data?: unknown;\n}\n```\n\n## Errors\n\n```ts\nimport { AdminAgentUIError, AdminAgentStreamError } from '@bernierllc/admin-agent-chat-ui';\n\n// Base error\nclass AdminAgentUIError extends Error {\n  readonly code: string; // e.g. 'UI_ERROR', 'NO_PROVIDER'\n}\n\n// Stream-specific error (extends AdminAgentUIError, code = 'STREAM_ERROR')\nclass AdminAgentStreamError extends AdminAgentUIError {}\n```\n\nBoth errors use `Error.cause` chaining for full stack traces.\n\n## State Machine\n\n```\nidle ──sendMessage──► thinking\nthinking ────────────► executing  (on tool-call-start)\nexecuting ───────────► thinking   (on tool-call-result, loop continues)\nthinking ────────────► responding (on text-delta)\nresponding ──────────► idle       (on done)\nany ─────────────────► error      (on error event or non-ok response)\n```\n\n## License\n\nCopyright (c) 2025 Bernier LLC. Licensed to the client under a limited-use license.\n","readmeFilename":"README.md"}