lance-context 0.1.0 → 1.0.1

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 (237) hide show
  1. package/README.md +232 -23
  2. package/dist/__tests__/ast-chunker.test.d.ts +2 -0
  3. package/dist/__tests__/ast-chunker.test.d.ts.map +1 -0
  4. package/dist/__tests__/ast-chunker.test.js +307 -0
  5. package/dist/__tests__/ast-chunker.test.js.map +1 -0
  6. package/dist/__tests__/config.test.d.ts +2 -0
  7. package/dist/__tests__/config.test.d.ts.map +1 -0
  8. package/dist/__tests__/config.test.js +242 -0
  9. package/dist/__tests__/config.test.js.map +1 -0
  10. package/dist/__tests__/dashboard/beads.test.d.ts +2 -0
  11. package/dist/__tests__/dashboard/beads.test.d.ts.map +1 -0
  12. package/dist/__tests__/dashboard/beads.test.js +151 -0
  13. package/dist/__tests__/dashboard/beads.test.js.map +1 -0
  14. package/dist/__tests__/dashboard/index.test.d.ts +2 -0
  15. package/dist/__tests__/dashboard/index.test.d.ts.map +1 -0
  16. package/dist/__tests__/dashboard/index.test.js +116 -0
  17. package/dist/__tests__/dashboard/index.test.js.map +1 -0
  18. package/dist/__tests__/dashboard/routes.test.d.ts +2 -0
  19. package/dist/__tests__/dashboard/routes.test.d.ts.map +1 -0
  20. package/dist/__tests__/dashboard/routes.test.js +125 -0
  21. package/dist/__tests__/dashboard/routes.test.js.map +1 -0
  22. package/dist/__tests__/dashboard/server.test.d.ts +2 -0
  23. package/dist/__tests__/dashboard/server.test.d.ts.map +1 -0
  24. package/dist/__tests__/dashboard/server.test.js +75 -0
  25. package/dist/__tests__/dashboard/server.test.js.map +1 -0
  26. package/dist/__tests__/dashboard/state.test.d.ts +2 -0
  27. package/dist/__tests__/dashboard/state.test.d.ts.map +1 -0
  28. package/dist/__tests__/dashboard/state.test.js +124 -0
  29. package/dist/__tests__/dashboard/state.test.js.map +1 -0
  30. package/dist/__tests__/embeddings/factory.test.d.ts +2 -0
  31. package/dist/__tests__/embeddings/factory.test.d.ts.map +1 -0
  32. package/dist/__tests__/embeddings/factory.test.js +100 -0
  33. package/dist/__tests__/embeddings/factory.test.js.map +1 -0
  34. package/dist/__tests__/embeddings/jina.test.d.ts +2 -0
  35. package/dist/__tests__/embeddings/jina.test.d.ts.map +1 -0
  36. package/dist/__tests__/embeddings/jina.test.js +156 -0
  37. package/dist/__tests__/embeddings/jina.test.js.map +1 -0
  38. package/dist/__tests__/embeddings/ollama.test.d.ts +2 -0
  39. package/dist/__tests__/embeddings/ollama.test.d.ts.map +1 -0
  40. package/dist/__tests__/embeddings/ollama.test.js +172 -0
  41. package/dist/__tests__/embeddings/ollama.test.js.map +1 -0
  42. package/dist/__tests__/embeddings/rate-limiter.test.d.ts +2 -0
  43. package/dist/__tests__/embeddings/rate-limiter.test.d.ts.map +1 -0
  44. package/dist/__tests__/embeddings/rate-limiter.test.js +163 -0
  45. package/dist/__tests__/embeddings/rate-limiter.test.js.map +1 -0
  46. package/dist/__tests__/embeddings/retry.test.d.ts +2 -0
  47. package/dist/__tests__/embeddings/retry.test.d.ts.map +1 -0
  48. package/dist/__tests__/embeddings/retry.test.js +260 -0
  49. package/dist/__tests__/embeddings/retry.test.js.map +1 -0
  50. package/dist/__tests__/embeddings/types.test.d.ts +2 -0
  51. package/dist/__tests__/embeddings/types.test.d.ts.map +1 -0
  52. package/dist/__tests__/embeddings/types.test.js +31 -0
  53. package/dist/__tests__/embeddings/types.test.js.map +1 -0
  54. package/dist/__tests__/mocks/embedding-backend.mock.d.ts +10 -0
  55. package/dist/__tests__/mocks/embedding-backend.mock.d.ts.map +1 -0
  56. package/dist/__tests__/mocks/embedding-backend.mock.js +39 -0
  57. package/dist/__tests__/mocks/embedding-backend.mock.js.map +1 -0
  58. package/dist/__tests__/mocks/fetch.mock.d.ts +38 -0
  59. package/dist/__tests__/mocks/fetch.mock.d.ts.map +1 -0
  60. package/dist/__tests__/mocks/fetch.mock.js +74 -0
  61. package/dist/__tests__/mocks/fetch.mock.js.map +1 -0
  62. package/dist/__tests__/mocks/lancedb.mock.d.ts +38 -0
  63. package/dist/__tests__/mocks/lancedb.mock.d.ts.map +1 -0
  64. package/dist/__tests__/mocks/lancedb.mock.js +63 -0
  65. package/dist/__tests__/mocks/lancedb.mock.js.map +1 -0
  66. package/dist/__tests__/search/clustering.test.d.ts +2 -0
  67. package/dist/__tests__/search/clustering.test.d.ts.map +1 -0
  68. package/dist/__tests__/search/clustering.test.js +230 -0
  69. package/dist/__tests__/search/clustering.test.js.map +1 -0
  70. package/dist/__tests__/search/hybrid-search.test.d.ts +2 -0
  71. package/dist/__tests__/search/hybrid-search.test.d.ts.map +1 -0
  72. package/dist/__tests__/search/hybrid-search.test.js +186 -0
  73. package/dist/__tests__/search/hybrid-search.test.js.map +1 -0
  74. package/dist/__tests__/search/indexer.test.d.ts +2 -0
  75. package/dist/__tests__/search/indexer.test.d.ts.map +1 -0
  76. package/dist/__tests__/search/indexer.test.js +878 -0
  77. package/dist/__tests__/search/indexer.test.js.map +1 -0
  78. package/dist/__tests__/search/tree-sitter-chunker.test.d.ts +2 -0
  79. package/dist/__tests__/search/tree-sitter-chunker.test.d.ts.map +1 -0
  80. package/dist/__tests__/search/tree-sitter-chunker.test.js +228 -0
  81. package/dist/__tests__/search/tree-sitter-chunker.test.js.map +1 -0
  82. package/dist/__tests__/setup.d.ts +2 -0
  83. package/dist/__tests__/setup.d.ts.map +1 -0
  84. package/dist/__tests__/setup.js +11 -0
  85. package/dist/__tests__/setup.js.map +1 -0
  86. package/dist/__tests__/utils/concurrency.test.d.ts +2 -0
  87. package/dist/__tests__/utils/concurrency.test.d.ts.map +1 -0
  88. package/dist/__tests__/utils/concurrency.test.js +83 -0
  89. package/dist/__tests__/utils/concurrency.test.js.map +1 -0
  90. package/dist/__tests__/utils/errors.test.d.ts +2 -0
  91. package/dist/__tests__/utils/errors.test.d.ts.map +1 -0
  92. package/dist/__tests__/utils/errors.test.js +136 -0
  93. package/dist/__tests__/utils/errors.test.js.map +1 -0
  94. package/dist/__tests__/utils/type-guards.test.d.ts +2 -0
  95. package/dist/__tests__/utils/type-guards.test.d.ts.map +1 -0
  96. package/dist/__tests__/utils/type-guards.test.js +80 -0
  97. package/dist/__tests__/utils/type-guards.test.js.map +1 -0
  98. package/dist/__tests__/worktree/worktree-manager.test.d.ts +2 -0
  99. package/dist/__tests__/worktree/worktree-manager.test.d.ts.map +1 -0
  100. package/dist/__tests__/worktree/worktree-manager.test.js +403 -0
  101. package/dist/__tests__/worktree/worktree-manager.test.js.map +1 -0
  102. package/dist/config.d.ts +122 -0
  103. package/dist/config.d.ts.map +1 -0
  104. package/dist/config.js +508 -0
  105. package/dist/config.js.map +1 -0
  106. package/dist/dashboard/beads.d.ts +35 -0
  107. package/dist/dashboard/beads.d.ts.map +1 -0
  108. package/dist/dashboard/beads.js +102 -0
  109. package/dist/dashboard/beads.js.map +1 -0
  110. package/dist/dashboard/events.d.ts +46 -0
  111. package/dist/dashboard/events.d.ts.map +1 -0
  112. package/dist/dashboard/events.js +141 -0
  113. package/dist/dashboard/events.js.map +1 -0
  114. package/dist/dashboard/index.d.ts +67 -0
  115. package/dist/dashboard/index.d.ts.map +1 -0
  116. package/dist/dashboard/index.js +90 -0
  117. package/dist/dashboard/index.js.map +1 -0
  118. package/dist/dashboard/routes.d.ts +6 -0
  119. package/dist/dashboard/routes.d.ts.map +1 -0
  120. package/dist/dashboard/routes.js +244 -0
  121. package/dist/dashboard/routes.js.map +1 -0
  122. package/dist/dashboard/server.d.ts +27 -0
  123. package/dist/dashboard/server.d.ts.map +1 -0
  124. package/dist/dashboard/server.js +72 -0
  125. package/dist/dashboard/server.js.map +1 -0
  126. package/dist/dashboard/state.d.ts +116 -0
  127. package/dist/dashboard/state.d.ts.map +1 -0
  128. package/dist/dashboard/state.js +251 -0
  129. package/dist/dashboard/state.js.map +1 -0
  130. package/dist/dashboard/ui.d.ts +6 -0
  131. package/dist/dashboard/ui.d.ts.map +1 -0
  132. package/dist/dashboard/ui.js +1407 -0
  133. package/dist/dashboard/ui.js.map +1 -0
  134. package/dist/embeddings/index.d.ts +20 -2
  135. package/dist/embeddings/index.d.ts.map +1 -1
  136. package/dist/embeddings/index.js +49 -6
  137. package/dist/embeddings/index.js.map +1 -1
  138. package/dist/embeddings/jina.d.ts +9 -0
  139. package/dist/embeddings/jina.d.ts.map +1 -1
  140. package/dist/embeddings/jina.js +42 -2
  141. package/dist/embeddings/jina.js.map +1 -1
  142. package/dist/embeddings/ollama.d.ts +2 -0
  143. package/dist/embeddings/ollama.d.ts.map +1 -1
  144. package/dist/embeddings/ollama.js +21 -5
  145. package/dist/embeddings/ollama.js.map +1 -1
  146. package/dist/embeddings/rate-limiter.d.ts +75 -0
  147. package/dist/embeddings/rate-limiter.d.ts.map +1 -0
  148. package/dist/embeddings/rate-limiter.js +145 -0
  149. package/dist/embeddings/rate-limiter.js.map +1 -0
  150. package/dist/embeddings/retry.d.ts +14 -0
  151. package/dist/embeddings/retry.d.ts.map +1 -0
  152. package/dist/embeddings/retry.js +89 -0
  153. package/dist/embeddings/retry.js.map +1 -0
  154. package/dist/embeddings/types.d.ts +56 -2
  155. package/dist/embeddings/types.d.ts.map +1 -1
  156. package/dist/embeddings/types.js +16 -0
  157. package/dist/embeddings/types.js.map +1 -1
  158. package/dist/index.js +1870 -44
  159. package/dist/index.js.map +1 -1
  160. package/dist/memory/index.d.ts +63 -0
  161. package/dist/memory/index.d.ts.map +1 -0
  162. package/dist/memory/index.js +168 -0
  163. package/dist/memory/index.js.map +1 -0
  164. package/dist/search/ast-chunker.d.ts +34 -0
  165. package/dist/search/ast-chunker.d.ts.map +1 -0
  166. package/dist/search/ast-chunker.js +261 -0
  167. package/dist/search/ast-chunker.js.map +1 -0
  168. package/dist/search/clustering.d.ts +77 -0
  169. package/dist/search/clustering.d.ts.map +1 -0
  170. package/dist/search/clustering.js +455 -0
  171. package/dist/search/clustering.js.map +1 -0
  172. package/dist/search/indexer.d.ts +239 -3
  173. package/dist/search/indexer.d.ts.map +1 -1
  174. package/dist/search/indexer.js +941 -45
  175. package/dist/search/indexer.js.map +1 -1
  176. package/dist/search/tree-sitter-chunker.d.ts +69 -0
  177. package/dist/search/tree-sitter-chunker.d.ts.map +1 -0
  178. package/dist/search/tree-sitter-chunker.js +436 -0
  179. package/dist/search/tree-sitter-chunker.js.map +1 -0
  180. package/dist/symbols/index.d.ts +14 -0
  181. package/dist/symbols/index.d.ts.map +1 -0
  182. package/dist/symbols/index.js +19 -0
  183. package/dist/symbols/index.js.map +1 -0
  184. package/dist/symbols/name-path.d.ts +113 -0
  185. package/dist/symbols/name-path.d.ts.map +1 -0
  186. package/dist/symbols/name-path.js +194 -0
  187. package/dist/symbols/name-path.js.map +1 -0
  188. package/dist/symbols/pattern-search.d.ts +14 -0
  189. package/dist/symbols/pattern-search.d.ts.map +1 -0
  190. package/dist/symbols/pattern-search.js +224 -0
  191. package/dist/symbols/pattern-search.js.map +1 -0
  192. package/dist/symbols/reference-finder.d.ts +38 -0
  193. package/dist/symbols/reference-finder.d.ts.map +1 -0
  194. package/dist/symbols/reference-finder.js +376 -0
  195. package/dist/symbols/reference-finder.js.map +1 -0
  196. package/dist/symbols/symbol-editor.d.ts +81 -0
  197. package/dist/symbols/symbol-editor.d.ts.map +1 -0
  198. package/dist/symbols/symbol-editor.js +257 -0
  199. package/dist/symbols/symbol-editor.js.map +1 -0
  200. package/dist/symbols/symbol-extractor.d.ts +49 -0
  201. package/dist/symbols/symbol-extractor.d.ts.map +1 -0
  202. package/dist/symbols/symbol-extractor.js +593 -0
  203. package/dist/symbols/symbol-extractor.js.map +1 -0
  204. package/dist/symbols/symbol-renamer.d.ts +81 -0
  205. package/dist/symbols/symbol-renamer.d.ts.map +1 -0
  206. package/dist/symbols/symbol-renamer.js +204 -0
  207. package/dist/symbols/symbol-renamer.js.map +1 -0
  208. package/dist/symbols/types.d.ts +234 -0
  209. package/dist/symbols/types.d.ts.map +1 -0
  210. package/dist/symbols/types.js +106 -0
  211. package/dist/symbols/types.js.map +1 -0
  212. package/dist/utils/concurrency.d.ts +32 -0
  213. package/dist/utils/concurrency.d.ts.map +1 -0
  214. package/dist/utils/concurrency.js +57 -0
  215. package/dist/utils/concurrency.js.map +1 -0
  216. package/dist/utils/errors.d.ts +36 -0
  217. package/dist/utils/errors.d.ts.map +1 -0
  218. package/dist/utils/errors.js +91 -0
  219. package/dist/utils/errors.js.map +1 -0
  220. package/dist/utils/type-guards.d.ts +17 -0
  221. package/dist/utils/type-guards.d.ts.map +1 -0
  222. package/dist/utils/type-guards.js +25 -0
  223. package/dist/utils/type-guards.js.map +1 -0
  224. package/dist/worktree/index.d.ts +6 -0
  225. package/dist/worktree/index.d.ts.map +1 -0
  226. package/dist/worktree/index.js +6 -0
  227. package/dist/worktree/index.js.map +1 -0
  228. package/dist/worktree/types.d.ts +101 -0
  229. package/dist/worktree/types.d.ts.map +1 -0
  230. package/dist/worktree/types.js +6 -0
  231. package/dist/worktree/types.js.map +1 -0
  232. package/dist/worktree/worktree-manager.d.ts +80 -0
  233. package/dist/worktree/worktree-manager.d.ts.map +1 -0
  234. package/dist/worktree/worktree-manager.js +407 -0
  235. package/dist/worktree/worktree-manager.js.map +1 -0
  236. package/package.json +39 -5
  237. package/scripts/postinstall.js +48 -0
