@nahisaho/shikigami-mcp-server 1.7.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +29 -0
  2. package/dist/cache/__tests__/global.test.d.ts +6 -0
  3. package/dist/cache/__tests__/global.test.d.ts.map +1 -0
  4. package/dist/cache/__tests__/global.test.js +269 -0
  5. package/dist/cache/__tests__/global.test.js.map +1 -0
  6. package/dist/cache/__tests__/manager.test.d.ts +6 -0
  7. package/dist/cache/__tests__/manager.test.d.ts.map +1 -0
  8. package/dist/cache/__tests__/manager.test.js +286 -0
  9. package/dist/cache/__tests__/manager.test.js.map +1 -0
  10. package/dist/cache/__tests__/semantic.test.d.ts +6 -0
  11. package/dist/cache/__tests__/semantic.test.d.ts.map +1 -0
  12. package/dist/cache/__tests__/semantic.test.js +271 -0
  13. package/dist/cache/__tests__/semantic.test.js.map +1 -0
  14. package/dist/cache/__tests__/store.test.d.ts +6 -0
  15. package/dist/cache/__tests__/store.test.d.ts.map +1 -0
  16. package/dist/cache/__tests__/store.test.js +289 -0
  17. package/dist/cache/__tests__/store.test.js.map +1 -0
  18. package/dist/cache/global.d.ts +140 -0
  19. package/dist/cache/global.d.ts.map +1 -0
  20. package/dist/cache/global.js +260 -0
  21. package/dist/cache/global.js.map +1 -0
  22. package/dist/cache/index.d.ts +10 -0
  23. package/dist/cache/index.d.ts.map +1 -0
  24. package/dist/cache/index.js +10 -0
  25. package/dist/cache/index.js.map +1 -0
  26. package/dist/cache/manager.d.ts +146 -0
  27. package/dist/cache/manager.d.ts.map +1 -0
  28. package/dist/cache/manager.js +229 -0
  29. package/dist/cache/manager.js.map +1 -0
  30. package/dist/cache/semantic.d.ts +164 -0
  31. package/dist/cache/semantic.d.ts.map +1 -0
  32. package/dist/cache/semantic.js +241 -0
  33. package/dist/cache/semantic.js.map +1 -0
  34. package/dist/cache/store.d.ts +98 -0
  35. package/dist/cache/store.d.ts.map +1 -0
  36. package/dist/cache/store.js +469 -0
  37. package/dist/cache/store.js.map +1 -0
  38. package/dist/cache/types.d.ts +171 -0
  39. package/dist/cache/types.d.ts.map +1 -0
  40. package/dist/cache/types.js +8 -0
  41. package/dist/cache/types.js.map +1 -0
  42. package/dist/config/types.d.ts +67 -0
  43. package/dist/config/types.d.ts.map +1 -1
  44. package/dist/config/types.js +30 -0
  45. package/dist/config/types.js.map +1 -1
  46. package/dist/tools/__tests__/multilingual-search.test.d.ts +7 -0
  47. package/dist/tools/__tests__/multilingual-search.test.d.ts.map +1 -0
  48. package/dist/tools/__tests__/multilingual-search.test.js +71 -0
  49. package/dist/tools/__tests__/multilingual-search.test.js.map +1 -0
  50. package/dist/tools/search/recovery/__tests__/logger.test.d.ts +8 -0
  51. package/dist/tools/search/recovery/__tests__/logger.test.d.ts.map +1 -0
  52. package/dist/tools/search/recovery/__tests__/logger.test.js +249 -0
  53. package/dist/tools/search/recovery/__tests__/logger.test.js.map +1 -0
  54. package/dist/tools/search/recovery/__tests__/manager-logger.test.d.ts +8 -0
  55. package/dist/tools/search/recovery/__tests__/manager-logger.test.d.ts.map +1 -0
  56. package/dist/tools/search/recovery/__tests__/manager-logger.test.js +158 -0
  57. package/dist/tools/search/recovery/__tests__/manager-logger.test.js.map +1 -0
  58. package/dist/tools/search/recovery/index.d.ts +31 -2
  59. package/dist/tools/search/recovery/index.d.ts.map +1 -1
  60. package/dist/tools/search/recovery/index.js +51 -7
  61. package/dist/tools/search/recovery/index.js.map +1 -1
  62. package/dist/tools/search/recovery/logger.d.ts +149 -0
  63. package/dist/tools/search/recovery/logger.d.ts.map +1 -0
  64. package/dist/tools/search/recovery/logger.js +218 -0
  65. package/dist/tools/search/recovery/logger.js.map +1 -0
  66. package/dist/tools/search.d.ts +48 -0
  67. package/dist/tools/search.d.ts.map +1 -1
  68. package/dist/tools/search.js +152 -0
  69. package/dist/tools/search.js.map +1 -1
  70. package/dist/tools/visit/recovery/__tests__/index.test.d.ts +10 -0
  71. package/dist/tools/visit/recovery/__tests__/index.test.d.ts.map +1 -0
  72. package/dist/tools/visit/recovery/__tests__/index.test.js +239 -0
  73. package/dist/tools/visit/recovery/__tests__/index.test.js.map +1 -0
  74. package/dist/tools/visit/recovery/__tests__/wayback.test.d.ts +8 -0
  75. package/dist/tools/visit/recovery/__tests__/wayback.test.d.ts.map +1 -0
  76. package/dist/tools/visit/recovery/__tests__/wayback.test.js +271 -0
  77. package/dist/tools/visit/recovery/__tests__/wayback.test.js.map +1 -0
  78. package/dist/tools/visit/recovery/index.d.ts +126 -0
  79. package/dist/tools/visit/recovery/index.d.ts.map +1 -0
  80. package/dist/tools/visit/recovery/index.js +203 -0
  81. package/dist/tools/visit/recovery/index.js.map +1 -0
  82. package/dist/tools/visit/recovery/wayback.d.ts +101 -0
  83. package/dist/tools/visit/recovery/wayback.d.ts.map +1 -0
  84. package/dist/tools/visit/recovery/wayback.js +140 -0
  85. package/dist/tools/visit/recovery/wayback.js.map +1 -0
  86. package/dist/tools/visit.d.ts +33 -0
  87. package/dist/tools/visit.d.ts.map +1 -1
  88. package/dist/tools/visit.js +127 -1
  89. package/dist/tools/visit.js.map +1 -1
  90. package/package.json +7 -3
  91. package/shikigami.config.example.yaml +9 -0
  92. package/src/cache/__tests__/global.test.ts +340 -0
  93. package/src/cache/__tests__/manager.test.ts +353 -0
  94. package/src/cache/__tests__/semantic.test.ts +331 -0
  95. package/src/cache/__tests__/store.test.ts +369 -0
  96. package/src/cache/global.ts +351 -0
  97. package/src/cache/index.ts +10 -0
  98. package/src/cache/manager.ts +325 -0
  99. package/src/cache/semantic.ts +368 -0
  100. package/src/cache/store.ts +555 -0
  101. package/src/cache/types.ts +189 -0
  102. package/src/config/types.ts +108 -0
  103. package/src/tools/__tests__/multilingual-search.test.ts +88 -0
  104. package/src/tools/search/recovery/__tests__/logger.test.ts +334 -0
  105. package/src/tools/search/recovery/__tests__/manager-logger.test.ts +199 -0
  106. package/src/tools/search/recovery/index.ts +67 -9
  107. package/src/tools/search/recovery/logger.ts +351 -0
  108. package/src/tools/search.ts +212 -0
  109. package/src/tools/visit/recovery/__tests__/index.test.ts +297 -0
  110. package/src/tools/visit/recovery/__tests__/wayback.test.ts +344 -0
  111. package/src/tools/visit/recovery/index.ts +312 -0
  112. package/src/tools/visit/recovery/wayback.ts +210 -0
  113. package/src/tools/visit.ts +159 -2
  114. package/vitest.config.ts +22 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.test.js","sourceRoot":"","sources":["../../../src/cache/__tests__/manager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * SemanticCacheMatcher Unit Tests
