@eeymoo/context-todos 0.1.0-alpha.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 (98) hide show
  1. package/README.md +261 -0
  2. package/dist/src/index.d.ts +3 -0
  3. package/dist/src/index.d.ts.map +1 -0
  4. package/dist/src/index.js +88 -0
  5. package/dist/src/index.js.map +1 -0
  6. package/dist/src/mcp/db.d.ts +29 -0
  7. package/dist/src/mcp/db.d.ts.map +1 -0
  8. package/dist/src/mcp/db.js +111 -0
  9. package/dist/src/mcp/db.js.map +1 -0
  10. package/dist/src/mcp/gitignore.d.ts +6 -0
  11. package/dist/src/mcp/gitignore.d.ts.map +1 -0
  12. package/dist/src/mcp/gitignore.js +32 -0
  13. package/dist/src/mcp/gitignore.js.map +1 -0
  14. package/dist/src/mcp/index.d.ts +7 -0
  15. package/dist/src/mcp/index.d.ts.map +1 -0
  16. package/dist/src/mcp/index.js +87 -0
  17. package/dist/src/mcp/index.js.map +1 -0
  18. package/dist/src/mcp/scanner.d.ts +7 -0
  19. package/dist/src/mcp/scanner.d.ts.map +1 -0
  20. package/dist/src/mcp/scanner.js +45 -0
  21. package/dist/src/mcp/scanner.js.map +1 -0
  22. package/dist/src/mcp/tools/get-todo-stats.d.ts +3 -0
  23. package/dist/src/mcp/tools/get-todo-stats.d.ts.map +1 -0
  24. package/dist/src/mcp/tools/get-todo-stats.js +37 -0
  25. package/dist/src/mcp/tools/get-todo-stats.js.map +1 -0
  26. package/dist/src/mcp/tools/list-extensions.d.ts +3 -0
  27. package/dist/src/mcp/tools/list-extensions.d.ts.map +1 -0
  28. package/dist/src/mcp/tools/list-extensions.js +28 -0
  29. package/dist/src/mcp/tools/list-extensions.js.map +1 -0
  30. package/dist/src/mcp/tools/list-todos.d.ts +3 -0
  31. package/dist/src/mcp/tools/list-todos.d.ts.map +1 -0
  32. package/dist/src/mcp/tools/list-todos.js +60 -0
  33. package/dist/src/mcp/tools/list-todos.js.map +1 -0
  34. package/dist/src/mcp/tools/scan-directory.d.ts +3 -0
  35. package/dist/src/mcp/tools/scan-directory.d.ts.map +1 -0
  36. package/dist/src/mcp/tools/scan-directory.js +78 -0
  37. package/dist/src/mcp/tools/scan-directory.js.map +1 -0
  38. package/dist/src/mcp/tools/scan-file.d.ts +3 -0
  39. package/dist/src/mcp/tools/scan-file.d.ts.map +1 -0
  40. package/dist/src/mcp/tools/scan-file.js +63 -0
  41. package/dist/src/mcp/tools/scan-file.js.map +1 -0
  42. package/dist/src/mcp/tools/watch.d.ts +4 -0
  43. package/dist/src/mcp/tools/watch.d.ts.map +1 -0
  44. package/dist/src/mcp/tools/watch.js +110 -0
  45. package/dist/src/mcp/tools/watch.js.map +1 -0
  46. package/dist/src/mcp/types.d.ts +35 -0
  47. package/dist/src/mcp/types.d.ts.map +1 -0
  48. package/dist/src/mcp/types.js +23 -0
  49. package/dist/src/mcp/types.js.map +1 -0
  50. package/dist/src/mcp/watcher.d.ts +7 -0
  51. package/dist/src/mcp/watcher.d.ts.map +1 -0
  52. package/dist/src/mcp/watcher.js +74 -0
  53. package/dist/src/mcp/watcher.js.map +1 -0
  54. package/dist/tests/db.test.d.ts +2 -0
  55. package/dist/tests/db.test.d.ts.map +1 -0
  56. package/dist/tests/db.test.js +339 -0
  57. package/dist/tests/db.test.js.map +1 -0
  58. package/dist/tests/mcp/index.test.d.ts +2 -0
  59. package/dist/tests/mcp/index.test.d.ts.map +1 -0
  60. package/dist/tests/mcp/index.test.js +276 -0
  61. package/dist/tests/mcp/index.test.js.map +1 -0
  62. package/dist/tests/scanner.test.d.ts +2 -0
  63. package/dist/tests/scanner.test.d.ts.map +1 -0
  64. package/dist/tests/scanner.test.js +101 -0
  65. package/dist/tests/scanner.test.js.map +1 -0
  66. package/dist/tests/tools/get-todo-stats.test.d.ts +2 -0
  67. package/dist/tests/tools/get-todo-stats.test.d.ts.map +1 -0
  68. package/dist/tests/tools/get-todo-stats.test.js +256 -0
  69. package/dist/tests/tools/get-todo-stats.test.js.map +1 -0
  70. package/dist/tests/tools/list-extensions.test.d.ts +2 -0
  71. package/dist/tests/tools/list-extensions.test.d.ts.map +1 -0
  72. package/dist/tests/tools/list-extensions.test.js +123 -0
  73. package/dist/tests/tools/list-extensions.test.js.map +1 -0
  74. package/dist/tests/tools/list-todos.test.d.ts +2 -0
  75. package/dist/tests/tools/list-todos.test.d.ts.map +1 -0
  76. package/dist/tests/tools/list-todos.test.js +279 -0
  77. package/dist/tests/tools/list-todos.test.js.map +1 -0
  78. package/dist/tests/tools/scan-directory.test.d.ts +2 -0
  79. package/dist/tests/tools/scan-directory.test.d.ts.map +1 -0
  80. package/dist/tests/tools/scan-directory.test.js +194 -0
  81. package/dist/tests/tools/scan-directory.test.js.map +1 -0
  82. package/dist/tests/tools/scan-file.test.d.ts +2 -0
  83. package/dist/tests/tools/scan-file.test.d.ts.map +1 -0
  84. package/dist/tests/tools/scan-file.test.js +176 -0
  85. package/dist/tests/tools/scan-file.test.js.map +1 -0
  86. package/dist/tests/tools/watch.test.d.ts +2 -0
  87. package/dist/tests/tools/watch.test.d.ts.map +1 -0
  88. package/dist/tests/tools/watch.test.js +286 -0
  89. package/dist/tests/tools/watch.test.js.map +1 -0
  90. package/dist/tests/watcher.test.d.ts +2 -0
  91. package/dist/tests/watcher.test.d.ts.map +1 -0
  92. package/dist/tests/watcher.test.js +372 -0
  93. package/dist/tests/watcher.test.js.map +1 -0
  94. package/dist/vitest.config.d.ts +3 -0
  95. package/dist/vitest.config.d.ts.map +1 -0
  96. package/dist/vitest.config.js +15 -0
  97. package/dist/vitest.config.js.map +1 -0
  98. package/package.json +67 -0
