@reasoningco/infer 0.0.2

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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +42 -0
  3. package/dist/catalog.d.ts +39 -0
  4. package/dist/catalog.d.ts.map +1 -0
  5. package/dist/catalog.js +249 -0
  6. package/dist/catalog.js.map +1 -0
  7. package/dist/connectors.d.ts +63 -0
  8. package/dist/connectors.d.ts.map +1 -0
  9. package/dist/connectors.js +263 -0
  10. package/dist/connectors.js.map +1 -0
  11. package/dist/dates.d.ts +35 -0
  12. package/dist/dates.d.ts.map +1 -0
  13. package/dist/dates.js +293 -0
  14. package/dist/dates.js.map +1 -0
  15. package/dist/entity-resolver.d.ts +29 -0
  16. package/dist/entity-resolver.d.ts.map +1 -0
  17. package/dist/entity-resolver.js +91 -0
  18. package/dist/entity-resolver.js.map +1 -0
  19. package/dist/errors.d.ts +10 -0
  20. package/dist/errors.d.ts.map +1 -0
  21. package/dist/errors.js +28 -0
  22. package/dist/errors.js.map +1 -0
  23. package/dist/index.d.ts +43 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +240 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/llm.d.ts +50 -0
  28. package/dist/llm.d.ts.map +1 -0
  29. package/dist/llm.js +311 -0
  30. package/dist/llm.js.map +1 -0
  31. package/dist/query-validator.d.ts +6 -0
  32. package/dist/query-validator.d.ts.map +1 -0
  33. package/dist/query-validator.js +136 -0
  34. package/dist/query-validator.js.map +1 -0
  35. package/dist/schemas.d.ts +170 -0
  36. package/dist/schemas.d.ts.map +1 -0
  37. package/dist/schemas.js +44 -0
  38. package/dist/schemas.js.map +1 -0
  39. package/dist/security.d.ts +9 -0
  40. package/dist/security.d.ts.map +1 -0
  41. package/dist/security.js +97 -0
  42. package/dist/security.js.map +1 -0
  43. package/dist/sql-builder.d.ts +5 -0
  44. package/dist/sql-builder.d.ts.map +1 -0
  45. package/dist/sql-builder.js +121 -0
  46. package/dist/sql-builder.js.map +1 -0
  47. package/dist/sql-validator.d.ts +8 -0
  48. package/dist/sql-validator.d.ts.map +1 -0
  49. package/dist/sql-validator.js +160 -0
  50. package/dist/sql-validator.js.map +1 -0
  51. package/dist/testing.d.ts +22 -0
  52. package/dist/testing.d.ts.map +1 -0
  53. package/dist/testing.js +78 -0
  54. package/dist/testing.js.map +1 -0
  55. package/dist/types.d.ts +214 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +27 -0
  58. package/dist/types.js.map +1 -0
  59. package/package.json +72 -0
