@cosmocoder/mcp-web-docs 1.0.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 (240) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +368 -0
  3. package/build/__mocks__/embeddings.d.ts +17 -0
  4. package/build/__mocks__/embeddings.js +66 -0
  5. package/build/__mocks__/embeddings.js.map +1 -0
  6. package/build/config.d.ts +44 -0
  7. package/build/config.js +158 -0
  8. package/build/config.js.map +1 -0
  9. package/build/config.test.d.ts +1 -0
  10. package/build/config.test.js +165 -0
  11. package/build/config.test.js.map +1 -0
  12. package/build/crawler/auth.d.ts +128 -0
  13. package/build/crawler/auth.js +546 -0
  14. package/build/crawler/auth.js.map +1 -0
  15. package/build/crawler/auth.test.d.ts +1 -0
  16. package/build/crawler/auth.test.js +174 -0
  17. package/build/crawler/auth.test.js.map +1 -0
  18. package/build/crawler/base.d.ts +24 -0
  19. package/build/crawler/base.js +149 -0
  20. package/build/crawler/base.js.map +1 -0
  21. package/build/crawler/base.test.d.ts +1 -0
  22. package/build/crawler/base.test.js +234 -0
  23. package/build/crawler/base.test.js.map +1 -0
  24. package/build/crawler/browser-config.d.ts +2 -0
  25. package/build/crawler/browser-config.js +29 -0
  26. package/build/crawler/browser-config.js.map +1 -0
  27. package/build/crawler/browser-config.test.d.ts +1 -0
  28. package/build/crawler/browser-config.test.js +56 -0
  29. package/build/crawler/browser-config.test.js.map +1 -0
  30. package/build/crawler/cheerio.d.ts +11 -0
  31. package/build/crawler/cheerio.js +134 -0
  32. package/build/crawler/cheerio.js.map +1 -0
  33. package/build/crawler/chromium.d.ts +21 -0
  34. package/build/crawler/chromium.js +596 -0
  35. package/build/crawler/chromium.js.map +1 -0
  36. package/build/crawler/content-extractor-types.d.ts +25 -0
  37. package/build/crawler/content-extractor-types.js +2 -0
  38. package/build/crawler/content-extractor-types.js.map +1 -0
  39. package/build/crawler/content-extractors.d.ts +9 -0
  40. package/build/crawler/content-extractors.js +9 -0
  41. package/build/crawler/content-extractors.js.map +1 -0
  42. package/build/crawler/content-utils.d.ts +2 -0
  43. package/build/crawler/content-utils.js +22 -0
  44. package/build/crawler/content-utils.js.map +1 -0
  45. package/build/crawler/content-utils.test.d.ts +1 -0
  46. package/build/crawler/content-utils.test.js +99 -0
  47. package/build/crawler/content-utils.test.js.map +1 -0
  48. package/build/crawler/crawlee-crawler.d.ts +63 -0
  49. package/build/crawler/crawlee-crawler.js +342 -0
  50. package/build/crawler/crawlee-crawler.js.map +1 -0
  51. package/build/crawler/crawlee-crawler.test.d.ts +1 -0
  52. package/build/crawler/crawlee-crawler.test.js +280 -0
  53. package/build/crawler/crawlee-crawler.test.js.map +1 -0
  54. package/build/crawler/default-extractor.d.ts +4 -0
  55. package/build/crawler/default-extractor.js +26 -0
  56. package/build/crawler/default-extractor.js.map +1 -0
  57. package/build/crawler/default-extractor.test.d.ts +1 -0
  58. package/build/crawler/default-extractor.test.js +200 -0
  59. package/build/crawler/default-extractor.test.js.map +1 -0
  60. package/build/crawler/default.d.ts +11 -0
  61. package/build/crawler/default.js +138 -0
  62. package/build/crawler/default.js.map +1 -0
  63. package/build/crawler/docs-crawler.d.ts +26 -0
  64. package/build/crawler/docs-crawler.js +97 -0
  65. package/build/crawler/docs-crawler.js.map +1 -0
  66. package/build/crawler/docs-crawler.test.d.ts +1 -0
  67. package/build/crawler/docs-crawler.test.js +185 -0
  68. package/build/crawler/docs-crawler.test.js.map +1 -0
  69. package/build/crawler/factory.d.ts +6 -0
  70. package/build/crawler/factory.js +83 -0
  71. package/build/crawler/factory.js.map +1 -0
  72. package/build/crawler/github-pages-extractor.d.ts +4 -0
  73. package/build/crawler/github-pages-extractor.js +33 -0
  74. package/build/crawler/github-pages-extractor.js.map +1 -0
  75. package/build/crawler/github-pages-extractor.test.d.ts +1 -0
  76. package/build/crawler/github-pages-extractor.test.js +184 -0
  77. package/build/crawler/github-pages-extractor.test.js.map +1 -0
  78. package/build/crawler/github.d.ts +20 -0
  79. package/build/crawler/github.js +181 -0
  80. package/build/crawler/github.js.map +1 -0
  81. package/build/crawler/github.test.d.ts +1 -0
  82. package/build/crawler/github.test.js +326 -0
  83. package/build/crawler/github.test.js.map +1 -0
  84. package/build/crawler/puppeteer.d.ts +16 -0
  85. package/build/crawler/puppeteer.js +191 -0
  86. package/build/crawler/puppeteer.js.map +1 -0
  87. package/build/crawler/queue-manager.d.ts +43 -0
  88. package/build/crawler/queue-manager.js +169 -0
  89. package/build/crawler/queue-manager.js.map +1 -0
  90. package/build/crawler/queue-manager.test.d.ts +1 -0
  91. package/build/crawler/queue-manager.test.js +509 -0
  92. package/build/crawler/queue-manager.test.js.map +1 -0
  93. package/build/crawler/site-rules.d.ts +11 -0
  94. package/build/crawler/site-rules.js +104 -0
  95. package/build/crawler/site-rules.js.map +1 -0
  96. package/build/crawler/site-rules.test.d.ts +1 -0
  97. package/build/crawler/site-rules.test.js +139 -0
  98. package/build/crawler/site-rules.test.js.map +1 -0
  99. package/build/crawler/storybook-extractor.d.ts +34 -0
  100. package/build/crawler/storybook-extractor.js +767 -0
  101. package/build/crawler/storybook-extractor.js.map +1 -0
  102. package/build/crawler/storybook-extractor.test.d.ts +1 -0
  103. package/build/crawler/storybook-extractor.test.js +491 -0
  104. package/build/crawler/storybook-extractor.test.js.map +1 -0
  105. package/build/embeddings/fastembed.d.ts +25 -0
  106. package/build/embeddings/fastembed.js +188 -0
  107. package/build/embeddings/fastembed.js.map +1 -0
  108. package/build/embeddings/fastembed.test.d.ts +1 -0
  109. package/build/embeddings/fastembed.test.js +307 -0
  110. package/build/embeddings/fastembed.test.js.map +1 -0
  111. package/build/embeddings/openai.d.ts +8 -0
  112. package/build/embeddings/openai.js +56 -0
  113. package/build/embeddings/openai.js.map +1 -0
  114. package/build/embeddings/types.d.ts +4 -0
  115. package/build/embeddings/types.js +2 -0
  116. package/build/embeddings/types.js.map +1 -0
  117. package/build/index.d.ts +2 -0
  118. package/build/index.js +1007 -0
  119. package/build/index.js.map +1 -0
  120. package/build/index.test.d.ts +1 -0
  121. package/build/index.test.js +364 -0
  122. package/build/index.test.js.map +1 -0
  123. package/build/indexing/queue-manager.d.ts +36 -0
  124. package/build/indexing/queue-manager.js +86 -0
  125. package/build/indexing/queue-manager.js.map +1 -0
  126. package/build/indexing/queue-manager.test.d.ts +1 -0
  127. package/build/indexing/queue-manager.test.js +257 -0
  128. package/build/indexing/queue-manager.test.js.map +1 -0
  129. package/build/indexing/status.d.ts +39 -0
  130. package/build/indexing/status.js +207 -0
  131. package/build/indexing/status.js.map +1 -0
  132. package/build/indexing/status.test.d.ts +1 -0
  133. package/build/indexing/status.test.js +246 -0
  134. package/build/indexing/status.test.js.map +1 -0
  135. package/build/processor/content.d.ts +16 -0
  136. package/build/processor/content.js +286 -0
  137. package/build/processor/content.js.map +1 -0
  138. package/build/processor/content.test.d.ts +1 -0
  139. package/build/processor/content.test.js +369 -0
  140. package/build/processor/content.test.js.map +1 -0
  141. package/build/processor/markdown.d.ts +11 -0
  142. package/build/processor/markdown.js +256 -0
  143. package/build/processor/markdown.js.map +1 -0
  144. package/build/processor/markdown.test.d.ts +1 -0
  145. package/build/processor/markdown.test.js +312 -0
  146. package/build/processor/markdown.test.js.map +1 -0
  147. package/build/processor/metadata-parser.d.ts +37 -0
  148. package/build/processor/metadata-parser.js +245 -0
  149. package/build/processor/metadata-parser.js.map +1 -0
  150. package/build/processor/metadata-parser.test.d.ts +1 -0
  151. package/build/processor/metadata-parser.test.js +357 -0
  152. package/build/processor/metadata-parser.test.js.map +1 -0
  153. package/build/processor/processor.d.ts +8 -0
  154. package/build/processor/processor.js +190 -0
  155. package/build/processor/processor.js.map +1 -0
  156. package/build/processor/processor.test.d.ts +1 -0
  157. package/build/processor/processor.test.js +357 -0
  158. package/build/processor/processor.test.js.map +1 -0
  159. package/build/rag/cache.d.ts +10 -0
  160. package/build/rag/cache.js +10 -0
  161. package/build/rag/cache.js.map +1 -0
  162. package/build/rag/code-generator.d.ts +11 -0
  163. package/build/rag/code-generator.js +30 -0
  164. package/build/rag/code-generator.js.map +1 -0
  165. package/build/rag/context-assembler.d.ts +23 -0
  166. package/build/rag/context-assembler.js +113 -0
  167. package/build/rag/context-assembler.js.map +1 -0
  168. package/build/rag/docs-search.d.ts +55 -0
  169. package/build/rag/docs-search.js +380 -0
  170. package/build/rag/docs-search.js.map +1 -0
  171. package/build/rag/pipeline.d.ts +26 -0
  172. package/build/rag/pipeline.js +91 -0
  173. package/build/rag/pipeline.js.map +1 -0
  174. package/build/rag/query-processor.d.ts +14 -0
  175. package/build/rag/query-processor.js +57 -0
  176. package/build/rag/query-processor.js.map +1 -0
  177. package/build/rag/reranker.d.ts +55 -0
  178. package/build/rag/reranker.js +210 -0
  179. package/build/rag/reranker.js.map +1 -0
  180. package/build/rag/response-generator.d.ts +20 -0
  181. package/build/rag/response-generator.js +101 -0
  182. package/build/rag/response-generator.js.map +1 -0
  183. package/build/rag/retriever.d.ts +19 -0
  184. package/build/rag/retriever.js +111 -0
  185. package/build/rag/retriever.js.map +1 -0
  186. package/build/rag/validator.d.ts +22 -0
  187. package/build/rag/validator.js +128 -0
  188. package/build/rag/validator.js.map +1 -0
  189. package/build/rag/version-manager.d.ts +23 -0
  190. package/build/rag/version-manager.js +98 -0
  191. package/build/rag/version-manager.js.map +1 -0
  192. package/build/setupTests.d.ts +4 -0
  193. package/build/setupTests.js +50 -0
  194. package/build/setupTests.js.map +1 -0
  195. package/build/storage/storage.d.ts +38 -0
  196. package/build/storage/storage.js +700 -0
  197. package/build/storage/storage.js.map +1 -0
  198. package/build/storage/storage.test.d.ts +1 -0
  199. package/build/storage/storage.test.js +338 -0
  200. package/build/storage/storage.test.js.map +1 -0
  201. package/build/types/rag.d.ts +27 -0
  202. package/build/types/rag.js +2 -0
  203. package/build/types/rag.js.map +1 -0
  204. package/build/types.d.ts +120 -0
  205. package/build/types.js +2 -0
  206. package/build/types.js.map +1 -0
  207. package/build/util/content-utils.d.ts +31 -0
  208. package/build/util/content-utils.js +120 -0
  209. package/build/util/content-utils.js.map +1 -0
  210. package/build/util/content.d.ts +1 -0
  211. package/build/util/content.js +16 -0
  212. package/build/util/content.js.map +1 -0
  213. package/build/util/docs.d.ts +1 -0
  214. package/build/util/docs.js +26 -0
  215. package/build/util/docs.js.map +1 -0
  216. package/build/util/docs.test.d.ts +1 -0
  217. package/build/util/docs.test.js +49 -0
  218. package/build/util/docs.test.js.map +1 -0
  219. package/build/util/favicon.d.ts +6 -0
  220. package/build/util/favicon.js +88 -0
  221. package/build/util/favicon.js.map +1 -0
  222. package/build/util/favicon.test.d.ts +1 -0
  223. package/build/util/favicon.test.js +140 -0
  224. package/build/util/favicon.test.js.map +1 -0
  225. package/build/util/logger.d.ts +17 -0
  226. package/build/util/logger.js +72 -0
  227. package/build/util/logger.js.map +1 -0
  228. package/build/util/logger.test.d.ts +1 -0
  229. package/build/util/logger.test.js +46 -0
  230. package/build/util/logger.test.js.map +1 -0
  231. package/build/util/security.d.ts +312 -0
  232. package/build/util/security.js +719 -0
  233. package/build/util/security.js.map +1 -0
  234. package/build/util/security.test.d.ts +1 -0
  235. package/build/util/security.test.js +524 -0
  236. package/build/util/security.test.js.map +1 -0
  237. package/build/util/site-detector.d.ts +22 -0
  238. package/build/util/site-detector.js +42 -0
  239. package/build/util/site-detector.js.map +1 -0
  240. package/package.json +112 -0
