@absolutejs/ai 0.0.46 → 0.0.48
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/README.md +49 -0
- package/dist/ai/client/index.js +192 -3
- package/dist/ai/client/index.js.map +9 -7
- package/dist/ai/index.js +281 -31
- package/dist/ai/index.js.map +9 -8
- package/dist/angular/ai/index.js +63 -2
- package/dist/angular/ai/index.js.map +6 -6
- package/dist/react/ai/index.js +62 -2
- package/dist/react/ai/index.js.map +6 -6
- package/dist/src/ai/client/actions.d.ts +113 -0
- package/dist/src/ai/client/composer.d.ts +15 -0
- package/dist/src/ai/client/index.d.ts +2 -0
- package/dist/src/ai/client/turnQueue.d.ts +40 -0
- package/dist/svelte/ai/index.js +62 -2
- package/dist/svelte/ai/index.js.map +6 -6
- package/dist/types/ai.d.ts +34 -1
- package/dist/vue/ai/index.js +62 -2
- package/dist/vue/ai/index.js.map +6 -6
- package/package.json +1 -1
package/dist/angular/ai/index.js
CHANGED
|
@@ -119,6 +119,28 @@ var serverMessageToAction = (message) => {
|
|
|
119
119
|
type: "complete",
|
|
120
120
|
usage: message.usage
|
|
121
121
|
};
|
|
122
|
+
case "turn_queued":
|
|
123
|
+
return {
|
|
124
|
+
conversationId: message.conversationId,
|
|
125
|
+
messageId: message.messageId,
|
|
126
|
+
position: message.position,
|
|
127
|
+
type: "turn_queued"
|
|
128
|
+
};
|
|
129
|
+
case "turn_started":
|
|
130
|
+
return {
|
|
131
|
+
conversationId: message.conversationId,
|
|
132
|
+
messageId: message.messageId,
|
|
133
|
+
type: "turn_started"
|
|
134
|
+
};
|
|
135
|
+
case "branched":
|
|
136
|
+
return {
|
|
137
|
+
content: message.content,
|
|
138
|
+
fromMessageId: message.fromMessageId,
|
|
139
|
+
messageId: message.messageId,
|
|
140
|
+
newConversationId: message.newConversationId,
|
|
141
|
+
oldConversationId: message.oldConversationId,
|
|
142
|
+
type: "branch"
|
|
143
|
+
};
|
|
122
144
|
case "rag_retrieving":
|
|
123
145
|
return {
|
|
124
146
|
conversationId: message.conversationId,
|
|
@@ -162,6 +184,12 @@ var isValidAIServerMessage = (data) => {
|
|
|
162
184
|
return "data" in data && typeof data.data === "string" && "format" in data && typeof data.format === "string" && "isPartial" in data && typeof data.isPartial === "boolean" && "messageId" in data && "conversationId" in data;
|
|
163
185
|
case "complete":
|
|
164
186
|
return "messageId" in data && "conversationId" in data;
|
|
187
|
+
case "turn_queued":
|
|
188
|
+
return "conversationId" in data && typeof data.conversationId === "string" && "messageId" in data && typeof data.messageId === "string" && "position" in data && typeof data.position === "number";
|
|
189
|
+
case "turn_started":
|
|
190
|
+
return "conversationId" in data && typeof data.conversationId === "string" && "messageId" in data && typeof data.messageId === "string";
|
|
191
|
+
case "branched":
|
|
192
|
+
return "content" in data && typeof data.content === "string" && "fromMessageId" in data && typeof data.fromMessageId === "string" && "messageId" in data && typeof data.messageId === "string" && "newConversationId" in data && typeof data.newConversationId === "string" && "oldConversationId" in data && typeof data.oldConversationId === "string";
|
|
165
193
|
case "rag_retrieved":
|
|
166
194
|
return "conversationId" in data && "messageId" in data && "sources" in data && Array.isArray(data.sources);
|
|
167
195
|
case "error":
|
|
@@ -349,6 +377,7 @@ var handleSend = (state, action) => {
|
|
|
349
377
|
content: action.content,
|
|
350
378
|
conversationId: action.conversationId,
|
|
351
379
|
id: action.messageId,
|
|
380
|
+
isQueued: false,
|
|
352
381
|
role: "user",
|
|
353
382
|
timestamp: Date.now()
|
|
354
383
|
};
|
|
@@ -357,6 +386,19 @@ var handleSend = (state, action) => {
|
|
|
357
386
|
state.error = null;
|
|
358
387
|
state.isStreaming = true;
|
|
359
388
|
};
|
|
389
|
+
var updateUserQueueState = (state, conversationId, messageId, isQueued) => {
|
|
390
|
+
const conversation = state.conversations.get(conversationId);
|
|
391
|
+
if (!conversation)
|
|
392
|
+
return;
|
|
393
|
+
conversation.messages = conversation.messages.map((message) => message.id === messageId && message.role === "user" ? { ...message, isQueued } : message);
|
|
394
|
+
};
|
|
395
|
+
var handleTurnQueued = (state, action) => {
|
|
396
|
+
updateUserQueueState(state, action.conversationId, action.messageId, true);
|
|
397
|
+
};
|
|
398
|
+
var handleTurnStarted = (state, action) => {
|
|
399
|
+
updateUserQueueState(state, action.conversationId, action.messageId, false);
|
|
400
|
+
state.isStreaming = true;
|
|
401
|
+
};
|
|
360
402
|
var handleChunk = (state, action) => {
|
|
361
403
|
const conversation = getOrCreate(state, action.conversationId);
|
|
362
404
|
const existingIdx = conversation.messages.findIndex((msg) => msg.id === action.messageId && msg.role === "assistant");
|
|
@@ -537,10 +579,21 @@ var handleBranch = (state, action) => {
|
|
|
537
579
|
const newConversation = {
|
|
538
580
|
createdAt: Date.now(),
|
|
539
581
|
id: action.newConversationId,
|
|
540
|
-
messages:
|
|
582
|
+
messages: [
|
|
583
|
+
...branchedMessages,
|
|
584
|
+
{
|
|
585
|
+
content: action.content,
|
|
586
|
+
conversationId: action.newConversationId,
|
|
587
|
+
id: action.messageId,
|
|
588
|
+
isQueued: false,
|
|
589
|
+
role: "user",
|
|
590
|
+
timestamp: Date.now()
|
|
591
|
+
}
|
|
592
|
+
]
|
|
541
593
|
};
|
|
542
594
|
state.conversations.set(action.newConversationId, newConversation);
|
|
543
595
|
state.activeConversationId = action.newConversationId;
|
|
596
|
+
state.isStreaming = true;
|
|
544
597
|
};
|
|
545
598
|
var applyAction = (state, action) => {
|
|
546
599
|
switch (action.type) {
|
|
@@ -562,6 +615,12 @@ var applyAction = (state, action) => {
|
|
|
562
615
|
case "complete":
|
|
563
616
|
handleComplete(state, action);
|
|
564
617
|
break;
|
|
618
|
+
case "turn_queued":
|
|
619
|
+
handleTurnQueued(state, action);
|
|
620
|
+
break;
|
|
621
|
+
case "turn_started":
|
|
622
|
+
handleTurnStarted(state, action);
|
|
623
|
+
break;
|
|
565
624
|
case "error":
|
|
566
625
|
state.error = action.message;
|
|
567
626
|
state.isStreaming = false;
|
|
@@ -665,6 +724,7 @@ class AIStreamService {
|
|
|
665
724
|
attachments,
|
|
666
725
|
content,
|
|
667
726
|
conversationId: convId,
|
|
727
|
+
messageId: msgId,
|
|
668
728
|
type: "message"
|
|
669
729
|
});
|
|
670
730
|
};
|
|
@@ -726,6 +786,7 @@ class AIStreamService {
|
|
|
726
786
|
attachments,
|
|
727
787
|
content,
|
|
728
788
|
conversationId: convId,
|
|
789
|
+
messageId: msgId,
|
|
729
790
|
type: "message"
|
|
730
791
|
});
|
|
731
792
|
};
|
|
@@ -773,5 +834,5 @@ export {
|
|
|
773
834
|
AIStreamService
|
|
774
835
|
};
|
|
775
836
|
|
|
776
|
-
//# debugId=
|
|
837
|
+
//# debugId=8021B9BF4BBDDD3A64756E2164756E21
|
|
777
838
|
//# sourceMappingURL=index.js.map
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/angular/ai/ai-stream.service.ts", "../src/ai/client/actions.ts", "../types/typeGuards.ts", "../src/ai/client/connection.ts", "../src/ai/client/messageStore.ts", "../src/ai/protocol.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { computed, Injectable, OnDestroy, signal } from \"@angular/core\";\nimport type {\n AIAttachment,\n AIMessage,\n AIServerMessage,\n} from \"../../../types/ai\";\nimport { serverMessageToAction } from \"../../ai/client/actions\";\nimport { createAIConnection } from \"../../ai/client/connection\";\nimport { createAIMessageStore } from \"../../ai/client/messageStore\";\nimport { generateId } from \"../../ai/protocol\";\n\n@Injectable({ providedIn: \"root\" })\nexport class AIStreamService implements OnDestroy {\n private connections = new Map<\n string,\n {\n connection: ReturnType<typeof createAIConnection>;\n store: ReturnType<typeof createAIMessageStore>;\n unsubscribeConnection: () => void;\n unsubscribeStore: () => void;\n }\n >();\n\n connect(path: string, conversationId?: string) {\n const existing = this.connections.get(path);\n if (existing) {\n return this.createHandle(existing, conversationId);\n }\n\n const connection = createAIConnection(path);\n const store = createAIMessageStore();\n\n const messagesSignal = signal<AIMessage[]>([]);\n const isStreamingSignal = signal(false);\n const errorSignal = signal<string | null>(null);\n const activeConversationIdSignal = signal<string | null>(\n conversationId ?? null,\n );\n\n const syncState = () => {\n const snapshot = store.getSnapshot();\n const convId =\n activeConversationIdSignal() ?? snapshot.activeConversationId;\n const conversation = convId\n ? snapshot.conversations.get(convId)\n : undefined;\n messagesSignal.set(conversation?.messages ?? []);\n isStreamingSignal.set(snapshot.isStreaming);\n errorSignal.set(snapshot.error);\n if (convId) {\n activeConversationIdSignal.set(convId);\n }\n };\n\n const unsubscribeStore = store.subscribe(syncState);\n\n const unsubscribeConnection = connection.subscribe(\n (message: AIServerMessage) => {\n const action = serverMessageToAction(message);\n if (action) {\n store.dispatch(action);\n }\n },\n );\n\n const entry: {\n connection: ReturnType<typeof createAIConnection>;\n store: ReturnType<typeof createAIMessageStore>;\n unsubscribeConnection: () => void;\n unsubscribeStore: () => void;\n } = {\n connection,\n store,\n unsubscribeConnection,\n unsubscribeStore,\n };\n this.connections.set(path, entry);\n\n const send = (content: string, attachments?: AIAttachment[]) => {\n const convId = activeConversationIdSignal() ?? generateId();\n const msgId = generateId();\n\n store.dispatch({\n attachments,\n content,\n conversationId: convId,\n messageId: msgId,\n type: \"send\",\n });\n\n connection.send({\n attachments,\n content,\n conversationId: convId,\n type: \"message\",\n });\n };\n\n const cancel = () => {\n const convId = activeConversationIdSignal();\n if (convId) {\n store.dispatch({ type: \"cancel\" });\n connection.send({ conversationId: convId, type: \"cancel\" });\n }\n };\n\n const branch = (messageId: string, content: string) => {\n const convId = activeConversationIdSignal();\n if (convId) {\n connection.send({\n content,\n conversationId: convId,\n messageId,\n type: \"branch\",\n });\n }\n };\n\n return {\n branch,\n cancel,\n error: computed(() => errorSignal()),\n isStreaming: computed(() => isStreamingSignal()),\n messages: computed(() => messagesSignal()),\n send,\n };\n }\n\n private createHandle(\n entry: {\n connection: ReturnType<typeof createAIConnection>;\n store: ReturnType<typeof createAIMessageStore>;\n },\n conversationId?: string,\n ) {\n const { connection, store } = entry;\n\n const messagesSignal = signal<AIMessage[]>([]);\n const isStreamingSignal = signal(false);\n const errorSignal = signal<string | null>(null);\n const activeConversationIdSignal = signal<string | null>(\n conversationId ?? null,\n );\n\n store.subscribe(() => {\n const snapshot = store.getSnapshot();\n const convId =\n activeConversationIdSignal() ?? snapshot.activeConversationId;\n const conversation = convId\n ? snapshot.conversations.get(convId)\n : undefined;\n messagesSignal.set(conversation?.messages ?? []);\n isStreamingSignal.set(snapshot.isStreaming);\n errorSignal.set(snapshot.error);\n if (convId) {\n activeConversationIdSignal.set(convId);\n }\n });\n\n const send = (content: string, attachments?: AIAttachment[]) => {\n const convId = activeConversationIdSignal() ?? generateId();\n const msgId = generateId();\n\n store.dispatch({\n attachments,\n content,\n conversationId: convId,\n messageId: msgId,\n type: \"send\",\n });\n\n connection.send({\n attachments,\n content,\n conversationId: convId,\n type: \"message\",\n });\n };\n\n const cancel = () => {\n const convId = activeConversationIdSignal();\n if (convId) {\n store.dispatch({ type: \"cancel\" });\n connection.send({ conversationId: convId, type: \"cancel\" });\n }\n };\n\n const branch = (messageId: string, content: string) => {\n const convId = activeConversationIdSignal();\n if (convId) {\n connection.send({\n content,\n conversationId: convId,\n messageId,\n type: \"branch\",\n });\n }\n };\n\n return {\n branch,\n cancel,\n error: computed(() => errorSignal()),\n isStreaming: computed(() => isStreamingSignal()),\n messages: computed(() => messagesSignal()),\n send,\n };\n }\n\n ngOnDestroy() {\n for (const [, entry] of this.connections) {\n entry.unsubscribeConnection();\n entry.unsubscribeStore();\n entry.connection.close();\n }\n this.connections.clear();\n }\n}\n",
|
|
6
|
-
"import type { AIServerMessage } from \"../../../types/ai\";\n\nexport const serverMessageToAction = (message: AIServerMessage) => {\n switch (message.type) {\n case \"chunk\":\n return {\n content: message.content,\n conversationId: message.conversationId,\n messageId: message.messageId,\n type: \"chunk\" as const,\n };\n case \"thinking\":\n return {\n content: message.content,\n conversationId: message.conversationId,\n messageId: message.messageId,\n type: \"thinking\" as const,\n };\n case \"tool_status\":\n return {\n conversationId: message.conversationId,\n input: message.input,\n messageId: message.messageId,\n name: message.name,\n result: message.result,\n status: message.status,\n type: \"tool_status\" as const,\n };\n case \"image\":\n return {\n conversationId: message.conversationId,\n data: message.data,\n format: message.format,\n imageId: message.imageId,\n isPartial: message.isPartial,\n messageId: message.messageId,\n revisedPrompt: message.revisedPrompt,\n type: \"image\" as const,\n };\n case \"complete\":\n return {\n conversationId: message.conversationId,\n durationMs: message.durationMs,\n messageId: message.messageId,\n model: message.model,\n sources: message.sources,\n type: \"complete\" as const,\n usage: message.usage,\n };\n case \"rag_retrieving\":\n return {\n conversationId: message.conversationId,\n messageId: message.messageId,\n retrievalStartedAt: message.retrievalStartedAt,\n type: \"rag_retrieving\" as const,\n };\n case \"rag_retrieved\":\n return {\n conversationId: message.conversationId,\n messageId: message.messageId,\n retrievalDurationMs: message.retrievalDurationMs,\n retrievalStartedAt: message.retrievalStartedAt,\n retrievedAt: message.retrievedAt,\n sources: message.sources,\n trace: message.trace,\n type: \"rag_retrieved\" as const,\n };\n case \"error\":\n return { message: message.message, type: \"error\" as const };\n default:\n return null;\n }\n};\n",
|
|
7
|
-
"import type { AIClientMessage, AIServerMessage } from \"./ai\";\n\nexport const isValidAIClientMessage = (\n data: unknown,\n): data is AIClientMessage => {\n if (!data || typeof data !== \"object\") {\n return false;\n }\n\n if (!(\"type\" in data) || typeof data.type !== \"string\") {\n return false;\n }\n\n switch (data.type) {\n case \"message\":\n return \"content\" in data && typeof data.content === \"string\";\n case \"cancel\":\n return (\n \"conversationId\" in data && typeof data.conversationId === \"string\"\n );\n case \"branch\":\n return (\n \"messageId\" in data &&\n typeof data.messageId === \"string\" &&\n \"content\" in data &&\n typeof data.content === \"string\" &&\n \"conversationId\" in data &&\n typeof data.conversationId === \"string\"\n );\n default:\n return false;\n }\n};\n\nexport const isValidAIServerMessage = (\n data: unknown,\n): data is AIServerMessage => {\n if (!data || typeof data !== \"object\") {\n return false;\n }\n\n if (!(\"type\" in data) || typeof data.type !== \"string\") {\n return false;\n }\n\n switch (data.type) {\n case \"chunk\":\n case \"thinking\":\n return (\n \"content\" in data &&\n typeof data.content === \"string\" &&\n \"messageId\" in data &&\n \"conversationId\" in data\n );\n case \"tool_status\":\n return (\n \"name\" in data &&\n \"status\" in data &&\n \"messageId\" in data &&\n \"conversationId\" in data\n );\n case \"image\":\n return (\n \"data\" in data &&\n typeof data.data === \"string\" &&\n \"format\" in data &&\n typeof data.format === \"string\" &&\n \"isPartial\" in data &&\n typeof data.isPartial === \"boolean\" &&\n \"messageId\" in data &&\n \"conversationId\" in data\n );\n case \"complete\":\n return \"messageId\" in data && \"conversationId\" in data;\n case \"rag_retrieved\":\n return (\n \"conversationId\" in data &&\n \"messageId\" in data &&\n \"sources\" in data &&\n Array.isArray(data.sources)\n );\n case \"error\":\n return \"message\" in data && typeof data.message === \"string\";\n default:\n return false;\n }\n};\n",
|
|
5
|
+
"import { computed, Injectable, OnDestroy, signal } from \"@angular/core\";\nimport type {\n AIAttachment,\n AIMessage,\n AIServerMessage,\n} from \"../../../types/ai\";\nimport { serverMessageToAction } from \"../../ai/client/actions\";\nimport { createAIConnection } from \"../../ai/client/connection\";\nimport { createAIMessageStore } from \"../../ai/client/messageStore\";\nimport { generateId } from \"../../ai/protocol\";\n\n@Injectable({ providedIn: \"root\" })\nexport class AIStreamService implements OnDestroy {\n private connections = new Map<\n string,\n {\n connection: ReturnType<typeof createAIConnection>;\n store: ReturnType<typeof createAIMessageStore>;\n unsubscribeConnection: () => void;\n unsubscribeStore: () => void;\n }\n >();\n\n connect(path: string, conversationId?: string) {\n const existing = this.connections.get(path);\n if (existing) {\n return this.createHandle(existing, conversationId);\n }\n\n const connection = createAIConnection(path);\n const store = createAIMessageStore();\n\n const messagesSignal = signal<AIMessage[]>([]);\n const isStreamingSignal = signal(false);\n const errorSignal = signal<string | null>(null);\n const activeConversationIdSignal = signal<string | null>(\n conversationId ?? null,\n );\n\n const syncState = () => {\n const snapshot = store.getSnapshot();\n const convId =\n activeConversationIdSignal() ?? snapshot.activeConversationId;\n const conversation = convId\n ? snapshot.conversations.get(convId)\n : undefined;\n messagesSignal.set(conversation?.messages ?? []);\n isStreamingSignal.set(snapshot.isStreaming);\n errorSignal.set(snapshot.error);\n if (convId) {\n activeConversationIdSignal.set(convId);\n }\n };\n\n const unsubscribeStore = store.subscribe(syncState);\n\n const unsubscribeConnection = connection.subscribe(\n (message: AIServerMessage) => {\n const action = serverMessageToAction(message);\n if (action) {\n store.dispatch(action);\n }\n },\n );\n\n const entry: {\n connection: ReturnType<typeof createAIConnection>;\n store: ReturnType<typeof createAIMessageStore>;\n unsubscribeConnection: () => void;\n unsubscribeStore: () => void;\n } = {\n connection,\n store,\n unsubscribeConnection,\n unsubscribeStore,\n };\n this.connections.set(path, entry);\n\n const send = (content: string, attachments?: AIAttachment[]) => {\n const convId = activeConversationIdSignal() ?? generateId();\n const msgId = generateId();\n\n store.dispatch({\n attachments,\n content,\n conversationId: convId,\n messageId: msgId,\n type: \"send\",\n });\n\n connection.send({\n attachments,\n content,\n conversationId: convId,\n messageId: msgId,\n type: \"message\",\n });\n };\n\n const cancel = () => {\n const convId = activeConversationIdSignal();\n if (convId) {\n store.dispatch({ type: \"cancel\" });\n connection.send({ conversationId: convId, type: \"cancel\" });\n }\n };\n\n const branch = (messageId: string, content: string) => {\n const convId = activeConversationIdSignal();\n if (convId) {\n connection.send({\n content,\n conversationId: convId,\n messageId,\n type: \"branch\",\n });\n }\n };\n\n return {\n branch,\n cancel,\n error: computed(() => errorSignal()),\n isStreaming: computed(() => isStreamingSignal()),\n messages: computed(() => messagesSignal()),\n send,\n };\n }\n\n private createHandle(\n entry: {\n connection: ReturnType<typeof createAIConnection>;\n store: ReturnType<typeof createAIMessageStore>;\n },\n conversationId?: string,\n ) {\n const { connection, store } = entry;\n\n const messagesSignal = signal<AIMessage[]>([]);\n const isStreamingSignal = signal(false);\n const errorSignal = signal<string | null>(null);\n const activeConversationIdSignal = signal<string | null>(\n conversationId ?? null,\n );\n\n store.subscribe(() => {\n const snapshot = store.getSnapshot();\n const convId =\n activeConversationIdSignal() ?? snapshot.activeConversationId;\n const conversation = convId\n ? snapshot.conversations.get(convId)\n : undefined;\n messagesSignal.set(conversation?.messages ?? []);\n isStreamingSignal.set(snapshot.isStreaming);\n errorSignal.set(snapshot.error);\n if (convId) {\n activeConversationIdSignal.set(convId);\n }\n });\n\n const send = (content: string, attachments?: AIAttachment[]) => {\n const convId = activeConversationIdSignal() ?? generateId();\n const msgId = generateId();\n\n store.dispatch({\n attachments,\n content,\n conversationId: convId,\n messageId: msgId,\n type: \"send\",\n });\n\n connection.send({\n attachments,\n content,\n conversationId: convId,\n messageId: msgId,\n type: \"message\",\n });\n };\n\n const cancel = () => {\n const convId = activeConversationIdSignal();\n if (convId) {\n store.dispatch({ type: \"cancel\" });\n connection.send({ conversationId: convId, type: \"cancel\" });\n }\n };\n\n const branch = (messageId: string, content: string) => {\n const convId = activeConversationIdSignal();\n if (convId) {\n connection.send({\n content,\n conversationId: convId,\n messageId,\n type: \"branch\",\n });\n }\n };\n\n return {\n branch,\n cancel,\n error: computed(() => errorSignal()),\n isStreaming: computed(() => isStreamingSignal()),\n messages: computed(() => messagesSignal()),\n send,\n };\n }\n\n ngOnDestroy() {\n for (const [, entry] of this.connections) {\n entry.unsubscribeConnection();\n entry.unsubscribeStore();\n entry.connection.close();\n }\n this.connections.clear();\n }\n}\n",
|
|
6
|
+
"import type { AIServerMessage } from \"../../../types/ai\";\n\nexport const serverMessageToAction = (message: AIServerMessage) => {\n switch (message.type) {\n case \"chunk\":\n return {\n content: message.content,\n conversationId: message.conversationId,\n messageId: message.messageId,\n type: \"chunk\" as const,\n };\n case \"thinking\":\n return {\n content: message.content,\n conversationId: message.conversationId,\n messageId: message.messageId,\n type: \"thinking\" as const,\n };\n case \"tool_status\":\n return {\n conversationId: message.conversationId,\n input: message.input,\n messageId: message.messageId,\n name: message.name,\n result: message.result,\n status: message.status,\n type: \"tool_status\" as const,\n };\n case \"image\":\n return {\n conversationId: message.conversationId,\n data: message.data,\n format: message.format,\n imageId: message.imageId,\n isPartial: message.isPartial,\n messageId: message.messageId,\n revisedPrompt: message.revisedPrompt,\n type: \"image\" as const,\n };\n case \"complete\":\n return {\n conversationId: message.conversationId,\n durationMs: message.durationMs,\n messageId: message.messageId,\n model: message.model,\n sources: message.sources,\n type: \"complete\" as const,\n usage: message.usage,\n };\n case \"turn_queued\":\n return {\n conversationId: message.conversationId,\n messageId: message.messageId,\n position: message.position,\n type: \"turn_queued\" as const,\n };\n case \"turn_started\":\n return {\n conversationId: message.conversationId,\n messageId: message.messageId,\n type: \"turn_started\" as const,\n };\n case \"branched\":\n return {\n content: message.content,\n fromMessageId: message.fromMessageId,\n messageId: message.messageId,\n newConversationId: message.newConversationId,\n oldConversationId: message.oldConversationId,\n type: \"branch\" as const,\n };\n case \"rag_retrieving\":\n return {\n conversationId: message.conversationId,\n messageId: message.messageId,\n retrievalStartedAt: message.retrievalStartedAt,\n type: \"rag_retrieving\" as const,\n };\n case \"rag_retrieved\":\n return {\n conversationId: message.conversationId,\n messageId: message.messageId,\n retrievalDurationMs: message.retrievalDurationMs,\n retrievalStartedAt: message.retrievalStartedAt,\n retrievedAt: message.retrievedAt,\n sources: message.sources,\n trace: message.trace,\n type: \"rag_retrieved\" as const,\n };\n case \"error\":\n return { message: message.message, type: \"error\" as const };\n default:\n return null;\n }\n};\n",
|
|
7
|
+
"import type { AIClientMessage, AIServerMessage } from \"./ai\";\n\nexport const isValidAIClientMessage = (\n data: unknown,\n): data is AIClientMessage => {\n if (!data || typeof data !== \"object\") {\n return false;\n }\n\n if (!(\"type\" in data) || typeof data.type !== \"string\") {\n return false;\n }\n\n switch (data.type) {\n case \"message\":\n return \"content\" in data && typeof data.content === \"string\";\n case \"cancel\":\n return (\n \"conversationId\" in data && typeof data.conversationId === \"string\"\n );\n case \"branch\":\n return (\n \"messageId\" in data &&\n typeof data.messageId === \"string\" &&\n \"content\" in data &&\n typeof data.content === \"string\" &&\n \"conversationId\" in data &&\n typeof data.conversationId === \"string\"\n );\n default:\n return false;\n }\n};\n\nexport const isValidAIServerMessage = (\n data: unknown,\n): data is AIServerMessage => {\n if (!data || typeof data !== \"object\") {\n return false;\n }\n\n if (!(\"type\" in data) || typeof data.type !== \"string\") {\n return false;\n }\n\n switch (data.type) {\n case \"chunk\":\n case \"thinking\":\n return (\n \"content\" in data &&\n typeof data.content === \"string\" &&\n \"messageId\" in data &&\n \"conversationId\" in data\n );\n case \"tool_status\":\n return (\n \"name\" in data &&\n \"status\" in data &&\n \"messageId\" in data &&\n \"conversationId\" in data\n );\n case \"image\":\n return (\n \"data\" in data &&\n typeof data.data === \"string\" &&\n \"format\" in data &&\n typeof data.format === \"string\" &&\n \"isPartial\" in data &&\n typeof data.isPartial === \"boolean\" &&\n \"messageId\" in data &&\n \"conversationId\" in data\n );\n case \"complete\":\n return \"messageId\" in data && \"conversationId\" in data;\n case \"turn_queued\":\n return (\n \"conversationId\" in data &&\n typeof data.conversationId === \"string\" &&\n \"messageId\" in data &&\n typeof data.messageId === \"string\" &&\n \"position\" in data &&\n typeof data.position === \"number\"\n );\n case \"turn_started\":\n return (\n \"conversationId\" in data &&\n typeof data.conversationId === \"string\" &&\n \"messageId\" in data &&\n typeof data.messageId === \"string\"\n );\n case \"branched\":\n return (\n \"content\" in data &&\n typeof data.content === \"string\" &&\n \"fromMessageId\" in data &&\n typeof data.fromMessageId === \"string\" &&\n \"messageId\" in data &&\n typeof data.messageId === \"string\" &&\n \"newConversationId\" in data &&\n typeof data.newConversationId === \"string\" &&\n \"oldConversationId\" in data &&\n typeof data.oldConversationId === \"string\"\n );\n case \"rag_retrieved\":\n return (\n \"conversationId\" in data &&\n \"messageId\" in data &&\n \"sources\" in data &&\n Array.isArray(data.sources)\n );\n case \"error\":\n return \"message\" in data && typeof data.message === \"string\";\n default:\n return false;\n }\n};\n",
|
|
8
8
|
"import type {\n AIClientMessage,\n AIConnectionOptions,\n AIServerMessage,\n} from \"../../../types/ai\";\nimport { isValidAIServerMessage } from \"../../../types/typeGuards\";\n\nconst WS_OPEN = 1;\nconst WS_NORMAL_CLOSURE = 1000;\nconst WS_CLOSED = 3;\nconst DEFAULT_PING_INTERVAL = 30_000;\nconst RECONNECT_INITIAL_DELAY = 500;\nconst RECONNECT_POLL_INTERVAL = 300;\nconst DEFAULT_MAX_RECONNECT_ATTEMPTS = 60;\n\ntype AIConnectionState = {\n isConnected: boolean;\n pendingMessages: string[];\n pingInterval: ReturnType<typeof setInterval> | null;\n reconnectAttempts: number;\n reconnectTimeout: ReturnType<typeof setTimeout> | null;\n ws: WebSocket | null;\n};\n\ntype AIConnectionHandle = {\n close: () => void;\n getReadyState: () => number;\n send: (msg: AIClientMessage) => void;\n subscribe: (callback: (msg: AIServerMessage) => void) => () => void;\n};\n\n// eslint-disable-next-line no-empty-function\nconst noop = () => {};\nconst noopUnsubscribe = () => noop;\n\nconst NOOP_CONNECTION: AIConnectionHandle = {\n close: noop,\n send: noop,\n subscribe: noopUnsubscribe,\n getReadyState: () => WS_CLOSED,\n};\n\nconst buildWsUrl = (path: string) => {\n const { hostname, port, protocol } = window.location;\n const wsProtocol = protocol === \"https:\" ? \"wss:\" : \"ws:\";\n const portSuffix = port ? `:${port}` : \"\";\n\n return `${wsProtocol}//${hostname}${portSuffix}${path}`;\n};\n\nconst parseServerMessage = (event: MessageEvent) => {\n let data: unknown;\n\n try {\n data = JSON.parse(String(event.data));\n } catch {\n return null;\n }\n\n if (\n data &&\n typeof data === \"object\" &&\n \"type\" in data &&\n data.type === \"pong\"\n ) {\n return null;\n }\n\n if (!isValidAIServerMessage(data)) {\n return null;\n }\n\n return data;\n};\n\nexport const createAIConnection = (\n path: string,\n options: AIConnectionOptions = {},\n) => {\n if (typeof window === \"undefined\") {\n return NOOP_CONNECTION;\n }\n\n const shouldReconnect = options.reconnect !== false;\n const pingInterval = options.pingInterval ?? DEFAULT_PING_INTERVAL;\n const maxReconnectAttempts =\n options.maxReconnectAttempts ?? DEFAULT_MAX_RECONNECT_ATTEMPTS;\n\n const listeners = new Set<(msg: AIServerMessage) => void>();\n\n const connState: AIConnectionState = {\n isConnected: false,\n pendingMessages: [],\n pingInterval: null,\n reconnectAttempts: 0,\n reconnectTimeout: null,\n ws: null,\n };\n\n const flushPendingMessages = () => {\n if (connState.ws?.readyState !== WS_OPEN) {\n return;\n }\n\n while (connState.pendingMessages.length > 0) {\n const next = connState.pendingMessages.shift();\n if (typeof next === \"string\") {\n connState.ws.send(next);\n }\n }\n };\n\n const clearTimers = () => {\n if (connState.pingInterval) {\n clearInterval(connState.pingInterval);\n connState.pingInterval = null;\n }\n\n if (connState.reconnectTimeout) {\n clearTimeout(connState.reconnectTimeout);\n connState.reconnectTimeout = null;\n }\n };\n\n const scheduleReconnect = () => {\n connState.reconnectAttempts++;\n const delay =\n connState.reconnectAttempts === 1\n ? RECONNECT_INITIAL_DELAY\n : RECONNECT_POLL_INTERVAL;\n\n connState.reconnectTimeout = setTimeout(() => {\n if (connState.reconnectAttempts > maxReconnectAttempts) {\n return;\n }\n\n connect();\n }, delay);\n };\n\n const connect = () => {\n const url = buildWsUrl(path);\n const wsInstance = new WebSocket(url, options.protocols);\n\n wsInstance.onopen = () => {\n connState.isConnected = true;\n connState.reconnectAttempts = 0;\n flushPendingMessages();\n\n connState.pingInterval = setInterval(() => {\n if (wsInstance.readyState === WS_OPEN && connState.isConnected) {\n wsInstance.send(JSON.stringify({ type: \"ping\" }));\n }\n }, pingInterval);\n };\n\n wsInstance.onmessage = (event: MessageEvent) => {\n const message = parseServerMessage(event);\n\n if (!message) {\n return;\n }\n\n listeners.forEach((listener) => listener(message));\n };\n\n wsInstance.onclose = (event: CloseEvent) => {\n connState.isConnected = false;\n clearTimers();\n\n const shouldAttemptReconnect =\n shouldReconnect &&\n event.code !== WS_NORMAL_CLOSURE &&\n connState.reconnectAttempts < maxReconnectAttempts;\n\n if (shouldAttemptReconnect) {\n scheduleReconnect();\n }\n };\n\n wsInstance.onerror = () => {\n // Error is followed by close event, reconnection handled there\n };\n\n connState.ws = wsInstance;\n };\n\n const send = (msg: AIClientMessage) => {\n const serialized = JSON.stringify(msg);\n\n if (connState.ws?.readyState === WS_OPEN) {\n connState.ws.send(serialized);\n\n return;\n }\n\n connState.pendingMessages.push(serialized);\n };\n\n const subscribe = (callback: (msg: AIServerMessage) => void) => {\n listeners.add(callback);\n\n return () => {\n listeners.delete(callback);\n };\n };\n\n const close = () => {\n clearTimers();\n\n if (connState.ws) {\n connState.ws.close(WS_NORMAL_CLOSURE);\n connState.ws = null;\n }\n\n connState.isConnected = false;\n listeners.clear();\n };\n\n const getReadyState = () => connState.ws?.readyState ?? WS_CLOSED;\n\n connect();\n\n return { close, getReadyState, send, subscribe };\n};\n",
|
|
9
|
-
"import type {\n AIConversation,\n RAGSource,\n AIImageData,\n AIMessage,\n AIStreamState,\n AIStoreAction,\n AIToolCall,\n} from \"../../../types/ai\";\n\nconst EMPTY_STATE: AIStreamState = {\n activeConversationId: null,\n conversations: new Map(),\n error: null,\n isStreaming: false,\n};\n\nconst initialActiveConversationId: string | null = null;\nconst initialError: string | null = null;\n\n// eslint-disable-next-line absolute/no-useless-function -- returns a new instance each call\nconst freshState = () => ({\n activeConversationId: initialActiveConversationId,\n conversations: new Map<string, AIConversation>(),\n error: initialError,\n isStreaming: false,\n});\n\nconst findAssistantMessage = (\n conversation: AIConversation,\n messageId: string,\n) =>\n conversation.messages.find(\n (msg) => msg.id === messageId && msg.role === \"assistant\",\n );\n\nconst getOrCreate = (state: AIStreamState, conversationId: string) => {\n let conversation = state.conversations.get(conversationId);\n\n if (!conversation) {\n conversation = {\n createdAt: Date.now(),\n id: conversationId,\n messages: [],\n };\n state.conversations.set(conversationId, conversation);\n }\n\n return conversation;\n};\n\nconst handleSend = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"send\" },\n) => {\n const conversation = getOrCreate(state, action.conversationId);\n const message: AIMessage = {\n attachments: action.attachments,\n content: action.content,\n conversationId: action.conversationId,\n id: action.messageId,\n role: \"user\",\n timestamp: Date.now(),\n };\n\n conversation.messages = [...conversation.messages, message];\n state.activeConversationId = action.conversationId;\n state.error = null;\n state.isStreaming = true;\n};\n\nconst handleChunk = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"chunk\" },\n) => {\n const conversation = getOrCreate(state, action.conversationId);\n const existingIdx = conversation.messages.findIndex(\n (msg) => msg.id === action.messageId && msg.role === \"assistant\",\n );\n\n if (existingIdx >= 0) {\n const prevContent = conversation.messages[existingIdx]?.content ?? \"\";\n conversation.messages = conversation.messages.map((msg, idx) =>\n idx === existingIdx\n ? { ...msg, content: prevContent + action.content }\n : msg,\n );\n\n return;\n }\n\n const message: AIMessage = {\n content: action.content,\n conversationId: action.conversationId,\n id: action.messageId,\n isStreaming: true,\n role: \"assistant\",\n timestamp: Date.now(),\n };\n\n conversation.messages = [...conversation.messages, message];\n};\n\nconst handleThinking = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"thinking\" },\n) => {\n const conversation = getOrCreate(state, action.conversationId);\n const existingIdx = conversation.messages.findIndex(\n (msg) => msg.id === action.messageId && msg.role === \"assistant\",\n );\n\n if (existingIdx >= 0) {\n const prevThinking = conversation.messages[existingIdx]?.thinking ?? \"\";\n conversation.messages = conversation.messages.map((msg, idx) =>\n idx === existingIdx\n ? { ...msg, thinking: prevThinking + action.content }\n : msg,\n );\n\n return;\n }\n\n const message: AIMessage = {\n content: \"\",\n conversationId: action.conversationId,\n id: action.messageId,\n isStreaming: true,\n role: \"assistant\",\n thinking: action.content,\n timestamp: Date.now(),\n };\n\n conversation.messages = [...conversation.messages, message];\n};\n\nconst upsertToolCall = (message: AIMessage, toolCall: AIToolCall) => {\n if (!message.toolCalls) {\n message.toolCalls = [toolCall];\n\n return;\n }\n\n const existingIdx = message.toolCalls.findIndex(\n (existing) => existing.name === toolCall.name,\n );\n\n if (existingIdx >= 0) {\n message.toolCalls[existingIdx] = toolCall;\n } else {\n message.toolCalls = [...message.toolCalls, toolCall];\n }\n};\n\nconst getOrCreateAssistantMessage = (\n conversation: AIConversation,\n messageId: string,\n conversationId: string,\n) => {\n const existing = findAssistantMessage(conversation, messageId);\n\n if (existing) {\n return existing;\n }\n\n const message: AIMessage = {\n content: \"\",\n conversationId,\n id: messageId,\n isStreaming: true,\n role: \"assistant\",\n timestamp: Date.now(),\n };\n conversation.messages = [...conversation.messages, message];\n\n return message;\n};\n\nconst handleRAGRetrieved = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"rag_retrieved\" },\n) => {\n const conversation = getOrCreate(state, action.conversationId);\n const message = getOrCreateAssistantMessage(\n conversation,\n action.messageId,\n action.conversationId,\n );\n\n message.sources = action.sources;\n message.retrievalStartedAt =\n action.retrievalStartedAt ?? message.retrievalStartedAt;\n message.retrievedAt = action.retrievedAt;\n message.retrievalDurationMs = action.retrievalDurationMs;\n message.retrievalTrace = action.trace;\n conversation.messages = [...conversation.messages];\n};\n\nconst handleRAGRetrieving = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"rag_retrieving\" },\n) => {\n const conversation = getOrCreate(state, action.conversationId);\n const message = getOrCreateAssistantMessage(\n conversation,\n action.messageId,\n action.conversationId,\n );\n\n message.retrievalStartedAt = action.retrievalStartedAt;\n conversation.messages = [...conversation.messages];\n};\n\nconst handleToolStatus = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"tool_status\" },\n) => {\n const conversation = getOrCreate(state, action.conversationId);\n const message = getOrCreateAssistantMessage(\n conversation,\n action.messageId,\n action.conversationId,\n );\n\n const toolCall: AIToolCall = {\n id: action.messageId,\n input: action.input,\n name: action.name,\n result: action.status === \"complete\" ? (action.result ?? \"\") : undefined,\n };\n\n upsertToolCall(message, toolCall);\n conversation.messages = [...conversation.messages];\n};\n\nconst markMessageComplete = (\n conversation: AIConversation,\n messageId: string,\n usage?: { inputTokens: number; outputTokens: number },\n durationMs?: number,\n model?: string,\n sources?: RAGSource[],\n) => {\n conversation.messages = conversation.messages.map((msg) =>\n msg.id === messageId && msg.role === \"assistant\"\n ? {\n ...msg,\n durationMs,\n isStreaming: false,\n model,\n sources: sources ?? msg.sources,\n usage,\n }\n : msg,\n );\n};\n\nconst NOT_FOUND = -1;\n\nconst findExistingImageById = (\n images: AIImageData[],\n imageId: string | undefined,\n) => {\n if (!imageId) return NOT_FOUND;\n\n return images.findIndex((img) => img.imageId === imageId);\n};\n\nconst findReplaceablePartialIndex = (images: AIImageData[]) => {\n const lastIdx = images.length - 1;\n\n if (lastIdx >= 0 && images[lastIdx]?.isPartial) {\n return lastIdx;\n }\n\n return NOT_FOUND;\n};\n\nconst upsertImage = (message: AIMessage, imageData: AIImageData) => {\n if (!message.images) {\n message.images = [imageData];\n\n return;\n }\n\n const existingIdx = findExistingImageById(message.images, imageData.imageId);\n\n if (existingIdx >= 0) {\n message.images[existingIdx] = imageData;\n\n return;\n }\n\n const replaceableIdx = findReplaceablePartialIndex(message.images);\n\n if (replaceableIdx >= 0) {\n message.images[replaceableIdx] = imageData;\n\n return;\n }\n\n message.images = [...message.images, imageData];\n};\n\nconst handleImage = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"image\" },\n) => {\n const conversation = getOrCreate(state, action.conversationId);\n const message = getOrCreateAssistantMessage(\n conversation,\n action.messageId,\n action.conversationId,\n );\n\n upsertImage(message, {\n data: action.data,\n format: action.format,\n imageId: action.imageId,\n isPartial: action.isPartial,\n revisedPrompt: action.revisedPrompt,\n });\n\n conversation.messages = [...conversation.messages];\n};\n\nconst handleComplete = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"complete\" },\n) => {\n const conversation = state.conversations.get(action.conversationId);\n\n if (conversation) {\n markMessageComplete(\n conversation,\n action.messageId,\n action.usage,\n action.durationMs,\n action.model,\n action.sources,\n );\n }\n\n state.isStreaming = false;\n};\n\nconst markConversationStreamsComplete = (conversation: AIConversation) => {\n const streamingMessages = conversation.messages.filter(\n (msg) => msg.isStreaming,\n );\n\n if (streamingMessages.length === 0) {\n return;\n }\n\n for (const msg of streamingMessages) {\n msg.isStreaming = false;\n }\n\n conversation.messages = [...conversation.messages];\n};\n\nconst markAllStreamsComplete = (state: AIStreamState) => {\n for (const [, conversation] of state.conversations) {\n markConversationStreamsComplete(conversation);\n }\n};\n\nconst handleBranch = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"branch\" },\n) => {\n const source = state.conversations.get(action.oldConversationId);\n\n if (!source) {\n return;\n }\n\n const cutoffIndex = source.messages.findIndex(\n (msg) => msg.id === action.fromMessageId,\n );\n\n if (cutoffIndex < 0) {\n return;\n }\n\n const branchedMessages = source.messages\n .slice(0, cutoffIndex + 1)\n .map((msg) => ({ ...msg, conversationId: action.newConversationId }));\n\n const newConversation: AIConversation = {\n createdAt: Date.now(),\n id: action.newConversationId,\n messages: branchedMessages,\n };\n\n state.conversations.set(action.newConversationId, newConversation);\n state.activeConversationId = action.newConversationId;\n};\n\nconst applyAction = (state: AIStreamState, action: AIStoreAction) => {\n switch (action.type) {\n case \"send\":\n handleSend(state, action);\n break;\n case \"chunk\":\n handleChunk(state, action);\n break;\n case \"thinking\":\n handleThinking(state, action);\n break;\n case \"tool_status\":\n handleToolStatus(state, action);\n break;\n case \"image\":\n handleImage(state, action);\n break;\n case \"complete\":\n handleComplete(state, action);\n break;\n case \"error\":\n state.error = action.message;\n state.isStreaming = false;\n break;\n case \"rag_retrieving\":\n handleRAGRetrieving(state, action);\n break;\n case \"rag_retrieved\":\n handleRAGRetrieved(state, action);\n break;\n case \"cancel\":\n state.isStreaming = false;\n markAllStreamsComplete(state);\n break;\n case \"branch\":\n handleBranch(state, action);\n break;\n case \"set_conversation\":\n state.activeConversationId = action.conversationId;\n break;\n }\n};\n\nexport const createAIMessageStore = () => {\n let state = freshState();\n const subscribers = new Set<() => void>();\n\n return {\n dispatch: (action: AIStoreAction) => {\n applyAction(state, action);\n // New reference so useSyncExternalStore detects the change\n state = { ...state, conversations: new Map(state.conversations) };\n subscribers.forEach((callback) => callback());\n },\n getServerSnapshot: () => EMPTY_STATE,\n getSnapshot: () => state,\n subscribe: (callback: () => void) => {\n subscribers.add(callback);\n\n return () => {\n subscribers.delete(callback);\n };\n },\n };\n};\n",
|
|
9
|
+
"import type {\n AIConversation,\n RAGSource,\n AIImageData,\n AIMessage,\n AIStreamState,\n AIStoreAction,\n AIToolCall,\n} from \"../../../types/ai\";\n\nconst EMPTY_STATE: AIStreamState = {\n activeConversationId: null,\n conversations: new Map(),\n error: null,\n isStreaming: false,\n};\n\nconst initialActiveConversationId: string | null = null;\nconst initialError: string | null = null;\n\n// eslint-disable-next-line absolute/no-useless-function -- returns a new instance each call\nconst freshState = () => ({\n activeConversationId: initialActiveConversationId,\n conversations: new Map<string, AIConversation>(),\n error: initialError,\n isStreaming: false,\n});\n\nconst findAssistantMessage = (\n conversation: AIConversation,\n messageId: string,\n) =>\n conversation.messages.find(\n (msg) => msg.id === messageId && msg.role === \"assistant\",\n );\n\nconst getOrCreate = (state: AIStreamState, conversationId: string) => {\n let conversation = state.conversations.get(conversationId);\n\n if (!conversation) {\n conversation = {\n createdAt: Date.now(),\n id: conversationId,\n messages: [],\n };\n state.conversations.set(conversationId, conversation);\n }\n\n return conversation;\n};\n\nconst handleSend = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"send\" },\n) => {\n const conversation = getOrCreate(state, action.conversationId);\n const message: AIMessage = {\n attachments: action.attachments,\n content: action.content,\n conversationId: action.conversationId,\n id: action.messageId,\n isQueued: false,\n role: \"user\",\n timestamp: Date.now(),\n };\n\n conversation.messages = [...conversation.messages, message];\n state.activeConversationId = action.conversationId;\n state.error = null;\n state.isStreaming = true;\n};\n\nconst updateUserQueueState = (\n state: AIStreamState,\n conversationId: string,\n messageId: string,\n isQueued: boolean,\n) => {\n const conversation = state.conversations.get(conversationId);\n if (!conversation) return;\n conversation.messages = conversation.messages.map((message) =>\n message.id === messageId && message.role === \"user\"\n ? { ...message, isQueued }\n : message,\n );\n};\n\nconst handleTurnQueued = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"turn_queued\" },\n) => {\n updateUserQueueState(state, action.conversationId, action.messageId, true);\n};\n\nconst handleTurnStarted = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"turn_started\" },\n) => {\n updateUserQueueState(state, action.conversationId, action.messageId, false);\n state.isStreaming = true;\n};\n\nconst handleChunk = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"chunk\" },\n) => {\n const conversation = getOrCreate(state, action.conversationId);\n const existingIdx = conversation.messages.findIndex(\n (msg) => msg.id === action.messageId && msg.role === \"assistant\",\n );\n\n if (existingIdx >= 0) {\n const prevContent = conversation.messages[existingIdx]?.content ?? \"\";\n conversation.messages = conversation.messages.map((msg, idx) =>\n idx === existingIdx\n ? { ...msg, content: prevContent + action.content }\n : msg,\n );\n\n return;\n }\n\n const message: AIMessage = {\n content: action.content,\n conversationId: action.conversationId,\n id: action.messageId,\n isStreaming: true,\n role: \"assistant\",\n timestamp: Date.now(),\n };\n\n conversation.messages = [...conversation.messages, message];\n};\n\nconst handleThinking = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"thinking\" },\n) => {\n const conversation = getOrCreate(state, action.conversationId);\n const existingIdx = conversation.messages.findIndex(\n (msg) => msg.id === action.messageId && msg.role === \"assistant\",\n );\n\n if (existingIdx >= 0) {\n const prevThinking = conversation.messages[existingIdx]?.thinking ?? \"\";\n conversation.messages = conversation.messages.map((msg, idx) =>\n idx === existingIdx\n ? { ...msg, thinking: prevThinking + action.content }\n : msg,\n );\n\n return;\n }\n\n const message: AIMessage = {\n content: \"\",\n conversationId: action.conversationId,\n id: action.messageId,\n isStreaming: true,\n role: \"assistant\",\n thinking: action.content,\n timestamp: Date.now(),\n };\n\n conversation.messages = [...conversation.messages, message];\n};\n\nconst upsertToolCall = (message: AIMessage, toolCall: AIToolCall) => {\n if (!message.toolCalls) {\n message.toolCalls = [toolCall];\n\n return;\n }\n\n const existingIdx = message.toolCalls.findIndex(\n (existing) => existing.name === toolCall.name,\n );\n\n if (existingIdx >= 0) {\n message.toolCalls[existingIdx] = toolCall;\n } else {\n message.toolCalls = [...message.toolCalls, toolCall];\n }\n};\n\nconst getOrCreateAssistantMessage = (\n conversation: AIConversation,\n messageId: string,\n conversationId: string,\n) => {\n const existing = findAssistantMessage(conversation, messageId);\n\n if (existing) {\n return existing;\n }\n\n const message: AIMessage = {\n content: \"\",\n conversationId,\n id: messageId,\n isStreaming: true,\n role: \"assistant\",\n timestamp: Date.now(),\n };\n conversation.messages = [...conversation.messages, message];\n\n return message;\n};\n\nconst handleRAGRetrieved = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"rag_retrieved\" },\n) => {\n const conversation = getOrCreate(state, action.conversationId);\n const message = getOrCreateAssistantMessage(\n conversation,\n action.messageId,\n action.conversationId,\n );\n\n message.sources = action.sources;\n message.retrievalStartedAt =\n action.retrievalStartedAt ?? message.retrievalStartedAt;\n message.retrievedAt = action.retrievedAt;\n message.retrievalDurationMs = action.retrievalDurationMs;\n message.retrievalTrace = action.trace;\n conversation.messages = [...conversation.messages];\n};\n\nconst handleRAGRetrieving = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"rag_retrieving\" },\n) => {\n const conversation = getOrCreate(state, action.conversationId);\n const message = getOrCreateAssistantMessage(\n conversation,\n action.messageId,\n action.conversationId,\n );\n\n message.retrievalStartedAt = action.retrievalStartedAt;\n conversation.messages = [...conversation.messages];\n};\n\nconst handleToolStatus = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"tool_status\" },\n) => {\n const conversation = getOrCreate(state, action.conversationId);\n const message = getOrCreateAssistantMessage(\n conversation,\n action.messageId,\n action.conversationId,\n );\n\n const toolCall: AIToolCall = {\n id: action.messageId,\n input: action.input,\n name: action.name,\n result: action.status === \"complete\" ? (action.result ?? \"\") : undefined,\n };\n\n upsertToolCall(message, toolCall);\n conversation.messages = [...conversation.messages];\n};\n\nconst markMessageComplete = (\n conversation: AIConversation,\n messageId: string,\n usage?: { inputTokens: number; outputTokens: number },\n durationMs?: number,\n model?: string,\n sources?: RAGSource[],\n) => {\n conversation.messages = conversation.messages.map((msg) =>\n msg.id === messageId && msg.role === \"assistant\"\n ? {\n ...msg,\n durationMs,\n isStreaming: false,\n model,\n sources: sources ?? msg.sources,\n usage,\n }\n : msg,\n );\n};\n\nconst NOT_FOUND = -1;\n\nconst findExistingImageById = (\n images: AIImageData[],\n imageId: string | undefined,\n) => {\n if (!imageId) return NOT_FOUND;\n\n return images.findIndex((img) => img.imageId === imageId);\n};\n\nconst findReplaceablePartialIndex = (images: AIImageData[]) => {\n const lastIdx = images.length - 1;\n\n if (lastIdx >= 0 && images[lastIdx]?.isPartial) {\n return lastIdx;\n }\n\n return NOT_FOUND;\n};\n\nconst upsertImage = (message: AIMessage, imageData: AIImageData) => {\n if (!message.images) {\n message.images = [imageData];\n\n return;\n }\n\n const existingIdx = findExistingImageById(message.images, imageData.imageId);\n\n if (existingIdx >= 0) {\n message.images[existingIdx] = imageData;\n\n return;\n }\n\n const replaceableIdx = findReplaceablePartialIndex(message.images);\n\n if (replaceableIdx >= 0) {\n message.images[replaceableIdx] = imageData;\n\n return;\n }\n\n message.images = [...message.images, imageData];\n};\n\nconst handleImage = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"image\" },\n) => {\n const conversation = getOrCreate(state, action.conversationId);\n const message = getOrCreateAssistantMessage(\n conversation,\n action.messageId,\n action.conversationId,\n );\n\n upsertImage(message, {\n data: action.data,\n format: action.format,\n imageId: action.imageId,\n isPartial: action.isPartial,\n revisedPrompt: action.revisedPrompt,\n });\n\n conversation.messages = [...conversation.messages];\n};\n\nconst handleComplete = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"complete\" },\n) => {\n const conversation = state.conversations.get(action.conversationId);\n\n if (conversation) {\n markMessageComplete(\n conversation,\n action.messageId,\n action.usage,\n action.durationMs,\n action.model,\n action.sources,\n );\n }\n\n state.isStreaming = false;\n};\n\nconst markConversationStreamsComplete = (conversation: AIConversation) => {\n const streamingMessages = conversation.messages.filter(\n (msg) => msg.isStreaming,\n );\n\n if (streamingMessages.length === 0) {\n return;\n }\n\n for (const msg of streamingMessages) {\n msg.isStreaming = false;\n }\n\n conversation.messages = [...conversation.messages];\n};\n\nconst markAllStreamsComplete = (state: AIStreamState) => {\n for (const [, conversation] of state.conversations) {\n markConversationStreamsComplete(conversation);\n }\n};\n\nconst handleBranch = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"branch\" },\n) => {\n const source = state.conversations.get(action.oldConversationId);\n\n if (!source) {\n return;\n }\n\n const cutoffIndex = source.messages.findIndex(\n (msg) => msg.id === action.fromMessageId,\n );\n\n if (cutoffIndex < 0) {\n return;\n }\n\n const branchedMessages = source.messages\n .slice(0, cutoffIndex + 1)\n .map((msg) => ({ ...msg, conversationId: action.newConversationId }));\n\n const newConversation: AIConversation = {\n createdAt: Date.now(),\n id: action.newConversationId,\n messages: [\n ...branchedMessages,\n {\n content: action.content,\n conversationId: action.newConversationId,\n id: action.messageId,\n isQueued: false,\n role: \"user\",\n timestamp: Date.now(),\n },\n ],\n };\n\n state.conversations.set(action.newConversationId, newConversation);\n state.activeConversationId = action.newConversationId;\n state.isStreaming = true;\n};\n\nconst applyAction = (state: AIStreamState, action: AIStoreAction) => {\n switch (action.type) {\n case \"send\":\n handleSend(state, action);\n break;\n case \"chunk\":\n handleChunk(state, action);\n break;\n case \"thinking\":\n handleThinking(state, action);\n break;\n case \"tool_status\":\n handleToolStatus(state, action);\n break;\n case \"image\":\n handleImage(state, action);\n break;\n case \"complete\":\n handleComplete(state, action);\n break;\n case \"turn_queued\":\n handleTurnQueued(state, action);\n break;\n case \"turn_started\":\n handleTurnStarted(state, action);\n break;\n case \"error\":\n state.error = action.message;\n state.isStreaming = false;\n break;\n case \"rag_retrieving\":\n handleRAGRetrieving(state, action);\n break;\n case \"rag_retrieved\":\n handleRAGRetrieved(state, action);\n break;\n case \"cancel\":\n state.isStreaming = false;\n markAllStreamsComplete(state);\n break;\n case \"branch\":\n handleBranch(state, action);\n break;\n case \"set_conversation\":\n state.activeConversationId = action.conversationId;\n break;\n }\n};\n\nexport const createAIMessageStore = () => {\n let state = freshState();\n const subscribers = new Set<() => void>();\n\n return {\n dispatch: (action: AIStoreAction) => {\n applyAction(state, action);\n // New reference so useSyncExternalStore detects the change\n state = { ...state, conversations: new Map(state.conversations) };\n subscribers.forEach((callback) => callback());\n },\n getServerSnapshot: () => EMPTY_STATE,\n getSnapshot: () => state,\n subscribe: (callback: () => void) => {\n subscribers.add(callback);\n\n return () => {\n subscribers.delete(callback);\n };\n },\n };\n};\n",
|
|
10
10
|
"import type { AIServerMessage } from \"../../types/ai\";\nimport { isValidAIClientMessage } from \"../../types/typeGuards\";\n\nexport const generateId = () => crypto.randomUUID();\n\nexport const parseAIMessage = (raw: unknown) => {\n if (raw === null || raw === undefined) {\n return null;\n }\n\n let text: string;\n\n if (typeof raw === \"string\") {\n text = raw;\n } else if (raw instanceof ArrayBuffer) {\n text = new TextDecoder().decode(raw);\n } else if (ArrayBuffer.isView(raw)) {\n text = new TextDecoder().decode(raw);\n } else if (typeof raw === \"object\") {\n if (isValidAIClientMessage(raw)) {\n return raw;\n }\n\n return null;\n } else {\n return null;\n }\n\n try {\n const parsed: unknown = JSON.parse(text);\n\n if (isValidAIClientMessage(parsed)) {\n return parsed;\n }\n\n return null;\n } catch {\n return null;\n }\n};\n\nexport const serializeAIMessage = (message: AIServerMessage) =>\n JSON.stringify(message);\n"
|
|
11
11
|
],
|
|
12
|
-
"mappings": "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",
|
|
13
|
-
"debugId": "
|
|
12
|
+
"mappings": "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",
|
|
13
|
+
"debugId": "8021B9BF4BBDDD3A64756E2164756E21",
|
|
14
14
|
"names": []
|
|
15
15
|
}
|
package/dist/react/ai/index.js
CHANGED
|
@@ -94,6 +94,12 @@ var isValidAIServerMessage = (data) => {
|
|
|
94
94
|
return "data" in data && typeof data.data === "string" && "format" in data && typeof data.format === "string" && "isPartial" in data && typeof data.isPartial === "boolean" && "messageId" in data && "conversationId" in data;
|
|
95
95
|
case "complete":
|
|
96
96
|
return "messageId" in data && "conversationId" in data;
|
|
97
|
+
case "turn_queued":
|
|
98
|
+
return "conversationId" in data && typeof data.conversationId === "string" && "messageId" in data && typeof data.messageId === "string" && "position" in data && typeof data.position === "number";
|
|
99
|
+
case "turn_started":
|
|
100
|
+
return "conversationId" in data && typeof data.conversationId === "string" && "messageId" in data && typeof data.messageId === "string";
|
|
101
|
+
case "branched":
|
|
102
|
+
return "content" in data && typeof data.content === "string" && "fromMessageId" in data && typeof data.fromMessageId === "string" && "messageId" in data && typeof data.messageId === "string" && "newConversationId" in data && typeof data.newConversationId === "string" && "oldConversationId" in data && typeof data.oldConversationId === "string";
|
|
97
103
|
case "rag_retrieved":
|
|
98
104
|
return "conversationId" in data && "messageId" in data && "sources" in data && Array.isArray(data.sources);
|
|
99
105
|
case "error":
|
|
@@ -281,6 +287,7 @@ var handleSend = (state, action) => {
|
|
|
281
287
|
content: action.content,
|
|
282
288
|
conversationId: action.conversationId,
|
|
283
289
|
id: action.messageId,
|
|
290
|
+
isQueued: false,
|
|
284
291
|
role: "user",
|
|
285
292
|
timestamp: Date.now()
|
|
286
293
|
};
|
|
@@ -289,6 +296,19 @@ var handleSend = (state, action) => {
|
|
|
289
296
|
state.error = null;
|
|
290
297
|
state.isStreaming = true;
|
|
291
298
|
};
|
|
299
|
+
var updateUserQueueState = (state, conversationId, messageId, isQueued) => {
|
|
300
|
+
const conversation = state.conversations.get(conversationId);
|
|
301
|
+
if (!conversation)
|
|
302
|
+
return;
|
|
303
|
+
conversation.messages = conversation.messages.map((message) => message.id === messageId && message.role === "user" ? { ...message, isQueued } : message);
|
|
304
|
+
};
|
|
305
|
+
var handleTurnQueued = (state, action) => {
|
|
306
|
+
updateUserQueueState(state, action.conversationId, action.messageId, true);
|
|
307
|
+
};
|
|
308
|
+
var handleTurnStarted = (state, action) => {
|
|
309
|
+
updateUserQueueState(state, action.conversationId, action.messageId, false);
|
|
310
|
+
state.isStreaming = true;
|
|
311
|
+
};
|
|
292
312
|
var handleChunk = (state, action) => {
|
|
293
313
|
const conversation = getOrCreate(state, action.conversationId);
|
|
294
314
|
const existingIdx = conversation.messages.findIndex((msg) => msg.id === action.messageId && msg.role === "assistant");
|
|
@@ -469,10 +489,21 @@ var handleBranch = (state, action) => {
|
|
|
469
489
|
const newConversation = {
|
|
470
490
|
createdAt: Date.now(),
|
|
471
491
|
id: action.newConversationId,
|
|
472
|
-
messages:
|
|
492
|
+
messages: [
|
|
493
|
+
...branchedMessages,
|
|
494
|
+
{
|
|
495
|
+
content: action.content,
|
|
496
|
+
conversationId: action.newConversationId,
|
|
497
|
+
id: action.messageId,
|
|
498
|
+
isQueued: false,
|
|
499
|
+
role: "user",
|
|
500
|
+
timestamp: Date.now()
|
|
501
|
+
}
|
|
502
|
+
]
|
|
473
503
|
};
|
|
474
504
|
state.conversations.set(action.newConversationId, newConversation);
|
|
475
505
|
state.activeConversationId = action.newConversationId;
|
|
506
|
+
state.isStreaming = true;
|
|
476
507
|
};
|
|
477
508
|
var applyAction = (state, action) => {
|
|
478
509
|
switch (action.type) {
|
|
@@ -494,6 +525,12 @@ var applyAction = (state, action) => {
|
|
|
494
525
|
case "complete":
|
|
495
526
|
handleComplete(state, action);
|
|
496
527
|
break;
|
|
528
|
+
case "turn_queued":
|
|
529
|
+
handleTurnQueued(state, action);
|
|
530
|
+
break;
|
|
531
|
+
case "turn_started":
|
|
532
|
+
handleTurnStarted(state, action);
|
|
533
|
+
break;
|
|
497
534
|
case "error":
|
|
498
535
|
state.error = action.message;
|
|
499
536
|
state.isStreaming = false;
|
|
@@ -584,6 +621,28 @@ var serverMessageToAction = (message) => {
|
|
|
584
621
|
type: "complete",
|
|
585
622
|
usage: message.usage
|
|
586
623
|
};
|
|
624
|
+
case "turn_queued":
|
|
625
|
+
return {
|
|
626
|
+
conversationId: message.conversationId,
|
|
627
|
+
messageId: message.messageId,
|
|
628
|
+
position: message.position,
|
|
629
|
+
type: "turn_queued"
|
|
630
|
+
};
|
|
631
|
+
case "turn_started":
|
|
632
|
+
return {
|
|
633
|
+
conversationId: message.conversationId,
|
|
634
|
+
messageId: message.messageId,
|
|
635
|
+
type: "turn_started"
|
|
636
|
+
};
|
|
637
|
+
case "branched":
|
|
638
|
+
return {
|
|
639
|
+
content: message.content,
|
|
640
|
+
fromMessageId: message.fromMessageId,
|
|
641
|
+
messageId: message.messageId,
|
|
642
|
+
newConversationId: message.newConversationId,
|
|
643
|
+
oldConversationId: message.oldConversationId,
|
|
644
|
+
type: "branch"
|
|
645
|
+
};
|
|
587
646
|
case "rag_retrieving":
|
|
588
647
|
return {
|
|
589
648
|
conversationId: message.conversationId,
|
|
@@ -699,6 +758,7 @@ var useAIStream = (path, conversationId) => {
|
|
|
699
758
|
attachments,
|
|
700
759
|
content,
|
|
701
760
|
conversationId: convId,
|
|
761
|
+
messageId: msgId,
|
|
702
762
|
type: "message"
|
|
703
763
|
});
|
|
704
764
|
}, [activeConvId, connection, store]);
|
|
@@ -732,5 +792,5 @@ export {
|
|
|
732
792
|
AIStreamProvider
|
|
733
793
|
};
|
|
734
794
|
|
|
735
|
-
//# debugId=
|
|
795
|
+
//# debugId=386A71808D08C60664756E2164756E21
|
|
736
796
|
//# sourceMappingURL=index.js.map
|