@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,98 @@
1
+ /**
2
+ * File-based Cache Store Implementation
3
+ * v1.0.0 - REQ-CACHE-001-01
4
+ *
5
+ * ファイルベースのキャッシュストア実装
6
+ * LRU削除ポリシー、TTL管理対応
7
+ */
8
+ import { ICacheStore, CacheEntry, CacheResult, CacheSetOptions, CacheQueryOptions, CacheStats, CacheConfig, CacheSource } from './types.js';
9
+ /**
10
+ * デフォルトキャッシュ設定
11
+ */
12
+ export declare const DEFAULT_CACHE_CONFIG: CacheConfig;
13
+ /**
14
+ * ファイルベースキャッシュストア
15
+ */
16
+ export declare class FileCacheStore implements ICacheStore {
17
+ private config;
18
+ private stats;
19
+ private initialized;
20
+ constructor(config?: Partial<CacheConfig>);
21
+ /**
22
+ * 統計情報を初期化
23
+ */
24
+ private initStats;
25
+ /**
26
+ * キャッシュディレクトリを初期化
27
+ */
28
+ private ensureInitialized;
29
+ /**
30
+ * キーからファイルパスを生成
31
+ */
32
+ private getFilePaths;
33
+ /**
34
+ * クエリからキャッシュキーを生成
35
+ */
36
+ static generateKey(query: string, source?: CacheSource): string;
37
+ /**
38
+ * クエリハッシュを生成
39
+ */
40
+ static generateQueryHash(query: string): string;
41
+ /**
42
+ * キャッシュエントリを取得
43
+ */
44
+ get<T = unknown>(key: string): Promise<CacheResult<T>>;
45
+ /**
46
+ * キャッシュエントリを保存
47
+ */
48
+ set<T = unknown>(key: string, value: T, options?: CacheSetOptions): Promise<void>;
49
+ /**
50
+ * キャッシュエントリを削除
51
+ */
52
+ delete(key: string): Promise<boolean>;
53
+ /**
54
+ * 全エントリを削除
55
+ */
56
+ clear(): Promise<void>;
57
+ /**
58
+ * キーが存在するか確認
59
+ */
60
+ has(key: string): Promise<boolean>;
61
+ /**
62
+ * 統計情報を取得
63
+ */
64
+ getStats(): Promise<CacheStats>;
65
+ /**
66
+ * 期限切れエントリを削除
67
+ */
68
+ evictExpired(): Promise<number>;
69
+ /**
70
+ * LRUポリシーでエントリを削除
71
+ */
72
+ evictLru(targetSizeBytes: number): Promise<number>;
73
+ /**
74
+ * エントリを検索
75
+ */
76
+ query(options: CacheQueryOptions): Promise<CacheEntry[]>;
77
+ /**
78
+ * ヒット率を更新
79
+ */
80
+ private updateHitRate;
81
+ /**
82
+ * ソース別統計を更新
83
+ */
84
+ private updateSourceStats;
85
+ /**
86
+ * 統計情報を読み込み
87
+ */
88
+ private loadStats;
89
+ /**
90
+ * 統計情報を保存
91
+ */
92
+ saveStats(): Promise<void>;
93
+ }
94
+ /**
95
+ * デフォルトのキャッシュストアインスタンスを作成
96
+ */
97
+ export declare function createCacheStore(config?: Partial<CacheConfig>): FileCacheStore;
98
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EACL,WAAW,EACX,UAAU,EAEV,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,WAAW,EAGZ,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAclC,CAAC;AAEF;;GAEG;AACH,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,WAAW,CAAkB;gBAEzB,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM;IAK7C;;OAEG;IACH,OAAO,CAAC,SAAS;IAcjB;;OAEG;YACW,iBAAiB;IAiB/B;;OAEG;IACH,OAAO,CAAC,YAAY;IAUpB;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,WAAqB,GAAG,MAAM;IAIxE;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI/C;;OAEG;IACG,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IA0C5D;;OAEG;IACG,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgD3F;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyB3C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB5B;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAIrC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAgDrC;;OAEG;IACG,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4ExD;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAoE9D;;OAEG;IACH,OAAO,CAAC,aAAa;IAKrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkCzB;;OAEG;YACW,SAAS;IAWvB;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;CAKjC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,cAAc,CAE9E"}
@@ -0,0 +1,469 @@
1
+ /**
2
+ * File-based Cache Store Implementation
3
+ * v1.0.0 - REQ-CACHE-001-01
4
+ *
5
+ * ファイルベースのキャッシュストア実装
6
+ * LRU削除ポリシー、TTL管理対応
7
+ */
8
+ import * as fs from 'fs/promises';
9
+ import * as path from 'path';
10
+ import * as crypto from 'crypto';
11
+ /**
12
+ * デフォルトキャッシュ設定
13
+ */
14
+ export const DEFAULT_CACHE_CONFIG = {
15
+ enabled: true,
16
+ maxEntries: 1000,
17
+ defaultTtlSeconds: 3600, // 1時間
18
+ maxSizeBytes: 100 * 1024 * 1024, // 100MB
19
+ cacheDir: '.shikigami/cache',
20
+ ttlBySource: {
21
+ search: 3600, // 1時間
22
+ visit: 86400, // 24時間
23
+ embedding: 604800, // 7日
24
+ analysis: 86400, // 24時間
25
+ other: 3600, // 1時間
26
+ },
27
+ useGlobalCache: false,
28
+ };
29
+ /**
30
+ * ファイルベースキャッシュストア
31
+ */
32
+ export class FileCacheStore {
33
+ config;
34
+ stats;
35
+ initialized = false;
36
+ constructor(config = {}) {
37
+ this.config = { ...DEFAULT_CACHE_CONFIG, ...config };
38
+ this.stats = this.initStats();
39
+ }
40
+ /**
41
+ * 統計情報を初期化
42
+ */
43
+ initStats() {
44
+ return {
45
+ totalEntries: 0,
46
+ totalSizeBytes: 0,
47
+ hits: 0,
48
+ misses: 0,
49
+ hitRate: 0,
50
+ expiredEvictions: 0,
51
+ lruEvictions: 0,
52
+ bySource: {},
53
+ statsStartedAt: new Date().toISOString(),
54
+ };
55
+ }
56
+ /**
57
+ * キャッシュディレクトリを初期化
58
+ */
59
+ async ensureInitialized() {
60
+ if (this.initialized)
61
+ return;
62
+ try {
63
+ await fs.mkdir(this.config.cacheDir, { recursive: true });
64
+ await fs.mkdir(path.join(this.config.cacheDir, 'data'), { recursive: true });
65
+ await fs.mkdir(path.join(this.config.cacheDir, 'meta'), { recursive: true });
66
+ this.initialized = true;
67
+ // 既存の統計を読み込み
68
+ await this.loadStats();
69
+ }
70
+ catch (error) {
71
+ // ディレクトリ作成エラーは無視(すでに存在する場合)
72
+ this.initialized = true;
73
+ }
74
+ }
75
+ /**
76
+ * キーからファイルパスを生成
77
+ */
78
+ getFilePaths(key) {
79
+ const hash = crypto.createHash('sha256').update(key).digest('hex');
80
+ const subDir = hash.substring(0, 2); // 最初の2文字でサブディレクトリ分割
81
+ return {
82
+ dataPath: path.join(this.config.cacheDir, 'data', subDir, `${hash}.json`),
83
+ metaPath: path.join(this.config.cacheDir, 'meta', subDir, `${hash}.json`),
84
+ };
85
+ }
86
+ /**
87
+ * クエリからキャッシュキーを生成
88
+ */
89
+ static generateKey(query, source = 'other') {
90
+ return `${source}:${query}`;
91
+ }
92
+ /**
93
+ * クエリハッシュを生成
94
+ */
95
+ static generateQueryHash(query) {
96
+ return crypto.createHash('sha256').update(query).digest('hex').substring(0, 16);
97
+ }
98
+ /**
99
+ * キャッシュエントリを取得
100
+ */
101
+ async get(key) {
102
+ await this.ensureInitialized();
103
+ const { dataPath, metaPath } = this.getFilePaths(key);
104
+ try {
105
+ // メタデータを読み込み
106
+ const metaContent = await fs.readFile(metaPath, 'utf-8');
107
+ const meta = JSON.parse(metaContent);
108
+ // 期限切れチェック
109
+ if (new Date(meta.expiresAt) < new Date()) {
110
+ this.stats.misses++;
111
+ this.updateHitRate();
112
+ // 期限切れエントリを削除
113
+ await this.delete(key);
114
+ return { hit: false, key };
115
+ }
116
+ // データを読み込み
117
+ const dataContent = await fs.readFile(dataPath, 'utf-8');
118
+ const value = JSON.parse(dataContent);
119
+ // アクセス情報を更新
120
+ meta.lastAccessedAt = new Date().toISOString();
121
+ meta.accessCount++;
122
+ await fs.writeFile(metaPath, JSON.stringify(meta, null, 2));
123
+ // 統計更新
124
+ this.stats.hits++;
125
+ this.updateSourceStats(meta.source, 'hit');
126
+ this.updateHitRate();
127
+ return { hit: true, value, meta, key };
128
+ }
129
+ catch (error) {
130
+ // ファイルが存在しない場合
131
+ this.stats.misses++;
132
+ this.updateHitRate();
133
+ return { hit: false, key };
134
+ }
135
+ }
136
+ /**
137
+ * キャッシュエントリを保存
138
+ */
139
+ async set(key, value, options = {}) {
140
+ await this.ensureInitialized();
141
+ const { dataPath, metaPath } = this.getFilePaths(key);
142
+ const source = options.source || 'other';
143
+ const ttlSeconds = options.ttlSeconds || this.config.ttlBySource?.[source] || this.config.defaultTtlSeconds;
144
+ const now = new Date();
145
+ const dataStr = JSON.stringify(value);
146
+ const size = Buffer.byteLength(dataStr, 'utf-8');
147
+ const meta = {
148
+ createdAt: now.toISOString(),
149
+ lastAccessedAt: now.toISOString(),
150
+ expiresAt: new Date(now.getTime() + ttlSeconds * 1000).toISOString(),
151
+ accessCount: 0,
152
+ size,
153
+ source,
154
+ queryHash: FileCacheStore.generateQueryHash(key),
155
+ originalKey: key,
156
+ tags: options.tags,
157
+ };
158
+ // サイズ超過時はLRU削除
159
+ if (this.stats.totalSizeBytes + size > this.config.maxSizeBytes) {
160
+ await this.evictLru(size);
161
+ }
162
+ // エントリ数超過時はLRU削除
163
+ if (this.stats.totalEntries >= this.config.maxEntries) {
164
+ await this.evictLru(size);
165
+ }
166
+ // ディレクトリ作成
167
+ await fs.mkdir(path.dirname(dataPath), { recursive: true });
168
+ await fs.mkdir(path.dirname(metaPath), { recursive: true });
169
+ // ファイル書き込み
170
+ await fs.writeFile(dataPath, dataStr);
171
+ await fs.writeFile(metaPath, JSON.stringify(meta, null, 2));
172
+ // 統計更新
173
+ this.stats.totalEntries++;
174
+ this.stats.totalSizeBytes += size;
175
+ this.updateSourceStats(source, 'add', size);
176
+ }
177
+ /**
178
+ * キャッシュエントリを削除
179
+ */
180
+ async delete(key) {
181
+ await this.ensureInitialized();
182
+ const { dataPath, metaPath } = this.getFilePaths(key);
183
+ try {
184
+ // メタデータを読んでサイズを取得
185
+ const metaContent = await fs.readFile(metaPath, 'utf-8');
186
+ const meta = JSON.parse(metaContent);
187
+ // ファイル削除
188
+ await fs.unlink(dataPath).catch(() => { });
189
+ await fs.unlink(metaPath).catch(() => { });
190
+ // 統計更新
191
+ this.stats.totalEntries = Math.max(0, this.stats.totalEntries - 1);
192
+ this.stats.totalSizeBytes = Math.max(0, this.stats.totalSizeBytes - meta.size);
193
+ this.updateSourceStats(meta.source, 'remove', meta.size);
194
+ return true;
195
+ }
196
+ catch {
197
+ return false;
198
+ }
199
+ }
200
+ /**
201
+ * 全エントリを削除
202
+ */
203
+ async clear() {
204
+ await this.ensureInitialized();
205
+ try {
206
+ await fs.rm(path.join(this.config.cacheDir, 'data'), { recursive: true, force: true });
207
+ await fs.rm(path.join(this.config.cacheDir, 'meta'), { recursive: true, force: true });
208
+ await fs.mkdir(path.join(this.config.cacheDir, 'data'), { recursive: true });
209
+ await fs.mkdir(path.join(this.config.cacheDir, 'meta'), { recursive: true });
210
+ }
211
+ catch {
212
+ // 削除エラーは無視
213
+ }
214
+ // 統計リセット
215
+ this.stats = this.initStats();
216
+ }
217
+ /**
218
+ * キーが存在するか確認
219
+ */
220
+ async has(key) {
221
+ const result = await this.get(key);
222
+ return result.hit;
223
+ }
224
+ /**
225
+ * 統計情報を取得
226
+ */
227
+ async getStats() {
228
+ return { ...this.stats };
229
+ }
230
+ /**
231
+ * 期限切れエントリを削除
232
+ */
233
+ async evictExpired() {
234
+ await this.ensureInitialized();
235
+ let evictedCount = 0;
236
+ const metaDir = path.join(this.config.cacheDir, 'meta');
237
+ try {
238
+ const subDirs = await fs.readdir(metaDir);
239
+ for (const subDir of subDirs) {
240
+ const subDirPath = path.join(metaDir, subDir);
241
+ const stat = await fs.stat(subDirPath);
242
+ if (!stat.isDirectory())
243
+ continue;
244
+ const files = await fs.readdir(subDirPath);
245
+ for (const file of files) {
246
+ if (!file.endsWith('.json'))
247
+ continue;
248
+ const metaPath = path.join(subDirPath, file);
249
+ try {
250
+ const metaContent = await fs.readFile(metaPath, 'utf-8');
251
+ const meta = JSON.parse(metaContent);
252
+ if (new Date(meta.expiresAt) < new Date()) {
253
+ const hash = file.replace('.json', '');
254
+ const dataPath = path.join(this.config.cacheDir, 'data', subDir, `${hash}.json`);
255
+ await fs.unlink(dataPath).catch(() => { });
256
+ await fs.unlink(metaPath).catch(() => { });
257
+ this.stats.totalEntries = Math.max(0, this.stats.totalEntries - 1);
258
+ this.stats.totalSizeBytes = Math.max(0, this.stats.totalSizeBytes - meta.size);
259
+ this.stats.expiredEvictions++;
260
+ evictedCount++;
261
+ }
262
+ }
263
+ catch {
264
+ // ファイル読み込みエラーは無視
265
+ }
266
+ }
267
+ }
268
+ }
269
+ catch {
270
+ // ディレクトリ読み込みエラーは無視
271
+ }
272
+ return evictedCount;
273
+ }
274
+ /**
275
+ * LRUポリシーでエントリを削除
276
+ */
277
+ async evictLru(targetSizeBytes) {
278
+ await this.ensureInitialized();
279
+ // まず期限切れを削除
280
+ await this.evictExpired();
281
+ // まだサイズ超過なら古いものから削除
282
+ if (this.stats.totalSizeBytes + targetSizeBytes <= this.config.maxSizeBytes) {
283
+ return 0;
284
+ }
285
+ const candidates = [];
286
+ const metaDir = path.join(this.config.cacheDir, 'meta');
287
+ try {
288
+ const subDirs = await fs.readdir(metaDir);
289
+ for (const subDir of subDirs) {
290
+ const subDirPath = path.join(metaDir, subDir);
291
+ const stat = await fs.stat(subDirPath);
292
+ if (!stat.isDirectory())
293
+ continue;
294
+ const files = await fs.readdir(subDirPath);
295
+ for (const file of files) {
296
+ if (!file.endsWith('.json'))
297
+ continue;
298
+ const metaPath = path.join(subDirPath, file);
299
+ try {
300
+ const metaContent = await fs.readFile(metaPath, 'utf-8');
301
+ const meta = JSON.parse(metaContent);
302
+ const hash = file.replace('.json', '');
303
+ candidates.push({
304
+ key: `${subDir}/${hash}`,
305
+ lastAccessedAt: meta.lastAccessedAt,
306
+ size: meta.size,
307
+ });
308
+ }
309
+ catch {
310
+ // ファイル読み込みエラーは無視
311
+ }
312
+ }
313
+ }
314
+ }
315
+ catch {
316
+ return 0;
317
+ }
318
+ // 古い順にソート
319
+ candidates.sort((a, b) => new Date(a.lastAccessedAt).getTime() - new Date(b.lastAccessedAt).getTime());
320
+ let evictedCount = 0;
321
+ let freedBytes = 0;
322
+ const targetFree = targetSizeBytes;
323
+ for (const candidate of candidates) {
324
+ if (freedBytes >= targetFree)
325
+ break;
326
+ const [subDir, hash] = candidate.key.split('/');
327
+ const dataPath = path.join(this.config.cacheDir, 'data', subDir, `${hash}.json`);
328
+ const metaPath = path.join(this.config.cacheDir, 'meta', subDir, `${hash}.json`);
329
+ await fs.unlink(dataPath).catch(() => { });
330
+ await fs.unlink(metaPath).catch(() => { });
331
+ freedBytes += candidate.size;
332
+ evictedCount++;
333
+ this.stats.lruEvictions++;
334
+ this.stats.totalEntries = Math.max(0, this.stats.totalEntries - 1);
335
+ this.stats.totalSizeBytes = Math.max(0, this.stats.totalSizeBytes - candidate.size);
336
+ }
337
+ return evictedCount;
338
+ }
339
+ /**
340
+ * エントリを検索
341
+ */
342
+ async query(options) {
343
+ await this.ensureInitialized();
344
+ const entries = [];
345
+ const metaDir = path.join(this.config.cacheDir, 'meta');
346
+ const limit = options.limit || 100;
347
+ try {
348
+ const subDirs = await fs.readdir(metaDir);
349
+ for (const subDir of subDirs) {
350
+ if (entries.length >= limit)
351
+ break;
352
+ const subDirPath = path.join(metaDir, subDir);
353
+ const stat = await fs.stat(subDirPath);
354
+ if (!stat.isDirectory())
355
+ continue;
356
+ const files = await fs.readdir(subDirPath);
357
+ for (const file of files) {
358
+ if (entries.length >= limit)
359
+ break;
360
+ if (!file.endsWith('.json'))
361
+ continue;
362
+ const metaPath = path.join(subDirPath, file);
363
+ try {
364
+ const metaContent = await fs.readFile(metaPath, 'utf-8');
365
+ const meta = JSON.parse(metaContent);
366
+ // 期限切れフィルタ
367
+ if (!options.includeExpired && new Date(meta.expiresAt) < new Date()) {
368
+ continue;
369
+ }
370
+ // ソースフィルタ
371
+ if (options.source && meta.source !== options.source) {
372
+ continue;
373
+ }
374
+ // タグフィルタ
375
+ if (options.tags && options.tags.length > 0) {
376
+ const metaTags = meta.tags || [];
377
+ const hasAllTags = options.tags.every((tag) => metaTags.includes(tag));
378
+ if (!hasAllTags)
379
+ continue;
380
+ }
381
+ // データを読み込み
382
+ const hash = file.replace('.json', '');
383
+ const dataPath = path.join(this.config.cacheDir, 'data', subDir, `${hash}.json`);
384
+ const dataContent = await fs.readFile(dataPath, 'utf-8');
385
+ const value = JSON.parse(dataContent);
386
+ entries.push({
387
+ key: meta.originalKey || `${meta.source}:${meta.queryHash}`,
388
+ value,
389
+ meta,
390
+ });
391
+ }
392
+ catch {
393
+ // ファイル読み込みエラーは無視
394
+ }
395
+ }
396
+ }
397
+ }
398
+ catch {
399
+ // ディレクトリ読み込みエラーは無視
400
+ }
401
+ return entries;
402
+ }
403
+ /**
404
+ * ヒット率を更新
405
+ */
406
+ updateHitRate() {
407
+ const total = this.stats.hits + this.stats.misses;
408
+ this.stats.hitRate = total > 0 ? this.stats.hits / total : 0;
409
+ }
410
+ /**
411
+ * ソース別統計を更新
412
+ */
413
+ updateSourceStats(source, action, size) {
414
+ if (!this.stats.bySource[source]) {
415
+ this.stats.bySource[source] = {
416
+ entries: 0,
417
+ sizeBytes: 0,
418
+ hits: 0,
419
+ misses: 0,
420
+ };
421
+ }
422
+ const sourceStats = this.stats.bySource[source];
423
+ switch (action) {
424
+ case 'hit':
425
+ sourceStats.hits++;
426
+ break;
427
+ case 'miss':
428
+ sourceStats.misses++;
429
+ break;
430
+ case 'add':
431
+ sourceStats.entries++;
432
+ sourceStats.sizeBytes += size || 0;
433
+ break;
434
+ case 'remove':
435
+ sourceStats.entries = Math.max(0, sourceStats.entries - 1);
436
+ sourceStats.sizeBytes = Math.max(0, sourceStats.sizeBytes - (size || 0));
437
+ break;
438
+ }
439
+ }
440
+ /**
441
+ * 統計情報を読み込み
442
+ */
443
+ async loadStats() {
444
+ const statsPath = path.join(this.config.cacheDir, 'stats.json');
445
+ try {
446
+ const content = await fs.readFile(statsPath, 'utf-8');
447
+ const savedStats = JSON.parse(content);
448
+ this.stats = { ...this.stats, ...savedStats };
449
+ }
450
+ catch {
451
+ // ファイルがない場合は初期値を使用
452
+ }
453
+ }
454
+ /**
455
+ * 統計情報を保存
456
+ */
457
+ async saveStats() {
458
+ await this.ensureInitialized();
459
+ const statsPath = path.join(this.config.cacheDir, 'stats.json');
460
+ await fs.writeFile(statsPath, JSON.stringify(this.stats, null, 2));
461
+ }
462
+ }
463
+ /**
464
+ * デフォルトのキャッシュストアインスタンスを作成
465
+ */
466
+ export function createCacheStore(config) {
467
+ return new FileCacheStore(config);
468
+ }
469
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAejC;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAgB;IAC/C,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,IAAI;IAChB,iBAAiB,EAAE,IAAI,EAAE,MAAM;IAC/B,YAAY,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE,QAAQ;IACzC,QAAQ,EAAE,kBAAkB;IAC5B,WAAW,EAAE;QACX,MAAM,EAAE,IAAI,EAAE,MAAM;QACpB,KAAK,EAAE,KAAK,EAAE,OAAO;QACrB,SAAS,EAAE,MAAM,EAAE,KAAK;QACxB,QAAQ,EAAE,KAAK,EAAE,OAAO;QACxB,KAAK,EAAE,IAAI,EAAE,MAAM;KACpB;IACD,cAAc,EAAE,KAAK;CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,cAAc;IACjB,MAAM,CAAc;IACpB,KAAK,CAAa;IAClB,WAAW,GAAY,KAAK,CAAC;IAErC,YAAY,SAA+B,EAAE;QAC3C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,oBAAoB,EAAE,GAAG,MAAM,EAAE,CAAC;QACrD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACK,SAAS;QACf,OAAO;YACL,YAAY,EAAE,CAAC;YACf,cAAc,EAAE,CAAC;YACjB,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,CAAC;YACV,gBAAgB,EAAE,CAAC;YACnB,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE,EAAE;YACZ,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACzC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB;QAC7B,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAE7B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7E,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7E,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YAExB,aAAa;YACb,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,4BAA4B;YAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,GAAW;QAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,oBAAoB;QAEzD,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC;YACzE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC;SAC1E,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,KAAa,EAAE,SAAsB,OAAO;QAC7D,OAAO,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,KAAa;QACpC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAc,GAAW;QAChC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,aAAa;YACb,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,IAAI,GAAmB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAErD,WAAW;YACX,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;gBAC1C,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACpB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,cAAc;gBACd,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACvB,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;YAC7B,CAAC;YAED,WAAW;YACX,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAM,CAAC;YAE3C,YAAY;YACZ,IAAI,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC/C,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAE5D,OAAO;YACP,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAClB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC3C,IAAI,CAAC,aAAa,EAAE,CAAC;YAErB,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAe;YACf,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAc,GAAW,EAAE,KAAQ,EAAE,UAA2B,EAAE;QACzE,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC;QACzC,MAAM,UAAU,GACd,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;QAE3F,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEjD,MAAM,IAAI,GAAmB;YAC3B,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;YAC5B,cAAc,EAAE,GAAG,CAAC,WAAW,EAAE;YACjC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,UAAU,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;YACpE,WAAW,EAAE,CAAC;YACd,IAAI;YACJ,MAAM;YACN,SAAS,EAAE,cAAc,CAAC,iBAAiB,CAAC,GAAG,CAAC;YAChD,WAAW,EAAE,GAAG;YAChB,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC;QAEF,eAAe;QACf,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAChE,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,iBAAiB;QACjB,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACtD,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,WAAW;QACX,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5D,WAAW;QACX,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACtC,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE5D,OAAO;QACP,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC;QAClC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,kBAAkB;YAClB,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,IAAI,GAAmB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAErD,SAAS;YACT,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC1C,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAE1C,OAAO;YACP,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YACnE,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/E,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAEzD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACvF,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACvF,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7E,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC;YACP,WAAW;QACb,CAAC;QAED,SAAS;QACT,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC,GAAG,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAExD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAE1C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC9C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACvC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;oBAAE,SAAS;gBAElC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAE3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;wBAAE,SAAS;oBAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBAC7C,IAAI,CAAC;wBACH,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;wBACzD,MAAM,IAAI,GAAmB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;wBAErD,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;4BAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;4BACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;4BAEjF,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;4BAC1C,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;4BAE1C,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;4BACnE,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;4BAC/E,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;4BAC9B,YAAY,EAAE,CAAC;wBACjB,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,iBAAiB;oBACnB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mBAAmB;QACrB,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,eAAuB;QACpC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,YAAY;QACZ,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAE1B,oBAAoB;QACpB,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAC5E,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,UAAU,GAAmB,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAExD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAE1C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC9C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACvC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;oBAAE,SAAS;gBAElC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAE3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;wBAAE,SAAS;oBAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBAC7C,IAAI,CAAC;wBACH,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;wBACzD,MAAM,IAAI,GAAmB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;wBACrD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;wBAEvC,UAAU,CAAC,IAAI,CAAC;4BACd,GAAG,EAAE,GAAG,MAAM,IAAI,IAAI,EAAE;4BACxB,cAAc,EAAE,IAAI,CAAC,cAAc;4BACnC,IAAI,EAAE,IAAI,CAAC,IAAI;yBAChB,CAAC,CAAC;oBACL,CAAC;oBAAC,MAAM,CAAC;wBACP,iBAAiB;oBACnB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC;QACX,CAAC;QAED,UAAU;QACV,UAAU,CAAC,IAAI,CACb,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,CACtF,CAAC;QAEF,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,MAAM,UAAU,GAAG,eAAe,CAAC;QAEnC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,UAAU,IAAI,UAAU;gBAAE,MAAM;YAEpC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;YACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;YAEjF,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC1C,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAE1C,UAAU,IAAI,SAAS,CAAC,IAAI,CAAC;YAC7B,YAAY,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YACnE,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QACtF,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,OAA0B;QACpC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC;QAEnC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAE1C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK;oBAAE,MAAM;gBAEnC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC9C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACvC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;oBAAE,SAAS;gBAElC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAE3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK;wBAAE,MAAM;oBACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;wBAAE,SAAS;oBAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBAC7C,IAAI,CAAC;wBACH,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;wBACzD,MAAM,IAAI,GAAmB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;wBAErD,WAAW;wBACX,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;4BACrE,SAAS;wBACX,CAAC;wBAED,UAAU;wBACV,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;4BACrD,SAAS;wBACX,CAAC;wBAED,SAAS;wBACT,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;4BACjC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;4BACvE,IAAI,CAAC,UAAU;gCAAE,SAAS;wBAC5B,CAAC;wBAED,WAAW;wBACX,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;wBACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;wBACjF,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;wBACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;wBAEtC,OAAO,CAAC,IAAI,CAAC;4BACX,GAAG,EAAE,IAAI,CAAC,WAAW,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE;4BAC3D,KAAK;4BACL,IAAI;yBACL,CAAC,CAAC;oBACL,CAAC;oBAAC,MAAM,CAAC;wBACP,iBAAiB;oBACnB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mBAAmB;QACrB,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACK,iBAAiB,CACvB,MAAmB,EACnB,MAAyC,EACzC,IAAa;QAEb,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG;gBAC5B,OAAO,EAAE,CAAC;gBACV,SAAS,EAAE,CAAC;gBACZ,IAAI,EAAE,CAAC;gBACP,MAAM,EAAE,CAAC;aACV,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAqB,CAAC;QAEpE,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,KAAK;gBACR,WAAW,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM;YACR,KAAK,MAAM;gBACT,WAAW,CAAC,MAAM,EAAE,CAAC;gBACrB,MAAM;YACR,KAAK,KAAK;gBACR,WAAW,CAAC,OAAO,EAAE,CAAC;gBACtB,WAAW,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,QAAQ;gBACX,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;gBAC3D,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;gBACzE,MAAM;QACV,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,SAAS;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAChE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,UAAU,EAAE,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,mBAAmB;QACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAChE,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAA6B;IAC5D,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}