@absolutejs/absolute 0.19.0-beta.226 → 0.19.0-beta.227

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.
Files changed (75) hide show
  1. package/.absolutejs/eslint-cache +1 -0
  2. package/.absolutejs/prettier.cache.json +42 -19
  3. package/.absolutejs/vue-tsc.tsbuildinfo +1 -1
  4. package/.claude/settings.local.json +2 -1
  5. package/ROADMAP.md +0 -25
  6. package/dist/{Image-y5bdvj57.vue → Image-b3r6hxqk.vue} +6 -1
  7. package/dist/ai/index.js +529 -0
  8. package/dist/ai/index.js.map +13 -0
  9. package/dist/ai/providers/anthropic.js +396 -0
  10. package/dist/ai/providers/anthropic.js.map +10 -0
  11. package/dist/ai/providers/ollama.js +233 -0
  12. package/dist/ai/providers/ollama.js.map +10 -0
  13. package/dist/ai/providers/openai.js +355 -0
  14. package/dist/ai/providers/openai.js.map +10 -0
  15. package/dist/ai-client/angular/ai/index.js +532 -0
  16. package/dist/ai-client/react/ai/index.js +499 -0
  17. package/dist/ai-client/vue/ai/index.js +460 -0
  18. package/dist/angular/ai/index.js +668 -0
  19. package/dist/angular/ai/index.js.map +15 -0
  20. package/dist/angular/components/image.component.js +1 -1
  21. package/dist/angular/index.js +11 -1
  22. package/dist/angular/index.js.map +3 -3
  23. package/dist/build.js +48 -2
  24. package/dist/build.js.map +4 -4
  25. package/dist/index.js +50 -2
  26. package/dist/index.js.map +6 -6
  27. package/dist/react/ai/index.js +635 -0
  28. package/dist/react/ai/index.js.map +16 -0
  29. package/dist/react/components/index.js +11 -1
  30. package/dist/react/components/index.js.map +2 -2
  31. package/dist/react/hooks/index.js +11 -1
  32. package/dist/react/hooks/index.js.map +2 -2
  33. package/dist/react/index.js +11 -1
  34. package/dist/react/index.js.map +3 -3
  35. package/dist/src/ai/client/actions.d.ts +46 -0
  36. package/dist/src/ai/client/connection.d.ts +9 -0
  37. package/dist/src/ai/client/messageStore.d.ts +12 -0
  38. package/dist/src/ai/conversationManager.d.ts +11 -0
  39. package/dist/src/ai/index.d.ts +3 -0
  40. package/dist/src/ai/protocol.d.ts +4 -0
  41. package/dist/src/ai/providers/anthropic.d.ts +3 -0
  42. package/dist/src/ai/providers/ollama.d.ts +6 -0
  43. package/dist/src/ai/providers/openai.d.ts +7 -0
  44. package/dist/src/ai/streamAI.d.ts +2 -0
  45. package/dist/src/angular/ai/ai-stream.service.d.ts +15 -0
  46. package/dist/src/angular/ai/index.d.ts +1 -0
  47. package/dist/src/react/ai/AIStreamProvider.d.ts +13 -0
  48. package/dist/src/react/ai/index.d.ts +2 -0
  49. package/dist/src/react/ai/useAIStream.d.ts +8 -0
  50. package/dist/src/svelte/ai/createAIStream.d.ts +10 -0
  51. package/dist/src/svelte/ai/index.d.ts +1 -0
  52. package/dist/src/vue/ai/index.d.ts +1 -0
  53. package/dist/src/vue/ai/useAIStream.d.ts +22 -0
  54. package/dist/svelte/ai/index.js +590 -0
  55. package/dist/svelte/ai/index.js.map +15 -0
  56. package/dist/svelte/components/Image.svelte +6 -1
  57. package/dist/svelte/index.js +11 -1
  58. package/dist/svelte/index.js.map +3 -3
  59. package/dist/types/ai.d.ts +188 -0
  60. package/dist/types/anthropic.d.ts +18 -0
  61. package/dist/types/index.d.ts +1 -0
  62. package/dist/types/typeGuards.d.ts +3 -0
  63. package/dist/vue/ai/index.js +596 -0
  64. package/dist/vue/ai/index.js.map +15 -0
  65. package/dist/vue/components/Image.vue +6 -1
  66. package/dist/vue/components/index.js +12 -2
  67. package/dist/vue/components/index.js.map +1 -1
  68. package/dist/vue/index.js +11 -1
  69. package/dist/vue/index.js.map +3 -3
  70. package/package.json +36 -1
  71. package/scripts/build.ts +33 -0
  72. package/types/ai.ts +235 -0
  73. package/types/anthropic.ts +17 -0
  74. package/types/index.ts +1 -0
  75. package/types/typeGuards.ts +72 -1
