@dxos/assistant 0.7.5-labs.ff2ff30 → 0.7.5-staging.2ff1350

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.
@@ -13,6 +13,7 @@ import {
13
13
  import { Schema as S } from "@effect/schema";
14
14
  import { Message } from "@dxos/artifact";
15
15
  import { invariant } from "@dxos/invariant";
16
+ import { log as log2 } from "@dxos/log";
16
17
 
17
18
  // packages/experimental/assistant/src/ai-service/stream.ts
18
19
  import { Trigger } from "@dxos/async";
@@ -354,7 +355,7 @@ var AIServiceClientImpl = class {
354
355
  constructor({ endpoint }) {
355
356
  invariant(endpoint, "endpoint is required", {
356
357
  F: __dxlog_file2,
357
- L: 36,
358
+ L: 37,
358
359
  S: this,
359
360
  A: [
360
361
  "endpoint",
@@ -396,6 +397,18 @@ var AIServiceClientImpl = class {
396
397
  * Open message stream.
397
398
  */
398
399
  async generate(request) {
400
+ request = {
401
+ tools: request.tools ?? [],
402
+ ...request
403
+ };
404
+ log2.info("requesting", {
405
+ endpoint: this._endpoint
406
+ }, {
407
+ F: __dxlog_file2,
408
+ L: 84,
409
+ S: this,
410
+ C: (f, a) => f(...a)
411
+ });
399
412
  const controller = new AbortController();
400
413
  const response = await fetch(`${this._endpoint}/generate`, {
401
414
  signal: controller.signal,
@@ -407,7 +420,7 @@ var AIServiceClientImpl = class {
407
420
  });
408
421
  invariant(response.body instanceof ReadableStream, void 0, {
409
422
  F: __dxlog_file2,
410
- L: 85,
423
+ L: 93,
411
424
  S: this,
412
425
  A: [
413
426
  "response.body instanceof ReadableStream",
@@ -423,7 +436,7 @@ import { Message as Message2 } from "@dxos/artifact";
423
436
  import { Event } from "@dxos/async";
424
437
  import { createStatic } from "@dxos/echo-schema";
425
438
  import { invariant as invariant2 } from "@dxos/invariant";
426
- import { log as log2 } from "@dxos/log";
439
+ import { log as log3 } from "@dxos/log";
427
440
  import { isNotFalsy, safeParseJson } from "@dxos/util";
428
441
 
429
442
  // packages/experimental/assistant/src/ai-service/transform.ts
@@ -566,6 +579,7 @@ var MixedStreamParser = class {
566
579
  let contentBlock;
567
580
  let streamBlock;
568
581
  const stack = [];
582
+ const messagesCollected = [];
569
583
  for await (const event of stream) {
570
584
  switch (event.type) {
571
585
  //
@@ -573,9 +587,9 @@ var MixedStreamParser = class {
573
587
  //
574
588
  case "message_start": {
575
589
  if (this._message) {
576
- log2.warn("unexpected message_start", void 0, {
590
+ log3.warn("unexpected message_start", void 0, {
577
591
  F: __dxlog_file3,
578
- L: 86,
592
+ L: 88,
579
593
  S: this,
580
594
  C: (f, a) => f(...a)
581
595
  });
@@ -589,9 +603,9 @@ var MixedStreamParser = class {
589
603
  }
590
604
  case "message_delta": {
591
605
  if (!this._message) {
592
- log2.warn("unexpected message_delta", void 0, {
606
+ log3.warn("unexpected message_delta", void 0, {
593
607
  F: __dxlog_file3,
594
- L: 96,
608
+ L: 98,
595
609
  S: this,
596
610
  C: (f, a) => f(...a)
597
611
  });
@@ -600,13 +614,14 @@ var MixedStreamParser = class {
600
614
  }
601
615
  case "message_stop": {
602
616
  if (!this._message) {
603
- log2.warn("unexpected message_stop", void 0, {
617
+ log3.warn("unexpected message_stop", void 0, {
604
618
  F: __dxlog_file3,
605
- L: 104,
619
+ L: 106,
606
620
  S: this,
607
621
  C: (f, a) => f(...a)
608
622
  });
609
623
  } else {
624
+ messagesCollected.push(this._message);
610
625
  this._message = void 0;
611
626
  }
612
627
  break;
@@ -616,11 +631,11 @@ var MixedStreamParser = class {
616
631
  //
617
632
  case "content_block_start": {
618
633
  if (contentBlock) {
619
- log2.warn("unexpected content_block_start", {
634
+ log3.warn("unexpected content_block_start", {
620
635
  content: contentBlock
621
636
  }, {
622
637
  F: __dxlog_file3,
623
- L: 117,
638
+ L: 120,
624
639
  S: this,
625
640
  C: (f, a) => f(...a)
626
641
  });
@@ -630,9 +645,9 @@ var MixedStreamParser = class {
630
645
  }
631
646
  case "content_block_delta": {
632
647
  if (!contentBlock) {
633
- log2.warn("unexpected content_block_delta", void 0, {
648
+ log3.warn("unexpected content_block_delta", void 0, {
634
649
  F: __dxlog_file3,
635
- L: 127,
650
+ L: 130,
636
651
  S: this,
637
652
  C: (f, a) => f(...a)
638
653
  });
@@ -658,7 +673,7 @@ var MixedStreamParser = class {
658
673
  const top = stack.pop();
659
674
  invariant2(top && top.type === "tag", void 0, {
660
675
  F: __dxlog_file3,
661
- L: 151,
676
+ L: 154,
662
677
  S: this,
663
678
  A: [
664
679
  "top && top.type === 'tag'",
@@ -682,7 +697,7 @@ var MixedStreamParser = class {
682
697
  const last = streamBlock.content.at(-1);
683
698
  invariant2(last, void 0, {
684
699
  F: __dxlog_file3,
685
- L: 168,
700
+ L: 171,
686
701
  S: this,
687
702
  A: [
688
703
  "last",
@@ -734,11 +749,11 @@ var MixedStreamParser = class {
734
749
  //
735
750
  case "input_json_delta": {
736
751
  if (!contentBlock) {
737
- log2.warn("unexpected input_json_delta", {
752
+ log3.warn("unexpected input_json_delta", {
738
753
  contentBlock
739
754
  }, {
740
755
  F: __dxlog_file3,
741
- L: 218,
756
+ L: 221,
742
757
  S: this,
743
758
  C: (f, a) => f(...a)
744
759
  });
@@ -759,9 +774,9 @@ var MixedStreamParser = class {
759
774
  }
760
775
  case "content_block_stop": {
761
776
  if (!contentBlock) {
762
- log2.warn("unexpected content_block_stop", void 0, {
777
+ log3.warn("unexpected content_block_stop", void 0, {
763
778
  F: __dxlog_file3,
764
- L: 235,
779
+ L: 238,
765
780
  S: this,
766
781
  C: (f, a) => f(...a)
767
782
  });
@@ -777,15 +792,16 @@ var MixedStreamParser = class {
777
792
  this._emitUpdate(contentBlock, streamBlock);
778
793
  }
779
794
  }
795
+ return messagesCollected;
780
796
  }
781
797
  };
782
798
  var mergeMessageBlock = (contentBlock, streamBlock) => {
783
- log2("mergeMessageBlock", {
799
+ log3("mergeMessageBlock", {
784
800
  contentBlock,
785
801
  streamBlock
786
802
  }, {
787
803
  F: __dxlog_file3,
788
- L: 260,
804
+ L: 265,
789
805
  S: void 0,
790
806
  C: (f, a) => f(...a)
791
807
  });
@@ -852,6 +868,13 @@ var mergeMessageBlock = (contentBlock, streamBlock) => {
852
868
  })
853
869
  };
854
870
  }
871
+ case "tool-list": {
872
+ return {
873
+ type: "json",
874
+ disposition: "tool_list",
875
+ json: JSON.stringify({})
876
+ };
877
+ }
855
878
  }
856
879
  break;
857
880
  }
@@ -916,13 +939,13 @@ var GenerateRequest = S2.Struct({
916
939
  import { ToolResult, Message as Message4 } from "@dxos/artifact";
917
940
  import { createStatic as createStatic2, ObjectId as ObjectId2 } from "@dxos/echo-schema";
918
941
  import { invariant as invariant3 } from "@dxos/invariant";
919
- import { log as log3 } from "@dxos/log";
942
+ import { log as log4 } from "@dxos/log";
920
943
  var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/experimental/assistant/src/conversation/conversation.ts";
921
944
  var runLLM = async (params) => {
922
945
  let conversationResult = null;
923
946
  const history = params.history ?? [];
924
947
  const generate = async () => {
925
- log3("llm generate", {
948
+ log4("llm generate", {
926
949
  tools: params.tools
927
950
  }, {
928
951
  F: __dxlog_file4,
@@ -954,7 +977,7 @@ var runLLM = async (params) => {
954
977
  ""
955
978
  ]
956
979
  });
957
- log3("llm result", {
980
+ log4("llm result", {
958
981
  time: Date.now() - beginTs,
959
982
  message
960
983
  }, {
@@ -1009,7 +1032,7 @@ var runLLM = async (params) => {
1009
1032
  const toolResult = await tool.execute(toolCall.input);
1010
1033
  switch (toolResult.kind) {
1011
1034
  case "error": {
1012
- log3.warn("tool error", {
1035
+ log4.warn("tool error", {
1013
1036
  message: toolResult.message
1014
1037
  }, {
1015
1038
  F: __dxlog_file4,
@@ -1039,7 +1062,7 @@ var runLLM = async (params) => {
1039
1062
  return true;
1040
1063
  }
1041
1064
  case "success": {
1042
- log3("tool success", {
1065
+ log4("tool success", {
1043
1066
  result: toolResult.result
1044
1067
  }, {
1045
1068
  F: __dxlog_file4,
@@ -1068,7 +1091,7 @@ var runLLM = async (params) => {
1068
1091
  return true;
1069
1092
  }
1070
1093
  case "break": {
1071
- log3("tool break", {
1094
+ log4("tool break", {
1072
1095
  result: toolResult.result
1073
1096
  }, {
1074
1097
  F: __dxlog_file4,
@@ -1134,7 +1157,7 @@ var runTools = async ({ message, tools, extensions }) => {
1134
1157
  extensions
1135
1158
  });
1136
1159
  } catch (error) {
1137
- log3("tool error", {
1160
+ log4("tool error", {
1138
1161
  error
1139
1162
  }, {
1140
1163
  F: __dxlog_file4,
@@ -1146,7 +1169,7 @@ var runTools = async ({ message, tools, extensions }) => {
1146
1169
  }
1147
1170
  switch (toolResult.kind) {
1148
1171
  case "error": {
1149
- log3("tool error", {
1172
+ log4("tool error", {
1150
1173
  message: toolResult.message
1151
1174
  }, {
1152
1175
  F: __dxlog_file4,
@@ -1171,7 +1194,7 @@ var runTools = async ({ message, tools, extensions }) => {
1171
1194
  };
1172
1195
  }
1173
1196
  case "success": {
1174
- log3("tool success", {
1197
+ log4("tool success", {
1175
1198
  result: toolResult.result
1176
1199
  }, {
1177
1200
  F: __dxlog_file4,
@@ -1195,7 +1218,7 @@ var runTools = async ({ message, tools, extensions }) => {
1195
1218
  };
1196
1219
  }
1197
1220
  case "break": {
1198
- log3("tool break", {
1221
+ log4("tool break", {
1199
1222
  result: toolResult.result
1200
1223
  }, {
1201
1224
  F: __dxlog_file4,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/ai-service/client.ts", "../../../src/ai-service/stream.ts", "../../../src/ai-service/util/sse.ts", "../../../src/ai-service/parser.ts", "../../../src/ai-service/transform.ts", "../../../src/ai-service/types.ts", "../../../src/conversation/conversation.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema as S } from '@effect/schema';\n\nimport { Message, type Space, type Thread } from '@dxos/artifact';\nimport { invariant } from '@dxos/invariant';\nimport { type SpaceId } from '@dxos/keys';\n\nimport { createGenerationStream, type GenerationStream } from './stream';\nimport { type GenerateRequest } from './types';\n\n// TODO(burdon): Rename.\nexport interface AIServiceClient {\n getSpace(spaceId: SpaceId): Promise<Space>;\n getThread(spaceId: SpaceId, threadId: string): Promise<Thread>;\n getMessages(spaceId: SpaceId, threadId: string): Promise<Message[]>;\n appendMessages(messages: Message[]): Promise<void>;\n updateMessage(spaceId: SpaceId, threadId: string, messageId: string, message: Message): Promise<void>;\n generate(request: GenerateRequest): Promise<GenerationStream>;\n}\n\nexport type AIServiceClientParams = {\n endpoint: string;\n};\n\n/**\n * Edge GPT client.\n */\n// TODO(burdon): Create mock.\nexport class AIServiceClientImpl implements AIServiceClient {\n private readonly _endpoint: string;\n\n constructor({ endpoint }: AIServiceClientParams) {\n invariant(endpoint, 'endpoint is required');\n this._endpoint = endpoint;\n }\n\n async getSpace(spaceId: SpaceId): Promise<Space> {\n throw new Error('Not implemented');\n }\n\n async getThread(spaceId: SpaceId, threadId: string): Promise<Thread> {\n throw new Error('Not implemented');\n }\n\n async getMessages(spaceId: SpaceId, threadId: string): Promise<Message[]> {\n const res = await fetch(`${this._endpoint}/space/${spaceId}/thread/${threadId}/message`);\n return S.decodePromise(S.Array(Message).pipe(S.mutable))((await res.json()).data.results);\n }\n\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 // TODO(dmaretskyi): Accept partial message schema.\n async updateMessage(spaceId: SpaceId, threadId: string, messageId: string, message: Message): Promise<void> {\n throw new Error('Not implemented');\n }\n\n /**\n * Open message stream.\n */\n async generate(request: GenerateRequest): Promise<GenerationStream> {\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(request),\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 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()) => {\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 GenerationStream(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 GenerationStream implements AsyncIterable<GenerationStreamEvent> {\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: GenerationStream) {\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 }\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 { 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 './stream';\nimport { StreamTransform, type StreamBlock } from './transform';\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 /**\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) {\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 for await (const event of stream) {\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: 'assistant', 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 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}\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\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", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Schema as S } from '@effect/schema';\n\nimport { Tool, Message, type MessageContentBlock, SpaceIdSchema } from '@dxos/artifact';\nimport { ObjectId } from '@dxos/echo-schema';\n\nexport const createArtifactElement = (id: ObjectId) => `<artifact id=${id} />`;\n\nexport const LLMModel = S.Literal(\n '@anthropic/claude-3-5-haiku-20241022',\n '@anthropic/claude-3-5-sonnet-20241022',\n '@cf/deepseek-ai/deepseek-r1-distill-qwen-32b',\n '@hf/nousresearch/hermes-2-pro-mistral-7b',\n '@ollama/llama-3-2-3b',\n '@ollama/llama-3-1-nemotron-70b-instruct',\n '@ollama/llama-3-1-nemotron-mini-4b-instruct',\n);\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 // TODO(burdon): Make optional with default.\n model: LLMModel,\n\n /**\n * Current request.\n */\n // TODO(burdon): Remove from history.\n // prompt: Message,\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 history: S.optional(S.Array(Message)),\n\n /**\n * Tools available for the LLM.\n */\n tools: S.optional(S.Array(Tool).pipe(S.mutable)),\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.generate({\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) => {\n const block = message.content.at(-1);\n invariant(block);\n return block.type === 'tool_use';\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 ],\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"],
5
- "mappings": "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",
6
- "names": ["Schema", "S", "Message", "invariant", "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", "GenerationStream", "constructor", "_controller", "_getIterator", "_done", "Trigger", "_iterator", "undefined", "Symbol", "asyncIterator", "_createIterator", "abort", "complete", "wait", "self", "generator", "wake", "throw", "call", "AIServiceClientImpl", "constructor", "endpoint", "invariant", "_endpoint", "getSpace", "spaceId", "Error", "getThread", "threadId", "getMessages", "res", "fetch", "S", "decodePromise", "Array", "Message", "pipe", "mutable", "json", "data", "results", "appendMessages", "messages", "url", "method", "headers", "body", "JSON", "stringify", "encodePromise", "ok", "text", "updateMessage", "messageId", "message", "generate", "request", "controller", "AbortController", "response", "signal", "ReadableStream", "createGenerationStream", "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", "_emitBlock", "contentBlock", "streamBlock", "messageBlock", "mergeMessageBlock", "type", "text", "length", "invariant", "_message", "content", "push", "emit", "_emitUpdate", "pending", "parse", "stream", "transformer", "StreamTransform", "stack", "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", "Schema", "S", "Tool", "Message", "SpaceIdSchema", "ObjectId", "createArtifactElement", "id", "LLMModel", "S", "Literal", "ToolTypes", "Object", "freeze", "TextToImage", "GenerateRequest", "Struct", "spaceId", "optional", "SpaceIdSchema", "threadId", "ObjectId", "model", "systemPrompt", "String", "history", "Array", "Message", "tools", "Tool", "pipe", "mutable", "ToolResult", "Message", "createStatic", "ObjectId", "invariant", "log", "runLLM", "params", "conversationResult", "history", "generate", "tools", "beginTs", "Date", "now", "stream", "client", "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", "runTools", "extensions", "error"]
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema as S } from '@effect/schema';\n\nimport { Message, type Space, type Thread } from '@dxos/artifact';\nimport { invariant } from '@dxos/invariant';\nimport { type SpaceId } from '@dxos/keys';\nimport { log } from '@dxos/log';\n\nimport { createGenerationStream, type GenerationStream } from './stream';\nimport { type GenerateRequest } from './types';\n\n// TODO(burdon): Rename.\nexport interface AIServiceClient {\n getSpace(spaceId: SpaceId): Promise<Space>;\n getThread(spaceId: SpaceId, threadId: string): Promise<Thread>;\n getMessages(spaceId: SpaceId, threadId: string): Promise<Message[]>;\n appendMessages(messages: Message[]): Promise<void>;\n updateMessage(spaceId: SpaceId, threadId: string, messageId: string, message: Message): Promise<void>;\n generate(request: GenerateRequest): Promise<GenerationStream>;\n}\n\nexport type AIServiceClientParams = {\n endpoint: string;\n};\n\n/**\n * Edge GPT client.\n */\n// TODO(burdon): Create mock.\nexport class AIServiceClientImpl implements AIServiceClient {\n private readonly _endpoint: string;\n\n constructor({ endpoint }: AIServiceClientParams) {\n invariant(endpoint, 'endpoint is required');\n this._endpoint = endpoint;\n }\n\n async getSpace(spaceId: SpaceId): Promise<Space> {\n throw new Error('Not implemented');\n }\n\n async getThread(spaceId: SpaceId, threadId: string): Promise<Thread> {\n throw new Error('Not implemented');\n }\n\n async getMessages(spaceId: SpaceId, threadId: string): Promise<Message[]> {\n const res = await fetch(`${this._endpoint}/space/${spaceId}/thread/${threadId}/message`);\n return S.decodePromise(S.Array(Message).pipe(S.mutable))((await res.json()).data.results);\n }\n\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 // TODO(dmaretskyi): Accept partial message schema.\n async updateMessage(spaceId: SpaceId, threadId: string, messageId: string, message: Message): Promise<void> {\n throw new Error('Not implemented');\n }\n\n /**\n * Open message stream.\n */\n async generate(request: GenerateRequest): Promise<GenerationStream> {\n // TODO(dmaretskyi): Errors if tools are not provided.\n request = {\n tools: request.tools ?? [],\n ...request,\n };\n\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(request),\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 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()) => {\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 GenerationStream(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 GenerationStream implements AsyncIterable<GenerationStreamEvent> {\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: GenerationStream) {\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 }\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 { 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 './stream';\nimport { StreamTransform, type StreamBlock } from './transform';\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 /**\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.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: 'assistant', 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", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Schema as S } from '@effect/schema';\n\nimport { Tool, Message, type MessageContentBlock, SpaceIdSchema } from '@dxos/artifact';\nimport { ObjectId } from '@dxos/echo-schema';\n\nexport const createArtifactElement = (id: ObjectId) => `<artifact id=${id} />`;\n\nexport const LLMModel = S.Literal(\n '@anthropic/claude-3-5-haiku-20241022',\n '@anthropic/claude-3-5-sonnet-20241022',\n '@cf/deepseek-ai/deepseek-r1-distill-qwen-32b',\n '@hf/nousresearch/hermes-2-pro-mistral-7b',\n '@ollama/llama-3-2-3b',\n '@ollama/llama-3-1-nemotron-70b-instruct',\n '@ollama/llama-3-1-nemotron-mini-4b-instruct',\n);\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 // TODO(burdon): Make optional with default.\n model: LLMModel,\n\n /**\n * Current request.\n */\n // TODO(burdon): Remove from history.\n // prompt: Message,\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 history: S.optional(S.Array(Message)),\n\n /**\n * Tools available for the LLM.\n */\n tools: S.optional(S.Array(Tool).pipe(S.mutable)),\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.generate({\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) => {\n const block = message.content.at(-1);\n invariant(block);\n return block.type === 'tool_use';\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 ],\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"],
5
+ "mappings": "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",
6
+ "names": ["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", "GenerationStream", "constructor", "_controller", "_getIterator", "_done", "Trigger", "_iterator", "undefined", "Symbol", "asyncIterator", "_createIterator", "abort", "complete", "wait", "self", "generator", "wake", "throw", "call", "AIServiceClientImpl", "constructor", "endpoint", "invariant", "_endpoint", "getSpace", "spaceId", "Error", "getThread", "threadId", "getMessages", "res", "fetch", "S", "decodePromise", "Array", "Message", "pipe", "mutable", "json", "data", "results", "appendMessages", "messages", "url", "method", "headers", "body", "JSON", "stringify", "encodePromise", "ok", "text", "updateMessage", "messageId", "message", "generate", "request", "tools", "log", "info", "controller", "AbortController", "response", "signal", "ReadableStream", "createGenerationStream", "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", "_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", "Schema", "S", "Tool", "Message", "SpaceIdSchema", "ObjectId", "createArtifactElement", "id", "LLMModel", "S", "Literal", "ToolTypes", "Object", "freeze", "TextToImage", "GenerateRequest", "Struct", "spaceId", "optional", "SpaceIdSchema", "threadId", "ObjectId", "model", "systemPrompt", "String", "history", "Array", "Message", "tools", "Tool", "pipe", "mutable", "ToolResult", "Message", "createStatic", "ObjectId", "invariant", "log", "runLLM", "params", "conversationResult", "history", "generate", "tools", "beginTs", "Date", "now", "stream", "client", "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", "runTools", "extensions", "error"]
7
7
  }