@dxos/assistant 0.8.2-main.2f9c567 → 0.8.2-main.5885341

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 (50) hide show
  1. package/dist/lib/browser/{chunk-OLO6SVOL.mjs → chunk-DEIGOD4U.mjs} +21 -21
  2. package/dist/lib/browser/chunk-DEIGOD4U.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +14 -14
  4. package/dist/lib/browser/index.mjs.map +3 -3
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +27 -23
  7. package/dist/lib/browser/testing/index.mjs.map +3 -3
  8. package/dist/lib/node/{chunk-CI5Q7FBG.cjs → chunk-7VH7NMIM.cjs} +6 -6
  9. package/dist/lib/node/chunk-7VH7NMIM.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +34 -34
  11. package/dist/lib/node/index.cjs.map +3 -3
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/testing/index.cjs +18 -13
  14. package/dist/lib/node/testing/index.cjs.map +3 -3
  15. package/dist/lib/node-esm/{chunk-Y3SYOFFJ.mjs → chunk-7JI4MDGL.mjs} +21 -21
  16. package/dist/lib/node-esm/chunk-7JI4MDGL.mjs.map +7 -0
  17. package/dist/lib/node-esm/index.mjs +14 -14
  18. package/dist/lib/node-esm/index.mjs.map +3 -3
  19. package/dist/lib/node-esm/meta.json +1 -1
  20. package/dist/lib/node-esm/testing/index.mjs +27 -23
  21. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  22. package/dist/types/src/ai-service/types.d.ts +130 -130
  23. package/dist/types/src/ai-service/types.d.ts.map +1 -1
  24. package/dist/types/src/conversation/types.d.ts +9 -9
  25. package/dist/types/src/conversation/types.d.ts.map +1 -1
  26. package/dist/types/src/cypher/echo-data-source.d.ts.map +1 -1
  27. package/dist/types/src/session/session.d.ts +3 -3
  28. package/dist/types/src/session/session.d.ts.map +1 -1
  29. package/dist/types/src/testing/query-promts.d.ts +3 -3
  30. package/dist/types/src/testing/query-promts.d.ts.map +1 -1
  31. package/dist/types/src/testing/test-data.d.ts +4 -4
  32. package/dist/types/src/testing/test-data.d.ts.map +1 -1
  33. package/dist/types/src/testing/test-schema.d.ts +23 -25
  34. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  35. package/package.json +13 -14
  36. package/src/ai-service/client.test.ts +5 -5
  37. package/src/ai-service/ollama-client.ts +7 -7
  38. package/src/ai-service/types.ts +14 -14
  39. package/src/conversation/conversation.test.ts +3 -3
  40. package/src/conversation/types.ts +10 -10
  41. package/src/cypher/echo-data-source.ts +5 -7
  42. package/src/session/session.test.ts +16 -22
  43. package/src/session/session.ts +14 -14
  44. package/src/testing/artifacts.test.ts +22 -22
  45. package/src/testing/query-promts.ts +5 -5
  46. package/src/testing/test-data.ts +4 -4
  47. package/src/testing/test-schema.ts +28 -27
  48. package/dist/lib/browser/chunk-OLO6SVOL.mjs.map +0 -7
  49. package/dist/lib/node/chunk-CI5Q7FBG.cjs.map +0 -7
  50. package/dist/lib/node-esm/chunk-Y3SYOFFJ.mjs.map +0 -7
@@ -493,44 +493,44 @@ function* emitMessageAsEvents(message) {
493
493
  }
494
494
 
495
495
  // packages/experimental/assistant/src/ai-service/types.ts
496
- import { Schema } from "effect";
496
+ import { Schema as S } from "effect";
497
497
  import { Tool, Message } from "@dxos/artifact";
498
498
  var createArtifactElement = (id) => `<artifact id=${id} />`;
499
- var LLMModel = Schema.Literal(...DEFAULT_EDGE_MODELS, ...DEFAULT_OLLAMA_MODELS);
499
+ var LLMModel = S.Literal(...DEFAULT_EDGE_MODELS, ...DEFAULT_OLLAMA_MODELS);
500
500
  var ToolTypes = Object.freeze({
501
501
  // TODO(dmaretskyi): Not implemented yet.
502
502
  // DatabaseQuery: 'database_query',
503
503
  TextToImage: "text_to_image"
504
504
  });
