ai-database 2.1.1 → 2.3.0
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/CHANGELOG.md +47 -1
- package/README.md +1063 -186
- package/dist/actions.d.ts +2 -2
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +1 -1
- package/dist/actions.js.map +1 -1
- package/dist/ai-promise-db.d.ts +52 -23
- package/dist/ai-promise-db.d.ts.map +1 -1
- package/dist/ai-promise-db.js +185 -164
- package/dist/ai-promise-db.js.map +1 -1
- package/dist/authorization.d.ts.map +1 -1
- package/dist/authorization.js +38 -30
- package/dist/authorization.js.map +1 -1
- package/dist/cascade-orchestrator.d.ts +404 -0
- package/dist/cascade-orchestrator.d.ts.map +1 -0
- package/dist/cascade-orchestrator.js +828 -0
- package/dist/cascade-orchestrator.js.map +1 -0
- package/dist/cascade-write-strategy.d.ts +584 -0
- package/dist/cascade-write-strategy.d.ts.map +1 -0
- package/dist/cascade-write-strategy.js +590 -0
- package/dist/cascade-write-strategy.js.map +1 -0
- package/dist/ch-adapter.d.ts +358 -0
- package/dist/ch-adapter.d.ts.map +1 -0
- package/dist/ch-adapter.js +929 -0
- package/dist/ch-adapter.js.map +1 -0
- package/dist/client/index.d.ts +42 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +43 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client.d.ts +266 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +81 -0
- package/dist/client.js.map +1 -0
- package/dist/constants.d.ts +64 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +52 -2
- package/dist/constants.js.map +1 -1
- package/dist/dataloader.d.ts +99 -0
- package/dist/dataloader.d.ts.map +1 -0
- package/dist/dataloader.js +225 -0
- package/dist/dataloader.js.map +1 -0
- package/dist/db-provider-port.d.ts +501 -0
- package/dist/db-provider-port.d.ts.map +1 -0
- package/dist/db-provider-port.js +113 -0
- package/dist/db-provider-port.js.map +1 -0
- package/dist/digital-objects-provider.d.ts +49 -0
- package/dist/digital-objects-provider.d.ts.map +1 -0
- package/dist/digital-objects-provider.js +55 -0
- package/dist/digital-objects-provider.js.map +1 -0
- package/dist/do-sqlite-adapter.d.ts +402 -0
- package/dist/do-sqlite-adapter.d.ts.map +1 -0
- package/dist/do-sqlite-adapter.js +745 -0
- package/dist/do-sqlite-adapter.js.map +1 -0
- package/dist/docs-rels/custom-types.d.ts +134 -0
- package/dist/docs-rels/custom-types.d.ts.map +1 -0
- package/dist/docs-rels/custom-types.js +70 -0
- package/dist/docs-rels/custom-types.js.map +1 -0
- package/dist/docs-rels/index.d.ts +16 -0
- package/dist/docs-rels/index.d.ts.map +1 -0
- package/dist/docs-rels/index.js +16 -0
- package/dist/docs-rels/index.js.map +1 -0
- package/dist/docs-rels/migrations/index.d.ts +30 -0
- package/dist/docs-rels/migrations/index.d.ts.map +1 -0
- package/dist/docs-rels/migrations/index.js +128 -0
- package/dist/docs-rels/migrations/index.js.map +1 -0
- package/dist/docs-rels/schema.d.ts +2961 -0
- package/dist/docs-rels/schema.d.ts.map +1 -0
- package/dist/docs-rels/schema.js +244 -0
- package/dist/docs-rels/schema.js.map +1 -0
- package/dist/durable-clickhouse.d.ts.map +1 -1
- package/dist/durable-clickhouse.js +16 -13
- package/dist/durable-clickhouse.js.map +1 -1
- package/dist/durable-promise.d.ts.map +1 -1
- package/dist/durable-promise.js +34 -15
- package/dist/durable-promise.js.map +1 -1
- package/dist/errors.d.ts +127 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +210 -0
- package/dist/errors.js.map +1 -0
- package/dist/eventbridge.d.ts +117 -0
- package/dist/eventbridge.d.ts.map +1 -0
- package/dist/eventbridge.js +238 -0
- package/dist/eventbridge.js.map +1 -0
- package/dist/events.d.ts +2 -2
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +1 -1
- package/dist/events.js.map +1 -1
- package/dist/execution-queue.d.ts.map +1 -1
- package/dist/execution-queue.js +4 -5
- package/dist/execution-queue.js.map +1 -1
- package/dist/index.d.ts +37 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +112 -6
- package/dist/index.js.map +1 -1
- package/dist/linguistic.d.ts +3 -108
- package/dist/linguistic.d.ts.map +1 -1
- package/dist/linguistic.js +3 -372
- package/dist/linguistic.js.map +1 -1
- package/dist/logger.d.ts +132 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +137 -0
- package/dist/logger.js.map +1 -0
- package/dist/memory-provider.d.ts +129 -0
- package/dist/memory-provider.d.ts.map +1 -1
- package/dist/memory-provider.js +592 -257
- package/dist/memory-provider.js.map +1 -1
- package/dist/pg-adapter.d.ts +424 -0
- package/dist/pg-adapter.d.ts.map +1 -0
- package/dist/pg-adapter.js +921 -0
- package/dist/pg-adapter.js.map +1 -0
- package/dist/pipelines-iceberg-emitter.d.ts +327 -0
- package/dist/pipelines-iceberg-emitter.d.ts.map +1 -0
- package/dist/pipelines-iceberg-emitter.js +351 -0
- package/dist/pipelines-iceberg-emitter.js.map +1 -0
- package/dist/provider-capabilities.d.ts +146 -0
- package/dist/provider-capabilities.d.ts.map +1 -0
- package/dist/provider-capabilities.js +214 -0
- package/dist/provider-capabilities.js.map +1 -0
- package/dist/rdb-provider-adapter.d.ts +195 -0
- package/dist/rdb-provider-adapter.d.ts.map +1 -0
- package/dist/rdb-provider-adapter.js +291 -0
- package/dist/rdb-provider-adapter.js.map +1 -0
- package/dist/schema/cascade.d.ts +49 -10
- package/dist/schema/cascade.d.ts.map +1 -1
- package/dist/schema/cascade.js +491 -273
- package/dist/schema/cascade.js.map +1 -1
- package/dist/schema/definition-caches.d.ts +24 -0
- package/dist/schema/definition-caches.d.ts.map +1 -0
- package/dist/schema/definition-caches.js +26 -0
- package/dist/schema/definition-caches.js.map +1 -0
- package/dist/schema/dependency-graph.d.ts +45 -0
- package/dist/schema/dependency-graph.d.ts.map +1 -0
- package/dist/schema/dependency-graph.js +47 -0
- package/dist/schema/dependency-graph.js.map +1 -0
- package/dist/schema/diff.d.ts +103 -0
- package/dist/schema/diff.d.ts.map +1 -0
- package/dist/schema/diff.js +329 -0
- package/dist/schema/diff.js.map +1 -0
- package/dist/schema/entity-operations.d.ts +99 -0
- package/dist/schema/entity-operations.d.ts.map +1 -0
- package/dist/schema/entity-operations.js +818 -0
- package/dist/schema/entity-operations.js.map +1 -0
- package/dist/schema/generation-context.d.ts +202 -0
- package/dist/schema/generation-context.d.ts.map +1 -0
- package/dist/schema/generation-context.js +393 -0
- package/dist/schema/generation-context.js.map +1 -0
- package/dist/schema/index.d.ts +32 -34
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +462 -519
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/migration.d.ts +205 -0
- package/dist/schema/migration.d.ts.map +1 -0
- package/dist/schema/migration.js +327 -0
- package/dist/schema/migration.js.map +1 -0
- package/dist/schema/nl-query-generator.d.ts +68 -0
- package/dist/schema/nl-query-generator.d.ts.map +1 -0
- package/dist/schema/nl-query-generator.js +362 -0
- package/dist/schema/nl-query-generator.js.map +1 -0
- package/dist/schema/nl-query.d.ts +65 -0
- package/dist/schema/nl-query.d.ts.map +1 -0
- package/dist/schema/nl-query.js +178 -0
- package/dist/schema/nl-query.js.map +1 -0
- package/dist/schema/parse.d.ts.map +1 -1
- package/dist/schema/parse.js +152 -89
- package/dist/schema/parse.js.map +1 -1
- package/dist/schema/provider.d.ts +38 -0
- package/dist/schema/provider.d.ts.map +1 -1
- package/dist/schema/provider.js +15 -7
- package/dist/schema/provider.js.map +1 -1
- package/dist/schema/resolve.d.ts +46 -5
- package/dist/schema/resolve.d.ts.map +1 -1
- package/dist/schema/resolve.js +334 -117
- package/dist/schema/resolve.js.map +1 -1
- package/dist/schema/search-utils.d.ts +76 -0
- package/dist/schema/search-utils.d.ts.map +1 -0
- package/dist/schema/search-utils.js +86 -0
- package/dist/schema/search-utils.js.map +1 -0
- package/dist/schema/seed.d.ts +53 -0
- package/dist/schema/seed.d.ts.map +1 -0
- package/dist/schema/seed.js +94 -0
- package/dist/schema/seed.js.map +1 -0
- package/dist/schema/semantic.d.ts +11 -0
- package/dist/schema/semantic.d.ts.map +1 -1
- package/dist/schema/semantic.js +262 -68
- package/dist/schema/semantic.js.map +1 -1
- package/dist/schema/sub-apis.d.ts +52 -0
- package/dist/schema/sub-apis.d.ts.map +1 -0
- package/dist/schema/sub-apis.js +216 -0
- package/dist/schema/sub-apis.js.map +1 -0
- package/dist/schema/system-entities.d.ts +42 -0
- package/dist/schema/system-entities.d.ts.map +1 -0
- package/dist/schema/system-entities.js +101 -0
- package/dist/schema/system-entities.js.map +1 -0
- package/dist/schema/types.d.ts +91 -9
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/union-fallback.d.ts +219 -0
- package/dist/schema/union-fallback.d.ts.map +1 -0
- package/dist/schema/union-fallback.js +331 -0
- package/dist/schema/union-fallback.js.map +1 -0
- package/dist/schema/value-generators/ai.d.ts +54 -0
- package/dist/schema/value-generators/ai.d.ts.map +1 -0
- package/dist/schema/value-generators/ai.js +136 -0
- package/dist/schema/value-generators/ai.js.map +1 -0
- package/dist/schema/value-generators/index.d.ts +126 -0
- package/dist/schema/value-generators/index.d.ts.map +1 -0
- package/dist/schema/value-generators/index.js +219 -0
- package/dist/schema/value-generators/index.js.map +1 -0
- package/dist/schema/value-generators/placeholder.d.ts +52 -0
- package/dist/schema/value-generators/placeholder.d.ts.map +1 -0
- package/dist/schema/value-generators/placeholder.js +328 -0
- package/dist/schema/value-generators/placeholder.js.map +1 -0
- package/dist/schema/value-generators/types.d.ts +116 -0
- package/dist/schema/value-generators/types.d.ts.map +1 -0
- package/dist/schema/value-generators/types.js +11 -0
- package/dist/schema/value-generators/types.js.map +1 -0
- package/dist/schema/verb-derivation.d.ts +167 -0
- package/dist/schema/verb-derivation.d.ts.map +1 -0
- package/dist/schema/verb-derivation.js +281 -0
- package/dist/schema/verb-derivation.js.map +1 -0
- package/dist/schema/version.d.ts +111 -0
- package/dist/schema/version.d.ts.map +1 -0
- package/dist/schema/version.js +190 -0
- package/dist/schema/version.js.map +1 -0
- package/dist/schema.d.ts +1095 -23
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +2854 -38
- package/dist/schema.js.map +1 -1
- package/dist/semantic-vectors.d.ts +39 -0
- package/dist/semantic-vectors.d.ts.map +1 -0
- package/dist/semantic-vectors.js +334 -0
- package/dist/semantic-vectors.js.map +1 -0
- package/dist/semantic.d.ts +29 -1
- package/dist/semantic.d.ts.map +1 -1
- package/dist/semantic.js +26 -16
- package/dist/semantic.js.map +1 -1
- package/dist/telemetry.d.ts +128 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +305 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/tests.d.ts.map +1 -1
- package/dist/tests.js +30 -22
- package/dist/tests.js.map +1 -1
- package/dist/type-guards.d.ts +212 -0
- package/dist/type-guards.d.ts.map +1 -0
- package/dist/type-guards.js +318 -0
- package/dist/type-guards.js.map +1 -0
- package/dist/types.d.ts +33 -245
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +62 -72
- package/dist/types.js.map +1 -1
- package/dist/validation.d.ts +165 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +639 -0
- package/dist/validation.js.map +1 -0
- package/dist/worker/db-provider.d.ts +168 -0
- package/dist/worker/db-provider.d.ts.map +1 -0
- package/dist/worker/db-provider.js +277 -0
- package/dist/worker/db-provider.js.map +1 -0
- package/dist/worker/index.d.ts +35 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +37 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker.d.ts +779 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +2786 -0
- package/dist/worker.js.map +1 -0
- package/package.json +38 -8
- package/src/docs-rels/migrations/0001-init.sql +125 -0
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default Natural Language Query Generator
|
|
3
|
+
*
|
|
4
|
+
* Uses generateObject from ai-functions to convert natural language
|
|
5
|
+
* queries into structured query plans that can be executed against the database.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import { getAIGenerationConfig } from './cascade.js';
|
|
10
|
+
/**
|
|
11
|
+
* Schema definition for the query plan that LLM generates
|
|
12
|
+
*/
|
|
13
|
+
const QUERY_PLAN_SCHEMA = {
|
|
14
|
+
types: 'string[] - The entity types to query (e.g., ["Lead", "Order"])',
|
|
15
|
+
filters: 'object? - Filter conditions to apply. Use MongoDB-style operators like $gt, $lt, $eq, $in. Example: { status: "active", score: { $gt: 70 } }',
|
|
16
|
+
search: 'string? - Optional text search query to apply',
|
|
17
|
+
timeRange: 'object? - Time range filter with "since" and/or "until" ISO date strings. Example: { since: "2024-01-01T00:00:00Z" }',
|
|
18
|
+
include: 'string[]? - Related entity fields to include in the results. Example: ["company", "orders"]',
|
|
19
|
+
interpretation: 'string - Human-readable interpretation of what the query means',
|
|
20
|
+
confidence: 'number - Confidence score from 0 to 1 indicating how confident the interpretation is',
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Build a prompt for the LLM that includes schema context
|
|
24
|
+
*
|
|
25
|
+
* @param query - The natural language query from the user
|
|
26
|
+
* @param context - Schema context including available types and their fields
|
|
27
|
+
* @returns A formatted prompt string for the LLM
|
|
28
|
+
*/
|
|
29
|
+
function buildQueryPrompt(query, context) {
|
|
30
|
+
const schemaDescription = context.types
|
|
31
|
+
.map((type) => {
|
|
32
|
+
const fieldsStr = type.fields.join(', ');
|
|
33
|
+
const relationsStr = type.relationships.length > 0
|
|
34
|
+
? ` | Relations: ${type.relationships
|
|
35
|
+
.map((r) => `${r.name} -> ${r.to} (${r.cardinality})`)
|
|
36
|
+
.join(', ')}`
|
|
37
|
+
: '';
|
|
38
|
+
return `- ${type.name} (${type.singular}/${type.plural}): Fields: [${fieldsStr}]${relationsStr}`;
|
|
39
|
+
})
|
|
40
|
+
.join('\n');
|
|
41
|
+
const targetTypeHint = context.targetType
|
|
42
|
+
? `\nNote: The query is specifically targeting the "${context.targetType}" type.`
|
|
43
|
+
: '';
|
|
44
|
+
return `Convert this natural language query into a structured query plan.
|
|
45
|
+
|
|
46
|
+
Available entity types and their schemas:
|
|
47
|
+
${schemaDescription}
|
|
48
|
+
${targetTypeHint}
|
|
49
|
+
|
|
50
|
+
Query: "${query}"
|
|
51
|
+
|
|
52
|
+
Guidelines:
|
|
53
|
+
- For filter conditions, use MongoDB-style operators: $gt, $lt, $gte, $lte, $eq, $ne, $in, $nin
|
|
54
|
+
- For temporal queries like "this week", "this year", "last month", calculate the appropriate date range
|
|
55
|
+
- If the query mentions a specific entity type, include it in the types array
|
|
56
|
+
- If no specific type is mentioned and targetType is provided, use the targetType
|
|
57
|
+
- Set confidence based on how clearly the query maps to the schema (0.9+ for clear queries, 0.7-0.9 for ambiguous)
|
|
58
|
+
- The interpretation should clearly explain what the query plan will do`;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Create a default NL query generator that uses generateObject from ai-functions
|
|
62
|
+
*
|
|
63
|
+
* This generator converts natural language queries into structured query plans
|
|
64
|
+
* using the LLM configured via configureAIGeneration().
|
|
65
|
+
*
|
|
66
|
+
* @returns An NLQueryGenerator function
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* import { setNLQueryGenerator } from 'ai-database'
|
|
71
|
+
* import { createDefaultNLQueryGenerator } from 'ai-database/schema/nl-query-generator'
|
|
72
|
+
*
|
|
73
|
+
* // Configure the default generator
|
|
74
|
+
* const generator = createDefaultNLQueryGenerator()
|
|
75
|
+
* setNLQueryGenerator(generator)
|
|
76
|
+
*
|
|
77
|
+
* // Now NL queries will use the LLM
|
|
78
|
+
* const results = await db.Lead`find high scoring leads`
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export function createDefaultNLQueryGenerator() {
|
|
82
|
+
return async (query, context) => {
|
|
83
|
+
const config = getAIGenerationConfig();
|
|
84
|
+
if (!config.enabled) {
|
|
85
|
+
// If AI is disabled, return a basic plan with low confidence
|
|
86
|
+
return {
|
|
87
|
+
types: context.targetType ? [context.targetType] : context.types.map((t) => t.name),
|
|
88
|
+
search: query,
|
|
89
|
+
interpretation: `Search for "${query}"`,
|
|
90
|
+
confidence: 0.5,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// Dynamically import generateObject to avoid circular dependencies
|
|
94
|
+
let result;
|
|
95
|
+
try {
|
|
96
|
+
const { generateObject } = await import('ai-functions');
|
|
97
|
+
const prompt = buildQueryPrompt(query, context);
|
|
98
|
+
result = await generateObject({
|
|
99
|
+
model: config.model,
|
|
100
|
+
schema: QUERY_PLAN_SCHEMA,
|
|
101
|
+
prompt,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
// If API key is missing or AI service unavailable, fall back to basic plan
|
|
106
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
107
|
+
const isApiKeyError = errorMessage.includes('API key') ||
|
|
108
|
+
errorMessage.includes('apiKey') ||
|
|
109
|
+
errorMessage.includes('OPENAI_API_KEY') ||
|
|
110
|
+
errorMessage.includes('ANTHROPIC_API_KEY');
|
|
111
|
+
if (isApiKeyError) {
|
|
112
|
+
return {
|
|
113
|
+
types: context.targetType ? [context.targetType] : context.types.map((t) => t.name),
|
|
114
|
+
search: query,
|
|
115
|
+
interpretation: `Search for "${query}"`,
|
|
116
|
+
confidence: 0.5,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
throw error;
|
|
120
|
+
}
|
|
121
|
+
// Raw object has string dates from LLM output
|
|
122
|
+
const rawPlan = result.object;
|
|
123
|
+
// Build a lookup map for type name normalization (case-insensitive)
|
|
124
|
+
const typeNameMap = new Map();
|
|
125
|
+
for (const type of context.types) {
|
|
126
|
+
typeNameMap.set(type.name.toLowerCase(), type.name);
|
|
127
|
+
typeNameMap.set(type.singular.toLowerCase(), type.name);
|
|
128
|
+
typeNameMap.set(type.plural.toLowerCase(), type.name);
|
|
129
|
+
}
|
|
130
|
+
// Normalize type names from AI response to match schema type names
|
|
131
|
+
const normalizedTypes = [];
|
|
132
|
+
if (rawPlan.types && rawPlan.types.length > 0) {
|
|
133
|
+
for (const rawType of rawPlan.types) {
|
|
134
|
+
if (typeof rawType === 'string' && rawType.trim()) {
|
|
135
|
+
const normalized = typeNameMap.get(rawType.toLowerCase().trim());
|
|
136
|
+
if (normalized && !normalizedTypes.includes(normalized)) {
|
|
137
|
+
normalizedTypes.push(normalized);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Parse confidence as number (AI may return it as string)
|
|
143
|
+
let confidence = 0.5;
|
|
144
|
+
if (rawPlan.confidence !== undefined && rawPlan.confidence !== null) {
|
|
145
|
+
const parsed = typeof rawPlan.confidence === 'number'
|
|
146
|
+
? rawPlan.confidence
|
|
147
|
+
: parseFloat(String(rawPlan.confidence));
|
|
148
|
+
if (!isNaN(parsed) && parsed >= 0 && parsed <= 1) {
|
|
149
|
+
confidence = parsed;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Convert to NLQueryPlan with proper Date objects
|
|
153
|
+
const plan = {
|
|
154
|
+
types: normalizedTypes,
|
|
155
|
+
interpretation: rawPlan.interpretation ?? `Query: "${query}"`,
|
|
156
|
+
confidence,
|
|
157
|
+
};
|
|
158
|
+
if (rawPlan.filters !== undefined) {
|
|
159
|
+
plan.filters = rawPlan.filters;
|
|
160
|
+
}
|
|
161
|
+
if (rawPlan.search !== undefined) {
|
|
162
|
+
plan.search = rawPlan.search;
|
|
163
|
+
}
|
|
164
|
+
if (rawPlan.include !== undefined) {
|
|
165
|
+
plan.include = rawPlan.include;
|
|
166
|
+
}
|
|
167
|
+
// Convert ISO date strings to Date objects if present
|
|
168
|
+
if (rawPlan.timeRange) {
|
|
169
|
+
const timeRange = {};
|
|
170
|
+
if (rawPlan.timeRange.since) {
|
|
171
|
+
timeRange.since = new Date(rawPlan.timeRange.since);
|
|
172
|
+
}
|
|
173
|
+
if (rawPlan.timeRange.until) {
|
|
174
|
+
timeRange.until = new Date(rawPlan.timeRange.until);
|
|
175
|
+
}
|
|
176
|
+
plan.timeRange = timeRange;
|
|
177
|
+
}
|
|
178
|
+
// Ensure types array is populated (fallback if AI didn't return valid types)
|
|
179
|
+
if (!plan.types || plan.types.length === 0) {
|
|
180
|
+
plan.types = context.targetType ? [context.targetType] : context.types.map((t) => t.name);
|
|
181
|
+
}
|
|
182
|
+
return plan;
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Convert a value to a number for comparison
|
|
187
|
+
* Handles Date objects, numbers, and numeric strings
|
|
188
|
+
*
|
|
189
|
+
* @param value - The value to convert
|
|
190
|
+
* @returns The numeric value, or NaN if conversion fails
|
|
191
|
+
*/
|
|
192
|
+
function toComparableNumber(value) {
|
|
193
|
+
if (typeof value === 'number') {
|
|
194
|
+
return value;
|
|
195
|
+
}
|
|
196
|
+
if (value instanceof Date) {
|
|
197
|
+
return value.getTime();
|
|
198
|
+
}
|
|
199
|
+
if (typeof value === 'string') {
|
|
200
|
+
// Try to parse as date first
|
|
201
|
+
const dateValue = Date.parse(value);
|
|
202
|
+
if (!isNaN(dateValue)) {
|
|
203
|
+
return dateValue;
|
|
204
|
+
}
|
|
205
|
+
// Try to parse as number
|
|
206
|
+
const numValue = parseFloat(value);
|
|
207
|
+
if (!isNaN(numValue)) {
|
|
208
|
+
return numValue;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return NaN;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Check if a value matches a MongoDB-style filter condition
|
|
215
|
+
*
|
|
216
|
+
* Supports the following operators:
|
|
217
|
+
* - `$eq` - Equal to
|
|
218
|
+
* - `$ne` - Not equal to
|
|
219
|
+
* - `$gt` - Greater than (works with numbers and dates)
|
|
220
|
+
* - `$gte` - Greater than or equal to
|
|
221
|
+
* - `$lt` - Less than
|
|
222
|
+
* - `$lte` - Less than or equal to
|
|
223
|
+
* - `$in` - Value is in array
|
|
224
|
+
* - `$nin` - Value is not in array
|
|
225
|
+
* - `$exists` - Field exists (or doesn't exist if false)
|
|
226
|
+
* - `$regex` - Regular expression match (string values only)
|
|
227
|
+
*
|
|
228
|
+
* @param value - The value to check
|
|
229
|
+
* @param condition - The filter condition (can be a value or operator object)
|
|
230
|
+
* @returns Whether the value matches the condition
|
|
231
|
+
*
|
|
232
|
+
* @example
|
|
233
|
+
* ```ts
|
|
234
|
+
* matchesFilter(75, { $gt: 70 }) // true
|
|
235
|
+
* matchesFilter('active', 'active') // true
|
|
236
|
+
* matchesFilter(new Date('2024-01-15'), { $gt: new Date('2024-01-01') }) // true
|
|
237
|
+
* matchesFilter('enterprise', { $regex: 'enter' }) // true
|
|
238
|
+
* ```
|
|
239
|
+
*/
|
|
240
|
+
export function matchesFilter(value, condition) {
|
|
241
|
+
if (condition === null || condition === undefined) {
|
|
242
|
+
return value === condition;
|
|
243
|
+
}
|
|
244
|
+
// Simple equality check
|
|
245
|
+
if (typeof condition !== 'object') {
|
|
246
|
+
return value === condition;
|
|
247
|
+
}
|
|
248
|
+
// MongoDB-style operators
|
|
249
|
+
const operators = condition;
|
|
250
|
+
for (const [op, target] of Object.entries(operators)) {
|
|
251
|
+
switch (op) {
|
|
252
|
+
case '$eq':
|
|
253
|
+
if (value !== target)
|
|
254
|
+
return false;
|
|
255
|
+
break;
|
|
256
|
+
case '$ne':
|
|
257
|
+
if (value === target)
|
|
258
|
+
return false;
|
|
259
|
+
break;
|
|
260
|
+
case '$gt': {
|
|
261
|
+
const numValue = toComparableNumber(value);
|
|
262
|
+
const numTarget = toComparableNumber(target);
|
|
263
|
+
if (isNaN(numValue) || isNaN(numTarget))
|
|
264
|
+
return false;
|
|
265
|
+
if (numValue <= numTarget)
|
|
266
|
+
return false;
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
case '$gte': {
|
|
270
|
+
const numValue = toComparableNumber(value);
|
|
271
|
+
const numTarget = toComparableNumber(target);
|
|
272
|
+
if (isNaN(numValue) || isNaN(numTarget))
|
|
273
|
+
return false;
|
|
274
|
+
if (numValue < numTarget)
|
|
275
|
+
return false;
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
case '$lt': {
|
|
279
|
+
const numValue = toComparableNumber(value);
|
|
280
|
+
const numTarget = toComparableNumber(target);
|
|
281
|
+
if (isNaN(numValue) || isNaN(numTarget))
|
|
282
|
+
return false;
|
|
283
|
+
if (numValue >= numTarget)
|
|
284
|
+
return false;
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
case '$lte': {
|
|
288
|
+
const numValue = toComparableNumber(value);
|
|
289
|
+
const numTarget = toComparableNumber(target);
|
|
290
|
+
if (isNaN(numValue) || isNaN(numTarget))
|
|
291
|
+
return false;
|
|
292
|
+
if (numValue > numTarget)
|
|
293
|
+
return false;
|
|
294
|
+
break;
|
|
295
|
+
}
|
|
296
|
+
case '$in':
|
|
297
|
+
if (!Array.isArray(target))
|
|
298
|
+
return false;
|
|
299
|
+
if (!target.includes(value))
|
|
300
|
+
return false;
|
|
301
|
+
break;
|
|
302
|
+
case '$nin':
|
|
303
|
+
if (!Array.isArray(target))
|
|
304
|
+
return false;
|
|
305
|
+
if (target.includes(value))
|
|
306
|
+
return false;
|
|
307
|
+
break;
|
|
308
|
+
case '$exists':
|
|
309
|
+
if (target === true && value === undefined)
|
|
310
|
+
return false;
|
|
311
|
+
if (target === false && value !== undefined)
|
|
312
|
+
return false;
|
|
313
|
+
break;
|
|
314
|
+
case '$regex': {
|
|
315
|
+
if (typeof value !== 'string' || typeof target !== 'string')
|
|
316
|
+
return false;
|
|
317
|
+
try {
|
|
318
|
+
const regex = new RegExp(target, 'i');
|
|
319
|
+
if (!regex.test(value))
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
return false;
|
|
324
|
+
}
|
|
325
|
+
break;
|
|
326
|
+
}
|
|
327
|
+
default:
|
|
328
|
+
// Unknown operator - treat as nested filter
|
|
329
|
+
if (typeof value === 'object' && value !== null) {
|
|
330
|
+
const nestedValue = value[op];
|
|
331
|
+
if (!matchesFilter(nestedValue, target))
|
|
332
|
+
return false;
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
return false;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return true;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Apply filters to a list of entities
|
|
343
|
+
*
|
|
344
|
+
* @param entities - The entities to filter
|
|
345
|
+
* @param filters - The filter conditions to apply
|
|
346
|
+
* @returns The filtered entities
|
|
347
|
+
*/
|
|
348
|
+
export function applyFilters(entities, filters) {
|
|
349
|
+
if (!filters || Object.keys(filters).length === 0) {
|
|
350
|
+
return entities;
|
|
351
|
+
}
|
|
352
|
+
return entities.filter((entity) => {
|
|
353
|
+
for (const [field, condition] of Object.entries(filters)) {
|
|
354
|
+
const value = entity[field];
|
|
355
|
+
if (!matchesFilter(value, condition)) {
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return true;
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
//# sourceMappingURL=nl-query-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nl-query-generator.js","sourceRoot":"","sources":["../../src/schema/nl-query-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Natural Language Query Implementation
|
|
3
|
+
*
|
|
4
|
+
* Contains the NL query execution system that allows users to query the database
|
|
5
|
+
* using natural language. This module provides:
|
|
6
|
+
* - buildNLQueryContext() - Build context for AI query generation
|
|
7
|
+
* - executeNLQuery() - Execute an NL query against the database
|
|
8
|
+
* - createNLQueryFn() - Create a tagged template literal query function
|
|
9
|
+
* - setNLQueryGenerator/getNLQueryGenerator - Configure the AI generator
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
import type { ParsedSchema } from '../types.js';
|
|
14
|
+
import type { NLQueryResult, NLQueryFn, NLQueryContext, NLQueryGenerator } from './types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Set the AI generator for natural language queries
|
|
17
|
+
*
|
|
18
|
+
* The generator is a function that takes a natural language question and
|
|
19
|
+
* schema context, then returns a structured query plan that can be executed
|
|
20
|
+
* against the database.
|
|
21
|
+
*
|
|
22
|
+
* @param generator - The NL query generator function
|
|
23
|
+
*/
|
|
24
|
+
export declare function setNLQueryGenerator(generator: NLQueryGenerator): void;
|
|
25
|
+
/**
|
|
26
|
+
* Get the currently configured NL query generator
|
|
27
|
+
*
|
|
28
|
+
* @returns The current generator or null if not configured
|
|
29
|
+
*/
|
|
30
|
+
export declare function getNLQueryGenerator(): NLQueryGenerator | null;
|
|
31
|
+
/**
|
|
32
|
+
* Build context for AI query generation
|
|
33
|
+
*
|
|
34
|
+
* This creates a structured representation of the database schema that can be
|
|
35
|
+
* provided to an AI model to help it generate accurate query plans.
|
|
36
|
+
*
|
|
37
|
+
* @param schema - The parsed database schema
|
|
38
|
+
* @param targetType - Optional specific type being queried
|
|
39
|
+
* @returns NLQueryContext with type information for the AI
|
|
40
|
+
*/
|
|
41
|
+
export declare function buildNLQueryContext(schema: ParsedSchema, targetType?: string): NLQueryContext;
|
|
42
|
+
/**
|
|
43
|
+
* Execute a natural language query against the database
|
|
44
|
+
*
|
|
45
|
+
* This function takes a natural language question and converts it to database
|
|
46
|
+
* operations. If an AI generator is configured, it will use that to create a
|
|
47
|
+
* structured query plan. Otherwise, it falls back to keyword search.
|
|
48
|
+
*
|
|
49
|
+
* @param question - The natural language question
|
|
50
|
+
* @param schema - The parsed database schema
|
|
51
|
+
* @param targetType - Optional specific type to query
|
|
52
|
+
* @returns NLQueryResult with interpretation and results
|
|
53
|
+
*/
|
|
54
|
+
export declare function executeNLQuery<T>(question: string, schema: ParsedSchema, targetType?: string): Promise<NLQueryResult<T>>;
|
|
55
|
+
/**
|
|
56
|
+
* Create a tagged template literal function for natural language queries
|
|
57
|
+
*
|
|
58
|
+
* This enables the intuitive syntax: db.Post`show recent posts about AI`
|
|
59
|
+
*
|
|
60
|
+
* @param schema - The parsed database schema
|
|
61
|
+
* @param typeName - Optional specific type to constrain queries to
|
|
62
|
+
* @returns A tagged template function that executes NL queries
|
|
63
|
+
*/
|
|
64
|
+
export declare function createNLQueryFn<T>(schema: ParsedSchema, typeName?: string): NLQueryFn<T>;
|
|
65
|
+
//# sourceMappingURL=nl-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nl-query.d.ts","sourceRoot":"","sources":["../../src/schema/nl-query.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,cAAc,EAEd,gBAAgB,EACjB,MAAM,YAAY,CAAA;AAWnB;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAErE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,IAAI,CAE7D;AAMD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CAkC7F;AAgCD;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,CAAC,EACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,YAAY,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAkD3B;AAMD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAQxF"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Natural Language Query Implementation
|
|
3
|
+
*
|
|
4
|
+
* Contains the NL query execution system that allows users to query the database
|
|
5
|
+
* using natural language. This module provides:
|
|
6
|
+
* - buildNLQueryContext() - Build context for AI query generation
|
|
7
|
+
* - executeNLQuery() - Execute an NL query against the database
|
|
8
|
+
* - createNLQueryFn() - Create a tagged template literal query function
|
|
9
|
+
* - setNLQueryGenerator/getNLQueryGenerator - Configure the AI generator
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
import { getTypeMeta } from '../linguistic.js';
|
|
14
|
+
import { resolveProvider } from './provider.js';
|
|
15
|
+
// =============================================================================
|
|
16
|
+
// NL Query Generator State
|
|
17
|
+
// =============================================================================
|
|
18
|
+
let nlQueryGenerator = null;
|
|
19
|
+
/**
|
|
20
|
+
* Set the AI generator for natural language queries
|
|
21
|
+
*
|
|
22
|
+
* The generator is a function that takes a natural language question and
|
|
23
|
+
* schema context, then returns a structured query plan that can be executed
|
|
24
|
+
* against the database.
|
|
25
|
+
*
|
|
26
|
+
* @param generator - The NL query generator function
|
|
27
|
+
*/
|
|
28
|
+
export function setNLQueryGenerator(generator) {
|
|
29
|
+
nlQueryGenerator = generator;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get the currently configured NL query generator
|
|
33
|
+
*
|
|
34
|
+
* @returns The current generator or null if not configured
|
|
35
|
+
*/
|
|
36
|
+
export function getNLQueryGenerator() {
|
|
37
|
+
return nlQueryGenerator;
|
|
38
|
+
}
|
|
39
|
+
// =============================================================================
|
|
40
|
+
// NL Query Context Builder
|
|
41
|
+
// =============================================================================
|
|
42
|
+
/**
|
|
43
|
+
* Build context for AI query generation
|
|
44
|
+
*
|
|
45
|
+
* This creates a structured representation of the database schema that can be
|
|
46
|
+
* provided to an AI model to help it generate accurate query plans.
|
|
47
|
+
*
|
|
48
|
+
* @param schema - The parsed database schema
|
|
49
|
+
* @param targetType - Optional specific type being queried
|
|
50
|
+
* @returns NLQueryContext with type information for the AI
|
|
51
|
+
*/
|
|
52
|
+
export function buildNLQueryContext(schema, targetType) {
|
|
53
|
+
const types = [];
|
|
54
|
+
for (const [name, entity] of schema.entities) {
|
|
55
|
+
const fields = [];
|
|
56
|
+
const relationships = [];
|
|
57
|
+
for (const [fieldName, field] of entity.fields) {
|
|
58
|
+
if (field.isRelation && field.relatedType) {
|
|
59
|
+
relationships.push({
|
|
60
|
+
name: fieldName,
|
|
61
|
+
to: field.relatedType,
|
|
62
|
+
cardinality: field.isArray ? 'many' : 'one',
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
fields.push(fieldName);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const meta = getTypeMeta(name);
|
|
70
|
+
types.push({
|
|
71
|
+
name,
|
|
72
|
+
singular: meta.singular,
|
|
73
|
+
plural: meta.plural,
|
|
74
|
+
fields,
|
|
75
|
+
relationships,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
const result = { types };
|
|
79
|
+
if (targetType !== undefined) {
|
|
80
|
+
result.targetType = targetType;
|
|
81
|
+
}
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
// =============================================================================
|
|
85
|
+
// NL Query Execution
|
|
86
|
+
// =============================================================================
|
|
87
|
+
/** Regex pattern to detect "list all" style queries */
|
|
88
|
+
const LIST_ALL_PATTERN = /^(show|list|get|find|display)\s+(all|every|the)?\s*/i;
|
|
89
|
+
/**
|
|
90
|
+
* Check if a query is requesting to list all items
|
|
91
|
+
*/
|
|
92
|
+
function isListAllQuery(question) {
|
|
93
|
+
const normalized = question.toLowerCase().trim();
|
|
94
|
+
return LIST_ALL_PATTERN.test(normalized) || normalized === '' || /\ball\b/i.test(normalized);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Fetch results from provider for a single type
|
|
98
|
+
*/
|
|
99
|
+
async function fetchTypeResults(provider, typeName, question, listAll) {
|
|
100
|
+
if (listAll) {
|
|
101
|
+
return (await provider.list(typeName));
|
|
102
|
+
}
|
|
103
|
+
return (await provider.search(typeName, question));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Execute a natural language query against the database
|
|
107
|
+
*
|
|
108
|
+
* This function takes a natural language question and converts it to database
|
|
109
|
+
* operations. If an AI generator is configured, it will use that to create a
|
|
110
|
+
* structured query plan. Otherwise, it falls back to keyword search.
|
|
111
|
+
*
|
|
112
|
+
* @param question - The natural language question
|
|
113
|
+
* @param schema - The parsed database schema
|
|
114
|
+
* @param targetType - Optional specific type to query
|
|
115
|
+
* @returns NLQueryResult with interpretation and results
|
|
116
|
+
*/
|
|
117
|
+
export async function executeNLQuery(question, schema, targetType) {
|
|
118
|
+
const { applyFilters } = await import('./nl-query-generator.js');
|
|
119
|
+
// Fallback mode when no AI generator is configured
|
|
120
|
+
if (!nlQueryGenerator) {
|
|
121
|
+
const provider = await resolveProvider();
|
|
122
|
+
const listAll = isListAllQuery(question);
|
|
123
|
+
const results = [];
|
|
124
|
+
const typesToQuery = targetType ? [targetType] : [...schema.entities.keys()];
|
|
125
|
+
for (const typeName of typesToQuery) {
|
|
126
|
+
const typeResults = await fetchTypeResults(provider, typeName, question, listAll);
|
|
127
|
+
results.push(...typeResults);
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
interpretation: `Search for "${question}"`,
|
|
131
|
+
confidence: 0.5,
|
|
132
|
+
results,
|
|
133
|
+
explanation: 'Fallback to keyword search (no AI generator configured)',
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
// AI-powered query execution
|
|
137
|
+
const context = buildNLQueryContext(schema, targetType);
|
|
138
|
+
const plan = await nlQueryGenerator(question, context);
|
|
139
|
+
const provider = await resolveProvider();
|
|
140
|
+
const results = [];
|
|
141
|
+
const hasFilters = plan.filters && Object.keys(plan.filters).length > 0;
|
|
142
|
+
for (const typeName of plan.types) {
|
|
143
|
+
let typeResults = plan.search
|
|
144
|
+
? await provider.search(typeName, plan.search)
|
|
145
|
+
: await provider.list(typeName);
|
|
146
|
+
if (hasFilters) {
|
|
147
|
+
typeResults = applyFilters(typeResults, plan.filters);
|
|
148
|
+
}
|
|
149
|
+
results.push(...typeResults);
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
interpretation: plan.interpretation,
|
|
153
|
+
confidence: plan.confidence,
|
|
154
|
+
results,
|
|
155
|
+
query: JSON.stringify({ types: plan.types, filters: plan.filters, search: plan.search }),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
// =============================================================================
|
|
159
|
+
// NL Query Function Factory
|
|
160
|
+
// =============================================================================
|
|
161
|
+
/**
|
|
162
|
+
* Create a tagged template literal function for natural language queries
|
|
163
|
+
*
|
|
164
|
+
* This enables the intuitive syntax: db.Post`show recent posts about AI`
|
|
165
|
+
*
|
|
166
|
+
* @param schema - The parsed database schema
|
|
167
|
+
* @param typeName - Optional specific type to constrain queries to
|
|
168
|
+
* @returns A tagged template function that executes NL queries
|
|
169
|
+
*/
|
|
170
|
+
export function createNLQueryFn(schema, typeName) {
|
|
171
|
+
return async (strings, ...values) => {
|
|
172
|
+
const question = strings.reduce((acc, str, i) => {
|
|
173
|
+
return acc + str + (values[i] !== undefined ? String(values[i]) : '');
|
|
174
|
+
}, '');
|
|
175
|
+
return executeNLQuery(question, schema, typeName);
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=nl-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nl-query.js","sourceRoot":"","sources":["../../src/schema/nl-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/schema/parse.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAEV,eAAe,EAEf,cAAc,EACd,WAAW,EAEX,YAAY,
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/schema/parse.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAEV,eAAe,EAEf,cAAc,EACd,WAAW,EAEX,YAAY,EAEb,MAAM,aAAa,CAAA;AAEpB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AASrD;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAA;IACZ,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAA;gBAEJ,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAO3E;AAkCD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CA+DrD;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAsCxE;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CA4I9F;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,OAAO,EAAE,EACrB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,IAAI,CAsCN;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,IAAI,CAoHN;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CA6BlF;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAgB5E;AAkCD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAYrD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,GAAG,WAAW,CAqHjF;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,YAAY,CAiJhE"}
|