@dxos/assistant 0.8.4-main.f5c0578 → 0.8.4-main.fcfe5033a5

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 (189) hide show
  1. package/README.md +1 -0
  2. package/dist/lib/neutral/chunk-2TBLG3XY.mjs +1793 -0
  3. package/dist/lib/neutral/chunk-2TBLG3XY.mjs.map +7 -0
  4. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  5. package/dist/lib/neutral/extraction/index.mjs +219 -0
  6. package/dist/lib/neutral/extraction/index.mjs.map +7 -0
  7. package/dist/lib/neutral/index.mjs +537 -0
  8. package/dist/lib/neutral/index.mjs.map +7 -0
  9. package/dist/lib/neutral/meta.json +1 -0
  10. package/dist/lib/neutral/testing/index.mjs +111 -0
  11. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  12. package/dist/types/src/conversation/context.d.ts +130 -65
  13. package/dist/types/src/conversation/context.d.ts.map +1 -1
  14. package/dist/types/src/conversation/context.test.d.ts +2 -0
  15. package/dist/types/src/conversation/context.test.d.ts.map +1 -0
  16. package/dist/types/src/conversation/index.d.ts +1 -1
  17. package/dist/types/src/conversation/index.d.ts.map +1 -1
  18. package/dist/types/src/conversation/session.d.ts +78 -0
  19. package/dist/types/src/conversation/session.d.ts.map +1 -0
  20. package/dist/types/src/conversation/session.test.d.ts.map +1 -0
  21. package/dist/types/src/diff.d.ts +17 -0
  22. package/dist/types/src/diff.d.ts.map +1 -0
  23. package/dist/types/src/diff.test.d.ts +2 -0
  24. package/dist/types/src/diff.test.d.ts.map +1 -0
  25. package/dist/types/src/errors.d.ts +46 -18
  26. package/dist/types/src/errors.d.ts.map +1 -1
  27. package/dist/types/src/execution-graph.d.ts +85 -0
  28. package/dist/types/src/execution-graph.d.ts.map +1 -0
  29. package/dist/types/src/execution-graph.test.d.ts +2 -0
  30. package/dist/types/src/execution-graph.test.d.ts.map +1 -0
  31. package/dist/types/src/extraction/extraction-ner-function/index.d.ts +0 -1
  32. package/dist/types/src/extraction/extraction-ner-function/index.d.ts.map +1 -1
  33. package/dist/types/src/extraction/extraction-ner-function/named-entity-recognition.d.ts.map +1 -1
  34. package/dist/types/src/extraction/extraction.d.ts +1066 -277
  35. package/dist/types/src/extraction/extraction.d.ts.map +1 -1
  36. package/dist/types/src/extraction/index.d.ts +0 -1
  37. package/dist/types/src/extraction/index.d.ts.map +1 -1
  38. package/dist/types/src/extraction/quotes.d.ts +3 -3
  39. package/dist/types/src/extraction/quotes.d.ts.map +1 -1
  40. package/dist/types/src/functions/services.d.ts +15 -5
  41. package/dist/types/src/functions/services.d.ts.map +1 -1
  42. package/dist/types/src/functions.test.d.ts +2 -0
  43. package/dist/types/src/functions.test.d.ts.map +1 -0
  44. package/dist/types/src/index.d.ts +5 -1
  45. package/dist/types/src/index.d.ts.map +1 -1
  46. package/dist/types/src/service/AgentService.d.ts +75 -0
  47. package/dist/types/src/service/AgentService.d.ts.map +1 -0
  48. package/dist/types/src/service/AgentService.test.d.ts +2 -0
  49. package/dist/types/src/service/AgentService.test.d.ts.map +1 -0
  50. package/dist/types/src/service/agent-process.d.ts +21 -0
  51. package/dist/types/src/service/agent-process.d.ts.map +1 -0
  52. package/dist/types/src/service/index.d.ts +3 -0
  53. package/dist/types/src/service/index.d.ts.map +1 -0
  54. package/dist/types/src/session/artifact-diff.d.ts +2 -2
  55. package/dist/types/src/session/artifact-diff.d.ts.map +1 -1
  56. package/dist/types/src/session/error-handling.d.ts +4 -0
  57. package/dist/types/src/session/error-handling.d.ts.map +1 -0
  58. package/dist/types/src/session/format.d.ts +9 -161
  59. package/dist/types/src/session/format.d.ts.map +1 -1
  60. package/dist/types/src/session/index.d.ts +4 -1
  61. package/dist/types/src/session/index.d.ts.map +1 -1
  62. package/dist/types/src/session/observer.d.ts +23 -0
  63. package/dist/types/src/session/observer.d.ts.map +1 -0
  64. package/dist/types/src/session/request.d.ts +106 -0
  65. package/dist/types/src/session/request.d.ts.map +1 -0
  66. package/dist/types/src/session/request.test.d.ts +2 -0
  67. package/dist/types/src/session/request.test.d.ts.map +1 -0
  68. package/dist/types/src/session/session-ollama.test.d.ts +2 -0
  69. package/dist/types/src/session/session-ollama.test.d.ts.map +1 -0
  70. package/dist/types/src/session/toolkit.d.ts +16 -0
  71. package/dist/types/src/session/toolkit.d.ts.map +1 -0
  72. package/dist/types/src/session/version-pin.d.ts +4 -4
  73. package/dist/types/src/session/version-pin.d.ts.map +1 -1
  74. package/dist/types/src/templates/system.d.ts +7 -12
  75. package/dist/types/src/templates/system.d.ts.map +1 -1
  76. package/dist/types/src/testing/index.d.ts +2 -0
  77. package/dist/types/src/testing/index.d.ts.map +1 -0
  78. package/dist/types/src/testing/layer.d.ts +40 -0
  79. package/dist/types/src/testing/layer.d.ts.map +1 -0
  80. package/dist/types/src/tracing.d.ts +223 -0
  81. package/dist/types/src/tracing.d.ts.map +1 -0
  82. package/dist/types/src/types/artifact.d.ts +28 -0
  83. package/dist/types/src/types/artifact.d.ts.map +1 -0
  84. package/dist/types/src/types/index.d.ts +2 -0
  85. package/dist/types/src/types/index.d.ts.map +1 -0
  86. package/dist/types/tsconfig.tsbuildinfo +1 -1
  87. package/package.json +43 -36
  88. package/src/conversation/context.test.ts +52 -0
  89. package/src/conversation/context.ts +338 -68
  90. package/src/conversation/index.ts +1 -1
  91. package/src/conversation/session.test.ts +58 -0
  92. package/src/conversation/session.ts +300 -0
  93. package/src/diff.test.ts +74 -0
  94. package/src/diff.ts +93 -0
  95. package/src/errors.ts +6 -1
  96. package/src/execution-graph.test.ts +740 -0
  97. package/src/execution-graph.ts +509 -0
  98. package/src/extraction/extraction-ner-function/index.ts +0 -1
  99. package/src/extraction/extraction-ner-function/named-entity-recognition.test.ts +12 -6
  100. package/src/extraction/extraction-ner-function/named-entity-recognition.ts +2 -0
  101. package/src/extraction/extraction.ts +44 -15
  102. package/src/extraction/index.ts +0 -1
  103. package/src/extraction/quotes.test.ts +2 -2
  104. package/src/extraction/quotes.ts +6 -7
  105. package/src/functions/services.ts +166 -66
  106. package/src/functions.conversations.json +1 -0
  107. package/src/functions.test.ts +88 -0
  108. package/src/index.ts +5 -1
  109. package/src/service/AgentService.conversations.json +1 -0
  110. package/src/service/AgentService.test.ts +169 -0
  111. package/src/service/AgentService.ts +184 -0
  112. package/src/service/agent-process.ts +364 -0
  113. package/src/service/index.ts +6 -0
  114. package/src/session/artifact-diff.ts +8 -4
  115. package/src/session/error-handling.ts +41 -0
  116. package/src/session/format.test.ts +113 -41
  117. package/src/session/format.ts +39 -29
  118. package/src/session/index.ts +4 -1
  119. package/src/session/observer.ts +62 -0
  120. package/src/session/request.conversations.json +1 -0
  121. package/src/session/request.test.ts +195 -0
  122. package/src/session/request.ts +344 -0
  123. package/src/session/session-ollama.test.ts +81 -0
  124. package/src/session/toolkit.ts +47 -0
  125. package/src/session/version-pin.ts +7 -7
  126. package/src/templates/{format.tpl → instructions/format.tpl} +6 -4
  127. package/src/templates/{system.tpl → instructions/system.tpl} +52 -14
  128. package/src/templates/system.ts +26 -17
  129. package/src/testing/index.ts +5 -0
  130. package/src/testing/layer.ts +236 -0
  131. package/src/tracing.ts +43 -0
  132. package/src/{types.ts → types/artifact.ts} +44 -7
  133. package/src/types/index.ts +5 -0
  134. package/dist/lib/browser/chunk-6WRGDEMH.mjs +0 -89
  135. package/dist/lib/browser/chunk-6WRGDEMH.mjs.map +0 -7
  136. package/dist/lib/browser/chunk-AVKQ32JL.mjs +0 -352
  137. package/dist/lib/browser/chunk-AVKQ32JL.mjs.map +0 -7
  138. package/dist/lib/browser/extraction/index.mjs +0 -269
  139. package/dist/lib/browser/extraction/index.mjs.map +0 -7
  140. package/dist/lib/browser/index.mjs +0 -355
  141. package/dist/lib/browser/index.mjs.map +0 -7
  142. package/dist/lib/browser/meta.json +0 -1
  143. package/dist/lib/browser/named-entity-recognition-O46UTCLR.mjs +0 -13
  144. package/dist/lib/node-esm/chunk-3UU5V4FS.mjs +0 -91
  145. package/dist/lib/node-esm/chunk-3UU5V4FS.mjs.map +0 -7
  146. package/dist/lib/node-esm/chunk-MNAVETJA.mjs +0 -354
  147. package/dist/lib/node-esm/chunk-MNAVETJA.mjs.map +0 -7
  148. package/dist/lib/node-esm/extraction/index.mjs +0 -270
  149. package/dist/lib/node-esm/extraction/index.mjs.map +0 -7
  150. package/dist/lib/node-esm/index.mjs +0 -356
  151. package/dist/lib/node-esm/index.mjs.map +0 -7
  152. package/dist/lib/node-esm/meta.json +0 -1
  153. package/dist/lib/node-esm/named-entity-recognition-W4VMRCH6.mjs +0 -14
  154. package/dist/lib/node-esm/named-entity-recognition-W4VMRCH6.mjs.map +0 -7
  155. package/dist/types/src/conversation/conversation.d.ts +0 -49
  156. package/dist/types/src/conversation/conversation.d.ts.map +0 -1
  157. package/dist/types/src/extraction/extraction-llm-function/extraction-llm-function.d.ts +0 -4
  158. package/dist/types/src/extraction/extraction-llm-function/extraction-llm-function.d.ts.map +0 -1
  159. package/dist/types/src/extraction/extraction-llm-function/extraction-llm-function.test.d.ts +0 -2
  160. package/dist/types/src/extraction/extraction-llm-function/extraction-llm-function.test.d.ts.map +0 -1
  161. package/dist/types/src/extraction/extraction-llm-function/index.d.ts +0 -2
  162. package/dist/types/src/extraction/extraction-llm-function/index.d.ts.map +0 -1
  163. package/dist/types/src/extraction/extraction-ner-function/extraction-ner-function.d.ts +0 -306
  164. package/dist/types/src/extraction/extraction-ner-function/extraction-ner-function.d.ts.map +0 -1
  165. package/dist/types/src/extraction/extraction-ner-function/extraction-ner-function.test.d.ts +0 -2
  166. package/dist/types/src/extraction/extraction-ner-function/extraction-ner-function.test.d.ts.map +0 -1
  167. package/dist/types/src/session/session.d.ts +0 -170
  168. package/dist/types/src/session/session.d.ts.map +0 -1
  169. package/dist/types/src/session/session.test.d.ts.map +0 -1
  170. package/dist/types/src/session/version-pin.test.d.ts +0 -2
  171. package/dist/types/src/session/version-pin.test.d.ts.map +0 -1
  172. package/dist/types/src/summarization/summarization.test.d.ts +0 -2
  173. package/dist/types/src/summarization/summarization.test.d.ts.map +0 -1
  174. package/dist/types/src/types.d.ts +0 -16
  175. package/dist/types/src/types.d.ts.map +0 -1
  176. package/src/conversation/conversation.ts +0 -127
  177. package/src/extraction/extraction-llm-function/extraction-llm-function.test.ts +0 -84
  178. package/src/extraction/extraction-llm-function/extraction-llm-function.ts +0 -71
  179. package/src/extraction/extraction-llm-function/index.ts +0 -5
  180. package/src/extraction/extraction-ner-function/extraction-ner-function.test.ts +0 -116
  181. package/src/extraction/extraction-ner-function/extraction-ner-function.ts +0 -57
  182. package/src/session/__snapshots__/session.test.ts.snap +0 -32
  183. package/src/session/session.test.ts +0 -308
  184. package/src/session/session.ts +0 -303
  185. package/src/session/version-pin.test.ts +0 -7
  186. package/src/summarization/summarization.test.ts +0 -197
  187. /package/dist/lib/{browser/named-entity-recognition-O46UTCLR.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  188. /package/dist/types/src/{session → conversation}/session.test.d.ts +0 -0
  189. /package/src/extraction/extraction-llm-function/{instructions.tpl → transcription-instructions.tpl} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/conversation/context.ts", "../../../src/types/artifact.ts", "../../../src/functions/services.ts", "../../../src/session/artifact-diff.ts", "../../../src/session/observer.ts", "../../../src/tracing.ts", "../../../src/errors.ts", "../../../src/session/format.ts", "../../../src/session/request.ts", "../../../src/session/toolkit.ts", "../../../src/session/version-pin.ts", "../../../src/conversation/session.ts", "../../../src/service/agent-process.ts", "../../../src/service/AgentService.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, Registry } from '@effect-atom/atom-react';\nimport * as EArray from 'effect/Array';\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Function from 'effect/Function';\nimport * as Runtime from 'effect/Runtime';\nimport * as Schema from 'effect/Schema';\n\nimport { Blueprint } from '@dxos/blueprints';\nimport { Resource } from '@dxos/context';\nimport { DXN, Feed, Obj, type QueryResult, Query, Ref, Type } from '@dxos/echo';\nimport { assertArgument } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { ComplexSet, isNonNullable } from '@dxos/util';\n\n/**\n * Thread message that binds or unbinds contextual objects to a conversation.\n */\n// TODO(burdon): Move to @dxos/schema ContentBlock?\nexport const ContextBinding = Schema.Struct({\n blueprints: Schema.Struct({\n added: Schema.Array(Ref.Ref(Blueprint.Blueprint)),\n removed: Schema.Array(Ref.Ref(Blueprint.Blueprint)),\n }),\n\n objects: Schema.Struct({\n added: Schema.Array(Ref.Ref(Obj.Unknown)),\n removed: Schema.Array(Ref.Ref(Obj.Unknown)),\n }),\n}).pipe(\n Type.object({\n typename: 'org.dxos.type.contextBinding',\n version: '0.1.0',\n }),\n);\n\nexport interface ContextBinding extends Schema.Schema.Type<typeof ContextBinding> {}\n\nexport type BindingProps = Partial<{\n blueprints: Ref.Ref<Blueprint.Blueprint>[];\n objects: Ref.Ref<Obj.Unknown>[];\n}>;\n\nexport class Bindings {\n readonly blueprints = new ComplexSet<Ref.Ref<Blueprint.Blueprint>>((ref) => ref.dxn.toString());\n\n // TODO(burdon): Some DXNs have the Space prefix so only compare the object ID.\n readonly objects = new ComplexSet<Ref.Ref<Obj.Unknown>>((ref) => ref.dxn.asEchoDXN()?.echoId);\n\n toJSON() {\n return {\n blueprints: EArray.fromIterable(this.blueprints).map((ref) => ref.dxn.toString()),\n objects: EArray.fromIterable(this.objects).map((ref) => ref.dxn.toString()),\n };\n }\n}\n\nexport type AiContextBinderOptions = {\n feed: Feed.Feed;\n runtime: Runtime.Runtime<Feed.FeedService>;\n registry?: Registry.Registry;\n};\n\n/**\n * Manages bindings of blueprints and objects to a conversation.\n */\n// TODO(burdon): Context should manage ephemeral state of bindings until prompt is issued?\nexport class AiContextBinder extends Resource {\n private readonly _blueprints = Atom.make<Blueprint.Blueprint[]>([]).pipe(Atom.keepAlive);\n private readonly _objects = Atom.make<Obj.Unknown[]>([]).pipe(Atom.keepAlive);\n private readonly _registry: Registry.Registry;\n private readonly _feed: Feed.Feed;\n private readonly _runtime: Runtime.Runtime<Feed.FeedService>;\n #bindingsQuery: QueryResult.QueryResult<ContextBinding> | undefined;\n\n constructor(options: AiContextBinderOptions) {\n super();\n assertArgument(options.feed, 'options.feed', 'Feed is required');\n assertArgument(options.runtime, 'options.runtime', 'Feed runtime is required');\n this._feed = options.feed;\n this._runtime = options.runtime;\n this._registry = options.registry ?? Registry.make();\n }\n\n /**\n * Returns the blueprints atom for subscription.\n */\n get blueprints(): Atom.Atom<Blueprint.Blueprint[]> {\n return this._blueprints;\n }\n\n /**\n * Returns the objects atom for subscription.\n */\n get objects(): Atom.Atom<Obj.Unknown[]> {\n return this._objects;\n }\n\n /**\n * Gets the current blueprints value.\n */\n getBlueprints(): Blueprint.Blueprint[] {\n return this._registry.get(this._blueprints);\n }\n\n /**\n * Gets the current objects value.\n */\n getObjects(): Obj.Unknown[] {\n return this._registry.get(this._objects);\n }\n\n /**\n * Subscribe to changes in blueprints.\n */\n subscribeBlueprints(cb: (blueprints: Blueprint.Blueprint[]) => void): () => void {\n return this._registry.subscribe(this._blueprints, () => cb(this._registry.get(this._blueprints)));\n }\n\n /**\n * Subscribe to changes in objects.\n */\n subscribeObjects(cb: (objects: Obj.Unknown[]) => void): () => void {\n return this._registry.subscribe(this._objects, () => cb(this._registry.get(this._objects)));\n }\n\n protected override async _open(): Promise<void> {\n this.#bindingsQuery = await Runtime.runPromise(this._runtime)(Feed.query(this._feed, Query.type(ContextBinding)));\n\n // Process initial state before returning.\n const initialResults = await this.#bindingsQuery.run();\n await this._updateBindings(initialResults);\n\n // Subscribe to future changes.\n this._ctx.onDispose(\n this.#bindingsQuery.subscribe(async () => {\n await this._updateBindings(this.#bindingsQuery!.results);\n }),\n );\n }\n\n /**\n * Re-reads bindings from the feed to pick up changes made by other processes.\n */\n async sync(): Promise<void> {\n if (this.#bindingsQuery) {\n const results = await this.#bindingsQuery.run();\n log('sync', { bindingItems: results.length });\n await this._updateBindings(results);\n log('sync complete', {\n blueprints: this._registry.get(this._blueprints).length,\n blueprintKeys: this._registry.get(this._blueprints).map((bp) => (bp as any).key),\n });\n }\n }\n\n private async _updateBindings(items: ContextBinding[]): Promise<void> {\n // Skip update if no items - preserve existing state set by bind().\n if (items.length === 0) {\n return;\n }\n\n const bindings = this._reduce(items);\n\n log('_updateBindings', {\n items: items.length,\n blueprintRefs: [...bindings.blueprints].map((ref) => ({ dxn: ref.dxn.toString(), available: ref.isAvailable })),\n });\n\n // Resolve references (loading them first if needed).\n const currentBlueprints = this._registry.get(this._blueprints);\n const currentObjects = this._registry.get(this._objects);\n const resolvedBlueprints = await this._resolve(bindings.blueprints, currentBlueprints);\n const resolvedObjects = await this._resolve(bindings.objects, currentObjects);\n\n log('_updateBindings resolved', {\n resolvedBlueprints: resolvedBlueprints.length,\n resolvedBlueprintKeys: resolvedBlueprints.map((bp) => (bp as any).key),\n });\n\n // Filter current state to only items still in the reduced binding set,\n // then merge in newly resolved items. This ensures unbind events are respected.\n const reducedBlueprintDxns = new ComplexSet<DXN>(\n DXN.hash,\n [...bindings.blueprints].map((ref) => ref.dxn),\n );\n const reducedObjectDxns = new ComplexSet<DXN>(\n DXN.hash,\n [...bindings.objects].map((ref) => ref.dxn),\n );\n const filteredBlueprints = currentBlueprints.filter((obj) => reducedBlueprintDxns.has(Obj.getDXN(obj)));\n const filteredObjects = currentObjects.filter((obj) => reducedObjectDxns.has(Obj.getDXN(obj)));\n const mergedBlueprints = this._mergeInto(filteredBlueprints, resolvedBlueprints);\n const mergedObjects = this._mergeInto(filteredObjects, resolvedObjects);\n\n this._registry.set(this._blueprints, mergedBlueprints);\n this._registry.set(this._objects, mergedObjects);\n\n log('updated bindings', {\n blueprints: mergedBlueprints.length,\n objects: mergedObjects.length,\n });\n }\n\n protected override async _close(): Promise<void> {\n // Reset atoms to empty state.\n this._registry.set(this._blueprints, []);\n this._registry.set(this._objects, []);\n }\n\n async bind({ blueprints, objects }: BindingProps): Promise<void> {\n const currentBlueprints = this._registry.get(this._blueprints);\n const currentObjects = this._registry.get(this._objects);\n\n const { added: addedBlueprints, next: nextBlueprints } = this._processBindings(blueprints, currentBlueprints);\n const { added: addedObjects, next: nextObjects } = this._processBindings(objects, currentObjects);\n if (!addedBlueprints.length && !addedObjects.length) {\n return;\n }\n\n // Atomic updates - subscribers notified automatically.\n this._registry.set(this._blueprints, nextBlueprints);\n this._registry.set(this._objects, nextObjects);\n\n log('bind', { blueprints: addedBlueprints.length, objects: addedObjects.length });\n await Runtime.runPromise(this._runtime)(\n Feed.append(this._feed, [\n Obj.make(ContextBinding, {\n blueprints: {\n added: addedBlueprints,\n removed: [],\n },\n objects: {\n added: addedObjects,\n removed: [],\n },\n }),\n ]),\n );\n }\n\n async unbind({ blueprints, objects }: BindingProps): Promise<void> {\n if (!blueprints?.length && !objects?.length) {\n return;\n }\n\n // Immediately update atom state so removals are reflected before the queue round-trips.\n const removedBlueprintDxns = (blueprints ?? []).map((ref) => ref.dxn);\n const removedObjectDxns = (objects ?? []).map((ref) => ref.dxn);\n if (removedBlueprintDxns.length > 0) {\n const current = this._registry.get(this._blueprints);\n this._registry.set(\n this._blueprints,\n current.filter((obj) => !removedBlueprintDxns.some((dxn) => DXN.equalsEchoId(Obj.getDXN(obj), dxn))),\n );\n }\n if (removedObjectDxns.length > 0) {\n const current = this._registry.get(this._objects);\n this._registry.set(\n this._objects,\n current.filter((obj) => !removedObjectDxns.some((dxn) => DXN.equalsEchoId(Obj.getDXN(obj), dxn))),\n );\n }\n\n log('unbind', { blueprints: blueprints?.length, objects: objects?.length });\n await Runtime.runPromise(this._runtime)(\n Feed.append(this._feed, [\n Obj.make(ContextBinding, {\n blueprints: {\n added: [],\n removed: blueprints ?? [],\n },\n objects: {\n added: [],\n removed: objects ?? [],\n },\n }),\n ]),\n );\n }\n\n /**\n * Process bindings to filter duplicates and determine next state.\n */\n private _processBindings<T extends Obj.Unknown>(\n refs: Ref.Ref<T>[] | undefined,\n current: T[],\n ): { added: Ref.Ref<T>[]; next: T[] } {\n const next = [...current];\n const added: Ref.Ref<T>[] = [];\n if (!refs?.length) {\n return { added, next };\n }\n\n const seen = new Set(current.map((obj) => Obj.getDXN(obj).toString()));\n for (const ref of refs) {\n const dxn = ref.dxn.toString();\n if (!seen.has(dxn)) {\n seen.add(dxn);\n added.push(ref);\n\n // Only resolve target if available (has target or resolver).\n if (ref.isAvailable) {\n const target = ref.target;\n if (target) {\n next.push(target);\n }\n }\n }\n }\n\n return { added, next };\n }\n\n /**\n * Reduce results into sets of blueprints and objects.\n */\n private _reduce(items: ContextBinding[]): Bindings {\n return Function.pipe(\n items,\n EArray.reduce(new Bindings(), (context, { blueprints, objects }) => {\n blueprints.added.forEach((ref) => context.blueprints.add(ref));\n blueprints.removed.forEach((ref) => context.blueprints.delete(ref));\n\n objects.added.forEach((ref) => context.objects.add(ref));\n objects.removed.forEach((ref) => {\n for (const obj of context.objects) {\n if (DXN.equalsEchoId(obj.dxn, ref.dxn)) {\n context.objects.delete(obj);\n }\n }\n });\n\n return context;\n }),\n );\n }\n\n /**\n * Merge resolved items into the current set, adding only items not already present (by DXN).\n */\n private _mergeInto<T extends Obj.Unknown>(current: T[], resolved: T[]): T[] {\n const seen = new Set(current.map((obj) => Obj.getDXN(obj).toString()));\n const merged = [...current];\n for (const obj of resolved) {\n const dxn = Obj.getDXN(obj).toString();\n if (!seen.has(dxn)) {\n seen.add(dxn);\n merged.push(obj);\n }\n }\n return merged;\n }\n\n /**\n * Resolve references to objects, loading them first if needed and falling back to existing objects.\n */\n private async _resolve<T extends Obj.Unknown>(refs: Iterable<Ref.Ref<T>>, current: T[]): Promise<T[]> {\n const refArray = [...refs];\n\n // Load all refs that need loading.\n await Promise.all(refArray.map((ref) => ref.tryLoad()));\n\n return refArray\n .map((ref) => {\n let target: T | undefined;\n // Only resolve target if available (has target or resolver).\n if (ref.isAvailable) {\n target = ref.target;\n }\n\n // Fallback to existing object.\n return target ?? current.find((obj) => Obj.getDXN(obj as any).toString() === ref.dxn.toString());\n })\n .filter(isNonNullable);\n }\n}\n\nexport class AiContextService extends Context.Tag('@dxos/assistant/AiContextService')<\n AiContextService,\n {\n binder: AiContextBinder;\n }\n>() {\n static bindContext = ({ blueprints, objects }: BindingProps): Effect.Effect<void, never, AiContextService> =>\n Effect.gen(function* () {\n const { binder } = yield* AiContextService;\n yield* Effect.promise(() => binder.bind({ blueprints, objects }));\n });\n\n static findObjects = <T extends Type.AnyEntity>(\n type: T,\n ): Effect.Effect<Schema.Schema.Type<T>[], never, AiContextService> => {\n return Effect.gen(function* () {\n const { binder } = yield* AiContextService;\n return binder.getObjects().filter(Obj.instanceOf(type));\n });\n };\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport type * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport { type Err, Obj, Ref, type Type } from '@dxos/echo';\nimport { Database } from '@dxos/echo';\nimport { EncodedReference } from '@dxos/echo-protocol';\nimport { DXN, LOCAL_SPACE_TAG, type ObjectId, type SpaceId } from '@dxos/keys';\nimport { trim } from '@dxos/util';\n\n/**\n * @deprecated\n */\nexport const createArtifactElement = (id: ObjectId) => `<artifact id=${id} />`;\n\n// TODO(burdon): Rename RefFromLLM? -- yes -dm\n/**\n * A model-friendly way to reference an object.\n * Supports vairous formats that will be normalized to a DXN.\n *\n * @deprecated Use `Ref.Ref(XXX)` instead.\n */\nexport const ArtifactId: Schema.Schema<string> & {\n toDXN: (reference: ArtifactId, owningSpaceId?: SpaceId) => DXN;\n resolve: <S extends Type.AnyEntity>(\n schema: S,\n ref: ArtifactId,\n ) => Effect.Effect<Schema.Schema.Type<S>, Err.ObjectNotFoundError, Database.Service>;\n} = class extends Schema.String.annotations({\n // TODO(dmaretskyi): This section gets overriden.\n description: trim`\n The ID of the referenced object. Formats accepted:\n - DXN (dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4). DXNs can be prepended with an @ symbol for compatibility with in-text references.\n - space ID, object ID tuple (spaceID:objectID)\n - Only object ID that is assumed to be in the current space (01KG7R1ZXWFMWQ4DA1Q6TN1DG4)\n `,\n examples: [\n 'dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4',\n '@dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4',\n 'BM3FSHFOMJCHCG5QW7JTVKGYABD2GAA7G:01KG7R1ZXWFMWQ4DA1Q6TN1DG4',\n '01KG7R1ZXWFMWQ4DA1Q6TN1DG4',\n ],\n}) {\n static toDXN(reference: ArtifactId, owningSpaceId?: SpaceId): DXN {\n // Allow @dxn: prefix for compatibility with in-text references.\n if (reference.startsWith('@dxn:')) {\n return DXN.parse(reference.slice(1));\n } else if (reference.startsWith('dxn:')) {\n return DXN.parse(reference);\n } else if (/^[A-Z0-9]+:[A-Z0-9]+$/.test(reference)) {\n const [spaceId, objectId] = reference.split(':');\n // This is a workaround because the current Filter API doesn't work with fully qualified Echo DXNs.\n // We check if the space ID is the same as the owning space and then use LOCAL_SPACE_TAG for local references.\n // TODO(dmaretskyi): Fix this in the Echo and Filter API to properly handle fully qualified DXNs.\n return new DXN(DXN.kind.ECHO, [spaceId === owningSpaceId ? LOCAL_SPACE_TAG : spaceId, objectId]);\n } else if (/^[A-Z0-9]+$/.test(reference)) {\n return DXN.fromLocalObjectId(reference);\n } else {\n throw new Error(`Unable to parse object reference: ${reference}`);\n }\n }\n\n /**\n * Resolves an artifact ID to an object.\n */\n static resolve<S extends Type.AnyEntity>(\n schema: S,\n ref: ArtifactId,\n ): Effect.Effect<Schema.Schema.Type<S>, Err.ObjectNotFoundError, Database.Service> {\n const dxn = ArtifactId.toDXN(ref);\n return Database.resolve(dxn, schema);\n }\n};\n\nexport type ArtifactId = Schema.Schema.Type<typeof ArtifactId>;\n\n/**\n * Schema that decodes ECHO reference object from an LLM-friendly input.\n */\nexport const RefFromLLM = Schema.transform(ArtifactId, Ref.Ref(Obj.Unknown), {\n decode: (fromA, fromI) => EncodedReference.fromDXN(ArtifactId.toDXN(fromA)),\n encode: (toI, toA) => EncodedReference.toDXN(toI).toString(),\n strict: false,\n}).annotations({\n description: ArtifactId.ast.annotations.description as string,\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Tool from '@effect/ai/Tool';\nimport type * as Toolkit from '@effect/ai/Toolkit';\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\nimport * as Option from 'effect/Option';\nimport * as Record from 'effect/Record';\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport { AiToolNotFoundError, ToolExecutionService, ToolResolverService } from '@dxos/ai';\nimport { OpaqueToolkit } from '@dxos/ai';\nimport { todo } from '@dxos/debug';\nimport { Ref } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { Operation, OperationRegistry } from '@dxos/operation';\n\nimport { RefFromLLM } from '../types';\n\nexport const makeToolResolverFromOperations = <R = never>({\n toolkit: extraToolkit = OpaqueToolkit.empty,\n}: { toolkit?: OpaqueToolkit.OpaqueToolkit<never, never, R> } = {}): Layer.Layer<\n ToolResolverService,\n never,\n OpaqueToolkit.OpaqueToolkitProvider | OperationRegistry.Service | R\n> => {\n return Layer.effect(\n ToolResolverService,\n Effect.gen(function* () {\n const toolkitProvider = yield* OpaqueToolkit.OpaqueToolkitProvider;\n const operationRegistry = yield* OperationRegistry.Service;\n return {\n resolve: (id): Effect.Effect<Tool.Any, AiToolNotFoundError> =>\n Effect.gen(function* () {\n const toolkit = OpaqueToolkit.merge(extraToolkit, toolkitProvider.getToolkit());\n\n const tool = toolkit.toolkit.tools[id];\n if (tool) {\n return tool;\n }\n\n return yield* operationRegistry.resolve(id).pipe(\n Effect.flatMap(\n Option.match({\n onSome: (_) => Effect.succeed(projectFunctionToTool(_)),\n onNone: () => Effect.fail(new AiToolNotFoundError(id)),\n }),\n ),\n );\n }),\n } satisfies Context.Tag.Service<ToolResolverService>;\n }),\n );\n};\n\nexport const makeToolExecutionService = <E, R>(opts: {\n invoke: (tool: Tool.Any, input: unknown) => Effect.Effect<unknown>;\n}): Layer.Layer<ToolExecutionService, never, OpaqueToolkit.OpaqueToolkitProvider> =>\n Layer.effect(\n ToolExecutionService,\n Effect.gen(function* () {\n const toolkitProvider = yield* OpaqueToolkit.OpaqueToolkitProvider;\n const toolkit = toolkitProvider.getToolkit();\n\n const toolkitHandler = yield* toolkit.toolkit.pipe(Effect.provide(toolkit.layer));\n invariant(isHandlerLike(toolkitHandler));\n\n return {\n handlersFor: (toolkit) => {\n const makeHandler = (tool: Tool.Any): ((params: unknown) => Effect.Effect<unknown, any, any>) => {\n return Effect.fn(`toolFunctionHandler ${tool.name}`)(function* (input: any) {\n if (toolkitHandler.tools[tool.name]) {\n if (Tool.isProviderDefined(tool)) {\n throw new Error('Attempted to call a provider-defined tool');\n }\n\n // TODO(wittjosiah): Everything is `never` here.\n const { result } = yield* (toolkitHandler.handle as any)(tool.name, input);\n return result;\n }\n\n return yield* opts.invoke(tool, input).pipe(Effect.catchAllDefect((defect) => Effect.fail(defect)));\n });\n };\n\n return toolkit.of(\n Record.map(toolkit.tools, (tool, _name) => (Tool.isUserDefined(tool) ? makeHandler(tool) : null)) as any,\n ) as any;\n },\n };\n }),\n );\n\nexport const makeToolExecutionServiceFromOperationInvoker = (): Layer.Layer<\n ToolExecutionService,\n never,\n Operation.Service | OpaqueToolkit.OpaqueToolkitProvider\n> => {\n return Layer.unwrapEffect(\n Effect.gen(function* () {\n const operationInvoker = yield* Operation.Service;\n\n return makeToolExecutionService({\n invoke: (tool, input) =>\n Effect.gen(function* () {\n const operationDef = getOperationFromTool(tool).pipe(Option.getOrThrow);\n\n return yield* operationInvoker.invoke(operationDef, input).pipe(Effect.orDie);\n }),\n });\n }),\n );\n};\n\nexport const ToolExecutionServices = Layer.mergeAll(\n makeToolResolverFromOperations(),\n makeToolExecutionServiceFromOperationInvoker(),\n);\n\nclass FunctionToolAnnotation extends Context.Tag('@dxos/assistant/FunctionToolAnnotation')<\n FunctionToolAnnotation,\n { definition: Operation.Definition.Any }\n>() {}\n\nexport const getOperationFromTool = (tool: Tool.Any): Option.Option<Operation.Definition.Any> => {\n return Context.getOption(FunctionToolAnnotation)(tool.annotations).pipe(Option.map(({ definition }) => definition));\n};\n\nconst toolCache = new WeakMap<Operation.Definition.Any, Tool.Any>();\n\n/**\n * Projects an `Operation.Definition` into an `AiTool`.\n */\nconst projectFunctionToTool = (fn: Operation.Definition.Any): Tool.Any => {\n if (toolCache.has(fn)) {\n return toolCache.get(fn)!;\n }\n\n const tool = Tool.make(makeToolName(fn.meta.name ?? fn.meta.key), {\n description: fn.meta.description,\n parameters: createStructFieldsFromSchema(fn.input),\n failure: Schema.Any,\n }).annotate(FunctionToolAnnotation, { definition: fn });\n toolCache.set(fn, tool);\n return tool;\n};\n\n/**\n * @returns Tool name produced from function name by escaping invalid characters.\n */\nconst makeToolName = (name: string) => {\n const toolName = name.toLowerCase().replace(/[^a-zA-Z0-9]/g, '-');\n invariant(toolName.match(/^[a-z_][a-z0-9-_]*$/));\n return toolName;\n};\n\n// TODO(dmaretskyi): Factor out.\nconst createStructFieldsFromSchema = (schema: Schema.Schema<any, any>): Record<string, Schema.Schema<any, any>> => {\n switch (schema.ast._tag) {\n case 'TypeLiteral':\n return Object.fromEntries(\n schema.ast.propertySignatures.map((prop) => [prop.name, Schema.make(mapSchemaTypeForLLM(prop.type))]),\n );\n case 'VoidKeyword':\n return {};\n default:\n return todo(`Unsupported schema AST: ${schema.ast._tag}`);\n }\n};\n\n/**\n * Picks an LLM-friendly schema type for the given schema AST.\n * The picked schema type decodes to the original schema type.\n */\nconst mapSchemaTypeForLLM = (ast: SchemaAST.AST): SchemaAST.AST => {\n if (Ref.isRefType(ast)) {\n const description = ast.annotations.description\n ? ast.annotations.description + '\\n' + RefFromLLM.ast.annotations.description\n : (RefFromLLM.ast.annotations.description as string);\n return RefFromLLM.annotations({ description }).ast;\n } else if (SchemaAST.isTupleType(ast)) {\n return new SchemaAST.TupleType(\n ast.elements.map((t) => new SchemaAST.OptionalType(mapSchemaTypeForLLM(t.type), t.isOptional, t.annotations)),\n ast.rest.map((t) => new SchemaAST.Type(mapSchemaTypeForLLM(t.type), t.annotations)),\n ast.isReadonly,\n ast.annotations,\n );\n } else if (SchemaAST.isTypeLiteral(ast)) {\n return new SchemaAST.TypeLiteral(\n ast.propertySignatures.map(\n (p) =>\n new SchemaAST.PropertySignature(\n p.name,\n mapSchemaTypeForLLM(p.type),\n p.isOptional,\n p.isReadonly,\n p.annotations,\n ),\n ),\n ast.indexSignatures,\n ast.annotations,\n );\n }\n\n return ast;\n};\n\nconst isHandlerLike = (value: unknown): value is Toolkit.WithHandler<Record<string, Tool.Any>> => {\n return typeof (value as any).tools === 'object' && typeof (value as any).handle === 'function';\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Context from 'effect/Context';\n\nimport { type ObjectVersion } from '@dxos/echo-db';\nimport { type ObjectId } from '@dxos/keys';\n\n/**\n * Resolves artifact ids to their versions.\n * Used to give the model a sense of the changes to the artifacts made by users during the conversation.\n * The artifacts versions are pinned in the history, and whenever the artifact changes in-between assistant's steps,\n * a diff is inserted into the conversation.\n *\n * Can be optionally provided to the session run call.\n */\n// TODO(dmaretskyi): Convert to Context.Reference\nexport class ArtifactDiffResolver extends Context.Tag('@dxos/assistant/ArtifactDiffResolver')<\n ArtifactDiffResolver,\n ArtifactDiffResolver.Service\n>() {}\n\nexport namespace ArtifactDiffResolver {\n export type Service = {\n resolve: (\n artifacts: {\n id: ObjectId;\n lastVersion: ObjectVersion;\n }[],\n ) => Promise<\n Map<\n ObjectId,\n {\n version: ObjectVersion;\n diff?: string;\n }\n >\n >;\n };\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport type * as Tool from '@effect/ai/Tool';\nimport * as Effect from 'effect/Effect';\nimport * as Function from 'effect/Function';\n\nimport { type AiParser, type ConsolePrinter } from '@dxos/ai';\nimport { type Message } from '@dxos/types';\n\n/**\n * Live observer of the generation process.\n */\nexport interface GenerationObserver<\n Tools extends Record<string, Tool.Any> = any,\n> extends AiParser.ParseResponseCallbacks<Tools> {\n /**\n * Complete messages fired during the session, both from the model and from the user.\n * This message will contain all message blocks emitted through the `onBlock` callback.\n */\n onMessage: (message: Message.Message) => Effect.Effect<void>;\n}\n\nexport const GenerationObserver = Object.freeze({\n make: ({\n onBegin = Function.constant(Effect.void),\n onPart = Function.constant(Effect.void),\n onBlock = Function.constant(Effect.void),\n onEnd = Function.constant(Effect.void),\n onMessage = Function.constant(Effect.void),\n }: Partial<GenerationObserver> = {}): GenerationObserver => ({\n onBegin,\n onPart,\n onBlock,\n onEnd,\n onMessage,\n }),\n\n noop: () => GenerationObserver.make(),\n\n /**\n * Debug printer to be used in unit-tests and browser devtools.\n */\n fromPrinter: (printer: ConsolePrinter) =>\n GenerationObserver.make({\n onBlock: (block) =>\n Effect.sync(() => {\n if (block.pending) {\n return; // Only prints full blocks (better for unit-tests and browser devtools).\n }\n printer.printContentBlock(block);\n }),\n onMessage: (message) =>\n Effect.sync(() => {\n if (message.sender.role === 'assistant') {\n return; // Skip assistant messages since they are printed in the `onBlock` callback.\n }\n printer.printMessage(message);\n }),\n }),\n});\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { Obj } from '@dxos/echo';\nimport { Trace } from '@dxos/functions';\nimport { ContentBlock, Actor } from '@dxos/types';\n\n/**\n * Partial content block emitted.\n */\nexport const PartialBlock = Trace.EventType('assistant.partialBlock', {\n schema: Schema.Struct({\n messageId: Obj.ID,\n role: Actor.Role,\n block: ContentBlock.Any,\n }),\n isEphemeral: true,\n});\n\n/**\n * Complete content block emitted.\n */\nexport const CompleteBlock = Trace.EventType('assistant.completeBlock', {\n schema: Schema.Struct({\n messageId: Obj.ID,\n role: Actor.Role,\n block: ContentBlock.Any,\n }),\n isEphemeral: false,\n});\n\nexport const AgentRequestBegin = Trace.EventType('assistant.agentRequestBegin', {\n schema: Schema.Struct({}),\n isEphemeral: false,\n});\n\nexport const AgentRequestEnd = Trace.EventType('assistant.agentRequestEnd', {\n schema: Schema.Struct({}),\n isEphemeral: false,\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { BaseError } from '@dxos/errors';\n\n/**\n * Generic error from AI model.\n */\nexport class AiModelError extends BaseError.extend('AiModelError', 'AI model error') {}\n\n/**\n * Generic error for AI agent execution.\n */\nexport class AiAssistantError extends BaseError.extend('AiAssistantError', 'AI assistant error') {}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Function from 'effect/Function';\nimport * as Option from 'effect/Option';\n\nimport { Template } from '@dxos/blueprints';\nimport { type Database, Obj } from '@dxos/echo';\nimport { ObjectVersion } from '@dxos/echo-db';\nimport type { ObjectNotFoundError } from '@dxos/echo/Err';\nimport { type FunctionNotFoundError } from '@dxos/functions';\nimport { type ObjectId } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { type Operation, type OperationRegistry } from '@dxos/operation';\nimport { type ContentBlock, Message } from '@dxos/types';\nimport { trim } from '@dxos/util';\n\nimport { AiAssistantError } from '../errors';\nimport { ArtifactDiffResolver } from './artifact-diff';\nimport { type AiRequestRunError, type AiRequestRunProps } from './request';\n\n/**\n * Formats the system prompt.\n */\n// TODO(burdon): Move to AiPreprocessor.\nexport const formatSystemPrompt = ({\n system,\n blueprints = [],\n objects = [],\n}: Pick<AiRequestRunProps, 'system' | 'blueprints' | 'objects'>): Effect.Effect<\n string,\n FunctionNotFoundError | ObjectNotFoundError,\n Database.Service | OperationRegistry.Service | Operation.Service\n> =>\n Effect.gen(function* () {\n const blueprintDefs = yield* Function.pipe(\n blueprints,\n Effect.forEach((blueprint) => Effect.succeed(blueprint.instructions)),\n Effect.flatMap(\n Effect.forEach((template) =>\n Effect.gen(function* () {\n return trim`\n <blueprint>\n ${yield* Template.processTemplate(template)}\n </blueprint>\n `;\n }),\n ),\n ),\n Effect.map((blueprints) =>\n blueprints.length > 0 ? ['## Blueprints Definitions', ...blueprints].join('\\n\\n') : undefined,\n ),\n );\n\n const objectDefs = yield* Function.pipe(\n objects,\n Effect.forEach((object) =>\n Effect.succeed(trim`\n <object>\n <dxn>${Obj.getDXN(object)}</dxn>\n <typename>${Obj.getTypename(object)}</typename>\n </object>\n `),\n ),\n Effect.map((objects) => (objects.length > 0 ? ['## Context Objects', ...objects].join('\\n\\n') : undefined)),\n );\n\n return yield* Function.pipe(\n Effect.succeed([system, blueprintDefs, objectDefs].filter((def): def is string => def !== undefined)),\n Effect.map((parts) => parts.join('\\n\\n')),\n );\n }).pipe(Effect.withSpan('formatSystemPrompt'));\n\n/**\n * Formats the user prompt.\n */\n// TODO(burdon): Move to AiPreprocessor.\n// TODO(burdon): Convert util below to `Effect.fn` (to preserve stack info)\nexport const formatUserPrompt = ({\n prompt,\n history = [],\n}: Pick<AiRequestRunProps, 'prompt' | 'history'>): Effect.Effect<Message.Message, AiRequestRunError> =>\n Effect.gen(function* () {\n const blocks: ContentBlock.Any[] = [];\n\n // TODO(dmaretskyi): Evaluate other approaches as `serviceOption` isn't represented in the type system.\n const artifactDiffResolver = yield* Effect.serviceOption(ArtifactDiffResolver);\n if (Option.isSome(artifactDiffResolver)) {\n const versions = gatherObjectVersions(history);\n const artifactDiff = yield* Effect.tryPromise({\n try: () =>\n artifactDiffResolver.value.resolve(\n [...versions.entries()].map(([id, version]) => ({ id, lastVersion: version })),\n ),\n catch: AiAssistantError.wrap({ message: 'Artifact diff resolution error' }),\n });\n\n log('version', { artifactDiff, versions });\n for (const [id, { version }] of [...artifactDiff.entries()]) {\n if (ObjectVersion.equals(version, versions.get(id)!)) {\n artifactDiff.delete(id);\n continue;\n }\n\n blocks.push({ _tag: 'anchor', objectId: id, version });\n }\n\n if (artifactDiff.size > 0) {\n blocks.push(createArtifactUpdateBlock(artifactDiff));\n }\n }\n\n return Obj.make(Message.Message, {\n created: new Date().toISOString(),\n sender: { role: 'user' },\n blocks: [...blocks, { _tag: 'text', text: prompt }],\n });\n }).pipe(Effect.withSpan('formatUserPrompt'));\n\nconst gatherObjectVersions = (messages: Message.Message[]): Map<ObjectId, ObjectVersion> => {\n const artifactIds = new Map<ObjectId, ObjectVersion>();\n for (const message of messages) {\n for (const block of message.blocks) {\n if (block._tag === 'anchor') {\n artifactIds.set(block.objectId, block.version as ObjectVersion);\n }\n }\n }\n\n return artifactIds;\n};\n\nconst createArtifactUpdateBlock = (\n artifactDiff: Map<ObjectId, { version: ObjectVersion; diff?: string }>,\n): ContentBlock.Any => {\n return {\n _tag: 'text',\n // TODO(dmaretskyi): Does this need to be a special content-block?\n disposition: 'artifact-update',\n text: trim`\n The following artifacts have been updated since the last message:\n ${[...artifactDiff.entries()]\n .map(([id, { diff }]) => `<changed-artifact id=\"${id}\">${diff ? `\\n${diff}` : ''}</changed-artifact>`)\n .join('\\n')}\n `,\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport type * as AiError from '@effect/ai/AiError';\nimport * as LanguageModel from '@effect/ai/LanguageModel';\nimport * as Array from 'effect/Array';\nimport * as Chunk from 'effect/Chunk';\nimport * as Effect from 'effect/Effect';\nimport { pipe } from 'effect/Function';\nimport * as Option from 'effect/Option';\nimport * as Stream from 'effect/Stream';\n\nimport {\n AiParser,\n AiPreprocessor,\n AiSummarizer,\n type AiToolNotFoundError,\n callTool,\n type OpaqueToolkit,\n type PromptPreprocessingError,\n type ToolExecutionService,\n type ToolResolverService,\n withoutToolCallParising,\n} from '@dxos/ai';\nimport { type Blueprint } from '@dxos/blueprints';\nimport { Database, Obj } from '@dxos/echo';\nimport { Trace } from '@dxos/functions';\nimport { log } from '@dxos/log';\nimport { Operation, OperationRegistry } from '@dxos/operation';\nimport { ContentBlock, Message } from '@dxos/types';\n\nimport { type AiAssistantError } from '../errors';\nimport { CompleteBlock, PartialBlock } from '../tracing';\nimport { formatSystemPrompt, formatUserPrompt } from './format';\nimport { GenerationObserver } from './observer';\n\nexport type AiRequestRunError = AiError.AiError | PromptPreprocessingError | AiToolNotFoundError | AiAssistantError;\n\nexport type AiRequestRunRequirements =\n | LanguageModel.LanguageModel\n | ToolExecutionService\n | ToolResolverService\n | Database.Service\n | Operation.Service\n | OperationRegistry.Service\n | Trace.TraceService;\n\nexport type AiRequestOptions = {\n /**\n * Summarize before executing the prompt if the existing history exceeds this threshold.\n */\n summarizationThreshold?: number;\n\n // TODO(dmaretskyi): Plan to phase out in favor of TracingService and the return type being a stream.\n observer?: GenerationObserver;\n /**\n * Callback for when a message is received from the user, model, or tool.\n * This is useful for streaming the output to a queue.\n */\n onOutput?: (message: Message.Message) => Effect.Effect<void, never, never>;\n};\n\nexport type AiRequestRunProps<R = never> = {\n prompt: string;\n // TODO(wittjosiah): Rename to systemPrompt.\n system?: string;\n history?: Message.Message[];\n objects?: Obj.Unknown[];\n blueprints?: readonly Blueprint.Blueprint[];\n toolkit?: OpaqueToolkit.OpaqueToolkit<R>;\n};\n\nexport type AiRequestBeginProps = {\n prompt: string;\n system?: string;\n history?: Message.Message[];\n objects?: Obj.Unknown[];\n blueprints?: readonly Blueprint.Blueprint[];\n};\n\nexport type AiRequestTurnProps<R = never> = {\n system: string;\n toolkit?: OpaqueToolkit.OpaqueToolkit<R>;\n};\n\nexport type AiRequestTurnResult = {\n messages: Message.Message[];\n done: boolean;\n};\n\n/**\n * Contains message history, tools, current context.\n * Current context means the state of the app, time of day, and other contextual information.\n * It makes requests to the model, its a state machine.\n * It keeps track of the current goal.\n * It manages the context window.\n * Tracks the success criteria of reaching the goal, exposing metrics (stretch).\n * Could be run locally in the app or remotely.\n * Could be personal or shared.\n */\nexport class AiRequest {\n /** Prevents concurrent execution of session. */\n private readonly _semaphore = Effect.runSync(Effect.makeSemaphore(1));\n\n private readonly _observer: GenerationObserver;\n private readonly _onOutput: (message: Message.Message) => Effect.Effect<void, never, never>;\n\n /** Message history from queue. */\n // TODO(burdon): Evolve into supporting a git-like graph of messages.\n private _history: Message.Message[] = [];\n\n /** Pending messages for this session (incl. the current prompt). */\n private _pending: Message.Message[] = [];\n\n private _started = 0;\n private _ended = 0;\n private _toolCalls = 0;\n\n constructor(private readonly _options: AiRequestOptions = {}) {\n this._observer = _options.observer ?? GenerationObserver.noop();\n this._onOutput = _options.onOutput ?? (() => Effect.void);\n }\n\n get duration(): number {\n return this._ended - this._started;\n }\n\n get toolCalls(): number {\n return this._toolCalls;\n }\n\n get pending(): readonly Message.Message[] {\n return this._pending;\n }\n\n private _submitMessage = (message: Message.Message): Effect.Effect<Message.Message, never, Trace.TraceService> =>\n Effect.gen(this, function* () {\n this._pending.push(message);\n yield* this._observer.onMessage(message);\n for (const block of message.blocks) {\n yield* Trace.write(CompleteBlock, {\n messageId: message.id,\n role: message.sender.role!,\n block,\n });\n }\n yield* this._onOutput(message);\n return message;\n });\n\n getToolCalls = () =>\n pipe(\n [...this._history, ...this._pending],\n Array.reverse,\n Array.takeWhile((_) => _.sender.role === 'assistant'),\n Array.flatMap((_) => _.blocks.filter(ContentBlock.is('toolCall')).map((block) => ({ block, message: _ }))),\n Array.filter((_) => !_.block.providerExecuted),\n Array.reverse,\n );\n\n /**\n * Initialize a session: set up history, perform summarization if needed, and submit the user prompt.\n * Must be called before `runTurn()`.\n */\n begin = ({\n prompt,\n system,\n history = [],\n blueprints = [],\n objects = [],\n }: AiRequestBeginProps): Effect.Effect<void, AiRequestRunError, AiRequestRunRequirements> =>\n Effect.gen(this, function* () {\n this._started = Date.now();\n this._history = [...history];\n this._pending = [];\n\n const systemPrompt = yield* formatSystemPrompt({ system, blueprints, objects }).pipe(Effect.orDie);\n\n if (this._options.summarizationThreshold !== undefined) {\n const tokenCount = yield* AiPreprocessor.estimateTokens(\n yield* AiPreprocessor.preprocessPrompt([...this._history], {\n system: systemPrompt,\n }),\n );\n if (tokenCount > this._options.summarizationThreshold) {\n const summary = yield* AiSummarizer.summarize([...this._history]);\n yield* this._submitMessage(summary);\n }\n }\n\n yield* this._submitMessage(yield* formatUserPrompt({ prompt, history }));\n }).pipe(Effect.withSpan('AiRequest.begin'));\n\n /**\n * Execute a single turn: one LLM generation followed by tool execution.\n * The toolkit and system prompt can be updated between turns to reflect context changes (e.g. dynamically enabled blueprints).\n */\n runAgentTurn = <const R = never>({\n system,\n toolkit: opaqueToolkit,\n }: AiRequestTurnProps<R>): Effect.Effect<AiRequestTurnResult, AiRequestRunError, AiRequestRunRequirements | R> =>\n Effect.gen(this, function* () {\n log.info('request', {\n system: { snippet: createSnippet(system), length: system.length },\n pending: this._pending.length,\n history: this._history.length,\n });\n\n const prompt = yield* AiPreprocessor.preprocessPrompt([...this._history, ...this._pending], {\n system,\n cacheControl: 'ephemeral',\n });\n\n const toolkit = opaqueToolkit ? yield* opaqueToolkit.handlers : undefined;\n\n const observer = this._observer;\n let currentMessageId: Obj.ID | null = null;\n\n const messages = yield* LanguageModel.streamText({\n prompt,\n toolkit,\n disableToolCallResolution: true,\n }).pipe(\n withoutToolCallParising,\n AiParser.parseResponse({\n emitPartial: true,\n onBegin: () => observer.onBegin(),\n onBlock: (block) => observer.onBlock(block),\n onPart: (part) => observer.onPart(part as any),\n onEnd: (summary) => observer.onEnd(summary),\n }),\n Stream.mapEffect(\n (block) =>\n Effect.gen(this, function* () {\n if (block.pending) {\n currentMessageId ??= Obj.ID.random();\n log('emit ephemeral message', { id: currentMessageId, type: block._tag });\n yield* Trace.write(PartialBlock, {\n messageId: currentMessageId,\n role: 'assistant',\n block,\n });\n return Option.none();\n } else {\n currentMessageId ??= Obj.ID.random();\n const id = currentMessageId;\n currentMessageId = null;\n log('emit complete message', { id, type: block._tag });\n const message = Obj.make(Message.Message, {\n id,\n created: new Date().toISOString(),\n sender: { role: 'assistant' },\n blocks: [block],\n });\n return Option.some(yield* this._submitMessage(message));\n }\n }),\n { concurrency: 1, unordered: false },\n ),\n Stream.filterMap((_) => _),\n Stream.runCollect,\n Effect.map(Chunk.toArray),\n );\n log.info('messages', { messages });\n\n const toolCalls = this.getToolCalls();\n\n if (toolCalls.length === 0) {\n this._ended = Date.now();\n return { messages, done: true };\n } else if (!toolkit) {\n throw new Error('No toolkit provided');\n }\n\n return { messages, done: false };\n }).pipe(Effect.withSpan('AiRequest.runAgentTurn'));\n\n runTools = <const R = never>({\n toolkit: opaqueToolkit,\n }: {\n toolkit?: OpaqueToolkit.OpaqueToolkit<R>;\n }): Effect.Effect<void, AiRequestRunError, AiRequestRunRequirements | R> =>\n Effect.gen(this, function* () {\n const toolkit = opaqueToolkit ? yield* opaqueToolkit.handlers : undefined;\n const toolCalls = this.getToolCalls();\n const toolResults = yield* Effect.forEach(toolCalls, ({ block, message }) => {\n if (!toolkit) {\n throw new Error('No toolkit provided');\n }\n return callTool(toolkit, block);\n });\n\n yield* this._submitMessage(\n Obj.make(Message.Message, {\n created: new Date().toISOString(),\n sender: { role: 'tool' },\n blocks: toolResults,\n }),\n );\n\n this._toolCalls += toolResults.length;\n }).pipe(Effect.withSpan('AiRequest.runTools'));\n\n /**\n * Run a full conversation turn loop. Equivalent to calling `begin()` then `runTurn()` in a loop.\n */\n run = <const R = never>({\n prompt,\n system: systemTemplate,\n history = [],\n objects = [],\n blueprints = [],\n toolkit,\n }: AiRequestRunProps<R>): Effect.Effect<Message.Message[], AiRequestRunError, AiRequestRunRequirements | R> =>\n Effect.gen(this, function* () {\n yield* this.begin({ prompt, system: systemTemplate, history, objects, blueprints });\n\n const system = yield* formatSystemPrompt({ system: systemTemplate, blueprints, objects }).pipe(Effect.orDie);\n\n do {\n const { done } = yield* this.runAgentTurn({ system, toolkit });\n if (done) {\n break;\n }\n yield* this.runTools({ toolkit });\n } while (true);\n\n log('done', { pending: this._pending.length, duration: this.duration, tools: this._toolCalls });\n return this._pending;\n }).pipe(this._semaphore.withPermits(1), Effect.withSpan('AiRequest.run'));\n}\n\nconst createSnippet = (text: string, len = 32) =>\n text.length <= len * 2 ? text : [text.slice(0, len), '...', text.slice(-len)].join('');\n\n// TODO(dmaretskyi): Extract as a general util.\nconst logDump = (message: string, data: unknown) => {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { writeFileSync } = require('node:fs');\n const path = `/tmp/log-data-${Date.now()}.json`;\n writeFileSync(path, JSON.stringify(data, null, 2));\n log.info(message, { path });\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Toolkit from '@effect/ai/Toolkit';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\n\nimport { type AiToolNotFoundError, OpaqueToolkit, ToolExecutionService, ToolResolverService } from '@dxos/ai';\nimport { type Blueprint } from '@dxos/blueprints';\nimport { isTruthy } from '@dxos/util';\n\nexport type CreateToolkitProps = {\n toolkit?: OpaqueToolkit.Any;\n blueprints?: readonly Blueprint.Blueprint[];\n /**\n * Self-contained with handlers toolkits.\n */\n opaqueToolkits?: readonly OpaqueToolkit.Any[];\n};\n\n/**\n * Build a combined toolkit from the blueprint tools and the provided toolkit.\n */\nexport const createToolkit = ({\n toolkit: toolkitProp,\n blueprints = [],\n opaqueToolkits = [],\n}: CreateToolkitProps): Effect.Effect<\n OpaqueToolkit.OpaqueToolkit,\n AiToolNotFoundError,\n ToolResolverService | ToolExecutionService\n> =>\n Effect.gen(function* () {\n const blueprintToolkit = yield* ToolResolverService.resolveToolkit(blueprints.flatMap(({ tools }) => tools));\n const blueprintToolHandler = yield* blueprintToolkit.toContext(ToolExecutionService.handlersFor(blueprintToolkit));\n const opaqueToolkit = OpaqueToolkit.merge(...opaqueToolkits);\n\n const toolkitDefs = [toolkitProp?.toolkit, blueprintToolkit, opaqueToolkit.toolkit].filter(isTruthy);\n const mergedToolkit = Toolkit.merge(...toolkitDefs);\n const combinedHandlerLayer = Layer.mergeAll(\n Layer.succeedContext(blueprintToolHandler),\n toolkitProp?.layer ?? OpaqueToolkit.empty.layer,\n opaqueToolkit.layer,\n );\n return OpaqueToolkit.make(mergedToolkit, combinedHandlerLayer as any) as OpaqueToolkit.OpaqueToolkit;\n }) as Effect.Effect<OpaqueToolkit.OpaqueToolkit, AiToolNotFoundError, ToolResolverService | ToolExecutionService>;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { type Obj } from '@dxos/echo';\nimport { type ObjectVersion, getVersion } from '@dxos/echo-db';\nimport { ObjectId } from '@dxos/keys';\nimport { type ContentBlock } from '@dxos/types';\n\n// TODO(dmaretskyi): Extract.\nconst ObjectVersionSchema = Schema.Unknown as Schema.Schema<ObjectVersion>;\n\nconst VersionPinSchema = Schema.Struct({\n // TODO(dmaretskyi): Use Ref when those support encoding.\n objectId: ObjectId,\n // TODO(dmaretskyi): Could be opaque.\n version: ObjectVersionSchema,\n});\n\n/**\n * Used to pin a specific version of an object during the course of a conversation.\n * This allows us to detect when the object changes during the course of the conversation.\n */\nexport interface VersionPin extends Schema.Schema.Type<typeof VersionPinSchema> {}\n\nexport const VersionPin: typeof VersionPinSchema & {\n DISPOSITION: 'version-pin';\n fromObject: (object: Obj.Unknown) => VersionPin;\n createBlock: (pin: VersionPin) => ContentBlock.Any;\n} = class extends VersionPinSchema {\n static readonly DISPOSITION = 'version-pin';\n static fromObject(object: Obj.Unknown): VersionPin {\n return VersionPin.make({\n objectId: object.id,\n version: getVersion(object),\n });\n }\n\n static createBlock(pin: VersionPin): ContentBlock.Any {\n return {\n _tag: 'json',\n disposition: VersionPin.DISPOSITION,\n data: JSON.stringify(pin),\n };\n }\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport type { Registry } from '@effect-atom/atom-react';\nimport * as Array from 'effect/Array';\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Either from 'effect/Either';\nimport { pipe } from 'effect/Function';\nimport * as Layer from 'effect/Layer';\nimport * as Record from 'effect/Record';\nimport * as Runtime from 'effect/Runtime';\n\nimport { type OpaqueToolkit, type ToolExecutionService, type ToolResolverService } from '@dxos/ai';\nimport { type Blueprint } from '@dxos/blueprints';\nimport { Resource } from '@dxos/context';\nimport { Database, Feed, Filter, Obj } from '@dxos/echo';\nimport { acquireReleaseResource } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { McpToolkit } from '@dxos/mcp-client';\nimport { Operation, type OperationRegistry } from '@dxos/operation';\nimport { Message } from '@dxos/types';\n\nimport { ToolExecutionServices } from '../functions';\nimport {\n AiRequest,\n type AiRequestRunError,\n type AiRequestRunRequirements,\n type GenerationObserver,\n createToolkit,\n formatSystemPrompt,\n} from '../session';\nimport { AiContextBinder, AiContextService } from './context';\n\nexport interface McpServerConfig {\n url: string;\n protocol: 'sse' | 'http';\n apiKey?: string;\n}\n\nexport interface AiSessionRunProps<R = never> {\n prompt: string;\n system?: string;\n observer?: GenerationObserver;\n toolkit?: OpaqueToolkit.OpaqueToolkit<R>;\n\n /**\n * Space-level MCP servers to connect alongside blueprint-defined ones.\n */\n mcpServers?: readonly McpServerConfig[];\n}\n\nexport type AiSessionOptions = {\n feed: Feed.Feed;\n runtime: Runtime.Runtime<Feed.FeedService>;\n registry?: Registry.Registry;\n};\n\n// TODO(dmaretskyi): Take from model characteristics. opus has 200k max tokens.\n/**\n * Summarization threshold in tokens.\n */\nconst SUMMARY_THRESHOLD = 80_000;\n\n/**\n * Durable conversation state (initiated by users and agents) backed by a Feed.\n * Executes tools based on AI responses and supports cancellation of in-progress requests.\n */\nexport class AiSession extends Resource {\n /**\n * Blueprints and objects bound to the conversation.\n */\n private readonly _binder: AiContextBinder;\n private readonly _feed: Feed.Feed;\n private readonly _runtime: Runtime.Runtime<Feed.FeedService>;\n\n public constructor(options: AiSessionOptions) {\n super();\n this._feed = options.feed;\n this._runtime = options.runtime;\n invariant(this._feed);\n invariant(this._runtime);\n this._binder = new AiContextBinder({ feed: this._feed, runtime: this._runtime, registry: options.registry });\n }\n\n protected override async _open(): Promise<void> {\n await this._binder.open(this._ctx);\n }\n\n public get feed() {\n return this._feed;\n }\n\n public get context() {\n return this._binder;\n }\n\n public async getHistory(): Promise<Message.Message[]> {\n const queryResult = await Runtime.runPromise(this._runtime)(Feed.query(this._feed, Filter.type(Message.Message)));\n const items = await queryResult.run();\n return items.filter(Obj.instanceOf(Message.Message));\n }\n\n getTools(): Effect.Effect<\n Record<string, import('@effect/ai/Tool').Any>,\n never,\n ToolExecutionService | ToolResolverService\n > {\n return Effect.gen(this, function* () {\n const toolkit = yield* createToolkit({ blueprints: this.context.getBlueprints() });\n return toolkit.toolkit.tools;\n }).pipe(Effect.orDie);\n }\n\n /**\n * Not provided by default, since users might want to override them.\n */\n makeToolExecutionServices(): Layer.Layer<\n ToolExecutionService | ToolResolverService,\n never,\n OpaqueToolkit.OpaqueToolkitProvider | Operation.Service | OperationRegistry.Service\n > {\n return ToolExecutionServices.pipe(\n Layer.provide(Operation.withInvocationOptions({ conversation: Obj.getDXN(this._feed).toString() })),\n );\n }\n /**\n * Creates a new cancelable request effect.\n */\n public createRequest<R = never>(\n params: AiSessionRunProps<R>,\n ): Effect.Effect<Message.Message[], AiRequestRunError, AiRequestRunRequirements | R> {\n return Effect.gen(this, function* () {\n const history = yield* Effect.promise(() => this.getHistory());\n const blueprints = this.context.getBlueprints();\n const objects = this.context.getObjects();\n\n log('run', {\n history: history.length,\n blueprints: blueprints.length,\n objects: objects.length,\n });\n\n const request = new AiRequest({\n summarizationThreshold: SUMMARY_THRESHOLD,\n observer: params.observer,\n onOutput: (message) =>\n Effect.promise(() => Runtime.runPromise(this._runtime)(Feed.append(this._feed, [message]))),\n });\n\n yield* request.begin({\n history,\n blueprints,\n objects,\n prompt: params.prompt,\n system: params.system,\n });\n\n // Turn loop: recompute toolkit and system prompt between turns to pick up dynamically enabled blueprints.\n do {\n yield* Effect.promise(() => this.context.sync());\n const currentBlueprints = this.context.getBlueprints();\n const mcps = yield* connectMcpServers(currentBlueprints, params.mcpServers);\n const toolkit = yield* createToolkit({\n toolkit: params.toolkit,\n blueprints: currentBlueprints,\n opaqueToolkits: mcps,\n });\n\n log('toolkit', { tools: Record.keys(toolkit.toolkit.tools) });\n const system = yield* formatSystemPrompt({\n system: params.system,\n blueprints: currentBlueprints,\n objects: this.context.getObjects(),\n }).pipe(Effect.orDie);\n\n const { done } = yield* request.runAgentTurn({ system, toolkit });\n if (done) {\n break;\n }\n\n yield* request.runTools({ toolkit });\n } while (true);\n\n log('result', {\n messages: request.pending.length,\n duration: request.duration,\n toolCalls: request.toolCalls,\n });\n\n return [...request.pending];\n }).pipe(\n Effect.provide(\n Layer.mergeAll(\n Layer.succeed(AiContextService, {\n binder: this.context,\n }),\n Layer.succeed(AiSessionService, this),\n Operation.withInvocationOptions({ conversation: Obj.getDXN(this._feed).toString() }),\n ),\n ),\n Effect.withSpan('AiSession.createRequest'),\n );\n }\n}\n\n/**\n * Gives access to the ai session.\n */\nexport class AiSessionService extends Context.Tag('@dxos/assistant/AiSessionService')<AiSessionService, AiSession>() {\n /**\n * Create a new session layer from options.\n */\n static layer = (options: AiSessionOptions): Layer.Layer<AiSessionService | AiContextService> =>\n aiContextFromSession.pipe(\n Layer.provideMerge(\n Layer.scoped(\n AiSessionService,\n Effect.gen(function* () {\n const session = yield* acquireReleaseResource(() => new AiSession(options));\n return session;\n }),\n ),\n ),\n );\n\n /**\n * Create a new session with a new feed.\n */\n static layerNewFeed = (\n options?: Omit<AiSessionOptions, 'feed' | 'runtime'>,\n ): Layer.Layer<AiSessionService | AiContextService, never, Database.Service | Feed.FeedService> =>\n Layer.unwrapScoped(\n Effect.gen(function* () {\n const feed = Feed.make();\n yield* Database.add(feed);\n const runtime = yield* Effect.runtime<Feed.FeedService>();\n return AiSessionService.layer({\n ...options,\n feed,\n runtime,\n });\n }),\n );\n\n /**\n * Run a prompt in the current session.\n */\n static run = <R = never>(\n params: AiSessionRunProps<R>,\n ): Effect.Effect<Message.Message[], AiRequestRunError, AiRequestRunRequirements | AiSessionService | R> =>\n Effect.gen(function* () {\n const session = yield* AiSessionService;\n return yield* session.createRequest(params);\n });\n}\n\nconst aiContextFromSession = Layer.effect(\n AiContextService,\n Effect.gen(function* () {\n const session = yield* AiSessionService;\n return {\n binder: session.context,\n };\n }),\n);\n\nconst connectMcpServers = (\n blueprints: readonly Blueprint.Blueprint[],\n spaceMcpServers: readonly McpServerConfig[] = [],\n): Effect.Effect<OpaqueToolkit.OpaqueToolkit[]> => {\n const blueprintServers: McpToolkit.McpToolkitOptions[] = pipe(\n blueprints,\n Array.flatMap((_) => _.mcpServers ?? []),\n Array.map(({ url, protocol }) => ({ url, kind: protocol })),\n );\n const spaceServers: McpToolkit.McpToolkitOptions[] = spaceMcpServers.map(({ url, protocol, apiKey }) => ({\n url,\n kind: protocol,\n apiKey,\n }));\n const allServers = [...blueprintServers, ...spaceServers];\n\n return pipe(\n allServers,\n Effect.forEach((options) =>\n McpToolkit.make(options).pipe(\n // NOTE: Type-inference fails here without explicit void return.\n Effect.tap((toolkit): void =>\n log.info('Connected to MCP server', { url: options.url, tools: Object.keys(toolkit.toolkit.tools).length }),\n ),\n Effect.tapDefect((error) => Effect.sync(() => log.warn('Failed to connect to MCP server', { error }))),\n Effect.either,\n ),\n ),\n Effect.map(Array.filterMap((_) => Either.getRight(_))),\n );\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Tool from '@effect/ai/Tool';\nimport * as Toolkit from '@effect/ai/Toolkit';\nimport * as Cause from 'effect/Cause';\nimport * as Duration from 'effect/Duration';\nimport * as Effect from 'effect/Effect';\nimport * as Exit from 'effect/Exit';\nimport * as Layer from 'effect/Layer';\nimport * as Match from 'effect/Match';\nimport * as Option from 'effect/Option';\nimport * as Schema from 'effect/Schema';\n\nimport { AiService, OpaqueToolkit, type ModelName } from '@dxos/ai';\nimport { Database, DXN, Feed, Obj } from '@dxos/echo';\nimport { acquireReleaseResource } from '@dxos/effect';\nimport { Trace } from '@dxos/functions';\nimport { Process, ProcessManager, StorageService } from '@dxos/functions-runtime';\nimport { log } from '@dxos/log';\nimport { Operation, OperationRegistry } from '@dxos/operation';\nimport { trim } from '@dxos/util';\n\nimport { type McpServerConfig, AiSession } from '../conversation';\nimport { getOperationFromTool, makeToolExecutionService, makeToolResolverFromOperations } from '../functions';\nimport { AgentRequestBegin, AgentRequestEnd } from '../tracing';\n\ninterface AgentProcessOptions {\n systemPrompt?: string;\n model?: ModelName;\n\n /**\n * Provider for space-level MCP server configs, called on each turn.\n */\n getMcpServers?: () => McpServerConfig[];\n}\n\nexport const AGENT_PROCESS_KEY = 'org.dxos.testing.process.agent';\n\n/**\n * Hosts a persistent, suspendible AiAgent that can process a number of prompts.\n * The process target is a queue DXN string.\n */\nexport const AgentProcess = (options: AgentProcessOptions) =>\n Process.make(\n {\n key: AGENT_PROCESS_KEY,\n input: Schema.String,\n output: Schema.Void,\n services: [\n Database.Service,\n OpaqueToolkit.OpaqueToolkitProvider,\n Operation.Service,\n OperationRegistry.Service,\n StorageService.StorageService,\n Feed.FeedService,\n ProcessManager.ProcessOperationInvoker.Service,\n AiService.AiService,\n ],\n },\n (ctx) =>\n Effect.gen(function* () {\n const feedDxn = ctx.params.target;\n if (feedDxn == null) {\n return yield* Effect.die(new Error('Agent executable requires spawn options.target set to a queue DXN.'));\n }\n const feed = yield* Database.resolve(DXN.parse(feedDxn), Feed.Feed).pipe(Effect.orDie);\n const runtime = yield* Effect.runtime<Feed.FeedService>();\n const session = yield* acquireReleaseResource(() => new AiSession({ feed, runtime }));\n let inputQueue: AgentEvent[] = [...(yield* AgentEventsKey.get)];\n const storageService = yield* StorageService.StorageService;\n const toolCallManager = new ToolCallManager(storageService);\n yield* toolCallManager.load();\n\n return {\n onInput: Effect.fnUntraced(function* (prompt: string) {\n log('agent onInput received', { promptLength: prompt.length, backlog: inputQueue.length });\n inputQueue.push({ _tag: 'prompt', content: prompt });\n log('agent onInput persisting queue', { depth: inputQueue.length });\n yield* AgentEventsKey.set(inputQueue);\n log('agent onInput persisted', { depth: inputQueue.length });\n ctx.setAlarm();\n log('agent onInput alarm scheduled');\n }),\n onAlarm: Effect.fnUntraced(\n function* () {\n log('agent onAlarm fired', { pending: inputQueue.length });\n const item = inputQueue.shift();\n if (!item) {\n log('agent onAlarm empty queue', {});\n return;\n }\n\n if (item._tag === 'tool_result' && toolCallManager.isReported(item.pid)) {\n log.info('skip tool result that was reported synchronously', { pid: item.pid });\n // Ignore tool results that were reported synchronously.\n return;\n }\n\n log('agent onAlarm handling', { tag: item._tag });\n\n const prompt = Match.value(item).pipe(\n Match.tag('prompt', (item) => item.content),\n Match.tag('tool_result', (item) =>\n item.isError\n ? toolErrorResponse(item.pid, item.result as string)\n : toolResultResponse(item.pid, item.result),\n ),\n Match.exhaustive,\n );\n\n log('begin request', { prompt });\n yield* Trace.write(AgentRequestBegin, {});\n yield* session\n .createRequest({\n prompt,\n // TODO(dmaretskyi): Polling currently broken, agent relies on completion notifications being delivered.\n // toolkit: AsynchronousExectionToolkit,\n system: options.systemPrompt,\n mcpServers: options.getMcpServers?.(),\n })\n .pipe(Effect.ensuring(Trace.write(AgentRequestEnd, {})));\n log('end request');\n yield* AgentEventsKey.set(inputQueue);\n if (inputQueue.length > 0) {\n ctx.setAlarm();\n }\n },\n Effect.orDie,\n Effect.provide(\n Layer.mergeAll(\n makeToolResolverFromOperations(),\n ToolExecutionService({\n toolCallManager,\n feed,\n }),\n AsynchronousExectionToolkitLayer,\n AiService.model(options.model ?? '@anthropic/claude-opus-4-6'),\n ).pipe(Layer.orDie),\n ),\n ),\n onChildEvent: Effect.fnUntraced(function* (event) {\n log('childEvent', { event });\n if (event._tag === 'exited') {\n if (!toolCallManager.isToolCall(event.pid)) {\n log.verbose('childEvent ignored non-tool call', { pid: event.pid });\n return;\n }\n\n const operationInvoker = yield* ProcessManager.ProcessOperationInvoker.Service;\n const fiber = yield* operationInvoker.attachFiber(event.pid).pipe(Effect.orDie);\n const result = yield* fiber.await.pipe(Effect.orDie).pipe(\n Effect.map(\n Exit.match({\n onSuccess: (value): AgentEvent => ({\n _tag: 'tool_result',\n pid: event.pid,\n result: value,\n isError: false,\n }),\n onFailure: (cause): AgentEvent => ({\n _tag: 'tool_result',\n pid: event.pid,\n result: Cause.pretty(cause),\n isError: true,\n }),\n }),\n ),\n );\n inputQueue.push(result);\n log('agent onChildEvent persisted tool result', { depth: inputQueue.length, childPid: event.pid });\n yield* AgentEventsKey.set(inputQueue);\n ctx.setAlarm();\n log('agent onChildEvent alarm scheduled', { depth: inputQueue.length });\n }\n }),\n };\n }),\n );\n\ninterface ToolExecutionServiceOptions {\n /**\n * Threshold after which the tool execution is placed in the background.\n */\n // TODO(dmaretskyi): Tool annotation to never run in background.\n backgroundThreshold?: Duration.Duration;\n\n toolCallManager: ToolCallManager;\n feed: Feed.Feed;\n}\n\nconst AgentEvent = Schema.Union(\n Schema.TaggedStruct('prompt', {\n content: Schema.String,\n }),\n Schema.TaggedStruct('tool_result', {\n pid: Process.ID,\n result: Schema.Unknown,\n isError: Schema.Boolean,\n }),\n);\ntype AgentEvent = Schema.Schema.Type<typeof AgentEvent>;\n\nconst AgentEventsKey = StorageService.key(\n Schema.parseJson(Schema.Array(AgentEvent).pipe(Schema.mutable)),\n 'inputQueue',\n).pipe(StorageService.withDefault(() => []));\n\nconst ToolCallState = Schema.Struct({\n activeCalls: Schema.Array(\n Schema.Struct({\n pid: Process.ID,\n // Whether the result was reported to the agent.\n reported: Schema.Boolean,\n }).pipe(Schema.mutable),\n ).pipe(Schema.mutable),\n});\ninterface ToolCallState extends Schema.Schema.Type<typeof ToolCallState> {}\n\n// Id's of processes who's results were already submitted to the agent.\nconst ToolCallStateKey = StorageService.key(Schema.parseJson(ToolCallState.pipe(Schema.mutable)), 'toolCallState').pipe(\n StorageService.withDefault(() => ({ activeCalls: [] })),\n);\n\nclass ToolCallManager {\n #storageService: StorageService.Service;\n #state: ToolCallState = { activeCalls: [] };\n\n constructor(storageService: StorageService.Service) {\n this.#storageService = storageService;\n }\n\n load() {\n return Effect.gen(this, function* () {\n this.#state = yield* ToolCallStateKey.get;\n }).pipe(Effect.provideService(StorageService.StorageService, this.#storageService));\n }\n\n beginCall(pid: Process.ID) {\n return Effect.gen(this, function* () {\n this.#state.activeCalls.push({ pid, reported: false });\n yield* ToolCallStateKey.set(this.#state);\n }).pipe(Effect.provideService(StorageService.StorageService, this.#storageService));\n }\n\n markAsReported(pid: Process.ID) {\n return Effect.gen(this, function* () {\n const call = this.#state.activeCalls.find((call) => call.pid === pid);\n if (!call) {\n return;\n }\n call.reported = true;\n yield* ToolCallStateKey.set(this.#state);\n }).pipe(Effect.provideService(StorageService.StorageService, this.#storageService));\n }\n\n isToolCall(pid: Process.ID): boolean {\n return this.#state.activeCalls.some((call) => call.pid === pid);\n }\n\n isReported(pid: Process.ID) {\n return this.#state.activeCalls.some((call) => call.pid === pid && call.reported);\n }\n}\n\nconst ToolExecutionService = ({\n backgroundThreshold = Duration.seconds(1),\n toolCallManager,\n feed,\n}: ToolExecutionServiceOptions) =>\n Layer.unwrapEffect(\n Effect.gen(function* () {\n const operationInvoker = yield* ProcessManager.ProcessOperationInvoker.Service;\n return makeToolExecutionService({\n invoke: (tool, input) =>\n Effect.gen(function* () {\n const operationDef = getOperationFromTool(tool).pipe(Option.getOrThrow);\n log('invoking operation', { operationDef, input });\n const fiber = yield* operationInvoker.invokeFiber(operationDef, input, {\n environment: {\n conversation: Obj.getDXN(feed).toString(),\n },\n traceMeta: {\n conversationId: feed.id,\n },\n });\n toolCallManager.beginCall(fiber.pid);\n log('invoked operation', { operationDef, input, fiber });\n\n const result = yield* fiber.await.pipe(\n Effect.tap(() => toolCallManager.markAsReported(fiber.pid)),\n Effect.timeout(backgroundThreshold),\n Effect.catchTag('TimeoutException', () => Effect.succeed(toolIsRunningInBackgroundResponse(fiber.pid))),\n );\n log('result', { result });\n return result;\n }),\n });\n }),\n );\n\nclass AsynchronousExectionToolkit extends Toolkit.make(\n Tool.make('poll-tools', {\n description: trim`\n Poll tool calls running in the background.\n Set wait to true to wait for the tool call to complete before returning.\n Only set wait to true if you dont have other tasks to perform in parallel.\n Set an appropriate timeout to avoid waiting forever.\n You will also be notified about the job completion separatelly, so you do not always need to inspect the job if you dont need the result right now.\n `,\n parameters: {\n ids: Schema.Array(Schema.String).annotations({\n description: 'The IDs of the jobs to inspect.',\n }),\n wait: Schema.optional(Schema.Boolean).annotations({\n description: 'Whether to wait for the job to complete before returning.',\n default: false,\n }),\n timeout: Schema.optional(Schema.Number).annotations({\n description:\n 'Maximum time to wait for the job to complete. If the job does not complete within the timeout, the current state is returned.',\n default: 10_000,\n }),\n },\n }),\n) {}\n\n// TODO(dmaretskyi): Currently broken: polling a completed process returns interruped error.\nconst AsynchronousExectionToolkitLayer = AsynchronousExectionToolkit.toLayer(\n Effect.gen(function* () {\n const invoker = yield* ProcessManager.ProcessOperationInvoker.Service;\n return {\n 'poll-tools': ({ ids, wait, timeout = 10_000 }) =>\n Effect.gen(function* () {\n return yield* Effect.forEach(ids, (pid) =>\n invoker.attachFiber<unknown>(Process.ID.make(pid)).pipe(\n Effect.flatMap((_) => _.await),\n Effect.timeout(Duration.millis(timeout)),\n Effect.flatMap(\n Exit.match({\n onSuccess: (value) => Effect.succeed(toolResultResponse(pid, value)),\n onFailure: (cause) => Effect.succeed(toolErrorResponse(pid, Cause.pretty(cause))),\n }),\n ),\n Effect.catchTag('ProcessNotFoundError', () => Effect.succeed(`Process not found: ${pid}`)),\n Effect.catchTag('TimeoutException', () => Effect.succeed(`Process still running: ${pid}`)),\n ),\n );\n }),\n };\n }),\n);\n\n/**\n * Instructs model that the tool is running in the background.\n */\nconst toolIsRunningInBackgroundResponse = (pid: Process.ID) =>\n `Tool is running in the background id=${pid}; wait for the completion notification to get the result.`;\n// `Tool is running in the background id=${pid}; use ${AsynchronousExectionToolkit.tools['poll-tools'].name} to get the result.`;\n\nconst toolResultResponse = (pid: string, value: unknown) => `<result pid=${pid}>${JSON.stringify(value)}</result>`;\n\nconst toolErrorResponse = (pid: string, cause: string) => `<error pid=${pid}>${cause}</error>`;\n", "//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\nimport * as Stream from 'effect/Stream';\n\nimport { ModelName } from '@dxos/ai';\nimport { Blueprint } from '@dxos/blueprints';\nimport { Database, Feed, Obj, Ref } from '@dxos/echo';\nimport { acquireReleaseResource } from '@dxos/effect';\nimport { type Trace } from '@dxos/functions';\nimport { ProcessManager } from '@dxos/functions-runtime';\n\nimport { type McpServerConfig, AiContextBinder } from '../conversation';\nimport { AgentProcess } from './agent-process';\n\nexport interface Service {\n /**\n * Gets or creates a session for a feed.\n */\n getSession: (feed: Feed.Feed, options?: GetSessionOptions) => Effect.Effect<Session>;\n}\n\nexport class AgentService extends Context.Tag('@dxos/assistant/AgentService')<AgentService, Service>() {}\n\n/**\n * Handle to an agent session.\n */\nexport interface Session {\n /**\n * The feed that the session is associated with.\n */\n readonly feed: Feed.Feed;\n\n /**\n * Submits a prompt to the agent.\n */\n submitPrompt: (prompt: string) => Effect.Effect<void>;\n\n /**\n * Wait until agent has completed its work.\n */\n waitForCompletion: () => Effect.Effect<void>;\n\n /**\n * Subscribe to ephemeral trace events (e.g., streaming partial messages).\n * Replays buffered events, then streams new ones until the process ends.\n */\n subscribeEphemeral: () => Stream.Stream<Trace.Message>;\n\n /**\n * Adds context objects to the agent.\n */\n addContext: (context: Ref.Ref<Obj.Unknown>[]) => Effect.Effect<void, never, Feed.FeedService>;\n\n /**\n * Gets the context objects from the agent.\n */\n getContext: () => Effect.Effect<Ref.Ref<Obj.Unknown>[], never, Feed.FeedService>;\n}\n\n/**\n * Gets or creates a session for a feed.\n */\nexport const getSession = Effect.serviceFunctionEffect(AgentService, (service) => service.getSession);\n\nexport interface GetSessionOptions {\n readonly model?: ModelName;\n}\n\nexport interface CreateSessionOptions {\n readonly blueprints?: Blueprint.Blueprint[];\n readonly context?: Ref.Ref<Obj.Unknown>[];\n readonly model?: ModelName;\n}\n\nexport const createSession: (\n opts?: CreateSessionOptions,\n) => Effect.Effect<\n Session,\n Blueprint.NotFoundError,\n Database.Service | Feed.FeedService | Blueprint.RegistryService | AgentService\n> = Effect.fn('createSession')(function* (opts) {\n const blueprints = yield* Effect.forEach(opts?.blueprints ?? [], (blueprint) =>\n Blueprint.upsert(blueprint.key).pipe(Effect.map(Ref.make)),\n );\n\n const feed = yield* Database.add(Feed.make());\n const runtime = yield* Effect.runtime<Feed.FeedService>();\n const binder = yield* acquireReleaseResource(() => new AiContextBinder({ feed, runtime }));\n\n yield* Effect.promise(() =>\n binder.bind({\n blueprints,\n objects: opts?.context ?? [],\n }),\n );\n\n return yield* getSession(feed, { model: opts?.model });\n}, Effect.scoped);\n\nexport const layer = (opts?: {\n systemPrompt?: string;\n /**\n * Default model used by sessions that don't specify one explicitly.\n */\n model?: ModelName;\n\n /**\n * Provider for space-level MCP server configs.\n */\n getMcpServers?: () => McpServerConfig[];\n}): Layer.Layer<AgentService, never, ProcessManager.ProcessManagerService> =>\n Layer.effect(\n AgentService,\n Effect.gen(function* () {\n const processManager = yield* ProcessManager.ProcessManagerService;\n const sessionCache = new Map<string, Session>();\n\n return {\n getSession: (feed: Feed.Feed, options?: GetSessionOptions) =>\n Effect.gen(function* () {\n const cached = sessionCache.get(feed.id);\n if (cached) {\n return cached;\n }\n\n const target = Obj.getDXN(feed).toString();\n const executable = AgentProcess({\n systemPrompt: opts?.systemPrompt,\n model: options?.model ?? opts?.model,\n getMcpServers: opts?.getMcpServers,\n });\n const processes = yield* processManager.list({ target, key: executable.key });\n\n let handle: ProcessManager.Handle<string, void>;\n if (processes.length > 0) {\n handle = processes[0];\n } else {\n handle = yield* processManager.spawn(executable, {\n name: 'agent',\n target,\n traceMeta: {\n conversationId: feed.id,\n },\n });\n }\n\n const session = makeSession(handle, feed);\n sessionCache.set(feed.id, session);\n return session;\n }),\n };\n }),\n );\n\nconst makeSession = (process: ProcessManager.Handle<string, void>, feed: Feed.Feed): Session => ({\n feed,\n submitPrompt: (prompt: string) => process.submitInput(prompt),\n waitForCompletion: () => process.runToCompletion(),\n subscribeEphemeral: () => process.subscribeEphemeral(),\n addContext: (context: Ref.Ref<Obj.Unknown>[]) =>\n Effect.gen(function* () {\n const runtime = yield* Effect.runtime<Feed.FeedService>();\n const binder = yield* acquireReleaseResource(() => new AiContextBinder({ feed, runtime }));\n yield* Effect.promise(() =>\n binder.bind({\n blueprints: [],\n objects: context,\n }),\n );\n }).pipe(Effect.scoped),\n getContext: () =>\n Effect.gen(function* () {\n const runtime = yield* Effect.runtime<Feed.FeedService>();\n const binder = yield* acquireReleaseResource(() => new AiContextBinder({ feed, runtime }));\n return binder.getObjects().map((object) => Ref.make(object));\n }).pipe(Effect.scoped),\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["Atom", "Registry", "EArray", "Context", "Effect", "Function", "Runtime", "Schema", "Blueprint", "Resource", "DXN", "Feed", "Obj", "Query", "Ref", "Type", "assertArgument", "log", "ComplexSet", "isNonNullable", "ContextBinding", "Struct", "blueprints", "added", "Array", "removed", "objects", "Unknown", "pipe", "object", "typename", "version", "Bindings", "ref", "dxn", "toString", "asEchoDXN", "echoId", "toJSON", "fromIterable", "map", "AiContextBinder", "_blueprints", "make", "keepAlive", "_objects", "_registry", "_feed", "_runtime", "options", "feed", "runtime", "registry", "getBlueprints", "get", "getObjects", "subscribeBlueprints", "cb", "subscribe", "subscribeObjects", "_open", "runPromise", "query", "type", "initialResults", "run", "_updateBindings", "_ctx", "onDispose", "results", "sync", "bindingItems", "length", "blueprintKeys", "bp", "key", "items", "bindings", "_reduce", "blueprintRefs", "available", "isAvailable", "currentBlueprints", "currentObjects", "resolvedBlueprints", "_resolve", "resolvedObjects", "resolvedBlueprintKeys", "reducedBlueprintDxns", "hash", "reducedObjectDxns", "filteredBlueprints", "filter", "obj", "has", "getDXN", "filteredObjects", "mergedBlueprints", "_mergeInto", "mergedObjects", "set", "_close", "bind", "addedBlueprints", "next", "nextBlueprints", "_processBindings", "addedObjects", "nextObjects", "append", "unbind", "removedBlueprintDxns", "removedObjectDxns", "current", "some", "equalsEchoId", "refs", "seen", "Set", "add", "push", "target", "reduce", "context", "forEach", "delete", "resolved", "merged", "refArray", "Promise", "all", "tryLoad", "find", "AiContextService", "Tag", "bindContext", "gen", "binder", "promise", "findObjects", "instanceOf", "Schema", "Obj", "Ref", "Database", "EncodedReference", "DXN", "LOCAL_SPACE_TAG", "trim", "createArtifactElement", "id", "ArtifactId", "String", "annotations", "description", "trim", "examples", "toDXN", "reference", "owningSpaceId", "startsWith", "DXN", "parse", "slice", "test", "spaceId", "objectId", "split", "kind", "ECHO", "LOCAL_SPACE_TAG", "fromLocalObjectId", "Error", "resolve", "schema", "ref", "dxn", "Database", "RefFromLLM", "transform", "Ref", "Obj", "Unknown", "decode", "fromA", "fromI", "EncodedReference", "fromDXN", "encode", "toI", "toA", "toString", "strict", "ast", "Tool", "Context", "Effect", "Layer", "Option", "Record", "Schema", "SchemaAST", "AiToolNotFoundError", "ToolExecutionService", "ToolResolverService", "OpaqueToolkit", "todo", "Ref", "invariant", "Operation", "OperationRegistry", "makeToolResolverFromOperations", "toolkit", "extraToolkit", "OpaqueToolkit", "empty", "effect", "ToolResolverService", "gen", "toolkitProvider", "OpaqueToolkitProvider", "operationRegistry", "OperationRegistry", "Service", "resolve", "id", "merge", "getToolkit", "tool", "tools", "pipe", "flatMap", "match", "onSome", "_", "succeed", "projectFunctionToTool", "onNone", "fail", "AiToolNotFoundError", "makeToolExecutionService", "opts", "ToolExecutionService", "toolkitHandler", "provide", "layer", "invariant", "isHandlerLike", "handlersFor", "makeHandler", "fn", "name", "input", "isProviderDefined", "Error", "result", "handle", "invoke", "catchAllDefect", "defect", "of", "map", "_name", "isUserDefined", "makeToolExecutionServiceFromOperationInvoker", "unwrapEffect", "operationInvoker", "Operation", "operationDef", "getOperationFromTool", "getOrThrow", "orDie", "ToolExecutionServices", "mergeAll", "FunctionToolAnnotation", "Tag", "getOption", "annotations", "definition", "toolCache", "WeakMap", "has", "get", "make", "makeToolName", "meta", "key", "description", "parameters", "createStructFieldsFromSchema", "failure", "Any", "annotate", "set", "toolName", "toLowerCase", "replace", "schema", "ast", "_tag", "Object", "fromEntries", "propertySignatures", "prop", "mapSchemaTypeForLLM", "type", "todo", "Ref", "isRefType", "RefFromLLM", "isTupleType", "TupleType", "elements", "t", "OptionalType", "isOptional", "rest", "Type", "isReadonly", "isTypeLiteral", "TypeLiteral", "p", "PropertySignature", "indexSignatures", "value", "Context", "ArtifactDiffResolver", "Tag", "Effect", "Function", "GenerationObserver", "Object", "freeze", "make", "onBegin", "constant", "void", "onPart", "onBlock", "onEnd", "onMessage", "noop", "fromPrinter", "printer", "block", "sync", "pending", "printContentBlock", "message", "sender", "role", "printMessage", "Schema", "Obj", "Trace", "ContentBlock", "Actor", "PartialBlock", "Trace", "EventType", "schema", "Struct", "messageId", "Obj", "ID", "role", "Actor", "Role", "block", "ContentBlock", "Any", "isEphemeral", "CompleteBlock", "AgentRequestBegin", "AgentRequestEnd", "BaseError", "AiModelError", "BaseError", "extend", "AiAssistantError", "Effect", "Function", "Option", "Template", "Obj", "ObjectVersion", "log", "Message", "trim", "formatSystemPrompt", "system", "blueprints", "objects", "gen", "blueprintDefs", "pipe", "forEach", "blueprint", "succeed", "instructions", "flatMap", "template", "trim", "Template", "processTemplate", "map", "length", "join", "undefined", "objectDefs", "object", "Obj", "getDXN", "getTypename", "filter", "def", "parts", "withSpan", "formatUserPrompt", "prompt", "history", "blocks", "artifactDiffResolver", "serviceOption", "ArtifactDiffResolver", "isSome", "versions", "gatherObjectVersions", "artifactDiff", "tryPromise", "try", "value", "resolve", "entries", "id", "version", "lastVersion", "catch", "AiAssistantError", "wrap", "message", "log", "ObjectVersion", "equals", "get", "delete", "push", "_tag", "objectId", "size", "createArtifactUpdateBlock", "make", "Message", "created", "Date", "toISOString", "sender", "role", "text", "messages", "artifactIds", "Map", "block", "set", "disposition", "diff", "LanguageModel", "Array", "Chunk", "Effect", "pipe", "Option", "Stream", "AiParser", "AiPreprocessor", "AiSummarizer", "callTool", "withoutToolCallParising", "Obj", "Trace", "log", "ContentBlock", "Message", "AiRequest", "_semaphore", "runSync", "makeSemaphore", "_observer", "_onOutput", "_history", "_pending", "_started", "_ended", "_toolCalls", "_options", "observer", "GenerationObserver", "noop", "onOutput", "void", "duration", "toolCalls", "pending", "_submitMessage", "message", "gen", "push", "onMessage", "block", "blocks", "Trace", "write", "CompleteBlock", "messageId", "id", "role", "sender", "getToolCalls", "pipe", "reverse", "takeWhile", "_", "flatMap", "filter", "ContentBlock", "is", "map", "providerExecuted", "begin", "prompt", "system", "history", "blueprints", "objects", "Date", "now", "systemPrompt", "formatSystemPrompt", "orDie", "summarizationThreshold", "undefined", "tokenCount", "AiPreprocessor", "estimateTokens", "preprocessPrompt", "summary", "AiSummarizer", "summarize", "formatUserPrompt", "withSpan", "runAgentTurn", "toolkit", "opaqueToolkit", "log", "info", "snippet", "createSnippet", "length", "cacheControl", "handlers", "currentMessageId", "messages", "streamText", "disableToolCallResolution", "withoutToolCallParising", "AiParser", "parseResponse", "emitPartial", "onBegin", "onBlock", "onPart", "part", "onEnd", "mapEffect", "Obj", "ID", "random", "type", "_tag", "PartialBlock", "none", "make", "Message", "created", "toISOString", "some", "concurrency", "unordered", "filterMap", "runCollect", "toArray", "done", "Error", "runTools", "toolResults", "forEach", "callTool", "run", "systemTemplate", "tools", "withPermits", "text", "len", "slice", "join", "Toolkit", "Effect", "Layer", "OpaqueToolkit", "ToolExecutionService", "ToolResolverService", "isTruthy", "createToolkit", "toolkit", "toolkitProp", "blueprints", "opaqueToolkits", "gen", "blueprintToolkit", "ToolResolverService", "resolveToolkit", "flatMap", "tools", "blueprintToolHandler", "toContext", "ToolExecutionService", "handlersFor", "opaqueToolkit", "OpaqueToolkit", "merge", "toolkitDefs", "filter", "isTruthy", "mergedToolkit", "combinedHandlerLayer", "mergeAll", "succeedContext", "layer", "empty", "make", "Schema", "getVersion", "ObjectId", "ObjectVersionSchema", "Unknown", "VersionPinSchema", "Struct", "objectId", "ObjectId", "version", "VersionPin", "DISPOSITION", "fromObject", "object", "make", "id", "getVersion", "createBlock", "pin", "_tag", "disposition", "data", "JSON", "stringify", "Array", "Context", "Effect", "Either", "pipe", "Layer", "Record", "Runtime", "Resource", "Database", "Feed", "Filter", "Obj", "acquireReleaseResource", "invariant", "log", "McpToolkit", "Operation", "Message", "SUMMARY_THRESHOLD", "AiSession", "Resource", "_binder", "_feed", "_runtime", "options", "feed", "runtime", "invariant", "AiContextBinder", "registry", "_open", "open", "_ctx", "context", "getHistory", "queryResult", "runPromise", "Feed", "query", "Filter", "type", "Message", "items", "run", "filter", "Obj", "instanceOf", "getTools", "gen", "toolkit", "createToolkit", "blueprints", "getBlueprints", "tools", "pipe", "orDie", "makeToolExecutionServices", "ToolExecutionServices", "provide", "Operation", "withInvocationOptions", "conversation", "getDXN", "toString", "createRequest", "params", "history", "promise", "objects", "getObjects", "log", "length", "request", "AiRequest", "summarizationThreshold", "observer", "onOutput", "message", "append", "begin", "prompt", "system", "sync", "currentBlueprints", "mcps", "connectMcpServers", "mcpServers", "opaqueToolkits", "keys", "formatSystemPrompt", "done", "runAgentTurn", "runTools", "messages", "pending", "duration", "toolCalls", "mergeAll", "succeed", "AiContextService", "binder", "AiSessionService", "withSpan", "Tag", "layer", "aiContextFromSession", "provideMerge", "scoped", "session", "acquireReleaseResource", "layerNewFeed", "unwrapScoped", "make", "Database", "add", "effect", "spaceMcpServers", "blueprintServers", "flatMap", "_", "map", "url", "protocol", "kind", "spaceServers", "apiKey", "allServers", "forEach", "McpToolkit", "tap", "info", "Object", "tapDefect", "error", "warn", "either", "filterMap", "getRight", "Tool", "Toolkit", "Cause", "Duration", "Effect", "Exit", "Layer", "Match", "Option", "Schema", "AiService", "OpaqueToolkit", "Database", "DXN", "Feed", "Obj", "acquireReleaseResource", "Trace", "Process", "ProcessManager", "StorageService", "log", "Operation", "OperationRegistry", "trim", "AGENT_PROCESS_KEY", "AgentProcess", "options", "Process", "make", "key", "input", "String", "output", "Void", "services", "Database", "Service", "OpaqueToolkit", "OpaqueToolkitProvider", "Operation", "OperationRegistry", "StorageService", "Feed", "FeedService", "ProcessManager", "ProcessOperationInvoker", "AiService", "ctx", "gen", "feedDxn", "params", "target", "die", "Error", "feed", "resolve", "DXN", "parse", "pipe", "orDie", "runtime", "session", "acquireReleaseResource", "AiSession", "inputQueue", "AgentEventsKey", "get", "storageService", "toolCallManager", "ToolCallManager", "load", "onInput", "fnUntraced", "prompt", "log", "promptLength", "length", "backlog", "push", "_tag", "content", "depth", "set", "setAlarm", "onAlarm", "pending", "item", "shift", "isReported", "pid", "info", "tag", "value", "isError", "toolErrorResponse", "result", "toolResultResponse", "exhaustive", "Trace", "write", "AgentRequestBegin", "createRequest", "system", "systemPrompt", "mcpServers", "getMcpServers", "ensuring", "AgentRequestEnd", "provide", "mergeAll", "makeToolResolverFromOperations", "ToolExecutionService", "AsynchronousExectionToolkitLayer", "model", "onChildEvent", "event", "isToolCall", "verbose", "operationInvoker", "fiber", "attachFiber", "await", "map", "match", "onSuccess", "onFailure", "cause", "pretty", "childPid", "AgentEvent", "Union", "TaggedStruct", "ID", "Unknown", "Boolean", "parseJson", "Array", "mutable", "withDefault", "ToolCallState", "Struct", "activeCalls", "reported", "ToolCallStateKey", "provideService", "beginCall", "markAsReported", "call", "find", "some", "backgroundThreshold", "seconds", "unwrapEffect", "makeToolExecutionService", "invoke", "tool", "operationDef", "getOperationFromTool", "getOrThrow", "invokeFiber", "environment", "conversation", "Obj", "getDXN", "toString", "traceMeta", "conversationId", "id", "tap", "timeout", "catchTag", "succeed", "toolIsRunningInBackgroundResponse", "AsynchronousExectionToolkit", "description", "trim", "parameters", "ids", "annotations", "wait", "optional", "default", "Number", "toLayer", "invoker", "forEach", "flatMap", "_", "millis", "JSON", "stringify", "Context", "Effect", "Layer", "Blueprint", "Database", "Feed", "Obj", "Ref", "acquireReleaseResource", "ProcessManager", "AgentService", "Tag", "getSession", "serviceFunctionEffect", "service", "createSession", "fn", "opts", "blueprints", "forEach", "blueprint", "Blueprint", "upsert", "key", "pipe", "map", "Ref", "make", "feed", "Database", "add", "Feed", "runtime", "binder", "acquireReleaseResource", "AiContextBinder", "promise", "bind", "objects", "context", "model", "scoped", "layer", "effect", "gen", "processManager", "ProcessManager", "ProcessManagerService", "sessionCache", "Map", "options", "cached", "get", "id", "target", "Obj", "getDXN", "toString", "executable", "AgentProcess", "systemPrompt", "getMcpServers", "processes", "list", "handle", "length", "spawn", "name", "traceMeta", "conversationId", "session", "makeSession", "set", "process", "submitPrompt", "prompt", "submitInput", "waitForCompletion", "runToCompletion", "subscribeEphemeral", "addContext", "getContext", "getObjects", "object"]
