@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,91 @@
1
+ import { InferError } from './errors.js';
2
+ // ── Entity Resolver Registry ──
3
+ export class EntityResolverRegistry {
4
+ resolvers = new Map();
5
+ register(name, resolver) {
6
+ this.resolvers.set(name, resolver);
7
+ }
8
+ get(name) {
9
+ return this.resolvers.get(name);
10
+ }
11
+ has(name) {
12
+ return this.resolvers.has(name);
13
+ }
14
+ async resolveAll(entityFilters, tenantId) {
15
+ const results = [];
16
+ for (const filter of entityFilters) {
17
+ const resolver = this.resolvers.get(filter.resolver);
18
+ if (!resolver) {
19
+ throw new InferError('ENTITY_NOT_FOUND', 'resolver', `No resolver registered for: ${filter.resolver}`);
20
+ }
21
+ const result = await resolver.resolve(filter.input, tenantId);
22
+ result.outputColumn = filter.outputColumn;
23
+ results.push(result);
24
+ }
25
+ return results;
26
+ }
27
+ }
28
+ // ── Database-backed Entity Resolver (example implementation) ──
29
+ export class DatabaseEntityResolver {
30
+ connector;
31
+ tableName;
32
+ idColumn;
33
+ nameColumn;
34
+ tenantScoped;
35
+ resolverName;
36
+ constructor(config) {
37
+ this.connector = config.connector;
38
+ this.tableName = config.tableName;
39
+ this.idColumn = config.idColumn;
40
+ this.nameColumn = config.nameColumn;
41
+ this.resolverName = config.resolverName;
42
+ this.tenantScoped = config.tenantScoped ?? true;
43
+ }
44
+ async resolve(input, tenantId) {
45
+ const trimmed = input.trim();
46
+ // Try exact match first
47
+ const exactParams = [trimmed];
48
+ let exactSql = `SELECT "${this.idColumn}" AS id FROM "${this.tableName}" WHERE LOWER("${this.nameColumn}") = LOWER($1)`;
49
+ if (this.tenantScoped) {
50
+ exactSql += ` AND "tenant_id" = $2`;
51
+ exactParams.push(tenantId);
52
+ }
53
+ exactSql += ' LIMIT 5';
54
+ const exactResult = await this.connector.execute(exactSql, exactParams);
55
+ if (exactResult.rows.length > 0) {
56
+ return {
57
+ resolver: this.resolverName,
58
+ input: trimmed,
59
+ outputColumn: '',
60
+ resolvedIds: exactResult.rows.map(r => String(r.id)),
61
+ confidence: 'exact',
62
+ };
63
+ }
64
+ // Try contains match
65
+ const containsParams = [`%${trimmed}%`];
66
+ let containsSql = `SELECT "${this.idColumn}" AS id FROM "${this.tableName}" WHERE "${this.nameColumn}" ILIKE $1`;
67
+ if (this.tenantScoped) {
68
+ containsSql += ` AND "tenant_id" = $2`;
69
+ containsParams.push(tenantId);
70
+ }
71
+ containsSql += ' LIMIT 5';
72
+ const containsResult = await this.connector.execute(containsSql, containsParams);
73
+ if (containsResult.rows.length > 0) {
74
+ return {
75
+ resolver: this.resolverName,
76
+ input: trimmed,
77
+ outputColumn: '',
78
+ resolvedIds: containsResult.rows.map(r => String(r.id)),
79
+ confidence: 'contains',
80
+ };
81
+ }
82
+ return {
83
+ resolver: this.resolverName,
84
+ input: trimmed,
85
+ outputColumn: '',
86
+ resolvedIds: [],
87
+ confidence: 'none',
88
+ };
89
+ }
90
+ }
91
+ //# sourceMappingURL=entity-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-resolver.js","sourceRoot":"","sources":["../src/entity-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type InferErrorCode = 'INPUT_TOO_LONG' | 'INPUT_PII_DETECTED' | 'INPUT_INJECTION_BLOCKED' | 'LLM_TIMEOUT' | 'LLM_UNAVAILABLE' | 'LLM_INVALID_RESPONSE' | 'PLAN_INVALID' | 'PLAN_SENSITIVE_COLUMN' | 'PLAN_OUT_OF_SCOPE' | 'ENTITY_NOT_FOUND' | 'SQL_VALIDATION_FAILED' | 'QUERY_TIMEOUT' | 'QUERY_ERROR' | 'CONNECTION_ERROR' | 'RATE_LIMITED';
2
+ export type PipelineStage = 'input' | 'planner' | 'validator' | 'resolver' | 'compiler' | 'sql_check' | 'executor';
3
+ export declare class InferError extends Error {
4
+ readonly code: InferErrorCode;
5
+ readonly stage: PipelineStage;
6
+ readonly retryable: boolean;
7
+ readonly details?: Record<string, unknown>;
8
+ constructor(code: InferErrorCode, stage: PipelineStage, message: string, details?: Record<string, unknown>);
9
+ }
10
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GACtB,gBAAgB,GAChB,oBAAoB,GACpB,yBAAyB,GACzB,aAAa,GACb,iBAAiB,GACjB,sBAAsB,GACtB,cAAc,GACd,uBAAuB,GACvB,mBAAmB,GACnB,kBAAkB,GAClB,uBAAuB,GACvB,eAAe,GACf,aAAa,GACb,kBAAkB,GAClB,cAAc,CAAC;AAEnB,MAAM,MAAM,aAAa,GACrB,OAAO,GACP,SAAS,GACT,WAAW,GACX,UAAU,GACV,UAAU,GACV,WAAW,GACX,UAAU,CAAC;AAYf,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAGzC,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAcpC"}
package/dist/errors.js ADDED
@@ -0,0 +1,28 @@
1
+ // Retry behavior table
2
+ const RETRYABLE_CODES = new Set([
3
+ 'LLM_TIMEOUT', 'LLM_UNAVAILABLE', 'QUERY_TIMEOUT', 'CONNECTION_ERROR', 'RATE_LIMITED'
4
+ ]);
5
+ // Security-sensitive errors that must NOT expose details
6
+ const SECURITY_ERROR_CODES = new Set([
7
+ 'PLAN_SENSITIVE_COLUMN', 'SQL_VALIDATION_FAILED', 'INPUT_INJECTION_BLOCKED'
8
+ ]);
9
+ export class InferError extends Error {
10
+ code;
11
+ stage;
12
+ retryable;
13
+ details;
14
+ constructor(code, stage, message, details) {
15
+ // Security errors get generic messages - never expose internals
16
+ const safeMessage = SECURITY_ERROR_CODES.has(code)
17
+ ? 'The requested data is not available.'
18
+ : message;
19
+ super(safeMessage);
20
+ this.name = 'InferError';
21
+ this.code = code;
22
+ this.stage = stage;
23
+ this.retryable = RETRYABLE_CODES.has(code);
24
+ // Security errors don't expose details
25
+ this.details = SECURITY_ERROR_CODES.has(code) ? undefined : details;
26
+ }
27
+ }
28
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AA0BA,uBAAuB;AACvB,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAC;IACnD,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc;CACtF,CAAC,CAAC;AAEH,yDAAyD;AACzD,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC;IACxD,uBAAuB,EAAE,uBAAuB,EAAE,yBAAyB;CAC5E,CAAC,CAAC;AAEH,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC1B,IAAI,CAAiB;IACrB,KAAK,CAAgB;IACrB,SAAS,CAAU;IACnB,OAAO,CAA2B;IAE3C,YACE,IAAoB,EACpB,KAAoB,EACpB,OAAe,EACf,OAAiC;QAEjC,gEAAgE;QAChE,MAAM,WAAW,GAAG,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;YAChD,CAAC,CAAC,sCAAsC;YACxC,CAAC,CAAC,OAAO,CAAC;QACZ,KAAK,CAAC,WAAW,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,uCAAuC;QACvC,IAAI,CAAC,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;IACtE,CAAC;CACF"}
@@ -0,0 +1,43 @@
1
+ import type { InferConfig, InferResult, SmartQueryPlan, ExecutionContext } from './types.js';
2
+ export declare class Infer {
3
+ private connector;
4
+ private llmProvider;
5
+ private catalog;
6
+ private catalogSource;
7
+ private config;
8
+ private entityResolvers;
9
+ private debug;
10
+ constructor(config: InferConfig);
11
+ ask(question: string, ctx?: Partial<ExecutionContext>): Promise<InferResult>;
12
+ execute(plan: SmartQueryPlan, ctx?: Partial<ExecutionContext>): Promise<InferResult>;
13
+ introspect(): Promise<import('./types.js').IntrospectedSchema>;
14
+ generateSchema(): Promise<string>;
15
+ refresh(): Promise<void>;
16
+ registerResolver(name: string, resolver: import('./entity-resolver.js').EntityResolver): void;
17
+ close(): Promise<void>;
18
+ private ensureCatalog;
19
+ private callLLMWithRetry;
20
+ private log;
21
+ }
22
+ export { InferError } from './errors.js';
23
+ export type { InferErrorCode, PipelineStage } from './errors.js';
24
+ export { validateInput, classifyInjection, sanitizeResult } from './security.js';
25
+ export type { ClassificationResult } from './security.js';
26
+ export { validateSQL, validateMetricExpression } from './sql-validator.js';
27
+ export { compileSQL, quoteIdentifier } from './sql-builder.js';
28
+ export { validateQueryPlan } from './query-validator.js';
29
+ export { createLLMProvider, buildCatalogSummary, extractJSON } from './llm.js';
30
+ export type { LLMProvider } from './llm.js';
31
+ export { OpenRouterProvider, OpenAIProvider, AnthropicProvider, OllamaProvider } from './llm.js';
32
+ export { PostgresConnector, HTTPConnector, SupabaseConnector, LambdaConnector } from './connectors.js';
33
+ export type { PostgresConnectorConfig, HTTPConnectorConfig } from './connectors.js';
34
+ export { loadCatalogFromYAML, buildCatalogFromIntrospection, mergeCatalogs } from './catalog.js';
35
+ export type { YAMLSchema, YAMLDatasource } from './catalog.js';
36
+ export { EntityResolverRegistry, DatabaseEntityResolver } from './entity-resolver.js';
37
+ export type { EntityResolver } from './entity-resolver.js';
38
+ export { RELATIVE_PHRASES, detectRelativePhrase, computeRelativeRange, resolveDateRange, parseRelativeDateRange, } from './dates.js';
39
+ export type { RelativeDatePhrase } from './dates.js';
40
+ export { SmartQueryPlanSchema, FilterSchema, EntityFilterSchema, DateRangeSchema, OrderBySchema } from './schemas.js';
41
+ export type { ColumnType, TimeMode, TimeConfig, EntityDef, DimensionDef, MetricAgg, MetricDef, JoinDef, DatasetEntry, InferCatalog, ColumnMeta, InferResult, SmartQueryPlan, AnswerMode, SmartFilter, SmartEntityFilter, DateRange, OrderByClause, ExecutionContext, ValidatedSmartPlan, ResolvedEntity, CompiledSQL, LLMMessage, LLMOptions, InferConnector, IntrospectedColumn, IntrospectedTable, IntrospectedSchema, InferConfig, LLMProviderConfig, } from './types.js';
42
+ export { datasetHasColumn, getMetricDef, getDimensionDef, allowlistedMetricIds, allowlistedGroupByColumns, effectiveTimeConfig, } from './types.js';
43
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,240 @@
1
+ import { InferError } from './errors.js';
2
+ import { validateInput } from './security.js';
3
+ import { sanitizeResult } from './security.js';
4
+ import { validateQueryPlan } from './query-validator.js';
5
+ import { compileSQL } from './sql-builder.js';
6
+ import { validateSQL } from './sql-validator.js';
7
+ import { createLLMProvider, buildCatalogSummary, extractJSON } from './llm.js';
8
+ import { loadCatalogFromYAML, buildCatalogFromIntrospection } from './catalog.js';
9
+ import { EntityResolverRegistry } from './entity-resolver.js';
10
+ export class Infer {
11
+ connector;
12
+ llmProvider;
13
+ catalog = null;
14
+ catalogSource;
15
+ config;
16
+ entityResolvers = new EntityResolverRegistry();
17
+ debug;
18
+ constructor(config) {
19
+ this.connector = config.connector;
20
+ this.config = config;
21
+ this.debug = config.debug ?? false;
22
+ this.catalogSource = config.catalog;
23
+ // Create LLM provider
24
+ this.llmProvider = createLLMProvider(config.llm);
25
+ }
26
+ // ── Main API ──
27
+ async ask(question, ctx) {
28
+ const startTime = Date.now();
29
+ const warnings = [];
30
+ // Layer 1: Input validation & safety check
31
+ this.log('input', `Validating: "${question}"`);
32
+ validateInput(question);
33
+ // Ensure catalog is loaded
34
+ const catalog = await this.ensureCatalog();
35
+ // Layer 2: LLM Query Planner
36
+ this.log('planner', 'Generating query plan...');
37
+ const systemPrompt = buildCatalogSummary(catalog);
38
+ const llmResponse = await this.callLLMWithRetry([
39
+ { role: 'system', content: systemPrompt },
40
+ { role: 'user', content: question },
41
+ ]);
42
+ const rawPlan = extractJSON(llmResponse);
43
+ this.config.onPlan?.(rawPlan);
44
+ // Layer 3: Plan validation
45
+ this.log('validator', 'Validating query plan...');
46
+ const validatedPlan = validateQueryPlan(rawPlan, catalog, {
47
+ maxLimit: this.config.maxRows ?? 200,
48
+ });
49
+ // Layer 4: Entity resolution
50
+ if (validatedPlan.resolvedEntities.length === 0 && rawPlan?.entityFilters?.length > 0) {
51
+ this.log('resolver', 'Resolving entities...');
52
+ const tenantId = ctx?.tenantId ?? this.config.tenantId ?? '';
53
+ validatedPlan.resolvedEntities = await this.entityResolvers.resolveAll(rawPlan.entityFilters, tenantId);
54
+ }
55
+ // Layer 5: SQL compilation
56
+ this.log('compiler', 'Compiling SQL...');
57
+ const executionCtx = {
58
+ tenantId: ctx?.tenantId ?? this.config.tenantId ?? '',
59
+ locationIds: ctx?.locationIds,
60
+ };
61
+ const compiled = compileSQL(validatedPlan, executionCtx);
62
+ this.config.onSQL?.(compiled.sql, compiled.params);
63
+ // Layer 6: SQL validation (defense-in-depth)
64
+ this.log('sql_check', 'Validating SQL...');
65
+ const allowedTables = Object.values(catalog.datasets).map(ds => `${ds.table.schema}.${ds.table.name}`);
66
+ validateSQL(compiled.sql, { allowedTables });
67
+ // Layer 7: Secure execution
68
+ this.log('executor', 'Executing query...');
69
+ const result = await this.connector.execute(compiled.sql, compiled.params);
70
+ // Layer 8: Result sanitization
71
+ const sensitiveColumns = validatedPlan.dataset.sensitiveColumns;
72
+ const sanitizedRows = sanitizeResult(result.rows, sensitiveColumns);
73
+ this.config.onValidation?.(warnings);
74
+ const inferResult = {
75
+ rows: sanitizedRows,
76
+ columns: result.columns,
77
+ sql: this.config.includeSQL ? compiled.sql : undefined,
78
+ plan: rawPlan,
79
+ warnings,
80
+ executionTime: Date.now() - startTime,
81
+ };
82
+ this.config.onResult?.(inferResult);
83
+ return inferResult;
84
+ }
85
+ // ── Direct plan execution (skip LLM) ──
86
+ async execute(plan, ctx) {
87
+ const startTime = Date.now();
88
+ const catalog = await this.ensureCatalog();
89
+ const validatedPlan = validateQueryPlan(plan, catalog, {
90
+ maxLimit: this.config.maxRows ?? 200,
91
+ });
92
+ const executionCtx = {
93
+ tenantId: ctx?.tenantId ?? this.config.tenantId ?? '',
94
+ locationIds: ctx?.locationIds,
95
+ };
96
+ const compiled = compileSQL(validatedPlan, executionCtx);
97
+ validateSQL(compiled.sql);
98
+ const result = await this.connector.execute(compiled.sql, compiled.params);
99
+ const sanitizedRows = sanitizeResult(result.rows, validatedPlan.dataset.sensitiveColumns);
100
+ return {
101
+ rows: sanitizedRows,
102
+ columns: result.columns,
103
+ sql: this.config.includeSQL ? compiled.sql : undefined,
104
+ plan,
105
+ warnings: [],
106
+ executionTime: Date.now() - startTime,
107
+ };
108
+ }
109
+ // ── Schema introspection ──
110
+ async introspect() {
111
+ return this.connector.introspect();
112
+ }
113
+ // ── Generate schema YAML ──
114
+ async generateSchema() {
115
+ const schema = await this.introspect();
116
+ const catalog = buildCatalogFromIntrospection(schema);
117
+ return catalogToYAML(catalog);
118
+ }
119
+ // ── Refresh schema cache ──
120
+ async refresh() {
121
+ this.catalog = null;
122
+ await this.ensureCatalog();
123
+ }
124
+ // ── Entity resolver registration ──
125
+ registerResolver(name, resolver) {
126
+ this.entityResolvers.register(name, resolver);
127
+ }
128
+ // ── Cleanup ──
129
+ async close() {
130
+ await this.connector.close();
131
+ }
132
+ // ── Private methods ──
133
+ async ensureCatalog() {
134
+ if (this.catalog)
135
+ return this.catalog;
136
+ if (typeof this.catalogSource === 'object' && this.catalogSource !== null) {
137
+ this.catalog = this.catalogSource;
138
+ }
139
+ else if (typeof this.catalogSource === 'string') {
140
+ // Load from YAML file path - try dynamic import of fs and yaml
141
+ try {
142
+ // Dynamic imports to avoid hard dependency on Node.js built-ins and yaml package
143
+ const fsModule = await Function('return import("fs")')();
144
+ const yamlModule = await Function('return import("yaml")')();
145
+ const content = fsModule.readFileSync(this.catalogSource, 'utf-8');
146
+ const parsed = yamlModule.parse(content);
147
+ this.catalog = loadCatalogFromYAML(parsed);
148
+ }
149
+ catch {
150
+ throw new InferError('CONNECTION_ERROR', 'validator', 'Failed to load catalog from file. Install the "yaml" package.');
151
+ }
152
+ }
153
+ else {
154
+ // Auto-introspect
155
+ const schema = await this.connector.introspect();
156
+ this.catalog = buildCatalogFromIntrospection(schema);
157
+ }
158
+ return this.catalog;
159
+ }
160
+ async callLLMWithRetry(messages) {
161
+ const maxRetries = this.config.retries?.max ?? 0;
162
+ let lastError = null;
163
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
164
+ try {
165
+ return await this.llmProvider.chat(messages, { temperature: 0 });
166
+ }
167
+ catch (error) {
168
+ lastError = error;
169
+ if (error instanceof InferError && !error.retryable)
170
+ throw error;
171
+ if (attempt < maxRetries) {
172
+ const delay = this.config.retries?.backoff === 'exponential'
173
+ ? Math.min(250 * Math.pow(2, attempt), 5000)
174
+ : 250 * (attempt + 1);
175
+ await new Promise(r => setTimeout(r, delay));
176
+ }
177
+ }
178
+ }
179
+ throw lastError ?? new InferError('LLM_UNAVAILABLE', 'planner', 'LLM call failed after retries');
180
+ }
181
+ log(stage, message) {
182
+ if (this.debug) {
183
+ console.log(`[infer:${stage}] ${message}`);
184
+ }
185
+ }
186
+ }
187
+ // ── Helper: Convert catalog to YAML string ──
188
+ function catalogToYAML(catalog) {
189
+ const lines = ['# infer-schema.yaml — auto-generated by infer-cli', '# Review and customize before use', '', 'datasources:'];
190
+ for (const [id, ds] of Object.entries(catalog.datasets)) {
191
+ lines.push(` ${id}:`);
192
+ lines.push(` table: ${ds.table.schema}.${ds.table.name}`);
193
+ if (ds.dateColumn)
194
+ lines.push(` date_column: ${ds.dateColumn}`);
195
+ if (ds.estimatedRows)
196
+ lines.push(` estimated_rows: ${ds.estimatedRows}`);
197
+ if (ds.selectableColumns.length > 0) {
198
+ lines.push(' columns:');
199
+ for (const col of ds.selectableColumns) {
200
+ lines.push(` - name: ${col}`);
201
+ lines.push(` type: ${ds.columnTypes[col] ?? 'text'}`);
202
+ const dim = ds.dimensions.find(d => d.column === col);
203
+ if (dim?.groupable)
204
+ lines.push(' groupable: true');
205
+ }
206
+ }
207
+ if (ds.metrics.length > 0) {
208
+ lines.push(' metrics:');
209
+ for (const m of ds.metrics) {
210
+ lines.push(` - id: ${m.id}`);
211
+ lines.push(` expression: "${m.expression}"`);
212
+ if (m.description)
213
+ lines.push(` description: "${m.description}"`);
214
+ }
215
+ }
216
+ if (ds.sensitiveColumns.length > 0) {
217
+ lines.push(' sensitive:');
218
+ for (const col of ds.sensitiveColumns) {
219
+ lines.push(` - ${col}`);
220
+ }
221
+ }
222
+ lines.push('');
223
+ }
224
+ return lines.join('\n');
225
+ }
226
+ // ── Re-exports ──
227
+ export { InferError } from './errors.js';
228
+ export { validateInput, classifyInjection, sanitizeResult } from './security.js';
229
+ export { validateSQL, validateMetricExpression } from './sql-validator.js';
230
+ export { compileSQL, quoteIdentifier } from './sql-builder.js';
231
+ export { validateQueryPlan } from './query-validator.js';
232
+ export { createLLMProvider, buildCatalogSummary, extractJSON } from './llm.js';
233
+ export { OpenRouterProvider, OpenAIProvider, AnthropicProvider, OllamaProvider } from './llm.js';
234
+ export { PostgresConnector, HTTPConnector, SupabaseConnector, LambdaConnector } from './connectors.js';
235
+ export { loadCatalogFromYAML, buildCatalogFromIntrospection, mergeCatalogs } from './catalog.js';
236
+ export { EntityResolverRegistry, DatabaseEntityResolver } from './entity-resolver.js';
237
+ export { RELATIVE_PHRASES, detectRelativePhrase, computeRelativeRange, resolveDateRange, parseRelativeDateRange, } from './dates.js';
238
+ export { SmartQueryPlanSchema, FilterSchema, EntityFilterSchema, DateRangeSchema, OrderBySchema } from './schemas.js';
239
+ export { datasetHasColumn, getMetricDef, getDimensionDef, allowlistedMetricIds, allowlistedGroupByColumns, effectiveTimeConfig, } from './types.js';
240
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/llm.d.ts ADDED
@@ -0,0 +1,50 @@
1
+ import type { LLMMessage, LLMOptions, LLMProviderConfig, InferCatalog } from './types.js';
2
+ export interface LLMProvider {
3
+ chat(messages: LLMMessage[], options?: LLMOptions): Promise<string>;
4
+ }
5
+ export declare class OpenRouterProvider implements LLMProvider {
6
+ private apiKey;
7
+ private model;
8
+ private baseUrl;
9
+ constructor(config: {
10
+ apiKey: string;
11
+ model?: string;
12
+ baseUrl?: string;
13
+ });
14
+ chat(messages: LLMMessage[], options?: LLMOptions): Promise<string>;
15
+ }
16
+ export declare class OpenAIProvider implements LLMProvider {
17
+ private apiKey;
18
+ private model;
19
+ private baseUrl;
20
+ constructor(config: {
21
+ apiKey: string;
22
+ model?: string;
23
+ baseUrl?: string;
24
+ });
25
+ chat(messages: LLMMessage[], options?: LLMOptions): Promise<string>;
26
+ }
27
+ export declare class AnthropicProvider implements LLMProvider {
28
+ private apiKey;
29
+ private model;
30
+ private baseUrl;
31
+ constructor(config: {
32
+ apiKey: string;
33
+ model?: string;
34
+ baseUrl?: string;
35
+ });
36
+ chat(messages: LLMMessage[], options?: LLMOptions): Promise<string>;
37
+ }
38
+ export declare class OllamaProvider implements LLMProvider {
39
+ private model;
40
+ private baseUrl;
41
+ constructor(config: {
42
+ model?: string;
43
+ baseUrl?: string;
44
+ });
45
+ chat(messages: LLMMessage[], options?: LLMOptions): Promise<string>;
46
+ }
47
+ export declare function createLLMProvider(config: LLMProviderConfig): LLMProvider;
48
+ export declare function buildCatalogSummary(catalog: InferCatalog): string;
49
+ export declare function extractJSON(text: string): unknown;
50
+ //# sourceMappingURL=llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAC;AAGxG,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACrE;AAGD,qBAAa,kBAAmB,YAAW,WAAW;IACpD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAMlE,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;CAuC1E;AAGD,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAMlE,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;CAqC1E;AAGD,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAMlE,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;CA2C1E;AAGD,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAKlD,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;CAgC1E;AAGD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAgBxE;AAGD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAqEjE;AAGD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAmBjD"}