@siemens/ix-mcp-angular 3.2.0-v.1.10.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 (48) hide show
  1. package/AGENTS.md +86 -0
  2. package/LICENSE.md +20 -0
  3. package/README.md +391 -0
  4. package/config.json +51 -0
  5. package/database/vectors.db/documents.lance/_transactions/109-667922df-dcb8-4400-846a-fcca46a3cfd8.txn +0 -0
  6. package/database/vectors.db/documents.lance/_versions/111.manifest +0 -0
  7. package/database/vectors.db/documents.lance/data/1001001000111000111110002d01c8449a9aa9f7ce9a04125c.lance +0 -0
  8. package/dist/src/cli.d.ts +3 -0
  9. package/dist/src/cli.d.ts.map +1 -0
  10. package/dist/src/cli.js +310 -0
  11. package/dist/src/cli.js.map +1 -0
  12. package/dist/src/config.d.ts +35 -0
  13. package/dist/src/config.d.ts.map +1 -0
  14. package/dist/src/config.js +33 -0
  15. package/dist/src/config.js.map +1 -0
  16. package/dist/src/db-handler.d.ts +50 -0
  17. package/dist/src/db-handler.d.ts.map +1 -0
  18. package/dist/src/db-handler.js +256 -0
  19. package/dist/src/db-handler.js.map +1 -0
  20. package/dist/src/embeddings.d.ts +77 -0
  21. package/dist/src/embeddings.d.ts.map +1 -0
  22. package/dist/src/embeddings.js +280 -0
  23. package/dist/src/embeddings.js.map +1 -0
  24. package/dist/src/index.d.ts +30 -0
  25. package/dist/src/index.d.ts.map +1 -0
  26. package/dist/src/index.js +427 -0
  27. package/dist/src/index.js.map +1 -0
  28. package/dist/src/keys.d.ts +4 -0
  29. package/dist/src/keys.d.ts.map +1 -0
  30. package/dist/src/keys.js +24 -0
  31. package/dist/src/keys.js.map +1 -0
  32. package/dist/src/logger.d.ts +24 -0
  33. package/dist/src/logger.d.ts.map +1 -0
  34. package/dist/src/logger.js +185 -0
  35. package/dist/src/logger.js.map +1 -0
  36. package/dist/src/prompt.d.ts +19 -0
  37. package/dist/src/prompt.d.ts.map +1 -0
  38. package/dist/src/prompt.js +94 -0
  39. package/dist/src/prompt.js.map +1 -0
  40. package/dist/src/setup.d.ts +29 -0
  41. package/dist/src/setup.d.ts.map +1 -0
  42. package/dist/src/setup.js +851 -0
  43. package/dist/src/setup.js.map +1 -0
  44. package/dist/src/token.d.ts +22 -0
  45. package/dist/src/token.d.ts.map +1 -0
  46. package/dist/src/token.js +76 -0
  47. package/dist/src/token.js.map +1 -0
  48. package/package.json +69 -0
