@dxos/assistant 0.8.4-main.3a94e84 → 0.8.4-main.3eb6e50203

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 (184) hide show
  1. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  2. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  3. package/dist/lib/neutral/chunk-QBD6NQJK.mjs +604 -0
  4. package/dist/lib/neutral/chunk-QBD6NQJK.mjs.map +7 -0
  5. package/dist/lib/neutral/extraction/index.mjs +225 -0
  6. package/dist/lib/neutral/extraction/index.mjs.map +7 -0
  7. package/dist/lib/neutral/index.mjs +931 -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 +38 -0
  11. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  12. package/dist/types/src/conversation/context.d.ts +138 -0
  13. package/dist/types/src/conversation/context.d.ts.map +1 -0
  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/conversation.d.ts +53 -25
  17. package/dist/types/src/conversation/conversation.d.ts.map +1 -1
  18. package/dist/types/src/conversation/conversation.test.d.ts +2 -0
  19. package/dist/types/src/conversation/conversation.test.d.ts.map +1 -0
  20. package/dist/types/src/conversation/index.d.ts +1 -0
  21. package/dist/types/src/conversation/index.d.ts.map +1 -1
  22. package/dist/types/src/diff.d.ts +17 -0
  23. package/dist/types/src/diff.d.ts.map +1 -0
  24. package/dist/types/src/diff.test.d.ts +2 -0
  25. package/dist/types/src/diff.test.d.ts.map +1 -0
  26. package/dist/types/src/errors.d.ts +47 -18
  27. package/dist/types/src/errors.d.ts.map +1 -1
  28. package/dist/types/src/execution-graph.d.ts +85 -0
  29. package/dist/types/src/execution-graph.d.ts.map +1 -0
  30. package/dist/types/src/execution-graph.test.d.ts +2 -0
  31. package/dist/types/src/execution-graph.test.d.ts.map +1 -0
  32. package/dist/types/src/extraction/extraction-llm-function/extraction-llm-function.d.ts +1 -1
  33. package/dist/types/src/extraction/extraction-llm-function/extraction-llm-function.d.ts.map +1 -1
  34. package/dist/types/src/extraction/extraction-ner-function/extraction-ner-function.d.ts +258 -213
  35. package/dist/types/src/extraction/extraction-ner-function/extraction-ner-function.d.ts.map +1 -1
  36. package/dist/types/src/extraction/extraction-ner-function/named-entity-recognition.d.ts.map +1 -1
  37. package/dist/types/src/extraction/extraction.d.ts +345 -270
  38. package/dist/types/src/extraction/extraction.d.ts.map +1 -1
  39. package/dist/types/src/extraction/quotes.d.ts +3 -3
  40. package/dist/types/src/extraction/quotes.d.ts.map +1 -1
  41. package/dist/types/src/functions/services.d.ts +17 -4
  42. package/dist/types/src/functions/services.d.ts.map +1 -1
  43. package/dist/types/src/functions.test.d.ts +2 -0
  44. package/dist/types/src/functions.test.d.ts.map +1 -0
  45. package/dist/types/src/index.d.ts +3 -3
  46. package/dist/types/src/index.d.ts.map +1 -1
  47. package/dist/types/src/session/GenericToolkit.d.ts +107 -0
  48. package/dist/types/src/session/GenericToolkit.d.ts.map +1 -0
  49. package/dist/types/src/session/artifact-diff.d.ts +27 -0
  50. package/dist/types/src/session/artifact-diff.d.ts.map +1 -0
  51. package/dist/types/src/session/error-handling.d.ts +4 -0
  52. package/dist/types/src/session/error-handling.d.ts.map +1 -0
  53. package/dist/types/src/session/format.d.ts +12 -0
  54. package/dist/types/src/session/format.d.ts.map +1 -0
  55. package/dist/types/src/session/format.test.d.ts +2 -0
  56. package/dist/types/src/session/format.test.d.ts.map +1 -0
  57. package/dist/types/src/session/index.d.ts +5 -0
  58. package/dist/types/src/session/index.d.ts.map +1 -1
  59. package/dist/types/src/session/observer.d.ts +23 -0
  60. package/dist/types/src/session/observer.d.ts.map +1 -0
  61. package/dist/types/src/session/session.d.ts +38 -237
  62. package/dist/types/src/session/session.d.ts.map +1 -1
  63. package/dist/types/src/session/toolkit.d.ts +14 -0
  64. package/dist/types/src/session/toolkit.d.ts.map +1 -0
  65. package/dist/types/src/session/version-pin.d.ts +4 -4
  66. package/dist/types/src/session/version-pin.d.ts.map +1 -1
  67. package/dist/types/src/templates/index.d.ts +1 -1
  68. package/dist/types/src/templates/system.d.ts +18 -0
  69. package/dist/types/src/templates/system.d.ts.map +1 -0
  70. package/dist/types/src/testing/index.d.ts +1 -2
  71. package/dist/types/src/testing/index.d.ts.map +1 -1
  72. package/dist/types/src/testing/layer.d.ts +22 -0
  73. package/dist/types/src/testing/layer.d.ts.map +1 -0
  74. package/dist/types/src/types/artifact.d.ts +28 -0
  75. package/dist/types/src/types/artifact.d.ts.map +1 -0
  76. package/dist/types/src/types/index.d.ts +2 -0
  77. package/dist/types/src/types/index.d.ts.map +1 -0
  78. package/dist/types/tsconfig.tsbuildinfo +1 -1
  79. package/package.json +56 -35
  80. package/src/conversation/context.test.ts +46 -0
  81. package/src/conversation/context.ts +330 -0
  82. package/src/conversation/conversation.test.ts +65 -0
  83. package/src/conversation/conversation.ts +179 -65
  84. package/src/conversation/index.ts +1 -0
  85. package/src/diff.test.ts +74 -0
  86. package/src/diff.ts +93 -0
  87. package/src/errors.ts +6 -1
  88. package/src/execution-graph.test.ts +740 -0
  89. package/src/execution-graph.ts +509 -0
  90. package/src/extraction/extraction-llm-function/extraction-llm-function.test.ts +10 -9
  91. package/src/extraction/extraction-llm-function/extraction-llm-function.ts +48 -56
  92. package/src/extraction/extraction-ner-function/extraction-ner-function.test.ts +23 -22
  93. package/src/extraction/extraction-ner-function/extraction-ner-function.ts +42 -43
  94. package/src/extraction/extraction-ner-function/named-entity-recognition.test.ts +12 -6
  95. package/src/extraction/extraction-ner-function/named-entity-recognition.ts +2 -0
  96. package/src/extraction/extraction.ts +10 -9
  97. package/src/extraction/quotes.test.ts +3 -3
  98. package/src/extraction/quotes.ts +6 -7
  99. package/src/functions/services.ts +147 -99
  100. package/src/functions.conversations.json +1 -0
  101. package/src/functions.test.ts +74 -0
  102. package/src/index.ts +3 -3
  103. package/src/session/GenericToolkit.ts +160 -0
  104. package/src/session/artifact-diff.ts +41 -0
  105. package/src/session/error-handling.ts +41 -0
  106. package/src/session/format.test.ts +124 -0
  107. package/src/session/format.ts +143 -0
  108. package/src/session/index.ts +6 -0
  109. package/src/session/observer.ts +61 -0
  110. package/src/session/session.conversations.json +1 -0
  111. package/src/session/session.test.ts +52 -199
  112. package/src/session/session.ts +165 -250
  113. package/src/session/toolkit.ts +39 -0
  114. package/src/session/version-pin.ts +8 -8
  115. package/src/templates/index.ts +1 -1
  116. package/src/templates/instructions/format.tpl +57 -0
  117. package/src/templates/instructions/system.tpl +48 -0
  118. package/src/templates/system.ts +41 -0
  119. package/src/testing/index.ts +2 -8
  120. package/src/testing/layer.ts +84 -0
  121. package/src/types/artifact.ts +89 -0
  122. package/src/types/index.ts +5 -0
  123. package/src/typings.d.ts +5 -0
  124. package/dist/lib/browser/index.mjs +0 -1831
  125. package/dist/lib/browser/index.mjs.map +0 -7
  126. package/dist/lib/browser/meta.json +0 -1
  127. package/dist/lib/node-esm/index.mjs +0 -1833
  128. package/dist/lib/node-esm/index.mjs.map +0 -7
  129. package/dist/lib/node-esm/meta.json +0 -1
  130. package/dist/types/bin/chat.d.ts +0 -2
  131. package/dist/types/bin/chat.d.ts.map +0 -1
  132. package/dist/types/src/context/binder.d.ts +0 -34
  133. package/dist/types/src/context/binder.d.ts.map +0 -1
  134. package/dist/types/src/context/binding.d.ts +0 -56
  135. package/dist/types/src/context/binding.d.ts.map +0 -1
  136. package/dist/types/src/context/index.d.ts +0 -3
  137. package/dist/types/src/context/index.d.ts.map +0 -1
  138. package/dist/types/src/research/exa.d.ts +0 -12
  139. package/dist/types/src/research/exa.d.ts.map +0 -1
  140. package/dist/types/src/research/graph.d.ts +0 -51
  141. package/dist/types/src/research/graph.d.ts.map +0 -1
  142. package/dist/types/src/research/graph.test.d.ts +0 -2
  143. package/dist/types/src/research/graph.test.d.ts.map +0 -1
  144. package/dist/types/src/research/index.d.ts +0 -4
  145. package/dist/types/src/research/index.d.ts.map +0 -1
  146. package/dist/types/src/research/research.d.ts +0 -10
  147. package/dist/types/src/research/research.d.ts.map +0 -1
  148. package/dist/types/src/research/research.test.d.ts +0 -2
  149. package/dist/types/src/research/research.test.d.ts.map +0 -1
  150. package/dist/types/src/session/version-pin.test.d.ts +0 -2
  151. package/dist/types/src/session/version-pin.test.d.ts.map +0 -1
  152. package/dist/types/src/summarization/summarization.test.d.ts +0 -2
  153. package/dist/types/src/summarization/summarization.test.d.ts.map +0 -1
  154. package/dist/types/src/templates/prompt.d.ts +0 -30
  155. package/dist/types/src/templates/prompt.d.ts.map +0 -1
  156. package/dist/types/src/testing/exa-search-1748337321991.d.ts +0 -38
  157. package/dist/types/src/testing/exa-search-1748337321991.d.ts.map +0 -1
  158. package/dist/types/src/testing/exa-search-1748337331526.d.ts +0 -37
  159. package/dist/types/src/testing/exa-search-1748337331526.d.ts.map +0 -1
  160. package/dist/types/src/testing/exa-search-1748337344119.d.ts +0 -58
  161. package/dist/types/src/testing/exa-search-1748337344119.d.ts.map +0 -1
  162. package/dist/types/src/types.d.ts +0 -13
  163. package/dist/types/src/types.d.ts.map +0 -1
  164. package/src/context/binder.ts +0 -103
  165. package/src/context/binding.ts +0 -32
  166. package/src/context/index.ts +0 -6
  167. package/src/research/exa.ts +0 -97
  168. package/src/research/graph.test.ts +0 -64
  169. package/src/research/graph.ts +0 -369
  170. package/src/research/index.ts +0 -7
  171. package/src/research/instructions-research.tpl +0 -98
  172. package/src/research/research.test.ts +0 -190
  173. package/src/research/research.ts +0 -87
  174. package/src/session/__snapshots__/session.test.ts.snap +0 -32
  175. package/src/session/version-pin.test.ts +0 -7
  176. package/src/summarization/summarization.test.ts +0 -208
  177. package/src/templates/assistant.tpl +0 -111
  178. package/src/templates/prompt.ts +0 -45
  179. package/src/testing/exa-search-1748337321991.ts +0 -131
  180. package/src/testing/exa-search-1748337331526.ts +0 -144
  181. package/src/testing/exa-search-1748337344119.ts +0 -133
  182. package/src/typedefs.d.ts +0 -8
  183. package/src/types.ts +0 -47
  184. /package/src/extraction/extraction-llm-function/{instructions.tpl → transcription-instructions.tpl} +0 -0