@@ -0,0 +1,396 @@
1
+ // @bun
2
+ var __create = Object.create;
3
+ var __getProtoOf = Object.getPrototypeOf;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ function __accessProp(key) {
9
+ return this[key];
10
+ }
11
+ var __toESMCache_node;
12
+ var __toESMCache_esm;
13
+ var __toESM = (mod, isNodeMode, target) => {
14
+ var canCache = mod != null && typeof mod === "object";
15
+ if (canCache) {
16
+ var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
17
+ var cached = cache.get(mod);
18
+ if (cached)
19
+ return cached;
20
+ }
21
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
22
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
23
+ for (let key of __getOwnPropNames(mod))
24
+ if (!__hasOwnProp.call(to, key))
25
+ __defProp(to, key, {
26
+ get: __accessProp.bind(mod, key),
27
+ enumerable: true
28
+ });
29
+ if (canCache)
30
+ cache.set(mod, to);
31
+ return to;
32
+ };
33
+ var __toCommonJS = (from) => {
34
+ var entry = (__moduleCache ??= new WeakMap).get(from), desc;
35
+ if (entry)
36
+ return entry;
37
+ entry = __defProp({}, "__esModule", { value: true });
38
+ if (from && typeof from === "object" || typeof from === "function") {
39
+ for (var key of __getOwnPropNames(from))
40
+ if (!__hasOwnProp.call(entry, key))
41
+ __defProp(entry, key, {
42
+ get: __accessProp.bind(from, key),
43
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
44
+ });
45
+ }
46
+ __moduleCache.set(from, entry);
47
+ return entry;
48
+ };
49
+ var __moduleCache;
50
+ var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
51
+ var __returnValue = (v) => v;
52
+ function __exportSetter(name, newValue) {
53
+ this[name] = __returnValue.bind(null, newValue);
54
+ }
55
+ var __export = (target, all) => {
56
+ for (var name in all)
57
+ __defProp(target, name, {
58
+ get: all[name],
59
+ enumerable: true,
60
+ configurable: true,
61
+ set: __exportSetter.bind(all, name)
62
+ });
63
+ };
64
+ var __legacyDecorateClassTS = function(decorators, target, key, desc) {
65
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
66
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
67
+ r = Reflect.decorate(decorators, target, key, desc);
68
+ else
69
+ for (var i = decorators.length - 1;i >= 0; i--)
70
+ if (d = decorators[i])
71
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
72
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
73
+ };
74
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
75
+ var __require = import.meta.require;
76
+
77
+ // src/ai/providers/anthropic.ts
78
+ var DEFAULT_BASE_URL = "https://api.anthropic.com";
79
+ var API_VERSION = "2023-06-01";
80
+ var MAX_TOKENS = 8192;
81
+ var EVENT_PREFIX_LENGTH = 7;
82
+ var DATA_PREFIX_LENGTH = 6;
83
+ var EMPTY_CHUNKS = [];
84
+ var isRecord = (val) => typeof val === "object" && val !== null;
85
+ var mapContentBlock = (block) => {
86
+ if (block.type === "tool_result") {
87
+ return {
88
+ content: block.content,
89
+ tool_use_id: block.tool_use_id,
90
+ type: "tool_result"
91
+ };
92
+ }
93
+ if (block.type === "tool_use") {
94
+ return {
95
+ id: block.id,
96
+ input: block.input,
97
+ name: block.name,
98
+ type: "tool_use"
99
+ };
100
+ }
101
+ return { text: block.content, type: "text" };
102
+ };
103
+ var mapMessage = (msg) => ({
104
+ content: typeof msg.content === "string" ? msg.content : msg.content.map(mapContentBlock),
105
+ role: msg.role === "system" ? "user" : msg.role
106
+ });
107
+ var mapToolDefinition = (tool) => ({
108
+ description: tool.description,
109
+ input_schema: tool.input_schema,
110
+ name: tool.name
111
+ });
112
+ var buildRequestBody = (params) => {
113
+ const messages = params.messages.filter((msg) => msg.role !== "system").map(mapMessage);
114
+ const body = {
115
+ max_tokens: MAX_TOKENS,
116
+ messages,
117
+ model: params.model,
118
+ stream: true
119
+ };
120
+ if (params.systemPrompt) {
121
+ body.system = params.systemPrompt;
122
+ }
123
+ if (params.tools && params.tools.length > 0) {
124
+ body.tools = params.tools.map(mapToolDefinition);
125
+ }
126
+ return body;
127
+ };
128
+ var classifyLine = (line) => {
129
+ if (line.startsWith("event: ")) {
130
+ return {
131
+ field: "event",
132
+ value: line.slice(EVENT_PREFIX_LENGTH)
133
+ };
134
+ }
135
+ if (line.startsWith("data: ")) {
136
+ return {
137
+ field: "data",
138
+ value: line.slice(DATA_PREFIX_LENGTH)
139
+ };
140
+ }
141
+ return;
142
+ };
143
+ var applyClassified = (acc, classified) => {
144
+ if (!classified) {
145
+ return acc;
146
+ }
147
+ if (classified.field === "event") {
148
+ return { eventData: acc.eventData, eventType: classified.value };
149
+ }
150
+ return { eventData: classified.value, eventType: acc.eventType };
151
+ };
152
+ var parseEventLines = (event) => event.split(`
153
+ `).reduce((acc, line) => applyClassified(acc, classifyLine(line)), {
154
+ eventData: "",
155
+ eventType: ""
156
+ });
157
+ var safeParse = (text) => {
158
+ try {
159
+ const result = JSON.parse(text);
160
+ return result;
161
+ } catch {
162
+ return;
163
+ }
164
+ };
165
+ var tryParseJson = (text) => {
166
+ const result = safeParse(text);
167
+ if (isRecord(result)) {
168
+ return result;
169
+ }
170
+ return;
171
+ };
172
+ var getRecord = (obj, key) => {
173
+ const val = obj[key];
174
+ if (isRecord(val)) {
175
+ return val;
176
+ }
177
+ return;
178
+ };
179
+ var getString = (obj, key) => {
180
+ const val = obj[key];
181
+ if (typeof val === "string") {
182
+ return val;
183
+ }
184
+ return "";
185
+ };
186
+ var getNumber = (obj, key) => {
187
+ const val = obj[key];
188
+ if (typeof val === "number") {
189
+ return val;
190
+ }
191
+ return 0;
192
+ };
193
+ var handleContentBlockStart = (parsed, state) => {
194
+ const block = getRecord(parsed, "content_block");
195
+ if (block && block.type === "tool_use") {
196
+ state.currentToolId = getString(block, "id");
197
+ state.currentToolName = getString(block, "name");
198
+ state.toolInputJson = "";
199
+ }
200
+ };
201
+ var handleContentBlockDelta = (parsed, state) => {
202
+ const delta = getRecord(parsed, "delta");
203
+ if (!delta) {
204
+ return;
205
+ }
206
+ if (delta.type === "text_delta") {
207
+ return {
208
+ content: getString(delta, "text"),
209
+ type: "text"
210
+ };
211
+ }
212
+ if (delta.type === "input_json_delta") {
213
+ state.toolInputJson += getString(delta, "partial_json");
214
+ }
215
+ return;
216
+ };
217
+ var handleContentBlockStop = (state) => {
218
+ if (!state.currentToolId) {
219
+ return;
220
+ }
221
+ const input = tryParseJson(state.toolInputJson) ?? state.toolInputJson;
222
+ const chunk = {
223
+ id: state.currentToolId,
224
+ input,
225
+ name: state.currentToolName,
226
+ type: "tool_use"
227
+ };
228
+ state.currentToolId = "";
229
+ state.currentToolName = "";
230
+ state.toolInputJson = "";
231
+ return chunk;
232
+ };
233
+ var extractUsage = (usageRecord, existingUsage) => {
234
+ if (!usageRecord) {
235
+ return existingUsage;
236
+ }
237
+ return {
238
+ inputTokens: getNumber(usageRecord, "input_tokens") || existingUsage?.inputTokens || 0,
239
+ outputTokens: getNumber(usageRecord, "output_tokens") || existingUsage?.outputTokens || 0
240
+ };
241
+ };
242
+ var handleMessageDelta = (parsed, state) => {
243
+ const deltaUsage = getRecord(parsed, "usage");
244
+ state.usage = extractUsage(deltaUsage, state.usage);
245
+ };
246
+ var handleMessageStart = (parsed, state) => {
247
+ const message = getRecord(parsed, "message");
248
+ if (!message) {
249
+ return;
250
+ }
251
+ const startUsage = getRecord(message, "usage");
252
+ state.usage = extractUsage(startUsage, state.usage);
253
+ };
254
+ var handleError = (parsed) => {
255
+ const error = getRecord(parsed, "error");
256
+ const errorMessage = error ? getString(error, "message") : "";
257
+ throw new Error(errorMessage || "Anthropic API error");
258
+ };
259
+ var processEvent = (eventType, parsed, state) => {
260
+ switch (eventType) {
261
+ case "content_block_start": {
262
+ handleContentBlockStart(parsed, state);
263
+ return;
264
+ }
265
+ case "content_block_delta": {
266
+ return handleContentBlockDelta(parsed, state);
267
+ }
268
+ case "content_block_stop": {
269
+ return handleContentBlockStop(state);
270
+ }
271
+ case "message_delta": {
272
+ handleMessageDelta(parsed, state);
273
+ return;
274
+ }
275
+ case "message_start": {
276
+ handleMessageStart(parsed, state);
277
+ return;
278
+ }
279
+ case "message_stop": {
280
+ return { type: "done", usage: state.usage };
281
+ }
282
+ case "error": {
283
+ handleError(parsed);
284
+ return;
285
+ }
286
+ default: {
287
+ return;
288
+ }
289
+ }
290
+ };
291
+ var processSingleEvent = (event, state) => {
292
+ if (!event.trim()) {
293
+ return;
294
+ }
295
+ const { eventData, eventType } = parseEventLines(event);
296
+ if (!eventData) {
297
+ return;
298
+ }
299
+ const parsed = tryParseJson(eventData);
300
+ if (!parsed) {
301
+ return;
302
+ }
303
+ return processEvent(eventType, parsed, state);
304
+ };
305
+ var collectChunk = (event, state) => {
306
+ const chunk = processSingleEvent(event, state);
307
+ return chunk ? [chunk] : [];
308
+ };
309
+ var processBufferedEvents = (eventsText, state) => {
310
+ const events = eventsText.split(`
311
+
312
+ `);
313
+ state.buffer = events.pop() ?? "";
314
+ return events.flatMap((event) => collectChunk(event, state));
315
+ };
316
+ var readNextChunks = async (reader, decoder, state, signal) => {
317
+ if (signal?.aborted) {
318
+ return { chunks: EMPTY_CHUNKS, done: true };
319
+ }
320
+ const { done, value } = await reader.read();
321
+ if (done) {
322
+ return { chunks: EMPTY_CHUNKS, done: true };
323
+ }
324
+ const rawText = state.buffer + decoder.decode(value, { stream: true });
325
+ const chunks = processBufferedEvents(rawText, state);
326
+ return { chunks, done: false };
327
+ };
328
+ var findDoneChunk = (chunks) => chunks.findIndex((c) => c.type === "done");
329
+ var sseStreamLoop = async (reader, decoder, state, signal) => {
330
+ const result = await readNextChunks(reader, decoder, state, signal);
331
+ if (result.done) {
332
+ return { chunks: result.chunks, finished: true };
333
+ }
334
+ const doneIdx = findDoneChunk(result.chunks);
335
+ if (doneIdx >= 0) {
336
+ return { chunks: result.chunks.slice(0, doneIdx + 1), finished: true };
337
+ }
338
+ return { chunks: result.chunks, finished: false };
339
+ };
340
+ async function* streamChunks(reader, decoder, state, signal) {
341
+ let finished = false;
342
+ while (!finished) {
343
+ const result = await sseStreamLoop(reader, decoder, state, signal);
344
+ ({ finished } = result);
345
+ yield* result.chunks;
346
+ }
347
+ }
348
+ async function* parseSSEStream(body, signal) {
349
+ const reader = body.getReader();
350
+ const decoder = new TextDecoder;
351
+ const state = {
352
+ buffer: "",
353
+ currentToolId: "",
354
+ currentToolName: "",
355
+ toolInputJson: "",
356
+ usage: undefined
357
+ };
358
+ try {
359
+ yield* streamChunks(reader, decoder, state, signal);
360
+ } finally {
361
+ reader.releaseLock();
362
+ }
363
+ }
364
+ var fetchAndStream = async function* (baseUrl, config, params) {
365
+ const body = buildRequestBody(params);
366
+ const response = await fetch(`${baseUrl}/v1/messages`, {
367
+ body: JSON.stringify(body),
368
+ headers: {
369
+ "anthropic-version": API_VERSION,
370
+ "Content-Type": "application/json",
371
+ "x-api-key": config.apiKey
372
+ },
373
+ method: "POST",
374
+ signal: params.signal
375
+ });
376
+ if (!response.ok) {
377
+ const errorText = await response.text();
378
+ throw new Error(`Anthropic API error ${response.status}: ${errorText}`);
379
+ }
380
+ if (!response.body) {
381
+ throw new Error("Anthropic API returned no response body");
382
+ }
383
+ yield* parseSSEStream(response.body, params.signal);
384
+ };
385
+ var anthropic = (config) => {
386
+ const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
387
+ return {
388
+ stream: (params) => fetchAndStream(baseUrl, config, params)
389
+ };
390
+ };
391
+ export {
392
+ anthropic
393
+ };
394
+
395
+ //# debugId=52B30E27186BE50564756E2164756E21
396
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ai/providers/anthropic.ts"],
4
+ "sourcesContent": [
5
+ "import type {\n\tAIChunk,\n\tAIProviderConfig,\n\tAIProviderContentBlock,\n\tAIProviderMessage,\n\tAIProviderStreamParams,\n\tAIProviderToolDefinition,\n\tAIUsage\n} from '../../../types/ai';\nimport type {\n\tAnthropicConfig,\n\tAnthropicMessage,\n\tAnthropicSSEState\n} from '../../../types/anthropic';\n\nconst DEFAULT_BASE_URL = 'https://api.anthropic.com';\nconst API_VERSION = '2023-06-01';\nconst MAX_TOKENS = 8192;\nconst EVENT_PREFIX_LENGTH = 7;\nconst DATA_PREFIX_LENGTH = 6;\n\nconst EMPTY_CHUNKS: AIChunk[] = [];\n\nconst isRecord = (val: unknown): val is Record<string, unknown> =>\n\ttypeof val === 'object' && val !== null;\n\nconst mapContentBlock = (block: AIProviderContentBlock) => {\n\tif (block.type === 'tool_result') {\n\t\treturn {\n\t\t\tcontent: block.content,\n\t\t\ttool_use_id: block.tool_use_id,\n\t\t\ttype: 'tool_result'\n\t\t};\n\t}\n\n\tif (block.type === 'tool_use') {\n\t\treturn {\n\t\t\tid: block.id,\n\t\t\tinput: block.input,\n\t\t\tname: block.name,\n\t\t\ttype: 'tool_use'\n\t\t};\n\t}\n\n\treturn { text: block.content, type: 'text' };\n};\n\nconst mapMessage = (msg: AIProviderMessage): AnthropicMessage => ({\n\tcontent:\n\t\ttypeof msg.content === 'string'\n\t\t\t? msg.content\n\t\t\t: msg.content.map(mapContentBlock),\n\trole: msg.role === 'system' ? 'user' : msg.role\n});\n\nconst mapToolDefinition = (tool: AIProviderToolDefinition) => ({\n\tdescription: tool.description,\n\tinput_schema: tool.input_schema,\n\tname: tool.name\n});\n\nconst buildRequestBody = (params: AIProviderStreamParams) => {\n\tconst messages: AnthropicMessage[] = params.messages\n\t\t.filter((msg) => msg.role !== 'system')\n\t\t.map(mapMessage);\n\n\tconst body: Record<string, unknown> = {\n\t\tmax_tokens: MAX_TOKENS,\n\t\tmessages,\n\t\tmodel: params.model,\n\t\tstream: true\n\t};\n\n\tif (params.systemPrompt) {\n\t\tbody.system = params.systemPrompt;\n\t}\n\n\tif (params.tools && params.tools.length > 0) {\n\t\tbody.tools = params.tools.map(mapToolDefinition);\n\t}\n\n\treturn body;\n};\n\nconst classifyLine = (line: string) => {\n\tif (line.startsWith('event: ')) {\n\t\treturn {\n\t\t\tfield: 'event' as const,\n\t\t\tvalue: line.slice(EVENT_PREFIX_LENGTH)\n\t\t};\n\t}\n\n\tif (line.startsWith('data: ')) {\n\t\treturn {\n\t\t\tfield: 'data' as const,\n\t\t\tvalue: line.slice(DATA_PREFIX_LENGTH)\n\t\t};\n\t}\n\n\treturn undefined;\n};\n\nconst applyClassified = (\n\tacc: { eventData: string; eventType: string },\n\tclassified: { field: 'event' | 'data'; value: string } | undefined\n) => {\n\tif (!classified) {\n\t\treturn acc;\n\t}\n\n\tif (classified.field === 'event') {\n\t\treturn { eventData: acc.eventData, eventType: classified.value };\n\t}\n\n\treturn { eventData: classified.value, eventType: acc.eventType };\n};\n\nconst parseEventLines = (event: string) =>\n\tevent\n\t\t.split('\\n')\n\t\t.reduce((acc, line) => applyClassified(acc, classifyLine(line)), {\n\t\t\teventData: '',\n\t\t\teventType: ''\n\t\t});\n\nconst safeParse = (text: string) => {\n\ttry {\n\t\tconst result: unknown = JSON.parse(text);\n\n\t\treturn result;\n\t} catch {\n\t\treturn undefined;\n\t}\n};\n\nconst tryParseJson = (text: string) => {\n\tconst result = safeParse(text);\n\n\tif (isRecord(result)) {\n\t\treturn result;\n\t}\n\n\treturn undefined;\n};\n\nconst getRecord = (obj: Record<string, unknown>, key: string) => {\n\tconst val = obj[key];\n\n\tif (isRecord(val)) {\n\t\treturn val;\n\t}\n\n\treturn undefined;\n};\n\nconst getString = (obj: Record<string, unknown>, key: string) => {\n\tconst val = obj[key];\n\n\tif (typeof val === 'string') {\n\t\treturn val;\n\t}\n\n\treturn '';\n};\n\nconst getNumber = (obj: Record<string, unknown>, key: string) => {\n\tconst val = obj[key];\n\n\tif (typeof val === 'number') {\n\t\treturn val;\n\t}\n\n\treturn 0;\n};\n\nconst handleContentBlockStart = (\n\tparsed: Record<string, unknown>,\n\tstate: AnthropicSSEState\n) => {\n\tconst block = getRecord(parsed, 'content_block');\n\n\tif (block && block.type === 'tool_use') {\n\t\tstate.currentToolId = getString(block, 'id');\n\t\tstate.currentToolName = getString(block, 'name');\n\t\tstate.toolInputJson = '';\n\t}\n};\n\nconst handleContentBlockDelta = (\n\tparsed: Record<string, unknown>,\n\tstate: AnthropicSSEState\n) => {\n\tconst delta = getRecord(parsed, 'delta');\n\n\tif (!delta) {\n\t\treturn undefined;\n\t}\n\n\tif (delta.type === 'text_delta') {\n\t\treturn {\n\t\t\tcontent: getString(delta, 'text'),\n\t\t\ttype: 'text'\n\t\t} satisfies AIChunk;\n\t}\n\n\tif (delta.type === 'input_json_delta') {\n\t\tstate.toolInputJson += getString(delta, 'partial_json');\n\t}\n\n\treturn undefined;\n};\n\nconst handleContentBlockStop = (state: AnthropicSSEState) => {\n\tif (!state.currentToolId) {\n\t\treturn undefined;\n\t}\n\n\tconst input = tryParseJson(state.toolInputJson) ?? state.toolInputJson;\n\n\tconst chunk: AIChunk = {\n\t\tid: state.currentToolId,\n\t\tinput,\n\t\tname: state.currentToolName,\n\t\ttype: 'tool_use'\n\t};\n\n\tstate.currentToolId = '';\n\tstate.currentToolName = '';\n\tstate.toolInputJson = '';\n\n\treturn chunk;\n};\n\nconst extractUsage = (\n\tusageRecord: Record<string, unknown> | undefined,\n\texistingUsage: AIUsage | undefined\n) => {\n\tif (!usageRecord) {\n\t\treturn existingUsage;\n\t}\n\n\treturn {\n\t\tinputTokens:\n\t\t\tgetNumber(usageRecord, 'input_tokens') ||\n\t\t\texistingUsage?.inputTokens ||\n\t\t\t0,\n\t\toutputTokens:\n\t\t\tgetNumber(usageRecord, 'output_tokens') ||\n\t\t\texistingUsage?.outputTokens ||\n\t\t\t0\n\t};\n};\n\nconst handleMessageDelta = (\n\tparsed: Record<string, unknown>,\n\tstate: AnthropicSSEState\n) => {\n\tconst deltaUsage = getRecord(parsed, 'usage');\n\tstate.usage = extractUsage(deltaUsage, state.usage);\n};\n\nconst handleMessageStart = (\n\tparsed: Record<string, unknown>,\n\tstate: AnthropicSSEState\n) => {\n\tconst message = getRecord(parsed, 'message');\n\n\tif (!message) {\n\t\treturn;\n\t}\n\n\tconst startUsage = getRecord(message, 'usage');\n\tstate.usage = extractUsage(startUsage, state.usage);\n};\n\nconst handleError = (parsed: Record<string, unknown>) => {\n\tconst error = getRecord(parsed, 'error');\n\tconst errorMessage = error ? getString(error, 'message') : '';\n\n\tthrow new Error(errorMessage || 'Anthropic API error');\n};\n\nconst processEvent = (\n\teventType: string,\n\tparsed: Record<string, unknown>,\n\tstate: AnthropicSSEState\n) => {\n\tswitch (eventType) {\n\t\tcase 'content_block_start': {\n\t\t\thandleContentBlockStart(parsed, state);\n\n\t\t\treturn undefined;\n\t\t}\n\n\t\tcase 'content_block_delta': {\n\t\t\treturn handleContentBlockDelta(parsed, state);\n\t\t}\n\n\t\tcase 'content_block_stop': {\n\t\t\treturn handleContentBlockStop(state);\n\t\t}\n\n\t\tcase 'message_delta': {\n\t\t\thandleMessageDelta(parsed, state);\n\n\t\t\treturn undefined;\n\t\t}\n\n\t\tcase 'message_start': {\n\t\t\thandleMessageStart(parsed, state);\n\n\t\t\treturn undefined;\n\t\t}\n\n\t\tcase 'message_stop': {\n\t\t\treturn { type: 'done' as const, usage: state.usage };\n\t\t}\n\n\t\tcase 'error': {\n\t\t\thandleError(parsed);\n\n\t\t\treturn undefined;\n\t\t}\n\n\t\tdefault: {\n\t\t\treturn undefined;\n\t\t}\n\t}\n};\n\nconst processSingleEvent = (event: string, state: AnthropicSSEState) => {\n\tif (!event.trim()) {\n\t\treturn undefined;\n\t}\n\n\tconst { eventData, eventType } = parseEventLines(event);\n\n\tif (!eventData) {\n\t\treturn undefined;\n\t}\n\n\tconst parsed = tryParseJson(eventData);\n\n\tif (!parsed) {\n\t\treturn undefined;\n\t}\n\n\treturn processEvent(eventType, parsed, state);\n};\n\nconst collectChunk = (event: string, state: AnthropicSSEState) => {\n\tconst chunk = processSingleEvent(event, state);\n\n\treturn chunk ? [chunk] : [];\n};\n\nconst processBufferedEvents = (\n\teventsText: string,\n\tstate: AnthropicSSEState\n) => {\n\tconst events = eventsText.split('\\n\\n');\n\tstate.buffer = events.pop() ?? '';\n\n\treturn events.flatMap((event) => collectChunk(event, state));\n};\n\nconst readNextChunks = async (\n\treader: ReadableStreamDefaultReader<Uint8Array>,\n\tdecoder: TextDecoder,\n\tstate: AnthropicSSEState,\n\tsignal?: AbortSignal\n) => {\n\tif (signal?.aborted) {\n\t\treturn { chunks: EMPTY_CHUNKS, done: true };\n\t}\n\n\tconst { done, value } = await reader.read();\n\n\tif (done) {\n\t\treturn { chunks: EMPTY_CHUNKS, done: true };\n\t}\n\n\tconst rawText = state.buffer + decoder.decode(value, { stream: true });\n\tconst chunks = processBufferedEvents(rawText, state);\n\n\treturn { chunks, done: false };\n};\n\nconst findDoneChunk = (chunks: AIChunk[]) =>\n\tchunks.findIndex((c) => c.type === 'done');\n\nconst sseStreamLoop = async (\n\treader: ReadableStreamDefaultReader<Uint8Array>,\n\tdecoder: TextDecoder,\n\tstate: AnthropicSSEState,\n\tsignal?: AbortSignal\n) => {\n\tconst result = await readNextChunks(reader, decoder, state, signal);\n\n\tif (result.done) {\n\t\treturn { chunks: result.chunks, finished: true };\n\t}\n\n\tconst doneIdx = findDoneChunk(result.chunks);\n\n\tif (doneIdx >= 0) {\n\t\treturn { chunks: result.chunks.slice(0, doneIdx + 1), finished: true };\n\t}\n\n\treturn { chunks: result.chunks, finished: false };\n};\n\n// eslint-disable-next-line func-style\nasync function* streamChunks(\n\treader: ReadableStreamDefaultReader<Uint8Array>,\n\tdecoder: TextDecoder,\n\tstate: AnthropicSSEState,\n\tsignal?: AbortSignal\n) {\n\tlet finished = false;\n\n\twhile (!finished) {\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tconst result = await sseStreamLoop(reader, decoder, state, signal);\n\t\t({ finished } = result);\n\t\tyield* result.chunks;\n\t}\n}\n\n// eslint-disable-next-line func-style\nasync function* parseSSEStream(\n\tbody: ReadableStream<Uint8Array>,\n\tsignal?: AbortSignal\n) {\n\tconst reader = body.getReader();\n\tconst decoder = new TextDecoder();\n\n\tconst state: AnthropicSSEState = {\n\t\tbuffer: '',\n\t\tcurrentToolId: '',\n\t\tcurrentToolName: '',\n\t\ttoolInputJson: '',\n\t\tusage: undefined\n\t};\n\n\ttry {\n\t\tyield* streamChunks(reader, decoder, state, signal);\n\t} finally {\n\t\treader.releaseLock();\n\t}\n}\n\nconst fetchAndStream = async function* (\n\tbaseUrl: string,\n\tconfig: AnthropicConfig,\n\tparams: AIProviderStreamParams\n) {\n\tconst body = buildRequestBody(params);\n\n\tconst response = await fetch(`${baseUrl}/v1/messages`, {\n\t\tbody: JSON.stringify(body),\n\t\theaders: {\n\t\t\t'anthropic-version': API_VERSION,\n\t\t\t'Content-Type': 'application/json',\n\t\t\t'x-api-key': config.apiKey\n\t\t},\n\t\tmethod: 'POST',\n\t\tsignal: params.signal\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\n\t\tthrow new Error(`Anthropic API error ${response.status}: ${errorText}`);\n\t}\n\n\tif (!response.body) {\n\t\tthrow new Error('Anthropic API returned no response body');\n\t}\n\n\tyield* parseSSEStream(response.body, params.signal);\n};\n\nexport const anthropic = (config: AnthropicConfig): AIProviderConfig => {\n\tconst baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n\n\treturn {\n\t\tstream: (params: AIProviderStreamParams) =>\n\t\t\tfetchAndStream(baseUrl, config, params)\n\t};\n};\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "52B30E27186BE50564756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,233 @@
1
+ // @bun
2
+ var __create = Object.create;
3
+ var __getProtoOf = Object.getPrototypeOf;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ function __accessProp(key) {
9
+ return this[key];
10
+ }
11
+ var __toESMCache_node;
12
+ var __toESMCache_esm;
13
+ var __toESM = (mod, isNodeMode, target) => {
14
+ var canCache = mod != null && typeof mod === "object";
15
+ if (canCache) {
16
+ var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
17
+ var cached = cache.get(mod);
18
+ if (cached)
19
+ return cached;
20
+ }
21
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
22
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
23
+ for (let key of __getOwnPropNames(mod))
24
+ if (!__hasOwnProp.call(to, key))
25
+ __defProp(to, key, {
26
+ get: __accessProp.bind(mod, key),
27
+ enumerable: true
28
+ });
29
+ if (canCache)
30
+ cache.set(mod, to);
31
+ return to;
32
+ };
33
+ var __toCommonJS = (from) => {
34
+ var entry = (__moduleCache ??= new WeakMap).get(from), desc;
35
+ if (entry)
36
+ return entry;
37
+ entry = __defProp({}, "__esModule", { value: true });
38
+ if (from && typeof from === "object" || typeof from === "function") {
39
+ for (var key of __getOwnPropNames(from))
40
+ if (!__hasOwnProp.call(entry, key))
41
+ __defProp(entry, key, {
42
+ get: __accessProp.bind(from, key),
43
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
44
+ });
45
+ }
46
+ __moduleCache.set(from, entry);
47
+ return entry;
48
+ };
49
+ var __moduleCache;
50
+ var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
51
+ var __returnValue = (v) => v;
52
+ function __exportSetter(name, newValue) {
53
+ this[name] = __returnValue.bind(null, newValue);
54
+ }
55
+ var __export = (target, all) => {
56
+ for (var name in all)
57
+ __defProp(target, name, {
58
+ get: all[name],
59
+ enumerable: true,
60
+ configurable: true,
61
+ set: __exportSetter.bind(all, name)
62
+ });
63
+ };
64
+ var __legacyDecorateClassTS = function(decorators, target, key, desc) {
65
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
66
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
67
+ r = Reflect.decorate(decorators, target, key, desc);
68
+ else
69
+ for (var i = decorators.length - 1;i >= 0; i--)
70
+ if (d = decorators[i])
71
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
72
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
73
+ };
74
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
75
+ var __require = import.meta.require;
76
+
77
+ // src/ai/providers/ollama.ts
78
+ var DEFAULT_BASE_URL = "http://localhost:11434";
79
+ var ZERO_TOKENS = 0;
80
+ var DONE_CHUNK = { type: "done" };
81
+ var buildRequestBody = (params) => {
82
+ const messages = params.messages.map((msg) => ({
83
+ content: typeof msg.content === "string" ? msg.content : "",
84
+ role: msg.role
85
+ }));
86
+ if (params.systemPrompt) {
87
+ messages.unshift({ content: params.systemPrompt, role: "system" });
88
+ }
89
+ return {
90
+ messages,
91
+ model: params.model,
92
+ stream: true
93
+ };
94
+ };
95
+ var isRecord = (val) => val !== null && typeof val === "object" && !Array.isArray(val);
96
+ var tryParseJSON = (text) => {
97
+ try {
98
+ const result = JSON.parse(text);
99
+ if (isRecord(result)) {
100
+ return result;
101
+ }
102
+ return null;
103
+ } catch {
104
+ return null;
105
+ }
106
+ };
107
+ var buildDoneChunk = (parsed) => {
108
+ const promptEvalCount = typeof parsed.prompt_eval_count === "number" ? parsed.prompt_eval_count : undefined;
109
+ const evalCount = typeof parsed.eval_count === "number" ? parsed.eval_count : undefined;
110
+ const totalDuration = typeof parsed.total_duration === "number" ? parsed.total_duration : undefined;
111
+ const hasTokenCounts = promptEvalCount !== undefined || evalCount !== undefined;
112
+ if (hasTokenCounts) {
113
+ return {
114
+ type: "done",
115
+ usage: {
116
+ inputTokens: promptEvalCount ?? ZERO_TOKENS,
117
+ outputTokens: evalCount ?? ZERO_TOKENS
118
+ }
119
+ };
120
+ }
121
+ if (totalDuration !== undefined) {
122
+ return {
123
+ type: "done",
124
+ usage: { inputTokens: ZERO_TOKENS, outputTokens: ZERO_TOKENS }
125
+ };
126
+ }
127
+ return { type: "done" };
128
+ };
129
+ var buildTextChunk = (content) => ({
130
+ content,
131
+ type: "text"
132
+ });
133
+ var extractTextChunk = (parsed) => {
134
+ const { message } = parsed;
135
+ if (!isRecord(message)) {
136
+ return null;
137
+ }
138
+ const { content } = message;
139
+ if (typeof content !== "string" || !content) {
140
+ return null;
141
+ }
142
+ return buildTextChunk(content);
143
+ };
144
+ var processLine = (line) => {
145
+ const trimmed = line.trim();
146
+ if (!trimmed) {
147
+ return null;
148
+ }
149
+ const parsed = tryParseJSON(trimmed);
150
+ if (!parsed) {
151
+ return null;
152
+ }
153
+ if (parsed.done === true) {
154
+ return buildDoneChunk(parsed);
155
+ }
156
+ return extractTextChunk(parsed);
157
+ };
158
+ var processBufferedLines = (lines) => lines.map(processLine).filter((chunk) => chunk !== null);
159
+ var readStreamChunks = async (reader, decoder, buffer, signal) => {
160
+ const emptyChunks = [];
161
+ if (signal?.aborted) {
162
+ return {
163
+ allChunks: emptyChunks,
164
+ currentBuffer: buffer,
165
+ finished: true
166
+ };
167
+ }
168
+ const result = await reader.read();
169
+ const { done, value } = result;
170
+ if (done) {
171
+ return {
172
+ allChunks: emptyChunks,
173
+ currentBuffer: buffer,
174
+ finished: true
175
+ };
176
+ }
177
+ const currentBuffer = buffer + decoder.decode(value, { stream: true });
178
+ const lines = currentBuffer.split(`
179
+ `);
180
+ const remainder = lines.pop() ?? "";
181
+ const allChunks = processBufferedLines(lines);
182
+ const finished = allChunks.some((c) => c.type === "done");
183
+ return { allChunks, currentBuffer: remainder, finished };
184
+ };
185
+ var parseNDJSONStream = async function* (body, signal) {
186
+ const reader = body.getReader();
187
+ try {
188
+ yield* parseNDJSONStreamInner(reader, signal);
189
+ } finally {
190
+ reader.releaseLock();
191
+ }
192
+ };
193
+ var parseNDJSONStreamInner = async function* (reader, signal) {
194
+ const decoder = new TextDecoder;
195
+ let buffer = "";
196
+ let done = false;
197
+ while (!done) {
198
+ const result = await readStreamChunks(reader, decoder, buffer, signal);
199
+ buffer = result.currentBuffer;
200
+ done = result.finished;
201
+ yield* result.allChunks;
202
+ }
203
+ yield DONE_CHUNK;
204
+ };
205
+ var fetchAndStream = async function* (baseUrl, params) {
206
+ const requestBody = buildRequestBody(params);
207
+ const response = await fetch(`${baseUrl}/api/chat`, {
208
+ body: JSON.stringify(requestBody),
209
+ headers: { "Content-Type": "application/json" },
210
+ method: "POST",
211
+ signal: params.signal
212
+ });
213
+ if (!response.ok) {
214
+ const errorText = await response.text();
215
+ throw new Error(`Ollama API error ${response.status}: ${errorText}`);
216
+ }
217
+ if (!response.body) {
218
+ throw new Error("Ollama API returned no response body");
219
+ }
220
+ yield* parseNDJSONStream(response.body, params.signal);
221
+ };
222
+ var ollama = (config = {}) => {
223
+ const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
224
+ return {
225
+ stream: (params) => fetchAndStream(baseUrl, params)
226
+ };
227
+ };
228
+ export {
229
+ ollama
230
+ };
231
+
232
+ //# debugId=7579757CE08DC46864756E2164756E21
233
+ //# sourceMappingURL=ollama.js.map