@@ -0,0 +1,310 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Copyright (c) Siemens 2016 - 2025
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { readFileSync, copyFileSync } from 'fs';
7
+ import { dirname, join, basename } from 'path';
8
+ import { fileURLToPath } from 'url';
9
+ import { Command } from 'commander';
10
+ import { SDLMCPSetup } from './setup.js';
11
+ import { loadConfig } from './config.js';
12
+ import { ObservabilityLogger } from './logger.js';
13
+ import { selectPrompt, showSuccess, showError, showInfo } from './prompt.js';
14
+ const __dirname = dirname(fileURLToPath(import.meta.url));
15
+ const config = loadConfig();
16
+ const program = new Command();
17
+ const binName = config.binName; // 'mcp'
18
+ const documentedName = config.documentedName; // 'Design System'
19
+ const projectName = config.projectName; // 'SDL'
20
+ program.name(binName).description(`${projectName} MCP Server CLI - Set up local MCP configurations for ${documentedName} documentation access
21
+
22
+ This tool creates an MCP (Model Context Protocol) server configuration in your repository
23
+ root, allowing AI tools like VS Code Copilot to access
24
+ ${documentedName} documentation and provide intelligent assistance with ${documentedName} components.
25
+ </parameter>
26
+
27
+ Repository Detection:
28
+ Automatically detects your repository root by looking for .git or package.json
29
+ Creates configurations locally in your project, not globally
30
+
31
+ Team Collaboration:
32
+ Configuration files can be committed and shared with your team
33
+ Each team member needs to set up their own LLM token`);
34
+ program
35
+ .command('setup')
36
+ .description(`Create MCP server configurations${config.agentsFile ? ' and optional AI agent instruction files' : ''}`)
37
+ .addHelpText('after', `
38
+ Examples:
39
+ $ ${binName} setup # Set up all MCP${config.agentsFile ? ' and agent instructions' : ' configs'}
40
+ $ cd my-project && ${binName} setup # Set up in specific project
41
+
42
+ This creates:
43
+ .vscode/mcp.json # VS Code MCP extension config
44
+ ${config.agentsFile
45
+ ? `
46
+ Optional AI agent instruction files:
47
+ .github/instructions/${documentedName}.instructions.md # ${documentedName}-specific instructions for AI agents
48
+ .github/copilot-instructions.md # General instructions for AI agents
49
+ AGENTS.md # Repository root instructions for AI agents
50
+ `
51
+ : ''}
52
+ Note: Run this from your project directory or any subdirectory`)
53
+ .action(async () => {
54
+ const setup = new SDLMCPSetup();
55
+ await setup.setupMCPConfigs();
56
+ });
57
+ program
58
+ .command('setup-token')
59
+ .description(`Configure your personal LLM token for ${documentedName} documentation access`)
60
+ .addHelpText('after', `
61
+ Examples:
62
+ $ ${binName} setup-token # Set up your personal token
63
+
64
+ Token Requirements:
65
+ - Get your token from: https://my.siemens.com/
66
+ - Must have 'llm' scope
67
+ - Stored securely in system keychain
68
+ - Required for embedding generation
69
+
70
+ Note: This is a one-time setup per machine/user`)
71
+ .action(async () => {
72
+ const setup = new SDLMCPSetup();
73
+ await setup.setupToken();
74
+ });
75
+ program
76
+ .command('check')
77
+ .description('Verify current MCP setup status and configuration')
78
+ .addHelpText('after', `
79
+ Examples:
80
+ $ ${binName} check # Check setup status
81
+ $ cd my-project && ${binName} check # Check specific project
82
+
83
+ Checks:
84
+ ✓ LLM token configuration
85
+ ✓ MCP configuration files existence
86
+ ✓ ${projectName} MCP server presence in configs
87
+ ✓ Configuration file validity`)
88
+ .action(async () => {
89
+ const setup = new SDLMCPSetup();
90
+ await setup.checkSetup();
91
+ });
92
+ program
93
+ .command('init')
94
+ .description('Complete initial setup: configure token, MCP configurations, and optional AI agent instruction files')
95
+ .addHelpText('after', `
96
+ Examples:
97
+ $ ${binName} init # Complete setup for new user
98
+ $ cd new-project && ${binName} init # Set up new project
99
+
100
+ This command:
101
+ 1. Prompts for your LLM token
102
+ 2. Stores token securely in keychain
103
+ 3. Creates all MCP configuration files
104
+ 4. Optionally adds instruction files for AI agents
105
+ 5. Provides next steps guidance
106
+
107
+ Perfect for first-time setup or new projects`)
108
+ .action(async () => {
109
+ const setup = new SDLMCPSetup();
110
+ await setup.setupToken();
111
+ await setup.setupMCPConfigs();
112
+ });
113
+ program
114
+ .command('test')
115
+ .description('Test MCP server functionality and connection')
116
+ .addHelpText('after', `
117
+ Examples:
118
+ $ ${binName} test # Test server functionality
119
+
120
+ This command:
121
+ - Validates server can be imported
122
+ - Tests basic initialization
123
+ - Verifies no critical errors
124
+ - Useful for troubleshooting`)
125
+ .action(async () => {
126
+ console.log(`Testing ${projectName} MCP server...`);
127
+ try {
128
+ // Dynamic import is necessary here for CLI testing
129
+ const { SDLMCPServer } = await import('./index.js');
130
+ const server = new SDLMCPServer({ debug: true });
131
+ setTimeout(() => {
132
+ console.log('✓ Server initialized successfully');
133
+ console.log('✓ MCP server is working correctly');
134
+ server.close();
135
+ process.exit(0);
136
+ }, 1000);
137
+ }
138
+ catch (error) {
139
+ console.error('✗ Server test failed:', error);
140
+ console.error('');
141
+ console.error('Troubleshooting:');
142
+ console.error(` 1. Ensure ${config.name /* 'MCP package' */} is installed`);
143
+ console.error(` 2. Check your LLM token is configured: ${binName} setup-token`);
144
+ console.error(` 3. Verify network connectivity to ${documentedName} documentation`);
145
+ process.exit(1);
146
+ }
147
+ });
148
+ // Only register log command if observability is enabled
149
+ program
150
+ .command('log', { hidden: !config.observabilityLogging })
151
+ .description('View and copy observability logs from previous MCP server sessions')
152
+ .addHelpText('after', `
153
+ Examples:
154
+ $ ${binName} log # View recent sessions and copy log
155
+
156
+ This command:
157
+ - Shows all recent MCP server sessions
158
+ - Lets you choose a session to view
159
+ - Copies the log file to current directory
160
+ - Displays the log content
161
+
162
+ Note: Observability must be enabled in config for logs to be created`)
163
+ .action(async () => {
164
+ try {
165
+ const sessions = ObservabilityLogger.listSessions();
166
+ if (sessions.length === 0) {
167
+ showInfo('No session logs found.');
168
+ console.log('');
169
+ console.log('Possible reasons:');
170
+ console.log(' - No MCP server sessions have been started yet');
171
+ console.log(' - Log directory has been cleared');
172
+ console.log('');
173
+ console.log(`Log directory: ${ObservabilityLogger.getLogDir()}`);
174
+ process.exit(0);
175
+ }
176
+ showSuccess(`Found ${sessions.length} session log(s)`);
177
+ console.log('');
178
+ const choices = sessions.map(session => ({
179
+ title: ObservabilityLogger.formatSessionDate(session),
180
+ value: session,
181
+ description: session
182
+ }));
183
+ const selectedSession = await selectPrompt('Select a session to view:', choices, 0);
184
+ if (!selectedSession) {
185
+ showInfo('No session selected.');
186
+ process.exit(0);
187
+ }
188
+ const logPath = ObservabilityLogger.getSessionPath(selectedSession);
189
+ const logContent = ObservabilityLogger.readSessionLog(selectedSession);
190
+ const fileName = basename(logPath);
191
+ const destPath = join(process.cwd(), fileName);
192
+ try {
193
+ copyFileSync(logPath, destPath);
194
+ showSuccess(`Log file copied to current directory: ${fileName}`);
195
+ }
196
+ catch (error) {
197
+ showError('Failed to copy log file');
198
+ console.error('Error:', error);
199
+ }
200
+ console.log('');
201
+ showInfo(`Original log location: ${logPath}`);
202
+ console.log('');
203
+ console.log('Log content:');
204
+ console.log('========================================');
205
+ console.log(logContent);
206
+ console.log('========================================');
207
+ console.log('');
208
+ showInfo(`Copied to: ${destPath}`);
209
+ console.log('');
210
+ }
211
+ catch (error) {
212
+ showError('Failed to read logs');
213
+ console.error('Error:', error);
214
+ process.exit(1);
215
+ }
216
+ });
217
+ program
218
+ .option('--verbose', 'Enable verbose logging for debugging')
219
+ .option('--debug', 'Enable debug mode with console logging')
220
+ .option('--port <number>', 'Start HTTP server on the given port instead of stdio')
221
+ .option('--test', 'Test mode - validate configuration and exit')
222
+ .option('--version', 'Display the current version')
223
+ .addHelpText('after', `
224
+ Quick Start:
225
+ 1. Navigate to your project directory
226
+ 2. Run: ${binName} init
227
+ 3. Follow the prompts to set up your token
228
+ 4. Restart VS Code or your AI tool
229
+ 5. Ask questions about ${documentedName} components!
230
+
231
+ Examples:
232
+ ${binName} init # Complete first-time setup
233
+ ${binName} setup # Add to existing project
234
+ ${binName} check # Verify everything works
235
+ ${binName} setup-token # Update your token
236
+ ${binName} --version # Show version
237
+
238
+ For more information: https://code.siemens.com/ux/sdl-mcp`);
239
+ if (!config.observabilityLogging) {
240
+ program.option('--log', 'Enable observability logging (add this flag in your MCP config, use the log command to view logs)');
241
+ }
242
+ else {
243
+ program.option('--nolog', 'Disable observability logging (add this flag in your MCP config, use the log command to view logs)');
244
+ }
245
+ // Handle --version option before parsing
246
+ if (process.argv.includes('--version')) {
247
+ try {
248
+ const packageJsonPath = join(__dirname, '../../package.json');
249
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
250
+ console.log(packageJson.version);
251
+ process.exit(0);
252
+ }
253
+ catch (error) {
254
+ console.error('Error reading version:', error);
255
+ process.exit(1);
256
+ }
257
+ }
258
+ const subcommands = ['setup', 'setup-token', 'check', 'init', 'test', 'log'];
259
+ const args = process.argv.slice(2);
260
+ const hasSubcommand = args.some(arg => subcommands.includes(arg));
261
+ const hasHelp = args.includes('--help') || args.includes('-h');
262
+ // Detect unknown positional args (words that aren't flags or a port value)
263
+ const hasUnknownPositional = args.some((arg, i) => {
264
+ if (arg.startsWith('-')) {
265
+ return false;
266
+ }
267
+ // If previous arg was --port, this is the port value (not a positional command)
268
+ if (i > 0 && args[i - 1] === '--port') {
269
+ return false;
270
+ }
271
+ return true;
272
+ });
273
+ // If no subcommand is provided, default to starting the server
274
+ if (!hasSubcommand && !hasHelp && !hasUnknownPositional) {
275
+ // No command provided (or only --port), start the MCP server directly
276
+ (async () => {
277
+ try {
278
+ const verbose = args.includes('--verbose');
279
+ const debug = args.includes('--debug');
280
+ const log = args.includes('--log');
281
+ const noLog = args.includes('--nolog');
282
+ const portArg = args.find(a => a.startsWith('--port='))?.split('=')[1] ?? args[args.indexOf('--port') + 1];
283
+ const port = portArg ? parseInt(portArg, 10) : undefined;
284
+ const { SDLMCPServer } = await import('./index.js');
285
+ const server = new SDLMCPServer({ verbose, debug, overrideLogging: noLog ? false : log || undefined });
286
+ await (port !== undefined ? server.runHttp(port) : server.run());
287
+ // Graceful shutdown handlers
288
+ const shutdown = (signal) => () => {
289
+ if (verbose || debug || process.env.SDL_MCP_DEBUG_LOG === 'true') {
290
+ console.log('');
291
+ console.log(`Received ${signal} signal...`);
292
+ }
293
+ server
294
+ .drainAndClose()
295
+ .then(() => process.exit(0))
296
+ .catch(() => process.exit(1));
297
+ };
298
+ process.on('SIGINT', shutdown('shutdown'));
299
+ process.on('SIGTERM', shutdown('termination'));
300
+ }
301
+ catch (error) {
302
+ console.error('Failed to start MCP server:', error);
303
+ process.exit(1);
304
+ }
305
+ })();
306
+ }
307
+ else {
308
+ program.parse();
309
+ }
310
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/mcp/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ declare function loadConfig(): {
2
+ name: string;
3
+ description: string;
4
+ displayName: string;
5
+ binName: string;
6
+ compatTokenName?: string;
7
+ documentedName: string;
8
+ projectName: string;
9
+ searchToolName: string;
10
+ iconSearch?: boolean;
11
+ iconSearchToolName?: string;
12
+ iconName?: string;
13
+ iconSearchIconPrefix?: string;
14
+ agentsFile?: boolean;
15
+ instructionFileName?: string;
16
+ observabilityLogging?: boolean;
17
+ exampleQuestions: string[];
18
+ texts: {
19
+ DOC_SEARCH_INSTRUCTION: string;
20
+ DOC_SEARCH_TOOL_DESCRIPTION: string;
21
+ DOC_SEARCH_QUERY_DESCRIPTION: string;
22
+ DOC_NO_RESULTS: string;
23
+ DOC_SUCCESS_HEADER: string;
24
+ DOC_RESULT_NOTE: string;
25
+ ICON_SEARCH_INSTRUCTION?: string;
26
+ ICON_SEARCH_TOOL_DESCRIPTION?: string;
27
+ ICON_SEARCH_QUERY_DESCRIPTION?: string;
28
+ ICON_NO_RESULTS?: string;
29
+ ICON_SUCCESS_HEADER?: string;
30
+ ICON_RESULT_NOTE?: string;
31
+ };
32
+ };
33
+ declare function setConfigPath(customPath: string): void;
34
+ export { loadConfig, setConfigPath };
35
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/mcp/config.ts"],"names":[],"mappings":"AAgDA,iBAAS,UAAU;UAjCP,MAAM;iBACC,MAAM;iBACN,MAAM;aACV,MAAM;sBACG,MAAM;oBACR,MAAM;iBACT,MAAM;oBACH,MAAM;iBACT,OAAO;yBACC,MAAM;eAChB,MAAM;2BACM,MAAM;iBAChB,OAAO;0BACE,MAAM;2BACL,OAAO;sBACZ,MAAM,EAAE;WACnB;QACL,sBAAsB,EAAE,MAAM,CAAC;QAC/B,2BAA2B,EAAE,MAAM,CAAC;QACpC,4BAA4B,EAAE,MAAM,CAAC;QACrC,cAAc,EAAE,MAAM,CAAC;QACvB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,eAAe,EAAE,MAAM,CAAC;QACxB,uBAAuB,CAAC,EAAE,MAAM,CAAC;QACjC,4BAA4B,CAAC,EAAE,MAAM,CAAC;QACtC,6BAA6B,CAAC,EAAE,MAAM,CAAC;QACvC,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B;EAgBN;AAED,iBAAS,aAAa,CAAC,UAAU,EAAE,MAAM,QAQxC;AAED,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Copyright (c) Siemens 2016 - 2025
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+ import * as fs from 'fs';
6
+ import * as path from 'path';
7
+ import { fileURLToPath } from 'url';
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+ let configPath = undefined;
11
+ let config = undefined;
12
+ function loadConfig() {
13
+ if (config)
14
+ return config;
15
+ const actualConfigPath = configPath || path.join(__dirname, '..', '..', 'config.json');
16
+ const configData = fs.readFileSync(actualConfigPath, 'utf8');
17
+ config = JSON.parse(configData);
18
+ if (!config) {
19
+ throw new Error('Failed to load configuration');
20
+ }
21
+ return config;
22
+ }
23
+ function setConfigPath(customPath) {
24
+ if (customPath === configPath) {
25
+ return;
26
+ }
27
+ if (config) {
28
+ throw new Error('Cannot set config path after config has been loaded');
29
+ }
30
+ configPath = customPath;
31
+ }
32
+ export { loadConfig, setConfigPath };
33
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/mcp/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,IAAI,UAAU,GAAuB,SAAS,CAAC;AAE/C,IAAI,MAAM,GAiCM,SAAS,CAAC;AAE1B,SAAS,UAAU;IACjB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,gBAAgB,GAAG,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;IACvF,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC7D,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAEhC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,UAAkB;IACvC,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,UAAU,GAAG,UAAU,CAAC;AAC1B,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,50 @@
1
+ export interface DocumentRow {
2
+ id: string;
3
+ content: string;
4
+ vector: number[];
5
+ chunk_index: number;
6
+ type: string;
7
+ header_path: string | undefined;
8
+ header_level: number | undefined;
9
+ category: string | undefined;
10
+ terms: string | undefined;
11
+ token_count: number;
12
+ }
13
+ export interface ChunkData {
14
+ chunkId: string;
15
+ content: string;
16
+ type: string;
17
+ headerPath: string | undefined;
18
+ headerLevel: number | undefined;
19
+ category: string | undefined;
20
+ terms: string | undefined;
21
+ tokenCount: number;
22
+ chunkIndex: number;
23
+ }
24
+ export declare class DatabaseHandler {
25
+ private db;
26
+ private table;
27
+ private verbose;
28
+ private dbPath;
29
+ private tableName;
30
+ constructor(dbPath: string, options?: {
31
+ verbose?: boolean;
32
+ });
33
+ initialize(): Promise<void>;
34
+ getDocumentCount(): Promise<number>;
35
+ getDocumentsByType(type: string): Promise<DocumentRow[]>;
36
+ getAllDocuments(): Promise<DocumentRow[]>;
37
+ insertDocument(chunk: ChunkData, embedding: number[]): Promise<void>;
38
+ insertDocumentsBatch(chunks: ChunkData[], embeddings: number[][]): Promise<void>;
39
+ clearAllDocuments(): Promise<number>;
40
+ clearDocumentsByType(type: string): Promise<number>;
41
+ vectorSearch(queryVector: number[], limit: number, type?: string): Promise<DocumentRow[]>;
42
+ close(): void;
43
+ getStats(): Promise<{
44
+ totalDocuments: number;
45
+ documentsByType: Record<string, number>;
46
+ }>;
47
+ cleanupOldVersions(): Promise<void>;
48
+ private normalizeRow;
49
+ }
50
+ //# sourceMappingURL=db-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-handler.d.ts","sourceRoot":"","sources":["../../../src/mcp/db-handler.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAAiC;IAC3C,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAe;gBAEpB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE;IAWrD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB3B,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAanC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAaxD,eAAe,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAazC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BpE,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BhF,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAepC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBnD,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAmB/F,KAAK,IAAI,IAAI;IAQP,QAAQ,IAAI,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IA8BxF,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BzC,OAAO,CAAC,YAAY;CAcrB"}