@dxos/assistant 0.8.1-main.ba2dec9 → 0.8.1-staging.5be625a

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 (70) hide show
  1. package/dist/lib/browser/chunk-BDMTBYIM.mjs +2285 -0
  2. package/dist/lib/browser/chunk-BDMTBYIM.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +313 -1631
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +15 -1
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node/chunk-A44NGSCM.cjs +2296 -0
  9. package/dist/lib/node/chunk-A44NGSCM.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +321 -1629
  11. package/dist/lib/node/index.cjs.map +4 -4
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/testing/index.cjs +18 -7
  14. package/dist/lib/node/testing/index.cjs.map +4 -4
  15. package/dist/lib/node-esm/chunk-J6DMSFSZ.mjs +2287 -0
  16. package/dist/lib/node-esm/chunk-J6DMSFSZ.mjs.map +7 -0
  17. package/dist/lib/node-esm/index.mjs +313 -1631
  18. package/dist/lib/node-esm/index.mjs.map +4 -4
  19. package/dist/lib/node-esm/meta.json +1 -1
  20. package/dist/lib/node-esm/testing/index.mjs +15 -1
  21. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  22. package/dist/types/src/ai-service/defs.d.ts +8 -2
  23. package/dist/types/src/ai-service/defs.d.ts.map +1 -1
  24. package/dist/types/src/ai-service/edge-client.d.ts.map +1 -1
  25. package/dist/types/src/ai-service/message-collector.d.ts +16 -16
  26. package/dist/types/src/ai-service/message-collector.d.ts.map +1 -1
  27. package/dist/types/src/ai-service/ollama-client.d.ts +1 -5
  28. package/dist/types/src/ai-service/ollama-client.d.ts.map +1 -1
  29. package/dist/types/src/ai-service/parser.d.ts +8 -8
  30. package/dist/types/src/ai-service/parser.d.ts.map +1 -1
  31. package/dist/types/src/ai-service/types.d.ts +90 -156
  32. package/dist/types/src/ai-service/types.d.ts.map +1 -1
  33. package/dist/types/src/conversation/conversation.d.ts +8 -8
  34. package/dist/types/src/conversation/conversation.d.ts.map +1 -1
  35. package/dist/types/src/index.d.ts +1 -0
  36. package/dist/types/src/index.d.ts.map +1 -1
  37. package/dist/types/src/session/index.d.ts +2 -0
  38. package/dist/types/src/session/index.d.ts.map +1 -0
  39. package/dist/types/src/session/session.d.ts +215 -0
  40. package/dist/types/src/session/session.d.ts.map +1 -0
  41. package/dist/types/src/session/session.test.d.ts +2 -0
  42. package/dist/types/src/session/session.test.d.ts.map +1 -0
  43. package/dist/types/src/testing/index.d.ts +1 -0
  44. package/dist/types/src/testing/index.d.ts.map +1 -1
  45. package/dist/types/src/testing/ollama.d.ts +6 -0
  46. package/dist/types/src/testing/ollama.d.ts.map +1 -0
  47. package/package.json +13 -13
  48. package/src/ai-service/client.test.ts +10 -10
  49. package/src/ai-service/defs.ts +18 -3
  50. package/src/ai-service/edge-client.ts +3 -2
  51. package/src/ai-service/ollama-client.ts +49 -23
  52. package/src/ai-service/parser.ts +1 -0
  53. package/src/ai-service/types.ts +2 -2
  54. package/src/bin/chat.ts +2 -2
  55. package/src/conversation/conversation.test.ts +3 -3
  56. package/src/index.ts +1 -0
  57. package/src/session/index.ts +5 -0
  58. package/src/session/session.test.ts +256 -0
  59. package/src/session/session.ts +369 -0
  60. package/src/testing/artifacts.test.ts +2 -2
  61. package/src/testing/index.ts +1 -0
  62. package/src/testing/object-extraction.test.ts +1 -1
  63. package/src/testing/ollama.ts +15 -0
  64. package/src/testing/query.test.ts +3 -3
  65. package/dist/lib/browser/chunk-AXUUNA7O.mjs +0 -565
  66. package/dist/lib/browser/chunk-AXUUNA7O.mjs.map +0 -7
  67. package/dist/lib/node/chunk-QPHGQINW.cjs +0 -577
  68. package/dist/lib/node/chunk-QPHGQINW.cjs.map +0 -7
  69. package/dist/lib/node-esm/chunk-GOVFOBIB.mjs +0 -567
  70. package/dist/lib/node-esm/chunk-GOVFOBIB.mjs.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/ai-service/defs.ts", "../../../src/ai-service/edge-client.ts", "../../../src/ai-service/stream.ts", "../../../src/ai-service/util/sse.ts", "../../../src/ai-service/message-collector.ts", "../../../src/ai-service/ollama-client.ts", "../../../src/ai-service/types.ts", "../../../src/conversation/conversation.ts", "../../../src/ai-service/parser.ts", "../../../src/ai-service/transform.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\n// TODO(burdon): Share with Edge.\n// TODO(burdon): Move to service config retrieved by HTTP?\n\nexport const DEFAULT_LLM_MODEL = '@anthropic/claude-3-5-sonnet-20241022';\n\nexport const DEFAULT_LLM_MODELS = [\n // AI Gateway.\n // https://developers.cloudflare.com/ai-gateway\n '@anthropic/claude-3-5-haiku-20241022',\n '@anthropic/claude-3-5-sonnet-20241022',\n '@anthropic/claude-3-7-sonnet-20250219',\n\n // Workers AI.\n // https://developers.cloudflare.com/workers-ai/models\n '@cf/deepseek-ai/deepseek-r1-distill-qwen-32b',\n '@hf/nousresearch/hermes-2-pro-mistral-7b',\n '@ollama/llama-3-1-nemotron-70b-instruct',\n '@ollama/llama-3-1-nemotron-mini-4b-instruct',\n '@ollama/llama-3-2-3b',\n];\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema as S } from 'effect';\n\nimport { Message } from '@dxos/artifact';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport type { AIServiceClient, GenerationStream } from './service';\nimport { createGenerationStream } from './stream';\nimport { type GenerateRequest } from './types';\n\nexport type AIServiceEdgeClientOptions = {\n endpoint: string;\n};\n\nexport class AIServiceEdgeClient implements AIServiceClient {\n private readonly _endpoint: string;\n\n constructor({ endpoint }: AIServiceEdgeClientOptions) {\n invariant(endpoint, 'endpoint is required');\n this._endpoint = endpoint;\n }\n\n /**\n * @deprecated\n */\n // TODO(burdon): Remove.\n async appendMessages(messages: Message[]): Promise<void> {\n const url = `${this._endpoint}/message`;\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n messages: await S.encodePromise(S.Array(Message))(messages),\n }),\n });\n\n if (!res.ok) {\n throw new Error(`${await res.text()} [${url}]`);\n }\n }\n\n /**\n * Process request and open message stream.\n */\n async exec(request: GenerateRequest): Promise<GenerationStream> {\n log.info('requesting', { endpoint: this._endpoint });\n const controller = new AbortController();\n const response = await fetch(`${this._endpoint}/generate`, {\n signal: controller.signal,\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n // TODO(dmaretskyi): Errors if tools are not provided.\n tools: request.tools ?? [],\n ...request,\n }),\n });\n\n invariant(response.body instanceof ReadableStream);\n return createGenerationStream(response, controller);\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { log } from '@dxos/log';\n\nimport type { GenerationStream } from './service';\nimport { type GenerationStreamEvent } from './types';\nimport { iterSSEMessages } from './util';\n\n/**\n * Creates a stream from an SSE response.\n */\nexport const createGenerationStream = (response: Response, controller = new AbortController()): GenerationStream => {\n const iterator = async function* () {\n for await (const sse of iterSSEMessages(response, controller)) {\n if (sse.event === 'completion') {\n try {\n yield JSON.parse(sse.data);\n } catch (err) {\n log.error('could not parse message into JSON:', { data: sse.data, raw: sse.raw });\n throw err;\n }\n }\n\n if (\n sse.event === 'message_start' ||\n sse.event === 'message_delta' ||\n sse.event === 'message_stop' ||\n sse.event === 'content_block_start' ||\n sse.event === 'content_block_delta' ||\n sse.event === 'content_block_stop'\n ) {\n try {\n yield JSON.parse(sse.data);\n } catch (err) {\n log.error('could not parse message into JSON:', { data: sse.data, raw: sse.raw });\n throw err;\n }\n }\n\n if (sse.event === 'ping') {\n continue;\n }\n\n if (sse.event === 'error') {\n throw new Error(`Message generation error: ${sse.data}`);\n }\n }\n };\n\n return new GenerationStreamImpl(controller, iterator);\n};\n\n/**\n * Server-Sent Events (SSE) stream from the AI service.\n * https://html.spec.whatwg.org/multipage/server-sent-events.html#server-sent-events\n */\nexport class GenerationStreamImpl implements GenerationStream {\n /**\n * Trigger event when the stream is done.\n */\n private readonly _done = new Trigger();\n\n /**\n * Iterator over the stream.\n */\n private _iterator?: AsyncIterator<GenerationStreamEvent> = undefined;\n\n constructor(\n private readonly _controller: AbortController,\n private readonly _getIterator: () => AsyncIterableIterator<GenerationStreamEvent>,\n ) {}\n\n /**\n * Returns an iterator over the stream.\n */\n [Symbol.asyncIterator](): AsyncIterator<GenerationStreamEvent> {\n return this._createIterator();\n }\n\n /**\n * Aborts the stream.\n */\n abort() {\n this._controller.abort();\n }\n\n /**\n * Returns the complete message list generated by the AI service.\n */\n async complete() {\n await this._done.wait();\n }\n\n /**\n * Creates an iterator over the stream.\n */\n private _createIterator(): AsyncIterator<GenerationStreamEvent> {\n const self = this;\n return (this._iterator ??= (() => {\n const generator = async function* (this: GenerationStreamImpl) {\n try {\n for await (const event of self._getIterator()) {\n yield event;\n }\n this._done.wake();\n } catch (err: any) {\n this._done.throw(err);\n throw err;\n }\n };\n\n return generator.call(this);\n })());\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n// Copied from anthropic SDK source\n//\n\n/**\n * Server sent events (SSE) iterator.\n * @param response\n * @param controller\n */\nexport async function* iterSSEMessages(\n response: Response,\n controller: AbortController,\n): AsyncGenerator<ServerSentEvent, void, unknown> {\n if (!response.body) {\n controller.abort();\n throw new Error('Attempted to iterate over a response with no body');\n }\n\n const sseDecoder = new SSEDecoder();\n const lineDecoder = new LineDecoder();\n\n const iter = readableStreamAsyncIterable<Bytes>(response.body);\n for await (const sseChunk of iterSSEChunks(iter)) {\n for (const line of lineDecoder.decode(sseChunk)) {\n const sse = sseDecoder.decode(line);\n if (sse) {\n yield sse;\n }\n }\n }\n\n for (const line of lineDecoder.flush()) {\n const sse = sseDecoder.decode(line);\n if (sse) {\n yield sse;\n }\n }\n}\n\nexport type ServerSentEvent = {\n event: string | null;\n data: string;\n raw: string[];\n};\n\n/**\n * Given an async iterable iterator, iterates over it and yields full\n * SSE chunks, i.e. yields when a double new-line is encountered.\n */\nasync function* iterSSEChunks(iterator: AsyncIterableIterator<Bytes>): AsyncGenerator<Uint8Array> {\n let data = new Uint8Array();\n\n for await (const chunk of iterator) {\n if (chunk == null) {\n continue;\n }\n\n const binaryChunk =\n chunk instanceof ArrayBuffer\n ? new Uint8Array(chunk)\n : typeof chunk === 'string'\n ? new TextEncoder().encode(chunk)\n : chunk;\n\n const newData = new Uint8Array(data.length + binaryChunk.length);\n newData.set(data);\n newData.set(binaryChunk, data.length);\n data = newData;\n\n let patternIndex;\n while ((patternIndex = findDoubleNewlineIndex(data)) !== -1) {\n yield data.slice(0, patternIndex);\n data = data.slice(patternIndex);\n }\n }\n\n if (data.length > 0) {\n yield data;\n }\n}\n\nconst findDoubleNewlineIndex = (buffer: Uint8Array): number => {\n // This function searches the buffer for the end patterns (\\r\\r, \\n\\n, \\r\\n\\r\\n)\n // and returns the index right after the first occurrence of any pattern,\n // or -1 if none of the patterns are found.\n const newline = 0x0a; // \\n\n const carriage = 0x0d; // \\r\n\n for (let i = 0; i < buffer.length - 2; i++) {\n if (buffer[i] === newline && buffer[i + 1] === newline) {\n // \\n\\n\n return i + 2;\n }\n if (buffer[i] === carriage && buffer[i + 1] === carriage) {\n // \\r\\r\n return i + 2;\n }\n if (\n buffer[i] === carriage &&\n buffer[i + 1] === newline &&\n i + 3 < buffer.length &&\n buffer[i + 2] === carriage &&\n buffer[i + 3] === newline\n ) {\n // \\r\\n\\r\\n\n return i + 4;\n }\n }\n\n return -1;\n};\n\nclass SSEDecoder {\n private data: string[];\n private event: string | null;\n private chunks: string[];\n\n constructor() {\n this.event = null;\n this.data = [];\n this.chunks = [];\n }\n\n decode(line: string) {\n if (line.endsWith('\\r')) {\n line = line.substring(0, line.length - 1);\n }\n\n if (!line) {\n // empty line and we didn't previously encounter any messages\n if (!this.event && !this.data.length) {\n return null;\n }\n\n const sse: ServerSentEvent = {\n event: this.event,\n data: this.data.join('\\n'),\n raw: this.chunks,\n };\n\n this.event = null;\n this.data = [];\n this.chunks = [];\n\n return sse;\n }\n\n this.chunks.push(line);\n\n if (line.startsWith(':')) {\n return null;\n }\n\n let [fieldname, _, value] = partition(line, ':');\n\n if (value.startsWith(' ')) {\n value = value.substring(1);\n }\n\n if (fieldname === 'event') {\n this.event = value;\n } else if (fieldname === 'data') {\n this.data.push(value);\n }\n\n return null;\n }\n}\n\n/** This is an internal helper function that's just used for testing */\nexport const _decodeChunks = (chunks: string[]): string[] => {\n const decoder = new LineDecoder();\n const lines: string[] = [];\n for (const chunk of chunks) {\n lines.push(...decoder.decode(chunk));\n }\n\n return lines;\n};\n\nconst partition = (str: string, delimiter: string): [string, string, string] => {\n const index = str.indexOf(delimiter);\n if (index !== -1) {\n return [str.substring(0, index), delimiter, str.substring(index + delimiter.length)];\n }\n\n return [str, '', ''];\n};\n\n/**\n * Most browsers don't yet have async iterable support for ReadableStream,\n * and Node has a very different way of reading bytes from its \"ReadableStream\".\n *\n * This polyfill was pulled from https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490\n */\nexport function readableStreamAsyncIterable<T>(stream: any): AsyncIterableIterator<T> {\n if (stream[Symbol.asyncIterator]) {\n return stream;\n }\n\n const reader = stream.getReader();\n return {\n next: async () => {\n try {\n const result = await reader.read();\n if (result?.done) {\n reader.releaseLock();\n } // release lock when stream becomes closed\n return result;\n } catch (e) {\n reader.releaseLock(); // release lock when stream becomes errored\n throw e;\n }\n },\n return: async () => {\n const cancelPromise = reader.cancel();\n reader.releaseLock();\n await cancelPromise;\n return { done: true, value: undefined };\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n}\n\nexport type Bytes = string | ArrayBuffer | Uint8Array | Buffer | null | undefined;\n\n/**\n * A re-implementation of httpx's `LineDecoder` in Python that handles incrementally\n * reading lines from text.\n *\n * https://github.com/encode/httpx/blob/920333ea98118e9cf617f246905d7b202510941c/httpx/_decoders.py#L258\n */\nexport class LineDecoder {\n // prettier-ignore\n static NEWLINE_CHARS = new Set(['\\n', '\\r']);\n static NEWLINE_REGEXP = /\\r\\n|[\\n\\r]/g;\n\n buffer: string[];\n trailingCR: boolean;\n textDecoder: any; // TextDecoder found in browsers; not typed to avoid pulling in either \"dom\" or \"node\" types.\n\n constructor() {\n this.buffer = [];\n this.trailingCR = false;\n }\n\n decode(chunk: Bytes): string[] {\n let text = this.decodeText(chunk);\n\n if (this.trailingCR) {\n text = '\\r' + text;\n this.trailingCR = false;\n }\n if (text.endsWith('\\r')) {\n this.trailingCR = true;\n text = text.slice(0, -1);\n }\n\n if (!text) {\n return [];\n }\n\n const trailingNewline = LineDecoder.NEWLINE_CHARS.has(text[text.length - 1] || '');\n let lines = text.split(LineDecoder.NEWLINE_REGEXP);\n\n // if there is a trailing new line then the last entry will be an empty\n // string which we don't care about\n if (trailingNewline) {\n lines.pop();\n }\n\n if (lines.length === 1 && !trailingNewline) {\n this.buffer.push(lines[0]!);\n return [];\n }\n\n if (this.buffer.length > 0) {\n lines = [this.buffer.join('') + lines[0], ...lines.slice(1)];\n this.buffer = [];\n }\n\n if (!trailingNewline) {\n this.buffer = [lines.pop() || ''];\n }\n\n return lines;\n }\n\n decodeText(bytes: Bytes): string {\n if (bytes == null) {\n return '';\n }\n if (typeof bytes === 'string') {\n return bytes;\n }\n\n // Node:\n if (typeof Buffer !== 'undefined') {\n if (bytes instanceof Buffer) {\n return bytes.toString();\n }\n if (bytes instanceof Uint8Array) {\n return Buffer.from(bytes).toString();\n }\n\n throw new Error(\n `Unexpected: received non-Uint8Array (${bytes.constructor.name}) stream chunk in an environment with a global \"Buffer\" defined, which this library assumes to be Node. Please report this error.`,\n );\n }\n\n // Browser\n if (typeof TextDecoder !== 'undefined') {\n if (bytes instanceof Uint8Array || bytes instanceof ArrayBuffer) {\n this.textDecoder ??= new TextDecoder('utf8');\n return this.textDecoder.decode(bytes);\n }\n\n throw new Error(\n `Unexpected: received non-Uint8Array/ArrayBuffer (${\n (bytes as any).constructor.name\n }) in a web platform. Please report this error.`,\n );\n }\n\n throw new Error('Unexpected: neither Buffer nor TextDecoder are available as globals. Please report this error.');\n }\n\n flush(): string[] {\n if (!this.buffer.length && !this.trailingCR) {\n return [];\n }\n\n const lines = [this.buffer.join('')];\n this.buffer = [];\n this.trailingCR = false;\n return lines;\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport type { Message } from '@dxos/artifact';\n\nimport type { GenerationStreamEvent } from './types';\n\nexport class MessageCollector {\n private _messages: Message[] = [];\n private _pendingMessage?: Message = undefined;\n\n public get messages() {\n return this._messages;\n }\n\n public get pendingMessage() {\n return this._pendingMessage;\n }\n\n push(event: GenerationStreamEvent) {\n switch (event.type) {\n case 'message_start':\n this._pendingMessage = event.message;\n break;\n\n case 'message_stop':\n if (this._pendingMessage) {\n this._messages.push(this._pendingMessage);\n this._pendingMessage = undefined;\n }\n break;\n\n case 'content_block_start':\n if (this._pendingMessage) {\n // Ensure the content array exists\n this._pendingMessage.content = this._pendingMessage.content || [];\n // Add the new content block at the specified index\n this._pendingMessage.content[event.index] = event.content;\n }\n break;\n\n case 'content_block_delta':\n if (this._pendingMessage && this._pendingMessage.content) {\n const block = this._pendingMessage.content[event.index];\n if (block && event.delta.type === 'text_delta' && block.type === 'text') {\n block.text = (block.text || '') + event.delta.text;\n }\n }\n break;\n\n case 'content_block_stop':\n // Mark the block as no longer pending if needed\n if (this._pendingMessage && this._pendingMessage.content) {\n const block = this._pendingMessage.content[event.index];\n if (block) {\n block.pending = false;\n }\n }\n break;\n\n case 'message_delta':\n // Apply any delta updates to the message\n if (this._pendingMessage && event.delta) {\n Object.assign(this._pendingMessage, event.delta);\n }\n break;\n }\n }\n\n pushMessage(message: Message) {\n this._messages.push(message);\n }\n}\n\nexport function* emitMessageAsEvents(message: Message): Iterable<GenerationStreamEvent> {\n yield {\n type: 'message_start',\n message,\n };\n yield {\n type: 'message_stop',\n };\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type MessageContentBlock, defineTool, type Tool, ToolResult } from '@dxos/artifact';\nimport { ObjectId, S } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport { MessageCollector, emitMessageAsEvents } from './message-collector';\nimport { type AIServiceClient, type GenerationStream } from './service';\nimport { GenerationStreamImpl } from './stream';\nimport { ToolTypes, type GenerateRequest, type GenerationStreamEvent } from './types';\nimport { isToolUse, runTools } from '../conversation';\n\n// TODO(burdon): Config.\nconst DEFAULT_OLLAMA_URL = 'http://localhost:11434';\nconst DEFAULT_OLLAMA_MODEL = 'llama3.2:1b';\n\nexport type OllamaClientParams = {\n endpoint?: string;\n\n /**\n * Tools that are executed within the client.\n */\n tools?: Tool[];\n\n /**\n * Override generation parameters.\n */\n // TODO(burdon): Why not just options?\n overrides?: {\n model?: string;\n temperature?: number;\n };\n\n /**\n * Maximum number of tool invocations in a single request that is allowed to run.\n * @default 3\n */\n maxToolInvocations?: number;\n};\n\nexport class OllamaClient implements AIServiceClient {\n /**\n * Create a test client with small local model and no temperature for predictable results.\n */\n static createClient(options?: Pick<OllamaClientParams, 'tools'>) {\n return new OllamaClient({\n tools: options?.tools,\n overrides: { model: DEFAULT_OLLAMA_MODEL, temperature: 0 },\n });\n }\n\n /**\n * Check if Ollama server is running and accessible.\n * @returns Promise that resolves to true if Ollama is running, false otherwise.\n */\n static async isRunning(): Promise<boolean> {\n try {\n const response = await fetch(`${DEFAULT_OLLAMA_URL}/api/version`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n signal: AbortSignal.timeout(100),\n });\n\n return response.ok;\n } catch (error) {\n return false;\n }\n }\n\n private readonly _endpoint: string;\n private readonly _tools: Tool[];\n private readonly _modelOverride?: string;\n private readonly _temperatureOverride?: number;\n private readonly _maxToolInvocations: number;\n\n constructor({ endpoint, tools, overrides, maxToolInvocations }: OllamaClientParams) {\n this._endpoint = endpoint ?? DEFAULT_OLLAMA_URL;\n this._tools = tools ?? [];\n this._modelOverride = overrides?.model;\n this._temperatureOverride = overrides?.temperature;\n this._maxToolInvocations = maxToolInvocations ?? 3;\n }\n\n private _getEmbededTools(clientTools: Tool[]) {\n return [\n ...this._tools,\n ...clientTools\n .filter((tool) => tool.type !== undefined && WELL_KNOWN_TOOLS[tool.type])\n .map((tool) => WELL_KNOWN_TOOLS[tool.type!]),\n ];\n }\n\n private async *_generateStream(request: GenerateRequest, signal?: AbortSignal): AsyncIterable<GenerationStreamEvent> {\n invariant(request.prompt === undefined, 'Prompt must be in history');\n\n // Map DXOS request to Ollama API format.\n const ollamaRequest: OllamaRequest = {\n model: this._modelOverride ?? request.model ?? 'llama3',\n messages: [],\n stream: true,\n options: {\n temperature: this._temperatureOverride ?? 0.7,\n },\n };\n\n // Add system message if provided.\n if (request.systemPrompt) {\n ollamaRequest.messages.push({\n role: 'system',\n content: request.systemPrompt,\n });\n }\n\n // Add history if provided.\n if (request.history?.length) {\n for (const message of request.history) {\n const role = message.role === 'assistant' ? 'assistant' : 'user';\n\n // Process message content.\n if (message.content.length === 0) {\n // Skip empty messages\n continue;\n }\n\n for (const content of message.content) {\n switch (content.type) {\n case 'text': {\n ollamaRequest.messages.push({\n role,\n content: content.text,\n });\n break;\n }\n case 'tool_use': {\n ollamaRequest.messages.push({\n role: 'assistant',\n content: '',\n tool_calls: [\n {\n function: {\n name: content.name,\n arguments: content.input as any,\n },\n },\n ],\n });\n break;\n }\n case 'tool_result': {\n ollamaRequest.messages.push({\n role: 'tool',\n content: JSON.stringify({\n type: 'tool_result',\n toolUseId: content.toolUseId,\n content: content.content,\n }),\n });\n break;\n }\n }\n }\n }\n }\n\n // Add tools if provided.\n if (request.tools?.length || this._tools.length) {\n const allTools = [...(request.tools ?? []), ...this._tools];\n const withWellKnownTools = allTools.map((tool) =>\n tool.type !== undefined && WELL_KNOWN_TOOLS[tool.type] ? WELL_KNOWN_TOOLS[tool.type] : tool,\n );\n\n if (withWellKnownTools.length > 0) {\n ollamaRequest.tools = withWellKnownTools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties: tool.parameters?.properties,\n required: tool.parameters?.required,\n },\n },\n }));\n }\n }\n\n log.info('generate request', { history: request.history, prompt: request.prompt, ollamaRequest });\n\n const response = await fetch(`${this._endpoint}/api/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(ollamaRequest),\n signal,\n });\n\n // log.info('ollama response', { response: await response.text() });\n\n if (!response.ok) {\n throw new Error(`Ollama API error: ${response.status} ${response.statusText}`);\n }\n\n if (!response.body) {\n throw new Error('Ollama API returned no response body');\n }\n\n // Create the stream\n const reader = response\n .body!.pipeThrough(new TextDecoderStream())\n .pipeThrough(new OllamaDecoderStream())\n .getReader();\n\n try {\n // Create a message ID.\n const messageId = ObjectId.random();\n\n // Send message_start event with proper message structure.\n yield {\n type: 'message_start',\n message: {\n id: messageId,\n role: 'assistant',\n content: [],\n },\n } as GenerationStreamEvent;\n\n // Initialize text content block.\n const textBlock: MessageContentBlock = {\n type: 'text',\n text: '',\n };\n\n let currentBlockIndex = 0;\n\n // Send content_block_start event.\n yield {\n type: 'content_block_start',\n index: currentBlockIndex,\n content: textBlock,\n } as GenerationStreamEvent;\n\n while (true) {\n const { done, value: data } = await reader.read();\n\n if (done) {\n break;\n }\n\n log.info('ollama data', { data });\n\n // Ollama sends chunks of text, we convert them to our event format.\n if (data.message?.content) {\n yield {\n type: 'content_block_delta',\n index: 0,\n delta: {\n type: 'text_delta',\n text: data.message.content,\n },\n } as GenerationStreamEvent;\n }\n\n // If tool usage is detected.\n if (data.message?.tool_calls && data.message?.tool_calls?.length > 0) {\n if (data.message.tool_calls.length > 1) {\n log.warn('Ollama returned multiple tool calls. Only the first one will be used.');\n }\n\n yield {\n type: 'content_block_stop',\n index: currentBlockIndex++,\n } as GenerationStreamEvent;\n\n yield {\n type: 'content_block_start',\n index: currentBlockIndex,\n content: {\n type: 'tool_use',\n id: ObjectId.random(),\n name: data.message.tool_calls[0].function.name,\n input: sanitizeToolArguments(data.message.tool_calls[0].function.arguments),\n },\n } as GenerationStreamEvent;\n\n yield {\n type: 'message_delta',\n delta: {\n stopReason: 'tool_use',\n },\n } as GenerationStreamEvent;\n }\n }\n\n // Send content_block_stop and message_stop events.\n yield {\n type: 'content_block_stop',\n index: currentBlockIndex,\n } as GenerationStreamEvent;\n\n yield {\n type: 'message_stop',\n } as GenerationStreamEvent;\n } finally {\n reader.releaseLock();\n }\n }\n\n async exec(request: GenerateRequest): Promise<GenerationStream> {\n const controller = new AbortController();\n\n try {\n return new GenerationStreamImpl(\n controller,\n async function* (this: OllamaClient) {\n const collector = new MessageCollector();\n\n // Loop while running tools.\n let toolInvocations = 0;\n while (true) {\n for await (const event of this._generateStream(\n {\n ...request,\n history: [\n ...(request.history ?? []),\n ...(request.prompt ? [request.prompt] : []),\n ...collector.messages,\n ],\n prompt: undefined,\n },\n controller.signal,\n )) {\n collector.push(event);\n yield event;\n }\n\n if (\n collector.messages.length > 0 &&\n !isToolUse(collector.messages.at(-1)!, {\n onlyToolNames: this._getEmbededTools(request.tools ?? []).map((tool) => tool.name),\n })\n ) {\n break;\n }\n\n if (++toolInvocations > this._maxToolInvocations) {\n throw new Error('Maximum number of tool invocations reached');\n }\n\n const result = await runTools({\n message: collector.messages.at(-1)!,\n tools: this._getEmbededTools(request.tools ?? []),\n });\n\n switch (result.type) {\n case 'continue': {\n collector.pushMessage(result.message);\n yield* emitMessageAsEvents(result.message);\n break;\n }\n case 'break': {\n throw new Error('Tool use breaks not allowed');\n }\n }\n }\n }.bind(this),\n );\n } catch (error) {\n controller.abort();\n throw error;\n }\n }\n}\n\nconst sanitizeToolArguments = (args: any) => {\n // TODO(dmaretskyi): Workaround for model bug.\n if (args.type === 'object' && typeof args.properties === 'object' && Array.isArray(args.required)) {\n return args.properties;\n }\n\n return args;\n};\n\nconst SAMPLE_IMAGE_URL = 'https://images.nightcafe.studio/jobs/BNmcRhHCM1JRKoUtqSei/BNmcRhHCM1JRKoUtqSei--1--5b9rv.jpg';\n\nconst WELL_KNOWN_TOOLS: Record<string, Tool> = {\n [ToolTypes.TextToImage]: defineTool('system', {\n name: 'text-to-image',\n description: 'Generate an image from a text prompt',\n schema: S.Struct({\n prompt: S.String.annotations({ description: 'The text prompt describing the image to generate' }),\n }),\n execute: async ({ prompt }) => {\n const image = await fetch(SAMPLE_IMAGE_URL).then(async (res) => Buffer.from(await res.arrayBuffer()));\n\n const imageBase64 = image.toString('base64');\n const id = ObjectId.random();\n\n return ToolResult.Success(`The generation was successful. Image ID: ${id} Prompt: ${prompt}`, [\n {\n type: 'image',\n id,\n source: {\n type: 'base64',\n mediaType: 'image/jpeg',\n data: imageBase64,\n },\n },\n ]);\n },\n }),\n};\n\ntype OllamaMessage = {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n tool_calls?: Array<{\n function: {\n name: string;\n arguments: string;\n };\n }>;\n};\n\ntype OllamaRequest = {\n model: string;\n messages: Array<OllamaMessage>;\n stream: boolean;\n options?: {\n temperature?: number;\n };\n tools?: Array<{\n type: 'function';\n function: {\n name: string;\n description?: string;\n parameters?: any;\n };\n }>;\n};\n\ntype OllamaResponseData = {\n message?: OllamaMessage;\n};\n\nclass OllamaDecoderStream extends TransformStream<string, OllamaResponseData> {\n private _buffer = '';\n\n constructor() {\n super({\n transform: (chunk, controller) => {\n this._buffer += chunk;\n const lines = this._buffer.split('\\n');\n this._buffer = lines.pop() || '';\n for (const line of lines) {\n controller.enqueue(JSON.parse(line.trim()));\n }\n },\n flush: (controller) => {\n this._buffer = this._buffer.trim();\n if (this._buffer.length > 0) {\n controller.enqueue(JSON.parse(this._buffer));\n }\n },\n });\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Schema as S } from 'effect';\n\nimport { Tool, Message, type MessageContentBlock, SpaceIdSchema } from '@dxos/artifact';\nimport { ObjectId } from '@dxos/echo-schema';\n\nimport { DEFAULT_LLM_MODELS } from './defs';\n\nexport const createArtifactElement = (id: ObjectId) => `<artifact id=${id} />`;\n\nexport const LLMModel = S.Literal(...DEFAULT_LLM_MODELS);\n\nexport type LLMModel = S.Schema.Type<typeof LLMModel>;\n\nexport const ToolTypes = Object.freeze({\n // TODO(dmaretskyi): Not implemented yet.\n // DatabaseQuery: 'database_query',\n TextToImage: 'text_to_image',\n});\n\n/**\n * Client GPT request.\n */\nexport const GenerateRequest = S.Struct({\n spaceId: S.optional(SpaceIdSchema),\n threadId: S.optional(ObjectId),\n\n /**\n * Preferred model or system default.\n */\n model: S.optional(LLMModel),\n\n /**\n * Tools available for the LLM.\n */\n tools: S.optional(S.Array(Tool).pipe(S.mutable)),\n\n /**\n * System instructions to the LLM.\n */\n systemPrompt: S.optional(S.String),\n\n /**\n * History of messages to include in the context window.\n */\n // TODO(burdon): Rename messages.\n history: S.optional(S.Array(Message)),\n\n /**\n * Current request.\n */\n prompt: S.optional(Message),\n});\n\nexport type GenerateRequest = S.Schema.Type<typeof GenerateRequest>;\n\n/**\n * Server-Sent Events (SSE) stream from the AI service.\n * https://docs.anthropic.com/en/api/streaming\n * https://platform.openai.com/docs/api-reference/streaming\n * https://html.spec.whatwg.org/multipage/server-sent-events.html#server-sent-events\n */\n// TODO(dmaretskyi): Effect schema.\nexport type GenerationStreamEvent =\n | {\n // TODO(dmaretskyi): Normalize types to our schema.\n type: 'message_start';\n message: Omit<Message, 'spaceId' | 'threadId'>;\n }\n | {\n type: 'message_delta';\n delta: {\n stopReason: 'tool_use' | 'end_turn';\n };\n }\n | {\n type: 'message_stop';\n }\n | {\n type: 'content_block_start';\n index: number;\n content: MessageContentBlock;\n }\n | {\n type: 'content_block_delta';\n index: number;\n delta:\n | {\n type: 'text_delta';\n text: string;\n }\n | {\n type: 'input_json_delta';\n partial_json: string;\n };\n }\n | {\n type: 'content_block_stop';\n index: number;\n };\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Tool, ToolResult, Message } from '@dxos/artifact';\nimport { createStatic, ObjectId } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { type SpaceId } from '@dxos/keys';\nimport { log } from '@dxos/log';\n\nimport { type AIServiceClient, type GenerationStreamEvent, type LLMModel } from '../ai-service';\n\nexport type CreateLLMConversationParams = {\n model: LLMModel;\n\n spaceId?: SpaceId;\n threadId?: ObjectId;\n\n /**\n * System prompt that specifies instructions for the LLM.\n */\n system?: string;\n\n tools: Tool[];\n history?: Message[];\n client: AIServiceClient;\n\n logger?: (event: ConversationEvent) => void;\n};\n\nexport type ConversationEvent =\n | {\n type: 'message';\n message: Message;\n }\n | GenerationStreamEvent;\n\n// TODO(burdon): Replace with processor from plugin-automation?\nexport const runLLM = async (params: CreateLLMConversationParams) => {\n let conversationResult: any = null;\n const history = params.history ?? [];\n\n const generate = async () => {\n log('llm generate', { tools: params.tools });\n const beginTs = Date.now();\n const stream = await params.client.exec({\n model: params.model,\n spaceId: params.spaceId,\n threadId: params.threadId,\n history,\n systemPrompt: params.system,\n tools: params.tools as any,\n });\n\n for await (const event of stream) {\n params.logger?.(event);\n }\n\n // TODO(burdon): !!!\n await stream.complete();\n const messages: Message[] = [];\n const message = messages.at(-1);\n invariant(message);\n\n log('llm result', { time: Date.now() - beginTs, message });\n invariant(message);\n params.logger?.({ type: 'message', message });\n history.push(\n ...messages.map(\n (message): Message => ({ ...message, content: message.content.filter((block) => block.type !== 'image') }),\n ),\n );\n\n const isToolUse = message.content.at(-1)?.type === 'tool_use';\n if (isToolUse) {\n const toolCalls = message.content.filter((block) => block.type === 'tool_use');\n invariant(toolCalls.length === 1);\n const toolCall = toolCalls[0];\n const tool = params.tools.find((tool) => tool.name === toolCall.name);\n if (!tool) {\n throw new Error(`Tool not found: ${toolCall.name}`);\n }\n\n invariant(tool.execute);\n const toolResult = await tool.execute(toolCall.input);\n switch (toolResult.kind) {\n case 'error': {\n log.warn('tool error', { message: toolResult.message });\n const resultMessage: Message = {\n id: ObjectId.random(),\n spaceId: params.spaceId,\n threadId: params.threadId,\n role: 'user',\n content: [\n {\n type: 'tool_result',\n toolUseId: toolCall.id,\n content: toolResult.message,\n isError: true,\n },\n ],\n };\n params.logger?.({ type: 'message', message: resultMessage });\n history.push(resultMessage);\n\n return true;\n }\n\n case 'success': {\n log('tool success', { result: toolResult.result });\n const resultMessage: Message = {\n id: ObjectId.random(),\n spaceId: params.spaceId,\n threadId: params.threadId,\n role: 'user',\n content: [\n {\n type: 'tool_result',\n toolUseId: toolCall.id,\n content: JSON.stringify(toolResult.result),\n },\n ],\n };\n params.logger?.({ type: 'message', message: resultMessage });\n history.push(resultMessage);\n\n return true;\n }\n\n case 'break': {\n log('tool break', { result: toolResult.result });\n conversationResult = toolResult.result;\n return false;\n }\n }\n }\n\n return false;\n };\n\n // eslint-disable-next-line no-empty\n while (await generate()) {}\n\n return {\n result: conversationResult,\n history,\n };\n};\n\nexport const isToolUse = (message: Message, { onlyToolNames }: { onlyToolNames?: string[] } = {}) => {\n const block = message.content.at(-1);\n invariant(block);\n return block.type === 'tool_use' && (!onlyToolNames || onlyToolNames.includes(block.name));\n};\n\nexport type RunToolsOptions = {\n message: Message;\n tools: Tool[];\n extensions?: ToolContextExtensions;\n};\n\nexport type RunToolsResult =\n | {\n type: 'continue';\n message: Message;\n }\n | {\n type: 'break';\n result: unknown;\n };\n\nexport const runTools = async ({ message, tools, extensions }: RunToolsOptions): Promise<RunToolsResult> => {\n const toolCalls = message.content.filter((block) => block.type === 'tool_use');\n invariant(toolCalls.length === 1);\n const toolCall = toolCalls[0];\n const tool = tools.find((tool) => tool.name === toolCall.name);\n if (!tool) {\n throw new Error(`Tool not found: ${toolCall.name}`);\n }\n\n let toolResult: ToolResult;\n try {\n invariant(tool.execute);\n toolResult = await tool.execute(toolCall.input, { extensions });\n } catch (error: any) {\n log('tool error', { error });\n toolResult = ToolResult.Error(error.message);\n }\n\n switch (toolResult.kind) {\n case 'error': {\n log('tool error', { message: toolResult.message });\n const resultMessage = createStatic(Message, {\n role: 'user',\n content: [\n {\n type: 'tool_result',\n toolUseId: toolCall.id,\n content: toolResult.message,\n isError: true,\n },\n ],\n });\n\n // TODO(burdon): Retry count?\n return {\n type: 'continue',\n message: resultMessage,\n };\n }\n\n case 'success': {\n log('tool success', { result: toolResult.result });\n const resultMessage = createStatic(Message, {\n role: 'user',\n content: [\n {\n type: 'tool_result',\n toolUseId: toolCall.id,\n content:\n typeof toolResult.result === 'string' ? toolResult.result : JSON.stringify(toolResult.result) ?? '',\n },\n ...(toolResult.extractContentBlocks ?? []),\n ],\n });\n\n return {\n type: 'continue',\n message: resultMessage,\n };\n }\n\n case 'break': {\n log('tool break', { result: toolResult.result });\n return {\n type: 'break',\n result: toolResult.result,\n };\n }\n }\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Message, type MessageContentBlock } from '@dxos/artifact';\nimport { Event } from '@dxos/async';\nimport { createStatic } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { isNotFalsy, safeParseJson } from '@dxos/util';\n\nimport { type GenerationStream } from './service';\nimport { StreamTransform, type StreamBlock } from './transform';\nimport type { GenerationStreamEvent } from './types';\n\n/**\n * Parse mixed content of plain text, XML fragments, and JSON blocks.\n */\nexport class MixedStreamParser {\n /**\n * New message.\n */\n public message = new Event<Message>();\n\n /**\n * Complete block added to Message.\n */\n public block = new Event<MessageContentBlock>();\n\n /**\n * Update partial block (while streaming).\n */\n public update = new Event<MessageContentBlock>();\n\n public streamEvent = new Event<GenerationStreamEvent>();\n\n /**\n * Current message.\n */\n private _message?: Message | undefined;\n\n private _emitBlock(contentBlock: MessageContentBlock, streamBlock?: StreamBlock) {\n const messageBlock = streamBlock ? mergeMessageBlock(contentBlock, streamBlock) : contentBlock;\n if (messageBlock) {\n if (messageBlock.type === 'text' && messageBlock.text.length === 0) {\n return;\n }\n\n invariant(this._message);\n this._message.content.push(messageBlock);\n this.block.emit(messageBlock);\n }\n }\n\n private _emitUpdate(contentBlock: MessageContentBlock, streamBlock: StreamBlock) {\n const messageBlock = mergeMessageBlock(contentBlock, streamBlock);\n if (messageBlock) {\n messageBlock.pending = true;\n this.update.emit(messageBlock);\n }\n }\n\n /**\n * Parse stream until end.\n */\n async parse(stream: GenerationStream): Promise<Message[]> {\n const transformer = new StreamTransform();\n\n /**\n * Current content message block.\n */\n let contentBlock: MessageContentBlock | undefined;\n\n /**\n * Current partial block used to accumulate content.\n */\n let streamBlock: StreamBlock | undefined;\n const stack: StreamBlock[] = [];\n\n const messagesCollected: Message[] = [];\n\n for await (const event of stream) {\n this.streamEvent.emit(event);\n\n // log.info('event', { type: event.type, event });\n switch (event.type) {\n //\n // Messages.\n //\n\n case 'message_start': {\n if (this._message) {\n log.warn('unexpected message_start');\n }\n\n this._message = createStatic(Message, { role: event.message.role, content: [...event.message.content] });\n this.message.emit(this._message);\n break;\n }\n\n case 'message_delta': {\n if (!this._message) {\n log.warn('unexpected message_delta');\n }\n\n break;\n }\n\n case 'message_stop': {\n if (!this._message) {\n log.warn('unexpected message_stop');\n } else {\n messagesCollected.push(this._message);\n this._message = undefined;\n }\n break;\n }\n\n //\n // Content blocks.\n //\n\n case 'content_block_start': {\n if (contentBlock) {\n log.warn('unexpected content_block_start', { content: contentBlock });\n }\n\n // TODO(burdon): Parse initial content (factor out from content_block_delta).\n contentBlock = event.content;\n break;\n }\n\n case 'content_block_delta': {\n if (!contentBlock) {\n log.warn('unexpected content_block_delta');\n break;\n }\n\n switch (event.delta.type) {\n //\n // Text\n //\n case 'text_delta': {\n const chunks = transformer.transform(event.delta.text);\n for (const chunk of chunks) {\n // log.info('text_delta', { chunk, current });\n\n switch (streamBlock?.type) {\n //\n // XML Fragment.\n //\n case 'tag': {\n if (chunk.type === 'tag') {\n if (chunk.selfClosing) {\n streamBlock.content.push(chunk);\n } else if (chunk.closing) {\n if (stack.length > 0) {\n const top = stack.pop();\n invariant(top && top.type === 'tag');\n top.content.push(streamBlock);\n streamBlock = top;\n } else {\n this._emitBlock(contentBlock, streamBlock);\n streamBlock = undefined;\n }\n } else {\n stack.push(streamBlock);\n streamBlock = chunk;\n }\n } else {\n // Append text.\n if (streamBlock.content.length === 0) {\n streamBlock.content.push(chunk);\n } else {\n const last = streamBlock.content.at(-1);\n invariant(last);\n if (last.type === 'text') {\n last.content += chunk.content;\n } else {\n streamBlock.content.push(chunk);\n }\n }\n }\n break;\n }\n\n //\n // Text Fragment.\n //\n case 'text': {\n if (chunk.type === 'tag') {\n this._emitBlock(contentBlock, streamBlock);\n if (chunk.selfClosing) {\n this._emitBlock(contentBlock, chunk);\n streamBlock = undefined;\n } else {\n streamBlock = chunk;\n }\n } else {\n // Append text.\n streamBlock.content += chunk.content;\n }\n break;\n }\n\n //\n // No current chunk.\n //\n default: {\n if (chunk.type === 'tag' && chunk.selfClosing) {\n this._emitBlock(contentBlock, chunk);\n } else {\n streamBlock = chunk;\n }\n }\n }\n }\n break;\n }\n\n //\n // JSON\n //\n case 'input_json_delta': {\n if (!contentBlock) {\n log.warn('unexpected input_json_delta', { contentBlock });\n break;\n }\n\n if (streamBlock?.type === 'json') {\n streamBlock.content += event.delta.partial_json;\n } else {\n streamBlock = { type: 'json', content: event.delta.partial_json };\n }\n break;\n }\n }\n break;\n }\n\n case 'content_block_stop': {\n if (!contentBlock) {\n log.warn('unexpected content_block_stop');\n break;\n }\n\n this._emitBlock(contentBlock, streamBlock);\n contentBlock = undefined;\n streamBlock = undefined;\n break;\n }\n }\n\n if (contentBlock && streamBlock) {\n this._emitUpdate(contentBlock, streamBlock);\n }\n } // for.\n\n return messagesCollected;\n }\n}\n\n/**\n * Convert stream block to message content block.\n */\nexport const mergeMessageBlock = (\n contentBlock: MessageContentBlock,\n streamBlock: StreamBlock,\n): MessageContentBlock | undefined => {\n log('mergeMessageBlock', { contentBlock, streamBlock });\n\n switch (streamBlock.type) {\n //\n // Text\n //\n case 'text': {\n return { ...contentBlock, type: 'text', text: streamBlock.content };\n }\n\n //\n // XML\n //\n case 'tag': {\n switch (streamBlock.tag) {\n case 'cot': {\n const content = streamBlock.content\n .map((block) => {\n switch (block.type) {\n case 'text':\n return block.content;\n default:\n return null;\n }\n })\n .filter(isNotFalsy)\n .join('\\n');\n\n return { ...contentBlock, type: 'text', disposition: 'cot', text: content };\n }\n\n case 'artifact': {\n const { attributes } = streamBlock;\n return { type: 'json', disposition: 'artifact', json: JSON.stringify(attributes) };\n }\n\n case 'suggest': {\n if (streamBlock.content.length === 1 && streamBlock.content[0].type === 'text') {\n return {\n type: 'json',\n disposition: 'suggest',\n json: JSON.stringify({ text: streamBlock.content[0].content }),\n };\n }\n break;\n }\n\n case 'select': {\n return {\n type: 'json',\n disposition: 'select',\n json: JSON.stringify({\n options: streamBlock.content.flatMap((content) =>\n content.type === 'tag' && content.content.length === 1 && content.content[0].type === 'text'\n ? [content.content[0].content]\n : [],\n ),\n }),\n };\n }\n\n case 'tool-list': {\n return {\n type: 'json',\n disposition: 'tool_list',\n json: JSON.stringify({}),\n };\n }\n }\n\n break;\n }\n\n //\n // JSON\n //\n case 'json': {\n switch (contentBlock.type) {\n case 'tool_use': {\n return { ...contentBlock, input: safeParseJson(streamBlock.content) ?? {} };\n }\n }\n\n return { ...contentBlock, type: 'json', disposition: 'artifact', json: streamBlock.content };\n }\n }\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as P from 'parsimmon';\n\n/**\n * Parsed block.\n */\nexport type StreamBlock =\n | {\n type: 'tag';\n tag: string;\n attributes?: Record<string, string>;\n content: StreamBlock[];\n closing?: boolean;\n selfClosing?: boolean;\n }\n | { type: 'text'; content: string }\n | { type: 'json'; disposition?: string; content: string };\n\nconst textChunk: P.Parser<StreamBlock> = P.regexp(/[^<]+/).map((content) => ({\n type: 'text',\n content,\n}));\n\nconst attribute: P.Parser<[string, string]> = P.seq(\n P.regexp(/[a-zA-Z_][a-zA-Z0-9_-]*/),\n P.string('=').trim(P.optWhitespace),\n P.alt(\n P.regexp(/\"[^\"]*\"/).map((s) => s.slice(1, -1)),\n P.regexp(/'[^']*'/).map((s) => s.slice(1, -1)),\n ),\n).map(([name, _, value]) => [name, value]);\n\nconst tagName = P.regexp(/[a-zA-Z_][a-zA-Z0-9_-]*/);\n\nconst selfClosingTag: P.Parser<StreamBlock> = P.seqMap(\n //\n P.string('<'),\n tagName,\n P.optWhitespace.then(attribute).many(),\n P.optWhitespace.then(P.string('/>')),\n P.optWhitespace,\n (_, tag, attributes, __) => ({\n type: 'tag',\n tag,\n attributes: Object.fromEntries(attributes),\n content: [],\n selfClosing: true,\n }),\n);\n\nconst openTag: P.Parser<StreamBlock> = P.seqMap(\n //\n P.string('<'),\n tagName,\n P.optWhitespace.then(attribute).many(),\n P.string('>'),\n P.regexp(/[^<]*/),\n (_, tag, attributes, __, content) => ({\n type: 'tag',\n tag,\n attributes: Object.fromEntries(attributes),\n content: content.length ? [{ type: 'text', content }] : [],\n }),\n);\n\nconst closeTag: P.Parser<StreamBlock> = P.seqMap(\n //\n P.string('</'),\n tagName,\n P.string('>'),\n P.optWhitespace,\n (_, tag) => ({\n type: 'tag',\n tag,\n content: [],\n closing: true,\n }),\n);\n\nconst mixedChunk: P.Parser<StreamBlock> = P.alt(selfClosingTag, openTag, closeTag, textChunk);\n\n/**\n * Permissive streaming transformer that processes mixed content (plain text and XML fragments) from the AI service.\n */\nexport class StreamTransform {\n private _buffer = '';\n\n transform(chunk: string): StreamBlock[] {\n this._buffer += chunk;\n\n const results: StreamBlock[] = [];\n const parser = mixedChunk.many().skip(P.optWhitespace);\n const result = parser.parse(this._buffer);\n if (result.status) {\n for (const chunk of result.value) {\n results.push(chunk);\n }\n\n this._buffer = '';\n }\n\n return results;\n }\n\n // TODO(burdon): Process remaining buffer?\n flush(): StreamBlock[] {\n const remaining = this._buffer;\n this._buffer = '';\n return remaining.length > 0\n ? [\n {\n type: 'text',\n content: remaining,\n },\n ]\n : [];\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["DEFAULT_LLM_MODEL", "DEFAULT_LLM_MODELS", "Schema", "S", "Message", "invariant", "log", "Trigger", "log", "iterSSEMessages", "response", "controller", "body", "abort", "Error", "sseDecoder", "SSEDecoder", "lineDecoder", "LineDecoder", "iter", "readableStreamAsyncIterable", "sseChunk", "iterSSEChunks", "line", "decode", "sse", "flush", "iterator", "data", "Uint8Array", "chunk", "binaryChunk", "ArrayBuffer", "TextEncoder", "encode", "newData", "length", "set", "patternIndex", "findDoubleNewlineIndex", "slice", "buffer", "newline", "carriage", "i", "constructor", "event", "chunks", "endsWith", "substring", "join", "raw", "push", "startsWith", "fieldname", "_", "value", "partition", "partition", "str", "delimiter", "index", "indexOf", "substring", "length", "readableStreamAsyncIterable", "stream", "Symbol", "asyncIterator", "reader", "getReader", "next", "result", "read", "done", "releaseLock", "e", "return", "cancelPromise", "cancel", "value", "undefined", "LineDecoder", "NEWLINE_CHARS", "Set", "NEWLINE_REGEXP", "constructor", "buffer", "trailingCR", "decode", "chunk", "text", "decodeText", "endsWith", "slice", "trailingNewline", "has", "lines", "split", "pop", "push", "join", "bytes", "Buffer", "toString", "Uint8Array", "from", "Error", "name", "TextDecoder", "ArrayBuffer", "textDecoder", "flush", "createGenerationStream", "response", "controller", "AbortController", "iterator", "sse", "iterSSEMessages", "event", "JSON", "parse", "data", "err", "log", "error", "raw", "Error", "GenerationStreamImpl", "constructor", "_controller", "_getIterator", "_done", "Trigger", "_iterator", "undefined", "Symbol", "asyncIterator", "_createIterator", "abort", "complete", "wait", "self", "generator", "wake", "throw", "call", "AIServiceEdgeClient", "constructor", "endpoint", "invariant", "_endpoint", "appendMessages", "messages", "url", "res", "fetch", "method", "headers", "body", "JSON", "stringify", "S", "encodePromise", "Array", "Message", "ok", "Error", "text", "exec", "request", "log", "info", "controller", "AbortController", "response", "signal", "tools", "ReadableStream", "createGenerationStream", "MessageCollector", "_messages", "_pendingMessage", "undefined", "messages", "pendingMessage", "push", "event", "type", "message", "content", "index", "block", "delta", "text", "pending", "Object", "assign", "pushMessage", "emitMessageAsEvents", "defineTool", "ToolResult", "ObjectId", "S", "invariant", "log", "Schema", "S", "Tool", "Message", "SpaceIdSchema", "ObjectId", "createArtifactElement", "id", "LLMModel", "S", "Literal", "DEFAULT_LLM_MODELS", "ToolTypes", "Object", "freeze", "TextToImage", "GenerateRequest", "Struct", "spaceId", "optional", "SpaceIdSchema", "threadId", "ObjectId", "model", "tools", "Array", "Tool", "pipe", "mutable", "systemPrompt", "String", "history", "Message", "prompt", "ToolResult", "Message", "createStatic", "ObjectId", "invariant", "log", "runLLM", "params", "conversationResult", "history", "generate", "tools", "beginTs", "Date", "now", "stream", "client", "exec", "model", "spaceId", "threadId", "systemPrompt", "system", "event", "logger", "complete", "messages", "message", "at", "time", "type", "push", "map", "content", "filter", "block", "isToolUse", "toolCalls", "length", "toolCall", "tool", "find", "name", "Error", "execute", "toolResult", "input", "kind", "warn", "resultMessage", "id", "random", "role", "toolUseId", "isError", "result", "JSON", "stringify", "onlyToolNames", "includes", "runTools", "extensions", "error", "extractContentBlocks", "DEFAULT_OLLAMA_URL", "DEFAULT_OLLAMA_MODEL", "OllamaClient", "createClient", "options", "tools", "overrides", "model", "temperature", "isRunning", "response", "fetch", "method", "headers", "signal", "AbortSignal", "timeout", "ok", "error", "constructor", "endpoint", "maxToolInvocations", "_endpoint", "_tools", "_modelOverride", "_temperatureOverride", "_maxToolInvocations", "_getEmbededTools", "clientTools", "filter", "tool", "type", "undefined", "WELL_KNOWN_TOOLS", "map", "_generateStream", "request", "invariant", "prompt", "ollamaRequest", "messages", "stream", "systemPrompt", "push", "role", "content", "history", "length", "message", "text", "tool_calls", "function", "name", "arguments", "input", "JSON", "stringify", "toolUseId", "allTools", "withWellKnownTools", "description", "parameters", "properties", "required", "log", "info", "body", "Error", "status", "statusText", "reader", "pipeThrough", "TextDecoderStream", "OllamaDecoderStream", "getReader", "messageId", "ObjectId", "random", "id", "textBlock", "currentBlockIndex", "index", "done", "value", "data", "read", "delta", "warn", "sanitizeToolArguments", "stopReason", "releaseLock", "exec", "controller", "AbortController", "GenerationStreamImpl", "collector", "MessageCollector", "toolInvocations", "event", "isToolUse", "at", "onlyToolNames", "result", "runTools", "pushMessage", "emitMessageAsEvents", "bind", "abort", "args", "Array", "isArray", "SAMPLE_IMAGE_URL", "ToolTypes", "TextToImage", "defineTool", "schema", "S", "Struct", "String", "annotations", "execute", "image", "then", "res", "Buffer", "from", "arrayBuffer", "imageBase64", "toString", "ToolResult", "Success", "source", "mediaType", "TransformStream", "transform", "chunk", "_buffer", "lines", "split", "pop", "line", "enqueue", "parse", "trim", "flush", "Message", "Event", "createStatic", "invariant", "log", "isNotFalsy", "safeParseJson", "P", "textChunk", "regexp", "map", "content", "type", "attribute", "seq", "string", "trim", "optWhitespace", "alt", "s", "slice", "name", "_", "value", "tagName", "selfClosingTag", "seqMap", "then", "many", "tag", "attributes", "__", "Object", "fromEntries", "selfClosing", "openTag", "length", "closeTag", "closing", "mixedChunk", "StreamTransform", "_buffer", "transform", "chunk", "results", "parser", "skip", "result", "parse", "status", "push", "flush", "remaining", "MixedStreamParser", "message", "Event", "block", "update", "streamEvent", "_emitBlock", "contentBlock", "streamBlock", "messageBlock", "mergeMessageBlock", "type", "text", "length", "invariant", "_message", "content", "push", "emit", "_emitUpdate", "pending", "parse", "stream", "transformer", "StreamTransform", "stack", "messagesCollected", "event", "log", "warn", "createStatic", "Message", "role", "undefined", "delta", "chunks", "transform", "chunk", "selfClosing", "closing", "top", "pop", "last", "at", "partial_json", "tag", "map", "filter", "isNotFalsy", "join", "disposition", "attributes", "json", "JSON", "stringify", "options", "flatMap", "input", "safeParseJson"]