@@ -0,0 +1,257 @@
1
+ import { IndexingQueueManager } from './queue-manager.js';
2
+ describe('IndexingQueueManager', () => {
3
+ let queue;
4
+ beforeEach(() => {
5
+ queue = new IndexingQueueManager();
6
+ });
7
+ describe('startOperation', () => {
8
+ it('should return an AbortController for new operations', async () => {
9
+ const controller = await queue.startOperation('https://example.com');
10
+ expect(controller).toBeDefined();
11
+ expect(controller).toBeInstanceOf(AbortController);
12
+ expect(controller.signal.aborted).toBe(false);
13
+ });
14
+ it('should normalize URLs when starting operations', async () => {
15
+ const controller = await queue.startOperation('https://example.com/');
16
+ // Register the operation to verify normalization works
17
+ const mockPromise = new Promise((resolve) => setTimeout(resolve, 100));
18
+ queue.registerOperation('https://example.com/', controller, mockPromise);
19
+ // Should find it with or without trailing slash
20
+ expect(queue.isIndexing('https://example.com')).toBe(true);
21
+ expect(queue.isIndexing('https://example.com/')).toBe(true);
22
+ queue.completeOperation('https://example.com');
23
+ });
24
+ it('should cancel existing operation when starting new one for same URL', async () => {
25
+ // Start first operation
26
+ const controller1 = await queue.startOperation('https://example.com');
27
+ const mockPromise1 = new Promise((_resolve, reject) => {
28
+ controller1.signal.addEventListener('abort', () => reject(new Error('Aborted')));
29
+ });
30
+ queue.registerOperation('https://example.com', controller1, mockPromise1);
31
+ // Start second operation for same URL - should cancel first
32
+ const controller2 = await queue.startOperation('https://example.com');
33
+ expect(controller1.signal.aborted).toBe(true);
34
+ expect(controller2.signal.aborted).toBe(false);
35
+ queue.completeOperation('https://example.com');
36
+ });
37
+ it('should not affect operations for different URLs', async () => {
38
+ const controller1 = await queue.startOperation('https://example.com');
39
+ const mockPromise1 = new Promise((resolve) => setTimeout(resolve, 1000));
40
+ queue.registerOperation('https://example.com', controller1, mockPromise1);
41
+ const controller2 = await queue.startOperation('https://other.com');
42
+ const mockPromise2 = new Promise((resolve) => setTimeout(resolve, 1000));
43
+ queue.registerOperation('https://other.com', controller2, mockPromise2);
44
+ // Both should be active
45
+ expect(controller1.signal.aborted).toBe(false);
46
+ expect(controller2.signal.aborted).toBe(false);
47
+ expect(queue.isIndexing('https://example.com')).toBe(true);
48
+ expect(queue.isIndexing('https://other.com')).toBe(true);
49
+ queue.completeOperation('https://example.com');
50
+ queue.completeOperation('https://other.com');
51
+ });
52
+ it('should handle cancellation timeout gracefully', async () => {
53
+ vi.useFakeTimers();
54
+ // Start operation that never resolves
55
+ const controller1 = await queue.startOperation('https://example.com');
56
+ const neverResolves = new Promise(() => {
57
+ // This promise never resolves
58
+ });
59
+ queue.registerOperation('https://example.com', controller1, neverResolves);
60
+ // Start new operation - should timeout waiting for cancellation
61
+ const startPromise = queue.startOperation('https://example.com');
62
+ // Advance timers past the 5000ms timeout
63
+ await vi.advanceTimersByTimeAsync(5100);
64
+ const controller2 = await startPromise;
65
+ // Should have returned a new controller after timeout
66
+ expect(controller2).toBeDefined();
67
+ expect(controller2.signal.aborted).toBe(false);
68
+ queue.completeOperation('https://example.com');
69
+ vi.useRealTimers();
70
+ });
71
+ });
72
+ describe('registerOperation', () => {
73
+ it('should register an operation', async () => {
74
+ const controller = await queue.startOperation('https://example.com');
75
+ const mockPromise = new Promise((resolve) => setTimeout(resolve, 100));
76
+ queue.registerOperation('https://example.com', controller, mockPromise);
77
+ expect(queue.isIndexing('https://example.com')).toBe(true);
78
+ queue.completeOperation('https://example.com');
79
+ });
80
+ it('should store operation with correct metadata', async () => {
81
+ const controller = await queue.startOperation('https://example.com');
82
+ const mockPromise = new Promise((resolve) => setTimeout(resolve, 100));
83
+ const beforeRegister = new Date();
84
+ queue.registerOperation('https://example.com', controller, mockPromise);
85
+ const afterRegister = new Date();
86
+ const operations = queue.getActiveOperations();
87
+ expect(operations).toHaveLength(1);
88
+ expect(operations[0].url).toBe('https://example.com');
89
+ expect(operations[0].startedAt.getTime()).toBeGreaterThanOrEqual(beforeRegister.getTime());
90
+ expect(operations[0].startedAt.getTime()).toBeLessThanOrEqual(afterRegister.getTime());
91
+ queue.completeOperation('https://example.com');
92
+ });
93
+ it('should normalize URL when registering', async () => {
94
+ const controller = await queue.startOperation('https://example.com/');
95
+ const mockPromise = new Promise((resolve) => setTimeout(resolve, 100));
96
+ queue.registerOperation('https://example.com/', controller, mockPromise);
97
+ // Should be findable with normalized URL
98
+ expect(queue.isIndexing('https://example.com')).toBe(true);
99
+ queue.completeOperation('https://example.com');
100
+ });
101
+ });
102
+ describe('completeOperation', () => {
103
+ it('should remove operation from active map', async () => {
104
+ const controller = await queue.startOperation('https://example.com');
105
+ const mockPromise = new Promise((resolve) => setTimeout(resolve, 100));
106
+ queue.registerOperation('https://example.com', controller, mockPromise);
107
+ expect(queue.isIndexing('https://example.com')).toBe(true);
108
+ queue.completeOperation('https://example.com');
109
+ expect(queue.isIndexing('https://example.com')).toBe(false);
110
+ });
111
+ it('should handle completing non-existent operation gracefully', () => {
112
+ // Should not throw
113
+ expect(() => queue.completeOperation('https://nonexistent.com')).not.toThrow();
114
+ });
115
+ it('should normalize URL when completing', async () => {
116
+ const controller = await queue.startOperation('https://example.com');
117
+ const mockPromise = new Promise((resolve) => setTimeout(resolve, 100));
118
+ queue.registerOperation('https://example.com', controller, mockPromise);
119
+ // Complete with trailing slash
120
+ queue.completeOperation('https://example.com/');
121
+ expect(queue.isIndexing('https://example.com')).toBe(false);
122
+ });
123
+ });
124
+ describe('cancelAll', () => {
125
+ it('should cancel all active operations', async () => {
126
+ const controller1 = await queue.startOperation('https://example1.com');
127
+ const mockPromise1 = new Promise((resolve) => {
128
+ controller1.signal.addEventListener('abort', () => resolve());
129
+ });
130
+ queue.registerOperation('https://example1.com', controller1, mockPromise1);
131
+ const controller2 = await queue.startOperation('https://example2.com');
132
+ const mockPromise2 = new Promise((resolve) => {
133
+ controller2.signal.addEventListener('abort', () => resolve());
134
+ });
135
+ queue.registerOperation('https://example2.com', controller2, mockPromise2);
136
+ expect(queue.getActiveOperations()).toHaveLength(2);
137
+ await queue.cancelAll();
138
+ expect(controller1.signal.aborted).toBe(true);
139
+ expect(controller2.signal.aborted).toBe(true);
140
+ expect(queue.getActiveOperations()).toHaveLength(0);
141
+ });
142
+ it('should handle empty queue', async () => {
143
+ await expect(queue.cancelAll()).resolves.not.toThrow();
144
+ expect(queue.getActiveOperations()).toHaveLength(0);
145
+ });
146
+ it('should handle operations that reject on cancel', async () => {
147
+ const controller = await queue.startOperation('https://example.com');
148
+ const mockPromise = new Promise((_, reject) => {
149
+ controller.signal.addEventListener('abort', () => reject(new Error('Cancelled')));
150
+ });
151
+ queue.registerOperation('https://example.com', controller, mockPromise);
152
+ // Should not throw even if promises reject
153
+ await expect(queue.cancelAll()).resolves.not.toThrow();
154
+ expect(queue.getActiveOperations()).toHaveLength(0);
155
+ });
156
+ });
157
+ describe('isIndexing', () => {
158
+ it('should return false for URLs not being indexed', () => {
159
+ expect(queue.isIndexing('https://example.com')).toBe(false);
160
+ });
161
+ it('should return true for URLs being indexed', async () => {
162
+ const controller = await queue.startOperation('https://example.com');
163
+ const mockPromise = new Promise((resolve) => setTimeout(resolve, 100));
164
+ queue.registerOperation('https://example.com', controller, mockPromise);
165
+ expect(queue.isIndexing('https://example.com')).toBe(true);
166
+ queue.completeOperation('https://example.com');
167
+ });
168
+ it('should return false after operation completes', async () => {
169
+ const controller = await queue.startOperation('https://example.com');
170
+ const mockPromise = new Promise((resolve) => setTimeout(resolve, 100));
171
+ queue.registerOperation('https://example.com', controller, mockPromise);
172
+ queue.completeOperation('https://example.com');
173
+ expect(queue.isIndexing('https://example.com')).toBe(false);
174
+ });
175
+ it('should normalize URL when checking', async () => {
176
+ const controller = await queue.startOperation('https://example.com');
177
+ const mockPromise = new Promise((resolve) => setTimeout(resolve, 100));
178
+ queue.registerOperation('https://example.com', controller, mockPromise);
179
+ // Check with trailing slash
180
+ expect(queue.isIndexing('https://example.com/')).toBe(true);
181
+ queue.completeOperation('https://example.com');
182
+ });
183
+ });
184
+ describe('getActiveOperations', () => {
185
+ it('should return empty array when no operations', () => {
186
+ expect(queue.getActiveOperations()).toEqual([]);
187
+ });
188
+ it('should return all active operations', async () => {
189
+ const controller1 = await queue.startOperation('https://example1.com');
190
+ const mockPromise1 = new Promise((resolve) => setTimeout(resolve, 100));
191
+ queue.registerOperation('https://example1.com', controller1, mockPromise1);
192
+ const controller2 = await queue.startOperation('https://example2.com');
193
+ const mockPromise2 = new Promise((resolve) => setTimeout(resolve, 100));
194
+ queue.registerOperation('https://example2.com', controller2, mockPromise2);
195
+ const operations = queue.getActiveOperations();
196
+ expect(operations).toHaveLength(2);
197
+ const urls = operations.map((op) => op.url);
198
+ expect(urls).toContain('https://example1.com');
199
+ expect(urls).toContain('https://example2.com');
200
+ queue.completeOperation('https://example1.com');
201
+ queue.completeOperation('https://example2.com');
202
+ });
203
+ it('should return operation metadata', async () => {
204
+ const controller = await queue.startOperation('https://example.com');
205
+ const mockPromise = new Promise((resolve) => setTimeout(resolve, 100));
206
+ queue.registerOperation('https://example.com', controller, mockPromise);
207
+ const operations = queue.getActiveOperations();
208
+ expect(operations[0]).toHaveProperty('url');
209
+ expect(operations[0]).toHaveProperty('startedAt');
210
+ expect(operations[0].startedAt).toBeInstanceOf(Date);
211
+ queue.completeOperation('https://example.com');
212
+ });
213
+ it('should not include completed operations', async () => {
214
+ const controller = await queue.startOperation('https://example.com');
215
+ const mockPromise = new Promise((resolve) => setTimeout(resolve, 100));
216
+ queue.registerOperation('https://example.com', controller, mockPromise);
217
+ queue.completeOperation('https://example.com');
218
+ expect(queue.getActiveOperations()).toHaveLength(0);
219
+ });
220
+ });
221
+ describe('concurrent operations', () => {
222
+ it('should handle multiple concurrent operations for different URLs', async () => {
223
+ const urls = ['https://a.com', 'https://b.com', 'https://c.com'];
224
+ const controllers = [];
225
+ for (const url of urls) {
226
+ const controller = await queue.startOperation(url);
227
+ const mockPromise = new Promise((resolve) => setTimeout(resolve, 100));
228
+ queue.registerOperation(url, controller, mockPromise);
229
+ controllers.push(controller);
230
+ }
231
+ expect(queue.getActiveOperations()).toHaveLength(3);
232
+ // All should be active
233
+ for (const controller of controllers) {
234
+ expect(controller.signal.aborted).toBe(false);
235
+ }
236
+ // Complete one
237
+ queue.completeOperation('https://b.com');
238
+ expect(queue.getActiveOperations()).toHaveLength(2);
239
+ expect(queue.isIndexing('https://a.com')).toBe(true);
240
+ expect(queue.isIndexing('https://b.com')).toBe(false);
241
+ expect(queue.isIndexing('https://c.com')).toBe(true);
242
+ queue.completeOperation('https://a.com');
243
+ queue.completeOperation('https://c.com');
244
+ });
245
+ it('should handle rapid start/complete cycles', async () => {
246
+ for (let i = 0; i < 10; i++) {
247
+ const controller = await queue.startOperation('https://example.com');
248
+ const mockPromise = Promise.resolve();
249
+ queue.registerOperation('https://example.com', controller, mockPromise);
250
+ queue.completeOperation('https://example.com');
251
+ }
252
+ expect(queue.isIndexing('https://example.com')).toBe(false);
253
+ expect(queue.getActiveOperations()).toHaveLength(0);
254
+ });
255
+ });
256
+ });
257
+ //# sourceMappingURL=queue-manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-manager.test.js","sourceRoot":"","sources":["../../src/indexing/queue-manager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { IndexingStatus } from '../types.js';
2
+ export declare class IndexingStatusTracker {
3
+ private multibar;
4
+ private bars;
5
+ private statuses;
6
+ private statusListeners;
7
+ /** Tracks when statuses completed for auto-cleanup */
8
+ private completedAt;
9
+ constructor();
10
+ addStatusListener(listener: (status: IndexingStatus) => void): void;
11
+ private notifyListeners;
12
+ startIndexing(id: string, url: string, title: string): void;
13
+ updateStats(id: string, stats: {
14
+ pagesFound?: number;
15
+ pagesProcessed?: number;
16
+ chunksCreated?: number;
17
+ }): void;
18
+ updateProgress(id: string, progress: number, description: string): void;
19
+ failIndexing(id: string, error: string): void;
20
+ completeIndexing(id: string): void;
21
+ abortIndexing(id: string): void;
22
+ cancelIndexing(id: string): void;
23
+ getStatus(id: string): IndexingStatus | undefined;
24
+ /**
25
+ * Get all statuses (for debugging/internal use)
26
+ */
27
+ getAllStatuses(): IndexingStatus[];
28
+ /**
29
+ * Get only active indexing operations and recently completed ones.
30
+ * Completed statuses are automatically cleaned up after TTL expires.
31
+ * This is the primary method for the get_indexing_status tool.
32
+ */
33
+ getActiveStatuses(): IndexingStatus[];
34
+ /**
35
+ * Remove statuses that completed more than TTL ago
36
+ */
37
+ private cleanupOldStatuses;
38
+ stop(): void;
39
+ }
@@ -0,0 +1,207 @@
1
+ import { MultiBar } from 'cli-progress';
2
+ /** How long to keep completed/failed statuses before auto-cleanup (2 minutes) */
3
+ const COMPLETED_STATUS_TTL_MS = 2 * 60 * 1000;
4
+ export class IndexingStatusTracker {
5
+ multibar;
6
+ bars;
7
+ statuses;
8
+ statusListeners;
9
+ /** Tracks when statuses completed for auto-cleanup */
10
+ completedAt;
11
+ constructor() {
12
+ this.multibar = new MultiBar({
13
+ format: '{title} [{bar}] {percentage}% | {value}/{total} | {status}',
14
+ hideCursor: true,
15
+ clearOnComplete: false,
16
+ stopOnComplete: true,
17
+ });
18
+ this.bars = new Map();
19
+ this.statuses = new Map();
20
+ this.statusListeners = [];
21
+ this.completedAt = new Map();
22
+ }
23
+ addStatusListener(listener) {
24
+ this.statusListeners.push(listener);
25
+ }
26
+ notifyListeners(status) {
27
+ this.statusListeners.forEach((listener) => listener(status));
28
+ }
29
+ startIndexing(id, url, title) {
30
+ const status = {
31
+ id,
32
+ url,
33
+ title,
34
+ status: 'indexing',
35
+ progress: 0,
36
+ description: 'Starting indexing...',
37
+ startedAt: new Date(),
38
+ pagesFound: 0,
39
+ pagesProcessed: 0,
40
+ chunksCreated: 0,
41
+ };
42
+ const bar = this.multibar.create(100, 0, {
43
+ title: title.slice(0, 30).padEnd(30),
44
+ status: 'Starting...',
45
+ });
46
+ this.bars.set(id, bar);
47
+ this.statuses.set(id, status);
48
+ this.notifyListeners(status);
49
+ }
50
+ updateStats(id, stats) {
51
+ const currentStatus = this.statuses.get(id);
52
+ if (!currentStatus)
53
+ return;
54
+ const status = {
55
+ ...currentStatus,
56
+ pagesFound: stats.pagesFound ?? currentStatus.pagesFound,
57
+ pagesProcessed: stats.pagesProcessed ?? currentStatus.pagesProcessed,
58
+ chunksCreated: stats.chunksCreated ?? currentStatus.chunksCreated,
59
+ };
60
+ this.statuses.set(id, status);
61
+ this.notifyListeners(status);
62
+ }
63
+ updateProgress(id, progress, description) {
64
+ const bar = this.bars.get(id);
65
+ const currentStatus = this.statuses.get(id);
66
+ if (!bar || !currentStatus) {
67
+ return;
68
+ }
69
+ const progressValue = Math.min(Math.round(progress * 100), 100);
70
+ bar.update(progressValue, {
71
+ status: description,
72
+ });
73
+ const status = {
74
+ ...currentStatus,
75
+ progress,
76
+ description,
77
+ status: currentStatus.status === 'complete' ? 'complete' : 'indexing',
78
+ };
79
+ this.statuses.set(id, status);
80
+ this.notifyListeners(status);
81
+ }
82
+ failIndexing(id, error) {
83
+ const bar = this.bars.get(id);
84
+ const currentStatus = this.statuses.get(id);
85
+ if (!bar || !currentStatus) {
86
+ return;
87
+ }
88
+ bar.update(100, {
89
+ status: `Failed: ${error}`,
90
+ });
91
+ const status = {
92
+ ...currentStatus,
93
+ status: 'failed',
94
+ progress: 1,
95
+ description: error,
96
+ error,
97
+ };
98
+ this.statuses.set(id, status);
99
+ this.completedAt.set(id, new Date());
100
+ this.notifyListeners(status);
101
+ }
102
+ completeIndexing(id) {
103
+ const bar = this.bars.get(id);
104
+ const currentStatus = this.statuses.get(id);
105
+ if (!bar || !currentStatus) {
106
+ return;
107
+ }
108
+ bar.update(100, {
109
+ status: 'Complete',
110
+ });
111
+ const status = {
112
+ ...currentStatus,
113
+ status: 'complete',
114
+ progress: 1,
115
+ description: 'Indexing complete',
116
+ };
117
+ this.statuses.set(id, status);
118
+ this.completedAt.set(id, new Date());
119
+ this.notifyListeners(status);
120
+ }
121
+ abortIndexing(id) {
122
+ const bar = this.bars.get(id);
123
+ const currentStatus = this.statuses.get(id);
124
+ if (!bar || !currentStatus) {
125
+ return;
126
+ }
127
+ bar.update(100, {
128
+ status: 'Aborted',
129
+ });
130
+ const status = {
131
+ ...currentStatus,
132
+ status: 'aborted',
133
+ progress: 1,
134
+ description: 'Indexing aborted',
135
+ };
136
+ this.statuses.set(id, status);
137
+ this.completedAt.set(id, new Date());
138
+ this.notifyListeners(status);
139
+ }
140
+ cancelIndexing(id) {
141
+ const bar = this.bars.get(id);
142
+ const currentStatus = this.statuses.get(id);
143
+ if (!bar || !currentStatus) {
144
+ return;
145
+ }
146
+ bar.update(currentStatus.progress * 100, {
147
+ status: 'Cancelled (new operation started)',
148
+ });
149
+ const status = {
150
+ ...currentStatus,
151
+ status: 'cancelled',
152
+ description: 'Cancelled - replaced by new indexing operation',
153
+ };
154
+ this.statuses.set(id, status);
155
+ this.completedAt.set(id, new Date());
156
+ this.notifyListeners(status);
157
+ }
158
+ getStatus(id) {
159
+ return this.statuses.get(id);
160
+ }
161
+ /**
162
+ * Get all statuses (for debugging/internal use)
163
+ */
164
+ getAllStatuses() {
165
+ return Array.from(this.statuses.values());
166
+ }
167
+ /**
168
+ * Get only active indexing operations and recently completed ones.
169
+ * Completed statuses are automatically cleaned up after TTL expires.
170
+ * This is the primary method for the get_indexing_status tool.
171
+ */
172
+ getActiveStatuses() {
173
+ this.cleanupOldStatuses();
174
+ const now = new Date();
175
+ return Array.from(this.statuses.values()).filter((status) => {
176
+ // Always include active indexing operations
177
+ if (status.status === 'indexing') {
178
+ return true;
179
+ }
180
+ // Include completed/failed/aborted/cancelled if within TTL
181
+ const completedTime = this.completedAt.get(status.id);
182
+ if (completedTime) {
183
+ const age = now.getTime() - completedTime.getTime();
184
+ return age < COMPLETED_STATUS_TTL_MS;
185
+ }
186
+ return false;
187
+ });
188
+ }
189
+ /**
190
+ * Remove statuses that completed more than TTL ago
191
+ */
192
+ cleanupOldStatuses() {
193
+ const now = new Date();
194
+ for (const [id, completedTime] of this.completedAt.entries()) {
195
+ const age = now.getTime() - completedTime.getTime();
196
+ if (age >= COMPLETED_STATUS_TTL_MS) {
197
+ this.statuses.delete(id);
198
+ this.completedAt.delete(id);
199
+ this.bars.delete(id);
200
+ }
201
+ }
202
+ }
203
+ stop() {
204
+ this.multibar.stop();
205
+ }
206
+ }
207
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/indexing/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};