@automatey-org/chat-state
v0.1.0
Published
Framework-light chat state: a persisted multi-session store + a headless React useChatSession hook driven by @automatey-org/agent-core callbacks.
Maintainers
Readme
@automatey-org/chat-state
Framework-light chat state shared by the Automatey chat surfaces:
- a headless, persisted multi-session store — pure functions over a
Storage-like backend, generic over your app's message type; and - a React
useChatSessionhook that drives off@automatey-org/agent-corecallbacks (token · reasoning · tool events · phase · metrics) and maintains a@automatey-org/ui-fluentChatMessage[].
The two halves are independent: import only the store and you never pull in React.
Session store
import {
createChatId, deriveChatTitle, createChatSession,
loadChatState, saveChatState, upsertSession,
type ChatSession, type StoredChatState,
} from '@automatey-org/chat-state';
type Msg = { id: string; text: string };
const persist = { storageKey: 'my-app-chats', maxSessions: 40 }; // storage defaults to localStorage
let state = loadChatState<ChatSession<Msg>>(persist);
state = upsertSession(state, createChatSession<Msg>(deriveChatTitle('first prompt')));
saveChatState(state, persist);Sessions are kept most-recent-first (by updatedAt) and capped to maxSessions.
Headless hook
import { useChatSession } from '@automatey-org/chat-state';
import { Agent } from '@automatey-org/agent-core';
function Chat({ model, tools }: { model: LanguageModel; tools?: ToolSet }) {
const { messages, isRunning, phase, send, stop, reset } = useChatSession(
() => new Agent({ model, tools, modelLabel: 'Nemotron' }),
);
// render `messages` with @automatey-org/ui-fluent; `phase` feeds ThinkingBubble.
}phase is the live TurnPhase (calling_llm · thinking · generating ·
executing_tools · condensing · done, or idle between turns) — pass it
straight to ThinkingBubble.
Peers
@automatey-org/agent-core >= 0.1.3(hook only)@automatey-org/ui-fluent >= 0.1.3(hook only,ChatMessagetype — optional)react >= 18(hook only — optional)
