@dxos/assistant 0.8.2-main.fbd8ed0 → 0.8.2-staging.7ac8446

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 (175) hide show
  1. package/dist/lib/browser/{chunk-B4HAWUFW.mjs → chunk-PND5VR6D.mjs} +286 -757
  2. package/dist/lib/browser/chunk-PND5VR6D.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +324 -7
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +102 -139
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node/{chunk-NOB7CIIC.cjs → chunk-IBOBRBDF.cjs} +303 -768
  9. package/dist/lib/node/chunk-IBOBRBDF.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +353 -36
  11. package/dist/lib/node/index.cjs.map +4 -4
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/testing/index.cjs +93 -128
  14. package/dist/lib/node/testing/index.cjs.map +4 -4
  15. package/dist/lib/node-esm/{chunk-SAWYU3V5.mjs → chunk-DCQJOLSR.mjs} +286 -757
  16. package/dist/lib/node-esm/chunk-DCQJOLSR.mjs.map +7 -0
  17. package/dist/lib/node-esm/index.mjs +324 -7
  18. package/dist/lib/node-esm/index.mjs.map +4 -4
  19. package/dist/lib/node-esm/meta.json +1 -1
  20. package/dist/lib/node-esm/testing/index.mjs +102 -139
  21. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  22. package/dist/types/src/ai-service/edge-client.d.ts +5 -4
  23. package/dist/types/src/ai-service/edge-client.d.ts.map +1 -1
  24. package/dist/types/src/ai-service/message-collector.d.ts +6 -0
  25. package/dist/types/src/ai-service/message-collector.d.ts.map +1 -1
  26. package/dist/types/src/ai-service/ollama-client.d.ts +2 -6
  27. package/dist/types/src/ai-service/ollama-client.d.ts.map +1 -1
  28. package/dist/types/src/ai-service/parser.d.ts +3 -0
  29. package/dist/types/src/ai-service/parser.d.ts.map +1 -1
  30. package/dist/types/src/ai-service/service.d.ts +2 -18
  31. package/dist/types/src/ai-service/service.d.ts.map +1 -1
  32. package/dist/types/src/ai-service/stream.d.ts.map +1 -1
  33. package/dist/types/src/ai-service/testing/mock.d.ts +2 -6
  34. package/dist/types/src/ai-service/testing/mock.d.ts.map +1 -1
  35. package/dist/types/src/ai-service/testing/test-stream.d.ts.map +1 -1
  36. package/dist/types/src/ai-service/types.d.ts +101 -144
  37. package/dist/types/src/ai-service/types.d.ts.map +1 -1
  38. package/dist/types/src/ai-service/util/sse.d.ts.map +1 -1
  39. package/dist/types/src/{experimental/conversation → conversation}/conversation.d.ts +21 -2
  40. package/dist/types/src/conversation/conversation.d.ts.map +1 -0
  41. package/dist/types/src/conversation/conversation.test.d.ts.map +1 -0
  42. package/dist/types/src/conversation/index.d.ts.map +1 -0
  43. package/dist/types/src/{experimental/conversation → conversation}/types.d.ts +12 -11
  44. package/dist/types/src/conversation/types.d.ts.map +1 -0
  45. package/dist/types/src/cypher/ast.d.ts.map +1 -0
  46. package/dist/types/src/cypher/combinators.d.ts.map +1 -0
  47. package/dist/types/src/cypher/combinators.test.d.ts.map +1 -0
  48. package/dist/types/src/cypher/echo-data-source.d.ts.map +1 -0
  49. package/dist/types/src/cypher/execution-plan.d.ts.map +1 -0
  50. package/dist/types/src/cypher/execution-plan.test.d.ts.map +1 -0
  51. package/dist/types/src/cypher/index.d.ts.map +1 -0
  52. package/dist/types/src/cypher/parjs.d.ts.map +1 -0
  53. package/dist/types/src/cypher/parser.d.ts.map +1 -0
  54. package/dist/types/src/cypher/query-executor.d.ts.map +1 -0
  55. package/dist/types/src/cypher/query-executor.test.d.ts.map +1 -0
  56. package/dist/types/src/cypher/schema.d.ts.map +1 -0
  57. package/dist/types/src/cypher/schema.test.d.ts.map +1 -0
  58. package/dist/types/src/index.d.ts +2 -1
  59. package/dist/types/src/index.d.ts.map +1 -1
  60. package/dist/types/src/session/index.d.ts +0 -2
  61. package/dist/types/src/session/index.d.ts.map +1 -1
  62. package/dist/types/src/session/session.d.ts +13 -33
  63. package/dist/types/src/session/session.d.ts.map +1 -1
  64. package/dist/types/src/testing/index.d.ts +0 -1
  65. package/dist/types/src/testing/index.d.ts.map +1 -1
  66. package/dist/types/src/testing/logger.d.ts +1 -1
  67. package/dist/types/src/testing/logger.d.ts.map +1 -1
  68. package/dist/types/src/testing/ollama.d.ts.map +1 -1
  69. package/dist/types/src/testing/query-promts.d.ts +4 -4
  70. package/dist/types/src/testing/query-promts.d.ts.map +1 -1
  71. package/dist/types/src/testing/test-data.d.ts +5 -5
  72. package/dist/types/src/testing/test-data.d.ts.map +1 -1
  73. package/dist/types/src/testing/test-schema.d.ts +23 -25
  74. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  75. package/dist/types/src/util/trim.d.ts.map +1 -1
  76. package/dist/types/tsconfig.tsbuildinfo +1 -1
  77. package/package.json +14 -20
  78. package/src/ai-service/client.test.ts +73 -55
  79. package/src/ai-service/edge-client.ts +20 -13
  80. package/src/ai-service/ollama-client.ts +10 -17
  81. package/src/ai-service/parser.ts +2 -13
  82. package/src/ai-service/service.ts +3 -19
  83. package/src/ai-service/testing/mock.ts +1 -9
  84. package/src/ai-service/types.ts +15 -24
  85. package/src/bin/chat.ts +4 -4
  86. package/src/{experimental/conversation → conversation}/conversation.test.ts +5 -5
  87. package/src/{experimental/conversation → conversation}/conversation.ts +119 -4
  88. package/src/{experimental/conversation → conversation}/types.ts +14 -11
  89. package/src/{experimental/cypher → cypher}/combinators.test.ts +4 -4
  90. package/src/{experimental/cypher → cypher}/echo-data-source.ts +11 -11
  91. package/src/{experimental/cypher → cypher}/execution-plan.test.ts +1 -1
  92. package/src/{experimental/cypher → cypher}/query-executor.test.ts +2 -2
  93. package/src/{experimental/cypher → cypher}/schema.test.ts +3 -3
  94. package/src/{experimental/cypher → cypher}/schema.ts +1 -1
  95. package/src/index.ts +2 -3
  96. package/src/session/index.ts +0 -2
  97. package/src/session/session.test.ts +63 -35
  98. package/src/session/session.ts +151 -297
  99. package/src/testing/artifacts.test.ts +22 -22
  100. package/src/testing/index.ts +0 -1
  101. package/src/testing/logger.ts +1 -1
  102. package/src/testing/query-promts.ts +6 -6
  103. package/src/testing/query.test.ts +21 -18
  104. package/src/testing/test-data.ts +72 -79
  105. package/src/testing/test-schema.ts +29 -28
  106. package/dist/lib/browser/chunk-B4HAWUFW.mjs.map +0 -7
  107. package/dist/lib/node/chunk-NOB7CIIC.cjs.map +0 -7
  108. package/dist/lib/node-esm/chunk-SAWYU3V5.mjs.map +0 -7
  109. package/dist/types/src/experimental/conversation/conversation.d.ts.map +0 -1
  110. package/dist/types/src/experimental/conversation/conversation.test.d.ts.map +0 -1
  111. package/dist/types/src/experimental/conversation/index.d.ts.map +0 -1
  112. package/dist/types/src/experimental/conversation/types.d.ts.map +0 -1
  113. package/dist/types/src/experimental/cypher/ast.d.ts.map +0 -1
  114. package/dist/types/src/experimental/cypher/combinators.d.ts.map +0 -1
  115. package/dist/types/src/experimental/cypher/combinators.test.d.ts.map +0 -1
  116. package/dist/types/src/experimental/cypher/echo-data-source.d.ts.map +0 -1
  117. package/dist/types/src/experimental/cypher/execution-plan.d.ts.map +0 -1
  118. package/dist/types/src/experimental/cypher/execution-plan.test.d.ts.map +0 -1
  119. package/dist/types/src/experimental/cypher/index.d.ts.map +0 -1
  120. package/dist/types/src/experimental/cypher/parjs.d.ts.map +0 -1
  121. package/dist/types/src/experimental/cypher/parser.d.ts.map +0 -1
  122. package/dist/types/src/experimental/cypher/query-executor.d.ts.map +0 -1
  123. package/dist/types/src/experimental/cypher/query-executor.test.d.ts.map +0 -1
  124. package/dist/types/src/experimental/cypher/schema.d.ts.map +0 -1
  125. package/dist/types/src/experimental/cypher/schema.test.d.ts.map +0 -1
  126. package/dist/types/src/experimental/index.d.ts +0 -3
  127. package/dist/types/src/experimental/index.d.ts.map +0 -1
  128. package/dist/types/src/experimental/ner/ner.test.d.ts +0 -2
  129. package/dist/types/src/experimental/ner/ner.test.d.ts.map +0 -1
  130. package/dist/types/src/experimental/research/exa.d.ts +0 -6
  131. package/dist/types/src/experimental/research/exa.d.ts.map +0 -1
  132. package/dist/types/src/experimental/research/research.test.d.ts +0 -2
  133. package/dist/types/src/experimental/research/research.test.d.ts.map +0 -1
  134. package/dist/types/src/session/tools.d.ts +0 -18
  135. package/dist/types/src/session/tools.d.ts.map +0 -1
  136. package/dist/types/src/session/version-pin.d.ts +0 -22
  137. package/dist/types/src/session/version-pin.d.ts.map +0 -1
  138. package/dist/types/src/session/version-pin.test.d.ts +0 -2
  139. package/dist/types/src/session/version-pin.test.d.ts.map +0 -1
  140. package/dist/types/src/testing/printer.d.ts +0 -6
  141. package/dist/types/src/testing/printer.d.ts.map +0 -1
  142. package/src/experimental/index.ts +0 -6
  143. package/src/experimental/ner/ner.test.ts +0 -163
  144. package/src/experimental/research/exa.ts +0 -38
  145. package/src/experimental/research/instructions.tpl +0 -64
  146. package/src/experimental/research/research.test.ts +0 -263
  147. package/src/session/tools.ts +0 -117
  148. package/src/session/version-pin.test.ts +0 -26
  149. package/src/session/version-pin.ts +0 -49
  150. package/src/testing/printer.ts +0 -41
  151. package/src/typedefs.d.ts +0 -8
  152. /package/dist/types/src/{experimental/conversation → conversation}/conversation.test.d.ts +0 -0
  153. /package/dist/types/src/{experimental/conversation → conversation}/index.d.ts +0 -0
  154. /package/dist/types/src/{experimental/cypher → cypher}/ast.d.ts +0 -0
  155. /package/dist/types/src/{experimental/cypher → cypher}/combinators.d.ts +0 -0
  156. /package/dist/types/src/{experimental/cypher → cypher}/combinators.test.d.ts +0 -0
  157. /package/dist/types/src/{experimental/cypher → cypher}/echo-data-source.d.ts +0 -0
  158. /package/dist/types/src/{experimental/cypher → cypher}/execution-plan.d.ts +0 -0
  159. /package/dist/types/src/{experimental/cypher → cypher}/execution-plan.test.d.ts +0 -0
  160. /package/dist/types/src/{experimental/cypher → cypher}/index.d.ts +0 -0
  161. /package/dist/types/src/{experimental/cypher → cypher}/parjs.d.ts +0 -0
  162. /package/dist/types/src/{experimental/cypher → cypher}/parser.d.ts +0 -0
  163. /package/dist/types/src/{experimental/cypher → cypher}/query-executor.d.ts +0 -0
  164. /package/dist/types/src/{experimental/cypher → cypher}/query-executor.test.d.ts +0 -0
  165. /package/dist/types/src/{experimental/cypher → cypher}/schema.d.ts +0 -0
  166. /package/dist/types/src/{experimental/cypher → cypher}/schema.test.d.ts +0 -0
  167. /package/src/{experimental/conversation → conversation}/index.ts +0 -0
  168. /package/src/{experimental/cypher → cypher}/ast.ts +0 -0
  169. /package/src/{experimental/cypher → cypher}/combinators.ts +0 -0
  170. /package/src/{experimental/cypher → cypher}/execution-plan.ts +0 -0
  171. /package/src/{experimental/cypher → cypher}/index.ts +0 -0
  172. /package/src/{experimental/cypher → cypher}/parjs-shims.d.ts +0 -0
  173. /package/src/{experimental/cypher → cypher}/parjs.ts +0 -0
  174. /package/src/{experimental/cypher → cypher}/parser.ts +0 -0
  175. /package/src/{experimental/cypher → cypher}/query-executor.ts +0 -0
