sql-ai-harness 0.0.0-stage → 0.1.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.
Files changed (117) hide show
  1. package/.env.example +31 -0
  2. package/LICENSE +15 -0
  3. package/README.md +201 -2
  4. package/dist/ai/factory.d.ts +4 -0
  5. package/dist/ai/factory.d.ts.map +1 -0
  6. package/dist/ai/factory.js +48 -0
  7. package/dist/ai/factory.js.map +1 -0
  8. package/dist/ai/provider.d.ts +13 -0
  9. package/dist/ai/provider.d.ts.map +1 -0
  10. package/dist/ai/provider.js +2 -0
  11. package/dist/ai/provider.js.map +1 -0
  12. package/dist/ai/sdk-provider.d.ts +13 -0
  13. package/dist/ai/sdk-provider.d.ts.map +1 -0
  14. package/dist/ai/sdk-provider.js +29 -0
  15. package/dist/ai/sdk-provider.js.map +1 -0
  16. package/dist/cli-observer.d.ts +5 -0
  17. package/dist/cli-observer.d.ts.map +1 -0
  18. package/dist/cli-observer.js +79 -0
  19. package/dist/cli-observer.js.map +1 -0
  20. package/dist/cli.d.ts +3 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +101 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/commands/init.d.ts +2 -0
  25. package/dist/commands/init.d.ts.map +1 -0
  26. package/dist/commands/init.js +232 -0
  27. package/dist/commands/init.js.map +1 -0
  28. package/dist/config/config.d.ts +39 -0
  29. package/dist/config/config.d.ts.map +1 -0
  30. package/dist/config/config.js +84 -0
  31. package/dist/config/config.js.map +1 -0
  32. package/dist/context/db-context.d.ts +12 -0
  33. package/dist/context/db-context.d.ts.map +1 -0
  34. package/dist/context/db-context.js +29 -0
  35. package/dist/context/db-context.js.map +1 -0
  36. package/dist/core/agent/agent.d.ts +32 -0
  37. package/dist/core/agent/agent.d.ts.map +1 -0
  38. package/dist/core/agent/agent.js +323 -0
  39. package/dist/core/agent/agent.js.map +1 -0
  40. package/dist/core/agent/index.d.ts +4 -0
  41. package/dist/core/agent/index.d.ts.map +1 -0
  42. package/dist/core/agent/index.js +2 -0
  43. package/dist/core/agent/index.js.map +1 -0
  44. package/dist/core/agent/observability.d.ts +19 -0
  45. package/dist/core/agent/observability.d.ts.map +1 -0
  46. package/dist/core/agent/observability.js +4 -0
  47. package/dist/core/agent/observability.js.map +1 -0
  48. package/dist/core/tools/describe-table.d.ts +6 -0
  49. package/dist/core/tools/describe-table.d.ts.map +1 -0
  50. package/dist/core/tools/describe-table.js +25 -0
  51. package/dist/core/tools/describe-table.js.map +1 -0
  52. package/dist/core/tools/describe-tables.d.ts +6 -0
  53. package/dist/core/tools/describe-tables.d.ts.map +1 -0
  54. package/dist/core/tools/describe-tables.js +22 -0
  55. package/dist/core/tools/describe-tables.js.map +1 -0
  56. package/dist/core/tools/execute-query.d.ts +6 -0
  57. package/dist/core/tools/execute-query.d.ts.map +1 -0
  58. package/dist/core/tools/execute-query.js +31 -0
  59. package/dist/core/tools/execute-query.js.map +1 -0
  60. package/dist/core/tools/explain-query.d.ts +10 -0
  61. package/dist/core/tools/explain-query.d.ts.map +1 -0
  62. package/dist/core/tools/explain-query.js +34 -0
  63. package/dist/core/tools/explain-query.js.map +1 -0
  64. package/dist/core/tools/get-relationships.d.ts +6 -0
  65. package/dist/core/tools/get-relationships.d.ts.map +1 -0
  66. package/dist/core/tools/get-relationships.js +23 -0
  67. package/dist/core/tools/get-relationships.js.map +1 -0
  68. package/dist/core/tools/index.d.ts +9 -0
  69. package/dist/core/tools/index.d.ts.map +1 -0
  70. package/dist/core/tools/index.js +8 -0
  71. package/dist/core/tools/index.js.map +1 -0
  72. package/dist/core/tools/list-tables.d.ts +3 -0
  73. package/dist/core/tools/list-tables.d.ts.map +1 -0
  74. package/dist/core/tools/list-tables.js +18 -0
  75. package/dist/core/tools/list-tables.js.map +1 -0
  76. package/dist/core/tools/registry.d.ts +11 -0
  77. package/dist/core/tools/registry.d.ts.map +1 -0
  78. package/dist/core/tools/registry.js +48 -0
  79. package/dist/core/tools/registry.js.map +1 -0
  80. package/dist/core/types/index.d.ts +94 -0
  81. package/dist/core/types/index.d.ts.map +1 -0
  82. package/dist/core/types/index.js +6 -0
  83. package/dist/core/types/index.js.map +1 -0
  84. package/dist/database/adapter.d.ts +3 -0
  85. package/dist/database/adapter.d.ts.map +1 -0
  86. package/dist/database/adapter.js +2 -0
  87. package/dist/database/adapter.js.map +1 -0
  88. package/dist/database/index.d.ts +4 -0
  89. package/dist/database/index.d.ts.map +1 -0
  90. package/dist/database/index.js +2 -0
  91. package/dist/database/index.js.map +1 -0
  92. package/dist/database/mysql/adapter.d.ts +21 -0
  93. package/dist/database/mysql/adapter.d.ts.map +1 -0
  94. package/dist/database/mysql/adapter.js +140 -0
  95. package/dist/database/mysql/adapter.js.map +1 -0
  96. package/dist/index.d.ts +19 -0
  97. package/dist/index.d.ts.map +1 -0
  98. package/dist/index.js +13 -0
  99. package/dist/index.js.map +1 -0
  100. package/dist/safety/limits.d.ts +7 -0
  101. package/dist/safety/limits.d.ts.map +1 -0
  102. package/dist/safety/limits.js +15 -0
  103. package/dist/safety/limits.js.map +1 -0
  104. package/dist/safety/policy.d.ts +8 -0
  105. package/dist/safety/policy.d.ts.map +1 -0
  106. package/dist/safety/policy.js +11 -0
  107. package/dist/safety/policy.js.map +1 -0
  108. package/dist/safety/sql-validator.d.ts +15 -0
  109. package/dist/safety/sql-validator.d.ts.map +1 -0
  110. package/dist/safety/sql-validator.js +31 -0
  111. package/dist/safety/sql-validator.js.map +1 -0
  112. package/dist/schema/cache.d.ts +24 -0
  113. package/dist/schema/cache.d.ts.map +1 -0
  114. package/dist/schema/cache.js +56 -0
  115. package/dist/schema/cache.js.map +1 -0
  116. package/package.json +75 -3
  117. package/sql-ai.example.md +32 -0