505
- var GenerateRequest = Schema.Struct({
505
+ var GenerateRequest = S.Struct({
506
506
  /**
507
507
  * Preferred model or system default.
508
508
  */
509
- model: Schema.optional(LLMModel),
509
+ model: S.optional(LLMModel),
510
510
  /**
511
511
  * Tools available for the LLM.
512
512
  */
513
- tools: Schema.optional(Schema.Array(Tool).pipe(Schema.mutable)),
513
+ tools: S.optional(S.Array(Tool).pipe(S.mutable)),
514
514
  /**
515
515
  * System instructions to the LLM.
516
516
  */
517
- systemPrompt: Schema.optional(Schema.String),
517
+ systemPrompt: S.optional(S.String),
518
518
  /**
519
519
  * History of messages to include in the context window.
520
520
  */
521
521
  // TODO(burdon): Rename messages.
522
- history: Schema.optional(Schema.Array(Message)),
522
+ history: S.optional(S.Array(Message)),
523
523
  /**
524
524
  * Current request.
525
525
  */
526
- prompt: Schema.optional(Message)
526
+ prompt: S.optional(Message)
527
527
  });
528
- var GenerateResponse = Schema.Struct({
529
- messages: Schema.Array(Message),
528
+ var GenerateResponse = S.Struct({
529
+ messages: S.Array(Message),
530
530
  /**
531
531
  * Number of tokens used in the response.
532
532
  */
533
- tokenCount: Schema.optional(Schema.Number)
533
+ tokenCount: S.optional(S.Number)
534
534
  });
535
535
 
536
536
  // packages/experimental/assistant/src/conversation/conversation.ts
@@ -842,7 +842,7 @@ var runTools = async ({ message, tools, extensions }) => {
842
842
  };
843
843
 
844
844
  // packages/experimental/assistant/src/ai-service/ollama-client.ts
845
- import { Schema as Schema2 } from "effect";
845
+ import { Schema as S2 } from "effect";
846
846
  import { defineTool, ToolResult as ToolResult2 } from "@dxos/artifact";
847
847
  import { ObjectId as ObjectId2 } from "@dxos/echo-schema";
848
848
  import { invariant as invariant3 } from "@dxos/invariant";
@@ -1148,8 +1148,8 @@ var WELL_KNOWN_TOOLS = {
1148
1148
  [ToolTypes.TextToImage]: defineTool("system", {
1149
1149
  name: "text-to-image",
1150
1150
  description: "Generate an image from a text prompt",
1151
- schema: Schema2.Struct({
1152
- prompt: Schema2.String.annotations({
1151
+ schema: S2.Struct({
1152
+ prompt: S2.String.annotations({
1153
1153
  description: "The text prompt describing the image to generate"
1154
1154
  })
1155
1155
  }),
@@ -1192,12 +1192,12 @@ var OllamaDecoderStream = class extends TransformStream {
1192
1192
  this._buffer = "";
1193
1193
  }
1194
1194
  };
1195
- var ModelDoesNotSupportToolsError = class extends Schema2.TaggedError()("ModelDoesNotSupportToolsError", {
1196
- model: Schema2.String
1195
+ var ModelDoesNotSupportToolsError = class extends S2.TaggedError()("ModelDoesNotSupportToolsError", {
1196
+ model: S2.String
1197
1197
  }) {
1198
1198
  };
1199
- var ModelNotFoundError = class extends Schema2.TaggedError()("ModelNotFoundError", {
1200
- model: Schema2.String
1199
+ var ModelNotFoundError = class extends S2.TaggedError()("ModelNotFoundError", {
1200
+ model: S2.String
1201
1201
  }) {
1202
1202
  };
1203
1203
  var parseOllamaError = (error) => {
@@ -2272,7 +2272,7 @@ var EchoDataSource = class {
2272
2272
  _ts_decorate([
2273
2273
  log8.method(void 0, void 0, {
2274
2274
  F: __dxlog_file8,
2275
- L: 18,
2275
+ L: 16,
2276
2276
  S: void 0,
2277
2277
  C: (f, a) => f(...a)
2278
2278
  })
@@ -2280,7 +2280,7 @@ _ts_decorate([
2280
2280
  _ts_decorate([
2281
2281
  log8.method(void 0, void 0, {
2282
2282
  F: __dxlog_file8,
2283
- L: 35,
2283
+ L: 33,
2284
2284
  S: void 0,
2285
2285
  C: (f, a) => f(...a)
2286
2286
  })
@@ -2319,4 +2319,4 @@ export {
2319
2319
  isReference,
2320
2320
  EchoDataSource
2321
2321
  };
2322
- //# sourceMappingURL=chunk-OLO6SVOL.mjs.map
2322
+ //# sourceMappingURL=chunk-DEIGOD4U.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ai-service/defs.ts", "../../../src/ai-service/stream.ts", "../../../src/ai-service/util/sse.ts", "../../../src/ai-service/edge-client.ts", "../../../src/ai-service/message-collector.ts", "../../../src/ai-service/types.ts", "../../../src/conversation/conversation.ts", "../../../src/ai-service/ollama-client.ts", "../../../src/ai-service/transform.ts", "../../../src/ai-service/parser.ts", "../../../src/cypher/parjs.ts", "../../../src/cypher/combinators.ts", "../../../src/cypher/parser.ts", "../../../src/cypher/query-executor.ts", "../../../src/cypher/execution-plan.ts", "../../../src/cypher/schema.ts", "../../../src/util/trim.ts", "../../../src/cypher/echo-data-source.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_EDGE_MODEL = '@anthropic/claude-3-5-sonnet-20241022';\n\nexport const DEFAULT_EDGE_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] as const;\n\n// TODO(burdon): Config.\nexport const DEFAULT_OLLAMA_ENDPOINT = 'http://localhost:11434';\n\nexport const DEFAULT_OLLAMA_MODEL = 'llama3.2:1b';\n\n/**\n * https://ollama.com/library\n */\nexport const DEFAULT_OLLAMA_MODELS = [\n //\n 'llama3.2:1b',\n 'llama3:70b',\n 'deepseek-r1:latest',\n] as const;\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 2024 DXOS.org\n//\n\nimport { assertArgument, invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport type { AIServiceClient, GenerationStream } from './service';\nimport { createGenerationStream } from './stream';\nimport { type GenerateRequest, type GenerateResponse } 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 * Generate non-streaming response.\n */\n async exec(request: GenerateRequest): Promise<GenerateResponse> {\n throw new Error('Not implemented');\n }\n\n /**\n * Process request and open message stream.\n */\n async execStream(request: GenerateRequest): Promise<GenerationStream> {\n assertArgument(typeof request.model === 'string', 'model is required');\n log('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 if (!response.ok) {\n throw await parseErrorResponse(response);\n }\n\n invariant(response.body instanceof ReadableStream);\n return createGenerationStream(response, controller);\n }\n}\n\nconst parseErrorResponse = async (response: Response): Promise<Error> => {\n throw new Error(`AI Service error: ${response.status} ${response.statusText} ${await response.text()}`);\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 { Schema as S } from 'effect';\n\nimport { Tool, Message, type MessageContentBlock } from '@dxos/artifact';\nimport { type ObjectId } from '@dxos/echo-schema';\n\nimport { DEFAULT_EDGE_MODELS, DEFAULT_OLLAMA_MODELS } from './defs';\n\nexport const createArtifactElement = (id: ObjectId) => `<artifact id=${id} />`;\n\nexport const LLMModel = S.Literal(...DEFAULT_EDGE_MODELS, ...DEFAULT_OLLAMA_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 /**\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});\nexport type GenerateRequest = S.Schema.Type<typeof GenerateRequest>;\n\n/**\n * Non-streaming response.\n */\nexport const GenerateResponse = S.Struct({\n messages: S.Array(Message),\n\n /**\n * Number of tokens used in the response.\n */\n tokenCount: S.optional(S.Number),\n});\nexport type GenerateResponse = S.Schema.Type<typeof GenerateResponse>;\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 { create, 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.execStream({\n model: params.model,\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 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 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 const resultMessage = create(Message, {\n role: 'user',\n content: [\n {\n type: 'tool_result',\n toolUseId: toolCall.id,\n content: `Tool not found: ${toolCall.name}`,\n isError: true,\n },\n ],\n });\n\n // TODO(burdon): Retry count?\n return {\n type: 'continue',\n message: resultMessage,\n };\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 = create(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 = create(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 { Schema as S } from 'effect';\n\nimport { type MessageContentBlock, defineTool, type Tool, ToolResult } from '@dxos/artifact';\nimport { ObjectId } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport { DEFAULT_OLLAMA_ENDPOINT } from './defs';\nimport { MessageCollector, emitMessageAsEvents } from './message-collector';\nimport { type AIServiceClient, type GenerationStream } from './service';\nimport { GenerationStreamImpl } from './stream';\nimport { ToolTypes, type GenerateRequest, type GenerateResponse, type GenerationStreamEvent } from './types';\nimport { isToolUse, runTools } from '../conversation';\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 * 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_ENDPOINT}/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_ENDPOINT;\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,\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('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 // TODO(burdon): Test if model is not found.\n if (!response.ok) {\n throw await parseErrorResponse(response);\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('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 /**\n * Generate non-streaming response.\n */\n async exec(request: GenerateRequest): Promise<GenerateResponse> {\n throw new Error('Not implemented');\n }\n\n async execStream(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\nclass ModelDoesNotSupportToolsError extends S.TaggedError<ModelDoesNotSupportToolsError>()(\n 'ModelDoesNotSupportToolsError',\n {\n model: S.String,\n },\n) {}\n\nclass ModelNotFoundError extends S.TaggedError<ModelNotFoundError>()('ModelNotFoundError', {\n model: S.String,\n}) {}\n\nconst parseOllamaError = (error: string): Error => {\n {\n const match = error.match(/^([^']+) does not support tools$/);\n if (match) {\n return new ModelDoesNotSupportToolsError({ model: match[1] });\n }\n }\n\n {\n const match = error.match(/^model \"([^\"]+)\" not found, try pulling it first$/);\n if (match) {\n return new ModelNotFoundError({ model: match[1] });\n }\n }\n\n throw new Error(`Ollama API error: ${error}`);\n};\n\nconst parseErrorResponse = async (response: Response): Promise<Error> => {\n if (response.headers.get('content-type')?.includes('application/json')) {\n const body = await response.json();\n return parseOllamaError(body.error);\n }\n\n throw new Error(`Ollama API error: ${response.status} ${response.statusText} ${await response.text()}`);\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", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Message, type MessageContentBlock } from '@dxos/artifact';\nimport { Event } from '@dxos/async';\nimport { create } 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 log('streamEvent', { event });\n this.streamEvent.emit(event);\n\n // log('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 = create(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('text_delta', { chunk });\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 log('pop', { top });\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 'proposal': {\n if (streamBlock.content.length === 1 && streamBlock.content[0].type === 'text') {\n return {\n type: 'json',\n disposition: 'proposal',\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 2024 DXOS.org\n//\n\n// Workaround for https://github.com/vitest-dev/vitest/issues/7174.\nimport type { Parjser } from 'parjs';\n\nimport { parjsCombinators, parjs } from '#parjs';\n\nexport { type Parjser, parjsCombinators, parjs };\n", "//\n// Copyright 2024 DXOS.org\n//\n\n/* eslint-disable unused-imports/no-unused-vars */\n/* eslint-disable @typescript-eslint/consistent-type-imports */\n\nimport type {\n CypherQuery,\n EqualsPredicate,\n GraphPattern,\n GraphPatternConnector,\n Identifier,\n MatchClause,\n MemberExpression,\n NodePattern,\n Properties,\n Property,\n RelationshipPattern,\n ReturnClause,\n StringLiteral,\n WhereClause,\n} from './ast';\nimport { Parjser, parjs, parjsCombinators } from './parjs';\n\n// Helper parsers\nconst ws = parjs.whitespace(); // Parses whitespace\n\nconst nothing = parjs.string('').pipe(parjsCombinators.map(() => null)); // Parses nothing\n\nconst optional = <T>(parser: Parjser<T>) =>\n parser.pipe(\n parjsCombinators.recover(() => ({ kind: 'Soft' })),\n parjsCombinators.or(nothing),\n ); // Makes a parser optional\n\nconst keyword = (word: string) => parjs.string(word).pipe(parjsCombinators.map(() => word)); // Parses specific keywords\n\n// Identifiers (node labels, relationship types, variables, etc.)\nexport const identifier = parjs.regexp(/[a-zA-Z_][a-zA-Z0-9_]*/).pipe(\n parjsCombinators.map((match): Identifier => ({ astKind: 'Identifier', name: match[0] })), // Extract the matched string\n);\n\n// Literals (numbers and strings)\nconst numberLiteral = parjs.regexp(/-?\\d+(\\.\\d+)?/).pipe(parjsCombinators.map(Number)); // Numbers\nconst stringLiteral = parjs.regexp(/\"([^\"]*)\"|'([^']*)'/).pipe(\n parjsCombinators.map((match): StringLiteral => ({ astKind: 'StringLiteral', value: match[1] || match[2] })), // Extract content without quotes\n);\n\n// Node pattern (e.g., \"(n:Person {name: 'John'})\"\nconst variableTag = identifier.pipe(parjsCombinators.map((variable) => variable)).expects('variable tag');\nexport const label = identifier.pipe(parjsCombinators.map((name) => name));\nexport const property = identifier.pipe(\n parjsCombinators.then(parjs.string(':'), ws, stringLiteral),\n parjsCombinators.map(([key, , , value]): Property => ({ key, value })),\n);\nexport const properties = property.pipe(\n parjsCombinators.manySepBy(','),\n parjsCombinators.between('{', '}'),\n parjsCombinators.map((properties): Properties => ({ astKind: 'Properties', properties })),\n);\nexport const nodePattern = optional(variableTag).pipe(\n parjsCombinators.then(':'),\n parjsCombinators.then(ws, label, ws),\n parjsCombinators.then(optional(properties)),\n parjsCombinators.between('(', ')'),\n parjsCombinators.map(\n ([[[variable], _, label], properties]): NodePattern => ({ astKind: 'NodePattern', variable, label, properties }),\n ),\n);\n\nexport const relationshipPattern = optional(variableTag).pipe(\n parjsCombinators.then(':'),\n parjsCombinators.then(ws, label, ws),\n parjsCombinators.then(optional(properties)),\n parjsCombinators.between('[', ']'),\n parjsCombinators.map(\n ([[[variable], _, label], properties]): RelationshipPattern => ({\n astKind: 'RelationshipPattern',\n variable,\n label,\n properties,\n }),\n ),\n);\n\nconst graphPatternConnector = parjs.string('->').pipe(\n parjsCombinators.or('<-' as const, '-' as const),\n parjsCombinators.map((x): GraphPatternConnector => ({ astKind: 'GraphPatternConnector', direction: x })),\n);\n\nexport const graphPattern = nodePattern.pipe(\n parjsCombinators.or(relationshipPattern),\n parjsCombinators.manySepBy(graphPatternConnector),\n parjsCombinators.map((segments): GraphPattern => ({ astKind: 'GraphPattern', segments })),\n);\n\nexport const matchClause = keyword('MATCH').pipe(\n parjsCombinators.then(ws),\n parjsCombinators.then(graphPattern),\n parjsCombinators.map(([, pattern]): MatchClause => ({ astKind: 'MatchClause', pattern })),\n);\n\nconst memberExpression = identifier.pipe(\n parjsCombinators.manySepBy('.'),\n parjsCombinators.map((path): MemberExpression => ({ astKind: 'MemberExpression', path })),\n);\n\nconst equalsPredicate = memberExpression.pipe(\n parjsCombinators.then(ws, parjs.string('='), ws, stringLiteral),\n parjsCombinators.map(([left, , , , right]): EqualsPredicate => ({ astKind: 'EqualsPredicate', left, right })),\n);\n\nexport const whereClause = keyword('WHERE').pipe(\n parjsCombinators.then(\n ws,\n equalsPredicate.pipe(parjsCombinators.between(ws, ws), parjsCombinators.manySepBy(parjs.string('AND'))),\n ws,\n ),\n parjsCombinators.map(([, , predicates]): WhereClause => ({ astKind: 'WhereClause', predicates })),\n);\n\nexport const returnClause = keyword('RETURN').pipe(\n parjsCombinators.then(\n ws,\n memberExpression.pipe(\n parjsCombinators.then(\n optional(parjs.string('AS').pipe(parjsCombinators.between(ws), parjsCombinators.then(identifier))),\n ws,\n ),\n parjsCombinators.manySepBy(parjs.string(',').pipe(parjsCombinators.then(ws))),\n ),\n ws,\n ),\n parjsCombinators.map(([, , fields]): ReturnClause => ({ astKind: 'ReturnClause', fields: fields.map(([f]) => f) })),\n);\n\nexport const cypherQuery = ws.pipe(\n parjsCombinators.then(matchClause, ws, optional(whereClause), ws, returnClause, ws),\n parjsCombinators.map(\n ([, matchClause, , whereClause, , returnClause]): CypherQuery => ({\n astKind: 'CypherQuery',\n matchClause,\n whereClause,\n returnClause,\n }),\n ),\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type { CypherQuery } from './ast';\nimport { cypherQuery } from './combinators';\n\nexport type ParsedQuery = {\n ast: CypherQuery;\n};\n\nexport const parseCypherQuery = (query: string): ParsedQuery => {\n const parseResult = cypherQuery.parse(query);\n if (parseResult.isOk) {\n return { ast: parseResult.value };\n } else {\n throw new Error(`Failed to parse query: ${parseResult}`);\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type { JsonPath } from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\nimport { mapValues } from '@dxos/util';\n\nimport { createExecutionPlan, type ExecutionPlan, type VariableName } from './execution-plan';\nimport { parseCypherQuery } from './parser';\n\nexport interface DataSource {\n getNodes: (params: { label?: string }) => Promise<Node[]>;\n getRelationships: (params: { label?: string }) => Promise<Relationship[]>;\n}\n\nexport type Node = {\n id: string;\n kind: 'node';\n label: string;\n properties: Record<string, unknown>;\n};\n\nexport type Relationship = {\n id: string;\n kind: 'relationship';\n label: string;\n properties: Record<string, unknown>;\n source: Node;\n target: Node;\n};\n\nexport const executeQueryPlan = async (\n dataSource: DataSource,\n plan: ExecutionPlan,\n): Promise<Record<string, unknown>[]> => {\n let buffer: Record<VariableName, Node | Relationship>[] = [];\n const results: Record<string, unknown>[] = [];\n\n for (const step of plan.steps) {\n log('begin step', { step });\n\n switch (step.type) {\n case 'NodeScan': {\n const nodes = await dataSource.getNodes({ label: step.label });\n buffer.push(...nodes.map((node) => ({ [step.into]: node })));\n break;\n }\n case 'FilterByLabel': {\n buffer = buffer.filter((item) => {\n const node = item[step.variable];\n return node && node.kind === 'node' && node.label === step.label;\n });\n break;\n }\n case 'FilterByProperty': {\n buffer = buffer.filter((item) => {\n const node = item[step.variable];\n return node && node.kind === 'node' && node.properties[step.property] === step.value;\n });\n break;\n }\n case 'RelationshipScan': {\n const relationships = await dataSource.getRelationships({ label: step.label });\n for (const tuple of [...buffer]) {\n if (tuple[step.anchor].kind !== 'node') {\n continue;\n }\n const filteredRelationships = relationships.filter((relationship) => {\n switch (step.direction) {\n case 'in':\n return relationship.target.id === tuple[step.anchor].id;\n case 'out':\n return relationship.source.id === tuple[step.anchor].id;\n case 'both':\n return (\n relationship.source.id === tuple[step.anchor].id || relationship.target.id === tuple[step.anchor].id\n );\n default:\n throw new Error(`Unknown direction: ${step.direction}`);\n }\n });\n for (let i = 0; i < filteredRelationships.length; i++) {\n const relationship = filteredRelationships[i];\n const newTuple = i === 0 ? tuple : { ...tuple };\n if (newTuple !== tuple) {\n buffer.push(newTuple);\n }\n newTuple[step.relationshipInto] = relationship;\n switch (step.direction) {\n case 'in':\n newTuple[step.nodeInto] = relationship.source;\n break;\n case 'out':\n newTuple[step.nodeInto] = relationship.target;\n break;\n case 'both':\n newTuple[step.nodeInto] =\n relationship.source.id === newTuple[step.anchor].id ? relationship.target : relationship.source;\n break;\n }\n }\n }\n break;\n }\n case 'ProduceResults': {\n for (const tuple of buffer) {\n const result: Record<string, unknown> = {};\n for (const field of step.fields) {\n result[field.name] = jsonPathGet(tuple[field.variable].properties, field.path);\n }\n results.push(result);\n }\n break;\n }\n }\n\n log('finish step', { buffer: buffer.map((tuple) => mapValues(tuple, (x) => x.id)), results });\n }\n\n return results;\n};\n\nexport const executeQuery = (dataSource: DataSource, query: string): Promise<Record<string, unknown>[]> => {\n const plan = createExecutionPlan(parseCypherQuery(query));\n return executeQueryPlan(dataSource, plan);\n};\n\n// TODO(dmaretskyi): Extract.\nconst jsonPathGet = (obj: Record<string, unknown>, path: JsonPath): unknown => {\n if (path === '' || path === '$') {\n return obj;\n }\n\n const parts = path.split('.');\n if (parts[0] === '$') {\n parts.shift();\n }\n\n let result: any = obj;\n for (const part of parts) {\n result = result?.[part];\n }\n return result;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type { JsonPath } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport type { GraphPatternConnector, MatchClause, ReturnClause, WhereClause } from './ast';\nimport type { ParsedQuery } from './parser';\n\nexport type VariableName = string & { __VariableName: never };\n\nexport type ExecutionPlanStep =\n | {\n type: 'NodeScan';\n label: string;\n into: VariableName;\n }\n | {\n type: 'FilterByLabel';\n variable: VariableName;\n label: string;\n }\n | {\n type: 'FilterByProperty';\n variable: VariableName;\n property: JsonPath;\n value: unknown;\n }\n | {\n /**\n * Scans (anchor)-[relationshipInto:label]->(nodeInto).\n */\n type: 'RelationshipScan';\n label: string;\n anchor: VariableName;\n relationshipInto: VariableName;\n nodeInto: VariableName;\n\n /**\n * `in`: (anchor)<-[relationshipInto:label]-(nodeInto)\n * `out`: (anchor)-[relationshipInto:label]->(nodeInto)\n * `both`: (anchor)-[relationshipInto:label]-(nodeInto)\n */\n direction: 'in' | 'out' | 'both';\n }\n | {\n type: 'ProduceResults';\n fields: {\n name: string;\n variable: VariableName;\n path: JsonPath;\n }[];\n };\n\nexport type ExecutionPlan = {\n steps: ExecutionPlanStep[];\n output: {\n fields: string[];\n };\n};\n\nexport const createExecutionPlan = (query: ParsedQuery): ExecutionPlan => {\n return new ExecutionPlanBuilder().build(query);\n};\n\nclass ExecutionPlanBuilder {\n private counter = 0;\n\n newVariable(): VariableName {\n return `anon_${this.counter++}` as VariableName;\n }\n\n build(query: ParsedQuery): ExecutionPlan {\n log('Creating execution plan for query', { query });\n return {\n steps: [\n ...this.createStepsForMatchClause(query.ast.matchClause),\n ...(query.ast.whereClause ? this.createStepsForWhereClause(query.ast.whereClause) : []),\n ...this.createStepsForReturnClause(query.ast.returnClause),\n ],\n output: {\n fields: this.getOutputFields(query.ast.returnClause),\n },\n };\n }\n\n createStepsForMatchClause(match: MatchClause): ExecutionPlanStep[] {\n invariant(match.pattern.segments.length > 0);\n const firstSegment = match.pattern.segments[0];\n invariant(firstSegment.astKind === 'NodePattern');\n let lastNodeVariable = (firstSegment.variable?.name as VariableName) ?? this.newVariable();\n\n const steps: ExecutionPlanStep[] = [];\n steps.push({\n type: 'NodeScan',\n label: firstSegment.label.name,\n into: lastNodeVariable,\n });\n\n if (firstSegment.properties) {\n for (const property of firstSegment.properties.properties) {\n steps.push({\n type: 'FilterByProperty',\n variable: lastNodeVariable,\n property: property.key.name as JsonPath,\n value: property.value.value,\n });\n }\n }\n\n for (let i = 1; i < match.pattern.segments.length; i++) {\n const relationshipSegment = match.pattern.segments[i++];\n invariant(relationshipSegment.astKind === 'RelationshipPattern');\n const nodeSegment = match.pattern.segments[i];\n invariant(nodeSegment.astKind === 'NodePattern');\n const leftSeparator = match.pattern.segments.separators[i - 2];\n const rightSeparator = match.pattern.segments.separators[i - 1];\n const direction = getDirection(leftSeparator.direction, rightSeparator.direction);\n\n const relationshipVariable = (relationshipSegment.variable?.name as VariableName) ?? this.newVariable();\n const nodeVariable = (nodeSegment.variable?.name as VariableName) ?? this.newVariable();\n\n steps.push({\n type: 'RelationshipScan',\n label: relationshipSegment.label.name,\n direction,\n anchor: lastNodeVariable,\n relationshipInto: relationshipVariable,\n nodeInto: nodeVariable,\n });\n\n if (relationshipSegment.properties) {\n for (const property of relationshipSegment.properties.properties) {\n steps.push({\n type: 'FilterByProperty',\n variable: relationshipVariable,\n property: property.key.name as JsonPath,\n value: property.value.value,\n });\n }\n }\n if (nodeSegment.label) {\n steps.push({\n type: 'FilterByLabel',\n variable: nodeVariable,\n label: nodeSegment.label.name,\n });\n }\n if (nodeSegment.properties) {\n for (const property of nodeSegment.properties.properties) {\n steps.push({\n type: 'FilterByProperty',\n variable: nodeVariable,\n property: property.key.name as JsonPath,\n value: property.value.value,\n });\n }\n }\n\n lastNodeVariable = nodeVariable;\n }\n\n return steps;\n }\n\n createStepsForWhereClause(where: WhereClause): ExecutionPlanStep[] {\n return [];\n }\n\n createStepsForReturnClause(returnClause: ReturnClause): ExecutionPlanStep[] {\n return [\n {\n type: 'ProduceResults',\n fields: returnClause.fields.map((field) => ({\n name: field.path.map((p) => p.name).join('_'),\n variable: field.path[0].name as VariableName,\n path:\n field.path.length > 1\n ? (field.path\n .slice(1)\n .map((p) => p.name)\n .join('.') as JsonPath)\n : ('$' as JsonPath),\n })),\n },\n ];\n }\n\n getOutputFields(returnClause: ReturnClause): string[] {\n return returnClause.fields.map((field) => field.path.map((p) => p.name).join('_'));\n }\n}\n\nconst getDirection = (\n left: GraphPatternConnector['direction'],\n right: GraphPatternConnector['direction'],\n): 'in' | 'out' | 'both' => {\n if (left === '-' && right === '->') {\n return 'out';\n } else if (left === '<-' && right === '-') {\n return 'in';\n } else if (left === '-' && right === '-') {\n return 'both';\n }\n throw new Error(`Invalid direction: ()${left}[]${right}()`);\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { raise } from '@dxos/debug';\nimport { JSON_SCHEMA_ECHO_REF_ID, type JsonSchemaType } from '@dxos/echo-schema';\n\nimport { trim } from '../util';\n\n/**\n * Formats ECHO schema to be consumed by LLM.\n * Schema is formatted in cypher format.\n * Objects are represented as nodes.\n * References are represented as relationships.\n */\nexport const formatJsonSchemaForLLM = (schemaTypes: JsonSchemaType[]): string[] => {\n return schemaTypes.flatMap((schema) => [\n formatNodeSchema(schema),\n ...formatInferredRelationships(schema, schemaTypes),\n ]);\n};\n\nconst formatNodeSchema = (schema: JsonSchemaType) => {\n const label = formatNodeLabel(schema.typename ?? raise(new Error('Schema must have $id')));\n const properties = Object.entries(schema.properties!).filter(([key, prop]) => key !== 'id' && !isReference(prop));\n\n return trim`\n <node>\n (:${label})\n\n <description>${schema.description}</description>\n\n <properties>\n ${properties.map(([key, value]) => {\n return trim`\n <${key}>\n <type>${value.type}</type>\n <description>${value.description}</description>\n </${key}>\n `;\n })}\n </properties>\n </node>\n `;\n};\n\nconst formatInferredRelationships = (schema: JsonSchemaType, allSchema: JsonSchemaType[]): string[] => {\n const nodeLabel = formatNodeLabel(schema.typename ?? raise(new Error('Schema must have $id')));\n const relationships = Object.entries(schema.properties!).filter(([key, prop]) => isReference(prop));\n\n return relationships.map(([key, value]) => {\n const relationshipLabel = formatInferredRelationshipLabel(\n schema.typename ?? raise(new Error('Schema must have $id')),\n key,\n );\n\n // TODO(dmaretskyi): Registered schema don't get reference types updated.\n const targetSchema = allSchema.find((schema) => `dxn:type/${schema.typename}` === value.reference?.schema.$ref);\n const targetLabel = targetSchema ? formatNodeLabel(targetSchema?.typename ?? '') : '';\n\n return trim`\n <relationship>\n (:${nodeLabel})-[:${relationshipLabel}]->(:${targetLabel})\n\n <description>${value.description}</description>\n </relationship>\n `;\n });\n};\n\nexport const formatNodeLabel = (typename: string) => {\n return typename.replace(/^example\\.com\\/type\\//g, '');\n};\n\nexport const formatInferredRelationshipLabel = (typename: string, property: string) => {\n const nodeLabel = formatNodeLabel(typename);\n return `${nodeLabel}_${property}`.toUpperCase();\n};\n\nexport const isReference = (schema: JsonSchemaType) =>\n schema.$id === JSON_SCHEMA_ECHO_REF_ID ||\n (schema.type === 'array' &&\n !Array.isArray(schema.items) &&\n typeof schema.items === 'object' &&\n '$id' in schema.items &&\n schema.items.$id === JSON_SCHEMA_ECHO_REF_ID);\n", "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Trims multiline strings.\n */\n// TODO(burdon): Move to util.\nexport const trim = (strings: TemplateStringsArray, ...values: any[]) => {\n const combined = strings.reduce((acc, str, i) => {\n return acc + str + (values[i] || '');\n }, '');\n\n return combined.replace('/^\\n/', '').replace(/\\n$/, '');\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { raise } from '@dxos/debug';\nimport { type EchoDatabase, Filter, type ReactiveEchoObject } from '@dxos/echo-db';\nimport { getSchema, getSchemaTypename, type S, StoredSchema, toJsonSchema } from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\n\nimport type { DataSource, Node, Relationship } from './query-executor';\nimport { formatInferredRelationshipLabel, formatNodeLabel, isReference } from './schema';\n\nexport class EchoDataSource implements DataSource {\n constructor(private readonly _db: EchoDatabase) {}\n\n @log.method()\n async getNodes({ label }: { label?: string }): Promise<Node[]> {\n if (!label) {\n const { objects } = await this._db.query().run();\n return objects.map(this._objectToNode);\n }\n\n const schema = (await this._getAllSchema()).find((s) => getSchemaTypename(s)?.endsWith(label));\n\n if (!schema) {\n return [];\n }\n\n const { objects } = await this._db.query(Filter.schema(schema)).run();\n return objects.map(this._objectToNode);\n }\n\n @log.method()\n async getRelationships({ label }: { label?: string }): Promise<Relationship[]> {\n const syntheticRefRelationships = (await this._getAllSchema())\n .filter((schema) => getSchemaTypename(schema) !== StoredSchema.typename)\n .flatMap((schema) => {\n const jsonSchema = toJsonSchema(schema);\n const relationships = Object.entries(jsonSchema.properties!).filter(([key, prop]) => isReference(prop));\n\n return relationships.map(([key, value]) => {\n const relationshipLabel = formatInferredRelationshipLabel(\n jsonSchema.typename ?? raise(new Error('Schema must have typename')),\n key,\n );\n\n return {\n label: relationshipLabel,\n schema,\n property: key,\n };\n });\n });\n const relationship = syntheticRefRelationships.find((r) => r.label === label);\n if (!relationship) {\n return []; // TODO(dmaretskyi): Handle real relationships.\n }\n\n const { objects } = await this._db.query(Filter.schema(relationship.schema)).run();\n return (\n await Promise.all(objects.map((object) => this._projectRefRelationship(object, relationship.property)))\n ).flat();\n }\n\n private async _getAllSchema(): Promise<S.Schema.AnyNoContext[]> {\n return [\n ...(await this._db.schemaRegistry.query().run()),\n // TODO(dmaretskyi): Remove once we can serialize recursive schema.\n ...this._db.graph.schemaRegistry.schemas.filter((s) => getSchemaTypename(s)?.startsWith('example.org')),\n ].filter((schema) => getSchemaTypename(schema) !== StoredSchema.typename);\n }\n\n private _objectToNode(object: ReactiveEchoObject<any>): Node {\n const { id, ...properties } = object;\n return {\n id,\n kind: 'node',\n label: formatNodeLabel(getSchemaTypename(getSchema(object)!)!),\n properties,\n };\n }\n\n private async _projectRefRelationship(object: ReactiveEchoObject<any>, prop: string): Promise<Relationship[]> {\n if (!object[prop]) {\n return [];\n }\n\n const value = Array.isArray(object[prop]) ? object[prop] : [object[prop]];\n\n return Promise.all(\n value.map(async (ref): Promise<Relationship> => {\n const target = await ref.load();\n return {\n id: `${object.id}-${prop}-${target.id}`,\n kind: 'relationship',\n label: formatInferredRelationshipLabel(getSchemaTypename(getSchema(object)!)!, prop),\n properties: {},\n source: this._objectToNode(object),\n target: this._objectToNode(target),\n };\n }),\n );\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["DEFAULT_EDGE_MODEL", "DEFAULT_EDGE_MODELS", "DEFAULT_OLLAMA_ENDPOINT", "DEFAULT_OLLAMA_MODEL", "DEFAULT_OLLAMA_MODELS", "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", "assertArgument", "invariant", "log", "AIServiceEdgeClient", "constructor", "endpoint", "invariant", "_endpoint", "exec", "request", "Error", "execStream", "assertArgument", "model", "log", "controller", "AbortController", "response", "fetch", "signal", "method", "headers", "body", "JSON", "stringify", "tools", "ok", "parseErrorResponse", "ReadableStream", "createGenerationStream", "status", "statusText", "text", "MessageCollector", "_messages", "_pendingMessage", "undefined", "messages", "pendingMessage", "push", "event", "type", "message", "content", "index", "block", "delta", "text", "pending", "Object", "assign", "pushMessage", "emitMessageAsEvents", "Schema", "S", "Tool", "Message", "createArtifactElement", "id", "LLMModel", "S", "Literal", "DEFAULT_EDGE_MODELS", "DEFAULT_OLLAMA_MODELS", "ToolTypes", "Object", "freeze", "TextToImage", "GenerateRequest", "Struct", "model", "optional", "tools", "Array", "Tool", "pipe", "mutable", "systemPrompt", "String", "history", "Message", "prompt", "GenerateResponse", "messages", "tokenCount", "Number", "ToolResult", "Message", "create", "ObjectId", "invariant", "log", "runLLM", "params", "conversationResult", "history", "generate", "tools", "beginTs", "Date", "now", "stream", "client", "execStream", "model", "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", "Schema", "S", "defineTool", "ToolResult", "ObjectId", "invariant", "log", "OllamaClient", "isRunning", "response", "fetch", "DEFAULT_OLLAMA_ENDPOINT", "method", "headers", "signal", "AbortSignal", "timeout", "ok", "error", "constructor", "endpoint", "tools", "overrides", "maxToolInvocations", "_endpoint", "_tools", "_modelOverride", "model", "_temperatureOverride", "temperature", "_maxToolInvocations", "_getEmbededTools", "clientTools", "filter", "tool", "type", "undefined", "WELL_KNOWN_TOOLS", "map", "_generateStream", "request", "invariant", "prompt", "ollamaRequest", "messages", "stream", "options", "systemPrompt", "push", "role", "content", "history", "length", "message", "text", "tool_calls", "function", "name", "arguments", "input", "JSON", "stringify", "toolUseId", "allTools", "withWellKnownTools", "description", "parameters", "properties", "required", "log", "body", "parseErrorResponse", "Error", "reader", "pipeThrough", "TextDecoderStream", "OllamaDecoderStream", "getReader", "messageId", "ObjectId", "random", "id", "textBlock", "currentBlockIndex", "index", "done", "value", "data", "read", "delta", "warn", "sanitizeToolArguments", "stopReason", "releaseLock", "exec", "execStream", "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", "ModelDoesNotSupportToolsError", "TaggedError", "ModelNotFoundError", "parseOllamaError", "match", "get", "includes", "json", "status", "statusText", "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", "Message", "Event", "create", "invariant", "log", "isNotFalsy", "safeParseJson", "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", "create", "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", "parjsCombinators", "parjs", "ws", "parjs", "whitespace", "nothing", "string", "pipe", "parjsCombinators", "map", "optional", "parser", "recover", "kind", "or", "keyword", "word", "identifier", "regexp", "match", "astKind", "name", "numberLiteral", "Number", "stringLiteral", "value", "variableTag", "variable", "expects", "label", "property", "then", "key", "properties", "manySepBy", "between", "nodePattern", "_", "relationshipPattern", "graphPatternConnector", "x", "direction", "graphPattern", "segments", "matchClause", "pattern", "memberExpression", "path", "equalsPredicate", "left", "right", "whereClause", "predicates", "returnClause", "fields", "f", "cypherQuery", "parseCypherQuery", "query", "parseResult", "cypherQuery", "parse", "isOk", "ast", "value", "Error", "log", "mapValues", "invariant", "log", "createExecutionPlan", "query", "ExecutionPlanBuilder", "build", "counter", "newVariable", "steps", "createStepsForMatchClause", "ast", "matchClause", "whereClause", "createStepsForWhereClause", "createStepsForReturnClause", "returnClause", "output", "fields", "getOutputFields", "match", "pattern", "segments", "length", "firstSegment", "astKind", "lastNodeVariable", "variable", "name", "push", "type", "label", "into", "properties", "property", "key", "value", "i", "relationshipSegment", "nodeSegment", "leftSeparator", "separators", "rightSeparator", "direction", "getDirection", "relationshipVariable", "nodeVariable", "anchor", "relationshipInto", "nodeInto", "where", "map", "field", "path", "p", "join", "slice", "left", "right", "Error", "executeQueryPlan", "dataSource", "plan", "buffer", "results", "step", "steps", "log", "type", "nodes", "getNodes", "label", "push", "map", "node", "into", "filter", "item", "variable", "kind", "properties", "property", "value", "relationships", "getRelationships", "tuple", "anchor", "filteredRelationships", "relationship", "direction", "target", "id", "source", "Error", "i", "length", "newTuple", "relationshipInto", "nodeInto", "result", "field", "fields", "name", "jsonPathGet", "path", "mapValues", "x", "executeQuery", "query", "createExecutionPlan", "parseCypherQuery", "obj", "parts", "split", "shift", "part", "raise", "JSON_SCHEMA_ECHO_REF_ID", "trim", "strings", "values", "combined", "reduce", "acc", "str", "i", "replace", "formatJsonSchemaForLLM", "schemaTypes", "flatMap", "schema", "formatNodeSchema", "formatInferredRelationships", "label", "formatNodeLabel", "typename", "raise", "Error", "properties", "Object", "entries", "filter", "key", "prop", "isReference", "trim", "description", "map", "value", "type", "allSchema", "nodeLabel", "relationships", "relationshipLabel", "formatInferredRelationshipLabel", "targetSchema", "find", "reference", "$ref", "targetLabel", "replace", "property", "toUpperCase", "$id", "JSON_SCHEMA_ECHO_REF_ID", "Array", "isArray", "items", "raise", "Filter", "getSchema", "getSchemaTypename", "StoredSchema", "toJsonSchema", "log", "EchoDataSource", "constructor", "_db", "getNodes", "label", "objects", "query", "run", "map", "_objectToNode", "schema", "_getAllSchema", "find", "s", "getSchemaTypename", "endsWith", "Filter", "getRelationships", "syntheticRefRelationships", "filter", "StoredSchema", "typename", "flatMap", "jsonSchema", "toJsonSchema", "relationships", "Object", "entries", "properties", "key", "prop", "isReference", "value", "relationshipLabel", "formatInferredRelationshipLabel", "raise", "Error", "property", "relationship", "r", "Promise", "all", "object", "_projectRefRelationship", "flat", "schemaRegistry", "graph", "schemas", "startsWith", "id", "kind", "formatNodeLabel", "getSchema", "Array", "isArray", "ref", "target", "load", "source", "log", "method"]
7
+ }
@@ -29,10 +29,10 @@ import {
29
29
  parseCypherQuery,
30
30
  runLLM,
31
31
  runTools
32
- } from "./chunk-OLO6SVOL.mjs";
32
+ } from "./chunk-DEIGOD4U.mjs";
33
33
 
34
34
  // packages/experimental/assistant/src/session/session.ts
35
- import { Option, Schema as Schema2 } from "effect";
35
+ import { Option, Schema as S } from "effect";
36
36
  import { defineTool, Message, ToolResult } from "@dxos/artifact";
37
37
  import { Event, synchronized } from "@dxos/async";
38
38
  import { ObjectVersion } from "@dxos/echo-db";
@@ -278,7 +278,7 @@ var AISession = class _AISession {
278
278
  return defineTool("system", {
279
279
  name: "query_artifact_definitions",
280
280
  description: "Query the available artifact definitions",
281
- schema: Schema2.Struct({}),
281
+ schema: S.Struct({}),
282
282
  execute: async () => {
283
283
  return ToolResult.Success({
284
284
  artifactDefinitions: artifacts.map((artifact) => ({
@@ -294,8 +294,8 @@ var AISession = class _AISession {
294
294
  return defineTool("system", {
295
295
  name: "require_artifact_definitions",
296
296
  description: "Require the use of specific artifact definitions. This will allow the model to interact with artifact definitions and use their tools.",
297
- schema: Schema2.Struct({
298
- artifactDefinitionIds: Schema2.Array(Schema2.String).annotations({
297
+ schema: S.Struct({
298
+ artifactDefinitionIds: S.Array(S.String).annotations({
299
299
  description: "The ids of the artifact definitions to require",
300
300
  examples: [
301
301
  [
@@ -318,21 +318,21 @@ var AISession = class _AISession {
318
318
  return defineTool("system", {
319
319
  name: "create_plan",
320
320
  description: "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.",
321
- schema: Schema2.Struct({
322
- goal: Schema2.String.annotations({
321
+ schema: S.Struct({
322
+ goal: S.String.annotations({
323
323
  description: "The goal that the plan will achieve."
324
324
  }),
325
- steps: Schema2.Array(Schema2.Struct({
326
- action: Schema2.String.annotations({
325
+ steps: S.Array(S.Struct({
326
+ action: S.String.annotations({
327
327
  description: "Complete, detailed action to perform."
328
328
  }),
329
- input: Schema2.String.annotations({
329
+ input: S.String.annotations({
330
330
  description: "The required input data for this step. First step must not require any data."
331
331
  }),
332
- output: Schema2.String.annotations({
332
+ output: S.String.annotations({
333
333
  description: "The output data from this step. This is passed to the next step as input."
334
334
  }),
335
- requiredArtifactIds: Schema2.Array(Schema2.String).annotations({
335
+ requiredArtifactIds: S.Array(S.String).annotations({
336
336
  description: "The ids of the artifacts required to perform this step.",
337
337
  examples: [
338
338
  [
@@ -444,14 +444,14 @@ var createBaseInstructions = ({ availableArtifacts, operationModel }) => `
444
444
 
445
445
  ${availableArtifacts.length > 0 ? `Artifacts already in context: ${availableArtifacts.join("\n")}` : ""}
446
446
  `;
447
- var AIServiecOverloadedError = class extends Schema2.TaggedError()("AIServiecOverloadedError", {}) {
447
+ var AIServiecOverloadedError = class extends S.TaggedError()("AIServiecOverloadedError", {}) {
448
448
  };
449
449
  var gatherObjectVersions = (messages) => {
450
450
  const artifactIds = /* @__PURE__ */ new Map();
451
451
  for (const message of messages) {
452
452
  for (const block of message.content) {
453
453
  if (block.type === "json" && block.disposition === VersionPin.DISPOSITION) {
454
- const pin = VersionPin.pipe(Schema2.decodeOption)(JSON.parse(block.json)).pipe(Option.getOrUndefined);
454
+ const pin = VersionPin.pipe(S.decodeOption)(JSON.parse(block.json)).pipe(Option.getOrUndefined);
455
455
  if (!pin) {
456
456
  continue;
457
457
  }