@dxos/assistant 0.8.4-main.ead640a → 0.8.4-main.ef1bc66f44

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