@@ -7,7 +7,7 @@ import {
7
7
  formatJsonSchemaForLLM,
8
8
  formatNodeLabel,
9
9
  trim
10
- } from "../chunk-SAWYU3V5.mjs";
10
+ } from "../chunk-DCQJOLSR.mjs";
11
11
 
12
12
  // packages/experimental/assistant/src/testing/defs.ts
13
13
  var AI_SERVICE_ENDPOINT = {
@@ -143,48 +143,8 @@ var createTestOllamaClient = (options) => {
143
143
  });
144
144
  };
145
145
 
146
- // packages/experimental/assistant/src/testing/printer.ts
147
- import { inspect } from "node:util";
148
- var ConsolePrinter = class {
149
- constructor() {
150
- this.printMessage = (message) => {
151
- console.log(`${message.role.toUpperCase()}
152
- `);
153
- for (const content of message.content) {
154
- this.printContentBlock(content);
155
- }
156
- };
157
- this.printContentBlock = (content) => {
158
- switch (content.type) {
159
- case "text":
160
- console.log(content.text);
161
- break;
162
- case "tool_use":
163
- console.log(`\u2699\uFE0F [Tool Use] ${content.name} ${inspect(content.input, {
164
- depth: null,
165
- colors: true
166
- })}`);
167
- break;
168
- case "tool_result": {
169
- let data;
170
- try {
171
- data = JSON.parse(content.content);
172
- } catch {
173
- data = content.content;
174
- }
175
- console.log(`\u2699\uFE0F [Tool Result] ${content.toolUseId} ${inspect(data, {
176
- depth: null,
177
- colors: true
178
- })}`);
179
- break;
180
- }
181
- }
182
- };
183
- }
184
- };
185
-
186
146
  // packages/experimental/assistant/src/testing/query-promts.ts
187
- import { Schema } from "effect";
147
+ import { Schema as S } from "effect";
188
148
  import { defineTool, ToolResult } from "@dxos/artifact";
189
149
  import { toJsonSchema } from "@dxos/echo-schema";
190
150
  import { log } from "@dxos/log";