3
+ * v1.0.0 - REQ-CACHE-001-02
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=semantic.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic.test.d.ts","sourceRoot":"","sources":["../../../src/cache/__tests__/semantic.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,271 @@
1
+ /**
2
+ * SemanticCacheMatcher Unit Tests
3
+ * v1.0.0 - REQ-CACHE-001-02
4
+ */
5
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
6
+ import * as fs from 'fs/promises';
7
+ import { FileCacheStore } from '../store.js';
8
+ import { SemanticCacheMatcher, SimpleEmbeddingService, cosineSimilarity, DEFAULT_SEMANTIC_CONFIG, createSemanticCacheMatcher, } from '../semantic.js';
9
+ // テスト用一時ディレクトリ(各テスト毎にユニーク)
10
+ let TEST_CACHE_DIR;
11
+ describe('SemanticCacheMatcher', () => {
12
+ let store;
13
+ let matcher;
14
+ beforeEach(async () => {
15
+ TEST_CACHE_DIR =
16
+ '/tmp/shikigami-semantic-test-' + Date.now() + '-' + Math.random().toString(36).substring(7);
17
+ store = new FileCacheStore({
18
+ cacheDir: TEST_CACHE_DIR,
19
+ maxEntries: 100,
20
+ defaultTtlSeconds: 3600,
21
+ });
22
+ matcher = new SemanticCacheMatcher(store);
23
+ });
24
+ afterEach(async () => {
25
+ try {
26
+ await fs.rm(TEST_CACHE_DIR, { recursive: true, force: true });
27
+ }
28
+ catch {
29
+ // 無視
30
+ }
31
+ });
32
+ describe('cosineSimilarity', () => {
33
+ it('should return 1 for identical vectors', () => {
34
+ const v1 = [1, 0, 0];
35
+ const v2 = [1, 0, 0];
36
+ expect(cosineSimilarity(v1, v2)).toBeCloseTo(1, 5);
37
+ });
38
+ it('should return 0 for orthogonal vectors', () => {
39
+ const v1 = [1, 0];
40
+ const v2 = [0, 1];
41
+ expect(cosineSimilarity(v1, v2)).toBeCloseTo(0, 5);
42
+ });
43
+ it('should return -1 for opposite vectors', () => {
44
+ const v1 = [1, 0];
45
+ const v2 = [-1, 0];
46
+ expect(cosineSimilarity(v1, v2)).toBeCloseTo(-1, 5);
47
+ });
48
+ it('should handle normalized vectors', () => {
49
+ const v1 = [0.6, 0.8];
50
+ const v2 = [0.6, 0.8];
51
+ expect(cosineSimilarity(v1, v2)).toBeCloseTo(1, 5);
52
+ });
53
+ it('should throw for dimension mismatch', () => {
54
+ const v1 = [1, 0, 0];
55
+ const v2 = [1, 0];
56
+ expect(() => cosineSimilarity(v1, v2)).toThrow('dimension mismatch');
57
+ });
58
+ it('should return 0 for zero vectors', () => {
59
+ const v1 = [0, 0, 0];
60
+ const v2 = [1, 0, 0];
61
+ expect(cosineSimilarity(v1, v2)).toBe(0);
62
+ });
63
+ });
64
+ describe('SimpleEmbeddingService', () => {
65
+ let embeddingService;
66
+ beforeEach(() => {
67
+ embeddingService = new SimpleEmbeddingService(64);
68
+ });
69
+ it('should generate embedding vector', async () => {
70
+ const embedding = await embeddingService.embed('test query');
71
+ expect(embedding).toHaveLength(64);
72
+ });
73
+ it('should generate normalized vectors', async () => {
74
+ const embedding = await embeddingService.embed('test query');
75
+ const magnitude = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0));
76
+ expect(magnitude).toBeCloseTo(1, 5);
77
+ });
78
+ it('should generate similar embeddings for similar text', async () => {
79
+ const e1 = await embeddingService.embed('Microsoft Teams pricing');
80
+ const e2 = await embeddingService.embed('Microsoft Teams price');
81
+ const similarity = cosineSimilarity(e1, e2);
82
+ expect(similarity).toBeGreaterThan(0.5);
83
+ });
84
+ it('should batch embed multiple texts', async () => {
85
+ const texts = ['query 1', 'query 2', 'query 3'];
86
+ const embeddings = await embeddingService.embedBatch(texts);
87
+ expect(embeddings).toHaveLength(3);
88
+ embeddings.forEach((e) => expect(e).toHaveLength(64));
89
+ });
90
+ it('should return model name', () => {
91
+ expect(embeddingService.getModelName()).toBe('simple-hash');
92
+ });
93
+ it('should return dimension', () => {
94
+ expect(embeddingService.getDimension()).toBe(64);
95
+ });
96
+ });
97
+ describe('indexQuery', () => {
98
+ it('should index a query', async () => {
99
+ await matcher.indexQuery('test query', 'search:test', 'search');
100
+ expect(matcher.getIndexSize()).toBe(1);
101
+ });
102
+ it('should index multiple queries', async () => {
103
+ await matcher.indexQuery('query 1', 'search:q1', 'search');
104
+ await matcher.indexQuery('query 2', 'search:q2', 'search');
105
+ await matcher.indexQuery('query 3', 'visit:q3', 'visit');
106
+ expect(matcher.getIndexSize()).toBe(3);
107
+ });
108
+ it('should persist embedding to cache store', async () => {
109
+ await matcher.indexQuery('test query', 'search:test', 'search');
110
+ const result = await store.get('embedding:search:test');
111
+ expect(result.hit).toBe(true);
112
+ });
113
+ it('should not index when disabled', async () => {
114
+ matcher.setEnabled(false);
115
+ await matcher.indexQuery('test query', 'search:test', 'search');
116
+ expect(matcher.getIndexSize()).toBe(0);
117
+ });
118
+ });
119
+ describe('findSimilar', () => {
120
+ beforeEach(async () => {
121
+ await matcher.indexQuery('Microsoft Teams pricing', 'search:teams-price', 'search');
122
+ await matcher.indexQuery('Microsoft 365 license cost', 'search:m365-cost', 'search');
123
+ await matcher.indexQuery('Zoom video conferencing', 'visit:zoom', 'visit');
124
+ });
125
+ it('should find similar queries', async () => {
126
+ // 同じクエリは類似度1
127
+ const candidates = await matcher.findSimilar('Microsoft Teams pricing');
128
+ expect(candidates.length).toBeGreaterThanOrEqual(1);
129
+ expect(candidates[0].similarity).toBeGreaterThan(0.9);
130
+ });
131
+ it('should filter by source', async () => {
132
+ const candidates = await matcher.findSimilar('Microsoft Teams', 'search');
133
+ // visitソースは除外される
134
+ const visitCandidates = candidates.filter((c) => c.cacheKey.startsWith('visit:'));
135
+ expect(visitCandidates.length).toBe(0);
136
+ });
137
+ it('should return empty when disabled', async () => {
138
+ matcher.setEnabled(false);
139
+ const candidates = await matcher.findSimilar('Microsoft Teams');
140
+ expect(candidates.length).toBe(0);
141
+ });
142
+ it('should sort by similarity', async () => {
143
+ const candidates = await matcher.findSimilar('Microsoft Teams pricing');
144
+ if (candidates.length >= 2) {
145
+ expect(candidates[0].similarity).toBeGreaterThanOrEqual(candidates[1].similarity);
146
+ }
147
+ });
148
+ it('should respect maxCandidates', async () => {
149
+ // 閾値を低くして多くの候補が見つかるようにする
150
+ matcher.setSimilarityThreshold(0.1);
151
+ await matcher.indexQuery('query 4', 'search:q4', 'search');
152
+ await matcher.indexQuery('query 5', 'search:q5', 'search');
153
+ await matcher.indexQuery('query 6', 'search:q6', 'search');
154
+ const matcherWithLimit = new SemanticCacheMatcher(store, { maxCandidates: 2 });
155
+ matcherWithLimit.setSimilarityThreshold(0.1);
156
+ // 同じインデックスをコピー(手動)
157
+ await matcherWithLimit.indexQuery('Microsoft Teams pricing', 'search:teams-price', 'search');
158
+ await matcherWithLimit.indexQuery('Microsoft 365 license cost', 'search:m365-cost', 'search');
159
+ await matcherWithLimit.indexQuery('query 4', 'search:q4', 'search');
160
+ const candidates = await matcherWithLimit.findSimilar('some query');
161
+ expect(candidates.length).toBeLessThanOrEqual(2);
162
+ });
163
+ });
164
+ describe('getBestMatch', () => {
165
+ it('should return best matching cache entry', async () => {
166
+ // キャッシュにデータを保存
167
+ await store.set('search:teams-price', { results: ['result1', 'result2'] }, { source: 'search' });
168
+ await matcher.indexQuery('Microsoft Teams pricing', 'search:teams-price', 'search');
169
+ const match = await matcher.getBestMatch('Microsoft Teams pricing');
170
+ expect(match).not.toBeNull();
171
+ expect(match?.entry.value.results).toEqual(['result1', 'result2']);
172
+ expect(match?.similarity).toBeCloseTo(1, 1);
173
+ });
174
+ it('should return null when no similar query found', async () => {
175
+ await matcher.indexQuery('completely different query', 'search:different', 'search');
176
+ // 閾値を高く保って類似性がないことを確認
177
+ matcher.setSimilarityThreshold(0.99);
178
+ const match = await matcher.getBestMatch('some random unique string xyz123');
179
+ expect(match).toBeNull();
180
+ });
181
+ it('should return null when cache entry is missing', async () => {
182
+ // インデックスにのみ追加(キャッシュには保存しない)
183
+ await matcher.indexQuery('test query', 'search:missing', 'search');
184
+ // キャッシュからは削除
185
+ await store.delete('search:missing');
186
+ const match = await matcher.getBestMatch('test query');
187
+ expect(match).toBeNull();
188
+ });
189
+ });
190
+ describe('removeFromIndex', () => {
191
+ it('should remove entry from index', async () => {
192
+ await matcher.indexQuery('test query', 'search:test', 'search');
193
+ expect(matcher.getIndexSize()).toBe(1);
194
+ matcher.removeFromIndex('search:test');
195
+ expect(matcher.getIndexSize()).toBe(0);
196
+ });
197
+ });
198
+ describe('clearIndex', () => {
199
+ it('should clear all entries from index', async () => {
200
+ await matcher.indexQuery('query 1', 'search:q1', 'search');
201
+ await matcher.indexQuery('query 2', 'search:q2', 'search');
202
+ expect(matcher.getIndexSize()).toBe(2);
203
+ matcher.clearIndex();
204
+ expect(matcher.getIndexSize()).toBe(0);
205
+ });
206
+ });
207
+ describe('loadIndex', () => {
208
+ it('should load persisted embeddings', async () => {
209
+ // 埋め込みを保存
210
+ await matcher.indexQuery('query 1', 'search:q1', 'search');
211
+ await matcher.indexQuery('query 2', 'search:q2', 'search');
212
+ // 新しいMatcherを作成してロード
213
+ const newMatcher = new SemanticCacheMatcher(store);
214
+ const loadedCount = await newMatcher.loadIndex();
215
+ expect(loadedCount).toBe(2);
216
+ expect(newMatcher.getIndexSize()).toBe(2);
217
+ });
218
+ });
219
+ describe('configuration', () => {
220
+ it('should return config', () => {
221
+ const config = matcher.getConfig();
222
+ expect(config.similarityThreshold).toBe(DEFAULT_SEMANTIC_CONFIG.similarityThreshold);
223
+ expect(config.maxCandidates).toBe(DEFAULT_SEMANTIC_CONFIG.maxCandidates);
224
+ });
225
+ it('should update similarity threshold', () => {
226
+ matcher.setSimilarityThreshold(0.85);
227
+ expect(matcher.getConfig().similarityThreshold).toBe(0.85);
228
+ });
229
+ it('should throw for invalid threshold', () => {
230
+ expect(() => matcher.setSimilarityThreshold(-0.1)).toThrow();
231
+ expect(() => matcher.setSimilarityThreshold(1.5)).toThrow();
232
+ });
233
+ it('should toggle enabled state', () => {
234
+ matcher.setEnabled(false);
235
+ expect(matcher.getConfig().enabled).toBe(false);
236
+ matcher.setEnabled(true);
237
+ expect(matcher.getConfig().enabled).toBe(true);
238
+ });
239
+ });
240
+ describe('getStats', () => {
241
+ it('should return stats', async () => {
242
+ await matcher.indexQuery('test', 'search:test', 'search');
243
+ const stats = matcher.getStats();
244
+ expect(stats.indexSize).toBe(1);
245
+ expect(stats.threshold).toBe(0.9);
246
+ expect(stats.enabled).toBe(true);
247
+ expect(stats.model).toBeDefined();
248
+ expect(stats.dimension).toBe(1536);
249
+ });
250
+ });
251
+ describe('createSemanticCacheMatcher', () => {
252
+ it('should create matcher with default config', () => {
253
+ const newMatcher = createSemanticCacheMatcher(store);
254
+ expect(newMatcher).toBeInstanceOf(SemanticCacheMatcher);
255
+ });
256
+ it('should create matcher with custom config', () => {
257
+ const newMatcher = createSemanticCacheMatcher(store, { similarityThreshold: 0.8 });
258
+ expect(newMatcher.getConfig().similarityThreshold).toBe(0.8);
259
+ });
260
+ it('should create matcher with custom embedding service', () => {
261
+ const customService = {
262
+ embed: async (text) => new Array(128).fill(0).map(() => Math.random()),
263
+ getModelName: () => 'custom',
264
+ getDimension: () => 128,
265
+ };
266
+ const newMatcher = createSemanticCacheMatcher(store, {}, customService);
267
+ expect(newMatcher.getStats().model).toBe('custom');
268
+ });
269
+ });
270
+ });
271
+ //# sourceMappingURL=semantic.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic.test.js","sourceRoot":"","sources":["../../../src/cache/__tests__/semantic.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * FileCacheStore Unit Tests
3
+ * v1.0.0 - REQ-CACHE-001-01
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.test.d.ts","sourceRoot":"","sources":["../../../src/cache/__tests__/store.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,289 @@
1
+ /**
2
+ * FileCacheStore Unit Tests
3
+ * v1.0.0 - REQ-CACHE-001-01
4
+ */
5
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
6
+ import * as fs from 'fs/promises';
7
+ import { FileCacheStore, DEFAULT_CACHE_CONFIG, createCacheStore } from '../store.js';
8
+ // テスト用一時ディレクトリ(各テスト毎にユニーク)
9
+ let TEST_CACHE_DIR;
10
+ describe('FileCacheStore', () => {
11
+ let store;
12
+ beforeEach(async () => {
13
+ TEST_CACHE_DIR = '/tmp/shikigami-cache-test-' + Date.now() + '-' + Math.random().toString(36).substring(7);
14
+ store = new FileCacheStore({
15
+ cacheDir: TEST_CACHE_DIR,
16
+ maxEntries: 100,
17
+ maxSizeBytes: 10 * 1024 * 1024, // 10MB
18
+ defaultTtlSeconds: 3600,
19
+ });
20
+ });
21
+ afterEach(async () => {
22
+ // テストディレクトリをクリーンアップ
23
+ try {
24
+ await fs.rm(TEST_CACHE_DIR, { recursive: true, force: true });
25
+ }
26
+ catch {
27
+ // 無視
28
+ }
29
+ });
30
+ describe('constructor', () => {
31
+ it('should create store with default config', () => {
32
+ const defaultStore = new FileCacheStore();
33
+ expect(defaultStore).toBeDefined();
34
+ });
35
+ it('should create store with custom config', () => {
36
+ const customStore = new FileCacheStore({
37
+ maxEntries: 500,
38
+ defaultTtlSeconds: 7200,
39
+ });
40
+ expect(customStore).toBeDefined();
41
+ });
42
+ });
43
+ describe('set and get', () => {
44
+ it('should store and retrieve a value', async () => {
45
+ const key = 'test-key';
46
+ const value = { data: 'test-value', count: 42 };
47
+ await store.set(key, value);
48
+ const result = await store.get(key);
49
+ expect(result.hit).toBe(true);
50
+ expect(result.value).toEqual(value);
51
+ expect(result.key).toBe(key);
52
+ });
53
+ it('should return miss for non-existent key', async () => {
54
+ const result = await store.get('non-existent-key');
55
+ expect(result.hit).toBe(false);
56
+ expect(result.value).toBeUndefined();
57
+ });
58
+ it('should store with custom TTL', async () => {
59
+ const key = 'ttl-test';
60
+ const value = { data: 'ttl-value' };
61
+ await store.set(key, value, { ttlSeconds: 1 });
62
+ // すぐに取得すると成功
63
+ const result1 = await store.get(key);
64
+ expect(result1.hit).toBe(true);
65
+ // TTL期限後は失敗(2秒待機)
66
+ await new Promise(resolve => setTimeout(resolve, 1100));
67
+ const result2 = await store.get(key);
68
+ expect(result2.hit).toBe(false);
69
+ });
70
+ it('should store with tags', async () => {
71
+ const key = 'tagged-key';
72
+ const value = { data: 'tagged-value' };
73
+ const tags = ['tag1', 'tag2'];
74
+ await store.set(key, value, { tags });
75
+ const result = await store.get(key);
76
+ expect(result.hit).toBe(true);
77
+ expect(result.meta?.tags).toEqual(tags);
78
+ });
79
+ it('should store with source', async () => {
80
+ const key = 'source-key';
81
+ const value = { data: 'source-value' };
82
+ const source = 'search';
83
+ await store.set(key, value, { source });
84
+ const result = await store.get(key);
85
+ expect(result.hit).toBe(true);
86
+ expect(result.meta?.source).toBe(source);
87
+ });
88
+ it('should update access count on get', async () => {
89
+ const key = 'access-count-key';
90
+ const value = { data: 'access-value' };
91
+ await store.set(key, value);
92
+ // 最初の取得
93
+ const result1 = await store.get(key);
94
+ expect(result1.meta?.accessCount).toBe(1);
95
+ // 2回目の取得
96
+ const result2 = await store.get(key);
97
+ expect(result2.meta?.accessCount).toBe(2);
98
+ });
99
+ });
100
+ describe('delete', () => {
101
+ it('should delete an existing entry', async () => {
102
+ const key = 'delete-test';
103
+ const value = { data: 'delete-value' };
104
+ await store.set(key, value);
105
+ const deleted = await store.delete(key);
106
+ expect(deleted).toBe(true);
107
+ const result = await store.get(key);
108
+ expect(result.hit).toBe(false);
109
+ });
110
+ it('should return false for non-existent key', async () => {
111
+ const deleted = await store.delete('non-existent');
112
+ expect(deleted).toBe(false);
113
+ });
114
+ });
115
+ describe('has', () => {
116
+ it('should return true for existing key', async () => {
117
+ const key = 'has-test';
118
+ await store.set(key, { data: 'value' });
119
+ const exists = await store.has(key);
120
+ expect(exists).toBe(true);
121
+ });
122
+ it('should return false for non-existent key', async () => {
123
+ const exists = await store.has('non-existent');
124
+ expect(exists).toBe(false);
125
+ });
126
+ });
127
+ describe('clear', () => {
128
+ it('should remove all entries', async () => {
129
+ await store.set('key1', { data: 'value1' });
130
+ await store.set('key2', { data: 'value2' });
131
+ await store.set('key3', { data: 'value3' });
132
+ await store.clear();
133
+ const result1 = await store.get('key1');
134
+ const result2 = await store.get('key2');
135
+ const result3 = await store.get('key3');
136
+ expect(result1.hit).toBe(false);
137
+ expect(result2.hit).toBe(false);
138
+ expect(result3.hit).toBe(false);
139
+ });
140
+ });
141
+ describe('getStats', () => {
142
+ it('should return cache statistics', async () => {
143
+ await store.set('key1', { data: 'value1' });
144
+ await store.set('key2', { data: 'value2' });
145
+ await store.get('key1'); // hit
146
+ await store.get('non-existent'); // miss
147
+ const stats = await store.getStats();
148
+ expect(stats.totalEntries).toBe(2);
149
+ expect(stats.hits).toBeGreaterThanOrEqual(1);
150
+ expect(stats.misses).toBeGreaterThanOrEqual(1);
151
+ expect(stats.hitRate).toBeGreaterThan(0);
152
+ expect(stats.statsStartedAt).toBeDefined();
153
+ });
154
+ it('should track source-specific stats', async () => {
155
+ await store.set('search-key', { data: 'search' }, { source: 'search' });
156
+ await store.set('visit-key', { data: 'visit' }, { source: 'visit' });
157
+ await store.get('search-key');
158
+ const stats = await store.getStats();
159
+ expect(stats.bySource.search?.entries).toBe(1);
160
+ expect(stats.bySource.search?.hits).toBe(1);
161
+ expect(stats.bySource.visit?.entries).toBe(1);
162
+ });
163
+ });
164
+ describe('evictExpired', () => {
165
+ it('should remove expired entries', async () => {
166
+ // 短いTTLでエントリを作成
167
+ await store.set('expired-key', { data: 'expired' }, { ttlSeconds: 1 });
168
+ await store.set('valid-key', { data: 'valid' }, { ttlSeconds: 3600 });
169
+ // TTL期限後(余裕を持って1.5秒待機)
170
+ await new Promise(resolve => setTimeout(resolve, 1500));
171
+ // evictExpiredを呼び出す(getを呼ばずに直接削除をテスト)
172
+ const evictedCount = await store.evictExpired();
173
+ // 期限切れエントリが削除されたことを確認(0または1)
174
+ // getで先に削除される可能性があるため、削除されたことを確認
175
+ expect(evictedCount).toBeGreaterThanOrEqual(0);
176
+ // 期限切れキーはgetで取得できない
177
+ const expiredResult = await store.get('expired-key');
178
+ const validResult = await store.get('valid-key');
179
+ expect(expiredResult.hit).toBe(false);
180
+ expect(validResult.hit).toBe(true);
181
+ });
182
+ });
183
+ describe('evictLru', () => {
184
+ it('should remove least recently used entries', async () => {
185
+ // 小さいキャッシュサイズで作成
186
+ const smallStore = new FileCacheStore({
187
+ cacheDir: TEST_CACHE_DIR + '-lru',
188
+ maxSizeBytes: 1000, // 1KB
189
+ maxEntries: 3,
190
+ });
191
+ // エントリを追加
192
+ await smallStore.set('key1', { data: 'a'.repeat(200) });
193
+ await new Promise(resolve => setTimeout(resolve, 50));
194
+ await smallStore.set('key2', { data: 'b'.repeat(200) });
195
+ await new Promise(resolve => setTimeout(resolve, 50));
196
+ await smallStore.set('key3', { data: 'c'.repeat(200) });
197
+ // key1にアクセス(最近使用)
198
+ await smallStore.get('key1');
199
+ // 大きいデータを追加してLRU発動
200
+ await smallStore.set('key4', { data: 'd'.repeat(500) });
201
+ // key2が削除されているはず(最も古いアクセス)
202
+ const result2 = await smallStore.get('key2');
203
+ // クリーンアップ
204
+ await fs.rm(TEST_CACHE_DIR + '-lru', { recursive: true, force: true });
205
+ });
206
+ });
207
+ describe('query', () => {
208
+ it('should filter by source', async () => {
209
+ await store.set('search1', { data: 's1' }, { source: 'search' });
210
+ await store.set('search2', { data: 's2' }, { source: 'search' });
211
+ await store.set('visit1', { data: 'v1' }, { source: 'visit' });
212
+ const results = await store.query({ source: 'search' });
213
+ expect(results.length).toBe(2);
214
+ results.forEach(entry => {
215
+ expect(entry.meta.source).toBe('search');
216
+ });
217
+ });
218
+ it('should filter by tags', async () => {
219
+ await store.set('tagged1', { data: 't1' }, { tags: ['important', 'recent'] });
220
+ await store.set('tagged2', { data: 't2' }, { tags: ['important'] });
221
+ await store.set('untagged', { data: 'u1' });
222
+ const results = await store.query({ tags: ['important'] });
223
+ expect(results.length).toBe(2);
224
+ });
225
+ it('should respect limit', async () => {
226
+ for (let i = 0; i < 10; i++) {
227
+ await store.set(`key-${i}`, { data: `value-${i}` });
228
+ }
229
+ const results = await store.query({ limit: 5 });
230
+ expect(results.length).toBeLessThanOrEqual(5);
231
+ });
232
+ it('should exclude expired by default', async () => {
233
+ await store.set('expired', { data: 'exp' }, { ttlSeconds: 1 });
234
+ await store.set('valid', { data: 'val' }, { ttlSeconds: 3600 });
235
+ await new Promise(resolve => setTimeout(resolve, 1100));
236
+ const results = await store.query({});
237
+ // 期限切れエントリはクエリ結果に含まれないはず
238
+ expect(results.every(e => e.meta.originalKey !== 'expired' || new Date(e.meta.expiresAt) > new Date())).toBe(true);
239
+ });
240
+ });
241
+ describe('generateKey', () => {
242
+ it('should generate consistent keys', () => {
243
+ const key1 = FileCacheStore.generateKey('test query', 'search');
244
+ const key2 = FileCacheStore.generateKey('test query', 'search');
245
+ expect(key1).toBe(key2);
246
+ expect(key1).toBe('search:test query');
247
+ });
248
+ it('should generate different keys for different sources', () => {
249
+ const key1 = FileCacheStore.generateKey('query', 'search');
250
+ const key2 = FileCacheStore.generateKey('query', 'visit');
251
+ expect(key1).not.toBe(key2);
252
+ });
253
+ });
254
+ describe('generateQueryHash', () => {
255
+ it('should generate consistent hashes', () => {
256
+ const hash1 = FileCacheStore.generateQueryHash('test query');
257
+ const hash2 = FileCacheStore.generateQueryHash('test query');
258
+ expect(hash1).toBe(hash2);
259
+ expect(hash1.length).toBe(16);
260
+ });
261
+ it('should generate different hashes for different queries', () => {
262
+ const hash1 = FileCacheStore.generateQueryHash('query1');
263
+ const hash2 = FileCacheStore.generateQueryHash('query2');
264
+ expect(hash1).not.toBe(hash2);
265
+ });
266
+ });
267
+ });
268
+ describe('createCacheStore', () => {
269
+ it('should create a FileCacheStore instance', () => {
270
+ const store = createCacheStore();
271
+ expect(store).toBeInstanceOf(FileCacheStore);
272
+ });
273
+ it('should accept custom config', () => {
274
+ const store = createCacheStore({ maxEntries: 500 });
275
+ expect(store).toBeInstanceOf(FileCacheStore);
276
+ });
277
+ });
278
+ describe('DEFAULT_CACHE_CONFIG', () => {
279
+ it('should have expected default values', () => {
280
+ expect(DEFAULT_CACHE_CONFIG.enabled).toBe(true);
281
+ expect(DEFAULT_CACHE_CONFIG.maxEntries).toBe(1000);
282
+ expect(DEFAULT_CACHE_CONFIG.defaultTtlSeconds).toBe(3600);
283
+ expect(DEFAULT_CACHE_CONFIG.maxSizeBytes).toBe(100 * 1024 * 1024);
284
+ expect(DEFAULT_CACHE_CONFIG.ttlBySource?.search).toBe(3600);
285
+ expect(DEFAULT_CACHE_CONFIG.ttlBySource?.visit).toBe(86400);
286
+ expect(DEFAULT_CACHE_CONFIG.ttlBySource?.embedding).toBe(604800);
287
+ });
288
+ });
289
+ //# sourceMappingURL=store.test.js.map