7
+ }
@@ -0,0 +1,10 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, { get: all[name], enumerable: true });
5
+ };
6
+
7
+ export {
8
+ __export
9
+ };
10
+ //# sourceMappingURL=chunk-J5LGTIGS.mjs.map
@@ -0,0 +1,219 @@
1
+ import "../chunk-J5LGTIGS.mjs";
2
+
3
+ // src/extraction/extraction.ts
4
+ import * as Schema from "effect/Schema";
5
+ import { Obj } from "@dxos/echo";
6
+ import { log } from "@dxos/log";
7
+ import { Operation } from "@dxos/operation";
8
+ import { Message } from "@dxos/types";
9
+ var __dxlog_file = "/__w/dxos/dxos/packages/core/assistant/src/extraction/extraction.ts";
10
+ var ExtractionInput = Schema.Struct({
11
+ message: Message.Message,
12
+ objects: Schema.optional(Schema.Array(Obj.Unknown)),
13
+ options: Schema.optional(Schema.Struct({
14
+ timeout: Schema.optional(Schema.Number),
15
+ fallbackToRaw: Schema.optional(Schema.Boolean)
16
+ }))
17
+ });
18
+ var ExtractionOutput = Schema.Struct({
19
+ message: Message.Message,
20
+ timeElapsed: Schema.Number
21
+ });
22
+ var extractionAnthropicFunction = Operation.make({
23
+ meta: {
24
+ key: "org.dxos.function.extraction.anthropic",
25
+ name: "Entity Extraction (Anthropic)",
26
+ description: "Extract entities from transcript using Anthropic LLM."
27
+ },
28
+ input: ExtractionInput,
29
+ output: ExtractionOutput
30
+ });
31
+ var extractionNerFunction = Operation.make({
32
+ meta: {
33
+ key: "org.dxos.function.extraction.ner",
34
+ name: "Entity Extraction (NER)",
35
+ description: "Extract entities from transcript using Named Entity Recognition."
36
+ },
37
+ input: ExtractionInput,
38
+ output: ExtractionOutput
39
+ });
40
+ var processTranscriptMessage = async (params) => {
41
+ try {
42
+ if (params.options?.timeout && params.options.timeout > 0) {
43
+ } else {
44
+ }
45
+ } catch (error) {
46
+ if (params.options?.fallbackToRaw) {
47
+ log.warn("failed to process message, falling back to raw text", {
48
+ error
49
+ }, {
50
+ F: __dxlog_file,
51
+ L: 92,
52
+ S: void 0,
53
+ C: (f, a) => f(...a)
54
+ });
55
+ return {
56
+ message: params.input.message,
57
+ timeElapsed: 0
58
+ };
59
+ } else {
60
+ throw error;
61
+ }
62
+ }
63
+ return {
64
+ message: params.input.message,
65
+ timeElapsed: 0
66
+ };
67
+ };
68
+
69
+ // src/extraction/extraction-ner-function/named-entity-recognition.ts
70
+ import { pipeline } from "@xenova/transformers";
71
+ import { log as log2 } from "@dxos/log";
72
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/core/assistant/src/extraction/extraction-ner-function/named-entity-recognition.ts";
73
+ var _ner;
74
+ var getNer = () => {
75
+ if (!_ner) {
76
+ _ner = pipeline("ner", "Xenova/bert-base-NER").then((ner) => {
77
+ log2.info("NER model is ready", void 0, {
78
+ F: __dxlog_file2,
79
+ L: 24,
80
+ S: void 0,
81
+ C: (f, a) => f(...a)
82
+ });
83
+ return ner;
84
+ });
85
+ }
86
+ return _ner;
87
+ };
88
+ var extractFullEntities = async (text) => {
89
+ const ner = await getNer();
90
+ const entities = await ner(text);
91
+ const tokenGroups = createTokenGroups(entities);
92
+ const combinedEntities = tokenGroups.map(combineNerTokens);
93
+ return combinedEntities;
94
+ };
95
+ var createTokenGroups = (tokens) => {
96
+ const tokenGroups = [];
97
+ const canBeCombined = (prevToken, currentToken) => {
98
+ const [currentState, currentEntity] = currentToken.entity.split("-");
99
+ const [prevState, prevEntity] = prevToken.entity.split("-");
100
+ if (prevEntity !== currentEntity) {
101
+ return false;
102
+ }
103
+ if (prevState === "O") {
104
+ return false;
105
+ }
106
+ if (currentState === "I") {
107
+ return true;
108
+ }
109
+ if ((prevState === "B" || prevState === "I") && currentState === "B") {
110
+ return currentToken.word.startsWith("#");
111
+ }
112
+ return false;
113
+ };
114
+ for (const token of tokens) {
115
+ if (tokenGroups.length === 0) {
116
+ tokenGroups.push([
117
+ token
118
+ ]);
119
+ continue;
120
+ }
121
+ const lastTokenGroup = tokenGroups.at(-1);
122
+ if (canBeCombined(lastTokenGroup.at(-1), token)) {
123
+ lastTokenGroup.push(token);
124
+ continue;
125
+ }
126
+ tokenGroups.push([
127
+ token
128
+ ]);
129
+ }
130
+ return tokenGroups;
131
+ };
132
+ var combineNerTokens = (group) => {
133
+ const combinedToken = {
134
+ entity: group.at(0).entity.split("-")[1],
135
+ score: group.reduce((acc, token) => acc + token.score, 0) / group.length,
136
+ index: group.at(0).index,
137
+ word: group.at(0).word,
138
+ start: group.at(0).start,
139
+ end: group.at(-1).end
140
+ };
141
+ for (const token of group.slice(1)) {
142
+ if (token.word.startsWith("#")) {
143
+ combinedToken.word += token.word.replace(/^#+/, "");
144
+ } else {
145
+ combinedToken.word += " " + token.word;
146
+ }
147
+ }
148
+ return combinedToken;
149
+ };
150
+
151
+ // src/extraction/quotes.ts
152
+ import * as Schema2 from "effect/Schema";
153
+ import { Filter, Query } from "@dxos/echo";
154
+ import { ObjectId } from "@dxos/keys";
155
+ import { DXN } from "@dxos/keys";
156
+ import { log as log3 } from "@dxos/log";
157
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/core/assistant/src/extraction/quotes.ts";
158
+ var ReferencedQuotes = Schema2.Struct({
159
+ references: Schema2.Array(Schema2.Struct({
160
+ id: Schema2.String,
161
+ quote: Schema2.String
162
+ })).pipe(Schema2.mutable).annotations({
163
+ // TODO(burdon): Does this description make sense?
164
+ description: `
165
+ The references to the context objects that are mentioned in the transcript.
166
+ Quote should match the original transcript text exactly, while id is the id of the context object.
167
+ `
168
+ })
169
+ });
170
+ var findQuotes = async (quotes, db) => {
171
+ const references = await Promise.all(quotes.map(async (quote) => {
172
+ const objects = await db.query(Query.select(Filter.text(quote, {
173
+ type: "vector"
174
+ }))).run();
175
+ log3.info("found quotes in vector index", {
176
+ objects,
177
+ quote
178
+ }, {
179
+ F: __dxlog_file3,
180
+ L: 34,
181
+ S: void 0,
182
+ C: (f, a) => f(...a)
183
+ });
184
+ return objects.length > 0 ? [
185
+ {
186
+ id: objects[0].id.toString(),
187
+ quote
188
+ }
189
+ ] : [];
190
+ }));
191
+ return {
192
+ references: references.flat()
193
+ };
194
+ };
195
+ var insertReferences = (text, quotes) => {
196
+ for (const quote of quotes.references) {
197
+ if (!ObjectId.isValid(quote.id)) {
198
+ continue;
199
+ }
200
+ const regex = new RegExp(quote.quote.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "gi");
201
+ text = text.replace(regex, `[${quote.quote}](${DXN.fromLocalObjectId(quote.id).toString()})`);
202
+ }
203
+ return text;
204
+ };
205
+ export {
206
+ ExtractionInput,
207
+ ExtractionOutput,
208
+ ReferencedQuotes,
209
+ combineNerTokens,
210
+ createTokenGroups,
211
+ extractFullEntities,
212
+ extractionAnthropicFunction,
213
+ extractionNerFunction,
214
+ findQuotes,
215
+ getNer,
216
+ insertReferences,
217
+ processTranscriptMessage
218
+ };
219
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/extraction/extraction.ts", "../../../../src/extraction/extraction-ner-function/named-entity-recognition.ts", "../../../../src/extraction/quotes.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { Obj } from '@dxos/echo';\nimport { log } from '@dxos/log';\nimport { Operation } from '@dxos/operation';\nimport { Message } from '@dxos/types';\n\nexport const ExtractionInput = Schema.Struct({\n message: Message.Message,\n objects: Schema.optional(Schema.Array(Obj.Unknown)),\n options: Schema.optional(\n Schema.Struct({\n timeout: Schema.optional(Schema.Number),\n fallbackToRaw: Schema.optional(Schema.Boolean),\n }),\n ),\n});\nexport interface ExtractionInput extends Schema.Schema.Type<typeof ExtractionInput> {}\n\nexport const ExtractionOutput = Schema.Struct({\n message: Message.Message,\n timeElapsed: Schema.Number,\n});\nexport interface ExtractionOutput extends Schema.Schema.Type<typeof ExtractionOutput> {}\n\nexport type ProcessTranscriptMessageProps = {\n input: ExtractionInput;\n function: Operation.Definition<ExtractionInput, ExtractionOutput>;\n\n options?: {\n /**\n * Timeout for the entity extraction.\n */\n timeout?: number;\n\n /**\n * Fallback to raw text if the entity extraction fails.\n * Otherwise the function will throw an error.\n * @default false\n */\n fallbackToRaw?: boolean;\n };\n};\n\nexport type ExtractionFunction = Operation.Definition<ExtractionInput, ExtractionOutput>;\n\n/**\n * Placeholder for Anthropic-based entity extraction.\n * Implementation is currently disabled pending restoration of extraction logic.\n */\nexport const extractionAnthropicFunction = Operation.make({\n meta: {\n key: 'org.dxos.function.extraction.anthropic',\n name: 'Entity Extraction (Anthropic)',\n description: 'Extract entities from transcript using Anthropic LLM.',\n },\n input: ExtractionInput,\n output: ExtractionOutput,\n});\n\n/**\n * Placeholder for NER-based entity extraction.\n * Implementation is currently disabled pending restoration of extraction logic.\n */\nexport const extractionNerFunction = Operation.make({\n meta: {\n key: 'org.dxos.function.extraction.ner',\n name: 'Entity Extraction (NER)',\n description: 'Extract entities from transcript using Named Entity Recognition.',\n },\n input: ExtractionInput,\n output: ExtractionOutput,\n});\n\n/**\n * Extract entities from the transcript message and add them to the message.\n */\n// TODO(dmaretskyi): Move context to a vector search index.\nexport const processTranscriptMessage = async (params: ProcessTranscriptMessageProps): Promise<ExtractionOutput> => {\n try {\n if (params.options?.timeout && params.options.timeout > 0) {\n // return await asyncTimeout(params.executor.invoke(params.function, params.input), params.options.timeout);\n } else {\n // return await params.executor.invoke(params.function, params.input);\n }\n } catch (error) {\n if (params.options?.fallbackToRaw) {\n log.warn('failed to process message, falling back to raw text', { error });\n return {\n message: params.input.message,\n timeElapsed: 0,\n };\n } else {\n throw error;\n }\n }\n\n // TODO(dmaretskyi): Restore extraction logic.\n return { message: params.input.message, timeElapsed: 0 };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport {\n type TokenClassificationOutput,\n type TokenClassificationPipelineType,\n type TokenClassificationSingle,\n pipeline,\n} from '@xenova/transformers';\n\nimport { log } from '@dxos/log';\n\nlet _ner: Promise<TokenClassificationPipelineType>;\n\n/**\n * Named Entity Recognition pipeline.\n * Initializes the pipeline on first call.\n * @returns The singleton promise that resolves to a token classification pipeline.\n */\nexport const getNer = () => {\n if (!_ner) {\n _ner = pipeline('ner', 'Xenova/bert-base-NER').then((ner) => {\n log.info('NER model is ready');\n return ner;\n });\n }\n\n return _ner;\n};\n\n/**\n * Extracts entities from text using the named entity recognition pipeline and does simple grouping of tokens.\n */\nexport const extractFullEntities = async (text: string): Promise<TokenClassificationSingle[]> => {\n const ner = await getNer();\n const entities = (await ner(text)) as TokenClassificationOutput;\n const tokenGroups = createTokenGroups(entities);\n const combinedEntities = tokenGroups.map(combineNerTokens);\n return combinedEntities;\n};\n\nexport const createTokenGroups = (tokens: TokenClassificationSingle[]): TokenClassificationSingle[][] => {\n const tokenGroups: TokenClassificationSingle[][] = [];\n\n const canBeCombined = (prevToken: TokenClassificationSingle, currentToken: TokenClassificationSingle) => {\n const [currentState, currentEntity] = currentToken.entity.split('-'); // B, I, O\n const [prevState, prevEntity] = prevToken.entity.split('-'); // B, I, O\n if (prevEntity !== currentEntity) {\n return false;\n }\n if (prevState === 'O') {\n return false;\n }\n if (currentState === 'I') {\n return true;\n }\n if ((prevState === 'B' || prevState === 'I') && currentState === 'B') {\n return currentToken.word.startsWith('#');\n }\n return false;\n };\n\n for (const token of tokens) {\n if (tokenGroups.length === 0) {\n tokenGroups.push([token]);\n continue;\n }\n const lastTokenGroup = tokenGroups.at(-1)!;\n if (canBeCombined(lastTokenGroup.at(-1)!, token)) {\n lastTokenGroup.push(token);\n continue;\n }\n tokenGroups.push([token]);\n }\n\n return tokenGroups;\n};\n\nexport const combineNerTokens = (group: TokenClassificationSingle[]): TokenClassificationSingle => {\n const combinedToken: TokenClassificationSingle = {\n entity: group.at(0)!.entity.split('-')[1],\n score: group.reduce((acc, token) => acc + token.score, 0) / group.length,\n index: group.at(0)!.index,\n word: group.at(0)!.word,\n start: group.at(0)!.start,\n end: group.at(-1)!.end,\n };\n\n for (const token of group.slice(1)) {\n if (token.word.startsWith('#')) {\n combinedToken.word += token.word.replace(/^#+/, '');\n } else {\n combinedToken.word += ' ' + token.word;\n }\n }\n\n return combinedToken;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { type Database, Filter, Query } from '@dxos/echo';\nimport { ObjectId } from '@dxos/keys';\nimport { DXN } from '@dxos/keys';\nimport { log } from '@dxos/log';\n\nexport const ReferencedQuotes = Schema.Struct({\n references: Schema.Array(\n Schema.Struct({\n id: Schema.String,\n quote: Schema.String, // TODO(burdon): Quote?\n }),\n )\n .pipe(Schema.mutable)\n .annotations({\n // TODO(burdon): Does this description make sense?\n description: `\n The references to the context objects that are mentioned in the transcript. \n Quote should match the original transcript text exactly, while id is the id of the context object.\n `,\n }),\n});\nexport type ReferencedQuotes = Schema.Schema.Type<typeof ReferencedQuotes>;\n\nexport const findQuotes = async (quotes: string[], db: Database.Database): Promise<ReferencedQuotes> => {\n const references = await Promise.all(\n quotes.map(async (quote) => {\n const objects = await db.query(Query.select(Filter.text(quote, { type: 'vector' }))).run();\n log.info('found quotes in vector index', { objects, quote });\n return objects.length > 0 ? [{ id: objects[0].id.toString(), quote }] : [];\n }),\n );\n return { references: references.flat() };\n};\n\n/**\n * Finds and replaces all quotes with DXNs references.\n */\n// TODO(dmaretskyi): Lookup and verifiy ids from provided context.\nexport const insertReferences = (text: string, quotes: ReferencedQuotes) => {\n for (const quote of quotes.references) {\n if (!ObjectId.isValid(quote.id)) {\n continue;\n }\n\n // Use a case-insensitive regular expression to replace the quote.\n const regex = new RegExp(quote.quote.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'gi');\n text = text.replace(regex, `[${quote.quote}](${DXN.fromLocalObjectId(quote.id).toString()})`);\n }\n\n return text;\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["Schema", "Obj", "log", "Operation", "Message", "ExtractionInput", "Struct", "message", "objects", "optional", "Array", "Unknown", "options", "timeout", "Number", "fallbackToRaw", "Boolean", "ExtractionOutput", "timeElapsed", "extractionAnthropicFunction", "make", "meta", "key", "name", "description", "input", "output", "extractionNerFunction", "processTranscriptMessage", "params", "error", "warn", "pipeline", "log", "_ner", "getNer", "then", "ner", "info", "extractFullEntities", "text", "entities", "tokenGroups", "createTokenGroups", "combinedEntities", "map", "combineNerTokens", "tokens", "canBeCombined", "prevToken", "currentToken", "currentState", "currentEntity", "entity", "split", "prevState", "prevEntity", "word", "startsWith", "token", "length", "push", "lastTokenGroup", "at", "group", "combinedToken", "score", "reduce", "acc", "index", "start", "end", "slice", "replace", "Schema", "Filter", "Query", "ObjectId", "DXN", "log", "ReferencedQuotes", "Struct", "references", "Array", "id", "String", "quote", "pipe", "mutable", "annotations", "description", "findQuotes", "quotes", "db", "Promise", "all", "map", "objects", "query", "select", "text", "type", "run", "info", "length", "toString", "flat", "insertReferences", "isValid", "regex", "RegExp", "replace", "fromLocalObjectId"]
7
+ }