kiri-mcp-server 0.9.9 → 0.11.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 +60 -7
- package/config/scoring-profiles.yml +82 -35
- package/dist/config/scoring-profiles.yml +82 -35
- package/dist/package.json +12 -1
- package/dist/src/client/proxy.js +81 -12
- package/dist/src/client/proxy.js.map +1 -1
- package/dist/src/daemon/daemon.js +91 -14
- package/dist/src/daemon/daemon.js.map +1 -1
- package/dist/src/indexer/cli.d.ts.map +1 -1
- package/dist/src/indexer/cli.js +712 -98
- package/dist/src/indexer/cli.js.map +1 -1
- package/dist/src/indexer/git.d.ts.map +1 -1
- package/dist/src/indexer/git.js +41 -3
- package/dist/src/indexer/git.js.map +1 -1
- package/dist/src/indexer/migrations/repo-merger.d.ts +33 -0
- package/dist/src/indexer/migrations/repo-merger.d.ts.map +1 -0
- package/dist/src/indexer/migrations/repo-merger.js +67 -0
- package/dist/src/indexer/migrations/repo-merger.js.map +1 -0
- package/dist/src/indexer/schema.d.ts +66 -0
- package/dist/src/indexer/schema.d.ts.map +1 -1
- package/dist/src/indexer/schema.js +337 -0
- package/dist/src/indexer/schema.js.map +1 -1
- package/dist/src/server/abbreviations.d.ts +47 -0
- package/dist/src/server/abbreviations.d.ts.map +1 -0
- package/dist/src/server/abbreviations.js +71 -0
- package/dist/src/server/abbreviations.js.map +1 -0
- package/dist/src/server/boost-profiles.d.ts +63 -0
- package/dist/src/server/boost-profiles.d.ts.map +1 -0
- package/dist/src/server/boost-profiles.js +202 -0
- package/dist/src/server/boost-profiles.js.map +1 -0
- package/dist/src/server/config.d.ts +45 -0
- package/dist/src/server/config.d.ts.map +1 -0
- package/dist/src/server/config.js +146 -0
- package/dist/src/server/config.js.map +1 -0
- package/dist/src/server/context.d.ts +29 -0
- package/dist/src/server/context.d.ts.map +1 -1
- package/dist/src/server/context.js +26 -1
- package/dist/src/server/context.js.map +1 -1
- package/dist/src/server/handlers/snippets-get.d.ts +36 -0
- package/dist/src/server/handlers/snippets-get.d.ts.map +1 -0
- package/dist/src/server/handlers/snippets-get.js +120 -0
- package/dist/src/server/handlers/snippets-get.js.map +1 -0
- package/dist/src/server/handlers.d.ts +35 -22
- package/dist/src/server/handlers.d.ts.map +1 -1
- package/dist/src/server/handlers.js +1993 -414
- package/dist/src/server/handlers.js.map +1 -1
- package/dist/src/server/indexBootstrap.d.ts.map +1 -1
- package/dist/src/server/indexBootstrap.js +49 -2
- package/dist/src/server/indexBootstrap.js.map +1 -1
- package/dist/src/server/main.d.ts.map +1 -1
- package/dist/src/server/main.js +119 -30
- package/dist/src/server/main.js.map +1 -1
- package/dist/src/server/profile-selector.d.ts +33 -0
- package/dist/src/server/profile-selector.d.ts.map +1 -0
- package/dist/src/server/profile-selector.js +291 -0
- package/dist/src/server/profile-selector.js.map +1 -0
- package/dist/src/server/rpc.d.ts.map +1 -1
- package/dist/src/server/rpc.js +61 -12
- package/dist/src/server/rpc.js.map +1 -1
- package/dist/src/server/rrf.d.ts +86 -0
- package/dist/src/server/rrf.d.ts.map +1 -0
- package/dist/src/server/rrf.js +108 -0
- package/dist/src/server/rrf.js.map +1 -0
- package/dist/src/server/runtime.d.ts.map +1 -1
- package/dist/src/server/runtime.js +14 -4
- package/dist/src/server/runtime.js.map +1 -1
- package/dist/src/server/scoring.d.ts +7 -1
- package/dist/src/server/scoring.d.ts.map +1 -1
- package/dist/src/server/scoring.js +121 -2
- package/dist/src/server/scoring.js.map +1 -1
- package/dist/src/server/services/index.d.ts +24 -0
- package/dist/src/server/services/index.d.ts.map +1 -0
- package/dist/src/server/services/index.js +20 -0
- package/dist/src/server/services/index.js.map +1 -0
- package/dist/src/server/services/repo-repository.d.ts +61 -0
- package/dist/src/server/services/repo-repository.d.ts.map +1 -0
- package/dist/src/server/services/repo-repository.js +93 -0
- package/dist/src/server/services/repo-repository.js.map +1 -0
- package/dist/src/server/services/repo-resolver.d.ts +28 -0
- package/dist/src/server/services/repo-resolver.d.ts.map +1 -0
- package/dist/src/server/services/repo-resolver.js +62 -0
- package/dist/src/server/services/repo-resolver.js.map +1 -0
- package/dist/src/shared/cli/args.d.ts +70 -0
- package/dist/src/shared/cli/args.d.ts.map +1 -0
- package/dist/src/shared/cli/args.js +84 -0
- package/dist/src/shared/cli/args.js.map +1 -0
- package/dist/src/shared/duckdb.d.ts.map +1 -1
- package/dist/src/shared/duckdb.js +21 -1
- package/dist/src/shared/duckdb.js.map +1 -1
- package/dist/src/shared/embedding/engine.d.ts +38 -0
- package/dist/src/shared/embedding/engine.d.ts.map +1 -0
- package/dist/src/shared/embedding/engine.js +6 -0
- package/dist/src/shared/embedding/engine.js.map +1 -0
- package/dist/src/shared/embedding/lsh-engine.d.ts +11 -0
- package/dist/src/shared/embedding/lsh-engine.d.ts.map +1 -0
- package/dist/src/shared/embedding/lsh-engine.js +14 -0
- package/dist/src/shared/embedding/lsh-engine.js.map +1 -0
- package/dist/src/shared/embedding/registry.d.ts +25 -0
- package/dist/src/shared/embedding/registry.d.ts.map +1 -0
- package/dist/src/shared/embedding/registry.js +50 -0
- package/dist/src/shared/embedding/registry.js.map +1 -0
- package/dist/src/shared/embedding/semantic-engine.d.ts +14 -0
- package/dist/src/shared/embedding/semantic-engine.d.ts.map +1 -0
- package/dist/src/shared/embedding/semantic-engine.js +50 -0
- package/dist/src/shared/embedding/semantic-engine.js.map +1 -0
- package/dist/src/shared/fs/safePath.d.ts +7 -0
- package/dist/src/shared/fs/safePath.d.ts.map +1 -0
- package/dist/src/shared/fs/safePath.js +23 -0
- package/dist/src/shared/fs/safePath.js.map +1 -0
- package/dist/src/shared/models/model-manager.d.ts +38 -0
- package/dist/src/shared/models/model-manager.d.ts.map +1 -0
- package/dist/src/shared/models/model-manager.js +116 -0
- package/dist/src/shared/models/model-manager.js.map +1 -0
- package/dist/src/shared/models/model-manifest.d.ts +22 -0
- package/dist/src/shared/models/model-manifest.d.ts.map +1 -0
- package/dist/src/shared/models/model-manifest.js +24 -0
- package/dist/src/shared/models/model-manifest.js.map +1 -0
- package/dist/src/shared/utils/glob.d.ts +5 -0
- package/dist/src/shared/utils/glob.d.ts.map +1 -0
- package/dist/src/shared/utils/glob.js +22 -0
- package/dist/src/shared/utils/glob.js.map +1 -0
- package/dist/src/shared/utils/retry.d.ts +8 -0
- package/dist/src/shared/utils/retry.d.ts.map +1 -0
- package/dist/src/shared/utils/retry.js +20 -0
- package/dist/src/shared/utils/retry.js.map +1 -0
- package/dist/src/shared/utils/validation.d.ts +14 -0
- package/dist/src/shared/utils/validation.d.ts.map +1 -0
- package/dist/src/shared/utils/validation.js +22 -0
- package/dist/src/shared/utils/validation.js.map +1 -0
- package/package.json +29 -20
|
@@ -1,3 +1,84 @@
|
|
|
1
|
+
import { normalizeRepoPath } from "../shared/utils/path.js";
|
|
2
|
+
import { mergeRepoRecords } from "./migrations/repo-merger.js";
|
|
3
|
+
/**
|
|
4
|
+
* Document metadata tables migration error
|
|
5
|
+
* Provides detailed information about which migration step failed
|
|
6
|
+
*/
|
|
7
|
+
class MigrationError extends Error {
|
|
8
|
+
step;
|
|
9
|
+
cause;
|
|
10
|
+
constructor(message, step, cause) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.step = step;
|
|
13
|
+
this.cause = cause;
|
|
14
|
+
this.name = "MigrationError";
|
|
15
|
+
// Set cause for better error chaining (Node.js 16.9.0+)
|
|
16
|
+
if (cause) {
|
|
17
|
+
this.cause = cause;
|
|
18
|
+
}
|
|
19
|
+
// Capture stack trace for debugging
|
|
20
|
+
if (Error.captureStackTrace) {
|
|
21
|
+
Error.captureStackTrace(this, MigrationError);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Execute a migration step with error wrapping
|
|
27
|
+
* Catches errors and wraps them in MigrationError with step context
|
|
28
|
+
*/
|
|
29
|
+
async function executeStep(step, fn) {
|
|
30
|
+
try {
|
|
31
|
+
return await fn();
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
const stepName = step.replace(/_/g, " ");
|
|
35
|
+
throw new MigrationError(`Failed to create ${stepName}. Re-run migration or check database permissions.`, step, error instanceof Error ? error : undefined);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Validate table schema using PRAGMA table_info
|
|
40
|
+
* Compares actual schema with expected column definitions
|
|
41
|
+
*
|
|
42
|
+
* @param db DuckDB client
|
|
43
|
+
* @param tableName Table name to validate
|
|
44
|
+
* @param expectedColumns Expected column definitions
|
|
45
|
+
* @throws MigrationError if schema doesn't match expectations
|
|
46
|
+
*/
|
|
47
|
+
async function validateTableSchema(db, tableName, expectedColumns, step) {
|
|
48
|
+
try {
|
|
49
|
+
// Get actual schema using PRAGMA table_info
|
|
50
|
+
const actualColumns = await db.all(`PRAGMA table_info('${tableName}')`);
|
|
51
|
+
// Build map of actual columns for lookup
|
|
52
|
+
const actualMap = new Map(actualColumns.map((col) => [col.name, { type: col.type.toUpperCase(), pk: col.pk > 0 }]));
|
|
53
|
+
// Validate each expected column
|
|
54
|
+
for (const expected of expectedColumns) {
|
|
55
|
+
const actual = actualMap.get(expected.name);
|
|
56
|
+
if (!actual) {
|
|
57
|
+
throw new Error(`Column '${expected.name}' missing in table '${tableName}'`);
|
|
58
|
+
}
|
|
59
|
+
// Normalize types for comparison (e.g., "INTEGER" vs "INT", "TEXT" vs "VARCHAR")
|
|
60
|
+
const expectedTypeNorm = expected.type.toUpperCase();
|
|
61
|
+
const actualTypeNorm = actual.type;
|
|
62
|
+
// Type validation with normalization
|
|
63
|
+
const typeMatches = expectedTypeNorm === actualTypeNorm ||
|
|
64
|
+
(expectedTypeNorm === "INTEGER" &&
|
|
65
|
+
(actualTypeNorm === "INT" || actualTypeNorm === "BIGINT")) ||
|
|
66
|
+
(expectedTypeNorm === "TEXT" &&
|
|
67
|
+
(actualTypeNorm === "VARCHAR" || actualTypeNorm === "STRING"));
|
|
68
|
+
if (!typeMatches) {
|
|
69
|
+
throw new Error(`Column '${expected.name}' in table '${tableName}' has type '${actual.type}', expected '${expected.type}'`);
|
|
70
|
+
}
|
|
71
|
+
// PRIMARY KEY validation
|
|
72
|
+
if (expected.pk && !actual.pk) {
|
|
73
|
+
throw new Error(`Column '${expected.name}' in table '${tableName}' should be PRIMARY KEY`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
const stepName = step.replace(/_/g, " ");
|
|
79
|
+
throw new MigrationError(`Schema validation failed for ${stepName}. ${error instanceof Error ? error.message : "Unknown error"}`, step, error instanceof Error ? error : undefined);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
1
82
|
export async function ensureBaseSchema(db) {
|
|
2
83
|
await db.run(`
|
|
3
84
|
CREATE SEQUENCE IF NOT EXISTS repo_id_seq START 1
|
|
@@ -6,6 +87,7 @@ export async function ensureBaseSchema(db) {
|
|
|
6
87
|
CREATE TABLE IF NOT EXISTS repo (
|
|
7
88
|
id INTEGER PRIMARY KEY DEFAULT nextval('repo_id_seq'),
|
|
8
89
|
root TEXT NOT NULL UNIQUE,
|
|
90
|
+
normalized_root TEXT,
|
|
9
91
|
default_branch TEXT,
|
|
10
92
|
indexed_at TIMESTAMP,
|
|
11
93
|
fts_last_indexed_at TIMESTAMP,
|
|
@@ -101,6 +183,51 @@ export async function ensureBaseSchema(db) {
|
|
|
101
183
|
PRIMARY KEY (repo_id, path)
|
|
102
184
|
)
|
|
103
185
|
`);
|
|
186
|
+
// Document metadata tables (delegated to dedicated migration function)
|
|
187
|
+
await ensureDocumentMetadataTables(db);
|
|
188
|
+
await db.run(`
|
|
189
|
+
CREATE TABLE IF NOT EXISTS markdown_link (
|
|
190
|
+
repo_id INTEGER,
|
|
191
|
+
src_path TEXT,
|
|
192
|
+
target TEXT,
|
|
193
|
+
resolved_path TEXT,
|
|
194
|
+
anchor_text TEXT,
|
|
195
|
+
kind TEXT,
|
|
196
|
+
PRIMARY KEY (repo_id, src_path, target, anchor_text)
|
|
197
|
+
)
|
|
198
|
+
`);
|
|
199
|
+
await db.run(`
|
|
200
|
+
CREATE INDEX IF NOT EXISTS idx_markdown_link_target
|
|
201
|
+
ON markdown_link(repo_id, resolved_path)
|
|
202
|
+
`);
|
|
203
|
+
await db.run(`
|
|
204
|
+
CREATE TABLE IF NOT EXISTS hint_expansion (
|
|
205
|
+
repo_id INTEGER,
|
|
206
|
+
hint_value TEXT,
|
|
207
|
+
expansion_kind TEXT,
|
|
208
|
+
target_path TEXT,
|
|
209
|
+
payload JSON,
|
|
210
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
211
|
+
)
|
|
212
|
+
`);
|
|
213
|
+
await db.run(`
|
|
214
|
+
CREATE INDEX IF NOT EXISTS idx_hint_expansion_repo
|
|
215
|
+
ON hint_expansion(repo_id, created_at)
|
|
216
|
+
`);
|
|
217
|
+
await db.run(`
|
|
218
|
+
CREATE TABLE IF NOT EXISTS hint_dictionary (
|
|
219
|
+
repo_id INTEGER,
|
|
220
|
+
hint_value TEXT,
|
|
221
|
+
target_path TEXT,
|
|
222
|
+
freq INTEGER DEFAULT 1,
|
|
223
|
+
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
224
|
+
PRIMARY KEY (repo_id, hint_value, target_path)
|
|
225
|
+
)
|
|
226
|
+
`);
|
|
227
|
+
await db.run(`
|
|
228
|
+
CREATE INDEX IF NOT EXISTS idx_hint_dictionary_repo_hint
|
|
229
|
+
ON hint_dictionary(repo_id, hint_value)
|
|
230
|
+
`);
|
|
104
231
|
}
|
|
105
232
|
/**
|
|
106
233
|
* repoテーブルにFTSメタデータ列を追加(Phase 3マイグレーション)
|
|
@@ -148,6 +275,102 @@ export async function ensureRepoMetaColumns(db) {
|
|
|
148
275
|
WHERE fts_last_indexed_at IS NULL
|
|
149
276
|
`);
|
|
150
277
|
}
|
|
278
|
+
/**
|
|
279
|
+
* Adds normalized_root column with UNIQUE index to the repo table (Phase 1: Critical #1)
|
|
280
|
+
*
|
|
281
|
+
* Migration Strategy:
|
|
282
|
+
* 1. Adds normalized_root column (nullable initially for backward compatibility)
|
|
283
|
+
* 2. Populates normalized_root from existing root values using normalizeRepoPath()
|
|
284
|
+
* 3. Deduplicates repos with same normalized_root (keeps lowest ID)
|
|
285
|
+
* 4. Creates UNIQUE index on normalized_root
|
|
286
|
+
*
|
|
287
|
+
* Deduplication Behavior:
|
|
288
|
+
* - When multiple repos have the same normalized_root: keeps repo with lowest ID
|
|
289
|
+
* - Deleted repos: All dependent data is automatically handled by foreign key constraints
|
|
290
|
+
* - Example: /Users/foo and /users/foo normalize to same path → keeps lower ID, deletes higher ID
|
|
291
|
+
* - Rationale: Lowest ID is typically the oldest/first indexed, most likely to be correct
|
|
292
|
+
*
|
|
293
|
+
* Safety Guarantees:
|
|
294
|
+
* - Transaction-based: All operations are atomic, rollback on failure
|
|
295
|
+
* - Backward compatible: Old code without normalized_root column awareness still works
|
|
296
|
+
* - Idempotent: Safe to run multiple times (checks for existing column and index)
|
|
297
|
+
* - Non-destructive: Only removes duplicate entries after careful validation
|
|
298
|
+
*
|
|
299
|
+
* Performance:
|
|
300
|
+
* - Backfill: O(n) where n = number of repos (typically small, <100)
|
|
301
|
+
* - Deduplication: O(m log m) where m = number of duplicate groups (typically 0-5)
|
|
302
|
+
* - Index creation: O(n log n)
|
|
303
|
+
*
|
|
304
|
+
* @param db - DuckDBクライアント
|
|
305
|
+
* @throws Error if migration fails (except when repo table doesn't exist yet)
|
|
306
|
+
*/
|
|
307
|
+
export async function ensureNormalizedRootColumn(db) {
|
|
308
|
+
// Check if repo table exists first
|
|
309
|
+
const tables = await db.all(`SELECT table_name FROM duckdb_tables() WHERE table_name = 'repo'`);
|
|
310
|
+
if (tables.length === 0) {
|
|
311
|
+
// repo table doesn't exist yet - will be created by ensureBaseSchema()
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
// 列の存在確認
|
|
315
|
+
const columns = await db.all(`SELECT column_name FROM duckdb_columns()
|
|
316
|
+
WHERE table_name = 'repo' AND column_name = 'normalized_root'`);
|
|
317
|
+
const hasNormalizedRoot = columns.length > 0;
|
|
318
|
+
// normalized_rootの追加
|
|
319
|
+
if (!hasNormalizedRoot) {
|
|
320
|
+
await db.run(`ALTER TABLE repo ADD COLUMN normalized_root TEXT`);
|
|
321
|
+
}
|
|
322
|
+
// 既存レコードのbackfill(トランザクション内で実行)
|
|
323
|
+
await db.transaction(async () => {
|
|
324
|
+
const needsBackfill = await db.all(`SELECT id, root FROM repo WHERE normalized_root IS NULL`);
|
|
325
|
+
if (needsBackfill.length > 0) {
|
|
326
|
+
// バッチ更新で高速化
|
|
327
|
+
for (const row of needsBackfill) {
|
|
328
|
+
const normalized = normalizeRepoPath(row.root);
|
|
329
|
+
await db.run(`UPDATE repo SET normalized_root = ? WHERE id = ?`, [normalized, row.id]);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
// 重複排除: UNIQUE index 作成前に重複する normalized_root を統合
|
|
334
|
+
await db.transaction(async () => {
|
|
335
|
+
const duplicates = await db.all(`SELECT normalized_root, STRING_AGG(CAST(id AS VARCHAR), ',') as ids
|
|
336
|
+
FROM repo
|
|
337
|
+
WHERE normalized_root IS NOT NULL
|
|
338
|
+
GROUP BY normalized_root
|
|
339
|
+
HAVING COUNT(*) > 1`);
|
|
340
|
+
if (duplicates.length > 0) {
|
|
341
|
+
// 各重複グループについて、最小IDのレコードを残して他を削除
|
|
342
|
+
for (const dup of duplicates) {
|
|
343
|
+
const ids = dup.ids
|
|
344
|
+
.split(",")
|
|
345
|
+
.map((value) => Number.parseInt(value, 10))
|
|
346
|
+
.filter((id) => Number.isFinite(id))
|
|
347
|
+
.sort((a, b) => a - b);
|
|
348
|
+
if (ids.length === 0) {
|
|
349
|
+
continue;
|
|
350
|
+
}
|
|
351
|
+
const keepId = ids[0];
|
|
352
|
+
if (keepId === undefined) {
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
const deleteIds = ids.slice(1);
|
|
356
|
+
if (deleteIds.length === 0) {
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
await mergeRepoRecords(db, keepId, deleteIds);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
// インデックスの存在確認
|
|
364
|
+
const indexes = await db.all(`SELECT index_name FROM duckdb_indexes() WHERE index_name = 'repo_normalized_root_idx'`);
|
|
365
|
+
// UNIQUE インデックスの作成
|
|
366
|
+
if (indexes.length === 0) {
|
|
367
|
+
// NOTE: UNIQUE制約により、同じ正規化パスを持つ複数のrepoは登録不可
|
|
368
|
+
// 衝突時は既存のrepoを使用するか、mergeLegacyRepoRowsで統合する
|
|
369
|
+
await db.run(`
|
|
370
|
+
CREATE UNIQUE INDEX repo_normalized_root_idx ON repo(normalized_root)
|
|
371
|
+
`);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
151
374
|
/**
|
|
152
375
|
* FTS(全文検索)インデックスの作成を試行
|
|
153
376
|
* @param db - DuckDBクライアント
|
|
@@ -355,6 +578,120 @@ export async function rebuildGlobalFTS(db, options = {}) {
|
|
|
355
578
|
return false;
|
|
356
579
|
}
|
|
357
580
|
}
|
|
581
|
+
/**
|
|
582
|
+
* Check if document_metadata table is empty
|
|
583
|
+
* Used to detect if migration needs to trigger a full reindex
|
|
584
|
+
*
|
|
585
|
+
* @param db - DuckDB client
|
|
586
|
+
* @returns true if table exists but is empty, false otherwise
|
|
587
|
+
*/
|
|
588
|
+
export async function isDocumentMetadataEmpty(db) {
|
|
589
|
+
// Check if document_metadata table exists
|
|
590
|
+
const tables = await db.all(`SELECT table_name FROM duckdb_tables() WHERE table_name = 'document_metadata'`);
|
|
591
|
+
if (tables.length === 0) {
|
|
592
|
+
// Table doesn't exist yet
|
|
593
|
+
return false;
|
|
594
|
+
}
|
|
595
|
+
// Count records in document_metadata table
|
|
596
|
+
const result = await db.all(`SELECT COUNT(*) as count FROM document_metadata`);
|
|
597
|
+
// Defensive: check array element exists and has valid count
|
|
598
|
+
const firstRow = result[0];
|
|
599
|
+
if (!firstRow || typeof firstRow.count !== "number") {
|
|
600
|
+
return false;
|
|
601
|
+
}
|
|
602
|
+
return firstRow.count === 0;
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* document_metadata関連テーブルを追加(マイグレーション+新規DB用)
|
|
606
|
+
* 既存DBとの互換性のため、テーブルが存在しない場合のみ作成
|
|
607
|
+
*
|
|
608
|
+
* Usage:
|
|
609
|
+
* - Called by ensureBaseSchema() for new databases (replaces duplicate DDL)
|
|
610
|
+
* - Called by CLI migration for existing databases
|
|
611
|
+
*
|
|
612
|
+
* Migration Strategy:
|
|
613
|
+
* 1. Check if document_metadata table exists
|
|
614
|
+
* 2. Create document_metadata table if missing
|
|
615
|
+
* 3. Create document_metadata_kv table if missing
|
|
616
|
+
* 4. Create index on document_metadata_kv if missing
|
|
617
|
+
*
|
|
618
|
+
* Safety Guarantees:
|
|
619
|
+
* - Idempotent: Safe to run multiple times (checks for existing tables/indexes)
|
|
620
|
+
* - Non-destructive: Only creates missing schema objects, never modifies existing data
|
|
621
|
+
* - Backward compatible: Old code without metadata awareness still works
|
|
622
|
+
*
|
|
623
|
+
* Performance:
|
|
624
|
+
* - O(1) for existence checks
|
|
625
|
+
* - O(1) for table creation (no data migration needed)
|
|
626
|
+
* - O(1) for index creation (table is initially empty)
|
|
627
|
+
*
|
|
628
|
+
* @param db - DuckDBクライアント
|
|
629
|
+
* @throws Error if migration fails
|
|
630
|
+
*/
|
|
631
|
+
export async function ensureDocumentMetadataTables(db) {
|
|
632
|
+
// トランザクション境界: 3つのDDL操作を単一のatomic操作として実行
|
|
633
|
+
// 失敗時は自動的にロールバックされ、部分的な状態が残らない
|
|
634
|
+
await db.transaction(async () => {
|
|
635
|
+
// 1. document_metadataテーブルの存在確認
|
|
636
|
+
const metadataTableExists = await db.all(`SELECT table_name FROM duckdb_tables() WHERE table_name = 'document_metadata'`);
|
|
637
|
+
if (metadataTableExists.length === 0) {
|
|
638
|
+
await executeStep("metadata_table", async () => {
|
|
639
|
+
await db.run(`
|
|
640
|
+
CREATE TABLE document_metadata (
|
|
641
|
+
repo_id INTEGER,
|
|
642
|
+
path TEXT,
|
|
643
|
+
source TEXT,
|
|
644
|
+
data JSON,
|
|
645
|
+
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
646
|
+
PRIMARY KEY (repo_id, path, source)
|
|
647
|
+
)
|
|
648
|
+
`);
|
|
649
|
+
});
|
|
650
|
+
}
|
|
651
|
+
// 2. document_metadata_kvテーブルの存在確認
|
|
652
|
+
const kvTableExists = await db.all(`SELECT table_name FROM duckdb_tables() WHERE table_name = 'document_metadata_kv'`);
|
|
653
|
+
if (kvTableExists.length === 0) {
|
|
654
|
+
await executeStep("metadata_kv_table", async () => {
|
|
655
|
+
await db.run(`
|
|
656
|
+
CREATE TABLE document_metadata_kv (
|
|
657
|
+
repo_id INTEGER,
|
|
658
|
+
path TEXT,
|
|
659
|
+
source TEXT,
|
|
660
|
+
key TEXT,
|
|
661
|
+
value TEXT,
|
|
662
|
+
PRIMARY KEY (repo_id, path, source, key, value)
|
|
663
|
+
)
|
|
664
|
+
`);
|
|
665
|
+
});
|
|
666
|
+
}
|
|
667
|
+
// 3. インデックスの存在確認と作成
|
|
668
|
+
const indexExists = await db.all(`SELECT index_name FROM duckdb_indexes() WHERE index_name = 'idx_document_metadata_key'`);
|
|
669
|
+
if (indexExists.length === 0) {
|
|
670
|
+
await executeStep("index", async () => {
|
|
671
|
+
await db.run(`
|
|
672
|
+
CREATE INDEX idx_document_metadata_key
|
|
673
|
+
ON document_metadata_kv(repo_id, key)
|
|
674
|
+
`);
|
|
675
|
+
});
|
|
676
|
+
}
|
|
677
|
+
// 4. スキーマ検証: 作成されたテーブルが期待通りの構造を持つことを確認
|
|
678
|
+
// 検証はトランザクション内で行い、不整合があればロールバック
|
|
679
|
+
await validateTableSchema(db, "document_metadata", [
|
|
680
|
+
{ name: "repo_id", type: "INTEGER" },
|
|
681
|
+
{ name: "path", type: "TEXT" },
|
|
682
|
+
{ name: "source", type: "TEXT" },
|
|
683
|
+
{ name: "data", type: "JSON" },
|
|
684
|
+
{ name: "updated_at", type: "TIMESTAMP" },
|
|
685
|
+
], "metadata_table");
|
|
686
|
+
await validateTableSchema(db, "document_metadata_kv", [
|
|
687
|
+
{ name: "repo_id", type: "INTEGER" },
|
|
688
|
+
{ name: "path", type: "TEXT" },
|
|
689
|
+
{ name: "source", type: "TEXT" },
|
|
690
|
+
{ name: "key", type: "TEXT" },
|
|
691
|
+
{ name: "value", type: "TEXT" },
|
|
692
|
+
], "metadata_kv_table");
|
|
693
|
+
});
|
|
694
|
+
}
|
|
358
695
|
/**
|
|
359
696
|
* FTS dirty flagを設定(Phase 3: ウォッチモード用)
|
|
360
697
|
* Note: 現在は rebuildFTSIfNeeded() の使用を推奨。この関数は将来のウォッチモード実装用に保持。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/indexer/schema.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/indexer/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abbreviation expansion for path matching (ADR 003)
|
|
3
|
+
*
|
|
4
|
+
* Bridges the vocabulary gap between natural language queries and technical path names.
|
|
5
|
+
* Example: "database" → ["database", "db", "data"]
|
|
6
|
+
*
|
|
7
|
+
* LDE principles:
|
|
8
|
+
* - Pure functions (no side effects)
|
|
9
|
+
* - Readonly types (immutability)
|
|
10
|
+
* - Property-based testing
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Abbreviation mapping (LDE: readonly, immutable)
|
|
14
|
+
*/
|
|
15
|
+
export interface AbbreviationMap {
|
|
16
|
+
readonly canonical: string;
|
|
17
|
+
readonly variants: readonly string[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Default abbreviation dictionary
|
|
21
|
+
*
|
|
22
|
+
* Maintenance: Add new entries as needed, alphabetically sorted by canonical
|
|
23
|
+
* Conflicts: Use most common meaning (e.g., "db" → "database" not "debug")
|
|
24
|
+
*/
|
|
25
|
+
export declare const DEFAULT_ABBREVIATIONS: readonly AbbreviationMap[];
|
|
26
|
+
/**
|
|
27
|
+
* Expand term with common abbreviations (LDE: pure function)
|
|
28
|
+
*
|
|
29
|
+
* Matches term (case-insensitive) against abbreviation dictionary and returns
|
|
30
|
+
* all related forms (canonical + variants).
|
|
31
|
+
*
|
|
32
|
+
* @param term - Query term to expand (e.g., "db", "database", "config")
|
|
33
|
+
* @param abbreviations - Abbreviation dictionary (default: DEFAULT_ABBREVIATIONS)
|
|
34
|
+
* @returns Readonly array of expanded terms including canonical and all variants
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* expandAbbreviations("db") → ["database", "db", "data"]
|
|
38
|
+
* expandAbbreviations("config") → ["configuration", "config", "cfg", "conf"]
|
|
39
|
+
* expandAbbreviations("unknown") → ["unknown"]
|
|
40
|
+
*
|
|
41
|
+
* LDE properties:
|
|
42
|
+
* - Pure: Same input always produces same output
|
|
43
|
+
* - No side effects: Doesn't modify input or global state
|
|
44
|
+
* - Immutable: Returns readonly array
|
|
45
|
+
*/
|
|
46
|
+
export declare function expandAbbreviations(term: string, abbreviations?: readonly AbbreviationMap[]): readonly string[];
|
|
47
|
+
//# sourceMappingURL=abbreviations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abbreviations.d.ts","sourceRoot":"","sources":["../../../src/server/abbreviations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,eAAe,EAqB3D,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,aAAa,GAAE,SAAS,eAAe,EAA0B,GAChE,SAAS,MAAM,EAAE,CAenB"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abbreviation expansion for path matching (ADR 003)
|
|
3
|
+
*
|
|
4
|
+
* Bridges the vocabulary gap between natural language queries and technical path names.
|
|
5
|
+
* Example: "database" → ["database", "db", "data"]
|
|
6
|
+
*
|
|
7
|
+
* LDE principles:
|
|
8
|
+
* - Pure functions (no side effects)
|
|
9
|
+
* - Readonly types (immutability)
|
|
10
|
+
* - Property-based testing
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Default abbreviation dictionary
|
|
14
|
+
*
|
|
15
|
+
* Maintenance: Add new entries as needed, alphabetically sorted by canonical
|
|
16
|
+
* Conflicts: Use most common meaning (e.g., "db" → "database" not "debug")
|
|
17
|
+
*/
|
|
18
|
+
export const DEFAULT_ABBREVIATIONS = [
|
|
19
|
+
{ canonical: "administrator", variants: ["admin"] },
|
|
20
|
+
{ canonical: "application", variants: ["app"] },
|
|
21
|
+
{ canonical: "authentication", variants: ["auth"] },
|
|
22
|
+
{ canonical: "authorization", variants: ["authz"] },
|
|
23
|
+
{ canonical: "configuration", variants: ["config", "cfg", "conf"] },
|
|
24
|
+
{ canonical: "controller", variants: ["ctrl"] },
|
|
25
|
+
{ canonical: "database", variants: ["db", "data"] },
|
|
26
|
+
{ canonical: "development", variants: ["dev"] },
|
|
27
|
+
{ canonical: "directory", variants: ["dir"] },
|
|
28
|
+
{ canonical: "document", variants: ["doc", "docs"] },
|
|
29
|
+
{ canonical: "error", variants: ["err", "errors"] },
|
|
30
|
+
{ canonical: "implementation", variants: ["impl"] },
|
|
31
|
+
{ canonical: "manager", variants: ["mgr"] },
|
|
32
|
+
{ canonical: "production", variants: ["prod"] },
|
|
33
|
+
{ canonical: "repository", variants: ["repo"] },
|
|
34
|
+
{ canonical: "service", variants: ["svc", "srv"] },
|
|
35
|
+
{ canonical: "source", variants: ["src"] },
|
|
36
|
+
{ canonical: "specification", variants: ["spec", "specs"] },
|
|
37
|
+
{ canonical: "temporary", variants: ["tmp", "temp"] },
|
|
38
|
+
{ canonical: "utilities", variants: ["util", "utils"] },
|
|
39
|
+
];
|
|
40
|
+
/**
|
|
41
|
+
* Expand term with common abbreviations (LDE: pure function)
|
|
42
|
+
*
|
|
43
|
+
* Matches term (case-insensitive) against abbreviation dictionary and returns
|
|
44
|
+
* all related forms (canonical + variants).
|
|
45
|
+
*
|
|
46
|
+
* @param term - Query term to expand (e.g., "db", "database", "config")
|
|
47
|
+
* @param abbreviations - Abbreviation dictionary (default: DEFAULT_ABBREVIATIONS)
|
|
48
|
+
* @returns Readonly array of expanded terms including canonical and all variants
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* expandAbbreviations("db") → ["database", "db", "data"]
|
|
52
|
+
* expandAbbreviations("config") → ["configuration", "config", "cfg", "conf"]
|
|
53
|
+
* expandAbbreviations("unknown") → ["unknown"]
|
|
54
|
+
*
|
|
55
|
+
* LDE properties:
|
|
56
|
+
* - Pure: Same input always produces same output
|
|
57
|
+
* - No side effects: Doesn't modify input or global state
|
|
58
|
+
* - Immutable: Returns readonly array
|
|
59
|
+
*/
|
|
60
|
+
export function expandAbbreviations(term, abbreviations = DEFAULT_ABBREVIATIONS) {
|
|
61
|
+
const normalized = term.toLowerCase().trim();
|
|
62
|
+
// Find matching abbreviation map (check both canonical and variants)
|
|
63
|
+
const map = abbreviations.find((m) => m.canonical === normalized || m.variants.includes(normalized));
|
|
64
|
+
if (map) {
|
|
65
|
+
// Return all forms: canonical + variants
|
|
66
|
+
return [map.canonical, ...map.variants];
|
|
67
|
+
}
|
|
68
|
+
// No match: return original term
|
|
69
|
+
return [term];
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=abbreviations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abbreviations.js","sourceRoot":"","sources":["../../../src/server/abbreviations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA+B;IAC/D,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE;IACnD,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE;IAC/C,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE;IACnD,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE;IACnD,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE;IACnE,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE;IAC/C,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;IACnD,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE;IAC/C,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE;IAC7C,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE;IACpD,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE;IACnD,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE;IACnD,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE;IAC3C,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE;IAC/C,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE;IAC/C,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;IAClD,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE;IAC1C,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;IAC3D,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE;IACrD,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;CACxD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,gBAA4C,qBAAqB;IAEjE,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAE7C,qEAAqE;IACrE,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,UAAU,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CACrE,CAAC;IAEF,IAAI,GAAG,EAAE,CAAC;QACR,yCAAyC;QACzC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,iCAAiC;IACjC,OAAO,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boost Profile Configurations
|
|
3
|
+
*
|
|
4
|
+
* This module provides centralized configuration for boost_profile options.
|
|
5
|
+
* Each profile defines how different file types should be ranked in search results.
|
|
6
|
+
*
|
|
7
|
+
* Profiles:
|
|
8
|
+
* - default: Prioritizes implementation files over documentation
|
|
9
|
+
* - docs: Prioritizes documentation over implementation
|
|
10
|
+
* - balanced: Equal weight for both docs and implementation
|
|
11
|
+
* - none: No file type boosting (pure keyword scoring)
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Boost profile configuration
|
|
15
|
+
* Defines how different file types should be ranked
|
|
16
|
+
*/
|
|
17
|
+
export interface BoostProfileConfig {
|
|
18
|
+
/**
|
|
19
|
+
* Directories to allow even if they match global denylist patterns.
|
|
20
|
+
* Example: ["docs/"] allows docs/ files despite being blacklisted by default.
|
|
21
|
+
* This overrides the global blacklist in applyFileTypeBoost/applyAdditiveFilePenalties.
|
|
22
|
+
*/
|
|
23
|
+
denylistOverrides: string[];
|
|
24
|
+
/** Multiplicative factors for different file types */
|
|
25
|
+
fileTypeMultipliers: {
|
|
26
|
+
/** Documentation files (.md, .yaml, .yml, .mdc) */
|
|
27
|
+
doc: number;
|
|
28
|
+
/** Implementation files (src/**) */
|
|
29
|
+
impl: number;
|
|
30
|
+
/** Configuration files (tsconfig.json, package.json, etc.) */
|
|
31
|
+
config: number;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Path-specific multipliers (e.g., src/app/ gets higher boost than src/)
|
|
35
|
+
* Array is sorted by prefix length (longest first) to ensure correct matching priority
|
|
36
|
+
*/
|
|
37
|
+
pathMultipliers: Array<{
|
|
38
|
+
prefix: string;
|
|
39
|
+
multiplier: number;
|
|
40
|
+
}>;
|
|
41
|
+
/**
|
|
42
|
+
* Skip additive penalty for config files (-1.5 score penalty)
|
|
43
|
+
* and only apply multiplicative penalty (e.g., 0.3x multiplier)
|
|
44
|
+
* @default false
|
|
45
|
+
*/
|
|
46
|
+
skipConfigAdditivePenalty?: boolean;
|
|
47
|
+
}
|
|
48
|
+
export type BoostProfileName = "default" | "docs" | "none" | "balanced" | "feature" | "bugfix" | "debug" | "api" | "editor" | "testfail" | "typeerror";
|
|
49
|
+
/**
|
|
50
|
+
* Boost profile definitions
|
|
51
|
+
* Centralized configuration for all boost profiles
|
|
52
|
+
*/
|
|
53
|
+
export declare const BOOST_PROFILES: Record<BoostProfileName, BoostProfileConfig>;
|
|
54
|
+
/**
|
|
55
|
+
* Get boost profile configuration by name
|
|
56
|
+
* @throws Error if profile name is invalid
|
|
57
|
+
*/
|
|
58
|
+
export declare function getBoostProfile(name: BoostProfileName): BoostProfileConfig;
|
|
59
|
+
/**
|
|
60
|
+
* Check if a profile name is valid
|
|
61
|
+
*/
|
|
62
|
+
export declare function isValidBoostProfile(name: string): name is BoostProfileName;
|
|
63
|
+
//# sourceMappingURL=boost-profiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boost-profiles.d.ts","sourceRoot":"","sources":["../../../src/server/boost-profiles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAE5B,sDAAsD;IACtD,mBAAmB,EAAE;QACnB,mDAAmD;QACnD,GAAG,EAAE,MAAM,CAAC;QACZ,oCAAoC;QACpC,IAAI,EAAE,MAAM,CAAC;QACb,8DAA8D;QAC9D,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF;;;OAGG;IACH,eAAe,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE/D;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,MAAM,GACN,MAAM,GACN,UAAU,GACV,SAAS,GACT,QAAQ,GACR,OAAO,GACP,KAAK,GACL,QAAQ,GACR,UAAU,GACV,WAAW,CAAC;AAEhB;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,gBAAgB,EAAE,kBAAkB,CAgLvE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,kBAAkB,CAS1E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,gBAAgB,CAE1E"}
|