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,323 @@
1
+ // agent.ts
2
+ import { dynamicTool } from "ai";
3
+ import { z } from "zod";
4
+ import { noopAgentObserver } from "./observability.js";
5
+ import { getTools } from "../tools/registry.js";
6
+ const emptyInput = z.object({}).strict();
7
+ const schemas = {
8
+ list_tables: emptyInput,
9
+ describe_tables: z.object({
10
+ tables: z.array(z.string().min(1)).min(1).max(10),
11
+ }),
12
+ describe_table: z.object({
13
+ table: z
14
+ .string()
15
+ .min(1)
16
+ .describe("The exact database table name to inspect."),
17
+ }),
18
+ get_relationships: z.object({
19
+ table: z
20
+ .string()
21
+ .min(1)
22
+ .optional()
23
+ .describe("Optional table name. Omit to inspect all foreign-key relationships."),
24
+ }),
25
+ execute_query: z.object({
26
+ sql: z.string().min(1).describe("A read-only SELECT or WITH SQL query."),
27
+ }),
28
+ explain_query: z.object({
29
+ sql: z
30
+ .string()
31
+ .min(1)
32
+ .describe("A read-only SELECT or WITH SQL query to explain."),
33
+ }),
34
+ };
35
+ const DEFAULT_MAX_QUERY_ATTEMPTS = 3;
36
+ /**
37
+ * Normalize insignificant SQL formatting differences while preserving
38
+ * the contents and case of quoted strings and identifiers.
39
+ */
40
+ function normalizeSql(sql) {
41
+ let normalized = "";
42
+ let quote = null;
43
+ let pendingSpace = false;
44
+ for (let i = 0; i < sql.length; i++) {
45
+ const char = sql[i];
46
+ const next = sql[i + 1];
47
+ if (quote) {
48
+ normalized += char;
49
+ // Handle SQL escaped quotes, e.g. 'it''s'.
50
+ if (char === quote) {
51
+ if (next === quote) {
52
+ normalized += next;
53
+ i++;
54
+ }
55
+ else {
56
+ quote = null;
57
+ }
58
+ }
59
+ else if (char === "\\" && next) {
60
+ normalized += next;
61
+ i++;
62
+ }
63
+ continue;
64
+ }
65
+ if (char === "'" || char === '"' || char === "`") {
66
+ if (pendingSpace && normalized.length > 0) {
67
+ normalized += " ";
68
+ }
69
+ pendingSpace = false;
70
+ quote = char;
71
+ normalized += char;
72
+ continue;
73
+ }
74
+ if (/\s/.test(char)) {
75
+ pendingSpace = true;
76
+ continue;
77
+ }
78
+ if (pendingSpace && normalized.length > 0) {
79
+ normalized += " ";
80
+ }
81
+ pendingSpace = false;
82
+ normalized += char.toLowerCase();
83
+ }
84
+ return normalized.trim().replace(/;+\s*$/, "");
85
+ }
86
+ /**
87
+ * Application-level agent. Provider-specific model calls stay behind AiProvider;
88
+ * database access stays behind ToolContext and the tool registry.
89
+ */
90
+ export class Agent {
91
+ provider;
92
+ context;
93
+ options;
94
+ constructor(provider, context, options = {}) {
95
+ this.provider = provider;
96
+ this.context = context;
97
+ this.options = options;
98
+ }
99
+ async ask(question) {
100
+ const prompt = question.trim();
101
+ if (!prompt)
102
+ throw new Error("Question is required.");
103
+ const runtime = {
104
+ relationshipsInspected: false,
105
+ queryAttempts: 0,
106
+ attemptedQueries: new Set(),
107
+ };
108
+ const relationshipResult = await this.discoverRelationships();
109
+ runtime.relationshipsInspected = relationshipResult.success;
110
+ const relationshipContext = relationshipResult.success
111
+ ? [
112
+ "",
113
+ "GLOBAL FOREIGN-KEY DISCOVERY RESULTS:",
114
+ JSON.stringify(relationshipResult.data),
115
+ "Use these actual relationships when constructing joins. Global relationship discovery has already been completed; do not repeat it unless more information is needed.",
116
+ ]
117
+ : [
118
+ "",
119
+ "GLOBAL FOREIGN-KEY DISCOVERY FAILED:",
120
+ relationshipResult.error ?? "Unknown error",
121
+ "Do not execute SQL until relationship discovery succeeds.",
122
+ ];
123
+ const tools = this.buildTools(runtime);
124
+ const result = await this.provider.generate({
125
+ system: [
126
+ "You are SQL AI Harness, a database analysis assistant.",
127
+ "Answer questions using the connected relational database.",
128
+ "Do not invent schema, columns, rows, or results.",
129
+ "Use schema discovery tools before writing SQL when the schema is not known.",
130
+ "When several tables are relevant, prefer describe_tables to multiple separate describe_table calls.",
131
+ "Global foreign-key discovery has already been performed before this model call. Use its results when planning joins. Call get_relationships again only when additional relationship information is needed.",
132
+ ...relationshipContext,
133
+ "Plan the query before writing SQL: identify the requested entities, relevant tables, output fields, filters, and any foreign-key path needed to connect those tables.",
134
+ "When the question requires data from related tables, use explicit JOINs that follow the discovered foreign-key relationships. Do not guess join columns or substitute foreign-key IDs for the related entity’s descriptive fields.",
135
+ "Choose result columns that answer the user’s wording. For requests to list or show people or named entities, prefer available human-readable fields such as names, usernames, or email addresses rather than returning only numeric IDs. Use IDs when the user asks for identifiers, counts, or when no descriptive fields exist.",
136
+ "After each query, inspect the actual result. A successful query returning zero rows is a valid result, not automatically a query failure. Report that no matching records were found when that is what the result establishes. Do not broaden filters or remove conditions merely to obtain rows.",
137
+ "If a query returns zero rows, retry only when you can identify a specific, evidence-based reason the query may be wrong, such as an incorrect join, column, or filter. Do not retry an unchanged query.",
138
+ `You may execute at most ${DEFAULT_MAX_QUERY_ATTEMPTS} SQL queries for this question. The tool enforces this limit. Once it is reached, do not call execute_query again; answer using the evidence already collected and clearly state any limitation.`,
139
+ ...this.responseInstructions(),
140
+ ...(this.options.databaseContext?.content
141
+ ? [
142
+ "",
143
+ "The user has provided the following optional database context.",
144
+ "Use it to understand the business/domain meaning of the database, but treat the live database schema and query results as authoritative for what actually exists.",
145
+ "",
146
+ "<DATABASE_CONTEXT>",
147
+ this.options.databaseContext.content,
148
+ "</DATABASE_CONTEXT>",
149
+ ]
150
+ : []),
151
+ ].join("\n"),
152
+ prompt,
153
+ tools,
154
+ temperature: this.options.temperature ?? 0,
155
+ maxSteps: this.options.maxSteps ?? 8,
156
+ });
157
+ return {
158
+ text: result.text,
159
+ steps: result.steps ?? 1,
160
+ toolCalls: result.toolCalls ?? 0,
161
+ raw: result.raw,
162
+ };
163
+ }
164
+ responseInstructions() {
165
+ switch (this.options.responseMode ?? "natural") {
166
+ case "technical":
167
+ return [
168
+ "Give a concise final answer based on the actual query results.",
169
+ "Use technical terminology where useful and include the SQL used when relevant.",
170
+ "Do not expose hidden chain-of-thought.",
171
+ ];
172
+ case "debug":
173
+ return [
174
+ "Give a concise final answer based on the actual query results.",
175
+ "Include useful technical details such as SQL, assumptions, and relevant execution information.",
176
+ "Do not expose hidden chain-of-thought.",
177
+ ];
178
+ case "natural":
179
+ default:
180
+ return [
181
+ "Give a clear, direct answer in plain language suitable for a non-technical audience.",
182
+ "Use business-friendly terminology and completely avoid technical jargon, database names, or raw SQL.",
183
+ "Focus on practical insights and answers rather than how the data was gathered or calculated.",
184
+ "Do not expose hidden chain-of-thought.",
185
+ ];
186
+ }
187
+ }
188
+ buildTools(runtime) {
189
+ const registered = getTools();
190
+ const toolSet = {};
191
+ for (const registeredTool of registered) {
192
+ const schema = schemas[registeredTool.name];
193
+ toolSet[registeredTool.name] = dynamicTool({
194
+ description: registeredTool.description,
195
+ inputSchema: schema,
196
+ // input is typed as 'unknown' — validate/cast at runtime
197
+ execute: async (input) => {
198
+ const observer = this.options.observer ?? noopAgentObserver;
199
+ const startedAt = performance.now();
200
+ observer.onToolEvent({
201
+ type: "tool-start",
202
+ name: registeredTool.name,
203
+ input,
204
+ });
205
+ try {
206
+ let result;
207
+ const isQuery = registeredTool.name === "execute_query";
208
+ const queryInput = input;
209
+ const sql = typeof queryInput?.sql === "string" ? queryInput.sql.trim() : "";
210
+ const normalizedSql = isQuery ? normalizeSql(sql) : "";
211
+ if (isQuery && !runtime.relationshipsInspected) {
212
+ result = {
213
+ success: false,
214
+ executionAttempted: false,
215
+ error: "Query planning requires global foreign-key discovery first. Call get_relationships without a table argument, then build SQL using the returned relationships where relevant.",
216
+ };
217
+ }
218
+ else if (isQuery &&
219
+ runtime.attemptedQueries.has(normalizedSql)) {
220
+ result = {
221
+ success: false,
222
+ error: "This SQL query has already been attempted. Do not retry it unchanged. Use the previous result or error to identify a concrete correction, or provide the best supported answer.",
223
+ };
224
+ }
225
+ else if (isQuery &&
226
+ runtime.queryAttempts >= DEFAULT_MAX_QUERY_ATTEMPTS) {
227
+ result = {
228
+ success: false,
229
+ executionAttempted: false,
230
+ error: `Maximum of ${DEFAULT_MAX_QUERY_ATTEMPTS} SQL query attempts reached. Use the existing results to provide the best supported answer, and clearly state any limitation.`,
231
+ };
232
+ }
233
+ else {
234
+ if (isQuery) {
235
+ // Count only queries that are actually passed to the registered tool.
236
+ runtime.attemptedQueries.add(normalizedSql);
237
+ runtime.queryAttempts += 1;
238
+ }
239
+ result = await registeredTool.execute(input, this.context);
240
+ if (registeredTool.name === "get_relationships" &&
241
+ result.success) {
242
+ const relationshipInput = input;
243
+ if (!String(relationshipInput?.table ?? "").trim()) {
244
+ runtime.relationshipsInspected = true;
245
+ }
246
+ }
247
+ }
248
+ observer.onToolEvent({
249
+ type: 'tool-end',
250
+ name: registeredTool.name,
251
+ input,
252
+ success: result.success,
253
+ durationMs: Math.round(performance.now() - startedAt),
254
+ data: result.success ? result.data : undefined,
255
+ error: result.success ? undefined : result.error,
256
+ ...(registeredTool.name === 'execute_query'
257
+ ? { databaseExecutionAttempted: result.executionAttempted ?? false }
258
+ : {}),
259
+ });
260
+ return result;
261
+ }
262
+ catch (error) {
263
+ const message = error instanceof Error ? error.message : String(error);
264
+ observer.onToolEvent({
265
+ type: "tool-end",
266
+ name: registeredTool.name,
267
+ input,
268
+ success: false,
269
+ durationMs: Math.round(performance.now() - startedAt),
270
+ error: message,
271
+ databaseExecutionAttempted: false,
272
+ });
273
+ throw error;
274
+ }
275
+ },
276
+ });
277
+ }
278
+ return toolSet;
279
+ }
280
+ async discoverRelationships() {
281
+ const relationshipTool = getTools().find((tool) => tool.name === "get_relationships");
282
+ if (!relationshipTool) {
283
+ return {
284
+ success: false,
285
+ error: "The get_relationships tool is not registered.",
286
+ };
287
+ }
288
+ const observer = this.options.observer ?? noopAgentObserver;
289
+ const startedAt = performance.now();
290
+ const input = {};
291
+ observer.onToolEvent({
292
+ type: "tool-start",
293
+ name: "get_relationships",
294
+ input,
295
+ });
296
+ try {
297
+ const result = await relationshipTool.execute(input, this.context);
298
+ observer.onToolEvent({
299
+ type: "tool-end",
300
+ name: "get_relationships",
301
+ input,
302
+ success: result.success,
303
+ durationMs: Math.round(performance.now() - startedAt),
304
+ data: result.success ? result.data : undefined,
305
+ error: result.success ? undefined : result.error,
306
+ });
307
+ return result;
308
+ }
309
+ catch (error) {
310
+ const message = error instanceof Error ? error.message : String(error);
311
+ observer.onToolEvent({
312
+ type: "tool-end",
313
+ name: "get_relationships",
314
+ input,
315
+ success: false,
316
+ durationMs: Math.round(performance.now() - startedAt),
317
+ error: message,
318
+ });
319
+ return { success: false, error: message };
320
+ }
321
+ }
322
+ }
323
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/core/agent/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { Agent } from './agent.js';
2
+ export type { AgentOptions, AgentResult } from './agent.js';
3
+ export type { AgentObserver, AgentToolEvent } from './observability.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5D,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { Agent } from './agent.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,19 @@
1
+ export type AgentToolEvent = {
2
+ type: 'tool-start';
3
+ name: string;
4
+ input: unknown;
5
+ } | {
6
+ type: 'tool-end';
7
+ name: string;
8
+ input: unknown;
9
+ success: boolean;
10
+ durationMs: number;
11
+ data?: unknown;
12
+ error?: string;
13
+ databaseExecutionAttempted?: boolean;
14
+ };
15
+ export interface AgentObserver {
16
+ onToolEvent(event: AgentToolEvent): void;
17
+ }
18
+ export declare const noopAgentObserver: AgentObserver;
19
+ //# sourceMappingURL=observability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../../src/core/agent/observability.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,cAAc,GACtB;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,GACD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC,CAAC;AAEN,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;CAC1C;AAED,eAAO,MAAM,iBAAiB,EAAE,aAE/B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const noopAgentObserver = {
2
+ onToolEvent: () => undefined,
3
+ };
4
+ //# sourceMappingURL=observability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.js","sourceRoot":"","sources":["../../../src/core/agent/observability.ts"],"names":[],"mappings":"AAsBA,MAAM,CAAC,MAAM,iBAAiB,GAAkB;IAC9C,WAAW,EAAE,GAAG,EAAE,CAAC,SAAS;CAC7B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SqlToolResult, ToolContext } from '../types/index.js';
2
+ export interface DescribeTableInput {
3
+ table: string;
4
+ }
5
+ export declare function describeTable(input: DescribeTableInput, context: ToolContext): Promise<SqlToolResult>;
6
+ //# sourceMappingURL=describe-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-table.d.ts","sourceRoot":"","sources":["../../../src/core/tools/describe-table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,CAAC,CAyBxB"}
@@ -0,0 +1,25 @@
1
+ export async function describeTable(input, context) {
2
+ const table = input.table.trim();
3
+ if (!table) {
4
+ return {
5
+ success: false,
6
+ error: 'Table name is required.',
7
+ };
8
+ }
9
+ try {
10
+ const schema = context.schemaCache
11
+ ? await context.schemaCache.describeTable(context.database, table)
12
+ : await context.database.describeTable(table);
13
+ return {
14
+ success: true,
15
+ data: schema,
16
+ };
17
+ }
18
+ catch (error) {
19
+ return {
20
+ success: false,
21
+ error: error instanceof Error ? error.message : `Failed to describe table "${table}".`,
22
+ };
23
+ }
24
+ }
25
+ //# sourceMappingURL=describe-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-table.js","sourceRoot":"","sources":["../../../src/core/tools/describe-table.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAyB,EACzB,OAAoB;IAEpB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAEjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,yBAAyB;SACjC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW;YAChC,CAAC,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC;YAClE,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAEhD,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,6BAA6B,KAAK,IAAI;SACvF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SqlToolResult, ToolContext } from '../types/index.js';
2
+ export interface DescribeTablesInput {
3
+ tables: string[];
4
+ }
5
+ export declare function describeTables(input: DescribeTablesInput, context: ToolContext): Promise<SqlToolResult>;
6
+ //# sourceMappingURL=describe-tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-tables.d.ts","sourceRoot":"","sources":["../../../src/core/tools/describe-tables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEpE,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,mBAAmB,EAC1B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,CAAC,CAuBxB"}
@@ -0,0 +1,22 @@
1
+ export async function describeTables(input, context) {
2
+ const tables = [...new Set((input.tables ?? []).map((table) => table.trim()).filter(Boolean))];
3
+ if (tables.length === 0) {
4
+ return { success: false, error: 'At least one table name is required.' };
5
+ }
6
+ if (tables.length > 10) {
7
+ return { success: false, error: 'A maximum of 10 tables can be described at once.' };
8
+ }
9
+ try {
10
+ const schemas = context.schemaCache
11
+ ? await context.schemaCache.describeTables(context.database, tables)
12
+ : await Promise.all(tables.map((table) => context.database.describeTable(table)));
13
+ return { success: true, data: schemas };
14
+ }
15
+ catch (error) {
16
+ return {
17
+ success: false,
18
+ error: error instanceof Error ? error.message : 'Failed to describe tables.',
19
+ };
20
+ }
21
+ }
22
+ //# sourceMappingURL=describe-tables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-tables.js","sourceRoot":"","sources":["../../../src/core/tools/describe-tables.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAA0B,EAC1B,OAAoB;IAEpB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAE/F,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC;IAC3E,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kDAAkD,EAAE,CAAC;IACvF,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW;YACjC,CAAC,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC;YACpE,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEpF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC1C,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,4BAA4B;SAC7E,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SqlToolResult, ToolContext } from '../types/index.js';
2
+ export interface ExecuteQueryInput {
3
+ sql: string;
4
+ }
5
+ export declare function executeQuery(input: ExecuteQueryInput, context: ToolContext): Promise<SqlToolResult>;
6
+ //# sourceMappingURL=execute-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-query.d.ts","sourceRoot":"","sources":["../../../src/core/tools/execute-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGpE,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAsB,YAAY,CAChC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,CAAC,CA8BxB"}
@@ -0,0 +1,31 @@
1
+ import { validateSql } from '../../safety/sql-validator.js';
2
+ export async function executeQuery(input, context) {
3
+ const validation = validateSql(input.sql, context.safety);
4
+ if (!validation.valid || !validation.sql) {
5
+ return {
6
+ success: false,
7
+ executionAttempted: false,
8
+ error: validation.reason ?? 'SQL query failed validation.',
9
+ };
10
+ }
11
+ try {
12
+ const result = await context.database.executeQuery(validation.sql, {
13
+ maxRows: context.safety.maxRows,
14
+ timeoutMs: context.safety.queryTimeoutMs,
15
+ maxResultBytes: context.safety.maxResultBytes,
16
+ });
17
+ return {
18
+ success: true,
19
+ executionAttempted: true,
20
+ data: result,
21
+ };
22
+ }
23
+ catch (error) {
24
+ return {
25
+ success: false,
26
+ executionAttempted: true,
27
+ error: error instanceof Error ? error.message : 'Failed to execute query.',
28
+ };
29
+ }
30
+ }
31
+ //# sourceMappingURL=execute-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-query.js","sourceRoot":"","sources":["../../../src/core/tools/execute-query.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAM5D,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAwB,EACxB,OAAoB;IAEpB,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAE1D,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;QACzC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,kBAAkB,EAAE,KAAK;YACzB,KAAK,EAAE,UAAU,CAAC,MAAM,IAAI,8BAA8B;SAC3D,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,EAAE;YACjE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO;YAC/B,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc;YACxC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc;SAC9C,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,IAAI;YACb,kBAAkB,EAAE,IAAI;YACxB,IAAI,EAAE,MAAM;SACb,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,kBAAkB,EAAE,IAAI;YACxB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B;SAC3E,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { SqlToolResult, ToolContext } from '../types/index.js';
2
+ export interface ExplainQueryInput {
3
+ sql: string;
4
+ }
5
+ /**
6
+ * Produces a database query plan after passing the SQL through the harness
7
+ * safety boundary.
8
+ */
9
+ export declare function explainQuery(input: ExplainQueryInput, context: ToolContext): Promise<SqlToolResult>;
10
+ //# sourceMappingURL=explain-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain-query.d.ts","sourceRoot":"","sources":["../../../src/core/tools/explain-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGpE,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,CAAC,CA8BxB"}
@@ -0,0 +1,34 @@
1
+ import { validateSql } from '../../safety/sql-validator.js';
2
+ /**
3
+ * Produces a database query plan after passing the SQL through the harness
4
+ * safety boundary.
5
+ */
6
+ export async function explainQuery(input, context) {
7
+ const validation = validateSql(input.sql, context.safety);
8
+ if (!validation.valid || !validation.sql) {
9
+ return {
10
+ success: false,
11
+ error: validation.reason ?? 'SQL query failed validation.',
12
+ };
13
+ }
14
+ if (!/^(SELECT|WITH)\b/i.test(validation.sql)) {
15
+ return {
16
+ success: false,
17
+ error: 'Only SELECT or WITH queries can be explained by this tool.',
18
+ };
19
+ }
20
+ try {
21
+ const result = await context.database.explainQuery(validation.sql);
22
+ return {
23
+ success: true,
24
+ data: result,
25
+ };
26
+ }
27
+ catch (error) {
28
+ return {
29
+ success: false,
30
+ error: error instanceof Error ? error.message : 'Failed to explain query.',
31
+ };
32
+ }
33
+ }
34
+ //# sourceMappingURL=explain-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain-query.js","sourceRoot":"","sources":["../../../src/core/tools/explain-query.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAM5D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAwB,EACxB,OAAoB;IAEpB,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAE1D,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;QACzC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,UAAU,CAAC,MAAM,IAAI,8BAA8B;SAC3D,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9C,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,4DAA4D;SACpE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAEnE,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,0BAA0B;SAC3E,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SqlToolResult, ToolContext } from '../types/index.js';
2
+ export interface GetRelationshipsInput {
3
+ table?: string;
4
+ }
5
+ export declare function getRelationships(input: GetRelationshipsInput | undefined, context: ToolContext): Promise<SqlToolResult>;
6
+ //# sourceMappingURL=get-relationships.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-relationships.d.ts","sourceRoot":"","sources":["../../../src/core/tools/get-relationships.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEpE,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,qBAAqB,YAAK,EACjC,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,CAAC,CAsBxB"}
@@ -0,0 +1,23 @@
1
+ export async function getRelationships(input = {}, context) {
2
+ const table = input.table?.trim() || undefined;
3
+ try {
4
+ const relationships = table
5
+ ? await context.database.getRelationships(table)
6
+ : context.schemaCache
7
+ ? await context.schemaCache.getRelationships(context.database)
8
+ : await context.database.getRelationships();
9
+ return {
10
+ success: true,
11
+ data: relationships,
12
+ };
13
+ }
14
+ catch (error) {
15
+ return {
16
+ success: false,
17
+ error: error instanceof Error
18
+ ? error.message
19
+ : 'Failed to retrieve database relationships.',
20
+ };
21
+ }
22
+ }
23
+ //# sourceMappingURL=get-relationships.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-relationships.js","sourceRoot":"","sources":["../../../src/core/tools/get-relationships.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAK,GAA0B,EAAE,EACjC,OAAoB;IAEpB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,KAAK;YACzB,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC;YAChD,CAAC,CAAC,OAAO,CAAC,WAAW;gBACnB,CAAC,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAC9D,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAEhD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,aAAa;SACpB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK;gBAC3B,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,4CAA4C;SACjD,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
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
+ export type { ToolName, RegisteredTool } from './registry.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","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;AAC/D,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}