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.
- package/.env.example +31 -0
- package/LICENSE +15 -0
- package/README.md +201 -2
- package/dist/ai/factory.d.ts +4 -0
- package/dist/ai/factory.d.ts.map +1 -0
- package/dist/ai/factory.js +48 -0
- package/dist/ai/factory.js.map +1 -0
- package/dist/ai/provider.d.ts +13 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +2 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/ai/sdk-provider.d.ts +13 -0
- package/dist/ai/sdk-provider.d.ts.map +1 -0
- package/dist/ai/sdk-provider.js +29 -0
- package/dist/ai/sdk-provider.js.map +1 -0
- package/dist/cli-observer.d.ts +5 -0
- package/dist/cli-observer.d.ts.map +1 -0
- package/dist/cli-observer.js +79 -0
- package/dist/cli-observer.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +101 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +232 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/config/config.d.ts +39 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +84 -0
- package/dist/config/config.js.map +1 -0
- package/dist/context/db-context.d.ts +12 -0
- package/dist/context/db-context.d.ts.map +1 -0
- package/dist/context/db-context.js +29 -0
- package/dist/context/db-context.js.map +1 -0
- package/dist/core/agent/agent.d.ts +32 -0
- package/dist/core/agent/agent.d.ts.map +1 -0
- package/dist/core/agent/agent.js +323 -0
- package/dist/core/agent/agent.js.map +1 -0
- package/dist/core/agent/index.d.ts +4 -0
- package/dist/core/agent/index.d.ts.map +1 -0
- package/dist/core/agent/index.js +2 -0
- package/dist/core/agent/index.js.map +1 -0
- package/dist/core/agent/observability.d.ts +19 -0
- package/dist/core/agent/observability.d.ts.map +1 -0
- package/dist/core/agent/observability.js +4 -0
- package/dist/core/agent/observability.js.map +1 -0
- package/dist/core/tools/describe-table.d.ts +6 -0
- package/dist/core/tools/describe-table.d.ts.map +1 -0
- package/dist/core/tools/describe-table.js +25 -0
- package/dist/core/tools/describe-table.js.map +1 -0
- package/dist/core/tools/describe-tables.d.ts +6 -0
- package/dist/core/tools/describe-tables.d.ts.map +1 -0
- package/dist/core/tools/describe-tables.js +22 -0
- package/dist/core/tools/describe-tables.js.map +1 -0
- package/dist/core/tools/execute-query.d.ts +6 -0
- package/dist/core/tools/execute-query.d.ts.map +1 -0
- package/dist/core/tools/execute-query.js +31 -0
- package/dist/core/tools/execute-query.js.map +1 -0
- package/dist/core/tools/explain-query.d.ts +10 -0
- package/dist/core/tools/explain-query.d.ts.map +1 -0
- package/dist/core/tools/explain-query.js +34 -0
- package/dist/core/tools/explain-query.js.map +1 -0
- package/dist/core/tools/get-relationships.d.ts +6 -0
- package/dist/core/tools/get-relationships.d.ts.map +1 -0
- package/dist/core/tools/get-relationships.js +23 -0
- package/dist/core/tools/get-relationships.js.map +1 -0
- package/dist/core/tools/index.d.ts +9 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +8 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/list-tables.d.ts +3 -0
- package/dist/core/tools/list-tables.d.ts.map +1 -0
- package/dist/core/tools/list-tables.js +18 -0
- package/dist/core/tools/list-tables.js.map +1 -0
- package/dist/core/tools/registry.d.ts +11 -0
- package/dist/core/tools/registry.d.ts.map +1 -0
- package/dist/core/tools/registry.js +48 -0
- package/dist/core/tools/registry.js.map +1 -0
- package/dist/core/types/index.d.ts +94 -0
- package/dist/core/types/index.d.ts.map +1 -0
- package/dist/core/types/index.js +6 -0
- package/dist/core/types/index.js.map +1 -0
- package/dist/database/adapter.d.ts +3 -0
- package/dist/database/adapter.d.ts.map +1 -0
- package/dist/database/adapter.js +2 -0
- package/dist/database/adapter.js.map +1 -0
- package/dist/database/index.d.ts +4 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +2 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/mysql/adapter.d.ts +21 -0
- package/dist/database/mysql/adapter.d.ts.map +1 -0
- package/dist/database/mysql/adapter.js +140 -0
- package/dist/database/mysql/adapter.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/safety/limits.d.ts +7 -0
- package/dist/safety/limits.d.ts.map +1 -0
- package/dist/safety/limits.js +15 -0
- package/dist/safety/limits.js.map +1 -0
- package/dist/safety/policy.d.ts +8 -0
- package/dist/safety/policy.d.ts.map +1 -0
- package/dist/safety/policy.js +11 -0
- package/dist/safety/policy.js.map +1 -0
- package/dist/safety/sql-validator.d.ts +15 -0
- package/dist/safety/sql-validator.d.ts.map +1 -0
- package/dist/safety/sql-validator.js +31 -0
- package/dist/safety/sql-validator.js.map +1 -0
- package/dist/schema/cache.d.ts +24 -0
- package/dist/schema/cache.d.ts.map +1 -0
- package/dist/schema/cache.js +56 -0
- package/dist/schema/cache.js.map +1 -0
- package/package.json +75 -3
- package/sql-ai.example.md +32 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process-local cache for database metadata. It never caches query results.
|
|
3
|
+
* A short TTL keeps repeated agent schema discovery from repeatedly hitting
|
|
4
|
+
* information_schema while allowing schema changes to become visible.
|
|
5
|
+
*/
|
|
6
|
+
export class SchemaCache {
|
|
7
|
+
ttlMs;
|
|
8
|
+
tables;
|
|
9
|
+
relationships;
|
|
10
|
+
tableSchemas = new Map();
|
|
11
|
+
constructor(options = {}) {
|
|
12
|
+
this.ttlMs = options.ttlMs ?? 300_000;
|
|
13
|
+
}
|
|
14
|
+
async listTables(database) {
|
|
15
|
+
const cached = this.get(this.tables);
|
|
16
|
+
if (cached)
|
|
17
|
+
return cached;
|
|
18
|
+
const value = await database.listTables();
|
|
19
|
+
this.tables = this.entry(value);
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
async describeTable(database, table) {
|
|
23
|
+
const key = table.toLowerCase();
|
|
24
|
+
const cached = this.get(this.tableSchemas.get(key));
|
|
25
|
+
if (cached)
|
|
26
|
+
return cached;
|
|
27
|
+
const value = await database.describeTable(table);
|
|
28
|
+
this.tableSchemas.set(key, this.entry(value));
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
async describeTables(database, tables) {
|
|
32
|
+
return Promise.all(tables.map((table) => this.describeTable(database, table)));
|
|
33
|
+
}
|
|
34
|
+
async getRelationships(database) {
|
|
35
|
+
const cached = this.get(this.relationships);
|
|
36
|
+
if (cached)
|
|
37
|
+
return cached;
|
|
38
|
+
const value = await database.getRelationships();
|
|
39
|
+
this.relationships = this.entry(value);
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
clear() {
|
|
43
|
+
this.tables = undefined;
|
|
44
|
+
this.relationships = undefined;
|
|
45
|
+
this.tableSchemas.clear();
|
|
46
|
+
}
|
|
47
|
+
entry(value) {
|
|
48
|
+
return { value, expiresAt: Date.now() + this.ttlMs };
|
|
49
|
+
}
|
|
50
|
+
get(entry) {
|
|
51
|
+
if (!entry || entry.expiresAt <= Date.now())
|
|
52
|
+
return undefined;
|
|
53
|
+
return entry.value;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/schema/cache.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,MAAM,OAAO,WAAW;IACL,KAAK,CAAS;IACvB,MAAM,CAA2B;IACjC,aAAa,CAAkC;IACtC,YAAY,GAAG,IAAI,GAAG,EAAmC,CAAC;IAE3E,YAAY,OAAO,GAAuB,EAAE;QAC1C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAyB;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAyB,EAAE,KAAa;QAC1D,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACpD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAyB,EAAE,MAAgB;QAC9D,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,QAAyB;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAChD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAI,KAAQ;QACvB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IACvD,CAAC;IAEO,GAAG,CAAI,KAAgC;QAC7C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;YAAE,OAAO,SAAS,CAAC;QAC9D,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,78 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sql-ai-harness",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"sql",
|
|
9
|
+
"ai",
|
|
10
|
+
"agent",
|
|
11
|
+
"database",
|
|
12
|
+
"text-to-sql",
|
|
13
|
+
"typescript"
|
|
14
|
+
],
|
|
15
|
+
"author": "NegusDev",
|
|
16
|
+
"license": "ISC",
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@types/better-sqlite3": "^9.6.0",
|
|
19
|
+
"@types/node": "^26.6.4",
|
|
20
|
+
"drizzle-kit": "1.0.0-rc.4",
|
|
21
|
+
"tsx": "^4.23.15",
|
|
22
|
+
"typescript": "^7.0.2",
|
|
23
|
+
"vitest": "^5.0.3"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@ai-sdk/cerebras": "^3.0.67",
|
|
27
|
+
"@ai-sdk/google": "^4.0.93",
|
|
28
|
+
"@ai-sdk/groq": "^4.0.59",
|
|
29
|
+
"@ai-sdk/openai-compatible": "^3.0.67",
|
|
30
|
+
"@openrouter/ai-sdk-provider": "^3.1.0",
|
|
31
|
+
"ai": "^7.0.127",
|
|
32
|
+
"better-sqlite3": "^13.0.3",
|
|
33
|
+
"dotenv": "^18.0.5",
|
|
34
|
+
"drizzle-orm": "1.0.0-rc.4",
|
|
35
|
+
"hono": "^4.13.13",
|
|
36
|
+
"mysql2": "^3.24.5",
|
|
37
|
+
"zod": "^4.6.5"
|
|
38
|
+
},
|
|
39
|
+
"description": "A provider-independent TypeScript SQL AI harness for querying existing relational databases.",
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": "https://github.com/NegusDev/sql-ai-harness.git"
|
|
43
|
+
},
|
|
44
|
+
"homepage": "https://github.com/NegusDev/sql-ai-harness#readme",
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/NegusDev/sql-ai-harness/issues"
|
|
47
|
+
},
|
|
48
|
+
"types": "./dist/index.d.ts",
|
|
49
|
+
"exports": {
|
|
50
|
+
".": {
|
|
51
|
+
"types": "./dist/index.d.ts",
|
|
52
|
+
"import": "./dist/index.js"
|
|
53
|
+
},
|
|
54
|
+
"./package.json": "./package.json"
|
|
55
|
+
},
|
|
56
|
+
"bin": {
|
|
57
|
+
"sql-ai-harness": "./dist/cli.js"
|
|
58
|
+
},
|
|
59
|
+
"files": [
|
|
60
|
+
"dist/",
|
|
61
|
+
"README.md",
|
|
62
|
+
"LICENSE",
|
|
63
|
+
".env.example",
|
|
64
|
+
"sql-ai.example.md"
|
|
65
|
+
],
|
|
66
|
+
"engines": {
|
|
67
|
+
"node": ">=20.0.0"
|
|
68
|
+
},
|
|
69
|
+
"scripts": {
|
|
70
|
+
"dev": "tsx src/cli.ts",
|
|
71
|
+
"ask": "node dist/cli.js ask",
|
|
72
|
+
"build": "tsc -p tsconfig.build.json && node -e \"require('node:fs').chmodSync('dist/cli.js', 0o755)\"",
|
|
73
|
+
"typecheck": "tsc --noEmit",
|
|
74
|
+
"test": "vitest run",
|
|
75
|
+
"eval": "tsx evals/runners/run-benchmark.ts",
|
|
76
|
+
"pack:check": "npm pack --dry-run"
|
|
77
|
+
}
|
|
6
78
|
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Database Context
|
|
2
|
+
|
|
3
|
+
<!--
|
|
4
|
+
This file is optional.
|
|
5
|
+
Rename it to `sql-ai.md` if you want to provide business/domain context
|
|
6
|
+
for the connected database.
|
|
7
|
+
-->
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
Describe what this database is used for and the domain it represents.
|
|
12
|
+
|
|
13
|
+
Example:
|
|
14
|
+
|
|
15
|
+
This database belongs to a school management system. It stores information
|
|
16
|
+
about students, parents, teachers, classes, enrollments, attendance and fees.
|
|
17
|
+
|
|
18
|
+
## Business Rules
|
|
19
|
+
|
|
20
|
+
Add important rules that are not obvious from the database schema.
|
|
21
|
+
|
|
22
|
+
- Only active enrollments represent currently enrolled students.
|
|
23
|
+
- Completed payments are considered successful payments.
|
|
24
|
+
- Cancelled payments should not be included in revenue calculations.
|
|
25
|
+
|
|
26
|
+
## Terminology
|
|
27
|
+
|
|
28
|
+
Explain domain-specific terms where the database naming may not be obvious.
|
|
29
|
+
|
|
30
|
+
- Student: A learner registered at the school.
|
|
31
|
+
- Enrollment: A student's registration for an academic period.
|
|
32
|
+
- Revenue: The total amount from completed payments.
|