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.
Files changed (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +347 -0
  3. package/dist/bin/dbgraph.d.ts +8 -0
  4. package/dist/bin/dbgraph.d.ts.map +1 -0
  5. package/dist/bin/dbgraph.js +382 -0
  6. package/dist/bin/dbgraph.js.map +1 -0
  7. package/dist/config.d.ts +25 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +158 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/context/formatter.d.ts +94 -0
  12. package/dist/context/formatter.d.ts.map +1 -0
  13. package/dist/context/formatter.js +288 -0
  14. package/dist/context/formatter.js.map +1 -0
  15. package/dist/context/index.d.ts +77 -0
  16. package/dist/context/index.d.ts.map +1 -0
  17. package/dist/context/index.js +458 -0
  18. package/dist/context/index.js.map +1 -0
  19. package/dist/db/index.d.ts +26 -0
  20. package/dist/db/index.d.ts.map +1 -0
  21. package/dist/db/index.js +127 -0
  22. package/dist/db/index.js.map +1 -0
  23. package/dist/db/migrations.d.ts +8 -0
  24. package/dist/db/migrations.d.ts.map +1 -0
  25. package/dist/db/migrations.js +39 -0
  26. package/dist/db/migrations.js.map +1 -0
  27. package/dist/db/queries.d.ts +46 -0
  28. package/dist/db/queries.d.ts.map +1 -0
  29. package/dist/db/queries.js +436 -0
  30. package/dist/db/queries.js.map +1 -0
  31. package/dist/db/schema.sql +113 -0
  32. package/dist/db/sqlite-adapter.d.ts +30 -0
  33. package/dist/db/sqlite-adapter.d.ts.map +1 -0
  34. package/dist/db/sqlite-adapter.js +78 -0
  35. package/dist/db/sqlite-adapter.js.map +1 -0
  36. package/dist/directory.d.ts +37 -0
  37. package/dist/directory.d.ts.map +1 -0
  38. package/dist/directory.js +160 -0
  39. package/dist/directory.js.map +1 -0
  40. package/dist/errors.d.ts +46 -0
  41. package/dist/errors.d.ts.map +1 -0
  42. package/dist/errors.js +90 -0
  43. package/dist/errors.js.map +1 -0
  44. package/dist/graph/traversal.d.ts +157 -0
  45. package/dist/graph/traversal.d.ts.map +1 -0
  46. package/dist/graph/traversal.js +531 -0
  47. package/dist/graph/traversal.js.map +1 -0
  48. package/dist/index.d.ts +183 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +435 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/introspect/base.d.ts +62 -0
  53. package/dist/introspect/base.d.ts.map +1 -0
  54. package/dist/introspect/base.js +107 -0
  55. package/dist/introspect/base.js.map +1 -0
  56. package/dist/introspect/connection.d.ts +30 -0
  57. package/dist/introspect/connection.d.ts.map +1 -0
  58. package/dist/introspect/connection.js +232 -0
  59. package/dist/introspect/connection.js.map +1 -0
  60. package/dist/introspect/index.d.ts +23 -0
  61. package/dist/introspect/index.d.ts.map +1 -0
  62. package/dist/introspect/index.js +46 -0
  63. package/dist/introspect/index.js.map +1 -0
  64. package/dist/introspect/mysql.d.ts +64 -0
  65. package/dist/introspect/mysql.d.ts.map +1 -0
  66. package/dist/introspect/mysql.js +360 -0
  67. package/dist/introspect/mysql.js.map +1 -0
  68. package/dist/introspect/postgres.d.ts +55 -0
  69. package/dist/introspect/postgres.d.ts.map +1 -0
  70. package/dist/introspect/postgres.js +372 -0
  71. package/dist/introspect/postgres.js.map +1 -0
  72. package/dist/introspect/sqlite.d.ts +33 -0
  73. package/dist/introspect/sqlite.d.ts.map +1 -0
  74. package/dist/introspect/sqlite.js +207 -0
  75. package/dist/introspect/sqlite.js.map +1 -0
  76. package/dist/mcp/engine.d.ts +92 -0
  77. package/dist/mcp/engine.d.ts.map +1 -0
  78. package/dist/mcp/engine.js +261 -0
  79. package/dist/mcp/engine.js.map +1 -0
  80. package/dist/mcp/index.d.ts +33 -0
  81. package/dist/mcp/index.d.ts.map +1 -0
  82. package/dist/mcp/index.js +119 -0
  83. package/dist/mcp/index.js.map +1 -0
  84. package/dist/mcp/server-instructions.d.ts +9 -0
  85. package/dist/mcp/server-instructions.d.ts.map +1 -0
  86. package/dist/mcp/server-instructions.js +71 -0
  87. package/dist/mcp/server-instructions.js.map +1 -0
  88. package/dist/mcp/session.d.ts +35 -0
  89. package/dist/mcp/session.d.ts.map +1 -0
  90. package/dist/mcp/session.js +140 -0
  91. package/dist/mcp/session.js.map +1 -0
  92. package/dist/mcp/tools.d.ts +99 -0
  93. package/dist/mcp/tools.d.ts.map +1 -0
  94. package/dist/mcp/tools.js +499 -0
  95. package/dist/mcp/tools.js.map +1 -0
  96. package/dist/mcp/transport.d.ts +78 -0
  97. package/dist/mcp/transport.d.ts.map +1 -0
  98. package/dist/mcp/transport.js +182 -0
  99. package/dist/mcp/transport.js.map +1 -0
  100. package/dist/search/query-parser.d.ts +66 -0
  101. package/dist/search/query-parser.d.ts.map +1 -0
  102. package/dist/search/query-parser.js +163 -0
  103. package/dist/search/query-parser.js.map +1 -0
  104. package/dist/search/query-utils.d.ts +78 -0
  105. package/dist/search/query-utils.d.ts.map +1 -0
  106. package/dist/search/query-utils.js +203 -0
  107. package/dist/search/query-utils.js.map +1 -0
  108. package/dist/types.d.ts +279 -0
  109. package/dist/types.d.ts.map +1 -0
  110. package/dist/types.js +47 -0
  111. package/dist/types.js.map +1 -0
  112. package/dist/utils.d.ts +40 -0
  113. package/dist/utils.d.ts.map +1 -0
  114. package/dist/utils.js +190 -0
  115. package/dist/utils.js.map +1 -0
  116. package/package.json +54 -0
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Schema Formatter
3
+ *
4
+ * Converts database schema objects into human-readable markdown.
5
+ * Used by the ContextBuilder and CLI to present schema information
6
+ * to LLMs and developers.
7
+ */
8
+ import { TableSchema, DbSourceRecord, GraphStats, SearchResult } from '../types';
9
+ export declare class SchemaFormatter {
10
+ /**
11
+ * Format a full table/view schema as markdown.
12
+ *
13
+ * Output structure:
14
+ * ```markdown
15
+ * ## Table: schema_name.table_name
16
+ * Database: alias (engine)
17
+ *
18
+ * > Table comment
19
+ *
20
+ * | Column | Type | Nullable | Default | PK | FK | Comment |
21
+ * |--------|------|----------|---------|----|----|---------|
22
+ * ...
23
+ *
24
+ * **Indexes:**
25
+ * - idx_name on (col1, col2) UNIQUE
26
+ *
27
+ * **Foreign Keys:**
28
+ * - fk_name → ref_table(ref_col) ON DELETE CASCADE
29
+ * ```
30
+ */
31
+ formatTableSchema(schema: TableSchema): string;
32
+ /**
33
+ * Format a high-level database overview as markdown.
34
+ *
35
+ * Output:
36
+ * ```markdown
37
+ * ## Database Overview
38
+ *
39
+ * | Database | Engine | Host | Tables | Last Indexed |
40
+ * |----------|--------|------|--------|-------------|
41
+ * | prod | postgresql | db.example.com:5432 | 42 | 2024-01-15 |
42
+ *
43
+ * **Graph Statistics:**
44
+ * - Total objects: 1,234
45
+ * - Tables: 42
46
+ * - Views: 12
47
+ * - Columns: 856
48
+ * - Indexes: 98
49
+ * - Foreign Keys: 67
50
+ * ```
51
+ */
52
+ formatDatabaseOverview(dbs: DbSourceRecord[], stats: GraphStats): string;
53
+ /**
54
+ * Format search results as markdown.
55
+ *
56
+ * Output:
57
+ * ```markdown
58
+ * ## Search Results for "orders"
59
+ *
60
+ * | Score | Name | Kind | Source |
61
+ * |-------|------|------|--------|
62
+ * | 1.00 | orders | table | @prod/public |
63
+ * | 0.85 | order_items | table | @prod/public |
64
+ * | 0.72 | total_order_amount | function | @prod/public |
65
+ * ```
66
+ *
67
+ * @param results - Ranked search results from QueryBuilder.searchNodes
68
+ */
69
+ formatSearchResults(results: SearchResult[]): string;
70
+ /**
71
+ * Format a single column table row.
72
+ */
73
+ private _formatColumnRow;
74
+ /**
75
+ * Format a single index entry.
76
+ *
77
+ * Examples:
78
+ * - idx_orders_user_id on (user_id)
79
+ * - pk_orders PRIMARY KEY using btree (id)
80
+ */
81
+ private _formatIndexLine;
82
+ /**
83
+ * Format a single foreign key entry.
84
+ *
85
+ * Examples:
86
+ * - fk_orders_user → users(id) ON DELETE CASCADE
87
+ */
88
+ private _formatForeignKeyLine;
89
+ /**
90
+ * Escape pipe characters so they don't break markdown table columns.
91
+ */
92
+ private _escapePipe;
93
+ }
94
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/context/formatter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,WAAW,EAIX,cAAc,EACd,UAAU,EACV,YAAY,EACb,MAAM,UAAU,CAAC;AAMlB,qBAAa,eAAe;IAK1B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM;IAsE9C;;;;;;;;;;;;;;;;;;;OAmBG;IACH,sBAAsB,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM;IAyExE;;;;;;;;;;;;;;;OAeG;IACH,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM;IAiDpD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsBxB;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAW7B;;OAEG;IACH,OAAO,CAAC,WAAW;CAGpB"}
@@ -0,0 +1,288 @@
1
+ "use strict";
2
+ /**
3
+ * Schema Formatter
4
+ *
5
+ * Converts database schema objects into human-readable markdown.
6
+ * Used by the ContextBuilder and CLI to present schema information
7
+ * to LLMs and developers.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.SchemaFormatter = void 0;
11
+ // =============================================================================
12
+ // SchemaFormatter
13
+ // =============================================================================
14
+ class SchemaFormatter {
15
+ // ---------------------------------------------------------------------------
16
+ // formatTableSchema
17
+ // ---------------------------------------------------------------------------
18
+ /**
19
+ * Format a full table/view schema as markdown.
20
+ *
21
+ * Output structure:
22
+ * ```markdown
23
+ * ## Table: schema_name.table_name
24
+ * Database: alias (engine)
25
+ *
26
+ * > Table comment
27
+ *
28
+ * | Column | Type | Nullable | Default | PK | FK | Comment |
29
+ * |--------|------|----------|---------|----|----|---------|
30
+ * ...
31
+ *
32
+ * **Indexes:**
33
+ * - idx_name on (col1, col2) UNIQUE
34
+ *
35
+ * **Foreign Keys:**
36
+ * - fk_name → ref_table(ref_col) ON DELETE CASCADE
37
+ * ```
38
+ */
39
+ formatTableSchema(schema) {
40
+ const lines = [];
41
+ const label = schema.kind === 'view' ? 'View' : 'Table';
42
+ // --- Header ---
43
+ lines.push(`## ${label}: ${schema.qualifiedName}`);
44
+ lines.push('');
45
+ // --- Source line ---
46
+ // schema.source is a URI like db://@alias/schema or db://host:port/db/schema
47
+ const sourceDisplay = schema.source.replace(/^db:\/\//, '');
48
+ lines.push(`Database: ${sourceDisplay}`);
49
+ lines.push('');
50
+ // --- Comment ---
51
+ if (schema.comment) {
52
+ lines.push(`> ${schema.comment}`);
53
+ lines.push('');
54
+ }
55
+ // --- Column table ---
56
+ lines.push('| Column | Type | Nullable | Default | PK | FK | Comment |');
57
+ lines.push('|--------|------|----------|---------|----|----|---------|');
58
+ for (const col of schema.columns) {
59
+ lines.push(this._formatColumnRow(col, schema.foreignKeys));
60
+ }
61
+ lines.push('');
62
+ // --- Primary key ---
63
+ if (schema.primaryKey.length > 0) {
64
+ lines.push(`**Primary Key:** ${schema.primaryKey.join(', ')}`);
65
+ lines.push('');
66
+ }
67
+ // --- Indexes ---
68
+ if (schema.indexes.length > 0) {
69
+ lines.push('**Indexes:**');
70
+ for (const idx of schema.indexes) {
71
+ lines.push(this._formatIndexLine(idx));
72
+ }
73
+ lines.push('');
74
+ }
75
+ // --- Foreign Keys ---
76
+ if (schema.foreignKeys.length > 0) {
77
+ lines.push('**Foreign Keys:**');
78
+ for (const fk of schema.foreignKeys) {
79
+ lines.push(this._formatForeignKeyLine(fk));
80
+ }
81
+ lines.push('');
82
+ }
83
+ // --- View definition ---
84
+ if (schema.definition) {
85
+ lines.push('**Definition:**');
86
+ lines.push('');
87
+ lines.push('```sql');
88
+ lines.push(schema.definition);
89
+ lines.push('```');
90
+ lines.push('');
91
+ }
92
+ return lines.join('\n');
93
+ }
94
+ // ---------------------------------------------------------------------------
95
+ // formatDatabaseOverview
96
+ // ---------------------------------------------------------------------------
97
+ /**
98
+ * Format a high-level database overview as markdown.
99
+ *
100
+ * Output:
101
+ * ```markdown
102
+ * ## Database Overview
103
+ *
104
+ * | Database | Engine | Host | Tables | Last Indexed |
105
+ * |----------|--------|------|--------|-------------|
106
+ * | prod | postgresql | db.example.com:5432 | 42 | 2024-01-15 |
107
+ *
108
+ * **Graph Statistics:**
109
+ * - Total objects: 1,234
110
+ * - Tables: 42
111
+ * - Views: 12
112
+ * - Columns: 856
113
+ * - Indexes: 98
114
+ * - Foreign Keys: 67
115
+ * ```
116
+ */
117
+ formatDatabaseOverview(dbs, stats) {
118
+ const lines = [];
119
+ lines.push('## Database Overview');
120
+ lines.push('');
121
+ if (dbs.length === 0) {
122
+ lines.push('*No databases indexed.*');
123
+ lines.push('');
124
+ return lines.join('\n');
125
+ }
126
+ // --- Database table ---
127
+ lines.push('| Alias | Engine | Host | Objects | Last Indexed |');
128
+ lines.push('|-------|--------|------|---------|-------------|');
129
+ for (const db of dbs) {
130
+ const host = db.host ? (db.port ? `${db.host}:${db.port}` : db.host) : '—';
131
+ const indexed = db.indexedAt
132
+ ? new Date(db.indexedAt).toISOString().slice(0, 10)
133
+ : '—';
134
+ lines.push(`| ${db.alias} | ${db.engine} | ${host} | ${db.nodeCount.toLocaleString()} | ${indexed} |`);
135
+ }
136
+ lines.push('');
137
+ // --- Graph statistics ---
138
+ lines.push('**Graph Statistics:**');
139
+ lines.push('');
140
+ const kindLabels = {
141
+ table: 'Tables',
142
+ view: 'Views',
143
+ column: 'Columns',
144
+ index: 'Indexes',
145
+ foreign_key: 'Foreign Keys',
146
+ constraint: 'Constraints',
147
+ trigger: 'Triggers',
148
+ stored_procedure: 'Stored Procedures',
149
+ function: 'Functions',
150
+ sequence: 'Sequences',
151
+ schema: 'Schemas',
152
+ database: 'Databases',
153
+ };
154
+ lines.push(`- Total objects: ${stats.nodeCount.toLocaleString()}`);
155
+ lines.push(`- Total relationships: ${stats.edgeCount.toLocaleString()}`);
156
+ for (const [kind, count] of Object.entries(stats.nodesByKind)) {
157
+ if (count > 0) {
158
+ const label = kindLabels[kind] ?? `${kind}s`;
159
+ lines.push(`- ${label}: ${count.toLocaleString()}`);
160
+ }
161
+ }
162
+ lines.push('');
163
+ if (stats.dbSizeBytes > 0) {
164
+ const size = stats.dbSizeBytes > 1_048_576
165
+ ? `${(stats.dbSizeBytes / 1_048_576).toFixed(1)} MB`
166
+ : `${(stats.dbSizeBytes / 1024).toFixed(1)} KB`;
167
+ lines.push(`Database file size: ${size}`);
168
+ lines.push('');
169
+ }
170
+ return lines.join('\n');
171
+ }
172
+ // ---------------------------------------------------------------------------
173
+ // formatSearchResults
174
+ // ---------------------------------------------------------------------------
175
+ /**
176
+ * Format search results as markdown.
177
+ *
178
+ * Output:
179
+ * ```markdown
180
+ * ## Search Results for "orders"
181
+ *
182
+ * | Score | Name | Kind | Source |
183
+ * |-------|------|------|--------|
184
+ * | 1.00 | orders | table | @prod/public |
185
+ * | 0.85 | order_items | table | @prod/public |
186
+ * | 0.72 | total_order_amount | function | @prod/public |
187
+ * ```
188
+ *
189
+ * @param results - Ranked search results from QueryBuilder.searchNodes
190
+ */
191
+ formatSearchResults(results) {
192
+ const lines = [];
193
+ if (results.length === 0) {
194
+ lines.push('*No results found.*');
195
+ lines.push('');
196
+ return lines.join('\n');
197
+ }
198
+ lines.push('| Score | Name | Kind | Qualified Name |');
199
+ lines.push('|-------|------|------|----------------|');
200
+ for (const r of results) {
201
+ const scoreStr = r.score.toFixed(2);
202
+ const name = r.node.name;
203
+ const kind = r.node.kind;
204
+ const qn = r.node.qualifiedName;
205
+ lines.push(`| ${scoreStr} | ${name} | ${kind} | \`${qn}\` |`);
206
+ }
207
+ lines.push('');
208
+ // Append highlights if present
209
+ let hasHighlights = false;
210
+ for (const r of results) {
211
+ if (r.highlights && r.highlights.length > 0) {
212
+ hasHighlights = true;
213
+ break;
214
+ }
215
+ }
216
+ if (hasHighlights) {
217
+ lines.push('**Matches:**');
218
+ lines.push('');
219
+ for (const r of results) {
220
+ if (r.highlights && r.highlights.length > 0) {
221
+ lines.push(`- \`${r.node.name}\`: ${r.highlights.join('; ')}`);
222
+ }
223
+ }
224
+ lines.push('');
225
+ }
226
+ return lines.join('\n');
227
+ }
228
+ // ---------------------------------------------------------------------------
229
+ // Private helpers
230
+ // ---------------------------------------------------------------------------
231
+ /**
232
+ * Format a single column table row.
233
+ */
234
+ _formatColumnRow(col, foreignKeys) {
235
+ const nullable = col.isNullable ? 'YES' : 'NO';
236
+ const defaultVal = col.defaultValue ?? '';
237
+ const pk = col.isPrimaryKey ? 'PK' : '';
238
+ // Find FK that this column participates in
239
+ const fk = foreignKeys.find((fk) => fk.columns.includes(col.name));
240
+ const fkDisplay = fk
241
+ ? `${fk.referencedTable}(${fk.referencedColumns.join(',')})`
242
+ : '';
243
+ const comment = col.comment ?? '';
244
+ // Escape pipe characters in values
245
+ const safeType = this._escapePipe(col.dataType);
246
+ return `| ${col.name} | ${safeType} | ${nullable} | ${defaultVal} | ${pk} | ${fkDisplay} | ${comment} |`;
247
+ }
248
+ /**
249
+ * Format a single index entry.
250
+ *
251
+ * Examples:
252
+ * - idx_orders_user_id on (user_id)
253
+ * - pk_orders PRIMARY KEY using btree (id)
254
+ */
255
+ _formatIndexLine(idx) {
256
+ const cols = idx.columns.join(', ');
257
+ if (idx.primary) {
258
+ const method = idx.method ?? 'btree';
259
+ return `- ${idx.name} PRIMARY KEY using ${method} (${cols})`;
260
+ }
261
+ const unique = idx.unique ? ' UNIQUE' : '';
262
+ return `- ${idx.name} on (${cols})${unique}`;
263
+ }
264
+ /**
265
+ * Format a single foreign key entry.
266
+ *
267
+ * Examples:
268
+ * - fk_orders_user → users(id) ON DELETE CASCADE
269
+ */
270
+ _formatForeignKeyLine(fk) {
271
+ const cols = fk.columns.join(', ');
272
+ const refs = `${fk.referencedTable}(${fk.referencedColumns.join(', ')})`;
273
+ const parts = [`- ${fk.constraintName} → ${refs}`];
274
+ if (fk.onDelete)
275
+ parts.push(`ON DELETE ${fk.onDelete.toUpperCase()}`);
276
+ if (fk.onUpdate)
277
+ parts.push(`ON UPDATE ${fk.onUpdate.toUpperCase()}`);
278
+ return parts.join(' ');
279
+ }
280
+ /**
281
+ * Escape pipe characters so they don't break markdown table columns.
282
+ */
283
+ _escapePipe(value) {
284
+ return value.replace(/\|/g, '\\|');
285
+ }
286
+ }
287
+ exports.SchemaFormatter = SchemaFormatter;
288
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/context/formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Context Builder
3
+ *
4
+ * Builds rich schema context from the database knowledge graph.
5
+ * Composes table schemas, relationship chains, and formats them
6
+ * as markdown for LLM consumption.
7
+ */
8
+ import { QueryBuilder } from '../db/queries';
9
+ import { GraphTraverser } from '../graph/traversal';
10
+ import { TableSchema } from '../types';
11
+ export declare class ContextBuilder {
12
+ private readonly projectRoot;
13
+ private readonly queries;
14
+ private readonly traverser;
15
+ /**
16
+ * @param projectRoot - Root path of the project (used for resolving .dbgraph/)
17
+ * @param queries - QueryBuilder instance for raw lookups
18
+ * @param traverser - GraphTraverser instance for BFS / ancestor / child queries
19
+ */
20
+ constructor(projectRoot: string, queries: QueryBuilder, traverser: GraphTraverser);
21
+ /**
22
+ * Build a complete TableSchema description from the graph.
23
+ *
24
+ * Resolution steps:
25
+ * 1. Fetch the table / view node.
26
+ * 2. Fetch child nodes via `contains` edges — separate columns from indexes.
27
+ * 3. Identify primary-key columns via `primary_key` edges.
28
+ * 4. Identify foreign-key columns via `references` edges on each column.
29
+ * 5. Collect index metadata from child index nodes.
30
+ * 6. Collect FK constraints via `foreign_key` edges and incoming `references`.
31
+ * 7. Assemble and return a TableSchema.
32
+ *
33
+ * @param nodeId - The graph node ID of the table or view.
34
+ */
35
+ getTableSchema(nodeId: string): Promise<TableSchema>;
36
+ /**
37
+ * Build a markdown context string for a table or view.
38
+ *
39
+ * Accepts either:
40
+ * - A graph node ID (exact `id` lookup)
41
+ * - A qualified or simple name (searched via `searchNodes`)
42
+ *
43
+ * The output includes:
44
+ * - Full table schema (columns, PKs, FKs, indexes)
45
+ * - Parent hierarchy (database → schema → table)
46
+ * - Tables that reference this table (incoming FK relationships)
47
+ *
48
+ * @param tableNameOrId - Table name, qualified name, or graph node ID.
49
+ */
50
+ buildContext(tableNameOrId: string): Promise<string>;
51
+ /**
52
+ * Extract the parent table ID for a column node by tracing its incoming
53
+ * `contains` edge.
54
+ */
55
+ private _parentTableId;
56
+ /**
57
+ * Resolve the data type for a column node.
58
+ * Priority: metadata.dataType → parse from signature → "unknown".
59
+ */
60
+ private _columnDataType;
61
+ /**
62
+ * Determine whether a column is nullable.
63
+ * Priority: metadata.isNullable → parse from signature → true.
64
+ */
65
+ private _columnIsNullable;
66
+ /**
67
+ * Extract default value for a column.
68
+ * Priority: metadata.defaultValue → parse from signature.
69
+ */
70
+ private _columnDefault;
71
+ /**
72
+ * Derive which columns an index covers by looking at the index node's
73
+ * metadata or its `indexed_by` edges to column nodes.
74
+ */
75
+ private _getIndexedColumnNames;
76
+ }
77
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAIL,WAAW,EAIZ,MAAM,UAAU,CAAC;AAMlB,qBAAa,cAAc;IAOvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAR5B;;;;OAIG;gBAEgB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,cAAc;IAO5C;;;;;;;;;;;;;OAaG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAsM1D;;;;;;;;;;;;;OAaG;IACG,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoL1D;;;OAGG;IACH,OAAO,CAAC,cAAc;IAWtB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAevB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAazB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAiBtB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;CAe/B"}