@negusdev/dbask 0.0.0-stage → 0.1.8

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 (161) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/LICENSE +15 -0
  3. package/README.md +422 -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 +55 -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 +36 -0
  15. package/dist/ai/sdk-provider.js.map +1 -0
  16. package/dist/cli-args.d.ts +26 -0
  17. package/dist/cli-args.d.ts.map +1 -0
  18. package/dist/cli-args.js +72 -0
  19. package/dist/cli-args.js.map +1 -0
  20. package/dist/cli-observer.d.ts +23 -0
  21. package/dist/cli-observer.d.ts.map +1 -0
  22. package/dist/cli-observer.js +224 -0
  23. package/dist/cli-observer.js.map +1 -0
  24. package/dist/cli.d.ts +3 -0
  25. package/dist/cli.d.ts.map +1 -0
  26. package/dist/cli.js +127 -0
  27. package/dist/cli.js.map +1 -0
  28. package/dist/commands/init.d.ts +2 -0
  29. package/dist/commands/init.d.ts.map +1 -0
  30. package/dist/commands/init.js +247 -0
  31. package/dist/commands/init.js.map +1 -0
  32. package/dist/commands/validate.d.ts +31 -0
  33. package/dist/commands/validate.d.ts.map +1 -0
  34. package/dist/commands/validate.js +205 -0
  35. package/dist/commands/validate.js.map +1 -0
  36. package/dist/config/config.d.ts +42 -0
  37. package/dist/config/config.d.ts.map +1 -0
  38. package/dist/config/config.js +94 -0
  39. package/dist/config/config.js.map +1 -0
  40. package/dist/context/db-context.d.ts +12 -0
  41. package/dist/context/db-context.d.ts.map +1 -0
  42. package/dist/context/db-context.js +29 -0
  43. package/dist/context/db-context.js.map +1 -0
  44. package/dist/core/agent/agent.d.ts +57 -0
  45. package/dist/core/agent/agent.d.ts.map +1 -0
  46. package/dist/core/agent/agent.js +518 -0
  47. package/dist/core/agent/agent.js.map +1 -0
  48. package/dist/core/agent/index.d.ts +4 -0
  49. package/dist/core/agent/index.d.ts.map +1 -0
  50. package/dist/core/agent/index.js +2 -0
  51. package/dist/core/agent/index.js.map +1 -0
  52. package/dist/core/agent/observability.d.ts +19 -0
  53. package/dist/core/agent/observability.d.ts.map +1 -0
  54. package/dist/core/agent/observability.js +4 -0
  55. package/dist/core/agent/observability.js.map +1 -0
  56. package/dist/core/agent/query-plan.d.ts +68 -0
  57. package/dist/core/agent/query-plan.d.ts.map +1 -0
  58. package/dist/core/agent/query-plan.js +282 -0
  59. package/dist/core/agent/query-plan.js.map +1 -0
  60. package/dist/core/tools/describe-table.d.ts +6 -0
  61. package/dist/core/tools/describe-table.d.ts.map +1 -0
  62. package/dist/core/tools/describe-table.js +25 -0
  63. package/dist/core/tools/describe-table.js.map +1 -0
  64. package/dist/core/tools/describe-tables.d.ts +6 -0
  65. package/dist/core/tools/describe-tables.d.ts.map +1 -0
  66. package/dist/core/tools/describe-tables.js +22 -0
  67. package/dist/core/tools/describe-tables.js.map +1 -0
  68. package/dist/core/tools/execute-query.d.ts +6 -0
  69. package/dist/core/tools/execute-query.d.ts.map +1 -0
  70. package/dist/core/tools/execute-query.js +31 -0
  71. package/dist/core/tools/execute-query.js.map +1 -0
  72. package/dist/core/tools/explain-query.d.ts +10 -0
  73. package/dist/core/tools/explain-query.d.ts.map +1 -0
  74. package/dist/core/tools/explain-query.js +34 -0
  75. package/dist/core/tools/explain-query.js.map +1 -0
  76. package/dist/core/tools/get-relationships.d.ts +6 -0
  77. package/dist/core/tools/get-relationships.d.ts.map +1 -0
  78. package/dist/core/tools/get-relationships.js +23 -0
  79. package/dist/core/tools/get-relationships.js.map +1 -0
  80. package/dist/core/tools/index.d.ts +9 -0
  81. package/dist/core/tools/index.d.ts.map +1 -0
  82. package/dist/core/tools/index.js +8 -0
  83. package/dist/core/tools/index.js.map +1 -0
  84. package/dist/core/tools/list-tables.d.ts +3 -0
  85. package/dist/core/tools/list-tables.d.ts.map +1 -0
  86. package/dist/core/tools/list-tables.js +18 -0
  87. package/dist/core/tools/list-tables.js.map +1 -0
  88. package/dist/core/tools/registry.d.ts +11 -0
  89. package/dist/core/tools/registry.d.ts.map +1 -0
  90. package/dist/core/tools/registry.js +48 -0
  91. package/dist/core/tools/registry.js.map +1 -0
  92. package/dist/core/types/index.d.ts +102 -0
  93. package/dist/core/types/index.d.ts.map +1 -0
  94. package/dist/core/types/index.js +6 -0
  95. package/dist/core/types/index.js.map +1 -0
  96. package/dist/database/adapter.d.ts +3 -0
  97. package/dist/database/adapter.d.ts.map +1 -0
  98. package/dist/database/adapter.js +2 -0
  99. package/dist/database/adapter.js.map +1 -0
  100. package/dist/database/factory.d.ts +16 -0
  101. package/dist/database/factory.d.ts.map +1 -0
  102. package/dist/database/factory.js +27 -0
  103. package/dist/database/factory.js.map +1 -0
  104. package/dist/database/index.d.ts +8 -0
  105. package/dist/database/index.d.ts.map +1 -0
  106. package/dist/database/index.js +4 -0
  107. package/dist/database/index.js.map +1 -0
  108. package/dist/database/mysql/adapter.d.ts +26 -0
  109. package/dist/database/mysql/adapter.d.ts.map +1 -0
  110. package/dist/database/mysql/adapter.js +131 -0
  111. package/dist/database/mysql/adapter.js.map +1 -0
  112. package/dist/database/postgres/adapter.d.ts +60 -0
  113. package/dist/database/postgres/adapter.d.ts.map +1 -0
  114. package/dist/database/postgres/adapter.js +307 -0
  115. package/dist/database/postgres/adapter.js.map +1 -0
  116. package/dist/database/result-limits.d.ts +17 -0
  117. package/dist/database/result-limits.d.ts.map +1 -0
  118. package/dist/database/result-limits.js +26 -0
  119. package/dist/database/result-limits.js.map +1 -0
  120. package/dist/index.d.ts +20 -0
  121. package/dist/index.d.ts.map +1 -0
  122. package/dist/index.js +13 -0
  123. package/dist/index.js.map +1 -0
  124. package/dist/safety/limits.d.ts +7 -0
  125. package/dist/safety/limits.d.ts.map +1 -0
  126. package/dist/safety/limits.js +15 -0
  127. package/dist/safety/limits.js.map +1 -0
  128. package/dist/safety/policy.d.ts +8 -0
  129. package/dist/safety/policy.d.ts.map +1 -0
  130. package/dist/safety/policy.js +11 -0
  131. package/dist/safety/policy.js.map +1 -0
  132. package/dist/safety/sql-tokenizer.d.ts +49 -0
  133. package/dist/safety/sql-tokenizer.d.ts.map +1 -0
  134. package/dist/safety/sql-tokenizer.js +240 -0
  135. package/dist/safety/sql-tokenizer.js.map +1 -0
  136. package/dist/safety/sql-validator.d.ts +34 -0
  137. package/dist/safety/sql-validator.d.ts.map +1 -0
  138. package/dist/safety/sql-validator.js +270 -0
  139. package/dist/safety/sql-validator.js.map +1 -0
  140. package/dist/schema/cache.d.ts +24 -0
  141. package/dist/schema/cache.d.ts.map +1 -0
  142. package/dist/schema/cache.js +57 -0
  143. package/dist/schema/cache.js.map +1 -0
  144. package/dist/ui/markdown.d.ts +8 -0
  145. package/dist/ui/markdown.d.ts.map +1 -0
  146. package/dist/ui/markdown.js +205 -0
  147. package/dist/ui/markdown.js.map +1 -0
  148. package/dist/ui/spinner.d.ts +32 -0
  149. package/dist/ui/spinner.d.ts.map +1 -0
  150. package/dist/ui/spinner.js +74 -0
  151. package/dist/ui/spinner.js.map +1 -0
  152. package/dist/ui/sql-highlight.d.ts +4 -0
  153. package/dist/ui/sql-highlight.d.ts.map +1 -0
  154. package/dist/ui/sql-highlight.js +28 -0
  155. package/dist/ui/sql-highlight.js.map +1 -0
  156. package/dist/ui/style.d.ts +38 -0
  157. package/dist/ui/style.d.ts.map +1 -0
  158. package/dist/ui/style.js +69 -0
  159. package/dist/ui/style.js.map +1 -0
  160. package/package.json +91 -4
  161. package/sql-ai.example.md +32 -0
