@dxos/assistant 0.8.0 → 0.8.1-main.013e445

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 (99) hide show
  1. package/dist/lib/browser/chunk-BDMTBYIM.mjs +2285 -0
  2. package/dist/lib/browser/chunk-BDMTBYIM.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +328 -1206
  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 +17 -3
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node/chunk-A44NGSCM.cjs +2296 -0
  9. package/dist/lib/node/chunk-A44NGSCM.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +335 -1206
  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 +40 -29
  14. package/dist/lib/node/testing/index.cjs.map +4 -4
  15. package/dist/lib/node-esm/chunk-J6DMSFSZ.mjs +2287 -0
  16. package/dist/lib/node-esm/chunk-J6DMSFSZ.mjs.map +7 -0
  17. package/dist/lib/node-esm/index.mjs +328 -1206
  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 +17 -3
  21. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  22. package/dist/types/src/ai-service/defs.d.ts +8 -2
  23. package/dist/types/src/ai-service/defs.d.ts.map +1 -1
  24. package/dist/types/src/ai-service/edge-client.d.ts +19 -0
  25. package/dist/types/src/ai-service/edge-client.d.ts.map +1 -0
  26. package/dist/types/src/ai-service/index.d.ts +4 -1
  27. package/dist/types/src/ai-service/index.d.ts.map +1 -1
  28. package/dist/types/src/ai-service/message-collector.d.ts +88 -0
  29. package/dist/types/src/ai-service/message-collector.d.ts.map +1 -0
  30. package/dist/types/src/ai-service/ollama-client.d.ts +39 -0
  31. package/dist/types/src/ai-service/ollama-client.d.ts.map +1 -0
  32. package/dist/types/src/ai-service/parser.d.ts +11 -9
  33. package/dist/types/src/ai-service/parser.d.ts.map +1 -1
  34. package/dist/types/src/ai-service/service.d.ts +9 -0
  35. package/dist/types/src/ai-service/service.d.ts.map +1 -0
  36. package/dist/types/src/ai-service/stream.d.ts +2 -1
  37. package/dist/types/src/ai-service/stream.d.ts.map +1 -1
  38. package/dist/types/src/ai-service/testing/mock.d.ts +2 -2
  39. package/dist/types/src/ai-service/testing/mock.d.ts.map +1 -1
  40. package/dist/types/src/ai-service/types.d.ts +91 -157
  41. package/dist/types/src/ai-service/types.d.ts.map +1 -1
  42. package/dist/types/src/conversation/conversation.d.ts +11 -9
  43. package/dist/types/src/conversation/conversation.d.ts.map +1 -1
  44. package/dist/types/src/conversation/types.d.ts +1 -1
  45. package/dist/types/src/conversation/types.d.ts.map +1 -1
  46. package/dist/types/src/index.d.ts +1 -0
  47. package/dist/types/src/index.d.ts.map +1 -1
  48. package/dist/types/src/session/index.d.ts +2 -0
  49. package/dist/types/src/session/index.d.ts.map +1 -0
  50. package/dist/types/src/session/session.d.ts +215 -0
  51. package/dist/types/src/session/session.d.ts.map +1 -0
  52. package/dist/types/src/session/session.test.d.ts +2 -0
  53. package/dist/types/src/session/session.test.d.ts.map +1 -0
  54. package/dist/types/src/testing/index.d.ts +1 -0
  55. package/dist/types/src/testing/index.d.ts.map +1 -1
  56. package/dist/types/src/testing/ollama.d.ts +6 -0
  57. package/dist/types/src/testing/ollama.d.ts.map +1 -0
  58. package/dist/types/src/testing/query-promts.d.ts +1 -1
  59. package/dist/types/src/testing/query-promts.d.ts.map +1 -1
  60. package/dist/types/src/testing/test-data.d.ts +1 -1
  61. package/dist/types/src/testing/test-data.d.ts.map +1 -1
  62. package/dist/types/src/testing/test-schema.d.ts +1 -1
  63. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  64. package/package.json +17 -14
  65. package/src/ai-service/client.test.ts +100 -13
  66. package/src/ai-service/defs.ts +18 -3
  67. package/src/ai-service/{client.ts → edge-client.ts} +18 -26
  68. package/src/ai-service/index.ts +4 -1
  69. package/src/ai-service/message-collector.ts +84 -0
  70. package/src/ai-service/ollama-client.ts +499 -0
  71. package/src/ai-service/parser.ts +8 -2
  72. package/src/ai-service/service.ts +15 -0
  73. package/src/ai-service/stream.ts +5 -3
  74. package/src/ai-service/testing/mock.ts +7 -2
  75. package/src/ai-service/types.ts +3 -3
  76. package/src/bin/chat.ts +3 -3
  77. package/src/conversation/conversation.test.ts +5 -5
  78. package/src/conversation/conversation.ts +3 -2
  79. package/src/conversation/types.ts +1 -1
  80. package/src/index.ts +1 -0
  81. package/src/session/index.ts +5 -0
  82. package/src/session/session.test.ts +256 -0
  83. package/src/session/session.ts +369 -0
  84. package/src/testing/artifacts.test.ts +4 -4
  85. package/src/testing/index.ts +1 -0
  86. package/src/testing/object-extraction.test.ts +1 -1
  87. package/src/testing/ollama.ts +15 -0
  88. package/src/testing/query-promts.ts +1 -1
  89. package/src/testing/query.test.ts +4 -4
  90. package/src/testing/test-data.ts +1 -1
  91. package/src/testing/test-schema.ts +1 -1
  92. package/dist/lib/browser/chunk-AXUUNA7O.mjs +0 -565
  93. package/dist/lib/browser/chunk-AXUUNA7O.mjs.map +0 -7
  94. package/dist/lib/node/chunk-QPHGQINW.cjs +0 -577
  95. package/dist/lib/node/chunk-QPHGQINW.cjs.map +0 -7
  96. package/dist/lib/node-esm/chunk-GOVFOBIB.mjs +0 -567
  97. package/dist/lib/node-esm/chunk-GOVFOBIB.mjs.map +0 -7
  98. package/dist/types/src/ai-service/client.d.ts +0 -25
  99. package/dist/types/src/ai-service/client.d.ts.map +0 -1
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/cypher/parjs.ts", "../../../src/cypher/combinators.ts", "../../../src/cypher/parser.ts", "../../../src/cypher/query-executor.ts", "../../../src/cypher/execution-plan.ts", "../../../src/cypher/schema.ts", "../../../src/util/trim.ts", "../../../src/cypher/echo-data-source.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\n// Workaround for https://github.com/vitest-dev/vitest/issues/7174.\nimport type { Parjser } from 'parjs';\n\nimport { parjsCombinators, parjs } from '#parjs';\n\nexport { type Parjser, parjsCombinators, parjs };\n", "//\n// Copyright 2024 DXOS.org\n//\n\n/* eslint-disable unused-imports/no-unused-vars */\n/* eslint-disable @typescript-eslint/consistent-type-imports */\n\nimport type {\n CypherQuery,\n EqualsPredicate,\n GraphPattern,\n GraphPatternConnector,\n Identifier,\n MatchClause,\n MemberExpression,\n NodePattern,\n Properties,\n Property,\n RelationshipPattern,\n ReturnClause,\n StringLiteral,\n WhereClause,\n} from './ast';\nimport { Parjser, parjs, parjsCombinators } from './parjs';\n\n// Helper parsers\nconst ws = parjs.whitespace(); // Parses whitespace\n\nconst nothing = parjs.string('').pipe(parjsCombinators.map(() => null)); // Parses nothing\n\nconst optional = <T>(parser: Parjser<T>) =>\n parser.pipe(\n parjsCombinators.recover(() => ({ kind: 'Soft' })),\n parjsCombinators.or(nothing),\n ); // Makes a parser optional\n\nconst keyword = (word: string) => parjs.string(word).pipe(parjsCombinators.map(() => word)); // Parses specific keywords\n\n// Identifiers (node labels, relationship types, variables, etc.)\nexport const identifier = parjs.regexp(/[a-zA-Z_][a-zA-Z0-9_]*/).pipe(\n parjsCombinators.map((match): Identifier => ({ astKind: 'Identifier', name: match[0] })), // Extract the matched string\n);\n\n// Literals (numbers and strings)\nconst numberLiteral = parjs.regexp(/-?\\d+(\\.\\d+)?/).pipe(parjsCombinators.map(Number)); // Numbers\nconst stringLiteral = parjs.regexp(/\"([^\"]*)\"|'([^']*)'/).pipe(\n parjsCombinators.map((match): StringLiteral => ({ astKind: 'StringLiteral', value: match[1] || match[2] })), // Extract content without quotes\n);\n\n// Node pattern (e.g., \"(n:Person {name: 'John'})\"\nconst variableTag = identifier.pipe(parjsCombinators.map((variable) => variable)).expects('variable tag');\nexport const label = identifier.pipe(parjsCombinators.map((name) => name));\nexport const property = identifier.pipe(\n parjsCombinators.then(parjs.string(':'), ws, stringLiteral),\n parjsCombinators.map(([key, , , value]): Property => ({ key, value })),\n);\nexport const properties = property.pipe(\n parjsCombinators.manySepBy(','),\n parjsCombinators.between('{', '}'),\n parjsCombinators.map((properties): Properties => ({ astKind: 'Properties', properties })),\n);\nexport const nodePattern = optional(variableTag).pipe(\n parjsCombinators.then(':'),\n parjsCombinators.then(ws, label, ws),\n parjsCombinators.then(optional(properties)),\n parjsCombinators.between('(', ')'),\n parjsCombinators.map(\n ([[[variable], _, label], properties]): NodePattern => ({ astKind: 'NodePattern', variable, label, properties }),\n ),\n);\n\nexport const relationshipPattern = optional(variableTag).pipe(\n parjsCombinators.then(':'),\n parjsCombinators.then(ws, label, ws),\n parjsCombinators.then(optional(properties)),\n parjsCombinators.between('[', ']'),\n parjsCombinators.map(\n ([[[variable], _, label], properties]): RelationshipPattern => ({\n astKind: 'RelationshipPattern',\n variable,\n label,\n properties,\n }),\n ),\n);\n\nconst graphPatternConnector = parjs.string('->').pipe(\n parjsCombinators.or('<-' as const, '-' as const),\n parjsCombinators.map((x): GraphPatternConnector => ({ astKind: 'GraphPatternConnector', direction: x })),\n);\n\nexport const graphPattern = nodePattern.pipe(\n parjsCombinators.or(relationshipPattern),\n parjsCombinators.manySepBy(graphPatternConnector),\n parjsCombinators.map((segments): GraphPattern => ({ astKind: 'GraphPattern', segments })),\n);\n\nexport const matchClause = keyword('MATCH').pipe(\n parjsCombinators.then(ws),\n parjsCombinators.then(graphPattern),\n parjsCombinators.map(([, pattern]): MatchClause => ({ astKind: 'MatchClause', pattern })),\n);\n\nconst memberExpression = identifier.pipe(\n parjsCombinators.manySepBy('.'),\n parjsCombinators.map((path): MemberExpression => ({ astKind: 'MemberExpression', path })),\n);\n\nconst equalsPredicate = memberExpression.pipe(\n parjsCombinators.then(ws, parjs.string('='), ws, stringLiteral),\n parjsCombinators.map(([left, , , , right]): EqualsPredicate => ({ astKind: 'EqualsPredicate', left, right })),\n);\n\nexport const whereClause = keyword('WHERE').pipe(\n parjsCombinators.then(\n ws,\n equalsPredicate.pipe(parjsCombinators.between(ws, ws), parjsCombinators.manySepBy(parjs.string('AND'))),\n ws,\n ),\n parjsCombinators.map(([, , predicates]): WhereClause => ({ astKind: 'WhereClause', predicates })),\n);\n\nexport const returnClause = keyword('RETURN').pipe(\n parjsCombinators.then(\n ws,\n memberExpression.pipe(\n parjsCombinators.then(\n optional(parjs.string('AS').pipe(parjsCombinators.between(ws), parjsCombinators.then(identifier))),\n ws,\n ),\n parjsCombinators.manySepBy(parjs.string(',').pipe(parjsCombinators.then(ws))),\n ),\n ws,\n ),\n parjsCombinators.map(([, , fields]): ReturnClause => ({ astKind: 'ReturnClause', fields: fields.map(([f]) => f) })),\n);\n\nexport const cypherQuery = ws.pipe(\n parjsCombinators.then(matchClause, ws, optional(whereClause), ws, returnClause, ws),\n parjsCombinators.map(\n ([, matchClause, , whereClause, , returnClause]): CypherQuery => ({\n astKind: 'CypherQuery',\n matchClause,\n whereClause,\n returnClause,\n }),\n ),\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type { CypherQuery } from './ast';\nimport { cypherQuery } from './combinators';\n\nexport type ParsedQuery = {\n ast: CypherQuery;\n};\n\nexport const parseCypherQuery = (query: string): ParsedQuery => {\n const parseResult = cypherQuery.parse(query);\n if (parseResult.isOk) {\n return { ast: parseResult.value };\n } else {\n throw new Error(`Failed to parse query: ${parseResult}`);\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type { JsonPath } from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\nimport { mapValues } from '@dxos/util';\n\nimport { createExecutionPlan, type ExecutionPlan, type VariableName } from './execution-plan';\nimport { parseCypherQuery } from './parser';\n\nexport interface DataSource {\n getNodes: (params: { label?: string }) => Promise<Node[]>;\n getRelationships: (params: { label?: string }) => Promise<Relationship[]>;\n}\n\nexport type Node = {\n id: string;\n kind: 'node';\n label: string;\n properties: Record<string, unknown>;\n};\n\nexport type Relationship = {\n id: string;\n kind: 'relationship';\n label: string;\n properties: Record<string, unknown>;\n source: Node;\n target: Node;\n};\n\nexport const executeQueryPlan = async (\n dataSource: DataSource,\n plan: ExecutionPlan,\n): Promise<Record<string, unknown>[]> => {\n let buffer: Record<VariableName, Node | Relationship>[] = [];\n const results: Record<string, unknown>[] = [];\n\n for (const step of plan.steps) {\n log('begin step', { step });\n\n switch (step.type) {\n case 'NodeScan': {\n const nodes = await dataSource.getNodes({ label: step.label });\n buffer.push(...nodes.map((node) => ({ [step.into]: node })));\n break;\n }\n case 'FilterByLabel': {\n buffer = buffer.filter((item) => {\n const node = item[step.variable];\n return node && node.kind === 'node' && node.label === step.label;\n });\n break;\n }\n case 'FilterByProperty': {\n buffer = buffer.filter((item) => {\n const node = item[step.variable];\n return node && node.kind === 'node' && node.properties[step.property] === step.value;\n });\n break;\n }\n case 'RelationshipScan': {\n const relationships = await dataSource.getRelationships({ label: step.label });\n for (const tuple of [...buffer]) {\n if (tuple[step.anchor].kind !== 'node') {\n continue;\n }\n const filteredRelationships = relationships.filter((relationship) => {\n switch (step.direction) {\n case 'in':\n return relationship.target.id === tuple[step.anchor].id;\n case 'out':\n return relationship.source.id === tuple[step.anchor].id;\n case 'both':\n return (\n relationship.source.id === tuple[step.anchor].id || relationship.target.id === tuple[step.anchor].id\n );\n default:\n throw new Error(`Unknown direction: ${step.direction}`);\n }\n });\n for (let i = 0; i < filteredRelationships.length; i++) {\n const relationship = filteredRelationships[i];\n const newTuple = i === 0 ? tuple : { ...tuple };\n if (newTuple !== tuple) {\n buffer.push(newTuple);\n }\n newTuple[step.relationshipInto] = relationship;\n switch (step.direction) {\n case 'in':\n newTuple[step.nodeInto] = relationship.source;\n break;\n case 'out':\n newTuple[step.nodeInto] = relationship.target;\n break;\n case 'both':\n newTuple[step.nodeInto] =\n relationship.source.id === newTuple[step.anchor].id ? relationship.target : relationship.source;\n break;\n }\n }\n }\n break;\n }\n case 'ProduceResults': {\n for (const tuple of buffer) {\n const result: Record<string, unknown> = {};\n for (const field of step.fields) {\n result[field.name] = jsonPathGet(tuple[field.variable].properties, field.path);\n }\n results.push(result);\n }\n break;\n }\n }\n\n log('finish step', { buffer: buffer.map((tuple) => mapValues(tuple, (x) => x.id)), results });\n }\n\n return results;\n};\n\nexport const executeQuery = (dataSource: DataSource, query: string): Promise<Record<string, unknown>[]> => {\n const plan = createExecutionPlan(parseCypherQuery(query));\n return executeQueryPlan(dataSource, plan);\n};\n\n// TODO(dmaretskyi): Extract.\nconst jsonPathGet = (obj: Record<string, unknown>, path: JsonPath): unknown => {\n if (path === '' || path === '$') {\n return obj;\n }\n\n const parts = path.split('.');\n if (parts[0] === '$') {\n parts.shift();\n }\n\n let result: any = obj;\n for (const part of parts) {\n result = result?.[part];\n }\n return result;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type { JsonPath } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport type { GraphPatternConnector, MatchClause, ReturnClause, WhereClause } from './ast';\nimport type { ParsedQuery } from './parser';\n\nexport type VariableName = string & { __VariableName: never };\n\nexport type ExecutionPlanStep =\n | {\n type: 'NodeScan';\n label: string;\n into: VariableName;\n }\n | {\n type: 'FilterByLabel';\n variable: VariableName;\n label: string;\n }\n | {\n type: 'FilterByProperty';\n variable: VariableName;\n property: JsonPath;\n value: unknown;\n }\n | {\n /**\n * Scans (anchor)-[relationshipInto:label]->(nodeInto).\n */\n type: 'RelationshipScan';\n label: string;\n anchor: VariableName;\n relationshipInto: VariableName;\n nodeInto: VariableName;\n\n /**\n * `in`: (anchor)<-[relationshipInto:label]-(nodeInto)\n * `out`: (anchor)-[relationshipInto:label]->(nodeInto)\n * `both`: (anchor)-[relationshipInto:label]-(nodeInto)\n */\n direction: 'in' | 'out' | 'both';\n }\n | {\n type: 'ProduceResults';\n fields: {\n name: string;\n variable: VariableName;\n path: JsonPath;\n }[];\n };\n\nexport type ExecutionPlan = {\n steps: ExecutionPlanStep[];\n output: {\n fields: string[];\n };\n};\n\nexport const createExecutionPlan = (query: ParsedQuery): ExecutionPlan => {\n return new ExecutionPlanBuilder().build(query);\n};\n\nclass ExecutionPlanBuilder {\n private counter = 0;\n\n newVariable(): VariableName {\n return `anon_${this.counter++}` as VariableName;\n }\n\n build(query: ParsedQuery): ExecutionPlan {\n log('Creating execution plan for query', { query });\n return {\n steps: [\n ...this.createStepsForMatchClause(query.ast.matchClause),\n ...(query.ast.whereClause ? this.createStepsForWhereClause(query.ast.whereClause) : []),\n ...this.createStepsForReturnClause(query.ast.returnClause),\n ],\n output: {\n fields: this.getOutputFields(query.ast.returnClause),\n },\n };\n }\n\n createStepsForMatchClause(match: MatchClause): ExecutionPlanStep[] {\n invariant(match.pattern.segments.length > 0);\n const firstSegment = match.pattern.segments[0];\n invariant(firstSegment.astKind === 'NodePattern');\n let lastNodeVariable = (firstSegment.variable?.name as VariableName) ?? this.newVariable();\n\n const steps: ExecutionPlanStep[] = [];\n steps.push({\n type: 'NodeScan',\n label: firstSegment.label.name,\n into: lastNodeVariable,\n });\n\n if (firstSegment.properties) {\n for (const property of firstSegment.properties.properties) {\n steps.push({\n type: 'FilterByProperty',\n variable: lastNodeVariable,\n property: property.key.name as JsonPath,\n value: property.value.value,\n });\n }\n }\n\n for (let i = 1; i < match.pattern.segments.length; i++) {\n const relationshipSegment = match.pattern.segments[i++];\n invariant(relationshipSegment.astKind === 'RelationshipPattern');\n const nodeSegment = match.pattern.segments[i];\n invariant(nodeSegment.astKind === 'NodePattern');\n const leftSeparator = match.pattern.segments.separators[i - 2];\n const rightSeparator = match.pattern.segments.separators[i - 1];\n const direction = getDirection(leftSeparator.direction, rightSeparator.direction);\n\n const relationshipVariable = (relationshipSegment.variable?.name as VariableName) ?? this.newVariable();\n const nodeVariable = (nodeSegment.variable?.name as VariableName) ?? this.newVariable();\n\n steps.push({\n type: 'RelationshipScan',\n label: relationshipSegment.label.name,\n direction,\n anchor: lastNodeVariable,\n relationshipInto: relationshipVariable,\n nodeInto: nodeVariable,\n });\n\n if (relationshipSegment.properties) {\n for (const property of relationshipSegment.properties.properties) {\n steps.push({\n type: 'FilterByProperty',\n variable: relationshipVariable,\n property: property.key.name as JsonPath,\n value: property.value.value,\n });\n }\n }\n if (nodeSegment.label) {\n steps.push({\n type: 'FilterByLabel',\n variable: nodeVariable,\n label: nodeSegment.label.name,\n });\n }\n if (nodeSegment.properties) {\n for (const property of nodeSegment.properties.properties) {\n steps.push({\n type: 'FilterByProperty',\n variable: nodeVariable,\n property: property.key.name as JsonPath,\n value: property.value.value,\n });\n }\n }\n\n lastNodeVariable = nodeVariable;\n }\n\n return steps;\n }\n\n createStepsForWhereClause(where: WhereClause): ExecutionPlanStep[] {\n return [];\n }\n\n createStepsForReturnClause(returnClause: ReturnClause): ExecutionPlanStep[] {\n return [\n {\n type: 'ProduceResults',\n fields: returnClause.fields.map((field) => ({\n name: field.path.map((p) => p.name).join('_'),\n variable: field.path[0].name as VariableName,\n path:\n field.path.length > 1\n ? (field.path\n .slice(1)\n .map((p) => p.name)\n .join('.') as JsonPath)\n : ('$' as JsonPath),\n })),\n },\n ];\n }\n\n getOutputFields(returnClause: ReturnClause): string[] {\n return returnClause.fields.map((field) => field.path.map((p) => p.name).join('_'));\n }\n}\n\nconst getDirection = (\n left: GraphPatternConnector['direction'],\n right: GraphPatternConnector['direction'],\n): 'in' | 'out' | 'both' => {\n if (left === '-' && right === '->') {\n return 'out';\n } else if (left === '<-' && right === '-') {\n return 'in';\n } else if (left === '-' && right === '-') {\n return 'both';\n }\n throw new Error(`Invalid direction: ()${left}[]${right}()`);\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { raise } from '@dxos/debug';\nimport { JSON_SCHEMA_ECHO_REF_ID, type JsonSchemaType } from '@dxos/echo-schema';\n\nimport { trim } from '../util';\n\n/**\n * Formats ECHO schema to be consumed by LLM.\n * Schema is formatted in cypher format.\n * Objects are represented as nodes.\n * References are represented as relationships.\n */\nexport const formatJsonSchemaForLLM = (schemaTypes: JsonSchemaType[]): string[] => {\n return schemaTypes.flatMap((schema) => [\n formatNodeSchema(schema),\n ...formatInferredRelationships(schema, schemaTypes),\n ]);\n};\n\nconst formatNodeSchema = (schema: JsonSchemaType) => {\n const label = formatNodeLabel(schema.typename ?? raise(new Error('Schema must have $id')));\n const properties = Object.entries(schema.properties!).filter(([key, prop]) => key !== 'id' && !isReference(prop));\n\n return trim`\n <node>\n (:${label})\n\n <description>${schema.description}</description>\n\n <properties>\n ${properties.map(([key, value]) => {\n return trim`\n <${key}>\n <type>${value.type}</type>\n <description>${value.description}</description>\n </${key}>\n `;\n })}\n </properties>\n </node>\n `;\n};\n\nconst formatInferredRelationships = (schema: JsonSchemaType, allSchema: JsonSchemaType[]): string[] => {\n const nodeLabel = formatNodeLabel(schema.typename ?? raise(new Error('Schema must have $id')));\n const relationships = Object.entries(schema.properties!).filter(([key, prop]) => isReference(prop));\n\n return relationships.map(([key, value]) => {\n const relationshipLabel = formatInferredRelationshipLabel(\n schema.typename ?? raise(new Error('Schema must have $id')),\n key,\n );\n\n // TODO(dmaretskyi): Registered schema don't get reference types updated.\n const targetSchema = allSchema.find((schema) => `dxn:type/${schema.typename}` === value.reference?.schema.$ref);\n const targetLabel = targetSchema ? formatNodeLabel(targetSchema?.typename ?? '') : '';\n\n return trim`\n <relationship>\n (:${nodeLabel})-[:${relationshipLabel}]->(:${targetLabel})\n\n <description>${value.description}</description>\n </relationship>\n `;\n });\n};\n\nexport const formatNodeLabel = (typename: string) => {\n return typename.replace(/^example\\.com\\/type\\//g, '');\n};\n\nexport const formatInferredRelationshipLabel = (typename: string, property: string) => {\n const nodeLabel = formatNodeLabel(typename);\n return `${nodeLabel}_${property}`.toUpperCase();\n};\n\nexport const isReference = (schema: JsonSchemaType) =>\n schema.$id === JSON_SCHEMA_ECHO_REF_ID ||\n (schema.type === 'array' &&\n !Array.isArray(schema.items) &&\n typeof schema.items === 'object' &&\n '$id' in schema.items &&\n schema.items.$id === JSON_SCHEMA_ECHO_REF_ID);\n", "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Trims multiline strings.\n */\n// TODO(burdon): Move to util.\nexport const trim = (strings: TemplateStringsArray, ...values: any[]) => {\n const combined = strings.reduce((acc, str, i) => {\n return acc + str + (values[i] || '');\n }, '');\n\n return combined.replace('/^\\n/', '').replace(/\\n$/, '');\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { raise } from '@dxos/debug';\nimport { type EchoDatabase, Filter, type ReactiveEchoObject } from '@dxos/echo-db';\nimport { type S, getSchemaTypename, StoredSchema, toJsonSchema } from '@dxos/echo-schema';\nimport { getSchema } from '@dxos/live-object';\nimport { log } from '@dxos/log';\n\nimport type { DataSource, Node, Relationship } from './query-executor';\nimport { formatInferredRelationshipLabel, formatNodeLabel, isReference } from './schema';\n\nexport class EchoDataSource implements DataSource {\n constructor(private readonly _db: EchoDatabase) {}\n\n @log.method()\n async getNodes({ label }: { label?: string }): Promise<Node[]> {\n if (!label) {\n const { objects } = await this._db.query().run();\n return objects.map(this._objectToNode);\n }\n\n const schema = (await this._getAllSchema()).find((s) => getSchemaTypename(s)?.endsWith(label));\n\n if (!schema) {\n return [];\n }\n\n const { objects } = await this._db.query(Filter.schema(schema)).run();\n return objects.map(this._objectToNode);\n }\n\n @log.method()\n async getRelationships({ label }: { label?: string }): Promise<Relationship[]> {\n const syntheticRefRelationships = (await this._getAllSchema())\n .filter((schema) => getSchemaTypename(schema) !== StoredSchema.typename)\n .flatMap((schema) => {\n const jsonSchema = toJsonSchema(schema);\n const relationships = Object.entries(jsonSchema.properties!).filter(([key, prop]) => isReference(prop));\n\n return relationships.map(([key, value]) => {\n const relationshipLabel = formatInferredRelationshipLabel(\n jsonSchema.typename ?? raise(new Error('Schema must have typename')),\n key,\n );\n\n return {\n label: relationshipLabel,\n schema,\n property: key,\n };\n });\n });\n const relationship = syntheticRefRelationships.find((r) => r.label === label);\n if (!relationship) {\n return []; // TODO(dmaretskyi): Handle real relationships.\n }\n\n const { objects } = await this._db.query(Filter.schema(relationship.schema)).run();\n return (\n await Promise.all(objects.map((object) => this._projectRefRelationship(object, relationship.property)))\n ).flat();\n }\n\n private async _getAllSchema(): Promise<S.Schema.AnyNoContext[]> {\n return [\n ...(await this._db.schemaRegistry.query().run()),\n // TODO(dmaretskyi): Remove once we can serialize recursive schema.\n ...this._db.graph.schemaRegistry.schemas.filter((s) => getSchemaTypename(s)?.startsWith('example.org')),\n ].filter((schema) => getSchemaTypename(schema) !== StoredSchema.typename);\n }\n\n private _objectToNode(object: ReactiveEchoObject<any>): Node {\n const { id, ...properties } = object;\n return {\n id,\n kind: 'node',\n label: formatNodeLabel(getSchemaTypename(getSchema(object)!)!),\n properties,\n };\n }\n\n private async _projectRefRelationship(object: ReactiveEchoObject<any>, prop: string): Promise<Relationship[]> {\n if (!object[prop]) {\n return [];\n }\n\n const value = Array.isArray(object[prop]) ? object[prop] : [object[prop]];\n\n return Promise.all(\n value.map(async (ref): Promise<Relationship> => {\n const target = await ref.load();\n return {\n id: `${object.id}-${prop}-${target.id}`,\n kind: 'relationship',\n label: formatInferredRelationshipLabel(getSchemaTypename(getSchema(object)!)!, prop),\n properties: {},\n source: this._objectToNode(object),\n target: this._objectToNode(target),\n };\n }),\n );\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["import_log", "import_debug", "import_echo_schema", "ws", "parjs", "whitespace", "nothing", "string", "pipe", "parjsCombinators", "map", "optional", "parser", "recover", "kind", "or", "keyword", "word", "identifier", "regexp", "match", "astKind", "name", "numberLiteral", "Number", "stringLiteral", "value", "variableTag", "variable", "expects", "label", "property", "then", "key", "properties", "manySepBy", "between", "nodePattern", "_", "relationshipPattern", "graphPatternConnector", "x", "direction", "graphPattern", "segments", "matchClause", "pattern", "memberExpression", "path", "equalsPredicate", "left", "right", "whereClause", "predicates", "returnClause", "fields", "f", "cypherQuery", "parseCypherQuery", "query", "parseResult", "parse", "isOk", "ast", "Error", "createExecutionPlan", "ExecutionPlanBuilder", "build", "counter", "newVariable", "log", "steps", "createStepsForMatchClause", "createStepsForWhereClause", "createStepsForReturnClause", "output", "getOutputFields", "invariant", "length", "firstSegment", "lastNodeVariable", "push", "type", "into", "i", "relationshipSegment", "nodeSegment", "leftSeparator", "separators", "rightSeparator", "getDirection", "relationshipVariable", "nodeVariable", "anchor", "relationshipInto", "nodeInto", "where", "field", "p", "join", "slice", "executeQueryPlan", "dataSource", "plan", "buffer", "results", "step", "nodes", "getNodes", "node", "filter", "item", "relationships", "getRelationships", "tuple", "filteredRelationships", "relationship", "target", "id", "source", "newTuple", "result", "jsonPathGet", "mapValues", "executeQuery", "obj", "parts", "split", "shift", "part", "trim", "strings", "values", "combined", "reduce", "acc", "str", "replace", "formatJsonSchemaForLLM", "schemaTypes", "flatMap", "schema", "formatNodeSchema", "formatInferredRelationships", "formatNodeLabel", "typename", "raise", "Object", "entries", "prop", "isReference", "description", "allSchema", "nodeLabel", "relationshipLabel", "formatInferredRelationshipLabel", "targetSchema", "find", "reference", "$ref", "targetLabel", "toUpperCase", "$id", "JSON_SCHEMA_ECHO_REF_ID", "Array", "isArray", "items", "EchoDataSource", "constructor", "_db", "objects", "run", "_objectToNode", "_getAllSchema", "s", "getSchemaTypename", "endsWith", "Filter", "syntheticRefRelationships", "StoredSchema", "jsonSchema", "toJsonSchema", "r", "Promise", "all", "object", "_projectRefRelationship", "flat", "schemaRegistry", "graph", "schemas", "startsWith", "getSchema", "ref", "load", "method"]
7
- }
@@ -1,567 +0,0 @@
1
- import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
-
3
- // packages/experimental/assistant/src/cypher/parjs.ts
4
- import { parjsCombinators, parjs } from "#parjs";
5
-
6
- // packages/experimental/assistant/src/cypher/combinators.ts
7
- var ws = parjs.whitespace();
8
- var nothing = parjs.string("").pipe(parjsCombinators.map(() => null));
9
- var optional = (parser) => parser.pipe(parjsCombinators.recover(() => ({
10
- kind: "Soft"
11
- })), parjsCombinators.or(nothing));
12
- var keyword = (word) => parjs.string(word).pipe(parjsCombinators.map(() => word));
13
- var identifier = parjs.regexp(/[a-zA-Z_][a-zA-Z0-9_]*/).pipe(parjsCombinators.map((match) => ({
14
- astKind: "Identifier",
15
- name: match[0]
16
- })));
17
- var numberLiteral = parjs.regexp(/-?\d+(\.\d+)?/).pipe(parjsCombinators.map(Number));
18
- var stringLiteral = parjs.regexp(/"([^"]*)"|'([^']*)'/).pipe(parjsCombinators.map((match) => ({
19
- astKind: "StringLiteral",
20
- value: match[1] || match[2]
21
- })));
22
- var variableTag = identifier.pipe(parjsCombinators.map((variable) => variable)).expects("variable tag");
23
- var label = identifier.pipe(parjsCombinators.map((name) => name));
24
- var property = identifier.pipe(parjsCombinators.then(parjs.string(":"), ws, stringLiteral), parjsCombinators.map(([key, , , value]) => ({
25
- key,
26
- value
27
- })));
28
- var properties = property.pipe(parjsCombinators.manySepBy(","), parjsCombinators.between("{", "}"), parjsCombinators.map((properties2) => ({
29
- astKind: "Properties",
30
- properties: properties2
31
- })));
32
- var nodePattern = optional(variableTag).pipe(parjsCombinators.then(":"), parjsCombinators.then(ws, label, ws), parjsCombinators.then(optional(properties)), parjsCombinators.between("(", ")"), parjsCombinators.map(([[[variable], _, label2], properties2]) => ({
33
- astKind: "NodePattern",
34
- variable,
35
- label: label2,
36
- properties: properties2
37
- })));
38
- var relationshipPattern = optional(variableTag).pipe(parjsCombinators.then(":"), parjsCombinators.then(ws, label, ws), parjsCombinators.then(optional(properties)), parjsCombinators.between("[", "]"), parjsCombinators.map(([[[variable], _, label2], properties2]) => ({
39
- astKind: "RelationshipPattern",
40
- variable,
41
- label: label2,
42
- properties: properties2
43
- })));
44
- var graphPatternConnector = parjs.string("->").pipe(parjsCombinators.or("<-", "-"), parjsCombinators.map((x) => ({
45
- astKind: "GraphPatternConnector",
46
- direction: x
47
- })));
48
- var graphPattern = nodePattern.pipe(parjsCombinators.or(relationshipPattern), parjsCombinators.manySepBy(graphPatternConnector), parjsCombinators.map((segments) => ({
49
- astKind: "GraphPattern",
50
- segments
51
- })));
52
- var matchClause = keyword("MATCH").pipe(parjsCombinators.then(ws), parjsCombinators.then(graphPattern), parjsCombinators.map(([, pattern]) => ({
53
- astKind: "MatchClause",
54
- pattern
55
- })));
56
- var memberExpression = identifier.pipe(parjsCombinators.manySepBy("."), parjsCombinators.map((path) => ({
57
- astKind: "MemberExpression",
58
- path
59
- })));
60
- var equalsPredicate = memberExpression.pipe(parjsCombinators.then(ws, parjs.string("="), ws, stringLiteral), parjsCombinators.map(([left, , , , right]) => ({
61
- astKind: "EqualsPredicate",
62
- left,
63
- right
64
- })));
65
- var whereClause = keyword("WHERE").pipe(parjsCombinators.then(ws, equalsPredicate.pipe(parjsCombinators.between(ws, ws), parjsCombinators.manySepBy(parjs.string("AND"))), ws), parjsCombinators.map(([, , predicates]) => ({
66
- astKind: "WhereClause",
67
- predicates
68
- })));
69
- var returnClause = keyword("RETURN").pipe(parjsCombinators.then(ws, memberExpression.pipe(parjsCombinators.then(optional(parjs.string("AS").pipe(parjsCombinators.between(ws), parjsCombinators.then(identifier))), ws), parjsCombinators.manySepBy(parjs.string(",").pipe(parjsCombinators.then(ws)))), ws), parjsCombinators.map(([, , fields]) => ({
70
- astKind: "ReturnClause",
71
- fields: fields.map(([f]) => f)
72
- })));
73
- var cypherQuery = ws.pipe(parjsCombinators.then(matchClause, ws, optional(whereClause), ws, returnClause, ws), parjsCombinators.map(([, matchClause2, , whereClause2, , returnClause2]) => ({
74
- astKind: "CypherQuery",
75
- matchClause: matchClause2,
76
- whereClause: whereClause2,
77
- returnClause: returnClause2
78
- })));
79
-
80
- // packages/experimental/assistant/src/cypher/parser.ts
81
- var parseCypherQuery = (query) => {
82
- const parseResult = cypherQuery.parse(query);
83
- if (parseResult.isOk) {
84
- return {
85
- ast: parseResult.value
86
- };
87
- } else {
88
- throw new Error(`Failed to parse query: ${parseResult}`);
89
- }
90
- };
91
-
92
- // packages/experimental/assistant/src/cypher/query-executor.ts
93
- import { log as log2 } from "@dxos/log";
94
- import { mapValues } from "@dxos/util";
95
-
96
- // packages/experimental/assistant/src/cypher/execution-plan.ts
97
- import { invariant } from "@dxos/invariant";
98
- import { log } from "@dxos/log";
99
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/experimental/assistant/src/cypher/execution-plan.ts";
100
- var createExecutionPlan = (query) => {
101
- return new ExecutionPlanBuilder().build(query);
102
- };
103
- var ExecutionPlanBuilder = class {
104
- constructor() {
105
- this.counter = 0;
106
- }
107
- newVariable() {
108
- return `anon_${this.counter++}`;
109
- }
110
- build(query) {
111
- log("Creating execution plan for query", {
112
- query
113
- }, {
114
- F: __dxlog_file,
115
- L: 76,
116
- S: this,
117
- C: (f, a) => f(...a)
118
- });
119
- return {
120
- steps: [
121
- ...this.createStepsForMatchClause(query.ast.matchClause),
122
- ...query.ast.whereClause ? this.createStepsForWhereClause(query.ast.whereClause) : [],
123
- ...this.createStepsForReturnClause(query.ast.returnClause)
124
- ],
125
- output: {
126
- fields: this.getOutputFields(query.ast.returnClause)
127
- }
128
- };
129
- }
130
- createStepsForMatchClause(match) {
131
- invariant(match.pattern.segments.length > 0, void 0, {
132
- F: __dxlog_file,
133
- L: 90,
134
- S: this,
135
- A: [
136
- "match.pattern.segments.length > 0",
137
- ""
138
- ]
139
- });
140
- const firstSegment = match.pattern.segments[0];
141
- invariant(firstSegment.astKind === "NodePattern", void 0, {
142
- F: __dxlog_file,
143
- L: 92,
144
- S: this,
145
- A: [
146
- "firstSegment.astKind === 'NodePattern'",
147
- ""
148
- ]
149
- });
150
- let lastNodeVariable = firstSegment.variable?.name ?? this.newVariable();
151
- const steps = [];
152
- steps.push({
153
- type: "NodeScan",
154
- label: firstSegment.label.name,
155
- into: lastNodeVariable
156
- });
157
- if (firstSegment.properties) {
158
- for (const property2 of firstSegment.properties.properties) {
159
- steps.push({
160
- type: "FilterByProperty",
161
- variable: lastNodeVariable,
162
- property: property2.key.name,
163
- value: property2.value.value
164
- });
165
- }
166
- }
167
- for (let i = 1; i < match.pattern.segments.length; i++) {
168
- const relationshipSegment = match.pattern.segments[i++];
169
- invariant(relationshipSegment.astKind === "RelationshipPattern", void 0, {
170
- F: __dxlog_file,
171
- L: 115,
172
- S: this,
173
- A: [
174
- "relationshipSegment.astKind === 'RelationshipPattern'",
175
- ""
176
- ]
177
- });
178
- const nodeSegment = match.pattern.segments[i];
179
- invariant(nodeSegment.astKind === "NodePattern", void 0, {
180
- F: __dxlog_file,
181
- L: 117,
182
- S: this,
183
- A: [
184
- "nodeSegment.astKind === 'NodePattern'",
185
- ""
186
- ]
187
- });
188
- const leftSeparator = match.pattern.segments.separators[i - 2];
189
- const rightSeparator = match.pattern.segments.separators[i - 1];
190
- const direction = getDirection(leftSeparator.direction, rightSeparator.direction);
191
- const relationshipVariable = relationshipSegment.variable?.name ?? this.newVariable();
192
- const nodeVariable = nodeSegment.variable?.name ?? this.newVariable();
193
- steps.push({
194
- type: "RelationshipScan",
195
- label: relationshipSegment.label.name,
196
- direction,
197
- anchor: lastNodeVariable,
198
- relationshipInto: relationshipVariable,
199
- nodeInto: nodeVariable
200
- });
201
- if (relationshipSegment.properties) {
202
- for (const property2 of relationshipSegment.properties.properties) {
203
- steps.push({
204
- type: "FilterByProperty",
205
- variable: relationshipVariable,
206
- property: property2.key.name,
207
- value: property2.value.value
208
- });
209
- }
210
- }
211
- if (nodeSegment.label) {
212
- steps.push({
213
- type: "FilterByLabel",
214
- variable: nodeVariable,
215
- label: nodeSegment.label.name
216
- });
217
- }
218
- if (nodeSegment.properties) {
219
- for (const property2 of nodeSegment.properties.properties) {
220
- steps.push({
221
- type: "FilterByProperty",
222
- variable: nodeVariable,
223
- property: property2.key.name,
224
- value: property2.value.value
225
- });
226
- }
227
- }
228
- lastNodeVariable = nodeVariable;
229
- }
230
- return steps;
231
- }
232
- createStepsForWhereClause(where) {
233
- return [];
234
- }
235
- createStepsForReturnClause(returnClause2) {
236
- return [
237
- {
238
- type: "ProduceResults",
239
- fields: returnClause2.fields.map((field) => ({
240
- name: field.path.map((p) => p.name).join("_"),
241
- variable: field.path[0].name,
242
- path: field.path.length > 1 ? field.path.slice(1).map((p) => p.name).join(".") : "$"
243
- }))
244
- }
245
- ];
246
- }
247
- getOutputFields(returnClause2) {
248
- return returnClause2.fields.map((field) => field.path.map((p) => p.name).join("_"));
249
- }
250
- };
251
- var getDirection = (left, right) => {
252
- if (left === "-" && right === "->") {
253
- return "out";
254
- } else if (left === "<-" && right === "-") {
255
- return "in";
256
- } else if (left === "-" && right === "-") {
257
- return "both";
258
- }
259
- throw new Error(`Invalid direction: ()${left}[]${right}()`);
260
- };
261
-
262
- // packages/experimental/assistant/src/cypher/query-executor.ts
263
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/experimental/assistant/src/cypher/query-executor.ts";
264
- var executeQueryPlan = async (dataSource, plan) => {
265
- let buffer = [];
266
- const results = [];
267
- for (const step of plan.steps) {
268
- log2("begin step", {
269
- step
270
- }, {
271
- F: __dxlog_file2,
272
- L: 41,
273
- S: void 0,
274
- C: (f, a) => f(...a)
275
- });
276
- switch (step.type) {
277
- case "NodeScan": {
278
- const nodes = await dataSource.getNodes({
279
- label: step.label
280
- });
281
- buffer.push(...nodes.map((node) => ({
282
- [step.into]: node
283
- })));
284
- break;
285
- }
286
- case "FilterByLabel": {
287
- buffer = buffer.filter((item) => {
288
- const node = item[step.variable];
289
- return node && node.kind === "node" && node.label === step.label;
290
- });
291
- break;
292
- }
293
- case "FilterByProperty": {
294
- buffer = buffer.filter((item) => {
295
- const node = item[step.variable];
296
- return node && node.kind === "node" && node.properties[step.property] === step.value;
297
- });
298
- break;
299
- }
300
- case "RelationshipScan": {
301
- const relationships = await dataSource.getRelationships({
302
- label: step.label
303
- });
304
- for (const tuple of [
305
- ...buffer
306
- ]) {
307
- if (tuple[step.anchor].kind !== "node") {
308
- continue;
309
- }
310
- const filteredRelationships = relationships.filter((relationship) => {
311
- switch (step.direction) {
312
- case "in":
313
- return relationship.target.id === tuple[step.anchor].id;
314
- case "out":
315
- return relationship.source.id === tuple[step.anchor].id;
316
- case "both":
317
- return relationship.source.id === tuple[step.anchor].id || relationship.target.id === tuple[step.anchor].id;
318
- default:
319
- throw new Error(`Unknown direction: ${step.direction}`);
320
- }
321
- });
322
- for (let i = 0; i < filteredRelationships.length; i++) {
323
- const relationship = filteredRelationships[i];
324
- const newTuple = i === 0 ? tuple : {
325
- ...tuple
326
- };
327
- if (newTuple !== tuple) {
328
- buffer.push(newTuple);
329
- }
330
- newTuple[step.relationshipInto] = relationship;
331
- switch (step.direction) {
332
- case "in":
333
- newTuple[step.nodeInto] = relationship.source;
334
- break;
335
- case "out":
336
- newTuple[step.nodeInto] = relationship.target;
337
- break;
338
- case "both":
339
- newTuple[step.nodeInto] = relationship.source.id === newTuple[step.anchor].id ? relationship.target : relationship.source;
340
- break;
341
- }
342
- }
343
- }
344
- break;
345
- }
346
- case "ProduceResults": {
347
- for (const tuple of buffer) {
348
- const result = {};
349
- for (const field of step.fields) {
350
- result[field.name] = jsonPathGet(tuple[field.variable].properties, field.path);
351
- }
352
- results.push(result);
353
- }
354
- break;
355
- }
356
- }
357
- log2("finish step", {
358
- buffer: buffer.map((tuple) => mapValues(tuple, (x) => x.id)),
359
- results
360
- }, {
361
- F: __dxlog_file2,
362
- L: 118,
363
- S: void 0,
364
- C: (f, a) => f(...a)
365
- });
366
- }
367
- return results;
368
- };
369
- var executeQuery = (dataSource, query) => {
370
- const plan = createExecutionPlan(parseCypherQuery(query));
371
- return executeQueryPlan(dataSource, plan);
372
- };
373
- var jsonPathGet = (obj, path) => {
374
- if (path === "" || path === "$") {
375
- return obj;
376
- }
377
- const parts = path.split(".");
378
- if (parts[0] === "$") {
379
- parts.shift();
380
- }
381
- let result = obj;
382
- for (const part of parts) {
383
- result = result?.[part];
384
- }
385
- return result;
386
- };
387
-
388
- // packages/experimental/assistant/src/cypher/schema.ts
389
- import { raise } from "@dxos/debug";
390
- import { JSON_SCHEMA_ECHO_REF_ID } from "@dxos/echo-schema";
391
-
392
- // packages/experimental/assistant/src/util/trim.ts
393
- var trim = (strings, ...values) => {
394
- const combined = strings.reduce((acc, str, i) => {
395
- return acc + str + (values[i] || "");
396
- }, "");
397
- return combined.replace("/^\n/", "").replace(/\n$/, "");
398
- };
399
-
400
- // packages/experimental/assistant/src/cypher/schema.ts
401
- var formatJsonSchemaForLLM = (schemaTypes) => {
402
- return schemaTypes.flatMap((schema) => [
403
- formatNodeSchema(schema),
404
- ...formatInferredRelationships(schema, schemaTypes)
405
- ]);
406
- };
407
- var formatNodeSchema = (schema) => {
408
- const label2 = formatNodeLabel(schema.typename ?? raise(new Error("Schema must have $id")));
409
- const properties2 = Object.entries(schema.properties).filter(([key, prop]) => key !== "id" && !isReference(prop));
410
- return trim`
411
- <node>
412
- (:${label2})
413
-
414
- <description>${schema.description}</description>
415
-
416
- <properties>
417
- ${properties2.map(([key, value]) => {
418
- return trim`
419
- <${key}>
420
- <type>${value.type}</type>
421
- <description>${value.description}</description>
422
- </${key}>
423
- `;
424
- })}
425
- </properties>
426
- </node>
427
- `;
428
- };
429
- var formatInferredRelationships = (schema, allSchema) => {
430
- const nodeLabel = formatNodeLabel(schema.typename ?? raise(new Error("Schema must have $id")));
431
- const relationships = Object.entries(schema.properties).filter(([key, prop]) => isReference(prop));
432
- return relationships.map(([key, value]) => {
433
- const relationshipLabel = formatInferredRelationshipLabel(schema.typename ?? raise(new Error("Schema must have $id")), key);
434
- const targetSchema = allSchema.find((schema2) => `dxn:type/${schema2.typename}` === value.reference?.schema.$ref);
435
- const targetLabel = targetSchema ? formatNodeLabel(targetSchema?.typename ?? "") : "";
436
- return trim`
437
- <relationship>
438
- (:${nodeLabel})-[:${relationshipLabel}]->(:${targetLabel})
439
-
440
- <description>${value.description}</description>
441
- </relationship>
442
- `;
443
- });
444
- };
445
- var formatNodeLabel = (typename) => {
446
- return typename.replace(/^example\.com\/type\//g, "");
447
- };
448
- var formatInferredRelationshipLabel = (typename, property2) => {
449
- const nodeLabel = formatNodeLabel(typename);
450
- return `${nodeLabel}_${property2}`.toUpperCase();
451
- };
452
- var isReference = (schema) => schema.$id === JSON_SCHEMA_ECHO_REF_ID || schema.type === "array" && !Array.isArray(schema.items) && typeof schema.items === "object" && "$id" in schema.items && schema.items.$id === JSON_SCHEMA_ECHO_REF_ID;
453
-
454
- // packages/experimental/assistant/src/cypher/echo-data-source.ts
455
- import { raise as raise2 } from "@dxos/debug";
456
- import { Filter } from "@dxos/echo-db";
457
- import { getSchemaTypename, StoredSchema, toJsonSchema } from "@dxos/echo-schema";
458
- import { getSchema } from "@dxos/live-object";
459
- import { log as log3 } from "@dxos/log";
460
- function _ts_decorate(decorators, target, key, desc) {
461
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
462
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
463
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
464
- return c > 3 && r && Object.defineProperty(target, key, r), r;
465
- }
466
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/experimental/assistant/src/cypher/echo-data-source.ts";
467
- var EchoDataSource = class {
468
- constructor(_db) {
469
- this._db = _db;
470
- }
471
- async getNodes({ label: label2 }) {
472
- if (!label2) {
473
- const { objects: objects2 } = await this._db.query().run();
474
- return objects2.map(this._objectToNode);
475
- }
476
- const schema = (await this._getAllSchema()).find((s) => getSchemaTypename(s)?.endsWith(label2));
477
- if (!schema) {
478
- return [];
479
- }
480
- const { objects } = await this._db.query(Filter.schema(schema)).run();
481
- return objects.map(this._objectToNode);
482
- }
483
- async getRelationships({ label: label2 }) {
484
- const syntheticRefRelationships = (await this._getAllSchema()).filter((schema) => getSchemaTypename(schema) !== StoredSchema.typename).flatMap((schema) => {
485
- const jsonSchema = toJsonSchema(schema);
486
- const relationships = Object.entries(jsonSchema.properties).filter(([key, prop]) => isReference(prop));
487
- return relationships.map(([key, value]) => {
488
- const relationshipLabel = formatInferredRelationshipLabel(jsonSchema.typename ?? raise2(new Error("Schema must have typename")), key);
489
- return {
490
- label: relationshipLabel,
491
- schema,
492
- property: key
493
- };
494
- });
495
- });
496
- const relationship = syntheticRefRelationships.find((r) => r.label === label2);
497
- if (!relationship) {
498
- return [];
499
- }
500
- const { objects } = await this._db.query(Filter.schema(relationship.schema)).run();
501
- return (await Promise.all(objects.map((object) => this._projectRefRelationship(object, relationship.property)))).flat();
502
- }
503
- async _getAllSchema() {
504
- return [
505
- ...await this._db.schemaRegistry.query().run(),
506
- // TODO(dmaretskyi): Remove once we can serialize recursive schema.
507
- ...this._db.graph.schemaRegistry.schemas.filter((s) => getSchemaTypename(s)?.startsWith("example.org"))
508
- ].filter((schema) => getSchemaTypename(schema) !== StoredSchema.typename);
509
- }
510
- _objectToNode(object) {
511
- const { id, ...properties2 } = object;
512
- return {
513
- id,
514
- kind: "node",
515
- label: formatNodeLabel(getSchemaTypename(getSchema(object))),
516
- properties: properties2
517
- };
518
- }
519
- async _projectRefRelationship(object, prop) {
520
- if (!object[prop]) {
521
- return [];
522
- }
523
- const value = Array.isArray(object[prop]) ? object[prop] : [
524
- object[prop]
525
- ];
526
- return Promise.all(value.map(async (ref) => {
527
- const target = await ref.load();
528
- return {
529
- id: `${object.id}-${prop}-${target.id}`,
530
- kind: "relationship",
531
- label: formatInferredRelationshipLabel(getSchemaTypename(getSchema(object)), prop),
532
- properties: {},
533
- source: this._objectToNode(object),
534
- target: this._objectToNode(target)
535
- };
536
- }));
537
- }
538
- };
539
- _ts_decorate([
540
- log3.method(void 0, void 0, {
541
- F: __dxlog_file3,
542
- L: 17,
543
- S: void 0,
544
- C: (f, a) => f(...a)
545
- })
546
- ], EchoDataSource.prototype, "getNodes", null);
547
- _ts_decorate([
548
- log3.method(void 0, void 0, {
549
- F: __dxlog_file3,
550
- L: 34,
551
- S: void 0,
552
- C: (f, a) => f(...a)
553
- })
554
- ], EchoDataSource.prototype, "getRelationships", null);
555
-
556
- export {
557
- parseCypherQuery,
558
- executeQueryPlan,
559
- executeQuery,
560
- trim,
561
- formatJsonSchemaForLLM,
562
- formatNodeLabel,
563
- formatInferredRelationshipLabel,
564
- isReference,
565
- EchoDataSource
566
- };
567
- //# sourceMappingURL=chunk-GOVFOBIB.mjs.map