@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,229 @@
1
+ /**
2
+ * Query Cache Manager
3
+ * v1.0.0 - REQ-CACHE-001-01
4
+ *
5
+ * 検索・訪問クエリのキャッシュ管理
6
+ */
7
+ import { FileCacheStore, createCacheStore } from './store.js';
8
+ /**
9
+ * クエリキャッシュマネージャー
10
+ * 検索、訪問、埋め込みなどのクエリ結果をキャッシュ
11
+ */
12
+ export class QueryCacheManager {
13
+ store;
14
+ config;
15
+ evictionTimer;
16
+ statsSaveTimer;
17
+ constructor(config = {}) {
18
+ this.config = {
19
+ evictionIntervalSeconds: 300, // 5分
20
+ statsSaveIntervalSeconds: 60, // 1分
21
+ ...config,
22
+ };
23
+ this.store = createCacheStore(config);
24
+ }
25
+ /**
26
+ * 定期的なメンテナンスタスクを開始
27
+ */
28
+ startMaintenanceTasks() {
29
+ // 期限切れ削除タイマー
30
+ if (this.config.evictionIntervalSeconds && this.config.evictionIntervalSeconds > 0) {
31
+ this.evictionTimer = setInterval(() => this.store.evictExpired(), this.config.evictionIntervalSeconds * 1000);
32
+ }
33
+ // 統計保存タイマー
34
+ if (this.config.statsSaveIntervalSeconds && this.config.statsSaveIntervalSeconds > 0) {
35
+ this.statsSaveTimer = setInterval(() => this.store.saveStats(), this.config.statsSaveIntervalSeconds * 1000);
36
+ }
37
+ }
38
+ /**
39
+ * メンテナンスタスクを停止
40
+ */
41
+ stopMaintenanceTasks() {
42
+ if (this.evictionTimer) {
43
+ clearInterval(this.evictionTimer);
44
+ this.evictionTimer = undefined;
45
+ }
46
+ if (this.statsSaveTimer) {
47
+ clearInterval(this.statsSaveTimer);
48
+ this.statsSaveTimer = undefined;
49
+ }
50
+ }
51
+ /**
52
+ * 検索クエリのキャッシュキーを生成
53
+ */
54
+ static generateSearchKey(params) {
55
+ const { query, engine = 'default', options = {} } = params;
56
+ const optionsStr = Object.keys(options).length > 0 ? JSON.stringify(options) : '';
57
+ return `search:${engine}:${query}${optionsStr ? ':' + optionsStr : ''}`;
58
+ }
59
+ /**
60
+ * 訪問クエリのキャッシュキーを生成
61
+ */
62
+ static generateVisitKey(params) {
63
+ const { url, options = {} } = params;
64
+ const optionsStr = Object.keys(options).length > 0 ? JSON.stringify(options) : '';
65
+ return `visit:${url}${optionsStr ? ':' + optionsStr : ''}`;
66
+ }
67
+ /**
68
+ * 埋め込みキャッシュキーを生成
69
+ */
70
+ static generateEmbeddingKey(params) {
71
+ const { text, model = 'default' } = params;
72
+ // テキストが長い場合はハッシュ化
73
+ const textKey = text.length > 100 ? FileCacheStore.generateQueryHash(text) : text;
74
+ return `embedding:${model}:${textKey}`;
75
+ }
76
+ /**
77
+ * 検索結果をキャッシュから取得
78
+ */
79
+ async getSearchResult(params) {
80
+ const key = QueryCacheManager.generateSearchKey(params);
81
+ return this.store.get(key);
82
+ }
83
+ /**
84
+ * 検索結果をキャッシュに保存
85
+ */
86
+ async setSearchResult(params, value, options = {}) {
87
+ const key = QueryCacheManager.generateSearchKey(params);
88
+ await this.store.set(key, value, { ...options, source: 'search' });
89
+ }
90
+ /**
91
+ * 訪問結果をキャッシュから取得
92
+ */
93
+ async getVisitResult(params) {
94
+ const key = QueryCacheManager.generateVisitKey(params);
95
+ return this.store.get(key);
96
+ }
97
+ /**
98
+ * 訪問結果をキャッシュに保存
99
+ */
100
+ async setVisitResult(params, value, options = {}) {
101
+ const key = QueryCacheManager.generateVisitKey(params);
102
+ await this.store.set(key, value, { ...options, source: 'visit' });
103
+ }
104
+ /**
105
+ * 埋め込みベクトルをキャッシュから取得
106
+ */
107
+ async getEmbedding(params) {
108
+ const key = QueryCacheManager.generateEmbeddingKey(params);
109
+ return this.store.get(key);
110
+ }
111
+ /**
112
+ * 埋め込みベクトルをキャッシュに保存
113
+ */
114
+ async setEmbedding(params, value, options = {}) {
115
+ const key = QueryCacheManager.generateEmbeddingKey(params);
116
+ await this.store.set(key, value, { ...options, source: 'embedding' });
117
+ }
118
+ /**
119
+ * 汎用的なキャッシュ取得
120
+ */
121
+ async get(key) {
122
+ return this.store.get(key);
123
+ }
124
+ /**
125
+ * 汎用的なキャッシュ保存
126
+ */
127
+ async set(key, value, options = {}) {
128
+ await this.store.set(key, value, options);
129
+ }
130
+ /**
131
+ * キャッシュエントリを削除
132
+ */
133
+ async delete(key) {
134
+ return this.store.delete(key);
135
+ }
136
+ /**
137
+ * URLに関連するキャッシュを削除
138
+ */
139
+ async invalidateUrl(url) {
140
+ let deletedCount = 0;
141
+ // 訪問キャッシュを削除
142
+ const visitKey = QueryCacheManager.generateVisitKey({ url });
143
+ if (await this.store.delete(visitKey)) {
144
+ deletedCount++;
145
+ }
146
+ // URL関連の検索キャッシュを検索・削除
147
+ const entries = await this.store.query({ source: 'visit' });
148
+ for (const entry of entries) {
149
+ if (entry.key.includes(url)) {
150
+ await this.store.delete(entry.key);
151
+ deletedCount++;
152
+ }
153
+ }
154
+ return deletedCount;
155
+ }
156
+ /**
157
+ * 特定のソースのキャッシュをすべて削除
158
+ */
159
+ async invalidateBySource(source) {
160
+ const entries = await this.store.query({ source });
161
+ let deletedCount = 0;
162
+ for (const entry of entries) {
163
+ if (await this.store.delete(entry.key)) {
164
+ deletedCount++;
165
+ }
166
+ }
167
+ return deletedCount;
168
+ }
169
+ /**
170
+ * すべてのキャッシュをクリア
171
+ */
172
+ async clear() {
173
+ await this.store.clear();
174
+ }
175
+ /**
176
+ * 統計情報を取得
177
+ */
178
+ async getStats() {
179
+ return this.store.getStats();
180
+ }
181
+ /**
182
+ * 期限切れエントリを削除
183
+ */
184
+ async evictExpired() {
185
+ return this.store.evictExpired();
186
+ }
187
+ /**
188
+ * キャッシュサマリーを取得(ログ用)
189
+ */
190
+ async getSummary() {
191
+ const stats = await this.getStats();
192
+ const hitRatePercent = (stats.hitRate * 100).toFixed(1);
193
+ const sizeMB = (stats.totalSizeBytes / (1024 * 1024)).toFixed(2);
194
+ return [
195
+ `Cache Summary:`,
196
+ ` Entries: ${stats.totalEntries}`,
197
+ ` Size: ${sizeMB} MB`,
198
+ ` Hit Rate: ${hitRatePercent}%`,
199
+ ` Hits: ${stats.hits}, Misses: ${stats.misses}`,
200
+ ` Evictions: ${stats.expiredEvictions} (expired), ${stats.lruEvictions} (LRU)`,
201
+ ].join('\n');
202
+ }
203
+ /**
204
+ * ストアインスタンスを取得(テスト用)
205
+ */
206
+ getStore() {
207
+ return this.store;
208
+ }
209
+ }
210
+ /**
211
+ * シングルトンインスタンス
212
+ */
213
+ let defaultManager = null;
214
+ /**
215
+ * デフォルトのキャッシュマネージャーを取得
216
+ */
217
+ export function getDefaultCacheManager(config) {
218
+ if (!defaultManager) {
219
+ defaultManager = new QueryCacheManager(config);
220
+ }
221
+ return defaultManager;
222
+ }
223
+ /**
224
+ * キャッシュマネージャーを作成
225
+ */
226
+ export function createCacheManager(config) {
227
+ return new QueryCacheManager(config);
228
+ }
229
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/cache/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Semantic Cache Matcher
3
+ * v1.0.0 - REQ-CACHE-001-02
4
+ *
5
+ * 意味的に類似したクエリのキャッシュマッチングを行う
6
+ * 埋め込みベクトルとコサイン類似度を使用
7
+ */
8
+ import { CacheEntry, CacheSource } from './types.js';
9
+ import { FileCacheStore } from './store.js';
10
+ /**
11
+ * 埋め込みベクトル
12
+ */
13
+ export type EmbeddingVector = number[];
14
+ /**
15
+ * クエリ埋め込みエントリ
16
+ */
17
+ export interface QueryEmbedding {
18
+ /** 元のクエリ文字列 */
19
+ query: string;
20
+ /** 埋め込みベクトル */
21
+ embedding: EmbeddingVector;
22
+ /** キャッシュキー */
23
+ cacheKey: string;
24
+ /** 作成日時 */
25
+ createdAt: string;
26
+ /** ソース種別 */
27
+ source: CacheSource;
28
+ }
29
+ /**
30
+ * 類似クエリ候補
31
+ */
32
+ export interface SimilarQueryCandidate {
33
+ /** 類似したクエリのキャッシュキー */
34
+ cacheKey: string;
35
+ /** 元のクエリ */
36
+ originalQuery: string;
37
+ /** 類似度スコア (0-1) */
38
+ similarity: number;
39
+ /** 作成日時 */
40
+ createdAt: string;
41
+ }
42
+ /**
43
+ * SemanticCacheMatcher設定
44
+ */
45
+ export interface SemanticCacheConfig {
46
+ /** 類似度の閾値 (0-1, デフォルト: 0.90) */
47
+ similarityThreshold: number;
48
+ /** 最大類似クエリ数 */
49
+ maxCandidates: number;
50
+ /** 埋め込みキャッシュの有効化 */
51
+ enabled: boolean;
52
+ /** 埋め込みモデル名 */
53
+ embeddingModel: string;
54
+ /** 埋め込み次元数 */
55
+ embeddingDimension: number;
56
+ }
57
+ /**
58
+ * デフォルト設定
59
+ */
60
+ export declare const DEFAULT_SEMANTIC_CONFIG: SemanticCacheConfig;
61
+ /**
62
+ * 埋め込みサービスインターフェース
63
+ */
64
+ export interface IEmbeddingService {
65
+ /** テキストから埋め込みベクトルを生成 */
66
+ embed(text: string): Promise<EmbeddingVector>;
67
+ /** 複数テキストの埋め込みベクトルをバッチ生成 */
68
+ embedBatch?(texts: string[]): Promise<EmbeddingVector[]>;
69
+ /** モデル名を取得 */
70
+ getModelName(): string;
71
+ /** 次元数を取得 */
72
+ getDimension(): number;
73
+ }
74
+ /**
75
+ * シンプルな埋め込みサービス(テスト/フォールバック用)
76
+ * 実運用では外部APIを使用
77
+ */
78
+ export declare class SimpleEmbeddingService implements IEmbeddingService {
79
+ private dimension;
80
+ private modelName;
81
+ constructor(dimension?: number, modelName?: string);
82
+ /**
83
+ * 簡易埋め込み生成(ハッシュベース)
84
+ * 実運用では OpenAI, Anthropic 等の API を使用
85
+ */
86
+ embed(text: string): Promise<EmbeddingVector>;
87
+ embedBatch(texts: string[]): Promise<EmbeddingVector[]>;
88
+ getModelName(): string;
89
+ getDimension(): number;
90
+ }
91
+ /**
92
+ * コサイン類似度を計算
93
+ */
94
+ export declare function cosineSimilarity(a: EmbeddingVector, b: EmbeddingVector): number;
95
+ /**
96
+ * SemanticCacheMatcher
97
+ * 意味的に類似したクエリのキャッシュマッチングを行う
98
+ */
99
+ export declare class SemanticCacheMatcher {
100
+ private config;
101
+ private embeddingService;
102
+ private cacheStore;
103
+ /** 埋め込みインデックス(メモリ上) */
104
+ private embeddingIndex;
105
+ constructor(cacheStore: FileCacheStore, config?: Partial<SemanticCacheConfig>, embeddingService?: IEmbeddingService);
106
+ /**
107
+ * クエリの埋め込みを生成し、インデックスに追加
108
+ */
109
+ indexQuery(query: string, cacheKey: string, source: CacheSource): Promise<void>;
110
+ /**
111
+ * 類似クエリを検索
112
+ */
113
+ findSimilar(query: string, source?: CacheSource): Promise<SimilarQueryCandidate[]>;
114
+ /**
115
+ * 最も類似したキャッシュエントリを取得
116
+ */
117
+ getBestMatch<T = unknown>(query: string, source?: CacheSource): Promise<{
118
+ entry: CacheEntry<T>;
119
+ similarity: number;
120
+ } | null>;
121
+ /**
122
+ * 埋め込みインデックスからエントリを削除
123
+ */
124
+ removeFromIndex(cacheKey: string): void;
125
+ /**
126
+ * インデックスをクリア
127
+ */
128
+ clearIndex(): void;
129
+ /**
130
+ * 永続化されたインデックスをロード
131
+ */
132
+ loadIndex(): Promise<number>;
133
+ /**
134
+ * インデックスサイズを取得
135
+ */
136
+ getIndexSize(): number;
137
+ /**
138
+ * 設定を取得
139
+ */
140
+ getConfig(): SemanticCacheConfig;
141
+ /**
142
+ * 類似度閾値を更新
143
+ */
144
+ setSimilarityThreshold(threshold: number): void;
145
+ /**
146
+ * 有効/無効を切り替え
147
+ */
148
+ setEnabled(enabled: boolean): void;
149
+ /**
150
+ * 統計情報を取得
151
+ */
152
+ getStats(): {
153
+ indexSize: number;
154
+ threshold: number;
155
+ enabled: boolean;
156
+ model: string;
157
+ dimension: number;
158
+ };
159
+ }
160
+ /**
161
+ * デフォルトインスタンス作成関数
162
+ */
163
+ export declare function createSemanticCacheMatcher(cacheStore: FileCacheStore, config?: Partial<SemanticCacheConfig>, embeddingService?: IEmbeddingService): SemanticCacheMatcher;
164
+ //# sourceMappingURL=semantic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../../src/cache/semantic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,241 @@
1
+ /**
2
+ * Semantic Cache Matcher
3
+ * v1.0.0 - REQ-CACHE-001-02
4
+ *
5
+ * 意味的に類似したクエリのキャッシュマッチングを行う
6
+ * 埋め込みベクトルとコサイン類似度を使用
7
+ */
8
+ /**
9
+ * デフォルト設定
10
+ */
11
+ export const DEFAULT_SEMANTIC_CONFIG = {
12
+ similarityThreshold: 0.90,
13
+ maxCandidates: 5,
14
+ enabled: true,
15
+ embeddingModel: 'default',
16
+ embeddingDimension: 1536,
17
+ };
18
+ /**
19
+ * シンプルな埋め込みサービス(テスト/フォールバック用)
20
+ * 実運用では外部APIを使用
21
+ */
22
+ export class SimpleEmbeddingService {
23
+ dimension;
24
+ modelName;
25
+ constructor(dimension = 64, modelName = 'simple-hash') {
26
+ this.dimension = dimension;
27
+ this.modelName = modelName;
28
+ }
29
+ /**
30
+ * 簡易埋め込み生成(ハッシュベース)
31
+ * 実運用では OpenAI, Anthropic 等の API を使用
32
+ */
33
+ async embed(text) {
34
+ const normalized = text.toLowerCase().trim();
35
+ const vector = new Array(this.dimension).fill(0);
36
+ // シンプルなハッシュベースの埋め込み
37
+ for (let i = 0; i < normalized.length; i++) {
38
+ const charCode = normalized.charCodeAt(i);
39
+ const idx = (charCode * (i + 1)) % this.dimension;
40
+ vector[idx] += charCode / 127; // normalize to ~1
41
+ }
42
+ // 正規化
43
+ const magnitude = Math.sqrt(vector.reduce((sum, v) => sum + v * v, 0)) || 1;
44
+ return vector.map((v) => v / magnitude);
45
+ }
46
+ async embedBatch(texts) {
47
+ return Promise.all(texts.map((t) => this.embed(t)));
48
+ }
49
+ getModelName() {
50
+ return this.modelName;
51
+ }
52
+ getDimension() {
53
+ return this.dimension;
54
+ }
55
+ }
56
+ /**
57
+ * コサイン類似度を計算
58
+ */
59
+ export function cosineSimilarity(a, b) {
60
+ if (a.length !== b.length) {
61
+ throw new Error(`Vector dimension mismatch: ${a.length} vs ${b.length}`);
62
+ }
63
+ let dotProduct = 0;
64
+ let magnitudeA = 0;
65
+ let magnitudeB = 0;
66
+ for (let i = 0; i < a.length; i++) {
67
+ dotProduct += a[i] * b[i];
68
+ magnitudeA += a[i] * a[i];
69
+ magnitudeB += b[i] * b[i];
70
+ }
71
+ magnitudeA = Math.sqrt(magnitudeA);
72
+ magnitudeB = Math.sqrt(magnitudeB);
73
+ if (magnitudeA === 0 || magnitudeB === 0) {
74
+ return 0;
75
+ }
76
+ return dotProduct / (magnitudeA * magnitudeB);
77
+ }
78
+ /**
79
+ * SemanticCacheMatcher
80
+ * 意味的に類似したクエリのキャッシュマッチングを行う
81
+ */
82
+ export class SemanticCacheMatcher {
83
+ config;
84
+ embeddingService;
85
+ cacheStore;
86
+ /** 埋め込みインデックス(メモリ上) */
87
+ embeddingIndex = new Map();
88
+ constructor(cacheStore, config = {}, embeddingService) {
89
+ this.config = { ...DEFAULT_SEMANTIC_CONFIG, ...config };
90
+ this.cacheStore = cacheStore;
91
+ this.embeddingService =
92
+ embeddingService || new SimpleEmbeddingService(this.config.embeddingDimension);
93
+ }
94
+ /**
95
+ * クエリの埋め込みを生成し、インデックスに追加
96
+ */
97
+ async indexQuery(query, cacheKey, source) {
98
+ if (!this.config.enabled)
99
+ return;
100
+ const embedding = await this.embeddingService.embed(query);
101
+ const entry = {
102
+ query,
103
+ embedding,
104
+ cacheKey,
105
+ source,
106
+ createdAt: new Date().toISOString(),
107
+ };
108
+ this.embeddingIndex.set(cacheKey, entry);
109
+ // 埋め込みもキャッシュストアに保存(永続化)
110
+ await this.cacheStore.set(`embedding:${cacheKey}`, entry, {
111
+ source: 'embedding',
112
+ ttlSeconds: 3600 * 24, // 24時間
113
+ });
114
+ }
115
+ /**
116
+ * 類似クエリを検索
117
+ */
118
+ async findSimilar(query, source) {
119
+ if (!this.config.enabled)
120
+ return [];
121
+ const queryEmbedding = await this.embeddingService.embed(query);
122
+ const candidates = [];
123
+ // メモリインデックスから検索
124
+ for (const [_key, entry] of this.embeddingIndex) {
125
+ // ソースフィルタ
126
+ if (source && entry.source !== source)
127
+ continue;
128
+ const similarity = cosineSimilarity(queryEmbedding, entry.embedding);
129
+ if (similarity >= this.config.similarityThreshold) {
130
+ candidates.push({
131
+ cacheKey: entry.cacheKey,
132
+ originalQuery: entry.query,
133
+ similarity,
134
+ createdAt: entry.createdAt,
135
+ });
136
+ }
137
+ }
138
+ // 類似度でソートして上位を返す
139
+ return candidates
140
+ .sort((a, b) => b.similarity - a.similarity)
141
+ .slice(0, this.config.maxCandidates);
142
+ }
143
+ /**
144
+ * 最も類似したキャッシュエントリを取得
145
+ */
146
+ async getBestMatch(query, source) {
147
+ const candidates = await this.findSimilar(query, source);
148
+ if (candidates.length === 0) {
149
+ return null;
150
+ }
151
+ const best = candidates[0];
152
+ const result = await this.cacheStore.get(best.cacheKey);
153
+ if (result.hit && result.value !== undefined) {
154
+ return {
155
+ entry: {
156
+ key: best.cacheKey,
157
+ value: result.value,
158
+ meta: result.meta,
159
+ },
160
+ similarity: best.similarity,
161
+ };
162
+ }
163
+ return null;
164
+ }
165
+ /**
166
+ * 埋め込みインデックスからエントリを削除
167
+ */
168
+ removeFromIndex(cacheKey) {
169
+ this.embeddingIndex.delete(cacheKey);
170
+ }
171
+ /**
172
+ * インデックスをクリア
173
+ */
174
+ clearIndex() {
175
+ this.embeddingIndex.clear();
176
+ }
177
+ /**
178
+ * 永続化されたインデックスをロード
179
+ */
180
+ async loadIndex() {
181
+ const entries = await this.cacheStore.query({
182
+ source: 'embedding',
183
+ limit: 10000,
184
+ });
185
+ let loadedCount = 0;
186
+ for (const entry of entries) {
187
+ const queryEmbedding = entry.value;
188
+ if (queryEmbedding.cacheKey && queryEmbedding.embedding) {
189
+ this.embeddingIndex.set(queryEmbedding.cacheKey, queryEmbedding);
190
+ loadedCount++;
191
+ }
192
+ }
193
+ return loadedCount;
194
+ }
195
+ /**
196
+ * インデックスサイズを取得
197
+ */
198
+ getIndexSize() {
199
+ return this.embeddingIndex.size;
200
+ }
201
+ /**
202
+ * 設定を取得
203
+ */
204
+ getConfig() {
205
+ return { ...this.config };
206
+ }
207
+ /**
208
+ * 類似度閾値を更新
209
+ */
210
+ setSimilarityThreshold(threshold) {
211
+ if (threshold < 0 || threshold > 1) {
212
+ throw new Error('Threshold must be between 0 and 1');
213
+ }
214
+ this.config.similarityThreshold = threshold;
215
+ }
216
+ /**
217
+ * 有効/無効を切り替え
218
+ */
219
+ setEnabled(enabled) {
220
+ this.config.enabled = enabled;
221
+ }
222
+ /**
223
+ * 統計情報を取得
224
+ */
225
+ getStats() {
226
+ return {
227
+ indexSize: this.embeddingIndex.size,
228
+ threshold: this.config.similarityThreshold,
229
+ enabled: this.config.enabled,
230
+ model: this.embeddingService.getModelName(),
231
+ dimension: this.embeddingService.getDimension(),
232
+ };
233
+ }
234
+ }
235
+ /**
236
+ * デフォルトインスタンス作成関数
237
+ */
238
+ export function createSemanticCacheMatcher(cacheStore, config, embeddingService) {
239
+ return new SemanticCacheMatcher(cacheStore, config, embeddingService);
240
+ }
241
+ //# sourceMappingURL=semantic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic.js","sourceRoot":"","sources":["../../src/cache/semantic.ts"],"names":[],"mappings":"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"}