@@ -0,0 +1,247 @@
1
+ import { createInterface } from 'node:readline/promises';
2
+ import { stdin, stdout } from 'node:process';
3
+ import { readFile, writeFile, access, chmod } from 'node:fs/promises';
4
+ import { constants } from 'node:fs';
5
+ import { resolve } from 'node:path';
6
+ import { createDatabaseAdapter } from '../database/factory.js';
7
+ const PROVIDERS = [
8
+ { value: 'openrouter', label: 'OpenRouter', model: '' },
9
+ { value: 'google', label: 'Google Gemini', model: '' },
10
+ { value: 'groq', label: 'Groq', model: '' },
11
+ { value: 'cerebras', label: 'Cerebras', model: '' },
12
+ { value: 'ollama', label: 'Ollama (local)', model: 'qwen2.5:7b' },
13
+ { value: 'deepseek', label: 'DeepSeek', model: '' },
14
+ ];
15
+ function required(value, label) {
16
+ const clean = value.trim();
17
+ if (!clean)
18
+ throw new Error(`${label} is required.`);
19
+ return clean;
20
+ }
21
+ async function askSecret(question) {
22
+ if (!stdin.isTTY || typeof stdin.setRawMode !== 'function') {
23
+ const rl = createInterface({ input: stdin, output: stdout });
24
+ try {
25
+ return await rl.question(`${question}: `);
26
+ }
27
+ finally {
28
+ rl.close();
29
+ }
30
+ }
31
+ stdout.write(`${question}: `);
32
+ stdin.setRawMode(true);
33
+ stdin.resume();
34
+ stdin.setEncoding('utf8');
35
+ return new Promise((resolvePromise, reject) => {
36
+ let value = '';
37
+ const cleanup = () => {
38
+ stdin.setRawMode(false);
39
+ stdin.pause();
40
+ stdin.removeListener('data', onData);
41
+ };
42
+ const onData = (chunk) => {
43
+ for (const char of chunk) {
44
+ if (char === '\u0003') {
45
+ cleanup();
46
+ stdout.write('\n');
47
+ reject(new Error('Setup cancelled.'));
48
+ return;
49
+ }
50
+ if (char === '\r' || char === '\n') {
51
+ cleanup();
52
+ stdout.write('\n');
53
+ resolvePromise(value);
54
+ return;
55
+ }
56
+ if (char === '\u007f' || char === '\b')
57
+ value = value.slice(0, -1);
58
+ else if (char >= ' ')
59
+ value += char;
60
+ }
61
+ };
62
+ stdin.on('data', onData);
63
+ });
64
+ }
65
+ async function askChoice(rl, question, options) {
66
+ stdout.write(`\n${question}\n`);
67
+ options.forEach((option, index) => stdout.write(` ${index + 1}. ${option.label}\n`));
68
+ while (true) {
69
+ const answer = (await rl.question(`Choose 1-${options.length} [1]: `)).trim() || '1';
70
+ const index = Number(answer) - 1;
71
+ if (Number.isInteger(index) && options[index])
72
+ return options[index].value;
73
+ stdout.write(`Enter a number from 1 to ${options.length}.\n`);
74
+ }
75
+ }
76
+ async function askValue(rl, label, defaultValue) {
77
+ const answer = (await rl.question(`${label} [${defaultValue}]: `)).trim();
78
+ return answer || defaultValue;
79
+ }
80
+ function dotenvValue(value) {
81
+ return value === '' ? '' : JSON.stringify(value);
82
+ }
83
+ async function saveEnvFile(path, values) {
84
+ let existing = '';
85
+ try {
86
+ existing = await readFile(path, 'utf8');
87
+ }
88
+ catch (error) {
89
+ if (error.code !== 'ENOENT')
90
+ throw error;
91
+ }
92
+ const lines = existing.split(/\r?\n/);
93
+ const output = [];
94
+ const written = new Set();
95
+ for (const line of lines) {
96
+ const match = line.match(/^\s*(?:export\s+)?([A-Z][A-Z0-9_]*)\s*=/);
97
+ const key = match?.[1];
98
+ if (key && Object.hasOwn(values, key)) {
99
+ if (!written.has(key))
100
+ output.push(`${key}=${dotenvValue(values[key])}`);
101
+ written.add(key);
102
+ }
103
+ else {
104
+ output.push(line);
105
+ }
106
+ }
107
+ const additions = Object.entries(values)
108
+ .filter(([key]) => !written.has(key))
109
+ .map(([key, value]) => `${key}=${dotenvValue(value)}`);
110
+ const merged = [...output.filter((line, index, all) => line !== '' || index < all.length - 1), ...additions].join('\n').replace(/\n*$/, '\n');
111
+ await writeFile(path, merged, { encoding: 'utf8', mode: 0o600 });
112
+ await chmod(path, 0o600);
113
+ }
114
+ export async function runInit(args = []) {
115
+ if (!stdin.isTTY || !stdout.isTTY) {
116
+ throw new Error('The init command requires an interactive terminal. Configure environment variables for non-interactive use.');
117
+ }
118
+ const force = args.includes('--force');
119
+ const envPath = resolve(process.cwd(), '.env');
120
+ try {
121
+ await access(envPath, constants.F_OK);
122
+ if (!force) {
123
+ const check = createInterface({ input: stdin, output: stdout });
124
+ const answer = (await check.question('A .env file already exists. Continue and add harness settings? (y/N): ')).trim().toLowerCase();
125
+ check.close();
126
+ if (answer !== 'y' && answer !== 'yes')
127
+ throw new Error('Setup cancelled. Existing .env file was not changed. Use --force to update harness settings.');
128
+ }
129
+ }
130
+ catch (error) {
131
+ if (error.code !== 'ENOENT')
132
+ throw error;
133
+ }
134
+ let rl = createInterface({ input: stdin, output: stdout });
135
+ const values = {
136
+ DB_DRIVER: 'mysql',
137
+ DB_HOST: '127.0.0.1',
138
+ DB_PORT: '3306',
139
+ DB_SSL: 'disable',
140
+ DB_NAME: '',
141
+ DB_USER: '',
142
+ DB_PASSWORD: '',
143
+ AI_PROVIDER: 'openrouter',
144
+ AI_MODEL: '',
145
+ OPENROUTER_API_KEY: '',
146
+ GROQ_API_KEY: '',
147
+ GOOGLE_GENERATIVE_AI_API_KEY: '',
148
+ CEREBRAS_API_KEY: '',
149
+ OLLAMA_BASE_URL: 'http://localhost:11434/v1',
150
+ DEEPSEEK_API_KEY: '',
151
+ AI_SITE_NAME: 'dbask',
152
+ SQL_MAX_ROWS: '500',
153
+ SQL_QUERY_TIMEOUT_MS: '10000',
154
+ SQL_MAX_RESULT_BYTES: '1048576',
155
+ AGENT_MAX_STEPS: '8',
156
+ SCHEMA_CACHE_TTL_MS: '300000',
157
+ };
158
+ try {
159
+ stdout.write('\ndbask — Setup\n\nDatabase\n');
160
+ values.DB_DRIVER = await askChoice(rl, 'Database type', [
161
+ { value: 'mysql', label: 'MySQL / MariaDB' },
162
+ { value: 'postgres', label: 'PostgreSQL' },
163
+ ]);
164
+ const isPostgres = values.DB_DRIVER === 'postgres';
165
+ values.DB_HOST = await askValue(rl, `${isPostgres ? 'PostgreSQL' : 'MySQL/MariaDB'} host`, '127.0.0.1');
166
+ values.DB_PORT = await askValue(rl, 'Port', isPostgres ? '5432' : '3306');
167
+ if (!/^\d+$/.test(values.DB_PORT) || Number(values.DB_PORT) < 1 || Number(values.DB_PORT) > 65535) {
168
+ throw new Error('Database port must be a number between 1 and 65535.');
169
+ }
170
+ values.DB_NAME = required(await askValue(rl, 'Database name', ''), 'Database name');
171
+ values.DB_USER = required(await askValue(rl, 'Database username', ''), 'Database username');
172
+ values.DB_SSL = await askChoice(rl, 'Encrypt the database connection (TLS)?', [
173
+ { value: 'disable', label: 'No (local or trusted network)' },
174
+ { value: 'require', label: 'Yes, without verifying the certificate' },
175
+ { value: 'verify-full', label: 'Yes, and verify the certificate' },
176
+ ]);
177
+ rl.close();
178
+ values.DB_PASSWORD = await askSecret('Database password');
179
+ rl = createInterface({ input: stdin, output: stdout });
180
+ const provider = await askChoice(rl, 'AI provider', PROVIDERS.map(({ value, label }) => ({ value, label })));
181
+ values.AI_PROVIDER = provider;
182
+ const providerInfo = PROVIDERS.find((item) => item.value === provider);
183
+ values.AI_MODEL = required(await rl.question('Model ID (enter the exact model identifier supported by this provider): '), 'Model ID');
184
+ if (provider !== 'ollama') {
185
+ const keyNames = {
186
+ openrouter: 'OPENROUTER_API_KEY',
187
+ google: 'GOOGLE_GENERATIVE_AI_API_KEY',
188
+ groq: 'GROQ_API_KEY',
189
+ cerebras: 'CEREBRAS_API_KEY',
190
+ deepseek: 'DEEPSEEK_API_KEY',
191
+ };
192
+ rl.close();
193
+ values[keyNames[provider]] = required(await askSecret(`${providerInfo.label} API key`), 'API key');
194
+ rl = createInterface({ input: stdin, output: stdout });
195
+ }
196
+ else {
197
+ values.OLLAMA_BASE_URL = await askValue(rl, 'Ollama OpenAI-compatible base URL', 'http://localhost:11434/v1');
198
+ try {
199
+ new URL(values.OLLAMA_BASE_URL);
200
+ }
201
+ catch {
202
+ throw new Error('Ollama base URL must be a valid URL.');
203
+ }
204
+ }
205
+ values.AGENT_MAX_STEPS = await askValue(rl, 'Maximum agent steps', '8');
206
+ values.SQL_MAX_ROWS = await askValue(rl, 'Maximum rows returned', '500');
207
+ values.SCHEMA_CACHE_TTL_MS = String(Number(await askValue(rl, 'Schema cache TTL in minutes', '5')) * 60_000);
208
+ if (!/^\d+$/.test(values.AGENT_MAX_STEPS) || Number(values.AGENT_MAX_STEPS) < 1 || Number(values.AGENT_MAX_STEPS) > 20) {
209
+ throw new Error('Maximum agent steps must be between 1 and 20.');
210
+ }
211
+ if (!/^\d+$/.test(values.SQL_MAX_ROWS) || Number(values.SQL_MAX_ROWS) < 1) {
212
+ throw new Error('Maximum rows returned must be a positive integer.');
213
+ }
214
+ if (!/^\d+$/.test(values.SCHEMA_CACHE_TTL_MS) || Number(values.SCHEMA_CACHE_TTL_MS) < 60_000) {
215
+ throw new Error('Schema cache TTL must be at least 1 minute.');
216
+ }
217
+ stdout.write(`\nTesting ${isPostgres ? 'PostgreSQL' : 'MySQL/MariaDB'} connection...\n`);
218
+ const database = createDatabaseAdapter({
219
+ driver: values.DB_DRIVER, host: values.DB_HOST, port: Number(values.DB_PORT),
220
+ name: values.DB_NAME, user: values.DB_USER, password: values.DB_PASSWORD,
221
+ ssl: values.DB_SSL,
222
+ });
223
+ try {
224
+ const tables = await database.listTables();
225
+ stdout.write(`✓ Database connection successful (${tables.length} tables discovered).\n`);
226
+ }
227
+ finally {
228
+ await database.close?.();
229
+ }
230
+ // Keep only the selected provider's secret key in the generated configuration.
231
+ const selectedKey = provider === 'ollama' ? undefined : {
232
+ openrouter: 'OPENROUTER_API_KEY', google: 'GOOGLE_GENERATIVE_AI_API_KEY',
233
+ groq: 'GROQ_API_KEY', cerebras: 'CEREBRAS_API_KEY', deepseek: 'DEEPSEEK_API_KEY',
234
+ }[provider];
235
+ for (const key of ['OPENROUTER_API_KEY', 'GROQ_API_KEY', 'GOOGLE_GENERATIVE_AI_API_KEY', 'CEREBRAS_API_KEY', 'DEEPSEEK_API_KEY']) {
236
+ if (key !== selectedKey)
237
+ delete values[key];
238
+ }
239
+ await saveEnvFile(envPath, values);
240
+ stdout.write(`\n✓ Configuration saved to ${envPath}\n`);
241
+ stdout.write(' Keep .env out of version control; it contains credentials.\n\nSetup complete. Try:\n dbask "How many records are in the database?"\n\n');
242
+ }
243
+ finally {
244
+ rl.close();
245
+ }
246
+ }
247
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type AppConfig } from '../config/config.js';
2
+ import type { AiProvider } from '../ai/provider.js';
3
+ import type { DatabaseAdapter, DatabaseContext } from '../core/types/index.js';
4
+ import { type Style } from '../ui/style.js';
5
+ export type CheckStatus = 'pass' | 'warn' | 'fail' | 'skip';
6
+ export interface CheckResult {
7
+ name: string;
8
+ status: CheckStatus;
9
+ detail: string;
10
+ }
11
+ export interface ValidateDependencies {
12
+ loadConfig: () => AppConfig;
13
+ createDatabase: (config: AppConfig['database']) => DatabaseAdapter;
14
+ createProvider: (config: AppConfig['ai']) => AiProvider;
15
+ loadContext: () => Promise<DatabaseContext>;
16
+ }
17
+ export interface ValidateOptions {
18
+ skipProvider: boolean;
19
+ providerTimeoutMs: number;
20
+ }
21
+ /**
22
+ * Runs the setup checks in order. Later checks are skipped when an earlier one
23
+ * they depend on has failed, so the output points at the first real problem.
24
+ *
25
+ * Nothing here reads table data or runs model-written SQL.
26
+ */
27
+ export declare function runValidationChecks(options: ValidateOptions, deps?: ValidateDependencies): Promise<CheckResult[]>;
28
+ export declare function formatValidationReport(results: CheckResult[], style?: Style): string;
29
+ export declare function parseValidateArgs(args: string[]): ValidateOptions;
30
+ export declare function runValidate(args: string[]): Promise<void>;
31
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAA2B,KAAK,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAErE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,SAAS,CAAC;IAC5B,cAAc,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,eAAe,CAAC;IACnE,cAAc,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC;IACxD,WAAW,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAuCD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,eAAe,EACxB,IAAI,GAAE,oBAA0C,GAC/C,OAAO,CAAC,WAAW,EAAE,CAAC,CAuHxB;AAuBD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,KAAK,GAAE,KAAkB,GAAG,MAAM,CAqBhG;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CAgBjE;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAS/D"}
@@ -0,0 +1,205 @@
1
+ import { ZodError } from 'zod';
2
+ import { loadConfig } from '../config/config.js';
3
+ import { createDatabaseAdapter, isSupportedDriver } from '../database/factory.js';
4
+ import { createAiProvider } from '../ai/factory.js';
5
+ import { loadDatabaseContext } from '../context/db-context.js';
6
+ import { createStyle, plainStyle } from '../ui/style.js';
7
+ const DEFAULT_PROVIDER_TIMEOUT_MS = 20_000;
8
+ const defaultDependencies = {
9
+ loadConfig: () => loadConfig(),
10
+ createDatabase: (config) => createDatabaseAdapter(config),
11
+ createProvider: createAiProvider,
12
+ loadContext: () => loadDatabaseContext(),
13
+ };
14
+ function describeError(error) {
15
+ if (error instanceof ZodError) {
16
+ return error.issues
17
+ .map((issue) => {
18
+ const path = issue.path.join('.');
19
+ return path ? `${path}: ${issue.message}` : issue.message;
20
+ })
21
+ .join('; ');
22
+ }
23
+ return error instanceof Error ? error.message : String(error);
24
+ }
25
+ function withTimeout(promise, ms, label) {
26
+ let timer;
27
+ const timeout = new Promise((_resolve, reject) => {
28
+ timer = setTimeout(() => reject(new Error(`${label} did not respond within ${Math.round(ms / 1000)}s.`)), ms);
29
+ });
30
+ return Promise.race([promise, timeout]).finally(() => {
31
+ if (timer)
32
+ clearTimeout(timer);
33
+ });
34
+ }
35
+ /**
36
+ * Runs the setup checks in order. Later checks are skipped when an earlier one
37
+ * they depend on has failed, so the output points at the first real problem.
38
+ *
39
+ * Nothing here reads table data or runs model-written SQL.
40
+ */
41
+ export async function runValidationChecks(options, deps = defaultDependencies) {
42
+ const results = [];
43
+ const add = (name, status, detail) => {
44
+ results.push({ name, status, detail });
45
+ };
46
+ // 1. Configuration.
47
+ let config;
48
+ try {
49
+ config = deps.loadConfig();
50
+ add('Configuration', 'pass', `provider=${config.ai.provider}, model=${config.ai.model}`);
51
+ }
52
+ catch (error) {
53
+ add('Configuration', 'fail', `${describeError(error)}. Run "dbask init" to create a .env, or set these variables in your environment.`);
54
+ }
55
+ if (!config) {
56
+ add('Database connection', 'skip', 'Skipped: configuration is invalid.');
57
+ add('Foreign keys', 'skip', 'Skipped: configuration is invalid.');
58
+ add('AI provider', 'skip', 'Skipped: configuration is invalid.');
59
+ add('Business context (sql-ai.md)', 'skip', 'Skipped: configuration is invalid.');
60
+ return results;
61
+ }
62
+ // 2. Database.
63
+ const missing = [];
64
+ if (!config.database.name)
65
+ missing.push('DB_NAME');
66
+ if (!config.database.user)
67
+ missing.push('DB_USER');
68
+ if (!isSupportedDriver(config.database.driver)) {
69
+ add('Database connection', 'fail', `DB_DRIVER=${config.database.driver} is not implemented yet. Supported: mysql, postgres.`);
70
+ add('Foreign keys', 'skip', 'Skipped: no database connection.');
71
+ }
72
+ else if (missing.length > 0) {
73
+ add('Database connection', 'fail', `${missing.join(' and ')} must be set.`);
74
+ add('Foreign keys', 'skip', 'Skipped: no database connection.');
75
+ }
76
+ else {
77
+ const database = deps.createDatabase(config.database);
78
+ try {
79
+ const tables = await database.listTables();
80
+ const where = `${config.database.host}:${config.database.port}/${config.database.name}`;
81
+ if (tables.length === 0) {
82
+ add('Database connection', 'warn', `Connected to ${where}, but no tables are visible to this user.`);
83
+ }
84
+ else {
85
+ add('Database connection', 'pass', `Connected to ${where}; ${tables.length} table${tables.length === 1 ? '' : 's'} visible.`);
86
+ }
87
+ try {
88
+ const relationships = await database.getRelationships();
89
+ if (relationships.length === 0) {
90
+ add('Foreign keys', 'warn', 'No declared foreign keys found. The agent relies on them to plan joins; consider describing relationships in sql-ai.md.');
91
+ }
92
+ else {
93
+ add('Foreign keys', 'pass', `${relationships.length} declared relationship${relationships.length === 1 ? '' : 's'} found.`);
94
+ }
95
+ }
96
+ catch (error) {
97
+ add('Foreign keys', 'fail', describeError(error));
98
+ }
99
+ }
100
+ catch (error) {
101
+ add('Database connection', 'fail', describeError(error));
102
+ add('Foreign keys', 'skip', 'Skipped: no database connection.');
103
+ }
104
+ finally {
105
+ await database.close?.().catch(() => undefined);
106
+ }
107
+ }
108
+ // 3. AI provider: one tiny request that confirms the key, model and network.
109
+ if (options.skipProvider) {
110
+ add('AI provider', 'skip', 'Skipped (--skip-provider). No request was sent.');
111
+ }
112
+ else {
113
+ try {
114
+ const provider = deps.createProvider(config.ai);
115
+ const response = await withTimeout(provider.generate({
116
+ prompt: 'Reply with the single word: ok',
117
+ temperature: 0,
118
+ maxSteps: 1,
119
+ }), options.providerTimeoutMs, `${config.ai.provider}`);
120
+ if (response.text.trim().length > 0) {
121
+ add('AI provider', 'pass', `${config.ai.provider} answered using model ${config.ai.model}.`);
122
+ }
123
+ else {
124
+ add('AI provider', 'warn', `${config.ai.provider} responded with empty text. Check that ${config.ai.model} is a chat model.`);
125
+ }
126
+ }
127
+ catch (error) {
128
+ add('AI provider', 'fail', describeError(error));
129
+ }
130
+ }
131
+ // 4. Optional business context.
132
+ try {
133
+ const context = await deps.loadContext();
134
+ if (context.content) {
135
+ add('Business context (sql-ai.md)', 'pass', `Loaded ${context.content.length} characters from ${context.source ?? 'sql-ai.md'}.`);
136
+ }
137
+ else {
138
+ add('Business context (sql-ai.md)', 'skip', 'No sql-ai.md found. This is optional.');
139
+ }
140
+ }
141
+ catch (error) {
142
+ add('Business context (sql-ai.md)', 'fail', describeError(error));
143
+ }
144
+ return results;
145
+ }
146
+ const SYMBOLS = {
147
+ pass: '[ok] ',
148
+ warn: '[warn]',
149
+ fail: '[fail]',
150
+ skip: '[skip]',
151
+ };
152
+ function symbolFor(status, style) {
153
+ if (!style.rich)
154
+ return style.color ? colorize(status, SYMBOLS[status], style) : SYMBOLS[status];
155
+ const icons = { pass: '✓', warn: '⚠', fail: '✗', skip: '○' };
156
+ return colorize(status, icons[status], style);
157
+ }
158
+ function colorize(status, text, style) {
159
+ if (status === 'pass')
160
+ return style.green(text);
161
+ if (status === 'warn')
162
+ return style.yellow(text);
163
+ if (status === 'fail')
164
+ return style.red(text);
165
+ return style.dim(text);
166
+ }
167
+ export function formatValidationReport(results, style = plainStyle) {
168
+ const lines = results.map((result) => `${symbolFor(result.status, style)} ${style.bold(result.name)}: ${result.status === 'skip' ? style.dim(result.detail) : result.detail}`);
169
+ const failed = results.filter((result) => result.status === 'fail').length;
170
+ const warned = results.filter((result) => result.status === 'warn').length;
171
+ lines.push('');
172
+ if (failed > 0) {
173
+ lines.push(style.red(`${failed} check${failed === 1 ? '' : 's'} failed. Fix the items marked ${style.rich ? '✗' : '[fail]'} and run validate again.`));
174
+ }
175
+ else if (warned > 0) {
176
+ lines.push(style.yellow('Ready to use, with warnings above.'));
177
+ }
178
+ else {
179
+ lines.push(`${style.green('Everything looks good.')} Try: dbask "How many rows are in my largest table?"`);
180
+ }
181
+ return lines.join('\n');
182
+ }
183
+ export function parseValidateArgs(args) {
184
+ const options = {
185
+ skipProvider: false,
186
+ providerTimeoutMs: DEFAULT_PROVIDER_TIMEOUT_MS,
187
+ };
188
+ for (const arg of args) {
189
+ if (arg === '--skip-provider') {
190
+ options.skipProvider = true;
191
+ continue;
192
+ }
193
+ throw new Error(`Unknown option for validate: ${arg}`);
194
+ }
195
+ return options;
196
+ }
197
+ export async function runValidate(args) {
198
+ const options = parseValidateArgs(args);
199
+ const results = await runValidationChecks(options);
200
+ console.log(formatValidationReport(results, createStyle(process.stdout)));
201
+ if (results.some((result) => result.status === 'fail')) {
202
+ process.exitCode = 1;
203
+ }
204
+ }
205
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import 'dotenv/config';
2
+ import { z } from 'zod';
3
+ import type { DatabaseSslMode, SqlSafetyPolicy } from '../core/types/index.js';
4
+ declare const providerSchema: z.ZodEnum<{
5
+ cerebras: "cerebras";
6
+ deepseek: "deepseek";
7
+ google: "google";
8
+ groq: "groq";
9
+ ollama: "ollama";
10
+ openrouter: "openrouter";
11
+ }>;
12
+ export type AiProviderName = z.infer<typeof providerSchema>;
13
+ export interface AppConfig {
14
+ ai: {
15
+ provider: AiProviderName;
16
+ apiKey?: string;
17
+ model: string;
18
+ baseUrl?: string;
19
+ siteUrl?: string;
20
+ siteName: string;
21
+ };
22
+ database: {
23
+ driver: 'mysql' | 'postgres' | 'sqlite';
24
+ host: string;
25
+ port: number;
26
+ name: string;
27
+ user: string;
28
+ password: string;
29
+ ssl: DatabaseSslMode;
30
+ };
31
+ safety: SqlSafetyPolicy;
32
+ agent: {
33
+ maxSteps: number;
34
+ queryPlan: boolean;
35
+ };
36
+ schema: {
37
+ cacheTtlMs: number;
38
+ };
39
+ }
40
+ export declare function loadConfig(env?: NodeJS.ProcessEnv): AppConfig;
41
+ export {};
42
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE/E,QAAA,MAAM,cAAc;;;;;;;EAOlB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAyC5D,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE;QACF,QAAQ,EAAE,cAAc,CAAC;QACzB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,QAAQ,EAAE;QACR,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;QACxC,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE,eAAe,CAAC;KACtB,CAAC;IACF,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,MAAM,EAAE;QACN,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,SAAS,CA8D1E"}