dbgraph 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/LICENSE +21 -0
- package/README.md +347 -0
- package/dist/bin/dbgraph.d.ts +8 -0
- package/dist/bin/dbgraph.d.ts.map +1 -0
- package/dist/bin/dbgraph.js +382 -0
- package/dist/bin/dbgraph.js.map +1 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +158 -0
- package/dist/config.js.map +1 -0
- package/dist/context/formatter.d.ts +94 -0
- package/dist/context/formatter.d.ts.map +1 -0
- package/dist/context/formatter.js +288 -0
- package/dist/context/formatter.js.map +1 -0
- package/dist/context/index.d.ts +77 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +458 -0
- package/dist/context/index.js.map +1 -0
- package/dist/db/index.d.ts +26 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +127 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrations.d.ts +8 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +39 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/queries.d.ts +46 -0
- package/dist/db/queries.d.ts.map +1 -0
- package/dist/db/queries.js +436 -0
- package/dist/db/queries.js.map +1 -0
- package/dist/db/schema.sql +113 -0
- package/dist/db/sqlite-adapter.d.ts +30 -0
- package/dist/db/sqlite-adapter.d.ts.map +1 -0
- package/dist/db/sqlite-adapter.js +78 -0
- package/dist/db/sqlite-adapter.js.map +1 -0
- package/dist/directory.d.ts +37 -0
- package/dist/directory.d.ts.map +1 -0
- package/dist/directory.js +160 -0
- package/dist/directory.js.map +1 -0
- package/dist/errors.d.ts +46 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +90 -0
- package/dist/errors.js.map +1 -0
- package/dist/graph/traversal.d.ts +157 -0
- package/dist/graph/traversal.d.ts.map +1 -0
- package/dist/graph/traversal.js +531 -0
- package/dist/graph/traversal.js.map +1 -0
- package/dist/index.d.ts +183 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +435 -0
- package/dist/index.js.map +1 -0
- package/dist/introspect/base.d.ts +62 -0
- package/dist/introspect/base.d.ts.map +1 -0
- package/dist/introspect/base.js +107 -0
- package/dist/introspect/base.js.map +1 -0
- package/dist/introspect/connection.d.ts +30 -0
- package/dist/introspect/connection.d.ts.map +1 -0
- package/dist/introspect/connection.js +232 -0
- package/dist/introspect/connection.js.map +1 -0
- package/dist/introspect/index.d.ts +23 -0
- package/dist/introspect/index.d.ts.map +1 -0
- package/dist/introspect/index.js +46 -0
- package/dist/introspect/index.js.map +1 -0
- package/dist/introspect/mysql.d.ts +64 -0
- package/dist/introspect/mysql.d.ts.map +1 -0
- package/dist/introspect/mysql.js +360 -0
- package/dist/introspect/mysql.js.map +1 -0
- package/dist/introspect/postgres.d.ts +55 -0
- package/dist/introspect/postgres.d.ts.map +1 -0
- package/dist/introspect/postgres.js +372 -0
- package/dist/introspect/postgres.js.map +1 -0
- package/dist/introspect/sqlite.d.ts +33 -0
- package/dist/introspect/sqlite.d.ts.map +1 -0
- package/dist/introspect/sqlite.js +207 -0
- package/dist/introspect/sqlite.js.map +1 -0
- package/dist/mcp/engine.d.ts +92 -0
- package/dist/mcp/engine.d.ts.map +1 -0
- package/dist/mcp/engine.js +261 -0
- package/dist/mcp/engine.js.map +1 -0
- package/dist/mcp/index.d.ts +33 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +119 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server-instructions.d.ts +9 -0
- package/dist/mcp/server-instructions.d.ts.map +1 -0
- package/dist/mcp/server-instructions.js +71 -0
- package/dist/mcp/server-instructions.js.map +1 -0
- package/dist/mcp/session.d.ts +35 -0
- package/dist/mcp/session.d.ts.map +1 -0
- package/dist/mcp/session.js +140 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/mcp/tools.d.ts +99 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +499 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/transport.d.ts +78 -0
- package/dist/mcp/transport.d.ts.map +1 -0
- package/dist/mcp/transport.js +182 -0
- package/dist/mcp/transport.js.map +1 -0
- package/dist/search/query-parser.d.ts +66 -0
- package/dist/search/query-parser.d.ts.map +1 -0
- package/dist/search/query-parser.js +163 -0
- package/dist/search/query-parser.js.map +1 -0
- package/dist/search/query-utils.d.ts +78 -0
- package/dist/search/query-utils.d.ts.map +1 -0
- package/dist/search/query-utils.js +203 -0
- package/dist/search/query-utils.js.map +1 -0
- package/dist/types.d.ts +279 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +47 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +40 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +190 -0
- package/dist/utils.js.map +1 -0
- package/package.json +54 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DBGraph
|
|
3
|
+
*
|
|
4
|
+
* Database knowledge graph — introspect database schemas into a local
|
|
5
|
+
* knowledge graph and expose it over MCP for LLM-powered SQL generation.
|
|
6
|
+
*/
|
|
7
|
+
import { Node, Edge, SearchOptions, SearchResult, GraphStats, DbSourceRecord, TableSchema } from './types';
|
|
8
|
+
import { QueryBuilder } from './db/queries';
|
|
9
|
+
import { GraphTraverser } from './graph/traversal';
|
|
10
|
+
import { ContextBuilder } from './context';
|
|
11
|
+
import { DBGraphConfig } from './config';
|
|
12
|
+
import { MCPServer } from './mcp';
|
|
13
|
+
export * from './types';
|
|
14
|
+
export { getDatabasePath } from './db';
|
|
15
|
+
export { getDBGraphDir, isInitialized, findNearestDBGraphRoot, DBGRAPH_DIR } from './directory';
|
|
16
|
+
export { MCPServer } from './mcp';
|
|
17
|
+
/**
|
|
18
|
+
* Constructor options for DBGraph
|
|
19
|
+
*/
|
|
20
|
+
export interface InitOptions {
|
|
21
|
+
/** Path to dbgraph-db.json config file */
|
|
22
|
+
config?: string;
|
|
23
|
+
/** Whether to run initial indexing after init */
|
|
24
|
+
index?: boolean;
|
|
25
|
+
/** Progress callback */
|
|
26
|
+
onProgress?: (msg: string, current: number, total: number) => void;
|
|
27
|
+
}
|
|
28
|
+
export interface OpenOptions {
|
|
29
|
+
/** Whether to run sync if sources have changed */
|
|
30
|
+
sync?: boolean;
|
|
31
|
+
/** Read-only mode */
|
|
32
|
+
readOnly?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface IndexOptions {
|
|
35
|
+
/** Progress callback */
|
|
36
|
+
onProgress?: (msg: string, current: number, total: number) => void;
|
|
37
|
+
/** Abort signal */
|
|
38
|
+
signal?: AbortSignal;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Main DBGraph class
|
|
42
|
+
*/
|
|
43
|
+
export declare class DBGraph {
|
|
44
|
+
private db;
|
|
45
|
+
private queries;
|
|
46
|
+
private projectRoot;
|
|
47
|
+
private traverser;
|
|
48
|
+
private contextBuilder;
|
|
49
|
+
private config;
|
|
50
|
+
private indexMutex;
|
|
51
|
+
private fileLock;
|
|
52
|
+
private constructor();
|
|
53
|
+
/**
|
|
54
|
+
* Initialize a new DBGraph project
|
|
55
|
+
*/
|
|
56
|
+
static init(projectRoot: string, options?: InitOptions): Promise<DBGraph>;
|
|
57
|
+
/**
|
|
58
|
+
* Initialize synchronously (no indexing)
|
|
59
|
+
*/
|
|
60
|
+
static initSync(projectRoot: string): DBGraph;
|
|
61
|
+
/**
|
|
62
|
+
* Open an existing DBGraph project
|
|
63
|
+
*/
|
|
64
|
+
static open(projectRoot: string, options?: OpenOptions): Promise<DBGraph>;
|
|
65
|
+
/**
|
|
66
|
+
* Open synchronously
|
|
67
|
+
*/
|
|
68
|
+
static openSync(projectRoot: string): DBGraph;
|
|
69
|
+
static isInitialized(projectRoot: string): boolean;
|
|
70
|
+
close(): void;
|
|
71
|
+
getProjectRoot(): string;
|
|
72
|
+
getConfig(): DBGraphConfig | null;
|
|
73
|
+
/**
|
|
74
|
+
* Set or update the configuration
|
|
75
|
+
*/
|
|
76
|
+
setConfig(config: DBGraphConfig): void;
|
|
77
|
+
/**
|
|
78
|
+
* Index all configured databases
|
|
79
|
+
*/
|
|
80
|
+
indexAll(options?: IndexOptions): Promise<{
|
|
81
|
+
success: boolean;
|
|
82
|
+
sourcesIndexed: number;
|
|
83
|
+
nodesCreated: number;
|
|
84
|
+
edgesCreated: number;
|
|
85
|
+
errors: string[];
|
|
86
|
+
}>;
|
|
87
|
+
/**
|
|
88
|
+
* Sync with current database state (re-index)
|
|
89
|
+
*/
|
|
90
|
+
sync(options?: IndexOptions): Promise<{
|
|
91
|
+
sourcesChecked: number;
|
|
92
|
+
sourcesReindexed: number;
|
|
93
|
+
}>;
|
|
94
|
+
/**
|
|
95
|
+
* Test connections to all configured databases
|
|
96
|
+
*/
|
|
97
|
+
testConnections(): Promise<Array<{
|
|
98
|
+
alias: string;
|
|
99
|
+
success: boolean;
|
|
100
|
+
error?: string;
|
|
101
|
+
}>>;
|
|
102
|
+
/**
|
|
103
|
+
* Search schema objects by name
|
|
104
|
+
*/
|
|
105
|
+
searchNodes(query: string, options?: SearchOptions): SearchResult[];
|
|
106
|
+
/**
|
|
107
|
+
* Get a node by ID
|
|
108
|
+
*/
|
|
109
|
+
getNode(id: string): Node | null;
|
|
110
|
+
/**
|
|
111
|
+
* Get nodes of a specific kind
|
|
112
|
+
*/
|
|
113
|
+
getNodesByKind(kind: Node['kind']): Node[];
|
|
114
|
+
/**
|
|
115
|
+
* Get nodes by exact name
|
|
116
|
+
*/
|
|
117
|
+
getNodesByName(name: string): Node[];
|
|
118
|
+
/**
|
|
119
|
+
* Build a complete table schema description from the graph
|
|
120
|
+
*/
|
|
121
|
+
getTableSchema(nodeId: string): Promise<TableSchema>;
|
|
122
|
+
/**
|
|
123
|
+
* Build full context for a table as markdown
|
|
124
|
+
*/
|
|
125
|
+
buildContext(name: string): Promise<string>;
|
|
126
|
+
/**
|
|
127
|
+
* Get outgoing edges (table → columns, FK references)
|
|
128
|
+
*/
|
|
129
|
+
getOutgoingEdges(nodeId: string, kinds?: Edge['kind'][]): Edge[];
|
|
130
|
+
/**
|
|
131
|
+
* Get incoming edges (what references this node)
|
|
132
|
+
*/
|
|
133
|
+
getIncomingEdges(nodeId: string, kinds?: Edge['kind'][]): Edge[];
|
|
134
|
+
/**
|
|
135
|
+
* Find FK path between two tables
|
|
136
|
+
*/
|
|
137
|
+
findForeignKeyPath(fromName: string, toName: string): Array<{
|
|
138
|
+
node: Node;
|
|
139
|
+
edge: Edge | null;
|
|
140
|
+
}> | null;
|
|
141
|
+
/**
|
|
142
|
+
* Get all databases tracked in the graph
|
|
143
|
+
*/
|
|
144
|
+
getSources(): DbSourceRecord[];
|
|
145
|
+
/**
|
|
146
|
+
* Get graph statistics
|
|
147
|
+
*/
|
|
148
|
+
getStats(): GraphStats;
|
|
149
|
+
/**
|
|
150
|
+
* Create an MCP server for this project
|
|
151
|
+
*/
|
|
152
|
+
createMCPServer(): MCPServer;
|
|
153
|
+
/**
|
|
154
|
+
* Get the underlying QueryBuilder (for advanced use)
|
|
155
|
+
*/
|
|
156
|
+
getQueryBuilder(): QueryBuilder;
|
|
157
|
+
/**
|
|
158
|
+
* Get the underlying GraphTraverser (for advanced use)
|
|
159
|
+
*/
|
|
160
|
+
getTraverser(): GraphTraverser;
|
|
161
|
+
/**
|
|
162
|
+
* Get the underlying ContextBuilder (for advanced use)
|
|
163
|
+
*/
|
|
164
|
+
getContextBuilder(): ContextBuilder;
|
|
165
|
+
/**
|
|
166
|
+
* Get the database journal mode
|
|
167
|
+
*/
|
|
168
|
+
getJournalMode(): string;
|
|
169
|
+
/**
|
|
170
|
+
* Optimize database
|
|
171
|
+
*/
|
|
172
|
+
optimize(): void;
|
|
173
|
+
/**
|
|
174
|
+
* Clear all data
|
|
175
|
+
*/
|
|
176
|
+
clear(): void;
|
|
177
|
+
/**
|
|
178
|
+
* Completely remove DBGraph from the project
|
|
179
|
+
*/
|
|
180
|
+
uninitialize(): void;
|
|
181
|
+
}
|
|
182
|
+
export default DBGraph;
|
|
183
|
+
//# 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,435 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DBGraph
|
|
4
|
+
*
|
|
5
|
+
* Database knowledge graph — introspect database schemas into a local
|
|
6
|
+
* knowledge graph and expose it over MCP for LLM-powered SQL generation.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
42
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.DBGraph = exports.MCPServer = exports.DBGRAPH_DIR = exports.findNearestDBGraphRoot = exports.isInitialized = exports.getDBGraphDir = exports.getDatabasePath = void 0;
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const db_1 = require("./db");
|
|
48
|
+
const queries_1 = require("./db/queries");
|
|
49
|
+
const directory_1 = require("./directory");
|
|
50
|
+
const traversal_1 = require("./graph/traversal");
|
|
51
|
+
const context_1 = require("./context");
|
|
52
|
+
const introspect_1 = require("./introspect");
|
|
53
|
+
const config_1 = require("./config");
|
|
54
|
+
const utils_1 = require("./utils");
|
|
55
|
+
const mcp_1 = require("./mcp");
|
|
56
|
+
// Re-exports
|
|
57
|
+
__exportStar(require("./types"), exports);
|
|
58
|
+
var db_2 = require("./db");
|
|
59
|
+
Object.defineProperty(exports, "getDatabasePath", { enumerable: true, get: function () { return db_2.getDatabasePath; } });
|
|
60
|
+
var directory_2 = require("./directory");
|
|
61
|
+
Object.defineProperty(exports, "getDBGraphDir", { enumerable: true, get: function () { return directory_2.getDBGraphDir; } });
|
|
62
|
+
Object.defineProperty(exports, "isInitialized", { enumerable: true, get: function () { return directory_2.isInitialized; } });
|
|
63
|
+
Object.defineProperty(exports, "findNearestDBGraphRoot", { enumerable: true, get: function () { return directory_2.findNearestDBGraphRoot; } });
|
|
64
|
+
Object.defineProperty(exports, "DBGRAPH_DIR", { enumerable: true, get: function () { return directory_2.DBGRAPH_DIR; } });
|
|
65
|
+
var mcp_2 = require("./mcp");
|
|
66
|
+
Object.defineProperty(exports, "MCPServer", { enumerable: true, get: function () { return mcp_2.MCPServer; } });
|
|
67
|
+
const LOCK_TIMEOUT_MS = 30000;
|
|
68
|
+
/**
|
|
69
|
+
* Main DBGraph class
|
|
70
|
+
*/
|
|
71
|
+
class DBGraph {
|
|
72
|
+
db;
|
|
73
|
+
queries;
|
|
74
|
+
projectRoot;
|
|
75
|
+
traverser;
|
|
76
|
+
contextBuilder;
|
|
77
|
+
config = null;
|
|
78
|
+
// Mutex + file lock for concurrent safety
|
|
79
|
+
indexMutex = new utils_1.Mutex();
|
|
80
|
+
fileLock;
|
|
81
|
+
constructor(db, queries, projectRoot) {
|
|
82
|
+
this.db = db;
|
|
83
|
+
this.queries = queries;
|
|
84
|
+
this.projectRoot = projectRoot;
|
|
85
|
+
this.fileLock = new utils_1.FileLock(path.join(projectRoot, '.dbgraph', 'dbgraph.lock'));
|
|
86
|
+
this.traverser = new traversal_1.GraphTraverser(queries);
|
|
87
|
+
this.contextBuilder = new context_1.ContextBuilder(projectRoot, queries, this.traverser);
|
|
88
|
+
}
|
|
89
|
+
// ===========================================================================
|
|
90
|
+
// Lifecycle
|
|
91
|
+
// ===========================================================================
|
|
92
|
+
/**
|
|
93
|
+
* Initialize a new DBGraph project
|
|
94
|
+
*/
|
|
95
|
+
static async init(projectRoot, options = {}) {
|
|
96
|
+
const resolvedRoot = path.resolve(projectRoot);
|
|
97
|
+
if ((0, directory_1.isInitialized)(resolvedRoot)) {
|
|
98
|
+
throw new Error(`DBGraph already initialized in ${resolvedRoot}`);
|
|
99
|
+
}
|
|
100
|
+
// Create directory structure
|
|
101
|
+
(0, directory_1.createDirectory)(resolvedRoot);
|
|
102
|
+
// Initialize database
|
|
103
|
+
const dbPath = (0, db_1.getDatabasePath)(resolvedRoot);
|
|
104
|
+
const db = db_1.DatabaseConnection.initialize(dbPath);
|
|
105
|
+
const queries = new queries_1.QueryBuilder(db.getDb());
|
|
106
|
+
const instance = new DBGraph(db, queries, resolvedRoot);
|
|
107
|
+
// Load config if specified or auto-discover
|
|
108
|
+
const configPath = options.config || (0, config_1.findConfigFile)(resolvedRoot);
|
|
109
|
+
if (configPath) {
|
|
110
|
+
instance.config = (0, config_1.loadConfig)(configPath);
|
|
111
|
+
}
|
|
112
|
+
// Run initial indexing if requested
|
|
113
|
+
if (options.index) {
|
|
114
|
+
await instance.indexAll({ onProgress: options.onProgress });
|
|
115
|
+
}
|
|
116
|
+
return instance;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Initialize synchronously (no indexing)
|
|
120
|
+
*/
|
|
121
|
+
static initSync(projectRoot) {
|
|
122
|
+
const resolvedRoot = path.resolve(projectRoot);
|
|
123
|
+
if ((0, directory_1.isInitialized)(resolvedRoot)) {
|
|
124
|
+
throw new Error(`DBGraph already initialized in ${resolvedRoot}`);
|
|
125
|
+
}
|
|
126
|
+
(0, directory_1.createDirectory)(resolvedRoot);
|
|
127
|
+
const dbPath = (0, db_1.getDatabasePath)(resolvedRoot);
|
|
128
|
+
const db = db_1.DatabaseConnection.initialize(dbPath);
|
|
129
|
+
const queries = new queries_1.QueryBuilder(db.getDb());
|
|
130
|
+
return new DBGraph(db, queries, resolvedRoot);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Open an existing DBGraph project
|
|
134
|
+
*/
|
|
135
|
+
static async open(projectRoot, options = {}) {
|
|
136
|
+
const resolvedRoot = path.resolve(projectRoot);
|
|
137
|
+
if (!(0, directory_1.isInitialized)(resolvedRoot)) {
|
|
138
|
+
throw new Error(`DBGraph not initialized in ${resolvedRoot}. Run init() first.`);
|
|
139
|
+
}
|
|
140
|
+
const validation = (0, directory_1.validateDirectory)(resolvedRoot);
|
|
141
|
+
if (!validation.valid) {
|
|
142
|
+
throw new Error(`Invalid DBGraph directory: ${validation.errors.join(', ')}`);
|
|
143
|
+
}
|
|
144
|
+
const dbPath = (0, db_1.getDatabasePath)(resolvedRoot);
|
|
145
|
+
const db = db_1.DatabaseConnection.open(dbPath);
|
|
146
|
+
const queries = new queries_1.QueryBuilder(db.getDb());
|
|
147
|
+
const instance = new DBGraph(db, queries, resolvedRoot);
|
|
148
|
+
// Load config
|
|
149
|
+
const configPath = (0, config_1.findConfigFile)(resolvedRoot);
|
|
150
|
+
if (configPath) {
|
|
151
|
+
instance.config = (0, config_1.loadConfig)(configPath);
|
|
152
|
+
}
|
|
153
|
+
if (options.sync) {
|
|
154
|
+
await instance.sync();
|
|
155
|
+
}
|
|
156
|
+
return instance;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Open synchronously
|
|
160
|
+
*/
|
|
161
|
+
static openSync(projectRoot) {
|
|
162
|
+
const resolvedRoot = path.resolve(projectRoot);
|
|
163
|
+
if (!(0, directory_1.isInitialized)(resolvedRoot)) {
|
|
164
|
+
throw new Error(`DBGraph not initialized in ${resolvedRoot}. Run init() first.`);
|
|
165
|
+
}
|
|
166
|
+
const validation = (0, directory_1.validateDirectory)(resolvedRoot);
|
|
167
|
+
if (!validation.valid) {
|
|
168
|
+
throw new Error(`Invalid DBGraph directory: ${validation.errors.join(', ')}`);
|
|
169
|
+
}
|
|
170
|
+
const dbPath = (0, db_1.getDatabasePath)(resolvedRoot);
|
|
171
|
+
const db = db_1.DatabaseConnection.open(dbPath);
|
|
172
|
+
const queries = new queries_1.QueryBuilder(db.getDb());
|
|
173
|
+
const instance = new DBGraph(db, queries, resolvedRoot);
|
|
174
|
+
const configPath = (0, config_1.findConfigFile)(resolvedRoot);
|
|
175
|
+
if (configPath) {
|
|
176
|
+
instance.config = (0, config_1.loadConfig)(configPath);
|
|
177
|
+
}
|
|
178
|
+
return instance;
|
|
179
|
+
}
|
|
180
|
+
static isInitialized(projectRoot) {
|
|
181
|
+
return (0, directory_1.isInitialized)(path.resolve(projectRoot));
|
|
182
|
+
}
|
|
183
|
+
close() {
|
|
184
|
+
this.fileLock.release();
|
|
185
|
+
this.db.close();
|
|
186
|
+
}
|
|
187
|
+
getProjectRoot() { return this.projectRoot; }
|
|
188
|
+
getConfig() { return this.config; }
|
|
189
|
+
/**
|
|
190
|
+
* Set or update the configuration
|
|
191
|
+
*/
|
|
192
|
+
setConfig(config) {
|
|
193
|
+
this.config = config;
|
|
194
|
+
}
|
|
195
|
+
// ===========================================================================
|
|
196
|
+
// Introspection / Indexing
|
|
197
|
+
// ===========================================================================
|
|
198
|
+
/**
|
|
199
|
+
* Index all configured databases
|
|
200
|
+
*/
|
|
201
|
+
async indexAll(options = {}) {
|
|
202
|
+
return this.indexMutex.withLock(async () => {
|
|
203
|
+
try {
|
|
204
|
+
this.fileLock.acquire();
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return { success: false, sourcesIndexed: 0, nodesCreated: 0, edgesCreated: 0, errors: ['Could not acquire file lock'] };
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
if (!this.config || this.config.databases.length === 0) {
|
|
211
|
+
return { success: false, sourcesIndexed: 0, nodesCreated: 0, edgesCreated: 0, errors: ['No databases configured. Create a dbgraph-db.json file.'] };
|
|
212
|
+
}
|
|
213
|
+
const before = this.queries.getNodeAndEdgeCount();
|
|
214
|
+
let totalSources = this.config.databases.length;
|
|
215
|
+
let sourcesIndexed = 0;
|
|
216
|
+
let errors = [];
|
|
217
|
+
for (const dbConfig of this.config.databases) {
|
|
218
|
+
options.onProgress?.(`Introspecting ${dbConfig.alias} (${dbConfig.engine})...`, sourcesIndexed + 1, totalSources);
|
|
219
|
+
try {
|
|
220
|
+
const introspector = (0, introspect_1.createIntrospector)(dbConfig);
|
|
221
|
+
const result = await introspector.extractAll();
|
|
222
|
+
if (result.errors.length > 0) {
|
|
223
|
+
errors.push(...result.errors.map(e => `[${dbConfig.alias}] ${e}`));
|
|
224
|
+
}
|
|
225
|
+
// Store in database
|
|
226
|
+
if (result.nodes.length > 0) {
|
|
227
|
+
this.db.transaction(() => {
|
|
228
|
+
// Remove old data for this source
|
|
229
|
+
this.queries.deleteNodesBySource(`db://@${dbConfig.alias}`);
|
|
230
|
+
// Insert new data
|
|
231
|
+
this.queries.insertNodes(result.nodes);
|
|
232
|
+
this.queries.insertEdges(result.edges);
|
|
233
|
+
});
|
|
234
|
+
// Upsert db source record
|
|
235
|
+
this.queries.upsertDbSource({
|
|
236
|
+
alias: dbConfig.alias,
|
|
237
|
+
engine: dbConfig.engine,
|
|
238
|
+
database: dbConfig.database,
|
|
239
|
+
host: dbConfig.host,
|
|
240
|
+
port: dbConfig.port,
|
|
241
|
+
displayUri: introspector.getDisplayUri(),
|
|
242
|
+
indexedAt: Date.now(),
|
|
243
|
+
nodeCount: result.nodes.length,
|
|
244
|
+
errors: result.errors.length > 0 ? result.errors : undefined,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
sourcesIndexed++;
|
|
248
|
+
}
|
|
249
|
+
catch (err) {
|
|
250
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
251
|
+
errors.push(`[${dbConfig.alias}] ${msg}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Run maintenance after bulk writes
|
|
255
|
+
this.db.runMaintenance();
|
|
256
|
+
const after = this.queries.getNodeAndEdgeCount();
|
|
257
|
+
options.onProgress?.('Done.', totalSources, totalSources);
|
|
258
|
+
return {
|
|
259
|
+
success: errors.length === 0,
|
|
260
|
+
sourcesIndexed,
|
|
261
|
+
nodesCreated: after.nodes - before.nodes,
|
|
262
|
+
edgesCreated: after.edges - before.edges,
|
|
263
|
+
errors,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
finally {
|
|
267
|
+
this.fileLock.release();
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Sync with current database state (re-index)
|
|
273
|
+
*/
|
|
274
|
+
async sync(options = {}) {
|
|
275
|
+
// For V1, sync == re-index all (incremental sync via hashing is future work)
|
|
276
|
+
const result = await this.indexAll(options);
|
|
277
|
+
return {
|
|
278
|
+
sourcesChecked: result.sourcesIndexed,
|
|
279
|
+
sourcesReindexed: result.sourcesIndexed,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Test connections to all configured databases
|
|
284
|
+
*/
|
|
285
|
+
async testConnections() {
|
|
286
|
+
if (!this.config)
|
|
287
|
+
return [];
|
|
288
|
+
const results = [];
|
|
289
|
+
for (const dbConfig of this.config.databases) {
|
|
290
|
+
try {
|
|
291
|
+
const introspector = (0, introspect_1.createIntrospector)(dbConfig);
|
|
292
|
+
const ok = await introspector.testConnection();
|
|
293
|
+
results.push({ alias: dbConfig.alias, success: ok });
|
|
294
|
+
}
|
|
295
|
+
catch (err) {
|
|
296
|
+
results.push({
|
|
297
|
+
alias: dbConfig.alias,
|
|
298
|
+
success: false,
|
|
299
|
+
error: err instanceof Error ? err.message : String(err),
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return results;
|
|
304
|
+
}
|
|
305
|
+
// ===========================================================================
|
|
306
|
+
// Graph Queries
|
|
307
|
+
// ===========================================================================
|
|
308
|
+
/**
|
|
309
|
+
* Search schema objects by name
|
|
310
|
+
*/
|
|
311
|
+
searchNodes(query, options) {
|
|
312
|
+
return this.queries.searchNodes(query, options);
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Get a node by ID
|
|
316
|
+
*/
|
|
317
|
+
getNode(id) {
|
|
318
|
+
return this.queries.getNodeById(id);
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Get nodes of a specific kind
|
|
322
|
+
*/
|
|
323
|
+
getNodesByKind(kind) {
|
|
324
|
+
return this.queries.getNodesByKind(kind);
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Get nodes by exact name
|
|
328
|
+
*/
|
|
329
|
+
getNodesByName(name) {
|
|
330
|
+
return this.queries.getNodesByName(name);
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Build a complete table schema description from the graph
|
|
334
|
+
*/
|
|
335
|
+
getTableSchema(nodeId) {
|
|
336
|
+
return this.contextBuilder.getTableSchema(nodeId);
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Build full context for a table as markdown
|
|
340
|
+
*/
|
|
341
|
+
async buildContext(name) {
|
|
342
|
+
return this.contextBuilder.buildContext(name);
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Get outgoing edges (table → columns, FK references)
|
|
346
|
+
*/
|
|
347
|
+
getOutgoingEdges(nodeId, kinds) {
|
|
348
|
+
return this.queries.getOutgoingEdges(nodeId, kinds);
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Get incoming edges (what references this node)
|
|
352
|
+
*/
|
|
353
|
+
getIncomingEdges(nodeId, kinds) {
|
|
354
|
+
return this.queries.getIncomingEdges(nodeId, kinds);
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Find FK path between two tables
|
|
358
|
+
*/
|
|
359
|
+
findForeignKeyPath(fromName, toName) {
|
|
360
|
+
const fromNodes = this.queries.searchNodes(fromName, { kinds: ['table'], limit: 5 });
|
|
361
|
+
const toNodes = this.queries.searchNodes(toName, { kinds: ['table'], limit: 5 });
|
|
362
|
+
if (fromNodes.length === 0 || toNodes.length === 0)
|
|
363
|
+
return null;
|
|
364
|
+
return this.traverser.findPath(fromNodes[0].node.id, toNodes[0].node.id, ['references', 'foreign_key', 'contains']);
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Get all databases tracked in the graph
|
|
368
|
+
*/
|
|
369
|
+
getSources() {
|
|
370
|
+
return this.queries.getAllDbSources();
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Get graph statistics
|
|
374
|
+
*/
|
|
375
|
+
getStats() {
|
|
376
|
+
const stats = this.queries.getStats();
|
|
377
|
+
stats.dbSizeBytes = this.db.getSize();
|
|
378
|
+
return stats;
|
|
379
|
+
}
|
|
380
|
+
// ===========================================================================
|
|
381
|
+
// MCP Server
|
|
382
|
+
// ===========================================================================
|
|
383
|
+
/**
|
|
384
|
+
* Create an MCP server for this project
|
|
385
|
+
*/
|
|
386
|
+
createMCPServer() {
|
|
387
|
+
return new mcp_1.MCPServer({ projectPath: this.projectRoot });
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Get the underlying QueryBuilder (for advanced use)
|
|
391
|
+
*/
|
|
392
|
+
getQueryBuilder() {
|
|
393
|
+
return this.queries;
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Get the underlying GraphTraverser (for advanced use)
|
|
397
|
+
*/
|
|
398
|
+
getTraverser() {
|
|
399
|
+
return this.traverser;
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Get the underlying ContextBuilder (for advanced use)
|
|
403
|
+
*/
|
|
404
|
+
getContextBuilder() {
|
|
405
|
+
return this.contextBuilder;
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Get the database journal mode
|
|
409
|
+
*/
|
|
410
|
+
getJournalMode() {
|
|
411
|
+
return this.db.getJournalMode();
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Optimize database
|
|
415
|
+
*/
|
|
416
|
+
optimize() {
|
|
417
|
+
this.db.optimize();
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Clear all data
|
|
421
|
+
*/
|
|
422
|
+
clear() {
|
|
423
|
+
this.queries.clear();
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Completely remove DBGraph from the project
|
|
427
|
+
*/
|
|
428
|
+
uninitialize() {
|
|
429
|
+
this.close();
|
|
430
|
+
(0, directory_1.removeDirectory)(this.projectRoot);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
exports.DBGraph = DBGraph;
|
|
434
|
+
exports.default = DBGraph;
|
|
435
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|