3
+ "sources": ["../../../src/session/session.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Schema as S } from 'effect';\n\nimport { defineTool, Message, ToolResult, type ArtifactDefinition, type Tool } from '@dxos/artifact';\nimport { Event, synchronized } from '@dxos/async';\nimport { createStatic } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport { MixedStreamParser, type AIServiceClient, type GenerateRequest, type GenerationStream } from '../ai-service';\nimport { isToolUse, runTools } from '../conversation';\n/**\n * Contains message history, tools, current context.\n * Current context means the state of the app, time of day, and other contextual information.\n * It makes requests to the model, its a state machine.\n * It keeps track of the current goal.\n * It manages the context window.\n * Tracks the success criteria of reaching the goal, exposing metrics (stretch)\n * Could be run locally in the app or remotely.\n * Could be personal or shared.\n */\n\nexport type SessionRunOptions = {\n client: AIServiceClient;\n\n artifacts: ArtifactDefinition[];\n\n /**\n * Non-artifact specific tools.\n */\n tools: Tool[];\n\n history: Message[];\n\n prompt: string;\n\n generationOptions?: Pick<GenerateRequest, 'model' | 'systemPrompt'>;\n\n extensions?: ToolContextExtensions;\n\n /**\n * Pre-require artifacts.\n */\n requiredArtifactIds?: string[];\n};\n\ntype OperationModel = 'planning' | 'immediate';\n\nexport type AiSessionOptions = {\n /**\n * In planning mode, the model will create a plan before executing the user's request.\n * The plan will determine the artifacts that will be used to perform the actions.\n * In require mode, the model will select the artifacts that will be used to perform the actions.\n */\n operationModel: OperationModel;\n};\n\nexport class AISession {\n /** SSE stream parser. */\n private readonly _parser = new MixedStreamParser();\n\n /** Pending messages (incl. the current user request). */\n private _pending: Message[] = [];\n\n /** Current streaming response. */\n private _stream: GenerationStream | undefined;\n\n /** Prior history from queue. */\n private _history: Message[] = [];\n\n /**\n * New message.\n */\n public readonly message = this._parser.message;\n\n /**\n * Complete block added to Message.\n */\n public readonly block = this._parser.block;\n\n /**\n * Update partial block (while streaming).\n */\n public readonly update = this._parser.update;\n\n public readonly streamEvent = this._parser.streamEvent;\n\n /**\n * User prompt or tool result.\n */\n public readonly userMessage = new Event<Message>();\n\n constructor(private readonly _options: AiSessionOptions) {\n // Message complete.\n this._parser.message.on((message) => {\n this._pending.push(message);\n });\n }\n\n @synchronized\n async run(options: SessionRunOptions): Promise<Message[]> {\n const systemTools: Tool[] = [\n defineTool('system', {\n name: 'query_artifacts',\n description: 'Query the available artifacts',\n schema: S.Struct({}),\n execute: async () => {\n return ToolResult.Success({\n artifacts: options.artifacts.map((artifact) => ({\n id: artifact.id,\n name: artifact.name,\n description: artifact.description,\n })),\n });\n },\n }),\n ];\n switch (this._options.operationModel) {\n case 'planning':\n systemTools.push(\n defineTool('system', {\n name: 'create_plan',\n description:\n 'Create a plan. Make sure that each step is independent and can be executed solely on the data returned by the previous step. The steps only share the data that is specified in the plan.',\n schema: S.Struct({\n goal: S.String.annotations({ description: 'The goal that the plan will achieve.' }),\n steps: S.Array(\n S.Struct({\n action: S.String.annotations({\n description: 'Complete, detailed action to perform.',\n }),\n input: S.String.annotations({\n description: 'The required input data for this step. First step must not require any data.',\n }),\n output: S.String.annotations({\n description: 'The output data from this step. This is passed to the next step as input.',\n }),\n requiredArtifactIds: S.Array(S.String).annotations({\n description: 'The ids of the artifacts required to perform this step.',\n examples: [['artifact:dxos.org/example/Test']],\n }),\n }),\n ).annotations({ description: 'Steps' }),\n }),\n execute: async ({ goal, steps }) => {\n const missingArtifactIds = steps\n .flatMap((step) => step.requiredArtifactIds)\n .filter((artifactId) => !options.artifacts.some((artifact) => artifact.id === artifactId));\n if (missingArtifactIds.length > 0) {\n return ToolResult.Error(`One or more artifact ids are invalid: ${missingArtifactIds.join(', ')}`);\n }\n\n const stepResults: any[] = [];\n for (const step of steps) {\n log.info('executing step', { action: step.action });\n const session = new AISession({ operationModel: 'immediate' });\n session.message.on((ev) => this.message.emit(ev));\n session.block.on((ev) => this.block.emit(ev));\n session.update.on((ev) => this.update.emit(ev));\n session.streamEvent.on((ev) => this.streamEvent.emit(ev));\n session.userMessage.on((ev) => this.userMessage.emit(ev));\n\n const messages = await session.run({\n client: options.client,\n artifacts: options.artifacts,\n tools: options.tools,\n history: options.history,\n extensions: options.extensions,\n generationOptions: options.generationOptions,\n requiredArtifactIds: step.requiredArtifactIds.slice(),\n prompt: `\n You are an agent that executes the subtask in a plan.\n \n While you know the plan's goal only focus on your subtask\n Use the data from the previous step to complete your task.\n Return all of the data from \"output\" in your last message.\n \n Current step (that you need to complete):\n ${JSON.stringify(\n {\n goal,\n input: step.input,\n output: step.output,\n yourTask: step.action,\n },\n null,\n 2,\n )}\n \n Previous step results:\n ${JSON.stringify(stepResults.at(-1))}.\n `,\n });\n const result = messages.at(-1);\n stepResults.push(result);\n }\n\n return ToolResult.Success({ stepResults });\n },\n }),\n );\n break;\n case 'immediate':\n systemTools.push(\n defineTool('system', {\n name: 'require_artifacts',\n description:\n 'Require the use of specific artifacts. This will allow the model to interact with artifacts and use their tools.',\n schema: S.Struct({\n artifactIds: S.Array(S.String).annotations({\n description: 'The ids of the artifacts to require',\n examples: [['artifact:dxos.org/example/Test']],\n }),\n }),\n execute: async ({ artifactIds }) => {\n const missingArtifactIds = artifactIds.filter(\n (artifactId) => !options.artifacts.some((artifact) => artifact.id === artifactId),\n );\n if (missingArtifactIds.length > 0) {\n return ToolResult.Error(`One or more artifact ids are invalid: ${missingArtifactIds.join(', ')}`);\n }\n\n for (const artifactId of artifactIds) {\n requiredArtifactIds.add(artifactId);\n }\n\n return ToolResult.Success({});\n },\n }),\n );\n break;\n }\n\n this._history = [...options.history];\n this._pending = [\n createStatic(Message, {\n role: 'user',\n content: [{ type: 'text', text: options.prompt }],\n }),\n ];\n this.userMessage.emit(this._pending.at(-1)!);\n this._stream = undefined;\n let error: Error | undefined;\n\n const requiredArtifactIds = new Set<string>(options.requiredArtifactIds ?? []);\n try {\n let more = false;\n do {\n const tools = [\n ...systemTools,\n ...options.tools,\n ...options.artifacts\n .filter((artifact) => requiredArtifactIds.has(artifact.id))\n .flatMap((artifact) => artifact.tools),\n ];\n\n log('request', {\n pending: this._pending.length,\n history: this._history.length,\n tools: tools.map((tool) => tool.name),\n });\n\n // Open request stream.\n this._stream = await options.client.exec({\n ...(options.generationOptions ?? {}),\n // TODO(burdon): Rename messages or separate history/message.\n history: [...this._history, ...this._pending],\n tools,\n systemPrompt: createBaseInstructions({\n availableArtifacts: Array.from(requiredArtifactIds),\n operationModel: this._options.operationModel,\n }),\n });\n\n // Wait until complete.\n await this._parser.parse(this._stream);\n await this._stream.complete();\n\n // Add messages.\n log('response', { pending: this._pending });\n\n // Resolve tool use locally.\n more = false;\n const message = this._pending.at(-1);\n invariant(message);\n if (isToolUse(message)) {\n log('tool request...');\n const response = await runTools({\n message: this._pending.at(-1)!,\n tools,\n extensions: options.extensions ?? {},\n });\n\n log('tool response', { response });\n switch (response.type) {\n case 'continue': {\n this._pending = [...this._pending, response.message];\n this.userMessage.emit(response.message);\n more = true;\n break;\n }\n }\n }\n } while (more);\n } catch (err) {\n log.catch(err);\n if (err instanceof Error && err.message.includes('Overloaded')) {\n error = new AIServiecOverloadedError('AI service overloaded', { cause: err });\n } else {\n error = new Error('AI service error', { cause: err });\n }\n } finally {\n this._stream = undefined;\n }\n\n if (error) {\n throw error;\n }\n\n return this._pending;\n }\n\n abort() {\n this._stream?.abort();\n }\n}\n\n// TODO(burdon): Use handlebars template with effect-schema input.\nconst createBaseInstructions = ({\n availableArtifacts,\n operationModel,\n}: {\n availableArtifacts: string[];\n operationModel: OperationModel;\n}) => `\n You are a friendly, advanced AI assistant capable of creating and managing artifacts from available data and tools. \n Your task is to process user commands and questions and decide how best to respond.\n In some cases, you will need to create or reference data objects called artifacts.\n\n Follow these guidelines carefully:\n\n Decision-making:\n\n - Analyze the structure and type of the content in the user's message.\n - Can you complete the task using the available artifacts?\n - If you can't complete the task using the available artifacts, query the list of available artifacts using the appropriate tool.\n - Identify which artifacts are relevant to the user's request.\n ${\n operationModel === 'planning'\n ? `\n - Break down the user's request into a step-by-step plan that you will use to execute the user's request, the plan items should include artifacts which will be used to perform the actions.\n `\n : `\n - Are the required artifacts already available?\n - If not, select which artifact(s) will be the most relevant and require them using the require_artifacts tool.\n - The require'd artifact tools will be available for use after require.\n `\n }\n\n Artifacts already required: ${availableArtifacts.join('\\n')}\n`;\n\nexport class AIServiecOverloadedError extends S.TaggedError<AIServiecOverloadedError>()(\n 'AIServiecOverloadedError',\n {},\n) {}\n"],
5
+ "mappings": "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",
6
+ "names": ["Schema", "S", "defineTool", "Message", "ToolResult", "Event", "synchronized", "createStatic", "invariant", "log", "AISession", "constructor", "_options", "_parser", "MixedStreamParser", "_pending", "_history", "message", "block", "update", "streamEvent", "userMessage", "Event", "on", "push", "run", "options", "systemTools", "defineTool", "name", "description", "schema", "S", "Struct", "execute", "ToolResult", "Success", "artifacts", "map", "artifact", "id", "operationModel", "goal", "String", "annotations", "steps", "Array", "action", "input", "output", "requiredArtifactIds", "examples", "missingArtifactIds", "flatMap", "step", "filter", "artifactId", "some", "length", "Error", "join", "stepResults", "log", "info", "session", "ev", "emit", "messages", "client", "tools", "history", "extensions", "generationOptions", "slice", "prompt", "JSON", "stringify", "yourTask", "at", "result", "artifactIds", "add", "createStatic", "Message", "role", "content", "type", "text", "_stream", "undefined", "error", "Set", "more", "has", "pending", "tool", "exec", "systemPrompt", "createBaseInstructions", "availableArtifacts", "from", "parse", "complete", "invariant", "isToolUse", "response", "runTools", "err", "catch", "includes", "AIServiecOverloadedError", "cause", "abort", "synchronized", "TaggedError"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/experimental/assistant/src/ai-service/defs.ts":{"bytes":2403,"imports":[],"format":"esm"},"packages/experimental/assistant/src/ai-service/util/sse.ts":{"bytes":30181,"imports":[],"format":"esm"},"packages/experimental/assistant/src/ai-service/util/index.ts":{"bytes":506,"imports":[{"path":"packages/experimental/assistant/src/ai-service/util/sse.ts","kind":"import-statement","original":"./sse"}],"format":"esm"},"packages/experimental/assistant/src/ai-service/stream.ts":{"bytes":10951,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/ai-service/util/index.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"packages/experimental/assistant/src/ai-service/edge-client.ts":{"bytes":7218,"imports":[{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/ai-service/stream.ts","kind":"import-statement","original":"./stream"}],"format":"esm"},"packages/experimental/assistant/src/ai-service/message-collector.ts":{"bytes":8239,"imports":[],"format":"esm"},"packages/experimental/assistant/src/ai-service/types.ts":{"bytes":6315,"imports":[{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/ai-service/defs.ts","kind":"import-statement","original":"./defs"}],"format":"esm"},"packages/experimental/assistant/src/conversation/conversation.ts":{"bytes":26327,"imports":[{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/experimental/assistant/src/conversation/index.ts":{"bytes":528,"imports":[{"path":"packages/experimental/assistant/src/conversation/conversation.ts","kind":"import-statement","original":"./conversation"}],"format":"esm"},"packages/experimental/assistant/src/ai-service/ollama-client.ts":{"bytes":46357,"imports":[{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/ai-service/message-collector.ts","kind":"import-statement","original":"./message-collector"},{"path":"packages/experimental/assistant/src/ai-service/stream.ts","kind":"import-statement","original":"./stream"},{"path":"packages/experimental/assistant/src/ai-service/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/experimental/assistant/src/conversation/index.ts","kind":"import-statement","original":"../conversation"}],"format":"esm"},"packages/experimental/assistant/src/ai-service/transform.ts":{"bytes":9707,"imports":[{"path":"parsimmon","kind":"import-statement","external":true}],"format":"esm"},"packages/experimental/assistant/src/ai-service/parser.ts":{"bytes":42064,"imports":[{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/ai-service/transform.ts","kind":"import-statement","original":"./transform"}],"format":"esm"},"packages/experimental/assistant/src/ai-service/service.ts":{"bytes":964,"imports":[],"format":"esm"},"packages/experimental/assistant/src/ai-service/index.ts":{"bytes":1252,"imports":[{"path":"packages/experimental/assistant/src/ai-service/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/experimental/assistant/src/ai-service/edge-client.ts","kind":"import-statement","original":"./edge-client"},{"path":"packages/experimental/assistant/src/ai-service/message-collector.ts","kind":"import-statement","original":"./message-collector"},{"path":"packages/experimental/assistant/src/ai-service/ollama-client.ts","kind":"import-statement","original":"./ollama-client"},{"path":"packages/experimental/assistant/src/ai-service/parser.ts","kind":"import-statement","original":"./parser"},{"path":"packages/experimental/assistant/src/ai-service/service.ts","kind":"import-statement","original":"./service"},{"path":"packages/experimental/assistant/src/ai-service/stream.ts","kind":"import-statement","original":"./stream"},{"path":"packages/experimental/assistant/src/ai-service/transform.ts","kind":"import-statement","original":"./transform"},{"path":"packages/experimental/assistant/src/ai-service/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/experimental/assistant/src/cypher/parjs.ts":{"bytes":1016,"imports":[{"path":"#parjs","kind":"import-statement","external":true}],"format":"esm"},"packages/experimental/assistant/src/cypher/combinators.ts":{"bytes":17930,"imports":[{"path":"packages/experimental/assistant/src/cypher/parjs.ts","kind":"import-statement","original":"./parjs"}],"format":"esm"},"packages/experimental/assistant/src/cypher/parser.ts":{"bytes":1744,"imports":[{"path":"packages/experimental/assistant/src/cypher/combinators.ts","kind":"import-statement","original":"./combinators"}],"format":"esm"},"packages/experimental/assistant/src/cypher/execution-plan.ts":{"bytes":20257,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/experimental/assistant/src/cypher/query-executor.ts":{"bytes":16864,"imports":[{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/cypher/execution-plan.ts","kind":"import-statement","original":"./execution-plan"},{"path":"packages/experimental/assistant/src/cypher/parser.ts","kind":"import-statement","original":"./parser"}],"format":"esm"},"packages/experimental/assistant/src/util/trim.ts":{"bytes":1569,"imports":[],"format":"esm"},"packages/experimental/assistant/src/util/index.ts":{"bytes":500,"imports":[{"path":"packages/experimental/assistant/src/util/trim.ts","kind":"import-statement","original":"./trim"}],"format":"esm"},"packages/experimental/assistant/src/cypher/schema.ts":{"bytes":9981,"imports":[{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/util/index.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"packages/experimental/assistant/src/cypher/echo-data-source.ts":{"bytes":14379,"imports":[{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/cypher/schema.ts","kind":"import-statement","original":"./schema"}],"format":"esm"},"packages/experimental/assistant/src/cypher/index.ts":{"bytes":808,"imports":[{"path":"packages/experimental/assistant/src/cypher/parser.ts","kind":"import-statement","original":"./parser"},{"path":"packages/experimental/assistant/src/cypher/query-executor.ts","kind":"import-statement","original":"./query-executor"},{"path":"packages/experimental/assistant/src/cypher/schema.ts","kind":"import-statement","original":"./schema"},{"path":"packages/experimental/assistant/src/cypher/echo-data-source.ts","kind":"import-statement","original":"./echo-data-source"}],"format":"esm"},"packages/experimental/assistant/src/index.ts":{"bytes":695,"imports":[{"path":"packages/experimental/assistant/src/ai-service/index.ts","kind":"import-statement","original":"./ai-service"},{"path":"packages/experimental/assistant/src/cypher/index.ts","kind":"import-statement","original":"./cypher"},{"path":"packages/experimental/assistant/src/conversation/index.ts","kind":"import-statement","original":"./conversation"}],"format":"esm"},"packages/experimental/assistant/src/testing/defs.ts":{"bytes":1016,"imports":[],"format":"esm"},"packages/experimental/assistant/src/testing/logger.ts":{"bytes":14680,"imports":[],"format":"esm"},"packages/experimental/assistant/src/testing/query-promts.ts":{"bytes":8932,"imports":[{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/cypher/index.ts","kind":"import-statement","original":"../cypher"},{"path":"packages/experimental/assistant/src/util/index.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"packages/experimental/assistant/src/testing/test-data.ts":{"bytes":35140,"imports":[{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/cypher/index.ts","kind":"import-statement","original":"../cypher"},{"path":"packages/experimental/assistant/src/testing/index.ts","kind":"import-statement","original":"../testing"}],"format":"esm"},"packages/experimental/assistant/src/testing/test-schema.ts":{"bytes":8426,"imports":[{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"format":"esm"},"packages/experimental/assistant/src/testing/index.ts":{"bytes":877,"imports":[{"path":"packages/experimental/assistant/src/testing/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/experimental/assistant/src/testing/logger.ts","kind":"import-statement","original":"./logger"},{"path":"packages/experimental/assistant/src/testing/query-promts.ts","kind":"import-statement","original":"./query-promts"},{"path":"packages/experimental/assistant/src/testing/test-data.ts","kind":"import-statement","original":"./test-data"},{"path":"packages/experimental/assistant/src/testing/test-schema.ts","kind":"import-statement","original":"./test-schema"}],"format":"esm"}},"outputs":{"packages/experimental/assistant/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":85520},"packages/experimental/assistant/dist/lib/browser/index.mjs":{"imports":[{"path":"packages/experimental/assistant/dist/lib/browser/chunk-AXUUNA7O.mjs","kind":"import-statement"},{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"parsimmon","kind":"import-statement","external":true}],"exports":["AIServiceEdgeClient","DEFAULT_LLM_MODEL","DEFAULT_LLM_MODELS","EchoDataSource","GenerateRequest","GenerationStreamImpl","LLMModel","MessageCollector","MixedStreamParser","OllamaClient","StreamTransform","ToolTypes","createArtifactElement","createGenerationStream","emitMessageAsEvents","executeQuery","executeQueryPlan","formatInferredRelationshipLabel","formatJsonSchemaForLLM","formatNodeLabel","isReference","isToolUse","mergeMessageBlock","parseCypherQuery","runLLM","runTools"],"entryPoint":"packages/experimental/assistant/src/index.ts","inputs":{"packages/experimental/assistant/src/ai-service/defs.ts":{"bytesInOutput":579},"packages/experimental/assistant/src/ai-service/index.ts":{"bytesInOutput":0},"packages/experimental/assistant/src/ai-service/edge-client.ts":{"bytesInOutput":1924},"packages/experimental/assistant/src/ai-service/stream.ts":{"bytesInOutput":2609},"packages/experimental/assistant/src/ai-service/util/sse.ts":{"bytesInOutput":6115},"packages/experimental/assistant/src/ai-service/util/index.ts":{"bytesInOutput":0},"packages/experimental/assistant/src/ai-service/message-collector.ts":{"bytesInOutput":1774},"packages/experimental/assistant/src/ai-service/ollama-client.ts":{"bytesInOutput":10861},"packages/experimental/assistant/src/ai-service/types.ts":{"bytesInOutput":1013},"packages/experimental/assistant/src/conversation/conversation.ts":{"bytesInOutput":7445},"packages/experimental/assistant/src/conversation/index.ts":{"bytesInOutput":0},"packages/experimental/assistant/src/ai-service/parser.ts":{"bytesInOutput":11114},"packages/experimental/assistant/src/ai-service/transform.ts":{"bytesInOutput":1994},"packages/experimental/assistant/src/index.ts":{"bytesInOutput":0}},"bytes":47090},"packages/experimental/assistant/dist/lib/browser/testing/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":33071},"packages/experimental/assistant/dist/lib/browser/testing/index.mjs":{"imports":[{"path":"packages/experimental/assistant/dist/lib/browser/chunk-AXUUNA7O.mjs","kind":"import-statement"},{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"exports":["AI_SERVICE_ENDPOINT","Contact","MockDataSource","ObjectId","Org","Project","Task","createCypherTool","createLogger","createSystemPrompt","createTestData","seedTestData"],"entryPoint":"packages/experimental/assistant/src/testing/index.ts","inputs":{"packages/experimental/assistant/src/testing/defs.ts":{"bytesInOutput":113},"packages/experimental/assistant/src/testing/index.ts":{"bytesInOutput":0},"packages/experimental/assistant/src/testing/logger.ts":{"bytesInOutput":3408},"packages/experimental/assistant/src/testing/query-promts.ts":{"bytesInOutput":2794},"packages/experimental/assistant/src/testing/test-data.ts":{"bytesInOutput":9031},"packages/experimental/assistant/src/testing/test-schema.ts":{"bytesInOutput":1907}},"bytes":17940},"packages/experimental/assistant/dist/lib/browser/chunk-AXUUNA7O.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":41496},"packages/experimental/assistant/dist/lib/browser/chunk-AXUUNA7O.mjs":{"imports":[{"path":"#parjs","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"exports":["EchoDataSource","executeQuery","executeQueryPlan","formatInferredRelationshipLabel","formatJsonSchemaForLLM","formatNodeLabel","isReference","parseCypherQuery","trim"],"inputs":{"packages/experimental/assistant/src/cypher/parjs.ts":{"bytesInOutput":50},"packages/experimental/assistant/src/cypher/combinators.ts":{"bytesInOutput":3853},"packages/experimental/assistant/src/cypher/parser.ts":{"bytesInOutput":239},"packages/experimental/assistant/src/cypher/query-executor.ts":{"bytesInOutput":3917},"packages/experimental/assistant/src/cypher/execution-plan.ts":{"bytesInOutput":5010},"packages/experimental/assistant/src/cypher/schema.ts":{"bytesInOutput":2270},"packages/experimental/assistant/src/util/trim.ts":{"bytesInOutput":204},"packages/experimental/assistant/src/util/index.ts":{"bytesInOutput":0},"packages/experimental/assistant/src/cypher/echo-data-source.ts":{"bytesInOutput":3981},"packages/experimental/assistant/src/cypher/index.ts":{"bytesInOutput":0}},"bytes":20360}}}
1
+ {"inputs":{"packages/experimental/assistant/src/ai-service/defs.ts":{"bytes":3427,"imports":[],"format":"esm"},"packages/experimental/assistant/src/ai-service/util/sse.ts":{"bytes":30181,"imports":[],"format":"esm"},"packages/experimental/assistant/src/ai-service/util/index.ts":{"bytes":506,"imports":[{"path":"packages/experimental/assistant/src/ai-service/util/sse.ts","kind":"import-statement","original":"./sse"}],"format":"esm"},"packages/experimental/assistant/src/ai-service/stream.ts":{"bytes":10951,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/ai-service/util/index.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"packages/experimental/assistant/src/ai-service/edge-client.ts":{"bytes":7501,"imports":[{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/ai-service/stream.ts","kind":"import-statement","original":"./stream"}],"format":"esm"},"packages/experimental/assistant/src/ai-service/message-collector.ts":{"bytes":8239,"imports":[],"format":"esm"},"packages/experimental/assistant/src/ai-service/types.ts":{"bytes":6502,"imports":[{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/ai-service/defs.ts","kind":"import-statement","original":"./defs"}],"format":"esm"},"packages/experimental/assistant/src/conversation/conversation.ts":{"bytes":26327,"imports":[{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/experimental/assistant/src/conversation/index.ts":{"bytes":528,"imports":[{"path":"packages/experimental/assistant/src/conversation/conversation.ts","kind":"import-statement","original":"./conversation"}],"format":"esm"},"packages/experimental/assistant/src/ai-service/ollama-client.ts":{"bytes":48893,"imports":[{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/ai-service/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/experimental/assistant/src/ai-service/message-collector.ts","kind":"import-statement","original":"./message-collector"},{"path":"packages/experimental/assistant/src/ai-service/stream.ts","kind":"import-statement","original":"./stream"},{"path":"packages/experimental/assistant/src/ai-service/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/experimental/assistant/src/conversation/index.ts","kind":"import-statement","original":"../conversation"}],"format":"esm"},"packages/experimental/assistant/src/ai-service/transform.ts":{"bytes":9707,"imports":[{"path":"parsimmon","kind":"import-statement","external":true}],"format":"esm"},"packages/experimental/assistant/src/ai-service/parser.ts":{"bytes":42376,"imports":[{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/ai-service/transform.ts","kind":"import-statement","original":"./transform"}],"format":"esm"},"packages/experimental/assistant/src/ai-service/service.ts":{"bytes":964,"imports":[],"format":"esm"},"packages/experimental/assistant/src/ai-service/index.ts":{"bytes":1252,"imports":[{"path":"packages/experimental/assistant/src/ai-service/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/experimental/assistant/src/ai-service/edge-client.ts","kind":"import-statement","original":"./edge-client"},{"path":"packages/experimental/assistant/src/ai-service/message-collector.ts","kind":"import-statement","original":"./message-collector"},{"path":"packages/experimental/assistant/src/ai-service/ollama-client.ts","kind":"import-statement","original":"./ollama-client"},{"path":"packages/experimental/assistant/src/ai-service/parser.ts","kind":"import-statement","original":"./parser"},{"path":"packages/experimental/assistant/src/ai-service/service.ts","kind":"import-statement","original":"./service"},{"path":"packages/experimental/assistant/src/ai-service/stream.ts","kind":"import-statement","original":"./stream"},{"path":"packages/experimental/assistant/src/ai-service/transform.ts","kind":"import-statement","original":"./transform"},{"path":"packages/experimental/assistant/src/ai-service/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/experimental/assistant/src/cypher/parjs.ts":{"bytes":1016,"imports":[{"path":"#parjs","kind":"import-statement","external":true}],"format":"esm"},"packages/experimental/assistant/src/cypher/combinators.ts":{"bytes":17930,"imports":[{"path":"packages/experimental/assistant/src/cypher/parjs.ts","kind":"import-statement","original":"./parjs"}],"format":"esm"},"packages/experimental/assistant/src/cypher/parser.ts":{"bytes":1744,"imports":[{"path":"packages/experimental/assistant/src/cypher/combinators.ts","kind":"import-statement","original":"./combinators"}],"format":"esm"},"packages/experimental/assistant/src/cypher/execution-plan.ts":{"bytes":20257,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/experimental/assistant/src/cypher/query-executor.ts":{"bytes":16864,"imports":[{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/cypher/execution-plan.ts","kind":"import-statement","original":"./execution-plan"},{"path":"packages/experimental/assistant/src/cypher/parser.ts","kind":"import-statement","original":"./parser"}],"format":"esm"},"packages/experimental/assistant/src/util/trim.ts":{"bytes":1569,"imports":[],"format":"esm"},"packages/experimental/assistant/src/util/index.ts":{"bytes":500,"imports":[{"path":"packages/experimental/assistant/src/util/trim.ts","kind":"import-statement","original":"./trim"}],"format":"esm"},"packages/experimental/assistant/src/cypher/schema.ts":{"bytes":9981,"imports":[{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/util/index.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"packages/experimental/assistant/src/cypher/echo-data-source.ts":{"bytes":14379,"imports":[{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/cypher/schema.ts","kind":"import-statement","original":"./schema"}],"format":"esm"},"packages/experimental/assistant/src/cypher/index.ts":{"bytes":808,"imports":[{"path":"packages/experimental/assistant/src/cypher/parser.ts","kind":"import-statement","original":"./parser"},{"path":"packages/experimental/assistant/src/cypher/query-executor.ts","kind":"import-statement","original":"./query-executor"},{"path":"packages/experimental/assistant/src/cypher/schema.ts","kind":"import-statement","original":"./schema"},{"path":"packages/experimental/assistant/src/cypher/echo-data-source.ts","kind":"import-statement","original":"./echo-data-source"}],"format":"esm"},"packages/experimental/assistant/src/session/session.ts":{"bytes":44070,"imports":[{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/ai-service/index.ts","kind":"import-statement","original":"../ai-service"},{"path":"packages/experimental/assistant/src/conversation/index.ts","kind":"import-statement","original":"../conversation"}],"format":"esm"},"packages/experimental/assistant/src/session/index.ts":{"bytes":510,"imports":[{"path":"packages/experimental/assistant/src/session/session.ts","kind":"import-statement","original":"./session"}],"format":"esm"},"packages/experimental/assistant/src/index.ts":{"bytes":782,"imports":[{"path":"packages/experimental/assistant/src/ai-service/index.ts","kind":"import-statement","original":"./ai-service"},{"path":"packages/experimental/assistant/src/cypher/index.ts","kind":"import-statement","original":"./cypher"},{"path":"packages/experimental/assistant/src/conversation/index.ts","kind":"import-statement","original":"./conversation"},{"path":"packages/experimental/assistant/src/session/index.ts","kind":"import-statement","original":"./session"}],"format":"esm"},"packages/experimental/assistant/src/testing/defs.ts":{"bytes":1016,"imports":[],"format":"esm"},"packages/experimental/assistant/src/testing/logger.ts":{"bytes":14680,"imports":[],"format":"esm"},"packages/experimental/assistant/src/testing/ollama.ts":{"bytes":1785,"imports":[{"path":"packages/experimental/assistant/src/ai-service/index.ts","kind":"import-statement","original":"../ai-service"}],"format":"esm"},"packages/experimental/assistant/src/testing/query-promts.ts":{"bytes":8932,"imports":[{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/cypher/index.ts","kind":"import-statement","original":"../cypher"},{"path":"packages/experimental/assistant/src/util/index.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"packages/experimental/assistant/src/testing/test-data.ts":{"bytes":35140,"imports":[{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"packages/experimental/assistant/src/cypher/index.ts","kind":"import-statement","original":"../cypher"},{"path":"packages/experimental/assistant/src/testing/index.ts","kind":"import-statement","original":"../testing"}],"format":"esm"},"packages/experimental/assistant/src/testing/test-schema.ts":{"bytes":8426,"imports":[{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"format":"esm"},"packages/experimental/assistant/src/testing/index.ts":{"bytes":963,"imports":[{"path":"packages/experimental/assistant/src/testing/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/experimental/assistant/src/testing/logger.ts","kind":"import-statement","original":"./logger"},{"path":"packages/experimental/assistant/src/testing/ollama.ts","kind":"import-statement","original":"./ollama"},{"path":"packages/experimental/assistant/src/testing/query-promts.ts","kind":"import-statement","original":"./query-promts"},{"path":"packages/experimental/assistant/src/testing/test-data.ts","kind":"import-statement","original":"./test-data"},{"path":"packages/experimental/assistant/src/testing/test-schema.ts","kind":"import-statement","original":"./test-schema"}],"format":"esm"}},"outputs":{"packages/experimental/assistant/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":19883},"packages/experimental/assistant/dist/lib/browser/index.mjs":{"imports":[{"path":"packages/experimental/assistant/dist/lib/browser/chunk-BDMTBYIM.mjs","kind":"import-statement"},{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"exports":["AIServiceEdgeClient","AIServiecOverloadedError","AISession","DEFAULT_EDGE_MODEL","DEFAULT_EDGE_MODELS","DEFAULT_OLLAMA_ENDPOINT","DEFAULT_OLLAMA_MODEL","DEFAULT_OLLAMA_MODELS","EchoDataSource","GenerateRequest","GenerationStreamImpl","LLMModel","MessageCollector","MixedStreamParser","OllamaClient","StreamTransform","ToolTypes","createArtifactElement","createGenerationStream","emitMessageAsEvents","executeQuery","executeQueryPlan","formatInferredRelationshipLabel","formatJsonSchemaForLLM","formatNodeLabel","isReference","isToolUse","mergeMessageBlock","parseCypherQuery","runLLM","runTools"],"entryPoint":"packages/experimental/assistant/src/index.ts","inputs":{"packages/experimental/assistant/src/index.ts":{"bytesInOutput":0},"packages/experimental/assistant/src/session/session.ts":{"bytesInOutput":11958},"packages/experimental/assistant/src/session/index.ts":{"bytesInOutput":0}},"bytes":13317},"packages/experimental/assistant/dist/lib/browser/testing/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":33826},"packages/experimental/assistant/dist/lib/browser/testing/index.mjs":{"imports":[{"path":"packages/experimental/assistant/dist/lib/browser/chunk-BDMTBYIM.mjs","kind":"import-statement"},{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"exports":["AI_SERVICE_ENDPOINT","Contact","MockDataSource","ObjectId","Org","Project","Task","createCypherTool","createLogger","createSystemPrompt","createTestData","createTestOllamaClient","seedTestData"],"entryPoint":"packages/experimental/assistant/src/testing/index.ts","inputs":{"packages/experimental/assistant/src/testing/defs.ts":{"bytesInOutput":113},"packages/experimental/assistant/src/testing/index.ts":{"bytesInOutput":0},"packages/experimental/assistant/src/testing/logger.ts":{"bytesInOutput":3408},"packages/experimental/assistant/src/testing/ollama.ts":{"bytesInOutput":187},"packages/experimental/assistant/src/testing/query-promts.ts":{"bytesInOutput":2794},"packages/experimental/assistant/src/testing/test-data.ts":{"bytesInOutput":9031},"packages/experimental/assistant/src/testing/test-schema.ts":{"bytesInOutput":1907}},"bytes":18251},"packages/experimental/assistant/dist/lib/browser/chunk-BDMTBYIM.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":129168},"packages/experimental/assistant/dist/lib/browser/chunk-BDMTBYIM.mjs":{"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"parsimmon","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"#parjs","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"exports":["AIServiceEdgeClient","DEFAULT_EDGE_MODEL","DEFAULT_EDGE_MODELS","DEFAULT_OLLAMA_ENDPOINT","DEFAULT_OLLAMA_MODEL","DEFAULT_OLLAMA_MODELS","EchoDataSource","GenerateRequest","GenerationStreamImpl","LLMModel","MessageCollector","MixedStreamParser","OllamaClient","StreamTransform","ToolTypes","createArtifactElement","createGenerationStream","emitMessageAsEvents","executeQuery","executeQueryPlan","formatInferredRelationshipLabel","formatJsonSchemaForLLM","formatNodeLabel","isReference","isToolUse","mergeMessageBlock","parseCypherQuery","runLLM","runTools","trim"],"inputs":{"packages/experimental/assistant/src/ai-service/defs.ts":{"bytesInOutput":773},"packages/experimental/assistant/src/ai-service/stream.ts":{"bytesInOutput":2609},"packages/experimental/assistant/src/ai-service/util/sse.ts":{"bytesInOutput":6115},"packages/experimental/assistant/src/ai-service/util/index.ts":{"bytesInOutput":0},"packages/experimental/assistant/src/ai-service/edge-client.ts":{"bytesInOutput":2011},"packages/experimental/assistant/src/ai-service/message-collector.ts":{"bytesInOutput":1774},"packages/experimental/assistant/src/ai-service/types.ts":{"bytesInOutput":1040},"packages/experimental/assistant/src/conversation/conversation.ts":{"bytesInOutput":7445},"packages/experimental/assistant/src/conversation/index.ts":{"bytesInOutput":0},"packages/experimental/assistant/src/ai-service/ollama-client.ts":{"bytesInOutput":11464},"packages/experimental/assistant/src/ai-service/transform.ts":{"bytesInOutput":1994},"packages/experimental/assistant/src/ai-service/parser.ts":{"bytesInOutput":11264},"packages/experimental/assistant/src/ai-service/index.ts":{"bytesInOutput":0},"packages/experimental/assistant/src/cypher/parjs.ts":{"bytesInOutput":50},"packages/experimental/assistant/src/cypher/combinators.ts":{"bytesInOutput":3853},"packages/experimental/assistant/src/cypher/parser.ts":{"bytesInOutput":239},"packages/experimental/assistant/src/cypher/query-executor.ts":{"bytesInOutput":3917},"packages/experimental/assistant/src/cypher/execution-plan.ts":{"bytesInOutput":5043},"packages/experimental/assistant/src/cypher/schema.ts":{"bytesInOutput":2270},"packages/experimental/assistant/src/util/trim.ts":{"bytesInOutput":204},"packages/experimental/assistant/src/util/index.ts":{"bytesInOutput":0},"packages/experimental/assistant/src/cypher/echo-data-source.ts":{"bytesInOutput":3981},"packages/experimental/assistant/src/cypher/index.ts":{"bytesInOutput":0}},"bytes":68004}}}
@@ -1,10 +1,12 @@
1
1
  import {
2
+ DEFAULT_OLLAMA_MODEL,
3
+ OllamaClient,
2
4
  executeQuery,
3
5
  formatInferredRelationshipLabel,
4
6
  formatJsonSchemaForLLM,
5
7
  formatNodeLabel,
6
8
  trim
7
- } from "../chunk-AXUUNA7O.mjs";
9
+ } from "../chunk-BDMTBYIM.mjs";
8
10
 
9
11
  // packages/experimental/assistant/src/testing/defs.ts
10
12
  var AI_SERVICE_ENDPOINT = {
@@ -129,6 +131,17 @@ var createLogger = ({ stream, filter, onImage } = {}) => {
129
131
  };
130
132
  };
131
133
 
134
+ // packages/experimental/assistant/src/testing/ollama.ts
135
+ var createTestOllamaClient = (options) => {
136
+ return new OllamaClient({
137
+ tools: options?.tools,
138
+ overrides: {
139
+ model: DEFAULT_OLLAMA_MODEL,
140
+ temperature: 0
141
+ }
142
+ });
143
+ };
144
+
132
145
  // packages/experimental/assistant/src/testing/query-promts.ts
133
146
  import { Schema as S } from "effect";
134
147
  import { defineTool, ToolResult } from "@dxos/artifact";
@@ -602,6 +615,7 @@ export {
602
615
  createLogger,
603
616
  createSystemPrompt,
604
617
  createTestData,
618
+ createTestOllamaClient,
605
619
  seedTestData
606
620
  };
607
621
  //# sourceMappingURL=index.mjs.map