@starcite/react 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,214 @@
1
+ import {
2
+ appendUserMessageEvent,
3
+ chatAssistantChunkEventType,
4
+ chatUserMessageEventType,
5
+ toUIMessagesFromEvents
6
+ } from "./chunk-QG237Z3K.js";
7
+
8
+ // src/use-starcite-chat.ts
9
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
10
+ function createMessageId() {
11
+ if (typeof crypto !== "undefined" && "randomUUID" in crypto) {
12
+ return crypto.randomUUID();
13
+ }
14
+ return `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
15
+ }
16
+ function isChatEventType(type) {
17
+ return type === chatUserMessageEventType || type === chatAssistantChunkEventType;
18
+ }
19
+ function isTerminalAssistantChunkType(type) {
20
+ return type === "finish" || type === "abort";
21
+ }
22
+ function isRecord(value) {
23
+ return typeof value === "object" && value !== null;
24
+ }
25
+ function readAssistantChunkType(payload) {
26
+ if (!isRecord(payload) || payload.kind !== chatAssistantChunkEventType) {
27
+ return void 0;
28
+ }
29
+ const chunk = payload.chunk;
30
+ if (!isRecord(chunk)) {
31
+ return void 0;
32
+ }
33
+ return typeof chunk.type === "string" ? chunk.type : void 0;
34
+ }
35
+ function hasTextInput(message) {
36
+ return "text" in message && !("parts" in message);
37
+ }
38
+ function normalizeOutgoingMessage(input) {
39
+ if (hasTextInput(input)) {
40
+ return {
41
+ id: createMessageId(),
42
+ role: "user",
43
+ parts: [{ type: "text", text: input.text }]
44
+ };
45
+ }
46
+ return {
47
+ ...input,
48
+ id: input.id ?? createMessageId()
49
+ };
50
+ }
51
+ function normalizeError(error) {
52
+ if (error instanceof Error) {
53
+ return error;
54
+ }
55
+ return new Error(String(error));
56
+ }
57
+ async function readChatState(events) {
58
+ const messages = await toUIMessagesFromEvents(events);
59
+ let assistantOpen = false;
60
+ for (let index = events.length - 1; index >= 0; index -= 1) {
61
+ const event = events[index];
62
+ if (!event || event.type !== chatAssistantChunkEventType) {
63
+ continue;
64
+ }
65
+ const chunkType = readAssistantChunkType(event.payload);
66
+ if (!chunkType) {
67
+ break;
68
+ }
69
+ assistantOpen = !isTerminalAssistantChunkType(chunkType);
70
+ break;
71
+ }
72
+ return {
73
+ messages,
74
+ assistantOpen
75
+ };
76
+ }
77
+ function useStarciteChat(options) {
78
+ const { session, id, userMessageSource = "use-chat", onError } = options;
79
+ const sessionResetKey = id ?? session.id;
80
+ const [messages, setMessages] = useState([]);
81
+ const [status, setStatus] = useState("ready");
82
+ const refreshVersionRef = useRef(0);
83
+ const sessionKeyRef = useRef(sessionResetKey);
84
+ const onErrorRef = useRef(onError);
85
+ const liveRefreshScheduledRef = useRef(false);
86
+ const replayRefreshTimeoutRef = useRef(
87
+ null
88
+ );
89
+ useEffect(() => {
90
+ onErrorRef.current = onError;
91
+ }, [onError]);
92
+ const reportError = useCallback((error) => {
93
+ const normalized = normalizeError(error);
94
+ setStatus("error");
95
+ onErrorRef.current?.(normalized);
96
+ return normalized;
97
+ }, []);
98
+ const refreshFromSession = useCallback(() => {
99
+ const version = refreshVersionRef.current + 1;
100
+ refreshVersionRef.current = version;
101
+ const snapshot = [...session.events()];
102
+ readChatState(snapshot).then((chatState) => {
103
+ if (refreshVersionRef.current !== version) {
104
+ return;
105
+ }
106
+ setMessages(chatState.messages);
107
+ setStatus((current) => {
108
+ if (chatState.assistantOpen) {
109
+ return "streaming";
110
+ }
111
+ return current === "submitted" ? "submitted" : "ready";
112
+ });
113
+ }).catch((error) => {
114
+ reportError(error);
115
+ });
116
+ }, [reportError, session]);
117
+ const scheduleLiveRefreshFromSession = useCallback(() => {
118
+ if (liveRefreshScheduledRef.current) {
119
+ return;
120
+ }
121
+ liveRefreshScheduledRef.current = true;
122
+ setTimeout(() => {
123
+ liveRefreshScheduledRef.current = false;
124
+ refreshFromSession();
125
+ }, 16);
126
+ }, [refreshFromSession]);
127
+ const scheduleReplayRefreshFromSession = useCallback(() => {
128
+ if (replayRefreshTimeoutRef.current !== null) {
129
+ clearTimeout(replayRefreshTimeoutRef.current);
130
+ }
131
+ replayRefreshTimeoutRef.current = setTimeout(() => {
132
+ replayRefreshTimeoutRef.current = null;
133
+ refreshFromSession();
134
+ }, 120);
135
+ }, [refreshFromSession]);
136
+ const sendMessage = useCallback(
137
+ async (message) => {
138
+ const requestSessionKey = sessionKeyRef.current;
139
+ const outgoingMessage = normalizeOutgoingMessage(message);
140
+ setStatus("submitted");
141
+ try {
142
+ await appendUserMessageEvent(
143
+ session,
144
+ outgoingMessage,
145
+ {
146
+ source: userMessageSource
147
+ }
148
+ );
149
+ if (sessionKeyRef.current !== requestSessionKey) {
150
+ return;
151
+ }
152
+ refreshFromSession();
153
+ } catch (error) {
154
+ refreshVersionRef.current += 1;
155
+ throw reportError(error);
156
+ }
157
+ },
158
+ [refreshFromSession, reportError, session, userMessageSource]
159
+ );
160
+ const onSessionEvent = useCallback(
161
+ (event, context) => {
162
+ if (!isChatEventType(event.type)) {
163
+ return;
164
+ }
165
+ if (!context?.replayed && event.type === chatAssistantChunkEventType) {
166
+ const chunkType = readAssistantChunkType(event.payload);
167
+ if (chunkType && isTerminalAssistantChunkType(chunkType)) {
168
+ setStatus("ready");
169
+ } else {
170
+ setStatus("streaming");
171
+ }
172
+ }
173
+ if (context?.replayed) {
174
+ scheduleReplayRefreshFromSession();
175
+ } else {
176
+ scheduleLiveRefreshFromSession();
177
+ }
178
+ },
179
+ [scheduleLiveRefreshFromSession, scheduleReplayRefreshFromSession]
180
+ );
181
+ useEffect(() => {
182
+ sessionKeyRef.current = sessionResetKey;
183
+ refreshVersionRef.current += 1;
184
+ setMessages([]);
185
+ setStatus("ready");
186
+ refreshFromSession();
187
+ const offEvent = session.on("event", onSessionEvent, { replay: false });
188
+ const offError = session.on("error", (error) => {
189
+ onErrorRef.current?.(normalizeError(error));
190
+ });
191
+ return () => {
192
+ refreshVersionRef.current += 1;
193
+ liveRefreshScheduledRef.current = false;
194
+ if (replayRefreshTimeoutRef.current !== null) {
195
+ clearTimeout(replayRefreshTimeoutRef.current);
196
+ replayRefreshTimeoutRef.current = null;
197
+ }
198
+ offEvent();
199
+ offError();
200
+ };
201
+ }, [onSessionEvent, refreshFromSession, session, sessionResetKey]);
202
+ return useMemo(
203
+ () => ({
204
+ messages,
205
+ sendMessage,
206
+ status
207
+ }),
208
+ [messages, sendMessage, status]
209
+ );
210
+ }
211
+ export {
212
+ useStarciteChat
213
+ };
214
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/use-starcite-chat.ts"],"sourcesContent":["import type {\n AppendResult,\n SessionAppendInput,\n SessionEvent,\n SessionEventListener,\n SessionOnEventOptions,\n} from \"@starcite/sdk\";\nimport type { ChatStatus, UIMessage } from \"ai\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n appendUserMessageEvent,\n chatAssistantChunkEventType,\n chatUserMessageEventType,\n toUIMessagesFromEvents,\n} from \"./chat-protocol\";\n\nexport interface StarciteChatSession {\n readonly id: string;\n append(input: SessionAppendInput): Promise<AppendResult>;\n events(): readonly SessionEvent[];\n on(\n eventName: \"event\",\n listener: SessionEventListener,\n options?: SessionOnEventOptions<SessionEvent>\n ): () => void;\n on(eventName: \"error\", listener: (error: Error) => void): () => void;\n}\n\nexport type SendMessageInput =\n | {\n text: string;\n }\n | (Omit<UIMessage, \"id\"> & { id?: string });\n\nexport interface UseStarciteChatOptions {\n session: StarciteChatSession;\n id?: string;\n userMessageSource?: string;\n onError?: (error: Error) => void;\n}\n\nexport interface UseStarciteChatResult {\n messages: UIMessage[];\n sendMessage: (message: SendMessageInput) => Promise<void>;\n status: ChatStatus;\n}\n\ninterface ChatStateSnapshot {\n messages: UIMessage[];\n assistantOpen: boolean;\n}\n\nfunction createMessageId(): string {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n\n return `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction isChatEventType(type: string): boolean {\n return (\n type === chatUserMessageEventType || type === chatAssistantChunkEventType\n );\n}\n\nfunction isTerminalAssistantChunkType(type: string): boolean {\n return type === \"finish\" || type === \"abort\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction readAssistantChunkType(payload: unknown): string | undefined {\n if (!isRecord(payload) || payload.kind !== chatAssistantChunkEventType) {\n return undefined;\n }\n\n const chunk = payload.chunk;\n if (!isRecord(chunk)) {\n return undefined;\n }\n\n return typeof chunk.type === \"string\" ? chunk.type : undefined;\n}\n\nfunction hasTextInput(message: SendMessageInput): message is { text: string } {\n return \"text\" in message && !(\"parts\" in message);\n}\n\nfunction normalizeOutgoingMessage(input: SendMessageInput): UIMessage {\n if (hasTextInput(input)) {\n return {\n id: createMessageId(),\n role: \"user\",\n parts: [{ type: \"text\", text: input.text }],\n };\n }\n\n return {\n ...input,\n id: input.id ?? createMessageId(),\n };\n}\n\nfunction normalizeError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n\n return new Error(String(error));\n}\n\nasync function readChatState(\n events: readonly SessionEvent[]\n): Promise<ChatStateSnapshot> {\n const messages = await toUIMessagesFromEvents(events);\n let assistantOpen = false;\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (!event || event.type !== chatAssistantChunkEventType) {\n continue;\n }\n\n const chunkType = readAssistantChunkType(event.payload);\n if (!chunkType) {\n break;\n }\n\n assistantOpen = !isTerminalAssistantChunkType(chunkType);\n break;\n }\n\n return {\n messages,\n assistantOpen,\n };\n}\n\nexport function useStarciteChat(\n options: UseStarciteChatOptions\n): UseStarciteChatResult {\n const { session, id, userMessageSource = \"use-chat\", onError } = options;\n\n const sessionResetKey = id ?? session.id;\n\n const [messages, setMessages] = useState<UIMessage[]>([]);\n const [status, setStatus] = useState<ChatStatus>(\"ready\");\n\n const refreshVersionRef = useRef(0);\n const sessionKeyRef = useRef(sessionResetKey);\n const onErrorRef = useRef(onError);\n const liveRefreshScheduledRef = useRef(false);\n const replayRefreshTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n\n useEffect(() => {\n onErrorRef.current = onError;\n }, [onError]);\n\n const reportError = useCallback((error: unknown): Error => {\n const normalized = normalizeError(error);\n setStatus(\"error\");\n onErrorRef.current?.(normalized);\n return normalized;\n }, []);\n\n const refreshFromSession = useCallback(() => {\n const version = refreshVersionRef.current + 1;\n refreshVersionRef.current = version;\n\n const snapshot = [...session.events()];\n\n readChatState(snapshot)\n .then((chatState) => {\n if (refreshVersionRef.current !== version) {\n return;\n }\n\n setMessages(chatState.messages);\n setStatus((current) => {\n if (chatState.assistantOpen) {\n return \"streaming\";\n }\n\n return current === \"submitted\" ? \"submitted\" : \"ready\";\n });\n })\n .catch((error) => {\n reportError(error);\n });\n }, [reportError, session]);\n\n const scheduleLiveRefreshFromSession = useCallback(() => {\n if (liveRefreshScheduledRef.current) {\n return;\n }\n\n liveRefreshScheduledRef.current = true;\n setTimeout(() => {\n liveRefreshScheduledRef.current = false;\n refreshFromSession();\n }, 16);\n }, [refreshFromSession]);\n\n const scheduleReplayRefreshFromSession = useCallback(() => {\n if (replayRefreshTimeoutRef.current !== null) {\n clearTimeout(replayRefreshTimeoutRef.current);\n }\n\n replayRefreshTimeoutRef.current = setTimeout(() => {\n replayRefreshTimeoutRef.current = null;\n refreshFromSession();\n }, 120);\n }, [refreshFromSession]);\n\n const sendMessage = useCallback(\n async (message: SendMessageInput): Promise<void> => {\n const requestSessionKey = sessionKeyRef.current;\n const outgoingMessage = normalizeOutgoingMessage(message);\n\n setStatus(\"submitted\");\n\n try {\n await appendUserMessageEvent(\n session,\n outgoingMessage as unknown as Record<string, unknown>,\n {\n source: userMessageSource,\n }\n );\n\n if (sessionKeyRef.current !== requestSessionKey) {\n return;\n }\n\n refreshFromSession();\n } catch (error) {\n refreshVersionRef.current += 1;\n throw reportError(error);\n }\n },\n [refreshFromSession, reportError, session, userMessageSource]\n );\n\n const onSessionEvent = useCallback(\n (event: SessionEvent, context?: { replayed: boolean }): void => {\n if (!isChatEventType(event.type)) {\n return;\n }\n\n if (!context?.replayed && event.type === chatAssistantChunkEventType) {\n const chunkType = readAssistantChunkType(event.payload);\n if (chunkType && isTerminalAssistantChunkType(chunkType)) {\n setStatus(\"ready\");\n } else {\n setStatus(\"streaming\");\n }\n }\n\n if (context?.replayed) {\n scheduleReplayRefreshFromSession();\n } else {\n scheduleLiveRefreshFromSession();\n }\n },\n [scheduleLiveRefreshFromSession, scheduleReplayRefreshFromSession]\n );\n\n useEffect(() => {\n sessionKeyRef.current = sessionResetKey;\n refreshVersionRef.current += 1;\n setMessages([]);\n setStatus(\"ready\");\n\n refreshFromSession();\n\n const offEvent = session.on(\"event\", onSessionEvent, { replay: false });\n const offError = session.on(\"error\", (error) => {\n onErrorRef.current?.(normalizeError(error));\n });\n\n return () => {\n refreshVersionRef.current += 1;\n\n liveRefreshScheduledRef.current = false;\n if (replayRefreshTimeoutRef.current !== null) {\n clearTimeout(replayRefreshTimeoutRef.current);\n replayRefreshTimeoutRef.current = null;\n }\n\n offEvent();\n offError();\n };\n }, [onSessionEvent, refreshFromSession, session, sessionResetKey]);\n\n return useMemo(\n () => ({\n messages,\n sendMessage,\n status,\n }),\n [messages, sendMessage, status]\n );\n}\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "@starcite/react",
3
+ "version": "0.0.7",
4
+ "description": "React hook for Starcite durable session chat",
5
+ "license": "Apache-2.0",
6
+ "homepage": "https://starcite.ai",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/fastpaca/starcite-clients.git",
10
+ "directory": "packages/starcite-react"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/fastpaca/starcite-clients/issues"
14
+ },
15
+ "keywords": [
16
+ "starcite",
17
+ "react",
18
+ "chat",
19
+ "streaming",
20
+ "typescript"
21
+ ],
22
+ "type": "module",
23
+ "main": "./dist/index.cjs",
24
+ "module": "./dist/index.js",
25
+ "types": "./dist/index.d.ts",
26
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "import": "./dist/index.js",
30
+ "require": "./dist/index.cjs"
31
+ },
32
+ "./chat-protocol": {
33
+ "types": "./dist/chat-protocol.d.ts",
34
+ "import": "./dist/chat-protocol.js",
35
+ "require": "./dist/chat-protocol.cjs"
36
+ }
37
+ },
38
+ "files": [
39
+ "dist"
40
+ ],
41
+ "scripts": {
42
+ "clean": "rm -rf dist",
43
+ "build": "tsup",
44
+ "test": "vitest run",
45
+ "typecheck": "tsc -p tsconfig.json --noEmit",
46
+ "prepublishOnly": "bun run clean && bun run build",
47
+ "publish:dry": "bun publish --dry-run --access public",
48
+ "lint": "ultracite check src test package.json tsconfig.json tsup.config.ts vitest.config.ts README.md",
49
+ "format": "ultracite fix src test package.json tsconfig.json tsup.config.ts vitest.config.ts README.md",
50
+ "check": "bun run lint && bun run typecheck && bun run test"
51
+ },
52
+ "dependencies": {
53
+ "@starcite/sdk": "^0.0.7",
54
+ "ai": "^5.0.0"
55
+ },
56
+ "peerDependencies": {
57
+ "react": ">=18.0.0"
58
+ },
59
+ "devDependencies": {
60
+ "@testing-library/react": "^16.3.0",
61
+ "@types/node": "^25.3.3",
62
+ "@types/react": "^19.2.2",
63
+ "@types/react-dom": "^19.2.2",
64
+ "jsdom": "^26.1.0",
65
+ "react": "^19.0.0",
66
+ "react-dom": "^19.0.0",
67
+ "tsup": "^8.5.0",
68
+ "typescript": "^5.8.3",
69
+ "vitest": "^2.1.9"
70
+ }
71
+ }