@absolutejs/ai 0.0.50 → 0.0.51
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 +22 -12
- package/dist/ai/client/index.js +30 -1
- package/dist/ai/client/index.js.map +5 -5
- package/dist/ai/index.js +531 -56
- package/dist/ai/index.js.map +15 -15
- package/dist/ai/providers/anthropic.js +100 -25
- package/dist/ai/providers/anthropic.js.map +5 -5
- package/dist/ai/providers/gemini.js +5 -2
- package/dist/ai/providers/gemini.js.map +4 -4
- package/dist/ai/providers/ollama.js +5 -2
- package/dist/ai/providers/ollama.js.map +4 -4
- package/dist/ai/providers/openai.js +56 -10
- package/dist/ai/providers/openai.js.map +5 -5
- package/dist/ai/providers/openaiCompatible.js +56 -10
- package/dist/ai/providers/openaiCompatible.js.map +5 -5
- package/dist/ai/providers/openaiResponses.js +100 -16
- package/dist/ai/providers/openaiResponses.js.map +5 -5
- package/dist/ai/providers/openrouter.js +888 -38
- package/dist/ai/providers/openrouter.js.map +10 -9
- package/dist/angular/ai/index.js +30 -1
- package/dist/angular/ai/index.js.map +5 -5
- package/dist/react/ai/index.js +30 -1
- package/dist/react/ai/index.js.map +5 -5
- package/dist/src/ai/client/actions.d.ts +53 -0
- package/dist/src/ai/errors/providerError.d.ts +3 -0
- package/dist/src/ai/index.d.ts +2 -2
- package/dist/src/ai/providers/openrouter.d.ts +46 -2
- package/dist/src/ai/providers/openrouterClient.d.ts +132 -3
- package/dist/src/ai/streamAIWithTools.d.ts +6 -0
- package/dist/svelte/ai/index.js +30 -1
- package/dist/svelte/ai/index.js.map +5 -5
- package/dist/types/ai.d.ts +54 -3
- package/dist/types/anthropic.d.ts +13 -5
- package/dist/vue/ai/index.js +30 -1
- package/dist/vue/ai/index.js.map +5 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -108,9 +108,11 @@ const provider = openrouter({
|
|
|
108
108
|
});
|
|
109
109
|
```
|
|
110
110
|
|
|
111
|
-
The adapter intentionally has no built-in geopolitical model list.
|
|
112
|
-
|
|
113
|
-
|
|
111
|
+
The adapter intentionally has no built-in geopolitical model list. Omitting
|
|
112
|
+
`allowedModels` exposes the full OpenRouter catalog; applications that need a
|
|
113
|
+
restricted catalog can define their own `allowedModels` and `allowedProviders`
|
|
114
|
+
policy. Avoid `openrouter/auto` under a strict policy unless it is deliberately
|
|
115
|
+
allowed.
|
|
114
116
|
|
|
115
117
|
Provider usage callbacks include OpenRouter's reported `costCredits`,
|
|
116
118
|
`upstreamInferenceCostCredits`, cache-read/write token counts, and reasoning
|
|
@@ -131,6 +133,7 @@ await generateAI({
|
|
|
131
133
|
sessionId: conversationId, // sticky routing improves prompt-cache hits
|
|
132
134
|
serviceTier: "flex", // cheaper, slower capacity when available
|
|
133
135
|
responseCache: { enabled: true, ttlSeconds: 300 },
|
|
136
|
+
trace: { trace_id: workflowId, generation_name: "support-answer" },
|
|
134
137
|
serverTools: [
|
|
135
138
|
{ type: "openrouter:web_search", parameters: { max_results: 3 } },
|
|
136
139
|
],
|
|
@@ -142,10 +145,11 @@ await generateAI({
|
|
|
142
145
|
```
|
|
143
146
|
|
|
144
147
|
Other typed request options include presets, plugins, per-call provider routing,
|
|
145
|
-
message transforms, reasoning
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
148
|
+
message transforms, native reasoning controls, prompt and response caching,
|
|
149
|
+
text-plus-audio output, verbosity, user attribution, and an `extraBody` escape
|
|
150
|
+
hatch for new OpenRouter parameters. The escape hatch cannot replace models,
|
|
151
|
+
fallbacks, providers, presets, messages, plugins, or tools; those fields use
|
|
152
|
+
policy-aware typed options instead.
|
|
149
153
|
|
|
150
154
|
URL images and PDFs, base64 audio, and URL/base64 video inputs use the ordinary
|
|
151
155
|
AbsoluteJS content-block contract. URL citations are emitted as `citation`
|
|
@@ -156,10 +160,14 @@ metadata when reported.
|
|
|
156
160
|
### OpenRouter platform client
|
|
157
161
|
|
|
158
162
|
`createOpenRouterClient()` covers model/provider discovery, embeddings,
|
|
159
|
-
reranking,
|
|
160
|
-
|
|
163
|
+
reranking, streamed and non-streamed image generation, reusable files,
|
|
164
|
+
Responses, speech, transcription, video jobs and downloads, batches, presets,
|
|
165
|
+
credits, key metadata, and generation metadata. It also exports
|
|
166
|
+
`verifyOpenRouterWebhookSignature()` for video completion webhooks. Its typed
|
|
161
167
|
operations enforce the same model allowlist. `request()` and `requestRaw()` are
|
|
162
168
|
forward-compatible access to new or administrative OpenRouter endpoints.
|
|
169
|
+
User-filtered model discovery and ZDR endpoint previews honor the local model
|
|
170
|
+
policy, so catalog UIs cannot accidentally reintroduce filtered models.
|
|
163
171
|
|
|
164
172
|
```ts
|
|
165
173
|
import { createOpenRouterClient } from "@absolutejs/ai/openrouter";
|
|
@@ -170,7 +178,8 @@ const openrouterClient = createOpenRouterClient({
|
|
|
170
178
|
});
|
|
171
179
|
|
|
172
180
|
const models = await openrouterClient.listModels({
|
|
173
|
-
|
|
181
|
+
output_modalities: "all",
|
|
182
|
+
sort: "pricing-low-to-high",
|
|
174
183
|
});
|
|
175
184
|
const embedding = await openrouterClient.createEmbedding({
|
|
176
185
|
model: "openai/text-embedding-3-small",
|
|
@@ -193,5 +202,6 @@ used alongside this package for its complete organization, SSO, SCIM, BYOK, and
|
|
|
193
202
|
analytics type surface.
|
|
194
203
|
|
|
195
204
|
Use `openrouterResponses(config)` when an AbsoluteJS agent should stream through
|
|
196
|
-
OpenRouter's stateless Responses API
|
|
197
|
-
same model/provider policies
|
|
205
|
+
OpenRouter's stateless Responses API, or `openrouterMessages(config)` for the
|
|
206
|
+
native Anthropic Messages protocol. Both accept the same model/provider policies
|
|
207
|
+
and `providerOptions.openrouter` controls, including replayable hosted-tool data.
|
package/dist/ai/client/index.js
CHANGED
|
@@ -39,6 +39,16 @@ var serverMessageToAction = (message) => {
|
|
|
39
39
|
revisedPrompt: message.revisedPrompt,
|
|
40
40
|
type: "image"
|
|
41
41
|
};
|
|
42
|
+
case "audio":
|
|
43
|
+
return {
|
|
44
|
+
audioId: message.audioId,
|
|
45
|
+
conversationId: message.conversationId,
|
|
46
|
+
data: message.data,
|
|
47
|
+
format: message.format,
|
|
48
|
+
messageId: message.messageId,
|
|
49
|
+
transcript: message.transcript,
|
|
50
|
+
type: "audio"
|
|
51
|
+
};
|
|
42
52
|
case "complete":
|
|
43
53
|
return {
|
|
44
54
|
conversationId: message.conversationId,
|
|
@@ -132,6 +142,8 @@ var isValidAIServerMessage = (data) => {
|
|
|
132
142
|
return "name" in data && "status" in data && "messageId" in data && "conversationId" in data;
|
|
133
143
|
case "image":
|
|
134
144
|
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;
|
|
145
|
+
case "audio":
|
|
146
|
+
return "data" in data && typeof data.data === "string" && "format" in data && typeof data.format === "string" && "messageId" in data && "conversationId" in data;
|
|
135
147
|
case "complete":
|
|
136
148
|
return "messageId" in data && "conversationId" in data;
|
|
137
149
|
case "turn_queued":
|
|
@@ -493,6 +505,20 @@ var handleImage = (state, action) => {
|
|
|
493
505
|
});
|
|
494
506
|
conversation.messages = [...conversation.messages];
|
|
495
507
|
};
|
|
508
|
+
var handleAudio = (state, action) => {
|
|
509
|
+
const conversation = getOrCreate(state, action.conversationId);
|
|
510
|
+
const message = getOrCreateAssistantMessage(conversation, action.messageId, action.conversationId);
|
|
511
|
+
message.audio = [
|
|
512
|
+
...message.audio ?? [],
|
|
513
|
+
{
|
|
514
|
+
audioId: action.audioId,
|
|
515
|
+
data: action.data,
|
|
516
|
+
format: action.format,
|
|
517
|
+
transcript: action.transcript
|
|
518
|
+
}
|
|
519
|
+
];
|
|
520
|
+
conversation.messages = [...conversation.messages];
|
|
521
|
+
};
|
|
496
522
|
var handleComplete = (state, action) => {
|
|
497
523
|
const conversation = state.conversations.get(action.conversationId);
|
|
498
524
|
if (conversation) {
|
|
@@ -563,6 +589,9 @@ var applyAction = (state, action) => {
|
|
|
563
589
|
case "image":
|
|
564
590
|
handleImage(state, action);
|
|
565
591
|
break;
|
|
592
|
+
case "audio":
|
|
593
|
+
handleAudio(state, action);
|
|
594
|
+
break;
|
|
566
595
|
case "complete":
|
|
567
596
|
handleComplete(state, action);
|
|
568
597
|
break;
|
|
@@ -866,5 +895,5 @@ export {
|
|
|
866
895
|
ConversationTurnQueueFullError
|
|
867
896
|
};
|
|
868
897
|
|
|
869
|
-
//# debugId=
|
|
898
|
+
//# debugId=5154A8EF40F9511964756E2164756E21
|
|
870
899
|
//# sourceMappingURL=index.js.map
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/ai/client/actions.ts", "../types/typeGuards.ts", "../src/ai/client/connection.ts", "../src/ai/client/messageStore.ts", "../src/ai/protocol.ts", "../src/ai/client/createAIStream.ts", "../src/ai/client/turnQueue.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"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 attachments: message.attachments,\n content: message.content,\n fromMessageId: message.fromMessageId,\n messageId: message.messageId,\n mode: message.mode,\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",
|
|
6
|
-
"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 case \"edit\":\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 (!(\"mode\" in data) || data.mode === \"append\" || data.mode === \"replace\")\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",
|
|
5
|
+
"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 \"audio\":\n return {\n audioId: message.audioId,\n conversationId: message.conversationId,\n data: message.data,\n format: message.format,\n messageId: message.messageId,\n transcript: message.transcript,\n type: \"audio\" 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 attachments: message.attachments,\n content: message.content,\n fromMessageId: message.fromMessageId,\n messageId: message.messageId,\n mode: message.mode,\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",
|
|
6
|
+
"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 case \"edit\":\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 \"audio\":\n return (\n \"data\" in data &&\n typeof data.data === \"string\" &&\n \"format\" in data &&\n typeof data.format === \"string\" &&\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 (!(\"mode\" in data) || data.mode === \"append\" || data.mode === \"replace\")\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",
|
|
7
7
|
"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",
|
|
8
|
-
"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 cutoffOffset = action.mode === \"replace\" ? 0 : 1;\n const branchedMessages = source.messages\n .slice(0, cutoffIndex + cutoffOffset)\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 attachments: action.attachments,\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",
|
|
8
|
+
"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 handleAudio = (\n state: AIStreamState,\n action: AIStoreAction & { type: \"audio\" },\n) => {\n const conversation = getOrCreate(state, action.conversationId);\n const message = getOrCreateAssistantMessage(\n conversation,\n action.messageId,\n action.conversationId,\n );\n message.audio = [\n ...(message.audio ?? []),\n {\n audioId: action.audioId,\n data: action.data,\n format: action.format,\n transcript: action.transcript,\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 cutoffOffset = action.mode === \"replace\" ? 0 : 1;\n const branchedMessages = source.messages\n .slice(0, cutoffIndex + cutoffOffset)\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 attachments: action.attachments,\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 \"audio\":\n handleAudio(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",
|
|
9
9
|
"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",
|
|
10
10
|
"import type {\n AIAttachment,\n AIMessage,\n AIServerMessage,\n} from \"../../../types/ai\";\nimport { serverMessageToAction } from \"./actions\";\nimport { createAIConnection } from \"./connection\";\nimport { createAIMessageStore } from \"./messageStore\";\nimport { generateId } from \"../protocol\";\n\nexport const createAIStream = (path: string, conversationId?: string) => {\n const connection = createAIConnection(path);\n const store = createAIMessageStore();\n const listeners = new Set<() => void>();\n\n let currentError: string | null = null;\n let currentIsStreaming = false;\n let currentMessages: AIMessage[] = [];\n let activeConversationId: string | null = conversationId ?? null;\n\n const syncState = () => {\n const snapshot = store.getSnapshot();\n const convId = activeConversationId ?? snapshot.activeConversationId;\n const conversation = convId\n ? snapshot.conversations.get(convId)\n : undefined;\n activeConversationId = convId ?? snapshot.activeConversationId;\n currentError = snapshot.error;\n currentIsStreaming = snapshot.isStreaming;\n currentMessages = conversation?.messages ?? [];\n listeners.forEach((listener) => listener());\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 branch = (messageId: string, content: string) => {\n if (activeConversationId) {\n connection.send({\n content,\n conversationId: activeConversationId,\n messageId,\n type: \"branch\",\n });\n }\n };\n\n const edit = (messageId: string, content: string) => {\n if (activeConversationId) {\n connection.send({\n content,\n conversationId: activeConversationId,\n messageId,\n type: \"edit\",\n });\n }\n };\n\n const cancel = () => {\n if (activeConversationId) {\n store.dispatch({ type: \"cancel\" });\n connection.send({\n conversationId: activeConversationId,\n type: \"cancel\",\n });\n }\n };\n\n const destroy = () => {\n unsubscribeStore();\n unsubscribeConnection();\n connection.close();\n listeners.clear();\n };\n\n const send = (content: string, attachments?: AIAttachment[]) => {\n const convId = activeConversationId ?? 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 subscribe = (callback: () => void) => {\n listeners.add(callback);\n\n return () => {\n listeners.delete(callback);\n };\n };\n\n return {\n branch,\n cancel,\n destroy,\n edit,\n send,\n subscribe,\n get error() {\n return currentError;\n },\n get isStreaming() {\n return currentIsStreaming;\n },\n get messages() {\n return currentMessages;\n },\n };\n};\n\nexport type CreateAIStream = typeof createAIStream;\n",
|
|
11
11
|
"export type ConversationTurnQueueStatus = \"failed\" | \"queued\" | \"running\";\n\nexport type ConversationTurnQueueItem<Input> = {\n error?: unknown;\n id: string;\n input: Input;\n status: ConversationTurnQueueStatus;\n};\n\nexport type ConversationTurnQueueSnapshot<Input> = {\n items: ReadonlyArray<ConversationTurnQueueItem<Input>>;\n running: boolean;\n};\n\nexport type ConversationTurnQueueOptions<Input> = {\n execute: (\n input: Input,\n context: { id: string; signal: AbortSignal },\n ) => Promise<void>;\n maxSize?: number;\n onError?: (error: unknown, item: ConversationTurnQueueItem<Input>) => void;\n};\n\nconst DEFAULT_MAX_SIZE = 100;\n\nexport class ConversationTurnQueueFullError extends Error {\n constructor(maxSize: number) {\n super(`Conversation turn queue is full (${maxSize} items)`);\n this.name = \"ConversationTurnQueueFullError\";\n }\n}\n\n/**\n * Serializes turns for one conversation.\n *\n * The queue is transport-agnostic: WebSocket chat, REST/SSE applications, and\n * durable adapters can all provide their own `execute` boundary. Failed turns\n * remain visible and stop the queue until the host retries or removes them, so\n * a later follow-up can never silently overtake a failed earlier message.\n */\nexport const createConversationTurnQueue = <Input>(\n options: ConversationTurnQueueOptions<Input>,\n) => {\n const maxSize = options.maxSize ?? DEFAULT_MAX_SIZE;\n const items: ConversationTurnQueueItem<Input>[] = [];\n const listeners = new Set<\n (snapshot: ConversationTurnQueueSnapshot<Input>) => void\n >();\n let activeAbort: AbortController | null = null;\n let draining = false;\n\n const snapshot = (): ConversationTurnQueueSnapshot<Input> => ({\n items: items.map((item) => ({ ...item })),\n running: items.some(({ status }) => status === \"running\"),\n });\n\n const notify = () => {\n const next = snapshot();\n listeners.forEach((listener) => listener(next));\n };\n\n const drain = async () => {\n if (draining) return;\n const next = items.find(({ status }) => status === \"queued\");\n if (!next || items.some(({ status }) => status === \"failed\")) return;\n draining = true;\n next.status = \"running\";\n activeAbort = new AbortController();\n notify();\n try {\n await options.execute(next.input, {\n id: next.id,\n signal: activeAbort.signal,\n });\n const index = items.findIndex(({ id }) => id === next.id);\n if (index >= 0) items.splice(index, 1);\n } catch (error) {\n if (activeAbort.signal.aborted) {\n const index = items.findIndex(({ id }) => id === next.id);\n if (index >= 0) items.splice(index, 1);\n } else {\n next.error = error;\n next.status = \"failed\";\n options.onError?.(error, { ...next });\n }\n } finally {\n activeAbort = null;\n draining = false;\n notify();\n void drain();\n }\n };\n\n const enqueue = (input: Input, id: string = crypto.randomUUID()) => {\n if (items.length >= maxSize) {\n throw new ConversationTurnQueueFullError(maxSize);\n }\n items.push({ id, input, status: \"queued\" });\n notify();\n void drain();\n\n return id;\n };\n\n const remove = (id: string) => {\n const index = items.findIndex(\n (item) => item.id === id && item.status !== \"running\",\n );\n if (index < 0) return false;\n items.splice(index, 1);\n notify();\n void drain();\n\n return true;\n };\n\n const retry = (id: string) => {\n const item = items.find(\n (candidate) => candidate.id === id && candidate.status === \"failed\",\n );\n if (!item) return false;\n delete item.error;\n item.status = \"queued\";\n notify();\n void drain();\n\n return true;\n };\n\n const cancel = (input: { clearPending?: boolean } = {}) => {\n activeAbort?.abort();\n if (input.clearPending) {\n for (let index = items.length - 1; index >= 0; index--) {\n if (items[index]?.status !== \"running\") items.splice(index, 1);\n }\n }\n notify();\n };\n\n return {\n cancel,\n enqueue,\n getSnapshot: snapshot,\n remove,\n retry,\n subscribe: (\n listener: (snapshot: ConversationTurnQueueSnapshot<Input>) => void,\n ) => {\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n },\n };\n};\n"
|
|
12
12
|
],
|
|
13
|
-
"mappings": "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",
|
|
14
|
-
"debugId": "
|
|
13
|
+
"mappings": "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",
|
|
14
|
+
"debugId": "5154A8EF40F9511964756E2164756E21",
|
|
15
15
|
"names": []
|
|
16
16
|
}
|