@@ -0,0 +1,8 @@
1
+ export { listTables } from './list-tables.js';
2
+ export { describeTable } from './describe-table.js';
3
+ export { describeTables } from './describe-tables.js';
4
+ export { getRelationships } from './get-relationships.js';
5
+ export { executeQuery } from './execute-query.js';
6
+ export { explainQuery } from './explain-query.js';
7
+ export { getTool, getTools, executeTool } from './registry.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SqlToolResult, ToolContext } from '../types/index.js';
2
+ export declare function listTables(context: ToolContext): Promise<SqlToolResult>;
3
+ //# sourceMappingURL=list-tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-tables.d.ts","sourceRoot":"","sources":["../../../src/core/tools/list-tables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEpE,wBAAsB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAgB7E"}
@@ -0,0 +1,18 @@
1
+ export async function listTables(context) {
2
+ try {
3
+ const tables = context.schemaCache
4
+ ? await context.schemaCache.listTables(context.database)
5
+ : await context.database.listTables();
6
+ return {
7
+ success: true,
8
+ data: tables,
9
+ };
10
+ }
11
+ catch (error) {
12
+ return {
13
+ success: false,
14
+ error: error instanceof Error ? error.message : 'Failed to list database tables.',
15
+ };
16
+ }
17
+ }
18
+ //# sourceMappingURL=list-tables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-tables.js","sourceRoot":"","sources":["../../../src/core/tools/list-tables.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAoB;IACnD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW;YAChC,CAAC,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC;YACxD,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAExC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,MAAM;SACb,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,iCAAiC;SAClF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { SqlToolResult, ToolContext } from '../types/index.js';
2
+ export type ToolName = 'list_tables' | 'describe_table' | 'describe_tables' | 'get_relationships' | 'execute_query' | 'explain_query';
3
+ export interface RegisteredTool {
4
+ name: ToolName;
5
+ description: string;
6
+ execute: (input: unknown, context: ToolContext) => Promise<SqlToolResult>;
7
+ }
8
+ export declare function getTool(name: ToolName): RegisteredTool;
9
+ export declare function getTools(): RegisteredTool[];
10
+ export declare function executeTool(name: ToolName, input: unknown, context: ToolContext): Promise<SqlToolResult>;
11
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAQpE,MAAM,MAAM,QAAQ,GAChB,aAAa,GACb,gBAAgB,GAChB,iBAAiB,GACjB,mBAAmB,GACnB,eAAe,GACf,eAAe,CAAC;AAEpB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;CAC3E;AAmCD,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,cAAc,CAEtD;AAED,wBAAgB,QAAQ,IAAI,cAAc,EAAE,CAE3C;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,CAAC,CAExB"}
@@ -0,0 +1,48 @@
1
+ import { describeTable } from './describe-table.js';
2
+ import { describeTables } from './describe-tables.js';
3
+ import { executeQuery } from './execute-query.js';
4
+ import { explainQuery } from './explain-query.js';
5
+ import { getRelationships } from './get-relationships.js';
6
+ import { listTables } from './list-tables.js';
7
+ const tools = {
8
+ list_tables: {
9
+ name: 'list_tables',
10
+ description: 'List the tables available in the connected database.',
11
+ execute: (_input, context) => listTables(context),
12
+ },
13
+ describe_table: {
14
+ name: 'describe_table',
15
+ description: 'Inspect the columns and basic schema information for a database table.',
16
+ execute: (input, context) => describeTable(input, context),
17
+ },
18
+ describe_tables: {
19
+ name: 'describe_tables',
20
+ description: 'Inspect columns and basic schema information for multiple database tables at once. Use this when several tables are relevant.',
21
+ execute: (input, context) => describeTables(input, context),
22
+ },
23
+ get_relationships: {
24
+ name: 'get_relationships',
25
+ description: 'List foreign-key relationships in the connected database, optionally for one table.',
26
+ execute: (input, context) => getRelationships((input ?? {}), context),
27
+ },
28
+ execute_query: {
29
+ name: 'execute_query',
30
+ description: 'Execute a validated read-only SQL query against the connected database.',
31
+ execute: (input, context) => executeQuery(input, context),
32
+ },
33
+ explain_query: {
34
+ name: 'explain_query',
35
+ description: 'Return the database execution plan for a validated SELECT or WITH query.',
36
+ execute: (input, context) => explainQuery(input, context),
37
+ },
38
+ };
39
+ export function getTool(name) {
40
+ return tools[name];
41
+ }
42
+ export function getTools() {
43
+ return Object.values(tools);
44
+ }
45
+ export async function executeTool(name, input, context) {
46
+ return getTool(name).execute(input, context);
47
+ }
48
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/tools/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAA2B,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAA4B,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,YAAY,EAA0B,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAA0B,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAA8B,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAgB9C,MAAM,KAAK,GAAqC;IAC9C,WAAW,EAAE;QACX,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,sDAAsD;QACnE,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;KAClD;IACD,cAAc,EAAE;QACd,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,wEAAwE;QACrF,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,KAA2B,EAAE,OAAO,CAAC;KACjF;IACD,eAAe,EAAE;QACf,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,+HAA+H;QAC5I,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,KAA4B,EAAE,OAAO,CAAC;KACnF;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,qFAAqF;QAClG,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,KAAK,IAAI,EAAE,CAA0B,EAAE,OAAO,CAAC;KAC/F;IACD,aAAa,EAAE;QACb,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,yEAAyE;QACtF,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,KAA0B,EAAE,OAAO,CAAC;KAC/E;IACD,aAAa,EAAE;QACb,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,0EAA0E;QACvF,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,KAA0B,EAAE,OAAO,CAAC;KAC/E;CACF,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,IAAc;IACpC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAc,EACd,KAAc,EACd,OAAoB;IAEpB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Shared domain types. These types deliberately do not depend on a provider,
3
+ * database driver, CLI framework, or HTTP framework.
4
+ */
5
+ export type SqlDialect = 'mysql' | 'postgres' | 'sqlite';
6
+ export interface ModelRequest {
7
+ system?: string;
8
+ prompt: string;
9
+ tools?: unknown;
10
+ temperature?: number;
11
+ maxSteps?: number;
12
+ }
13
+ export interface ModelResponse {
14
+ text: string;
15
+ raw?: unknown;
16
+ steps?: number;
17
+ toolCalls?: number;
18
+ }
19
+ export interface ModelProvider {
20
+ readonly name: string;
21
+ generate(request: ModelRequest): Promise<ModelResponse>;
22
+ }
23
+ export interface TableInfo {
24
+ name: string;
25
+ schema?: string;
26
+ }
27
+ export interface ColumnInfo {
28
+ name: string;
29
+ dataType: string;
30
+ nullable: boolean;
31
+ defaultValue?: unknown;
32
+ isPrimaryKey: boolean;
33
+ isAutoIncrement: boolean;
34
+ }
35
+ export interface TableSchema {
36
+ table: TableInfo;
37
+ columns: ColumnInfo[];
38
+ }
39
+ export interface RelationshipInfo {
40
+ table: string;
41
+ column: string;
42
+ referencedTable: string;
43
+ referencedColumn: string;
44
+ constraintName?: string;
45
+ }
46
+ export interface QueryResult {
47
+ rows: Record<string, unknown>[];
48
+ rowCount: number;
49
+ executionTimeMs: number;
50
+ }
51
+ export interface QueryPlan {
52
+ sql: string;
53
+ plan: unknown;
54
+ }
55
+ export interface DatabaseAdapter {
56
+ readonly dialect: SqlDialect;
57
+ listTables(): Promise<TableInfo[]>;
58
+ describeTable(table: string): Promise<TableSchema>;
59
+ getRelationships(table?: string): Promise<RelationshipInfo[]>;
60
+ executeQuery(sql: string, options?: QueryExecutionOptions): Promise<QueryResult>;
61
+ explainQuery(sql: string): Promise<QueryPlan>;
62
+ close?(): Promise<void>;
63
+ }
64
+ export interface QueryExecutionOptions {
65
+ maxRows?: number;
66
+ timeoutMs?: number;
67
+ maxResultBytes?: number;
68
+ }
69
+ export interface SqlSafetyPolicy {
70
+ readOnly: boolean;
71
+ maxRows: number;
72
+ queryTimeoutMs: number;
73
+ maxResultBytes: number;
74
+ }
75
+ export interface ToolContext {
76
+ database: DatabaseAdapter;
77
+ safety: SqlSafetyPolicy;
78
+ schemaCache?: import('../../schema/cache.js').SchemaCache;
79
+ }
80
+ export interface DatabaseContext {
81
+ content?: string;
82
+ source?: string;
83
+ }
84
+ export interface SqlToolResult {
85
+ success: boolean;
86
+ data?: unknown;
87
+ error?: string;
88
+ /**
89
+ * True when the database adapter was actually called.
90
+ * False when SQL was rejected before database execution.
91
+ */
92
+ executionAttempted?: boolean;
93
+ }
94
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Shared domain types. These types deliberately do not depend on a provider,
3
+ * database driver, CLI framework, or HTTP framework.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/types/index.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,3 @@
1
+ import type { DatabaseAdapter } from '../core/types/index.js';
2
+ export type { DatabaseAdapter };
3
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/database/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,YAAY,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/database/adapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export type { DatabaseAdapter } from './adapter.js';
2
+ export { MySqlAdapter } from './mysql/adapter.js';
3
+ export type { MySqlAdapterConfig } from './mysql/adapter.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { MySqlAdapter } from './mysql/adapter.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { DatabaseAdapter, QueryExecutionOptions, QueryPlan, QueryResult, RelationshipInfo, TableInfo, TableSchema } from '../../core/types/index.js';
2
+ export interface MySqlAdapterConfig {
3
+ host: string;
4
+ port: number;
5
+ database: string;
6
+ user: string;
7
+ password: string;
8
+ connectionLimit?: number;
9
+ }
10
+ export declare class MySqlAdapter implements DatabaseAdapter {
11
+ readonly dialect: 'mysql';
12
+ private readonly pool;
13
+ constructor(config: MySqlAdapterConfig);
14
+ listTables(): Promise<TableInfo[]>;
15
+ describeTable(table: string): Promise<TableSchema>;
16
+ getRelationships(table?: string): Promise<RelationshipInfo[]>;
17
+ executeQuery(sql: string, options?: QueryExecutionOptions): Promise<QueryResult>;
18
+ explainQuery(sql: string): Promise<QueryPlan>;
19
+ close(): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/database/mysql/adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,eAAe,EACf,qBAAqB,EACrB,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,WAAW,EACZ,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,YAAa,YAAW,eAAe;IAClD,QAAQ,CAAC,OAAO,EAAG,OAAO,CAAU;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;IAE5B,YAAY,MAAM,EAAE,kBAAkB,EAcrC;IAEK,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAYvC;IAEK,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAmCvD;IAEK,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAmClE;IAEK,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,WAAW,CAAC,CA4CzF;IAEK,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAUlD;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;CACF"}
@@ -0,0 +1,140 @@
1
+ import mysql from 'mysql2/promise';
2
+ export class MySqlAdapter {
3
+ dialect = 'mysql';
4
+ pool;
5
+ constructor(config) {
6
+ const options = {
7
+ host: config.host,
8
+ port: config.port,
9
+ database: config.database,
10
+ user: config.user,
11
+ password: config.password,
12
+ connectionLimit: config.connectionLimit ?? 5,
13
+ waitForConnections: true,
14
+ enableKeepAlive: true,
15
+ dateStrings: true,
16
+ };
17
+ this.pool = mysql.createPool(options);
18
+ }
19
+ async listTables() {
20
+ const [rows] = await this.pool.query(`
21
+ SELECT TABLE_NAME AS table_name
22
+ FROM information_schema.TABLES
23
+ WHERE TABLE_SCHEMA = DATABASE()
24
+ AND TABLE_TYPE = 'BASE TABLE'
25
+ ORDER BY TABLE_NAME ASC
26
+ `);
27
+ return rows.map((row) => ({ name: String(row.table_name) }));
28
+ }
29
+ async describeTable(table) {
30
+ const [rows] = await this.pool.execute(`
31
+ SELECT
32
+ COLUMN_NAME AS column_name,
33
+ DATA_TYPE AS data_type,
34
+ IS_NULLABLE AS is_nullable,
35
+ COLUMN_DEFAULT AS column_default,
36
+ COLUMN_KEY AS column_key,
37
+ EXTRA AS extra
38
+ FROM information_schema.COLUMNS
39
+ WHERE TABLE_SCHEMA = DATABASE()
40
+ AND TABLE_NAME = ?
41
+ ORDER BY ORDINAL_POSITION ASC
42
+ `, [table]);
43
+ if (rows.length === 0) {
44
+ throw new Error(`Table "${table}" was not found in the current database.`);
45
+ }
46
+ const columns = rows.map((row) => ({
47
+ name: String(row.column_name),
48
+ dataType: String(row.data_type),
49
+ nullable: row.is_nullable === 'YES',
50
+ defaultValue: row.column_default,
51
+ isPrimaryKey: row.column_key === 'PRI',
52
+ isAutoIncrement: String(row.extra ?? '').toLowerCase().includes('auto_increment'),
53
+ }));
54
+ return {
55
+ table: { name: table },
56
+ columns,
57
+ };
58
+ }
59
+ async getRelationships(table) {
60
+ const conditions = [
61
+ 'TABLE_SCHEMA = DATABASE()',
62
+ 'REFERENCED_TABLE_SCHEMA = DATABASE()',
63
+ ];
64
+ const params = [];
65
+ if (table) {
66
+ conditions.push('TABLE_NAME = ?');
67
+ params.push(table);
68
+ }
69
+ const [rows] = await this.pool.execute(`
70
+ SELECT
71
+ TABLE_NAME AS table_name,
72
+ COLUMN_NAME AS column_name,
73
+ REFERENCED_TABLE_NAME AS referenced_table,
74
+ REFERENCED_COLUMN_NAME AS referenced_column,
75
+ CONSTRAINT_NAME AS constraint_name
76
+ FROM information_schema.KEY_COLUMN_USAGE
77
+ WHERE ${conditions.join(' AND ')}
78
+ AND REFERENCED_TABLE_NAME IS NOT NULL
79
+ ORDER BY TABLE_NAME ASC, COLUMN_NAME ASC
80
+ `, params);
81
+ return rows.map((row) => ({
82
+ table: String(row.table_name),
83
+ column: String(row.column_name),
84
+ referencedTable: String(row.referenced_table),
85
+ referencedColumn: String(row.referenced_column),
86
+ constraintName: String(row.constraint_name),
87
+ }));
88
+ }
89
+ async executeQuery(sql, options = {}) {
90
+ const maxRows = options.maxRows ?? 500;
91
+ const timeoutMs = options.timeoutMs ?? 10_000;
92
+ const maxResultBytes = options.maxResultBytes ?? 1_048_576;
93
+ const startedAt = performance.now();
94
+ // mysql2 supports a client-side timeout for text queries.
95
+ const [rawRows] = await this.pool.query({
96
+ sql,
97
+ timeout: timeoutMs,
98
+ });
99
+ const rows = Array.isArray(rawRows)
100
+ ? rawRows.slice(0, maxRows).map((row) => ({ ...row }))
101
+ : [];
102
+ const serialized = JSON.stringify(rows);
103
+ if (Buffer.byteLength(serialized, 'utf8') > maxResultBytes) {
104
+ const limitedRows = [];
105
+ let size = 2;
106
+ for (const row of rows) {
107
+ const rowJson = JSON.stringify(row);
108
+ const rowSize = Buffer.byteLength(rowJson, 'utf8') + (limitedRows.length > 0 ? 1 : 0);
109
+ if (size + rowSize > maxResultBytes)
110
+ break;
111
+ limitedRows.push(row);
112
+ size += rowSize;
113
+ }
114
+ return {
115
+ rows: limitedRows,
116
+ rowCount: limitedRows.length,
117
+ executionTimeMs: Math.round(performance.now() - startedAt),
118
+ };
119
+ }
120
+ return {
121
+ rows,
122
+ rowCount: rows.length,
123
+ executionTimeMs: Math.round(performance.now() - startedAt),
124
+ };
125
+ }
126
+ async explainQuery(sql) {
127
+ const [rows] = await this.pool.query({
128
+ sql: `EXPLAIN ${sql}`,
129
+ timeout: 10_000,
130
+ });
131
+ return {
132
+ sql,
133
+ plan: rows,
134
+ };
135
+ }
136
+ async close() {
137
+ await this.pool.end();
138
+ }
139
+ }
140
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/database/mysql/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Public SDK entry point for SQL AI Harness.
3
+ *
4
+ * Keep this file as the supported import surface. Consumers should not need to
5
+ * import implementation files from internal src/ paths.
6
+ */
7
+ export { Agent } from './core/agent/index.js';
8
+ export type { AgentOptions, AgentResult, ResponseMode, } from './core/agent/agent.js';
9
+ export type { AgentObserver, AgentToolEvent, } from './core/agent/observability.js';
10
+ export type { AiProvider } from './ai/provider.js';
11
+ export { SdkAiProvider } from './ai/sdk-provider.js';
12
+ export { createAiProvider } from './ai/factory.js';
13
+ export { loadConfig } from './config/config.js';
14
+ export type { AppConfig, AiProviderName } from './config/config.js';
15
+ export { MySqlAdapter } from './database/index.js';
16
+ export type { MySqlAdapterConfig, DatabaseAdapter } from './database/index.js';
17
+ export type { ColumnInfo, DatabaseContext, ModelProvider, ModelRequest, ModelResponse, QueryExecutionOptions, QueryPlan, QueryResult, RelationshipInfo, SqlDialect, SqlSafetyPolicy, SqlToolResult, TableInfo, TableSchema, ToolContext, } from './core/types/index.js';
18
+ export { SchemaCache } from './schema/cache.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,YAAY,EACV,YAAY,EACZ,WAAW,EACX,YAAY,GACb,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AAEvC,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE/E,YAAY,EACV,UAAU,EACV,eAAe,EACf,aAAa,EACb,YAAY,EACZ,aAAa,EACb,qBAAqB,EACrB,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,aAAa,EACb,SAAS,EACT,WAAW,EACX,WAAW,GACZ,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Public SDK entry point for SQL AI Harness.
3
+ *
4
+ * Keep this file as the supported import surface. Consumers should not need to
5
+ * import implementation files from internal src/ paths.
6
+ */
7
+ export { Agent } from './core/agent/index.js';
8
+ export { SdkAiProvider } from './ai/sdk-provider.js';
9
+ export { createAiProvider } from './ai/factory.js';
10
+ export { loadConfig } from './config/config.js';
11
+ export { MySqlAdapter } from './database/index.js';
12
+ export { SchemaCache } from './schema/cache.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAY9C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAqBnD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { SqlSafetyPolicy } from '../core/types/index.js';
2
+ /**
3
+ * Adds a conservative LIMIT to simple SELECT/WITH queries that do not already
4
+ * have one. Actual row limits should still be enforced by the database adapter.
5
+ */
6
+ export declare function applyRowLimit(sql: string, policy: SqlSafetyPolicy): string;
7
+ //# sourceMappingURL=limits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../src/safety/limits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CAY1E"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Adds a conservative LIMIT to simple SELECT/WITH queries that do not already
3
+ * have one. Actual row limits should still be enforced by the database adapter.
4
+ */
5
+ export function applyRowLimit(sql, policy) {
6
+ const normalized = sql.trim().replace(/;\s*$/, '');
7
+ if (/\bLIMIT\s+\d+/i.test(normalized)) {
8
+ return normalized;
9
+ }
10
+ if (/^(SELECT|WITH)\b/i.test(normalized)) {
11
+ return `${normalized} LIMIT ${policy.maxRows}`;
12
+ }
13
+ return normalized;
14
+ }
15
+ //# sourceMappingURL=limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits.js","sourceRoot":"","sources":["../../src/safety/limits.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,MAAuB;IAChE,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAEnD,IAAI,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACtC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACzC,OAAO,GAAG,UAAU,UAAU,MAAM,CAAC,OAAO,EAAE,CAAC;IACjD,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { SqlSafetyPolicy } from '../core/types/index.js';
2
+ import { type SqlValidationResult } from './sql-validator.js';
3
+ export declare function validateQuery(sql: string, policy: SqlSafetyPolicy): SqlValidationResult;
4
+ export declare function getQueryExecutionOptions(policy: SqlSafetyPolicy): {
5
+ maxRows: number;
6
+ timeoutMs: number;
7
+ };
8
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/safety/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAe,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,mBAAmB,CAEvF;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,eAAe;IAE5D,OAAO;IACP,SAAS;EAEZ"}
@@ -0,0 +1,11 @@
1
+ import { validateSql } from './sql-validator.js';
2
+ export function validateQuery(sql, policy) {
3
+ return validateSql(sql, policy);
4
+ }
5
+ export function getQueryExecutionOptions(policy) {
6
+ return {
7
+ maxRows: policy.maxRows,
8
+ timeoutMs: policy.queryTimeoutMs,
9
+ };
10
+ }
11
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/safety/policy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAA4B,MAAM,oBAAoB,CAAC;AAE3E,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,MAAuB;IAChE,OAAO,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAuB;IAC9D,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,cAAc;KACjC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { SqlSafetyPolicy } from '../core/types/index.js';
2
+ export interface SqlValidationResult {
3
+ valid: boolean;
4
+ sql?: string;
5
+ reason?: string;
6
+ }
7
+ /**
8
+ * First-stage SQL safety boundary.
9
+ *
10
+ * This intentionally rejects anything that is not clearly read-oriented.
11
+ * It is not intended to be a complete SQL parser; the database account should
12
+ * also be configured with read-only privileges.
13
+ */
14
+ export declare function validateSql(sql: string, policy: SqlSafetyPolicy): SqlValidationResult;
15
+ //# sourceMappingURL=sql-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-validator.d.ts","sourceRoot":"","sources":["../../src/safety/sql-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAM9D,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,mBAAmB,CAyBrF"}
@@ -0,0 +1,31 @@
1
+ const BLOCKED_KEYWORDS = /\b(INSERT|UPDATE|DELETE|DROP|ALTER|TRUNCATE|CREATE|REPLACE|MERGE|GRANT|REVOKE|CALL|SET|USE|LOAD|HANDLER|LOCK|UNLOCK)\b/i;
2
+ const MULTI_STATEMENT = /;\s*\S/;
3
+ const LEADING_COMMENT = /^(?:\s*(?:--[^\n]*(?:\n|$)|#[^\n]*(?:\n|$)|\/\*[\s\S]*?\*\/))*\s*/;
4
+ /**
5
+ * First-stage SQL safety boundary.
6
+ *
7
+ * This intentionally rejects anything that is not clearly read-oriented.
8
+ * It is not intended to be a complete SQL parser; the database account should
9
+ * also be configured with read-only privileges.
10
+ */
11
+ export function validateSql(sql, policy) {
12
+ const normalized = sql.trim();
13
+ if (!normalized) {
14
+ return { valid: false, reason: 'SQL query is empty.' };
15
+ }
16
+ const withoutLeadingComments = normalized.replace(LEADING_COMMENT, '');
17
+ if (!/^(SELECT|WITH|EXPLAIN|SHOW|DESCRIBE|DESC)\b/i.test(withoutLeadingComments)) {
18
+ return { valid: false, reason: 'Only read-oriented SQL statements are allowed.' };
19
+ }
20
+ if (policy.readOnly && BLOCKED_KEYWORDS.test(withoutLeadingComments)) {
21
+ return { valid: false, reason: 'The query contains a blocked SQL operation.' };
22
+ }
23
+ if (MULTI_STATEMENT.test(normalized)) {
24
+ return { valid: false, reason: 'Multiple SQL statements are not allowed.' };
25
+ }
26
+ return {
27
+ valid: true,
28
+ sql: normalized.replace(/;\s*$/, ''),
29
+ };
30
+ }
31
+ //# sourceMappingURL=sql-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-validator.js","sourceRoot":"","sources":["../../src/safety/sql-validator.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB,GAAG,yHAAyH,CAAC;AACnJ,MAAM,eAAe,GAAG,QAAQ,CAAC;AACjC,MAAM,eAAe,GAAG,mEAAmE,CAAC;AAQ5F;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,MAAuB;IAC9D,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAE9B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAEvE,IAAI,CAAC,8CAA8C,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACjF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,gDAAgD,EAAE,CAAC;IACpF,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACrE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,6CAA6C,EAAE,CAAC;IACjF,CAAC;IAED,IAAI,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,0CAA0C,EAAE,CAAC;IAC9E,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;KACrC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { DatabaseAdapter, TableInfo, TableSchema, RelationshipInfo } from '../core/types/index.js';
2
+ export interface SchemaCacheOptions {
3
+ ttlMs?: number;
4
+ }
5
+ /**
6
+ * Process-local cache for database metadata. It never caches query results.
7
+ * A short TTL keeps repeated agent schema discovery from repeatedly hitting
8
+ * information_schema while allowing schema changes to become visible.
9
+ */
10
+ export declare class SchemaCache {
11
+ private readonly ttlMs;
12
+ private tables?;
13
+ private relationships?;
14
+ private readonly tableSchemas;
15
+ constructor(options?: SchemaCacheOptions);
16
+ listTables(database: DatabaseAdapter): Promise<TableInfo[]>;
17
+ describeTable(database: DatabaseAdapter, table: string): Promise<TableSchema>;
18
+ describeTables(database: DatabaseAdapter, tables: string[]): Promise<TableSchema[]>;
19
+ getRelationships(database: DatabaseAdapter): Promise<RelationshipInfo[]>;
20
+ clear(): void;
21
+ private entry;
22
+ private get;
23
+ }
24
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/schema/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAExG,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD;;;;GAIG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,MAAM,CAAC,CAA0B;IACzC,OAAO,CAAC,aAAa,CAAC,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA8C;IAE3E,YAAY,OAAO,GAAE,kBAAuB,EAE3C;IAEK,UAAU,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAOhE;IAEK,aAAa,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAQlF;IAEK,cAAc,CAAC,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAExF;IAEK,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAO7E;IAED,KAAK,IAAI,IAAI,CAIZ;IAED,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,GAAG;CAIZ"}