@@ -0,0 +1,263 @@
1
+ import { InferError } from './errors.js';
2
+ export class PostgresConnector {
3
+ pool; // pg.Pool - lazy loaded
4
+ config;
5
+ constructor(config) {
6
+ // Browser environment guard
7
+ if (typeof window !== 'undefined') {
8
+ throw new Error('PostgresConnector cannot run in a browser. Use HTTPConnector or a server-side API proxy.');
9
+ }
10
+ this.config = config;
11
+ }
12
+ async getPool() {
13
+ if (!this.pool) {
14
+ try {
15
+ // Dynamic import - pg is an optional peer dependency
16
+ const pg = await (Function('return import("pg")')());
17
+ const Pool = pg.default?.Pool || pg.Pool;
18
+ this.pool = new Pool({
19
+ connectionString: this.config.connectionString,
20
+ host: this.config.host,
21
+ port: this.config.port,
22
+ database: this.config.database,
23
+ user: this.config.user,
24
+ password: this.config.password,
25
+ ssl: this.config.ssl,
26
+ max: this.config.max ?? 10,
27
+ });
28
+ }
29
+ catch {
30
+ throw new InferError('CONNECTION_ERROR', 'executor', 'pg package is not installed. Run: npm install pg');
31
+ }
32
+ }
33
+ return this.pool;
34
+ }
35
+ async execute(sql, params) {
36
+ const pool = await this.getPool();
37
+ const client = await pool.connect();
38
+ try {
39
+ // Secure execution: read-only transaction with timeout
40
+ await client.query('BEGIN');
41
+ await client.query('SET TRANSACTION READ ONLY');
42
+ if (this.config.statementTimeout) {
43
+ const timeout = String(this.config.statementTimeout);
44
+ if (!/^\d+(ms|s|min)?$/.test(timeout)) {
45
+ throw new Error(`Invalid statementTimeout value: ${timeout}`);
46
+ }
47
+ await client.query(`SET LOCAL statement_timeout = '${timeout}'`);
48
+ }
49
+ const result = await client.query(sql, params);
50
+ await client.query('COMMIT');
51
+ const columns = result.fields?.map((f) => ({
52
+ name: f.name,
53
+ type: pgTypeToColumnType(f.dataTypeID),
54
+ })) ?? [];
55
+ return { rows: result.rows, columns };
56
+ }
57
+ catch (error) {
58
+ await client.query('ROLLBACK').catch(() => { });
59
+ if (error?.code === '57014') {
60
+ throw new InferError('QUERY_TIMEOUT', 'executor', 'Statement timeout exceeded');
61
+ }
62
+ if (error instanceof InferError)
63
+ throw error;
64
+ throw new InferError('QUERY_ERROR', 'executor', 'Database query failed');
65
+ }
66
+ finally {
67
+ client.release();
68
+ }
69
+ }
70
+ async introspect() {
71
+ const pool = await this.getPool();
72
+ const client = await pool.connect();
73
+ try {
74
+ // Phase 1: Structure
75
+ const structureQuery = `
76
+ SELECT
77
+ n.nspname AS schema_name, c.relname AS table_name,
78
+ a.attname AS column_name,
79
+ pg_catalog.format_type(a.atttypid, a.atttypmod) AS data_type,
80
+ t.typcategory,
81
+ a.attnotnull AS not_null,
82
+ pg_get_expr(d.adbin, d.adrelid) AS default_value,
83
+ col_description(a.attrelid, a.attnum) AS column_comment,
84
+ c.reltuples::bigint AS estimated_rows
85
+ FROM pg_catalog.pg_class c
86
+ JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
87
+ JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid
88
+ JOIN pg_catalog.pg_type t ON t.oid = a.atttypid
89
+ LEFT JOIN pg_catalog.pg_attrdef d ON d.adrelid = c.oid AND d.adnum = a.attnum
90
+ WHERE c.relkind IN ('r','v','m')
91
+ AND n.nspname NOT IN ('pg_catalog','information_schema','pg_toast')
92
+ AND a.attnum > 0 AND NOT a.attisdropped
93
+ AND has_table_privilege(c.oid, 'SELECT')
94
+ ORDER BY n.nspname, c.relname, a.attnum;
95
+ `;
96
+ const { rows } = await client.query(structureQuery);
97
+ // Phase 1b: Foreign keys
98
+ const fkQuery = `
99
+ SELECT
100
+ n.nspname AS schema_name,
101
+ c.relname AS table_name,
102
+ a.attname AS column_name,
103
+ fn.nspname AS foreign_schema,
104
+ fc.relname AS foreign_table,
105
+ fa.attname AS foreign_column
106
+ FROM pg_catalog.pg_constraint con
107
+ JOIN pg_catalog.pg_class c ON c.oid = con.conrelid
108
+ JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
109
+ JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid AND a.attnum = ANY(con.conkey)
110
+ JOIN pg_catalog.pg_class fc ON fc.oid = con.confrelid
111
+ JOIN pg_catalog.pg_namespace fn ON fn.oid = fc.relnamespace
112
+ JOIN pg_catalog.pg_attribute fa ON fa.attrelid = fc.oid AND fa.attnum = ANY(con.confkey)
113
+ WHERE con.contype = 'f'
114
+ AND n.nspname NOT IN ('pg_catalog','information_schema');
115
+ `;
116
+ const fkResult = await client.query(fkQuery);
117
+ // Phase 1c: Enums
118
+ const enumQuery = `
119
+ SELECT t.typname, e.enumlabel
120
+ FROM pg_catalog.pg_type t
121
+ JOIN pg_catalog.pg_enum e ON t.oid = e.enumtypid
122
+ ORDER BY t.typname, e.enumsortorder;
123
+ `;
124
+ const enumResult = await client.query(enumQuery);
125
+ // Build schema
126
+ const tableMap = new Map();
127
+ for (const row of rows) {
128
+ const key = `${row.schema_name}.${row.table_name}`;
129
+ if (!tableMap.has(key)) {
130
+ tableMap.set(key, {
131
+ schema: row.schema_name,
132
+ name: row.table_name,
133
+ columns: [],
134
+ estimatedRows: Number(row.estimated_rows) || 0,
135
+ foreignKeys: [],
136
+ indexes: [],
137
+ });
138
+ }
139
+ tableMap.get(key).columns.push({
140
+ name: row.column_name,
141
+ dataType: row.data_type,
142
+ typeCategory: row.typcategory,
143
+ notNull: row.not_null,
144
+ defaultValue: row.default_value,
145
+ comment: row.column_comment,
146
+ });
147
+ }
148
+ // Add foreign keys
149
+ for (const fk of fkResult.rows) {
150
+ const key = `${fk.schema_name}.${fk.table_name}`;
151
+ const table = tableMap.get(key);
152
+ if (table) {
153
+ table.foreignKeys.push({
154
+ column: fk.column_name,
155
+ foreignTable: `${fk.foreign_schema}.${fk.foreign_table}`,
156
+ foreignColumn: fk.foreign_column,
157
+ });
158
+ }
159
+ }
160
+ // Build enums
161
+ const enums = {};
162
+ for (const row of enumResult.rows) {
163
+ if (!enums[row.typname])
164
+ enums[row.typname] = [];
165
+ enums[row.typname].push(row.enumlabel);
166
+ }
167
+ return {
168
+ tables: Array.from(tableMap.values()),
169
+ enums,
170
+ };
171
+ }
172
+ finally {
173
+ client.release();
174
+ }
175
+ }
176
+ async close() {
177
+ if (this.pool) {
178
+ await this.pool.end();
179
+ this.pool = null;
180
+ }
181
+ }
182
+ }
183
+ export class HTTPConnector {
184
+ config;
185
+ constructor(config) {
186
+ this.config = config;
187
+ }
188
+ async execute(sql, params) {
189
+ const response = await fetch(this.config.endpoint, {
190
+ method: 'POST',
191
+ headers: {
192
+ 'Content-Type': 'application/json',
193
+ ...this.config.headers,
194
+ },
195
+ body: JSON.stringify({ sql, params }),
196
+ });
197
+ if (!response.ok) {
198
+ throw new InferError('QUERY_ERROR', 'executor', `HTTP ${response.status}: ${response.statusText}`);
199
+ }
200
+ return response.json();
201
+ }
202
+ async introspect() {
203
+ const response = await fetch(`${this.config.endpoint}/introspect`, {
204
+ method: 'POST',
205
+ headers: {
206
+ 'Content-Type': 'application/json',
207
+ ...this.config.headers,
208
+ },
209
+ });
210
+ if (!response.ok) {
211
+ throw new InferError('CONNECTION_ERROR', 'executor', 'Introspection failed');
212
+ }
213
+ return response.json();
214
+ }
215
+ async close() { }
216
+ }
217
+ // ── SupabaseConnector (stub) ──
218
+ export class SupabaseConnector {
219
+ constructor(_config) {
220
+ // Stub — full implementation in future release
221
+ }
222
+ async execute() {
223
+ throw new InferError('CONNECTION_ERROR', 'executor', 'SupabaseConnector is not yet implemented');
224
+ }
225
+ async introspect() {
226
+ throw new InferError('CONNECTION_ERROR', 'executor', 'SupabaseConnector is not yet implemented');
227
+ }
228
+ async close() { }
229
+ }
230
+ // ── LambdaConnector (stub) ──
231
+ export class LambdaConnector {
232
+ constructor(_config) {
233
+ // Stub — full implementation in future release
234
+ }
235
+ async execute() {
236
+ throw new InferError('CONNECTION_ERROR', 'executor', 'LambdaConnector is not yet implemented');
237
+ }
238
+ async introspect() {
239
+ throw new InferError('CONNECTION_ERROR', 'executor', 'LambdaConnector is not yet implemented');
240
+ }
241
+ async close() { }
242
+ }
243
+ // ── Helpers ──
244
+ function pgTypeToColumnType(oid) {
245
+ // Common PostgreSQL OIDs
246
+ const numericTypes = new Set([20, 21, 23, 26, 700, 701, 790, 1700]);
247
+ const dateTypes = new Set([1082]);
248
+ const timestampTypes = new Set([1114, 1184]);
249
+ const boolType = 16;
250
+ const jsonTypes = new Set([114, 3802]);
251
+ if (numericTypes.has(oid))
252
+ return 'numeric';
253
+ if (dateTypes.has(oid))
254
+ return 'date';
255
+ if (timestampTypes.has(oid))
256
+ return 'timestamp';
257
+ if (oid === boolType)
258
+ return 'boolean';
259
+ if (jsonTypes.has(oid))
260
+ return 'json';
261
+ return 'text';
262
+ }
263
+ //# sourceMappingURL=connectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectors.js","sourceRoot":"","sources":["../src/connectors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAgBzC,MAAM,OAAO,iBAAiB;IACpB,IAAI,CAAM,CAAC,wBAAwB;IACnC,MAAM,CAA0B;IAExC,YAAY,MAA+B;QACzC,4BAA4B;QAC5B,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,0FAA0F,CAAC,CAAC;QAC9G,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,qDAAqD;gBACrD,MAAM,EAAE,GAAQ,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;gBAC1D,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC;gBACzC,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC;oBACnB,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB;oBAC9C,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;oBACtB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;oBACtB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;oBAC9B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;oBACtB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;oBAC9B,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG;oBACpB,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE;iBAC3B,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,UAAU,EAAE,kDAAkD,CAAC,CAAC;YAC3G,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,MAAiB;QAC1C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,uDAAuD;YACvD,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAChD,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;gBACrD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAC;gBAChE,CAAC;gBACD,MAAM,MAAM,CAAC,KAAK,CAAC,kCAAkC,OAAO,GAAG,CAAC,CAAC;YACnE,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC/C,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAE7B,MAAM,OAAO,GAAiB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBAC5D,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,UAAU,CAAC;aACvC,CAAC,CAAC,IAAI,EAAE,CAAC;YAEV,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;QACxC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC/C,IAAI,KAAK,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC5B,MAAM,IAAI,UAAU,CAAC,eAAe,EAAE,UAAU,EAAE,4BAA4B,CAAC,CAAC;YAClF,CAAC;YACD,IAAI,KAAK,YAAY,UAAU;gBAAE,MAAM,KAAK,CAAC;YAC7C,MAAM,IAAI,UAAU,CAAC,aAAa,EAAE,UAAU,EAAE,uBAAuB,CAAC,CAAC;QAC3E,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,qBAAqB;YACrB,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;OAoBtB,CAAC;YACF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAEpD,yBAAyB;YACzB,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;OAiBf,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAE7C,kBAAkB;YAClB,MAAM,SAAS,GAAG;;;;;OAKjB,CAAC;YACF,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAEjD,eAAe;YACf,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;YACtD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;gBACnD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE;wBAChB,MAAM,EAAE,GAAG,CAAC,WAAW;wBACvB,IAAI,EAAE,GAAG,CAAC,UAAU;wBACpB,OAAO,EAAE,EAAE;wBACX,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC;wBAC9C,WAAW,EAAE,EAAE;wBACf,OAAO,EAAE,EAAE;qBACZ,CAAC,CAAC;gBACL,CAAC;gBACD,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,OAAO,CAAC,IAAI,CAAC;oBAC9B,IAAI,EAAE,GAAG,CAAC,WAAW;oBACrB,QAAQ,EAAE,GAAG,CAAC,SAAS;oBACvB,YAAY,EAAE,GAAG,CAAC,WAAW;oBAC7B,OAAO,EAAE,GAAG,CAAC,QAAQ;oBACrB,YAAY,EAAE,GAAG,CAAC,aAAa;oBAC/B,OAAO,EAAE,GAAG,CAAC,cAAc;iBAC5B,CAAC,CAAC;YACL,CAAC;YAED,mBAAmB;YACnB,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC/B,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;gBACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAChC,IAAI,KAAK,EAAE,CAAC;oBACV,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;wBACrB,MAAM,EAAE,EAAE,CAAC,WAAW;wBACtB,YAAY,EAAE,GAAG,EAAE,CAAC,cAAc,IAAI,EAAE,CAAC,aAAa,EAAE;wBACxD,aAAa,EAAE,EAAE,CAAC,cAAc;qBACjC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,cAAc;YACd,MAAM,KAAK,GAA6B,EAAE,CAAC;YAC3C,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;gBAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;oBAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACjD,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACzC,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACrC,KAAK;aACN,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC;CACF;AAQD,MAAM,OAAO,aAAa;IAChB,MAAM,CAAsB;IAEpC,YAAY,MAA2B;QACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,MAAiB;QAC1C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;YACjD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;aACvB;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;SACtC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,UAAU,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACrG,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,aAAa,EAAE;YACjE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;aACvB;SACF,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,UAAU,EAAE,sBAAsB,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK,KAAmB,CAAC;CAChC;AAED,iCAAiC;AACjC,MAAM,OAAO,iBAAiB;IAC5B,YAAY,OAAgD;QAC1D,+CAA+C;IACjD,CAAC;IACD,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,UAAU,EAAE,0CAA0C,CAAC,CAAC;IACnG,CAAC;IACD,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,UAAU,EAAE,0CAA0C,CAAC,CAAC;IACnG,CAAC;IACD,KAAK,CAAC,KAAK,KAAmB,CAAC;CAChC;AAED,+BAA+B;AAC/B,MAAM,OAAO,eAAe;IAC1B,YAAY,OAAiD;QAC3D,+CAA+C;IACjD,CAAC;IACD,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,UAAU,EAAE,wCAAwC,CAAC,CAAC;IACjG,CAAC;IACD,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,UAAU,EAAE,wCAAwC,CAAC,CAAC;IACjG,CAAC;IACD,KAAK,CAAC,KAAK,KAAmB,CAAC;CAChC;AAED,gBAAgB;AAChB,SAAS,kBAAkB,CAAC,GAAW;IACrC,yBAAyB;IACzB,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IAEvC,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IACtC,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,WAAW,CAAC;IAChD,IAAI,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACvC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IACtC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,35 @@
1
+ export declare const RELATIVE_PHRASES: readonly ["today", "yesterday", "tomorrow", "this week", "last week", "next week", "last 7 days", "next 7 days", "last 30 days", "next 30 days", "this month", "last month", "next month", "this year", "last year"];
2
+ export type RelativeDatePhrase = (typeof RELATIVE_PHRASES)[number] | `last ${number} days` | `next ${number} days` | `last ${number} weeks` | `next ${number} weeks` | `last ${number} months` | `next ${number} months`;
3
+ export declare function formatDateISO(d: Date): string;
4
+ export declare function startOfLocalDay(d: Date): Date;
5
+ export declare function addDays(d: Date, n: number): Date;
6
+ export declare function startOfWeekMonday(d: Date): Date;
7
+ export declare function startOfMonth(d: Date): Date;
8
+ export declare function endOfMonth(d: Date): Date;
9
+ export declare function tryDynamicMatch(phrase: string, now: Date): {
10
+ start: Date;
11
+ end: Date;
12
+ } | null;
13
+ export declare function detectRelativePhrase(text: string): RelativeDatePhrase | null;
14
+ export type ComputedRange = {
15
+ startISO: string;
16
+ endISO: string;
17
+ start: Date;
18
+ end: Date;
19
+ };
20
+ export declare function computeRelativeRange(phrase: RelativeDatePhrase | string, now: Date): ComputedRange;
21
+ export declare function resolveDateRange(options: {
22
+ startDate?: string;
23
+ endDate?: string;
24
+ phrase?: string;
25
+ now?: Date;
26
+ }): {
27
+ startDate: string;
28
+ endDate: string;
29
+ } | null;
30
+ export declare function parseRelativeDateRange(question: string, now?: Date): {
31
+ startDate: string;
32
+ endDate: string;
33
+ phrase: string;
34
+ } | null;
35
+ //# sourceMappingURL=dates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dates.d.ts","sourceRoot":"","sources":["../src/dates.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,sNAgBnB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAC1B,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,GACjC,QAAQ,MAAM,OAAO,GACrB,QAAQ,MAAM,OAAO,GACrB,QAAQ,MAAM,QAAQ,GACtB,QAAQ,MAAM,QAAQ,GACtB,QAAQ,MAAM,SAAS,GACvB,QAAQ,MAAM,SAAS,CAAC;AAI5B,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAK7C;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAE7C;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAIhD;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAI/C;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAE1C;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAExC;AAyLD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,IAAI,GACR;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,GAAG,IAAI,CASnC;AAID,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAoB5E;AAID,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,IAAI,CAAC;IACZ,GAAG,EAAE,IAAI,CAAC;CACX,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,kBAAkB,GAAG,MAAM,EACnC,GAAG,EAAE,IAAI,GACR,aAAa,CAmCf;AAID,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAYhD;AAID,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,GAAG,CAAC,EAAE,IAAI,GACT;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAK/D"}
package/dist/dates.js ADDED
@@ -0,0 +1,293 @@
1
+ // ── Relative date phrases ──
2
+ export const RELATIVE_PHRASES = [
3
+ "today",
4
+ "yesterday",
5
+ "tomorrow",
6
+ "this week",
7
+ "last week",
8
+ "next week",
9
+ "last 7 days",
10
+ "next 7 days",
11
+ "last 30 days",
12
+ "next 30 days",
13
+ "this month",
14
+ "last month",
15
+ "next month",
16
+ "this year",
17
+ "last year",
18
+ ];
19
+ // ── Helper functions ──
20
+ export function formatDateISO(d) {
21
+ const y = d.getFullYear();
22
+ const m = String(d.getMonth() + 1).padStart(2, "0");
23
+ const day = String(d.getDate()).padStart(2, "0");
24
+ return `${y}-${m}-${day}`;
25
+ }
26
+ export function startOfLocalDay(d) {
27
+ return new Date(d.getFullYear(), d.getMonth(), d.getDate());
28
+ }
29
+ export function addDays(d, n) {
30
+ const result = new Date(d);
31
+ result.setDate(result.getDate() + n);
32
+ return result;
33
+ }
34
+ export function startOfWeekMonday(d) {
35
+ const day = d.getDay();
36
+ const diff = day === 0 ? -6 : 1 - day;
37
+ return addDays(startOfLocalDay(d), diff);
38
+ }
39
+ export function startOfMonth(d) {
40
+ return new Date(d.getFullYear(), d.getMonth(), 1);
41
+ }
42
+ export function endOfMonth(d) {
43
+ return new Date(d.getFullYear(), d.getMonth() + 1, 0);
44
+ }
45
+ const RELATIVE_RULES = [
46
+ {
47
+ phrase: "today",
48
+ compute: (now) => {
49
+ const s = startOfLocalDay(now);
50
+ return { start: s, end: s };
51
+ },
52
+ },
53
+ {
54
+ phrase: "yesterday",
55
+ compute: (now) => {
56
+ const s = addDays(startOfLocalDay(now), -1);
57
+ return { start: s, end: s };
58
+ },
59
+ },
60
+ {
61
+ phrase: "tomorrow",
62
+ compute: (now) => {
63
+ const s = addDays(startOfLocalDay(now), 1);
64
+ return { start: s, end: s };
65
+ },
66
+ },
67
+ {
68
+ phrase: "this week",
69
+ compute: (now) => {
70
+ const s = startOfWeekMonday(now);
71
+ const e = addDays(s, 6);
72
+ return { start: s, end: e };
73
+ },
74
+ },
75
+ {
76
+ phrase: "last week",
77
+ compute: (now) => {
78
+ const s = addDays(startOfWeekMonday(now), -7);
79
+ const e = addDays(s, 6);
80
+ return { start: s, end: e };
81
+ },
82
+ },
83
+ {
84
+ phrase: "next week",
85
+ compute: (now) => {
86
+ const s = addDays(startOfWeekMonday(now), 7);
87
+ const e = addDays(s, 6);
88
+ return { start: s, end: e };
89
+ },
90
+ },
91
+ {
92
+ phrase: "last 7 days",
93
+ compute: (now) => {
94
+ const today = startOfLocalDay(now);
95
+ return { start: addDays(today, -6), end: today };
96
+ },
97
+ },
98
+ {
99
+ phrase: "next 7 days",
100
+ compute: (now) => {
101
+ const today = startOfLocalDay(now);
102
+ return { start: today, end: addDays(today, 6) };
103
+ },
104
+ },
105
+ {
106
+ phrase: "last 30 days",
107
+ compute: (now) => {
108
+ const today = startOfLocalDay(now);
109
+ return { start: addDays(today, -29), end: today };
110
+ },
111
+ },
112
+ {
113
+ phrase: "next 30 days",
114
+ compute: (now) => {
115
+ const today = startOfLocalDay(now);
116
+ return { start: today, end: addDays(today, 29) };
117
+ },
118
+ },
119
+ {
120
+ phrase: "this month",
121
+ compute: (now) => {
122
+ return { start: startOfMonth(now), end: endOfMonth(now) };
123
+ },
124
+ },
125
+ {
126
+ phrase: "last month",
127
+ compute: (now) => {
128
+ const prev = new Date(now.getFullYear(), now.getMonth() - 1, 1);
129
+ return { start: startOfMonth(prev), end: endOfMonth(prev) };
130
+ },
131
+ },
132
+ {
133
+ phrase: "next month",
134
+ compute: (now) => {
135
+ const next = new Date(now.getFullYear(), now.getMonth() + 1, 1);
136
+ return { start: startOfMonth(next), end: endOfMonth(next) };
137
+ },
138
+ },
139
+ {
140
+ phrase: "this year",
141
+ compute: (now) => {
142
+ return {
143
+ start: new Date(now.getFullYear(), 0, 1),
144
+ end: new Date(now.getFullYear(), 11, 31),
145
+ };
146
+ },
147
+ },
148
+ {
149
+ phrase: "last year",
150
+ compute: (now) => {
151
+ const y = now.getFullYear() - 1;
152
+ return { start: new Date(y, 0, 1), end: new Date(y, 11, 31) };
153
+ },
154
+ },
155
+ ];
156
+ // ── Dynamic patterns ──
157
+ const DYNAMIC_PAST_DAYS = /^last (\d+) days?$/i;
158
+ const DYNAMIC_FUTURE_DAYS = /^next (\d+) days?$/i;
159
+ const DYNAMIC_PAST_WEEKS = /^last (\d+) weeks?$/i;
160
+ const DYNAMIC_FUTURE_WEEKS = /^next (\d+) weeks?$/i;
161
+ const DYNAMIC_PAST_MONTHS = /^last (\d+) months?$/i;
162
+ const DYNAMIC_FUTURE_MONTHS = /^next (\d+) months?$/i;
163
+ const DYNAMIC_PATTERNS = [
164
+ {
165
+ regex: DYNAMIC_PAST_DAYS,
166
+ compute: (n, now) => {
167
+ const today = startOfLocalDay(now);
168
+ return { start: addDays(today, -(n - 1)), end: today };
169
+ },
170
+ },
171
+ {
172
+ regex: DYNAMIC_FUTURE_DAYS,
173
+ compute: (n, now) => {
174
+ const today = startOfLocalDay(now);
175
+ return { start: today, end: addDays(today, n - 1) };
176
+ },
177
+ },
178
+ {
179
+ regex: DYNAMIC_PAST_WEEKS,
180
+ compute: (n, now) => {
181
+ const monday = startOfWeekMonday(now);
182
+ return { start: addDays(monday, -7 * n), end: addDays(monday, -1) };
183
+ },
184
+ },
185
+ {
186
+ regex: DYNAMIC_FUTURE_WEEKS,
187
+ compute: (n, now) => {
188
+ const monday = startOfWeekMonday(now);
189
+ const nextMonday = addDays(monday, 7);
190
+ return { start: nextMonday, end: addDays(nextMonday, 7 * n - 1) };
191
+ },
192
+ },
193
+ {
194
+ regex: DYNAMIC_PAST_MONTHS,
195
+ compute: (n, now) => {
196
+ const s = new Date(now.getFullYear(), now.getMonth() - n, 1);
197
+ const e = new Date(now.getFullYear(), now.getMonth(), 0);
198
+ return { start: s, end: e };
199
+ },
200
+ },
201
+ {
202
+ regex: DYNAMIC_FUTURE_MONTHS,
203
+ compute: (n, now) => {
204
+ const s = new Date(now.getFullYear(), now.getMonth() + 1, 1);
205
+ const e = new Date(now.getFullYear(), now.getMonth() + 1 + n, 0);
206
+ return { start: s, end: e };
207
+ },
208
+ },
209
+ ];
210
+ // ── Dynamic match ──
211
+ export function tryDynamicMatch(phrase, now) {
212
+ for (const { regex, compute } of DYNAMIC_PATTERNS) {
213
+ const m = phrase.match(regex);
214
+ if (m) {
215
+ const n = parseInt(m[1], 10);
216
+ if (n > 0)
217
+ return compute(n, now);
218
+ }
219
+ }
220
+ return null;
221
+ }
222
+ // ── Detect a relative phrase in freeform text ──
223
+ export function detectRelativePhrase(text) {
224
+ const lower = text.toLowerCase().trim();
225
+ // Check static phrases (longest first to prefer "last 30 days" over "last 7 days")
226
+ const sorted = [...RELATIVE_PHRASES].sort((a, b) => b.length - a.length);
227
+ for (const phrase of sorted) {
228
+ if (lower.includes(phrase)) {
229
+ return phrase;
230
+ }
231
+ }
232
+ // Check dynamic patterns
233
+ for (const { regex } of DYNAMIC_PATTERNS) {
234
+ const m = lower.match(regex);
235
+ if (m) {
236
+ return m[0];
237
+ }
238
+ }
239
+ return null;
240
+ }
241
+ export function computeRelativeRange(phrase, now) {
242
+ const lower = phrase.toLowerCase().trim();
243
+ // Check static rules first
244
+ for (const rule of RELATIVE_RULES) {
245
+ if (rule.phrase === lower) {
246
+ const { start, end } = rule.compute(now);
247
+ return {
248
+ start,
249
+ end,
250
+ startISO: formatDateISO(start),
251
+ endISO: formatDateISO(end),
252
+ };
253
+ }
254
+ }
255
+ // Check dynamic patterns
256
+ const dynamic = tryDynamicMatch(lower, now);
257
+ if (dynamic) {
258
+ return {
259
+ start: dynamic.start,
260
+ end: dynamic.end,
261
+ startISO: formatDateISO(dynamic.start),
262
+ endISO: formatDateISO(dynamic.end),
263
+ };
264
+ }
265
+ // Fallback: treat as today
266
+ const today = startOfLocalDay(now);
267
+ return {
268
+ start: today,
269
+ end: today,
270
+ startISO: formatDateISO(today),
271
+ endISO: formatDateISO(today),
272
+ };
273
+ }
274
+ // ── Resolve a date range from explicit dates or a phrase ──
275
+ export function resolveDateRange(options) {
276
+ if (options.startDate && options.endDate) {
277
+ return { startDate: options.startDate, endDate: options.endDate };
278
+ }
279
+ if (options.phrase) {
280
+ const range = computeRelativeRange(options.phrase, options.now ?? new Date());
281
+ return { startDate: range.startISO, endDate: range.endISO };
282
+ }
283
+ return null;
284
+ }
285
+ // ── Parse a relative date range from a natural-language question ──
286
+ export function parseRelativeDateRange(question, now) {
287
+ const phrase = detectRelativePhrase(question);
288
+ if (!phrase)
289
+ return null;
290
+ const range = computeRelativeRange(phrase, now ?? new Date());
291
+ return { startDate: range.startISO, endDate: range.endISO, phrase };
292
+ }
293
+ //# sourceMappingURL=dates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dates.js","sourceRoot":"","sources":["../src/dates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { SmartEntityFilter, ResolvedEntity, InferConnector } from './types.js';
2
+ export interface EntityResolver {
3
+ resolve(input: string, tenantId: string): Promise<ResolvedEntity>;
4
+ }
5
+ export declare class EntityResolverRegistry {
6
+ private resolvers;
7
+ register(name: string, resolver: EntityResolver): void;
8
+ get(name: string): EntityResolver | undefined;
9
+ has(name: string): boolean;
10
+ resolveAll(entityFilters: SmartEntityFilter[], tenantId: string): Promise<ResolvedEntity[]>;
11
+ }
12
+ export declare class DatabaseEntityResolver implements EntityResolver {
13
+ private connector;
14
+ private tableName;
15
+ private idColumn;
16
+ private nameColumn;
17
+ private tenantScoped;
18
+ private resolverName;
19
+ constructor(config: {
20
+ connector: InferConnector;
21
+ tableName: string;
22
+ idColumn: string;
23
+ nameColumn: string;
24
+ resolverName: string;
25
+ tenantScoped?: boolean;
26
+ });
27
+ resolve(input: string, tenantId: string): Promise<ResolvedEntity>;
28
+ }
29
+ //# sourceMappingURL=entity-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-resolver.d.ts","sourceRoot":"","sources":["../src/entity-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIpF,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACnE;AAGD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,SAAS,CAAqC;IAEtD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAItD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI7C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIpB,UAAU,CACd,aAAa,EAAE,iBAAiB,EAAE,EAClC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,EAAE,CAAC;CAa7B;AAGD,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,EAAE;QAClB,SAAS,EAAE,cAAc,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB;IASK,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAmDxE"}