{"_id":"@automatey-org/chat-state","name":"@automatey-org/chat-state","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@automatey-org/chat-state","version":"0.1.0","description":"Framework-light chat state: a persisted multi-session store + a headless React useChatSession hook driven by @automatey-org/agent-core callbacks.","keywords":["chat","react","hooks","agent","vercel-ai-sdk","session-store","automatey"],"license":"MIT","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","main":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"sideEffects":false,"scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","test":"vitest run","prepublishOnly":"npm run build"},"peerDependencies":{"@automatey-org/agent-core":">=0.1.3","@automatey-org/ui-fluent":">=0.1.3","react":">=18"},"peerDependenciesMeta":{"@automatey-org/ui-fluent":{"optional":true},"react":{"optional":true}},"devDependencies":{"@automatey-org/agent-core":"*","@automatey-org/ui-fluent":"*","@types/react":"^18.3.12","ai":"^7.0.11","react":"^18.3.1","typescript":"^5.6.0","vitest":"^4.1.2"},"publishConfig":{"access":"public"},"gitHead":"3ea423195809db00d5430abb5abb5415bf9528b0","_id":"@automatey-org/chat-state@0.1.0","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-tTkn4P0OBd7vhsoA6/QrvCCpRDqF5I8FD6Lrtn5HG/rSj3zDOmdbgLoLfrZ1m6lrzwUxveCSiVXnZa+myAX0Kw==","shasum":"8afada2bebec901953e5898940928e0ba52debf1","tarball":"https://registry.npmjs.org/@automatey-org/chat-state/-/chat-state-0.1.0.tgz","fileCount":14,"unpackedSize":24471,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHhro+9MWTOa8nue5/SBfE1u3+oRP6cgCjTi85UW+yzWAiEApq1/PZMVtQkRHEK2cNq8Q/QW5acLQ7AZxJ9GHwObMGk="}]},"_npmUser":{"name":"maxgolovanov","email":"max.golovanov@gmail.com"},"directories":{},"maintainers":[{"name":"maxgolovanov","email":"max.golovanov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/chat-state_0.1.0_1783305035171_0.6440435497275305"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-06T02:30:35.012Z","0.1.0":"2026-07-06T02:30:35.324Z","modified":"2026-07-06T02:30:35.532Z"},"maintainers":[{"name":"maxgolovanov","email":"max.golovanov@gmail.com"}],"description":"Framework-light chat state: a persisted multi-session store + a headless React useChatSession hook driven by @automatey-org/agent-core callbacks.","keywords":["chat","react","hooks","agent","vercel-ai-sdk","session-store","automatey"],"license":"MIT","readme":"# @automatey-org/chat-state\r\n\r\nFramework-light **chat state** shared by the Automatey chat surfaces:\r\n\r\n1. a **headless, persisted multi-session store** — pure functions over a\r\n   `Storage`-like backend, generic over your app's message type; and\r\n2. a React **`useChatSession`** hook that drives off\r\n   [`@automatey-org/agent-core`](https://www.npmjs.com/package/@automatey-org/agent-core)\r\n   callbacks (token · reasoning · tool events · **phase** · metrics) and\r\n   maintains a [`@automatey-org/ui-fluent`](https://www.npmjs.com/package/@automatey-org/ui-fluent)\r\n   `ChatMessage[]`.\r\n\r\nThe two halves are independent: import only the store and you never pull in\r\nReact.\r\n\r\n## Session store\r\n\r\n```ts\r\nimport {\r\n  createChatId, deriveChatTitle, createChatSession,\r\n  loadChatState, saveChatState, upsertSession,\r\n  type ChatSession, type StoredChatState,\r\n} from '@automatey-org/chat-state';\r\n\r\ntype Msg = { id: string; text: string };\r\nconst persist = { storageKey: 'my-app-chats', maxSessions: 40 }; // storage defaults to localStorage\r\n\r\nlet state = loadChatState<ChatSession<Msg>>(persist);\r\nstate = upsertSession(state, createChatSession<Msg>(deriveChatTitle('first prompt')));\r\nsaveChatState(state, persist);\r\n```\r\n\r\nSessions are kept most-recent-first (by `updatedAt`) and capped to `maxSessions`.\r\n\r\n## Headless hook\r\n\r\n```tsx\r\nimport { useChatSession } from '@automatey-org/chat-state';\r\nimport { Agent } from '@automatey-org/agent-core';\r\n\r\nfunction Chat({ model, tools }: { model: LanguageModel; tools?: ToolSet }) {\r\n  const { messages, isRunning, phase, send, stop, reset } = useChatSession(\r\n    () => new Agent({ model, tools, modelLabel: 'Nemotron' }),\r\n  );\r\n  // render `messages` with @automatey-org/ui-fluent; `phase` feeds ThinkingBubble.\r\n}\r\n```\r\n\r\n`phase` is the live `TurnPhase` (`calling_llm` · `thinking` · `generating` ·\r\n`executing_tools` · `condensing` · `done`, or `idle` between turns) — pass it\r\nstraight to `ThinkingBubble`.\r\n\r\n## Peers\r\n- `@automatey-org/agent-core >= 0.1.3` (hook only)\r\n- `@automatey-org/ui-fluent >= 0.1.3` (hook only, `ChatMessage` type — optional)\r\n- `react >= 18` (hook only — optional)\r\n","readmeFilename":"README.md","_rev":"1-92cb3e69c680e9ffb8c34722a710585b"}