@@ -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,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,604 @@
1
+ import {
2
+ __export
3
+ } from "./chunk-J5LGTIGS.mjs";
4
+
5
+ // src/session/artifact-diff.ts
6
+ import * as Context from "effect/Context";
7
+ var ArtifactDiffResolver = class extends Context.Tag("@dxos/assistant/ArtifactDiffResolver")() {
8
+ };
9
+
10
+ // src/session/observer.ts
11
+ import * as Effect from "effect/Effect";
12
+ import * as Function from "effect/Function";
13
+ var GenerationObserver = Object.freeze({
14
+ make: ({ onBegin = Function.constant(Effect.void), onPart = Function.constant(Effect.void), onBlock = Function.constant(Effect.void), onEnd = Function.constant(Effect.void), onMessage = Function.constant(Effect.void) } = {}) => ({
15
+ onBegin,
16
+ onPart,
17
+ onBlock,
18
+ onEnd,
19
+ onMessage
20
+ }),
21
+ noop: () => GenerationObserver.make(),
22
+ /**
23
+ * Debug printer to be used in unit-tests and browser devtools.
24
+ */
25
+ fromPrinter: (printer) => GenerationObserver.make({
26
+ onBlock: (block) => Effect.sync(() => {
27
+ if (block.pending) {
28
+ return;
29
+ }
30
+ printer.printContentBlock(block);
31
+ }),
32
+ onMessage: (message) => Effect.sync(() => {
33
+ if (message.sender.role === "assistant") {
34
+ return;
35
+ }
36
+ printer.printMessage(message);
37
+ })
38
+ })
39
+ });
40
+
41
+ // src/errors.ts
42
+ import { BaseError } from "@dxos/errors";
43
+ var AiModelError = class extends BaseError.extend("AiModelError", "AI model error") {
44
+ };
45
+ var AiAssistantError = class extends BaseError.extend("AiAssistantError", "AI assistant error") {
46
+ };
47
+
48
+ // src/session/format.ts
49
+ import * as Effect2 from "effect/Effect";
50
+ import * as Function2 from "effect/Function";
51
+ import * as Option from "effect/Option";
52
+ import { Template } from "@dxos/blueprints";
53
+ import { Obj } from "@dxos/echo";
54
+ import { ObjectVersion } from "@dxos/echo-db";
55
+ import { log } from "@dxos/log";
56
+ import { Message } from "@dxos/types";
57
+ import { trim } from "@dxos/util";
58
+ var __dxlog_file = "/__w/dxos/dxos/packages/core/assistant/src/session/format.ts";
59
+ var formatSystemPrompt = ({ system, blueprints = [], objects = [] }) => Effect2.gen(function* () {
60
+ const blueprintDefs = yield* Function2.pipe(blueprints, Effect2.forEach((blueprint) => Effect2.succeed(blueprint.instructions)), Effect2.flatMap(Effect2.forEach((template) => Effect2.gen(function* () {
61
+ return trim`
62
+ <blueprint>
63
+ ${yield* Template.processTemplate(template)}
64
+ </blueprint>
65
+ `;
66
+ }))), Effect2.map((blueprints2) => blueprints2.length > 0 ? [
67
+ "## Blueprints Definitions",
68
+ ...blueprints2
69
+ ].join("\n\n") : void 0));
70
+ const objectDefs = yield* Function2.pipe(objects, Effect2.forEach((object) => Effect2.succeed(trim`
71
+ <object>
72
+ <dxn>${Obj.getDXN(object)}</dxn>
73
+ <typename>${Obj.getTypename(object)}</typename>
74
+ </object>
75
+ `)), Effect2.map((objects2) => objects2.length > 0 ? [
76
+ "## Context Objects",
77
+ ...objects2
78
+ ].join("\n\n") : void 0));
79
+ return yield* Function2.pipe(Effect2.succeed([
80
+ system,
81
+ blueprintDefs,
82
+ objectDefs
83
+ ].filter((def) => def !== void 0)), Effect2.map((parts) => parts.join("\n\n")));
84
+ });
85
+ var formatUserPrompt = ({ prompt, history = [] }) => Effect2.gen(function* () {
86
+ const blocks = [];
87
+ const artifactDiffResolver = yield* Effect2.serviceOption(ArtifactDiffResolver);
88
+ if (Option.isSome(artifactDiffResolver)) {
89
+ const versions = gatherObjectVersions(history);
90
+ const artifactDiff = yield* Effect2.tryPromise({
91
+ try: () => artifactDiffResolver.value.resolve([
92
+ ...versions.entries()
93
+ ].map(([id, version]) => ({
94
+ id,
95
+ lastVersion: version
96
+ }))),
97
+ catch: AiAssistantError.wrap({
98
+ message: "Artifact diff resolution error"
99
+ })
100
+ });
101
+ log("version", {
102
+ artifactDiff,
103
+ versions
104
+ }, {
105
+ F: __dxlog_file,
106
+ L: 94,
107
+ S: this,
108
+ C: (f, a) => f(...a)
109
+ });
110
+ for (const [id, { version }] of [
111
+ ...artifactDiff.entries()
112
+ ]) {
113
+ if (ObjectVersion.equals(version, versions.get(id))) {
114
+ artifactDiff.delete(id);
115
+ continue;
116
+ }
117
+ blocks.push({
118
+ _tag: "anchor",
119
+ objectId: id,
120
+ version
121
+ });
122
+ }
123
+ if (artifactDiff.size > 0) {
124
+ blocks.push(createArtifactUpdateBlock(artifactDiff));
125
+ }
126
+ }
127
+ return Obj.make(Message.Message, {
128
+ created: (/* @__PURE__ */ new Date()).toISOString(),
129
+ sender: {
130
+ role: "user"
131
+ },
132
+ blocks: [
133
+ ...blocks,
134
+ {
135
+ _tag: "text",
136
+ text: prompt
137
+ }
138
+ ]
139
+ });
140
+ });
141
+ var gatherObjectVersions = (messages) => {
142
+ const artifactIds = /* @__PURE__ */ new Map();
143
+ for (const message of messages) {
144
+ for (const block of message.blocks) {
145
+ if (block._tag === "anchor") {
146
+ artifactIds.set(block.objectId, block.version);
147
+ }
148
+ }
149
+ }
150
+ return artifactIds;
151
+ };
152
+ var createArtifactUpdateBlock = (artifactDiff) => {
153
+ return {
154
+ _tag: "text",
155
+ // TODO(dmaretskyi): Does this need to be a special content-block?
156
+ disposition: "artifact-update",
157
+ text: trim`
158
+ The following artifacts have been updated since the last message:
159
+ ${[
160
+ ...artifactDiff.entries()
161
+ ].map(([id, { diff }]) => `<changed-artifact id="${id}">${diff ? `
162
+ ${diff}` : ""}</changed-artifact>`).join("\n")}
163
+ `
164
+ };
165
+ };
166
+
167
+ // src/session/session.ts
168
+ import * as LanguageModel from "@effect/ai/LanguageModel";
169
+ import * as Chunk from "effect/Chunk";
170
+ import * as Effect3 from "effect/Effect";
171
+ import * as Stream from "effect/Stream";
172
+ import { AiParser, AiPreprocessor, callTool, withoutToolCallParising } from "@dxos/ai";
173
+ import { todo } from "@dxos/debug";
174
+ import { Obj as Obj2 } from "@dxos/echo";
175
+ import { TracingService } from "@dxos/functions";
176
+ import { log as log2 } from "@dxos/log";
177
+ import { Message as Message2 } from "@dxos/types";
178
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/core/assistant/src/session/session.ts";
179
+ var AiSession = class {
180
+ _options;
181
+ /** Prevents concurrent execution of session. */
182
+ _semaphore = Effect3.runSync(Effect3.makeSemaphore(1));
183
+ /** Message history from queue. */
184
+ // TODO(burdon): Evolve into supporting a git-like graph of messages.
185
+ _history = [];
186
+ /** Pending messages for this session (incl. the current prompt). */
187
+ _pending = [];
188
+ _started = 0;
189
+ _ended = 0;
190
+ _toolCalls = 0;
191
+ constructor(_options = {}) {
192
+ this._options = _options;
193
+ }
194
+ get duration() {
195
+ return this._ended - this._started;
196
+ }
197
+ get toolCalls() {
198
+ return this._toolCalls;
199
+ }
200
+ run = ({ prompt, system: systemTemplate, history = [], objects = [], blueprints = [], toolkit, observer = GenerationObserver.noop(), onOutput = () => Effect3.void }) => Effect3.gen(this, function* () {
201
+ this._started = Date.now();
202
+ this._history = [
203
+ ...history
204
+ ];
205
+ this._pending = [];
206
+ const pending = this._pending;
207
+ const submitMessage = Effect3.fnUntraced(function* (message) {
208
+ pending.push(message);
209
+ yield* observer.onMessage(message);
210
+ yield* TracingService.emitConverationMessage(message);
211
+ yield* onOutput(message);
212
+ return message;
213
+ });
214
+ const promptMessage = yield* submitMessage(yield* formatUserPrompt({
215
+ prompt,
216
+ history
217
+ }));
218
+ const system = yield* formatSystemPrompt({
219
+ system: systemTemplate,
220
+ blueprints,
221
+ objects
222
+ }).pipe(Effect3.orDie);
223
+ do {
224
+ log2("request", {
225
+ prompt: promptMessage,
226
+ system: {
227
+ snippet: createSnippet(system),
228
+ length: system.length
229
+ },
230
+ pending: this._pending.length,
231
+ history: this._history.length,
232
+ objects: objects?.length ?? 0
233
+ }, {
234
+ F: __dxlog_file2,
235
+ L: 132,
236
+ S: this,
237
+ C: (f, a) => f(...a)
238
+ });
239
+ const prompt2 = yield* AiPreprocessor.preprocessPrompt([
240
+ ...this._history,
241
+ ...this._pending
242
+ ], {
243
+ system,
244
+ cacheControl: "ephemeral"
245
+ });
246
+ const messages = yield* LanguageModel.streamText({
247
+ prompt: prompt2,
248
+ toolkit,
249
+ disableToolCallResolution: true
250
+ }).pipe(
251
+ // Disable tool call parsing so that we can handle parameter schema errors on a per-tool call basis.
252
+ withoutToolCallParising,
253
+ // TOOD(dmaretskyi): Error mapping.
254
+ AiParser.parseResponse({
255
+ onBegin: () => observer.onBegin(),
256
+ onBlock: (block) => observer.onBlock(block),
257
+ onPart: (part) => observer.onPart(part),
258
+ onEnd: (summary) => observer.onEnd(summary)
259
+ }),
260
+ Stream.mapEffect((block) => Effect3.gen(function* () {
261
+ return yield* submitMessage(Obj2.make(Message2.Message, {
262
+ created: (/* @__PURE__ */ new Date()).toISOString(),
263
+ sender: {
264
+ role: "assistant"
265
+ },
266
+ blocks: [
267
+ block
268
+ ]
269
+ }));
270
+ })),
271
+ Stream.runCollect,
272
+ Effect3.map(Chunk.toArray)
273
+ );
274
+ const toolCalls = messages.flatMap((message) => message.blocks.filter((block) => block._tag === "toolCall" && block.providerExecuted === false).map((block) => ({
275
+ block,
276
+ message
277
+ })));
278
+ if (toolCalls.length === 0) {
279
+ break;
280
+ } else if (!toolkit) {
281
+ throw new Error("No toolkit provided");
282
+ }
283
+ const toolResults = yield* Effect3.forEach(toolCalls, ({ block, message }) => {
284
+ return callTool(toolkit, block).pipe(Effect3.provide(TracingService.layerSubframe((context) => ({
285
+ ...context,
286
+ parentMessage: message.id,
287
+ toolCallId: block.toolCallId
288
+ }))));
289
+ });
290
+ yield* submitMessage(Obj2.make(Message2.Message, {
291
+ created: (/* @__PURE__ */ new Date()).toISOString(),
292
+ sender: {
293
+ role: "tool"
294
+ },
295
+ blocks: toolResults
296
+ }));
297
+ this._toolCalls++;
298
+ } while (true);
299
+ this._ended = Date.now();
300
+ log2("done", {
301
+ pending: this._pending.length,
302
+ duration: this.duration,
303
+ tools: this._toolCalls
304
+ }, {
305
+ F: __dxlog_file2,
306
+ L: 219,
307
+ S: this,
308
+ C: (f, a) => f(...a)
309
+ });
310
+ return this._pending;
311
+ }).pipe(this._semaphore.withPermits(1), Effect3.withSpan("AiSession.run"));
312
+ /**
313
+ * @deprecated
314
+ */
315
+ // TODO(burdon): Implement or remove.
316
+ async runStructured(_schema, _options) {
317
+ return todo();
318
+ }
319
+ };
320
+ var createSnippet = (text, len = 32) => text.length <= len * 2 ? text : [
321
+ text.slice(0, len),
322
+ "...",
323
+ text.slice(-len)
324
+ ].join("");
325
+
326
+ // src/session/toolkit.ts
327
+ import * as Toolkit from "@effect/ai/Toolkit";
328
+ import * as Effect4 from "effect/Effect";
329
+ import { ToolExecutionService, ToolResolverService } from "@dxos/ai";
330
+ import { isTruthy } from "@dxos/util";
331
+ var createToolkit = ({ toolkit: toolkitProp, blueprints = [] }) => Effect4.gen(function* () {
332
+ const blueprintToolkit = yield* ToolResolverService.resolveToolkit(blueprints.flatMap(({ tools }) => tools));
333
+ const blueprintToolHandler = yield* blueprintToolkit.toContext(ToolExecutionService.handlersFor(blueprintToolkit));
334
+ const toolkit = Toolkit.merge(...[
335
+ toolkitProp,
336
+ blueprintToolkit
337
+ ].filter(isTruthy));
338
+ return yield* toolkit.pipe(Effect4.provide(blueprintToolHandler));
339
+ });
340
+
341
+ // src/session/version-pin.ts
342
+ import * as Schema from "effect/Schema";
343
+ import { getVersion } from "@dxos/echo-db";
344
+ import { ObjectId } from "@dxos/keys";
345
+ var ObjectVersionSchema = Schema.Unknown;
346
+ var VersionPinSchema = Schema.Struct({
347
+ // TODO(dmaretskyi): Use Ref when those support encoding.
348
+ objectId: ObjectId,
349
+ // TODO(dmaretskyi): Could be opaque.
350
+ version: ObjectVersionSchema
351
+ });
352
+ var VersionPin = class extends VersionPinSchema {
353
+ static DISPOSITION = "version-pin";
354
+ static fromObject(object) {
355
+ return VersionPin.make({
356
+ objectId: object.id,
357
+ version: getVersion(object)
358
+ });
359
+ }
360
+ static createBlock(pin) {
361
+ return {
362
+ _tag: "json",
363
+ disposition: VersionPin.DISPOSITION,
364
+ data: JSON.stringify(pin)
365
+ };
366
+ }
367
+ };
368
+
369
+ // src/session/GenericToolkit.ts
370
+ var GenericToolkit_exports = {};
371
+ __export(GenericToolkit_exports, {
372
+ Provider: () => Provider,
373
+ TypeId: () => TypeId,
374
+ empty: () => empty3,
375
+ make: () => make,
376
+ merge: () => merge3,
377
+ providerEmpty: () => providerEmpty,
378
+ providerLayer: () => providerLayer
379
+ });
380
+ import * as Toolkit2 from "@effect/ai/Toolkit";
381
+ import * as Context2 from "effect/Context";
382
+ import * as Effect5 from "effect/Effect";
383
+ import * as Layer from "effect/Layer";
384
+ import * as Pipeable from "effect/Pipeable";
385
+ var TypeId = "~@dxos/assistant/GenericToolkit";
386
+ var make = (toolkit, layer) => {
387
+ return {
388
+ [TypeId]: TypeId,
389
+ toolkit,
390
+ layer,
391
+ handlers: toolkit.pipe(Effect5.provide(layer)),
392
+ pipe() {
393
+ return Pipeable.pipeArguments(this, arguments);
394
+ }
395
+ };
396
+ };
397
+ var empty3 = make(Toolkit2.empty, Layer.empty);
398
+ var merge3 = (...toolkits) => {
399
+ return make(Toolkit2.merge(...toolkits.map((t) => t.toolkit)), Layer.mergeAll(...toolkits.map((t) => t.layer)));
400
+ };
401
+ var Provider = class extends Context2.Tag("@dxos/assistant/GenericToolkit.Provider")() {
402
+ };
403
+ var providerLayer = (toolkit) => Layer.succeed(Provider, {
404
+ getToolkit: () => toolkit
405
+ });
406
+ var providerEmpty = providerLayer(empty3);
407
+
408
+ // src/types/artifact.ts
409
+ import * as Schema2 from "effect/Schema";
410
+ import { Type } from "@dxos/echo";
411
+ import { Database } from "@dxos/echo";
412
+ import { EncodedReference } from "@dxos/echo-protocol";
413
+ import { DXN, LOCAL_SPACE_TAG } from "@dxos/keys";
414
+ import { trim as trim2 } from "@dxos/util";
415
+ var createArtifactElement = (id) => `<artifact id=${id} />`;
416
+ var ArtifactId = class extends Schema2.String.annotations({
417
+ // TODO(dmaretskyi): This section gets overriden.
418
+ description: trim2`
419
+ The ID of the referenced object. Formats accepted:
420
+ - DXN (dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4). DXNs can be prepended with an @ symbol for compatibility with in-text references.
421
+ - space ID, object ID tuple (spaceID:objectID)
422
+ - Only object ID that is assumed to be in the current space (01KG7R1ZXWFMWQ4DA1Q6TN1DG4)
423
+ `,
424
+ examples: [
425
+ "dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4",
426
+ "@dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4",
427
+ "BM3FSHFOMJCHCG5QW7JTVKGYABD2GAA7G:01KG7R1ZXWFMWQ4DA1Q6TN1DG4",
428
+ "01KG7R1ZXWFMWQ4DA1Q6TN1DG4"
429
+ ]
430
+ }) {
431
+ static toDXN(reference, owningSpaceId) {
432
+ if (reference.startsWith("@dxn:")) {
433
+ return DXN.parse(reference.slice(1));
434
+ } else if (reference.startsWith("dxn:")) {
435
+ return DXN.parse(reference);
436
+ } else if (/^[A-Z0-9]+:[A-Z0-9]+$/.test(reference)) {
437
+ const [spaceId, objectId] = reference.split(":");
438
+ return new DXN(DXN.kind.ECHO, [
439
+ spaceId === owningSpaceId ? LOCAL_SPACE_TAG : spaceId,
440
+ objectId
441
+ ]);
442
+ } else if (/^[A-Z0-9]+$/.test(reference)) {
443
+ return DXN.fromLocalObjectId(reference);
444
+ } else {
445
+ throw new Error(`Unable to parse object reference: ${reference}`);
446
+ }
447
+ }
448
+ /**
449
+ * Resolves an artifact ID to an object.
450
+ */
451
+ static resolve(schema, ref) {
452
+ const dxn = ArtifactId.toDXN(ref);
453
+ return Database.resolve(dxn, schema);
454
+ }
455
+ };
456
+ var RefFromLLM = Schema2.transform(ArtifactId, Type.Ref(Type.Obj), {
457
+ decode: (fromA, fromI) => EncodedReference.fromDXN(ArtifactId.toDXN(fromA)),
458
+ encode: (toI, toA) => EncodedReference.toDXN(toI).toString(),
459
+ strict: false
460
+ }).annotations({
461
+ description: ArtifactId.ast.annotations.description
462
+ });
463
+
464
+ // src/functions/services.ts
465
+ import * as Tool from "@effect/ai/Tool";
466
+ import * as Context3 from "effect/Context";
467
+ import * as Effect6 from "effect/Effect";
468
+ import * as Layer2 from "effect/Layer";
469
+ import * as Record from "effect/Record";
470
+ import * as Schema3 from "effect/Schema";
471
+ import { AiToolNotFoundError, ToolExecutionService as ToolExecutionService2, ToolResolverService as ToolResolverService2 } from "@dxos/ai";
472
+ import { todo as todo2 } from "@dxos/debug";
473
+ import { Type as Type2 } from "@dxos/echo";
474
+ import { FunctionInvocationService } from "@dxos/functions";
475
+ import { invariant } from "@dxos/invariant";
476
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/core/assistant/src/functions/services.ts";
477
+ var makeToolResolverFromFunctions = () => {
478
+ return Layer2.effect(ToolResolverService2, Effect6.gen(function* () {
479
+ const toolkitProvider = yield* GenericToolkit_exports.Provider;
480
+ const functionInvocationService = yield* FunctionInvocationService;
481
+ return {
482
+ resolve: (id) => Effect6.gen(function* () {
483
+ const toolkit = toolkitProvider.getToolkit();
484
+ const tool = toolkit.toolkit.tools[id];
485
+ if (tool) {
486
+ return tool;
487
+ }
488
+ return yield* functionInvocationService.resolveFunction(id).pipe(Effect6.map(projectFunctionToTool), Effect6.catchTag("FunctionNotFound", () => Effect6.fail(new AiToolNotFoundError(id))));
489
+ })
490
+ };
491
+ }));
492
+ };
493
+ var makeToolExecutionServiceFromFunctions = () => {
494
+ return Layer2.effect(ToolExecutionService2, Effect6.gen(function* () {
495
+ const toolkitProvider = yield* GenericToolkit_exports.Provider;
496
+ const toolkit = toolkitProvider.getToolkit();
497
+ const toolkitHandler = yield* toolkit.toolkit.pipe(Effect6.provide(toolkit.layer));
498
+ invariant(isHandlerLike(toolkitHandler), void 0, {
499
+ F: __dxlog_file3,
500
+ L: 76,
501
+ S: this,
502
+ A: [
503
+ "isHandlerLike(toolkitHandler)",
504
+ ""
505
+ ]
506
+ });
507
+ const functionInvocationService = yield* FunctionInvocationService;
508
+ return {
509
+ handlersFor: (toolkit2) => {
510
+ const makeHandler = (tool) => {
511
+ return Effect6.fn(`toolFunctionHandler ${tool.name}`)(function* (input) {
512
+ if (toolkitHandler.tools[tool.name]) {
513
+ if (Tool.isProviderDefined(tool)) {
514
+ throw new Error("Attempted to call a provider-defined tool");
515
+ }
516
+ const { result } = yield* toolkitHandler.handle(tool.name, input);
517
+ return result;
518
+ }
519
+ const { definition: functionDef } = Context3.get(FunctionToolAnnotation)(tool.annotations);
520
+ return yield* functionInvocationService.invokeFunction(functionDef, input).pipe(Effect6.catchAllDefect((defect) => Effect6.fail(defect)));
521
+ });
522
+ };
523
+ return toolkit2.of(Record.map(toolkit2.tools, (tool, _name) => Tool.isUserDefined(tool) ? makeHandler(tool) : null));
524
+ }
525
+ };
526
+ }));
527
+ };
528
+ var ToolExecutionServices = Layer2.mergeAll(makeToolResolverFromFunctions(), makeToolExecutionServiceFromFunctions());
529
+ var FunctionToolAnnotation = class extends Context3.Tag("@dxos/assistant/FunctionToolAnnotation")() {
530
+ };
531
+ var toolCache = /* @__PURE__ */ new WeakMap();
532
+ var projectFunctionToTool = (fn2) => {
533
+ if (toolCache.has(fn2)) {
534
+ return toolCache.get(fn2);
535
+ }
536
+ const tool = Tool.make(makeToolName(fn2.name), {
537
+ description: fn2.description,
538
+ parameters: createStructFieldsFromSchema(fn2.inputSchema),
539
+ // TODO(dmaretskyi): Include output schema.
540
+ failure: Schema3.Any
541
+ }).annotate(FunctionToolAnnotation, {
542
+ definition: fn2
543
+ });
544
+ toolCache.set(fn2, tool);
545
+ return tool;
546
+ };
547
+ var makeToolName = (name) => {
548
+ const toolName = name.toLowerCase().replace(/[^a-zA-Z0-9]/g, "-");
549
+ invariant(toolName.match(/^[a-z_][a-z0-9-_]*$/), void 0, {
550
+ F: __dxlog_file3,
551
+ L: 152,
552
+ S: void 0,
553
+ A: [
554
+ "toolName.match(/^[a-z_][a-z0-9-_]*$/)",
555
+ ""
556
+ ]
557
+ });
558
+ return toolName;
559
+ };
560
+ var createStructFieldsFromSchema = (schema) => {
561
+ switch (schema.ast._tag) {
562
+ case "TypeLiteral":
563
+ return Object.fromEntries(schema.ast.propertySignatures.map((prop) => [
564
+ prop.name,
565
+ Schema3.make(mapSchemaTypeForLLM(prop.type))
566
+ ]));
567
+ case "VoidKeyword":
568
+ return {};
569
+ default:
570
+ return todo2(`Unsupported schema AST: ${schema.ast._tag}`);
571
+ }
572
+ };
573
+ var mapSchemaTypeForLLM = (ast) => {
574
+ if (Type2.Ref.isRefSchemaAST(ast)) {
575
+ const description = ast.annotations.description ? ast.annotations.description + "\n" + RefFromLLM.ast.annotations.description : RefFromLLM.ast.annotations.description;
576
+ return RefFromLLM.annotations({
577
+ description
578
+ }).ast;
579
+ }
580
+ return ast;
581
+ };
582
+ var isHandlerLike = (value) => {
583
+ return typeof value.tools === "object" && typeof value.handle === "function";
584
+ };
585
+
586
+ export {
587
+ ArtifactDiffResolver,
588
+ GenerationObserver,
589
+ AiModelError,
590
+ AiAssistantError,
591
+ formatSystemPrompt,
592
+ formatUserPrompt,
593
+ AiSession,
594
+ createToolkit,
595
+ VersionPin,
596
+ GenericToolkit_exports,
597
+ createArtifactElement,
598
+ ArtifactId,
599
+ RefFromLLM,
600
+ makeToolResolverFromFunctions,
601
+ makeToolExecutionServiceFromFunctions,
602
+ ToolExecutionServices
603
+ };
604
+ //# sourceMappingURL=chunk-QBD6NQJK.mjs.map