@@ -194,8 +154,8 @@ var createCypherTool = (dataSource, schemaTypes = []) => defineTool("dxos.org/ec
194
154
  description: "Query the ECHO graph database in cypher query language. Returns data from the database." + (schemaTypes.length > 0 ? `
195
155
 
196
156
  ${createSystemPrompt(schemaTypes)}` : ""),
197
- schema: Schema.Struct({
198
- query: Schema.String.annotations({
157
+ schema: S.Struct({
158
+ query: S.String.annotations({
199
159
  description: `
200
160
  A valid cypher query string to execute.
201
161
  Query must have one MATCH clause.
@@ -271,96 +231,96 @@ var createSystemPrompt = (schemaTypes) => trim`
271
231
 
272
232
  // packages/experimental/assistant/src/testing/test-data.ts
273
233
  import { raise } from "@dxos/debug";
274
- import { JSON_SCHEMA_ECHO_REF_ID, ObjectId, toJsonSchema as toJsonSchema2, Ref as RefImpl } from "@dxos/echo-schema";
234
+ import { JSON_SCHEMA_ECHO_REF_ID, ObjectId, toJsonSchema as toJsonSchema2 } from "@dxos/echo-schema";
275
235
  import { invariant } from "@dxos/invariant";
276
- import { live } from "@dxos/live-object";
236
+ import { create, makeRef } from "@dxos/live-object";
277
237
  var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/experimental/assistant/src/testing/test-data.ts";
278
238
  var seedTestData = (db) => {
279
- const contactRich = db.add(live(Contact, {
239
+ const contactRich = db.add(create(Contact, {
280
240
  name: "Rich"
281
241
  }));
282
- const contactJosiah = db.add(live(Contact, {
242
+ const contactJosiah = db.add(create(Contact, {
283
243
  name: "Josiah"
284
244
  }));
285
- const contactDima = db.add(live(Contact, {
245
+ const contactDima = db.add(create(Contact, {
286
246
  name: "Dima"
287
247
  }));
288
- const contactFred = db.add(live(Contact, {
248
+ const contactFred = db.add(create(Contact, {
289
249
  name: "Fred"
290
250
  }));
291
- const projectComposer = db.add(live(Project, {
251
+ const projectComposer = db.add(create(Project, {
292
252
  name: "Composer"
293
253
  }));
294
- const projectEcho = db.add(live(Project, {
254
+ const projectEcho = db.add(create(Project, {
295
255
  name: "ECHO"
296
256
  }));
297
- const projectDoodles = db.add(live(Project, {
257
+ const projectDoodles = db.add(create(Project, {
298
258
  name: "Doodles"
299
259
  }));
300
- const _taskComposer1 = db.add(live(Task, {
260
+ const _taskComposer1 = db.add(create(Task, {
301
261
  name: "Optimize startup performance",
302
- project: RefImpl.make(projectComposer),
303
- assignee: RefImpl.make(contactJosiah)
262
+ project: makeRef(projectComposer),
263
+ assignee: makeRef(contactJosiah)
304
264
  }));
305
- const _taskComposer2 = db.add(live(Task, {
265
+ const _taskComposer2 = db.add(create(Task, {
306
266
  name: "Create form builder",
307
- project: RefImpl.make(projectComposer),
308
- assignee: RefImpl.make(contactRich)
267
+ project: makeRef(projectComposer),
268
+ assignee: makeRef(contactRich)
309
269
  }));
310
- const _taskComposer3 = db.add(live(Task, {
270
+ const _taskComposer3 = db.add(create(Task, {
311
271
  name: "Add support for custom themes",
312
- project: RefImpl.make(projectComposer),
313
- assignee: RefImpl.make(contactJosiah)
272
+ project: makeRef(projectComposer),
273
+ assignee: makeRef(contactJosiah)
314
274
  }));
315
- const _taskComposer5 = db.add(live(Task, {
275
+ const _taskComposer5 = db.add(create(Task, {
316
276
  name: "Implement community plugin",
317
- project: RefImpl.make(projectComposer),
318
- assignee: RefImpl.make(contactFred)
277
+ project: makeRef(projectComposer),
278
+ assignee: makeRef(contactFred)
319
279
  }));
320
- const _taskComposer4 = db.add(live(Task, {
280
+ const _taskComposer4 = db.add(create(Task, {
321
281
  name: "Implement dark mode",
322
- project: RefImpl.make(projectComposer),
323
- assignee: RefImpl.make(contactRich)
282
+ project: makeRef(projectComposer),
283
+ assignee: makeRef(contactRich)
324
284
  }));
325
- const _taskEcho1 = db.add(live(Task, {
285
+ const _taskEcho1 = db.add(create(Task, {
326
286
  name: "Implement cypher query engine",
327
- project: RefImpl.make(projectEcho),
328
- assignee: RefImpl.make(contactDima)
287
+ project: makeRef(projectEcho),
288
+ assignee: makeRef(contactDima)
329
289
  }));
330
- const _taskEcho2 = db.add(live(Task, {
290
+ const _taskEcho2 = db.add(create(Task, {
331
291
  name: "Add schema editor",
332
- project: RefImpl.make(projectEcho),
333
- assignee: RefImpl.make(contactRich)
292
+ project: makeRef(projectEcho),
293
+ assignee: makeRef(contactRich)
334
294
  }));
335
- const _taskDoodles1 = db.add(live(Task, {
295
+ const _taskDoodles1 = db.add(create(Task, {
336
296
  name: "Add support for custom themes",
337
- project: RefImpl.make(projectDoodles),
338
- assignee: RefImpl.make(contactFred)
297
+ project: makeRef(projectDoodles),
298
+ assignee: makeRef(contactFred)
339
299
  }));
340
- const _taskDoodles2 = db.add(live(Task, {
300
+ const _taskDoodles2 = db.add(create(Task, {
341
301
  name: "Implement dark mode",
342
- project: RefImpl.make(projectDoodles),
343
- assignee: RefImpl.make(contactJosiah)
302
+ project: makeRef(projectDoodles),
303
+ assignee: makeRef(contactJosiah)
344
304
  }));
345
- const _orgDxos = db.add(live(Organization, {
305
+ const _orgDxos = db.add(create(Org, {
346
306
  name: "DXOS",
347
307
  employees: [
348
- RefImpl.make(contactRich),
349
- RefImpl.make(contactJosiah),
350
- RefImpl.make(contactDima)
308
+ makeRef(contactRich),
309
+ makeRef(contactJosiah),
310
+ makeRef(contactDima)
351
311
  ],
352
312
  projects: [
353
- RefImpl.make(projectEcho)
313
+ makeRef(projectEcho)
354
314
  ]
355
315
  }));
356
- const _orgBraneframe = db.add(live(Organization, {
316
+ const _orgBraneframe = db.add(create(Org, {
357
317
  name: "Braneframe",
358
318
  employees: [
359
- RefImpl.make(contactJosiah),
360
- RefImpl.make(contactRich)
319
+ makeRef(contactJosiah),
320
+ makeRef(contactRich)
361
321
  ],
362
322
  projects: [
363
- RefImpl.make(projectComposer)
323
+ makeRef(projectComposer)
364
324
  ]
365
325
  }));
366
326
  };
@@ -397,78 +357,78 @@ var createTestData = () => {
397
357
  const _taskComposer1 = dataSource.add(Task, {
398
358
  id: ObjectId.random(),
399
359
  name: "Optimize startup performance",
400
- project: RefImpl.make(projectComposer),
401
- assignee: RefImpl.make(contactJosiah)
360
+ project: makeRef(projectComposer),
361
+ assignee: makeRef(contactJosiah)
402
362
  });
403
363
  const _taskComposer2 = dataSource.add(Task, {
404
364
  id: ObjectId.random(),
405
365
  name: "Create form builder",
406
- project: RefImpl.make(projectComposer),
407
- assignee: RefImpl.make(contactRich)
366
+ project: makeRef(projectComposer),
367
+ assignee: makeRef(contactRich)
408
368
  });
409
369
  const _taskComposer3 = dataSource.add(Task, {
410
370
  id: ObjectId.random(),
411
371
  name: "Add support for custom themes",
412
- project: RefImpl.make(projectComposer),
413
- assignee: RefImpl.make(contactJosiah)
372
+ project: makeRef(projectComposer),
373
+ assignee: makeRef(contactJosiah)
414
374
  });
415
375
  const _taskComposer5 = dataSource.add(Task, {
416
376
  id: ObjectId.random(),
417
377
  name: "Implement community plugin",
418
- project: RefImpl.make(projectComposer),
419
- assignee: RefImpl.make(contactFred)
378
+ project: makeRef(projectComposer),
379
+ assignee: makeRef(contactFred)
420
380
  });
421
381
  const _taskComposer4 = dataSource.add(Task, {
422
382
  id: ObjectId.random(),
423
383
  name: "Implement dark mode",
424
- project: RefImpl.make(projectComposer),
425
- assignee: RefImpl.make(contactRich)
384
+ project: makeRef(projectComposer),
385
+ assignee: makeRef(contactRich)
426
386
  });
427
387
  const _taskEcho1 = dataSource.add(Task, {
428
388
  id: ObjectId.random(),
429
389
  name: "Implement cypher query engine",
430
- project: RefImpl.make(projectEcho),
431
- assignee: RefImpl.make(contactDima)
390
+ project: makeRef(projectEcho),
391
+ assignee: makeRef(contactDima)
432
392
  });
433
393
  const _taskEcho2 = dataSource.add(Task, {
434
394
  id: ObjectId.random(),
435
395
  name: "Add schema editor",
436
- project: RefImpl.make(projectEcho),
437
- assignee: RefImpl.make(contactRich)
396
+ project: makeRef(projectEcho),
397
+ assignee: makeRef(contactRich)
438
398
  });
439
399
  const _taskDoodles1 = dataSource.add(Task, {
440
400
  id: ObjectId.random(),
441
401
  name: "Add support for custom themes",
442
- project: RefImpl.make(projectDoodles),
443
- assignee: RefImpl.make(contactFred)
402
+ project: makeRef(projectDoodles),
403
+ assignee: makeRef(contactFred)
444
404
  });
445
405
  const _taskDoodles2 = dataSource.add(Task, {
446
406
  id: ObjectId.random(),
447
407
  name: "Implement dark mode",
448
- project: RefImpl.make(projectDoodles),
449
- assignee: RefImpl.make(contactJosiah)
408
+ project: makeRef(projectDoodles),
409
+ assignee: makeRef(contactJosiah)
450
410
  });
451
- const _orgDxos = dataSource.add(Organization, {
411
+ const _orgDxos = dataSource.add(Org, {
452
412
  id: ObjectId.random(),
453
413
  name: "DXOS",
454
414
  employees: [
455
- RefImpl.make(contactRich),
456
- RefImpl.make(contactJosiah),
457
- RefImpl.make(contactDima)
415
+ makeRef(contactRich),
416
+ makeRef(contactJosiah),
417
+ makeRef(contactDima)
458
418
  ],
459
419
  projects: [
460
- RefImpl.make(projectEcho)
420
+ makeRef(projectEcho)
461
421
  ]
462
422
  });
463
- const _orgBraneframe = dataSource.add(Organization, {
423
+ const _orgBraneframe = dataSource.add(Org, {
464
424
  id: ObjectId.random(),
465
425
  name: "Braneframe",
466
426
  employees: [
467
- RefImpl.make(contactJosiah),
468
- RefImpl.make(contactRich)
427
+ makeRef(contactJosiah),
428
+ makeRef(contactRich)
469
429
  ],
470
430
  projects: [
471
- RefImpl.make(projectComposer)
431
+ makeRef(projectComposer)
472
432
  ]
473
433
  });
474
434
  dataSource.computeGraph();
@@ -490,7 +450,7 @@ var MockDataSource = class {
490
450
  add(schema, data) {
491
451
  invariant(typeof data.id === "string", "Data must have an id", {
492
452
  F: __dxlog_file2,
493
- L: 284,
453
+ L: 277,
494
454
  S: this,
495
455
  A: [
496
456
  "typeof data.id === 'string'",
@@ -574,17 +534,20 @@ var MockDataSource = class {
574
534
  };
575
535
 
576
536
  // packages/experimental/assistant/src/testing/test-schema.ts
577
- import { Schema as Schema2 } from "effect";
578
- import { EntityKind, TypeAnnotationId, Ref, ObjectId as ObjectId2 } from "@dxos/echo-schema";
579
- var Contact = Schema2.Struct({
537
+ import { Schema as S2 } from "effect";
538
+ import { EntityKind, TypeAnnotationId, Ref } from "@dxos/echo-schema";
539
+ var ObjectId2 = S2.String.annotations({
540
+ description: "The unique object identifier."
541
+ });
542
+ var Contact = S2.Struct({
580
543
  id: ObjectId2,
581
- name: Schema2.String.annotations({
544
+ name: S2.String.annotations({
582
545
  description: "The name of the person."
583
546
  }),
584
- email: Schema2.optional(Schema2.String).annotations({
547
+ email: S2.optional(S2.String).annotations({
585
548
  description: "Email address."
586
549
  })
587
- }).pipe(Schema2.mutable).annotations({
550
+ }).pipe(S2.mutable).annotations({
588
551
  [TypeAnnotationId]: {
589
552
  kind: EntityKind.Object,
590
553
  typename: "example.com/type/Contact",
@@ -592,15 +555,15 @@ var Contact = Schema2.Struct({
592
555
  },
593
556
  description: "Contact information."
594
557
  });
595
- var Project = Schema2.Struct({
558
+ var Project = S2.Struct({
596
559
  id: ObjectId2,
597
- name: Schema2.String.annotations({
560
+ name: S2.String.annotations({
598
561
  description: "The name of the project."
599
562
  }),
600
- description: Schema2.optional(Schema2.String).annotations({
563
+ description: S2.optional(S2.String).annotations({
601
564
  description: "The description of the project."
602
565
  })
603
- }).pipe(Schema2.mutable).annotations({
566
+ }).pipe(S2.mutable).annotations({
604
567
  [TypeAnnotationId]: {
605
568
  kind: EntityKind.Object,
606
569
  typename: "example.com/type/Project",
@@ -608,17 +571,17 @@ var Project = Schema2.Struct({
608
571
  },
609
572
  description: "Contact information."
610
573
  });
611
- var Task = Schema2.Struct({
574
+ var Task = S2.Struct({
612
575
  id: ObjectId2,
613
- name: Schema2.String.annotations({
576
+ name: S2.String.annotations({
614
577
  description: "The name of the task."
615
578
  }),
616
- description: Schema2.optional(Schema2.String).annotations({
579
+ description: S2.optional(S2.String).annotations({
617
580
  description: "The description of the task."
618
581
  }),
619
582
  project: Ref(Project),
620
583
  assignee: Ref(Contact)
621
- }).pipe(Schema2.mutable).annotations({
584
+ }).pipe(S2.mutable).annotations({
622
585
  [TypeAnnotationId]: {
623
586
  kind: EntityKind.Object,
624
587
  typename: "example.com/type/Task",
@@ -626,27 +589,27 @@ var Task = Schema2.Struct({
626
589
  },
627
590
  description: "Contact information."
628
591
  });
629
- var Organization = Schema2.Struct({
592
+ var Org = S2.Struct({
630
593
  id: ObjectId2,
631
- name: Schema2.String.annotations({
594
+ name: S2.String.annotations({
632
595
  description: "The name of the organization."
633
596
  }),
634
- projects: Schema2.Array(Ref(Project)),
635
- employees: Schema2.Array(Ref(Contact))
636
- }).pipe(Schema2.mutable).annotations({
597
+ projects: S2.Array(Ref(Project)),
598
+ employees: S2.Array(Ref(Contact))
599
+ }).pipe(S2.mutable).annotations({
637
600
  [TypeAnnotationId]: {
638
601
  kind: EntityKind.Object,
639
- typename: "example.com/type/Organization",
602
+ typename: "example.com/type/Org",
640
603
  version: "0.1.0"
641
604
  },
642
605
  description: "Contact information."
643
606
  });
644
607
  export {
645
608
  AI_SERVICE_ENDPOINT,
646
- ConsolePrinter,
647
609
  Contact,
648
610
  MockDataSource,
649
- Organization,
611
+ ObjectId2 as ObjectId,
612
+ Org,
650
613
  Project,
651
614
  Task,
652
615
  createCypherTool,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../src/testing/defs.ts", "../../../../src/testing/logger.ts", "../../../../src/testing/ollama.ts", "../../../../src/testing/printer.ts", "../../../../src/testing/query-promts.ts", "../../../../src/testing/test-data.ts", "../../../../src/testing/test-schema.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\n// TODO(burdon): Remove/Reconcile with @dxos/assistant-testing.\nexport const AI_SERVICE_ENDPOINT = {\n LOCAL: 'http://localhost:8788',\n REMOTE: 'https://ai-service.dxos.workers.dev',\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type { ImageSource, MessageContentBlock } from '@dxos/artifact';\n\nimport type { ConversationEvent } from '../experimental';\n\nexport const createLogger = ({\n stream,\n filter,\n onImage,\n}: {\n stream?: boolean;\n filter?: (event: ConversationEvent) => boolean;\n onImage?: (img: { id: string; description?: string; source: ImageSource }) => void;\n} = {}) => {\n const images: Record<string, any> = {};\n let currentText = '';\n\n return (event: ConversationEvent) => {\n if (typeof filter === 'function' && !filter(event)) {\n return;\n }\n\n const printContentBlock = (content: MessageContentBlock) => {\n switch (content.type) {\n case 'text':\n process.stdout.write(content.text);\n break;\n case 'tool_use':\n process.stdout.write(`⚙️ [Tool Use] ${content.name}\\n`);\n break;\n case 'image': {\n if (content.id && content.source) {\n images[content.id] = content.source;\n }\n process.stdout.write(`[Image id=${content.id} mediaType=${content.source?.mediaType}]`);\n break;\n }\n }\n };\n\n const onTextBlockPrinted = (text: string) => {\n const imageMatch = text.match(/<image id=\"([^\"]+)\"(?:\\s+prompt=\"([^\"]+)\")?\\s*\\/>/);\n if (imageMatch && onImage && images[imageMatch[1]]) {\n onImage({\n id: imageMatch[1],\n description: imageMatch[2], // Extract prompt as description if present\n source: images[imageMatch[1]],\n });\n }\n };\n\n if (stream) {\n switch (event.type) {\n case 'message_start': {\n process.stdout.write(`${event.message.role.toUpperCase()}\\n\\n`);\n for (const content of event.message.content) {\n printContentBlock(content);\n }\n break;\n }\n case 'content_block_start': {\n currentText = '';\n printContentBlock(event.content);\n break;\n }\n case 'content_block_delta': {\n switch (event.delta.type) {\n case 'text_delta': {\n currentText += event.delta.text;\n process.stdout.write(event.delta.text);\n break;\n }\n case 'input_json_delta': {\n process.stdout.write(event.delta.partial_json);\n break;\n }\n }\n break;\n }\n case 'content_block_stop': {\n process.stdout.write('\\n');\n onTextBlockPrinted(currentText);\n currentText = '';\n break;\n }\n case 'message_delta': {\n break;\n }\n case 'message_stop': {\n process.stdout.write('\\n\\n');\n break;\n }\n }\n }\n\n switch (event.type) {\n case 'message': {\n if (!stream || event.message.role !== 'assistant') {\n process.stdout.write(`${event.message.role.toUpperCase()}\\n\\n`);\n for (const block of event.message.content) {\n switch (block.type) {\n case 'text':\n process.stdout.write(block.text + '\\n');\n onTextBlockPrinted(block.text);\n break;\n case 'tool_use':\n process.stdout.write(`⚙️ [Tool Use] ${block.name}\\n`);\n process.stdout.write(` ${JSON.stringify(block.input)}\\n`);\n break;\n case 'tool_result':\n if (block.isError) {\n process.stdout.write('❌ [Tool Error]\\n');\n process.stdout.write(block.content + '\\n');\n } else {\n process.stdout.write('✅ [Tool Success]\\n');\n process.stdout.write(block.content + '\\n');\n }\n }\n process.stdout.write('\\n\\n');\n }\n }\n break;\n }\n }\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { DEFAULT_OLLAMA_MODEL, OllamaClient, type OllamaClientParams } from '../ai-service';\n\n/**\n * Create a test client with small local model and no temperature for predictable results.\n */\nexport const createTestOllamaClient = (options?: Pick<OllamaClientParams, 'tools'>) => {\n return new OllamaClient({\n tools: options?.tools,\n overrides: { model: DEFAULT_OLLAMA_MODEL, temperature: 0 },\n });\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { inspect } from 'node:util';\n\nimport type { Message, MessageContentBlock } from '@dxos/artifact';\n\nexport class ConsolePrinter {\n printMessage = (message: Message) => {\n // eslint-disable-next-line no-console\n console.log(`${message.role.toUpperCase()}\\n`);\n for (const content of message.content) {\n this.printContentBlock(content);\n }\n };\n\n printContentBlock = (content: MessageContentBlock) => {\n switch (content.type) {\n case 'text':\n // eslint-disable-next-line no-console\n console.log(content.text);\n break;\n case 'tool_use':\n // eslint-disable-next-line no-console\n console.log(`⚙️ [Tool Use] ${content.name} ${inspect(content.input, { depth: null, colors: true })}`);\n break;\n case 'tool_result': {\n let data: any;\n try {\n data = JSON.parse(content.content);\n } catch {\n data = content.content;\n }\n // eslint-disable-next-line no-console\n console.log(`⚙️ [Tool Result] ${content.toolUseId} ${inspect(data, { depth: null, colors: true })}`);\n break;\n }\n }\n };\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema } from 'effect';\n\nimport { defineTool, ToolResult } from '@dxos/artifact';\nimport { toJsonSchema } from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\n\nimport { executeQuery, formatJsonSchemaForLLM, type DataSource } from '../experimental';\nimport { trim } from '../util';\n\nexport const createCypherTool = (dataSource: DataSource, schemaTypes: Schema.Schema.Any[] = []) =>\n defineTool('dxos.org/echo', {\n name: 'query',\n description:\n 'Query the ECHO graph database in cypher query language. Returns data from the database.' +\n (schemaTypes.length > 0 ? `\\n\\n${createSystemPrompt(schemaTypes)}` : ''),\n schema: Schema.Struct({\n query: Schema.String.annotations({\n description: `\n A valid cypher query string to execute.\n Query must have one MATCH clause.\n Match clause can have multiple patterns but they must all be connected via a relationship chain.\n Query might have zero or one WHERE clauses.\n Query must have one RETURN clause.\n RETURN clause can have multiple expressions separated by commas.\n DISTINCT keyword is not allowed.\n\n <example>\n MATCH (n:Person) RETURN n.name\n </example>\n\n <example>\n MATCH (s:Studio)-[:PRODUCED]->(m:Movie)-[:PRODUCED_IN]->(c:City {name: \"Las Vegas\"}) RETURN s\n </example>\n \n <example>\n MATCH (a:Actor)-[:STARRED_IN]->(m:Movie)<-[:PRODUCED]-(s:Studio {name: \"Cinema Pictures\"}) WHERE m.name = \"Once upon a time\" RETURN m.name, a.name\n </example>\n `,\n }),\n }),\n execute: async ({ query }) => {\n try {\n log('cypher query', { query });\n const results = await executeQuery(dataSource, query);\n log('query complete', { results });\n return ToolResult.Success(results);\n } catch (e: any) {\n log.catch(e);\n return ToolResult.Error(e.message);\n }\n },\n });\n\nexport const createSystemPrompt = (schemaTypes: Schema.Schema.Any[]) => trim`\n You have access to ECHO graph database. You can query the database to get data to satisfy user prompts.\n\n Database schema is defined in pseud-cypher syntax. The schema is:\n\n <schema>\n ${formatJsonSchemaForLLM(schemaTypes.map((schema) => toJsonSchema(schema)))}\n <schema>\n\n Before replying always think step-by-step on how to proceed.\n Print your thoughts inside <cot> tags.\n \n <example>\n <cot>To answer the question I need to ...</cot>\n </example>\n\n Before answering the user's question, decide what tools you need to use to answer the question.\n`;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Schema } from 'effect';\n\nimport { raise } from '@dxos/debug';\nimport type { EchoDatabase } from '@dxos/echo-db';\nimport {\n JSON_SCHEMA_ECHO_REF_ID,\n ObjectId,\n toJsonSchema,\n type JsonSchemaType,\n type Ref,\n Ref as RefImpl,\n} from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { live } from '@dxos/live-object';\n\nimport {\n type DataSource,\n type Node,\n type Relationship,\n formatInferredRelationshipLabel,\n formatNodeLabel,\n} from '../experimental';\nimport { Contact, Organization, Project, Task } from '../testing';\n\nexport const seedTestData = (db: EchoDatabase) => {\n const contactRich = db.add(\n live(Contact, {\n name: 'Rich',\n }),\n );\n const contactJosiah = db.add(\n live(Contact, {\n name: 'Josiah',\n }),\n );\n const contactDima = db.add(\n live(Contact, {\n name: 'Dima',\n }),\n );\n const contactFred = db.add(\n live(Contact, {\n name: 'Fred',\n }),\n );\n\n const projectComposer = db.add(\n live(Project, {\n name: 'Composer',\n }),\n );\n const projectEcho = db.add(\n live(Project, {\n name: 'ECHO',\n }),\n );\n const projectDoodles = db.add(\n live(Project, {\n name: 'Doodles',\n }),\n );\n\n const _taskComposer1 = db.add(\n live(Task, {\n name: 'Optimize startup performance',\n project: RefImpl.make(projectComposer),\n assignee: RefImpl.make(contactJosiah),\n }),\n );\n const _taskComposer2 = db.add(\n live(Task, {\n name: 'Create form builder',\n project: RefImpl.make(projectComposer),\n assignee: RefImpl.make(contactRich),\n }),\n );\n const _taskComposer3 = db.add(\n live(Task, {\n name: 'Add support for custom themes',\n project: RefImpl.make(projectComposer),\n assignee: RefImpl.make(contactJosiah),\n }),\n );\n const _taskComposer5 = db.add(\n live(Task, {\n name: 'Implement community plugin',\n project: RefImpl.make(projectComposer),\n assignee: RefImpl.make(contactFred),\n }),\n );\n const _taskComposer4 = db.add(\n live(Task, {\n name: 'Implement dark mode',\n project: RefImpl.make(projectComposer),\n assignee: RefImpl.make(contactRich),\n }),\n );\n const _taskEcho1 = db.add(\n live(Task, {\n name: 'Implement cypher query engine',\n project: RefImpl.make(projectEcho),\n assignee: RefImpl.make(contactDima),\n }),\n );\n const _taskEcho2 = db.add(\n live(Task, {\n name: 'Add schema editor',\n project: RefImpl.make(projectEcho),\n assignee: RefImpl.make(contactRich),\n }),\n );\n const _taskDoodles1 = db.add(\n live(Task, {\n name: 'Add support for custom themes',\n project: RefImpl.make(projectDoodles),\n assignee: RefImpl.make(contactFred),\n }),\n );\n const _taskDoodles2 = db.add(\n live(Task, {\n name: 'Implement dark mode',\n project: RefImpl.make(projectDoodles),\n assignee: RefImpl.make(contactJosiah),\n }),\n );\n\n const _orgDxos = db.add(\n live(Organization, {\n name: 'DXOS',\n employees: [RefImpl.make(contactRich), RefImpl.make(contactJosiah), RefImpl.make(contactDima)],\n projects: [RefImpl.make(projectEcho)],\n }),\n );\n const _orgBraneframe = db.add(\n live(Organization, {\n name: 'Braneframe',\n employees: [RefImpl.make(contactJosiah), RefImpl.make(contactRich)],\n projects: [RefImpl.make(projectComposer)],\n }),\n );\n};\n\n// TODO(burdon): Use schema/testing.\nexport const createTestData = (): MockDataSource => {\n const dataSource = new MockDataSource();\n\n const contactRich = dataSource.add(Contact, {\n id: ObjectId.random(),\n name: 'Rich',\n });\n const contactJosiah = dataSource.add(Contact, {\n id: ObjectId.random(),\n name: 'Josiah',\n });\n const contactDima = dataSource.add(Contact, {\n id: ObjectId.random(),\n name: 'Dima',\n });\n const contactFred = dataSource.add(Contact, {\n id: ObjectId.random(),\n name: 'Fred',\n });\n\n const projectComposer = dataSource.add(Project, {\n id: ObjectId.random(),\n name: 'Composer',\n });\n const projectEcho = dataSource.add(Project, {\n id: ObjectId.random(),\n name: 'ECHO',\n });\n const projectDoodles = dataSource.add(Project, {\n id: ObjectId.random(),\n name: 'Doodles',\n });\n\n const _taskComposer1 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Optimize startup performance',\n project: RefImpl.make(projectComposer),\n assignee: RefImpl.make(contactJosiah),\n });\n const _taskComposer2 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Create form builder',\n project: RefImpl.make(projectComposer),\n assignee: RefImpl.make(contactRich),\n });\n const _taskComposer3 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Add support for custom themes',\n project: RefImpl.make(projectComposer),\n assignee: RefImpl.make(contactJosiah),\n });\n const _taskComposer5 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Implement community plugin',\n project: RefImpl.make(projectComposer),\n assignee: RefImpl.make(contactFred),\n });\n const _taskComposer4 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Implement dark mode',\n project: RefImpl.make(projectComposer),\n assignee: RefImpl.make(contactRich),\n });\n const _taskEcho1 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Implement cypher query engine',\n project: RefImpl.make(projectEcho),\n assignee: RefImpl.make(contactDima),\n });\n const _taskEcho2 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Add schema editor',\n project: RefImpl.make(projectEcho),\n assignee: RefImpl.make(contactRich),\n });\n const _taskDoodles1 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Add support for custom themes',\n project: RefImpl.make(projectDoodles),\n assignee: RefImpl.make(contactFred),\n });\n const _taskDoodles2 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Implement dark mode',\n project: RefImpl.make(projectDoodles),\n assignee: RefImpl.make(contactJosiah),\n });\n\n const _orgDxos = dataSource.add(Organization, {\n id: ObjectId.random(),\n name: 'DXOS',\n employees: [RefImpl.make(contactRich), RefImpl.make(contactJosiah), RefImpl.make(contactDima)],\n projects: [RefImpl.make(projectEcho)],\n });\n const _orgBraneframe = dataSource.add(Organization, {\n id: ObjectId.random(),\n name: 'Braneframe',\n employees: [RefImpl.make(contactJosiah), RefImpl.make(contactRich)],\n projects: [RefImpl.make(projectComposer)],\n });\n dataSource.computeGraph();\n\n return dataSource;\n};\n\nexport class MockDataSource implements DataSource {\n objects: Record<\n string,\n {\n schema: Schema.Schema.All;\n typeDxn: string;\n id: string;\n data: unknown;\n }\n > = {};\n\n schema: Record<\n string,\n {\n json: JsonSchemaType;\n instance: Schema.Schema.All;\n }\n > = {};\n\n nodes: Node[] = [];\n relationships: Relationship[] = [];\n\n async getNodes({ label }: { label?: string }) {\n return this.nodes.filter((node) => !label || node.label === label);\n }\n\n async getRelationships({ label }: { label?: string }) {\n return this.relationships.filter((relationship) => !label || relationship.label === label);\n }\n\n add<S extends Schema.Schema.All>(schema: S, data: Schema.Schema.Type<S>) {\n invariant(typeof data.id === 'string', 'Data must have an id');\n const jsonSchema = toJsonSchema(schema);\n if (!this.schema[jsonSchema.$id!]) {\n this.schema[jsonSchema.$id!] = {\n json: jsonSchema,\n instance: schema,\n };\n }\n\n const typenameDxn = jsonSchema.$id ?? raise(new Error('Schema must have $id'));\n\n this.objects[data.id] = {\n schema,\n id: data.id,\n typeDxn: typenameDxn,\n data,\n };\n\n return data;\n }\n\n computeGraph() {\n this.nodes = [];\n this.relationships = [];\n\n for (const object of Object.values(this.objects)) {\n this.nodes.push({\n kind: 'node',\n id: object.id,\n label: formatNodeLabel(object.typeDxn),\n properties: object.data as any,\n });\n }\n\n for (const object of Object.values(this.objects)) {\n const schema = this.schema[object.typeDxn].json;\n const typenameDxn = schema.$id ?? raise(new Error('Schema must have $id'));\n\n for (const [name, propSchema] of Object.entries(schema.properties!)) {\n if (propSchema.$id === JSON_SCHEMA_ECHO_REF_ID) {\n const label = formatInferredRelationshipLabel(typenameDxn, name);\n\n const source = this.nodes.find((node) => node.id === object.id);\n if (!source) {\n continue;\n }\n\n const { id: targetId } = (object.data as any)[name].target;\n\n const target = this.nodes.find((node) => node.id === targetId);\n if (!target) {\n continue;\n }\n\n this.relationships.push({\n kind: 'relationship',\n id: `${object.id}-${name}-${target.id}`,\n label,\n properties: {},\n source,\n target,\n });\n } else if (\n propSchema.type === 'array' &&\n propSchema.items &&\n typeof propSchema.items === 'object' &&\n '$id' in propSchema.items &&\n propSchema.items.$id === JSON_SCHEMA_ECHO_REF_ID\n ) {\n const label = formatInferredRelationshipLabel(typenameDxn, name);\n\n const source = this.nodes.find((node) => node.id === object.id);\n if (!source) {\n continue;\n }\n\n for (const { id: targetId } of (object.data as any)[name].map((x: Ref<any>) => x.target)) {\n const target = this.nodes.find((node) => node.id === targetId);\n if (!target) {\n continue;\n }\n\n this.relationships.push({\n kind: 'relationship',\n id: `${object.id}-${name}-${targetId}`,\n label,\n properties: {},\n source,\n target,\n });\n }\n }\n }\n }\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema } from 'effect';\n\nimport { EntityKind, TypeAnnotationId, Ref, ObjectId } from '@dxos/echo-schema';\n\n// TODO(burdon): Remove (use @dxos/schema DataType).\n\n/** @deprecated */\nexport const Contact = Schema.Struct({\n id: ObjectId,\n name: Schema.String.annotations({ description: 'The name of the person.' }),\n email: Schema.optional(Schema.String).annotations({ description: 'Email address.' }),\n})\n .pipe(Schema.mutable)\n .annotations({\n [TypeAnnotationId]: {\n kind: EntityKind.Object,\n typename: 'example.com/type/Contact',\n version: '0.1.0',\n },\n description: 'Contact information.',\n });\nexport interface Contact extends Schema.Schema.Type<typeof Contact> {}\n\n/** @deprecated */\nexport const Project = Schema.Struct({\n id: ObjectId,\n name: Schema.String.annotations({ description: 'The name of the project.' }),\n description: Schema.optional(Schema.String).annotations({ description: 'The description of the project.' }),\n})\n .pipe(Schema.mutable)\n .annotations({\n [TypeAnnotationId]: {\n kind: EntityKind.Object,\n typename: 'example.com/type/Project',\n version: '0.1.0',\n },\n description: 'Contact information.',\n });\nexport interface Project extends Schema.Schema.Type<typeof Project> {}\n\nexport const Task = Schema.Struct({\n id: ObjectId,\n name: Schema.String.annotations({ description: 'The name of the task.' }),\n description: Schema.optional(Schema.String).annotations({ description: 'The description of the task.' }),\n project: Ref(Project),\n assignee: Ref(Contact),\n})\n .pipe(Schema.mutable)\n .annotations({\n [TypeAnnotationId]: {\n kind: EntityKind.Object,\n typename: 'example.com/type/Task',\n version: '0.1.0',\n },\n description: 'Contact information.',\n });\nexport interface Task extends Schema.Schema.Type<typeof Task> {}\n\n/** @deprecated */\nexport const Organization = Schema.Struct({\n id: ObjectId,\n name: Schema.String.annotations({ description: 'The name of the organization.' }),\n projects: Schema.Array(Ref(Project)),\n employees: Schema.Array(Ref(Contact)),\n})\n .pipe(Schema.mutable)\n .annotations({\n [TypeAnnotationId]: {\n kind: EntityKind.Object,\n typename: 'example.com/type/Organization',\n version: '0.1.0',\n },\n description: 'Contact information.',\n });\nexport interface Organization extends Schema.Schema.Type<typeof Organization> {}\n"],
5
- "mappings": ";;;;;;;;;;;;AAKO,IAAMA,sBAAsB;EACjCC,OAAO;EACPC,QAAQ;AACV;;;ACAO,IAAMC,eAAe,CAAC,EAC3BC,QACAC,QACAC,QAAO,IAKL,CAAC,MAAC;AACJ,QAAMC,SAA8B,CAAC;AACrC,MAAIC,cAAc;AAElB,SAAO,CAACC,UAAAA;AACN,QAAI,OAAOJ,WAAW,cAAc,CAACA,OAAOI,KAAAA,GAAQ;AAClD;IACF;AAEA,UAAMC,oBAAoB,CAACC,YAAAA;AACzB,cAAQA,QAAQC,MAAI;QAClB,KAAK;AACHC,kBAAQC,OAAOC,MAAMJ,QAAQK,IAAI;AACjC;QACF,KAAK;AACHH,kBAAQC,OAAOC,MAAM,2BAAiBJ,QAAQM,IAAI;CAAI;AACtD;QACF,KAAK,SAAS;AACZ,cAAIN,QAAQO,MAAMP,QAAQQ,QAAQ;AAChCZ,mBAAOI,QAAQO,EAAE,IAAIP,QAAQQ;UAC/B;AACAN,kBAAQC,OAAOC,MAAM,aAAaJ,QAAQO,EAAE,cAAcP,QAAQQ,QAAQC,SAAAA,GAAY;AACtF;QACF;MACF;IACF;AAEA,UAAMC,qBAAqB,CAACL,SAAAA;AAC1B,YAAMM,aAAaN,KAAKO,MAAM,mDAAA;AAC9B,UAAID,cAAchB,WAAWC,OAAOe,WAAW,CAAA,CAAE,GAAG;AAClDhB,gBAAQ;UACNY,IAAII,WAAW,CAAA;UACfE,aAAaF,WAAW,CAAA;UACxBH,QAAQZ,OAAOe,WAAW,CAAA,CAAE;QAC9B,CAAA;MACF;IACF;AAEA,QAAIlB,QAAQ;AACV,cAAQK,MAAMG,MAAI;QAChB,KAAK,iBAAiB;AACpBC,kBAAQC,OAAOC,MAAM,GAAGN,MAAMgB,QAAQC,KAAKC,YAAW,CAAA;;CAAQ;AAC9D,qBAAWhB,WAAWF,MAAMgB,QAAQd,SAAS;AAC3CD,8BAAkBC,OAAAA;UACpB;AACA;QACF;QACA,KAAK,uBAAuB;AAC1BH,wBAAc;AACdE,4BAAkBD,MAAME,OAAO;AAC/B;QACF;QACA,KAAK,uBAAuB;AAC1B,kBAAQF,MAAMmB,MAAMhB,MAAI;YACtB,KAAK,cAAc;AACjBJ,6BAAeC,MAAMmB,MAAMZ;AAC3BH,sBAAQC,OAAOC,MAAMN,MAAMmB,MAAMZ,IAAI;AACrC;YACF;YACA,KAAK,oBAAoB;AACvBH,sBAAQC,OAAOC,MAAMN,MAAMmB,MAAMC,YAAY;AAC7C;YACF;UACF;AACA;QACF;QACA,KAAK,sBAAsB;AACzBhB,kBAAQC,OAAOC,MAAM,IAAA;AACrBM,6BAAmBb,WAAAA;AACnBA,wBAAc;AACd;QACF;QACA,KAAK,iBAAiB;AACpB;QACF;QACA,KAAK,gBAAgB;AACnBK,kBAAQC,OAAOC,MAAM,MAAA;AACrB;QACF;MACF;IACF;AAEA,YAAQN,MAAMG,MAAI;MAChB,KAAK,WAAW;AACd,YAAI,CAACR,UAAUK,MAAMgB,QAAQC,SAAS,aAAa;AACjDb,kBAAQC,OAAOC,MAAM,GAAGN,MAAMgB,QAAQC,KAAKC,YAAW,CAAA;;CAAQ;AAC9D,qBAAWG,SAASrB,MAAMgB,QAAQd,SAAS;AACzC,oBAAQmB,MAAMlB,MAAI;cAChB,KAAK;AACHC,wBAAQC,OAAOC,MAAMe,MAAMd,OAAO,IAAA;AAClCK,mCAAmBS,MAAMd,IAAI;AAC7B;cACF,KAAK;AACHH,wBAAQC,OAAOC,MAAM,2BAAiBe,MAAMb,IAAI;CAAI;AACpDJ,wBAAQC,OAAOC,MAAM,KAAKgB,KAAKC,UAAUF,MAAMG,KAAK,CAAA;CAAK;AACzD;cACF,KAAK;AACH,oBAAIH,MAAMI,SAAS;AACjBrB,0BAAQC,OAAOC,MAAM,uBAAA;AACrBF,0BAAQC,OAAOC,MAAMe,MAAMnB,UAAU,IAAA;gBACvC,OAAO;AACLE,0BAAQC,OAAOC,MAAM,yBAAA;AACrBF,0BAAQC,OAAOC,MAAMe,MAAMnB,UAAU,IAAA;gBACvC;YACJ;AACAE,oBAAQC,OAAOC,MAAM,MAAA;UACvB;QACF;AACA;MACF;IACF;EACF;AACF;;;ACvHO,IAAMoB,yBAAyB,CAACC,YAAAA;AACrC,SAAO,IAAIC,aAAa;IACtBC,OAAOF,SAASE;IAChBC,WAAW;MAAEC,OAAOC;MAAsBC,aAAa;IAAE;EAC3D,CAAA;AACF;;;ACVA,SAASC,eAAe;AAIjB,IAAMC,iBAAN,MAAMA;EAAN;AACLC,wBAAe,CAACC,YAAAA;AAEdC,cAAQC,IAAI,GAAGF,QAAQG,KAAKC,YAAW,CAAA;CAAM;AAC7C,iBAAWC,WAAWL,QAAQK,SAAS;AACrC,aAAKC,kBAAkBD,OAAAA;MACzB;IACF;AAEAC,6BAAoB,CAACD,YAAAA;AACnB,cAAQA,QAAQE,MAAI;QAClB,KAAK;AAEHN,kBAAQC,IAAIG,QAAQG,IAAI;AACxB;QACF,KAAK;AAEHP,kBAAQC,IAAI,2BAAiBG,QAAQI,IAAI,IAAIC,QAAQL,QAAQM,OAAO;YAAEC,OAAO;YAAMC,QAAQ;UAAK,CAAA,CAAA,EAAI;AACpG;QACF,KAAK,eAAe;AAClB,cAAIC;AACJ,cAAI;AACFA,mBAAOC,KAAKC,MAAMX,QAAQA,OAAO;UACnC,QAAQ;AACNS,mBAAOT,QAAQA;UACjB;AAEAJ,kBAAQC,IAAI,8BAAoBG,QAAQY,SAAS,IAAIP,QAAQI,MAAM;YAAEF,OAAO;YAAMC,QAAQ;UAAK,CAAA,CAAA,EAAI;AACnG;QACF;MACF;IACF;;AACF;;;ACpCA,SAASK,cAAc;AAEvB,SAASC,YAAYC,kBAAkB;AACvC,SAASC,oBAAoB;AAC7B,SAASC,WAAW;;AAKb,IAAMC,mBAAmB,CAACC,YAAwBC,cAAmC,CAAA,MAC1FC,WAAW,iBAAiB;EAC1BC,MAAM;EACNC,aACE,6FACCH,YAAYI,SAAS,IAAI;;EAAOC,mBAAmBL,WAAAA,CAAAA,KAAiB;EACvEM,QAAQC,OAAOC,OAAO;IACpBC,OAAOF,OAAOG,OAAOC,YAAY;MAC/BR,aAAa;;;;;;;;;;;;;;;;;;;;;IAqBf,CAAA;EACF,CAAA;EACAS,SAAS,OAAO,EAAEH,MAAK,MAAE;AACvB,QAAI;AACFI,UAAI,gBAAgB;QAAEJ;MAAM,GAAA;;;;;;AAC5B,YAAMK,UAAU,MAAMC,aAAahB,YAAYU,KAAAA;AAC/CI,UAAI,kBAAkB;QAAEC;MAAQ,GAAA;;;;;;AAChC,aAAOE,WAAWC,QAAQH,OAAAA;IAC5B,SAASI,GAAQ;AACfL,UAAIM,MAAMD,GAAAA,QAAAA;;;;;;AACV,aAAOF,WAAWI,MAAMF,EAAEG,OAAO;IACnC;EACF;AACF,CAAA;AAEK,IAAMhB,qBAAqB,CAACL,gBAAqCsB;;;;;;MAMlEC,uBAAuBvB,YAAYwB,IAAI,CAAClB,WAAWmB,aAAanB,MAAAA,CAAAA,CAAAA,CAAAA;;;;;;;;;;;;;;ACzDtE,SAASoB,aAAa;AAEtB,SACEC,yBACAC,UACAC,gBAAAA,eAGAC,OAAOC,eACF;AACP,SAASC,iBAAiB;AAC1B,SAASC,YAAY;;AAWd,IAAMC,eAAe,CAACC,OAAAA;AAC3B,QAAMC,cAAcD,GAAGE,IACrBC,KAAKC,SAAS;IACZC,MAAM;EACR,CAAA,CAAA;AAEF,QAAMC,gBAAgBN,GAAGE,IACvBC,KAAKC,SAAS;IACZC,MAAM;EACR,CAAA,CAAA;AAEF,QAAME,cAAcP,GAAGE,IACrBC,KAAKC,SAAS;IACZC,MAAM;EACR,CAAA,CAAA;AAEF,QAAMG,cAAcR,GAAGE,IACrBC,KAAKC,SAAS;IACZC,MAAM;EACR,CAAA,CAAA;AAGF,QAAMI,kBAAkBT,GAAGE,IACzBC,KAAKO,SAAS;IACZL,MAAM;EACR,CAAA,CAAA;AAEF,QAAMM,cAAcX,GAAGE,IACrBC,KAAKO,SAAS;IACZL,MAAM;EACR,CAAA,CAAA;AAEF,QAAMO,iBAAiBZ,GAAGE,IACxBC,KAAKO,SAAS;IACZL,MAAM;EACR,CAAA,CAAA;AAGF,QAAMQ,iBAAiBb,GAAGE,IACxBC,KAAKW,MAAM;IACTT,MAAM;IACNU,SAASC,QAAQC,KAAKR,eAAAA;IACtBS,UAAUF,QAAQC,KAAKX,aAAAA;EACzB,CAAA,CAAA;AAEF,QAAMa,iBAAiBnB,GAAGE,IACxBC,KAAKW,MAAM;IACTT,MAAM;IACNU,SAASC,QAAQC,KAAKR,eAAAA;IACtBS,UAAUF,QAAQC,KAAKhB,WAAAA;EACzB,CAAA,CAAA;AAEF,QAAMmB,iBAAiBpB,GAAGE,IACxBC,KAAKW,MAAM;IACTT,MAAM;IACNU,SAASC,QAAQC,KAAKR,eAAAA;IACtBS,UAAUF,QAAQC,KAAKX,aAAAA;EACzB,CAAA,CAAA;AAEF,QAAMe,iBAAiBrB,GAAGE,IACxBC,KAAKW,MAAM;IACTT,MAAM;IACNU,SAASC,QAAQC,KAAKR,eAAAA;IACtBS,UAAUF,QAAQC,KAAKT,WAAAA;EACzB,CAAA,CAAA;AAEF,QAAMc,iBAAiBtB,GAAGE,IACxBC,KAAKW,MAAM;IACTT,MAAM;IACNU,SAASC,QAAQC,KAAKR,eAAAA;IACtBS,UAAUF,QAAQC,KAAKhB,WAAAA;EACzB,CAAA,CAAA;AAEF,QAAMsB,aAAavB,GAAGE,IACpBC,KAAKW,MAAM;IACTT,MAAM;IACNU,SAASC,QAAQC,KAAKN,WAAAA;IACtBO,UAAUF,QAAQC,KAAKV,WAAAA;EACzB,CAAA,CAAA;AAEF,QAAMiB,aAAaxB,GAAGE,IACpBC,KAAKW,MAAM;IACTT,MAAM;IACNU,SAASC,QAAQC,KAAKN,WAAAA;IACtBO,UAAUF,QAAQC,KAAKhB,WAAAA;EACzB,CAAA,CAAA;AAEF,QAAMwB,gBAAgBzB,GAAGE,IACvBC,KAAKW,MAAM;IACTT,MAAM;IACNU,SAASC,QAAQC,KAAKL,cAAAA;IACtBM,UAAUF,QAAQC,KAAKT,WAAAA;EACzB,CAAA,CAAA;AAEF,QAAMkB,gBAAgB1B,GAAGE,IACvBC,KAAKW,MAAM;IACTT,MAAM;IACNU,SAASC,QAAQC,KAAKL,cAAAA;IACtBM,UAAUF,QAAQC,KAAKX,aAAAA;EACzB,CAAA,CAAA;AAGF,QAAMqB,WAAW3B,GAAGE,IAClBC,KAAKyB,cAAc;IACjBvB,MAAM;IACNwB,WAAW;MAACb,QAAQC,KAAKhB,WAAAA;MAAce,QAAQC,KAAKX,aAAAA;MAAgBU,QAAQC,KAAKV,WAAAA;;IACjFuB,UAAU;MAACd,QAAQC,KAAKN,WAAAA;;EAC1B,CAAA,CAAA;AAEF,QAAMoB,iBAAiB/B,GAAGE,IACxBC,KAAKyB,cAAc;IACjBvB,MAAM;IACNwB,WAAW;MAACb,QAAQC,KAAKX,aAAAA;MAAgBU,QAAQC,KAAKhB,WAAAA;;IACtD6B,UAAU;MAACd,QAAQC,KAAKR,eAAAA;;EAC1B,CAAA,CAAA;AAEJ;AAGO,IAAMuB,iBAAiB,MAAA;AAC5B,QAAMC,aAAa,IAAIC,eAAAA;AAEvB,QAAMjC,cAAcgC,WAAW/B,IAAIE,SAAS;IAC1C+B,IAAIC,SAASC,OAAM;IACnBhC,MAAM;EACR,CAAA;AACA,QAAMC,gBAAgB2B,WAAW/B,IAAIE,SAAS;IAC5C+B,IAAIC,SAASC,OAAM;IACnBhC,MAAM;EACR,CAAA;AACA,QAAME,cAAc0B,WAAW/B,IAAIE,SAAS;IAC1C+B,IAAIC,SAASC,OAAM;IACnBhC,MAAM;EACR,CAAA;AACA,QAAMG,cAAcyB,WAAW/B,IAAIE,SAAS;IAC1C+B,IAAIC,SAASC,OAAM;IACnBhC,MAAM;EACR,CAAA;AAEA,QAAMI,kBAAkBwB,WAAW/B,IAAIQ,SAAS;IAC9CyB,IAAIC,SAASC,OAAM;IACnBhC,MAAM;EACR,CAAA;AACA,QAAMM,cAAcsB,WAAW/B,IAAIQ,SAAS;IAC1CyB,IAAIC,SAASC,OAAM;IACnBhC,MAAM;EACR,CAAA;AACA,QAAMO,iBAAiBqB,WAAW/B,IAAIQ,SAAS;IAC7CyB,IAAIC,SAASC,OAAM;IACnBhC,MAAM;EACR,CAAA;AAEA,QAAMQ,iBAAiBoB,WAAW/B,IAAIY,MAAM;IAC1CqB,IAAIC,SAASC,OAAM;IACnBhC,MAAM;IACNU,SAASC,QAAQC,KAAKR,eAAAA;IACtBS,UAAUF,QAAQC,KAAKX,aAAAA;EACzB,CAAA;AACA,QAAMa,iBAAiBc,WAAW/B,IAAIY,MAAM;IAC1CqB,IAAIC,SAASC,OAAM;IACnBhC,MAAM;IACNU,SAASC,QAAQC,KAAKR,eAAAA;IACtBS,UAAUF,QAAQC,KAAKhB,WAAAA;EACzB,CAAA;AACA,QAAMmB,iBAAiBa,WAAW/B,IAAIY,MAAM;IAC1CqB,IAAIC,SAASC,OAAM;IACnBhC,MAAM;IACNU,SAASC,QAAQC,KAAKR,eAAAA;IACtBS,UAAUF,QAAQC,KAAKX,aAAAA;EACzB,CAAA;AACA,QAAMe,iBAAiBY,WAAW/B,IAAIY,MAAM;IAC1CqB,IAAIC,SAASC,OAAM;IACnBhC,MAAM;IACNU,SAASC,QAAQC,KAAKR,eAAAA;IACtBS,UAAUF,QAAQC,KAAKT,WAAAA;EACzB,CAAA;AACA,QAAMc,iBAAiBW,WAAW/B,IAAIY,MAAM;IAC1CqB,IAAIC,SAASC,OAAM;IACnBhC,MAAM;IACNU,SAASC,QAAQC,KAAKR,eAAAA;IACtBS,UAAUF,QAAQC,KAAKhB,WAAAA;EACzB,CAAA;AACA,QAAMsB,aAAaU,WAAW/B,IAAIY,MAAM;IACtCqB,IAAIC,SAASC,OAAM;IACnBhC,MAAM;IACNU,SAASC,QAAQC,KAAKN,WAAAA;IACtBO,UAAUF,QAAQC,KAAKV,WAAAA;EACzB,CAAA;AACA,QAAMiB,aAAaS,WAAW/B,IAAIY,MAAM;IACtCqB,IAAIC,SAASC,OAAM;IACnBhC,MAAM;IACNU,SAASC,QAAQC,KAAKN,WAAAA;IACtBO,UAAUF,QAAQC,KAAKhB,WAAAA;EACzB,CAAA;AACA,QAAMwB,gBAAgBQ,WAAW/B,IAAIY,MAAM;IACzCqB,IAAIC,SAASC,OAAM;IACnBhC,MAAM;IACNU,SAASC,QAAQC,KAAKL,cAAAA;IACtBM,UAAUF,QAAQC,KAAKT,WAAAA;EACzB,CAAA;AACA,QAAMkB,gBAAgBO,WAAW/B,IAAIY,MAAM;IACzCqB,IAAIC,SAASC,OAAM;IACnBhC,MAAM;IACNU,SAASC,QAAQC,KAAKL,cAAAA;IACtBM,UAAUF,QAAQC,KAAKX,aAAAA;EACzB,CAAA;AAEA,QAAMqB,WAAWM,WAAW/B,IAAI0B,cAAc;IAC5CO,IAAIC,SAASC,OAAM;IACnBhC,MAAM;IACNwB,WAAW;MAACb,QAAQC,KAAKhB,WAAAA;MAAce,QAAQC,KAAKX,aAAAA;MAAgBU,QAAQC,KAAKV,WAAAA;;IACjFuB,UAAU;MAACd,QAAQC,KAAKN,WAAAA;;EAC1B,CAAA;AACA,QAAMoB,iBAAiBE,WAAW/B,IAAI0B,cAAc;IAClDO,IAAIC,SAASC,OAAM;IACnBhC,MAAM;IACNwB,WAAW;MAACb,QAAQC,KAAKX,aAAAA;MAAgBU,QAAQC,KAAKhB,WAAAA;;IACtD6B,UAAU;MAACd,QAAQC,KAAKR,eAAAA;;EAC1B,CAAA;AACAwB,aAAWK,aAAY;AAEvB,SAAOL;AACT;AAEO,IAAMC,iBAAN,MAAMA;EAAN;AACLK,mBAQI,CAAC;AAELC,kBAMI,CAAC;AAELC,iBAAgB,CAAA;AAChBC,yBAAgC,CAAA;;EAEhC,MAAMC,SAAS,EAAEC,MAAK,GAAwB;AAC5C,WAAO,KAAKH,MAAMI,OAAO,CAACC,SAAS,CAACF,SAASE,KAAKF,UAAUA,KAAAA;EAC9D;EAEA,MAAMG,iBAAiB,EAAEH,MAAK,GAAwB;AACpD,WAAO,KAAKF,cAAcG,OAAO,CAACG,iBAAiB,CAACJ,SAASI,aAAaJ,UAAUA,KAAAA;EACtF;EAEA1C,IAAiCsC,QAAWS,MAA6B;AACvEC,cAAU,OAAOD,KAAKd,OAAO,UAAU,wBAAA;;;;;;;;;AACvC,UAAMgB,aAAaC,cAAaZ,MAAAA;AAChC,QAAI,CAAC,KAAKA,OAAOW,WAAWE,GAAG,GAAI;AACjC,WAAKb,OAAOW,WAAWE,GAAG,IAAK;QAC7BC,MAAMH;QACNI,UAAUf;MACZ;IACF;AAEA,UAAMgB,cAAcL,WAAWE,OAAOI,MAAM,IAAIC,MAAM,sBAAA,CAAA;AAEtD,SAAKnB,QAAQU,KAAKd,EAAE,IAAI;MACtBK;MACAL,IAAIc,KAAKd;MACTwB,SAASH;MACTP;IACF;AAEA,WAAOA;EACT;EAEAX,eAAe;AACb,SAAKG,QAAQ,CAAA;AACb,SAAKC,gBAAgB,CAAA;AAErB,eAAWkB,UAAUC,OAAOC,OAAO,KAAKvB,OAAO,GAAG;AAChD,WAAKE,MAAMsB,KAAK;QACdC,MAAM;QACN7B,IAAIyB,OAAOzB;QACXS,OAAOqB,gBAAgBL,OAAOD,OAAO;QACrCO,YAAYN,OAAOX;MACrB,CAAA;IACF;AAEA,eAAWW,UAAUC,OAAOC,OAAO,KAAKvB,OAAO,GAAG;AAChD,YAAMC,SAAS,KAAKA,OAAOoB,OAAOD,OAAO,EAAEL;AAC3C,YAAME,cAAchB,OAAOa,OAAOI,MAAM,IAAIC,MAAM,sBAAA,CAAA;AAElD,iBAAW,CAACrD,MAAM8D,UAAAA,KAAeN,OAAOO,QAAQ5B,OAAO0B,UAAU,GAAI;AACnE,YAAIC,WAAWd,QAAQgB,yBAAyB;AAC9C,gBAAMzB,QAAQ0B,gCAAgCd,aAAanD,IAAAA;AAE3D,gBAAMkE,SAAS,KAAK9B,MAAM+B,KAAK,CAAC1B,SAASA,KAAKX,OAAOyB,OAAOzB,EAAE;AAC9D,cAAI,CAACoC,QAAQ;AACX;UACF;AAEA,gBAAM,EAAEpC,IAAIsC,SAAQ,IAAMb,OAAOX,KAAa5C,IAAAA,EAAMqE;AAEpD,gBAAMA,SAAS,KAAKjC,MAAM+B,KAAK,CAAC1B,SAASA,KAAKX,OAAOsC,QAAAA;AACrD,cAAI,CAACC,QAAQ;AACX;UACF;AAEA,eAAKhC,cAAcqB,KAAK;YACtBC,MAAM;YACN7B,IAAI,GAAGyB,OAAOzB,EAAE,IAAI9B,IAAAA,IAAQqE,OAAOvC,EAAE;YACrCS;YACAsB,YAAY,CAAC;YACbK;YACAG;UACF,CAAA;QACF,WACEP,WAAWQ,SAAS,WACpBR,WAAWS,SACX,OAAOT,WAAWS,UAAU,YAC5B,SAAST,WAAWS,SACpBT,WAAWS,MAAMvB,QAAQgB,yBACzB;AACA,gBAAMzB,QAAQ0B,gCAAgCd,aAAanD,IAAAA;AAE3D,gBAAMkE,SAAS,KAAK9B,MAAM+B,KAAK,CAAC1B,SAASA,KAAKX,OAAOyB,OAAOzB,EAAE;AAC9D,cAAI,CAACoC,QAAQ;AACX;UACF;AAEA,qBAAW,EAAEpC,IAAIsC,SAAQ,KAAOb,OAAOX,KAAa5C,IAAAA,EAAMwE,IAAI,CAACC,MAAgBA,EAAEJ,MAAM,GAAG;AACxF,kBAAMA,SAAS,KAAKjC,MAAM+B,KAAK,CAAC1B,SAASA,KAAKX,OAAOsC,QAAAA;AACrD,gBAAI,CAACC,QAAQ;AACX;YACF;AAEA,iBAAKhC,cAAcqB,KAAK;cACtBC,MAAM;cACN7B,IAAI,GAAGyB,OAAOzB,EAAE,IAAI9B,IAAAA,IAAQoE,QAAAA;cAC5B7B;cACAsB,YAAY,CAAC;cACbK;cACAG;YACF,CAAA;UACF;QACF;MACF;IACF;EACF;AACF;;;ACtXA,SAASK,UAAAA,eAAc;AAEvB,SAASC,YAAYC,kBAAkBC,KAAKC,YAAAA,iBAAgB;AAKrD,IAAMC,UAAUC,QAAOC,OAAO;EACnCC,IAAIC;EACJC,MAAMJ,QAAOK,OAAOC,YAAY;IAAEC,aAAa;EAA0B,CAAA;EACzEC,OAAOR,QAAOS,SAAST,QAAOK,MAAM,EAAEC,YAAY;IAAEC,aAAa;EAAiB,CAAA;AACpF,CAAA,EACGG,KAAKV,QAAOW,OAAO,EACnBL,YAAY;EACX,CAACM,gBAAAA,GAAmB;IAClBC,MAAMC,WAAWC;IACjBC,UAAU;IACVC,SAAS;EACX;EACAV,aAAa;AACf,CAAA;AAIK,IAAMW,UAAUlB,QAAOC,OAAO;EACnCC,IAAIC;EACJC,MAAMJ,QAAOK,OAAOC,YAAY;IAAEC,aAAa;EAA2B,CAAA;EAC1EA,aAAaP,QAAOS,SAAST,QAAOK,MAAM,EAAEC,YAAY;IAAEC,aAAa;EAAkC,CAAA;AAC3G,CAAA,EACGG,KAAKV,QAAOW,OAAO,EACnBL,YAAY;EACX,CAACM,gBAAAA,GAAmB;IAClBC,MAAMC,WAAWC;IACjBC,UAAU;IACVC,SAAS;EACX;EACAV,aAAa;AACf,CAAA;AAGK,IAAMY,OAAOnB,QAAOC,OAAO;EAChCC,IAAIC;EACJC,MAAMJ,QAAOK,OAAOC,YAAY;IAAEC,aAAa;EAAwB,CAAA;EACvEA,aAAaP,QAAOS,SAAST,QAAOK,MAAM,EAAEC,YAAY;IAAEC,aAAa;EAA+B,CAAA;EACtGa,SAASC,IAAIH,OAAAA;EACbI,UAAUD,IAAItB,OAAAA;AAChB,CAAA,EACGW,KAAKV,QAAOW,OAAO,EACnBL,YAAY;EACX,CAACM,gBAAAA,GAAmB;IAClBC,MAAMC,WAAWC;IACjBC,UAAU;IACVC,SAAS;EACX;EACAV,aAAa;AACf,CAAA;AAIK,IAAMgB,eAAevB,QAAOC,OAAO;EACxCC,IAAIC;EACJC,MAAMJ,QAAOK,OAAOC,YAAY;IAAEC,aAAa;EAAgC,CAAA;EAC/EiB,UAAUxB,QAAOyB,MAAMJ,IAAIH,OAAAA,CAAAA;EAC3BQ,WAAW1B,QAAOyB,MAAMJ,IAAItB,OAAAA,CAAAA;AAC9B,CAAA,EACGW,KAAKV,QAAOW,OAAO,EACnBL,YAAY;EACX,CAACM,gBAAAA,GAAmB;IAClBC,MAAMC,WAAWC;IACjBC,UAAU;IACVC,SAAS;EACX;EACAV,aAAa;AACf,CAAA;",
6
- "names": ["AI_SERVICE_ENDPOINT", "LOCAL", "REMOTE", "createLogger", "stream", "filter", "onImage", "images", "currentText", "event", "printContentBlock", "content", "type", "process", "stdout", "write", "text", "name", "id", "source", "mediaType", "onTextBlockPrinted", "imageMatch", "match", "description", "message", "role", "toUpperCase", "delta", "partial_json", "block", "JSON", "stringify", "input", "isError", "createTestOllamaClient", "options", "OllamaClient", "tools", "overrides", "model", "DEFAULT_OLLAMA_MODEL", "temperature", "inspect", "ConsolePrinter", "printMessage", "message", "console", "log", "role", "toUpperCase", "content", "printContentBlock", "type", "text", "name", "inspect", "input", "depth", "colors", "data", "JSON", "parse", "toolUseId", "Schema", "defineTool", "ToolResult", "toJsonSchema", "log", "createCypherTool", "dataSource", "schemaTypes", "defineTool", "name", "description", "length", "createSystemPrompt", "schema", "Schema", "Struct", "query", "String", "annotations", "execute", "log", "results", "executeQuery", "ToolResult", "Success", "e", "catch", "Error", "message", "trim", "formatJsonSchemaForLLM", "map", "toJsonSchema", "raise", "JSON_SCHEMA_ECHO_REF_ID", "ObjectId", "toJsonSchema", "Ref", "RefImpl", "invariant", "live", "seedTestData", "db", "contactRich", "add", "live", "Contact", "name", "contactJosiah", "contactDima", "contactFred", "projectComposer", "Project", "projectEcho", "projectDoodles", "_taskComposer1", "Task", "project", "RefImpl", "make", "assignee", "_taskComposer2", "_taskComposer3", "_taskComposer5", "_taskComposer4", "_taskEcho1", "_taskEcho2", "_taskDoodles1", "_taskDoodles2", "_orgDxos", "Organization", "employees", "projects", "_orgBraneframe", "createTestData", "dataSource", "MockDataSource", "id", "ObjectId", "random", "computeGraph", "objects", "schema", "nodes", "relationships", "getNodes", "label", "filter", "node", "getRelationships", "relationship", "data", "invariant", "jsonSchema", "toJsonSchema", "$id", "json", "instance", "typenameDxn", "raise", "Error", "typeDxn", "object", "Object", "values", "push", "kind", "formatNodeLabel", "properties", "propSchema", "entries", "JSON_SCHEMA_ECHO_REF_ID", "formatInferredRelationshipLabel", "source", "find", "targetId", "target", "type", "items", "map", "x", "Schema", "EntityKind", "TypeAnnotationId", "Ref", "ObjectId", "Contact", "Schema", "Struct", "id", "ObjectId", "name", "String", "annotations", "description", "email", "optional", "pipe", "mutable", "TypeAnnotationId", "kind", "EntityKind", "Object", "typename", "version", "Project", "Task", "project", "Ref", "assignee", "Organization", "projects", "Array", "employees"]
3
+ "sources": ["../../../../src/testing/defs.ts", "../../../../src/testing/logger.ts", "../../../../src/testing/ollama.ts", "../../../../src/testing/query-promts.ts", "../../../../src/testing/test-data.ts", "../../../../src/testing/test-schema.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\n// TODO(burdon): Remove/Reconcile with @dxos/assistant-testing.\nexport const AI_SERVICE_ENDPOINT = {\n LOCAL: 'http://localhost:8788',\n REMOTE: 'https://ai-service.dxos.workers.dev',\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type { ImageSource, MessageContentBlock } from '@dxos/artifact';\n\nimport type { ConversationEvent } from '../conversation';\n\nexport const createLogger = ({\n stream,\n filter,\n onImage,\n}: {\n stream?: boolean;\n filter?: (event: ConversationEvent) => boolean;\n onImage?: (img: { id: string; description?: string; source: ImageSource }) => void;\n} = {}) => {\n const images: Record<string, any> = {};\n let currentText = '';\n\n return (event: ConversationEvent) => {\n if (typeof filter === 'function' && !filter(event)) {\n return;\n }\n\n const printContentBlock = (content: MessageContentBlock) => {\n switch (content.type) {\n case 'text':\n process.stdout.write(content.text);\n break;\n case 'tool_use':\n process.stdout.write(`⚙️ [Tool Use] ${content.name}\\n`);\n break;\n case 'image': {\n if (content.id && content.source) {\n images[content.id] = content.source;\n }\n process.stdout.write(`[Image id=${content.id} mediaType=${content.source?.mediaType}]`);\n break;\n }\n }\n };\n\n const onTextBlockPrinted = (text: string) => {\n const imageMatch = text.match(/<image id=\"([^\"]+)\"(?:\\s+prompt=\"([^\"]+)\")?\\s*\\/>/);\n if (imageMatch && onImage && images[imageMatch[1]]) {\n onImage({\n id: imageMatch[1],\n description: imageMatch[2], // Extract prompt as description if present\n source: images[imageMatch[1]],\n });\n }\n };\n\n if (stream) {\n switch (event.type) {\n case 'message_start': {\n process.stdout.write(`${event.message.role.toUpperCase()}\\n\\n`);\n for (const content of event.message.content) {\n printContentBlock(content);\n }\n break;\n }\n case 'content_block_start': {\n currentText = '';\n printContentBlock(event.content);\n break;\n }\n case 'content_block_delta': {\n switch (event.delta.type) {\n case 'text_delta': {\n currentText += event.delta.text;\n process.stdout.write(event.delta.text);\n break;\n }\n case 'input_json_delta': {\n process.stdout.write(event.delta.partial_json);\n break;\n }\n }\n break;\n }\n case 'content_block_stop': {\n process.stdout.write('\\n');\n onTextBlockPrinted(currentText);\n currentText = '';\n break;\n }\n case 'message_delta': {\n break;\n }\n case 'message_stop': {\n process.stdout.write('\\n\\n');\n break;\n }\n }\n }\n\n switch (event.type) {\n case 'message': {\n if (!stream || event.message.role !== 'assistant') {\n process.stdout.write(`${event.message.role.toUpperCase()}\\n\\n`);\n for (const block of event.message.content) {\n switch (block.type) {\n case 'text':\n process.stdout.write(block.text + '\\n');\n onTextBlockPrinted(block.text);\n break;\n case 'tool_use':\n process.stdout.write(`⚙️ [Tool Use] ${block.name}\\n`);\n process.stdout.write(` ${JSON.stringify(block.input)}\\n`);\n break;\n case 'tool_result':\n if (block.isError) {\n process.stdout.write('❌ [Tool Error]\\n');\n process.stdout.write(block.content + '\\n');\n } else {\n process.stdout.write('✅ [Tool Success]\\n');\n process.stdout.write(block.content + '\\n');\n }\n }\n process.stdout.write('\\n\\n');\n }\n }\n break;\n }\n }\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { DEFAULT_OLLAMA_MODEL, OllamaClient, type OllamaClientParams } from '../ai-service';\n\n/**\n * Create a test client with small local model and no temperature for predictable results.\n */\nexport const createTestOllamaClient = (options?: Pick<OllamaClientParams, 'tools'>) => {\n return new OllamaClient({\n tools: options?.tools,\n overrides: { model: DEFAULT_OLLAMA_MODEL, temperature: 0 },\n });\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema as S } from 'effect';\n\nimport { defineTool, ToolResult } from '@dxos/artifact';\nimport { toJsonSchema } from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\n\nimport { executeQuery, formatJsonSchemaForLLM, type DataSource } from '../cypher';\nimport { trim } from '../util';\n\nexport const createCypherTool = (dataSource: DataSource, schemaTypes: S.Schema.Any[] = []) =>\n defineTool('dxos.org/echo', {\n name: 'query',\n description:\n 'Query the ECHO graph database in cypher query language. Returns data from the database.' +\n (schemaTypes.length > 0 ? `\\n\\n${createSystemPrompt(schemaTypes)}` : ''),\n schema: S.Struct({\n query: S.String.annotations({\n description: `\n A valid cypher query string to execute.\n Query must have one MATCH clause.\n Match clause can have multiple patterns but they must all be connected via a relationship chain.\n Query might have zero or one WHERE clauses.\n Query must have one RETURN clause.\n RETURN clause can have multiple expressions separated by commas.\n DISTINCT keyword is not allowed.\n\n <example>\n MATCH (n:Person) RETURN n.name\n </example>\n\n <example>\n MATCH (s:Studio)-[:PRODUCED]->(m:Movie)-[:PRODUCED_IN]->(c:City {name: \"Las Vegas\"}) RETURN s\n </example>\n \n <example>\n MATCH (a:Actor)-[:STARRED_IN]->(m:Movie)<-[:PRODUCED]-(s:Studio {name: \"Cinema Pictures\"}) WHERE m.name = \"Once upon a time\" RETURN m.name, a.name\n </example>\n `,\n }),\n }),\n execute: async ({ query }) => {\n try {\n log('cypher query', { query });\n const results = await executeQuery(dataSource, query);\n log('query complete', { results });\n return ToolResult.Success(results);\n } catch (e: any) {\n log.catch(e);\n return ToolResult.Error(e.message);\n }\n },\n });\n\nexport const createSystemPrompt = (schemaTypes: S.Schema.Any[]) => trim`\n You have access to ECHO graph database. You can query the database to get data to satisfy user prompts.\n\n Database schema is defined in pseud-cypher syntax. The schema is:\n\n <schema>\n ${formatJsonSchemaForLLM(schemaTypes.map((schema) => toJsonSchema(schema)))}\n <schema>\n\n Before replying always think step-by-step on how to proceed.\n Print your thoughts inside <cot> tags.\n \n <example>\n <cot>To answer the question I need to ...</cot>\n </example>\n\n Before answering the user's question, decide what tools you need to use to answer the question.\n`;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Schema as S } from 'effect';\n\nimport { raise } from '@dxos/debug';\nimport type { EchoDatabase } from '@dxos/echo-db';\nimport { JSON_SCHEMA_ECHO_REF_ID, ObjectId, toJsonSchema, type JsonSchemaType, type Ref } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { create, makeRef } from '@dxos/live-object';\n\nimport {\n type DataSource,\n type Node,\n type Relationship,\n formatInferredRelationshipLabel,\n formatNodeLabel,\n} from '../cypher';\nimport { Contact, Org, Project, Task } from '../testing';\n\nexport const seedTestData = (db: EchoDatabase) => {\n const contactRich = db.add(\n create(Contact, {\n name: 'Rich',\n }),\n );\n const contactJosiah = db.add(\n create(Contact, {\n name: 'Josiah',\n }),\n );\n const contactDima = db.add(\n create(Contact, {\n name: 'Dima',\n }),\n );\n const contactFred = db.add(\n create(Contact, {\n name: 'Fred',\n }),\n );\n\n const projectComposer = db.add(\n create(Project, {\n name: 'Composer',\n }),\n );\n const projectEcho = db.add(\n create(Project, {\n name: 'ECHO',\n }),\n );\n const projectDoodles = db.add(\n create(Project, {\n name: 'Doodles',\n }),\n );\n\n const _taskComposer1 = db.add(\n create(Task, {\n name: 'Optimize startup performance',\n project: makeRef(projectComposer),\n assignee: makeRef(contactJosiah),\n }),\n );\n const _taskComposer2 = db.add(\n create(Task, {\n name: 'Create form builder',\n project: makeRef(projectComposer),\n assignee: makeRef(contactRich),\n }),\n );\n const _taskComposer3 = db.add(\n create(Task, {\n name: 'Add support for custom themes',\n project: makeRef(projectComposer),\n assignee: makeRef(contactJosiah),\n }),\n );\n const _taskComposer5 = db.add(\n create(Task, {\n name: 'Implement community plugin',\n project: makeRef(projectComposer),\n assignee: makeRef(contactFred),\n }),\n );\n const _taskComposer4 = db.add(\n create(Task, {\n name: 'Implement dark mode',\n project: makeRef(projectComposer),\n assignee: makeRef(contactRich),\n }),\n );\n const _taskEcho1 = db.add(\n create(Task, {\n name: 'Implement cypher query engine',\n project: makeRef(projectEcho),\n assignee: makeRef(contactDima),\n }),\n );\n const _taskEcho2 = db.add(\n create(Task, {\n name: 'Add schema editor',\n project: makeRef(projectEcho),\n assignee: makeRef(contactRich),\n }),\n );\n const _taskDoodles1 = db.add(\n create(Task, {\n name: 'Add support for custom themes',\n project: makeRef(projectDoodles),\n assignee: makeRef(contactFred),\n }),\n );\n const _taskDoodles2 = db.add(\n create(Task, {\n name: 'Implement dark mode',\n project: makeRef(projectDoodles),\n assignee: makeRef(contactJosiah),\n }),\n );\n\n const _orgDxos = db.add(\n create(Org, {\n name: 'DXOS',\n employees: [makeRef(contactRich), makeRef(contactJosiah), makeRef(contactDima)],\n projects: [makeRef(projectEcho)],\n }),\n );\n const _orgBraneframe = db.add(\n create(Org, {\n name: 'Braneframe',\n employees: [makeRef(contactJosiah), makeRef(contactRich)],\n projects: [makeRef(projectComposer)],\n }),\n );\n};\n\n// TODO(burdon): Use schema/testing.\nexport const createTestData = (): MockDataSource => {\n const dataSource = new MockDataSource();\n\n const contactRich = dataSource.add(Contact, {\n id: ObjectId.random(),\n name: 'Rich',\n });\n const contactJosiah = dataSource.add(Contact, {\n id: ObjectId.random(),\n name: 'Josiah',\n });\n const contactDima = dataSource.add(Contact, {\n id: ObjectId.random(),\n name: 'Dima',\n });\n const contactFred = dataSource.add(Contact, {\n id: ObjectId.random(),\n name: 'Fred',\n });\n\n const projectComposer = dataSource.add(Project, {\n id: ObjectId.random(),\n name: 'Composer',\n });\n const projectEcho = dataSource.add(Project, {\n id: ObjectId.random(),\n name: 'ECHO',\n });\n const projectDoodles = dataSource.add(Project, {\n id: ObjectId.random(),\n name: 'Doodles',\n });\n\n const _taskComposer1 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Optimize startup performance',\n project: makeRef(projectComposer),\n assignee: makeRef(contactJosiah),\n });\n const _taskComposer2 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Create form builder',\n project: makeRef(projectComposer),\n assignee: makeRef(contactRich),\n });\n const _taskComposer3 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Add support for custom themes',\n project: makeRef(projectComposer),\n assignee: makeRef(contactJosiah),\n });\n const _taskComposer5 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Implement community plugin',\n project: makeRef(projectComposer),\n assignee: makeRef(contactFred),\n });\n const _taskComposer4 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Implement dark mode',\n project: makeRef(projectComposer),\n assignee: makeRef(contactRich),\n });\n const _taskEcho1 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Implement cypher query engine',\n project: makeRef(projectEcho),\n assignee: makeRef(contactDima),\n });\n const _taskEcho2 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Add schema editor',\n project: makeRef(projectEcho),\n assignee: makeRef(contactRich),\n });\n const _taskDoodles1 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Add support for custom themes',\n project: makeRef(projectDoodles),\n assignee: makeRef(contactFred),\n });\n const _taskDoodles2 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Implement dark mode',\n project: makeRef(projectDoodles),\n assignee: makeRef(contactJosiah),\n });\n\n const _orgDxos = dataSource.add(Org, {\n id: ObjectId.random(),\n name: 'DXOS',\n employees: [makeRef(contactRich), makeRef(contactJosiah), makeRef(contactDima)],\n projects: [makeRef(projectEcho)],\n });\n const _orgBraneframe = dataSource.add(Org, {\n id: ObjectId.random(),\n name: 'Braneframe',\n employees: [makeRef(contactJosiah), makeRef(contactRich)],\n projects: [makeRef(projectComposer)],\n });\n dataSource.computeGraph();\n\n return dataSource;\n};\n\nexport class MockDataSource implements DataSource {\n objects: Record<\n string,\n {\n schema: S.Schema.All;\n typeDxn: string;\n id: string;\n data: unknown;\n }\n > = {};\n\n schema: Record<\n string,\n {\n json: JsonSchemaType;\n instance: S.Schema.All;\n }\n > = {};\n\n nodes: Node[] = [];\n relationships: Relationship[] = [];\n\n async getNodes({ label }: { label?: string }) {\n return this.nodes.filter((node) => !label || node.label === label);\n }\n\n async getRelationships({ label }: { label?: string }) {\n return this.relationships.filter((relationship) => !label || relationship.label === label);\n }\n\n add<S extends S.Schema.All>(schema: S, data: S.Schema.Type<S>) {\n invariant(typeof data.id === 'string', 'Data must have an id');\n const jsonSchema = toJsonSchema(schema);\n if (!this.schema[jsonSchema.$id!]) {\n this.schema[jsonSchema.$id!] = {\n json: jsonSchema,\n instance: schema,\n };\n }\n\n const typenameDxn = jsonSchema.$id ?? raise(new Error('Schema must have $id'));\n\n this.objects[data.id] = {\n schema,\n id: data.id,\n typeDxn: typenameDxn,\n data,\n };\n\n return data;\n }\n\n computeGraph() {\n this.nodes = [];\n this.relationships = [];\n\n for (const object of Object.values(this.objects)) {\n this.nodes.push({\n kind: 'node',\n id: object.id,\n label: formatNodeLabel(object.typeDxn),\n properties: object.data as any,\n });\n }\n\n for (const object of Object.values(this.objects)) {\n const schema = this.schema[object.typeDxn].json;\n const typenameDxn = schema.$id ?? raise(new Error('Schema must have $id'));\n\n for (const [name, propSchema] of Object.entries(schema.properties!)) {\n if (propSchema.$id === JSON_SCHEMA_ECHO_REF_ID) {\n const label = formatInferredRelationshipLabel(typenameDxn, name);\n\n const source = this.nodes.find((node) => node.id === object.id);\n if (!source) {\n continue;\n }\n\n const { id: targetId } = (object.data as any)[name].target;\n\n const target = this.nodes.find((node) => node.id === targetId);\n if (!target) {\n continue;\n }\n\n this.relationships.push({\n kind: 'relationship',\n id: `${object.id}-${name}-${target.id}`,\n label,\n properties: {},\n source,\n target,\n });\n } else if (\n propSchema.type === 'array' &&\n propSchema.items &&\n typeof propSchema.items === 'object' &&\n '$id' in propSchema.items &&\n propSchema.items.$id === JSON_SCHEMA_ECHO_REF_ID\n ) {\n const label = formatInferredRelationshipLabel(typenameDxn, name);\n\n const source = this.nodes.find((node) => node.id === object.id);\n if (!source) {\n continue;\n }\n\n for (const { id: targetId } of (object.data as any)[name].map((x: Ref<any>) => x.target)) {\n const target = this.nodes.find((node) => node.id === targetId);\n if (!target) {\n continue;\n }\n\n this.relationships.push({\n kind: 'relationship',\n id: `${object.id}-${name}-${targetId}`,\n label,\n properties: {},\n source,\n target,\n });\n }\n }\n }\n }\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema as S } from 'effect';\n\nimport { EntityKind, TypeAnnotationId, Ref } from '@dxos/echo-schema';\n\n// TODO(burdon): Reconcile with sdk/schema/testing.\n// TODO(burdon): Convert interface to type.\n\n// TODO(dmaretskyi): Extract.\nexport const ObjectId = S.String.annotations({ description: 'The unique object identifier.' });\n\nexport const Contact = S.Struct({\n id: ObjectId,\n name: S.String.annotations({ description: 'The name of the person.' }),\n email: S.optional(S.String).annotations({ description: 'Email address.' }),\n})\n .pipe(S.mutable)\n .annotations({\n [TypeAnnotationId]: {\n kind: EntityKind.Object,\n typename: 'example.com/type/Contact',\n version: '0.1.0',\n },\n description: 'Contact information.',\n });\nexport interface Contact extends S.Schema.Type<typeof Contact> {}\n\nexport const Project = S.Struct({\n id: ObjectId,\n name: S.String.annotations({ description: 'The name of the project.' }),\n description: S.optional(S.String).annotations({ description: 'The description of the project.' }),\n})\n .pipe(S.mutable)\n .annotations({\n [TypeAnnotationId]: {\n kind: EntityKind.Object,\n typename: 'example.com/type/Project',\n version: '0.1.0',\n },\n description: 'Contact information.',\n });\nexport interface Project extends S.Schema.Type<typeof Project> {}\n\nexport const Task = S.Struct({\n id: ObjectId,\n name: S.String.annotations({ description: 'The name of the task.' }),\n description: S.optional(S.String).annotations({ description: 'The description of the task.' }),\n project: Ref(Project),\n assignee: Ref(Contact),\n})\n .pipe(S.mutable)\n .annotations({\n [TypeAnnotationId]: {\n kind: EntityKind.Object,\n typename: 'example.com/type/Task',\n version: '0.1.0',\n },\n description: 'Contact information.',\n });\nexport interface Task extends S.Schema.Type<typeof Task> {}\n\nexport const Org = S.Struct({\n id: ObjectId,\n name: S.String.annotations({ description: 'The name of the organization.' }),\n projects: S.Array(Ref(Project)),\n employees: S.Array(Ref(Contact)),\n})\n .pipe(S.mutable)\n .annotations({\n [TypeAnnotationId]: {\n kind: EntityKind.Object,\n typename: 'example.com/type/Org',\n version: '0.1.0',\n },\n description: 'Contact information.',\n });\nexport interface Org extends S.Schema.Type<typeof Org> {}\n"],
5
+ "mappings": "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",
6
+ "names": ["AI_SERVICE_ENDPOINT", "LOCAL", "REMOTE", "createLogger", "stream", "filter", "onImage", "images", "currentText", "event", "printContentBlock", "content", "type", "process", "stdout", "write", "text", "name", "id", "source", "mediaType", "onTextBlockPrinted", "imageMatch", "match", "description", "message", "role", "toUpperCase", "delta", "partial_json", "block", "JSON", "stringify", "input", "isError", "createTestOllamaClient", "options", "OllamaClient", "tools", "overrides", "model", "DEFAULT_OLLAMA_MODEL", "temperature", "Schema", "S", "defineTool", "ToolResult", "toJsonSchema", "log", "createCypherTool", "dataSource", "schemaTypes", "defineTool", "name", "description", "length", "createSystemPrompt", "schema", "S", "Struct", "query", "String", "annotations", "execute", "log", "results", "executeQuery", "ToolResult", "Success", "e", "catch", "Error", "message", "trim", "formatJsonSchemaForLLM", "map", "toJsonSchema", "raise", "JSON_SCHEMA_ECHO_REF_ID", "ObjectId", "toJsonSchema", "invariant", "create", "makeRef", "seedTestData", "db", "contactRich", "add", "create", "Contact", "name", "contactJosiah", "contactDima", "contactFred", "projectComposer", "Project", "projectEcho", "projectDoodles", "_taskComposer1", "Task", "project", "makeRef", "assignee", "_taskComposer2", "_taskComposer3", "_taskComposer5", "_taskComposer4", "_taskEcho1", "_taskEcho2", "_taskDoodles1", "_taskDoodles2", "_orgDxos", "Org", "employees", "projects", "_orgBraneframe", "createTestData", "dataSource", "MockDataSource", "id", "ObjectId", "random", "computeGraph", "objects", "schema", "nodes", "relationships", "getNodes", "label", "filter", "node", "getRelationships", "relationship", "data", "invariant", "jsonSchema", "toJsonSchema", "$id", "json", "instance", "typenameDxn", "raise", "Error", "typeDxn", "object", "Object", "values", "push", "kind", "formatNodeLabel", "properties", "propSchema", "entries", "JSON_SCHEMA_ECHO_REF_ID", "formatInferredRelationshipLabel", "source", "find", "targetId", "target", "type", "items", "map", "x", "Schema", "S", "EntityKind", "TypeAnnotationId", "Ref", "ObjectId", "S", "String", "annotations", "description", "Contact", "Struct", "id", "name", "email", "optional", "pipe", "mutable", "TypeAnnotationId", "kind", "EntityKind", "Object", "typename", "version", "Project", "Task", "project", "Ref", "assignee", "Org", "projects", "Array", "employees"]
7
7
  }
@@ -1,5 +1,6 @@
1
+ import { Message } from '@dxos/artifact';
1
2
  import type { AIServiceClient, GenerationStream } from './service';
2
- import { type GenerateRequest, type GenerateResponse } from './types';
3
+ import { type GenerateRequest } from './types';
3
4
  export type AIServiceEdgeClientOptions = {
4
5
  endpoint: string;
5
6
  };
@@ -7,12 +8,12 @@ export declare class AIServiceEdgeClient implements AIServiceClient {
7
8
  private readonly _endpoint;
8
9
  constructor({ endpoint }: AIServiceEdgeClientOptions);
9
10
  /**
10
- * Generate non-streaming response.
11
+ * @deprecated
11
12
  */
12
- exec(request: GenerateRequest): Promise<GenerateResponse>;
13
+ appendMessages(messages: Message[]): Promise<void>;
13
14
  /**
14
15
  * Process request and open message stream.
15
16
  */
16
- execStream(request: GenerateRequest): Promise<GenerationStream>;
17
+ exec(request: GenerateRequest): Promise<GenerationStream>;
17
18
  }
18
19
  //# sourceMappingURL=edge-client.d.ts.map