kiri-mcp-server 0.13.0 → 0.16.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.
- package/README.md +13 -17
- package/config/scoring-profiles.yml +78 -0
- package/config/stop-words.yml +307 -0
- package/dist/config/scoring-profiles.yml +78 -0
- package/dist/config/stop-words.yml +307 -0
- package/dist/package.json +2 -2
- package/dist/src/indexer/cli.d.ts +1 -0
- package/dist/src/indexer/cli.d.ts.map +1 -1
- package/dist/src/indexer/cli.js +22 -2
- package/dist/src/indexer/cli.js.map +1 -1
- package/dist/src/indexer/cochange.d.ts +97 -0
- package/dist/src/indexer/cochange.d.ts.map +1 -0
- package/dist/src/indexer/cochange.js +315 -0
- package/dist/src/indexer/cochange.js.map +1 -0
- package/dist/src/indexer/graph-metrics.d.ts +68 -0
- package/dist/src/indexer/graph-metrics.d.ts.map +1 -0
- package/dist/src/indexer/graph-metrics.js +239 -0
- package/dist/src/indexer/graph-metrics.js.map +1 -0
- package/dist/src/indexer/schema.d.ts +15 -0
- package/dist/src/indexer/schema.d.ts.map +1 -1
- package/dist/src/indexer/schema.js +86 -0
- package/dist/src/indexer/schema.js.map +1 -1
- package/dist/src/server/config.d.ts.map +1 -1
- package/dist/src/server/config.js +22 -16
- package/dist/src/server/config.js.map +1 -1
- package/dist/src/server/handlers/snippets-get.d.ts +10 -0
- package/dist/src/server/handlers/snippets-get.d.ts.map +1 -1
- package/dist/src/server/handlers/snippets-get.js +40 -3
- package/dist/src/server/handlers/snippets-get.js.map +1 -1
- package/dist/src/server/handlers.d.ts +1 -1
- package/dist/src/server/handlers.d.ts.map +1 -1
- package/dist/src/server/handlers.js +195 -51
- package/dist/src/server/handlers.js.map +1 -1
- package/dist/src/server/idf-provider.d.ts +110 -0
- package/dist/src/server/idf-provider.d.ts.map +1 -0
- package/dist/src/server/idf-provider.js +233 -0
- package/dist/src/server/idf-provider.js.map +1 -0
- package/dist/src/server/rpc.d.ts.map +1 -1
- package/dist/src/server/rpc.js +43 -4
- package/dist/src/server/rpc.js.map +1 -1
- package/dist/src/server/scoring.d.ts +10 -0
- package/dist/src/server/scoring.d.ts.map +1 -1
- package/dist/src/server/scoring.js +73 -0
- package/dist/src/server/scoring.js.map +1 -1
- package/dist/src/server/services/index.d.ts +2 -0
- package/dist/src/server/services/index.d.ts.map +1 -1
- package/dist/src/server/services/index.js +3 -0
- package/dist/src/server/services/index.js.map +1 -1
- package/dist/src/server/stop-words.d.ts +106 -0
- package/dist/src/server/stop-words.d.ts.map +1 -0
- package/dist/src/server/stop-words.js +312 -0
- package/dist/src/server/stop-words.js.map +1 -0
- package/dist/src/shared/adaptive-k-categories.d.ts +5 -0
- package/dist/src/shared/adaptive-k-categories.d.ts.map +1 -0
- package/dist/src/shared/adaptive-k-categories.js +17 -0
- package/dist/src/shared/adaptive-k-categories.js.map +1 -0
- package/dist/src/shared/duckdb.d.ts +8 -2
- package/dist/src/shared/duckdb.d.ts.map +1 -1
- package/dist/src/shared/duckdb.js +37 -62
- package/dist/src/shared/duckdb.js.map +1 -1
- package/package.json +2 -2
|
@@ -25,6 +25,12 @@ function validateWeights(weights, profileName) {
|
|
|
25
25
|
"blacklistPenaltyMultiplier",
|
|
26
26
|
"testPenaltyMultiplier",
|
|
27
27
|
"lockPenaltyMultiplier",
|
|
28
|
+
// Graph Layer parameters (Phase 3.2)
|
|
29
|
+
"graphInbound",
|
|
30
|
+
"graphImportance",
|
|
31
|
+
"graphDecay",
|
|
32
|
+
"graphMaxDepth",
|
|
33
|
+
"cochange",
|
|
28
34
|
];
|
|
29
35
|
const obj = weights;
|
|
30
36
|
// v1.0.0: Provide default values for new fields (backward compatibility)
|
|
@@ -40,6 +46,22 @@ function validateWeights(weights, profileName) {
|
|
|
40
46
|
console.warn(`[KIRI] Profile '${profileName}' missing lockPenaltyMultiplier, using default 0.01`);
|
|
41
47
|
obj.lockPenaltyMultiplier = 0.01;
|
|
42
48
|
}
|
|
49
|
+
// Graph Layer parameters (Phase 3.2): Provide default values for backward compatibility
|
|
50
|
+
if (obj.graphInbound === undefined) {
|
|
51
|
+
obj.graphInbound = 0.5;
|
|
52
|
+
}
|
|
53
|
+
if (obj.graphImportance === undefined) {
|
|
54
|
+
obj.graphImportance = 0.3;
|
|
55
|
+
}
|
|
56
|
+
if (obj.graphDecay === undefined) {
|
|
57
|
+
obj.graphDecay = 0.5;
|
|
58
|
+
}
|
|
59
|
+
if (obj.graphMaxDepth === undefined) {
|
|
60
|
+
obj.graphMaxDepth = 3;
|
|
61
|
+
}
|
|
62
|
+
if (obj.cochange === undefined) {
|
|
63
|
+
obj.cochange = 0.0;
|
|
64
|
+
}
|
|
43
65
|
for (const key of required) {
|
|
44
66
|
const value = obj[key];
|
|
45
67
|
if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
|
|
@@ -120,6 +142,17 @@ function loadProfilesFromConfig() {
|
|
|
120
142
|
}
|
|
121
143
|
validated[profile] = validateWeights(parsed[profile], profile);
|
|
122
144
|
}
|
|
145
|
+
// 追加プロファイル(graph-off, graph-onなど)もロード
|
|
146
|
+
for (const profileName of Object.keys(parsed)) {
|
|
147
|
+
if (!validated[profileName]) {
|
|
148
|
+
try {
|
|
149
|
+
validated[profileName] = validateWeights(parsed[profileName], profileName);
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
console.warn(`[KIRI] Skipping invalid optional profile '${profileName}':`, err);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
123
156
|
profilesCache = validated;
|
|
124
157
|
return profilesCache;
|
|
125
158
|
}
|
|
@@ -140,6 +173,11 @@ function loadProfilesFromConfig() {
|
|
|
140
173
|
blacklistPenaltyMultiplier: 0.01,
|
|
141
174
|
testPenaltyMultiplier: 0.02,
|
|
142
175
|
lockPenaltyMultiplier: 0.01,
|
|
176
|
+
graphInbound: 0.5,
|
|
177
|
+
graphImportance: 0.3,
|
|
178
|
+
graphDecay: 0.5,
|
|
179
|
+
graphMaxDepth: 3,
|
|
180
|
+
cochange: 0.0,
|
|
143
181
|
},
|
|
144
182
|
debug: {
|
|
145
183
|
textMatch: 1.0,
|
|
@@ -154,6 +192,11 @@ function loadProfilesFromConfig() {
|
|
|
154
192
|
blacklistPenaltyMultiplier: 0.01,
|
|
155
193
|
testPenaltyMultiplier: 0.02,
|
|
156
194
|
lockPenaltyMultiplier: 0.01,
|
|
195
|
+
graphInbound: 0.55,
|
|
196
|
+
graphImportance: 0.35,
|
|
197
|
+
graphDecay: 0.5,
|
|
198
|
+
graphMaxDepth: 3,
|
|
199
|
+
cochange: 0.0,
|
|
157
200
|
},
|
|
158
201
|
api: {
|
|
159
202
|
textMatch: 1.0,
|
|
@@ -168,6 +211,11 @@ function loadProfilesFromConfig() {
|
|
|
168
211
|
blacklistPenaltyMultiplier: 0.01,
|
|
169
212
|
testPenaltyMultiplier: 0.02,
|
|
170
213
|
lockPenaltyMultiplier: 0.01,
|
|
214
|
+
graphInbound: 0.5,
|
|
215
|
+
graphImportance: 0.3,
|
|
216
|
+
graphDecay: 0.5,
|
|
217
|
+
graphMaxDepth: 3,
|
|
218
|
+
cochange: 0.0,
|
|
171
219
|
},
|
|
172
220
|
editor: {
|
|
173
221
|
textMatch: 1.0,
|
|
@@ -182,6 +230,11 @@ function loadProfilesFromConfig() {
|
|
|
182
230
|
blacklistPenaltyMultiplier: 0.01,
|
|
183
231
|
testPenaltyMultiplier: 0.02,
|
|
184
232
|
lockPenaltyMultiplier: 0.01,
|
|
233
|
+
graphInbound: 0.45,
|
|
234
|
+
graphImportance: 0.25,
|
|
235
|
+
graphDecay: 0.5,
|
|
236
|
+
graphMaxDepth: 3,
|
|
237
|
+
cochange: 0.0,
|
|
185
238
|
},
|
|
186
239
|
bugfix: {
|
|
187
240
|
textMatch: 1.0,
|
|
@@ -196,6 +249,11 @@ function loadProfilesFromConfig() {
|
|
|
196
249
|
blacklistPenaltyMultiplier: 0.01,
|
|
197
250
|
testPenaltyMultiplier: 0.02,
|
|
198
251
|
lockPenaltyMultiplier: 0.01,
|
|
252
|
+
graphInbound: 0.6,
|
|
253
|
+
graphImportance: 0.4,
|
|
254
|
+
graphDecay: 0.5,
|
|
255
|
+
graphMaxDepth: 3,
|
|
256
|
+
cochange: 0.0,
|
|
199
257
|
},
|
|
200
258
|
testfail: {
|
|
201
259
|
textMatch: 1.0,
|
|
@@ -210,6 +268,11 @@ function loadProfilesFromConfig() {
|
|
|
210
268
|
blacklistPenaltyMultiplier: 0.01,
|
|
211
269
|
testPenaltyMultiplier: 0.2,
|
|
212
270
|
lockPenaltyMultiplier: 0.01,
|
|
271
|
+
graphInbound: 0.4,
|
|
272
|
+
graphImportance: 0.3,
|
|
273
|
+
graphDecay: 0.5,
|
|
274
|
+
graphMaxDepth: 3,
|
|
275
|
+
cochange: 0.0,
|
|
213
276
|
},
|
|
214
277
|
typeerror: {
|
|
215
278
|
textMatch: 1.0,
|
|
@@ -224,6 +287,11 @@ function loadProfilesFromConfig() {
|
|
|
224
287
|
blacklistPenaltyMultiplier: 0.01,
|
|
225
288
|
testPenaltyMultiplier: 0.02,
|
|
226
289
|
lockPenaltyMultiplier: 0.01,
|
|
290
|
+
graphInbound: 0.35,
|
|
291
|
+
graphImportance: 0.25,
|
|
292
|
+
graphDecay: 0.5,
|
|
293
|
+
graphMaxDepth: 3,
|
|
294
|
+
cochange: 0.0,
|
|
227
295
|
},
|
|
228
296
|
feature: {
|
|
229
297
|
textMatch: 1.0,
|
|
@@ -238,6 +306,11 @@ function loadProfilesFromConfig() {
|
|
|
238
306
|
blacklistPenaltyMultiplier: 0.01,
|
|
239
307
|
testPenaltyMultiplier: 0.02,
|
|
240
308
|
lockPenaltyMultiplier: 0.01,
|
|
309
|
+
graphInbound: 0.5,
|
|
310
|
+
graphImportance: 0.35,
|
|
311
|
+
graphDecay: 0.5,
|
|
312
|
+
graphMaxDepth: 3,
|
|
313
|
+
cochange: 0.0,
|
|
241
314
|
},
|
|
242
315
|
};
|
|
243
316
|
return profilesCache;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../../src/server/scoring.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../../src/server/scoring.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DuckDBClient } from "../../shared/duckdb.js";
|
|
2
2
|
import { type DomainTermsDictionary } from "../domain-terms.js";
|
|
3
|
+
import { type StopWordsService } from "../stop-words.js";
|
|
3
4
|
import { RepoRepository } from "./repo-repository.js";
|
|
4
5
|
import { RepoResolver } from "./repo-resolver.js";
|
|
5
6
|
/**
|
|
@@ -12,6 +13,7 @@ export interface ServerServices {
|
|
|
12
13
|
repoRepository: RepoRepository;
|
|
13
14
|
repoResolver: RepoResolver;
|
|
14
15
|
domainTerms: DomainTermsDictionary;
|
|
16
|
+
stopWords: StopWordsService;
|
|
15
17
|
}
|
|
16
18
|
/**
|
|
17
19
|
* createServerServices
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAExE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,qBAAqB,CAAC;IACnC,SAAS,EAAE,gBAAgB,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,YAAY,GAAG,cAAc,CAsBrE"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { loadDomainTerms, } from "../domain-terms.js";
|
|
2
|
+
import { loadStopWords } from "../stop-words.js";
|
|
2
3
|
import { RepoRepository } from "./repo-repository.js";
|
|
3
4
|
import { RepoResolver } from "./repo-resolver.js";
|
|
4
5
|
/**
|
|
@@ -23,10 +24,12 @@ export function createServerServices(db) {
|
|
|
23
24
|
return { matched: [], aliases: [], fileHints: [] };
|
|
24
25
|
}
|
|
25
26
|
})();
|
|
27
|
+
const stopWords = loadStopWords();
|
|
26
28
|
return {
|
|
27
29
|
repoRepository,
|
|
28
30
|
repoResolver,
|
|
29
31
|
domainTerms,
|
|
32
|
+
stopWords,
|
|
30
33
|
};
|
|
31
34
|
}
|
|
32
35
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/services/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,GAGhB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/services/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,GAGhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAyB,MAAM,kBAAkB,CAAC;AAExE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAelD;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAgB;IACnD,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,EAAE,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,cAAc,CAAC,CAAC;IACtD,MAAM,WAAW,GACf,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG;QAC1C,CAAC,CAAC,eAAe,EAAE;QACnB,CAAC,CAAE,IAAI,CAAC,MAAM,SAAS;YACnB,cAAc;gBACZ,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;YACrD,CAAC;YACD,gBAAgB;gBACd,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;YACrD,CAAC;SACF,CAAC,EAAuC,CAAC;IAChD,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAElC,OAAO;QACL,cAAc;QACd,YAAY;QACZ,WAAW;QACX,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stop Words Service
|
|
3
|
+
*
|
|
4
|
+
* ストップワード(除外語)の設定と判定を提供するサービス。
|
|
5
|
+
* 多言語対応(英語・日本語)、外部設定ファイルからの読み込み、
|
|
6
|
+
* シングルトンキャッシュによるパフォーマンス最適化を実装。
|
|
7
|
+
*
|
|
8
|
+
* @see Issue #48: Improve context_bundle stop word coverage and configurability
|
|
9
|
+
*/
|
|
10
|
+
export interface StopWordsConfig {
|
|
11
|
+
version: string;
|
|
12
|
+
default_language: "en" | "ja";
|
|
13
|
+
languages: Record<string, {
|
|
14
|
+
words: string[];
|
|
15
|
+
}>;
|
|
16
|
+
code_generic: string[];
|
|
17
|
+
custom: string[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Phase 2用IDFプロバイダーインターフェース
|
|
21
|
+
* Phase 1では使用しないが、将来の拡張に備えて定義
|
|
22
|
+
*/
|
|
23
|
+
export interface IdfProvider {
|
|
24
|
+
getIdf(word: string): number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* ストップワードサービス
|
|
28
|
+
*
|
|
29
|
+
* ストップワードの判定と重み付けを提供する。
|
|
30
|
+
* 設定ファイルがない場合はレガシーモードで動作し、
|
|
31
|
+
* 既存の31語のストップワードを使用する。
|
|
32
|
+
*/
|
|
33
|
+
export declare class StopWordsService {
|
|
34
|
+
private readonly words;
|
|
35
|
+
private readonly isLegacyMode;
|
|
36
|
+
constructor(config: StopWordsConfig | null, language?: string);
|
|
37
|
+
/**
|
|
38
|
+
* ストップワード判定
|
|
39
|
+
*
|
|
40
|
+
* @param word - 判定対象の単語
|
|
41
|
+
* @returns ストップワードならtrue
|
|
42
|
+
*/
|
|
43
|
+
has(word: string): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* IDF重み付け取得
|
|
46
|
+
*
|
|
47
|
+
* ストップワードの場合は0.0を返す。
|
|
48
|
+
* IdfProviderが提供された場合は、IDFベースの重みを返す。
|
|
49
|
+
* それ以外の場合は1.0(ニュートラル重み)を返す。
|
|
50
|
+
*
|
|
51
|
+
* Phase 2実装: IdfProviderを使用して高頻度語を自動的に減衰。
|
|
52
|
+
*
|
|
53
|
+
* @param word - 対象単語
|
|
54
|
+
* @param idfProvider - IDFプロバイダー(オプション)
|
|
55
|
+
* @returns 重み(0.0〜1.0)
|
|
56
|
+
*/
|
|
57
|
+
getWeight(word: string, idfProvider?: IdfProvider): number;
|
|
58
|
+
/**
|
|
59
|
+
* トークン正規化
|
|
60
|
+
* - 空文字・null/undefinedの防御処理
|
|
61
|
+
* - NFKC正規化(全角→半角、濁点統合等)
|
|
62
|
+
* - 小文字化
|
|
63
|
+
* - カタカナ→ひらがな変換(日本語用)
|
|
64
|
+
*
|
|
65
|
+
* @param token - 正規化対象のトークン
|
|
66
|
+
* @returns 正規化されたトークン(空入力時は空文字列)
|
|
67
|
+
*/
|
|
68
|
+
static normalizeToken(token: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* デバッグ用: 現在のストップワード数を取得
|
|
71
|
+
*/
|
|
72
|
+
get size(): number;
|
|
73
|
+
/**
|
|
74
|
+
* レガシーモードかどうか
|
|
75
|
+
*/
|
|
76
|
+
get legacy(): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* 全ストップワードを取得(デバッグ・テスト用)
|
|
79
|
+
*/
|
|
80
|
+
getWords(): string[];
|
|
81
|
+
}
|
|
82
|
+
export interface LoadStopWordsOptions {
|
|
83
|
+
configPath?: string;
|
|
84
|
+
cwd?: string;
|
|
85
|
+
language?: string;
|
|
86
|
+
forceReload?: boolean;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* ストップワードサービスをロード
|
|
90
|
+
*
|
|
91
|
+
* 設定ファイルを読み込み、StopWordsServiceを初期化する。
|
|
92
|
+
* シングルトンキャッシュを使用し、同一設定ファイルの再読み込みを回避。
|
|
93
|
+
*
|
|
94
|
+
* @param options - ロードオプション
|
|
95
|
+
* @returns StopWordsServiceインスタンス
|
|
96
|
+
*/
|
|
97
|
+
export declare function loadStopWords(options?: LoadStopWordsOptions): StopWordsService;
|
|
98
|
+
/**
|
|
99
|
+
* テスト用: キャッシュクリア
|
|
100
|
+
*/
|
|
101
|
+
export declare function clearStopWordsCache(): void;
|
|
102
|
+
/**
|
|
103
|
+
* レガシーストップワードリストを取得(テスト・マイグレーション用)
|
|
104
|
+
*/
|
|
105
|
+
export declare function getLegacyStopWords(): readonly string[];
|
|
106
|
+
//# sourceMappingURL=stop-words.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop-words.d.ts","sourceRoot":"","sources":["../../../src/server/stop-words.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA0CH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,IAAI,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC/C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAC9B;AA4DD;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;gBAE3B,MAAM,EAAE,eAAe,GAAG,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM;IAgC7D;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,MAAM;IAe1D;;;;;;;;;OASG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IA8B5C;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED;;OAEG;IACH,QAAQ,IAAI,MAAM,EAAE;CAGrB;AA6BD,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,gBAAgB,CA0DlF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,SAAS,MAAM,EAAE,CAEtD"}
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stop Words Service
|
|
3
|
+
*
|
|
4
|
+
* ストップワード(除外語)の設定と判定を提供するサービス。
|
|
5
|
+
* 多言語対応(英語・日本語)、外部設定ファイルからの読み込み、
|
|
6
|
+
* シングルトンキャッシュによるパフォーマンス最適化を実装。
|
|
7
|
+
*
|
|
8
|
+
* @see Issue #48: Improve context_bundle stop word coverage and configurability
|
|
9
|
+
*/
|
|
10
|
+
import fs from "node:fs";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
import { parse } from "yaml";
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
// ============================================================
|
|
15
|
+
// 定数
|
|
16
|
+
// ============================================================
|
|
17
|
+
/**
|
|
18
|
+
* カタカナ→ひらがな変換オフセット
|
|
19
|
+
*
|
|
20
|
+
* Unicode上でカタカナ(U+30A1-U+30F6)とひらがな(U+3041-U+3096)は
|
|
21
|
+
* 0x60(96)の差で対応している。例: ア(U+30A2) - 0x60 = あ(U+3042)
|
|
22
|
+
*
|
|
23
|
+
* @see https://www.unicode.org/charts/PDF/U3040.pdf (Hiragana)
|
|
24
|
+
* @see https://en.wikipedia.org/wiki/Katakana_(Unicode_block)
|
|
25
|
+
*/
|
|
26
|
+
const KATAKANA_HIRAGANA_OFFSET = 0x60;
|
|
27
|
+
/**
|
|
28
|
+
* カタカナ変換対象範囲の開始 (ァ)
|
|
29
|
+
* U+30A1-U+30F6 は全て -0x60 でひらがなに変換可能
|
|
30
|
+
*/
|
|
31
|
+
const KATAKANA_START = 0x30a1;
|
|
32
|
+
/**
|
|
33
|
+
* カタカナ変換対象範囲の終了 (ヶ)
|
|
34
|
+
* この範囲にはヴ(U+30F4)、ヵ(U+30F5)、ヶ(U+30F6)も含まれる
|
|
35
|
+
*
|
|
36
|
+
* 注意: U+30F7-U+30FA (ヷ-ヺ) は対応ひらがなが未割当のため除外
|
|
37
|
+
* 注意: U+30FC (ー) は長音記号でひらがな/カタカナ共用のため変換不要
|
|
38
|
+
*/
|
|
39
|
+
const KATAKANA_END = 0x30f6;
|
|
40
|
+
// ============================================================
|
|
41
|
+
// Zodスキーマ
|
|
42
|
+
// ============================================================
|
|
43
|
+
const LanguageWordsSchema = z.object({
|
|
44
|
+
words: z.array(z.string().trim().min(1)),
|
|
45
|
+
});
|
|
46
|
+
const StopWordsConfigSchema = z.object({
|
|
47
|
+
version: z.string().default("1.0"),
|
|
48
|
+
default_language: z.enum(["en", "ja"]).default("en"),
|
|
49
|
+
languages: z.record(z.string(), LanguageWordsSchema).default({}),
|
|
50
|
+
code_generic: z.array(z.string().trim().min(1)).default([]),
|
|
51
|
+
custom: z.array(z.string().trim().min(1)).default([]),
|
|
52
|
+
});
|
|
53
|
+
// ============================================================
|
|
54
|
+
// レガシーデフォルト(後方互換用)
|
|
55
|
+
// ============================================================
|
|
56
|
+
const LEGACY_STOP_WORDS = [
|
|
57
|
+
"the",
|
|
58
|
+
"and",
|
|
59
|
+
"for",
|
|
60
|
+
"with",
|
|
61
|
+
"from",
|
|
62
|
+
"this",
|
|
63
|
+
"that",
|
|
64
|
+
"have",
|
|
65
|
+
"has",
|
|
66
|
+
"will",
|
|
67
|
+
"would",
|
|
68
|
+
"into",
|
|
69
|
+
"about",
|
|
70
|
+
"there",
|
|
71
|
+
"their",
|
|
72
|
+
"your",
|
|
73
|
+
"fix",
|
|
74
|
+
"test",
|
|
75
|
+
"tests",
|
|
76
|
+
"issue",
|
|
77
|
+
"error",
|
|
78
|
+
"bug",
|
|
79
|
+
"fail",
|
|
80
|
+
"failing",
|
|
81
|
+
"make",
|
|
82
|
+
"when",
|
|
83
|
+
"where",
|
|
84
|
+
"should",
|
|
85
|
+
"could",
|
|
86
|
+
"need",
|
|
87
|
+
"goal",
|
|
88
|
+
];
|
|
89
|
+
// ============================================================
|
|
90
|
+
// StopWordsService クラス
|
|
91
|
+
// ============================================================
|
|
92
|
+
/**
|
|
93
|
+
* ストップワードサービス
|
|
94
|
+
*
|
|
95
|
+
* ストップワードの判定と重み付けを提供する。
|
|
96
|
+
* 設定ファイルがない場合はレガシーモードで動作し、
|
|
97
|
+
* 既存の31語のストップワードを使用する。
|
|
98
|
+
*/
|
|
99
|
+
export class StopWordsService {
|
|
100
|
+
words;
|
|
101
|
+
isLegacyMode;
|
|
102
|
+
constructor(config, language) {
|
|
103
|
+
if (!config) {
|
|
104
|
+
// レガシーモード: 設定ファイルなし
|
|
105
|
+
this.words = new Set(LEGACY_STOP_WORDS);
|
|
106
|
+
this.isLegacyMode = true;
|
|
107
|
+
console.info(`[KIRI] Using legacy stop words (${LEGACY_STOP_WORDS.length} words). ` +
|
|
108
|
+
"Consider adding config/stop-words.yml for extended support.");
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
this.isLegacyMode = false;
|
|
112
|
+
const lang = language ?? config.default_language;
|
|
113
|
+
const langWords = config.languages[lang]?.words ?? [];
|
|
114
|
+
// マージ優先順位: code_generic < language < custom
|
|
115
|
+
// 全て同じSetに追加されるため、実質的に和集合
|
|
116
|
+
const merged = new Set();
|
|
117
|
+
for (const word of config.code_generic) {
|
|
118
|
+
merged.add(StopWordsService.normalizeToken(word));
|
|
119
|
+
}
|
|
120
|
+
for (const word of langWords) {
|
|
121
|
+
merged.add(StopWordsService.normalizeToken(word));
|
|
122
|
+
}
|
|
123
|
+
for (const word of config.custom) {
|
|
124
|
+
merged.add(StopWordsService.normalizeToken(word));
|
|
125
|
+
}
|
|
126
|
+
this.words = merged;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* ストップワード判定
|
|
130
|
+
*
|
|
131
|
+
* @param word - 判定対象の単語
|
|
132
|
+
* @returns ストップワードならtrue
|
|
133
|
+
*/
|
|
134
|
+
has(word) {
|
|
135
|
+
return this.words.has(StopWordsService.normalizeToken(word));
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* IDF重み付け取得
|
|
139
|
+
*
|
|
140
|
+
* ストップワードの場合は0.0を返す。
|
|
141
|
+
* IdfProviderが提供された場合は、IDFベースの重みを返す。
|
|
142
|
+
* それ以外の場合は1.0(ニュートラル重み)を返す。
|
|
143
|
+
*
|
|
144
|
+
* Phase 2実装: IdfProviderを使用して高頻度語を自動的に減衰。
|
|
145
|
+
*
|
|
146
|
+
* @param word - 対象単語
|
|
147
|
+
* @param idfProvider - IDFプロバイダー(オプション)
|
|
148
|
+
* @returns 重み(0.0〜1.0)
|
|
149
|
+
*/
|
|
150
|
+
getWeight(word, idfProvider) {
|
|
151
|
+
// ストップワードは常に0.0
|
|
152
|
+
if (this.has(word)) {
|
|
153
|
+
return 0.0;
|
|
154
|
+
}
|
|
155
|
+
// IdfProviderが提供されている場合はIDF重みを使用
|
|
156
|
+
if (idfProvider) {
|
|
157
|
+
return idfProvider.getIdf(word);
|
|
158
|
+
}
|
|
159
|
+
// フォールバック: ニュートラル重み
|
|
160
|
+
return 1.0;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* トークン正規化
|
|
164
|
+
* - 空文字・null/undefinedの防御処理
|
|
165
|
+
* - NFKC正規化(全角→半角、濁点統合等)
|
|
166
|
+
* - 小文字化
|
|
167
|
+
* - カタカナ→ひらがな変換(日本語用)
|
|
168
|
+
*
|
|
169
|
+
* @param token - 正規化対象のトークン
|
|
170
|
+
* @returns 正規化されたトークン(空入力時は空文字列)
|
|
171
|
+
*/
|
|
172
|
+
static normalizeToken(token) {
|
|
173
|
+
// 防御的ガード: null/undefined/空文字の場合は早期リターン
|
|
174
|
+
if (!token) {
|
|
175
|
+
return "";
|
|
176
|
+
}
|
|
177
|
+
// NFKC正規化
|
|
178
|
+
let normalized = token.normalize("NFKC");
|
|
179
|
+
// 小文字化
|
|
180
|
+
normalized = normalized.toLowerCase();
|
|
181
|
+
// カタカナ→ひらがな変換
|
|
182
|
+
// 範囲: U+30A1(ァ)〜U+30F6(ヶ)
|
|
183
|
+
// 長音記号ー(U+30FC)は範囲外のため変換されず、ひらがな文中でもそのまま保持される
|
|
184
|
+
// codePointAtを使用してサロゲートペア対応(カタカナはBMP内だが安全のため)
|
|
185
|
+
normalized = normalized.replace(new RegExp(`[\\u${KATAKANA_START.toString(16)}-\\u${KATAKANA_END.toString(16)}]`, "g"), (char) => {
|
|
186
|
+
const codePoint = char.codePointAt(0);
|
|
187
|
+
if (codePoint === undefined) {
|
|
188
|
+
return char;
|
|
189
|
+
}
|
|
190
|
+
return String.fromCodePoint(codePoint - KATAKANA_HIRAGANA_OFFSET);
|
|
191
|
+
});
|
|
192
|
+
return normalized.trim();
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* デバッグ用: 現在のストップワード数を取得
|
|
196
|
+
*/
|
|
197
|
+
get size() {
|
|
198
|
+
return this.words.size;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* レガシーモードかどうか
|
|
202
|
+
*/
|
|
203
|
+
get legacy() {
|
|
204
|
+
return this.isLegacyMode;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* 全ストップワードを取得(デバッグ・テスト用)
|
|
208
|
+
*/
|
|
209
|
+
getWords() {
|
|
210
|
+
return Array.from(this.words);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// ============================================================
|
|
214
|
+
// シングルトンキャッシュ
|
|
215
|
+
// ============================================================
|
|
216
|
+
let cachedService = null;
|
|
217
|
+
let cachedConfigPath = null;
|
|
218
|
+
let cachedConfigMtime = null;
|
|
219
|
+
function getConfigMtime(configPath) {
|
|
220
|
+
try {
|
|
221
|
+
return fs.statSync(configPath).mtimeMs;
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// ============================================================
|
|
228
|
+
// ローダー関数
|
|
229
|
+
// ============================================================
|
|
230
|
+
const CONFIG_CANDIDATES = [
|
|
231
|
+
".kiri/stop-words.yml",
|
|
232
|
+
".kiri/stop-words.yaml",
|
|
233
|
+
"config/stop-words.yml",
|
|
234
|
+
"config/stop-words.yaml",
|
|
235
|
+
];
|
|
236
|
+
/**
|
|
237
|
+
* ストップワードサービスをロード
|
|
238
|
+
*
|
|
239
|
+
* 設定ファイルを読み込み、StopWordsServiceを初期化する。
|
|
240
|
+
* シングルトンキャッシュを使用し、同一設定ファイルの再読み込みを回避。
|
|
241
|
+
*
|
|
242
|
+
* @param options - ロードオプション
|
|
243
|
+
* @returns StopWordsServiceインスタンス
|
|
244
|
+
*/
|
|
245
|
+
export function loadStopWords(options = {}) {
|
|
246
|
+
const cwd = options.cwd ?? process.cwd();
|
|
247
|
+
const forceReload = options.forceReload ?? false;
|
|
248
|
+
// 設定ファイルパスの解決
|
|
249
|
+
let resolvedPath = null;
|
|
250
|
+
if (options.configPath) {
|
|
251
|
+
resolvedPath = path.isAbsolute(options.configPath)
|
|
252
|
+
? options.configPath
|
|
253
|
+
: path.join(cwd, options.configPath);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
for (const candidate of CONFIG_CANDIDATES) {
|
|
257
|
+
const fullPath = path.join(cwd, candidate);
|
|
258
|
+
if (fs.existsSync(fullPath)) {
|
|
259
|
+
resolvedPath = fullPath;
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// キャッシュ有効性チェック
|
|
265
|
+
if (!forceReload && cachedService) {
|
|
266
|
+
if (!resolvedPath && cachedConfigPath === null) {
|
|
267
|
+
return cachedService; // 両方ともconfig無し
|
|
268
|
+
}
|
|
269
|
+
if (resolvedPath && resolvedPath === cachedConfigPath) {
|
|
270
|
+
const currentMtime = getConfigMtime(resolvedPath);
|
|
271
|
+
if (currentMtime === cachedConfigMtime) {
|
|
272
|
+
return cachedService; // 同一ファイル、未変更
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// 設定ファイル読み込み
|
|
277
|
+
let config = null;
|
|
278
|
+
if (resolvedPath && fs.existsSync(resolvedPath)) {
|
|
279
|
+
const raw = fs.readFileSync(resolvedPath, "utf8");
|
|
280
|
+
const parsed = parse(raw);
|
|
281
|
+
const result = StopWordsConfigSchema.safeParse(parsed);
|
|
282
|
+
if (!result.success) {
|
|
283
|
+
const details = result.error.issues.map((issue) => issue.message).join(", ");
|
|
284
|
+
throw new Error(`Invalid stop words config in ${resolvedPath}: ${details}`);
|
|
285
|
+
}
|
|
286
|
+
config = result.data;
|
|
287
|
+
cachedConfigPath = resolvedPath;
|
|
288
|
+
cachedConfigMtime = getConfigMtime(resolvedPath);
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
cachedConfigPath = null;
|
|
292
|
+
cachedConfigMtime = null;
|
|
293
|
+
}
|
|
294
|
+
// サービス生成&キャッシュ
|
|
295
|
+
cachedService = new StopWordsService(config, options.language);
|
|
296
|
+
return cachedService;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* テスト用: キャッシュクリア
|
|
300
|
+
*/
|
|
301
|
+
export function clearStopWordsCache() {
|
|
302
|
+
cachedService = null;
|
|
303
|
+
cachedConfigPath = null;
|
|
304
|
+
cachedConfigMtime = null;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* レガシーストップワードリストを取得(テスト・マイグレーション用)
|
|
308
|
+
*/
|
|
309
|
+
export function getLegacyStopWords() {
|
|
310
|
+
return LEGACY_STOP_WORDS;
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=stop-words.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop-words.js","sourceRoot":"","sources":["../../../src/server/stop-words.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,+DAA+D;AAC/D,KAAK;AACL,+DAA+D;AAE/D;;;;;;;;GAQG;AACH,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAEtC;;;GAGG;AACH,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B;;;;;;GAMG;AACH,MAAM,YAAY,GAAG,MAAM,CAAC;AAsB5B,+DAA+D;AAC/D,UAAU;AACV,+DAA+D;AAE/D,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACzC,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAClC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACpD,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAChE,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3D,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACtD,CAAC,CAAC;AAEH,+DAA+D;AAC/D,mBAAmB;AACnB,+DAA+D;AAE/D,MAAM,iBAAiB,GAAG;IACxB,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,KAAK;IACL,MAAM;IACN,SAAS;IACT,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,MAAM;IACN,MAAM;CACP,CAAC;AAEF,+DAA+D;AAC/D,uBAAuB;AACvB,+DAA+D;AAE/D;;;;;;GAMG;AACH,MAAM,OAAO,gBAAgB;IACV,KAAK,CAAc;IACnB,YAAY,CAAU;IAEvC,YAAY,MAA8B,EAAE,QAAiB;QAC3D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,oBAAoB;YACpB,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC;YACxC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,OAAO,CAAC,IAAI,CACV,mCAAmC,iBAAiB,CAAC,MAAM,WAAW;gBACpE,6DAA6D,CAChE,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,MAAM,IAAI,GAAG,QAAQ,IAAI,MAAM,CAAC,gBAAgB,CAAC;QACjD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QAEtD,4CAA4C;QAC5C,0BAA0B;QAC1B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;IACtB,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,IAAY,EAAE,WAAyB;QAC/C,gBAAgB;QAChB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,OAAO,GAAG,CAAC;QACb,CAAC;QAED,iCAAiC;QACjC,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QAED,oBAAoB;QACpB,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;;;;;;OASG;IACH,MAAM,CAAC,cAAc,CAAC,KAAa;QACjC,uCAAuC;QACvC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,UAAU;QACV,IAAI,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEzC,OAAO;QACP,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QAEtC,cAAc;QACd,0BAA0B;QAC1B,8CAA8C;QAC9C,8CAA8C;QAC9C,UAAU,GAAG,UAAU,CAAC,OAAO,CAC7B,IAAI,MAAM,CAAC,OAAO,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EACtF,CAAC,IAAI,EAAE,EAAE;YACP,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YACtC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,MAAM,CAAC,aAAa,CAAC,SAAS,GAAG,wBAAwB,CAAC,CAAC;QACpE,CAAC,CACF,CAAC;QAEF,OAAO,UAAU,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;CACF;AAED,+DAA+D;AAC/D,cAAc;AACd,+DAA+D;AAE/D,IAAI,aAAa,GAA4B,IAAI,CAAC;AAClD,IAAI,gBAAgB,GAAkB,IAAI,CAAC;AAC3C,IAAI,iBAAiB,GAAkB,IAAI,CAAC;AAE5C,SAAS,cAAc,CAAC,UAAkB;IACxC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,SAAS;AACT,+DAA+D;AAE/D,MAAM,iBAAiB,GAAG;IACxB,sBAAsB;IACtB,uBAAuB;IACvB,uBAAuB;IACvB,wBAAwB;CACzB,CAAC;AASF;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,UAAgC,EAAE;IAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC;IAEjD,cAAc;IACd,IAAI,YAAY,GAAkB,IAAI,CAAC;IAEvC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC;YAChD,CAAC,CAAC,OAAO,CAAC,UAAU;YACpB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,YAAY,GAAG,QAAQ,CAAC;gBACxB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,eAAe;IACf,IAAI,CAAC,WAAW,IAAI,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC,YAAY,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;YAC/C,OAAO,aAAa,CAAC,CAAC,eAAe;QACvC,CAAC;QACD,IAAI,YAAY,IAAI,YAAY,KAAK,gBAAgB,EAAE,CAAC;YACtD,MAAM,YAAY,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;YAClD,IAAI,YAAY,KAAK,iBAAiB,EAAE,CAAC;gBACvC,OAAO,aAAa,CAAC,CAAC,aAAa;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED,aAAa;IACb,IAAI,MAAM,GAA2B,IAAI,CAAC;IAE1C,IAAI,YAAY,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEvD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7E,MAAM,IAAI,KAAK,CAAC,gCAAgC,YAAY,KAAK,OAAO,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;QACrB,gBAAgB,GAAG,YAAY,CAAC;QAChC,iBAAiB,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,gBAAgB,GAAG,IAAI,CAAC;QACxB,iBAAiB,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,eAAe;IACf,aAAa,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/D,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,aAAa,GAAG,IAAI,CAAC;IACrB,gBAAgB,GAAG,IAAI,CAAC;IACxB,iBAAiB,GAAG,IAAI,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,iBAAiB,CAAC;AAC3B,CAAC"}
|