@@ -0,0 +1,74 @@
1
+ import { watch } from 'chokidar';
2
+ import { resolve, relative } from 'node:path';
3
+ import { scanFile } from './scanner.js';
4
+ export function createWatcher(options) {
5
+ const maxChanges = options?.maxChanges ?? 200;
6
+ const gitignoreFilter = options?.gitignoreFilter ?? { ignores: () => false, ignoresDir: () => false };
7
+ let fsWatcher = null;
8
+ let changes = [];
9
+ function pushChange(event) {
10
+ changes.push(event);
11
+ if (changes.length > maxChanges) {
12
+ changes = changes.slice(-maxChanges);
13
+ }
14
+ }
15
+ async function start(path, extensions) {
16
+ if (fsWatcher) {
17
+ await stop();
18
+ }
19
+ const absPath = resolve(path);
20
+ fsWatcher = watch(absPath, {
21
+ ignored: (filePath, stats) => {
22
+ if (gitignoreFilter.ignores(relative(absPath, filePath)))
23
+ return true;
24
+ if (stats?.isFile() && extensions) {
25
+ const ext = '.' + filePath.split('.').pop();
26
+ return !extensions.includes(ext);
27
+ }
28
+ return false;
29
+ },
30
+ persistent: true,
31
+ ignoreInitial: true,
32
+ });
33
+ const handleFile = async (type, filePath) => {
34
+ let todos = [];
35
+ if (type !== 'unlink') {
36
+ try {
37
+ todos = await scanFile(filePath);
38
+ }
39
+ catch {
40
+ // atomic write during file may be temporarily unreadable
41
+ }
42
+ }
43
+ pushChange({ type, path: filePath, todos, timestamp: Date.now() });
44
+ };
45
+ fsWatcher
46
+ .on('add', (p) => handleFile('add', p))
47
+ .on('change', (p) => handleFile('change', p))
48
+ .on('unlink', (p) => handleFile('unlink', p));
49
+ }
50
+ async function stop() {
51
+ if (fsWatcher) {
52
+ await fsWatcher.close();
53
+ fsWatcher = null;
54
+ }
55
+ }
56
+ function getChanges(since) {
57
+ if (since === undefined)
58
+ return [...changes];
59
+ return changes.filter((c) => c.timestamp > since);
60
+ }
61
+ function clearChanges() {
62
+ changes = [];
63
+ }
64
+ return {
65
+ get watching() {
66
+ return fsWatcher !== null;
67
+ },
68
+ start,
69
+ stop,
70
+ getChanges,
71
+ clearChanges,
72
+ };
73
+ }
74
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../../src/mcp/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAkB,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAIxC,MAAM,UAAU,aAAa,CAAC,OAG7B;IACC,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,GAAG,CAAC;IAC9C,MAAM,eAAe,GAAG,OAAO,EAAE,eAAe,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IACtG,IAAI,SAAS,GAAqB,IAAI,CAAC;IACvC,IAAI,OAAO,GAAsB,EAAE,CAAC;IAEpC,SAAS,UAAU,CAAC,KAAsB;QACxC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,OAAO,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;YAChC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,KAAK,UAAU,KAAK,CAAC,IAAY,EAAE,UAAqB;QACtD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAE9B,SAAS,GAAG,KAAK,CAAC,OAAO,EAAE;YACzB,OAAO,EAAE,CAAC,QAAgB,EAAE,KAA6B,EAAE,EAAE;gBAC3D,IAAI,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;oBAAE,OAAO,IAAI,CAAC;gBACtE,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;oBAClC,MAAM,GAAG,GAAG,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;oBAC5C,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACnC,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,KAAK,EAAE,IAAiC,EAAE,QAAgB,EAAE,EAAE;YAC/E,IAAI,KAAK,GAAe,EAAE,CAAC;YAC3B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,IAAI,CAAC;oBACH,KAAK,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACnC,CAAC;gBAAC,MAAM,CAAC;oBACP,yDAAyD;gBAC3D,CAAC;YACH,CAAC;YACD,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC,CAAC;QAEF,SAAS;aACN,EAAE,CAAC,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;aAC9C,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;aACpD,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,UAAU,IAAI;QACjB,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;YACxB,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC;IAED,SAAS,UAAU,CAAC,KAAc;QAChC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;QAC7C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,SAAS,YAAY;QACnB,OAAO,GAAG,EAAE,CAAC;IACf,CAAC;IAED,OAAO;QACL,IAAI,QAAQ;YACV,OAAO,SAAS,KAAK,IAAI,CAAC;QAC5B,CAAC;QACD,KAAK;QACL,IAAI;QACJ,UAAU;QACV,YAAY;KACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=db.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.test.d.ts","sourceRoot":"","sources":["../../tests/db.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,339 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { mkdirSync, rmSync, existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { initDb, getDb, syncFileTodos, removeFileTodos, queryTodos, getTodoStats, } from '../src/mcp/db.js';
6
+ describe('Database Module', () => {
7
+ let testDir;
8
+ beforeEach(() => {
9
+ testDir = join(tmpdir(), `db-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
10
+ mkdirSync(testDir, { recursive: true });
11
+ });
12
+ afterEach(() => {
13
+ if (existsSync(testDir)) {
14
+ rmSync(testDir, { recursive: true, force: true });
15
+ }
16
+ });
17
+ describe('initDb', () => {
18
+ it('should initialize database successfully', async () => {
19
+ const client = await initDb(testDir);
20
+ expect(client).toBeDefined();
21
+ const dbPath = join(testDir, '.context-todos.db');
22
+ expect(existsSync(dbPath)).toBe(true);
23
+ });
24
+ it('should create todos table with correct schema', async () => {
25
+ await initDb(testDir);
26
+ const db = getDb();
27
+ const result = await db.execute('PRAGMA table_info(todos)');
28
+ const columns = result.rows.map((r) => r.name);
29
+ expect(columns).toContain('id');
30
+ expect(columns).toContain('file');
31
+ expect(columns).toContain('tag');
32
+ expect(columns).toContain('line');
33
+ expect(columns).toContain('ref');
34
+ expect(columns).toContain('text');
35
+ expect(columns).toContain('created_at');
36
+ expect(columns).toContain('updated_at');
37
+ });
38
+ it('should create indexes', async () => {
39
+ await initDb(testDir);
40
+ const db = getDb();
41
+ const result = await db.execute("SELECT name FROM sqlite_master WHERE type='index' AND tbl_name='todos'");
42
+ const indexNames = result.rows.map((r) => String(r.name));
43
+ expect(indexNames).toContain('idx_todos_file');
44
+ expect(indexNames).toContain('idx_todos_tag');
45
+ expect(indexNames).toContain('idx_todos_updated');
46
+ });
47
+ it('should handle multiple calls to initDb', async () => {
48
+ await initDb(testDir);
49
+ const db1 = getDb();
50
+ await initDb(testDir);
51
+ const db2 = getDb();
52
+ expect(db1).toBeDefined();
53
+ expect(db2).toBeDefined();
54
+ });
55
+ });
56
+ describe('getDb', () => {
57
+ it('should return client after initDb', async () => {
58
+ await initDb(testDir);
59
+ const db = getDb();
60
+ expect(db).toBeDefined();
61
+ expect(typeof db.execute).toBe('function');
62
+ });
63
+ it('should throw error when called before initDb', () => {
64
+ const freshTestDir = join(tmpdir(), `db-test-uninitialized-${Date.now()}-${Math.random().toString(36).slice(2)}`);
65
+ mkdirSync(freshTestDir, { recursive: true });
66
+ expect(() => {
67
+ try {
68
+ getDb();
69
+ }
70
+ catch (err) {
71
+ expect(err.message).toContain('Database not initialized');
72
+ throw err;
73
+ }
74
+ }).toBeDefined();
75
+ rmSync(freshTestDir, { recursive: true, force: true });
76
+ });
77
+ });
78
+ describe('syncFileTodos', () => {
79
+ beforeEach(async () => {
80
+ await initDb(testDir);
81
+ });
82
+ it('should sync todos to empty database', async () => {
83
+ const todos = [
84
+ { file: 'test.ts', tag: 'TODO', line: 1, ref: '', text: 'First todo' },
85
+ { file: 'test.ts', tag: 'FIXME', line: 5, ref: 'ref123', text: 'Second todo' },
86
+ ];
87
+ await syncFileTodos('test.ts', todos);
88
+ const result = await queryTodos({ file: 'test.ts' });
89
+ expect(result.todos.length).toBe(2);
90
+ expect(result.total).toBe(2);
91
+ expect(result.todos.some((t) => t.text === 'First todo')).toBe(true);
92
+ expect(result.todos.some((t) => t.text === 'Second todo')).toBe(true);
93
+ });
94
+ it('should replace existing todos for file', async () => {
95
+ const initialTodos = [
96
+ { file: 'test.ts', tag: 'TODO', line: 1, ref: '', text: 'Old todo' },
97
+ ];
98
+ await syncFileTodos('test.ts', initialTodos);
99
+ const newTodos = [
100
+ { file: 'test.ts', tag: 'TODO', line: 2, ref: '', text: 'New todo 1' },
101
+ { file: 'test.ts', tag: 'TODO', line: 3, ref: '', text: 'New todo 2' },
102
+ ];
103
+ await syncFileTodos('test.ts', newTodos);
104
+ const result = await queryTodos({ file: 'test.ts' });
105
+ expect(result.todos.length).toBe(2);
106
+ expect(result.todos.some((t) => t.text === 'Old todo')).toBe(false);
107
+ expect(result.todos.some((t) => t.text === 'New todo 1')).toBe(true);
108
+ expect(result.todos.some((t) => t.text === 'New todo 2')).toBe(true);
109
+ });
110
+ it('should delete all todos when syncing empty array', async () => {
111
+ const todos = [
112
+ { file: 'test.ts', tag: 'TODO', line: 1, ref: '', text: 'Todo to delete' },
113
+ ];
114
+ await syncFileTodos('test.ts', todos);
115
+ await syncFileTodos('test.ts', []);
116
+ const result = await queryTodos({ file: 'test.ts' });
117
+ expect(result.todos.length).toBe(0);
118
+ expect(result.total).toBe(0);
119
+ });
120
+ it('should rollback transaction on error', async () => {
121
+ const validTodos = [
122
+ { file: 'test.ts', tag: 'TODO', line: 1, ref: '', text: 'Valid todo' },
123
+ ];
124
+ await syncFileTodos('test.ts', validTodos);
125
+ const invalidTodos = [
126
+ { file: 'test.ts', tag: 'TODO', line: 2, ref: '', text: 'First' },
127
+ { file: 'test.ts', tag: 'TODO', line: 2, ref: '', text: 'Duplicate line' },
128
+ ];
129
+ try {
130
+ await syncFileTodos('test.ts', invalidTodos);
131
+ }
132
+ catch (err) {
133
+ expect(err).toBeDefined();
134
+ }
135
+ const result = await queryTodos({ file: 'test.ts' });
136
+ expect(result.todos.length).toBe(1);
137
+ expect(result.todos[0]?.text).toBe('Valid todo');
138
+ });
139
+ it('should not affect other files when syncing', async () => {
140
+ const file1Todos = [
141
+ { file: 'file1.ts', tag: 'TODO', line: 1, ref: '', text: 'File 1 todo' },
142
+ ];
143
+ const file2Todos = [
144
+ { file: 'file2.ts', tag: 'TODO', line: 1, ref: '', text: 'File 2 todo' },
145
+ ];
146
+ await syncFileTodos('file1.ts', file1Todos);
147
+ await syncFileTodos('file2.ts', file2Todos);
148
+ await syncFileTodos('file1.ts', [
149
+ { file: 'file1.ts', tag: 'TODO', line: 2, ref: '', text: 'File 1 new todo' },
150
+ ]);
151
+ const file2Result = await queryTodos({ file: 'file2.ts' });
152
+ expect(file2Result.todos.length).toBe(1);
153
+ expect(file2Result.todos[0]?.text).toBe('File 2 todo');
154
+ });
155
+ });
156
+ describe('removeFileTodos', () => {
157
+ beforeEach(async () => {
158
+ await initDb(testDir);
159
+ });
160
+ it('should remove todos for specified file', async () => {
161
+ const todos = [
162
+ { file: 'test.ts', tag: 'TODO', line: 1, ref: '', text: 'Todo to remove' },
163
+ { file: 'test.ts', tag: 'FIXME', line: 5, ref: '', text: 'Another todo' },
164
+ ];
165
+ await syncFileTodos('test.ts', todos);
166
+ await removeFileTodos('test.ts');
167
+ const result = await queryTodos({ file: 'test.ts' });
168
+ expect(result.todos.length).toBe(0);
169
+ expect(result.total).toBe(0);
170
+ });
171
+ it('should preserve todos from other files', async () => {
172
+ const file1Todos = [
173
+ { file: 'file1.ts', tag: 'TODO', line: 1, ref: '', text: 'File 1 todo' },
174
+ ];
175
+ const file2Todos = [
176
+ { file: 'file2.ts', tag: 'TODO', line: 1, ref: '', text: 'File 2 todo' },
177
+ ];
178
+ await syncFileTodos('file1.ts', file1Todos);
179
+ await syncFileTodos('file2.ts', file2Todos);
180
+ await removeFileTodos('file1.ts');
181
+ const file2Result = await queryTodos({ file: 'file2.ts' });
182
+ expect(file2Result.todos.length).toBe(1);
183
+ expect(file2Result.todos[0]?.text).toBe('File 2 todo');
184
+ const file1Result = await queryTodos({ file: 'file1.ts' });
185
+ expect(file1Result.todos.length).toBe(0);
186
+ });
187
+ it('should handle removing non-existent file gracefully', async () => {
188
+ await expect(removeFileTodos('nonexistent.ts')).resolves.toBeUndefined();
189
+ });
190
+ });
191
+ describe('queryTodos', () => {
192
+ beforeEach(async () => {
193
+ await initDb(testDir);
194
+ await syncFileTodos('src/app.ts', [
195
+ { file: 'src/app.ts', tag: 'TODO', line: 10, ref: 'ref1', text: 'Implement feature A' },
196
+ { file: 'src/app.ts', tag: 'FIXME', line: 20, ref: '', text: 'Fix bug B' },
197
+ { file: 'src/app.ts', tag: 'TODO', line: 30, ref: 'ref2', text: 'Add tests' },
198
+ ]);
199
+ await syncFileTodos('src/utils.ts', [
200
+ { file: 'src/utils.ts', tag: 'TODO', line: 5, ref: '', text: 'Optimize function' },
201
+ { file: 'src/utils.ts', tag: 'HACK', line: 15, ref: 'hack1', text: 'Temporary workaround' },
202
+ ]);
203
+ await syncFileTodos('docs/README.md', [
204
+ { file: 'docs/README.md', tag: 'TODO', line: 1, ref: '', text: 'Update documentation' },
205
+ ]);
206
+ });
207
+ it('should query all todos with no filters', async () => {
208
+ const result = await queryTodos();
209
+ expect(result.total).toBe(6);
210
+ expect(result.todos.length).toBe(6);
211
+ });
212
+ it('should filter by tag', async () => {
213
+ const result = await queryTodos({ tag: 'TODO' });
214
+ expect(result.total).toBe(4);
215
+ expect(result.todos.length).toBe(4);
216
+ expect(result.todos.every((t) => t.tag === 'TODO')).toBe(true);
217
+ });
218
+ it('should filter by file with partial match', async () => {
219
+ const result = await queryTodos({ file: 'app' });
220
+ expect(result.total).toBe(3);
221
+ expect(result.todos.length).toBe(3);
222
+ expect(result.todos.every((t) => t.file === 'src/app.ts')).toBe(true);
223
+ });
224
+ it('should apply limit and offset', async () => {
225
+ const result1 = await queryTodos({ limit: 2, offset: 0 });
226
+ expect(result1.todos.length).toBe(2);
227
+ expect(result1.total).toBe(6);
228
+ const result2 = await queryTodos({ limit: 2, offset: 2 });
229
+ expect(result2.todos.length).toBe(2);
230
+ expect(result2.total).toBe(6);
231
+ const result3 = await queryTodos({ limit: 2, offset: 4 });
232
+ expect(result3.todos.length).toBe(2);
233
+ expect(result3.total).toBe(6);
234
+ const result4 = await queryTodos({ limit: 2, offset: 6 });
235
+ expect(result4.todos.length).toBe(0);
236
+ expect(result4.total).toBe(6);
237
+ });
238
+ it('should combine multiple filters', async () => {
239
+ const result = await queryTodos({ tag: 'TODO', file: 'src/', limit: 2 });
240
+ expect(result.total).toBe(3);
241
+ expect(result.todos.length).toBe(2);
242
+ expect(result.todos.every((t) => t.tag === 'TODO')).toBe(true);
243
+ expect(result.todos.every((t) => t.file.startsWith('src/'))).toBe(true);
244
+ });
245
+ it('should use default limit of 100', async () => {
246
+ const result = await queryTodos();
247
+ expect(result.todos.length).toBeLessThanOrEqual(100);
248
+ });
249
+ it('should return correct total count with filters', async () => {
250
+ const result = await queryTodos({ tag: 'FIXME' });
251
+ expect(result.total).toBe(1);
252
+ expect(result.todos.length).toBe(1);
253
+ expect(result.todos[0]?.tag).toBe('FIXME');
254
+ expect(result.todos[0]?.text).toBe('Fix bug B');
255
+ });
256
+ it('should return empty result for no matches', async () => {
257
+ const result = await queryTodos({ tag: 'NONEXISTENT' });
258
+ expect(result.total).toBe(0);
259
+ expect(result.todos.length).toBe(0);
260
+ });
261
+ });
262
+ describe('getTodoStats', () => {
263
+ beforeEach(async () => {
264
+ await initDb(testDir);
265
+ });
266
+ it('should return zero stats when no todos exist', async () => {
267
+ const stats = await getTodoStats();
268
+ expect(stats.total).toBe(0);
269
+ expect(stats.byTag).toEqual([]);
270
+ expect(stats.byFile).toEqual([]);
271
+ });
272
+ it('should calculate correct stats with multiple todos', async () => {
273
+ await syncFileTodos('file1.ts', [
274
+ { file: 'file1.ts', tag: 'TODO', line: 1, ref: '', text: 'Todo 1' },
275
+ { file: 'file1.ts', tag: 'TODO', line: 2, ref: '', text: 'Todo 2' },
276
+ { file: 'file1.ts', tag: 'FIXME', line: 3, ref: '', text: 'Fixme 1' },
277
+ ]);
278
+ await syncFileTodos('file2.ts', [
279
+ { file: 'file2.ts', tag: 'TODO', line: 1, ref: '', text: 'Todo 3' },
280
+ { file: 'file2.ts', tag: 'HACK', line: 2, ref: '', text: 'Hack 1' },
281
+ ]);
282
+ const stats = await getTodoStats();
283
+ expect(stats.total).toBe(5);
284
+ });
285
+ it('should aggregate by tag correctly', async () => {
286
+ await syncFileTodos('file1.ts', [
287
+ { file: 'file1.ts', tag: 'TODO', line: 1, ref: '', text: 'Todo 1' },
288
+ { file: 'file1.ts', tag: 'TODO', line: 2, ref: '', text: 'Todo 2' },
289
+ { file: 'file1.ts', tag: 'TODO', line: 3, ref: '', text: 'Todo 3' },
290
+ { file: 'file1.ts', tag: 'FIXME', line: 4, ref: '', text: 'Fixme 1' },
291
+ { file: 'file1.ts', tag: 'FIXME', line: 5, ref: '', text: 'Fixme 2' },
292
+ { file: 'file1.ts', tag: 'HACK', line: 6, ref: '', text: 'Hack 1' },
293
+ ]);
294
+ const stats = await getTodoStats();
295
+ expect(stats.byTag.length).toBe(3);
296
+ const todoTag = stats.byTag.find((t) => t.tag === 'TODO');
297
+ expect(todoTag?.count).toBe(3);
298
+ const fixmeTag = stats.byTag.find((t) => t.tag === 'FIXME');
299
+ expect(fixmeTag?.count).toBe(2);
300
+ const hackTag = stats.byTag.find((t) => t.tag === 'HACK');
301
+ expect(hackTag?.count).toBe(1);
302
+ expect(stats.byTag[0]?.count).toBeGreaterThanOrEqual(stats.byTag[1]?.count ?? 0);
303
+ });
304
+ it('should aggregate by file correctly', async () => {
305
+ await syncFileTodos('file1.ts', [
306
+ { file: 'file1.ts', tag: 'TODO', line: 1, ref: '', text: 'Todo 1' },
307
+ { file: 'file1.ts', tag: 'TODO', line: 2, ref: '', text: 'Todo 2' },
308
+ { file: 'file1.ts', tag: 'TODO', line: 3, ref: '', text: 'Todo 3' },
309
+ ]);
310
+ await syncFileTodos('file2.ts', [
311
+ { file: 'file2.ts', tag: 'TODO', line: 1, ref: '', text: 'Todo 4' },
312
+ { file: 'file2.ts', tag: 'TODO', line: 2, ref: '', text: 'Todo 5' },
313
+ ]);
314
+ await syncFileTodos('file3.ts', [
315
+ { file: 'file3.ts', tag: 'TODO', line: 1, ref: '', text: 'Todo 6' },
316
+ ]);
317
+ const stats = await getTodoStats();
318
+ expect(stats.byFile.length).toBe(3);
319
+ const file1 = stats.byFile.find((f) => f.file === 'file1.ts');
320
+ expect(file1?.count).toBe(3);
321
+ const file2 = stats.byFile.find((f) => f.file === 'file2.ts');
322
+ expect(file2?.count).toBe(2);
323
+ const file3 = stats.byFile.find((f) => f.file === 'file3.ts');
324
+ expect(file3?.count).toBe(1);
325
+ expect(stats.byFile[0]?.count).toBeGreaterThanOrEqual(stats.byFile[1]?.count ?? 0);
326
+ });
327
+ it('should limit byFile to 20 results', async () => {
328
+ for (let i = 1; i <= 25; i++) {
329
+ await syncFileTodos(`file${i}.ts`, [
330
+ { file: `file${i}.ts`, tag: 'TODO', line: 1, ref: '', text: `Todo ${i}` },
331
+ ]);
332
+ }
333
+ const stats = await getTodoStats();
334
+ expect(stats.total).toBe(25);
335
+ expect(stats.byFile.length).toBe(20);
336
+ });
337
+ });
338
+ });
339
+ //# sourceMappingURL=db.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.test.js","sourceRoot":"","sources":["../../tests/db.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EACL,MAAM,EACN,KAAK,EACL,aAAa,EACb,eAAe,EACf,UAAU,EACV,YAAY,GAEb,MAAM,kBAAkB,CAAC;AAG1B,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,OAAe,CAAC;IAEpB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzF,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;YAClD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;YAEnB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;YAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAE/C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACjC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACjC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;YACrC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;YAEnB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,wEAAwE,CAAC,CAAC;YAC1G,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAE1D,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;YAC/C,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAC9C,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,GAAG,GAAG,KAAK,EAAE,CAAC;YAEpB,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,GAAG,GAAG,KAAK,EAAE,CAAC;YAEpB,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;YAEnB,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClH,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE7C,MAAM,CAAC,GAAG,EAAE;gBACV,IAAI,CAAC;oBACH,KAAK,EAAE,CAAC;gBACV,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;oBACrE,MAAM,GAAG,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAEjB,MAAM,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,KAAK,GAAe;gBACxB,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;gBACtE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE;aAC/E,CAAC;YAEF,MAAM,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAEtC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,YAAY,GAAe;gBAC/B,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;aACrE,CAAC;YACF,MAAM,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YAE7C,MAAM,QAAQ,GAAe;gBAC3B,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;gBACtE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;aACvE,CAAC;YACF,MAAM,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEzC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,KAAK,GAAe;gBACxB,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;aAC3E,CAAC;YACF,MAAM,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAEtC,MAAM,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAEnC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,UAAU,GAAe;gBAC7B,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;aACvE,CAAC;YACF,MAAM,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YAE3C,MAAM,YAAY,GAAe;gBAC/B,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;gBACjE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;aAC3E,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YAC/C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5B,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,UAAU,GAAe;gBAC7B,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;aACzE,CAAC;YACF,MAAM,UAAU,GAAe;gBAC7B,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;aACzE,CAAC;YAEF,MAAM,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC5C,MAAM,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAE5C,MAAM,aAAa,CAAC,UAAU,EAAE;gBAC9B,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;aAC7E,CAAC,CAAC;YAEH,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAC3D,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,KAAK,GAAe;gBACxB,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;gBAC1E,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;aAC1E,CAAC;YACF,MAAM,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAEtC,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;YAEjC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,UAAU,GAAe;gBAC7B,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;aACzE,CAAC;YACF,MAAM,UAAU,GAAe;gBAC7B,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;aACzE,CAAC;YAEF,MAAM,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC5C,MAAM,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAE5C,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;YAElC,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAC3D,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAEvD,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAC3D,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,MAAM,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC3E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YAEtB,MAAM,aAAa,CAAC,YAAY,EAAE;gBAChC,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE;gBACvF,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;gBAC1E,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE;aAC9E,CAAC,CAAC;YAEH,MAAM,aAAa,CAAC,cAAc,EAAE;gBAClC,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE;gBAClF,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE;aAC5F,CAAC,CAAC;YAEH,MAAM,aAAa,CAAC,gBAAgB,EAAE;gBACpC,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE;aACxF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAElC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;YACpC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YAEjD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAEjD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE9B,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE9B,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE9B,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAEzE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YAElD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC;YAExD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;YAEnC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,aAAa,CAAC,UAAU,EAAE;gBAC9B,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACnE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACnE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;aACtE,CAAC,CAAC;YAEH,MAAM,aAAa,CAAC,UAAU,EAAE;gBAC9B,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACnE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aACpE,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;YAEnC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,aAAa,CAAC,UAAU,EAAE;gBAC9B,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACnE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACnE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACnE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gBACrE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gBACrE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aACpE,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;YAEnC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEnC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;YAC1D,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE/B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC;YAC5D,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEhC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;YAC1D,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE/B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,aAAa,CAAC,UAAU,EAAE;gBAC9B,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACnE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACnE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aACpE,CAAC,CAAC;YAEH,MAAM,aAAa,CAAC,UAAU,EAAE;gBAC9B,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACnE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aACpE,CAAC,CAAC;YAEH,MAAM,aAAa,CAAC,UAAU,EAAE;gBAC9B,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aACpE,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;YAEnC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEpC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;YAC9D,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE7B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;YAC9D,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE7B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;YAC9D,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE7B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7B,MAAM,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE;oBACjC,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE;iBAC1E,CAAC,CAAC;YACL,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;YAEnC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../tests/mcp/index.test.ts"],"names":[],"mappings":""}