@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.
- package/dist/lib/browser/{chunk-B4HAWUFW.mjs → chunk-PND5VR6D.mjs} +286 -757
- package/dist/lib/browser/chunk-PND5VR6D.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +324 -7
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +102 -139
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/node/{chunk-NOB7CIIC.cjs → chunk-IBOBRBDF.cjs} +303 -768
- package/dist/lib/node/chunk-IBOBRBDF.cjs.map +7 -0
- package/dist/lib/node/index.cjs +353 -36
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +93 -128
- package/dist/lib/node/testing/index.cjs.map +4 -4
- package/dist/lib/node-esm/{chunk-SAWYU3V5.mjs → chunk-DCQJOLSR.mjs} +286 -757
- package/dist/lib/node-esm/chunk-DCQJOLSR.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +324 -7
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +102 -139
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/types/src/ai-service/edge-client.d.ts +5 -4
- package/dist/types/src/ai-service/edge-client.d.ts.map +1 -1
- package/dist/types/src/ai-service/message-collector.d.ts +6 -0
- package/dist/types/src/ai-service/message-collector.d.ts.map +1 -1
- package/dist/types/src/ai-service/ollama-client.d.ts +2 -6
- package/dist/types/src/ai-service/ollama-client.d.ts.map +1 -1
- package/dist/types/src/ai-service/parser.d.ts +3 -0
- package/dist/types/src/ai-service/parser.d.ts.map +1 -1
- package/dist/types/src/ai-service/service.d.ts +2 -18
- package/dist/types/src/ai-service/service.d.ts.map +1 -1
- package/dist/types/src/ai-service/stream.d.ts.map +1 -1
- package/dist/types/src/ai-service/testing/mock.d.ts +2 -6
- package/dist/types/src/ai-service/testing/mock.d.ts.map +1 -1
- package/dist/types/src/ai-service/testing/test-stream.d.ts.map +1 -1
- package/dist/types/src/ai-service/types.d.ts +101 -144
- package/dist/types/src/ai-service/types.d.ts.map +1 -1
- package/dist/types/src/ai-service/util/sse.d.ts.map +1 -1
- package/dist/types/src/{experimental/conversation → conversation}/conversation.d.ts +21 -2
- package/dist/types/src/conversation/conversation.d.ts.map +1 -0
- package/dist/types/src/conversation/conversation.test.d.ts.map +1 -0
- package/dist/types/src/conversation/index.d.ts.map +1 -0
- package/dist/types/src/{experimental/conversation → conversation}/types.d.ts +12 -11
- package/dist/types/src/conversation/types.d.ts.map +1 -0
- package/dist/types/src/cypher/ast.d.ts.map +1 -0
- package/dist/types/src/cypher/combinators.d.ts.map +1 -0
- package/dist/types/src/cypher/combinators.test.d.ts.map +1 -0
- package/dist/types/src/cypher/echo-data-source.d.ts.map +1 -0
- package/dist/types/src/cypher/execution-plan.d.ts.map +1 -0
- package/dist/types/src/cypher/execution-plan.test.d.ts.map +1 -0
- package/dist/types/src/cypher/index.d.ts.map +1 -0
- package/dist/types/src/cypher/parjs.d.ts.map +1 -0
- package/dist/types/src/cypher/parser.d.ts.map +1 -0
- package/dist/types/src/cypher/query-executor.d.ts.map +1 -0
- package/dist/types/src/cypher/query-executor.test.d.ts.map +1 -0
- package/dist/types/src/cypher/schema.d.ts.map +1 -0
- package/dist/types/src/cypher/schema.test.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +2 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/session/index.d.ts +0 -2
- package/dist/types/src/session/index.d.ts.map +1 -1
- package/dist/types/src/session/session.d.ts +13 -33
- package/dist/types/src/session/session.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +0 -1
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/logger.d.ts +1 -1
- package/dist/types/src/testing/logger.d.ts.map +1 -1
- package/dist/types/src/testing/ollama.d.ts.map +1 -1
- package/dist/types/src/testing/query-promts.d.ts +4 -4
- package/dist/types/src/testing/query-promts.d.ts.map +1 -1
- package/dist/types/src/testing/test-data.d.ts +5 -5
- package/dist/types/src/testing/test-data.d.ts.map +1 -1
- package/dist/types/src/testing/test-schema.d.ts +23 -25
- package/dist/types/src/testing/test-schema.d.ts.map +1 -1
- package/dist/types/src/util/trim.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -20
- package/src/ai-service/client.test.ts +73 -55
- package/src/ai-service/edge-client.ts +20 -13
- package/src/ai-service/ollama-client.ts +10 -17
- package/src/ai-service/parser.ts +2 -13
- package/src/ai-service/service.ts +3 -19
- package/src/ai-service/testing/mock.ts +1 -9
- package/src/ai-service/types.ts +15 -24
- package/src/bin/chat.ts +4 -4
- package/src/{experimental/conversation → conversation}/conversation.test.ts +5 -5
- package/src/{experimental/conversation → conversation}/conversation.ts +119 -4
- package/src/{experimental/conversation → conversation}/types.ts +14 -11
- package/src/{experimental/cypher → cypher}/combinators.test.ts +4 -4
- package/src/{experimental/cypher → cypher}/echo-data-source.ts +11 -11
- package/src/{experimental/cypher → cypher}/execution-plan.test.ts +1 -1
- package/src/{experimental/cypher → cypher}/query-executor.test.ts +2 -2
- package/src/{experimental/cypher → cypher}/schema.test.ts +3 -3
- package/src/{experimental/cypher → cypher}/schema.ts +1 -1
- package/src/index.ts +2 -3
- package/src/session/index.ts +0 -2
- package/src/session/session.test.ts +63 -35
- package/src/session/session.ts +151 -297
- package/src/testing/artifacts.test.ts +22 -22
- package/src/testing/index.ts +0 -1
- package/src/testing/logger.ts +1 -1
- package/src/testing/query-promts.ts +6 -6
- package/src/testing/query.test.ts +21 -18
- package/src/testing/test-data.ts +72 -79
- package/src/testing/test-schema.ts +29 -28
- package/dist/lib/browser/chunk-B4HAWUFW.mjs.map +0 -7
- package/dist/lib/node/chunk-NOB7CIIC.cjs.map +0 -7
- package/dist/lib/node-esm/chunk-SAWYU3V5.mjs.map +0 -7
- package/dist/types/src/experimental/conversation/conversation.d.ts.map +0 -1
- package/dist/types/src/experimental/conversation/conversation.test.d.ts.map +0 -1
- package/dist/types/src/experimental/conversation/index.d.ts.map +0 -1
- package/dist/types/src/experimental/conversation/types.d.ts.map +0 -1
- package/dist/types/src/experimental/cypher/ast.d.ts.map +0 -1
- package/dist/types/src/experimental/cypher/combinators.d.ts.map +0 -1
- package/dist/types/src/experimental/cypher/combinators.test.d.ts.map +0 -1
- package/dist/types/src/experimental/cypher/echo-data-source.d.ts.map +0 -1
- package/dist/types/src/experimental/cypher/execution-plan.d.ts.map +0 -1
- package/dist/types/src/experimental/cypher/execution-plan.test.d.ts.map +0 -1
- package/dist/types/src/experimental/cypher/index.d.ts.map +0 -1
- package/dist/types/src/experimental/cypher/parjs.d.ts.map +0 -1
- package/dist/types/src/experimental/cypher/parser.d.ts.map +0 -1
- package/dist/types/src/experimental/cypher/query-executor.d.ts.map +0 -1
- package/dist/types/src/experimental/cypher/query-executor.test.d.ts.map +0 -1
- package/dist/types/src/experimental/cypher/schema.d.ts.map +0 -1
- package/dist/types/src/experimental/cypher/schema.test.d.ts.map +0 -1
- package/dist/types/src/experimental/index.d.ts +0 -3
- package/dist/types/src/experimental/index.d.ts.map +0 -1
- package/dist/types/src/experimental/ner/ner.test.d.ts +0 -2
- package/dist/types/src/experimental/ner/ner.test.d.ts.map +0 -1
- package/dist/types/src/experimental/research/exa.d.ts +0 -6
- package/dist/types/src/experimental/research/exa.d.ts.map +0 -1
- package/dist/types/src/experimental/research/research.test.d.ts +0 -2
- package/dist/types/src/experimental/research/research.test.d.ts.map +0 -1
- package/dist/types/src/session/tools.d.ts +0 -18
- package/dist/types/src/session/tools.d.ts.map +0 -1
- package/dist/types/src/session/version-pin.d.ts +0 -22
- package/dist/types/src/session/version-pin.d.ts.map +0 -1
- package/dist/types/src/session/version-pin.test.d.ts +0 -2
- package/dist/types/src/session/version-pin.test.d.ts.map +0 -1
- package/dist/types/src/testing/printer.d.ts +0 -6
- package/dist/types/src/testing/printer.d.ts.map +0 -1
- package/src/experimental/index.ts +0 -6
- package/src/experimental/ner/ner.test.ts +0 -163
- package/src/experimental/research/exa.ts +0 -38
- package/src/experimental/research/instructions.tpl +0 -64
- package/src/experimental/research/research.test.ts +0 -263
- package/src/session/tools.ts +0 -117
- package/src/session/version-pin.test.ts +0 -26
- package/src/session/version-pin.ts +0 -49
- package/src/testing/printer.ts +0 -41
- package/src/typedefs.d.ts +0 -8
- /package/dist/types/src/{experimental/conversation → conversation}/conversation.test.d.ts +0 -0
- /package/dist/types/src/{experimental/conversation → conversation}/index.d.ts +0 -0
- /package/dist/types/src/{experimental/cypher → cypher}/ast.d.ts +0 -0
- /package/dist/types/src/{experimental/cypher → cypher}/combinators.d.ts +0 -0
- /package/dist/types/src/{experimental/cypher → cypher}/combinators.test.d.ts +0 -0
- /package/dist/types/src/{experimental/cypher → cypher}/echo-data-source.d.ts +0 -0
- /package/dist/types/src/{experimental/cypher → cypher}/execution-plan.d.ts +0 -0
- /package/dist/types/src/{experimental/cypher → cypher}/execution-plan.test.d.ts +0 -0
- /package/dist/types/src/{experimental/cypher → cypher}/index.d.ts +0 -0
- /package/dist/types/src/{experimental/cypher → cypher}/parjs.d.ts +0 -0
- /package/dist/types/src/{experimental/cypher → cypher}/parser.d.ts +0 -0
- /package/dist/types/src/{experimental/cypher → cypher}/query-executor.d.ts +0 -0
- /package/dist/types/src/{experimental/cypher → cypher}/query-executor.test.d.ts +0 -0
- /package/dist/types/src/{experimental/cypher → cypher}/schema.d.ts +0 -0
- /package/dist/types/src/{experimental/cypher → cypher}/schema.test.d.ts +0 -0
- /package/src/{experimental/conversation → conversation}/index.ts +0 -0
- /package/src/{experimental/cypher → cypher}/ast.ts +0 -0
- /package/src/{experimental/cypher → cypher}/combinators.ts +0 -0
- /package/src/{experimental/cypher → cypher}/execution-plan.ts +0 -0
- /package/src/{experimental/cypher → cypher}/index.ts +0 -0
- /package/src/{experimental/cypher → cypher}/parjs-shims.d.ts +0 -0
- /package/src/{experimental/cypher → cypher}/parjs.ts +0 -0
- /package/src/{experimental/cypher → cypher}/parser.ts +0 -0
- /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-
|
|
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:
|
|
198
|
-
query:
|
|
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
|
|
234
|
+
import { JSON_SCHEMA_ECHO_REF_ID, ObjectId, toJsonSchema as toJsonSchema2 } from "@dxos/echo-schema";
|
|
275
235
|
import { invariant } from "@dxos/invariant";
|
|
276
|
-
import {
|
|
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(
|
|
239
|
+
const contactRich = db.add(create(Contact, {
|
|
280
240
|
name: "Rich"
|
|
281
241
|
}));
|
|
282
|
-
const contactJosiah = db.add(
|
|
242
|
+
const contactJosiah = db.add(create(Contact, {
|
|
283
243
|
name: "Josiah"
|
|
284
244
|
}));
|
|
285
|
-
const contactDima = db.add(
|
|
245
|
+
const contactDima = db.add(create(Contact, {
|
|
286
246
|
name: "Dima"
|
|
287
247
|
}));
|
|
288
|
-
const contactFred = db.add(
|
|
248
|
+
const contactFred = db.add(create(Contact, {
|
|
289
249
|
name: "Fred"
|
|
290
250
|
}));
|
|
291
|
-
const projectComposer = db.add(
|
|
251
|
+
const projectComposer = db.add(create(Project, {
|
|
292
252
|
name: "Composer"
|
|
293
253
|
}));
|
|
294
|
-
const projectEcho = db.add(
|
|
254
|
+
const projectEcho = db.add(create(Project, {
|
|
295
255
|
name: "ECHO"
|
|
296
256
|
}));
|
|
297
|
-
const projectDoodles = db.add(
|
|
257
|
+
const projectDoodles = db.add(create(Project, {
|
|
298
258
|
name: "Doodles"
|
|
299
259
|
}));
|
|
300
|
-
const _taskComposer1 = db.add(
|
|
260
|
+
const _taskComposer1 = db.add(create(Task, {
|
|
301
261
|
name: "Optimize startup performance",
|
|
302
|
-
project:
|
|
303
|
-
assignee:
|
|
262
|
+
project: makeRef(projectComposer),
|
|
263
|
+
assignee: makeRef(contactJosiah)
|
|
304
264
|
}));
|
|
305
|
-
const _taskComposer2 = db.add(
|
|
265
|
+
const _taskComposer2 = db.add(create(Task, {
|
|
306
266
|
name: "Create form builder",
|
|
307
|
-
project:
|
|
308
|
-
assignee:
|
|
267
|
+
project: makeRef(projectComposer),
|
|
268
|
+
assignee: makeRef(contactRich)
|
|
309
269
|
}));
|
|
310
|
-
const _taskComposer3 = db.add(
|
|
270
|
+
const _taskComposer3 = db.add(create(Task, {
|
|
311
271
|
name: "Add support for custom themes",
|
|
312
|
-
project:
|
|
313
|
-
assignee:
|
|
272
|
+
project: makeRef(projectComposer),
|
|
273
|
+
assignee: makeRef(contactJosiah)
|
|
314
274
|
}));
|
|
315
|
-
const _taskComposer5 = db.add(
|
|
275
|
+
const _taskComposer5 = db.add(create(Task, {
|
|
316
276
|
name: "Implement community plugin",
|
|
317
|
-
project:
|
|
318
|
-
assignee:
|
|
277
|
+
project: makeRef(projectComposer),
|
|
278
|
+
assignee: makeRef(contactFred)
|
|
319
279
|
}));
|
|
320
|
-
const _taskComposer4 = db.add(
|
|
280
|
+
const _taskComposer4 = db.add(create(Task, {
|
|
321
281
|
name: "Implement dark mode",
|
|
322
|
-
project:
|
|
323
|
-
assignee:
|
|
282
|
+
project: makeRef(projectComposer),
|
|
283
|
+
assignee: makeRef(contactRich)
|
|
324
284
|
}));
|
|
325
|
-
const _taskEcho1 = db.add(
|
|
285
|
+
const _taskEcho1 = db.add(create(Task, {
|
|
326
286
|
name: "Implement cypher query engine",
|
|
327
|
-
project:
|
|
328
|
-
assignee:
|
|
287
|
+
project: makeRef(projectEcho),
|
|
288
|
+
assignee: makeRef(contactDima)
|
|
329
289
|
}));
|
|
330
|
-
const _taskEcho2 = db.add(
|
|
290
|
+
const _taskEcho2 = db.add(create(Task, {
|
|
331
291
|
name: "Add schema editor",
|
|
332
|
-
project:
|
|
333
|
-
assignee:
|
|
292
|
+
project: makeRef(projectEcho),
|
|
293
|
+
assignee: makeRef(contactRich)
|
|
334
294
|
}));
|
|
335
|
-
const _taskDoodles1 = db.add(
|
|
295
|
+
const _taskDoodles1 = db.add(create(Task, {
|
|
336
296
|
name: "Add support for custom themes",
|
|
337
|
-
project:
|
|
338
|
-
assignee:
|
|
297
|
+
project: makeRef(projectDoodles),
|
|
298
|
+
assignee: makeRef(contactFred)
|
|
339
299
|
}));
|
|
340
|
-
const _taskDoodles2 = db.add(
|
|
300
|
+
const _taskDoodles2 = db.add(create(Task, {
|
|
341
301
|
name: "Implement dark mode",
|
|
342
|
-
project:
|
|
343
|
-
assignee:
|
|
302
|
+
project: makeRef(projectDoodles),
|
|
303
|
+
assignee: makeRef(contactJosiah)
|
|
344
304
|
}));
|
|
345
|
-
const _orgDxos = db.add(
|
|
305
|
+
const _orgDxos = db.add(create(Org, {
|
|
346
306
|
name: "DXOS",
|
|
347
307
|
employees: [
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
308
|
+
makeRef(contactRich),
|
|
309
|
+
makeRef(contactJosiah),
|
|
310
|
+
makeRef(contactDima)
|
|
351
311
|
],
|
|
352
312
|
projects: [
|
|
353
|
-
|
|
313
|
+
makeRef(projectEcho)
|
|
354
314
|
]
|
|
355
315
|
}));
|
|
356
|
-
const _orgBraneframe = db.add(
|
|
316
|
+
const _orgBraneframe = db.add(create(Org, {
|
|
357
317
|
name: "Braneframe",
|
|
358
318
|
employees: [
|
|
359
|
-
|
|
360
|
-
|
|
319
|
+
makeRef(contactJosiah),
|
|
320
|
+
makeRef(contactRich)
|
|
361
321
|
],
|
|
362
322
|
projects: [
|
|
363
|
-
|
|
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:
|
|
401
|
-
assignee:
|
|
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:
|
|
407
|
-
assignee:
|
|
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:
|
|
413
|
-
assignee:
|
|
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:
|
|
419
|
-
assignee:
|
|
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:
|
|
425
|
-
assignee:
|
|
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:
|
|
431
|
-
assignee:
|
|
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:
|
|
437
|
-
assignee:
|
|
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:
|
|
443
|
-
assignee:
|
|
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:
|
|
449
|
-
assignee:
|
|
408
|
+
project: makeRef(projectDoodles),
|
|
409
|
+
assignee: makeRef(contactJosiah)
|
|
450
410
|
});
|
|
451
|
-
const _orgDxos = dataSource.add(
|
|
411
|
+
const _orgDxos = dataSource.add(Org, {
|
|
452
412
|
id: ObjectId.random(),
|
|
453
413
|
name: "DXOS",
|
|
454
414
|
employees: [
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
415
|
+
makeRef(contactRich),
|
|
416
|
+
makeRef(contactJosiah),
|
|
417
|
+
makeRef(contactDima)
|
|
458
418
|
],
|
|
459
419
|
projects: [
|
|
460
|
-
|
|
420
|
+
makeRef(projectEcho)
|
|
461
421
|
]
|
|
462
422
|
});
|
|
463
|
-
const _orgBraneframe = dataSource.add(
|
|
423
|
+
const _orgBraneframe = dataSource.add(Org, {
|
|
464
424
|
id: ObjectId.random(),
|
|
465
425
|
name: "Braneframe",
|
|
466
426
|
employees: [
|
|
467
|
-
|
|
468
|
-
|
|
427
|
+
makeRef(contactJosiah),
|
|
428
|
+
makeRef(contactRich)
|
|
469
429
|
],
|
|
470
430
|
projects: [
|
|
471
|
-
|
|
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:
|
|
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
|
|
578
|
-
import { EntityKind, TypeAnnotationId, Ref
|
|
579
|
-
var
|
|
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:
|
|
544
|
+
name: S2.String.annotations({
|
|
582
545
|
description: "The name of the person."
|
|
583
546
|
}),
|
|
584
|
-
email:
|
|
547
|
+
email: S2.optional(S2.String).annotations({
|
|
585
548
|
description: "Email address."
|
|
586
549
|
})
|
|
587
|
-
}).pipe(
|
|
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 =
|
|
558
|
+
var Project = S2.Struct({
|
|
596
559
|
id: ObjectId2,
|
|
597
|
-
name:
|
|
560
|
+
name: S2.String.annotations({
|
|
598
561
|
description: "The name of the project."
|
|
599
562
|
}),
|
|
600
|
-
description:
|
|
563
|
+
description: S2.optional(S2.String).annotations({
|
|
601
564
|
description: "The description of the project."
|
|
602
565
|
})
|
|
603
|
-
}).pipe(
|
|
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 =
|
|
574
|
+
var Task = S2.Struct({
|
|
612
575
|
id: ObjectId2,
|
|
613
|
-
name:
|
|
576
|
+
name: S2.String.annotations({
|
|
614
577
|
description: "The name of the task."
|
|
615
578
|
}),
|
|
616
|
-
description:
|
|
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(
|
|
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
|
|
592
|
+
var Org = S2.Struct({
|
|
630
593
|
id: ObjectId2,
|
|
631
|
-
name:
|
|
594
|
+
name: S2.String.annotations({
|
|
632
595
|
description: "The name of the organization."
|
|
633
596
|
}),
|
|
634
|
-
projects:
|
|
635
|
-
employees:
|
|
636
|
-
}).pipe(
|
|
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/
|
|
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
|
-
|
|
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/
|
|
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", "
|
|
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
|
|
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
|
-
*
|
|
11
|
+
* @deprecated
|
|
11
12
|
*/
|
|
12
|
-
|
|
13
|
+
appendMessages(messages: Message[]): Promise<void>;
|
|
13
14
|
/**
|
|
14
15
|
* Process request and open message stream.
|
|
15
16
|
*/
|
|
16
|
-
|
|
17
|
+
exec(request: GenerateRequest): Promise<GenerationStream>;
|
|
17
18
|
}
|
|
18
19
|
//# sourceMappingURL=edge-client.d.ts.map
|