@@ -0,0 +1,260 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { fetchWithRetry } from '../../embeddings/retry.js';
3
+ describe('fetchWithRetry', () => {
4
+ beforeEach(() => {
5
+ vi.useFakeTimers();
6
+ });
7
+ afterEach(() => {
8
+ vi.useRealTimers();
9
+ });
10
+ describe('immediate success', () => {
11
+ it('should return response on first successful call', async () => {
12
+ const mockResponse = {
13
+ ok: true,
14
+ status: 200,
15
+ json: async () => ({ data: 'test' }),
16
+ };
17
+ vi.stubGlobal('fetch', vi.fn().mockResolvedValue(mockResponse));
18
+ const response = await fetchWithRetry('https://api.test.com', {});
19
+ expect(response).toBe(mockResponse);
20
+ expect(fetch).toHaveBeenCalledTimes(1);
21
+ });
22
+ it('should pass options to fetch', async () => {
23
+ const mockResponse = { ok: true, status: 200 };
24
+ vi.stubGlobal('fetch', vi.fn().mockResolvedValue(mockResponse));
25
+ const options = {
26
+ method: 'POST',
27
+ headers: { 'Content-Type': 'application/json' },
28
+ body: JSON.stringify({ test: true }),
29
+ };
30
+ await fetchWithRetry('https://api.test.com', options);
31
+ expect(fetch).toHaveBeenCalledWith('https://api.test.com', options);
32
+ });
33
+ });
34
+ describe('retryable status codes', () => {
35
+ it('should retry on 429 status code', async () => {
36
+ const mockFetch = vi
37
+ .fn()
38
+ .mockResolvedValueOnce({ ok: false, status: 429, statusText: 'Too Many Requests' })
39
+ .mockResolvedValueOnce({ ok: true, status: 200 });
40
+ vi.stubGlobal('fetch', mockFetch);
41
+ const responsePromise = fetchWithRetry('https://api.test.com', {}, { maxRetries: 3 });
42
+ // First call returns 429
43
+ await vi.advanceTimersByTimeAsync(0);
44
+ expect(mockFetch).toHaveBeenCalledTimes(1);
45
+ // Wait for retry delay (1000ms base)
46
+ await vi.advanceTimersByTimeAsync(1000);
47
+ const response = await responsePromise;
48
+ expect(response.ok).toBe(true);
49
+ expect(mockFetch).toHaveBeenCalledTimes(2);
50
+ });
51
+ it('should retry on 500 status code', async () => {
52
+ const mockFetch = vi
53
+ .fn()
54
+ .mockResolvedValueOnce({ ok: false, status: 500, statusText: 'Internal Server Error' })
55
+ .mockResolvedValueOnce({ ok: true, status: 200 });
56
+ vi.stubGlobal('fetch', mockFetch);
57
+ const responsePromise = fetchWithRetry('https://api.test.com', {});
58
+ await vi.advanceTimersByTimeAsync(1000);
59
+ const response = await responsePromise;
60
+ expect(response.ok).toBe(true);
61
+ expect(mockFetch).toHaveBeenCalledTimes(2);
62
+ });
63
+ it('should retry on 503 status code', async () => {
64
+ const mockFetch = vi
65
+ .fn()
66
+ .mockResolvedValueOnce({ ok: false, status: 503, statusText: 'Service Unavailable' })
67
+ .mockResolvedValueOnce({ ok: true, status: 200 });
68
+ vi.stubGlobal('fetch', mockFetch);
69
+ const responsePromise = fetchWithRetry('https://api.test.com', {});
70
+ await vi.advanceTimersByTimeAsync(1000);
71
+ const response = await responsePromise;
72
+ expect(response.ok).toBe(true);
73
+ expect(mockFetch).toHaveBeenCalledTimes(2);
74
+ });
75
+ it('should retry on 408 status code', async () => {
76
+ const mockFetch = vi
77
+ .fn()
78
+ .mockResolvedValueOnce({ ok: false, status: 408, statusText: 'Request Timeout' })
79
+ .mockResolvedValueOnce({ ok: true, status: 200 });
80
+ vi.stubGlobal('fetch', mockFetch);
81
+ const responsePromise = fetchWithRetry('https://api.test.com', {});
82
+ await vi.advanceTimersByTimeAsync(1000);
83
+ const response = await responsePromise;
84
+ expect(response.ok).toBe(true);
85
+ expect(mockFetch).toHaveBeenCalledTimes(2);
86
+ });
87
+ });
88
+ describe('exponential backoff', () => {
89
+ it('should use exponential backoff timing', async () => {
90
+ const mockFetch = vi
91
+ .fn()
92
+ .mockResolvedValueOnce({ ok: false, status: 429 })
93
+ .mockResolvedValueOnce({ ok: false, status: 429 })
94
+ .mockResolvedValueOnce({ ok: false, status: 429 })
95
+ .mockResolvedValueOnce({ ok: true, status: 200 });
96
+ vi.stubGlobal('fetch', mockFetch);
97
+ const responsePromise = fetchWithRetry('https://api.test.com', {}, {
98
+ maxRetries: 3,
99
+ baseDelayMs: 1000,
100
+ });
101
+ await vi.advanceTimersByTimeAsync(0);
102
+ expect(mockFetch).toHaveBeenCalledTimes(1);
103
+ // First retry: 1000ms (1000 * 2^0)
104
+ await vi.advanceTimersByTimeAsync(1000);
105
+ expect(mockFetch).toHaveBeenCalledTimes(2);
106
+ // Second retry: 2000ms (1000 * 2^1)
107
+ await vi.advanceTimersByTimeAsync(2000);
108
+ expect(mockFetch).toHaveBeenCalledTimes(3);
109
+ // Third retry: 4000ms (1000 * 2^2)
110
+ await vi.advanceTimersByTimeAsync(4000);
111
+ expect(mockFetch).toHaveBeenCalledTimes(4);
112
+ const response = await responsePromise;
113
+ expect(response.ok).toBe(true);
114
+ });
115
+ it('should respect maxDelayMs', async () => {
116
+ const mockFetch = vi
117
+ .fn()
118
+ .mockResolvedValueOnce({ ok: false, status: 429 })
119
+ .mockResolvedValueOnce({ ok: false, status: 429 })
120
+ .mockResolvedValueOnce({ ok: false, status: 429 })
121
+ .mockResolvedValueOnce({ ok: true, status: 200 });
122
+ vi.stubGlobal('fetch', mockFetch);
123
+ const responsePromise = fetchWithRetry('https://api.test.com', {}, {
124
+ maxRetries: 3,
125
+ baseDelayMs: 5000,
126
+ maxDelayMs: 8000,
127
+ });
128
+ await vi.advanceTimersByTimeAsync(0);
129
+ expect(mockFetch).toHaveBeenCalledTimes(1);
130
+ // First retry: 5000ms (5000 * 2^0)
131
+ await vi.advanceTimersByTimeAsync(5000);
132
+ expect(mockFetch).toHaveBeenCalledTimes(2);
133
+ // Second retry: capped at 8000ms (would be 10000 = 5000 * 2^1)
134
+ await vi.advanceTimersByTimeAsync(8000);
135
+ expect(mockFetch).toHaveBeenCalledTimes(3);
136
+ // Third retry: capped at 8000ms (would be 20000 = 5000 * 2^2)
137
+ await vi.advanceTimersByTimeAsync(8000);
138
+ expect(mockFetch).toHaveBeenCalledTimes(4);
139
+ await responsePromise;
140
+ });
141
+ });
142
+ describe('max retries exhaustion', () => {
143
+ it('should return error response after max retries', async () => {
144
+ const errorResponse = { ok: false, status: 429, statusText: 'Too Many Requests' };
145
+ const mockFetch = vi.fn().mockResolvedValue(errorResponse);
146
+ vi.stubGlobal('fetch', mockFetch);
147
+ const responsePromise = fetchWithRetry('https://api.test.com', {}, { maxRetries: 2 });
148
+ // Process all retries
149
+ await vi.advanceTimersByTimeAsync(1000); // First retry
150
+ await vi.advanceTimersByTimeAsync(2000); // Second retry
151
+ const response = await responsePromise;
152
+ expect(response.ok).toBe(false);
153
+ expect(response.status).toBe(429);
154
+ expect(mockFetch).toHaveBeenCalledTimes(3); // Initial + 2 retries
155
+ });
156
+ });
157
+ describe('non-retryable errors', () => {
158
+ it('should not retry on 400 status code', async () => {
159
+ const mockFetch = vi
160
+ .fn()
161
+ .mockResolvedValue({ ok: false, status: 400, statusText: 'Bad Request' });
162
+ vi.stubGlobal('fetch', mockFetch);
163
+ const response = await fetchWithRetry('https://api.test.com', {});
164
+ expect(response.ok).toBe(false);
165
+ expect(response.status).toBe(400);
166
+ expect(mockFetch).toHaveBeenCalledTimes(1);
167
+ });
168
+ it('should not retry on 401 status code', async () => {
169
+ const mockFetch = vi
170
+ .fn()
171
+ .mockResolvedValue({ ok: false, status: 401, statusText: 'Unauthorized' });
172
+ vi.stubGlobal('fetch', mockFetch);
173
+ const response = await fetchWithRetry('https://api.test.com', {});
174
+ expect(response.ok).toBe(false);
175
+ expect(response.status).toBe(401);
176
+ expect(mockFetch).toHaveBeenCalledTimes(1);
177
+ });
178
+ it('should not retry on 403 status code', async () => {
179
+ const mockFetch = vi
180
+ .fn()
181
+ .mockResolvedValue({ ok: false, status: 403, statusText: 'Forbidden' });
182
+ vi.stubGlobal('fetch', mockFetch);
183
+ const response = await fetchWithRetry('https://api.test.com', {});
184
+ expect(response.ok).toBe(false);
185
+ expect(response.status).toBe(403);
186
+ expect(mockFetch).toHaveBeenCalledTimes(1);
187
+ });
188
+ it('should not retry on 404 status code', async () => {
189
+ const mockFetch = vi
190
+ .fn()
191
+ .mockResolvedValue({ ok: false, status: 404, statusText: 'Not Found' });
192
+ vi.stubGlobal('fetch', mockFetch);
193
+ const response = await fetchWithRetry('https://api.test.com', {});
194
+ expect(response.ok).toBe(false);
195
+ expect(response.status).toBe(404);
196
+ expect(mockFetch).toHaveBeenCalledTimes(1);
197
+ });
198
+ });
199
+ describe('network errors', () => {
200
+ it('should retry on fetch network error', async () => {
201
+ const mockFetch = vi
202
+ .fn()
203
+ .mockRejectedValueOnce(new Error('fetch failed'))
204
+ .mockResolvedValueOnce({ ok: true, status: 200 });
205
+ vi.stubGlobal('fetch', mockFetch);
206
+ const responsePromise = fetchWithRetry('https://api.test.com', {});
207
+ await vi.advanceTimersByTimeAsync(1000);
208
+ const response = await responsePromise;
209
+ expect(response.ok).toBe(true);
210
+ expect(mockFetch).toHaveBeenCalledTimes(2);
211
+ });
212
+ it('should retry on ECONNREFUSED error', async () => {
213
+ const mockFetch = vi
214
+ .fn()
215
+ .mockRejectedValueOnce(new Error('ECONNREFUSED'))
216
+ .mockResolvedValueOnce({ ok: true, status: 200 });
217
+ vi.stubGlobal('fetch', mockFetch);
218
+ const responsePromise = fetchWithRetry('https://api.test.com', {});
219
+ await vi.advanceTimersByTimeAsync(1000);
220
+ const response = await responsePromise;
221
+ expect(response.ok).toBe(true);
222
+ expect(mockFetch).toHaveBeenCalledTimes(2);
223
+ });
224
+ it('should throw after max retries on network error', async () => {
225
+ const mockFetch = vi.fn().mockRejectedValue(new Error('fetch failed'));
226
+ vi.stubGlobal('fetch', mockFetch);
227
+ // Wrap in try-catch to properly handle the rejection
228
+ let error = null;
229
+ const responsePromise = fetchWithRetry('https://api.test.com', {}, { maxRetries: 2 }).catch((e) => {
230
+ error = e;
231
+ });
232
+ // Need to flush all timers to let the retries complete
233
+ await vi.runAllTimersAsync();
234
+ await responsePromise;
235
+ expect(error).toBeInstanceOf(Error);
236
+ expect(error.message).toBe('fetch failed');
237
+ expect(mockFetch).toHaveBeenCalledTimes(3);
238
+ });
239
+ it('should not retry on non-network errors', async () => {
240
+ const mockFetch = vi.fn().mockRejectedValue(new Error('some other error'));
241
+ vi.stubGlobal('fetch', mockFetch);
242
+ await expect(fetchWithRetry('https://api.test.com', {})).rejects.toThrow('some other error');
243
+ expect(mockFetch).toHaveBeenCalledTimes(1);
244
+ });
245
+ });
246
+ describe('default options', () => {
247
+ it('should use default maxRetries of 3', async () => {
248
+ const mockFetch = vi.fn().mockResolvedValue({ ok: false, status: 429 });
249
+ vi.stubGlobal('fetch', mockFetch);
250
+ const responsePromise = fetchWithRetry('https://api.test.com', {});
251
+ // Process all retries with default baseDelayMs of 1000
252
+ await vi.advanceTimersByTimeAsync(1000); // Retry 1
253
+ await vi.advanceTimersByTimeAsync(2000); // Retry 2
254
+ await vi.advanceTimersByTimeAsync(4000); // Retry 3
255
+ await responsePromise;
256
+ expect(mockFetch).toHaveBeenCalledTimes(4); // Initial + 3 retries
257
+ });
258
+ });
259
+ });
260
+ //# sourceMappingURL=retry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.test.js","sourceRoot":"","sources":["../../../src/__tests__/embeddings/retry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/embeddings/types.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,31 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { chunkArray } from '../../embeddings/types.js';
3
+ describe('chunkArray', () => {
4
+ it('should return empty array for empty input', () => {
5
+ expect(chunkArray([], 10)).toEqual([]);
6
+ });
7
+ it('should return single chunk when array is smaller than chunk size', () => {
8
+ expect(chunkArray([1, 2, 3], 10)).toEqual([[1, 2, 3]]);
9
+ });
10
+ it('should split array into even chunks', () => {
11
+ expect(chunkArray([1, 2, 3, 4], 2)).toEqual([
12
+ [1, 2],
13
+ [3, 4],
14
+ ]);
15
+ });
16
+ it('should handle uneven splits with remainder in last chunk', () => {
17
+ expect(chunkArray([1, 2, 3, 4, 5], 2)).toEqual([[1, 2], [3, 4], [5]]);
18
+ });
19
+ it('should create individual chunks when chunk size is 1', () => {
20
+ expect(chunkArray([1, 2, 3], 1)).toEqual([[1], [2], [3]]);
21
+ });
22
+ it('should work with strings', () => {
23
+ expect(chunkArray(['a', 'b', 'c', 'd'], 3)).toEqual([['a', 'b', 'c'], ['d']]);
24
+ });
25
+ it('should work with objects', () => {
26
+ const arr = [{ id: 1 }, { id: 2 }, { id: 3 }];
27
+ const result = chunkArray(arr, 2);
28
+ expect(result).toEqual([[{ id: 1 }, { id: 2 }], [{ id: 3 }]]);
29
+ });
30
+ });
31
+ //# sourceMappingURL=types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../../src/__tests__/embeddings/types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1C,CAAC,CAAC,EAAE,CAAC,CAAC;YACN,CAAC,CAAC,EAAE,CAAC,CAAC;SACP,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,GAAG,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { EmbeddingBackend } from '../../embeddings/types.js';
2
+ /**
3
+ * Creates a mock EmbeddingBackend for testing
4
+ */
5
+ export declare function createMockEmbeddingBackend(overrides?: Partial<EmbeddingBackend>): EmbeddingBackend;
6
+ /**
7
+ * Creates a mock EmbeddingBackend that fails initialization
8
+ */
9
+ export declare function createFailingMockEmbeddingBackend(error: Error): EmbeddingBackend;
10
+ //# sourceMappingURL=embedding-backend.mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-backend.mock.d.ts","sourceRoot":"","sources":["../../../src/__tests__/mocks/embedding-backend.mock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAElE;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACxC,gBAAgB,CAuBlB;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,KAAK,GAAG,gBAAgB,CAShF"}
@@ -0,0 +1,39 @@
1
+ import { vi } from 'vitest';
2
+ /**
3
+ * Creates a mock EmbeddingBackend for testing
4
+ */
5
+ export function createMockEmbeddingBackend(overrides = {}) {
6
+ const dimensions = overrides.getDimensions?.() ?? 1536;
7
+ const model = overrides.getModel?.() ?? 'mock-model';
8
+ return {
9
+ name: 'mock',
10
+ initialize: vi.fn().mockResolvedValue(undefined),
11
+ embed: vi.fn().mockImplementation(async () => {
12
+ return Array(dimensions)
13
+ .fill(0)
14
+ .map(() => Math.random());
15
+ }),
16
+ embedBatch: vi.fn().mockImplementation(async (texts) => {
17
+ return texts.map(() => Array(dimensions)
18
+ .fill(0)
19
+ .map(() => Math.random()));
20
+ }),
21
+ getDimensions: vi.fn().mockReturnValue(dimensions),
22
+ getModel: vi.fn().mockReturnValue(model),
23
+ ...overrides,
24
+ };
25
+ }
26
+ /**
27
+ * Creates a mock EmbeddingBackend that fails initialization
28
+ */
29
+ export function createFailingMockEmbeddingBackend(error) {
30
+ return {
31
+ name: 'failing-mock',
32
+ initialize: vi.fn().mockRejectedValue(error),
33
+ embed: vi.fn().mockRejectedValue(error),
34
+ embedBatch: vi.fn().mockRejectedValue(error),
35
+ getDimensions: vi.fn().mockReturnValue(1536),
36
+ getModel: vi.fn().mockReturnValue('failing-mock-model'),
37
+ };
38
+ }
39
+ //# sourceMappingURL=embedding-backend.mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-backend.mock.js","sourceRoot":"","sources":["../../../src/__tests__/mocks/embedding-backend.mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAG5B;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,YAAuC,EAAE;IAEzC,MAAM,UAAU,GAAG,SAAS,CAAC,aAAa,EAAE,EAAE,IAAI,IAAI,CAAC;IACvD,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,YAAY,CAAC;IAErD,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAChD,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;YAC3C,OAAO,KAAK,CAAC,UAAU,CAAC;iBACrB,IAAI,CAAC,CAAC,CAAC;iBACP,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9B,CAAC,CAAC;QACF,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAe,EAAE,EAAE;YAC/D,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CACpB,KAAK,CAAC,UAAU,CAAC;iBACd,IAAI,CAAC,CAAC,CAAC;iBACP,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAC5B,CAAC;QACJ,CAAC,CAAC;QACF,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC;QAClD,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC;QACxC,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iCAAiC,CAAC,KAAY;IAC5D,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC;QAC5C,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC;QACvC,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC;QAC5C,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;QAC5C,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,oBAAoB,CAAC;KACxD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,38 @@
1
+ export interface MockFetchResponse {
2
+ ok: boolean;
3
+ status: number;
4
+ statusText?: string;
5
+ json?: () => Promise<unknown>;
6
+ text?: () => Promise<string>;
7
+ }
8
+ type FetchHandler = (url: string, options?: RequestInit) => Promise<MockFetchResponse>;
9
+ /**
10
+ * Creates a mock fetch function
11
+ */
12
+ export declare function createMockFetch(handler: FetchHandler): import("vitest").Mock<import("@vitest/spy").Procedure>;
13
+ /**
14
+ * Creates a mock fetch that returns a successful JSON response
15
+ */
16
+ export declare function createSuccessFetch(data: unknown): ReturnType<typeof createMockFetch>;
17
+ /**
18
+ * Creates a mock fetch that returns an error response
19
+ */
20
+ export declare function createErrorFetch(status: number, statusText?: string, body?: string): ReturnType<typeof createMockFetch>;
21
+ /**
22
+ * Creates a mock fetch that fails with a network error
23
+ */
24
+ export declare function createNetworkErrorFetch(message?: string): ReturnType<typeof createMockFetch>;
25
+ /**
26
+ * Creates a mock fetch that returns different responses based on call count
27
+ */
28
+ export declare function createSequentialFetch(responses: MockFetchResponse[]): ReturnType<typeof createMockFetch>;
29
+ /**
30
+ * Creates Jina-style embedding response
31
+ */
32
+ export declare function createJinaEmbeddingResponse(embeddings: number[][]): MockFetchResponse;
33
+ /**
34
+ * Creates Ollama-style embedding response
35
+ */
36
+ export declare function createOllamaEmbeddingResponse(embedding: number[]): MockFetchResponse;
37
+ export {};
38
+ //# sourceMappingURL=fetch.mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.mock.d.ts","sourceRoot":"","sources":["../../../src/__tests__/mocks/fetch.mock.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9B;AAED,KAAK,YAAY,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEvF;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,0DAEpD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAOpF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,MAAgB,EAC5B,IAAI,GAAE,MAAW,GAChB,UAAU,CAAC,OAAO,eAAe,CAAC,CAQpC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,MAAuB,GAC/B,UAAU,CAAC,OAAO,eAAe,CAAC,CAEpC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,iBAAiB,EAAE,GAC7B,UAAU,CAAC,OAAO,eAAe,CAAC,CAOpC;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,GAAG,iBAAiB,CAYrF;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAOpF"}
@@ -0,0 +1,74 @@
1
+ import { vi } from 'vitest';
2
+ /**
3
+ * Creates a mock fetch function
4
+ */
5
+ export function createMockFetch(handler) {
6
+ return vi.fn().mockImplementation(handler);
7
+ }
8
+ /**
9
+ * Creates a mock fetch that returns a successful JSON response
10
+ */
11
+ export function createSuccessFetch(data) {
12
+ return createMockFetch(async () => ({
13
+ ok: true,
14
+ status: 200,
15
+ json: async () => data,
16
+ text: async () => JSON.stringify(data),
17
+ }));
18
+ }
19
+ /**
20
+ * Creates a mock fetch that returns an error response
21
+ */
22
+ export function createErrorFetch(status, statusText = 'Error', body = '') {
23
+ return createMockFetch(async () => ({
24
+ ok: false,
25
+ status,
26
+ statusText,
27
+ json: async () => ({ error: body }),
28
+ text: async () => body,
29
+ }));
30
+ }
31
+ /**
32
+ * Creates a mock fetch that fails with a network error
33
+ */
34
+ export function createNetworkErrorFetch(message = 'fetch failed') {
35
+ return vi.fn().mockRejectedValue(new Error(message));
36
+ }
37
+ /**
38
+ * Creates a mock fetch that returns different responses based on call count
39
+ */
40
+ export function createSequentialFetch(responses) {
41
+ let callCount = 0;
42
+ return vi.fn().mockImplementation(async () => {
43
+ const response = responses[Math.min(callCount, responses.length - 1)];
44
+ callCount++;
45
+ return response;
46
+ });
47
+ }
48
+ /**
49
+ * Creates Jina-style embedding response
50
+ */
51
+ export function createJinaEmbeddingResponse(embeddings) {
52
+ return {
53
+ ok: true,
54
+ status: 200,
55
+ json: async () => ({
56
+ data: embeddings.map((embedding) => ({ embedding })),
57
+ }),
58
+ text: async () => JSON.stringify({
59
+ data: embeddings.map((embedding) => ({ embedding })),
60
+ }),
61
+ };
62
+ }
63
+ /**
64
+ * Creates Ollama-style embedding response
65
+ */
66
+ export function createOllamaEmbeddingResponse(embedding) {
67
+ return {
68
+ ok: true,
69
+ status: 200,
70
+ json: async () => ({ embedding }),
71
+ text: async () => JSON.stringify({ embedding }),
72
+ };
73
+ }
74
+ //# sourceMappingURL=fetch.mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.mock.js","sourceRoot":"","sources":["../../../src/__tests__/mocks/fetch.mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAY5B;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAqB;IACnD,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAa;IAC9C,OAAO,eAAe,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAClC,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,GAAG;QACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;QACtB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KACvC,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,aAAqB,OAAO,EAC5B,OAAe,EAAE;IAEjB,OAAO,eAAe,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAClC,EAAE,EAAE,KAAK;QACT,MAAM;QACN,UAAU;QACV,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACnC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;KACvB,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,UAAkB,cAAc;IAEhC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAA8B;IAE9B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;QAC3C,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACtE,SAAS,EAAE,CAAC;QACZ,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,UAAsB;IAChE,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,GAAG;QACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACjB,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;SACrD,CAAC;QACF,IAAI,EAAE,KAAK,IAAI,EAAE,CACf,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;SACrD,CAAC;KACL,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAAC,SAAmB;IAC/D,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,GAAG;QACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACjC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC;KAChD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,38 @@
1
+ export interface MockRow {
2
+ id?: string;
3
+ filepath: string;
4
+ content?: string;
5
+ startLine?: number;
6
+ endLine?: number;
7
+ language?: string;
8
+ vector?: number[];
9
+ mtime?: number;
10
+ symbolType?: 'function' | 'class' | 'method' | 'interface' | 'type' | 'variable' | 'import' | 'other';
11
+ symbolName?: string;
12
+ }
13
+ /**
14
+ * Creates a mock LanceDB table
15
+ */
16
+ export declare function createMockTable(initialData?: MockRow[]): {
17
+ add: import("vitest").Mock<import("@vitest/spy").Procedure>;
18
+ delete: import("vitest").Mock<import("@vitest/spy").Procedure>;
19
+ countRows: import("vitest").Mock<import("@vitest/spy").Procedure>;
20
+ query: import("vitest").Mock<import("@vitest/spy").Procedure>;
21
+ search: import("vitest").Mock<import("@vitest/spy").Procedure>;
22
+ };
23
+ /**
24
+ * Creates a mock LanceDB connection
25
+ */
26
+ export declare function createMockConnection(tables?: Record<string, ReturnType<typeof createMockTable>>): {
27
+ tableNames: import("vitest").Mock<import("@vitest/spy").Procedure>;
28
+ openTable: import("vitest").Mock<import("@vitest/spy").Procedure>;
29
+ createTable: import("vitest").Mock<import("@vitest/spy").Procedure>;
30
+ dropTable: import("vitest").Mock<import("@vitest/spy").Procedure>;
31
+ };
32
+ /**
33
+ * Setup mock for @lancedb/lancedb module
34
+ */
35
+ export declare function setupLanceDBMock(connection: ReturnType<typeof createMockConnection>): {
36
+ connect: import("vitest").Mock<import("@vitest/spy").Procedure>;
37
+ };
38
+ //# sourceMappingURL=lancedb.mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lancedb.mock.d.ts","sourceRoot":"","sources":["../../../src/__tests__/mocks/lancedb.mock.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,OAAO;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EACP,UAAU,GACV,OAAO,GACP,QAAQ,GACR,WAAW,GACX,MAAM,GACN,UAAU,GACV,QAAQ,GACR,OAAO,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,GAAE,OAAO,EAAO;;;;;;EA4B1D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAM;;;;;EAqBhE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC;;EAInF"}
@@ -0,0 +1,63 @@
1
+ import { vi } from 'vitest';
2
+ /**
3
+ * Creates a mock LanceDB table
4
+ */
5
+ export function createMockTable(initialData = []) {
6
+ let data = [...initialData];
7
+ const mockQuery = {
8
+ toArray: vi.fn().mockImplementation(async () => data),
9
+ limit: vi.fn().mockReturnThis(),
10
+ };
11
+ return {
12
+ add: vi.fn().mockImplementation(async (rows) => {
13
+ data.push(...rows);
14
+ }),
15
+ delete: vi.fn().mockImplementation(async (filter) => {
16
+ // Simple filter parsing for "filepath = 'value'"
17
+ const match = filter.match(/filepath = '(.+)'/);
18
+ if (match) {
19
+ const pathToDelete = match[1].replace(/''/g, "'");
20
+ data = data.filter((row) => row.filepath !== pathToDelete);
21
+ }
22
+ }),
23
+ countRows: vi.fn().mockImplementation(async () => data.length),
24
+ query: vi.fn().mockReturnValue(mockQuery),
25
+ search: vi.fn().mockImplementation(() => ({
26
+ limit: vi.fn().mockReturnValue({
27
+ toArray: vi.fn().mockResolvedValue(data),
28
+ }),
29
+ })),
30
+ };
31
+ }
32
+ /**
33
+ * Creates a mock LanceDB connection
34
+ */
35
+ export function createMockConnection(tables = {}) {
36
+ const tableStore = { ...tables };
37
+ return {
38
+ tableNames: vi.fn().mockImplementation(async () => Object.keys(tableStore)),
39
+ openTable: vi.fn().mockImplementation(async (name) => {
40
+ if (!tableStore[name]) {
41
+ throw new Error(`Table ${name} not found`);
42
+ }
43
+ return tableStore[name];
44
+ }),
45
+ createTable: vi.fn().mockImplementation(async (name, data) => {
46
+ const table = createMockTable(data);
47
+ tableStore[name] = table;
48
+ return table;
49
+ }),
50
+ dropTable: vi.fn().mockImplementation(async (name) => {
51
+ delete tableStore[name];
52
+ }),
53
+ };
54
+ }
55
+ /**
56
+ * Setup mock for @lancedb/lancedb module
57
+ */
58
+ export function setupLanceDBMock(connection) {
59
+ return {
60
+ connect: vi.fn().mockResolvedValue(connection),
61
+ };
62
+ }
63
+ //# sourceMappingURL=lancedb.mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lancedb.mock.js","sourceRoot":"","sources":["../../../src/__tests__/mocks/lancedb.mock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=clustering.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clustering.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/search/clustering.test.ts"],"names":[],"mappings":""}